@hanfani/core 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +47 -0
- package/dist/conformance.d.ts +25 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +90 -0
- package/dist/conformance.js.map +1 -0
- package/dist/defineAgent.d.ts +76 -0
- package/dist/defineAgent.d.ts.map +1 -0
- package/dist/defineAgent.js +59 -0
- package/dist/defineAgent.js.map +1 -0
- package/dist/definePrompt.d.ts +15 -0
- package/dist/definePrompt.d.ts.map +1 -0
- package/dist/definePrompt.js +23 -0
- package/dist/definePrompt.js.map +1 -0
- package/dist/defineWorkflow.d.ts +10 -0
- package/dist/defineWorkflow.d.ts.map +1 -0
- package/dist/defineWorkflow.js +38 -0
- package/dist/defineWorkflow.js.map +1 -0
- package/dist/delivery.d.ts +8 -0
- package/dist/delivery.d.ts.map +1 -0
- package/dist/delivery.js +21 -0
- package/dist/delivery.js.map +1 -0
- package/dist/fold.d.ts +8 -0
- package/dist/fold.d.ts.map +1 -0
- package/dist/fold.js +98 -0
- package/dist/fold.js.map +1 -0
- package/dist/gate.d.ts +25 -0
- package/dist/gate.d.ts.map +1 -0
- package/dist/gate.js +22 -0
- package/dist/gate.js.map +1 -0
- package/dist/handoff.d.ts +77 -0
- package/dist/handoff.d.ts.map +1 -0
- package/dist/handoff.js +52 -0
- package/dist/handoff.js.map +1 -0
- package/dist/handoffNote.d.ts +11 -0
- package/dist/handoffNote.d.ts.map +1 -0
- package/dist/handoffNote.js +6 -0
- package/dist/handoffNote.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/integration.d.ts +9 -0
- package/dist/integration.d.ts.map +1 -0
- package/dist/integration.js +13 -0
- package/dist/integration.js.map +1 -0
- package/dist/integrationAuth.d.ts +8 -0
- package/dist/integrationAuth.d.ts.map +1 -0
- package/dist/integrationAuth.js +5 -0
- package/dist/integrationAuth.js.map +1 -0
- package/dist/lifecycle.d.ts +16 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +57 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/lifecycleNote.d.ts +13 -0
- package/dist/lifecycleNote.d.ts.map +1 -0
- package/dist/lifecycleNote.js +17 -0
- package/dist/lifecycleNote.js.map +1 -0
- package/dist/messages.d.ts +21 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +78 -0
- package/dist/messages.js.map +1 -0
- package/dist/prompt.d.ts +3 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +6 -0
- package/dist/prompt.js.map +1 -0
- package/dist/providers.d.ts +4 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +12 -0
- package/dist/providers.js.map +1 -0
- package/dist/types.d.ts +158 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
- package/src/conformance.ts +118 -0
- package/src/defineAgent.ts +63 -0
- package/src/definePrompt.ts +33 -0
- package/src/defineWorkflow.ts +52 -0
- package/src/delivery.ts +28 -0
- package/src/fold.ts +129 -0
- package/src/gate.ts +26 -0
- package/src/handoff.ts +58 -0
- package/src/handoffNote.ts +15 -0
- package/src/index.ts +101 -0
- package/src/integration.ts +14 -0
- package/src/integrationAuth.ts +8 -0
- package/src/lifecycle.ts +61 -0
- package/src/lifecycleNote.ts +27 -0
- package/src/messages.ts +99 -0
- package/src/prompt.ts +8 -0
- package/src/providers.ts +12 -0
- package/src/types.ts +151 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Aziz Mashkour
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# @hanfani/core
|
|
2
|
+
|
|
3
|
+
Headless engine and types for the Hanfani agent framework.
|
|
4
|
+
|
|
5
|
+
Pure logic — no I/O, no server, no React. This is the layer that defines what a
|
|
6
|
+
workflow and an agent *are* and enforces the framework's one safety invariant:
|
|
7
|
+
|
|
8
|
+
> An agent proposes, a human approves, the server acts.
|
|
9
|
+
|
|
10
|
+
`defineAgent` refuses any `effect` that isn't also an `approval`, so a side
|
|
11
|
+
effect can never be wired to fire without a human gate. `providerConformanceChecks`
|
|
12
|
+
proves any provider honours that at runtime.
|
|
13
|
+
|
|
14
|
+
## Exports
|
|
15
|
+
|
|
16
|
+
- **Definitions:** `defineAgent`, `defineWorkflow`, `definePrompt`,
|
|
17
|
+
`defineProviders`, `AgentDefinitionSchema`.
|
|
18
|
+
- **Messages:** `isAssistant`, `isToolMessage`, `toolCallsOf`,
|
|
19
|
+
`hasPendingApproval`, `pairToolResults`, `lastApprovalArgs`,
|
|
20
|
+
`resolvedApprovalCount`, `approvalResolved`.
|
|
21
|
+
- **Handoffs:** `encodeHandoff`, `decodeHandoff`, `handoffNote`,
|
|
22
|
+
`HandoffPayloadSchema`, `TicketHandoffPayloadSchema`.
|
|
23
|
+
- **Gates & events:** `gateOpened`, `readGateOpened`, `GATE_OPENED`,
|
|
24
|
+
`GateOpenedValueSchema`, `lifecycleNote`, `LIFECYCLE_NOTE_TEXT`,
|
|
25
|
+
`foldEventsToMessages`.
|
|
26
|
+
- **Lifecycle & delivery:** `lifecycle`, `hasLiveDescendant`, `resolveDelivery`,
|
|
27
|
+
`instanceId`, `composeInstructions`.
|
|
28
|
+
- **Providers & integration:** `providerConformanceChecks`, `aggregateHealth`,
|
|
29
|
+
`isOk`, `isOAuth2`.
|
|
30
|
+
- Plus the full type surface (`WorkflowDescriptor`, `Outcome`, `Phase`,
|
|
31
|
+
`Provider`, `EffectFn`, `AuthSpec`, `ResolvedCredential`, …).
|
|
32
|
+
|
|
33
|
+
## Build & test
|
|
34
|
+
|
|
35
|
+
Built with the native TypeScript 7 compiler (`tsc` / tsgo) — no bundler, no
|
|
36
|
+
compiler-API tooling, so nothing here breaks on the TS 7 upgrade.
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
pnpm build # tsc -p tsconfig.build.json → dist/*.js + dist/*.d.ts
|
|
40
|
+
pnpm typecheck # tsc -p tsconfig.json --noEmit
|
|
41
|
+
pnpm test # vitest smoke suite
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Peer runtime
|
|
45
|
+
|
|
46
|
+
Depends on `@ag-ui/client` (event/message types) and `zod` (schemas). Both are
|
|
47
|
+
declared as regular dependencies.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { RunAgentInput } from '@ag-ui/client';
|
|
2
|
+
import type { GateResolution, Provider, ResumeHandle } from './types.js';
|
|
3
|
+
export interface ConformanceScenario {
|
|
4
|
+
approvalNames: readonly string[];
|
|
5
|
+
surfaceTools: readonly string[];
|
|
6
|
+
turn1Input: RunAgentInput;
|
|
7
|
+
approved: {
|
|
8
|
+
handle: ResumeHandle;
|
|
9
|
+
resolution: GateResolution;
|
|
10
|
+
};
|
|
11
|
+
rejected: {
|
|
12
|
+
handle: ResumeHandle;
|
|
13
|
+
resolution: GateResolution;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface ConformanceCheck {
|
|
17
|
+
name: string;
|
|
18
|
+
run(makeProvider: () => Provider, scenario: ConformanceScenario): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A provider-agnostic conformance suite: any Provider implementation can be run
|
|
22
|
+
* against these checks to prove it honours the framework's gate/effect contract.
|
|
23
|
+
*/
|
|
24
|
+
export declare const providerConformanceChecks: ConformanceCheck[];
|
|
25
|
+
//# sourceMappingURL=conformance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,eAAe,CAAA;AAE7D,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAExE,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAA;IAChC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;IAC/B,UAAU,EAAE,aAAa,CAAA;IACzB,QAAQ,EAAE;QAAE,MAAM,EAAE,YAAY,CAAC;QAAC,UAAU,EAAE,cAAc,CAAA;KAAE,CAAA;IAC9D,QAAQ,EAAE;QAAE,MAAM,EAAE,YAAY,CAAC;QAAC,UAAU,EAAE,cAAc,CAAA;KAAE,CAAA;CAC/D;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,YAAY,EAAE,MAAM,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAChF;AAuBD;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,gBAAgB,EA0EvD,CAAA"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { EventType } from '@ag-ui/client';
|
|
2
|
+
import { readGateOpened } from './gate.js';
|
|
3
|
+
async function collect(events) {
|
|
4
|
+
const out = [];
|
|
5
|
+
for await (const e of events)
|
|
6
|
+
out.push(e);
|
|
7
|
+
return out;
|
|
8
|
+
}
|
|
9
|
+
function gatesIn(events) {
|
|
10
|
+
const out = [];
|
|
11
|
+
for (const e of events) {
|
|
12
|
+
const gate = readGateOpened(e);
|
|
13
|
+
if (gate)
|
|
14
|
+
out.push(gate);
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
18
|
+
function assert(cond, message) {
|
|
19
|
+
if (!cond)
|
|
20
|
+
throw new Error(`conformance: ${message}`);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A provider-agnostic conformance suite: any Provider implementation can be run
|
|
24
|
+
* against these checks to prove it honours the framework's gate/effect contract.
|
|
25
|
+
*/
|
|
26
|
+
export const providerConformanceChecks = [
|
|
27
|
+
{
|
|
28
|
+
name: 'turn 1 opens exactly one approval gate matching an approval tool',
|
|
29
|
+
async run(makeProvider, scenario) {
|
|
30
|
+
const events = await collect(makeProvider().run(scenario.turn1Input));
|
|
31
|
+
const gates = gatesIn(events);
|
|
32
|
+
assert(gates.length === 1, `expected 1 GATE_OPENED, got ${gates.length}`);
|
|
33
|
+
const gate = gates[0];
|
|
34
|
+
assert(scenario.approvalNames.includes(gate.toolName), `gate toolName "${gate.toolName}" is not an approval`);
|
|
35
|
+
const startIds = events
|
|
36
|
+
.filter((e) => e.type === EventType.TOOL_CALL_START)
|
|
37
|
+
.map((e) => e.toolCallId);
|
|
38
|
+
assert(startIds.includes(gate.toolCallId), 'gate toolCallId has no matching TOOL_CALL_START');
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'resume(approved) completes and re-opens no gate',
|
|
43
|
+
async run(makeProvider, scenario) {
|
|
44
|
+
const provider = makeProvider();
|
|
45
|
+
assert(typeof provider.resume === 'function', 'provider does not implement resume()');
|
|
46
|
+
const events = await collect(provider.resume(scenario.approved.handle, scenario.approved.resolution));
|
|
47
|
+
assert(gatesIn(events).length === 0, 'resume(approved) re-opened a gate');
|
|
48
|
+
assert(events.length > 0, 'resume(approved) produced no events');
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'resume(rejected) terminates and re-opens no gate',
|
|
53
|
+
async run(makeProvider, scenario) {
|
|
54
|
+
const provider = makeProvider();
|
|
55
|
+
assert(typeof provider.resume === 'function', 'provider does not implement resume()');
|
|
56
|
+
const events = await collect(provider.resume(scenario.rejected.handle, scenario.rejected.resolution));
|
|
57
|
+
assert(gatesIn(events).length === 0, 'resume(rejected) re-opened a gate');
|
|
58
|
+
assert(events.length > 0, 'resume(rejected) produced no events');
|
|
59
|
+
assert(events.filter((e) => e.type === EventType.TOOL_CALL_START).length === 0, 'resume(rejected) emitted a tool call (possible effect)');
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'only surfaced tools appear as tool calls on turn 1',
|
|
64
|
+
async run(makeProvider, scenario) {
|
|
65
|
+
const events = await collect(makeProvider().run(scenario.turn1Input));
|
|
66
|
+
const toolNames = events
|
|
67
|
+
.filter((e) => e.type === EventType.TOOL_CALL_START)
|
|
68
|
+
.map((e) => e.toolCallName);
|
|
69
|
+
for (const name of toolNames) {
|
|
70
|
+
assert(name !== undefined && scenario.surfaceTools.includes(name), `surfaced an undeclared tool: "${name}"`);
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: 'every TOOL_CALL_START on turn 1 has a matching TOOL_CALL_END with the same toolCallId',
|
|
76
|
+
async run(makeProvider, scenario) {
|
|
77
|
+
const events = await collect(makeProvider().run(scenario.turn1Input));
|
|
78
|
+
const startIds = events
|
|
79
|
+
.filter((e) => e.type === EventType.TOOL_CALL_START)
|
|
80
|
+
.map((e) => e.toolCallId);
|
|
81
|
+
const endIds = new Set(events
|
|
82
|
+
.filter((e) => e.type === EventType.TOOL_CALL_END)
|
|
83
|
+
.map((e) => e.toolCallId));
|
|
84
|
+
for (const id of startIds) {
|
|
85
|
+
assert(endIds.has(id), `TOOL_CALL_START id "${id}" has no matching TOOL_CALL_END`);
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
//# sourceMappingURL=conformance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conformance.js","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* The agent contract. `superRefine` enforces the framework's structural rules:
|
|
4
|
+
* approvals/renders/dispatches must be declared tools, and every effect must be
|
|
5
|
+
* an approval (so a side effect can never fire without a human gate).
|
|
6
|
+
*/
|
|
7
|
+
export declare const AgentDefinitionSchema: z.ZodEffects<z.ZodObject<{
|
|
8
|
+
id: z.ZodString;
|
|
9
|
+
name: z.ZodString;
|
|
10
|
+
provider: z.ZodString;
|
|
11
|
+
instructions: z.ZodString;
|
|
12
|
+
tools: z.ZodArray<z.ZodString, "many">;
|
|
13
|
+
approvals: z.ZodArray<z.ZodString, "many">;
|
|
14
|
+
renders: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
15
|
+
handoffs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
16
|
+
maxInstances: z.ZodDefault<z.ZodNumber>;
|
|
17
|
+
effects: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
18
|
+
readonly: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
19
|
+
dispatches: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
20
|
+
}, "strip", z.ZodTypeAny, {
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
provider: string;
|
|
24
|
+
instructions: string;
|
|
25
|
+
tools: string[];
|
|
26
|
+
approvals: string[];
|
|
27
|
+
renders: Record<string, string>;
|
|
28
|
+
handoffs?: string[] | undefined;
|
|
29
|
+
maxInstances: number;
|
|
30
|
+
effects: string[];
|
|
31
|
+
readonly: string[];
|
|
32
|
+
dispatches: string[];
|
|
33
|
+
}, {
|
|
34
|
+
id: string;
|
|
35
|
+
name: string;
|
|
36
|
+
provider: string;
|
|
37
|
+
instructions: string;
|
|
38
|
+
tools: string[];
|
|
39
|
+
approvals: string[];
|
|
40
|
+
renders: Record<string, string>;
|
|
41
|
+
handoffs?: string[] | undefined;
|
|
42
|
+
maxInstances?: number | undefined;
|
|
43
|
+
effects?: string[] | undefined;
|
|
44
|
+
readonly?: string[] | undefined;
|
|
45
|
+
dispatches?: string[] | undefined;
|
|
46
|
+
}>, {
|
|
47
|
+
id: string;
|
|
48
|
+
name: string;
|
|
49
|
+
provider: string;
|
|
50
|
+
instructions: string;
|
|
51
|
+
tools: string[];
|
|
52
|
+
approvals: string[];
|
|
53
|
+
renders: Record<string, string>;
|
|
54
|
+
handoffs?: string[] | undefined;
|
|
55
|
+
maxInstances: number;
|
|
56
|
+
effects: string[];
|
|
57
|
+
readonly: string[];
|
|
58
|
+
dispatches: string[];
|
|
59
|
+
}, {
|
|
60
|
+
id: string;
|
|
61
|
+
name: string;
|
|
62
|
+
provider: string;
|
|
63
|
+
instructions: string;
|
|
64
|
+
tools: string[];
|
|
65
|
+
approvals: string[];
|
|
66
|
+
renders: Record<string, string>;
|
|
67
|
+
handoffs?: string[] | undefined;
|
|
68
|
+
maxInstances?: number | undefined;
|
|
69
|
+
effects?: string[] | undefined;
|
|
70
|
+
readonly?: string[] | undefined;
|
|
71
|
+
dispatches?: string[] | undefined;
|
|
72
|
+
}>;
|
|
73
|
+
export type AgentDefinition = z.infer<typeof AgentDefinitionSchema>;
|
|
74
|
+
export type AgentDefinitionInput = z.input<typeof AgentDefinitionSchema>;
|
|
75
|
+
export declare function defineAgent(def: AgentDefinitionInput): AgentDefinition;
|
|
76
|
+
//# sourceMappingURL=defineAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineAgent.d.ts","sourceRoot":"","sources":["../src/defineAgent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgD9B,CAAA;AAEJ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AACnE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAExE,wBAAgB,WAAW,CAAC,GAAG,EAAE,oBAAoB,GAAG,eAAe,CAEtE"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* The agent contract. `superRefine` enforces the framework's structural rules:
|
|
4
|
+
* approvals/renders/dispatches must be declared tools, and every effect must be
|
|
5
|
+
* an approval (so a side effect can never fire without a human gate).
|
|
6
|
+
*/
|
|
7
|
+
export const AgentDefinitionSchema = z
|
|
8
|
+
.object({
|
|
9
|
+
id: z.string(),
|
|
10
|
+
name: z.string(),
|
|
11
|
+
provider: z.string(),
|
|
12
|
+
instructions: z.string(),
|
|
13
|
+
tools: z.array(z.string()),
|
|
14
|
+
approvals: z.array(z.string()),
|
|
15
|
+
renders: z.record(z.string()),
|
|
16
|
+
handoffs: z.array(z.string()).optional(),
|
|
17
|
+
maxInstances: z.number().int().positive().default(1),
|
|
18
|
+
effects: z.array(z.string()).default([]),
|
|
19
|
+
readonly: z.array(z.string()).default([]),
|
|
20
|
+
dispatches: z.array(z.string()).default([]),
|
|
21
|
+
})
|
|
22
|
+
.superRefine((def, ctx) => {
|
|
23
|
+
for (const approval of def.approvals) {
|
|
24
|
+
if (!def.tools.includes(approval)) {
|
|
25
|
+
ctx.addIssue({
|
|
26
|
+
code: z.ZodIssueCode.custom,
|
|
27
|
+
message: `approval "${approval}" is not declared in tools`,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
for (const renderKey of Object.keys(def.renders)) {
|
|
32
|
+
if (!def.tools.includes(renderKey)) {
|
|
33
|
+
ctx.addIssue({
|
|
34
|
+
code: z.ZodIssueCode.custom,
|
|
35
|
+
message: `render key "${renderKey}" is not declared in tools`,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
for (const effect of def.effects) {
|
|
40
|
+
if (!def.approvals.includes(effect)) {
|
|
41
|
+
ctx.addIssue({
|
|
42
|
+
code: z.ZodIssueCode.custom,
|
|
43
|
+
message: `effect "${effect}" is not an approval`,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
for (const dispatch of def.dispatches) {
|
|
48
|
+
if (!def.tools.includes(dispatch)) {
|
|
49
|
+
ctx.addIssue({
|
|
50
|
+
code: z.ZodIssueCode.custom,
|
|
51
|
+
message: `dispatch "${dispatch}" is not declared in tools`,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
export function defineAgent(def) {
|
|
57
|
+
return AgentDefinitionSchema.parse(def);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=defineAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineAgent.js","sourceRoot":"","sources":["../src/defineAgent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC;KACnC,MAAM,CAAC;IACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACpD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACzC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC5C,CAAC;KACD,WAAW,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACxB,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,aAAa,QAAQ,4BAA4B;aAC3D,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,eAAe,SAAS,4BAA4B;aAC9D,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,WAAW,MAAM,sBAAsB;aACjD,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACtC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,aAAa,QAAQ,4BAA4B;aAC3D,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAA;AAKJ,MAAM,UAAU,WAAW,CAAC,GAAyB;IACnD,OAAO,qBAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACzC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
import type { PromptStrategy, ResumeOutcome } from './types.js';
|
|
3
|
+
export interface PromptSpec<T> {
|
|
4
|
+
input?: z.ZodType<T>;
|
|
5
|
+
onInput?: (payload: T) => string;
|
|
6
|
+
onStart: () => string;
|
|
7
|
+
onResume?: (result: Record<string, unknown>) => ResumeOutcome;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Build a prompt strategy: on the first turn, decode any handoff payload and
|
|
11
|
+
* route it through `onInput`, else `onStart`; on resume, hand the executed
|
|
12
|
+
* result to `onResume`.
|
|
13
|
+
*/
|
|
14
|
+
export declare function definePrompt<T>(spec: PromptSpec<T>): PromptStrategy;
|
|
15
|
+
//# sourceMappingURL=definePrompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definePrompt.d.ts","sourceRoot":"","sources":["../src/definePrompt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAE5B,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/D,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,CAAA;IAChC,OAAO,EAAE,MAAM,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,aAAa,CAAA;CAC9D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,cAAc,CAenE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { decodeHandoff } from './handoff.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build a prompt strategy: on the first turn, decode any handoff payload and
|
|
4
|
+
* route it through `onInput`, else `onStart`; on resume, hand the executed
|
|
5
|
+
* result to `onResume`.
|
|
6
|
+
*/
|
|
7
|
+
export function definePrompt(spec) {
|
|
8
|
+
const { onResume } = spec;
|
|
9
|
+
return {
|
|
10
|
+
buildFirst(input) {
|
|
11
|
+
if (spec.input && spec.onInput) {
|
|
12
|
+
const payload = decodeHandoff(input, spec.input);
|
|
13
|
+
if (payload)
|
|
14
|
+
return spec.onInput(payload);
|
|
15
|
+
}
|
|
16
|
+
return spec.onStart();
|
|
17
|
+
},
|
|
18
|
+
buildResume: onResume
|
|
19
|
+
? (_args, executedResult) => onResume(executedResult ?? {})
|
|
20
|
+
: undefined,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=definePrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definePrompt.js","sourceRoot":"","sources":["../src/definePrompt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAU5C;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAI,IAAmB;IACjD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IACzB,OAAO;QACL,UAAU,CAAC,KAAoB;YAC7B,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;gBAChD,IAAI,OAAO;oBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YAC3C,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,EAAE,CAAA;QACvB,CAAC;QACD,WAAW,EAAE,QAAQ;YACnB,CAAC,CAAC,CAAC,KAA8B,EAAE,cAAwC,EAAE,EAAE,CAC3E,QAAQ,CAAC,cAAc,IAAI,EAAE,CAAC;YAClC,CAAC,CAAC,SAAS;KACd,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { WorkflowDescriptor } from './types.js';
|
|
2
|
+
/** Stable instance id for an agent within a workflow. */
|
|
3
|
+
export declare function instanceId(workflowId: string, agentId: string): string;
|
|
4
|
+
/**
|
|
5
|
+
* Validate a workflow descriptor's internal consistency: unique agent ids, a
|
|
6
|
+
* role:input entry agent, handoffs that point inside the workflow, unique input
|
|
7
|
+
* names, and inputs bound to input-role agents. Returns the descriptor as-is.
|
|
8
|
+
*/
|
|
9
|
+
export declare function defineWorkflow(def: WorkflowDescriptor): WorkflowDescriptor;
|
|
10
|
+
//# sourceMappingURL=defineWorkflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineWorkflow.d.ts","sourceRoot":"","sources":["../src/defineWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpD,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,kBAAkB,GAAG,kBAAkB,CAuC1E"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Stable instance id for an agent within a workflow. */
|
|
2
|
+
export function instanceId(workflowId, agentId) {
|
|
3
|
+
return `${workflowId}__${agentId}`;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Validate a workflow descriptor's internal consistency: unique agent ids, a
|
|
7
|
+
* role:input entry agent, handoffs that point inside the workflow, unique input
|
|
8
|
+
* names, and inputs bound to input-role agents. Returns the descriptor as-is.
|
|
9
|
+
*/
|
|
10
|
+
export function defineWorkflow(def) {
|
|
11
|
+
const agentIds = def.agents.map((a) => a.agent.id);
|
|
12
|
+
const dupAgent = agentIds.find((id, i) => agentIds.indexOf(id) !== i);
|
|
13
|
+
if (dupAgent)
|
|
14
|
+
throw new Error(`workflow "${def.id}": duplicate agent id "${dupAgent}"`);
|
|
15
|
+
const inputAgentIds = new Set(def.agents.filter((a) => a.role === 'input').map((a) => a.agent.id));
|
|
16
|
+
const allAgentIds = new Set(agentIds);
|
|
17
|
+
if (!inputAgentIds.has(def.entryAgentId)) {
|
|
18
|
+
throw new Error(`workflow "${def.id}": entry agent "${def.entryAgentId}" is not a role:input agent`);
|
|
19
|
+
}
|
|
20
|
+
for (const a of def.agents) {
|
|
21
|
+
for (const target of a.agent.handoffs ?? []) {
|
|
22
|
+
if (!allAgentIds.has(target)) {
|
|
23
|
+
throw new Error(`workflow "${def.id}": agent "${a.agent.id}" hands off to "${target}" which is not in this workflow`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const inputNames = def.inputs.map((i) => i.name);
|
|
28
|
+
const dupInput = inputNames.find((n, i) => inputNames.indexOf(n) !== i);
|
|
29
|
+
if (dupInput)
|
|
30
|
+
throw new Error(`workflow "${def.id}": duplicate published input name "${dupInput}"`);
|
|
31
|
+
for (const input of def.inputs) {
|
|
32
|
+
if (!inputAgentIds.has(input.agentId)) {
|
|
33
|
+
throw new Error(`workflow "${def.id}": input "${input.name}" is bound to "${input.agentId}" which is not a role:input agent`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return def;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=defineWorkflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineWorkflow.js","sourceRoot":"","sources":["../src/defineWorkflow.ts"],"names":[],"mappings":"AAEA,yDAAyD;AACzD,MAAM,UAAU,UAAU,CAAC,UAAkB,EAAE,OAAe;IAC5D,OAAO,GAAG,UAAU,KAAK,OAAO,EAAE,CAAA;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAuB;IACpD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IACrE,IAAI,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,EAAE,0BAA0B,QAAQ,GAAG,CAAC,CAAA;IAEvF,MAAM,aAAa,GAAG,IAAI,GAAG,CAC3B,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CACpE,CAAA;IACD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAA;IAErC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,aAAa,GAAG,CAAC,EAAE,mBAAmB,GAAG,CAAC,YAAY,6BAA6B,CACpF,CAAA;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CACb,aAAa,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,EAAE,mBAAmB,MAAM,iCAAiC,CACrG,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAChD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;IACvE,IAAI,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,EAAE,sCAAsC,QAAQ,GAAG,CAAC,CAAA;IAEnG,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CACb,aAAa,GAAG,CAAC,EAAE,aAAa,KAAK,CAAC,IAAI,kBAAkB,KAAK,CAAC,OAAO,mCAAmC,CAC7G,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DeliveryResult, Destination, WorkflowDescriptor } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve where a payload should be delivered. Agent destinations resolve
|
|
4
|
+
* directly; contract destinations validate the payload against the target
|
|
5
|
+
* workflow's published input schema before resolving.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveDelivery(workflows: WorkflowDescriptor[], origin: string, dest: Destination, payload: unknown): DeliveryResult;
|
|
8
|
+
//# sourceMappingURL=delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEjF;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,kBAAkB,EAAE,EAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,OAAO,GACf,cAAc,CAchB"}
|
package/dist/delivery.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { instanceId } from './defineWorkflow.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve where a payload should be delivered. Agent destinations resolve
|
|
4
|
+
* directly; contract destinations validate the payload against the target
|
|
5
|
+
* workflow's published input schema before resolving.
|
|
6
|
+
*/
|
|
7
|
+
export function resolveDelivery(workflows, origin, dest, payload) {
|
|
8
|
+
if (dest.kind === 'agent') {
|
|
9
|
+
return { ok: true, instanceId: instanceId(origin, dest.agentId) };
|
|
10
|
+
}
|
|
11
|
+
const workflow = workflows.find((w) => w.id === dest.workflow);
|
|
12
|
+
if (!workflow)
|
|
13
|
+
return { ok: false, error: `unknown workflow "${dest.workflow}"` };
|
|
14
|
+
const input = workflow.inputs.find((i) => i.name === dest.input);
|
|
15
|
+
if (!input)
|
|
16
|
+
return { ok: false, error: `workflow "${dest.workflow}" has no input "${dest.input}"` };
|
|
17
|
+
return input.schema.safeParse(payload).success
|
|
18
|
+
? { ok: true, instanceId: instanceId(workflow.id, input.agentId), targetWorkflow: workflow.id }
|
|
19
|
+
: { ok: false, error: `payload does not match contract "${dest.workflow}.${dest.input}"` };
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAGhD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,SAA+B,EAC/B,MAAc,EACd,IAAiB,EACjB,OAAgB;IAEhB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAA;IACnE,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC9D,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;IAEjF,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAA;IAChE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,IAAI,CAAC,QAAQ,mBAAmB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;IAEnG,OAAO,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO;QAC5C,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,EAAE;QAC/F,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;AAC9F,CAAC"}
|
package/dist/fold.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { BaseEvent, Message } from '@ag-ui/client';
|
|
2
|
+
/**
|
|
3
|
+
* Fold an ag-ui event stream into a flat list of messages: text chunks merge by
|
|
4
|
+
* messageId, tool calls attach to their parent assistant message, tool results
|
|
5
|
+
* become tool messages, and lifecycle/handoff custom events become notes.
|
|
6
|
+
*/
|
|
7
|
+
export declare function foldEventsToMessages(events: readonly BaseEvent[]): Message[];
|
|
8
|
+
//# sourceMappingURL=fold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fold.d.ts","sourceRoot":"","sources":["../src/fold.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAsCvD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,EAAE,CAoF5E"}
|
package/dist/fold.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { EventType } from '@ag-ui/client';
|
|
2
|
+
import { LIFECYCLE_NOTE_TEXT } from './lifecycleNote.js';
|
|
3
|
+
/**
|
|
4
|
+
* Fold an ag-ui event stream into a flat list of messages: text chunks merge by
|
|
5
|
+
* messageId, tool calls attach to their parent assistant message, tool results
|
|
6
|
+
* become tool messages, and lifecycle/handoff custom events become notes.
|
|
7
|
+
*/
|
|
8
|
+
export function foldEventsToMessages(events) {
|
|
9
|
+
const messages = new Map();
|
|
10
|
+
const parentByToolCall = new Map();
|
|
11
|
+
for (const raw of events) {
|
|
12
|
+
const e = raw;
|
|
13
|
+
switch (e.type) {
|
|
14
|
+
case EventType.TEXT_MESSAGE_CHUNK: {
|
|
15
|
+
const id = e.messageId;
|
|
16
|
+
if (!id)
|
|
17
|
+
break;
|
|
18
|
+
const existing = messages.get(id);
|
|
19
|
+
if (existing && existing.role === 'assistant') {
|
|
20
|
+
existing.content = (existing.content ?? '') + (e.delta ?? '');
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
messages.set(id, { id, role: 'assistant', content: e.delta ?? '' });
|
|
24
|
+
}
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
case EventType.TOOL_CALL_START: {
|
|
28
|
+
const id = e.toolCallId;
|
|
29
|
+
if (!id)
|
|
30
|
+
break;
|
|
31
|
+
const parentId = e.parentMessageId ?? `tc-${id}`;
|
|
32
|
+
let parent = messages.get(parentId);
|
|
33
|
+
if (!parent || parent.role !== 'assistant') {
|
|
34
|
+
parent = { id: parentId, role: 'assistant', content: '', toolCalls: [] };
|
|
35
|
+
messages.set(parentId, parent);
|
|
36
|
+
}
|
|
37
|
+
parent.toolCalls ||= [];
|
|
38
|
+
parent.toolCalls.push({
|
|
39
|
+
id,
|
|
40
|
+
type: 'function',
|
|
41
|
+
function: { name: e.toolCallName ?? '', arguments: '' },
|
|
42
|
+
});
|
|
43
|
+
parentByToolCall.set(id, parentId);
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case EventType.TOOL_CALL_ARGS: {
|
|
47
|
+
const id = e.toolCallId;
|
|
48
|
+
if (!id)
|
|
49
|
+
break;
|
|
50
|
+
const parentId = parentByToolCall.get(id);
|
|
51
|
+
if (!parentId)
|
|
52
|
+
break;
|
|
53
|
+
const call = messages.get(parentId)?.toolCalls?.find((c) => c.id === id);
|
|
54
|
+
if (call)
|
|
55
|
+
call.function.arguments += e.delta ?? '';
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case EventType.TOOL_CALL_END:
|
|
59
|
+
break;
|
|
60
|
+
case EventType.TOOL_CALL_RESULT: {
|
|
61
|
+
const id = e.toolCallId;
|
|
62
|
+
const msgId = e.messageId ?? (id ? `result-${id}` : undefined);
|
|
63
|
+
if (!msgId || !id)
|
|
64
|
+
break;
|
|
65
|
+
messages.set(msgId, { id: msgId, role: 'tool', toolCallId: id, content: e.content ?? '' });
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
case EventType.CUSTOM: {
|
|
69
|
+
if (e.name === 'lifecycle') {
|
|
70
|
+
const v = e.value;
|
|
71
|
+
if (v && v.outcome !== undefined) {
|
|
72
|
+
const text = LIFECYCLE_NOTE_TEXT[v.outcome] || v.outcome;
|
|
73
|
+
const id = `lifecycle-${v.at}`;
|
|
74
|
+
messages.set(id, { id, role: 'system', content: text });
|
|
75
|
+
}
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
if (e.name === 'handoff' && e.value) {
|
|
79
|
+
const v = e.value;
|
|
80
|
+
const id = `handoff-${v.childWorkItemId}`;
|
|
81
|
+
messages.set(id, {
|
|
82
|
+
id,
|
|
83
|
+
role: 'handoff',
|
|
84
|
+
targetAgentId: v.targetAgentId,
|
|
85
|
+
childWorkItemId: v.childWorkItemId,
|
|
86
|
+
deduped: v.deduped,
|
|
87
|
+
});
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
default:
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return [...messages.values()];
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=fold.js.map
|
package/dist/fold.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fold.js","sourceRoot":"","sources":["../src/fold.ts"],"names":[],"mappings":"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"}
|
package/dist/gate.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { BaseEvent, CustomEvent as AguiCustomEvent } from '@ag-ui/client';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
export declare const GATE_OPENED: 'GATE_OPENED';
|
|
4
|
+
export declare const GateOpenedValueSchema: z.ZodObject<{
|
|
5
|
+
gateKind: z.ZodLiteral<"approval">;
|
|
6
|
+
toolName: z.ZodString;
|
|
7
|
+
toolCallId: z.ZodString;
|
|
8
|
+
proposedArtifact: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
gateKind: "approval";
|
|
11
|
+
toolName: string;
|
|
12
|
+
toolCallId: string;
|
|
13
|
+
proposedArtifact: Record<string, unknown>;
|
|
14
|
+
}, {
|
|
15
|
+
gateKind: "approval";
|
|
16
|
+
toolName: string;
|
|
17
|
+
toolCallId: string;
|
|
18
|
+
proposedArtifact: Record<string, unknown>;
|
|
19
|
+
}>;
|
|
20
|
+
export type GateOpenedValue = z.infer<typeof GateOpenedValueSchema>;
|
|
21
|
+
/** Emit the custom event that opens a human-approval gate. */
|
|
22
|
+
export declare function gateOpened(value: GateOpenedValue): AguiCustomEvent;
|
|
23
|
+
/** Read a GATE_OPENED value off an event, or null if it isn't one. */
|
|
24
|
+
export declare function readGateOpened(event: BaseEvent): GateOpenedValue | null;
|
|
25
|
+
//# sourceMappingURL=gate.d.ts.map
|