@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.
- package/README.md +1 -0
- package/dist/acp.d.ts +11 -3
- package/dist/acp.d.ts.map +1 -1
- package/dist/acp.js +114 -27
- package/dist/acp.js.map +1 -1
- package/dist/attach.d.ts +149 -0
- package/dist/attach.d.ts.map +1 -0
- package/dist/attach.js +450 -0
- package/dist/attach.js.map +1 -0
- package/dist/bin.d.ts +1 -0
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +30 -6
- package/dist/bin.js.map +1 -1
- package/dist/brain/actions.d.ts +1 -1
- package/dist/brain/actions.d.ts.map +1 -1
- package/dist/brain/actions.js.map +1 -1
- package/dist/brain/cli.d.ts +1 -1
- package/dist/brain/cli.d.ts.map +1 -1
- package/dist/brain/cli.js +47 -5
- package/dist/brain/cli.js.map +1 -1
- package/dist/brain/exchange-json.d.ts +4 -0
- package/dist/brain/exchange-json.d.ts.map +1 -0
- package/dist/brain/exchange-json.js +77 -0
- package/dist/brain/exchange-json.js.map +1 -0
- package/dist/brain/exchange.d.ts +26 -0
- package/dist/brain/exchange.d.ts.map +1 -0
- package/dist/brain/exchange.js +86 -0
- package/dist/brain/exchange.js.map +1 -0
- package/dist/brain/index.d.ts +3 -0
- package/dist/brain/index.d.ts.map +1 -1
- package/dist/brain/index.js +3 -0
- package/dist/brain/index.js.map +1 -1
- package/dist/brain/journal.js +3 -3
- package/dist/brain/journal.js.map +1 -1
- package/dist/brain/kg-claims.d.ts +13 -0
- package/dist/brain/kg-claims.d.ts.map +1 -0
- package/dist/brain/kg-claims.js +156 -0
- package/dist/brain/kg-claims.js.map +1 -0
- package/dist/brain/kg-export.d.ts +13 -0
- package/dist/brain/kg-export.d.ts.map +1 -0
- package/dist/brain/kg-export.js +116 -0
- package/dist/brain/kg-export.js.map +1 -0
- package/dist/brain/kg-transfer.d.ts +29 -0
- package/dist/brain/kg-transfer.d.ts.map +1 -0
- package/dist/brain/kg-transfer.js +156 -0
- package/dist/brain/kg-transfer.js.map +1 -0
- package/dist/brain/kg.d.ts.map +1 -1
- package/dist/brain/kg.js +89 -16
- package/dist/brain/kg.js.map +1 -1
- package/dist/brain/presentation.d.ts.map +1 -1
- package/dist/brain/presentation.js +10 -0
- package/dist/brain/presentation.js.map +1 -1
- package/dist/brain/store.d.ts +1 -1
- package/dist/brain/store.d.ts.map +1 -1
- package/dist/brain/store.js +8 -2
- package/dist/brain/store.js.map +1 -1
- package/dist/brain/transfer-report.d.ts +38 -0
- package/dist/brain/transfer-report.d.ts.map +1 -0
- package/dist/brain/transfer-report.js +10 -0
- package/dist/brain/transfer-report.js.map +1 -0
- package/dist/brain/transfer.d.ts +29 -21
- package/dist/brain/transfer.d.ts.map +1 -1
- package/dist/brain/transfer.js +120 -89
- package/dist/brain/transfer.js.map +1 -1
- package/dist/brain/validation.d.ts +1 -0
- package/dist/brain/validation.d.ts.map +1 -1
- package/dist/brain/validation.js +7 -6
- package/dist/brain/validation.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/execution/authority.d.ts.map +1 -1
- package/dist/execution/authority.js +4 -2
- package/dist/execution/authority.js.map +1 -1
- package/dist/execution/files.d.ts.map +1 -1
- package/dist/execution/files.js +9 -6
- package/dist/execution/files.js.map +1 -1
- package/dist/execution/ledger.d.ts.map +1 -1
- package/dist/execution/ledger.js +3 -1
- package/dist/execution/ledger.js.map +1 -1
- package/dist/execution/project-spend.d.ts.map +1 -1
- package/dist/execution/project-spend.js +9 -6
- package/dist/execution/project-spend.js.map +1 -1
- package/dist/execution/writer-recovery.d.ts.map +1 -1
- package/dist/execution/writer-recovery.js +14 -10
- package/dist/execution/writer-recovery.js.map +1 -1
- package/dist/goals/store.d.ts.map +1 -1
- package/dist/goals/store.js +3 -1
- package/dist/goals/store.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/judgment/cli.d.ts +20 -0
- package/dist/judgment/cli.d.ts.map +1 -0
- package/dist/judgment/cli.js +141 -0
- package/dist/judgment/cli.js.map +1 -0
- package/dist/judgment/evaluate.d.ts +47 -0
- package/dist/judgment/evaluate.d.ts.map +1 -0
- package/dist/judgment/evaluate.js +369 -0
- package/dist/judgment/evaluate.js.map +1 -0
- package/dist/judgment/index.d.ts +8 -0
- package/dist/judgment/index.d.ts.map +1 -0
- package/dist/judgment/index.js +5 -0
- package/dist/judgment/index.js.map +1 -0
- package/dist/judgment/policy.d.ts +61 -0
- package/dist/judgment/policy.d.ts.map +1 -0
- package/dist/judgment/policy.js +143 -0
- package/dist/judgment/policy.js.map +1 -0
- package/dist/judgment/types.d.ts +73 -0
- package/dist/judgment/types.d.ts.map +1 -0
- package/dist/judgment/types.js +9 -0
- package/dist/judgment/types.js.map +1 -0
- package/dist/model-detection.d.ts.map +1 -1
- package/dist/model-detection.js +40 -7
- package/dist/model-detection.js.map +1 -1
- package/dist/models/metadata.d.ts +2 -0
- package/dist/models/metadata.d.ts.map +1 -1
- package/dist/models/metadata.js +2 -2
- package/dist/models/metadata.js.map +1 -1
- package/dist/orchestration/execution-store.d.ts.map +1 -1
- package/dist/orchestration/execution-store.js +14 -3
- package/dist/orchestration/execution-store.js.map +1 -1
- package/dist/orchestration/store.d.ts.map +1 -1
- package/dist/orchestration/store.js +3 -1
- package/dist/orchestration/store.js.map +1 -1
- package/dist/policy.d.ts +8 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +74 -5
- package/dist/policy.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +10 -5
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +3 -2
- package/dist/providers/openai.js.map +1 -1
- package/dist/routing/select.d.ts +7 -0
- package/dist/routing/select.d.ts.map +1 -1
- package/dist/routing/select.js +18 -1
- package/dist/routing/select.js.map +1 -1
- package/dist/session-management/files.d.ts.map +1 -1
- package/dist/session-management/files.js +9 -6
- package/dist/session-management/files.js.map +1 -1
- package/dist/sessions/history.d.ts.map +1 -1
- package/dist/sessions/history.js +12 -6
- package/dist/sessions/history.js.map +1 -1
- package/dist/spawning/store.d.ts.map +1 -1
- package/dist/spawning/store.js +10 -8
- package/dist/spawning/store.js.map +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +5 -2
- package/dist/tools.js.map +1 -1
- package/dist/types.js +1 -1
- package/dist/ui/agent.d.ts.map +1 -1
- package/dist/ui/agent.js +3 -2
- package/dist/ui/agent.js.map +1 -1
- package/dist/ui/commands.d.ts.map +1 -1
- package/dist/ui/commands.js +20 -12
- package/dist/ui/commands.js.map +1 -1
- package/dist/ui/model-commands.d.ts.map +1 -1
- package/dist/ui/model-commands.js +3 -2
- package/dist/ui/model-commands.js.map +1 -1
- 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 —
|
|
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 <
|
|
150
|
-
console.error(`calliope requires Node.js
|
|
151
|
-
console.error('Upgrade: https://nodejs.org/en/download or nvm install
|
|
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
|