aibroker 0.8.3 → 0.9.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 (37) hide show
  1. package/README.md +20 -1
  2. package/dist/adapters/pailot/message-queue.d.ts.map +1 -1
  3. package/dist/adapters/pailot/message-queue.js +9 -1
  4. package/dist/adapters/pailot/message-queue.js.map +1 -1
  5. package/dist/apns/client.d.ts.map +1 -1
  6. package/dist/apns/client.js +26 -19
  7. package/dist/apns/client.js.map +1 -1
  8. package/dist/core/json-store.d.ts +82 -0
  9. package/dist/core/json-store.d.ts.map +1 -0
  10. package/dist/core/json-store.js +149 -0
  11. package/dist/core/json-store.js.map +1 -0
  12. package/dist/core/persistence.d.ts +2 -0
  13. package/dist/core/persistence.d.ts.map +1 -1
  14. package/dist/core/persistence.js +28 -9
  15. package/dist/core/persistence.js.map +1 -1
  16. package/dist/daemon/ask-cli.d.ts +2 -0
  17. package/dist/daemon/ask-cli.d.ts.map +1 -0
  18. package/dist/daemon/ask-cli.js +112 -0
  19. package/dist/daemon/ask-cli.js.map +1 -0
  20. package/dist/daemon/ask.d.ts +76 -0
  21. package/dist/daemon/ask.d.ts.map +1 -0
  22. package/dist/daemon/ask.js +227 -0
  23. package/dist/daemon/ask.js.map +1 -0
  24. package/dist/daemon/cli.js +7 -1
  25. package/dist/daemon/cli.js.map +1 -1
  26. package/dist/daemon/core-handlers.d.ts.map +1 -1
  27. package/dist/daemon/core-handlers.js +21 -0
  28. package/dist/daemon/core-handlers.js.map +1 -1
  29. package/dist/daemon/dispatch.d.ts +8 -17
  30. package/dist/daemon/dispatch.d.ts.map +1 -1
  31. package/dist/daemon/dispatch.js +4 -49
  32. package/dist/daemon/dispatch.js.map +1 -1
  33. package/dist/daemon/terminal-screen.d.ts +50 -0
  34. package/dist/daemon/terminal-screen.d.ts.map +1 -0
  35. package/dist/daemon/terminal-screen.js +70 -0
  36. package/dist/daemon/terminal-screen.js.map +1 -0
  37. package/package.json +1 -1
@@ -0,0 +1,112 @@
1
+ /**
2
+ * daemon/ask-cli.ts — `aibroker ask <project> --stdin --timeout <secs> --json`.
3
+ *
4
+ * Thin client over the daemon's `ask` handler, for callers with no session and
5
+ * no mailbox — a launchd poller asking whether the session it gave work to is
6
+ * still alive.
7
+ *
8
+ * All probe outcomes exit 0, same convention as `dispatch`: "it did not answer"
9
+ * is a result to act on, not a crash. Only a genuine failure — daemon down,
10
+ * unreadable stdin, bad usage — exits non-zero.
11
+ */
12
+ import { WatcherClient } from "../ipc/client.js";
13
+ import { DAEMON_SOCKET_PATH } from "./index.js";
14
+ async function readStdin() {
15
+ if (process.stdin.isTTY)
16
+ return "";
17
+ const chunks = [];
18
+ for await (const chunk of process.stdin)
19
+ chunks.push(Buffer.from(chunk));
20
+ return Buffer.concat(chunks).toString("utf-8");
21
+ }
22
+ function usage() {
23
+ console.log(`aibroker ask — put a question to a project's session and wait for its answer
24
+
25
+ aibroker ask <project> --stdin [--timeout SECONDS] [--json]
26
+
27
+ <project> curated project name or alias (case-insensitive)
28
+ --stdin read the question from stdin
29
+ --question TEXT inline question, for short probes
30
+ --timeout SECONDS total budget (default 60)
31
+ --json emit a single JSON object on stdout
32
+
33
+ Never spawns a session: a probe must not create the thing it is probing for.
34
+
35
+ Outcomes (all exit 0):
36
+ replied the session answered; "reply" holds its words
37
+ busy mid-turn and still producing output. ALIVE — nothing was sent
38
+ silent idle, took the question, never answered. Genuinely suspicious
39
+ absent no live session for that project
40
+
41
+ Note: "busy" is positive evidence of life and must not count toward a stuck
42
+ threshold. Claude queues input while working, so a session mid-turn cannot
43
+ answer for as long as that turn lasts; asking anyway would report every
44
+ slow-but-healthy task as stuck. Liveness is therefore checked BEFORE any
45
+ question is sent, which also means a working session pays no token cost.`);
46
+ }
47
+ export async function runAsk(args) {
48
+ const has = (f) => args.includes(f);
49
+ const val = (f) => { const i = args.indexOf(f); return i >= 0 ? args[i + 1] : undefined; };
50
+ if (has("--help") || has("-h") || args.length === 0) {
51
+ usage();
52
+ return;
53
+ }
54
+ const flagValues = new Set(["--question", "--timeout"].map((f) => val(f)).filter((v) => v !== undefined));
55
+ const project = args.find((a) => !a.startsWith("--") && !flagValues.has(a));
56
+ if (!project) {
57
+ console.error("Usage: aibroker ask <project> --stdin [--timeout SECONDS] [--json]");
58
+ process.exitCode = 2;
59
+ return;
60
+ }
61
+ const json = has("--json");
62
+ const question = has("--stdin") ? await readStdin() : (val("--question") ?? "");
63
+ if (!question.trim()) {
64
+ console.error("No question. Pass --stdin (preferred) or --question TEXT.");
65
+ process.exitCode = 2;
66
+ return;
67
+ }
68
+ const rawTimeout = val("--timeout");
69
+ const timeoutMs = rawTimeout !== undefined ? Number(rawTimeout) * 1000 : undefined;
70
+ if (timeoutMs !== undefined && (!Number.isFinite(timeoutMs) || timeoutMs < 0)) {
71
+ console.error(`--timeout expects a non-negative number of seconds, got "${rawTimeout}"`);
72
+ process.exitCode = 2;
73
+ return;
74
+ }
75
+ let result;
76
+ try {
77
+ const res = await new WatcherClient(DAEMON_SOCKET_PATH).call_raw("ask", {
78
+ project,
79
+ question,
80
+ timeoutMs,
81
+ });
82
+ result = res;
83
+ }
84
+ catch (err) {
85
+ const reason = `Could not reach the aibroker daemon at ${DAEMON_SOCKET_PATH}: ` +
86
+ `${err instanceof Error ? err.message : String(err)}. Is it running? (aibroker start)`;
87
+ if (json)
88
+ console.log(JSON.stringify({ replied: false, session: "", state: "error", reason }));
89
+ else
90
+ console.error(reason);
91
+ process.exitCode = 1;
92
+ return;
93
+ }
94
+ if (json) {
95
+ // Shape matches the agreed contract; `state` is additive for callers that
96
+ // want to distinguish busy (alive) from silent (suspicious) without
97
+ // matching on prose.
98
+ console.log(JSON.stringify({
99
+ replied: result.replied,
100
+ session: result.session,
101
+ ...(result.reply !== undefined ? { reply: result.reply } : {}),
102
+ ...(result.reason !== undefined ? { reason: result.reason } : {}),
103
+ state: result.state,
104
+ }));
105
+ return;
106
+ }
107
+ if (result.replied)
108
+ console.log(`${result.session}: ${result.reply}`);
109
+ else
110
+ console.log(`${result.state}${result.session ? ` (${result.session})` : ""}: ${result.reason}`);
111
+ }
112
+ //# sourceMappingURL=ask-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-cli.js","sourceRoot":"","sources":["../../src/daemon/ask-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * daemon/ask.ts — put a question to a project's session and wait for its answer.
3
+ *
4
+ * Sibling to `dispatch`, for a caller with no session and no mailbox: a plain
5
+ * CLI poller run by launchd that needs to know whether the session it handed
6
+ * work to is still alive.
7
+ *
8
+ * NEVER spawns. A probe that creates the thing it is probing for turns a dead
9
+ * session into a fresh one and reports health.
10
+ *
11
+ * ── Why there is a fourth outcome ───────────────────────────────────────────
12
+ *
13
+ * The requested contract had three: replied / not running / no reply in time.
14
+ * Implementing it revealed those cannot be told apart from the case that
15
+ * matters most. Claude Code QUEUES typed input while it is mid-turn and only
16
+ * reads it when the current turn ends, which can be many minutes. So a healthy
17
+ * session busy doing exactly the work it was given produces the same silence as
18
+ * a wedged one, and a short timeout reports it as "no reply".
19
+ *
20
+ * That is not an edge case for this caller — the scheduler probes at expected
21
+ * duration x 1.5, i.e. precisely when the session is most likely still working.
22
+ * Every probe of a slow-but-fine task would read as stuck.
23
+ *
24
+ * So `ask` checks liveness BEFORE injecting anything: a session whose screen is
25
+ * changing is working, which is the answer the caller wanted, and it is
26
+ * returned without sending a question at all. That also removes the probe's
27
+ * token cost in the common case, which is the pressure PAI asked the contract
28
+ * to apply.
29
+ *
30
+ * replied — it answered; `reply` holds its words
31
+ * busy — mid-turn and progressing. ALIVE. Nothing was sent.
32
+ * silent — idle, took the question, never answered. Genuinely suspicious.
33
+ * absent — no live session for that project
34
+ *
35
+ * `busy` must NOT count toward a stuck threshold; it is positive evidence of
36
+ * life. `silent` is the one that should.
37
+ */
38
+ import { type PaiProject } from "./pai-projects.js";
39
+ import { type LiveSession } from "./dispatch.js";
40
+ import { type TerminalIO } from "./terminal-screen.js";
41
+ export type AskState = "replied" | "busy" | "silent" | "absent";
42
+ export interface AskResult {
43
+ /** True only when the session actually answered. */
44
+ replied: boolean;
45
+ /** Resolved session label, or "" when none is running. */
46
+ session: string;
47
+ /** The session's answer. Present only when replied. */
48
+ reply?: string;
49
+ /** Why not, when it did not answer. */
50
+ reason?: string;
51
+ /** Machine-readable outcome; additive to the boolean above. */
52
+ state: AskState;
53
+ }
54
+ export interface AskOptions {
55
+ /** Total budget for the whole probe. */
56
+ timeoutMs?: number;
57
+ }
58
+ export interface AskDeps {
59
+ resolve: (name: string) => Promise<PaiProject | undefined>;
60
+ sessions: () => LiveSession[];
61
+ io: TerminalIO;
62
+ }
63
+ /** Two samples this far apart decide working-vs-idle. */
64
+ export declare const LIVENESS_SAMPLE_MS = 1500;
65
+ export declare const realAskDeps: AskDeps;
66
+ /**
67
+ * Extract the session's answer: everything added below the echoed question and
68
+ * above the input box.
69
+ *
70
+ * Anchored on the LAST line still matching the question, because Claude echoes
71
+ * the question into the transcript and a long one wraps over several lines —
72
+ * without that, the session's own echo reads back as its reply.
73
+ */
74
+ export declare function extractReply(frame: string, question: string): string;
75
+ export declare function ask(projectName: string, question: string, opts?: AskOptions, deps?: AskDeps): Promise<AskResult>;
76
+ //# sourceMappingURL=ask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/daemon/ask.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EAAyB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAGxE,OAAO,EAML,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhE,MAAM,WAAW,SAAS;IACxB,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IAC3D,QAAQ,EAAE,MAAM,WAAW,EAAE,CAAC;IAC9B,EAAE,EAAE,UAAU,CAAC;CAChB;AAGD,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,OAAQ,CAAC;AAexC,eAAO,MAAM,WAAW,EAAE,OAIzB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAwCpE;AAYD,wBAAsB,GAAG,CACvB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,UAAe,EACrB,IAAI,GAAE,OAAqB,GAC1B,OAAO,CAAC,SAAS,CAAC,CAsGpB"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * daemon/ask.ts — put a question to a project's session and wait for its answer.
3
+ *
4
+ * Sibling to `dispatch`, for a caller with no session and no mailbox: a plain
5
+ * CLI poller run by launchd that needs to know whether the session it handed
6
+ * work to is still alive.
7
+ *
8
+ * NEVER spawns. A probe that creates the thing it is probing for turns a dead
9
+ * session into a fresh one and reports health.
10
+ *
11
+ * ── Why there is a fourth outcome ───────────────────────────────────────────
12
+ *
13
+ * The requested contract had three: replied / not running / no reply in time.
14
+ * Implementing it revealed those cannot be told apart from the case that
15
+ * matters most. Claude Code QUEUES typed input while it is mid-turn and only
16
+ * reads it when the current turn ends, which can be many minutes. So a healthy
17
+ * session busy doing exactly the work it was given produces the same silence as
18
+ * a wedged one, and a short timeout reports it as "no reply".
19
+ *
20
+ * That is not an edge case for this caller — the scheduler probes at expected
21
+ * duration x 1.5, i.e. precisely when the session is most likely still working.
22
+ * Every probe of a slow-but-fine task would read as stuck.
23
+ *
24
+ * So `ask` checks liveness BEFORE injecting anything: a session whose screen is
25
+ * changing is working, which is the answer the caller wanted, and it is
26
+ * returned without sending a question at all. That also removes the probe's
27
+ * token cost in the common case, which is the pressure PAI asked the contract
28
+ * to apply.
29
+ *
30
+ * replied — it answered; `reply` holds its words
31
+ * busy — mid-turn and progressing. ALIVE. Nothing was sent.
32
+ * silent — idle, took the question, never answered. Genuinely suspicious.
33
+ * absent — no live session for that project
34
+ *
35
+ * `busy` must NOT count toward a stuck threshold; it is positive evidence of
36
+ * life. `silent` is the one that should.
37
+ */
38
+ import { findCuratedPaiProject } from "./pai-projects.js";
39
+ import { findSessionForProject } from "./dispatch.js";
40
+ import { snapshotAllSessions } from "../transport/sync-facade.js";
41
+ import { getAllPersistentSessionNames, lookupPersistentName } from "../core/persistence.js";
42
+ import { flatten, inputBoxStart, hasBeenSubmitted, isClaudeReady, realIO, } from "./terminal-screen.js";
43
+ import { log } from "../core/log.js";
44
+ const DEFAULT_TIMEOUT_MS = 60_000;
45
+ /** Two samples this far apart decide working-vs-idle. */
46
+ export const LIVENESS_SAMPLE_MS = 1_500;
47
+ /** Quiet samples that mean the answer is finished. */
48
+ const SETTLE_TICKS = 4;
49
+ const POLL_MS = 500;
50
+ /** Enumerate live sessions with persistent names resolved. */
51
+ function liveSessions() {
52
+ const persistent = getAllPersistentSessionNames();
53
+ return snapshotAllSessions().map((s) => ({
54
+ id: s.id,
55
+ name: s.name,
56
+ paiName: lookupPersistentName(persistent, s.id, s.aibrokerId),
57
+ }));
58
+ }
59
+ export const realAskDeps = {
60
+ resolve: findCuratedPaiProject,
61
+ sessions: liveSessions,
62
+ io: realIO,
63
+ };
64
+ /**
65
+ * Extract the session's answer: everything added below the echoed question and
66
+ * above the input box.
67
+ *
68
+ * Anchored on the LAST line still matching the question, because Claude echoes
69
+ * the question into the transcript and a long one wraps over several lines —
70
+ * without that, the session's own echo reads back as its reply.
71
+ */
72
+ export function extractReply(frame, question) {
73
+ const lines = frame.split("\n");
74
+ const needle = flatten(question).slice(0, 24);
75
+ let lastEcho = -1;
76
+ for (let i = lines.length - 1; i >= 0; i--) {
77
+ if (needle && flatten(lines[i]).includes(needle)) {
78
+ lastEcho = i;
79
+ break;
80
+ }
81
+ }
82
+ // The echo wraps; skip its continuation lines too.
83
+ if (lastEcho >= 0) {
84
+ const qWords = flatten(question).split(" ").filter((w) => w.length > 3);
85
+ let j = lastEcho + 1;
86
+ while (j < lines.length) {
87
+ const f = flatten(lines[j]);
88
+ if (!f) {
89
+ j++;
90
+ continue;
91
+ }
92
+ const overlap = qWords.filter((w) => f.includes(w)).length;
93
+ if (overlap > 0 && overlap >= Math.min(3, qWords.length)) {
94
+ j++;
95
+ continue;
96
+ }
97
+ break;
98
+ }
99
+ lastEcho = j - 1;
100
+ }
101
+ const boxAt = inputBoxStart(frame);
102
+ const end = boxAt >= 0 ? boxAt : lines.length;
103
+ const body = lines.slice(lastEcho + 1, end);
104
+ return body
105
+ // Filter BEFORE stripping markers: the marker IS the signal. Claude prefixes
106
+ // real output with ⏺ and its elapsed-time status with ✻ ("✻ Cogitated for
107
+ // 49s", "✻ Vibing… (3m 27s · ↓ 11.6k tokens)"). Strip the glyph first and
108
+ // the status line becomes ordinary prose that reads as part of the answer.
109
+ .filter((l) => !/^\s*[✻✳]/.test(l))
110
+ // `⎿` marks a tool-result continuation ("⎿ 1 skill available") — Claude's
111
+ // rendering, never the prose we asked for. Observed leaking into a live probe.
112
+ .filter((l) => !/^\s*⎿/.test(l))
113
+ .map((l) => l.replace(/^\s*[⏺*]\s?/, "").trimEnd())
114
+ .filter((l) => !/^\s*$/.test(l))
115
+ .join("\n")
116
+ .trim();
117
+ }
118
+ /** True when two samples of the screen differ — the session is producing output. */
119
+ async function isWorking(id, io) {
120
+ const a = io.capture(id);
121
+ if (a === null)
122
+ return false;
123
+ await io.sleep(LIVENESS_SAMPLE_MS);
124
+ const b = io.capture(id);
125
+ if (b === null)
126
+ return false;
127
+ return a !== b;
128
+ }
129
+ export async function ask(projectName, question, opts = {}, deps = realAskDeps) {
130
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
131
+ const startedAt = deps.io.now();
132
+ const left = () => Math.max(0, timeoutMs - (deps.io.now() - startedAt));
133
+ const project = await deps.resolve(projectName);
134
+ if (!project) {
135
+ return {
136
+ replied: false,
137
+ session: "",
138
+ state: "absent",
139
+ reason: `No curated alias for "${projectName}", so no session could be identified. ` +
140
+ `Register one with \`pai project name <identifier> ${projectName}\`.`,
141
+ };
142
+ }
143
+ const label = project.displayName || project.name;
144
+ const existing = findSessionForProject(project, deps.sessions());
145
+ if (!existing) {
146
+ // Deliberately not launched: a probe must never create what it is probing.
147
+ return { replied: false, session: "", state: "absent", reason: "session not running" };
148
+ }
149
+ // ── liveness first, so a working session is never interrupted ──
150
+ if (await isWorking(existing.id, deps.io)) {
151
+ return {
152
+ replied: false,
153
+ session: existing.label,
154
+ state: "busy",
155
+ reason: "session is mid-turn and still producing output, so it cannot read a question yet — " +
156
+ "nothing was sent. This is evidence of life, not of being stuck.",
157
+ };
158
+ }
159
+ const frame = deps.io.capture(existing.id);
160
+ if (frame === null) {
161
+ return { replied: false, session: existing.label, state: "silent", reason: "session terminal could not be read" };
162
+ }
163
+ if (!isClaudeReady(frame)) {
164
+ return {
165
+ replied: false,
166
+ session: existing.label,
167
+ state: "silent",
168
+ reason: "session is not showing a Claude prompt (it may have exited to a shell)",
169
+ };
170
+ }
171
+ // ── idle: ask, confirm the question landed, then wait for the answer ──
172
+ deps.io.send(existing.id, question);
173
+ const needle = flatten(question).slice(0, 48);
174
+ let submitted = false;
175
+ const submitDeadline = deps.io.now() + Math.min(10_000, timeoutMs);
176
+ while (deps.io.now() < submitDeadline) {
177
+ await deps.io.sleep(POLL_MS);
178
+ const f = deps.io.capture(existing.id);
179
+ if (f !== null && hasBeenSubmitted(f, needle)) {
180
+ submitted = true;
181
+ break;
182
+ }
183
+ }
184
+ if (!submitted) {
185
+ return {
186
+ replied: false,
187
+ session: existing.label,
188
+ state: "silent",
189
+ reason: "the question was typed but the session never accepted it",
190
+ };
191
+ }
192
+ // Answer complete when the screen stops changing.
193
+ let last = deps.io.capture(existing.id) ?? "";
194
+ let quiet = 0;
195
+ while (left() > 0) {
196
+ await deps.io.sleep(POLL_MS);
197
+ const cur = deps.io.capture(existing.id);
198
+ if (cur === null)
199
+ continue;
200
+ if (cur === last) {
201
+ if (++quiet >= SETTLE_TICKS) {
202
+ const reply = extractReply(cur, question);
203
+ if (!reply) {
204
+ return {
205
+ replied: false,
206
+ session: existing.label,
207
+ state: "silent",
208
+ reason: "session took the question but produced no answer",
209
+ };
210
+ }
211
+ log(`ask: ${label} answered in ${Math.round((deps.io.now() - startedAt) / 1000)}s`);
212
+ return { replied: true, session: existing.label, state: "replied", reply };
213
+ }
214
+ }
215
+ else {
216
+ quiet = 0;
217
+ last = cur;
218
+ }
219
+ }
220
+ return {
221
+ replied: false,
222
+ session: existing.label,
223
+ state: "silent",
224
+ reason: `no reply within ${Math.round(timeoutMs / 1000)}s`,
225
+ };
226
+ }
227
+ //# sourceMappingURL=ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/daemon/ask.ts"],"names":[],"mappings":"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"}
@@ -130,6 +130,11 @@ switch (command) {
130
130
  await runDispatch(rest);
131
131
  break;
132
132
  }
133
+ case "ask": {
134
+ const { runAsk } = await import("./ask-cli.js");
135
+ await runAsk(rest);
136
+ break;
137
+ }
133
138
  case "create-adapter": {
134
139
  // Parse arguments: name, --display-name <Name>, --output <dir>
135
140
  const adapterName = rest.find((a) => !a.startsWith("--"));
@@ -162,13 +167,14 @@ switch (command) {
162
167
  console.log(" ota <sub> OTA hub: up|down|status|logs|setup-serve");
163
168
  console.log(" sessions <sub> Session backup: snapshot|restore|checkpoint|list|install");
164
169
  console.log(" dispatch <project> Deliver a work order to a project's session (--stdin --json)");
170
+ console.log(" ask <project> Ask a session a question and wait for its reply (--stdin --json)");
165
171
  console.log(" help Show this help");
166
172
  console.log("\nFlags:");
167
173
  console.log(" --version, -v Show version");
168
174
  break;
169
175
  default:
170
176
  console.error(`Unknown command: ${command}`);
171
- console.error("Usage: aibroker [start|status|stop|ping|create-adapter|ota|sessions|dispatch|help]");
177
+ console.error("Usage: aibroker [start|status|stop|ping|create-adapter|ota|sessions|dispatch|ask|help]");
172
178
  process.exit(1);
173
179
  }
174
180
  //# sourceMappingURL=cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/daemon/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/daemon/cli.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"core-handlers.d.ts","sourceRoot":"","sources":["../../src/daemon/core-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAqC9D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,UAAU,EACvB,OAAO,EAAE,oBAAoB,GAC5B,IAAI,CAuqCN"}
1
+ {"version":3,"file":"core-handlers.d.ts","sourceRoot":"","sources":["../../src/daemon/core-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAqC9D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,UAAU,EACvB,OAAO,EAAE,oBAAoB,GAC5B,IAAI,CA+rCN"}
@@ -302,6 +302,27 @@ export function registerCoreHandlers(server, registry, _apiBackend, manager) {
302
302
  return { ok: false, error: err instanceof Error ? err.message : String(err) };
303
303
  }
304
304
  });
305
+ /**
306
+ * ask — put a question to a project's session and wait for its answer.
307
+ *
308
+ * Never spawns: a probe that creates the session it is probing reports health
309
+ * for a session that had died.
310
+ */
311
+ server.on("ask", async (req) => {
312
+ const { project, question, timeoutMs } = req.params;
313
+ if (!project)
314
+ return { ok: false, error: "project is required" };
315
+ if (!question)
316
+ return { ok: false, error: "question is required" };
317
+ const { ask } = await import("./ask.js");
318
+ try {
319
+ const result = await ask(project, question, { timeoutMs });
320
+ return { ok: true, result: { ...result } };
321
+ }
322
+ catch (err) {
323
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
324
+ }
325
+ });
305
326
  server.on("pai_launch", async (req) => {
306
327
  const { name } = req.params;
307
328
  if (!name)