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.
- package/README.md +20 -1
- package/dist/adapters/pailot/message-queue.d.ts.map +1 -1
- package/dist/adapters/pailot/message-queue.js +9 -1
- package/dist/adapters/pailot/message-queue.js.map +1 -1
- package/dist/apns/client.d.ts.map +1 -1
- package/dist/apns/client.js +26 -19
- package/dist/apns/client.js.map +1 -1
- package/dist/core/json-store.d.ts +82 -0
- package/dist/core/json-store.d.ts.map +1 -0
- package/dist/core/json-store.js +149 -0
- package/dist/core/json-store.js.map +1 -0
- package/dist/core/persistence.d.ts +2 -0
- package/dist/core/persistence.d.ts.map +1 -1
- package/dist/core/persistence.js +28 -9
- package/dist/core/persistence.js.map +1 -1
- package/dist/daemon/ask-cli.d.ts +2 -0
- package/dist/daemon/ask-cli.d.ts.map +1 -0
- package/dist/daemon/ask-cli.js +112 -0
- package/dist/daemon/ask-cli.js.map +1 -0
- package/dist/daemon/ask.d.ts +76 -0
- package/dist/daemon/ask.d.ts.map +1 -0
- package/dist/daemon/ask.js +227 -0
- package/dist/daemon/ask.js.map +1 -0
- package/dist/daemon/cli.js +7 -1
- package/dist/daemon/cli.js.map +1 -1
- package/dist/daemon/core-handlers.d.ts.map +1 -1
- package/dist/daemon/core-handlers.js +21 -0
- package/dist/daemon/core-handlers.js.map +1 -1
- package/dist/daemon/dispatch.d.ts +8 -17
- package/dist/daemon/dispatch.d.ts.map +1 -1
- package/dist/daemon/dispatch.js +4 -49
- package/dist/daemon/dispatch.js.map +1 -1
- package/dist/daemon/terminal-screen.d.ts +50 -0
- package/dist/daemon/terminal-screen.d.ts.map +1 -0
- package/dist/daemon/terminal-screen.js +70 -0
- package/dist/daemon/terminal-screen.js.map +1 -0
- 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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"}
|
package/dist/daemon/cli.js
CHANGED
|
@@ -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
|
package/dist/daemon/cli.js.map
CHANGED
|
@@ -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,
|
|
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)
|