@plurnk/plurnk-agui 1.14.2 → 1.15.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/SPEC.md +28 -4
- package/dist/AguiSurface.d.ts +2 -3
- package/dist/AguiSurface.d.ts.map +1 -1
- package/dist/BuiltinActions.d.ts +16 -0
- package/dist/BuiltinActions.d.ts.map +1 -0
- package/dist/BuiltinActions.js +339 -0
- package/dist/BuiltinActions.js.map +1 -0
- package/dist/EventRouter.d.ts +8 -4
- package/dist/EventRouter.d.ts.map +1 -1
- package/dist/EventRouter.js +4 -3
- package/dist/EventRouter.js.map +1 -1
- package/dist/Module.d.ts.map +1 -1
- package/dist/Module.js +23 -607
- package/dist/Module.js.map +1 -1
- package/dist/Portal.d.ts +5 -2
- package/dist/Portal.d.ts.map +1 -1
- package/dist/Portal.js +45 -14
- package/dist/Portal.js.map +1 -1
- package/dist/RunHandler.d.ts +25 -0
- package/dist/RunHandler.d.ts.map +1 -0
- package/dist/RunHandler.js +290 -0
- package/dist/RunHandler.js.map +1 -0
- package/dist/Translator.d.ts +8 -4
- package/dist/Translator.d.ts.map +1 -1
- package/dist/Translator.js +82 -12
- package/dist/Translator.js.map +1 -1
- package/dist/action-results.d.ts +9 -0
- package/dist/action-results.d.ts.map +1 -0
- package/dist/action-results.js +45 -0
- package/dist/action-results.js.map +1 -0
- package/dist/observe.d.ts +1 -3
- package/dist/observe.d.ts.map +1 -1
- package/dist/observe.js +2 -2
- package/dist/observe.js.map +1 -1
- package/dist/run-events.d.ts +5 -0
- package/dist/run-events.d.ts.map +1 -0
- package/dist/run-events.js +9 -0
- package/dist/run-events.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
package/SPEC.md
CHANGED
|
@@ -32,6 +32,8 @@ does not recompute them.
|
|
|
32
32
|
conversations are addressable as threads), minted via `createConversationWorker`
|
|
33
33
|
if it doesn't. The core workspace envelope carries only the workspace and selected client
|
|
34
34
|
actor ({§methods-rebind}); AG-UI owns the separate per-thread conversation binding.
|
|
35
|
+
Process-local bindings use the complete `(workspace, threadId)` identity; equal thread names
|
|
36
|
+
in different workspaces never share an envelope, Worker, replay, state, or active Run.
|
|
35
37
|
`loop.inject`, `loop.cancel`, and `run.fork` operate on the THREAD's conversation.
|
|
36
38
|
`log.read` and `entry.read` default there and may explicitly select another workspace worker.
|
|
37
39
|
Extended context persists across AG-UI Runs because the worker's log does.
|
|
@@ -48,13 +50,14 @@ One accepted Run or daemon notification produces zero-or-more AG-UI events:
|
|
|
48
50
|
| plurnk wire | AG-UI events |
|
|
49
51
|
| ------------------------------------------ | ------------ |
|
|
50
52
|
| schema-valid `RunAgentInput` | `RUN_STARTED` + initial `STATE_SNAPSHOT` |
|
|
53
|
+
| `forwardedProps.plurnk.mode = "sync"` | Durable conversation `MESSAGES_SNAPSHOT`, then pending interrupt, live observation, or `RUN_FINISHED` {§agui-conversation-sync} |
|
|
51
54
|
| `log/entry` turn boundary | `STEP_FINISHED` + `STEP_STARTED` (`turn-<id>`) |
|
|
52
55
|
| `log/entry` op=PLAN (model) | `ACTIVITY_SNAPSHOT` {§agui-plan-activity} |
|
|
53
56
|
| `log/entry` op=SEND (model) | Optional readable-reasoning sequence {§agui-readable-reasoning}, then `TEXT_MESSAGE_START/CONTENT/END` + `CUSTOM plurnk.send` (signal/status) |
|
|
54
57
|
| `log/entry` other op (model) | `TOOL_CALL_START/ARGS/END` (+ `TOOL_CALL_RESULT` when rx exists) |
|
|
55
58
|
| `log/entry` actionless `kind=turnOps` or `kind=emissionAttempt` | At most one `REASONING_ENCRYPTED_VALUE`, attached to the same turn's actual SEND assistant message when {§agui-encrypted-reasoning} is satisfied; otherwise nothing beyond the forensic row. |
|
|
56
59
|
| `log/entry` origin≠model | `CUSTOM plurnk.ambient` (foists, deltas, narrations) |
|
|
57
|
-
| client-owned `loop/proposal` | `TOOL_CALL_START/ARGS/END`, then `RUN_FINISHED` with an interrupt outcome |
|
|
60
|
+
| client-owned `loop/proposal` | `TOOL_CALL_START/ARGS/END`, `STEP_FINISHED` when a turn step is active, then `RUN_FINISHED` with an interrupt outcome; its resume Run reopens the continued turn with `STEP_STARTED` after `RUN_STARTED` and initial state |
|
|
58
61
|
| `loop/packet` | `STATE_DELTA` replacing the bound thread's loop id, lifecycle, and exact packet count |
|
|
59
62
|
| `loop/terminated` | `STATE_DELTA` (latest-turn gauge only) + `CUSTOM plurnk.terminated` (the complete daemon terminal, including physical-request accounting and top-level attribution) + `RAW` (the provider's opaque metadata bag, `source: provider`, §475) + `RUN_FINISHED` (`result.status === 200`) or `RUN_ERROR` (otherwise, from the exact RFC 9457 Problem Details) |
|
|
60
63
|
| transport failure after SSE opens | `CUSTOM plurnk.problem` (exact Problem Details) + `RUN_ERROR` (`code` = Problem `type`, `message` = Problem `detail`) |
|
|
@@ -163,13 +166,28 @@ every other daemon surface.
|
|
|
163
166
|
`STATE_DELTA`s. A dropped SSE stream cancels the loop (`loop.cancel`) — the frontend hanging
|
|
164
167
|
up IS the abort signal; no worker is orphaned unwatched.
|
|
165
168
|
|
|
166
|
-
- §agui-replay **
|
|
167
|
-
frontend arrived)
|
|
168
|
-
|
|
169
|
+
- §agui-replay **Unoriented reattach replays once** — a rediscovered thread (the module restarted, a second
|
|
170
|
+
frontend arrived) whose Run input carries none of the log's durable assistant identities attaches
|
|
171
|
+
to its existing workspace by name→id and opens ORIENTED: durable
|
|
172
|
+
prompt rows replay as user messages, the model worker's current PLAN activity and SEND speech
|
|
173
|
+
replay chronologically, and the one validated current Run user message follows them under a
|
|
174
|
+
Run-owned identity in the authoritative `MESSAGES_SNAPSHOT`. Client-claimed earlier history is not
|
|
175
|
+
imported. A client already carrying any durable assistant identity receives no repeated snapshot.
|
|
176
|
+
Everything else stays
|
|
169
177
|
reachable via live `plurnk.row`. Pending proposals and client interactions remain durable while
|
|
170
178
|
their operation owners are live and are presented as interrupts when the owning conversation is
|
|
171
179
|
resumed; a days-old question is discoverable, never converted into a mystery hang.
|
|
172
180
|
|
|
181
|
+
- §agui-conversation-sync **Conversation synchronization is an inference-free AG-UI Run.**
|
|
182
|
+
`forwardedProps.plurnk.mode = "sync"` on the existing Run endpoint accepts no messages,
|
|
183
|
+
management action, or interrupt resume. It binds the named workspace and conversation,
|
|
184
|
+
emits the normal `RUN_STARTED` and initial `STATE_SNAPSHOT`, then emits an authoritative
|
|
185
|
+
`MESSAGES_SNAPSHOT` from the daemon-owned log. A durable pending interrupt is re-presented
|
|
186
|
+
through the standard terminate-resume contract; an active Loop remains observed through its
|
|
187
|
+
terminal; an idle conversation emits `RUN_FINISHED`. Synchronization admits no prompt,
|
|
188
|
+
creates no turn, and performs no model inference. Disconnecting this observer never cancels
|
|
189
|
+
independently-owned work.
|
|
190
|
+
|
|
173
191
|
## §agui-first-party-client-conformance First-party client conformance
|
|
174
192
|
|
|
175
193
|
The one-shot CLI, interactive terminal, and Neovim plugin consume one AG-UI+
|
|
@@ -210,6 +228,12 @@ presented one Worker at a time; resolving one re-surfaces the next without admit
|
|
|
210
228
|
Sibling and unrelated conversations never receive one another's gates. A resume containing foreign, partial, unknown, duplicate, or multi-worker
|
|
211
229
|
interrupt sets fails before any stopped operation is released.
|
|
212
230
|
|
|
231
|
+
An interrupt is an AG-UI Run boundary, not a Plurnk turn boundary. Before Run A's interrupt
|
|
232
|
+
terminal, the projection closes any active `turn-<id>` step. Run B emits `RUN_STARTED`, its
|
|
233
|
+
initial state, and a new `STEP_STARTED` for that same durable turn before releasing the stopped
|
|
234
|
+
operation. The continued loop later closes that Run B step normally. No AG-UI Run may finish
|
|
235
|
+
while a step remains active.
|
|
236
|
+
|
|
213
237
|
Proposal tool-call arguments and resume payloads retain the proposal review contract.
|
|
214
238
|
Client-interaction tool calls use the request's exact `toolName` and `arguments`; their standard
|
|
215
239
|
interrupt carries its optional `message` and `responseSchema`. A resolved resume payload becomes
|
package/dist/AguiSurface.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { JsonSchema } from "@plurnk/plurnk-contracts";
|
|
2
|
-
|
|
2
|
+
type AguiActionScope = "worldless" | "workspace" | "worker";
|
|
3
3
|
export interface AguiActionContract {
|
|
4
4
|
readonly scope: AguiActionScope;
|
|
5
5
|
readonly inputSchema: JsonSchema;
|
|
@@ -48,6 +48,5 @@ export declare const AGUI_NOTIFICATIONS: Readonly<{
|
|
|
48
48
|
"stream/concluded": AguiNotificationContract;
|
|
49
49
|
"workspace/branch-batch": AguiNotificationContract;
|
|
50
50
|
}>;
|
|
51
|
-
export
|
|
52
|
-
export type AguiNotificationName = keyof typeof AGUI_NOTIFICATIONS;
|
|
51
|
+
export {};
|
|
53
52
|
//# sourceMappingURL=AguiSurface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AguiSurface.d.ts","sourceRoot":"","sources":["../src/AguiSurface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAM3D,
|
|
1
|
+
{"version":3,"file":"AguiSurface.d.ts","sourceRoot":"","sources":["../src/AguiSurface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAM3D,KAAK,eAAe,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;CACrC;AAED,MAAM,WAAW,wBAAwB;IACrC,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC;CACtC;AAiED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkFwB,CAAC;AA6B1D,eAAO,MAAM,kBAAkB;;;;;;;;;;;EAoEgC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ActionOutcome } from "./AguiPlus.ts";
|
|
2
|
+
import { type AguiDiscovery, type ApplicationPort, type ClientEnvelope } from "@plurnk/plurnk-contracts";
|
|
3
|
+
export default class BuiltinActions {
|
|
4
|
+
#private;
|
|
5
|
+
constructor({ seam, capabilities, envelope, requireWorkspace }: {
|
|
6
|
+
seam: () => ApplicationPort;
|
|
7
|
+
capabilities: () => Promise<AguiDiscovery>;
|
|
8
|
+
envelope: (threadId: string, forwarded?: Record<string, unknown>) => Promise<{
|
|
9
|
+
env: ClientEnvelope;
|
|
10
|
+
reattached: boolean;
|
|
11
|
+
}>;
|
|
12
|
+
requireWorkspace: (kind: string, env: ClientEnvelope | null) => ClientEnvelope;
|
|
13
|
+
});
|
|
14
|
+
executeBuiltin(kind: string, p: Readonly<Record<string, unknown>>, env: ClientEnvelope | null, conversationWorkerId?: number): Promise<ActionOutcome>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=BuiltinActions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuiltinActions.d.ts","sourceRoot":"","sources":["../src/BuiltinActions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAuD,KAAK,aAAa,EAAE,KAAK,eAAe,EAAyB,KAAK,cAAc,EAAkE,MAAM,0BAA0B,CAAC;AAwCrP,MAAM,CAAC,OAAO,OAAO,cAAc;;IAM/B,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE;QAC5D,IAAI,EAAE,MAAM,eAAe,CAAC;QAC5B,YAAY,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;QAC3C,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;YAAE,GAAG,EAAE,cAAc,CAAC;YAAC,UAAU,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QAC3H,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,KAAK,cAAc,CAAC;KAClF,EAKA;IAKK,cAAc,CAChB,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACpC,GAAG,EAAE,cAAc,GAAG,IAAI,EAC1B,oBAAoB,CAAC,EAAE,MAAM,GAC9B,OAAO,CAAC,aAAa,CAAC,CAyXxB;CAEJ"}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
// The AG-UI built-in actions: the management-plane calls a client makes by name. Split out of the module.
|
|
2
|
+
import {} from "./AguiPlus.js";
|
|
3
|
+
import { Problems, PlurnkParser, UNKNOWN_POSITION, Validator } from "@plurnk/plurnk-contracts";
|
|
4
|
+
import { actionFailure, problemFromError } from "./action-results.js";
|
|
5
|
+
const operationOutcome = (result) => {
|
|
6
|
+
const exact = Validator.assertOperationResult(result);
|
|
7
|
+
return exact.problem === undefined
|
|
8
|
+
? { ok: true, result: exact }
|
|
9
|
+
: { ok: false, problem: exact.problem };
|
|
10
|
+
};
|
|
11
|
+
const parseFailureResult = ({ detail, line, column, source, severity, }) => ({
|
|
12
|
+
status: 400,
|
|
13
|
+
problem: Problems.create("agui:action", "parse-failed", 400, detail, {
|
|
14
|
+
line,
|
|
15
|
+
column,
|
|
16
|
+
source,
|
|
17
|
+
severity,
|
|
18
|
+
stage: "parsing",
|
|
19
|
+
retryable: false,
|
|
20
|
+
}),
|
|
21
|
+
});
|
|
22
|
+
export default class BuiltinActions {
|
|
23
|
+
#seam;
|
|
24
|
+
#capabilities;
|
|
25
|
+
#envelope;
|
|
26
|
+
#requireWorkspace;
|
|
27
|
+
constructor({ seam, capabilities, envelope, requireWorkspace }) {
|
|
28
|
+
this.#seam = seam;
|
|
29
|
+
this.#capabilities = capabilities;
|
|
30
|
+
this.#envelope = envelope;
|
|
31
|
+
this.#requireWorkspace = requireWorkspace;
|
|
32
|
+
}
|
|
33
|
+
// The built-in implementation half of the declarative registry. The registry
|
|
34
|
+
// owns membership, scope, admission, projection, and discovery; this dispatch
|
|
35
|
+
// owns only the corresponding daemon operation.
|
|
36
|
+
async executeBuiltin(kind, p, env, conversationWorkerId) {
|
|
37
|
+
try {
|
|
38
|
+
// Worldless actions never bind or forge a workspace.
|
|
39
|
+
switch (kind) {
|
|
40
|
+
case "ping": return { ok: true, result: {} };
|
|
41
|
+
case "discover": return { ok: true, result: await this.#capabilities() };
|
|
42
|
+
case "providers.list": return { ok: true, result: this.#seam().listProviders() };
|
|
43
|
+
case "models.list": {
|
|
44
|
+
return { ok: true, result: this.#seam().listModels(Validator.assertModelCatalogQuery(p)) };
|
|
45
|
+
}
|
|
46
|
+
case "workspace.list": return { ok: true, result: { workspaces: await this.#seam().listWorkspaces() } };
|
|
47
|
+
case "workspace.create": {
|
|
48
|
+
// The name IS the identity: an explicit name creates/attaches EXACTLY
|
|
49
|
+
// that workspace; no name = the daemon names it and the real name binds.
|
|
50
|
+
if (Object.hasOwn(p, "name") && (typeof p.name !== "string" || p.name.length === 0)) {
|
|
51
|
+
return actionFailure("invalid-action-parameters", "workspace.create name is not a non-empty string.", 400, { field: "name", recovery: "Provide a non-empty workspace name or omit it." });
|
|
52
|
+
}
|
|
53
|
+
if (typeof p.name === "string") {
|
|
54
|
+
// The name IS the world here — feed it as the workspace so #envelope
|
|
55
|
+
// creates/attaches exactly it (p carries no `workspace` of its own).
|
|
56
|
+
const { env: created } = await this.#envelope(p.name, { ...p, workspace: p.name });
|
|
57
|
+
return { ok: true, result: { id: created.workspaceId, name: created.workspaceName, workerId: created.workerId } };
|
|
58
|
+
}
|
|
59
|
+
const created = await this.#seam().createWorkspace({
|
|
60
|
+
...(Object.hasOwn(p, "projectRoot")
|
|
61
|
+
? { projectRoot: p.projectRoot }
|
|
62
|
+
: {}),
|
|
63
|
+
...(Object.hasOwn(p, "constraints")
|
|
64
|
+
? { constraints: p.constraints }
|
|
65
|
+
: {}),
|
|
66
|
+
...(Object.hasOwn(p, "settings")
|
|
67
|
+
? { settings: p.settings }
|
|
68
|
+
: {}),
|
|
69
|
+
});
|
|
70
|
+
return { ok: true, result: { id: created.workspaceId, name: created.workspaceName, workerId: created.workerId } };
|
|
71
|
+
}
|
|
72
|
+
case "workspace.attach": {
|
|
73
|
+
// A REAL attach: rebind the thread map to the chosen workspace and hand
|
|
74
|
+
// back its envelope — the picker does what it says (the unwired kind +
|
|
75
|
+
// a nil-masking fallback produced the 2026-07-10 front-door disaster).
|
|
76
|
+
if (typeof p.id !== "number") {
|
|
77
|
+
return actionFailure("invalid-action-parameters", "workspace.attach requires a numeric workspace id.", 400, {
|
|
78
|
+
field: "id",
|
|
79
|
+
recovery: "Provide a workspace id returned by workspace.list.",
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const att = await this.#seam().attachWorkspace({ workspaceId: p.id, ...(typeof p.workerId === "number" ? { workerId: p.workerId } : {}) });
|
|
83
|
+
return { ok: true, result: { id: att.workspaceId, name: att.workspaceName, workerId: att.workerId } };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const world = this.#requireWorkspace(kind, env);
|
|
87
|
+
switch (kind) {
|
|
88
|
+
case "workspace.workers": return { ok: true, result: { workers: await this.#seam().listWorkers(typeof p.id === "number" ? p.id : world.workspaceId) } };
|
|
89
|
+
case "log.read": {
|
|
90
|
+
// Default worker: the conversation; p.workerId pins another.
|
|
91
|
+
const readWorkerId = typeof p.workerId === "number" ? p.workerId : conversationWorkerId ?? await this.#seam().ensureModelWorker(world.workspaceId);
|
|
92
|
+
const entries = await this.#seam().readLog({
|
|
93
|
+
workspaceId: world.workspaceId,
|
|
94
|
+
workerId: readWorkerId,
|
|
95
|
+
...(Object.hasOwn(p, "limit") ? { limit: p.limit } : {}),
|
|
96
|
+
...(Object.hasOwn(p, "sinceId") ? { sinceId: p.sinceId } : {}),
|
|
97
|
+
...(Object.hasOwn(p, "loopId") ? { loopId: p.loopId } : {}),
|
|
98
|
+
...(Object.hasOwn(p, "turnId") ? { turnId: p.turnId } : {}),
|
|
99
|
+
...(Object.hasOwn(p, "loopSeq") ? { loopSeq: p.loopSeq } : {}),
|
|
100
|
+
...(Object.hasOwn(p, "turnSeq") ? { turnSeq: p.turnSeq } : {}),
|
|
101
|
+
...(Object.hasOwn(p, "sequence") ? { sequence: p.sequence } : {}),
|
|
102
|
+
});
|
|
103
|
+
return { ok: true, result: { entries } };
|
|
104
|
+
}
|
|
105
|
+
case "loop.inject": {
|
|
106
|
+
if (typeof p.prompt !== "string" || p.prompt.length === 0) {
|
|
107
|
+
return actionFailure("invalid-action-parameters", "loop.inject requires a non-empty prompt.", 400, { field: "prompt", recovery: "Provide the prompt to inject." });
|
|
108
|
+
}
|
|
109
|
+
const ack = await this.#seam().runLoop({ workspaceId: world.workspaceId, workerId: conversationWorkerId ?? await this.#seam().ensureModelWorker(world.workspaceId), prompt: p.prompt });
|
|
110
|
+
return operationOutcome(ack);
|
|
111
|
+
}
|
|
112
|
+
// The stop button (TUI /stop + Ctrl-C, nvim :PlurnkStop): abort the model
|
|
113
|
+
// worker's active drain. Mirrors the SSE-hangup abort, addressable as a verb.
|
|
114
|
+
case "loop.cancel": return { ok: true, result: { cancelled: this.#seam().cancelDrain(conversationWorkerId ?? await this.#seam().ensureModelWorker(world.workspaceId), typeof p.reason === "string" ? p.reason : undefined) } };
|
|
115
|
+
case "workspace.prompts": return {
|
|
116
|
+
ok: true,
|
|
117
|
+
result: {
|
|
118
|
+
prompts: await this.#seam().listPrompts(world.workspaceId, Object.hasOwn(p, "limit") ? p.limit : undefined),
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
case "workspace.rename": {
|
|
122
|
+
if (typeof p.name !== "string" || p.name.length === 0) {
|
|
123
|
+
return actionFailure("invalid-action-parameters", "workspace.rename requires a non-empty name.", 400, { field: "name", recovery: "Provide the new workspace name." });
|
|
124
|
+
}
|
|
125
|
+
return { ok: true, result: await this.#seam().renameWorkspace(world.workspaceId, p.name) };
|
|
126
|
+
}
|
|
127
|
+
case "workspace.derivation": return { ok: true, result: { status: this.#seam().workspaceDerivationStatus(world.workspaceId) } };
|
|
128
|
+
case "entry.read": {
|
|
129
|
+
if (typeof p.target !== "string") {
|
|
130
|
+
return actionFailure("invalid-action-parameters", "entry.read requires a string target.", 400, { field: "target", recovery: "Provide an entry URI." });
|
|
131
|
+
}
|
|
132
|
+
if (Object.hasOwn(p, "workerId")
|
|
133
|
+
&& (typeof p.workerId !== "number" || !Number.isSafeInteger(p.workerId) || p.workerId <= 0)) {
|
|
134
|
+
return actionFailure("invalid-action-parameters", "entry.read workerId must be a positive integer.", 400, { field: "workerId", recovery: "Use the workerId supplied with the entry notification." });
|
|
135
|
+
}
|
|
136
|
+
const result = Validator.assertEntryReadResult(await this.#seam().readEntry({
|
|
137
|
+
workspaceId: world.workspaceId,
|
|
138
|
+
workerId: typeof p.workerId === "number"
|
|
139
|
+
? p.workerId
|
|
140
|
+
: conversationWorkerId ?? await this.#seam().ensureModelWorker(world.workspaceId),
|
|
141
|
+
target: p.target,
|
|
142
|
+
...(Object.hasOwn(p, "channel") ? { channel: p.channel } : {}),
|
|
143
|
+
...(Object.hasOwn(p, "offset") ? { offset: p.offset } : {}),
|
|
144
|
+
}));
|
|
145
|
+
return operationOutcome(result);
|
|
146
|
+
}
|
|
147
|
+
case "op.exec": {
|
|
148
|
+
// EXEC constructed structurally (no DSL text): the model-facing shape,
|
|
149
|
+
// proposal-gated by the engine like any client op.
|
|
150
|
+
if (typeof p.command !== "string" || p.command.length === 0) {
|
|
151
|
+
return actionFailure("invalid-action-parameters", "op.exec requires a non-empty command.", 400, { field: "command", recovery: "Provide the command to execute." });
|
|
152
|
+
}
|
|
153
|
+
const statement = {
|
|
154
|
+
op: "EXEC", executor: null, delimiter: "", annotation: null, target: null,
|
|
155
|
+
metadata: null, lineMarker: null, body: p.command, position: UNKNOWN_POSITION,
|
|
156
|
+
};
|
|
157
|
+
// Client ops journal as client-origin turns in the client worker (worker split:
|
|
158
|
+
// only LOOPS live in the model worker) and execute in the attached Worker's
|
|
159
|
+
// Functionality ({§actor-boundary-attached-functionality}).
|
|
160
|
+
const [result] = await this.#seam().dispatchClientAction({
|
|
161
|
+
workspaceId: world.workspaceId,
|
|
162
|
+
workerId: world.workerId,
|
|
163
|
+
functionalityWorkerId: conversationWorkerId ?? await this.#seam().ensureModelWorker(world.workspaceId),
|
|
164
|
+
statements: [statement],
|
|
165
|
+
});
|
|
166
|
+
if (result === undefined)
|
|
167
|
+
throw new Error("op.exec dispatch returned no operation result");
|
|
168
|
+
return operationOutcome(result);
|
|
169
|
+
}
|
|
170
|
+
case "op.parse": {
|
|
171
|
+
// Raw DSL is parsed at the module's edge; statements and parser facts project
|
|
172
|
+
// through one ordered result contract. {§agui-op-parse}
|
|
173
|
+
if (typeof p.text !== "string" || p.text.length === 0) {
|
|
174
|
+
return actionFailure("invalid-action-parameters", "op.parse requires non-empty PLURNK text.", 400, { field: "text", recovery: "Provide PLURNK statements to parse." });
|
|
175
|
+
}
|
|
176
|
+
const parsed = PlurnkParser.parseClient(p.text);
|
|
177
|
+
const results = [];
|
|
178
|
+
const statements = [];
|
|
179
|
+
for (const item of parsed.items) {
|
|
180
|
+
if (item.kind === "error") {
|
|
181
|
+
results.push(parseFailureResult({
|
|
182
|
+
detail: item.error.message,
|
|
183
|
+
line: item.error.line,
|
|
184
|
+
column: item.error.column,
|
|
185
|
+
source: item.error.source,
|
|
186
|
+
severity: item.error.severity,
|
|
187
|
+
}));
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (item.kind !== "statement")
|
|
191
|
+
continue; // interstitial text isn't dispatchable
|
|
192
|
+
statements.push(item.statement);
|
|
193
|
+
results.push(null);
|
|
194
|
+
}
|
|
195
|
+
if (parsed.unparsedTail !== undefined) {
|
|
196
|
+
results.push(parseFailureResult({
|
|
197
|
+
detail: parsed.unparsedTail.reason,
|
|
198
|
+
line: parsed.unparsedTail.from.line,
|
|
199
|
+
column: parsed.unparsedTail.from.column,
|
|
200
|
+
source: "grammar",
|
|
201
|
+
severity: "error",
|
|
202
|
+
}));
|
|
203
|
+
}
|
|
204
|
+
const dispatched = statements.length === 0
|
|
205
|
+
? []
|
|
206
|
+
: await this.#seam().dispatchClientAction({
|
|
207
|
+
workspaceId: world.workspaceId,
|
|
208
|
+
workerId: world.workerId,
|
|
209
|
+
functionalityWorkerId: conversationWorkerId ?? await this.#seam().ensureModelWorker(world.workspaceId),
|
|
210
|
+
statements,
|
|
211
|
+
});
|
|
212
|
+
let index = 0;
|
|
213
|
+
for (let i = 0; i < results.length; i++) {
|
|
214
|
+
if (results[i] === null)
|
|
215
|
+
results[i] = dispatched[index++];
|
|
216
|
+
}
|
|
217
|
+
return { ok: true, result: { results } };
|
|
218
|
+
}
|
|
219
|
+
case "op.look": {
|
|
220
|
+
// {§agui-op-look}
|
|
221
|
+
if (typeof p.text !== "string" || p.text.length === 0) {
|
|
222
|
+
return actionFailure("invalid-action-parameters", "op.look requires non-empty PLURNK text.", 400, { field: "text", recovery: "Provide one PLURNK statement to observe." });
|
|
223
|
+
}
|
|
224
|
+
const parsed = PlurnkParser.parseClient(p.text);
|
|
225
|
+
const diagnostic = parsed.items.find((item) => item.kind === "error");
|
|
226
|
+
if (diagnostic !== undefined && diagnostic.kind === "error") {
|
|
227
|
+
return operationOutcome(parseFailureResult({
|
|
228
|
+
detail: diagnostic.error.message,
|
|
229
|
+
line: diagnostic.error.line,
|
|
230
|
+
column: diagnostic.error.column,
|
|
231
|
+
source: diagnostic.error.source,
|
|
232
|
+
severity: diagnostic.error.severity,
|
|
233
|
+
}));
|
|
234
|
+
}
|
|
235
|
+
if (parsed.unparsedTail !== undefined) {
|
|
236
|
+
return operationOutcome(parseFailureResult({
|
|
237
|
+
detail: parsed.unparsedTail.reason,
|
|
238
|
+
line: parsed.unparsedTail.from.line,
|
|
239
|
+
column: parsed.unparsedTail.from.column,
|
|
240
|
+
source: "grammar",
|
|
241
|
+
severity: "error",
|
|
242
|
+
}));
|
|
243
|
+
}
|
|
244
|
+
const textItem = parsed.items.find((item) => item.kind === "text");
|
|
245
|
+
if (textItem !== undefined && textItem.kind === "text") {
|
|
246
|
+
return actionFailure("invalid-action-parameters", "op.look parsed text outside the statement; only surrounding whitespace is allowed.", 400, {
|
|
247
|
+
field: "text",
|
|
248
|
+
line: textItem.position.line,
|
|
249
|
+
column: textItem.position.column,
|
|
250
|
+
recovery: "Remove text outside the LOOK statement.",
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
const statements = parsed.items.filter((item) => item.kind === "statement");
|
|
254
|
+
if (statements.length !== 1) {
|
|
255
|
+
return actionFailure("invalid-action-parameters", `op.look parsed ${statements.length} statements; exactly one LOOK statement is required.`, 400, { field: "text", recovery: "Provide exactly one valid LOOK statement." });
|
|
256
|
+
}
|
|
257
|
+
const [item] = statements;
|
|
258
|
+
if (item.statement.op !== "LOOK") {
|
|
259
|
+
return actionFailure("invalid-action-parameters", `op.look parsed ${item.statement.op}; the single statement must be LOOK.`, 400, { field: "text", recovery: "Use LOOK as the observation operation." });
|
|
260
|
+
}
|
|
261
|
+
const statement = { ...item.statement, op: "READ" };
|
|
262
|
+
return operationOutcome(await this.#seam().look({
|
|
263
|
+
workspaceId: world.workspaceId,
|
|
264
|
+
workerId: world.workerId,
|
|
265
|
+
functionalityWorkerId: conversationWorkerId ?? await this.#seam().ensureModelWorker(world.workspaceId),
|
|
266
|
+
statement,
|
|
267
|
+
}));
|
|
268
|
+
}
|
|
269
|
+
case "run.fork": return { ok: true, result: await this.#seam().forkWorker({ workspaceId: world.workspaceId, workerId: conversationWorkerId ?? await this.#seam().ensureModelWorker(world.workspaceId), ...(typeof p.name === "string" ? { name: p.name } : {}) }) };
|
|
270
|
+
case "worker.model.get": {
|
|
271
|
+
const { model, spawnModel } = await this.#seam().readWorkerModel({
|
|
272
|
+
workspaceId: world.workspaceId,
|
|
273
|
+
workerId: conversationWorkerId ?? await this.#seam().ensureModelWorker(world.workspaceId),
|
|
274
|
+
});
|
|
275
|
+
return { ok: true, result: { model, spawnModel } };
|
|
276
|
+
}
|
|
277
|
+
case "worker.model.set": {
|
|
278
|
+
if (typeof p.selector !== "string" || p.selector.length === 0) {
|
|
279
|
+
return actionFailure("invalid-action-parameters", "worker.model.set requires a selector.", 400, { recovery: "Provide a declared alias or provider/model route." });
|
|
280
|
+
}
|
|
281
|
+
return { ok: true, result: await this.#seam().setWorkerModel({
|
|
282
|
+
workspaceId: world.workspaceId,
|
|
283
|
+
workerId: conversationWorkerId ?? await this.#seam().ensureModelWorker(world.workspaceId),
|
|
284
|
+
selector: p.selector,
|
|
285
|
+
}) };
|
|
286
|
+
}
|
|
287
|
+
case "worker.child.set": {
|
|
288
|
+
if (!Object.hasOwn(p, "selector")
|
|
289
|
+
|| (p.selector !== null && (typeof p.selector !== "string" || p.selector.length === 0))) {
|
|
290
|
+
return actionFailure("invalid-action-parameters", "worker.child.set requires a selector.", 400, { recovery: "Provide a declared alias or provider/model route; null means inherit." });
|
|
291
|
+
}
|
|
292
|
+
return { ok: true, result: await this.#seam().setWorkerSpawnModel({
|
|
293
|
+
workspaceId: world.workspaceId,
|
|
294
|
+
workerId: conversationWorkerId ?? await this.#seam().ensureModelWorker(world.workspaceId),
|
|
295
|
+
selector: p.selector,
|
|
296
|
+
}) };
|
|
297
|
+
}
|
|
298
|
+
case "worker.reasoning.get": {
|
|
299
|
+
return { ok: true, result: await this.#seam().readWorkerReasoning({
|
|
300
|
+
workspaceId: world.workspaceId,
|
|
301
|
+
workerId: conversationWorkerId ?? await this.#seam().ensureModelWorker(world.workspaceId),
|
|
302
|
+
}) };
|
|
303
|
+
}
|
|
304
|
+
case "worker.reasoning.set": {
|
|
305
|
+
if (!Object.hasOwn(p, "policy")) {
|
|
306
|
+
return actionFailure("invalid-action-parameters", "worker.reasoning.set requires a policy.", 400, { recovery: "Provide a reasoning policy." });
|
|
307
|
+
}
|
|
308
|
+
return { ok: true, result: await this.#seam().setWorkerReasoning({
|
|
309
|
+
workspaceId: world.workspaceId,
|
|
310
|
+
workerId: conversationWorkerId ?? await this.#seam().ensureModelWorker(world.workspaceId),
|
|
311
|
+
policy: p.policy,
|
|
312
|
+
}) };
|
|
313
|
+
}
|
|
314
|
+
case "worker.capabilities.get": {
|
|
315
|
+
return { ok: true, result: await this.#seam().readWorkerCapabilities({
|
|
316
|
+
workspaceId: world.workspaceId,
|
|
317
|
+
workerId: conversationWorkerId ?? await this.#seam().ensureModelWorker(world.workspaceId),
|
|
318
|
+
}) };
|
|
319
|
+
}
|
|
320
|
+
case "worker.capabilities.set": {
|
|
321
|
+
return { ok: true, result: await this.#seam().setWorkerCapabilities({
|
|
322
|
+
workspaceId: world.workspaceId,
|
|
323
|
+
workerId: conversationWorkerId ?? await this.#seam().ensureModelWorker(world.workspaceId),
|
|
324
|
+
policy: p.policy,
|
|
325
|
+
}) };
|
|
326
|
+
}
|
|
327
|
+
default: throw new Error(`AG-UI built-in '${kind}' has no executor`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
catch (err) {
|
|
331
|
+
const problem = problemFromError(err);
|
|
332
|
+
if (problem !== null)
|
|
333
|
+
return { ok: false, problem };
|
|
334
|
+
console.error(`AG-UI action '${kind}' failed:`, err);
|
|
335
|
+
return actionFailure("action-failed", "The action failed unexpectedly.", 500);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=BuiltinActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuiltinActions.js","sourceRoot":"","sources":["../src/BuiltinActions.ts"],"names":[],"mappings":"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"}
|
package/dist/EventRouter.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type TranslatorContinuation } from "./Translator.ts";
|
|
2
|
-
import { type AguiEvent } from "./types.ts";
|
|
2
|
+
import { type AguiEvent, type UserMessage } from "./types.ts";
|
|
3
3
|
export default class EventRouter {
|
|
4
4
|
#private;
|
|
5
5
|
constructor(args: {
|
|
@@ -9,9 +9,13 @@ export default class EventRouter {
|
|
|
9
9
|
workspaceId?: number | null;
|
|
10
10
|
continuation?: TranslatorContinuation;
|
|
11
11
|
});
|
|
12
|
-
runStarted(
|
|
13
|
-
replay(entries: Array<Record<string, unknown
|
|
14
|
-
|
|
12
|
+
runStarted(state?: AguiEvent): AguiEvent[];
|
|
13
|
+
replay(entries: Array<Record<string, unknown>>, currentUser?: UserMessage): AguiEvent[];
|
|
14
|
+
interrupt(): {
|
|
15
|
+
events: AguiEvent[];
|
|
16
|
+
continuation: TranslatorContinuation;
|
|
17
|
+
};
|
|
18
|
+
finish(): AguiEvent[];
|
|
15
19
|
route(method: string, params: unknown): AguiEvent[];
|
|
16
20
|
}
|
|
17
21
|
//# sourceMappingURL=EventRouter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventRouter.d.ts","sourceRoot":"","sources":["../src/EventRouter.ts"],"names":[],"mappings":"AAOA,OAAmB,EAAE,KAAK,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAa,KAAK,SAAS,EAA2F,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"EventRouter.d.ts","sourceRoot":"","sources":["../src/EventRouter.ts"],"names":[],"mappings":"AAOA,OAAmB,EAAE,KAAK,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAa,KAAK,SAAS,EAA2F,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAQlK,MAAM,CAAC,OAAO,OAAO,WAAW;;IAG5B,YAAY,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,YAAY,CAAC,EAAE,sBAAsB,CAAA;KAAE,EAEvJ;IAED,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,CAAsC;IAChF,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,SAAS,EAAE,CAAiD;IACxI,SAAS,IAAI;QAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAAC,YAAY,EAAE,sBAAsB,CAAA;KAAE,CAAgC;IAC1G,MAAM,IAAI,SAAS,EAAE,CAA6B;IAElD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE,CAMlD;CA8CJ"}
|
package/dist/EventRouter.js
CHANGED
|
@@ -16,9 +16,10 @@ class EventRouter {
|
|
|
16
16
|
constructor(args) {
|
|
17
17
|
this.#t = new Translator(args);
|
|
18
18
|
}
|
|
19
|
-
runStarted(
|
|
20
|
-
replay(entries) { return this.#t.replay(entries); }
|
|
21
|
-
|
|
19
|
+
runStarted(state) { return this.#t.runStarted(state); }
|
|
20
|
+
replay(entries, currentUser) { return this.#t.replay(entries, currentUser); }
|
|
21
|
+
interrupt() { return this.#t.interrupt(); }
|
|
22
|
+
finish() { return this.#t.finish(); }
|
|
22
23
|
route(method, params) {
|
|
23
24
|
return observedSync(// {§observability-boundary} — the method name only; params stay off the span.
|
|
24
25
|
"agui.event", { method }, () => this.#routeSettled(method, params));
|
package/dist/EventRouter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventRouter.js","sourceRoot":"","sources":["../src/EventRouter.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,qFAAqF;AACrF,sFAAsF;AACtF,8FAA8F;AAC9F,wFAAwF;AACxF,kFAAkF;;AAElF,OAAO,UAAU,EAAE,EAA+B,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"EventRouter.js","sourceRoot":"","sources":["../src/EventRouter.ts"],"names":[],"mappings":"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"}
|
package/dist/Module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Module.d.ts","sourceRoot":"","sources":["../src/Module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Module.d.ts","sourceRoot":"","sources":["../src/Module.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAiC,KAAK,eAAe,EAA4C,MAAM,0BAA0B,CAAC;AAEzI,OAAO,EAAwB,KAAK,aAAa,EAA8B,MAAM,aAAa,CAAC;AAMnG,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IAC/B,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACjD;AAmBD,MAAM,CAAC,OAAO,OAAO,MAAM;;IAcvB,OAAO,eAGN;IAyDD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,GAAG,kBAAkB,CAWnD;IAKD,OAAa,IAAI,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAItD;IAEK,MAAM,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAmBtD;IAEK,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CASlD;IAED,OAAO,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAIxC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAS3B;CA6OJ"}
|