@anna-ai/cli 0.1.33 → 0.1.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/{_lifecycle-shared-CUK2CE76.js → _lifecycle-shared-RyiRITI5.js} +4 -2
  2. package/dist/{account-bqao7Gp5.js → account-B4rdVDyg.js} +1 -1
  3. package/dist/{agent-CzPryLi6.js → agent-DAOr_aiE.js} +1 -1
  4. package/dist/{app-bundle-upload-CqT9KUOl.js → app-bundle-upload-DmVKWAj9.js} +3 -3
  5. package/dist/{apps-dvknZYI2.js → apps-C_Oln_om.js} +1 -1
  6. package/dist/apps-cut-MjSe2ph7.js +159 -0
  7. package/dist/{apps-destructive-B6RFjokU.js → apps-destructive-a2YBmWFm.js} +2 -2
  8. package/dist/{apps-discard-hVZxAQyj.js → apps-discard-BWLVVMu7.js} +12 -10
  9. package/dist/{apps-grants-DnXCnkH5.js → apps-grants-lmllFB02.js} +1 -1
  10. package/dist/{apps-publish-BKqVsS1W.js → apps-publish--EmBa0zN.js} +8 -7
  11. package/dist/apps-publish-B7reDBe1.js +17 -0
  12. package/dist/{apps-push-B3wZr9B4.js → apps-push-CkJ1gtpy.js} +16 -12
  13. package/dist/{apps-release-CyAPmWPU.js → apps-release-J-Sjkoym.js} +3 -3
  14. package/dist/{apps-rename-slug-D2BrWasG.js → apps-rename-slug-DYrk4Zpt.js} +3 -3
  15. package/dist/{apps-status-DV8V_y35.js → apps-status-CcCoYu6i.js} +1 -1
  16. package/dist/{apps-submit-review-DMFQI8JZ.js → apps-submit-review-DNrQc2ws.js} +2 -2
  17. package/dist/{apps-sync-meta-BOb6J_wz.js → apps-sync-meta-CL2PCMCv.js} +6 -4
  18. package/dist/{apps-versions-D1lixrmM.js → apps-versions-2BR8xo7C.js} +1 -1
  19. package/dist/binary-upload-CKMU5Rfw.js +181 -0
  20. package/dist/bridge-CzeSuRRL.js +3 -0
  21. package/dist/{bridge-CbjqAm0H.js → bridge-Dvck0e9c.js} +1 -1
  22. package/dist/{bundled-executas-06keEPP_.js → bundled-executas-Bp9Z6aiR.js} +1 -1
  23. package/dist/cli.js +80 -44
  24. package/dist/dev-CZLOk2qE.js +4 -0
  25. package/dist/{dev-Re6NyNDS.js → dev-GUFWek03.js} +5 -5
  26. package/dist/{dev-app-cache-Dv1dZ_bw.js → dev-app-cache-B3Wa5t6X.js} +18 -3
  27. package/dist/{doctor-VrfEkedz.js → doctor-C3Nx8E2L.js} +1 -1
  28. package/dist/{executa-cache-B0O79Hpb.js → executa-cache-WBkCLic7.js} +1 -1
  29. package/dist/{executa-destructive-Bz7vWxEO.js → executa-destructive-DCfQ1ez5.js} +3 -3
  30. package/dist/{executa-dev-B5Uz982M.js → executa-dev-CAw5X64R.js} +8 -8
  31. package/dist/{executa-install-BW9jjY7u.js → executa-install-Dz7hBUsn.js} +2 -2
  32. package/dist/executa-install-nOFLBwxv.js +7 -0
  33. package/dist/executa-publish-B_7k1gOf.js +11 -0
  34. package/dist/{executa-publish-Ah6J7jYd.js → executa-publish-kh4Ucd3o.js} +21 -5
  35. package/dist/{executa-reads-BXDJWWw6.js → executa-reads-BmwT_Yjp.js} +2 -2
  36. package/dist/executa-trusted-publisher-tVwzjI2d.js +91 -0
  37. package/dist/executa-upload-binaries-DURJTXRI.js +277 -0
  38. package/dist/executa-upload-binaries-DrwpzQp3.js +9 -0
  39. package/dist/{listing-meta-BlY7XMrw.js → listing-meta-CtVtyaWu.js} +13 -4
  40. package/dist/{manifest-DOMrcdCK.js → manifest-CAF3_r1T.js} +88 -11
  41. package/dist/{publish-GpvkaBIx.js → publish-DwIJWl46.js} +12 -10
  42. package/dist/{server-BMcGaUTy.js → server-BHWGGZsf.js} +1 -1
  43. package/dist/{storage-BkF4XyI0.js → storage-aii8EyPC.js} +1 -1
  44. package/dist/{token-uedeaAy7.js → token-COnYMRB-.js} +1 -1
  45. package/dist/{working-orchestration-1jzRuk34.js → working-orchestration-D7cW2Bf2.js} +7 -6
  46. package/package.json +1 -1
  47. package/dist/apps-cut-8870xpk-.js +0 -86
  48. package/dist/apps-publish-Djpw5cfG.js +0 -15
  49. package/dist/bridge-CzHB_IsQ.js +0 -3
  50. package/dist/dev-C3yWhzAp.js +0 -4
  51. package/dist/executa-install-Cyid8R7r.js +0 -7
  52. package/dist/executa-publish-DI_6M_ea.js +0 -9
  53. /package/dist/{app-cache-BqnTkxUw.js → app-cache-Cr3tKbux.js} +0 -0
  54. /package/dist/{bundled-executas-_H1A9M50.js → bundled-executas-rSIkaA6-.js} +0 -0
  55. /package/dist/{confirm-BuT56E_B.js → confirm-BSoOy1X2.js} +0 -0
  56. /package/dist/{dev-account-DqEFCmVg.js → dev-account-CfVdGa9j.js} +0 -0
  57. /package/dist/{executa-cache-Do1D7xC0.js → executa-cache-BFoUtb4J.js} +0 -0
  58. /package/dist/{executa-init-D-kWINZ3.js → executa-init-DKy7DMSD.js} +0 -0
  59. /package/dist/{executa-register-D5kvSSz_.js → executa-register-CmqKsoAU.js} +0 -0
  60. /package/dist/{executas-BhFed1B-.js → executas-CvQY_w2U.js} +0 -0
  61. /package/dist/{fixture-BUKQYR5e.js → fixture-BF1Z0Rry.js} +0 -0
  62. /package/dist/{host_upload-BVzAqvX1.js → host_upload-DrbQ-vk2.js} +0 -0
  63. /package/dist/{image-BLPyUbGQ.js → image-B4UrufYH.js} +0 -0
  64. /package/dist/{login-DhgBgsfx.js → login-DbETuUxy.js} +0 -0
  65. /package/dist/{logout-VYDkLYAx.js → logout-BzIEf-HU.js} +0 -0
  66. /package/dist/{runner-BxYjAmih.js → runner-Bka_coxb.js} +0 -0
  67. /package/dist/{sampling-XBIEYU4A.js → sampling-BpJcd6BC.js} +0 -0
  68. /package/dist/{whoami-C_x26b_k.js → whoami-Bn38ns8r.js} +0 -0
@@ -9,7 +9,7 @@ import { createInterface } from "node:readline";
9
9
  * `uvx <pkg>@<version>` so end users always run the dispatcher version
10
10
  * the CLI was tested against.
11
11
  */
12
- const PINNED_RUNTIME_VERSION = "0.2.0a11";
12
+ const PINNED_RUNTIME_VERSION = "0.2.0a12";
13
13
  /**
14
14
  * Throwable from a {@link RequestHandler} to send a structured JSON-RPC
15
15
  * error back to the python bridge with a stable string ``code`` (e.g.
@@ -1,5 +1,5 @@
1
1
  import "./credentials-BTv2IfUZ.js";
2
2
  import "./client-D-_z1ALk.js";
3
- import { collectBundledHandles, lockPath, parseExecutaIdOverrides, readExecutasLock, substituteBundledRefs, validateBundledHandles, writeBundleToolIdSidecar, writeExecutasLock } from "./bundled-executas-_H1A9M50.js";
3
+ import { collectBundledHandles, lockPath, parseExecutaIdOverrides, readExecutasLock, substituteBundledRefs, validateBundledHandles, writeBundleToolIdSidecar, writeExecutasLock } from "./bundled-executas-rSIkaA6-.js";
4
4
 
5
5
  export { substituteBundledRefs, writeBundleToolIdSidecar };
package/dist/cli.js CHANGED
@@ -470,7 +470,7 @@ program.command("validate").description("Run schema + ACL checks on a manifest+b
470
470
  process.exit(code);
471
471
  });
472
472
  program.command("dev").description("Run a local harness (in-process dispatcher + iframe + SSE relay)").option("--manifest <path>", "manifest.json path", "manifest.json").option("--bundle <dir>", "bundle directory (default: ./bundle)").option("--slug <slug>", "App slug (overrides manifest.slug/name)").option("--view <name>", "View name to open (default: manifest default)").option("--matrix-nexus-root <path>", "matrix-nexus checkout (auto-detected if omitted; can also use $ANNA_NEXUS_ROOT)").option("--port <number>", "HTTP port", "5180").option("--user-id <id>", "Harness user_id", "1").option("--cwd <dir>", "Project root (default: cwd)").option("--no-watch", "Disable bundle file watcher (default: enabled)").option("--executa <spec>", "Explicit executa registration; repeatable. Spec: comma-separated key=value (dir=<path>[,tool_id=<id>][,type=python|node|go|binary][,command=\"<argv>\"]). When only `dir=` is given, the executa is auto-detected from executa.json / pyproject.toml / package.json / go.mod. Overrides directory auto-discovery under <manifest-dir>/executas/.", (val, prev) => prev ? [...prev, val] : [val]).option("--no-llm", "Disable LLM bridge (anna.llm/agent return llm_disabled)").option("--mock-llm <fixture>", "Serve canned LLM responses from a JSONL fixture").option("--llm-account <host>", "Saved account host to use (default: current)").option("--llm-app-slug <slug>", "Override the manifest slug used to register / look up the dev AnnaApp (default: manifest.slug)").option("--storage <mode>", "Storage backend: \"legacy\" (in-memory runtime_state, default) or \"aps\" (real nexus APS via /api/v1/storage/* — requires `anna-app login`).", "legacy").action(async (opts) => {
473
- const { runDev, parseExecutaSpec } = await import("./dev-C3yWhzAp.js");
473
+ const { runDev, parseExecutaSpec } = await import("./dev-CZLOk2qE.js");
474
474
  const cwd = opts.cwd ?? process.cwd();
475
475
  let executas;
476
476
  if (opts.executa && opts.executa.length > 0) {
@@ -505,7 +505,7 @@ program.command("dev").description("Run a local harness (in-process dispatcher +
505
505
  });
506
506
  const fixture = program.command("fixture").description("Inspect / replay harness recordings (Phase 6)");
507
507
  fixture.command("verify <file>").description("Schema + invariant checks on a harness JSONL recording").option("--json", "Emit machine-readable JSON", false).action(async (file, opts) => {
508
- const { runFixtureVerify } = await import("./fixture-BUKQYR5e.js");
508
+ const { runFixtureVerify } = await import("./fixture-BF1Z0Rry.js");
509
509
  const code = await runFixtureVerify({
510
510
  file,
511
511
  json: opts.json
@@ -513,7 +513,7 @@ fixture.command("verify <file>").description("Schema + invariant checks on a har
513
513
  process.exit(code);
514
514
  });
515
515
  fixture.command("summarize <file>").description("Print a human-readable digest of a harness recording").option("--json", "Emit machine-readable JSON", false).action(async (file, opts) => {
516
- const { runFixtureSummarize } = await import("./fixture-BUKQYR5e.js");
516
+ const { runFixtureSummarize } = await import("./fixture-BF1Z0Rry.js");
517
517
  const code = await runFixtureSummarize({
518
518
  file,
519
519
  json: opts.json
@@ -521,7 +521,7 @@ fixture.command("summarize <file>").description("Print a human-readable digest o
521
521
  process.exit(code);
522
522
  });
523
523
  fixture.command("replay <file>").description("Dry-run replay of a harness recording (Phase 6 MVP)").option("--manifest <path>", "manifest.json path", "manifest.json").action(async (file, opts) => {
524
- const { runFixtureReplay } = await import("./fixture-BUKQYR5e.js");
524
+ const { runFixtureReplay } = await import("./fixture-BF1Z0Rry.js");
525
525
  const code = await runFixtureReplay({
526
526
  file,
527
527
  manifest: opts.manifest
@@ -529,12 +529,12 @@ fixture.command("replay <file>").description("Dry-run replay of a harness record
529
529
  process.exit(code);
530
530
  });
531
531
  program.command("doctor").description("Check environment for `anna-app dev` (uv, matrix-nexus, dev key)").option("--matrix-nexus-root <path>", "matrix-nexus checkout (optional)").action(async (opts) => {
532
- const { runDoctor } = await import("./doctor-VrfEkedz.js");
532
+ const { runDoctor } = await import("./doctor-C3Nx8E2L.js");
533
533
  const code = await runDoctor({ matrixNexusRoot: opts.matrixNexusRoot });
534
534
  process.exit(code);
535
535
  });
536
536
  program.command("login").description("Device-flow login against a nexus host; saves a PAT to ~/.config/anna/credentials.json").requiredOption("--host <url>", "nexus base URL, e.g. https://nexus.example.com").option("--no-browser", "Do not open a browser window automatically", false).action(async (opts) => {
537
- const { runLogin } = await import("./login-DhgBgsfx.js");
537
+ const { runLogin } = await import("./login-DbETuUxy.js");
538
538
  const code = await runLogin({
539
539
  host: opts.host,
540
540
  noBrowser: opts.browser === false
@@ -542,7 +542,7 @@ program.command("login").description("Device-flow login against a nexus host; sa
542
542
  process.exit(code);
543
543
  });
544
544
  program.command("logout").description("Remove a saved PAT entry").option("--host <url>", "Account to remove (default: current)").option("--all", "Remove every saved account", false).action(async (opts) => {
545
- const { runLogout } = await import("./logout-VYDkLYAx.js");
545
+ const { runLogout } = await import("./logout-BzIEf-HU.js");
546
546
  const code = await runLogout({
547
547
  host: opts.host,
548
548
  all: opts.all
@@ -550,13 +550,13 @@ program.command("logout").description("Remove a saved PAT entry").option("--host
550
550
  process.exit(code);
551
551
  });
552
552
  program.command("whoami").description("Show the current account (and any others)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
553
- const { runWhoami } = await import("./whoami-C_x26b_k.js");
553
+ const { runWhoami } = await import("./whoami-Bn38ns8r.js");
554
554
  const code = await runWhoami({ json: opts.json });
555
555
  process.exit(code);
556
556
  });
557
557
  const account = program.command("account").description("Manage your developer account (handle / namespace)");
558
558
  account.command("set-handle <handle>").description("Set or rename your developer handle — the @handle namespace your apps publish under (@handle/slug). Required before creating your first app.").option("--host <url>", "Account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (handle, opts) => {
559
- const { runAccountSetHandle } = await import("./account-bqao7Gp5.js");
559
+ const { runAccountSetHandle } = await import("./account-B4rdVDyg.js");
560
560
  const code = await runAccountSetHandle({
561
561
  handle,
562
562
  account: opts.host,
@@ -576,7 +576,7 @@ executa.command("init <dir>").description("Scaffold a standalone Executa plugin
576
576
  console.error(`✗ unknown template "${opts.template}" — expected python | node | go`);
577
577
  process.exit(2);
578
578
  }
579
- const { runExecutaInit } = await import("./executa-init-D-kWINZ3.js");
579
+ const { runExecutaInit } = await import("./executa-init-DKy7DMSD.js");
580
580
  const code = runExecutaInit({
581
581
  targetDir: dir,
582
582
  slug,
@@ -587,12 +587,12 @@ executa.command("init <dir>").description("Scaffold a standalone Executa plugin
587
587
  process.exit(code);
588
588
  });
589
589
  executa.command("register").description("Register a HARNESS AnnaApp(kind=executa) so `executa dev --storage real` (and agent / sampling / image / upload real-mode flows) can mint tokens for a local executa subprocess. Does NOT publish the executa itself — use `executa publish` for that. Lists/deletes via `apps list` / `apps delete`.").requiredOption("--tool-id <id>", "Executa tool_id (matches executa.json tool_id / executable_name)").option("--slug <slug>", "App slug (default: executa-<tool_id>; must be lowercase + hyphens)").option("--name <name>", "Human-readable display name (default: <tool_id>)").option("--account <host>", "Saved account host (default: current)").action(async (opts) => {
590
- const { runExecutaRegister } = await import("./executa-register-D5kvSSz_.js");
590
+ const { runExecutaRegister } = await import("./executa-register-CmqKsoAU.js");
591
591
  const code = await runExecutaRegister(opts);
592
592
  process.exit(code);
593
593
  });
594
594
  executa.command("install").description("Install a local-dev shim for an Executa under its minted tool_id so the Agent can discover it via 'Rediscover Local' (for distribution_type: local). Resolves the tool_id from .anna/executa.json (written by `executa publish` / `apps push`) unless --tool-id is given.").option("--dir <path>", "Executa project dir (default: CWD)").option("--tool-id <id>", "Install the shim under this exact id (default: minted id from .anna/executa.json, else executa.json tool_id)").option("--bin-dir <path>", "Install dir for the shim (default: ~/.anna/executa/bin)").option("--force", "Overwrite an existing shim of the same name", false).option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
595
- const { runExecutaInstall } = await import("./executa-install-Cyid8R7r.js");
595
+ const { runExecutaInstall } = await import("./executa-install-nOFLBwxv.js");
596
596
  const code = await runExecutaInstall({
597
597
  dir: opts.dir,
598
598
  toolId: opts.toolId,
@@ -603,7 +603,7 @@ executa.command("install").description("Install a local-dev shim for an Executa
603
603
  process.exit(code);
604
604
  });
605
605
  executa.command("dev").description("Run one Executa plugin in isolation (REPL or one-shot describe/invoke)").option("--dir <path>", "Executa project dir (default: CWD)").option("--spec <spec>", "Override discovery: comma-separated key=value (tool_id=...,type=...,command=\"...\")").option("--describe", "Print MANIFEST and exit", false).option("--health", "Print health and exit", false).option("--invoke <tool>", "Invoke one tool and exit").option("--args <json>", "JSON object passed as tool arguments", "{}").option("--json", "One-shot: emit compact JSON (no banners)", false).option("--no-sampling", "Hard-disable sampling reverse RPC (returns sampling_disabled)").option("--mock-sampling <fixture>", "Serve canned sampling responses from a JSONL fixture (offline)").option("--sampling-unsupported-format", "Simulate a model without json_schema support — exercises responseFormat onUnsupported branches (-32010 / downgrade)").option("--app-slug <slug>", "Forward sampling to nexus on behalf of this dev AnnaApp slug").option("--sampling-account <host>", "Saved account host for nexus sampling (default: current)").option("--no-agent", "Hard-disable agent reverse RPC (returns agent_not_granted)").option("--mock-agent <fixture>", "Serve canned agent/* responses from a JSONL fixture (offline)").option("--agent-account <host>", "Saved account host for nexus agent (default: --sampling-account or current)").option("--storage <mode>", "Storage backend: off | memory | mock | real (default: memory)").option("--mock-storage <fixture>", "Serve canned storage/* + files/* responses from a JSONL fixture").option("--storage-account <host>", "Saved account host for nexus storage (default: --sampling-account or current)").option("--storage-scopes <list>", "Comma-separated scopes for real storage tokens (default: user,app,tool)").option("--no-image", "Hard-disable image reverse RPC (returns image_not_granted)").option("--mock-image <fixture>", "Serve canned image/generate + image/edit responses from a JSONL fixture").option("--image-account <host>", "Saved account host for nexus image (default: --sampling-account or current)").option("--no-upload", "Hard-disable host/uploadFile reverse RPC (returns upload_not_granted)").option("--mock-upload <fixture>", "Serve canned host/uploadFile responses from a JSONL fixture").option("--upload-account <host>", "Saved account host for nexus uploads (default: --sampling-account or current)").action(async (opts) => {
606
- const { runExecutaDev } = await import("./executa-dev-B5Uz982M.js");
606
+ const { runExecutaDev } = await import("./executa-dev-CAw5X64R.js");
607
607
  const storageMode = opts.storage === void 0 ? void 0 : (() => {
608
608
  const m = opts.storage;
609
609
  if (m === "off" || m === "memory" || m === "mock" || m === "real") return m;
@@ -641,14 +641,14 @@ executa.command("dev").description("Run one Executa plugin in isolation (REPL or
641
641
  });
642
642
  const apps = program.command("apps").description("Anna App publish lifecycle commands");
643
643
  apps.command("list").description("List the Anna Apps you authored, with lifecycle status").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
644
- const { runAppsList } = await import("./apps-dvknZYI2.js");
644
+ const { runAppsList } = await import("./apps-C_Oln_om.js");
645
645
  process.exit(await runAppsList({
646
646
  account: opts.account,
647
647
  json: opts.json
648
648
  }));
649
649
  });
650
650
  apps.command("rename-slug <new-slug>").description("Rename an app's public slug (DRAFT/REJECTED, never-published, zero installs only). Updates local app.json + .anna/app.json on success.").option("--cwd <dir>", "Project root (default: cwd)").option("--manifest <path>", "manifest.json path", "manifest.json").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (newSlug, opts) => {
651
- const { runAppsRenameSlug } = await import("./apps-rename-slug-D2BrWasG.js");
651
+ const { runAppsRenameSlug } = await import("./apps-rename-slug-DYrk4Zpt.js");
652
652
  process.exit(await runAppsRenameSlug({
653
653
  newSlug,
654
654
  cwd: opts.cwd,
@@ -657,7 +657,7 @@ apps.command("rename-slug <new-slug>").description("Rename an app's public slug
657
657
  json: opts.json
658
658
  }));
659
659
  });
660
- apps.command("publish").description("Publish or update an Anna App (manifest.json in cwd)").option("--cwd <dir>", "Project root (default: cwd)").option("--manifest <path>", "manifest.json path", "manifest.json").option("--bump <kind>", "Bump version: patch|minor|major").option("--no-write", "Skip writing the bumped version back to disk", false).option("--dry-run", "Resolve identity + diff but don't upload", false).option("--executa-id <handle=id>", "Override a bundled executa handle with a real tool_id (repeatable)", (val, prev) => [...prev, val], []).option("--skip-executa-publish", "Use cached/overridden tool_ids; don't recursively publish bundled executas", false).option("--no-bundled-executas", "Disable bundled-executa orchestration (legacy behaviour)").option("--no-bundle", "Skip UI bundle upload even if the manifest declares a UI").option("--bundle-dir <dir>", "UI bundle directory (default: <cwd>/bundle)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
660
+ apps.command("publish").description("Publish or update an Anna App (manifest.json in cwd)").option("--cwd <dir>", "Project root (default: cwd)").option("--manifest <path>", "manifest.json path", "manifest.json").option("--bump <kind>", "Bump version: patch|minor|major").option("--no-write", "Skip writing the bumped version back to disk", false).option("--dry-run", "Resolve identity + diff but don't upload", false).option("--executa-id <handle=id>", "Override a bundled executa handle with a real tool_id (repeatable)", (val, prev) => [...prev, val], []).option("--skip-executa-publish", "Use cached/overridden tool_ids; don't recursively publish bundled executas", false).option("--no-bundled-executas", "Disable bundled-executa orchestration (legacy behaviour)").option("--no-bundle", "Skip UI bundle upload even if the manifest declares a UI").option("--bundle-dir <dir>", "UI bundle directory (default: <cwd>/bundle)").option("--profile <name>", "Select a bundled executa `distribution.profiles` entry for this run (overrides each executa.json `active`, e.g. --profile local)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
661
661
  if (opts.bump && ![
662
662
  "patch",
663
663
  "minor",
@@ -666,7 +666,7 @@ apps.command("publish").description("Publish or update an Anna App (manifest.jso
666
666
  console.error(`✗ --bump must be patch|minor|major (got: ${opts.bump})`);
667
667
  process.exit(2);
668
668
  }
669
- const { runAppsPublish } = await import("./apps-publish-Djpw5cfG.js");
669
+ const { runAppsPublish } = await import("./apps-publish-B7reDBe1.js");
670
670
  process.exit(await runAppsPublish({
671
671
  cwd: opts.cwd,
672
672
  manifest: opts.manifest,
@@ -678,11 +678,12 @@ apps.command("publish").description("Publish or update an Anna App (manifest.jso
678
678
  noBundledExecutas: opts.bundledExecutas === false,
679
679
  noBundle: opts.bundle === false,
680
680
  bundleDir: opts.bundleDir,
681
+ profile: opts.profile,
681
682
  account: opts.account,
682
683
  json: opts.json
683
684
  }));
684
685
  });
685
- apps.command("push").description("Upsert the mutable working draft (manifest + bundle, no freeze)").option("--cwd <dir>", "Project root (default: cwd)").option("--manifest <path>", "manifest.json path", "manifest.json").option("--bump <kind>", "Bump version: patch|minor|major").option("--no-write", "Skip writing the bumped version back to disk", false).option("--dry-run", "Resolve identity + diff but don't upsert", false).option("--executa-id <handle=id>", "Override a bundled executa handle with a real tool_id (repeatable)", (val, prev) => [...prev, val], []).option("--skip-executa-publish", "Use cached/overridden tool_ids; don't recursively register bundled executas", false).option("--no-bundled-executas", "Disable bundled-executa orchestration (legacy behaviour)").option("--no-bundle", "Skip working UI bundle upload even if the manifest declares a UI").option("--bundle-dir <dir>", "UI bundle directory (default: <cwd>/bundle)").option("--no-install-local", "Don't install local-dev shims for bundled `local` executas (skip Rediscover-Local prep)").option("--if-match <revision>", "Optimistic-lock: require this working revision").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
686
+ apps.command("push").description("Upsert the mutable working draft (manifest + bundle, no freeze)").option("--cwd <dir>", "Project root (default: cwd)").option("--manifest <path>", "manifest.json path", "manifest.json").option("--bump <kind>", "Bump version: patch|minor|major").option("--no-write", "Skip writing the bumped version back to disk", false).option("--dry-run", "Resolve identity + diff but don't upsert", false).option("--executa-id <handle=id>", "Override a bundled executa handle with a real tool_id (repeatable)", (val, prev) => [...prev, val], []).option("--skip-executa-publish", "Use cached/overridden tool_ids; don't recursively register bundled executas", false).option("--no-bundled-executas", "Disable bundled-executa orchestration (legacy behaviour)").option("--no-bundle", "Skip working UI bundle upload even if the manifest declares a UI").option("--bundle-dir <dir>", "UI bundle directory (default: <cwd>/bundle)").option("--no-install-local", "Don't install local-dev shims for bundled `local` executas (skip Rediscover-Local prep)").option("--profile <name>", "Select a bundled executa `distribution.profiles` entry for this push (overrides each executa.json `active`; e.g. --profile local for a dev push while `active` stays `binary`)").option("--if-match <revision>", "Optimistic-lock: require this working revision").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
686
687
  if (opts.bump && ![
687
688
  "patch",
688
689
  "minor",
@@ -699,7 +700,7 @@ apps.command("push").description("Upsert the mutable working draft (manifest + b
699
700
  process.exit(2);
700
701
  }
701
702
  }
702
- const { runAppsPush } = await import("./apps-push-B3wZr9B4.js");
703
+ const { runAppsPush } = await import("./apps-push-CkJ1gtpy.js");
703
704
  process.exit(await runAppsPush({
704
705
  cwd: opts.cwd,
705
706
  manifest: opts.manifest,
@@ -712,13 +713,14 @@ apps.command("push").description("Upsert the mutable working draft (manifest + b
712
713
  noBundle: opts.bundle === false,
713
714
  bundleDir: opts.bundleDir,
714
715
  noInstallLocal: opts.installLocal === false,
716
+ profile: opts.profile,
715
717
  ifMatch,
716
718
  account: opts.account,
717
719
  json: opts.json
718
720
  }));
719
721
  });
720
722
  apps.command("cut <version>").description("Snapshot the working draft into an immutable version (freeze deps)").option("--changelog <text>", "Override the working draft changelog for this version").option("--slug <slug>", "App slug (default: resolve from .anna/app.json cache)").option("--cwd <dir>", "Project root for identity cache (default: cwd)").option("--dry-run", "Resolve target but don't cut", false).option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (version, opts) => {
721
- const { runAppsCut } = await import("./apps-cut-8870xpk-.js");
723
+ const { runAppsCut } = await import("./apps-cut-MjSe2ph7.js");
722
724
  process.exit(await runAppsCut({
723
725
  version,
724
726
  changelog: opts.changelog,
@@ -730,7 +732,7 @@ apps.command("cut <version>").description("Snapshot the working draft into an im
730
732
  }));
731
733
  });
732
734
  apps.command("discard").description("Drop the mutable working draft (leaves cut versions intact)").option("--slug <slug>", "App slug (default: resolve from .anna/app.json cache)").option("--cwd <dir>", "Project root for identity cache (default: cwd)").option("--dry-run", "Resolve target but don't discard", false).option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
733
- const { runAppsDiscard } = await import("./apps-discard-hVZxAQyj.js");
735
+ const { runAppsDiscard } = await import("./apps-discard-BWLVVMu7.js");
734
736
  process.exit(await runAppsDiscard({
735
737
  slug: opts.slug,
736
738
  cwd: opts.cwd,
@@ -740,7 +742,7 @@ apps.command("discard").description("Drop the mutable working draft (leaves cut
740
742
  }));
741
743
  });
742
744
  apps.command("release <version>").description("Freeze & publish an existing remote version (go live)").option("--slug <slug>", "App slug (default: resolve from .anna/app.json cache)").option("--cwd <dir>", "Project root for identity cache (default: cwd)").option("--allow-create", "If the version isn't on the server, run 'apps publish' first, then release", false).option("--dry-run", "Resolve target + pre-flight but don't publish", false).option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (version, opts) => {
743
- const { runAppsRelease } = await import("./apps-release-CyAPmWPU.js");
745
+ const { runAppsRelease } = await import("./apps-release-J-Sjkoym.js");
744
746
  process.exit(await runAppsRelease({
745
747
  version,
746
748
  slug: opts.slug,
@@ -752,7 +754,7 @@ apps.command("release <version>").description("Freeze & publish an existing remo
752
754
  }));
753
755
  });
754
756
  apps.command("sync-meta").description("Push mutable store metadata (name/tagline/…) from the manifest").option("--cwd <dir>", "Project root (default: cwd)").option("--manifest <path>", "manifest.json path", "manifest.json").option("--logo <path>", "Local logo file to upload (overrides app.json logo_file)").option("--dry-run", "Print the metadata diff but don't PATCH", false).option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
755
- const { runAppsSyncMeta } = await import("./apps-sync-meta-BOb6J_wz.js");
757
+ const { runAppsSyncMeta } = await import("./apps-sync-meta-CL2PCMCv.js");
756
758
  process.exit(await runAppsSyncMeta({
757
759
  cwd: opts.cwd,
758
760
  manifest: opts.manifest,
@@ -763,7 +765,7 @@ apps.command("sync-meta").description("Push mutable store metadata (name/tagline
763
765
  }));
764
766
  });
765
767
  apps.command("submit-review [slug]").description("Move an app into review (DRAFT/REJECTED → PENDING_REVIEW)").option("--cwd <dir>", "Project root for identity cache (default: cwd)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
766
- const { runAppsSubmitReview } = await import("./apps-submit-review-DMFQI8JZ.js");
768
+ const { runAppsSubmitReview } = await import("./apps-submit-review-DNrQc2ws.js");
767
769
  process.exit(await runAppsSubmitReview({
768
770
  slug,
769
771
  cwd: opts.cwd,
@@ -772,7 +774,7 @@ apps.command("submit-review [slug]").description("Move an app into review (DRAFT
772
774
  }));
773
775
  });
774
776
  apps.command("status <slug>").description("Show server-known state for one Anna App").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
775
- const { runAppsStatus } = await import("./apps-status-DV8V_y35.js");
777
+ const { runAppsStatus } = await import("./apps-status-CcCoYu6i.js");
776
778
  process.exit(await runAppsStatus({
777
779
  slug,
778
780
  account: opts.account,
@@ -780,7 +782,7 @@ apps.command("status <slug>").description("Show server-known state for one Anna
780
782
  }));
781
783
  });
782
784
  apps.command("versions <slug>").description("List all server versions of one Anna App").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
783
- const { runAppsVersions } = await import("./apps-versions-D1lixrmM.js");
785
+ const { runAppsVersions } = await import("./apps-versions-2BR8xo7C.js");
784
786
  process.exit(await runAppsVersions({
785
787
  slug,
786
788
  account: opts.account,
@@ -788,7 +790,7 @@ apps.command("versions <slug>").description("List all server versions of one Ann
788
790
  }));
789
791
  });
790
792
  apps.command("grants <slug>").description("Show currently granted scopes/quota for one Anna App").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
791
- const { runAppsGrants } = await import("./apps-grants-DnXCnkH5.js");
793
+ const { runAppsGrants } = await import("./apps-grants-lmllFB02.js");
792
794
  process.exit(await runAppsGrants({
793
795
  slug,
794
796
  account: opts.account,
@@ -796,7 +798,7 @@ apps.command("grants <slug>").description("Show currently granted scopes/quota f
796
798
  }));
797
799
  });
798
800
  apps.command("unpublish <slug>").description("Flip a PUBLISHED app back to APPROVED (private)").option("--yes", "Acknowledge the destructive operation", false).option("--confirm <slug>", "Slug confirmation (must match target)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
799
- const { runAppsUnpublish } = await import("./apps-destructive-B6RFjokU.js");
801
+ const { runAppsUnpublish } = await import("./apps-destructive-a2YBmWFm.js");
800
802
  process.exit(await runAppsUnpublish({
801
803
  slug,
802
804
  yes: opts.yes,
@@ -806,7 +808,7 @@ apps.command("unpublish <slug>").description("Flip a PUBLISHED app back to APPRO
806
808
  }));
807
809
  });
808
810
  apps.command("archive <slug>").description("Archive an Anna App (hides it from end users)").option("--yes", "Acknowledge the destructive operation", false).option("--confirm <slug>", "Slug confirmation (must match target)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
809
- const { runAppsArchive } = await import("./apps-destructive-B6RFjokU.js");
811
+ const { runAppsArchive } = await import("./apps-destructive-a2YBmWFm.js");
810
812
  process.exit(await runAppsArchive({
811
813
  slug,
812
814
  yes: opts.yes,
@@ -816,7 +818,7 @@ apps.command("archive <slug>").description("Archive an Anna App (hides it from e
816
818
  }));
817
819
  });
818
820
  apps.command("unarchive <slug>").description("Restore an archived Anna App back to APPROVED").option("--yes", "Acknowledge the operation", false).option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
819
- const { runAppsUnarchive } = await import("./apps-destructive-B6RFjokU.js");
821
+ const { runAppsUnarchive } = await import("./apps-destructive-a2YBmWFm.js");
820
822
  process.exit(await runAppsUnarchive({
821
823
  slug,
822
824
  yes: opts.yes,
@@ -825,7 +827,7 @@ apps.command("unarchive <slug>").description("Restore an archived Anna App back
825
827
  }));
826
828
  });
827
829
  apps.command("delete <slug>").description("Hard-delete an Anna App (refused by server if installs exist)").option("--yes", "Acknowledge the destructive operation", false).option("--confirm <slug>", "Slug confirmation (must match target)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
828
- const { runAppsDelete } = await import("./apps-destructive-B6RFjokU.js");
830
+ const { runAppsDelete } = await import("./apps-destructive-a2YBmWFm.js");
829
831
  process.exit(await runAppsDelete({
830
832
  slug,
831
833
  yes: opts.yes,
@@ -835,14 +837,14 @@ apps.command("delete <slug>").description("Hard-delete an Anna App (refused by s
835
837
  }));
836
838
  });
837
839
  executa.command("list").description("List Executas owned by the current PAT").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
838
- const { runExecutaList } = await import("./executa-reads-BXDJWWw6.js");
840
+ const { runExecutaList } = await import("./executa-reads-BmwT_Yjp.js");
839
841
  process.exit(await runExecutaList({
840
842
  account: opts.account,
841
843
  json: opts.json
842
844
  }));
843
845
  });
844
846
  executa.command("status <ref>").description("Show server-known state for one Executa (slug or tool_id)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (ref, opts) => {
845
- const { runExecutaStatus } = await import("./executa-reads-BXDJWWw6.js");
847
+ const { runExecutaStatus } = await import("./executa-reads-BmwT_Yjp.js");
846
848
  process.exit(await runExecutaStatus({
847
849
  ref,
848
850
  account: opts.account,
@@ -850,14 +852,14 @@ executa.command("status <ref>").description("Show server-known state for one Exe
850
852
  }));
851
853
  });
852
854
  executa.command("versions <ref>").description("List immutable version snapshots for one Executa").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (ref, opts) => {
853
- const { runExecutaVersions } = await import("./executa-reads-BXDJWWw6.js");
855
+ const { runExecutaVersions } = await import("./executa-reads-BmwT_Yjp.js");
854
856
  process.exit(await runExecutaVersions({
855
857
  ref,
856
858
  account: opts.account,
857
859
  json: opts.json
858
860
  }));
859
861
  });
860
- executa.command("publish").description("Mint or update an Executa (executa.json in cwd)").option("--cwd <dir>", "Project root (default: cwd)").option("--manifest <path>", "executa.json path", "executa.json").option("--bump <kind>", "Bump version: patch|minor|major").option("--no-write", "Skip writing the bumped version back to disk", false).option("--publish", "After freezing the version, flip visibility to PUBLIC", false).option("--dry-run", "Resolve identity + diff but don't upload", false).option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
862
+ executa.command("publish").description("Mint or update an Executa (executa.json in cwd)").option("--cwd <dir>", "Project root (default: cwd)").option("--manifest <path>", "executa.json path", "executa.json").option("--bump <kind>", "Bump version: patch|minor|major").option("--no-write", "Skip writing the bumped version back to disk", false).option("--publish", "After freezing the version, flip visibility to PUBLIC", false).option("--dry-run", "Resolve identity + diff but don't upload", false).option("--profile <name>", "Select a `distribution.profiles` entry for this run (overrides executa.json `active`, e.g. --profile local)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
861
863
  if (opts.bump && ![
862
864
  "patch",
863
865
  "minor",
@@ -866,7 +868,7 @@ executa.command("publish").description("Mint or update an Executa (executa.json
866
868
  console.error(`✗ --bump must be patch|minor|major (got: ${opts.bump})`);
867
869
  process.exit(2);
868
870
  }
869
- const { runExecutaPublish } = await import("./executa-publish-DI_6M_ea.js");
871
+ const { runExecutaPublish } = await import("./executa-publish-B_7k1gOf.js");
870
872
  process.exit(await runExecutaPublish({
871
873
  cwd: opts.cwd,
872
874
  manifest: opts.manifest,
@@ -874,12 +876,46 @@ executa.command("publish").description("Mint or update an Executa (executa.json
874
876
  noWrite: opts.write === false,
875
877
  publish: opts.publish,
876
878
  dryRun: opts.dryRun,
879
+ profile: opts.profile,
877
880
  account: opts.account,
878
881
  json: opts.json
879
882
  }));
880
883
  });
884
+ executa.command("upload-binaries").description("Push the local binary_artifacts declared in executa.json straight to the platform CDN (no public source URL needed — works for private repos). Requires a minted identity (.anna/executa.json from `executa publish` / `apps push`) or --tool-id.").option("--dir <path>", "Executa project dir (default: CWD)").option("--dry-run", "Hash artifacts + validate the plan server-side without uploading", false).option("--oidc", "Mint the upload token from the GitHub Actions OIDC id-token instead of a PAT (zero long-term secrets; needs `permissions: id-token: write` and a registered trusted publisher)", false).option("--tool-id <id>", "Explicit tool_id (skip the identity cache)").option("--host <url>", "Nexus host (required with --oidc unless ANNA_APP_HOST is set)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
885
+ const { runExecutaUploadBinaries } = await import("./executa-upload-binaries-DrwpzQp3.js");
886
+ process.exit(await runExecutaUploadBinaries({
887
+ dir: opts.dir,
888
+ dryRun: opts.dryRun,
889
+ oidc: opts.oidc,
890
+ toolId: opts.toolId,
891
+ host: opts.host,
892
+ account: opts.account,
893
+ json: opts.json
894
+ }));
895
+ });
896
+ const trustedPublisher = executa.command("trusted-publisher").description("Manage the GitHub Actions identities allowed to publish binaries for an executa via OIDC (zero-secret CI; pairs with `executa upload-binaries --oidc`)");
897
+ trustedPublisher.command("add").description("Register a {repository, workflow, environment?} triple").requiredOption("--repository <owner/repo>", "GitHub repository").requiredOption("--workflow <file>", "Workflow file, e.g. \"publish.yml\"").option("--environment <name>", "GitHub Environment gate (default: any)").option("--dir <path>", "Executa project dir (default: CWD)").option("--tool-id <id>", "Explicit tool_id (skip the identity cache)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
898
+ const { runTrustedPublisherAdd } = await import("./executa-trusted-publisher-tVwzjI2d.js");
899
+ process.exit(await runTrustedPublisherAdd(opts));
900
+ });
901
+ trustedPublisher.command("list").description("List registered trusted publishers").option("--dir <path>", "Executa project dir (default: CWD)").option("--tool-id <id>", "Explicit tool_id (skip the identity cache)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
902
+ const { runTrustedPublisherList } = await import("./executa-trusted-publisher-tVwzjI2d.js");
903
+ process.exit(await runTrustedPublisherList(opts));
904
+ });
905
+ trustedPublisher.command("remove <publisher-id>").description("Remove a trusted publisher registration by id").option("--dir <path>", "Executa project dir (default: CWD)").option("--tool-id <id>", "Explicit tool_id (skip the identity cache)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (publisherId, opts) => {
906
+ const id = Number(publisherId);
907
+ if (!Number.isInteger(id) || id <= 0) {
908
+ console.error(`✗ publisher-id must be a positive integer (got "${publisherId}")`);
909
+ process.exit(2);
910
+ }
911
+ const { runTrustedPublisherRemove } = await import("./executa-trusted-publisher-tVwzjI2d.js");
912
+ process.exit(await runTrustedPublisherRemove({
913
+ ...opts,
914
+ publisherId: id
915
+ }));
916
+ });
881
917
  executa.command("unpublish <slug>").description("Flip an Executa's visibility back to private").option("--yes", "Acknowledge the destructive operation", false).option("--confirm <slug>", "Slug confirmation (must match target)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
882
- const { runExecutaUnpublish } = await import("./executa-destructive-Bz7vWxEO.js");
918
+ const { runExecutaUnpublish } = await import("./executa-destructive-DCfQ1ez5.js");
883
919
  process.exit(await runExecutaUnpublish({
884
920
  slug,
885
921
  yes: opts.yes,
@@ -889,7 +925,7 @@ executa.command("unpublish <slug>").description("Flip an Executa's visibility ba
889
925
  }));
890
926
  });
891
927
  executa.command("yank <ref>").description("Hard-delete one Executa version (<slug>@<version>)").option("--yes", "Acknowledge the destructive operation", false).option("--confirm <slug>", "Slug confirmation (must match target)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (ref, opts) => {
892
- const { runExecutaYank } = await import("./executa-destructive-Bz7vWxEO.js");
928
+ const { runExecutaYank } = await import("./executa-destructive-DCfQ1ez5.js");
893
929
  process.exit(await runExecutaYank({
894
930
  ref,
895
931
  yes: opts.yes,
@@ -899,7 +935,7 @@ executa.command("yank <ref>").description("Hard-delete one Executa version (<slu
899
935
  }));
900
936
  });
901
937
  executa.command("delete <slug>").description("Hard-delete an Executa").option("--yes", "Acknowledge the destructive operation", false).option("--confirm <slug>", "Slug confirmation (must match target)").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (slug, opts) => {
902
- const { runExecutaDelete } = await import("./executa-destructive-Bz7vWxEO.js");
938
+ const { runExecutaDelete } = await import("./executa-destructive-DCfQ1ez5.js");
903
939
  process.exit(await runExecutaDelete({
904
940
  slug,
905
941
  yes: opts.yes,
@@ -911,7 +947,7 @@ executa.command("delete <slug>").description("Hard-delete an Executa").option("-
911
947
  executa.command("cache-clear").description("Delete the local `.anna/executa.json` identity cache. Use after the server-side Executa has been deleted/recreated, or when switching host. Next `executa publish` will re-mint via the idempotency key.").option("--cwd <dir>", "Project root (default: cwd)").action(async (opts) => {
912
948
  const { resolve: resolve$1 } = await import("node:path");
913
949
  const { existsSync: existsSync$1 } = await import("node:fs");
914
- const { executaCachePath, invalidateExecutaCache } = await import("./executa-cache-B0O79Hpb.js");
950
+ const { executaCachePath, invalidateExecutaCache } = await import("./executa-cache-WBkCLic7.js");
915
951
  const cwd = resolve$1(opts.cwd ?? process.cwd());
916
952
  const p = executaCachePath(cwd);
917
953
  if (!existsSync$1(p)) {
@@ -924,7 +960,7 @@ executa.command("cache-clear").description("Delete the local `.anna/executa.json
924
960
  });
925
961
  const token = program.command("token").description("Manage developer PATs (list / revoke / scopes)");
926
962
  token.command("list").description("List the caller's PATs (most-recent first)").option("--include-revoked", "Also show revoked PATs", false).option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
927
- const { runTokenList } = await import("./token-uedeaAy7.js");
963
+ const { runTokenList } = await import("./token-COnYMRB-.js");
928
964
  process.exit(await runTokenList({
929
965
  includeRevoked: opts.includeRevoked,
930
966
  account: opts.account,
@@ -937,7 +973,7 @@ token.command("revoke <id>").description("Revoke one of the caller's PATs by id"
937
973
  console.error(`✗ token id must be a positive integer (got: ${id})`);
938
974
  process.exit(2);
939
975
  }
940
- const { runTokenRevoke } = await import("./token-uedeaAy7.js");
976
+ const { runTokenRevoke } = await import("./token-COnYMRB-.js");
941
977
  process.exit(await runTokenRevoke({
942
978
  id: idNum,
943
979
  account: opts.account,
@@ -945,7 +981,7 @@ token.command("revoke <id>").description("Revoke one of the caller's PATs by id"
945
981
  }));
946
982
  });
947
983
  token.command("scopes").description("Print the available PAT scope catalogue").option("--account <host>", "Saved account host (default: current)").option("--json", "Emit machine-readable JSON", false).action(async (opts) => {
948
- const { runTokenScopes } = await import("./token-uedeaAy7.js");
984
+ const { runTokenScopes } = await import("./token-COnYMRB-.js");
949
985
  process.exit(await runTokenScopes({
950
986
  account: opts.account,
951
987
  json: opts.json
@@ -960,7 +996,7 @@ program.command("publish").description("Auto-detect cwd and publish (apps publis
960
996
  console.error(`✗ --bump must be patch|minor|major (got: ${opts.bump})`);
961
997
  process.exit(2);
962
998
  }
963
- const { runTopLevelPublish } = await import("./publish-GpvkaBIx.js");
999
+ const { runTopLevelPublish } = await import("./publish-DwIJWl46.js");
964
1000
  process.exit(await runTopLevelPublish({
965
1001
  cwd: opts.cwd,
966
1002
  bump: opts.bump,
@@ -0,0 +1,4 @@
1
+ import "./nexus-root-BlPwOusj.js";
2
+ import { parseExecutaSpec, runDev } from "./dev-GUFWek03.js";
3
+
4
+ export { parseExecutaSpec, runDev };
@@ -49,8 +49,8 @@ async function runDev(opts) {
49
49
  }
50
50
  process.env.ANNA_APP_RUNTIME_STORAGE_MODE = "aps";
51
51
  }
52
- const { PythonBridge, PINNED_RUNTIME_VERSION } = await import("./bridge-CzHB_IsQ.js");
53
- const { HarnessServer } = await import("./server-BMcGaUTy.js");
52
+ const { PythonBridge, PINNED_RUNTIME_VERSION } = await import("./bridge-CzeSuRRL.js");
53
+ const { HarnessServer } = await import("./server-BHWGGZsf.js");
54
54
  const bridge = new PythonBridge({
55
55
  mode,
56
56
  matrixNexusRoot: matrixNexusRoot ?? void 0,
@@ -90,7 +90,7 @@ async function runDev(opts) {
90
90
  if (executas.length > 0) console.log(` executas ${dim(executas.map((e) => e.tool_id).join(", "))}`);
91
91
  const bundledResolved = resolveBundledHandles(dirname(manifestPath), executas);
92
92
  if (Object.keys(bundledResolved).length > 0) {
93
- const { substituteBundledRefs, writeBundleToolIdSidecar } = await import("./bundled-executas-06keEPP_.js");
93
+ const { substituteBundledRefs, writeBundleToolIdSidecar } = await import("./bundled-executas-Bp9Z6aiR.js");
94
94
  try {
95
95
  manifest = substituteBundledRefs(manifest, bundledResolved);
96
96
  writeBundleToolIdSidecar(bundleDir, bundledResolved);
@@ -161,7 +161,7 @@ async function runDev(opts) {
161
161
  */
162
162
  async function resolveRealLlm(args) {
163
163
  const { getAccount } = await import("./credentials-Chkoidh5.js");
164
- const { ensureDevAppRegistered } = await import("./dev-app-cache-Dv1dZ_bw.js");
164
+ const { ensureDevAppRegistered } = await import("./dev-app-cache-B3Wa5t6X.js");
165
165
  const acc = getAccount(args.account);
166
166
  if (!acc) {
167
167
  console.error(red("✗ no developer PAT on disk — run `anna-app login --host <nexus-url>` first.\n (or use `--no-llm` / `--mock-llm <fixture>` to develop offline.)"));
@@ -190,7 +190,7 @@ async function resolveRealLlm(args) {
190
190
  account: args.account,
191
191
  appSlug: entry.slug,
192
192
  onAppSlugNotFound: async () => {
193
- const { invalidateDevAppCache } = await import("./dev-app-cache-Dv1dZ_bw.js");
193
+ const { invalidateDevAppCache } = await import("./dev-app-cache-B3Wa5t6X.js");
194
194
  invalidateDevAppCache(args.cwd);
195
195
  const fresh = getAccount(args.account);
196
196
  if (!fresh) throw new Error("PAT not found while re-registering dev app — run `anna-app login` again");
@@ -5,6 +5,19 @@ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "
5
5
  //#region src/dev-app-cache.ts
6
6
  const CACHE_DIR = ".anna";
7
7
  const CACHE_FILE = "dev-app.json";
8
+ /**
9
+ * Bump this whenever the server-side dev-app grant shape changes in a way
10
+ * that requires a re-register to pick up (registration is idempotent and
11
+ * refreshes the grant bundle server-side). Cached entries written with a
12
+ * lower `cache_version` are treated as stale and re-POSTed.
13
+ *
14
+ * 1 — initial (implicit: entries without `cache_version`; server wrote
15
+ * `llm_grant` only)
16
+ * 2 — server now writes the full dev grant bundle (llm + image + upload);
17
+ * re-register so pre-existing dev apps pick up `upload_grant` /
18
+ * `image_grant` (fixes host/uploadFile → APP_NOT_GRANTED, forum #159)
19
+ */
20
+ const DEV_APP_CACHE_VERSION = 2;
8
21
  function cachePath(cwd) {
9
22
  return resolve(cwd, CACHE_DIR, CACHE_FILE);
10
23
  }
@@ -18,7 +31,8 @@ function readDevAppCache(cwd) {
18
31
  slug: raw.slug,
19
32
  app_id: raw.app_id,
20
33
  name: raw.name ?? raw.slug,
21
- registered_at: raw.registered_at ?? ""
34
+ registered_at: raw.registered_at ?? "",
35
+ cache_version: typeof raw.cache_version === "number" ? raw.cache_version : 0
22
36
  };
23
37
  } catch {}
24
38
  return null;
@@ -83,7 +97,7 @@ async function listDevApps(args) {
83
97
  async function ensureDevAppRegistered(args) {
84
98
  const canonical = canonicalHost(args.host);
85
99
  const cached = readDevAppCache(args.cwd);
86
- if (cached && cached.host === canonical && cached.slug === args.input.slug) try {
100
+ if (cached && cached.host === canonical && cached.slug === args.input.slug && cached.cache_version >= DEV_APP_CACHE_VERSION) try {
87
101
  const apps = await listDevApps({
88
102
  host: args.host,
89
103
  pat: args.pat
@@ -103,7 +117,8 @@ async function ensureDevAppRegistered(args) {
103
117
  slug: r.slug,
104
118
  app_id: r.app_id,
105
119
  name: r.name,
106
- registered_at: new Date().toISOString()
120
+ registered_at: new Date().toISOString(),
121
+ cache_version: DEV_APP_CACHE_VERSION
107
122
  };
108
123
  writeDevAppCache(args.cwd, entry);
109
124
  return entry;
@@ -1,5 +1,5 @@
1
1
  import { findMatrixNexusRoot, nexusSchemaDir } from "./nexus-root-BlPwOusj.js";
2
- import { PINNED_RUNTIME_VERSION } from "./bridge-CbjqAm0H.js";
2
+ import { PINNED_RUNTIME_VERSION } from "./bridge-Dvck0e9c.js";
3
3
  import { resolve } from "node:path";
4
4
  import { existsSync, statSync } from "node:fs";
5
5
  import { spawnSync } from "node:child_process";
@@ -1,4 +1,4 @@
1
1
  import "./credentials-BTv2IfUZ.js";
2
- import { executaCacheMatches, executaCachePath, invalidateExecutaCache, mintIdempotencyKey, readExecutaIdentity, writeExecutaIdentity } from "./executa-cache-Do1D7xC0.js";
2
+ import { executaCacheMatches, executaCachePath, invalidateExecutaCache, mintIdempotencyKey, readExecutaIdentity, writeExecutaIdentity } from "./executa-cache-BFoUtb4J.js";
3
3
 
4
4
  export { executaCachePath, invalidateExecutaCache };
@@ -1,8 +1,8 @@
1
1
  import "./credentials-BTv2IfUZ.js";
2
2
  import { CliError } from "./client-D-_z1ALk.js";
3
- import { resolveClient, withErrorHandling } from "./_lifecycle-shared-CUK2CE76.js";
4
- import { deleteMyTool, listMyTools, listToolVersions, unpublishTool, yankToolVersion } from "./executas-BhFed1B-.js";
5
- import { ensureDestructiveAllowed } from "./confirm-BuT56E_B.js";
3
+ import { resolveClient, withErrorHandling } from "./_lifecycle-shared-RyiRITI5.js";
4
+ import { deleteMyTool, listMyTools, listToolVersions, unpublishTool, yankToolVersion } from "./executas-CvQY_w2U.js";
5
+ import { ensureDestructiveAllowed } from "./confirm-BSoOy1X2.js";
6
6
  import { dim, green, yellow } from "kleur/colors";
7
7
 
8
8
  //#region src/commands/executa-destructive.ts