@ashlr/hub 3.5.1 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/CHANGELOG.md +165 -0
  2. package/README.md +3 -0
  3. package/dist/build-identity.json +2 -2
  4. package/dist/cli/activation.d.ts +41 -0
  5. package/dist/cli/activation.js +485 -0
  6. package/dist/cli/activation.js.map +1 -0
  7. package/dist/core/daemon/cutoff-checkpoint-scheduler.js +7 -0
  8. package/dist/core/daemon/cutoff-checkpoint-scheduler.js.map +1 -1
  9. package/dist/core/daemon/loop.d.ts +19 -0
  10. package/dist/core/daemon/loop.js +235 -5
  11. package/dist/core/daemon/loop.js.map +1 -1
  12. package/dist/core/daemon/overnight-status.d.ts +152 -0
  13. package/dist/core/daemon/overnight-status.js +275 -0
  14. package/dist/core/daemon/overnight-status.js.map +1 -0
  15. package/dist/core/daemon/post-merge-halt.d.ts +212 -0
  16. package/dist/core/daemon/post-merge-halt.js +503 -0
  17. package/dist/core/daemon/post-merge-halt.js.map +1 -0
  18. package/dist/core/daemon/run-window.d.ts +218 -0
  19. package/dist/core/daemon/run-window.js +420 -0
  20. package/dist/core/daemon/run-window.js.map +1 -0
  21. package/dist/core/fleet/generated-repair-resolution.d.ts +36 -0
  22. package/dist/core/fleet/generated-repair-resolution.js +245 -0
  23. package/dist/core/fleet/generated-repair-resolution.js.map +1 -0
  24. package/dist/core/local-runtime/llama/port.d.ts +17 -0
  25. package/dist/core/local-runtime/llama/port.js +47 -0
  26. package/dist/core/local-runtime/llama/port.js.map +1 -0
  27. package/dist/core/local-runtime/llama/proxy-host.d.ts +54 -0
  28. package/dist/core/local-runtime/llama/proxy-host.js +159 -0
  29. package/dist/core/local-runtime/llama/proxy-host.js.map +1 -0
  30. package/dist/core/local-runtime/llama/proxy-process.d.ts +148 -0
  31. package/dist/core/local-runtime/llama/proxy-process.js +250 -0
  32. package/dist/core/local-runtime/llama/proxy-process.js.map +1 -0
  33. package/dist/core/local-runtime/llama/proxy-record.d.ts +40 -0
  34. package/dist/core/local-runtime/llama/proxy-record.js +133 -0
  35. package/dist/core/local-runtime/llama/proxy-record.js.map +1 -0
  36. package/dist/core/local-runtime/llama/proxy-supervisor.d.ts +118 -0
  37. package/dist/core/local-runtime/llama/proxy-supervisor.js +511 -0
  38. package/dist/core/local-runtime/llama/proxy-supervisor.js.map +1 -0
  39. package/dist/core/policy/local-only.d.ts +142 -2
  40. package/dist/core/policy/local-only.js +204 -15
  41. package/dist/core/policy/local-only.js.map +1 -1
  42. package/dist/core/run/budget.d.ts +22 -8
  43. package/dist/core/run/budget.js +80 -12
  44. package/dist/core/run/budget.js.map +1 -1
  45. package/dist/core/run/sandboxed-engine.js +3 -3
  46. package/dist/core/run/sandboxed-engine.js.map +1 -1
  47. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  48. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +61 -9
  49. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +60 -8
  50. package/dist/core/verse/session-engine.d.ts +42 -1
  51. package/dist/core/verse/session-engine.js +79 -2
  52. package/dist/core/verse/session-engine.js.map +1 -1
  53. package/dist/core/web/public/next/assets/{App-BbVoUCIi.js → App-BsbJFA2j.js} +2 -2
  54. package/dist/core/web/public/next/assets/{App-BbVoUCIi.js.map → App-BsbJFA2j.js.map} +1 -1
  55. package/dist/core/web/public/next/assets/{ApprovalsSection-BW9iVjUa.js → ApprovalsSection-2CCSoBTJ.js} +2 -2
  56. package/dist/core/web/public/next/assets/{ApprovalsSection-BW9iVjUa.js.map → ApprovalsSection-2CCSoBTJ.js.map} +1 -1
  57. package/dist/core/web/public/next/assets/{AutonomySection-Cpk_oEhc.css → AutonomySection-CHjxJt2z.css} +1 -1
  58. package/dist/core/web/public/next/assets/AutonomySection-yeNNUPur.js +2 -0
  59. package/dist/core/web/public/next/assets/AutonomySection-yeNNUPur.js.map +1 -0
  60. package/dist/core/web/public/next/assets/ChatSection-BfnLe5dT.css +1 -0
  61. package/dist/core/web/public/next/assets/ChatSection-DwDDnCZQ.js +80 -0
  62. package/dist/core/web/public/next/assets/ChatSection-DwDDnCZQ.js.map +1 -0
  63. package/dist/core/web/public/next/assets/{ConfirmDialog-CXevY3Au.js → ConfirmDialog-C363ty_c.js} +2 -2
  64. package/dist/core/web/public/next/assets/{ConfirmDialog-CXevY3Au.js.map → ConfirmDialog-C363ty_c.js.map} +1 -1
  65. package/dist/core/web/public/next/assets/{Dialog-Bn0CgEGz.js → Dialog-nK15L1M0.js} +2 -2
  66. package/dist/core/web/public/next/assets/{Dialog-Bn0CgEGz.js.map → Dialog-nK15L1M0.js.map} +1 -1
  67. package/dist/core/web/public/next/assets/{DiffViewer-QKyisN2L.js → DiffViewer-D369eZe8.js} +2 -2
  68. package/dist/core/web/public/next/assets/{DiffViewer-QKyisN2L.js.map → DiffViewer-D369eZe8.js.map} +1 -1
  69. package/dist/core/web/public/next/assets/McpSection-D88QlDpG.css +1 -0
  70. package/dist/core/web/public/next/assets/McpSection-DVgiSYG1.js +2 -0
  71. package/dist/core/web/public/next/assets/McpSection-DVgiSYG1.js.map +1 -0
  72. package/dist/core/web/public/next/assets/Meter-CLcr-4wS.css +1 -0
  73. package/dist/core/web/public/next/assets/Meter-Cmo1pLbk.js +2 -0
  74. package/dist/core/web/public/next/assets/Meter-Cmo1pLbk.js.map +1 -0
  75. package/dist/core/web/public/next/assets/{MutationTokenDialog-DbSHPy3w.js → MutationTokenDialog-B9I4PAcp.js} +2 -2
  76. package/dist/core/web/public/next/assets/{MutationTokenDialog-DbSHPy3w.js.map → MutationTokenDialog-B9I4PAcp.js.map} +1 -1
  77. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-C-PCgCzo.js → ResourcePoolConsoleApp-z6tJj3s9.js} +2 -2
  78. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-C-PCgCzo.js.map → ResourcePoolConsoleApp-z6tJj3s9.js.map} +1 -1
  79. package/dist/core/web/public/next/assets/{RouteErrorBoundary-Dw8ZjmkS.js → RouteErrorBoundary-OSajL45F.js} +2 -2
  80. package/dist/core/web/public/next/assets/{RouteErrorBoundary-Dw8ZjmkS.js.map → RouteErrorBoundary-OSajL45F.js.map} +1 -1
  81. package/dist/core/web/public/next/assets/SettingsSection-B3YH2Npi.js +2 -0
  82. package/dist/core/web/public/next/assets/SettingsSection-B3YH2Npi.js.map +1 -0
  83. package/dist/core/web/public/next/assets/{UniverseConsoleApp-Bk5HipM0.js → UniverseConsoleApp-wEKIzl1M.js} +2 -2
  84. package/dist/core/web/public/next/assets/{UniverseConsoleApp-Bk5HipM0.js.map → UniverseConsoleApp-wEKIzl1M.js.map} +1 -1
  85. package/dist/core/web/public/next/assets/{UniverseView-D8k9q0ce.js → UniverseView-CQVpJqqI.js} +2 -2
  86. package/dist/core/web/public/next/assets/{UniverseView-D8k9q0ce.js.map → UniverseView-CQVpJqqI.js.map} +1 -1
  87. package/dist/core/web/public/next/assets/{UsageSection-B2E06ZH1.js → UsageSection-dToBThXe.js} +2 -2
  88. package/dist/core/web/public/next/assets/{UsageSection-B2E06ZH1.js.map → UsageSection-dToBThXe.js.map} +1 -1
  89. package/dist/core/web/public/next/assets/VerseConsoleApp-CMkCizvL.css +1 -0
  90. package/dist/core/web/public/next/assets/VerseConsoleApp-DHU32JCQ.js +3 -0
  91. package/dist/core/web/public/next/assets/VerseConsoleApp-DHU32JCQ.js.map +1 -0
  92. package/dist/core/web/public/next/assets/{charts-DSUpczxG.js → charts-BopViIha.js} +2 -2
  93. package/dist/core/web/public/next/assets/{charts-DSUpczxG.js.map → charts-BopViIha.js.map} +1 -1
  94. package/dist/core/web/public/next/assets/global-DMWakEhP.js +2 -0
  95. package/dist/core/web/public/next/assets/global-DMWakEhP.js.map +1 -0
  96. package/dist/core/web/public/next/assets/global-z-JfD3ow.css +1 -0
  97. package/dist/core/web/public/next/assets/{icons-BxOX8-XB.js → icons-L06pQH6j.js} +2 -2
  98. package/dist/core/web/public/next/assets/{icons-BxOX8-XB.js.map → icons-L06pQH6j.js.map} +1 -1
  99. package/dist/core/web/public/next/assets/{index-BMRIET7F.js → index-CXgVQHek.js} +3 -3
  100. package/dist/core/web/public/next/assets/{index-BMRIET7F.js.map → index-CXgVQHek.js.map} +1 -1
  101. package/dist/core/web/public/next/assets/{queries-AxnVa02h.js → queries-D3sSlan1.js} +2 -2
  102. package/dist/core/web/public/next/assets/{queries-AxnVa02h.js.map → queries-D3sSlan1.js.map} +1 -1
  103. package/dist/core/web/public/next/assets/{use-guarded-action-BO6c94Wp.js → use-guarded-action-BxfJ9E-n.js} +2 -2
  104. package/dist/core/web/public/next/assets/{use-guarded-action-BO6c94Wp.js.map → use-guarded-action-BxfJ9E-n.js.map} +1 -1
  105. package/dist/core/web/public/next/assets/workspace-model-v0a1gl-C.js +2 -0
  106. package/dist/core/web/public/next/assets/workspace-model-v0a1gl-C.js.map +1 -0
  107. package/dist/core/web/public/next/index.html +1 -1
  108. package/dist/release-dependency-inventory.json +1 -1
  109. package/package.json +1 -1
  110. package/dist/core/web/public/next/assets/AutonomySection-CRqHUhED.js +0 -2
  111. package/dist/core/web/public/next/assets/AutonomySection-CRqHUhED.js.map +0 -1
  112. package/dist/core/web/public/next/assets/ChatSection-5irrh6Jw.js +0 -80
  113. package/dist/core/web/public/next/assets/ChatSection-5irrh6Jw.js.map +0 -1
  114. package/dist/core/web/public/next/assets/ChatSection-LQiAn6Eu.css +0 -1
  115. package/dist/core/web/public/next/assets/SettingsSection-CWxtTNlD.js +0 -2
  116. package/dist/core/web/public/next/assets/SettingsSection-CWxtTNlD.js.map +0 -1
  117. package/dist/core/web/public/next/assets/VerseConsoleApp-CRfZUV-T.js +0 -3
  118. package/dist/core/web/public/next/assets/VerseConsoleApp-CRfZUV-T.js.map +0 -1
  119. package/dist/core/web/public/next/assets/VerseConsoleApp-D2E3mU9a.css +0 -1
  120. package/dist/core/web/public/next/assets/global-C4jfYHrj.js +0 -2
  121. package/dist/core/web/public/next/assets/global-C4jfYHrj.js.map +0 -1
  122. package/dist/core/web/public/next/assets/global-D463gG1X.css +0 -1
  123. package/dist/core/web/public/next/assets/workspace-model-cE4LkKpE.js +0 -2
  124. package/dist/core/web/public/next/assets/workspace-model-cE4LkKpE.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -339,6 +339,171 @@ superseded, not a setup procedure. Use [runtime activation authority](docs/RUNTI
339
339
  and the [current architecture boundary](docs/ARCHITECTURE.md#legacy-fleet-activation-boundary).
340
340
  Neither the historical record nor a successful test activates a resident fleet.
341
341
 
342
+ ## [3.8.0] — 2026-09-23 UTC — local-only actually prevents spend
343
+
344
+ Two gates that make a promise the UI was already making. Both landed after the
345
+ 3.7.0 tag, so 3.7.0 shipped with local-only leaking in two places.
346
+
347
+ ### The Verse chat gate
348
+
349
+ The Local-only panel said *"Nothing can spend money while this is on"* and
350
+ *"cloud engines are unreachable"*. That was **false for Verse chat sessions**:
351
+ `session-engine.ts` spawned the seat CLI with raw `child_process.spawn` and
352
+ imported nothing from `policy/`, so an interactive Claude, Codex or Grok turn
353
+ still ran and still spent.
354
+
355
+ The daemon path was gated at seven chokepoints, and a structural test enumerated
356
+ them — which is exactly why this survived. The test listed every chokepoint
357
+ except this one, so the gap looked audited. Verse is now chokepoint 13, with a
358
+ test asserting the gate sits inside `startTurn` *before* the `spawn(`.
359
+
360
+ ### Locality is not the same claim as spend
361
+
362
+ `local-only.ts` answered one question — local or cloud — that was used to decide
363
+ two: where inference runs, and whether something can bill you. Its purpose is the
364
+ second. For every subject except CLI agents the answers coincide. For `ashlrcode`
365
+ they did not: it is a local **process** whose inference is cloud by default, and
366
+ `sandboxed-engine.ts` hands every cli-agent spawn `CLAUDE_CODE_OAUTH_TOKEN` /
367
+ `ANTHROPIC_AUTH_TOKEN` plus the config dirs where subscription auth lives.
368
+
369
+ Measured before the change: `enginePermitted('ashlrcode')`, `binPermitted('ac')`
370
+ and `binPermitted('aw')` all **permitted** under local-only, and
371
+ `estCostUsd('ashlrcode', 1M, 1M)` was **$18**.
372
+
373
+ `Meteredness = 'free' | 'metered' | 'unknown'` now sits beside `EngineLocality`,
374
+ which is unchanged — local-fleet membership, pool tiering and local-context
375
+ injection all legitimately want "runs on this machine". **Local-only refuses
376
+ anything not provably free, including `unknown`**: a spend policy cannot treat
377
+ "I can't tell" as safe, which is how this survived. `estCostUsd` keys on
378
+ meteredness, never locality, and does not report $0 for a metered agent — zero
379
+ would be worse than wrong, because a wrong number invites scrutiny and a zero
380
+ ends it.
381
+
382
+ `ashlrcode` is `metered` by decision: its repo has not moved in three months and
383
+ Qwen3.8 now drives the local lane, so refusing it under local-only costs nothing.
384
+ `aw` is `unknown` rather than `metered` — its cloud fallback is opt-in, but that
385
+ opt-in lives in aw's own config which the hub never reads, and asserting
386
+ otherwise would be the same error mirrored.
387
+
388
+ Three assertions in `local-only-policy.test.ts` had been **defending the bug** as
389
+ expected behaviour. They were green on master.
390
+
391
+ ### Known residual
392
+
393
+ `forceLocalOnly` — the autonomy director's cost-*pressure* switch — is a
394
+ different mechanism from `cfg.foundry.localOnly` and still allows `ashlrcode`.
395
+ Closing it is a decision about what the director should do when it is trying to
396
+ save money rather than forbid spending it. See `docs/LOCALITY-VS-SPEND.md`.
397
+
398
+ ## [3.7.0] — 2026-09-23 UTC — The console you can actually navigate, and a fleet that can be bounded
399
+
400
+ ### Verse
401
+
402
+ - **The rail expands** (⌘\), with labels and ⌘-digits. Hover used to show the
403
+ *native browser tooltip* — unstyled, mouse-only, clipping against the sidebar.
404
+ There is now a real portalled Tooltip primitive, and adopting it fixed a live
405
+ accessibility defect: `aria-describedby` sat on a wrapper rather than the
406
+ focusable child, so nothing was ever announced. A **disabled** trigger emits no
407
+ pointer events, so its tooltip could never open — precisely the tooltip that
408
+ matters, since it explains why the control is disabled.
409
+ - **The header earns its height.** It held one toggle floating at the right edge
410
+ with nothing anchoring the left, because the sidebar toggle only rendered while
411
+ the sidebar was collapsed.
412
+ - **Display size** — Default / Large / Extra large, scaling type *and* spacing as
413
+ a multiplier rather than a second table of literals, because density and scale
414
+ have identical CSS specificity and two literal tables would let file order
415
+ decide what "Compact + Large" means. Rail width and strip height are pinned so
416
+ the traffic-light clearance cannot regress.
417
+ - **Pane resizing** that survives a real drag: widths are a desired/effective
418
+ pair, so a wide sidebar narrows on a small window and springs back. It also
419
+ turned out the resize handle was eating 4px of the macOS window drag strip.
420
+ - **Saved projects and a native folder picker**, and the MCP section is mounted.
421
+
422
+ ### Autonomy
423
+
424
+ - **A bounded run window** — until paused, at a wall-clock time, or after N
425
+ iterations. The window is an absolute instant, never a countdown, so a host
426
+ suspended at 01:00 and opened at 09:00 finds its 07:00 window expired.
427
+ - **The post-merge halt.** The pre-merge gate was already strict; *nothing re-ran
428
+ the suite after a merge*, so a regression merged at 01:00 compounded all night.
429
+ A dirty working tree halts too, as **unprovable** rather than *regressed* — a
430
+ run that measured uncommitted edits has proven nothing. Ignored files are not
431
+ dirt, or it would halt every night.
432
+
433
+ ### Corrections
434
+
435
+ - A test guard was red, and a red guard protects nothing. The Anthropic shim is a
436
+ request normaliser, not a transport — its one `/chat/completions` is in a doc
437
+ comment recording a measurement.
438
+ - `VerseApp.test.tsx` had been passing by luck of file ordering; the first test to
439
+ mount the shell paid ChatSection's cold transform cost inside its own 1000ms
440
+ assertion window.
441
+
442
+ ## [3.6.0] — 2026-09-23 UTC — Open any project, from a real picker
443
+
444
+ Verse could already drive any folder on the machine — the API accepted an
445
+ unenrolled path and both Grok and local seats ran in it. What it could not do was
446
+ let you *choose* one. The only way in was typing an absolute path into a text
447
+ box, and a folder you typed vanished from the list until a chat existed on it.
448
+ This release is the door.
449
+
450
+ ### Any folder, from a native chooser
451
+
452
+ - **A real macOS directory picker.** "Choose folder…" opens `NSOpenPanel`
453
+ through the Tauri dialog plugin. Detection is a call-time feature probe of the
454
+ injected shell global, not a build flag, because the same bundle is served
455
+ inside the desktop app and as a plain web UI — in a browser the button is
456
+ absent and the absolute-path input remains, which is never removed.
457
+ - **Saved projects the console can actually create.** `createVerseWorkspace`,
458
+ `updateVerseWorkspace`, `deleteVerseWorkspace`, `setVerseRootPriority` and
459
+ `setVerseFocusSection` all existed with **zero callers**, so
460
+ `~/.ashlr/verse/workspaces.json` could only be written by hand. There is now a
461
+ Projects section in the sidebar: save, rename, add and remove folders, reorder
462
+ (the first folder is the primary — its directory is the chat's working
463
+ directory), and forget behind a two-step confirm that states existing chats
464
+ are untouched.
465
+ - **Interactive and autonomous stay separate registries.** Saving a folder to
466
+ work in never enrols it for unattended work. A saved project can be *offered*
467
+ to the autonomous lane, but only by ticking that box.
468
+ - **The Grok caveat travels with a saved project.** Grok takes no extra roots,
469
+ so a multi-root project picked with a Grok seat now says its extra folders are
470
+ unreachable. That case previously had no warning at all.
471
+
472
+ ### The MCP section exists again
473
+
474
+ `McpSection.tsx` was complete — query layer, tested contract, complete server
475
+ side — and unreachable: absent from `VERSE_SECTIONS`, no `'mcp'` member on
476
+ `VerseSectionId`, and outside the glob that mounts sections. It is now ⌘6.
477
+ ⌘1–⌘5 keep their meanings.
478
+
479
+ It also discloses a footgun nothing named before: Codex and Grok inherit MCP
480
+ from their native profile config, so a turn on an unenrolled folder can reach an
481
+ `ashlr__*` write tool and be refused by the enrollment gate — the turn fails on
482
+ policy, not on the model. Claude and local seats are unaffected, because the
483
+ adapter passes an empty `--mcp-config` under `--strict-mcp-config`.
484
+
485
+ ### One capability was widened, deliberately
486
+
487
+ `dialog:allow-open` is granted to the remote Verse origin in
488
+ `capabilities/verse-remote.json`, whose note said not to widen the list. It is
489
+ the narrowest dialog permission: it shows a chooser the user must confirm and
490
+ returns a path, reads no file contents, and no `fs:*` permission is granted
491
+ anywhere in the app. `allow-save`, `allow-message`, `allow-ask` and
492
+ `allow-confirm` stay ungranted so page code cannot forge a native prompt.
493
+
494
+ It had to go in that file rather than `main.json`: the Verse window loads a
495
+ remote origin, and a Tauri 2 capability without a `remote` block never reaches
496
+ one — the grant would have looked correct in review and failed silently at
497
+ runtime.
498
+
499
+ ### Verified in the built app, not only in tests
500
+
501
+ The picker was driven end to end in a real build: the button renders inside the
502
+ shell, `NSOpenPanel` opens, the chosen path lands in the field, "Start chat"
503
+ enables, "Save as a project" persists and appears in the sidebar, and forget
504
+ removes it. Separately, `POST /api/verse/workspaces` was confirmed against a
505
+ live server to create a record on disk and list it back.
506
+
342
507
  ## [3.5.1] — 2026-09-23 UTC — The dependency backlog, landed rather than deferred
343
508
 
344
509
  Four dependency PRs had been sitting open. None was a version bump; each needed
package/README.md CHANGED
@@ -7,6 +7,9 @@
7
7
  **[verse.ashlr.ai](https://verse.ashlr.ai)** — Ashlr Verse, the operator console: every account you own
8
8
  behind one surface, plus a local model that keeps working after the quota runs out.
9
9
 
10
+
11
+ ![Ashlr Verse — the operator console: an expandable section rail, a project sidebar, and every connected account with its live usage windows](docs/images/verse-console.png)
12
+
10
13
  [![npm](https://img.shields.io/npm/v/@ashlr/hub.svg?logo=npm&label=%40ashlr%2Fhub&color=cb3837)](https://www.npmjs.com/package/@ashlr/hub)
11
14
  [![npm downloads](https://img.shields.io/npm/dm/@ashlr/hub.svg?color=cb3837)](https://www.npmjs.com/package/@ashlr/hub)
12
15
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](./LICENSE)
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "packageVersion": "3.5.1",
4
- "revision": "5bbb2454b7238f8db83acc7b7b8b9635bd89d2da",
3
+ "packageVersion": "3.8.0",
4
+ "revision": "a3a44cbbc5599bdb369c3cba1d7fcd53a45fa854",
5
5
  "dirty": false,
6
6
  "provenance": "git"
7
7
  }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * `ashlr activation` — operator authority for the autonomous fleet (M470).
3
+ *
4
+ * The daemon, goal/simple conductors, and resident-service install are all
5
+ * held shut by hard-coded denials until an operator EXPLICITLY grants
6
+ * authority here. Doing nothing keeps today's exact behavior: everything
7
+ * denied. This command group is how an operator opts in, on their own
8
+ * terms, with a real signed/expiring/revocable authorization trail.
9
+ *
10
+ * Subcommands:
11
+ * activation init [--label <text>] [--force] [--yes] [--json]
12
+ * Generate an Ed25519 keypair on this machine (private key never
13
+ * leaves it) and register the public half as a trust root. Grants
14
+ * NOTHING by itself — run `activation grant` next.
15
+ * activation status [--json]
16
+ * Trust roots, pending one-shot permit, standing grants, and what is
17
+ * currently authorized, right now, and why.
18
+ * activation grant <scope...> [--ttl <duration>] [--yes] [--json]
19
+ * Mint a scoped, signed, expiring authorization. `once`/`resident`
20
+ * mint a single-use permit for `ashlr daemon start`, good for a fixed
21
+ * 2-minute window; any of `residentStanding`/`conductor`/`automerge`/
22
+ * `repair`/`deploy`/`install`/`proposalOnly` mint a standing grant
23
+ * checked on every use until it expires (30d cap) or is revoked.
24
+ * `residentStanding` is what lets a resident daemon started by
25
+ * launchd/systemd/Task Scheduler after a reboot authorize itself with
26
+ * no operator present — grant it once, ahead of time, alongside
27
+ * whichever of `automerge`/`repair`/`deploy` the resident loop should
28
+ * also carry for its whole run.
29
+ * activation revoke --root <keyId> | --grant <grantId> [--yes] [--json]
30
+ * Immediately invalidate a trust root or a standing grant.
31
+ *
32
+ * Every subcommand supports --help. Mutating subcommands (init/grant/revoke)
33
+ * refuse to run unattended in a non-TTY session without --yes — the same
34
+ * confirm-gate convention as `ashlr inbox approve`.
35
+ */
36
+ /**
37
+ * `ashlr activation [init|status|grant|revoke] [flags]`
38
+ *
39
+ * Returns a process exit code (0 = success, non-zero = error/usage).
40
+ */
41
+ export declare function cmdActivation(args: string[]): Promise<number>;