@ouispec/agent-worker 0.1.0
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 +175 -0
- package/dist/approvals/client.d.ts +29 -0
- package/dist/approvals/client.d.ts.map +1 -0
- package/dist/approvals/client.js +50 -0
- package/dist/approvals/client.js.map +1 -0
- package/dist/approvals/continuation.d.ts +28 -0
- package/dist/approvals/continuation.d.ts.map +1 -0
- package/dist/approvals/continuation.js +43 -0
- package/dist/approvals/continuation.js.map +1 -0
- package/dist/approvals/preview.d.ts +15 -0
- package/dist/approvals/preview.d.ts.map +1 -0
- package/dist/approvals/preview.js +33 -0
- package/dist/approvals/preview.js.map +1 -0
- package/dist/approvals/requirement.d.ts +15 -0
- package/dist/approvals/requirement.d.ts.map +1 -0
- package/dist/approvals/requirement.js +26 -0
- package/dist/approvals/requirement.js.map +1 -0
- package/dist/authz/tool-policy.d.ts +63 -0
- package/dist/authz/tool-policy.d.ts.map +1 -0
- package/dist/authz/tool-policy.js +23 -0
- package/dist/authz/tool-policy.js.map +1 -0
- package/dist/container/server.d.ts +24 -0
- package/dist/container/server.d.ts.map +1 -0
- package/dist/container/server.js +119 -0
- package/dist/container/server.js.map +1 -0
- package/dist/emit/http-adapter.d.ts +15 -0
- package/dist/emit/http-adapter.d.ts.map +1 -0
- package/dist/emit/http-adapter.js +35 -0
- package/dist/emit/http-adapter.js.map +1 -0
- package/dist/emit/types.d.ts +9 -0
- package/dist/emit/types.d.ts.map +1 -0
- package/dist/emit/types.js +7 -0
- package/dist/emit/types.js.map +1 -0
- package/dist/events/http-waiter.d.ts +19 -0
- package/dist/events/http-waiter.d.ts.map +1 -0
- package/dist/events/http-waiter.js +20 -0
- package/dist/events/http-waiter.js.map +1 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/lambda/handler.d.ts +38 -0
- package/dist/lambda/handler.d.ts.map +1 -0
- package/dist/lambda/handler.js +26 -0
- package/dist/lambda/handler.js.map +1 -0
- package/dist/model.d.ts +33 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +15 -0
- package/dist/model.js.map +1 -0
- package/dist/openapi/document.d.ts +87 -0
- package/dist/openapi/document.d.ts.map +1 -0
- package/dist/openapi/document.js +117 -0
- package/dist/openapi/document.js.map +1 -0
- package/dist/openapi/executor.d.ts +51 -0
- package/dist/openapi/executor.d.ts.map +1 -0
- package/dist/openapi/executor.js +140 -0
- package/dist/openapi/executor.js.map +1 -0
- package/dist/openapi/index.d.ts +14 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +9 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/openapi/loader.d.ts +81 -0
- package/dist/openapi/loader.d.ts.map +1 -0
- package/dist/openapi/loader.js +361 -0
- package/dist/openapi/loader.js.map +1 -0
- package/dist/openapi/x-agent.d.ts +34 -0
- package/dist/openapi/x-agent.d.ts.map +1 -0
- package/dist/openapi/x-agent.js +102 -0
- package/dist/openapi/x-agent.js.map +1 -0
- package/dist/orchestrator.d.ts +12 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +1019 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/prompt/builder.d.ts +29 -0
- package/dist/prompt/builder.d.ts.map +1 -0
- package/dist/prompt/builder.js +129 -0
- package/dist/prompt/builder.js.map +1 -0
- package/dist/prompt/index.d.ts +15 -0
- package/dist/prompt/index.d.ts.map +1 -0
- package/dist/prompt/index.js +13 -0
- package/dist/prompt/index.js.map +1 -0
- package/dist/prompt/rules/base.d.ts +6 -0
- package/dist/prompt/rules/base.d.ts.map +1 -0
- package/dist/prompt/rules/base.js +38 -0
- package/dist/prompt/rules/base.js.map +1 -0
- package/dist/prompt/rules/communication.d.ts +7 -0
- package/dist/prompt/rules/communication.d.ts.map +1 -0
- package/dist/prompt/rules/communication.js +53 -0
- package/dist/prompt/rules/communication.js.map +1 -0
- package/dist/prompt/rules/tool-strategy.d.ts +6 -0
- package/dist/prompt/rules/tool-strategy.d.ts.map +1 -0
- package/dist/prompt/rules/tool-strategy.js +42 -0
- package/dist/prompt/rules/tool-strategy.js.map +1 -0
- package/dist/prompt/rules/ui-control.d.ts +10 -0
- package/dist/prompt/rules/ui-control.d.ts.map +1 -0
- package/dist/prompt/rules/ui-control.js +44 -0
- package/dist/prompt/rules/ui-control.js.map +1 -0
- package/dist/prompt/types.d.ts +85 -0
- package/dist/prompt/types.d.ts.map +1 -0
- package/dist/prompt/types.js +10 -0
- package/dist/prompt/types.js.map +1 -0
- package/dist/realtime/long-poll.d.ts +21 -0
- package/dist/realtime/long-poll.d.ts.map +1 -0
- package/dist/realtime/long-poll.js +36 -0
- package/dist/realtime/long-poll.js.map +1 -0
- package/dist/runtime/config.d.ts +4 -0
- package/dist/runtime/config.d.ts.map +1 -0
- package/dist/runtime/config.js +29 -0
- package/dist/runtime/config.js.map +1 -0
- package/dist/runtime/turn-runner.d.ts +32 -0
- package/dist/runtime/turn-runner.d.ts.map +1 -0
- package/dist/runtime/turn-runner.js +216 -0
- package/dist/runtime/turn-runner.js.map +1 -0
- package/dist/runtime/types.d.ts +244 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/testing/desk-events.d.ts +12 -0
- package/dist/testing/desk-events.d.ts.map +1 -0
- package/dist/testing/desk-events.js +62 -0
- package/dist/testing/desk-events.js.map +1 -0
- package/dist/testing/index.d.ts +8 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +7 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/openapi-fixture.d.ts +47 -0
- package/dist/testing/openapi-fixture.d.ts.map +1 -0
- package/dist/testing/openapi-fixture.js +370 -0
- package/dist/testing/openapi-fixture.js.map +1 -0
- package/dist/tools/async-binding.d.ts +71 -0
- package/dist/tools/async-binding.d.ts.map +1 -0
- package/dist/tools/async-binding.js +104 -0
- package/dist/tools/async-binding.js.map +1 -0
- package/dist/tools/builtin-tools.d.ts +20 -0
- package/dist/tools/builtin-tools.d.ts.map +1 -0
- package/dist/tools/builtin-tools.js +108 -0
- package/dist/tools/builtin-tools.js.map +1 -0
- package/dist/tools/entity-tools.d.ts +6 -0
- package/dist/tools/entity-tools.d.ts.map +1 -0
- package/dist/tools/entity-tools.js +227 -0
- package/dist/tools/entity-tools.js.map +1 -0
- package/dist/tools/input-validation.d.ts +16 -0
- package/dist/tools/input-validation.d.ts.map +1 -0
- package/dist/tools/input-validation.js +75 -0
- package/dist/tools/input-validation.js.map +1 -0
- package/dist/tools/load-all-tools.d.ts +12 -0
- package/dist/tools/load-all-tools.d.ts.map +1 -0
- package/dist/tools/load-all-tools.js +42 -0
- package/dist/tools/load-all-tools.js.map +1 -0
- package/dist/tools/schema-loader.d.ts +24 -0
- package/dist/tools/schema-loader.d.ts.map +1 -0
- package/dist/tools/schema-loader.js +267 -0
- package/dist/tools/schema-loader.js.map +1 -0
- package/dist/tools/types.d.ts +85 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +22 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/turn-policy.d.ts +68 -0
- package/dist/turn-policy.d.ts.map +1 -0
- package/dist/turn-policy.js +21 -0
- package/dist/turn-policy.js.map +1 -0
- package/dist/types.d.ts +151 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/channel.d.ts +64 -0
- package/dist/ui/channel.d.ts.map +1 -0
- package/dist/ui/channel.js +81 -0
- package/dist/ui/channel.js.map +1 -0
- package/dist/ui/knowledge.d.ts +30 -0
- package/dist/ui/knowledge.d.ts.map +1 -0
- package/dist/ui/knowledge.js +66 -0
- package/dist/ui/knowledge.js.map +1 -0
- package/dist/ui/observations.d.ts +41 -0
- package/dist/ui/observations.d.ts.map +1 -0
- package/dist/ui/observations.js +236 -0
- package/dist/ui/observations.js.map +1 -0
- package/dist/ui/snapshot.d.ts +33 -0
- package/dist/ui/snapshot.d.ts.map +1 -0
- package/dist/ui/snapshot.js +75 -0
- package/dist/ui/snapshot.js.map +1 -0
- package/dist/ui/ui-sequence.d.ts +75 -0
- package/dist/ui/ui-sequence.d.ts.map +1 -0
- package/dist/ui/ui-sequence.js +73 -0
- package/dist/ui/ui-sequence.js.map +1 -0
- package/dist/ui/ui-tools.d.ts +59 -0
- package/dist/ui/ui-tools.d.ts.map +1 -0
- package/dist/ui/ui-tools.js +244 -0
- package/dist/ui/ui-tools.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate a tool call's input against the tool's declared input schema before it runs.
|
|
3
|
+
*
|
|
4
|
+
* The orchestrator hands tools to the model as raw JSON Schema (`jsonSchema(rawSchema)`),
|
|
5
|
+
* which carries no validator, and a tool call's arguments are whatever the model
|
|
6
|
+
* produced. Without this check a host's tool receives undeclared and mistyped fields:
|
|
7
|
+
* a generated entity update tool passed every key the model supplied straight to a
|
|
8
|
+
* database write.
|
|
9
|
+
*
|
|
10
|
+
* Validation is by the schema as declared. A tool that must refuse undeclared
|
|
11
|
+
* properties says so with `additionalProperties: false`, as the schema loader and the
|
|
12
|
+
* entity tool generator now do.
|
|
13
|
+
*/
|
|
14
|
+
import { Ajv } from 'ajv';
|
|
15
|
+
import formatsPlugin from 'ajv-formats';
|
|
16
|
+
// ajv-formats is CommonJS; under ESM interop its function is on `default`.
|
|
17
|
+
const addFormats = formatsPlugin.default ??
|
|
18
|
+
formatsPlugin;
|
|
19
|
+
/**
|
|
20
|
+
* Top-level keys removed before compiling:
|
|
21
|
+
* - `sideEffects`: the SDK's own flag, stored on the input schema; not JSON Schema.
|
|
22
|
+
* - `$schema`: hosts emit different drafts (e.g. 2020-12 from zod); the keywords tools
|
|
23
|
+
* use are the same across them, and an unknown draft must not stop a tool working.
|
|
24
|
+
* - `$id`: two tools declaring the same id would collide in the compiler.
|
|
25
|
+
*/
|
|
26
|
+
const NON_VALIDATION_KEYS = ['sideEffects', '$schema', '$id'];
|
|
27
|
+
const ajv = new Ajv({ allErrors: true, strict: false, useDefaults: false, coerceTypes: false });
|
|
28
|
+
addFormats(ajv);
|
|
29
|
+
function describeError(error) {
|
|
30
|
+
const at = error.instancePath || '(input)';
|
|
31
|
+
const params = error.params;
|
|
32
|
+
if (error.keyword === 'additionalProperties') {
|
|
33
|
+
return `${at} has a property this tool does not accept: "${String(params.additionalProperty)}"`;
|
|
34
|
+
}
|
|
35
|
+
if (error.keyword === 'required') {
|
|
36
|
+
return `${at} is missing required property "${String(params.missingProperty)}"`;
|
|
37
|
+
}
|
|
38
|
+
return `${at} ${error.message ?? 'is invalid'}`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Compile a validator for a tool's input schema.
|
|
42
|
+
*
|
|
43
|
+
* A schema that cannot be compiled yields a validator that rejects every call: a tool
|
|
44
|
+
* whose input cannot be checked does not run.
|
|
45
|
+
*/
|
|
46
|
+
export function createToolInputValidator(inputSchema) {
|
|
47
|
+
const schema = { ...(inputSchema ?? { type: 'object', properties: {} }) };
|
|
48
|
+
for (const key of NON_VALIDATION_KEYS)
|
|
49
|
+
delete schema[key];
|
|
50
|
+
let validate;
|
|
51
|
+
try {
|
|
52
|
+
validate = ajv.compile(schema);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
56
|
+
return () => ({ ok: false, errors: [`this tool's input schema is invalid (${reason})`] });
|
|
57
|
+
}
|
|
58
|
+
const required = new Set(Array.isArray(schema.required) ? schema.required.map(String) : []);
|
|
59
|
+
return (input) => {
|
|
60
|
+
if (input === null || typeof input !== 'object' || Array.isArray(input)) {
|
|
61
|
+
return { ok: false, errors: ['(input) must be an object'] };
|
|
62
|
+
}
|
|
63
|
+
// Models often send null for an optional argument they mean to leave out.
|
|
64
|
+
const value = {};
|
|
65
|
+
for (const [key, entry] of Object.entries(input)) {
|
|
66
|
+
if (entry === null && !required.has(key))
|
|
67
|
+
continue;
|
|
68
|
+
value[key] = entry;
|
|
69
|
+
}
|
|
70
|
+
if (validate(value))
|
|
71
|
+
return { ok: true, value };
|
|
72
|
+
return { ok: false, errors: (validate.errors ?? []).map(describeError) };
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=input-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-validation.js","sourceRoot":"","sources":["../../src/tools/input-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RegisteredTool } from './types.js';
|
|
2
|
+
import type { LoadToolsOptions } from './schema-loader.js';
|
|
3
|
+
export interface LoadAllToolsOptions extends LoadToolsOptions {
|
|
4
|
+
/** Path to the schema directory (e.g. ./schemas/my-app/) */
|
|
5
|
+
schemasDir: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Generate the complete tool registry from schema + built-ins.
|
|
9
|
+
* This is the only tool-loading function a host worker should call.
|
|
10
|
+
*/
|
|
11
|
+
export declare function loadAllTools(options: LoadAllToolsOptions): Promise<RegisteredTool[]>;
|
|
12
|
+
//# sourceMappingURL=load-all-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-all-tools.d.ts","sourceRoot":"","sources":["../../src/tools/load-all-tools.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAuB1F"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loadAllTools — the single entry point for generating the complete tool
|
|
3
|
+
* registry from schema. Combines:
|
|
4
|
+
* 1. Intent tools (from intents/*.yaml) → apiSurface.executeIntent
|
|
5
|
+
* 2. Entity CRUD tools (from entities/*.yaml) → apiSurface.queryEntities/mutateEntity
|
|
6
|
+
* 3. Built-in interaction tools (SDK-owned, generic)
|
|
7
|
+
*
|
|
8
|
+
* This replaces hand-authored tool definitions entirely. The host provides
|
|
9
|
+
* schemas (generated by introspection) + an apiSurface binding; the SDK
|
|
10
|
+
* generates every tool.
|
|
11
|
+
*
|
|
12
|
+
* @see docs/reference/integration-contract.md §4
|
|
13
|
+
*/
|
|
14
|
+
import { loadToolsFromSchema } from './schema-loader.js';
|
|
15
|
+
import { loadEntityToolsFromSchema } from './entity-tools.js';
|
|
16
|
+
import { loadBuiltinTools } from './builtin-tools.js';
|
|
17
|
+
/**
|
|
18
|
+
* Generate the complete tool registry from schema + built-ins.
|
|
19
|
+
* This is the only tool-loading function a host worker should call.
|
|
20
|
+
*/
|
|
21
|
+
export async function loadAllTools(options) {
|
|
22
|
+
const [intentTools, entityTools] = await Promise.all([
|
|
23
|
+
loadToolsFromSchema(options.schemasDir, {
|
|
24
|
+
...(options.events ? { events: options.events } : {}),
|
|
25
|
+
...(options.waiter ? { waiter: options.waiter } : {}),
|
|
26
|
+
}),
|
|
27
|
+
loadEntityToolsFromSchema(options.schemasDir),
|
|
28
|
+
]);
|
|
29
|
+
const builtinTools = loadBuiltinTools();
|
|
30
|
+
// Merge, deduping by name (entity CRUD may overlap with intent tools for
|
|
31
|
+
// entities that also have explicit intents like create-character)
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
const all = [];
|
|
34
|
+
for (const tool of [...intentTools, ...entityTools, ...builtinTools]) {
|
|
35
|
+
if (!seen.has(tool.name)) {
|
|
36
|
+
seen.add(tool.name);
|
|
37
|
+
all.push(tool);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return all;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=load-all-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-all-tools.js","sourceRoot":"","sources":["../../src/tools/load-all-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAStD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA4B;IAC7D,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACnD,mBAAmB,CAAC,OAAO,CAAC,UAAU,EAAE;YACtC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC;QACF,yBAAyB,CAAC,OAAO,CAAC,UAAU,CAAC;KAC9C,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;IAExC,yEAAyE;IACzE,kEAAkE;IAClE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,WAAW,EAAE,GAAG,WAAW,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { RegisteredTool } from './types.js';
|
|
2
|
+
import type { EventCatalog, EventWaiter } from '@ouispec/agent-events';
|
|
3
|
+
export interface LoadToolsOptions {
|
|
4
|
+
/**
|
|
5
|
+
* The product's event declarations. Required when any intent waits
|
|
6
|
+
* (`execution.subscribe`): each names declared events, or the tools fail to
|
|
7
|
+
* load, naming the intent and the event.
|
|
8
|
+
*/
|
|
9
|
+
events?: EventCatalog;
|
|
10
|
+
/**
|
|
11
|
+
* How an async intent waits for its job to settle
|
|
12
|
+
* (`createHttpEventWaiter`, or the host's own). Without it an async intent
|
|
13
|
+
* returns its dispatch at once, with the job id.
|
|
14
|
+
*/
|
|
15
|
+
waiter?: EventWaiter;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Load intent schemas from a directory and compile them into RegisteredTool[].
|
|
19
|
+
*
|
|
20
|
+
* @param schemasDir Path to the schema directory (e.g. './schemas/my-app/')
|
|
21
|
+
* @param options Optional subscription adapter for async intent resolution
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadToolsFromSchema(schemasDir: string, options?: LoadToolsOptions): Promise<RegisteredTool[]>;
|
|
24
|
+
//# sourceMappingURL=schema-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-loader.d.ts","sourceRoot":"","sources":["../../src/tools/schema-loader.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGvE,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAWD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,cAAc,EAAE,CAAC,CAK3B"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loadToolsFromSchema — generates a RegisteredTool[] from declarative intent
|
|
3
|
+
* schemas (intents/*.yaml). This is the schema-driven replacement for
|
|
4
|
+
* hand-authored tool definitions.
|
|
5
|
+
*
|
|
6
|
+
* Each generated tool's `execute` calls the host's AgentApiSurface binding
|
|
7
|
+
* (`ctx.apiSurface.executeIntent(intentId, params)`) — the host never writes
|
|
8
|
+
* a tool body. An async intent's `subscribe:` block names the declared events
|
|
9
|
+
* that settle its job (W9): they are checked against the product's event
|
|
10
|
+
* declarations when the tools load, and with a waiter the tool waits for the
|
|
11
|
+
* job to complete or fail.
|
|
12
|
+
*
|
|
13
|
+
* @see docs/reference/integration-contract.md §1b, §4
|
|
14
|
+
*/
|
|
15
|
+
import { loadSchemas } from '@ouispec/agent-core';
|
|
16
|
+
import { asyncToolResult, awaitAsyncTool, bindAsyncTool, parseWaitTimeout } from './async-binding.js';
|
|
17
|
+
/**
|
|
18
|
+
* Load intent schemas from a directory and compile them into RegisteredTool[].
|
|
19
|
+
*
|
|
20
|
+
* @param schemasDir Path to the schema directory (e.g. './schemas/my-app/')
|
|
21
|
+
* @param options Optional subscription adapter for async intent resolution
|
|
22
|
+
*/
|
|
23
|
+
export async function loadToolsFromSchema(schemasDir, options) {
|
|
24
|
+
const documents = await loadSchemas(schemasDir);
|
|
25
|
+
const intents = extractIntents(documents);
|
|
26
|
+
return intents.map((intent) => compileIntentToTool(intent, bindIntent(intent, options ?? {}), options?.waiter));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Bind an intent's `subscribe` block to the declarations, or throw naming the
|
|
30
|
+
* intent and what is wrong. Null for an intent that does not wait.
|
|
31
|
+
*/
|
|
32
|
+
function bindIntent(intent, options) {
|
|
33
|
+
const sub = intent.execution?.subscribe;
|
|
34
|
+
if (!sub)
|
|
35
|
+
return null;
|
|
36
|
+
const usedBy = `intent '${intent.id}'`;
|
|
37
|
+
if (!options.events) {
|
|
38
|
+
throw new Error(`[agent-sdk] ${usedBy} waits on '${sub.event}', but no event declarations were given (LoadToolsOptions.events)`);
|
|
39
|
+
}
|
|
40
|
+
const filter = Object.entries(sub.filter ?? {});
|
|
41
|
+
if (filter.length !== 1) {
|
|
42
|
+
throw new Error(`[agent-sdk] ${usedBy}: subscribe.filter must name exactly one field, the job id of '${sub.event}' (it names ${filter.length})`);
|
|
43
|
+
}
|
|
44
|
+
const [[correlation, idFrom]] = filter;
|
|
45
|
+
const bound = bindAsyncTool(options.events, {
|
|
46
|
+
usedBy,
|
|
47
|
+
completion: sub.event,
|
|
48
|
+
...(sub.failure !== undefined ? { failure: sub.failure } : {}),
|
|
49
|
+
correlation,
|
|
50
|
+
timeoutMs: parseWaitTimeout(usedBy, 'subscribe.timeout', sub.timeout),
|
|
51
|
+
...(sub.resultMapping ? { resultMapping: sub.resultMapping } : {}),
|
|
52
|
+
mappingLabel: 'subscribe.resultMapping',
|
|
53
|
+
});
|
|
54
|
+
return { bound, idFrom, events: options.events, waiter: options.waiter };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Flatten all intent definitions from loaded schema documents.
|
|
58
|
+
* Intents appear either as top-level `doc.intent` or nested in
|
|
59
|
+
* `doc.domain.intents[]` (after $ref resolution).
|
|
60
|
+
*/
|
|
61
|
+
function extractIntents(documents) {
|
|
62
|
+
const intents = [];
|
|
63
|
+
for (const doc of documents) {
|
|
64
|
+
if (doc.intent) {
|
|
65
|
+
intents.push(doc.intent);
|
|
66
|
+
}
|
|
67
|
+
if (doc.domain?.intents) {
|
|
68
|
+
for (const i of doc.domain.intents) {
|
|
69
|
+
if (typeof i === 'object' && i !== null && 'id' in i) {
|
|
70
|
+
intents.push(i);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Deduplicate by id (domain $ref + standalone file may overlap)
|
|
76
|
+
const seen = new Set();
|
|
77
|
+
return intents.filter((i) => {
|
|
78
|
+
if (seen.has(i.id))
|
|
79
|
+
return false;
|
|
80
|
+
seen.add(i.id);
|
|
81
|
+
return true;
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Compile a single intent schema into a RegisteredTool.
|
|
86
|
+
*/
|
|
87
|
+
function compileIntentToTool(intent, asyncIntent, waiter) {
|
|
88
|
+
const inputSchema = convertParameters(intent.parameters);
|
|
89
|
+
// Thread the sideEffects flag into the inputSchema so the orchestrator's
|
|
90
|
+
// quota check (`inputSchema.sideEffects !== false`) reads a real value
|
|
91
|
+
// instead of always getting `undefined` (which fail-closed to side-effecting).
|
|
92
|
+
if (intent.sideEffects === false) {
|
|
93
|
+
inputSchema.sideEffects = false;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
name: intent.id,
|
|
97
|
+
description: buildDescription(intent, !!(asyncIntent && waiter)),
|
|
98
|
+
inputSchema,
|
|
99
|
+
async execute(input, ctx) {
|
|
100
|
+
return executeIntent(intent, input, ctx, asyncIntent);
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Build the tool description from the intent, enriching with async/duration
|
|
106
|
+
* hints so the LLM knows what to expect.
|
|
107
|
+
*/
|
|
108
|
+
function buildDescription(intent, waits) {
|
|
109
|
+
let desc = intent.description;
|
|
110
|
+
if (intent.outcome?.async) {
|
|
111
|
+
desc += `\n\nAsync: returns a jobId. Estimated duration: ${intent.outcome.estimatedDuration ?? 'unknown'}.`;
|
|
112
|
+
// Promise the event only when the tool will actually wait for it.
|
|
113
|
+
if (waits && intent.execution?.subscribe) {
|
|
114
|
+
desc += ` The result arrives via the ${intent.execution.subscribe.event} realtime event.`;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (intent.outcome?.produces) {
|
|
118
|
+
desc += `\nProduces: ${intent.outcome.produces}.`;
|
|
119
|
+
}
|
|
120
|
+
return desc;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Convert RawParameterSchema (YAML) into a JSON Schema object for the LLM.
|
|
124
|
+
* Entity-typed parameters become string references (the LLM passes an entity ID).
|
|
125
|
+
*/
|
|
126
|
+
function convertParameters(parameters) {
|
|
127
|
+
const properties = {};
|
|
128
|
+
const required = [];
|
|
129
|
+
for (const [name, param] of Object.entries(parameters)) {
|
|
130
|
+
properties[name] = convertProperty(param);
|
|
131
|
+
if (param.required) {
|
|
132
|
+
required.push(name);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
type: 'object',
|
|
137
|
+
properties,
|
|
138
|
+
...(required.length > 0 ? { required } : {}),
|
|
139
|
+
// An intent accepts exactly the parameters it declares. The orchestrator
|
|
140
|
+
// validates calls against this, so an undeclared argument never reaches the host.
|
|
141
|
+
additionalProperties: false,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function convertProperty(param) {
|
|
145
|
+
const schema = {};
|
|
146
|
+
// Entity-typed params are string IDs at the LLM layer
|
|
147
|
+
if (param.type === 'entity') {
|
|
148
|
+
schema.type = 'string';
|
|
149
|
+
if (param.entity) {
|
|
150
|
+
schema.description = param.description
|
|
151
|
+
? `${param.description} (entity: ${param.entity} — pass the ID)`
|
|
152
|
+
: `Entity reference (${param.entity}) — pass the ID`;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else if (param.type === 'enum') {
|
|
156
|
+
schema.type = 'string';
|
|
157
|
+
if (param.values)
|
|
158
|
+
schema.enum = param.values;
|
|
159
|
+
}
|
|
160
|
+
else if (param.type === 'array') {
|
|
161
|
+
schema.type = 'array';
|
|
162
|
+
if (param.items)
|
|
163
|
+
schema.items = convertProperty(param.items);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
schema.type = param.type;
|
|
167
|
+
}
|
|
168
|
+
if (param.description && param.type !== 'entity') {
|
|
169
|
+
schema.description = param.description;
|
|
170
|
+
}
|
|
171
|
+
if (param.maxLength !== undefined)
|
|
172
|
+
schema.maxLength = param.maxLength;
|
|
173
|
+
if (param.minLength !== undefined)
|
|
174
|
+
schema.minLength = param.minLength;
|
|
175
|
+
if (param.default !== undefined)
|
|
176
|
+
schema.default = param.default;
|
|
177
|
+
return schema;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Execute an intent via the host's AgentApiSurface binding.
|
|
181
|
+
*
|
|
182
|
+
* This is the heart of the schema-driven model: the tool body is generated,
|
|
183
|
+
* not hand-authored. It calls `ctx.apiSurface.executeIntent(intentId, params)`
|
|
184
|
+
* — the host's binding decides whether that hits a REST route, a gateway
|
|
185
|
+
* inference endpoint, or anything else.
|
|
186
|
+
*/
|
|
187
|
+
async function executeIntent(intent, input, ctx, asyncIntent) {
|
|
188
|
+
const apiSurface = ctx.apiSurface;
|
|
189
|
+
if (!apiSurface) {
|
|
190
|
+
return {
|
|
191
|
+
success: false,
|
|
192
|
+
error: `Intent '${intent.id}' requires an AgentApiSurface binding in the tool execution context. Provide apiSurface in the worker config.`,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
let result;
|
|
196
|
+
try {
|
|
197
|
+
result = await apiSurface.executeIntent(intent.id, input);
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
return {
|
|
201
|
+
success: false,
|
|
202
|
+
error: `Intent '${intent.id}' threw: ${err instanceof Error ? err.message : String(err)}`,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
if (!result.success) {
|
|
206
|
+
return {
|
|
207
|
+
success: false,
|
|
208
|
+
error: result.error?.message ?? `Intent '${intent.id}' failed`,
|
|
209
|
+
data: result,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
const exec = intent.execution;
|
|
213
|
+
const mapped = applyResultMapping(exec, result);
|
|
214
|
+
if (!result.async?.jobId || !asyncIntent?.waiter) {
|
|
215
|
+
// Sync intent, or async without a waiter: the dispatch, with clean field names.
|
|
216
|
+
return { success: true, data: mapped };
|
|
217
|
+
}
|
|
218
|
+
// Wait for the job to settle: its declared completion or failure.
|
|
219
|
+
const dispatchData = result.data ?? {};
|
|
220
|
+
const id = resolveTemplateString(String(asyncIntent.idFrom), { response: dispatchData });
|
|
221
|
+
const settled = await awaitAsyncTool(asyncIntent.events, asyncIntent.waiter, asyncIntent.bound, id, ctx.abortSignal);
|
|
222
|
+
return asyncToolResult(mapped, settled, { ...dispatchData, jobId: result.async.jobId });
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Apply execution.resultMapping to the dispatch response so the LLM sees
|
|
226
|
+
* clean field names (jobId, imageId, status) rather than raw response shapes.
|
|
227
|
+
*/
|
|
228
|
+
function applyResultMapping(exec, result) {
|
|
229
|
+
const base = {
|
|
230
|
+
...(result.data ?? {}),
|
|
231
|
+
};
|
|
232
|
+
if (result.async) {
|
|
233
|
+
base.jobId = result.async.jobId;
|
|
234
|
+
base.status = result.async.jobId ? (result.data?.status ?? 'dispatched') : base.status;
|
|
235
|
+
}
|
|
236
|
+
if (exec?.resultMapping) {
|
|
237
|
+
const mapped = {};
|
|
238
|
+
const rMapping = exec.resultMapping;
|
|
239
|
+
for (const [target, sourceExpr] of Object.entries(rMapping)) {
|
|
240
|
+
const sourcePath = sourceExpr.replace(/\$\{\s*response\./, '').replace(/\s*\}/, '').trim();
|
|
241
|
+
mapped[target] = getByPath(base, sourcePath);
|
|
242
|
+
}
|
|
243
|
+
// Merge mapped fields over base so both raw + mapped are available
|
|
244
|
+
return { ...base, ...mapped };
|
|
245
|
+
}
|
|
246
|
+
return base;
|
|
247
|
+
}
|
|
248
|
+
// ─── template helpers ──────────────────────────────────────────────────────
|
|
249
|
+
function resolveTemplateString(str, ctx) {
|
|
250
|
+
const match = str.match(/^\$\{\s*(\w+)\.([^}]+?)\s*\}$/);
|
|
251
|
+
if (!match)
|
|
252
|
+
return str;
|
|
253
|
+
const [, ns, path] = match;
|
|
254
|
+
const root = ctx[ns];
|
|
255
|
+
if (root === undefined)
|
|
256
|
+
return undefined;
|
|
257
|
+
return getByPath(root, path);
|
|
258
|
+
}
|
|
259
|
+
function getByPath(obj, path) {
|
|
260
|
+
return path.split('.').reduce((acc, key) => {
|
|
261
|
+
if (acc && typeof acc === 'object') {
|
|
262
|
+
return acc[key];
|
|
263
|
+
}
|
|
264
|
+
return undefined;
|
|
265
|
+
}, obj);
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=schema-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-loader.js","sourceRoot":"","sources":["../../src/tools/schema-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { ActionRequestApproval, AgentApiSurface } from '@ouispec/agent-core';
|
|
2
|
+
import type { EffectOrKind } from '@ouispec/bindings';
|
|
3
|
+
import type { UISlot } from '../ui/ui-sequence.js';
|
|
4
|
+
/**
|
|
5
|
+
* Tool registry — platforms register their tools here.
|
|
6
|
+
* The worker calls tools by name during the orchestration loop.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* What a tool declares it does (ADR-0226 §2.6): a host or API tool's full
|
|
10
|
+
* effect, or, for a UI action, the effect kind its OUI surface carries.
|
|
11
|
+
*/
|
|
12
|
+
export type ToolEffect = EffectOrKind;
|
|
13
|
+
export interface RegisteredTool {
|
|
14
|
+
name: string;
|
|
15
|
+
/**
|
|
16
|
+
* `ui`: an action on the client's UI, run as the user in their own session
|
|
17
|
+
* (ADR-0209). Bounded by the turn's round cap rather than the backend
|
|
18
|
+
* side-effect quota. Default `backend`.
|
|
19
|
+
*/
|
|
20
|
+
kind?: 'ui' | 'backend';
|
|
21
|
+
/**
|
|
22
|
+
* What calling the tool changes (ADR-0226 §2.6). A tool that declares none is
|
|
23
|
+
* treated as a write. Approvals key on this and `destructive` (ADR-0228).
|
|
24
|
+
*/
|
|
25
|
+
effect?: ToolEffect;
|
|
26
|
+
/** The call removes or replaces something the person made (ADR-0228). */
|
|
27
|
+
destructive?: boolean;
|
|
28
|
+
description: string;
|
|
29
|
+
inputSchema: Record<string, unknown>;
|
|
30
|
+
execute: (input: Record<string, unknown>, ctx: ToolExecutionContext) => Promise<ToolExecutionResult>;
|
|
31
|
+
/** Its name as a person reads it, for the approval card. Default: `name`. */
|
|
32
|
+
title?: string;
|
|
33
|
+
/** What running it does, for the approval card. Default: `description`. */
|
|
34
|
+
consequence?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Whether its arguments are kept out of logs. Default true: an approval's
|
|
37
|
+
* arguments are logged only when its declaration says they are not sensitive.
|
|
38
|
+
*/
|
|
39
|
+
argsSensitive?: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface ToolExecutionContext {
|
|
42
|
+
userId: string;
|
|
43
|
+
accountId: string;
|
|
44
|
+
turnId: string;
|
|
45
|
+
conversationId: string;
|
|
46
|
+
userToken?: string;
|
|
47
|
+
/**
|
|
48
|
+
* The host's AgentApiSurface binding. Schema-generated tools call
|
|
49
|
+
* `apiSurface.executeIntent(intentId, params)` instead of hand-rolled bodies.
|
|
50
|
+
* Optional only for tools that don't need host API access (e.g. pure UI actions).
|
|
51
|
+
*/
|
|
52
|
+
apiSurface?: AgentApiSurface;
|
|
53
|
+
/** AbortSignal tied to the turn deadline — tools should observe this for cancellation. */
|
|
54
|
+
abortSignal?: AbortSignal;
|
|
55
|
+
/** The model's id for this call. UI tools use it as the OUI request id. */
|
|
56
|
+
toolCallId?: string;
|
|
57
|
+
/** The turn's realtime room, where the client that sent the turn listens. */
|
|
58
|
+
socketRoom?: string;
|
|
59
|
+
/**
|
|
60
|
+
* A UI tool's place in the turn's UI order, taken by the orchestrator when the
|
|
61
|
+
* model's call arrived (ui-sequence.ts). A UI tool runs its action in it.
|
|
62
|
+
*/
|
|
63
|
+
uiSlot?: UISlot;
|
|
64
|
+
/**
|
|
65
|
+
* Set when the call is one the user approved (ADR-0228): a UI action's
|
|
66
|
+
* request carries it, and the browser runs the action only when it matches
|
|
67
|
+
* the grant from the user's own click.
|
|
68
|
+
*/
|
|
69
|
+
approval?: ActionRequestApproval;
|
|
70
|
+
[key: string]: unknown;
|
|
71
|
+
}
|
|
72
|
+
export interface ToolExecutionResult {
|
|
73
|
+
success: boolean;
|
|
74
|
+
data?: unknown;
|
|
75
|
+
error?: string;
|
|
76
|
+
}
|
|
77
|
+
export interface ToolRegistry {
|
|
78
|
+
tools: RegisteredTool[];
|
|
79
|
+
execute(name: string, input: Record<string, unknown>, ctx: ToolExecutionContext): Promise<ToolExecutionResult>;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Creates a tool registry from a list of registered tools.
|
|
83
|
+
*/
|
|
84
|
+
export declare function createToolRegistry(tools: RegisteredTool[]): ToolRegistry;
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD;;;GAGG;AAEH;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACxB;;;OAGG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,yEAAyE;IACzE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,oBAAoB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrG,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,0FAA0F;IAC1F,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAChH;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,YAAY,CAiBxE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a tool registry from a list of registered tools.
|
|
3
|
+
*/
|
|
4
|
+
export function createToolRegistry(tools) {
|
|
5
|
+
const toolMap = new Map(tools.map(t => [t.name, t]));
|
|
6
|
+
return {
|
|
7
|
+
tools,
|
|
8
|
+
async execute(name, input, ctx) {
|
|
9
|
+
const tool = toolMap.get(name);
|
|
10
|
+
if (!tool) {
|
|
11
|
+
return { success: false, error: `Unknown tool: ${name}` };
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
return await tool.execute(input, ctx);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
return { success: false, error: err instanceof Error ? err.message : String(err) };
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAuFA;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAuB;IACxD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAErD,OAAO;QACL,KAAK;QACL,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,KAA8B,EAAE,GAAyB;YACnF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;YAC5D,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACrF,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TurnPolicy — controls per-step tool selection and constraints.
|
|
3
|
+
*
|
|
4
|
+
* Integrators provide their own policy to encode product-specific orchestration
|
|
5
|
+
* behavior (e.g. forced tool sequences for onboarding, navigation-first flows).
|
|
6
|
+
* The SDK provides a safe, product-neutral default.
|
|
7
|
+
*
|
|
8
|
+
* The policy is consulted at two points:
|
|
9
|
+
* 1. classifyTurn — called once at turn start to classify the user's intent
|
|
10
|
+
* 2. prepareStep — called before each LLM step to control tool selection
|
|
11
|
+
*/
|
|
12
|
+
export interface TurnPolicy {
|
|
13
|
+
/**
|
|
14
|
+
* Classify the current turn to determine orchestration behavior.
|
|
15
|
+
* Returns a string label that `prepareStep` uses to apply constraints.
|
|
16
|
+
* The SDK does not interpret the label — it's opaque to the orchestrator.
|
|
17
|
+
*/
|
|
18
|
+
classifyTurn(content: string, history?: Array<{
|
|
19
|
+
role: string;
|
|
20
|
+
content: string;
|
|
21
|
+
}>): string;
|
|
22
|
+
/**
|
|
23
|
+
* Called before each step to control tool selection.
|
|
24
|
+
* Returns overrides for toolChoice and activeTools, or empty object for no constraint.
|
|
25
|
+
*/
|
|
26
|
+
prepareStep(ctx: {
|
|
27
|
+
steps: Array<{
|
|
28
|
+
toolCalls?: Array<{
|
|
29
|
+
toolName: string;
|
|
30
|
+
}>;
|
|
31
|
+
}>;
|
|
32
|
+
turnClass: string;
|
|
33
|
+
allToolNames: string[];
|
|
34
|
+
}): Promise<{
|
|
35
|
+
toolChoice?: 'auto' | 'none' | 'required' | {
|
|
36
|
+
type: 'tool';
|
|
37
|
+
toolName: string;
|
|
38
|
+
};
|
|
39
|
+
activeTools?: string[];
|
|
40
|
+
/**
|
|
41
|
+
* An instruction for this step only, added after the system prompt. Say why
|
|
42
|
+
* the step is constrained when the model cannot tell: a model made to hand
|
|
43
|
+
* back at a step limit, without being told, invents a reason (on dev: "I
|
|
44
|
+
* navigated away before filling in the text", about text it had filled).
|
|
45
|
+
*/
|
|
46
|
+
note?: string;
|
|
47
|
+
}>;
|
|
48
|
+
/**
|
|
49
|
+
* Optional: called after turn classification to perform side effects
|
|
50
|
+
* (e.g. emitting deterministic navigation events).
|
|
51
|
+
* The SDK calls this if defined, passing the emit adapter and turn context.
|
|
52
|
+
*/
|
|
53
|
+
onTurnClassified?: (ctx: {
|
|
54
|
+
turnClass: string;
|
|
55
|
+
content: string;
|
|
56
|
+
emit: {
|
|
57
|
+
emit: (room: string, event: string, data: unknown) => Promise<void>;
|
|
58
|
+
};
|
|
59
|
+
socketRoom: string;
|
|
60
|
+
}) => Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Default turn policy — product-neutral, safe defaults.
|
|
64
|
+
* No forced tool sequences, no product-specific constraints.
|
|
65
|
+
* The orchestrator's existing step count and token limits provide the safety net.
|
|
66
|
+
*/
|
|
67
|
+
export declare const defaultTurnPolicy: TurnPolicy;
|
|
68
|
+
//# sourceMappingURL=turn-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-policy.d.ts","sourceRoot":"","sources":["../src/turn-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,YAAY,CACV,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GACjD,MAAM,CAAC;IAEV;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE;QACf,KAAK,EAAE,KAAK,CAAC;YAAE,SAAS,CAAC,EAAE,KAAK,CAAC;gBAAE,QAAQ,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,CAAC,CAAC;QAC1D,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,GAAG,OAAO,CAAC;QACV,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/E,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB;;;;;WAKG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IAEH;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE;YAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;SAAE,CAAC;QAC9E,UAAU,EAAE,MAAM,CAAC;KACpB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAG/B,CAAC"}
|