@heyditto/cli 2.10.0 → 2.12.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 +74 -0
- package/dist/agents/launch.d.ts +11 -0
- package/dist/agents/launch.js +207 -9
- package/dist/agents/launch.js.map +1 -1
- package/dist/api.d.ts +129 -0
- package/dist/api.js +82 -0
- package/dist/api.js.map +1 -1
- package/dist/cli.js +14 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands.js +5 -1
- package/dist/commands.js.map +1 -1
- package/dist/org-commands.d.ts +52 -0
- package/dist/org-commands.js +511 -0
- package/dist/org-commands.js.map +1 -0
- package/dist/remote/attachments.d.ts +22 -0
- package/dist/remote/attachments.js +0 -0
- package/dist/remote/attachments.js.map +1 -0
- package/dist/remote/catalog.d.ts +18 -0
- package/dist/remote/catalog.js +309 -0
- package/dist/remote/catalog.js.map +1 -0
- package/dist/remote/controller.d.ts +76 -0
- package/dist/remote/controller.js +352 -0
- package/dist/remote/controller.js.map +1 -0
- package/dist/remote/fork-command.d.ts +8 -0
- package/dist/remote/fork-command.js +50 -0
- package/dist/remote/fork-command.js.map +1 -0
- package/dist/remote/fork.d.ts +22 -0
- package/dist/remote/fork.js +113 -0
- package/dist/remote/fork.js.map +1 -0
- package/dist/remote/headless.d.ts +30 -0
- package/dist/remote/headless.js +75 -0
- package/dist/remote/headless.js.map +1 -0
- package/dist/remote/hook.d.ts +2 -0
- package/dist/remote/hook.js +69 -0
- package/dist/remote/hook.js.map +1 -0
- package/dist/remote/hooks.d.ts +30 -0
- package/dist/remote/hooks.js +95 -0
- package/dist/remote/hooks.js.map +1 -0
- package/dist/remote/host.d.ts +63 -0
- package/dist/remote/host.js +240 -0
- package/dist/remote/host.js.map +1 -0
- package/dist/remote/protocol.d.ts +163 -0
- package/dist/remote/protocol.js +11 -0
- package/dist/remote/protocol.js.map +1 -0
- package/dist/remote/pty.d.ts +56 -0
- package/dist/remote/pty.js +100 -0
- package/dist/remote/pty.js.map +1 -0
- package/dist/store.d.ts +11 -0
- package/dist/store.js.map +1 -1
- package/dist/teleport/commands.d.ts +6 -0
- package/dist/teleport/commands.js +11 -0
- package/dist/teleport/commands.js.map +1 -1
- package/package.json +9 -2
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
import { approveToolApproval, createMCPConnection, deleteMCPConnection, listCompanies, listEndpointTools, listMCPConnections, listToolApprovals, rejectToolApproval, resolveCompany, startMCPOAuth, updateMCPConnection, } from "./api.js";
|
|
2
|
+
import { openInBrowser } from "./browser.js";
|
|
3
|
+
import { readStoredAuth, updateStoredAuth } from "./store.js";
|
|
4
|
+
function isJSON(options) {
|
|
5
|
+
return options.output === "json" || options.output === "raw";
|
|
6
|
+
}
|
|
7
|
+
function pad(value, width) {
|
|
8
|
+
return value.length >= width ? value : value + " ".repeat(width - value.length);
|
|
9
|
+
}
|
|
10
|
+
function printTable(header, rows) {
|
|
11
|
+
if (rows.length === 0)
|
|
12
|
+
return;
|
|
13
|
+
const widths = header.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] ?? "").length)));
|
|
14
|
+
const line = (r) => r.map((c, i) => (i === r.length - 1 ? c : pad(c ?? "", widths[i] ?? 0))).join(" ");
|
|
15
|
+
process.stdout.write(`${line(header)}\n`);
|
|
16
|
+
for (const r of rows)
|
|
17
|
+
process.stdout.write(`${line(r)}\n`);
|
|
18
|
+
}
|
|
19
|
+
function writeJSON(value) {
|
|
20
|
+
process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Which organization a command acts on: `--org`, else the one `orgs use`
|
|
24
|
+
* remembered, else none (the caller's personal scope).
|
|
25
|
+
*
|
|
26
|
+
* Returning undefined rather than throwing is deliberate — most of these
|
|
27
|
+
* commands have a meaningful personal answer, and the ones that do not say so
|
|
28
|
+
* themselves with a message naming the flag.
|
|
29
|
+
*/
|
|
30
|
+
/**
|
|
31
|
+
* Reads one header value from stdin.
|
|
32
|
+
*
|
|
33
|
+
* Exists so a bearer token never has to appear in argv: `--header "Name: -"`
|
|
34
|
+
* takes the value from the pipe. Trailing newline is stripped because
|
|
35
|
+
* `printf %s` and `echo` differ there and a token with a stray \n fails
|
|
36
|
+
* server-side in a way that looks like a bad credential rather than a bad pipe.
|
|
37
|
+
*/
|
|
38
|
+
async function readHeaderValueFromStdin(headerName) {
|
|
39
|
+
if (process.stdin.isTTY) {
|
|
40
|
+
throw new Error(`--header "${headerName}: -" reads the value from stdin; pipe it in, e.g. printf %s "$TOKEN" | heyditto ...`);
|
|
41
|
+
}
|
|
42
|
+
const chunks = [];
|
|
43
|
+
for await (const chunk of process.stdin) {
|
|
44
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
45
|
+
}
|
|
46
|
+
const value = Buffer.concat(chunks).toString("utf8").replace(/\r?\n$/, "");
|
|
47
|
+
if (value === "") {
|
|
48
|
+
throw new Error(`--header "${headerName}: -" got an empty value on stdin`);
|
|
49
|
+
}
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
async function resolveScope(options) {
|
|
53
|
+
const wanted = options.org?.trim() || (await readStoredAuth())?.defaultCompany;
|
|
54
|
+
if (!wanted)
|
|
55
|
+
return undefined;
|
|
56
|
+
return resolveCompany(wanted);
|
|
57
|
+
}
|
|
58
|
+
async function requireOrg(options) {
|
|
59
|
+
const company = await resolveScope(options);
|
|
60
|
+
if (!company) {
|
|
61
|
+
throw new Error("this command acts on an organization.\n\n" +
|
|
62
|
+
" Pass: --org <slug>\n" +
|
|
63
|
+
" Or: heyditto orgs use <slug> (remember it)\n" +
|
|
64
|
+
" See: heyditto orgs (the ones you belong to)\n");
|
|
65
|
+
}
|
|
66
|
+
return company;
|
|
67
|
+
}
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// orgs
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
export async function cmdOrgs(options) {
|
|
72
|
+
const companies = await listCompanies();
|
|
73
|
+
const current = (await readStoredAuth())?.defaultCompany;
|
|
74
|
+
if (isJSON(options)) {
|
|
75
|
+
writeJSON({ companies, defaultCompany: current ?? null });
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (companies.length === 0) {
|
|
79
|
+
process.stdout.write("You are not a member of any organization.\n");
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
printTable(["", "SLUG", "NAME", "YOUR ROLE"], companies.map((c) => [c.slug === current ? "*" : " ", c.slug, c.name, c.role]));
|
|
83
|
+
if (!current) {
|
|
84
|
+
process.stderr.write("\nSet one with `heyditto orgs use <slug>` to skip --org.\n");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export async function cmdOrgUse(slug, options) {
|
|
88
|
+
const company = await resolveCompany(slug);
|
|
89
|
+
await updateStoredAuth({ defaultCompany: company.slug });
|
|
90
|
+
if (isJSON(options)) {
|
|
91
|
+
writeJSON(company);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
process.stderr.write(`Default organization set to ${company.slug} (${company.role}).\n`);
|
|
95
|
+
}
|
|
96
|
+
export async function cmdOrgClear(options) {
|
|
97
|
+
await updateStoredAuth({ defaultCompany: undefined });
|
|
98
|
+
if (isJSON(options)) {
|
|
99
|
+
writeJSON({ defaultCompany: null });
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
process.stderr.write("Cleared the default organization.\n");
|
|
103
|
+
}
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
// mcp servers
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
/** The connection's live state, in the words that tell you what to do about it. */
|
|
108
|
+
function connectionStatus(connection) {
|
|
109
|
+
if (!connection.enabled)
|
|
110
|
+
return "paused";
|
|
111
|
+
if (connection.config.authType !== "oauth")
|
|
112
|
+
return "ready";
|
|
113
|
+
switch (connection.oauthStatus) {
|
|
114
|
+
case "connected":
|
|
115
|
+
return "connected";
|
|
116
|
+
case "expired":
|
|
117
|
+
return "needs reconnect";
|
|
118
|
+
default:
|
|
119
|
+
return "not connected";
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function findConnection(list, wanted) {
|
|
123
|
+
const needle = wanted.trim().toLowerCase();
|
|
124
|
+
const match = list.find((c) => c.id.toLowerCase() === needle ||
|
|
125
|
+
c.name.toLowerCase() === needle ||
|
|
126
|
+
c.prefix.toLowerCase() === needle);
|
|
127
|
+
if (match)
|
|
128
|
+
return match;
|
|
129
|
+
const known = list.map((c) => c.name).join(", ");
|
|
130
|
+
throw new Error(`no connection called "${wanted}".` + (known ? ` Available: ${known}` : " There are none yet."));
|
|
131
|
+
}
|
|
132
|
+
export async function cmdMCPList(options) {
|
|
133
|
+
const company = await requireOrg(options);
|
|
134
|
+
const { servers, canManage } = await listMCPConnections(company.id);
|
|
135
|
+
if (isJSON(options)) {
|
|
136
|
+
writeJSON({ company: company.slug, canManage, servers });
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (servers.length === 0) {
|
|
140
|
+
process.stdout.write(`${company.slug} has no tool servers connected.\n` +
|
|
141
|
+
(canManage ? "Add one with `heyditto mcp add <name> <url>`.\n" : ""));
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
printTable(["NAME", "PREFIX", "STATUS", "TRANSPORT", "URL"], servers.map((s) => [
|
|
145
|
+
s.name,
|
|
146
|
+
`${s.prefix}__`,
|
|
147
|
+
connectionStatus(s),
|
|
148
|
+
s.transport,
|
|
149
|
+
s.config.url,
|
|
150
|
+
]));
|
|
151
|
+
if (!canManage) {
|
|
152
|
+
process.stderr.write("\nRead-only: an owner or admin can change these.\n");
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
export async function cmdMCPAdd(name, url, options) {
|
|
156
|
+
const company = await requireOrg(options);
|
|
157
|
+
const headers = {};
|
|
158
|
+
for (const raw of options.header ?? []) {
|
|
159
|
+
const index = raw.indexOf(":");
|
|
160
|
+
if (index <= 0)
|
|
161
|
+
throw new Error(`--header must be "Name: value", got "${raw}"`);
|
|
162
|
+
const headerName = raw.slice(0, index).trim();
|
|
163
|
+
const headerValue = raw.slice(index + 1).trim();
|
|
164
|
+
// A bare `--header "Authorization: Bearer ..."` leaves the credential in
|
|
165
|
+
// shell history and in the process table, where any local user can read it
|
|
166
|
+
// off `ps`. A value of "-" reads it from stdin instead, which keeps it out
|
|
167
|
+
// of both. The header NAME still comes from the flag; the name is not the
|
|
168
|
+
// secret.
|
|
169
|
+
headers[headerName] =
|
|
170
|
+
headerValue === "-" ? await readHeaderValueFromStdin(headerName) : headerValue;
|
|
171
|
+
}
|
|
172
|
+
const authType = options.auth ?? (Object.keys(headers).length > 0 ? "headers" : "oauth");
|
|
173
|
+
if (authType === "headers" && Object.keys(headers).length === 0) {
|
|
174
|
+
throw new Error("--auth headers needs at least one --header \"Name: value\"");
|
|
175
|
+
}
|
|
176
|
+
const connection = await createMCPConnection(company.id, {
|
|
177
|
+
name,
|
|
178
|
+
description: options.description,
|
|
179
|
+
transport: options.transport ?? "streamable_http",
|
|
180
|
+
config: { url, authType, headers: authType === "headers" ? headers : undefined },
|
|
181
|
+
});
|
|
182
|
+
if (isJSON(options)) {
|
|
183
|
+
writeJSON(connection);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
process.stderr.write(`Connected ${connection.name} to ${company.slug}.\n`);
|
|
187
|
+
process.stderr.write(`Its tools are named ${connection.prefix}__<tool>.\n`);
|
|
188
|
+
if (connection.config.authType === "oauth") {
|
|
189
|
+
process.stderr.write(`\nIt is not signed in yet. Run: heyditto mcp connect ${connection.name} --org ${company.slug}\n`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
export async function cmdMCPConnect(server, options) {
|
|
193
|
+
const company = await requireOrg(options);
|
|
194
|
+
const { servers } = await listMCPConnections(company.id);
|
|
195
|
+
const connection = findConnection(servers, server);
|
|
196
|
+
const url = await startMCPOAuth(connection.id);
|
|
197
|
+
if (!url)
|
|
198
|
+
throw new Error("the server did not return an authorization URL");
|
|
199
|
+
if (isJSON(options)) {
|
|
200
|
+
writeJSON({ authorizationUrl: url });
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
process.stderr.write(`Open this to sign in to ${connection.name}:\n\n ${url}\n\n`);
|
|
204
|
+
if (!options.noBrowser)
|
|
205
|
+
openInBrowser(url);
|
|
206
|
+
// Deliberately not polling. The authorization completes in a browser that may
|
|
207
|
+
// not be on this machine, and a CLI that sits there spinning is worse than
|
|
208
|
+
// one that tells you how to check.
|
|
209
|
+
process.stderr.write(`When you have finished, check it with: heyditto mcp list --org ${company.slug}\n`);
|
|
210
|
+
}
|
|
211
|
+
export async function cmdMCPRemove(server, options) {
|
|
212
|
+
const company = await requireOrg(options);
|
|
213
|
+
const { servers } = await listMCPConnections(company.id);
|
|
214
|
+
const connection = findConnection(servers, server);
|
|
215
|
+
await deleteMCPConnection(company.id, connection.id);
|
|
216
|
+
if (isJSON(options)) {
|
|
217
|
+
writeJSON({ removed: connection.id });
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
process.stderr.write(`Removed ${connection.name} from ${company.slug}. ` +
|
|
221
|
+
"Endpoints that selected its tools keep the selection and stop being able to call them.\n");
|
|
222
|
+
}
|
|
223
|
+
export async function cmdMCPEnable(server, options) {
|
|
224
|
+
const company = await requireOrg(options);
|
|
225
|
+
const { servers } = await listMCPConnections(company.id);
|
|
226
|
+
const connection = findConnection(servers, server);
|
|
227
|
+
const updated = await updateMCPConnection(company.id, connection.id, {
|
|
228
|
+
enabled: options.enable,
|
|
229
|
+
});
|
|
230
|
+
if (isJSON(options)) {
|
|
231
|
+
writeJSON(updated);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
process.stderr.write(`${updated.name} is now ${updated.enabled ? "enabled" : "paused"}.\n`);
|
|
235
|
+
}
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
// mcp tools
|
|
238
|
+
// ---------------------------------------------------------------------------
|
|
239
|
+
function toolFlags(tool, selected) {
|
|
240
|
+
const flags = [];
|
|
241
|
+
if (selected.has(tool.name))
|
|
242
|
+
flags.push("selected");
|
|
243
|
+
if (tool.requiresApproval)
|
|
244
|
+
flags.push("needs approval");
|
|
245
|
+
if (tool.enabled === false)
|
|
246
|
+
flags.push("unavailable");
|
|
247
|
+
return flags.join(", ");
|
|
248
|
+
}
|
|
249
|
+
export async function cmdMCPTools(endpoint, options) {
|
|
250
|
+
const catalog = await listEndpointTools(endpoint);
|
|
251
|
+
if (isJSON(options)) {
|
|
252
|
+
writeJSON(catalog);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const selected = new Set(catalog.selected);
|
|
256
|
+
const tools = options.all ? catalog.tools : catalog.tools.filter((t) => selected.has(t.name));
|
|
257
|
+
if (tools.length === 0) {
|
|
258
|
+
process.stdout.write(options.all
|
|
259
|
+
? "This endpoint can reach no tools.\n"
|
|
260
|
+
: "This endpoint has no tools selected. Pass --all to see what it could reach.\n");
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
printTable(["TOOL", "FROM", "FLAGS"], tools.map((t) => [t.name, t.group ?? "", toolFlags(t, selected)]));
|
|
264
|
+
process.stderr.write(`\nApprovals: ${catalog.toolApprovalMode}` +
|
|
265
|
+
(catalog.autoApproveTools.length > 0
|
|
266
|
+
? ` (running without asking: ${catalog.autoApproveTools.join(", ")})`
|
|
267
|
+
: "") +
|
|
268
|
+
"\n");
|
|
269
|
+
}
|
|
270
|
+
// ---------------------------------------------------------------------------
|
|
271
|
+
// approvals
|
|
272
|
+
// ---------------------------------------------------------------------------
|
|
273
|
+
function approvalLabel(approval) {
|
|
274
|
+
return approval.toolTitle || approval.toolName;
|
|
275
|
+
}
|
|
276
|
+
function tierSourceNote(source) {
|
|
277
|
+
switch (source) {
|
|
278
|
+
case "annotations":
|
|
279
|
+
return "server-declared";
|
|
280
|
+
case "catalog":
|
|
281
|
+
return "Ditto tool";
|
|
282
|
+
default:
|
|
283
|
+
return "name heuristic";
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
export async function cmdApprovals(options) {
|
|
287
|
+
const company = await resolveScope(options);
|
|
288
|
+
const { approvals, canDecide } = await listToolApprovals({
|
|
289
|
+
companyId: company?.id,
|
|
290
|
+
endpointId: options.endpoint,
|
|
291
|
+
});
|
|
292
|
+
if (isJSON(options)) {
|
|
293
|
+
writeJSON({ approvals, canDecide });
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
if (approvals.length === 0) {
|
|
297
|
+
process.stdout.write("Nothing waiting.\n");
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
printTable(["ID", "TOOL", "WHY", "REQUEST", "CALL"], approvals.map((a) => [
|
|
301
|
+
a.id,
|
|
302
|
+
approvalLabel(a),
|
|
303
|
+
tierSourceNote(a.tierSource),
|
|
304
|
+
a.requestId,
|
|
305
|
+
a.summary || a.toolName,
|
|
306
|
+
]));
|
|
307
|
+
// The single most important thing to say here, because it is the reading
|
|
308
|
+
// people reach for and it is wrong.
|
|
309
|
+
process.stderr.write("\nNone of these has run. Allowing one runs that tool on its own — it does not\n" +
|
|
310
|
+
"resume the run that parked it, which has already finished.\n");
|
|
311
|
+
if (!canDecide) {
|
|
312
|
+
// Reading this queue is wider than deciding it. Say so here rather than
|
|
313
|
+
// letting the next command answer 404.
|
|
314
|
+
process.stderr.write("\nYou can see these but not decide them — that needs the owner or admin role\n" +
|
|
315
|
+
"in the organization that owns this endpoint.\n");
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
process.stderr.write("\n heyditto approvals allow <id>\n heyditto approvals deny <id>\n" +
|
|
319
|
+
" heyditto approvals allow --request <request-id> (everything one script held)\n");
|
|
320
|
+
}
|
|
321
|
+
async function decide(ids, allow, options) {
|
|
322
|
+
const decided = [];
|
|
323
|
+
for (const id of ids) {
|
|
324
|
+
// Sequential, not parallel: each of these has a side effect on someone
|
|
325
|
+
// else's system, and a half-applied batch is easier to reason about when
|
|
326
|
+
// the order is the order you asked for.
|
|
327
|
+
decided.push(allow ? await approveToolApproval(id) : await rejectToolApproval(id));
|
|
328
|
+
}
|
|
329
|
+
if (isJSON(options))
|
|
330
|
+
writeJSON({ approvals: decided });
|
|
331
|
+
return decided;
|
|
332
|
+
}
|
|
333
|
+
async function resolveIDs(id, options) {
|
|
334
|
+
if (id)
|
|
335
|
+
return [id];
|
|
336
|
+
if (!options.request) {
|
|
337
|
+
throw new Error("pass an approval id, or --request <request-id> to decide a whole request");
|
|
338
|
+
}
|
|
339
|
+
const company = await resolveScope(options);
|
|
340
|
+
const { approvals } = await listToolApprovals({
|
|
341
|
+
companyId: company?.id,
|
|
342
|
+
endpointId: options.endpoint,
|
|
343
|
+
});
|
|
344
|
+
const group = approvals.filter((a) => a.requestId === options.request);
|
|
345
|
+
if (group.length === 0)
|
|
346
|
+
throw new Error(`no pending approvals for request "${options.request}"`);
|
|
347
|
+
return group.sort((a, b) => a.seq - b.seq).map((a) => a.id);
|
|
348
|
+
}
|
|
349
|
+
export async function cmdApprovalAllow(id, options) {
|
|
350
|
+
const ids = await resolveIDs(id, options);
|
|
351
|
+
const decided = await decide(ids, true, options);
|
|
352
|
+
if (isJSON(options))
|
|
353
|
+
return;
|
|
354
|
+
for (const approval of decided) {
|
|
355
|
+
if (approval.status === "failed") {
|
|
356
|
+
process.stderr.write(`${approvalLabel(approval)} failed: ${approval.error || "no reason given"}\n`);
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
process.stderr.write(`${approvalLabel(approval)} ran.\n`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
export async function cmdApprovalDeny(id, options) {
|
|
363
|
+
const ids = await resolveIDs(id, options);
|
|
364
|
+
const decided = await decide(ids, false, options);
|
|
365
|
+
if (isJSON(options))
|
|
366
|
+
return;
|
|
367
|
+
for (const approval of decided) {
|
|
368
|
+
process.stderr.write(`${approvalLabel(approval)} was not run.\n`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
// ---------------------------------------------------------------------------
|
|
372
|
+
// registration
|
|
373
|
+
// ---------------------------------------------------------------------------
|
|
374
|
+
export function registerOrgCommands(program, addExamples, outputOption, orgOption) {
|
|
375
|
+
const orgs = program
|
|
376
|
+
.command("orgs")
|
|
377
|
+
.description("organizations you belong to, and which one commands act on")
|
|
378
|
+
.summary("organizations");
|
|
379
|
+
addExamples(orgs
|
|
380
|
+
.command("list", { isDefault: true })
|
|
381
|
+
.description("list your organizations (* = the one commands use by default)")
|
|
382
|
+
.addOption(outputOption())
|
|
383
|
+
.action(cmdOrgs), ` heyditto orgs
|
|
384
|
+
heyditto orgs --output json`);
|
|
385
|
+
orgs
|
|
386
|
+
.command("use")
|
|
387
|
+
.description("act on this organization when --org is omitted")
|
|
388
|
+
.argument("<org>", "organization slug or id")
|
|
389
|
+
.addOption(outputOption())
|
|
390
|
+
.action(cmdOrgUse);
|
|
391
|
+
orgs
|
|
392
|
+
.command("clear")
|
|
393
|
+
.description("forget the default organization")
|
|
394
|
+
.addOption(outputOption())
|
|
395
|
+
.action(cmdOrgClear);
|
|
396
|
+
const mcp = program
|
|
397
|
+
.command("mcp")
|
|
398
|
+
.description("tool servers (MCP) an organization owns")
|
|
399
|
+
.summary("organization tool servers")
|
|
400
|
+
.showHelpAfterError()
|
|
401
|
+
.addHelpText("after", `
|
|
402
|
+
A connection belongs to the organization, not to you: managers administer it
|
|
403
|
+
and the organization's endpoints execute its tools. Personal connections live
|
|
404
|
+
in the Ditto app under Settings -> Agent tools.
|
|
405
|
+
|
|
406
|
+
Anything a server marks as destructive is held for an owner or admin instead of
|
|
407
|
+
running. See \`heyditto approvals\`.`);
|
|
408
|
+
addExamples(mcp
|
|
409
|
+
.command("list", { isDefault: true })
|
|
410
|
+
.description("list the organization's tool servers")
|
|
411
|
+
.addOption(orgOption())
|
|
412
|
+
.addOption(outputOption())
|
|
413
|
+
.action(cmdMCPList), ` heyditto mcp --org omni-aura
|
|
414
|
+
heyditto orgs use omni-aura && heyditto mcp`);
|
|
415
|
+
addExamples(mcp
|
|
416
|
+
.command("add")
|
|
417
|
+
.description("connect a tool server to the organization")
|
|
418
|
+
.argument("<name>", "what the team will call it")
|
|
419
|
+
.argument("<url>", "the server's MCP endpoint (https)")
|
|
420
|
+
.option("--transport <transport>", "streamable_http (default) or sse")
|
|
421
|
+
.option("--auth <type>", "oauth (default) or headers")
|
|
422
|
+
.option("--header <header...>", 'for --auth headers: "Name: value", or "Name: -" to read the value from stdin')
|
|
423
|
+
.option("--description <text>", "why the team has this connected")
|
|
424
|
+
.addOption(orgOption())
|
|
425
|
+
.addOption(outputOption())
|
|
426
|
+
.action(cmdMCPAdd), ` heyditto mcp add Linear https://mcp.linear.app/mcp --org omni-aura
|
|
427
|
+
# "-" reads the secret from stdin, keeping it out of shell history and out of
|
|
428
|
+
# the process table. Prefer it for anything bearer-shaped.
|
|
429
|
+
printf %s "$TOKEN" | heyditto mcp add Internal https://tools.internal/mcp --auth headers --header "Authorization: -"`);
|
|
430
|
+
addExamples(mcp
|
|
431
|
+
.command("connect")
|
|
432
|
+
.description("sign in to an OAuth tool server (prints and opens the URL)")
|
|
433
|
+
.argument("<server>", "connection name, prefix or id")
|
|
434
|
+
.option("--no-browser", "print the URL without opening it")
|
|
435
|
+
.addOption(orgOption())
|
|
436
|
+
.addOption(outputOption())
|
|
437
|
+
.action(cmdMCPConnect), ` heyditto mcp connect Linear --org omni-aura
|
|
438
|
+
heyditto mcp connect Linear --no-browser`);
|
|
439
|
+
mcp
|
|
440
|
+
.command("remove")
|
|
441
|
+
.description("remove a tool server from the organization")
|
|
442
|
+
.argument("<server>", "connection name, prefix or id")
|
|
443
|
+
.addOption(orgOption())
|
|
444
|
+
.addOption(outputOption())
|
|
445
|
+
.action(cmdMCPRemove);
|
|
446
|
+
mcp
|
|
447
|
+
.command("enable")
|
|
448
|
+
.description("let the organization's endpoints use this connection again")
|
|
449
|
+
.argument("<server>", "connection name, prefix or id")
|
|
450
|
+
.addOption(orgOption())
|
|
451
|
+
.addOption(outputOption())
|
|
452
|
+
.action((server, options) => cmdMCPEnable(server, { ...options, enable: true }));
|
|
453
|
+
mcp
|
|
454
|
+
.command("disable")
|
|
455
|
+
.description("stop the organization's endpoints using this connection")
|
|
456
|
+
.argument("<server>", "connection name, prefix or id")
|
|
457
|
+
.addOption(orgOption())
|
|
458
|
+
.addOption(outputOption())
|
|
459
|
+
.action((server, options) => cmdMCPEnable(server, { ...options, enable: false }));
|
|
460
|
+
addExamples(mcp
|
|
461
|
+
.command("tools")
|
|
462
|
+
.description("what one endpoint can call, resolved from the endpoint")
|
|
463
|
+
.argument("<endpoint>", "endpoint id")
|
|
464
|
+
.option("--all", "include tools the endpoint could reach but has not selected")
|
|
465
|
+
.addOption(orgOption())
|
|
466
|
+
.addOption(outputOption())
|
|
467
|
+
.action(cmdMCPTools), ` heyditto mcp tools 0f1e2d3c-...
|
|
468
|
+
heyditto mcp tools 0f1e2d3c-... --all --output json`);
|
|
469
|
+
const approvals = program
|
|
470
|
+
.command("approvals")
|
|
471
|
+
.description("tool calls held for a human")
|
|
472
|
+
.summary("tool approvals")
|
|
473
|
+
.showHelpAfterError()
|
|
474
|
+
.addHelpText("after", `
|
|
475
|
+
Nothing in this queue has run. A tool that can change or delete something was
|
|
476
|
+
called through an endpoint and held; the caller was told the call was queued and
|
|
477
|
+
carried on without it.
|
|
478
|
+
|
|
479
|
+
Allowing one runs that tool on its own. It does NOT resume the run that parked
|
|
480
|
+
it — that request has already finished, and on a Code Mode endpoint so has the
|
|
481
|
+
sandboxed script that made the call.`);
|
|
482
|
+
addExamples(approvals
|
|
483
|
+
.command("list", { isDefault: true })
|
|
484
|
+
.description("list held calls")
|
|
485
|
+
.option("--endpoint <id>", "only this endpoint's")
|
|
486
|
+
.addOption(orgOption())
|
|
487
|
+
.addOption(outputOption())
|
|
488
|
+
.action(cmdApprovals), ` heyditto approvals
|
|
489
|
+
heyditto approvals --org omni-aura
|
|
490
|
+
heyditto approvals --endpoint 0f1e2d3c-... --output json`);
|
|
491
|
+
addExamples(approvals
|
|
492
|
+
.command("allow")
|
|
493
|
+
.description("run one held call now")
|
|
494
|
+
.argument("[id]", "approval id")
|
|
495
|
+
.option("--request <id>", "allow every call one request held")
|
|
496
|
+
.option("--endpoint <id>", "scope --request to one endpoint")
|
|
497
|
+
.addOption(orgOption())
|
|
498
|
+
.addOption(outputOption())
|
|
499
|
+
.action(cmdApprovalAllow), ` heyditto approvals allow 6f0c...
|
|
500
|
+
heyditto approvals allow --request req-1 --org omni-aura`);
|
|
501
|
+
approvals
|
|
502
|
+
.command("deny")
|
|
503
|
+
.description("refuse a held call; the tool never runs")
|
|
504
|
+
.argument("[id]", "approval id")
|
|
505
|
+
.option("--request <id>", "deny every call one request held")
|
|
506
|
+
.option("--endpoint <id>", "scope --request to one endpoint")
|
|
507
|
+
.addOption(orgOption())
|
|
508
|
+
.addOption(outputOption())
|
|
509
|
+
.action(cmdApprovalDeny);
|
|
510
|
+
}
|
|
511
|
+
//# sourceMappingURL=org-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org-commands.js","sourceRoot":"","sources":["../src/org-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Attachment } from "./protocol.js";
|
|
2
|
+
/** Repo-relative directory attachments land in, one folder per turn. */
|
|
3
|
+
export declare const ATTACHMENTS_DIR: string;
|
|
4
|
+
/** A file name that cannot escape the turn's folder or hide as a dotfile. */
|
|
5
|
+
export declare function safeAttachmentName(name: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Keeps `.tmp/` out of `git status` without touching the repository's
|
|
8
|
+
* `.gitignore`: the exclude goes into `.git/info/exclude` (per-clone, never
|
|
9
|
+
* committed). No-op outside a repository or when `.tmp` is already ignored.
|
|
10
|
+
*/
|
|
11
|
+
export declare function ensureTmpExcluded(cwd: string): Promise<boolean>;
|
|
12
|
+
export interface DownloadedAttachment {
|
|
13
|
+
attachment: Attachment;
|
|
14
|
+
/** Absolute path on disk. */
|
|
15
|
+
absPath: string;
|
|
16
|
+
/** Path relative to the session cwd, forward slashes. */
|
|
17
|
+
relPath: string;
|
|
18
|
+
}
|
|
19
|
+
/** Downloads a turn's attachments into `<cwd>/.tmp/ditto/attachments/<turnId>/`, verifying size and sha256. */
|
|
20
|
+
export declare function downloadAttachments(cwd: string, turnId: string, attachments: Attachment[] | undefined, fetchImpl?: (url: string, size: number) => Promise<Buffer>): Promise<DownloadedAttachment[]>;
|
|
21
|
+
/** The prompt handed to the harness: the user's text plus the attachment paths it can open. */
|
|
22
|
+
export declare function buildPrompt(text: string, downloaded: DownloadedAttachment[]): string;
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/remote/attachments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Harness } from "../agents/types.js";
|
|
2
|
+
import type { CommandEntry } from "./protocol.js";
|
|
3
|
+
/** `key: value` lines between the leading `---` fences; enough for command and skill files. */
|
|
4
|
+
export declare function parseFrontmatter(text: string): {
|
|
5
|
+
fields: Record<string, string>;
|
|
6
|
+
body: string;
|
|
7
|
+
};
|
|
8
|
+
/** Directories whose contents feed the catalog; watched for changes. */
|
|
9
|
+
export declare function catalogDirs(harness: Harness, cwd: string): string[];
|
|
10
|
+
export declare function discoverCommands(harness: Harness, cwd: string): Promise<CommandEntry[]>;
|
|
11
|
+
/** The text typed into the harness for a catalog command. */
|
|
12
|
+
export declare function commandInvocation(harness: Harness, entry: CommandEntry | undefined, name: string, args?: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Re-runs discovery when any catalog directory changes (debounced). Node's
|
|
15
|
+
* recursive watch is unsupported on some platforms; those fall back to a
|
|
16
|
+
* shallow watch, which still catches new command files and skill folders.
|
|
17
|
+
*/
|
|
18
|
+
export declare function watchCatalog(harness: Harness, cwd: string, onChange: () => void, debounceMs?: number): () => void;
|