@heyditto/cli 2.9.1 → 2.10.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.
@@ -0,0 +1,485 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { Option } from "commander";
4
+ import { apiBase, attachAppEndpoint, createApp, detachAppEndpoint, findApp, getConsentProfile, getEndpoint, listAppEndpoints, listApps, listReceipts, rotateAppSecret, setAppEndpointBilling, updateApp, uploadAppIcon, verifyCallbackOrigin, } from "./api.js";
5
+ import { confirmTyped, isJSON, printTable, shorthandsOf } from "./commands.js";
6
+ import { STORE_IDS, VERCEL_TARGETS, deliver, selectStore } from "./secret-stores/index.js";
7
+ /**
8
+ * Developer apps from the shell — everything the developer console does for
9
+ * "Sign in with Ditto" and app-owned Router endpoints, so an agent can set an
10
+ * app up end to end without a browser:
11
+ *
12
+ * heyditto apps create "DittoBench"
13
+ * heyditto apps origins verify dittobench-3f9a https://dittobench.ai (then --confirm)
14
+ * heyditto apps consent set dittobench-3f9a credits:spend "Pays for the inference your miner uses."
15
+ * heyditto apps secret rotate dittobench-3f9a --gh-secret DITTO_OIDC_CLIENT_SECRET --repo ditto-assistant/ditto-subnet
16
+ * heyditto apps oidc dittobench-3f9a --output env
17
+ * heyditto apps endpoints attach dittobench-3f9a screener --billing user
18
+ *
19
+ * The client secret follows the same rule as endpoint keys: it is forwarded
20
+ * straight into a secret store over the store CLI's stdin and never printed.
21
+ */
22
+ const ADVERTISED_SCOPES = [
23
+ "openid",
24
+ "email",
25
+ "profile",
26
+ "credits:spend",
27
+ "memory:read",
28
+ "memory:write",
29
+ "memory:delete",
30
+ "memory:publish",
31
+ "offline_access",
32
+ "mcp:read",
33
+ "mcp:write",
34
+ ];
35
+ function writeJSON(value) {
36
+ process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
37
+ }
38
+ function appRow(app) {
39
+ return [app.appID, app.name, app.enabled ? (app.archived ? "archived" : "enabled") : "disabled", app.createdAt.slice(0, 10)];
40
+ }
41
+ /** OIDC/OAuth values a relying app needs; none of them are secret. */
42
+ export function oidcConfig(app, base = apiBase()) {
43
+ return {
44
+ DITTO_OIDC_ISSUER: base,
45
+ DITTO_OIDC_CLIENT_ID: app.appID,
46
+ DITTO_OIDC_AUTHORIZATION_ENDPOINT: `${base}/authorize`,
47
+ DITTO_OIDC_TOKEN_ENDPOINT: `${base}/token`,
48
+ DITTO_OIDC_USERINFO_ENDPOINT: `${base}/userinfo`,
49
+ DITTO_OIDC_JWKS_URI: `${base}/.well-known/jwks.json`,
50
+ DITTO_OIDC_DISCOVERY: `${base}/.well-known/openid-configuration`,
51
+ DITTO_INFERENCE_BASE_URL: "",
52
+ };
53
+ }
54
+ /** Renders {KEY: value} as KEY=value lines (values quoted only when needed). */
55
+ export function envLines(values) {
56
+ return Object.entries(values)
57
+ .filter(([, v]) => v !== "")
58
+ .map(([k, v]) => `${k}=${/[\s#"'\\]/.test(v) ? JSON.stringify(v) : v}`)
59
+ .join("\n");
60
+ }
61
+ function requireEnabledScope(scope) {
62
+ const s = scope.trim();
63
+ if (!ADVERTISED_SCOPES.includes(s)) {
64
+ throw new Error(`unknown scope "${scope}". Known scopes: ${ADVERTISED_SCOPES.join(", ")}`);
65
+ }
66
+ return s;
67
+ }
68
+ /** Select the store, preflight its CLI and resolve the target — nothing is minted yet. */
69
+ function prepareSecretStore(options, defaultName) {
70
+ const { store, name: secretName } = selectStore({ ...options, secret: options.secret ?? defaultName, shorthands: shorthandsOf(options) });
71
+ store.preflight();
72
+ const target = store.resolveTarget(options);
73
+ return { store, secretName, target };
74
+ }
75
+ /** Forward a secret into a prepared store over stdin; never argv, never stdout. */
76
+ function deliverPrepared(prepared, plaintext, what) {
77
+ const { store, secretName, target } = prepared;
78
+ deliver(store, secretName, store.deliveries(secretName, target), plaintext);
79
+ process.stderr.write(`Stored ${what} as ${secretName} in ${target.describe}.\n`);
80
+ return { secretName, describe: target.describe };
81
+ }
82
+ function hasStoreFlag(options) {
83
+ return Boolean(options.store || options.secret || Object.values(shorthandsOf(options)).some(Boolean));
84
+ }
85
+ function addStoreOptions(command, defaultSecret) {
86
+ return command
87
+ .addOption(new Option("--store <destination>", `where the secret goes (default secret name ${defaultSecret})`).choices([...STORE_IDS]))
88
+ .option("--secret <NAME>", "name of the secret, variable, item or path to store (with --store)")
89
+ .option("--gh-secret <NAME>", "shorthand for --store github --secret NAME")
90
+ .option("--gitlab-var <NAME>", "shorthand for --store gitlab --secret NAME")
91
+ .option("--aws-secret <NAME>", "shorthand for --store aws --secret NAME")
92
+ .option("--gcp-secret <NAME>", "shorthand for --store gcloud --secret NAME")
93
+ .option("--az-secret <NAME>", "shorthand for --store azure --secret NAME")
94
+ .option("--op-item <TITLE>", "shorthand for --store 1password --secret TITLE")
95
+ .option("--vault-secret <PATH>", "shorthand for --store vault --secret PATH")
96
+ .option("--doppler-secret <NAME>", "shorthand for --store doppler --secret NAME")
97
+ .option("--cf-secret <NAME>", "shorthand for --store cloudflare --secret NAME")
98
+ .option("--vercel-env <NAME>", "shorthand for --store vercel --secret NAME")
99
+ .option("--k8s-secret <NAME>", "shorthand for --store kubernetes --secret NAME")
100
+ .option("--fly-secret <NAME>", "shorthand for --store fly --secret NAME")
101
+ .option("--repo <owner/repo>", "github: repository for the secret (default: the repo of the current directory)")
102
+ .option("--env <environment>", "github: deployment environment; gitlab: variable environment scope")
103
+ .option("--org <org>", "github: organization secret; gitlab: group variable")
104
+ .option("--region <region>", "aws: region")
105
+ .option("--project <project>", "gitlab, gcloud, doppler: project")
106
+ .option("--key-vault <name>", "azure: Key Vault the secret goes into")
107
+ .option("--op-vault <name>", "1password: vault for the item")
108
+ .option("--mount <mount>", "vault: kv mount")
109
+ .option("--field <field>", "vault: field at the path")
110
+ .option("--doppler-config <config>", "doppler: config within the project")
111
+ .option("--worker <name>", "cloudflare: Worker name")
112
+ .addOption(new Option("--vercel-target <target>", "vercel: environment").choices([...VERCEL_TARGETS]))
113
+ .option("--namespace <namespace>", "kubernetes: namespace")
114
+ .option("--k8s-key <key>", "kubernetes: key within the secret")
115
+ .option("--app <app>", "fly: app name");
116
+ }
117
+ // ---------------------------------------------------------------------------
118
+ export async function cmdAppsList(options) {
119
+ const apps = await listApps(options.company);
120
+ if (isJSON(options))
121
+ return writeJSON({ apps });
122
+ if (apps.length === 0) {
123
+ process.stdout.write("No apps yet. Create one: heyditto apps create \"My App\"\n");
124
+ return;
125
+ }
126
+ printTable(["APP ID", "NAME", "STATE", "CREATED"], apps.map(appRow));
127
+ }
128
+ export async function cmdAppsCreate(name, options) {
129
+ // Everything that can fail cheaply happens before the app exists: the
130
+ // platform CLI is present and signed in and its target resolves. Otherwise
131
+ // a typo in --repo would create the app and lose its only secret.
132
+ const prepared = hasStoreFlag(options) ? prepareSecretStore(options, "DITTO_OIDC_CLIENT_SECRET") : undefined;
133
+ const app = await createApp(name.trim(), options.company);
134
+ const { appSecret, ...safe } = app;
135
+ let stored;
136
+ if (appSecret && prepared) {
137
+ try {
138
+ stored = deliverPrepared(prepared, appSecret, "the app secret");
139
+ }
140
+ catch (err) {
141
+ const reason = err instanceof Error ? err.message : String(err);
142
+ throw new Error(`${reason}\nApp ${app.appID} was created but its secret could NOT be stored and is not recoverable. Rotate it into a store: heyditto apps secret rotate ${app.appID} --gh-secret ${prepared.secretName} --repo <owner/repo>`);
143
+ }
144
+ }
145
+ if (isJSON(options))
146
+ return writeJSON({ app: safe, secretStored: stored ?? null, oidc: oidcConfig(app) });
147
+ process.stdout.write(`Created app ${app.appID} ("${app.name}").\n`);
148
+ process.stdout.write(`${envLines(oidcConfig(app))}\n`);
149
+ if (appSecret && !stored) {
150
+ process.stderr.write("The app secret was minted but NOT shown. Store it somewhere your server can read it:\n" +
151
+ ` heyditto apps secret rotate ${app.appID} --gh-secret DITTO_OIDC_CLIENT_SECRET --repo <owner/repo>\n` +
152
+ "(rotating mints a fresh secret and forwards it straight into the store).\n");
153
+ }
154
+ }
155
+ export async function cmdAppsShow(ref, options) {
156
+ const app = await findApp(ref, options.company);
157
+ const [{ endpoints, baseUrl, onBehalfOfHeader }, profile] = await Promise.all([
158
+ listAppEndpoints(app.appID),
159
+ getConsentProfile(app.appID).catch(() => undefined),
160
+ ]);
161
+ if (isJSON(options))
162
+ return writeJSON({ app, endpoints, baseUrl, onBehalfOfHeader, consentProfile: profile ?? null, oidc: oidcConfig(app) });
163
+ process.stdout.write(`${app.name} (${app.appID}) — ${app.enabled ? "enabled" : "disabled"}${app.archived ? ", archived" : ""}\n`);
164
+ if (app.metadata?.description)
165
+ process.stdout.write(` ${app.metadata.description}\n`);
166
+ if (profile?.iconUrl)
167
+ process.stdout.write(` icon: ${profile.iconUrl}\n`);
168
+ const origins = profile?.callbackOrigins ?? [];
169
+ process.stdout.write(` verified callback origins: ${origins.length ? origins.join(", ") : "(none — run: heyditto apps origins verify)"}\n`);
170
+ const rationale = app.consentRationale ?? profile?.rationale ?? {};
171
+ process.stdout.write(` consent rationale: ${Object.keys(rationale).length ? "" : "(none)"}\n`);
172
+ for (const [scope, why] of Object.entries(rationale))
173
+ process.stdout.write(` ${scope}: ${why}\n`);
174
+ process.stdout.write(` endpoints (${endpoints.length}):${endpoints.length ? "" : " (none — run: heyditto apps endpoints attach)"}\n`);
175
+ for (const e of endpoints)
176
+ process.stdout.write(` ${e.slug} ${e.model} billing=${e.appBilling} ${baseUrl}\n`);
177
+ if (endpoints.length)
178
+ process.stdout.write(` server-to-server: send ${onBehalfOfHeader}: <ditto uid> with an owner-minted key on the endpoint\n`);
179
+ }
180
+ export async function cmdAppsUpdate(ref, options) {
181
+ const app = await findApp(ref, options.company);
182
+ const patch = {};
183
+ if (options.name !== undefined)
184
+ patch.name = options.name;
185
+ if (options.description !== undefined)
186
+ patch.description = options.description;
187
+ if (options.landingUrl !== undefined)
188
+ patch.landingURL = options.landingUrl;
189
+ if (options.appUrl !== undefined)
190
+ patch.appURL = options.appUrl;
191
+ if (options.enable)
192
+ patch.enabled = true;
193
+ if (options.disable)
194
+ patch.enabled = false;
195
+ if (options.archive)
196
+ patch.archived = true;
197
+ if (options.restore)
198
+ patch.archived = false;
199
+ if (Object.keys(patch).length === 0)
200
+ throw new Error("nothing to change; pass --name, --description, --landing-url, --app-url, --enable, --disable, --archive or --restore");
201
+ const updated = await updateApp(app.appID, patch);
202
+ if (isJSON(options))
203
+ return writeJSON({ app: updated });
204
+ process.stdout.write(`Updated ${updated.appID}.\n`);
205
+ }
206
+ export async function cmdAppsConsentShow(ref, options) {
207
+ const app = await findApp(ref, options.company);
208
+ const profile = await getConsentProfile(app.appID);
209
+ if (isJSON(options))
210
+ return writeJSON({ consentProfile: profile });
211
+ process.stdout.write(`Consent screen for ${profile.name} (${profile.appID})\n`);
212
+ if (profile.iconUrl)
213
+ process.stdout.write(` icon: ${profile.iconUrl}\n`);
214
+ if (profile.ownerName)
215
+ process.stdout.write(` by: ${profile.ownerName}\n`);
216
+ const entries = Object.entries(profile.rationale);
217
+ process.stdout.write(` rationale:${entries.length ? "" : " (none — the default scope wording is shown)"}\n`);
218
+ for (const [scope, why] of entries)
219
+ process.stdout.write(` ${scope}: ${why}\n`);
220
+ }
221
+ export async function cmdAppsConsentSet(ref, scope, why, options) {
222
+ const app = await findApp(ref, options.company);
223
+ const key = requireEnabledScope(scope);
224
+ const current = { ...(app.consentRationale ?? {}) };
225
+ if (options.clear)
226
+ delete current[key];
227
+ else {
228
+ const text = (why ?? "").trim();
229
+ if (!text)
230
+ throw new Error("pass the reason text, or --clear to remove it");
231
+ current[key] = text;
232
+ }
233
+ const updated = await updateApp(app.appID, { consentRationale: current });
234
+ if (isJSON(options))
235
+ return writeJSON({ consentRationale: updated.consentRationale ?? current });
236
+ process.stdout.write(options.clear ? `Cleared the ${key} rationale on ${app.appID}.\n` : `Set the ${key} rationale on ${app.appID}.\n`);
237
+ }
238
+ const ICON_TYPES = { ".png": "image/png", ".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".webp": "image/webp", ".svg": "image/svg+xml" };
239
+ export async function cmdAppsIconSet(ref, file, options) {
240
+ const app = await findApp(ref, options.company);
241
+ const contentType = ICON_TYPES[path.extname(file).toLowerCase()];
242
+ if (!contentType)
243
+ throw new Error(`unsupported icon type "${path.extname(file)}"; use png, jpg, webp or svg`);
244
+ const data = await readFile(file);
245
+ const out = await uploadAppIcon(app.appID, contentType, data.toString("base64"));
246
+ const url = out.iconURL ?? out.iconUrl ?? "";
247
+ if (isJSON(options))
248
+ return writeJSON({ appID: app.appID, iconURL: url });
249
+ process.stdout.write(`Icon uploaded for ${app.appID}${url ? `: ${url}` : ""}\n`);
250
+ }
251
+ export async function cmdAppsOriginsVerify(ref, origin, options) {
252
+ const app = await findApp(ref, options.company);
253
+ const out = await verifyCallbackOrigin(app.appID, origin, Boolean(options.confirm));
254
+ if (isJSON(options))
255
+ return writeJSON(out);
256
+ if (out.verified) {
257
+ process.stdout.write(`Verified ${out.origin}. Callback origins: ${(out.callbackOrigins ?? []).join(", ")}\n`);
258
+ return;
259
+ }
260
+ process.stdout.write(`Challenge for ${out.origin}:\n` +
261
+ ` Serve this token as the plain-text body of ${out.wellKnown}\n` +
262
+ ` token: ${out.token}\n` +
263
+ `Then run: heyditto apps origins verify ${app.appID} ${out.origin} --confirm\n`);
264
+ }
265
+ export async function cmdAppsSecretRotate(ref, options) {
266
+ const app = await findApp(ref, options.company);
267
+ if (!hasStoreFlag(options)) {
268
+ throw new Error("choose where the new secret goes (it is never printed): e.g. --gh-secret DITTO_OIDC_CLIENT_SECRET --repo owner/repo, --gcp-secret NAME, --op-item TITLE …");
269
+ }
270
+ const { store, name: secretName } = selectStore({ ...options, secret: options.secret ?? "DITTO_OIDC_CLIENT_SECRET", shorthands: shorthandsOf(options) });
271
+ store.preflight();
272
+ const target = store.resolveTarget(options);
273
+ await confirmTyped({
274
+ action: `rotate the app secret of ${app.appID} (the current secret stops working) and store it in ${store.label}`,
275
+ expected: secretName,
276
+ label: `the ${store.nameLabel.toLowerCase()}`,
277
+ yes: options.yes,
278
+ preview: `Will mint a new app secret for ${app.appID} and store ${secretName} in ${target.describe}. Your server must switch to it right away.`,
279
+ });
280
+ const rotated = await rotateAppSecret(app.appID);
281
+ const { appSecret, ...safe } = rotated;
282
+ try {
283
+ deliver(store, secretName, store.deliveries(secretName, target), appSecret ?? "");
284
+ }
285
+ catch (err) {
286
+ const reason = err instanceof Error ? err.message : String(err);
287
+ // The backend already replaced the secret; the plaintext is gone with this
288
+ // process. Never print it as a fallback — say what happened and how to recover.
289
+ throw new Error(`${reason}\nThe app secret of ${app.appID} was rotated but could NOT be stored; the previous secret no longer works and the new one is not recoverable. Re-run: heyditto apps secret rotate ${app.appID} --gh-secret ${secretName} --repo <owner/repo>`);
290
+ }
291
+ if (isJSON(options))
292
+ return writeJSON({ ...safe, appID: app.appID, secretStored: { secretName, describe: target.describe } });
293
+ process.stdout.write(`Rotated the app secret of ${app.appID} and stored ${secretName} in ${target.describe}.\n`);
294
+ }
295
+ export async function cmdAppsOidc(ref, options) {
296
+ const app = await findApp(ref, options.company);
297
+ const [{ baseUrl }, profile] = await Promise.all([listAppEndpoints(app.appID), getConsentProfile(app.appID).catch(() => undefined)]);
298
+ const values = oidcConfig(app);
299
+ values.DITTO_INFERENCE_BASE_URL = baseUrl;
300
+ if (options.callback)
301
+ values.DITTO_OIDC_REDIRECT_URI = options.callback;
302
+ const origins = profile?.callbackOrigins ?? [];
303
+ if (options.output === "json")
304
+ return writeJSON({ oidc: values, callbackOrigins: origins, scopes: ["openid", "email", "profile"], spendingScope: "credits:spend" });
305
+ process.stdout.write(`${envLines(values)}\n`);
306
+ process.stderr.write(`# redirect_uri must be on a verified callback origin (${origins.length ? origins.join(", ") : "none yet — heyditto apps origins verify"}).\n` +
307
+ `# client_secret: heyditto apps secret rotate ${app.appID} --gh-secret DITTO_OIDC_CLIENT_SECRET …\n` +
308
+ `# request scope "openid email profile" for sign-in, add "credits:spend" to let users pay for the app's inference.\n`);
309
+ }
310
+ function endpointRow(e) {
311
+ return [e.slug, e.model, e.appBilling, e.status ?? "", e.id];
312
+ }
313
+ export async function cmdAppsEndpointsList(ref, options) {
314
+ const app = await findApp(ref, options.company);
315
+ const { endpoints, baseUrl, onBehalfOfHeader } = await listAppEndpoints(app.appID);
316
+ if (isJSON(options))
317
+ return writeJSON({ appID: app.appID, endpoints, baseUrl, onBehalfOfHeader });
318
+ if (endpoints.length === 0) {
319
+ process.stdout.write(`No endpoints attached to ${app.appID}. Attach one: heyditto apps endpoints attach ${app.appID} <endpoint> --billing user|sponsor\n`);
320
+ return;
321
+ }
322
+ printTable(["SLUG", "MODEL", "BILLING", "STATUS", "ID"], endpoints.map(endpointRow));
323
+ process.stdout.write(`Base URL ${baseUrl}; server-to-server calls send ${onBehalfOfHeader}: <ditto uid>.\n`);
324
+ }
325
+ function parseBilling(raw) {
326
+ const v = (raw ?? "user").trim();
327
+ if (v === "user" || v === "sponsor")
328
+ return v;
329
+ throw new Error(`--billing must be user (the consenting user pays) or sponsor (the endpoint owner pays), got "${raw}"`);
330
+ }
331
+ export async function cmdAppsEndpointsAttach(ref, endpointRef, options) {
332
+ const app = await findApp(ref, options.company);
333
+ const { endpoint } = await getEndpoint(endpointRef);
334
+ const attached = await attachAppEndpoint(app.appID, endpoint.id, parseBilling(options.billing));
335
+ if (isJSON(options))
336
+ return writeJSON({ appID: app.appID, endpoint: attached });
337
+ process.stdout.write(`Attached ${attached.slug} to ${app.appID} (billing=${attached.appBilling}).\n`);
338
+ }
339
+ export async function cmdAppsEndpointsBilling(ref, endpointRef, billing, options) {
340
+ const app = await findApp(ref, options.company);
341
+ const { endpoint } = await getEndpoint(endpointRef);
342
+ const updated = await setAppEndpointBilling(app.appID, endpoint.id, parseBilling(billing));
343
+ if (isJSON(options))
344
+ return writeJSON({ appID: app.appID, endpoint: updated });
345
+ process.stdout.write(`${updated.slug} now bills the ${updated.appBilling === "user" ? "consenting user" : "sponsor"}.\n`);
346
+ }
347
+ export async function cmdAppsEndpointsDetach(ref, endpointRef, options) {
348
+ const app = await findApp(ref, options.company);
349
+ const { endpoint } = await getEndpoint(endpointRef);
350
+ // App users lose this endpoint the moment it is detached; make it deliberate.
351
+ await confirmTyped({
352
+ action: `detach ${endpoint.slug} from ${app.appID} (its app users lose access immediately)`,
353
+ expected: endpoint.slug,
354
+ label: "the endpoint slug",
355
+ yes: options.yes,
356
+ preview: `Will detach ${endpoint.slug} from ${app.appID}. The endpoint and its keys are kept; app users can no longer call it.`,
357
+ });
358
+ await detachAppEndpoint(app.appID, endpoint.id);
359
+ if (isJSON(options))
360
+ return writeJSON({ appID: app.appID, detached: endpoint.id });
361
+ process.stdout.write(`Detached ${endpoint.slug} from ${app.appID}.\n`);
362
+ }
363
+ export async function cmdReceipts(options) {
364
+ const days = options.days ? Number(options.days) : undefined;
365
+ const limit = options.limit ? Number(options.limit) : undefined;
366
+ if (days !== undefined && (!Number.isInteger(days) || days <= 0))
367
+ throw new Error("--days must be a positive integer");
368
+ const out = await listReceipts({ leg: options.leg, app: options.app, days, limit });
369
+ if (isJSON(options))
370
+ return writeJSON(out);
371
+ const usd = (tokens) => `$${(tokens / 1e9).toFixed(4)}`;
372
+ if (out.summary.length) {
373
+ printTable(["LEG", "APP", "CALLS", "DITTO COST"], out.summary.map((s) => [s.leg, s.appName || s.appID || "ditto", String(s.calls), s.leg === "ditto" ? usd(s.dittoTokens) : "—"]));
374
+ process.stdout.write("\n");
375
+ }
376
+ if (out.receipts.length === 0) {
377
+ process.stdout.write("No receipts in this window.\n");
378
+ return;
379
+ }
380
+ printTable(["WHEN", "MODEL", "LEG", "APP", "COST"], out.receipts.map((r) => [r.timestamp.slice(0, 16).replace("T", " "), r.model || r.serviceName || "—", r.leg, r.appID ? `${r.appID}${r.billing === "sponsor" ? " (sponsored)" : ""}` : "", r.leg === "ditto" ? usd(r.dittoTokens) : "—"]));
381
+ }
382
+ export function registerAppCommands(program, addExamples, outputOption) {
383
+ const apps = program.command("apps").description("developer apps: Sign in with Ditto, branded consent and app-owned Router endpoints");
384
+ const companyOption = () => new Option("--company <id>", "developer company (organization) the app belongs to; default: your developer company");
385
+ addExamples(apps.command("list", { isDefault: true }).description("list your developer apps").addOption(companyOption()).addOption(outputOption()).action(cmdAppsList), ` heyditto apps list
386
+ heyditto apps list --company 5f1c… --output json`);
387
+ addExamples(addStoreOptions(apps
388
+ .command("create")
389
+ .description("create an app; forward its client secret straight into a secret store (never printed)")
390
+ .argument("<name>", "display name shown on the consent screen")
391
+ .addOption(companyOption())
392
+ .option("--yes", "skip confirmations")
393
+ .addOption(outputOption()), "DITTO_OIDC_CLIENT_SECRET").action(cmdAppsCreate), ` heyditto apps create "DittoBench" --gh-secret DITTO_OIDC_CLIENT_SECRET --repo ditto-assistant/ditto-subnet
394
+ heyditto apps create "DittoBench" --output json # secret minted but not shown; rotate it into a store later`);
395
+ apps.command("show").description("one app: state, callback origins, consent rationale, attached endpoints").argument("<app>", "app id, slug or name").addOption(companyOption()).addOption(outputOption()).action(cmdAppsShow);
396
+ apps
397
+ .command("update")
398
+ .description("rename, describe, enable/disable or archive an app")
399
+ .argument("<app>", "app id, slug or name")
400
+ .option("--name <name>")
401
+ .option("--description <text>")
402
+ .option("--landing-url <url>")
403
+ .option("--app-url <url>")
404
+ .option("--enable")
405
+ .option("--disable")
406
+ .option("--archive")
407
+ .option("--restore")
408
+ .addOption(companyOption())
409
+ .addOption(outputOption())
410
+ .action(cmdAppsUpdate);
411
+ const consent = apps.command("consent").description("what the consent screen says about this app");
412
+ consent.command("show").description("the public consent profile (name, icon, rationale per scope)").argument("<app>").addOption(companyOption()).addOption(outputOption()).action(cmdAppsConsentShow);
413
+ addExamples(consent
414
+ .command("set")
415
+ .description("set (or --clear) the app's own reason for one requested scope")
416
+ .argument("<app>")
417
+ .argument("<scope>", `one of ${ADVERTISED_SCOPES.join(", ")}`)
418
+ .argument("[why]", "the reason shown under the permission (≤ 280 chars)")
419
+ .option("--clear", "remove the reason for this scope")
420
+ .addOption(companyOption())
421
+ .addOption(outputOption())
422
+ .action(cmdAppsConsentSet), ` heyditto apps consent set dittobench credits:spend "Pays for the inference your miner uses during screening."
423
+ heyditto apps consent set dittobench openid "Links your miner hotkeys to your Ditto account."
424
+ heyditto apps consent set dittobench email --clear`);
425
+ apps.command("icon").description("app icon").command("set").description("upload the icon shown on the consent screen (png, jpg, webp, svg)").argument("<app>").argument("<file>").addOption(companyOption()).addOption(outputOption()).action(cmdAppsIconSet);
426
+ const origins = apps.command("origins").description("verified callback origins (allowed OAuth redirect origins)");
427
+ addExamples(origins
428
+ .command("verify")
429
+ .description("request a challenge for an https origin, then --confirm once it is served")
430
+ .argument("<app>")
431
+ .argument("<origin>", "https origin, e.g. https://dittobench.ai")
432
+ .option("--confirm", "verify a previously requested challenge")
433
+ .addOption(companyOption())
434
+ .addOption(outputOption())
435
+ .action(cmdAppsOriginsVerify), ` heyditto apps origins verify dittobench https://dittobench.ai # prints the token to serve
436
+ heyditto apps origins verify dittobench https://dittobench.ai --confirm # checks /.well-known/ditto-callback-challenge`);
437
+ const secret = apps.command("secret").description("the app's client secret (signs consent callbacks; OIDC client_secret)");
438
+ addExamples(addStoreOptions(secret.command("rotate").description("mint a new secret and store it straight into a secret store (never printed)").argument("<app>").addOption(companyOption()).option("--yes", "skip the confirmation prompt").addOption(outputOption()), "DITTO_OIDC_CLIENT_SECRET").action(cmdAppsSecretRotate), ` heyditto apps secret rotate dittobench --gh-secret DITTO_OIDC_CLIENT_SECRET --repo ditto-assistant/ditto-subnet
439
+ heyditto apps secret rotate dittobench --gcp-secret dittobench-oidc-client-secret --project ditto-platform
440
+ heyditto apps secret rotate dittobench --op-item "DittoBench OIDC" --op-vault Engineering`);
441
+ addExamples(apps
442
+ .command("oidc")
443
+ .description("the non-secret OIDC configuration a relying app needs (issuer, endpoints, client_id) as env lines or JSON")
444
+ .argument("<app>")
445
+ .option("--callback <url>", "include the redirect URI your app uses")
446
+ .addOption(companyOption())
447
+ .addOption(outputOption())
448
+ .action(cmdAppsOidc), ` heyditto apps oidc dittobench --callback https://dittobench.ai/auth/ditto/callback >> .env
449
+ heyditto apps oidc dittobench --output json`);
450
+ const endpoints = apps.command("endpoints").description("Router endpoints this app owns (its users get inference, never keys)");
451
+ endpoints.command("list", { isDefault: true }).argument("<app>").addOption(companyOption()).addOption(outputOption()).action(cmdAppsEndpointsList);
452
+ addExamples(endpoints
453
+ .command("attach")
454
+ .description("attach one of your endpoints to the app and choose who pays")
455
+ .argument("<app>")
456
+ .argument("<endpoint>", "endpoint slug or id")
457
+ .addOption(new Option("--billing <who>", "user = the consenting user's credits (needs their credits:spend grant); sponsor = the endpoint owner").choices(["user", "sponsor"]).default("user"))
458
+ .addOption(companyOption())
459
+ .addOption(outputOption())
460
+ .action(cmdAppsEndpointsAttach), ` heyditto apps endpoints attach dittobench screener --billing sponsor
461
+ heyditto apps endpoints attach dittobench competition --billing user
462
+ heyditto endpoints keys create competition --gh-secret DITTO_ROUTER_KEY --repo ditto-assistant/ditto-subnet # the app's server key`);
463
+ endpoints.command("billing").description("change who pays on an attached endpoint").argument("<app>").argument("<endpoint>").argument("<who>", "user | sponsor").addOption(companyOption()).addOption(outputOption()).action(cmdAppsEndpointsBilling);
464
+ endpoints
465
+ .command("detach")
466
+ .description("detach an endpoint from the app (its app users lose access immediately; asks you to type the slug)")
467
+ .argument("<app>")
468
+ .argument("<endpoint>")
469
+ .option("--yes", "skip the confirmation")
470
+ .addOption(companyOption())
471
+ .addOption(outputOption())
472
+ .action(cmdAppsEndpointsDetach);
473
+ addExamples(program
474
+ .command("receipts")
475
+ .description("your receipts by billing leg (ditto | byok | covered) and by the app that spent them")
476
+ .addOption(new Option("--leg <leg>", "billing leg").choices(["ditto", "byok", "covered"]))
477
+ .option("--app <app_id>", "only this app's spend (use - for Ditto's own surfaces)")
478
+ .option("--days <n>", "window in days (default 30)")
479
+ .option("--limit <n>", "max receipts (default 50)")
480
+ .addOption(outputOption())
481
+ .action(cmdReceipts), ` heyditto receipts
482
+ heyditto receipts --leg byok --days 7
483
+ heyditto receipts --app dittobench --output json`);
484
+ }
485
+ //# sourceMappingURL=app-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-commands.js","sourceRoot":"","sources":["../src/app-commands.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -11,6 +11,7 @@ import { markSessionUsed, resolveActiveSession, sessionHeaders } from "./mcp-ses
11
11
  import { NO_KEY_MESSAGE } from "./api.js";
12
12
  import { openInBrowser } from "./browser.js";
13
13
  import { registerTeleportCommands } from "./teleport/commands.js";
14
+ import { registerAppCommands } from "./app-commands.js";
14
15
  import { deviceLogin } from "./device-login.js";
15
16
  const OUTPUT_FORMATS = ["json", "text", "markdown", "raw"];
16
17
  const MEMORY_FORMATS = ["full", "outline", "blocks"];
@@ -914,6 +915,7 @@ your own graph or an app graph.`);
914
915
  .addOption(hiddenOutputOption())
915
916
  .action(cmdLogin);
916
917
  registerEndpointCommands(program, addExamples, outputOption);
918
+ registerAppCommands(program, addExamples, outputOption);
917
919
  registerHarnessCommands(program, addExamples);
918
920
  registerSessionCommands(program, addExamples);
919
921
  registerTeleportCommands(program, addExamples);