Build the agent-native compute CRM platform
CI / verify (push) Successful in 3m6s

This commit is contained in:
2026-08-13 01:39:01 -07:00
parent bfd2f8d95a
commit 853bde2265
160 changed files with 61812 additions and 483 deletions
+146
View File
@@ -0,0 +1,146 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import { z } from 'zod';
import { PrimeOpenAIChatProvider, type PiggyChatEvent } from '../src/chat';
import { defineTool } from '../src/provider';
async function collect(stream: AsyncIterable<PiggyChatEvent>): Promise<PiggyChatEvent[]> {
const events: PiggyChatEvent[] = [];
for await (const event of stream) events.push(event);
return events;
}
function eventStream(events: unknown[]): Response {
const text = events.map((event) => `data: ${JSON.stringify(event)}\n\n`).join('') + 'data: [DONE]\n\n';
const midpoint = Math.floor(text.length / 2);
const encoder = new TextEncoder();
return new Response(
new ReadableStream({
start(controller) {
controller.enqueue(encoder.encode(text.slice(0, midpoint)));
controller.enqueue(encoder.encode(text.slice(midpoint)));
controller.close();
},
}),
{ headers: { 'content-type': 'text/event-stream' } },
);
}
test('interactive streaming keeps reasoning, tools and final content as separate events', async () => {
const bodies: Record<string, unknown>[] = [];
let call = 0;
const fetchImpl: typeof fetch = async (_input, init) => {
bodies.push(JSON.parse(String(init?.body)) as Record<string, unknown>);
call += 1;
return call === 1
? eventStream([
{
choices: [{
delta: {
tool_calls: [{
index: 0,
id: 'call_1',
function: { name: 'pig_get_', arguments: '{"id":' },
}],
},
finish_reason: null,
}],
},
{
choices: [{
delta: {
tool_calls: [{
index: 0,
function: { name: 'record', arguments: '"record-1"}' },
}],
},
finish_reason: 'tool_calls',
}],
},
])
: eventStream([
{
choices: [{ delta: { reasoning_content: 'Checked the scoped record.' }, finish_reason: null }],
},
{
choices: [{ delta: { content: 'The commitment expires in October.' }, finish_reason: 'stop' }],
},
{ choices: [], usage: { prompt_tokens: 12, completion_tokens: 7 } },
]);
};
const provider = new PrimeOpenAIChatProvider({ apiKey: 'test', fetchImpl });
const events = await collect(
provider.run({
message: 'When does this expire?',
context: { type: 'contract', id: 'record-1' },
tools: [
defineTool({
name: 'pig_get_record',
description: 'Read the record in focus.',
inputSchema: z.object({ id: z.string() }),
execute: async ({ id }) => ({ id, expiresAt: '2026-10-01T00:00:00.000Z' }),
}),
],
}),
);
assert.deepEqual(events.map((event) => event.type), [
'meta',
'tool_call',
'tool_result',
'reasoning_delta',
'content_delta',
'done',
]);
assert.deepEqual(events[1], {
type: 'tool_call',
id: 'call_1',
name: 'pig_get_record',
arguments: { id: 'record-1' },
});
assert.equal(bodies.length, 2);
for (const body of bodies) {
assert.equal(body.reasoning_effort, 'none');
assert.equal(body.stream, true);
assert.equal(body.parallel_tool_calls, false);
const advertisedTools = body.tools as { function: { name: string; description: string } }[];
assert.deepEqual(
advertisedTools.map((tool) => tool.function.name),
['pig_get_record'],
);
assert.ok(!JSON.stringify(advertisedTools).match(/bash|filesystem|file_read|file_write/i));
}
const firstMessages = bodies[0]?.messages as { role: string; content: string }[];
const systemPrompt = firstMessages?.find((message) => message.role === 'system')?.content;
assert.match(systemPrompt ?? '', /no shell, filesystem, browser, code execution, or hidden tools/i);
});
test('ambient coding tools are rejected before inference', async () => {
let fetched = false;
const provider = new PrimeOpenAIChatProvider({
apiKey: 'test',
fetchImpl: async () => {
fetched = true;
return eventStream([]);
},
});
await assert.rejects(
collect(
provider.run({
message: 'List files',
tools: [
defineTool({
name: 'bash',
description: 'Run a command.',
inputSchema: z.object({ command: z.string() }),
execute: async () => null,
}),
],
}),
),
/outside the PIG tool boundary/,
);
assert.equal(fetched, false);
});