@pinecall/agents 0.9.20
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 +202 -0
- package/README.md +121 -0
- package/dist/agent/accepts.d.ts +31 -0
- package/dist/agent/accepts.d.ts.map +1 -0
- package/dist/agent/accepts.js +27 -0
- package/dist/agent/accepts.js.map +1 -0
- package/dist/agent/agent.d.ts +151 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +240 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/authors.d.ts +12 -0
- package/dist/agent/authors.d.ts.map +1 -0
- package/dist/agent/authors.js +26 -0
- package/dist/agent/authors.js.map +1 -0
- package/dist/agent/decorators.d.ts +16 -0
- package/dist/agent/decorators.d.ts.map +1 -0
- package/dist/agent/decorators.js +43 -0
- package/dist/agent/decorators.js.map +1 -0
- package/dist/agent/docstrings.d.ts +35 -0
- package/dist/agent/docstrings.d.ts.map +1 -0
- package/dist/agent/docstrings.js +301 -0
- package/dist/agent/docstrings.js.map +1 -0
- package/dist/agent/knowledge.d.ts +9 -0
- package/dist/agent/knowledge.d.ts.map +1 -0
- package/dist/agent/knowledge.js +3 -0
- package/dist/agent/knowledge.js.map +1 -0
- package/dist/agent/lifecycle.d.ts +29 -0
- package/dist/agent/lifecycle.d.ts.map +1 -0
- package/dist/agent/lifecycle.js +9 -0
- package/dist/agent/lifecycle.js.map +1 -0
- package/dist/agent/searching.d.ts +7 -0
- package/dist/agent/searching.d.ts.map +1 -0
- package/dist/agent/searching.js +35 -0
- package/dist/agent/searching.js.map +1 -0
- package/dist/agent/stages.d.ts +23 -0
- package/dist/agent/stages.d.ts.map +1 -0
- package/dist/agent/stages.js +29 -0
- package/dist/agent/stages.js.map +1 -0
- package/dist/agent/state.d.ts +36 -0
- package/dist/agent/state.d.ts.map +1 -0
- package/dist/agent/state.js +93 -0
- package/dist/agent/state.js.map +1 -0
- package/dist/agent/tools.d.ts +61 -0
- package/dist/agent/tools.d.ts.map +1 -0
- package/dist/agent/tools.js +145 -0
- package/dist/agent/tools.js.map +1 -0
- package/dist/agent/view.d.ts +29 -0
- package/dist/agent/view.d.ts.map +1 -0
- package/dist/agent/view.js +29 -0
- package/dist/agent/view.js.map +1 -0
- package/dist/agent/visibility.d.ts +32 -0
- package/dist/agent/visibility.d.ts.map +1 -0
- package/dist/agent/visibility.js +77 -0
- package/dist/agent/visibility.js.map +1 -0
- package/dist/call/call.d.ts +137 -0
- package/dist/call/call.d.ts.map +1 -0
- package/dist/call/call.js +228 -0
- package/dist/call/call.js.map +1 -0
- package/dist/call/history.d.ts +28 -0
- package/dist/call/history.d.ts.map +1 -0
- package/dist/call/history.js +32 -0
- package/dist/call/history.js.map +1 -0
- package/dist/call/room.d.ts +56 -0
- package/dist/call/room.d.ts.map +1 -0
- package/dist/call/room.js +66 -0
- package/dist/call/room.js.map +1 -0
- package/dist/client/agent.d.ts +93 -0
- package/dist/client/agent.d.ts.map +1 -0
- package/dist/client/agent.js +230 -0
- package/dist/client/agent.js.map +1 -0
- package/dist/client/calls.d.ts +87 -0
- package/dist/client/calls.d.ts.map +1 -0
- package/dist/client/calls.js +180 -0
- package/dist/client/calls.js.map +1 -0
- package/dist/client/client.d.ts +112 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +284 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/connection.d.ts +52 -0
- package/dist/client/connection.d.ts.map +1 -0
- package/dist/client/connection.js +157 -0
- package/dist/client/connection.js.map +1 -0
- package/dist/client/endpoints.d.ts +9 -0
- package/dist/client/endpoints.d.ts.map +1 -0
- package/dist/client/endpoints.js +25 -0
- package/dist/client/endpoints.js.map +1 -0
- package/dist/client/frames.d.ts +29 -0
- package/dist/client/frames.d.ts.map +1 -0
- package/dist/client/frames.js +51 -0
- package/dist/client/frames.js.map +1 -0
- package/dist/client/index.d.ts +18 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +13 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/listeners.d.ts +35 -0
- package/dist/client/listeners.d.ts.map +1 -0
- package/dist/client/listeners.js +60 -0
- package/dist/client/listeners.js.map +1 -0
- package/dist/client/lost.d.ts +4 -0
- package/dist/client/lost.d.ts.map +1 -0
- package/dist/client/lost.js +8 -0
- package/dist/client/lost.js.map +1 -0
- package/dist/client/observe.d.ts +50 -0
- package/dist/client/observe.d.ts.map +1 -0
- package/dist/client/observe.js +125 -0
- package/dist/client/observe.js.map +1 -0
- package/dist/client/signed.d.ts +14 -0
- package/dist/client/signed.d.ts.map +1 -0
- package/dist/client/signed.js +18 -0
- package/dist/client/signed.js.map +1 -0
- package/dist/client/testing/gateway.d.ts +58 -0
- package/dist/client/testing/gateway.d.ts.map +1 -0
- package/dist/client/testing/gateway.js +175 -0
- package/dist/client/testing/gateway.js.map +1 -0
- package/dist/client/testing/index.d.ts +4 -0
- package/dist/client/testing/index.d.ts.map +1 -0
- package/dist/client/testing/index.js +4 -0
- package/dist/client/testing/index.js.map +1 -0
- package/dist/client/testing/log.d.ts +24 -0
- package/dist/client/testing/log.d.ts.map +1 -0
- package/dist/client/testing/log.js +106 -0
- package/dist/client/testing/log.js.map +1 -0
- package/dist/client/testing/loopback.d.ts +3 -0
- package/dist/client/testing/loopback.d.ts.map +1 -0
- package/dist/client/testing/loopback.js +3 -0
- package/dist/client/testing/loopback.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/connect.d.ts +42 -0
- package/dist/runtime/connect.d.ts.map +1 -0
- package/dist/runtime/connect.js +234 -0
- package/dist/runtime/connect.js.map +1 -0
- package/dist/runtime/dispatch.d.ts +32 -0
- package/dist/runtime/dispatch.d.ts.map +1 -0
- package/dist/runtime/dispatch.js +46 -0
- package/dist/runtime/dispatch.js.map +1 -0
- package/dist/runtime/environment.d.ts +7 -0
- package/dist/runtime/environment.d.ts.map +1 -0
- package/dist/runtime/environment.js +30 -0
- package/dist/runtime/environment.js.map +1 -0
- package/dist/runtime/recall.d.ts +9 -0
- package/dist/runtime/recall.d.ts.map +1 -0
- package/dist/runtime/recall.js +13 -0
- package/dist/runtime/recall.js.map +1 -0
- package/dist/runtime/run-tool.d.ts +18 -0
- package/dist/runtime/run-tool.d.ts.map +1 -0
- package/dist/runtime/run-tool.js +70 -0
- package/dist/runtime/run-tool.js.map +1 -0
- package/dist/serve/index.d.ts +5 -0
- package/dist/serve/index.d.ts.map +1 -0
- package/dist/serve/index.js +50 -0
- package/dist/serve/index.js.map +1 -0
- package/dist/serve/io.d.ts +14 -0
- package/dist/serve/io.d.ts.map +1 -0
- package/dist/serve/io.js +6 -0
- package/dist/serve/io.js.map +1 -0
- package/dist/serve/leaving.d.ts +12 -0
- package/dist/serve/leaving.d.ts.map +1 -0
- package/dist/serve/leaving.js +61 -0
- package/dist/serve/leaving.js.map +1 -0
- package/dist/serve/lines.d.ts +7 -0
- package/dist/serve/lines.d.ts.map +1 -0
- package/dist/serve/lines.js +25 -0
- package/dist/serve/lines.js.map +1 -0
- package/dist/serve/load.d.ts +26 -0
- package/dist/serve/load.d.ts.map +1 -0
- package/dist/serve/load.js +61 -0
- package/dist/serve/load.js.map +1 -0
- package/dist/serve/machine.d.ts +4 -0
- package/dist/serve/machine.d.ts.map +1 -0
- package/dist/serve/machine.js +33 -0
- package/dist/serve/machine.js.map +1 -0
- package/dist/serve/prompt.d.ts +7 -0
- package/dist/serve/prompt.d.ts.map +1 -0
- package/dist/serve/prompt.js +51 -0
- package/dist/serve/prompt.js.map +1 -0
- package/dist/serve/start.d.ts +7 -0
- package/dist/serve/start.d.ts.map +1 -0
- package/dist/serve/start.js +95 -0
- package/dist/serve/start.js.map +1 -0
- package/dist/serve/viewing.d.ts +17 -0
- package/dist/serve/viewing.d.ts.map +1 -0
- package/dist/serve/viewing.js +42 -0
- package/dist/serve/viewing.js.map +1 -0
- package/dist/views/built-in-rules.d.ts +9 -0
- package/dist/views/built-in-rules.d.ts.map +1 -0
- package/dist/views/built-in-rules.js +28 -0
- package/dist/views/built-in-rules.js.map +1 -0
- package/dist/views/components.d.ts +17 -0
- package/dist/views/components.d.ts.map +1 -0
- package/dist/views/components.js +33 -0
- package/dist/views/components.js.map +1 -0
- package/dist/views/jsx-dev-runtime.d.ts +3 -0
- package/dist/views/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/views/jsx-dev-runtime.js +4 -0
- package/dist/views/jsx-dev-runtime.js.map +1 -0
- package/dist/views/jsx-runtime.d.ts +46 -0
- package/dist/views/jsx-runtime.d.ts.map +1 -0
- package/dist/views/jsx-runtime.js +63 -0
- package/dist/views/jsx-runtime.js.map +1 -0
- package/dist/views/layout.d.ts +19 -0
- package/dist/views/layout.d.ts.map +1 -0
- package/dist/views/layout.js +58 -0
- package/dist/views/layout.js.map +1 -0
- package/dist/views/nodes.d.ts +48 -0
- package/dist/views/nodes.d.ts.map +1 -0
- package/dist/views/nodes.js +45 -0
- package/dist/views/nodes.js.map +1 -0
- package/dist/views/panels.d.ts +17 -0
- package/dist/views/panels.d.ts.map +1 -0
- package/dist/views/panels.js +62 -0
- package/dist/views/panels.js.map +1 -0
- package/dist/views/render.d.ts +11 -0
- package/dist/views/render.d.ts.map +1 -0
- package/dist/views/render.js +19 -0
- package/dist/views/render.js.map +1 -0
- package/dist/wire/agent-config.d.ts +213 -0
- package/dist/wire/agent-config.d.ts.map +1 -0
- package/dist/wire/agent-config.js +126 -0
- package/dist/wire/agent-config.js.map +1 -0
- package/dist/wire/codec.d.ts +43 -0
- package/dist/wire/codec.d.ts.map +1 -0
- package/dist/wire/codec.js +51 -0
- package/dist/wire/codec.js.map +1 -0
- package/dist/wire/commands.d.ts +443 -0
- package/dist/wire/commands.d.ts.map +1 -0
- package/dist/wire/commands.js +203 -0
- package/dist/wire/commands.js.map +1 -0
- package/dist/wire/defs.d.ts +373 -0
- package/dist/wire/defs.d.ts.map +1 -0
- package/dist/wire/defs.js +212 -0
- package/dist/wire/defs.js.map +1 -0
- package/dist/wire/envelope.d.ts +29 -0
- package/dist/wire/envelope.d.ts.map +1 -0
- package/dist/wire/envelope.js +27 -0
- package/dist/wire/envelope.js.map +1 -0
- package/dist/wire/events-call.d.ts +446 -0
- package/dist/wire/events-call.d.ts.map +1 -0
- package/dist/wire/events-call.js +196 -0
- package/dist/wire/events-call.js.map +1 -0
- package/dist/wire/events.d.ts +946 -0
- package/dist/wire/events.d.ts.map +1 -0
- package/dist/wire/events.js +309 -0
- package/dist/wire/events.js.map +1 -0
- package/dist/wire/index.d.ts +19 -0
- package/dist/wire/index.d.ts.map +1 -0
- package/dist/wire/index.js +19 -0
- package/dist/wire/index.js.map +1 -0
- package/dist/wire/metrics.d.ts +366 -0
- package/dist/wire/metrics.d.ts.map +1 -0
- package/dist/wire/metrics.js +269 -0
- package/dist/wire/metrics.js.map +1 -0
- package/dist/wire/reduce.d.ts +10 -0
- package/dist/wire/reduce.d.ts.map +1 -0
- package/dist/wire/reduce.js +367 -0
- package/dist/wire/reduce.js.map +1 -0
- package/dist/wire/registry.d.ts +1789 -0
- package/dist/wire/registry.d.ts.map +1 -0
- package/dist/wire/registry.js +118 -0
- package/dist/wire/registry.js.map +1 -0
- package/dist/wire/rest-data.d.ts +170 -0
- package/dist/wire/rest-data.d.ts.map +1 -0
- package/dist/wire/rest-data.js +78 -0
- package/dist/wire/rest-data.js.map +1 -0
- package/dist/wire/rest-hosting.d.ts +74 -0
- package/dist/wire/rest-hosting.d.ts.map +1 -0
- package/dist/wire/rest-hosting.js +38 -0
- package/dist/wire/rest-hosting.js.map +1 -0
- package/dist/wire/rest-retrieval.d.ts +214 -0
- package/dist/wire/rest-retrieval.d.ts.map +1 -0
- package/dist/wire/rest-retrieval.js +161 -0
- package/dist/wire/rest-retrieval.js.map +1 -0
- package/dist/wire/rest.d.ts +786 -0
- package/dist/wire/rest.d.ts.map +1 -0
- package/dist/wire/rest.js +238 -0
- package/dist/wire/rest.js.map +1 -0
- package/dist/wire/room.d.ts +106 -0
- package/dist/wire/room.d.ts.map +1 -0
- package/dist/wire/room.js +73 -0
- package/dist/wire/room.js.map +1 -0
- package/dist/wire/state.d.ts +915 -0
- package/dist/wire/state.d.ts.map +1 -0
- package/dist/wire/state.js +189 -0
- package/dist/wire/state.js.map +1 -0
- package/dist/wire/verbs.d.ts +73 -0
- package/dist/wire/verbs.d.ts.map +1 -0
- package/dist/wire/verbs.js +50 -0
- package/dist/wire/verbs.js.map +1 -0
- package/package.json +74 -0
- package/tsconfig.tenant.json +24 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** Dispatches `event.received` entries to the instance serving the call, or drops them. */
|
|
2
|
+
import { emitEvent } from "../agent/agent.js";
|
|
3
|
+
import { withAuthorAsync } from "../agent/authors.js";
|
|
4
|
+
import { accepts } from "../agent/accepts.js";
|
|
5
|
+
/**
|
|
6
|
+
* Dispatch after all earlier events finish. The cause lives on the call while a hook runs, so
|
|
7
|
+
* concurrent hooks would attribute writes to each other's event.
|
|
8
|
+
*/
|
|
9
|
+
export function inOrder(serving, received) {
|
|
10
|
+
const next = serving.queue.then(() => dispatch(serving, received));
|
|
11
|
+
// A throwing hook must not block later events; the rejection goes to the caller.
|
|
12
|
+
serving.queue = next.catch(() => undefined);
|
|
13
|
+
return next;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Pass the event to `onEvent` if its name and source are declared, else drop it. Writes inside the
|
|
17
|
+
* hook are authored `event:<name>`, and the call carries the cause so the log can name it.
|
|
18
|
+
*/
|
|
19
|
+
export async function dispatch(serving, received) {
|
|
20
|
+
const { name, data, source, seq } = received;
|
|
21
|
+
if (!accepts(serving.ctor, name, source)) {
|
|
22
|
+
warn(serving, name, source);
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
const meta = { source, seq, ...(received.identity === undefined ? {} : { identity: received.identity }) };
|
|
26
|
+
const hook = serving.agent.onEvent;
|
|
27
|
+
serving.call.cause = { name, seq };
|
|
28
|
+
try {
|
|
29
|
+
await withAuthorAsync(`event:${name}`, () => hook.call(serving.agent, name, data, meta));
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
serving.call.cause = null;
|
|
33
|
+
}
|
|
34
|
+
const heard = { name, data, meta };
|
|
35
|
+
emitEvent(serving.agent, heard);
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
// Once per (call, name): a backend sending an undeclared event usually sends it repeatedly.
|
|
39
|
+
function warn(serving, name, source) {
|
|
40
|
+
const key = `${serving.call.id}:${name}`;
|
|
41
|
+
if (serving.warned.has(key))
|
|
42
|
+
return;
|
|
43
|
+
serving.warned.add(key);
|
|
44
|
+
console.warn(`pinecall: event ${name} from ${source} is not declared by this agent; dropped`);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/runtime/dispatch.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAE3F,OAAO,EAAE,SAAS,EAAmB,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAoC,MAAM,qBAAqB,CAAC;AAuBhF;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,OAAgB,EAAE,QAAkB;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnE,iFAAiF;IACjF,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAgB,EAAE,QAAkB;IACjE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC;IAC7C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAc,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;IACrH,MAAM,IAAI,GAAI,OAAO,CAAC,KAAuF,CAAC,OAAO,CAAC;IACtH,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,SAAS,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3F,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IAC5B,CAAC;IACD,MAAM,KAAK,GAAe,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/C,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4FAA4F;AAC5F,SAAS,IAAI,CAAC,OAAgB,EAAE,IAAY,EAAE,MAAmB;IAC/D,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;IACzC,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO;IACpC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,mBAAmB,IAAI,SAAS,MAAM,yCAAyC,CAAC,CAAC;AAChG,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Environment fields a class may not declare, each with the CLI verb that sets it instead. */
|
|
2
|
+
export declare const THE_WORLDS: Readonly<Record<string, string>>;
|
|
3
|
+
/** The error message for a class that declares an environment field. */
|
|
4
|
+
export declare function movedToTheWorld(field: string): string;
|
|
5
|
+
/** Throw on the first environment field the instance declares. */
|
|
6
|
+
export declare function refuseTheEnvironment(probe: object): void;
|
|
7
|
+
//# sourceMappingURL=environment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/runtime/environment.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAM/F,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAavD,CAAC;AAEF,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,kEAAkE;AAClE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIxD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** Environment fields a class may not declare, each with the CLI verb that sets it instead. */
|
|
2
|
+
import { DeclarationRefused } from "../agent/tools.js";
|
|
3
|
+
// These are per-world settings changed without a deploy. The class is refused at load, and the
|
|
4
|
+
// error names the verb that replaces the field.
|
|
5
|
+
export const THE_WORLDS = {
|
|
6
|
+
voice: "pinecall agent set --voice <name>",
|
|
7
|
+
llm: "pinecall agent set --llm <vendor/model>",
|
|
8
|
+
stt: "pinecall agent set --stt <vendor>",
|
|
9
|
+
language: "pinecall agent set --language <tag>",
|
|
10
|
+
greeting: "pinecall agent set --greeting '…' (or --reply '…')",
|
|
11
|
+
hangup: "pinecall agent set --hangup '…'",
|
|
12
|
+
says: "pinecall lexicon add <word> --say '…'",
|
|
13
|
+
hears: "pinecall lexicon hear <word> …",
|
|
14
|
+
memory: "pinecall memory policy --remember '…' --forget '…'",
|
|
15
|
+
record: "pinecall agent set --record on|off",
|
|
16
|
+
knowledge: "pinecall agent knowledge edit — what the agent knows by heart is a setting, not a file",
|
|
17
|
+
docs: "pinecall docs push, then pinecall docs attach <base>",
|
|
18
|
+
};
|
|
19
|
+
/** The error message for a class that declares an environment field. */
|
|
20
|
+
export function movedToTheWorld(field) {
|
|
21
|
+
return `\`${field}\` is the world's now, not the class's: ${THE_WORLDS[field]} — remove it from the class`;
|
|
22
|
+
}
|
|
23
|
+
/** Throw on the first environment field the instance declares. */
|
|
24
|
+
export function refuseTheEnvironment(probe) {
|
|
25
|
+
for (const field of Object.keys(THE_WORLDS)) {
|
|
26
|
+
if (Object.hasOwn(probe, field))
|
|
27
|
+
throw new DeclarationRefused(movedToTheWorld(field));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/runtime/environment.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,+FAA+F;AAC/F,gDAAgD;AAChD,MAAM,CAAC,MAAM,UAAU,GAAqC;IAC1D,KAAK,EAAE,mCAAmC;IAC1C,GAAG,EAAE,yCAAyC;IAC9C,GAAG,EAAE,mCAAmC;IACxC,QAAQ,EAAE,qCAAqC;IAC/C,QAAQ,EAAE,oDAAoD;IAC9D,MAAM,EAAE,iCAAiC;IACzC,IAAI,EAAE,uCAAuC;IAC7C,KAAK,EAAE,gCAAgC;IACvC,MAAM,EAAE,oDAAoD;IAC5D,MAAM,EAAE,oCAAoC;IAC5C,SAAS,EAAE,wFAAwF;IACnG,IAAI,EAAE,sDAAsD;CAC7D,CAAC;AAEF,wEAAwE;AACxE,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,KAAK,KAAK,2CAA2C,UAAU,CAAC,KAAK,CAAC,6BAA6B,CAAC;AAC7G,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5C,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;YAAE,MAAM,IAAI,kBAAkB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;IACxF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Extracts the recalled memory words that `remembers()` checks against. */
|
|
2
|
+
import { type Camel } from "../wire/codec.js";
|
|
3
|
+
import { type MemoryOps } from "../wire/events.js";
|
|
4
|
+
/**
|
|
5
|
+
* Each recalled fact's text and category from one `memory.ops` entry. Only `recall` ops count:
|
|
6
|
+
* a `remember` stores facts from this call rather than surfacing them to it.
|
|
7
|
+
*/
|
|
8
|
+
export declare function wordsRecalled(entry: Camel<MemoryOps>): string[];
|
|
9
|
+
//# sourceMappingURL=recall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../src/runtime/recall.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,CAI/D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Extracts the recalled memory words that `remembers()` checks against. */
|
|
2
|
+
import {} from "../wire/codec.js";
|
|
3
|
+
import {} from "../wire/events.js";
|
|
4
|
+
/**
|
|
5
|
+
* Each recalled fact's text and category from one `memory.ops` entry. Only `recall` ops count:
|
|
6
|
+
* a `remember` stores facts from this call rather than surfacing them to it.
|
|
7
|
+
*/
|
|
8
|
+
export function wordsRecalled(entry) {
|
|
9
|
+
return entry.ops
|
|
10
|
+
.filter((op) => op.op === "recall")
|
|
11
|
+
.flatMap((op) => op.facts.flatMap((fact) => [fact.text, fact.category ?? ""]));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=recall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/runtime/recall.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,EAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAkB,MAAM,mBAAmB,CAAC;AAEnD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAuB;IACnD,OAAO,KAAK,CAAC,GAAG;SACb,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC;SAClC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Runs one tool call: validates args, calls the method, trims the result to its preview. */
|
|
2
|
+
import type { ToolDeclaration } from "../agent/tools.js";
|
|
3
|
+
/** A tool failure with a message for the model. The SDK sends it as `tool.result.error`. */
|
|
4
|
+
export declare class ToolFailed extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
/** Validate args against the tool's schema. Returns complaints; empty means valid. */
|
|
8
|
+
export declare function validate(declaration: ToolDeclaration, args: Record<string, unknown>): string[];
|
|
9
|
+
/** Convert the model's args object into the method's positional arguments. */
|
|
10
|
+
export declare function argumentsFor(declaration: ToolDeclaration, args: Record<string, unknown>): unknown[];
|
|
11
|
+
/** Trim an array result to the tool's `preview` row count; state still keeps the full result. */
|
|
12
|
+
export declare function preview(declaration: ToolDeclaration, result: unknown): unknown;
|
|
13
|
+
/**
|
|
14
|
+
* Run one tool call against a live agent. The method is called through the instance, not
|
|
15
|
+
* `declaration.method`, because the decorator's wrapper authors writes with the tool's name.
|
|
16
|
+
*/
|
|
17
|
+
export declare function runTool(agent: object, declaration: ToolDeclaration, args: Record<string, unknown>): Promise<unknown>;
|
|
18
|
+
//# sourceMappingURL=run-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-tool.d.ts","sourceRoot":"","sources":["../../src/runtime/run-tool.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAE7F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,4FAA4F;AAC5F,qBAAa,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAoCD,sFAAsF;AACtF,wBAAgB,QAAQ,CAAC,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAE9F;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAC1B,WAAW,EAAE,eAAe,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,EAAE,CAEX;AAED,iGAAiG;AACjG,wBAAgB,OAAO,CAAC,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAI9E;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,eAAe,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC,CAclB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/** Runs one tool call: validates args, calls the method, trims the result to its preview. */
|
|
2
|
+
/** A tool failure with a message for the model. The SDK sends it as `tool.result.error`. */
|
|
3
|
+
export class ToolFailed extends Error {
|
|
4
|
+
constructor(message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "ToolFailed";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
// Schema property order is the signature's order (parametersOf writes it that way).
|
|
10
|
+
function orderOf(parameters) {
|
|
11
|
+
return Object.keys(parameters.properties ?? {});
|
|
12
|
+
}
|
|
13
|
+
function typeOf(value) {
|
|
14
|
+
if (Array.isArray(value))
|
|
15
|
+
return "array";
|
|
16
|
+
if (value === null)
|
|
17
|
+
return "null";
|
|
18
|
+
return typeof value;
|
|
19
|
+
}
|
|
20
|
+
// Checks only required names and top-level JSON types; nested shapes are the app's to validate.
|
|
21
|
+
function complaintsAbout(parameters, args) {
|
|
22
|
+
const properties = parameters.properties ?? {};
|
|
23
|
+
const complaints = [];
|
|
24
|
+
for (const name of parameters.required ?? []) {
|
|
25
|
+
if (args[name] === undefined)
|
|
26
|
+
complaints.push(`${name} is required`);
|
|
27
|
+
}
|
|
28
|
+
for (const [name, schema] of Object.entries(properties)) {
|
|
29
|
+
const value = args[name];
|
|
30
|
+
const wanted = schema.type;
|
|
31
|
+
if (value === undefined || wanted === undefined)
|
|
32
|
+
continue;
|
|
33
|
+
if (typeOf(value) !== wanted) {
|
|
34
|
+
complaints.push(`${name} must be a ${wanted}, not a ${typeOf(value)}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return complaints;
|
|
38
|
+
}
|
|
39
|
+
/** Validate args against the tool's schema. Returns complaints; empty means valid. */
|
|
40
|
+
export function validate(declaration, args) {
|
|
41
|
+
return complaintsAbout(declaration.spec.parameters, args ?? {});
|
|
42
|
+
}
|
|
43
|
+
/** Convert the model's args object into the method's positional arguments. */
|
|
44
|
+
export function argumentsFor(declaration, args) {
|
|
45
|
+
return orderOf(declaration.spec.parameters).map((name) => args?.[name]);
|
|
46
|
+
}
|
|
47
|
+
/** Trim an array result to the tool's `preview` row count; state still keeps the full result. */
|
|
48
|
+
export function preview(declaration, result) {
|
|
49
|
+
const rows = declaration.options.preview;
|
|
50
|
+
if (rows === undefined || !Array.isArray(result) || result.length <= rows)
|
|
51
|
+
return result;
|
|
52
|
+
return result.slice(0, rows);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Run one tool call against a live agent. The method is called through the instance, not
|
|
56
|
+
* `declaration.method`, because the decorator's wrapper authors writes with the tool's name.
|
|
57
|
+
*/
|
|
58
|
+
export async function runTool(agent, declaration, args) {
|
|
59
|
+
const complaints = validate(declaration, args);
|
|
60
|
+
if (complaints.length > 0) {
|
|
61
|
+
throw new ToolFailed(`${declaration.name}: ${complaints.join("; ")}`);
|
|
62
|
+
}
|
|
63
|
+
const method = agent[declaration.name];
|
|
64
|
+
if (typeof method !== "function") {
|
|
65
|
+
throw new ToolFailed(`${declaration.name}: this agent has no such method any more`);
|
|
66
|
+
}
|
|
67
|
+
const result = await method.apply(agent, argumentsFor(declaration, args));
|
|
68
|
+
return preview(declaration, result);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=run-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-tool.js","sourceRoot":"","sources":["../../src/runtime/run-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** `@pinecall/agents/serve`: the entry the CLI starts an agent with — `start` holds it, `prompt` prints it. */
|
|
2
|
+
import { type Io } from "./io.js";
|
|
3
|
+
/** Run one verb; 2 when it cannot run at all, with the sentence on `err`. */
|
|
4
|
+
export declare function main(argv: string[], io?: Io): Promise<number>;
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/serve/index.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAO/G,OAAO,EAAa,KAAK,EAAE,EAAE,MAAM,SAAS,CAAC;AAW7C,6EAA6E;AAC7E,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,GAAE,EAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAYhF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** `@pinecall/agents/serve`: the entry the CLI starts an agent with — `start` holds it, `prompt` prints it. */
|
|
2
|
+
import { realpathSync } from "node:fs";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { DeclarationRefused } from "../agent/tools.js";
|
|
5
|
+
import { processIo } from "./io.js";
|
|
6
|
+
import { CannotServe } from "./load.js";
|
|
7
|
+
import { prompt } from "./prompt.js";
|
|
8
|
+
import { start } from "./start.js";
|
|
9
|
+
const USAGE = `usage: serve start --file <agent.tsx> --slug <slug> [--file … --slug …] [--console] [--events]
|
|
10
|
+
serve prompt --file <agent.tsx> --slug <slug> [--state field=json]… [--channel name] [--medium how] [--show-machine]
|
|
11
|
+
|
|
12
|
+
Reads PINECALL_URL, PINECALL_KEY and PINECALL_ENV from its environment and nothing else.
|
|
13
|
+
start leaves on SIGINT, SIGTERM or the end of its stdin, draining first; a second signal leaves now.`;
|
|
14
|
+
/** Run one verb; 2 when it cannot run at all, with the sentence on `err`. */
|
|
15
|
+
export async function main(argv, io = processIo()) {
|
|
16
|
+
const [verb, ...rest] = argv;
|
|
17
|
+
try {
|
|
18
|
+
if (verb === "start")
|
|
19
|
+
return await start(rest, io);
|
|
20
|
+
if (verb === "prompt")
|
|
21
|
+
return await prompt(rest, io);
|
|
22
|
+
}
|
|
23
|
+
catch (failed) {
|
|
24
|
+
if (!(failed instanceof CannotServe) && !(failed instanceof DeclarationRefused) && !isAFlag(failed))
|
|
25
|
+
throw failed;
|
|
26
|
+
io.err.write(`${failed.message}\n`);
|
|
27
|
+
return 2;
|
|
28
|
+
}
|
|
29
|
+
io.err.write(`${USAGE}\n`);
|
|
30
|
+
return 2;
|
|
31
|
+
}
|
|
32
|
+
function isAFlag(failed) {
|
|
33
|
+
const code = failed.code;
|
|
34
|
+
return failed instanceof Error && typeof code === "string" && code.startsWith("ERR_PARSE_ARGS_");
|
|
35
|
+
}
|
|
36
|
+
// argv[1] may be a symlink (a package's bin), so it is resolved before comparing.
|
|
37
|
+
function isEntry() {
|
|
38
|
+
const entry = process.argv[1];
|
|
39
|
+
if (entry === undefined)
|
|
40
|
+
return false;
|
|
41
|
+
try {
|
|
42
|
+
return import.meta.url === pathToFileURL(realpathSync(entry)).href;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (isEntry())
|
|
49
|
+
process.exitCode = await main(process.argv.slice(2));
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/serve/index.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAE/G,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAW,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,KAAK,GAAG;;;;uGAIyF,CAAC;AAExG,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc,EAAE,EAAE,GAAO,SAAS,EAAE;IAC7D,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC;QACH,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,IAAI,CAAC,CAAC,MAAM,YAAY,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,YAAY,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,MAAM,MAAM,CAAC;QAClH,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QACpC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,OAAO,CAAC,MAAe;IAC9B,MAAM,IAAI,GAAI,MAAgC,CAAC,IAAI,CAAC;IACpD,OAAO,MAAM,YAAY,KAAK,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACnG,CAAC;AAED,kFAAkF;AAClF,SAAS,OAAO;IACd,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,OAAO,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,OAAO,EAAE;IAAE,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** What the serve entry reads and writes: two streams out, its environment, its stdin, its signals. */
|
|
2
|
+
/** Everything a verb of the entry touches outside itself, so a test hands in its own. */
|
|
3
|
+
export interface Io {
|
|
4
|
+
out: NodeJS.WritableStream;
|
|
5
|
+
err: NodeJS.WritableStream;
|
|
6
|
+
env: Record<string, string | undefined>;
|
|
7
|
+
/** Its end is a reason to leave: the process that started this one is gone. */
|
|
8
|
+
input: NodeJS.ReadableStream;
|
|
9
|
+
/** Where SIGINT and SIGTERM are heard. */
|
|
10
|
+
signals: NodeJS.EventEmitter;
|
|
11
|
+
}
|
|
12
|
+
/** The process's own. */
|
|
13
|
+
export declare function processIo(): Io;
|
|
14
|
+
//# sourceMappingURL=io.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../src/serve/io.ts"],"names":[],"mappings":"AAAA,uGAAuG;AAEvG,yFAAyF;AACzF,MAAM,WAAW,EAAE;IACjB,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC;IAC7B,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC;CAC9B;AAED,yBAAyB;AACzB,wBAAgB,SAAS,IAAI,EAAE,CAE9B"}
|
package/dist/serve/io.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** What the serve entry reads and writes: two streams out, its environment, its stdin, its signals. */
|
|
2
|
+
/** The process's own. */
|
|
3
|
+
export function processIo() {
|
|
4
|
+
return { out: process.stdout, err: process.stderr, env: process.env, input: process.stdin, signals: process };
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/serve/io.ts"],"names":[],"mappings":"AAAA,uGAAuG;AAavG,yBAAyB;AACzB,MAAM,UAAU,SAAS;IACvB,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAChH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** How a served process leaves: asked to (a signal, its stdin's end, a stop), then a drain. */
|
|
2
|
+
import type { Drained, Pinecall } from "../client/index.js";
|
|
3
|
+
import type { Io } from "./io.js";
|
|
4
|
+
/** Why the process is leaving. A stop from the org is not drained: the gateway already let go. */
|
|
5
|
+
export type Asked = "signalled" | "ended" | "stopped";
|
|
6
|
+
/** Resolve with the first reason to leave; a stop is said on `err` in the gateway's words. */
|
|
7
|
+
export declare function askedToLeave(pc: Pinecall, io: Io): Promise<Asked>;
|
|
8
|
+
/** Drain every agent, unless a second signal says to leave now: then nothing. */
|
|
9
|
+
export declare function drainedUnlessSignalledAgain(pc: Pinecall, io: Io): Promise<Drained | undefined>;
|
|
10
|
+
/** Summarize a drain: live calls handed over or kept, tools finished or cut. */
|
|
11
|
+
export declare function drainLine(done: Drained): string;
|
|
12
|
+
//# sourceMappingURL=leaving.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaving.d.ts","sourceRoot":"","sources":["../../src/serve/leaving.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAElC,kGAAkG;AAClG,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAItD,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAmBjE;AAED,iFAAiF;AACjF,wBAAsB,2BAA2B,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAWpG;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAS/C"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/** How a served process leaves: asked to (a signal, its stdin's end, a stop), then a drain. */
|
|
2
|
+
const SIGNALS = ["SIGINT", "SIGTERM"];
|
|
3
|
+
/** Resolve with the first reason to leave; a stop is said on `err` in the gateway's words. */
|
|
4
|
+
export function askedToLeave(pc, io) {
|
|
5
|
+
return new Promise((done) => {
|
|
6
|
+
const signalled = () => leave("signalled");
|
|
7
|
+
const ended = () => leave("ended");
|
|
8
|
+
const unstop = pc.onStopped((why) => {
|
|
9
|
+
io.err.write(`${why}\n`);
|
|
10
|
+
leave("stopped");
|
|
11
|
+
});
|
|
12
|
+
for (const signal of SIGNALS)
|
|
13
|
+
io.signals.on(signal, signalled);
|
|
14
|
+
io.input.on("end", ended);
|
|
15
|
+
io.input.resume();
|
|
16
|
+
function leave(why) {
|
|
17
|
+
for (const signal of SIGNALS)
|
|
18
|
+
io.signals.off(signal, signalled);
|
|
19
|
+
io.input.off("end", ended);
|
|
20
|
+
io.input.pause();
|
|
21
|
+
unstop();
|
|
22
|
+
done(why);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/** Drain every agent, unless a second signal says to leave now: then nothing. */
|
|
27
|
+
export async function drainedUnlessSignalledAgain(pc, io) {
|
|
28
|
+
let heard;
|
|
29
|
+
const again = new Promise((done) => {
|
|
30
|
+
heard = () => done(undefined);
|
|
31
|
+
for (const signal of SIGNALS)
|
|
32
|
+
io.signals.on(signal, heard);
|
|
33
|
+
});
|
|
34
|
+
try {
|
|
35
|
+
return await Promise.race([pc.drain(), again]);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
for (const signal of SIGNALS)
|
|
39
|
+
io.signals.off(signal, heard);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Summarize a drain: live calls handed over or kept, tools finished or cut. */
|
|
43
|
+
export function drainLine(done) {
|
|
44
|
+
const calls = done.handed + done.parked;
|
|
45
|
+
if (calls === 0 && done.tools === 0)
|
|
46
|
+
return "draining · no live calls";
|
|
47
|
+
const parts = ["draining"];
|
|
48
|
+
if (done.handed > 0)
|
|
49
|
+
parts.push(`${plural(done.handed, "live call")} handed over`);
|
|
50
|
+
if (done.parked > 0)
|
|
51
|
+
parts.push(`${plural(done.parked, "live call")} kept for the next process`);
|
|
52
|
+
if (done.finished > 0)
|
|
53
|
+
parts.push(`${plural(done.finished, "tool")} finished`);
|
|
54
|
+
if (done.tools > done.finished)
|
|
55
|
+
parts.push(`${plural(done.tools - done.finished, "tool")} cut`);
|
|
56
|
+
return parts.join(" · ");
|
|
57
|
+
}
|
|
58
|
+
function plural(count, noun) {
|
|
59
|
+
return `${count} ${noun}${count === 1 ? "" : "s"}`;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=leaving.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaving.js","sourceRoot":"","sources":["../../src/serve/leaving.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAQ/F,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAU,CAAC;AAE/C,8FAA8F;AAC9F,MAAM,UAAU,YAAY,CAAC,EAAY,EAAE,EAAM;IAC/C,OAAO,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,MAAM,SAAS,GAAG,GAAS,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,GAAS,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;YAClC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;YACzB,KAAK,CAAC,SAAS,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC/D,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1B,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,SAAS,KAAK,CAAC,GAAU;YACvB,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAChE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3B,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,EAAE,CAAC;YACT,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,EAAY,EAAE,EAAM;IACpE,IAAI,KAA+B,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,OAAO,CAAY,CAAC,IAAI,EAAE,EAAE;QAC5C,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC;YAAS,CAAC;QACT,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAM,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACxC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,0BAA0B,CAAC;IACvE,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC,CAAC;IAC3B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IACnF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,4BAA4B,CAAC,CAAC;IACjG,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAC/E,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAChG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,MAAM,CAAC,KAAa,EAAE,IAAY;IACzC,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** What a served process prints: the wire entry line by line for the CLI, or a few lines for a person. */
|
|
2
|
+
import type { Entry } from "../wire/envelope.js";
|
|
3
|
+
/** One `--events` line: the entry as the gateway wrote it, without the log's bookkeeping. */
|
|
4
|
+
export declare function eventLine(entry: Entry): string;
|
|
5
|
+
/** A line for a person reading the process, or null for an entry worth no line. */
|
|
6
|
+
export declare function personLine(entry: Entry): string | null;
|
|
7
|
+
//# sourceMappingURL=lines.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../src/serve/lines.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAE1G,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,6FAA6F;AAC7F,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAE9C;AAED,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAiBtD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** What a served process prints: the wire entry line by line for the CLI, or a few lines for a person. */
|
|
2
|
+
/** One `--events` line: the entry as the gateway wrote it, without the log's bookkeeping. */
|
|
3
|
+
export function eventLine(entry) {
|
|
4
|
+
return JSON.stringify({ type: entry.type, agent: entry.agent, call: entry.call, data: entry.data });
|
|
5
|
+
}
|
|
6
|
+
/** A line for a person reading the process, or null for an entry worth no line. */
|
|
7
|
+
export function personLine(entry) {
|
|
8
|
+
const data = entry.data;
|
|
9
|
+
const said = (mark, text) => `${entry.agent} ${mark} ${String(text)}`;
|
|
10
|
+
switch (entry.type) {
|
|
11
|
+
case "agent.registered":
|
|
12
|
+
return said("·", `answering as ${String(data["app"])}`);
|
|
13
|
+
case "turn.user":
|
|
14
|
+
return said("‹", data["text"]);
|
|
15
|
+
case "turn.agent":
|
|
16
|
+
return said("›", data["text"]);
|
|
17
|
+
case "tool.call":
|
|
18
|
+
return said("→", data["name"]);
|
|
19
|
+
case "error":
|
|
20
|
+
return said("✗", data["message"]);
|
|
21
|
+
default:
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=lines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lines.js","sourceRoot":"","sources":["../../src/serve/lines.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAI1G,6FAA6F;AAC7F,MAAM,UAAU,SAAS,CAAC,KAAY;IACpC,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACtG,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,UAAU,CAAC,KAAY;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,IAA+B,CAAC;IACnD,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,IAAa,EAAU,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IAChG,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,kBAAkB;YACrB,OAAO,IAAI,CAAC,GAAG,EAAE,gBAAgB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1D,KAAK,WAAW;YACd,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACjC,KAAK,YAAY;YACf,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACjC,KAAK,WAAW;YACd,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACjC,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACpC;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Load a tenant's agent file: register the TypeScript loader, import the class, read its source. */
|
|
2
|
+
import { type Medium } from "../wire/defs.js";
|
|
3
|
+
import { Agent } from "../agent/agent.js";
|
|
4
|
+
/** Thrown when what was asked cannot be served at all; the entry exits 2 with its sentence. */
|
|
5
|
+
export declare class CannotServe extends Error {
|
|
6
|
+
readonly name = "CannotServe";
|
|
7
|
+
}
|
|
8
|
+
/** A loaded agent class with its file path and source text. */
|
|
9
|
+
export interface Loaded {
|
|
10
|
+
ctor: new () => Agent;
|
|
11
|
+
file: string;
|
|
12
|
+
source: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Load an agent file and pass its source to `describe`. The source is required: the class
|
|
16
|
+
* docstring and tool parameter types are not recoverable from the compiled module.
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadAgent(file: string): Promise<Loaded>;
|
|
19
|
+
/** Load the file served as `slug`; a class whose `static slug` says another is refused. */
|
|
20
|
+
export declare function loadServed(file: string, slug: string): Promise<Loaded>;
|
|
21
|
+
/**
|
|
22
|
+
* Instantiate the class with a stub call, since `render()` may read `this.call`. Without a
|
|
23
|
+
* medium, the call's is the one its channel implies.
|
|
24
|
+
*/
|
|
25
|
+
export declare function instanceFor(loaded: Loaded, channel?: string, medium?: Medium): Agent;
|
|
26
|
+
//# sourceMappingURL=load.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/serve/load.ts"],"names":[],"mappings":"AAAA,qGAAqG;AAMrG,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,KAAK,EAAW,MAAM,mBAAmB,CAAC;AAKnD,+FAA+F;AAC/F,qBAAa,WAAY,SAAQ,KAAK;IACpC,SAAkB,IAAI,iBAAiB;CACxC;AAED,+DAA+D;AAC/D,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,UAAU,KAAK,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAYD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY7D;AAED,2FAA2F;AAC3F,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,SAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAKnF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/** Load a tenant's agent file: register the TypeScript loader, import the class, read its source. */
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { pathToFileURL } from "node:url";
|
|
5
|
+
import {} from "../wire/defs.js";
|
|
6
|
+
import { Agent, setCall } from "../agent/agent.js";
|
|
7
|
+
import { describe } from "../agent/docstrings.js";
|
|
8
|
+
import { CallWorld } from "../call/call.js";
|
|
9
|
+
import { refuseTheEnvironment } from "../runtime/environment.js";
|
|
10
|
+
/** Thrown when what was asked cannot be served at all; the entry exits 2 with its sentence. */
|
|
11
|
+
export class CannotServe extends Error {
|
|
12
|
+
name = "CannotServe";
|
|
13
|
+
}
|
|
14
|
+
let registered = false;
|
|
15
|
+
/** Register tsx once per process, lazily, so tenant .ts/.tsx files load without a build step. */
|
|
16
|
+
async function useTypeScript() {
|
|
17
|
+
if (registered)
|
|
18
|
+
return;
|
|
19
|
+
const { register } = await import("tsx/esm/api");
|
|
20
|
+
register();
|
|
21
|
+
registered = true;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Load an agent file and pass its source to `describe`. The source is required: the class
|
|
25
|
+
* docstring and tool parameter types are not recoverable from the compiled module.
|
|
26
|
+
*/
|
|
27
|
+
export async function loadAgent(file) {
|
|
28
|
+
const path = resolve(file);
|
|
29
|
+
if (!existsSync(path))
|
|
30
|
+
throw new CannotServe(`no agent at ${path}`);
|
|
31
|
+
await useTypeScript();
|
|
32
|
+
const module_ = (await import(pathToFileURL(path).href));
|
|
33
|
+
const ctor = module_.default;
|
|
34
|
+
if (typeof ctor !== "function")
|
|
35
|
+
throw new CannotServe(`${path} has no default-exported Agent class`);
|
|
36
|
+
const source = readFileSync(path, "utf8");
|
|
37
|
+
describe(ctor, source, path);
|
|
38
|
+
// Refuse environment-owned fields (voice, model, ...) here, since `prompt` never mounts.
|
|
39
|
+
refuseTheEnvironment(new ctor());
|
|
40
|
+
return { ctor: ctor, file: path, source };
|
|
41
|
+
}
|
|
42
|
+
/** Load the file served as `slug`; a class whose `static slug` says another is refused. */
|
|
43
|
+
export async function loadServed(file, slug) {
|
|
44
|
+
const loaded = await loadAgent(file);
|
|
45
|
+
const declared = loaded.ctor.slug;
|
|
46
|
+
if (typeof declared === "string" && declared !== slug) {
|
|
47
|
+
throw new CannotServe(`${loaded.file} says its slug is ${declared}, and it is served as ${slug}: the slug is its folder's name`);
|
|
48
|
+
}
|
|
49
|
+
return loaded;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Instantiate the class with a stub call, since `render()` may read `this.call`. Without a
|
|
53
|
+
* medium, the call's is the one its channel implies.
|
|
54
|
+
*/
|
|
55
|
+
export function instanceFor(loaded, channel = "web", medium) {
|
|
56
|
+
const agent = new loaded.ctor();
|
|
57
|
+
const line = medium === undefined ? { id: "", contact: "", channel } : { id: "", contact: "", channel, medium };
|
|
58
|
+
setCall(agent, new CallWorld(line, () => undefined));
|
|
59
|
+
return agent;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/serve/load.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Developer view of an agent's tools: current stage, and which tools are visible and why. */
|
|
2
|
+
/** List every declared tool, marking the visible ones and what gates each. For developers only. */
|
|
3
|
+
export declare function showMachine(agent: object): string;
|
|
4
|
+
//# sourceMappingURL=machine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine.d.ts","sourceRoot":"","sources":["../../src/serve/machine.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAM9F,mGAAmG;AACnG,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWjD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Developer view of an agent's tools: current stage, and which tools are visible and why. */
|
|
2
|
+
import { stageOf, stagesOf } from "../agent/stages.js";
|
|
3
|
+
import { toolsOf, visibleToolsOf } from "../agent/tools.js";
|
|
4
|
+
import { headerFor } from "../views/render.js";
|
|
5
|
+
/** List every declared tool, marking the visible ones and what gates each. For developers only. */
|
|
6
|
+
export function showMachine(agent) {
|
|
7
|
+
const visible = new Set(visibleToolsOf(agent).map((declared) => declared.name));
|
|
8
|
+
const declarations = toolsOf(agent);
|
|
9
|
+
if (declarations.length === 0)
|
|
10
|
+
return `${header(agent)}\n\n this agent declares no tools`;
|
|
11
|
+
const width = Math.max(...declarations.map((declared) => declared.name.length));
|
|
12
|
+
const lines = declarations.map((declared) => {
|
|
13
|
+
const shown = visible.has(declared.name);
|
|
14
|
+
const mark = shown ? "●" : "○";
|
|
15
|
+
return ` ${mark} ${declared.name.padEnd(width)} ${gatedBy(agent, declared.options, shown)}`;
|
|
16
|
+
});
|
|
17
|
+
return [header(agent), "", ...lines].join("\n");
|
|
18
|
+
}
|
|
19
|
+
function header(agent) {
|
|
20
|
+
const stage = stageOf(agent);
|
|
21
|
+
return stage === undefined ? headerFor("tools") : `${headerFor("tools")} stage: ${stage}`;
|
|
22
|
+
}
|
|
23
|
+
// Flags a tool hidden in its own stage, since that is always the `when` predicate's doing.
|
|
24
|
+
function gatedBy(agent, options, shown) {
|
|
25
|
+
const stages = stagesOf(options);
|
|
26
|
+
if (stages === undefined)
|
|
27
|
+
return options.when === undefined ? "always" : "when(state)";
|
|
28
|
+
const here = stageOf(agent);
|
|
29
|
+
const named = stages.join(" · ");
|
|
30
|
+
const hiddenInItsOwnStage = !shown && here !== undefined && stages.includes(here);
|
|
31
|
+
return hiddenInItsOwnStage ? `${named} · when(state) says no` : named;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=machine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine.js","sourceRoot":"","sources":["../../src/serve/machine.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAE9F,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,cAAc,EAA0B,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,mGAAmG;AACnG,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAChF,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC;IAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/B,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;IAChG,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,KAAK,EAAE,CAAC;AAC5F,CAAC;AAED,2FAA2F;AAC3F,SAAS,OAAO,CAAC,KAAa,EAAE,OAA0B,EAAE,KAAc;IACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC;IACvF,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,mBAAmB,GAAG,CAAC,KAAK,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClF,OAAO,mBAAmB,CAAC,CAAC,CAAC,GAAG,KAAK,wBAAwB,CAAC,CAAC,CAAC,KAAK,CAAC;AACxE,CAAC"}
|