@plurnk/plurnk-agui 0.3.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/.env.example +37 -0
- package/README.md +65 -0
- package/SPEC.md +115 -0
- package/dist/AguiPlus.d.ts +58 -0
- package/dist/AguiPlus.d.ts.map +1 -0
- package/dist/AguiPlus.js +67 -0
- package/dist/AguiPlus.js.map +1 -0
- package/dist/DaemonClient.d.ts +9 -0
- package/dist/DaemonClient.d.ts.map +1 -0
- package/dist/DaemonClient.js +55 -0
- package/dist/DaemonClient.js.map +1 -0
- package/dist/DaemonSeam.d.ts +103 -0
- package/dist/DaemonSeam.d.ts.map +1 -0
- package/dist/DaemonSeam.js +7 -0
- package/dist/DaemonSeam.js.map +1 -0
- package/dist/EventRouter.d.ts +14 -0
- package/dist/EventRouter.d.ts.map +1 -0
- package/dist/EventRouter.js +27 -0
- package/dist/EventRouter.js.map +1 -0
- package/dist/Module.d.ts +23 -0
- package/dist/Module.d.ts.map +1 -0
- package/dist/Module.js +200 -0
- package/dist/Module.js.map +1 -0
- package/dist/Portal.d.ts +33 -0
- package/dist/Portal.d.ts.map +1 -0
- package/dist/Portal.js +62 -0
- package/dist/Portal.js.map +1 -0
- package/dist/ProposalHitl.d.ts +14 -0
- package/dist/ProposalHitl.d.ts.map +1 -0
- package/dist/ProposalHitl.js +64 -0
- package/dist/ProposalHitl.js.map +1 -0
- package/dist/Server.d.ts +10 -0
- package/dist/Server.d.ts.map +1 -0
- package/dist/Server.js +232 -0
- package/dist/Server.js.map +1 -0
- package/dist/Translator.d.ts +17 -0
- package/dist/Translator.d.ts.map +1 -0
- package/dist/Translator.js +200 -0
- package/dist/Translator.js.map +1 -0
- package/dist/bin/serve.d.ts +3 -0
- package/dist/bin/serve.d.ts.map +1 -0
- package/dist/bin/serve.js +9 -0
- package/dist/bin/serve.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +134 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/package.json +65 -0
package/dist/Server.js
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
// The AG-UI face: POST / runs an agent turn and streams the projection as SSE until the loop
|
|
2
|
+
// terminates; POST /resolve answers a pending proposal (file edit, MCP auth, [300] question).
|
|
3
|
+
// An AG-UI threadId IS a plurnk session (`<prefix>-<threadId>`, created on first run, reattached
|
|
4
|
+
// after) — the daemon's extended context persists across AG-UI runs for free (§agui-thread-is-session).
|
|
5
|
+
var _a;
|
|
6
|
+
import { createServer } from "node:http";
|
|
7
|
+
import DaemonClient from "./DaemonClient.js";
|
|
8
|
+
import Translator from "./Translator.js";
|
|
9
|
+
const env = (name) => {
|
|
10
|
+
const v = process.env[name];
|
|
11
|
+
if (v === undefined || v.length === 0)
|
|
12
|
+
throw new Error(`plurnk-agui: ${name} must be set (see .env.example)`);
|
|
13
|
+
return v;
|
|
14
|
+
};
|
|
15
|
+
class Server {
|
|
16
|
+
#http;
|
|
17
|
+
#daemonUrl;
|
|
18
|
+
#threads = new Map();
|
|
19
|
+
constructor() {
|
|
20
|
+
this.#daemonUrl = env("PLURNK_AGUI_DAEMON_URL");
|
|
21
|
+
this.#http = createServer((req, res) => { void this.#route(req, res); });
|
|
22
|
+
}
|
|
23
|
+
async listen() {
|
|
24
|
+
const host = env("PLURNK_AGUI_HOST");
|
|
25
|
+
await new Promise((resolve) => this.#http.listen(Number(env("PLURNK_AGUI_PORT")), host, resolve));
|
|
26
|
+
const addr = this.#http.address();
|
|
27
|
+
if (addr === null || typeof addr === "string")
|
|
28
|
+
throw new Error("plurnk-agui: listener bound no TCP address");
|
|
29
|
+
return { host, port: addr.port }; // the BOUND port — PORT=0 (ephemeral) reports the real one
|
|
30
|
+
}
|
|
31
|
+
async close() {
|
|
32
|
+
for (const t of this.#threads.values())
|
|
33
|
+
t.client.close();
|
|
34
|
+
await new Promise((resolve, reject) => this.#http.close((e) => (e ? reject(e) : resolve())));
|
|
35
|
+
}
|
|
36
|
+
async #route(req, res) {
|
|
37
|
+
try {
|
|
38
|
+
// CORS: browser frontends (the demo page, CopilotKit dev servers) POST cross-origin.
|
|
39
|
+
res.setHeader("access-control-allow-origin", "*");
|
|
40
|
+
res.setHeader("access-control-allow-headers", "content-type, authorization");
|
|
41
|
+
if (req.method === "OPTIONS") {
|
|
42
|
+
res.writeHead(204).end();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// §agui-auth — empty token = local trust (loopback bind is the boundary, the daemon's
|
|
46
|
+
// own posture); set = every POST carries the bearer, checked before any body read.
|
|
47
|
+
const token = process.env.PLURNK_AGUI_TOKEN ?? "";
|
|
48
|
+
if (token.length > 0 && req.headers.authorization !== `Bearer ${token}`) {
|
|
49
|
+
res.writeHead(401, { "content-type": "application/json" }).end(JSON.stringify({ error: "bearer token required" }));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (req.method === "POST" && (req.url === "/" || req.url === "/agui"))
|
|
53
|
+
return await this.#run(req, res);
|
|
54
|
+
if (req.method === "POST" && req.url === "/resolve")
|
|
55
|
+
return await this.#resolve(req, res);
|
|
56
|
+
if (req.method === "POST" && req.url === "/plurnk/rpc")
|
|
57
|
+
return await this.#rpc(req, res);
|
|
58
|
+
res.writeHead(404, { "content-type": "application/json" }).end(JSON.stringify({ error: "POST / (AG-UI run) or POST /resolve" }));
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
62
|
+
if (!res.headersSent)
|
|
63
|
+
res.writeHead(500, { "content-type": "application/json" });
|
|
64
|
+
res.end(JSON.stringify({ error: message }));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async #thread(threadId, createOptions) {
|
|
68
|
+
const existing = this.#threads.get(threadId);
|
|
69
|
+
if (existing !== undefined)
|
|
70
|
+
return existing;
|
|
71
|
+
const client = await DaemonClient.connect(this.#daemonUrl);
|
|
72
|
+
const name = `${env("PLURNK_AGUI_SESSION_PREFIX")}-${threadId}`;
|
|
73
|
+
// Reattach by NAME via session.list → attach by ID (the daemon's real contract — the
|
|
74
|
+
// earlier attach-by-name silently created a fresh session every bridge restart, found
|
|
75
|
+
// by the service's own the service SPEC proposal-list contract e2e). A rediscovered thread is a REATTACH.
|
|
76
|
+
const listed = await client.call("session.list", {});
|
|
77
|
+
const known = Array.isArray(listed?.sessions) ? listed.sessions.find((x) => x.name === name) : undefined;
|
|
78
|
+
let sessionId;
|
|
79
|
+
let reattached = false;
|
|
80
|
+
let modelRunId = null;
|
|
81
|
+
if (known !== undefined) {
|
|
82
|
+
await client.call("session.attach", { id: known.id });
|
|
83
|
+
sessionId = known.id;
|
|
84
|
+
reattached = true;
|
|
85
|
+
const runs = await client.call("session.runs", {}).catch(() => null);
|
|
86
|
+
modelRunId = (Array.isArray(runs?.runs) ? runs.runs.find((r) => r.name.startsWith("model-"))?.id : undefined) ?? null;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// §agui-forwarded-props — RunAgentInput.forwardedProps.plurnk is the spec's sanctioned
|
|
90
|
+
// side-channel: session.create options (projectRoot, constraints, settings) ride the
|
|
91
|
+
// thread's FIRST run. The bridge's questions default composes UNDER an explicit one.
|
|
92
|
+
const opts = createOptions ?? {};
|
|
93
|
+
const settings = { ...(env("PLURNK_AGUI_QUESTIONS") === "1" ? { questions: true } : {}), ...(typeof opts.settings === "object" && opts.settings !== null ? opts.settings : {}) };
|
|
94
|
+
const created = await client.call("session.create", {
|
|
95
|
+
name, settings,
|
|
96
|
+
...(typeof opts.projectRoot === "string" ? { projectRoot: opts.projectRoot } : {}),
|
|
97
|
+
...(Array.isArray(opts.constraints) ? { constraints: opts.constraints } : {}),
|
|
98
|
+
});
|
|
99
|
+
sessionId = created.id;
|
|
100
|
+
// created.runId is the CLIENT run — the model run is born at loop.run's drain;
|
|
101
|
+
// the Translator lazily adopts the first model-origin row's run (§agui-topology-scope).
|
|
102
|
+
}
|
|
103
|
+
const thread = { sessionId, client, reattached, modelRunId };
|
|
104
|
+
this.#threads.set(threadId, thread);
|
|
105
|
+
return thread;
|
|
106
|
+
}
|
|
107
|
+
async #run(req, res) {
|
|
108
|
+
const input = JSON.parse(await _a.#body(req));
|
|
109
|
+
if (typeof input.threadId !== "string" || input.threadId.length === 0)
|
|
110
|
+
throw new Error("RunAgentInput.threadId required");
|
|
111
|
+
const lastUser = [...(input.messages ?? [])].reverse().find((m) => m.role === "user");
|
|
112
|
+
if (lastUser?.content === undefined || lastUser.content.length === 0)
|
|
113
|
+
throw new Error("RunAgentInput.messages must carry a user message");
|
|
114
|
+
const forwarded = input.forwardedProps?.plurnk;
|
|
115
|
+
const thread = await this.#thread(input.threadId, forwarded);
|
|
116
|
+
const client = thread.client;
|
|
117
|
+
const translator = new Translator({ threadId: input.threadId, runId: input.runId ?? crypto.randomUUID(), modelRunId: thread.modelRunId, sessionId: thread.sessionId });
|
|
118
|
+
res.writeHead(200, {
|
|
119
|
+
"content-type": "text/event-stream",
|
|
120
|
+
"cache-control": "no-cache",
|
|
121
|
+
"connection": "keep-alive",
|
|
122
|
+
});
|
|
123
|
+
const emit = (events) => {
|
|
124
|
+
for (const e of events)
|
|
125
|
+
res.write(`data: ${JSON.stringify(e)}\n\n`);
|
|
126
|
+
};
|
|
127
|
+
// The state gauge starts TRUE: the daemon's providers.list carries the effective prompt
|
|
128
|
+
// budget (service#345) — passed through verbatim, never recomputed.
|
|
129
|
+
const providers = await client.call("providers.list", {}).catch(() => null);
|
|
130
|
+
const active = Array.isArray(providers?.aliases) ? providers.aliases.find((a) => a.active) ?? null : null;
|
|
131
|
+
emit(translator.runStarted(active === null ? undefined : { budget: { contextSize: active.contextSize }, model: { alias: active.alias, id: active.model } }));
|
|
132
|
+
// A reattached thread starts ORIENTED, not blind: the session log replays as
|
|
133
|
+
// MESSAGES_SNAPSHOT (§agui-replay) and any stopped world re-surfaces immediately —
|
|
134
|
+
// the indefinite-wait ruling's client half (a days-old question is discoverable).
|
|
135
|
+
if (thread.reattached) {
|
|
136
|
+
// The conversation spine lives in the MODEL run (service #214) — log.read defaults
|
|
137
|
+
// to the connection's own run, so resolve the model run via session.runs first.
|
|
138
|
+
const runs = await client.call("session.runs", {}).catch(() => null);
|
|
139
|
+
const modelRun = Array.isArray(runs?.runs) ? runs.runs.find((r) => r.name.startsWith("model-")) : undefined;
|
|
140
|
+
const history = modelRun === undefined ? null : await client.call("log.read", { runId: modelRun.id, limit: 1000 }).catch(() => null);
|
|
141
|
+
if (history !== null && Array.isArray(history.entries))
|
|
142
|
+
emit(translator.replay(history.entries));
|
|
143
|
+
const pending = await client.call("proposal.list", {}).catch(() => null);
|
|
144
|
+
if (pending !== null && Array.isArray(pending.proposals)) {
|
|
145
|
+
for (const pr of pending.proposals)
|
|
146
|
+
emit([{ type: "CUSTOM", name: "plurnk.proposal", value: pr }]);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const done = new Promise((resolve) => {
|
|
150
|
+
const offEntry = client.on("log/entry", (p) => emit(translator.logEntry(p)));
|
|
151
|
+
const offProposal = client.on("loop/proposal", (p) => emit(translator.proposal(p)));
|
|
152
|
+
// The daemon's telemetry notification is `telemetry/event` (SPEC §8.6) — the
|
|
153
|
+
// earlier `loop/telemetry` subscription matched nothing, so plurnk.telemetry
|
|
154
|
+
// never fired for any bridge client.
|
|
155
|
+
// Project the EVENT, not the {loopId, event} envelope — consumers (WS TUI,
|
|
156
|
+
// CLI, the transport seam) read the TelemetryEvent directly.
|
|
157
|
+
const offTelemetry = client.on("telemetry/event", (p) => emit(translator.telemetry(p.event ?? p)));
|
|
158
|
+
const offQuiesced = client.on("loop/quiesced", (p) => emit([{ type: "CUSTOM", name: "plurnk.quiesced", value: p }]));
|
|
159
|
+
// The stream lifecycle rides ONE family channel: `stream/event` (the start
|
|
160
|
+
// line the TUI renders) AND `stream/concluded` both project to plurnk.stream;
|
|
161
|
+
// the payload self-discriminates (event carries `state`, concluded `closeStatus`).
|
|
162
|
+
const offStreamEvent = client.on("stream/event", (p) => emit([{ type: "CUSTOM", name: "plurnk.stream", value: p }]));
|
|
163
|
+
const offStream = client.on("stream/concluded", (p) => emit([{ type: "CUSTOM", name: "plurnk.stream", value: p }]));
|
|
164
|
+
const offTerm = client.on("loop/terminated", (p) => {
|
|
165
|
+
emit(translator.terminated(p));
|
|
166
|
+
offEntry();
|
|
167
|
+
offProposal();
|
|
168
|
+
offTelemetry();
|
|
169
|
+
offQuiesced();
|
|
170
|
+
offStreamEvent();
|
|
171
|
+
offStream();
|
|
172
|
+
offTerm();
|
|
173
|
+
resolve();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
// Per-run knobs ride forwardedProps.plurnk (a family client's model switch,
|
|
177
|
+
// ask/act flags, maxTurns) and override the bridge's env defaults — so the TUI
|
|
178
|
+
// keeps /model + mode. Env is the floor when the client sends nothing.
|
|
179
|
+
const fwdFlags = typeof forwarded?.flags === "object" && forwarded.flags !== null ? forwarded.flags : {};
|
|
180
|
+
const ack = await client.call("loop.run", {
|
|
181
|
+
prompt: lastUser.content,
|
|
182
|
+
maxTurns: typeof forwarded?.maxTurns === "number" ? forwarded.maxTurns : Number(env("PLURNK_AGUI_MAX_TURNS")),
|
|
183
|
+
flags: { yolo: env("PLURNK_AGUI_YOLO") === "1", ...fwdFlags },
|
|
184
|
+
...(typeof forwarded?.alias === "string" ? { alias: forwarded.alias } : {}),
|
|
185
|
+
...(typeof forwarded?.model === "string" ? { model: forwarded.model } : {}),
|
|
186
|
+
});
|
|
187
|
+
// AG-UI cancellation: the frontend hanging up IS the abort signal — a dropped SSE
|
|
188
|
+
// stream cancels the loop rather than orphaning a run nobody is watching.
|
|
189
|
+
let finished = false;
|
|
190
|
+
req.on("close", () => {
|
|
191
|
+
if (!finished)
|
|
192
|
+
void client.call("loop.cancel", { loopId: ack.loopId }).catch(() => { });
|
|
193
|
+
});
|
|
194
|
+
await done;
|
|
195
|
+
finished = true;
|
|
196
|
+
res.end();
|
|
197
|
+
}
|
|
198
|
+
// §agui-management-plane — the charter's ONE escape hatch: AG-UI models the RUN plane;
|
|
199
|
+
// the workspace plane (sessions, entry CRUD, providers, auth) rides a boring JSON-RPC
|
|
200
|
+
// passthrough. {threadId, method, params} → the thread's own daemon connection (so session
|
|
201
|
+
// scoping is exactly the thread's), the daemon's response verbatim. The daemon's method
|
|
202
|
+
// registry is the contract — discover it via {method: "discover"}.
|
|
203
|
+
async #rpc(req, res) {
|
|
204
|
+
const p = JSON.parse(await _a.#body(req));
|
|
205
|
+
if (typeof p.threadId !== "string" || p.threadId.length === 0)
|
|
206
|
+
throw new Error("/plurnk/rpc requires threadId");
|
|
207
|
+
if (typeof p.method !== "string" || p.method.length === 0)
|
|
208
|
+
throw new Error("/plurnk/rpc requires method");
|
|
209
|
+
const thread = await this.#thread(p.threadId);
|
|
210
|
+
const result = await thread.client.call(p.method, p.params ?? {});
|
|
211
|
+
res.writeHead(200, { "content-type": "application/json" }).end(JSON.stringify({ result }));
|
|
212
|
+
}
|
|
213
|
+
async #resolve(req, res) {
|
|
214
|
+
const p = JSON.parse(await _a.#body(req));
|
|
215
|
+
const thread = this.#threads.get(p.threadId);
|
|
216
|
+
if (thread === undefined)
|
|
217
|
+
throw new Error(`unknown threadId '${p.threadId}' — resolve rides the thread that raised the proposal`);
|
|
218
|
+
const result = await thread.client.call("loop.resolve", { logEntryId: p.logEntryId, decision: p.decision, ...(p.body !== undefined ? { body: p.body } : {}) });
|
|
219
|
+
res.writeHead(200, { "content-type": "application/json" }).end(JSON.stringify(result ?? { ok: true }));
|
|
220
|
+
}
|
|
221
|
+
static #body(req) {
|
|
222
|
+
return new Promise((resolve, reject) => {
|
|
223
|
+
let data = "";
|
|
224
|
+
req.on("data", (c) => { data += c.toString(); });
|
|
225
|
+
req.on("end", () => resolve(data));
|
|
226
|
+
req.on("error", reject);
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
_a = Server;
|
|
231
|
+
export default Server;
|
|
232
|
+
//# sourceMappingURL=Server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Server.js","sourceRoot":"","sources":["../src/Server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AguiEvent, LogEntryNotification, ProposalNotification, TerminatedNotification } from "./types.ts";
|
|
2
|
+
export default class Translator {
|
|
3
|
+
#private;
|
|
4
|
+
constructor(args: {
|
|
5
|
+
threadId: string;
|
|
6
|
+
runId: string;
|
|
7
|
+
modelRunId?: number | null;
|
|
8
|
+
sessionId?: number | null;
|
|
9
|
+
});
|
|
10
|
+
runStarted(snapshot?: unknown): AguiEvent[];
|
|
11
|
+
logEntry(n: LogEntryNotification): AguiEvent[];
|
|
12
|
+
proposal(n: ProposalNotification): AguiEvent[];
|
|
13
|
+
terminated(n: TerminatedNotification): AguiEvent[];
|
|
14
|
+
replay(entries: Array<Record<string, unknown>>): AguiEvent[];
|
|
15
|
+
telemetry(event: unknown): AguiEvent[];
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=Translator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Translator.d.ts","sourceRoot":"","sources":["../src/Translator.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEhH,MAAM,CAAC,OAAO,OAAO,UAAU;;IAO3B,YAAY,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAK3G;IAED,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,EAAE,CAK1C;IAED,QAAQ,CAAC,CAAC,EAAE,oBAAoB,GAAG,SAAS,EAAE,CAyD7C;IAED,QAAQ,CAAC,CAAC,EAAE,oBAAoB,GAAG,SAAS,EAAE,CAY7C;IAED,UAAU,CAAC,CAAC,EAAE,sBAAsB,GAAG,SAAS,EAAE,CA4BjD;IAMD,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,EAAE,CAS3D;IAED,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,EAAE,CAErC;CAiCJ"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
// The projection — plurnk's log-shaped wire onto AG-UI's event vocabulary. PURE: one daemon
|
|
2
|
+
// notification in, zero-or-more AG-UI events out, with per-run turn tracking as the only state.
|
|
3
|
+
// The mapping (§agui-projection):
|
|
4
|
+
// log/entry op=PLAN (model) → THINKING_TEXT_MESSAGE triple (the model's stated intent)
|
|
5
|
+
// log/entry op=SEND (model) → TEXT_MESSAGE triple (assistant speech; the signal rides plurnk.send)
|
|
6
|
+
// log/entry other (model) → TOOL_CALL_START/ARGS/END + TOOL_CALL_RESULT (an op row IS a
|
|
7
|
+
// tool call: tx is the args, rx the result, coordinate the id)
|
|
8
|
+
// log/entry (plurnk) → CUSTOM plurnk.ambient (foists, deltas, narrations — the
|
|
9
|
+
// environment speaking; generic UIs skip, rich UIs render)
|
|
10
|
+
// turn_id changes → STEP_FINISHED/STEP_STARTED
|
|
11
|
+
// loop/proposal → CUSTOM plurnk.proposal (file edits, MCP auths, [300] questions —
|
|
12
|
+
// one stop-the-world surface; answered via POST /resolve)
|
|
13
|
+
// loop/terminated → STATE_DELTA (budget truth) + RUN_FINISHED or RUN_ERROR
|
|
14
|
+
// Numbers are passed through verbatim, never recomputed — the daemon's gauge is the gauge
|
|
15
|
+
// (§agui-numbers-passthrough).
|
|
16
|
+
export default class Translator {
|
|
17
|
+
#threadId;
|
|
18
|
+
#runId;
|
|
19
|
+
#currentTurn = null;
|
|
20
|
+
#modelRunId;
|
|
21
|
+
#sessionId;
|
|
22
|
+
constructor(args) {
|
|
23
|
+
this.#threadId = args.threadId;
|
|
24
|
+
this.#runId = args.runId;
|
|
25
|
+
this.#modelRunId = args.modelRunId ?? null;
|
|
26
|
+
this.#sessionId = args.sessionId ?? null;
|
|
27
|
+
}
|
|
28
|
+
runStarted(snapshot) {
|
|
29
|
+
const events = [{ type: "RUN_STARTED", threadId: this.#threadId, runId: this.#runId }];
|
|
30
|
+
// Spec flow: SNAPSHOT then DELTAs — the frontend's state gauge starts true, not blank.
|
|
31
|
+
if (snapshot !== undefined)
|
|
32
|
+
events.push({ type: "STATE_SNAPSHOT", snapshot });
|
|
33
|
+
return events;
|
|
34
|
+
}
|
|
35
|
+
logEntry(n) {
|
|
36
|
+
const e = n.entry;
|
|
37
|
+
const events = [];
|
|
38
|
+
// §agui-topology-scope — the session broadcast carries EVERY run's rows (workers, the
|
|
39
|
+
// plurnk run, siblings); only the THREAD's model run projects onto the core vocabulary.
|
|
40
|
+
// Everything else rides plurnk.row/plurnk.ambient — visible to rich clients as topology,
|
|
41
|
+
// never interleaved into the conversation a generic frontend renders.
|
|
42
|
+
const runId = e.run_id;
|
|
43
|
+
// Lazy binding: session.create returns the CLIENT run's id — the model run is born at
|
|
44
|
+
// loop.run's drain, so a fresh thread adopts its FIRST model-origin row's run as the
|
|
45
|
+
// model run (workers spawn FROM it later; reattach seeds it from session.runs instead).
|
|
46
|
+
if (this.#modelRunId === null && e.origin === "model" && typeof runId === "number")
|
|
47
|
+
this.#modelRunId = runId;
|
|
48
|
+
const foreign = this.#modelRunId !== null && typeof runId === "number" && runId !== this.#modelRunId;
|
|
49
|
+
// §agui-row-channel — the FULL wire row rides plurnk.row alongside the core projection:
|
|
50
|
+
// fold state, tags-in-signal, tokens, coordinates — everything the TUI/nvim render that
|
|
51
|
+
// the core vocabulary can't hold. Rich clients render from plurnk.row; generic clients
|
|
52
|
+
// never see the difference. This is the metadata channel the exclusive-portal migration
|
|
53
|
+
// stands on: core events for the world, plurnk.* for the family.
|
|
54
|
+
events.push({ type: "CUSTOM", name: "plurnk.row", value: e });
|
|
55
|
+
if (foreign) {
|
|
56
|
+
events.push({ type: "CUSTOM", name: "plurnk.ambient", value: e });
|
|
57
|
+
return events;
|
|
58
|
+
}
|
|
59
|
+
if (typeof e.turn_id === "number" && e.turn_id !== this.#currentTurn) {
|
|
60
|
+
if (this.#currentTurn !== null)
|
|
61
|
+
events.push({ type: "STEP_FINISHED", stepName: `turn-${this.#currentTurn}` });
|
|
62
|
+
this.#currentTurn = e.turn_id;
|
|
63
|
+
events.push({ type: "STEP_STARTED", stepName: `turn-${e.turn_id}` });
|
|
64
|
+
}
|
|
65
|
+
if (e.origin !== "model") {
|
|
66
|
+
events.push({ type: "CUSTOM", name: "plurnk.ambient", value: e });
|
|
67
|
+
return events;
|
|
68
|
+
}
|
|
69
|
+
const id = e.coordinate ?? String(e.id);
|
|
70
|
+
if (e.op === "PLAN") {
|
|
71
|
+
const text = Translator.#txBody(e.tx);
|
|
72
|
+
events.push({ type: "THINKING_TEXT_MESSAGE_START" });
|
|
73
|
+
if (text.length > 0)
|
|
74
|
+
events.push({ type: "THINKING_TEXT_MESSAGE_CONTENT", delta: text });
|
|
75
|
+
events.push({ type: "THINKING_TEXT_MESSAGE_END" });
|
|
76
|
+
return events;
|
|
77
|
+
}
|
|
78
|
+
if (e.op === "SEND") {
|
|
79
|
+
const text = Translator.#txBody(e.tx);
|
|
80
|
+
events.push({ type: "TEXT_MESSAGE_START", messageId: id, role: "assistant" });
|
|
81
|
+
if (text.length > 0)
|
|
82
|
+
events.push({ type: "TEXT_MESSAGE_CONTENT", messageId: id, delta: text });
|
|
83
|
+
events.push({ type: "TEXT_MESSAGE_END", messageId: id });
|
|
84
|
+
events.push({ type: "CUSTOM", name: "plurnk.send", value: { signal: e.signal, status: e.status_rx, coordinate: e.coordinate } });
|
|
85
|
+
return events;
|
|
86
|
+
}
|
|
87
|
+
if (e.op === "model")
|
|
88
|
+
return events; // the verbatim mirror row is forensic, not renderable speech
|
|
89
|
+
events.push({ type: "TOOL_CALL_START", toolCallId: id, toolCallName: e.op });
|
|
90
|
+
events.push({ type: "TOOL_CALL_ARGS", toolCallId: id, delta: Translator.#argsFor(e) });
|
|
91
|
+
events.push({ type: "TOOL_CALL_END", toolCallId: id });
|
|
92
|
+
const rxText = Translator.#asText(e.rx);
|
|
93
|
+
if (rxText.length > 0) {
|
|
94
|
+
events.push({ type: "TOOL_CALL_RESULT", toolCallId: id, messageId: `${id}/result`, content: rxText });
|
|
95
|
+
}
|
|
96
|
+
return events;
|
|
97
|
+
}
|
|
98
|
+
proposal(n) {
|
|
99
|
+
// One surface for every stop-the-world: file edits, MCP auths, [300] questions
|
|
100
|
+
// (attrs carries {question, choices} for those). The frontend answers via
|
|
101
|
+
// POST /resolve {logEntryId, decision, body} — a passthrough to loop.resolve.
|
|
102
|
+
return [{
|
|
103
|
+
type: "CUSTOM", name: "plurnk.proposal",
|
|
104
|
+
value: {
|
|
105
|
+
logEntryId: n.logEntryId, op: n.op, target: n.target,
|
|
106
|
+
body: n.body, attrs: n.attrs, flags: n.flags,
|
|
107
|
+
staleClobberRisk: n.staleClobberRisk === true,
|
|
108
|
+
},
|
|
109
|
+
}];
|
|
110
|
+
}
|
|
111
|
+
terminated(n) {
|
|
112
|
+
const events = [];
|
|
113
|
+
if (this.#currentTurn !== null) {
|
|
114
|
+
events.push({ type: "STEP_FINISHED", stepName: `turn-${this.#currentTurn}` });
|
|
115
|
+
this.#currentTurn = null;
|
|
116
|
+
}
|
|
117
|
+
events.push({
|
|
118
|
+
type: "STATE_DELTA",
|
|
119
|
+
delta: [
|
|
120
|
+
{ op: "replace", path: "/budget/contextTokens", value: n.usage.contextTokens },
|
|
121
|
+
{ op: "replace", path: "/budget/contextSize", value: n.usage.contextSize },
|
|
122
|
+
{ op: "replace", path: "/budget/promptTokens", value: n.usage.promptTokens },
|
|
123
|
+
{ op: "replace", path: "/budget/completionTokens", value: n.usage.completionTokens },
|
|
124
|
+
],
|
|
125
|
+
});
|
|
126
|
+
// Family channel — the full terminal truth the core STATE_DELTA can't hold
|
|
127
|
+
// (loopId, turnIds, costPico, usage meta) PLUS the daemon sessionId, so a
|
|
128
|
+
// plurnk client rebuilds its json record from the stream with ONE schema
|
|
129
|
+
// across transports (WS or bridge) — no second round-trip. Numbers verbatim
|
|
130
|
+
// (§agui-numbers-passthrough). Generic frontends ignore it; the RUN_FINISHED/
|
|
131
|
+
// RUN_ERROR below is their terminal signal.
|
|
132
|
+
events.push({ type: "CUSTOM", name: "plurnk.terminated", value: { ...n, sessionId: this.#sessionId } });
|
|
133
|
+
if (n.finalStatus === 200) {
|
|
134
|
+
events.push({ type: "RUN_FINISHED", threadId: this.#threadId, runId: this.#runId });
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
events.push({ type: "RUN_ERROR", message: `loop terminated ${n.finalStatus}${n.hitMaxTurns ? " (maxTurns)" : ""}`, code: String(n.finalStatus) });
|
|
138
|
+
}
|
|
139
|
+
return events;
|
|
140
|
+
}
|
|
141
|
+
// §agui-replay — the session log as AG-UI history: model SENDs become assistant messages
|
|
142
|
+
// (the conversation's spine); everything else stays reachable through live plurnk.row
|
|
143
|
+
// rendering, not duplicated into message history. Wire rows arrive as the log.read
|
|
144
|
+
// projection (tx parsed).
|
|
145
|
+
replay(entries) {
|
|
146
|
+
const messages = [];
|
|
147
|
+
for (const e of entries) {
|
|
148
|
+
if (e.op === "SEND" && e.origin === "model") {
|
|
149
|
+
const text = Translator.#txBody(e.tx);
|
|
150
|
+
if (text.length > 0)
|
|
151
|
+
messages.push({ id: String(e.coordinate ?? e.id), role: "assistant", content: text });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return [{ type: "MESSAGES_SNAPSHOT", messages }];
|
|
155
|
+
}
|
|
156
|
+
telemetry(event) {
|
|
157
|
+
return [{ type: "CUSTOM", name: "plurnk.telemetry", value: event }];
|
|
158
|
+
}
|
|
159
|
+
// The model-facing statement body out of the tx — SEND/PLAN carry their text here. The real
|
|
160
|
+
// wire ships tx PARSED (an object); a string is tolerated and parsed for robustness.
|
|
161
|
+
static #txBody(tx) {
|
|
162
|
+
let parsed = tx;
|
|
163
|
+
if (typeof tx === "string") {
|
|
164
|
+
if (tx.length === 0)
|
|
165
|
+
return "";
|
|
166
|
+
try {
|
|
167
|
+
parsed = JSON.parse(tx);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return tx;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (parsed === null || typeof parsed !== "object")
|
|
174
|
+
return "";
|
|
175
|
+
const body = parsed.body;
|
|
176
|
+
if (typeof body === "string")
|
|
177
|
+
return body;
|
|
178
|
+
if (body !== null && typeof body === "object" && typeof body.raw === "string")
|
|
179
|
+
return body.raw;
|
|
180
|
+
return "";
|
|
181
|
+
}
|
|
182
|
+
// A wire value (object or string) as display text.
|
|
183
|
+
static #asText(v) {
|
|
184
|
+
if (typeof v === "string")
|
|
185
|
+
return v;
|
|
186
|
+
if (v === null || v === undefined)
|
|
187
|
+
return "";
|
|
188
|
+
return JSON.stringify(v);
|
|
189
|
+
}
|
|
190
|
+
// Tool-call args: the op's addressing + body as one JSON string (AG-UI streams args as deltas;
|
|
191
|
+
// a dispatched plurnk op is atomic, so the whole args object arrives as one delta).
|
|
192
|
+
static #argsFor(e) {
|
|
193
|
+
return JSON.stringify({
|
|
194
|
+
target: e.scheme !== null && e.scheme !== undefined ? `${e.scheme}://${e.pathname ?? ""}` : e.pathname ?? null,
|
|
195
|
+
body: Translator.#txBody(e.tx) || undefined,
|
|
196
|
+
signal: e.signal ?? undefined,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=Translator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Translator.js","sourceRoot":"","sources":["../src/Translator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/bin/serve.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import Server from "../Server.js";
|
|
3
|
+
const server = new Server();
|
|
4
|
+
const { host, port } = await server.listen();
|
|
5
|
+
process.stdout.write(`plurnk-agui http://${host}:${port} → ${process.env.PLURNK_AGUI_DAEMON_URL}\n`);
|
|
6
|
+
for (const sig of ["SIGINT", "SIGTERM"]) {
|
|
7
|
+
process.on(sig, () => { void server.close().then(() => process.exit(0)); });
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/bin/serve.ts"],"names":[],"mappings":";AACA,OAAO,MAAM,MAAM,cAAc,CAAC;AAElC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;AAC5B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;AAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,IAAI,IAAI,IAAI,MAAM,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,CAAC;AACrG,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAU,EAAE,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { default as Module } from "./Module.ts";
|
|
2
|
+
export type { ModuleOptions } from "./Module.ts";
|
|
3
|
+
export type { DaemonSeam, ClientEnvelope, PendingProposal, ProposalResolution, PlurnkStatement, LogEntryWire } from "./DaemonSeam.ts";
|
|
4
|
+
export { default as Portal } from "./Portal.ts";
|
|
5
|
+
export { default as EventRouter } from "./EventRouter.ts";
|
|
6
|
+
export { default as ProposalHitl } from "./ProposalHitl.ts";
|
|
7
|
+
export * from "./AguiPlus.ts";
|
|
8
|
+
export { default as Translator } from "./Translator.ts";
|
|
9
|
+
export type * from "./types.ts";
|
|
10
|
+
export { default as Server } from "./Server.ts";
|
|
11
|
+
export { default as DaemonClient } from "./DaemonClient.ts";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACtI,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,mBAAmB,YAAY,CAAC;AAGhC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// The daughter's export surface. Module is what the daemon's boot plug-point
|
|
2
|
+
// activates (registerModule(Module.init(opts))); DaemonSeam is the contract it
|
|
3
|
+
// consumes. The projection pieces (AguiPlus, Translator, EventRouter, ProposalHitl,
|
|
4
|
+
// Portal) export for the daemon's tests and future transports. Server/DaemonClient
|
|
5
|
+
// are the LEGACY separate-process bridge — they retire at cutover (#2 WS-7).
|
|
6
|
+
export { default as Module } from "./Module.js";
|
|
7
|
+
export { default as Portal } from "./Portal.js";
|
|
8
|
+
export { default as EventRouter } from "./EventRouter.js";
|
|
9
|
+
export { default as ProposalHitl } from "./ProposalHitl.js";
|
|
10
|
+
export * from "./AguiPlus.js";
|
|
11
|
+
export { default as Translator } from "./Translator.js";
|
|
12
|
+
// Legacy separate-process bridge (retires at cutover):
|
|
13
|
+
export { default as Server } from "./Server.js";
|
|
14
|
+
export { default as DaemonClient } from "./DaemonClient.js";
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,+EAA+E;AAC/E,oFAAoF;AACpF,mFAAmF;AACnF,6EAA6E;AAE7E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGxD,uDAAuD;AACvD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|