@calliopelabs/cli 3.2.1 → 3.3.1

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 (163) hide show
  1. package/README.md +1 -0
  2. package/dist/acp.d.ts +11 -3
  3. package/dist/acp.d.ts.map +1 -1
  4. package/dist/acp.js +114 -27
  5. package/dist/acp.js.map +1 -1
  6. package/dist/attach.d.ts +149 -0
  7. package/dist/attach.d.ts.map +1 -0
  8. package/dist/attach.js +450 -0
  9. package/dist/attach.js.map +1 -0
  10. package/dist/bin.d.ts +1 -0
  11. package/dist/bin.d.ts.map +1 -1
  12. package/dist/bin.js +30 -6
  13. package/dist/bin.js.map +1 -1
  14. package/dist/brain/actions.d.ts +1 -1
  15. package/dist/brain/actions.d.ts.map +1 -1
  16. package/dist/brain/actions.js.map +1 -1
  17. package/dist/brain/cli.d.ts +1 -1
  18. package/dist/brain/cli.d.ts.map +1 -1
  19. package/dist/brain/cli.js +47 -5
  20. package/dist/brain/cli.js.map +1 -1
  21. package/dist/brain/exchange-json.d.ts +4 -0
  22. package/dist/brain/exchange-json.d.ts.map +1 -0
  23. package/dist/brain/exchange-json.js +77 -0
  24. package/dist/brain/exchange-json.js.map +1 -0
  25. package/dist/brain/exchange.d.ts +26 -0
  26. package/dist/brain/exchange.d.ts.map +1 -0
  27. package/dist/brain/exchange.js +86 -0
  28. package/dist/brain/exchange.js.map +1 -0
  29. package/dist/brain/index.d.ts +3 -0
  30. package/dist/brain/index.d.ts.map +1 -1
  31. package/dist/brain/index.js +3 -0
  32. package/dist/brain/index.js.map +1 -1
  33. package/dist/brain/journal.js +3 -3
  34. package/dist/brain/journal.js.map +1 -1
  35. package/dist/brain/kg-claims.d.ts +13 -0
  36. package/dist/brain/kg-claims.d.ts.map +1 -0
  37. package/dist/brain/kg-claims.js +156 -0
  38. package/dist/brain/kg-claims.js.map +1 -0
  39. package/dist/brain/kg-export.d.ts +13 -0
  40. package/dist/brain/kg-export.d.ts.map +1 -0
  41. package/dist/brain/kg-export.js +116 -0
  42. package/dist/brain/kg-export.js.map +1 -0
  43. package/dist/brain/kg-transfer.d.ts +29 -0
  44. package/dist/brain/kg-transfer.d.ts.map +1 -0
  45. package/dist/brain/kg-transfer.js +156 -0
  46. package/dist/brain/kg-transfer.js.map +1 -0
  47. package/dist/brain/kg.d.ts.map +1 -1
  48. package/dist/brain/kg.js +89 -16
  49. package/dist/brain/kg.js.map +1 -1
  50. package/dist/brain/presentation.d.ts.map +1 -1
  51. package/dist/brain/presentation.js +10 -0
  52. package/dist/brain/presentation.js.map +1 -1
  53. package/dist/brain/store.d.ts +1 -1
  54. package/dist/brain/store.d.ts.map +1 -1
  55. package/dist/brain/store.js +8 -2
  56. package/dist/brain/store.js.map +1 -1
  57. package/dist/brain/transfer-report.d.ts +38 -0
  58. package/dist/brain/transfer-report.d.ts.map +1 -0
  59. package/dist/brain/transfer-report.js +10 -0
  60. package/dist/brain/transfer-report.js.map +1 -0
  61. package/dist/brain/transfer.d.ts +29 -21
  62. package/dist/brain/transfer.d.ts.map +1 -1
  63. package/dist/brain/transfer.js +120 -89
  64. package/dist/brain/transfer.js.map +1 -1
  65. package/dist/brain/validation.d.ts +1 -0
  66. package/dist/brain/validation.d.ts.map +1 -1
  67. package/dist/brain/validation.js +7 -6
  68. package/dist/brain/validation.js.map +1 -1
  69. package/dist/config.d.ts +4 -0
  70. package/dist/config.d.ts.map +1 -1
  71. package/dist/config.js.map +1 -1
  72. package/dist/execution/authority.d.ts.map +1 -1
  73. package/dist/execution/authority.js +4 -2
  74. package/dist/execution/authority.js.map +1 -1
  75. package/dist/execution/files.d.ts.map +1 -1
  76. package/dist/execution/files.js +9 -6
  77. package/dist/execution/files.js.map +1 -1
  78. package/dist/execution/ledger.d.ts.map +1 -1
  79. package/dist/execution/ledger.js +3 -1
  80. package/dist/execution/ledger.js.map +1 -1
  81. package/dist/execution/project-spend.d.ts.map +1 -1
  82. package/dist/execution/project-spend.js +9 -6
  83. package/dist/execution/project-spend.js.map +1 -1
  84. package/dist/execution/writer-recovery.d.ts.map +1 -1
  85. package/dist/execution/writer-recovery.js +14 -10
  86. package/dist/execution/writer-recovery.js.map +1 -1
  87. package/dist/goals/store.d.ts.map +1 -1
  88. package/dist/goals/store.js +3 -1
  89. package/dist/goals/store.js.map +1 -1
  90. package/dist/index.d.ts +2 -0
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +1 -0
  93. package/dist/index.js.map +1 -1
  94. package/dist/judgment/cli.d.ts +20 -0
  95. package/dist/judgment/cli.d.ts.map +1 -0
  96. package/dist/judgment/cli.js +141 -0
  97. package/dist/judgment/cli.js.map +1 -0
  98. package/dist/judgment/evaluate.d.ts +47 -0
  99. package/dist/judgment/evaluate.d.ts.map +1 -0
  100. package/dist/judgment/evaluate.js +369 -0
  101. package/dist/judgment/evaluate.js.map +1 -0
  102. package/dist/judgment/index.d.ts +8 -0
  103. package/dist/judgment/index.d.ts.map +1 -0
  104. package/dist/judgment/index.js +5 -0
  105. package/dist/judgment/index.js.map +1 -0
  106. package/dist/judgment/policy.d.ts +61 -0
  107. package/dist/judgment/policy.d.ts.map +1 -0
  108. package/dist/judgment/policy.js +143 -0
  109. package/dist/judgment/policy.js.map +1 -0
  110. package/dist/judgment/types.d.ts +73 -0
  111. package/dist/judgment/types.d.ts.map +1 -0
  112. package/dist/judgment/types.js +9 -0
  113. package/dist/judgment/types.js.map +1 -0
  114. package/dist/model-detection.d.ts.map +1 -1
  115. package/dist/model-detection.js +40 -7
  116. package/dist/model-detection.js.map +1 -1
  117. package/dist/models/metadata.d.ts +2 -0
  118. package/dist/models/metadata.d.ts.map +1 -1
  119. package/dist/models/metadata.js +2 -2
  120. package/dist/models/metadata.js.map +1 -1
  121. package/dist/orchestration/execution-store.d.ts.map +1 -1
  122. package/dist/orchestration/execution-store.js +14 -3
  123. package/dist/orchestration/execution-store.js.map +1 -1
  124. package/dist/orchestration/store.d.ts.map +1 -1
  125. package/dist/orchestration/store.js +3 -1
  126. package/dist/orchestration/store.js.map +1 -1
  127. package/dist/policy.d.ts +8 -1
  128. package/dist/policy.d.ts.map +1 -1
  129. package/dist/policy.js +74 -5
  130. package/dist/policy.js.map +1 -1
  131. package/dist/providers/anthropic.d.ts.map +1 -1
  132. package/dist/providers/anthropic.js +10 -5
  133. package/dist/providers/anthropic.js.map +1 -1
  134. package/dist/providers/openai.d.ts.map +1 -1
  135. package/dist/providers/openai.js +3 -2
  136. package/dist/providers/openai.js.map +1 -1
  137. package/dist/routing/select.d.ts +7 -0
  138. package/dist/routing/select.d.ts.map +1 -1
  139. package/dist/routing/select.js +18 -1
  140. package/dist/routing/select.js.map +1 -1
  141. package/dist/session-management/files.d.ts.map +1 -1
  142. package/dist/session-management/files.js +9 -6
  143. package/dist/session-management/files.js.map +1 -1
  144. package/dist/sessions/history.d.ts.map +1 -1
  145. package/dist/sessions/history.js +12 -6
  146. package/dist/sessions/history.js.map +1 -1
  147. package/dist/spawning/store.d.ts.map +1 -1
  148. package/dist/spawning/store.js +10 -8
  149. package/dist/spawning/store.js.map +1 -1
  150. package/dist/tools.d.ts.map +1 -1
  151. package/dist/tools.js +5 -2
  152. package/dist/tools.js.map +1 -1
  153. package/dist/types.js +1 -1
  154. package/dist/ui/agent.d.ts.map +1 -1
  155. package/dist/ui/agent.js +3 -2
  156. package/dist/ui/agent.js.map +1 -1
  157. package/dist/ui/commands.d.ts.map +1 -1
  158. package/dist/ui/commands.js +20 -12
  159. package/dist/ui/commands.js.map +1 -1
  160. package/dist/ui/model-commands.d.ts.map +1 -1
  161. package/dist/ui/model-commands.js +3 -2
  162. package/dist/ui/model-commands.js.map +1 -1
  163. package/package.json +5 -5
package/dist/attach.js ADDED
@@ -0,0 +1,450 @@
1
+ /**
2
+ * Calliope CLI - attach to an agent host (#378, calliope-vscode#790)
3
+ *
4
+ * `calliope attach` connects to a running agent host over the Agent Host
5
+ * Protocol (JSON-RPC over WebSocket) and follows a session another surface
6
+ * started (the IDE, desktop, AGTerm, Chat Studio), answering its tool-call
7
+ * confirmations from the terminal, including any already waiting when it joins
8
+ * and those inside a subagent, which the session's `inputNeeded` lists (#394).
9
+ *
10
+ * calliope attach --url <ws-url> list the host's sessions
11
+ * calliope attach --url <ws-url> <session-uri> follow one, approve its tool calls
12
+ * calliope attach --hub <url> --user <name> ... find (or start) the user's
13
+ * `agenthost` server on a Workbench hub
14
+ * --token-env <VAR> hub API token source (default JUPYTERHUB_API_TOKEN)
15
+ * --read-only follow without being asked to approve
16
+ * --once exit after the next turn completes
17
+ *
18
+ * AHP is an added route, never a replacement (calliope-vscode#796). When no host
19
+ * answers, attach prints one reason code (disabled, unentitled, auth, version,
20
+ * unreachable) and exits 3; the local `calliope` REPL is the fallback.
21
+ * CALLIOPE_AHP=off is the kill switch.
22
+ */
23
+ import * as readline from 'readline';
24
+ /** Protocol versions offered in `initialize`; keep in step with calliope-vscode scripts/ahp-supported-versions.json. */
25
+ export const SUPPORTED_VERSIONS = ['1.0.0', '0.6.0'];
26
+ export const FALLBACK_EXIT = 3;
27
+ const ROOT = 'ahp-root://';
28
+ const UNSUPPORTED_PROTOCOL_VERSION = -32005;
29
+ const fail = (reason, detail) => ({ ok: false, reason, detail });
30
+ export function isDisabled(env = process.env) {
31
+ return ['off', '0', 'false', 'disabled'].includes(String(env.CALLIOPE_AHP ?? '').trim().toLowerCase());
32
+ }
33
+ /** A session's default chat channel: `ahp-chat://default/<base64url(session)>`. */
34
+ export function defaultChatUri(session) {
35
+ return `ahp-chat://default/${Buffer.from(session).toString('base64url')}`;
36
+ }
37
+ /**
38
+ * Node's WebSocket hides the status of a refused upgrade, so ask plainly first:
39
+ * an authorized agent-host route answers a plain GET with 426 Upgrade Required.
40
+ */
41
+ export async function preflight(wsUrl, headers, fetchImpl = fetch) {
42
+ const http = wsUrl.replace(/^ws/, 'http');
43
+ try {
44
+ const res = await fetchImpl(http, { headers, redirect: 'manual' });
45
+ if (res.status === 426 || res.ok) {
46
+ return undefined;
47
+ }
48
+ // A hub sends an unauthenticated request to its login page.
49
+ const toLogin = res.status >= 300 && res.status < 400 && /\/(hub\/)?login|oauth/.test(res.headers.get('location') ?? '');
50
+ return fail(res.status === 401 || res.status === 403 || toLogin ? 'auth' : 'unreachable', `the host route answered HTTP ${res.status}`);
51
+ }
52
+ catch (err) {
53
+ return fail('unreachable', `cannot reach ${http}: ${err.message}`);
54
+ }
55
+ }
56
+ /** Find (or start) the user's agent host on a JupyterHub; returns its WebSocket URL. */
57
+ export async function resolveHubHost(opts) {
58
+ const { hubUrl, user, token, serverName = 'agenthost', fetchImpl = fetch, timeoutMs = 60_000 } = opts;
59
+ const api = new URL('hub/api/', hubUrl.endsWith('/') ? hubUrl : `${hubUrl}/`);
60
+ const headers = { Authorization: `token ${token}` };
61
+ const deadline = Date.now() + timeoutMs;
62
+ try {
63
+ for (let spawned = false;;) {
64
+ const res = await fetchImpl(new URL(`users/${encodeURIComponent(user)}`, api), { headers });
65
+ if (!res.ok) {
66
+ return fail(res.status === 401 || res.status === 403 ? 'auth' : 'unreachable', `hub user lookup answered ${res.status}`);
67
+ }
68
+ const body = await res.json();
69
+ const server = body.servers?.[serverName];
70
+ if (server?.ready && server.url) {
71
+ const ws = new URL(`${server.url}agent-host/`, hubUrl);
72
+ ws.protocol = ws.protocol === 'https:' ? 'wss:' : 'ws:';
73
+ return { ok: true, url: ws.toString() };
74
+ }
75
+ if (!spawned) {
76
+ const spawn = await fetchImpl(new URL(`users/${encodeURIComponent(user)}/servers/${encodeURIComponent(serverName)}`, api), { method: 'POST', headers });
77
+ if (spawn.status === 401) {
78
+ return fail('auth', 'hub refused the token');
79
+ }
80
+ if (spawn.status === 403 || (spawn.status === 400 && !server)) {
81
+ return fail('unentitled', `hub refused to start ${serverName}: ${spawn.status}`);
82
+ }
83
+ if (!spawn.ok && spawn.status !== 400) {
84
+ return fail('unreachable', `hub could not start ${serverName}: ${spawn.status}`);
85
+ }
86
+ spawned = true;
87
+ }
88
+ if (Date.now() >= deadline) {
89
+ return fail('unreachable', `${serverName} not ready within ${Math.round(timeoutMs / 1000)}s`);
90
+ }
91
+ await new Promise(resolve => setTimeout(resolve, 1000));
92
+ }
93
+ }
94
+ catch (err) {
95
+ return fail('unreachable', `hub unreachable: ${err.message}`);
96
+ }
97
+ }
98
+ /** The minimal JSON-RPC client attach needs, over any WebSocket-shaped object. */
99
+ export class AhpConnection {
100
+ ws;
101
+ nextId = 1;
102
+ pending = new Map();
103
+ actions = [];
104
+ closed;
105
+ constructor(ws) {
106
+ this.ws = ws;
107
+ ws.addEventListener('message', ev => {
108
+ const msg = JSON.parse(String(ev.data));
109
+ if (msg.id !== undefined && this.pending.has(msg.id)) {
110
+ this.pending.get(msg.id).resolve(msg);
111
+ this.pending.delete(msg.id);
112
+ return;
113
+ }
114
+ if (msg.method === 'action' && msg.params?.action) {
115
+ for (const fn of this.actions) {
116
+ fn(msg.params.action, msg.params.channel, msg.params.serverSeq);
117
+ }
118
+ }
119
+ });
120
+ ws.addEventListener('close', ev => this.closed?.(`connection closed (${ev.code ?? 'unknown'})`));
121
+ }
122
+ call(method, params) {
123
+ const id = this.nextId++;
124
+ return new Promise(resolve => {
125
+ this.pending.set(id, { resolve });
126
+ this.ws.send(JSON.stringify({ jsonrpc: '2.0', id, method, params }));
127
+ });
128
+ }
129
+ dispatch(channel, clientSeq, action) {
130
+ this.ws.send(JSON.stringify({ jsonrpc: '2.0', method: 'dispatchAction', params: { channel, clientSeq, action } }));
131
+ }
132
+ close() {
133
+ this.ws.close();
134
+ }
135
+ }
136
+ /** Classify the `initialize` answer; undefined when the host is usable. */
137
+ export function checkInitialize(msg, supported = SUPPORTED_VERSIONS) {
138
+ if (msg.error) {
139
+ return msg.error.code === UNSUPPORTED_PROTOCOL_VERSION
140
+ ? fail('version', `the host speaks none of ${supported.join(', ')}`)
141
+ : fail('unreachable', `initialize failed: ${msg.error.message}`);
142
+ }
143
+ if (!supported.includes(msg.result?.protocolVersion)) {
144
+ return fail('version', `the host answered ${msg.result?.protocolVersion}`);
145
+ }
146
+ return undefined;
147
+ }
148
+ const text = (value, fallback) => typeof value === 'string' ? value : value?.markdown ?? fallback;
149
+ /**
150
+ * Render a session's chat actions and answer tool confirmations. Resolves when
151
+ * the connection closes, or after the next turn with `once`.
152
+ *
153
+ * `subscribed` is the chat channel's `subscribe` snapshot for a client joining
154
+ * a session already under way: the confirmations it shows waiting are asked
155
+ * first. `sessionSubscribed` is the session channel's: its `inputNeeded` lists
156
+ * the confirmations waiting in the session's other chats (a subagent's), which
157
+ * are answered on their own chat. Each channel's actions that arrive before its
158
+ * snapshot are held, then applied after it, skipping any the snapshot already
159
+ * includes.
160
+ */
161
+ export function follow(conn, session, io, subscribed, sessionSubscribed) {
162
+ const chat = defaultChatUri(session);
163
+ let seq = 0;
164
+ let finish;
165
+ const done = new Promise(resolve => { finish = resolve; });
166
+ // Confirmations this client knows are open, by tool call, each able to
167
+ // withdraw its prompt. One prompt at a time: a snapshot can hold several, and
168
+ // two readline prompts on one stdin garble each other. `request` is the
169
+ // session's `inputNeeded` id of a confirmation asked for another chat.
170
+ const open = new Map();
171
+ let prompts = Promise.resolve();
172
+ const settled = (toolCallId) => {
173
+ open.get(toolCallId)?.asked.abort();
174
+ open.delete(toolCallId);
175
+ };
176
+ const settleAll = () => {
177
+ for (const toolCallId of [...open.keys()]) {
178
+ settled(toolCallId);
179
+ }
180
+ };
181
+ // The default chat's turn is over, and so are the prompts asked on it. One
182
+ // for another chat closes when the session removes its request: the host ends
183
+ // subagent turns with a cancelled parent's, and a background subagent's turn
184
+ // can outlive the parent's.
185
+ const settleTurn = () => {
186
+ for (const [toolCallId, { request }] of [...open]) {
187
+ if (request === undefined) {
188
+ settled(toolCallId);
189
+ }
190
+ }
191
+ };
192
+ // Following is over: no prompt outlives it, or its readline keeps the process alive.
193
+ const end = (reason) => {
194
+ settleAll();
195
+ finish(reason);
196
+ };
197
+ const confirm = (target, turnId, toolCallId, confirmationTitle, toolInput, request) => {
198
+ if (open.has(toolCallId)) {
199
+ return;
200
+ }
201
+ const asked = new AbortController();
202
+ open.set(toolCallId, { asked, request });
203
+ const title = text(confirmationTitle, 'Run tool');
204
+ const input = typeof toolInput === 'string' ? toolInput : JSON.stringify(toolInput ?? '');
205
+ const approve = io.approve;
206
+ if (!approve) {
207
+ io.write(`\n[waiting for approval elsewhere] ${title}: ${input}\n`);
208
+ return;
209
+ }
210
+ prompts = prompts.then(async () => {
211
+ if (asked.signal.aborted) {
212
+ return;
213
+ }
214
+ const approved = await approve(title, input, asked.signal);
215
+ if (asked.signal.aborted) {
216
+ io.write('\n[approval no longer needed; nothing sent]\n');
217
+ return;
218
+ }
219
+ open.delete(toolCallId);
220
+ conn.dispatch(target, ++seq, approved
221
+ ? { type: 'chat/toolCallConfirmed', turnId, toolCallId, approved: true, confirmed: 'user-action' }
222
+ : { type: 'chat/toolCallConfirmed', turnId, toolCallId, approved: false, reason: 'denied' });
223
+ }).catch(err => io.write(`\n[approval prompt failed] ${err.message}\n`));
224
+ };
225
+ const apply = (action) => {
226
+ switch (action.type) {
227
+ case 'chat/turnStarted':
228
+ io.write(`\n› ${action.message?.text ?? ''}\n`);
229
+ break;
230
+ case 'chat/delta':
231
+ io.write(action.content ?? '');
232
+ break;
233
+ case 'chat/toolCallReady':
234
+ if (action.confirmationTitle !== undefined) {
235
+ confirm(chat, action.turnId, action.toolCallId, action.confirmationTitle, action.toolInput);
236
+ }
237
+ break;
238
+ case 'chat/toolCallConfirmed':
239
+ settled(action.toolCallId);
240
+ break;
241
+ case 'chat/toolCallComplete':
242
+ settled(action.toolCallId);
243
+ io.write(`\n[tool ${action.result?.success === false ? 'failed' : 'done'}]\n`);
244
+ break;
245
+ case 'chat/turnCancelled':
246
+ settleTurn();
247
+ break;
248
+ case 'chat/turnComplete':
249
+ settleTurn();
250
+ io.write('\n[turn complete]\n');
251
+ if (io.once) {
252
+ end('turnComplete');
253
+ }
254
+ break;
255
+ case 'chat/error':
256
+ settleTurn();
257
+ io.write(`\n[turn error] ${JSON.stringify(action.error ?? action).slice(0, 200)}\n`);
258
+ if (io.once) {
259
+ end('error');
260
+ }
261
+ break;
262
+ }
263
+ };
264
+ // The session's `inputNeeded` lists the input waiting in every chat. A
265
+ // confirmation on the default chat is there too, and is asked through that
266
+ // chat above: a host without calliope-vscode#823 drops its entry while the
267
+ // call still waits (the provider's late ready moves it to running), so that
268
+ // removal is no answer. The session is how attach hears about the other
269
+ // chats, a subagent's.
270
+ const ask = (request) => {
271
+ const call = request?.toolCall;
272
+ if (request?.kind === 'toolConfirmation' && call?.status === 'pending-confirmation'
273
+ && typeof request.chat === 'string' && request.chat !== chat && typeof request.turnId === 'string') {
274
+ confirm(request.chat, request.turnId, call.toolCallId, call.confirmationTitle ?? call.invocationMessage, call.toolInput, request.id);
275
+ }
276
+ };
277
+ const applySession = (action) => {
278
+ switch (action.type) {
279
+ case 'session/inputNeededSet':
280
+ ask(action.request);
281
+ break;
282
+ case 'session/inputNeededRemoved':
283
+ for (const [toolCallId, { request }] of [...open]) {
284
+ if (request === action.id) {
285
+ settled(toolCallId);
286
+ }
287
+ }
288
+ break;
289
+ }
290
+ };
291
+ // Apply a channel's actions from its snapshot on: those that arrive first are
292
+ // held, then applied after it, skipping any it already includes.
293
+ const track = (channel, onAction, seed, snapshot) => {
294
+ let held = snapshot ? [] : undefined;
295
+ conn.actions.push((action, from, serverSeq) => {
296
+ if (from !== channel) {
297
+ return;
298
+ }
299
+ if (held) {
300
+ held.push({ action, serverSeq });
301
+ return;
302
+ }
303
+ onAction(action);
304
+ });
305
+ const join = (joined) => {
306
+ seed(joined);
307
+ const early = held ?? [];
308
+ held = undefined;
309
+ const fromSeq = joined?.fromSeq;
310
+ for (const { action, serverSeq } of early) {
311
+ if (fromSeq === undefined || serverSeq === undefined || serverSeq > fromSeq) {
312
+ onAction(action);
313
+ }
314
+ }
315
+ };
316
+ snapshot?.then(join, () => join(undefined));
317
+ };
318
+ track(chat, apply, snapshot => {
319
+ const turn = snapshot?.state?.activeTurn;
320
+ for (const part of turn?.responseParts ?? []) {
321
+ const call = part.kind === 'toolCall' ? part.toolCall : undefined;
322
+ if (turn && call?.status === 'pending-confirmation') {
323
+ confirm(chat, turn.id, call.toolCallId, call.confirmationTitle ?? call.invocationMessage, call.toolInput);
324
+ }
325
+ }
326
+ }, subscribed);
327
+ track(session, applySession, snapshot => {
328
+ for (const request of snapshot?.state?.inputNeeded ?? []) {
329
+ ask(request);
330
+ }
331
+ }, sessionSubscribed);
332
+ conn.closed = end;
333
+ return { done };
334
+ }
335
+ function parseArgs(args) {
336
+ const out = { tokenEnv: 'JUPYTERHUB_API_TOKEN', readOnly: false, once: false };
337
+ for (let i = 0; i < args.length; i++) {
338
+ const a = args[i];
339
+ if (a === '--url')
340
+ out.url = args[++i];
341
+ else if (a === '--hub')
342
+ out.hub = args[++i];
343
+ else if (a === '--user')
344
+ out.user = args[++i];
345
+ else if (a === '--token-env')
346
+ out.tokenEnv = args[++i] ?? out.tokenEnv;
347
+ else if (a === '--read-only')
348
+ out.readOnly = true;
349
+ else if (a === '--once')
350
+ out.once = true;
351
+ else if (a && !a.startsWith('--'))
352
+ out.session = a;
353
+ }
354
+ return out;
355
+ }
356
+ function askYesNo(title, input, signal) {
357
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
358
+ return new Promise(resolve => {
359
+ const end = (approved) => {
360
+ rl.close();
361
+ resolve(approved);
362
+ };
363
+ signal.addEventListener('abort', () => end(false), { once: true });
364
+ rl.question(`\n${title}\n ${input}\nApprove? [y/N] `, answer => end(/^y(es)?$/i.test(answer.trim())));
365
+ });
366
+ }
367
+ export async function runAttach(args, env = process.env) {
368
+ const opts = parseArgs(args);
369
+ const err = (s) => process.stderr.write(`${s}\n`);
370
+ const fallback = (f) => {
371
+ err(`calliope attach: no agent host (reason: ${f.reason}). ${f.detail}`);
372
+ err('Falling back: run `calliope` to work locally.');
373
+ return FALLBACK_EXIT;
374
+ };
375
+ if (isDisabled(env)) {
376
+ return fallback(fail('disabled', 'CALLIOPE_AHP is off'));
377
+ }
378
+ const token = env[opts.tokenEnv];
379
+ const headers = token ? { Authorization: `token ${token}` } : {};
380
+ let url = opts.url;
381
+ if (!url && opts.hub && opts.user) {
382
+ if (!token) {
383
+ return fallback(fail('auth', `set ${opts.tokenEnv} to a hub API token`));
384
+ }
385
+ const resolved = await resolveHubHost({ hubUrl: opts.hub, user: opts.user, token });
386
+ if (!resolved.ok) {
387
+ return fallback(resolved);
388
+ }
389
+ url = resolved.url;
390
+ }
391
+ if (!url) {
392
+ err('usage: calliope attach (--url <ws-url> | --hub <url> --user <name>) [session-uri] [--read-only]');
393
+ return 1;
394
+ }
395
+ const refused = await preflight(url, headers);
396
+ if (refused) {
397
+ return fallback(refused);
398
+ }
399
+ const ws = new WebSocket(url, { headers });
400
+ const opened = await new Promise(resolve => {
401
+ ws.addEventListener('open', () => resolve(true));
402
+ ws.addEventListener('error', () => resolve(false));
403
+ });
404
+ if (!opened) {
405
+ return fallback(fail('unreachable', 'the WebSocket upgrade failed'));
406
+ }
407
+ const conn = new AhpConnection(ws);
408
+ const init = await conn.call('initialize', {
409
+ channel: ROOT, protocolVersions: SUPPORTED_VERSIONS, clientId: `calliope-cli-${process.pid}`,
410
+ clientInfo: { name: 'calliope-cli', version: '1' }, initialSubscriptions: [ROOT],
411
+ });
412
+ const bad = checkInitialize(init);
413
+ if (bad) {
414
+ conn.close();
415
+ return fallback(bad);
416
+ }
417
+ if (!opts.session) {
418
+ const list = await conn.call('listSessions', { channel: ROOT });
419
+ if (list.error) {
420
+ err(`calliope attach: the host could not list sessions: ${list.error.message.split('\n')[0]}`);
421
+ conn.close();
422
+ return 1;
423
+ }
424
+ const items = (list.result?.items ?? []);
425
+ process.stdout.write(items.length ? '' : 'No sessions on this host.\n');
426
+ for (const s of items) {
427
+ process.stdout.write(`${s.resource} ${s.title ?? ''} ${s.modifiedAt ?? ''}\n`);
428
+ }
429
+ conn.close();
430
+ return 0;
431
+ }
432
+ // The session snapshot lists the input waiting in every chat, a subagent's
433
+ // included; the chat snapshot holds the confirmations waiting on the default
434
+ // chat, which is subscribed once the session answers. follow() listens from
435
+ // the moment the first request goes out: an action can share a network read
436
+ // with an answer, and Node delivers it before an awaited call resumes.
437
+ const chat = defaultChatUri(opts.session);
438
+ const sessionAnswer = conn.call('subscribe', { channel: opts.session });
439
+ const chatAnswer = sessionAnswer.then(() => conn.call('subscribe', { channel: chat }));
440
+ const { done } = follow(conn, opts.session, {
441
+ write: s => process.stdout.write(s),
442
+ approve: opts.readOnly ? undefined : askYesNo,
443
+ once: opts.once,
444
+ }, chatAnswer.then(answer => answer.result?.snapshot), sessionAnswer.then(answer => answer.result?.snapshot));
445
+ process.stderr.write(`attached to ${opts.session} (AHP ${init.result.protocolVersion}); Ctrl+C to detach\n`);
446
+ const ended = await done;
447
+ conn.close();
448
+ return ended === 'turnComplete' ? 0 : 1;
449
+ }
450
+ //# sourceMappingURL=attach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach.js","sourceRoot":"","sources":["../src/attach.ts"],"names":[],"mappings":"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"}
package/dist/bin.d.ts CHANGED
@@ -17,4 +17,5 @@ export { skipPermissions, useHeadless, maxRetries };
17
17
  export declare function shutdown(exitCode?: number): Promise<void>;
18
18
  /** Register signal + top-level error handlers. Idempotent. */
19
19
  export declare function registerProcessHandlers(): void;
20
+ export declare function printHelp(): void;
20
21
  //# sourceMappingURL=bin.d.ts.map
package/dist/bin.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AA0DH,QAAA,MAAM,eAAe,SAE0B,CAAC;AAKhD,QAAA,MAAM,WAAW,SAAuD,CAAC;AAsBzE,QAAA,MAAM,UAAU,QAAoB,CAAC;AAGrC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AAepD;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1D;AAED,8DAA8D;AAC9D,wBAAgB,uBAAuB,IAAI,IAAI,CAW9C"}
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AA0DH,QAAA,MAAM,eAAe,SAE0B,CAAC;AAKhD,QAAA,MAAM,WAAW,SAAuD,CAAC;AAsBzE,QAAA,MAAM,UAAU,QAAoB,CAAC;AAGrC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AAepD;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1D;AAED,8DAA8D;AAC9D,wBAAgB,uBAAuB,IAAI,IAAI,CAW9C;AAmRD,wBAAgB,SAAS,IAAI,IAAI,CAsGhC"}
package/dist/bin.js CHANGED
@@ -144,11 +144,11 @@ function completeCommand(exitCode) {
144
144
  process.exitCode = exitCode;
145
145
  }
146
146
  async function main() {
147
- // Check Node.js version — ink requires Node >=20 (uses /v regex flag in string-width)
147
+ // Check Node.js version — the supported floor is Node 24 (current openai SDK needs >=22; 20 is EOL)
148
148
  const [nodeMaj = 0] = process.versions.node.split('.').map(Number);
149
- if (nodeMaj < 20) {
150
- console.error(`calliope requires Node.js 20 or later (you have ${process.versions.node})`);
151
- console.error('Upgrade: https://nodejs.org/en/download or nvm install 20');
149
+ if (nodeMaj < 24) {
150
+ console.error(`calliope requires Node.js 24 or later (you have ${process.versions.node})`);
151
+ console.error('Upgrade: https://nodejs.org/en/download or nvm install 24');
152
152
  process.exit(1);
153
153
  }
154
154
  // Handle --help
@@ -158,6 +158,12 @@ async function main() {
158
158
  }
159
159
  // Handle --version
160
160
  if (args.includes('--version') || args.includes('-v')) {
161
+ // Embedders check compatibility before spawning `calliope acp`; offline, no update check.
162
+ if (args.includes('--json')) {
163
+ const { PROTOCOL_VERSION } = await import('@zed-industries/agent-client-protocol');
164
+ console.log(JSON.stringify({ version: getVersion(), acp: PROTOCOL_VERSION }));
165
+ return completeCommand(0);
166
+ }
161
167
  console.log(`calliope v${getVersion()}`);
162
168
  await checkForUpdates();
163
169
  process.exit(0);
@@ -193,6 +199,13 @@ async function main() {
193
199
  const { runOrchestrationCommand } = await import('./orchestration/index.js');
194
200
  return completeCommand(await runOrchestrationCommand(args[0], rawArgs.slice(1), { signal: headlessCancellation.signal }));
195
201
  }
202
+ // Typed judgments run before the setup/TUI gates: they need a provider, but
203
+ // never an interactive session, and the module is loaded only on demand.
204
+ if (args[0] === 'judge') {
205
+ headlessCancellation = new AbortController();
206
+ const { runJudge } = await import('./judgment/index.js');
207
+ return completeCommand(await runJudge(rawArgs.slice(1), { signal: headlessCancellation.signal }));
208
+ }
196
209
  if (args[0] === 'session') {
197
210
  headlessCancellation = new AbortController();
198
211
  const { runSessionCommand } = await import('./session-management/cli.js');
@@ -214,6 +227,13 @@ async function main() {
214
227
  const code = await runCost(args.slice(1));
215
228
  return completeCommand(code);
216
229
  }
230
+ // Handle `attach` subcommand — follow a session on an agent host over the
231
+ // Agent Host Protocol and answer its tool confirmations (#378). Runs before
232
+ // the setup/TUI gates; loaded lazily so the default path pays nothing.
233
+ if (args[0] === 'attach') {
234
+ const { runAttach } = await import('./attach.js');
235
+ return completeCommand(await runAttach(args.slice(1)));
236
+ }
217
237
  // Handle `acp` subcommand — run as an Agent Client Protocol agent over stdio
218
238
  // JSON-RPC (Zed, JetBrains, Neovim, …). Runs before the setup/TUI gates and
219
239
  // never touches Ink: stdio carries the protocol, so an interactive prompt
@@ -368,7 +388,7 @@ async function startCLI(options = {}) {
368
388
  await startInkCLI(fullOptions);
369
389
  }
370
390
  }
371
- function printHelp() {
391
+ export function printHelp() {
372
392
  console.log(`
373
393
  ${bold('calliope')} - Multi-model AI agent CLI
374
394
 
@@ -396,14 +416,18 @@ ${bold('USAGE')}
396
416
  calliope agents spawn --resume <hash> --run <id> [--json] Recover child admission
397
417
  calliope tasks --graph [--run <id>] [--json] Inspect task dependencies
398
418
  calliope session <action> [args] [--json] Manage private session history without inference
419
+ calliope judge --request <file|-> [--provider <name>|typesafe] [--model <id>] [--json] Typed judgments (noul/choice/score)
420
+ calliope judge --policy <rules.json> Judgment-backed pre-tool policy engine (tool call on stdin)
399
421
  calliope replay <path|sessionId> [--json] Render an audit run-log trace
400
422
  calliope cost [sessionId] [--json] [--dir <path>] Report spend + tool usage from run logs
401
423
  calliope acp Run as an ACP agent over stdio (for editors)
424
+ calliope attach (--url <ws-url> | --hub <url> --user <name>) [session-uri] [--read-only] [--once]
425
+ Follow an agent host session and answer its tool approvals (no session-uri: list sessions)
402
426
  calliope doctor [providers|provider <name>] [--json] [--probe] Inspect provider health
403
427
 
404
428
  ${bold('OPTIONS')}
405
429
  -h, --help Show this help message
406
- -v, --version Show version
430
+ -v, --version Show version (with --json: {"version","acp"} for embedders)
407
431
  -u, --upgrade Upgrade to latest version
408
432
  --setup Run setup wizard (reconfigure)
409
433
  --config Show config file path and status