@anna-ai/cli 0.1.32 → 0.1.34

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-CrBRnzf4.js} +3 -3
  5. package/dist/{apps-dvknZYI2.js → apps-C_Oln_om.js} +1 -1
  6. package/dist/apps-cut-C14A3V93.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-B49iiOX6.js} +12 -10
  9. package/dist/{apps-grants-DnXCnkH5.js → apps-grants-lmllFB02.js} +1 -1
  10. package/dist/apps-publish-B9CnifEx.js +17 -0
  11. package/dist/{apps-publish-BKqVsS1W.js → apps-publish-qc_E4b_R.js} +7 -7
  12. package/dist/{apps-push-B3wZr9B4.js → apps-push-DnINd0Cx.js} +14 -12
  13. package/dist/{apps-release-DZK30eF_.js → apps-release--7R2cmPg.js} +7 -6
  14. package/dist/{apps-rename-slug-D2BrWasG.js → apps-rename-slug-CGykNHM5.js} +3 -3
  15. package/dist/{apps-status-Ca6MdXZd.js → apps-status-CcCoYu6i.js} +2 -2
  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-dy9j-5n8.js} +4 -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 +74 -41
  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-Ah6J7jYd.js → executa-publish-CGz5wM1Q.js} +20 -4
  34. package/dist/executa-publish-DHICU6S0.js +11 -0
  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-CYMtWJU7.js +9 -0
  38. package/dist/executa-upload-binaries-Do5Sq64E.js +277 -0
  39. package/dist/{manifest-DOMrcdCK.js → manifest-DlIcwLQs.js} +56 -1
  40. package/dist/{publish-GpvkaBIx.js → publish-DW_D3uQ4.js} +12 -10
  41. package/dist/{server-BMcGaUTy.js → server-BHWGGZsf.js} +1 -1
  42. package/dist/{storage-BkF4XyI0.js → storage-aii8EyPC.js} +1 -1
  43. package/dist/{token-uedeaAy7.js → token-COnYMRB-.js} +1 -1
  44. package/dist/{working-orchestration-1jzRuk34.js → working-orchestration-B8KdAh5S.js} +5 -5
  45. package/package.json +1 -1
  46. package/dist/apps-cut-8870xpk-.js +0 -86
  47. package/dist/apps-publish-Djpw5cfG.js +0 -15
  48. package/dist/bridge-CzHB_IsQ.js +0 -3
  49. package/dist/dev-C3yWhzAp.js +0 -4
  50. package/dist/executa-install-Cyid8R7r.js +0 -7
  51. package/dist/executa-publish-DI_6M_ea.js +0 -9
  52. /package/dist/{app-cache-BqnTkxUw.js → app-cache-Cr3tKbux.js} +0 -0
  53. /package/dist/{bundled-executas-_H1A9M50.js → bundled-executas-rSIkaA6-.js} +0 -0
  54. /package/dist/{confirm-BuT56E_B.js → confirm-BSoOy1X2.js} +0 -0
  55. /package/dist/{dev-account-DqEFCmVg.js → dev-account-CfVdGa9j.js} +0 -0
  56. /package/dist/{executa-cache-Do1D7xC0.js → executa-cache-BFoUtb4J.js} +0 -0
  57. /package/dist/{executa-init-D-kWINZ3.js → executa-init-DKy7DMSD.js} +0 -0
  58. /package/dist/{executa-register-D5kvSSz_.js → executa-register-CmqKsoAU.js} +0 -0
  59. /package/dist/{executas-BhFed1B-.js → executas-CvQY_w2U.js} +0 -0
  60. /package/dist/{fixture-BUKQYR5e.js → fixture-BF1Z0Rry.js} +0 -0
  61. /package/dist/{host_upload-BVzAqvX1.js → host_upload-DrbQ-vk2.js} +0 -0
  62. /package/dist/{image-BLPyUbGQ.js → image-B4UrufYH.js} +0 -0
  63. /package/dist/{listing-meta-BlY7XMrw.js → listing-meta-C0HsNjIB.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-CGykNHM5.js");
652
652
  process.exit(await runAppsRenameSlug({
653
653
  newSlug,
654
654
  cwd: opts.cwd,
@@ -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-B9CnifEx.js");
670
670
  process.exit(await runAppsPublish({
671
671
  cwd: opts.cwd,
672
672
  manifest: opts.manifest,
@@ -699,7 +699,7 @@ apps.command("push").description("Upsert the mutable working draft (manifest + b
699
699
  process.exit(2);
700
700
  }
701
701
  }
702
- const { runAppsPush } = await import("./apps-push-B3wZr9B4.js");
702
+ const { runAppsPush } = await import("./apps-push-DnINd0Cx.js");
703
703
  process.exit(await runAppsPush({
704
704
  cwd: opts.cwd,
705
705
  manifest: opts.manifest,
@@ -718,7 +718,7 @@ apps.command("push").description("Upsert the mutable working draft (manifest + b
718
718
  }));
719
719
  });
720
720
  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");
721
+ const { runAppsCut } = await import("./apps-cut-C14A3V93.js");
722
722
  process.exit(await runAppsCut({
723
723
  version,
724
724
  changelog: opts.changelog,
@@ -730,7 +730,7 @@ apps.command("cut <version>").description("Snapshot the working draft into an im
730
730
  }));
731
731
  });
732
732
  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");
733
+ const { runAppsDiscard } = await import("./apps-discard-B49iiOX6.js");
734
734
  process.exit(await runAppsDiscard({
735
735
  slug: opts.slug,
736
736
  cwd: opts.cwd,
@@ -740,7 +740,7 @@ apps.command("discard").description("Drop the mutable working draft (leaves cut
740
740
  }));
741
741
  });
742
742
  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-DZK30eF_.js");
743
+ const { runAppsRelease } = await import("./apps-release--7R2cmPg.js");
744
744
  process.exit(await runAppsRelease({
745
745
  version,
746
746
  slug: opts.slug,
@@ -752,7 +752,7 @@ apps.command("release <version>").description("Freeze & publish an existing remo
752
752
  }));
753
753
  });
754
754
  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");
755
+ const { runAppsSyncMeta } = await import("./apps-sync-meta-dy9j-5n8.js");
756
756
  process.exit(await runAppsSyncMeta({
757
757
  cwd: opts.cwd,
758
758
  manifest: opts.manifest,
@@ -763,7 +763,7 @@ apps.command("sync-meta").description("Push mutable store metadata (name/tagline
763
763
  }));
764
764
  });
765
765
  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");
766
+ const { runAppsSubmitReview } = await import("./apps-submit-review-DNrQc2ws.js");
767
767
  process.exit(await runAppsSubmitReview({
768
768
  slug,
769
769
  cwd: opts.cwd,
@@ -772,7 +772,7 @@ apps.command("submit-review [slug]").description("Move an app into review (DRAFT
772
772
  }));
773
773
  });
774
774
  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-Ca6MdXZd.js");
775
+ const { runAppsStatus } = await import("./apps-status-CcCoYu6i.js");
776
776
  process.exit(await runAppsStatus({
777
777
  slug,
778
778
  account: opts.account,
@@ -780,7 +780,7 @@ apps.command("status <slug>").description("Show server-known state for one Anna
780
780
  }));
781
781
  });
782
782
  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");
783
+ const { runAppsVersions } = await import("./apps-versions-2BR8xo7C.js");
784
784
  process.exit(await runAppsVersions({
785
785
  slug,
786
786
  account: opts.account,
@@ -788,7 +788,7 @@ apps.command("versions <slug>").description("List all server versions of one Ann
788
788
  }));
789
789
  });
790
790
  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");
791
+ const { runAppsGrants } = await import("./apps-grants-lmllFB02.js");
792
792
  process.exit(await runAppsGrants({
793
793
  slug,
794
794
  account: opts.account,
@@ -796,7 +796,7 @@ apps.command("grants <slug>").description("Show currently granted scopes/quota f
796
796
  }));
797
797
  });
798
798
  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");
799
+ const { runAppsUnpublish } = await import("./apps-destructive-a2YBmWFm.js");
800
800
  process.exit(await runAppsUnpublish({
801
801
  slug,
802
802
  yes: opts.yes,
@@ -806,7 +806,7 @@ apps.command("unpublish <slug>").description("Flip a PUBLISHED app back to APPRO
806
806
  }));
807
807
  });
808
808
  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");
809
+ const { runAppsArchive } = await import("./apps-destructive-a2YBmWFm.js");
810
810
  process.exit(await runAppsArchive({
811
811
  slug,
812
812
  yes: opts.yes,
@@ -816,7 +816,7 @@ apps.command("archive <slug>").description("Archive an Anna App (hides it from e
816
816
  }));
817
817
  });
818
818
  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");
819
+ const { runAppsUnarchive } = await import("./apps-destructive-a2YBmWFm.js");
820
820
  process.exit(await runAppsUnarchive({
821
821
  slug,
822
822
  yes: opts.yes,
@@ -825,7 +825,7 @@ apps.command("unarchive <slug>").description("Restore an archived Anna App back
825
825
  }));
826
826
  });
827
827
  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");
828
+ const { runAppsDelete } = await import("./apps-destructive-a2YBmWFm.js");
829
829
  process.exit(await runAppsDelete({
830
830
  slug,
831
831
  yes: opts.yes,
@@ -835,14 +835,14 @@ apps.command("delete <slug>").description("Hard-delete an Anna App (refused by s
835
835
  }));
836
836
  });
837
837
  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");
838
+ const { runExecutaList } = await import("./executa-reads-BmwT_Yjp.js");
839
839
  process.exit(await runExecutaList({
840
840
  account: opts.account,
841
841
  json: opts.json
842
842
  }));
843
843
  });
844
844
  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");
845
+ const { runExecutaStatus } = await import("./executa-reads-BmwT_Yjp.js");
846
846
  process.exit(await runExecutaStatus({
847
847
  ref,
848
848
  account: opts.account,
@@ -850,7 +850,7 @@ executa.command("status <ref>").description("Show server-known state for one Exe
850
850
  }));
851
851
  });
852
852
  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");
853
+ const { runExecutaVersions } = await import("./executa-reads-BmwT_Yjp.js");
854
854
  process.exit(await runExecutaVersions({
855
855
  ref,
856
856
  account: opts.account,
@@ -866,7 +866,7 @@ executa.command("publish").description("Mint or update an Executa (executa.json
866
866
  console.error(`✗ --bump must be patch|minor|major (got: ${opts.bump})`);
867
867
  process.exit(2);
868
868
  }
869
- const { runExecutaPublish } = await import("./executa-publish-DI_6M_ea.js");
869
+ const { runExecutaPublish } = await import("./executa-publish-DHICU6S0.js");
870
870
  process.exit(await runExecutaPublish({
871
871
  cwd: opts.cwd,
872
872
  manifest: opts.manifest,
@@ -878,8 +878,41 @@ executa.command("publish").description("Mint or update an Executa (executa.json
878
878
  json: opts.json
879
879
  }));
880
880
  });
881
+ 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) => {
882
+ const { runExecutaUploadBinaries } = await import("./executa-upload-binaries-CYMtWJU7.js");
883
+ process.exit(await runExecutaUploadBinaries({
884
+ dir: opts.dir,
885
+ dryRun: opts.dryRun,
886
+ oidc: opts.oidc,
887
+ toolId: opts.toolId,
888
+ host: opts.host,
889
+ account: opts.account,
890
+ json: opts.json
891
+ }));
892
+ });
893
+ 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`)");
894
+ 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) => {
895
+ const { runTrustedPublisherAdd } = await import("./executa-trusted-publisher-tVwzjI2d.js");
896
+ process.exit(await runTrustedPublisherAdd(opts));
897
+ });
898
+ 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) => {
899
+ const { runTrustedPublisherList } = await import("./executa-trusted-publisher-tVwzjI2d.js");
900
+ process.exit(await runTrustedPublisherList(opts));
901
+ });
902
+ 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) => {
903
+ const id = Number(publisherId);
904
+ if (!Number.isInteger(id) || id <= 0) {
905
+ console.error(`✗ publisher-id must be a positive integer (got "${publisherId}")`);
906
+ process.exit(2);
907
+ }
908
+ const { runTrustedPublisherRemove } = await import("./executa-trusted-publisher-tVwzjI2d.js");
909
+ process.exit(await runTrustedPublisherRemove({
910
+ ...opts,
911
+ publisherId: id
912
+ }));
913
+ });
881
914
  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");
915
+ const { runExecutaUnpublish } = await import("./executa-destructive-DCfQ1ez5.js");
883
916
  process.exit(await runExecutaUnpublish({
884
917
  slug,
885
918
  yes: opts.yes,
@@ -889,7 +922,7 @@ executa.command("unpublish <slug>").description("Flip an Executa's visibility ba
889
922
  }));
890
923
  });
891
924
  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");
925
+ const { runExecutaYank } = await import("./executa-destructive-DCfQ1ez5.js");
893
926
  process.exit(await runExecutaYank({
894
927
  ref,
895
928
  yes: opts.yes,
@@ -899,7 +932,7 @@ executa.command("yank <ref>").description("Hard-delete one Executa version (<slu
899
932
  }));
900
933
  });
901
934
  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");
935
+ const { runExecutaDelete } = await import("./executa-destructive-DCfQ1ez5.js");
903
936
  process.exit(await runExecutaDelete({
904
937
  slug,
905
938
  yes: opts.yes,
@@ -911,7 +944,7 @@ executa.command("delete <slug>").description("Hard-delete an Executa").option("-
911
944
  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
945
  const { resolve: resolve$1 } = await import("node:path");
913
946
  const { existsSync: existsSync$1 } = await import("node:fs");
914
- const { executaCachePath, invalidateExecutaCache } = await import("./executa-cache-B0O79Hpb.js");
947
+ const { executaCachePath, invalidateExecutaCache } = await import("./executa-cache-WBkCLic7.js");
915
948
  const cwd = resolve$1(opts.cwd ?? process.cwd());
916
949
  const p = executaCachePath(cwd);
917
950
  if (!existsSync$1(p)) {
@@ -924,7 +957,7 @@ executa.command("cache-clear").description("Delete the local `.anna/executa.json
924
957
  });
925
958
  const token = program.command("token").description("Manage developer PATs (list / revoke / scopes)");
926
959
  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");
960
+ const { runTokenList } = await import("./token-COnYMRB-.js");
928
961
  process.exit(await runTokenList({
929
962
  includeRevoked: opts.includeRevoked,
930
963
  account: opts.account,
@@ -937,7 +970,7 @@ token.command("revoke <id>").description("Revoke one of the caller's PATs by id"
937
970
  console.error(`✗ token id must be a positive integer (got: ${id})`);
938
971
  process.exit(2);
939
972
  }
940
- const { runTokenRevoke } = await import("./token-uedeaAy7.js");
973
+ const { runTokenRevoke } = await import("./token-COnYMRB-.js");
941
974
  process.exit(await runTokenRevoke({
942
975
  id: idNum,
943
976
  account: opts.account,
@@ -945,7 +978,7 @@ token.command("revoke <id>").description("Revoke one of the caller's PATs by id"
945
978
  }));
946
979
  });
947
980
  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");
981
+ const { runTokenScopes } = await import("./token-COnYMRB-.js");
949
982
  process.exit(await runTokenScopes({
950
983
  account: opts.account,
951
984
  json: opts.json
@@ -960,7 +993,7 @@ program.command("publish").description("Auto-detect cwd and publish (apps publis
960
993
  console.error(`✗ --bump must be patch|minor|major (got: ${opts.bump})`);
961
994
  process.exit(2);
962
995
  }
963
- const { runTopLevelPublish } = await import("./publish-GpvkaBIx.js");
996
+ const { runTopLevelPublish } = await import("./publish-DW_D3uQ4.js");
964
997
  process.exit(await runTopLevelPublish({
965
998
  cwd: opts.cwd,
966
999
  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
@@ -1,5 +1,5 @@
1
1
  import "./nexus-root-BlPwOusj.js";
2
- import { parseExecutaSpec } from "./dev-Re6NyNDS.js";
2
+ import { parseExecutaSpec } from "./dev-GUFWek03.js";
3
3
  import { isAbsolute, resolve } from "node:path";
4
4
  import { existsSync } from "node:fs";
5
5
  import { bold, cyan, dim, green, red, yellow } from "kleur/colors";
@@ -35,7 +35,7 @@ async function runExecutaDev(opts) {
35
35
  const oneShot = !!(opts.describe || opts.health || opts.invoke);
36
36
  const quiet = oneShot && (opts.json ?? false);
37
37
  const { getAccount } = await import("./credentials-Chkoidh5.js");
38
- const { ensureDevExecutaRegistered } = await import("./dev-app-cache-Dv1dZ_bw.js");
38
+ const { ensureDevExecutaRegistered } = await import("./dev-app-cache-B3Wa5t6X.js");
39
39
  const needsRealMint = !opts.noSampling && !opts.mockSampling || !opts.noAgent && !opts.mockAgent || !opts.noImage && !opts.mockImage || !opts.noUpload && !opts.mockUpload || opts.storage === "real";
40
40
  let effectiveAppSlug = opts.appSlug;
41
41
  let autoRegistered = false;
@@ -57,7 +57,7 @@ async function runExecutaDev(opts) {
57
57
  }
58
58
  }
59
59
  }
60
- const { SamplingBridge } = await import("./sampling-XBIEYU4A.js");
60
+ const { SamplingBridge } = await import("./sampling-BpJcd6BC.js");
61
61
  const simulateUnsupportedResponseFormat = opts.samplingUnsupportedFormat;
62
62
  const sampling = opts.noSampling ? new SamplingBridge({ mode: "off" }) : opts.mockSampling ? new SamplingBridge({
63
63
  mode: "mock",
@@ -69,7 +69,7 @@ async function runExecutaDev(opts) {
69
69
  appSlug: effectiveAppSlug,
70
70
  simulateUnsupportedResponseFormat
71
71
  }) : new SamplingBridge({ mode: "off" });
72
- const { AgentBridge } = await import("./agent-CzPryLi6.js");
72
+ const { AgentBridge } = await import("./agent-DAOr_aiE.js");
73
73
  const agent = opts.noAgent ? new AgentBridge({ mode: "off" }) : opts.mockAgent ? new AgentBridge({
74
74
  mode: "mock",
75
75
  mockFile: opts.mockAgent
@@ -78,7 +78,7 @@ async function runExecutaDev(opts) {
78
78
  account: opts.agentAccount ?? opts.samplingAccount,
79
79
  appSlug: effectiveAppSlug
80
80
  }) : new AgentBridge({ mode: "off" });
81
- const { StorageBridge } = await import("./storage-BkF4XyI0.js");
81
+ const { StorageBridge } = await import("./storage-aii8EyPC.js");
82
82
  const storageMode = opts.storage ?? (opts.mockStorage ? "mock" : "memory");
83
83
  const storage = new StorageBridge({
84
84
  mode: storageMode,
@@ -88,8 +88,8 @@ async function runExecutaDev(opts) {
88
88
  scopes: opts.storageScopes ? opts.storageScopes.split(",").map((s) => s.trim()).filter(Boolean) : void 0,
89
89
  pluginName: parsed.tool_id
90
90
  });
91
- const { ExecutaRunner } = await import("./runner-BxYjAmih.js");
92
- const { ImageBridge } = await import("./image-BLPyUbGQ.js");
91
+ const { ExecutaRunner } = await import("./runner-Bka_coxb.js");
92
+ const { ImageBridge } = await import("./image-B4UrufYH.js");
93
93
  const image = opts.noImage ? new ImageBridge({ mode: "off" }) : opts.mockImage ? new ImageBridge({
94
94
  mode: "mock",
95
95
  mockFile: opts.mockImage
@@ -98,7 +98,7 @@ async function runExecutaDev(opts) {
98
98
  account: opts.imageAccount ?? opts.samplingAccount,
99
99
  appSlug: effectiveAppSlug
100
100
  }) : new ImageBridge({ mode: "off" });
101
- const { HostUploadBridge } = await import("./host_upload-BVzAqvX1.js");
101
+ const { HostUploadBridge } = await import("./host_upload-DrbQ-vk2.js");
102
102
  const hostUpload = opts.noUpload ? new HostUploadBridge({ mode: "off" }) : opts.mockUpload ? new HostUploadBridge({
103
103
  mode: "mock",
104
104
  mockFile: opts.mockUpload
@@ -1,5 +1,5 @@
1
- import { readExecutaIdentity } from "./executa-cache-Do1D7xC0.js";
2
- import { parseExecutaSpec } from "./dev-Re6NyNDS.js";
1
+ import { readExecutaIdentity } from "./executa-cache-BFoUtb4J.js";
2
+ import { parseExecutaSpec } from "./dev-GUFWek03.js";
3
3
  import { isAbsolute, join, resolve } from "node:path";
4
4
  import { chmodSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
5
5
  import { bold, cyan, dim, green, red, yellow } from "kleur/colors";
@@ -0,0 +1,7 @@
1
+ import "./credentials-BTv2IfUZ.js";
2
+ import "./nexus-root-BlPwOusj.js";
3
+ import "./executa-cache-BFoUtb4J.js";
4
+ import "./dev-GUFWek03.js";
5
+ import { runExecutaInstall } from "./executa-install-Dz7hBUsn.js";
6
+
7
+ export { runExecutaInstall };