aibroker 0.53.5 → 0.55.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.
Files changed (74) hide show
  1. package/README.md +3 -0
  2. package/dist/.metadata_never_index +0 -0
  3. package/dist/a2a/agentish-extension.d.ts +111 -0
  4. package/dist/a2a/agentish-extension.d.ts.map +1 -0
  5. package/dist/a2a/agentish-extension.js +124 -0
  6. package/dist/a2a/agentish-extension.js.map +1 -0
  7. package/dist/a2a/client.d.ts +45 -0
  8. package/dist/a2a/client.d.ts.map +1 -0
  9. package/dist/a2a/client.js +112 -0
  10. package/dist/a2a/client.js.map +1 -0
  11. package/dist/a2a/exposure.d.ts +24 -0
  12. package/dist/a2a/exposure.d.ts.map +1 -0
  13. package/dist/a2a/exposure.js +70 -0
  14. package/dist/a2a/exposure.js.map +1 -0
  15. package/dist/a2a/schema/types.d.ts +153 -0
  16. package/dist/a2a/schema/types.d.ts.map +1 -0
  17. package/dist/a2a/schema/types.js +28 -0
  18. package/dist/a2a/schema/types.js.map +1 -0
  19. package/dist/a2a/schema/validate.d.ts +27 -0
  20. package/dist/a2a/schema/validate.d.ts.map +1 -0
  21. package/dist/a2a/schema/validate.js +190 -0
  22. package/dist/a2a/schema/validate.js.map +1 -0
  23. package/dist/a2a/server.d.ts +73 -0
  24. package/dist/a2a/server.d.ts.map +1 -0
  25. package/dist/a2a/server.js +325 -0
  26. package/dist/a2a/server.js.map +1 -0
  27. package/dist/a2a/tasks.d.ts +81 -0
  28. package/dist/a2a/tasks.d.ts.map +1 -0
  29. package/dist/a2a/tasks.js +148 -0
  30. package/dist/a2a/tasks.js.map +1 -0
  31. package/dist/agentish/index.d.ts +80 -0
  32. package/dist/agentish/index.d.ts.map +1 -0
  33. package/dist/agentish/index.js +263 -0
  34. package/dist/agentish/index.js.map +1 -0
  35. package/dist/daemon/a2a-cli.d.ts +46 -0
  36. package/dist/daemon/a2a-cli.d.ts.map +1 -0
  37. package/dist/daemon/a2a-cli.js +385 -0
  38. package/dist/daemon/a2a-cli.js.map +1 -0
  39. package/dist/daemon/agentish-cli.d.ts +17 -0
  40. package/dist/daemon/agentish-cli.d.ts.map +1 -0
  41. package/dist/daemon/agentish-cli.js +137 -0
  42. package/dist/daemon/agentish-cli.js.map +1 -0
  43. package/dist/daemon/agentish-stats.d.ts +65 -0
  44. package/dist/daemon/agentish-stats.d.ts.map +1 -0
  45. package/dist/daemon/agentish-stats.js +125 -0
  46. package/dist/daemon/agentish-stats.js.map +1 -0
  47. package/dist/daemon/agentish.d.ts +13 -0
  48. package/dist/daemon/agentish.d.ts.map +1 -0
  49. package/dist/daemon/agentish.js +13 -0
  50. package/dist/daemon/agentish.js.map +1 -0
  51. package/dist/daemon/budget-cli.d.ts.map +1 -1
  52. package/dist/daemon/budget-cli.js +22 -3
  53. package/dist/daemon/budget-cli.js.map +1 -1
  54. package/dist/daemon/cli.js +12 -1
  55. package/dist/daemon/cli.js.map +1 -1
  56. package/dist/daemon/core-handlers.d.ts.map +1 -1
  57. package/dist/daemon/core-handlers.js +38 -0
  58. package/dist/daemon/core-handlers.js.map +1 -1
  59. package/dist/daemon/manage.d.ts.map +1 -1
  60. package/dist/daemon/manage.js +10 -1
  61. package/dist/daemon/manage.js.map +1 -1
  62. package/dist/daemon/todoist-webhook.d.ts +25 -2
  63. package/dist/daemon/todoist-webhook.d.ts.map +1 -1
  64. package/dist/daemon/todoist-webhook.js +136 -17
  65. package/dist/daemon/todoist-webhook.js.map +1 -1
  66. package/dist/mcp/index.js +41 -1
  67. package/dist/mcp/index.js.map +1 -1
  68. package/dist/transport/screen.d.ts +7 -0
  69. package/dist/transport/screen.d.ts.map +1 -1
  70. package/dist/transport/screen.js +17 -3
  71. package/dist/transport/screen.js.map +1 -1
  72. package/docker/ota/src/landing.ts +22 -24
  73. package/docker/ota/src/server.ts +5 -1
  74. package/package.json +1 -1
@@ -0,0 +1,385 @@
1
+ /**
2
+ * daemon/a2a-cli.ts — `aibroker a2a`, from a shell rather than an MCP tool.
3
+ *
4
+ * Two families of verb. `card`, `send`, `get`, `cancel`, `check` are pure
5
+ * A2A CLIENT operations — they speak to ANY A2A v0.3.0 agent over the
6
+ * network and need no daemon running locally; `check` in particular is
7
+ * generic interoperability tooling, not a self-test, and is meant to be
8
+ * pointed at agents this project did not write.
9
+ *
10
+ * `expose`, `unexpose`, `exposed`, `tasks`, `setup` operate on THIS
11
+ * machine's A2A server: which sessions it publishes as skills, what
12
+ * tasks are on file, and how the endpoint is exposed to the internet.
13
+ * `reply` goes through the daemon (`WatcherClient`), the same reason
14
+ * `aibroker issue` does — the calling session's identity and the audit
15
+ * record both live there, and a CLI that mutated the task file directly
16
+ * would bypass both.
17
+ */
18
+ import { randomBytes } from "node:crypto";
19
+ import { existsSync, appendFileSync, mkdirSync } from "node:fs";
20
+ import { homedir } from "node:os";
21
+ import { join, dirname } from "node:path";
22
+ import { execSync } from "node:child_process";
23
+ import { loadEnvFile } from "../core/env.js";
24
+ import { WatcherClient } from "../ipc/client.js";
25
+ import { DAEMON_SOCKET_PATH } from "./index.js";
26
+ import { fetchAgentCard, sendMessage, getTask, cancelTask, pollUntilDone } from "../a2a/client.js";
27
+ import { expose, unexpose, listExposed } from "../a2a/exposure.js";
28
+ import { listAll, listForSession } from "../a2a/tasks.js";
29
+ import { funnelHostname } from "./funnel-watchdog.js";
30
+ function usage() {
31
+ console.log("Usage: aibroker a2a <verb> [options]");
32
+ console.log("");
33
+ console.log("Client — task any A2A v0.3.0 agent:");
34
+ console.log(" card <url> Fetch and print an AgentCard");
35
+ console.log(" send <url> --skill s [--ag2] [--context id] --token T --body -");
36
+ console.log(" get <url> <taskId> [--token T]");
37
+ console.log(" cancel <url> <taskId> [--token T]");
38
+ console.log(" check <url> [--skill s] [--token T]");
39
+ console.log(" Interop smoke test: card, hello send, poll to done");
40
+ console.log("");
41
+ console.log("This server — which sessions this machine offers, and its own tasks:");
42
+ console.log(" expose <session> [--as \"description\"] Publish a session as an A2A skill");
43
+ console.log(" unexpose <session> Stop publishing it");
44
+ console.log(" exposed List what is published now");
45
+ console.log(" tasks [--session name] Local tasks and their state");
46
+ console.log(" reply <taskId> --body - Reply to a task addressed to your session");
47
+ console.log(" setup [--print-only] Generate a token, expose the endpoint, verify it");
48
+ console.log("");
49
+ console.log("`--body -` reads from stdin. See docs/a2a.md.");
50
+ }
51
+ async function readStdin() {
52
+ const chunks = [];
53
+ for await (const c of process.stdin)
54
+ chunks.push(Buffer.from(c));
55
+ return Buffer.concat(chunks).toString("utf8");
56
+ }
57
+ function flag(args, name) {
58
+ const i = args.indexOf(`--${name}`);
59
+ return i >= 0 ? args[i + 1] : undefined;
60
+ }
61
+ function hasFlag(args, name) {
62
+ return args.includes(`--${name}`);
63
+ }
64
+ /** AIBROKER_A2A_URL wins whole; otherwise https://<public host>/a2a. Exported for tests. */
65
+ export function resolveOwnA2AUrl() {
66
+ if (process.env.AIBROKER_A2A_URL)
67
+ return process.env.AIBROKER_A2A_URL.replace(/\/+$/, "");
68
+ const host = process.env.AIBROKER_PUBLIC_HOST ?? funnelHostname().hostname;
69
+ if (!host)
70
+ throw new Error("no public host: set AIBROKER_A2A_URL or AIBROKER_PUBLIC_HOST, or bring the Tailscale funnel up");
71
+ return `https://${host}/a2a`;
72
+ }
73
+ function printCard(card) {
74
+ console.log(JSON.stringify(card, null, 2));
75
+ }
76
+ async function runCard(args) {
77
+ let url = args[1];
78
+ if (!url) {
79
+ try {
80
+ url = resolveOwnA2AUrl().replace(/\/a2a$/, "");
81
+ }
82
+ catch (e) {
83
+ console.error(e instanceof Error ? e.message : String(e));
84
+ process.exitCode = 2;
85
+ return;
86
+ }
87
+ }
88
+ const r = await fetchAgentCard(url);
89
+ if (!r.ok) {
90
+ console.error(`INVALID: ${r.errors.join("; ")}`);
91
+ process.exitCode = 1;
92
+ return;
93
+ }
94
+ printCard(r.card);
95
+ }
96
+ async function runSend(args) {
97
+ const url = args[1];
98
+ if (!url) {
99
+ console.error("Usage: aibroker a2a send <url> --skill s [--ag2] --body -");
100
+ process.exitCode = 2;
101
+ return;
102
+ }
103
+ let body = flag(args, "body");
104
+ if (body === "-")
105
+ body = await readStdin();
106
+ if (!body?.trim()) {
107
+ console.error("--body is required (use --body - for stdin)");
108
+ process.exitCode = 2;
109
+ return;
110
+ }
111
+ const r = await sendMessage(url, {
112
+ skillId: flag(args, "skill"),
113
+ text: body,
114
+ ag2: hasFlag(args, "ag2"),
115
+ contextId: flag(args, "context"),
116
+ token: flag(args, "token") ?? process.env.AIBROKER_A2A_TOKEN,
117
+ });
118
+ if (!r.ok) {
119
+ console.error(r.error);
120
+ process.exitCode = 1;
121
+ return;
122
+ }
123
+ printCard(r.task);
124
+ }
125
+ async function runGetOrCancel(args, cancel) {
126
+ const [, url, taskId] = args;
127
+ if (!url || !taskId) {
128
+ console.error(`Usage: aibroker a2a ${cancel ? "cancel" : "get"} <url> <taskId>`);
129
+ process.exitCode = 2;
130
+ return;
131
+ }
132
+ const token = flag(args, "token") ?? process.env.AIBROKER_A2A_TOKEN;
133
+ const r = cancel ? await cancelTask(url, taskId, token) : await getTask(url, taskId, token);
134
+ if (!r.ok) {
135
+ console.error(r.error);
136
+ process.exitCode = 1;
137
+ return;
138
+ }
139
+ printCard(r.task);
140
+ }
141
+ async function runCheck(args) {
142
+ const url = args[1];
143
+ if (!url) {
144
+ console.error("Usage: aibroker a2a check <url>");
145
+ process.exitCode = 2;
146
+ return;
147
+ }
148
+ const token = flag(args, "token") ?? process.env.AIBROKER_A2A_TOKEN;
149
+ const rows = [];
150
+ const card = await fetchAgentCard(url);
151
+ rows.push({ step: "fetch + validate AgentCard", pass: card.ok, detail: card.ok ? card.card.name : card.errors.join("; ") });
152
+ if (card.ok) {
153
+ const skillId = flag(args, "skill") ?? card.card.skills[0]?.id;
154
+ const a2aUrl = card.card.url;
155
+ const sent = await sendMessage(a2aUrl, { skillId, text: "hello from `aibroker a2a check`", token });
156
+ rows.push({ step: "message/send", pass: sent.ok, detail: sent.ok ? `task ${sent.task.id} (${sent.task.status.state})` : sent.error });
157
+ if (sent.ok) {
158
+ const done = await pollUntilDone(a2aUrl, sent.task.id, { timeoutMs: 20_000, token });
159
+ rows.push({
160
+ step: "tasks/get → terminal state",
161
+ pass: done.ok && done.task !== undefined,
162
+ detail: done.task ? done.task.status.state : done.error ?? "unknown",
163
+ });
164
+ }
165
+ }
166
+ for (const r of rows)
167
+ console.log(`${r.pass ? "PASS" : "FAIL"} ${r.step.padEnd(28)} ${r.detail}`);
168
+ process.exitCode = rows.every((r) => r.pass) ? 0 : 1;
169
+ }
170
+ function runExpose(args) {
171
+ const name = args[1];
172
+ if (!name) {
173
+ console.error('Usage: aibroker a2a expose <session> [--as "description"]');
174
+ process.exitCode = 2;
175
+ return;
176
+ }
177
+ const e = expose(name, flag(args, "as"));
178
+ console.log(`${e.name} is now exposed as an A2A skill.${e.description ? ` "${e.description}"` : ""}`);
179
+ }
180
+ function runUnexpose(args) {
181
+ const name = args[1];
182
+ if (!name) {
183
+ console.error("Usage: aibroker a2a unexpose <session>");
184
+ process.exitCode = 2;
185
+ return;
186
+ }
187
+ console.log(unexpose(name) ? `${name} is no longer exposed.` : `${name} was not exposed.`);
188
+ }
189
+ function runExposed() {
190
+ const list = listExposed();
191
+ if (list.length === 0) {
192
+ console.log("Nothing exposed. The AgentCard currently lists no skills.");
193
+ console.log('Expose a session with: aibroker a2a expose <session> [--as "description"]');
194
+ return;
195
+ }
196
+ for (const e of list)
197
+ console.log(` ${e.name}${e.description ? ` — ${e.description}` : ""}`);
198
+ }
199
+ function runTasks(args) {
200
+ const session = flag(args, "session");
201
+ const tasks = session ? listForSession(session) : listAll();
202
+ if (tasks.length === 0) {
203
+ console.log(session ? `No tasks for ${session}.` : "No tasks.");
204
+ return;
205
+ }
206
+ for (const t of tasks) {
207
+ const age = Math.round((Date.now() - Date.parse(t.updatedAt)) / 60000);
208
+ console.log(` ${t.id} ${t.state.padEnd(14)} ${t.session} updated ${age}m ago`);
209
+ }
210
+ }
211
+ async function runReply(args) {
212
+ const taskId = args[1];
213
+ if (!taskId) {
214
+ console.error("Usage: aibroker a2a reply <taskId> --body -");
215
+ process.exitCode = 2;
216
+ return;
217
+ }
218
+ let body = flag(args, "body");
219
+ if (body === "-")
220
+ body = await readStdin();
221
+ if (!body?.trim()) {
222
+ console.error("--body is required (use --body - for stdin)");
223
+ process.exitCode = 2;
224
+ return;
225
+ }
226
+ try {
227
+ const res = (await new WatcherClient(DAEMON_SOCKET_PATH).call_raw("a2a_reply", { taskId, text: body }));
228
+ console.log(`Task ${taskId} → ${res.state ?? "updated"}${res.agentishOk === false ? " (AG2 in the reply did not validate)" : ""}`);
229
+ }
230
+ catch (err) {
231
+ const why = err instanceof Error ? err.message : String(err);
232
+ console.error(why.includes("ENOENT") || why.includes("connect")
233
+ ? `Could not reach the daemon at ${DAEMON_SOCKET_PATH}. Is it running? (aibroker start)`
234
+ : why);
235
+ process.exitCode = 1;
236
+ }
237
+ }
238
+ function appendEnvVar(file, key, value) {
239
+ mkdirSync(dirname(file), { recursive: true });
240
+ appendFileSync(file, `${existsSync(file) ? "\n" : ""}${key}=${value}\n`, "utf-8");
241
+ }
242
+ function hasTailscale() {
243
+ try {
244
+ execSync("which tailscale", { stdio: "ignore" });
245
+ return true;
246
+ }
247
+ catch {
248
+ return false;
249
+ }
250
+ }
251
+ /**
252
+ * `AIBROKER_A2A_TOKEN` if already set; otherwise a fresh 32-byte token,
253
+ * written to `envFile` unless `printOnly`. Never overwrites an existing
254
+ * token — mirrors inbound.ts's secret handling: generated once, shown once.
255
+ * Pulled out of `runSetup` so the generate-once / keep-existing behaviour
256
+ * is testable without touching a real `tailscale` binary or the network.
257
+ */
258
+ export function ensureA2AToken(envFile, printOnly) {
259
+ const existing = process.env.AIBROKER_A2A_TOKEN;
260
+ if (existing)
261
+ return { token: existing, generated: false };
262
+ const token = randomBytes(32).toString("base64url");
263
+ if (!printOnly) {
264
+ appendEnvVar(envFile, "AIBROKER_A2A_TOKEN", token);
265
+ process.env.AIBROKER_A2A_TOKEN = token;
266
+ }
267
+ return { token, generated: true };
268
+ }
269
+ /**
270
+ * Fetch `<publicBase>/.well-known/agent-card.json` and report what came
271
+ * back. Pulled out of `runSetup` so `setup`'s pass/fail reporting is
272
+ * testable against an arbitrary URL, without going through DNS, Tailscale,
273
+ * or this machine's own configured public host.
274
+ */
275
+ export async function verifyPublicCard(publicBase, timeoutMs = 10_000) {
276
+ try {
277
+ const res = await fetch(`${publicBase}/.well-known/agent-card.json`, { signal: AbortSignal.timeout(timeoutMs) });
278
+ if (!res.ok)
279
+ return { ok: false, detail: `HTTP ${res.status}` };
280
+ const card = await res.json();
281
+ return { ok: true, detail: `${card.name ?? "?"} at ${card.url ?? "?"}`, skillCount: card.skills?.length ?? 0 };
282
+ }
283
+ catch (e) {
284
+ return { ok: false, detail: e instanceof Error ? e.message : String(e) };
285
+ }
286
+ }
287
+ async function runSetup(args) {
288
+ loadEnvFile();
289
+ const printOnly = hasFlag(args, "print-only");
290
+ const port = Number(process.env.AIBROKER_A2A_PORT ?? process.env.TODOIST_WEBHOOK_PORT ?? 8766);
291
+ const envFile = join(homedir(), ".aibroker", "env");
292
+ const { token, generated } = ensureA2AToken(envFile, printOnly);
293
+ if (generated) {
294
+ console.log(printOnly
295
+ ? "Would generate AIBROKER_A2A_TOKEN and save it to ~/.aibroker/env (not written: --print-only)."
296
+ : `Generated AIBROKER_A2A_TOKEN and saved it to ~/.aibroker/env. This is the only time it is shown:\n ${token}`);
297
+ }
298
+ else {
299
+ console.log("AIBROKER_A2A_TOKEN is already set — leaving it alone.");
300
+ }
301
+ const cmds = [
302
+ `tailscale funnel --bg --set-path=/a2a http://127.0.0.1:${port}/a2a`,
303
+ `tailscale funnel --bg --set-path=/.well-known http://127.0.0.1:${port}/.well-known`,
304
+ ];
305
+ if (hasTailscale()) {
306
+ if (printOnly) {
307
+ console.log("\nWould run:");
308
+ for (const c of cmds)
309
+ console.log(` ${c}`);
310
+ }
311
+ else {
312
+ for (const c of cmds) {
313
+ console.log(`\n+ ${c}`);
314
+ try {
315
+ execSync(c, { stdio: "inherit" });
316
+ }
317
+ catch (e) {
318
+ console.warn(`tailscale funnel may already be configured: ${e instanceof Error ? e.message : String(e)}`);
319
+ }
320
+ }
321
+ }
322
+ }
323
+ else {
324
+ console.log("\nTailscale not found. Put these two paths behind your own reverse proxy instead — e.g. nginx:");
325
+ console.log(` location /a2a { proxy_pass http://127.0.0.1:${port}/a2a; }`);
326
+ console.log(` location /.well-known { proxy_pass http://127.0.0.1:${port}/.well-known; }`);
327
+ console.log("or Caddy:");
328
+ console.log(` agent.example.org {`);
329
+ console.log(` reverse_proxy /a2a* 127.0.0.1:${port}`);
330
+ console.log(` reverse_proxy /.well-known* 127.0.0.1:${port}`);
331
+ console.log(` }`);
332
+ }
333
+ console.log("\nThe daemon reads AIBROKER_A2A_TOKEN at startup — restart it to pick this up:");
334
+ console.log(" aibroker stop && aibroker start");
335
+ if (printOnly)
336
+ return;
337
+ let publicBase;
338
+ try {
339
+ publicBase = resolveOwnA2AUrl().replace(/\/a2a$/, "");
340
+ }
341
+ catch (e) {
342
+ console.error(`\nCannot verify yet: ${e instanceof Error ? e.message : String(e)}`);
343
+ process.exitCode = 1;
344
+ return;
345
+ }
346
+ console.log(`\nVerifying ${publicBase}/.well-known/agent-card.json ...`);
347
+ const v = await verifyPublicCard(publicBase);
348
+ if (v.ok) {
349
+ console.log(`OK — ${v.detail}, ${v.skillCount ?? 0} skill(s) exposed.`);
350
+ if (!v.skillCount)
351
+ console.log(`Nothing exposed yet: aibroker a2a expose <session>`);
352
+ }
353
+ else {
354
+ console.error(`FAILED: ${v.detail}`);
355
+ console.error("The daemon may need restarting for the new token to take effect, or the funnel path is not live yet.");
356
+ process.exitCode = 1;
357
+ }
358
+ }
359
+ export async function runA2A(args) {
360
+ const [verb] = args;
361
+ switch (verb) {
362
+ case undefined:
363
+ case "help":
364
+ case "--help":
365
+ case "-h":
366
+ usage();
367
+ return;
368
+ case "card": return runCard(args);
369
+ case "send": return runSend(args);
370
+ case "get": return runGetOrCancel(args, false);
371
+ case "cancel": return runGetOrCancel(args, true);
372
+ case "check": return runCheck(args);
373
+ case "expose": return runExpose(args);
374
+ case "unexpose": return runUnexpose(args);
375
+ case "exposed": return runExposed();
376
+ case "tasks": return runTasks(args);
377
+ case "reply": return runReply(args);
378
+ case "setup": return runSetup(args);
379
+ default:
380
+ console.error(`Unknown a2a verb: ${verb}`);
381
+ usage();
382
+ process.exitCode = 2;
383
+ }
384
+ }
385
+ //# sourceMappingURL=a2a-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-cli.js","sourceRoot":"","sources":["../../src/daemon/a2a-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * daemon/agentish-cli.ts — `aibroker agentish`, so a message can be checked
3
+ * from a shell rather than trusted by eye.
4
+ *
5
+ * `aibroker agentish spec` prints the format itself, so a session that has
6
+ * never seen AG2 can learn it with one command instead of being handed a
7
+ * paragraph in the arming text and hoping it read it.
8
+ *
9
+ * `check --json` and `spec --json` exist so a team with no AIBroker daemon
10
+ * can still run this validator as a CI step: parse the JSON, branch on exit
11
+ * code and on each error's `code`, done. See docs/agentish.md, "Use in CI".
12
+ * Exit codes are part of that contract and do not move: 0 the message is
13
+ * valid, 1 it parsed but failed validation, 2 the invocation itself was
14
+ * wrong (bad usage, a file that could not be read).
15
+ */
16
+ export declare function runAgentish(args: string[]): Promise<void>;
17
+ //# sourceMappingURL=agentish-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentish-cli.d.ts","sourceRoot":"","sources":["../../src/daemon/agentish-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAsCH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2F/D"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * daemon/agentish-cli.ts — `aibroker agentish`, so a message can be checked
3
+ * from a shell rather than trusted by eye.
4
+ *
5
+ * `aibroker agentish spec` prints the format itself, so a session that has
6
+ * never seen AG2 can learn it with one command instead of being handed a
7
+ * paragraph in the arming text and hoping it read it.
8
+ *
9
+ * `check --json` and `spec --json` exist so a team with no AIBroker daemon
10
+ * can still run this validator as a CI step: parse the JSON, branch on exit
11
+ * code and on each error's `code`, done. See docs/agentish.md, "Use in CI".
12
+ * Exit codes are part of that contract and do not move: 0 the message is
13
+ * valid, 1 it parsed but failed validation, 2 the invocation itself was
14
+ * wrong (bad usage, a file that could not be read).
15
+ */
16
+ import { readFileSync } from "node:fs";
17
+ import { AG2_SPEC, AG2_EXTENSIONS, AGENTISH_URI, check, measure } from "../agentish/index.js";
18
+ import { agentishStats, formatStatsReport } from "./agentish-stats.js";
19
+ const JSON_VERSION = "2";
20
+ function usage() {
21
+ console.log("Usage: aibroker agentish <verb> [options]");
22
+ console.log("");
23
+ console.log(" spec [--json] Print the AG2 format and the extensions this validator adds");
24
+ console.log(" check <file|-> [earlier...] [--json]");
25
+ console.log(" Validate a message; earlier messages supply @n symbols");
26
+ console.log(" measure <file> <prose-file> Token count, agentish vs. a prose twin");
27
+ console.log(" stats [--since YYYY-MM-DD] [--json]");
28
+ console.log(" AG2 vs. prose on real inter-session traffic, from the audit log");
29
+ console.log("");
30
+ console.log("`-` reads the message to check from stdin.");
31
+ console.log("Exit codes (check): 0 valid, 1 invalid, 2 bad usage or a file could not be read.");
32
+ }
33
+ async function readStdin() {
34
+ const chunks = [];
35
+ for await (const c of process.stdin)
36
+ chunks.push(Buffer.from(c));
37
+ return Buffer.concat(chunks).toString("utf8");
38
+ }
39
+ async function readArg(path) {
40
+ return path === "-" ? readStdin() : readFileSync(path, "utf8");
41
+ }
42
+ /** Strip a boolean flag out of an argv-like array, wherever it appears. */
43
+ function takeFlag(args, flag) {
44
+ const present = args.includes(flag);
45
+ return { rest: args.filter((a) => a !== flag), present };
46
+ }
47
+ export async function runAgentish(args) {
48
+ const [verb, ...rawRest] = args;
49
+ if (!verb || verb === "help" || verb === "--help" || verb === "-h") {
50
+ usage();
51
+ return;
52
+ }
53
+ if (verb === "spec") {
54
+ const { present: json } = takeFlag(rawRest, "--json");
55
+ if (json) {
56
+ console.log(JSON.stringify({ version: JSON_VERSION, spec: AG2_SPEC, extensions: AG2_EXTENSIONS, uri: AGENTISH_URI }));
57
+ }
58
+ else {
59
+ console.log(AG2_SPEC);
60
+ console.log(AG2_EXTENSIONS);
61
+ }
62
+ return;
63
+ }
64
+ if (verb === "check") {
65
+ const { rest, present: json } = takeFlag(rawRest, "--json");
66
+ const [file, ...earlierFiles] = rest;
67
+ if (!file) {
68
+ usage();
69
+ process.exitCode = 2;
70
+ return;
71
+ }
72
+ let msg;
73
+ let earlier;
74
+ try {
75
+ msg = await readArg(file);
76
+ earlier = earlierFiles.map((f) => readFileSync(f, "utf8"));
77
+ }
78
+ catch (e) {
79
+ console.log(`ERR could not read a message file: ${e instanceof Error ? e.message : String(e)}`);
80
+ process.exitCode = 2;
81
+ return;
82
+ }
83
+ const { kind, fields, symbols, errors, details } = check(msg, earlier);
84
+ const ok = errors.length === 0;
85
+ if (json) {
86
+ console.log(JSON.stringify({ version: JSON_VERSION, kind, fields, errors: details, ok }));
87
+ }
88
+ else {
89
+ for (const e of errors)
90
+ console.log(`ERR ${e}`);
91
+ console.log(`${kind ?? "?"} ${Object.keys(fields).length} fields ${Object.keys(symbols).length} symbols ${ok ? "ok" : "INVALID"}`);
92
+ }
93
+ process.exitCode = ok ? 0 : 1;
94
+ return;
95
+ }
96
+ if (verb === "stats") {
97
+ const sinceIdx = rawRest.indexOf("--since");
98
+ const sinceStr = sinceIdx >= 0 ? rawRest[sinceIdx + 1] : undefined;
99
+ const since = sinceStr ? new Date(`${sinceStr}T00:00:00.000Z`) : undefined;
100
+ if (sinceStr && (since === undefined || Number.isNaN(since.getTime()))) {
101
+ console.log(`ERR --since must be YYYY-MM-DD, got ${JSON.stringify(sinceStr)}`);
102
+ process.exitCode = 2;
103
+ return;
104
+ }
105
+ const report = agentishStats({ since });
106
+ if (rawRest.includes("--json")) {
107
+ console.log(JSON.stringify(report, null, 2));
108
+ }
109
+ else {
110
+ console.log(formatStatsReport(report));
111
+ }
112
+ return;
113
+ }
114
+ if (verb === "measure") {
115
+ const [file, proseFile] = rawRest;
116
+ if (!file || !proseFile) {
117
+ usage();
118
+ process.exitCode = 2;
119
+ return;
120
+ }
121
+ let a, p;
122
+ try {
123
+ [a, p] = [readFileSync(file, "utf8"), readFileSync(proseFile, "utf8")];
124
+ }
125
+ catch (e) {
126
+ console.log(`ERR could not read a message file: ${e instanceof Error ? e.message : String(e)}`);
127
+ process.exitCode = 2;
128
+ return;
129
+ }
130
+ const { agentish, prose, ratio, valid } = measure(a, p);
131
+ console.log(`agentish=${agentish} prose=${prose} ratio=${ratio.toFixed(2)} valid=${valid ? "yes" : "no"}`);
132
+ return;
133
+ }
134
+ usage();
135
+ process.exitCode = 2;
136
+ }
137
+ //# sourceMappingURL=agentish-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentish-cli.js","sourceRoot":"","sources":["../../src/daemon/agentish-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * daemon/agentish-stats.ts — is AG2 actually cheaper, measured on the real
3
+ * traffic between sessions rather than a hand-picked pair.
4
+ *
5
+ * `agentish measure` compares one message against a prose twin somebody
6
+ * wrote to make the point. That is a demonstration, not a measurement: it
7
+ * proves AG2 CAN be smaller, not that it IS, night after night, across every
8
+ * session that is supposed to be speaking it. This reads the audit log
9
+ * instead — every `send` between two sessions is already recorded there,
10
+ * body and all — and classifies each one as AG2 or prose by running it
11
+ * through the real validator, not a guess from its shape.
12
+ */
13
+ /**
14
+ * AG2 did not exist before this date, so a send from before it is prose
15
+ * however it happens to parse — a validator that classified by shape alone
16
+ * would call a coincidentally `k=v`-shaped sentence "AG2" and quietly
17
+ * inflate the count of a format nobody was using yet.
18
+ */
19
+ export declare const AG2_BASELINE_DATE = "2026-09-05";
20
+ export type MessageClass = "ag2" | "prose";
21
+ /**
22
+ * Tokens, from raw characters — not tiktoken (no such dependency here), and
23
+ * not the word-plus-punctuation counter `agentish.ts`'s `measure()` uses for
24
+ * a pairwise comparison either. That counter treats `|`, `@`, `=` — AG2's
25
+ * own punctuation — as one token each, the same as it treats an English
26
+ * word; real tokenizers pack runs of ordinary text tighter than runs of
27
+ * symbols. So this heuristic UNDERSTATES the AG2 side specifically, more
28
+ * than it understates prose, which means the ratio this module prints is a
29
+ * floor on the real saving, not a ceiling — read it as "at least this much",
30
+ * never as "exactly this much".
31
+ */
32
+ export declare function approxTokens(text: string): number;
33
+ export interface AgentishStatsOptions {
34
+ since?: Date;
35
+ until?: Date;
36
+ }
37
+ export interface ClassSummary {
38
+ count: number;
39
+ totalTokens: number;
40
+ meanTokens: number;
41
+ medianTokens: number;
42
+ }
43
+ export interface DayRow {
44
+ day: string;
45
+ ag2: number;
46
+ prose: number;
47
+ }
48
+ export interface AgentishStatsReport {
49
+ ag2: ClassSummary;
50
+ prose: ClassSummary;
51
+ /** prose mean / ag2 mean, or null when either class has no messages. */
52
+ ratio: number | null;
53
+ perDay: DayRow[];
54
+ baseline: string;
55
+ heuristic: string;
56
+ }
57
+ /**
58
+ * Every session-to-session `send` in the audit log, classified and summed.
59
+ * Reads real messages, not samples — the whole point is that this is the
60
+ * traffic that actually happened, not a fixture built to make a point.
61
+ */
62
+ export declare function agentishStats(opts?: AgentishStatsOptions): AgentishStatsReport;
63
+ /** The report, as a human reads it — never a bare ratio. */
64
+ export declare function formatStatsReport(r: AgentishStatsReport): string;
65
+ //# sourceMappingURL=agentish-stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentish-stats.d.ts","sourceRoot":"","sources":["../../src/daemon/agentish-stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAuBH;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAE9C,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,CAAC;AAQ3C;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjD;AAQD,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,YAAY,CAAC;IAClB,KAAK,EAAE,YAAY,CAAC;IACpB,wEAAwE;IACxE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAYD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE,oBAAyB,GAAG,mBAAmB,CAuClF;AAED,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAkBhE"}