@north-light/api 0.3.580 → 0.3.587
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/client.d.ts +9 -2
- package/dist/api/client.js +22 -0
- package/dist/api/contract.d.ts +1 -1
- package/dist/api/contract.js +1 -1
- package/dist/api/dto/bash-jobs.d.ts +17 -0
- package/dist/api/dto/bash-jobs.js +2 -0
- package/dist/api/dto/execution-start.d.ts +14 -0
- package/dist/api/dto/health.d.ts +22 -0
- package/dist/api/dto/imports.d.ts +142 -0
- package/dist/api/dto/imports.js +2 -0
- package/dist/api/error-codes.d.ts +5 -0
- package/dist/api/error-codes.js +2 -0
- package/dist/api/errors.js +2 -1
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.js +1 -0
- package/dist/api/routes.d.ts +3 -0
- package/dist/api/routes.js +3 -0
- package/dist/build-root.d.ts +66 -0
- package/dist/build-root.js +401 -0
- package/dist/clients/attach/ansi-cells.d.ts +44 -0
- package/dist/clients/attach/ansi-cells.js +137 -0
- package/dist/clients/attach/chrome/bash-jobs.d.ts +16 -0
- package/dist/clients/attach/chrome/bash-jobs.js +34 -0
- package/dist/clients/attach/chrome/canvas-panels.d.ts +43 -0
- package/dist/clients/attach/chrome/canvas-panels.js +227 -0
- package/dist/clients/attach/chrome/completion-bell.d.ts +10 -0
- package/dist/clients/attach/chrome/completion-bell.js +89 -0
- package/dist/clients/attach/chrome/cron-wait.d.ts +3 -0
- package/dist/clients/attach/chrome/cron-wait.js +34 -0
- package/dist/clients/attach/chrome/git-info.d.ts +20 -0
- package/dist/clients/attach/chrome/git-info.js +44 -0
- package/dist/clients/attach/chrome/header.d.ts +10 -0
- package/dist/clients/attach/chrome/header.js +30 -0
- package/dist/clients/attach/chrome/inbox-strip.d.ts +36 -0
- package/dist/clients/attach/chrome/inbox-strip.js +219 -0
- package/dist/clients/attach/chrome/key-hint.d.ts +9 -0
- package/dist/clients/attach/chrome/key-hint.js +16 -0
- package/dist/clients/attach/chrome/object-wait.d.ts +4 -0
- package/dist/clients/attach/chrome/object-wait.js +24 -0
- package/dist/clients/attach/chrome/recap.d.ts +7 -0
- package/dist/clients/attach/chrome/recap.js +19 -0
- package/dist/clients/attach/chrome/review-wait.d.ts +6 -0
- package/dist/clients/attach/chrome/review-wait.js +22 -0
- package/dist/clients/attach/chrome/roster.d.ts +39 -0
- package/dist/clients/attach/chrome/roster.js +294 -0
- package/dist/clients/attach/chrome/status-line.d.ts +38 -0
- package/dist/clients/attach/chrome/status-line.js +127 -0
- package/dist/clients/attach/chrome/ticket-panel.d.ts +29 -0
- package/dist/clients/attach/chrome/ticket-panel.js +280 -0
- package/dist/clients/attach/chrome/widgets.d.ts +9 -0
- package/dist/clients/attach/chrome/widgets.js +51 -0
- package/dist/clients/attach/command.d.ts +3 -0
- package/dist/clients/attach/command.js +107 -0
- package/dist/clients/attach/config.d.ts +95 -0
- package/dist/clients/attach/config.js +275 -0
- package/dist/clients/attach/input/capabilities.d.ts +30 -0
- package/dist/clients/attach/input/capabilities.js +112 -0
- package/dist/clients/attach/input/clipboard-image.d.ts +55 -0
- package/dist/clients/attach/input/clipboard-image.js +237 -0
- package/dist/clients/attach/input/completion-frecency.d.ts +45 -0
- package/dist/clients/attach/input/completion-frecency.js +141 -0
- package/dist/clients/attach/input/controller.d.ts +92 -0
- package/dist/clients/attach/input/controller.js +383 -0
- package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
- package/dist/clients/attach/input/overlay-owner.js +199 -0
- package/dist/clients/attach/input/ref-autocomplete.d.ts +77 -0
- package/dist/clients/attach/input/ref-autocomplete.js +176 -0
- package/dist/clients/attach/input/titled-editor.d.ts +225 -0
- package/dist/clients/attach/input/titled-editor.js +859 -0
- package/dist/clients/attach/overlays/auth.d.ts +13 -0
- package/dist/clients/attach/overlays/auth.js +247 -0
- package/dist/clients/attach/overlays/dialogs.d.ts +27 -0
- package/dist/clients/attach/overlays/dialogs.js +102 -0
- package/dist/clients/attach/overlays/file-review.d.ts +10 -0
- package/dist/clients/attach/overlays/file-review.js +146 -0
- package/dist/clients/attach/overlays/graph.d.ts +83 -0
- package/dist/clients/attach/overlays/graph.js +725 -0
- package/dist/clients/attach/overlays/help.d.ts +33 -0
- package/dist/clients/attach/overlays/help.js +214 -0
- package/dist/clients/attach/overlays/mcp.d.ts +32 -0
- package/dist/clients/attach/overlays/mcp.js +302 -0
- package/dist/clients/attach/overlays/pickers.d.ts +56 -0
- package/dist/clients/attach/overlays/pickers.js +163 -0
- package/dist/clients/attach/render/activity-slot.d.ts +4 -0
- package/dist/clients/attach/render/activity-slot.js +13 -0
- package/dist/clients/attach/render/assistant-message.d.ts +13 -0
- package/dist/clients/attach/render/assistant-message.js +56 -0
- package/dist/clients/attach/render/card-presentation.d.ts +36 -0
- package/dist/clients/attach/render/card-presentation.js +222 -0
- package/dist/clients/attach/render/chat-view.d.ts +409 -0
- package/dist/clients/attach/render/chat-view.js +2108 -0
- package/dist/clients/attach/render/condensed-history.d.ts +21 -0
- package/dist/clients/attach/render/condensed-history.js +60 -0
- package/dist/clients/attach/render/context-message.d.ts +22 -0
- package/dist/clients/attach/render/context-message.js +63 -0
- package/dist/clients/attach/render/crtr-output.d.ts +52 -0
- package/dist/clients/attach/render/crtr-output.js +721 -0
- package/dist/clients/attach/render/diagram.d.ts +4 -0
- package/dist/clients/attach/render/diagram.js +111 -0
- package/dist/clients/attach/render/doc-links.d.ts +36 -0
- package/dist/clients/attach/render/doc-links.js +78 -0
- package/dist/clients/attach/render/edit-diff.d.ts +12 -0
- package/dist/clients/attach/render/edit-diff.js +304 -0
- package/dist/clients/attach/render/glyph-codepoints.d.ts +3 -0
- package/dist/clients/attach/render/glyph-codepoints.js +42 -0
- package/dist/clients/attach/render/group-activity.d.ts +84 -0
- package/dist/clients/attach/render/group-activity.js +276 -0
- package/dist/clients/attach/render/group-recap.d.ts +13 -0
- package/dist/clients/attach/render/group-recap.js +146 -0
- package/dist/clients/attach/render/markdown-source.d.ts +21 -0
- package/dist/clients/attach/render/markdown-source.js +279 -0
- package/dist/clients/attach/render/measured-container.d.ts +96 -0
- package/dist/clients/attach/render/measured-container.js +322 -0
- package/dist/clients/attach/render/page-block.d.ts +39 -0
- package/dist/clients/attach/render/page-block.js +187 -0
- package/dist/clients/attach/render/scroll-animation.d.ts +8 -0
- package/dist/clients/attach/render/scroll-animation.js +80 -0
- package/dist/clients/attach/render/tool-calls.d.ts +53 -0
- package/dist/clients/attach/render/tool-calls.js +350 -0
- package/dist/clients/attach/render/transcript-copy.d.ts +9 -0
- package/dist/clients/attach/render/transcript-copy.js +81 -0
- package/dist/clients/attach/render/transcript-search.d.ts +28 -0
- package/dist/clients/attach/render/transcript-search.js +152 -0
- package/dist/clients/attach/render/viewport.d.ts +38 -0
- package/dist/clients/attach/render/viewport.js +184 -0
- package/dist/clients/attach/session/banner.d.ts +13 -0
- package/dist/clients/attach/session/banner.js +33 -0
- package/dist/clients/attach/session/bindings.d.ts +20 -0
- package/dist/clients/attach/session/bindings.js +71 -0
- package/dist/clients/attach/session/chrome-refresh.d.ts +49 -0
- package/dist/clients/attach/session/chrome-refresh.js +154 -0
- package/dist/clients/attach/session/connection.d.ts +54 -0
- package/dist/clients/attach/session/connection.js +204 -0
- package/dist/clients/attach/session/context.d.ts +59 -0
- package/dist/clients/attach/session/context.js +16 -0
- package/dist/clients/attach/session/document-links.d.ts +12 -0
- package/dist/clients/attach/session/document-links.js +43 -0
- package/dist/clients/attach/session/editor-frame.d.ts +47 -0
- package/dist/clients/attach/session/editor-frame.js +142 -0
- package/dist/clients/attach/session/editor-inventory.d.ts +63 -0
- package/dist/clients/attach/session/editor-inventory.js +156 -0
- package/dist/clients/attach/session/file-links.d.ts +22 -0
- package/dist/clients/attach/session/file-links.js +73 -0
- package/dist/clients/attach/session/focus-events.d.ts +4 -0
- package/dist/clients/attach/session/focus-events.js +12 -0
- package/dist/clients/attach/session/frame.d.ts +46 -0
- package/dist/clients/attach/session/frame.js +214 -0
- package/dist/clients/attach/session/frames.d.ts +51 -0
- package/dist/clients/attach/session/frames.js +203 -0
- package/dist/clients/attach/session/identity.d.ts +16 -0
- package/dist/clients/attach/session/identity.js +26 -0
- package/dist/clients/attach/session/input-wiring.d.ts +53 -0
- package/dist/clients/attach/session/input-wiring.js +146 -0
- package/dist/clients/attach/session/invariant.d.ts +9 -0
- package/dist/clients/attach/session/invariant.js +15 -0
- package/dist/clients/attach/session/keys.d.ts +46 -0
- package/dist/clients/attach/session/keys.js +77 -0
- package/dist/clients/attach/session/layout.d.ts +22 -0
- package/dist/clients/attach/session/layout.js +59 -0
- package/dist/clients/attach/session/mouse.d.ts +27 -0
- package/dist/clients/attach/session/mouse.js +78 -0
- package/dist/clients/attach/session/pane-focus.d.ts +8 -0
- package/dist/clients/attach/session/pane-focus.js +42 -0
- package/dist/clients/attach/session/pane-tag.d.ts +44 -0
- package/dist/clients/attach/session/pane-tag.js +112 -0
- package/dist/clients/attach/session/pi-assets.d.ts +1 -0
- package/dist/clients/attach/session/pi-assets.js +24 -0
- package/dist/clients/attach/session/pi-oauth-flows.d.ts +1 -0
- package/dist/clients/attach/session/pi-oauth-flows.js +21 -0
- package/dist/clients/attach/session/profile-files.d.ts +17 -0
- package/dist/clients/attach/session/profile-files.js +207 -0
- package/dist/clients/attach/session/readonly-popup.d.ts +15 -0
- package/dist/clients/attach/session/readonly-popup.js +25 -0
- package/dist/clients/attach/session/reconnect.d.ts +46 -0
- package/dist/clients/attach/session/reconnect.js +195 -0
- package/dist/clients/attach/session/selection.d.ts +28 -0
- package/dist/clients/attach/session/selection.js +108 -0
- package/dist/clients/attach/session/state-sync.d.ts +38 -0
- package/dist/clients/attach/session/state-sync.js +67 -0
- package/dist/clients/attach/session/surface-frame.d.ts +20 -0
- package/dist/clients/attach/session/surface-frame.js +73 -0
- package/dist/clients/attach/session/surface-host.d.ts +65 -0
- package/dist/clients/attach/session/surface-host.js +256 -0
- package/dist/clients/attach/session/teardown.d.ts +30 -0
- package/dist/clients/attach/session/teardown.js +94 -0
- package/dist/clients/attach/session/transcript-search.d.ts +20 -0
- package/dist/clients/attach/session/transcript-search.js +151 -0
- package/dist/clients/attach/session/whip-achievements.d.ts +4 -0
- package/dist/clients/attach/session/whip-achievements.js +145 -0
- package/dist/clients/attach/session/whip.d.ts +20 -0
- package/dist/clients/attach/session/whip.js +362 -0
- package/dist/clients/attach/slash/dispatch.d.ts +120 -0
- package/dist/clients/attach/slash/dispatch.js +748 -0
- package/dist/clients/attach/slash/prompt-preview.d.ts +30 -0
- package/dist/clients/attach/slash/prompt-preview.js +121 -0
- package/dist/clients/attach/viewer.d.ts +8 -0
- package/dist/clients/attach/viewer.js +873 -0
- package/dist/clients/conversation/projection.d.ts +79 -0
- package/dist/clients/conversation/projection.js +324 -0
- package/dist/clients/conversation/submit.d.ts +38 -0
- package/dist/clients/conversation/submit.js +51 -0
- package/dist/clients/dashboard/app.d.ts +7 -0
- package/dist/clients/dashboard/app.js +438 -0
- package/dist/clients/dashboard/model.d.ts +39 -0
- package/dist/clients/dashboard/model.js +77 -0
- package/dist/clients/dashboard/render.d.ts +29 -0
- package/dist/clients/dashboard/render.js +148 -0
- package/dist/clients/inbox/controller.d.ts +174 -0
- package/dist/clients/inbox/controller.js +816 -0
- package/dist/clients/inbox/dto-adapt.d.ts +28 -0
- package/dist/clients/inbox/dto-adapt.js +93 -0
- package/dist/clients/inbox/layout.d.ts +8 -0
- package/dist/clients/inbox/layout.js +9 -0
- package/dist/clients/inbox/page-adapter.d.ts +33 -0
- package/dist/clients/inbox/page-adapter.js +55 -0
- package/dist/clients/inbox/resolve.d.ts +16 -0
- package/dist/clients/inbox/resolve.js +35 -0
- package/dist/clients/inbox/review/anchors.d.ts +41 -0
- package/dist/clients/inbox/review/anchors.js +89 -0
- package/dist/clients/inbox/review/comments-client.d.ts +74 -0
- package/dist/clients/inbox/review/comments-client.js +103 -0
- package/dist/clients/inbox/review/companion-pane.d.ts +47 -0
- package/dist/clients/inbox/review/companion-pane.js +109 -0
- package/dist/clients/inbox/review/document-surface.d.ts +212 -0
- package/dist/clients/inbox/review/document-surface.js +1268 -0
- package/dist/clients/inbox/review/frame.d.ts +57 -0
- package/dist/clients/inbox/review/frame.js +309 -0
- package/dist/clients/inbox/review/keys.d.ts +69 -0
- package/dist/clients/inbox/review/keys.js +133 -0
- package/dist/clients/inbox/review/launch.d.ts +16 -0
- package/dist/clients/inbox/review/launch.js +170 -0
- package/dist/clients/inbox/review/live-source.d.ts +24 -0
- package/dist/clients/inbox/review/live-source.js +160 -0
- package/dist/clients/inbox/review/nvim.d.ts +15 -0
- package/dist/clients/inbox/review/nvim.js +43 -0
- package/dist/clients/inbox/review/remap.d.ts +51 -0
- package/dist/clients/inbox/review/remap.js +157 -0
- package/dist/clients/inbox/review/review-client.d.ts +43 -0
- package/dist/clients/inbox/review/review-client.js +123 -0
- package/dist/clients/inbox/review/roundtrip.d.ts +5 -0
- package/dist/clients/inbox/review/roundtrip.js +41 -0
- package/dist/clients/inbox/review/state.d.ts +153 -0
- package/dist/clients/inbox/review/state.js +315 -0
- package/dist/clients/inbox/review-adapter.d.ts +17 -0
- package/dist/clients/inbox/review-adapter.js +43 -0
- package/dist/clients/inbox/surface.d.ts +25 -0
- package/dist/clients/inbox/surface.js +190 -0
- package/dist/clients/inbox/tui/ansi.d.ts +68 -0
- package/dist/clients/inbox/tui/ansi.js +321 -0
- package/dist/clients/inbox/tui/input.d.ts +5 -0
- package/dist/clients/inbox/tui/input.js +392 -0
- package/dist/clients/inbox/tui/keys.d.ts +28 -0
- package/dist/clients/inbox/tui/keys.js +104 -0
- package/dist/clients/inbox/tui/page-body.d.ts +10 -0
- package/dist/clients/inbox/tui/page-body.js +69 -0
- package/dist/clients/inbox/tui/panel.d.ts +4 -0
- package/dist/clients/inbox/tui/panel.js +84 -0
- package/dist/clients/inbox/tui/render.d.ts +23 -0
- package/dist/clients/inbox/tui/render.js +378 -0
- package/dist/clients/inbox/tui/slots.d.ts +33 -0
- package/dist/clients/inbox/tui/slots.js +134 -0
- package/dist/clients/inbox/tui/types.d.ts +73 -0
- package/dist/clients/inbox/tui/types.js +1 -0
- package/dist/clients/inbox/tui.d.ts +17 -0
- package/dist/clients/inbox/tui.js +92 -0
- package/dist/clients/surfaces/host.d.ts +74 -0
- package/dist/clients/surfaces/host.js +1 -0
- package/dist/commands/api-client.d.ts +113 -0
- package/dist/commands/api-client.js +427 -0
- package/dist/commands/attention.d.ts +2 -0
- package/dist/commands/attention.js +215 -0
- package/dist/commands/canvas/edges.d.ts +2 -0
- package/dist/commands/canvas/edges.js +41 -0
- package/dist/commands/canvas/list.d.ts +4 -0
- package/dist/commands/canvas/list.js +79 -0
- package/dist/commands/canvas/read.d.ts +14 -0
- package/dist/commands/canvas/read.js +95 -0
- package/dist/commands/canvas/search.d.ts +2 -0
- package/dist/commands/canvas/search.js +49 -0
- package/dist/commands/canvas/share.d.ts +2 -0
- package/dist/commands/canvas/share.js +80 -0
- package/dist/commands/canvas/unwatch.d.ts +2 -0
- package/dist/commands/canvas/unwatch.js +42 -0
- package/dist/commands/canvas/watch.d.ts +3 -0
- package/dist/commands/canvas/watch.js +63 -0
- package/dist/commands/canvas-analytics/chart.d.ts +52 -0
- package/dist/commands/canvas-analytics/chart.js +124 -0
- package/dist/commands/canvas-analytics/drilldown.d.ts +34 -0
- package/dist/commands/canvas-analytics/drilldown.js +96 -0
- package/dist/commands/canvas-analytics/format.d.ts +29 -0
- package/dist/commands/canvas-analytics/format.js +106 -0
- package/dist/commands/canvas-analytics/graph-detail.d.ts +2 -0
- package/dist/commands/canvas-analytics/graph-detail.js +307 -0
- package/dist/commands/canvas-analytics/graphs.d.ts +9 -0
- package/dist/commands/canvas-analytics/graphs.js +365 -0
- package/dist/commands/canvas-analytics/memory.d.ts +2 -0
- package/dist/commands/canvas-analytics/memory.js +211 -0
- package/dist/commands/canvas-analytics/overview.d.ts +2 -0
- package/dist/commands/canvas-analytics/overview.js +189 -0
- package/dist/commands/canvas-analytics/shell.d.ts +60 -0
- package/dist/commands/canvas-analytics/shell.js +416 -0
- package/dist/commands/canvas-analytics/time.d.ts +2 -0
- package/dist/commands/canvas-analytics/time.js +228 -0
- package/dist/commands/canvas-analytics/usage.d.ts +2 -0
- package/dist/commands/canvas-analytics/usage.js +305 -0
- package/dist/commands/canvas-analytics/view.d.ts +85 -0
- package/dist/commands/canvas-analytics/view.js +102 -0
- package/dist/commands/canvas-analytics.d.ts +2 -0
- package/dist/commands/canvas-analytics.js +28 -0
- package/dist/commands/canvas-browse.d.ts +2 -0
- package/dist/commands/canvas-browse.js +71 -0
- package/dist/commands/canvas-config.d.ts +2 -0
- package/dist/commands/canvas-config.js +192 -0
- package/dist/commands/canvas-history/grep.d.ts +1 -0
- package/dist/commands/canvas-history/grep.js +85 -0
- package/dist/commands/canvas-history/read.d.ts +1 -0
- package/dist/commands/canvas-history/read.js +48 -0
- package/dist/commands/canvas-history/search.d.ts +1 -0
- package/dist/commands/canvas-history/search.js +99 -0
- package/dist/commands/canvas-history/shared.d.ts +34 -0
- package/dist/commands/canvas-history/shared.js +135 -0
- package/dist/commands/canvas-history/stats.d.ts +1 -0
- package/dist/commands/canvas-history/stats.js +68 -0
- package/dist/commands/canvas-history.d.ts +2 -0
- package/dist/commands/canvas-history.js +29 -0
- package/dist/commands/canvas-issue.d.ts +2 -0
- package/dist/commands/canvas-issue.js +148 -0
- package/dist/commands/canvas-prune.d.ts +2 -0
- package/dist/commands/canvas-prune.js +111 -0
- package/dist/commands/canvas-roster.d.ts +2 -0
- package/dist/commands/canvas-roster.js +69 -0
- package/dist/commands/canvas-snapshot.d.ts +2 -0
- package/dist/commands/canvas-snapshot.js +34 -0
- package/dist/commands/canvas-use.d.ts +1 -0
- package/dist/commands/canvas-use.js +61 -0
- package/dist/commands/canvas.d.ts +3 -0
- package/dist/commands/canvas.js +57 -0
- package/dist/commands/chord.d.ts +2 -0
- package/dist/commands/chord.js +241 -0
- package/dist/commands/cron.d.ts +2 -0
- package/dist/commands/cron.js +541 -0
- package/dist/commands/custom-object/ack.d.ts +2 -0
- package/dist/commands/custom-object/ack.js +30 -0
- package/dist/commands/custom-object/publish.d.ts +2 -0
- package/dist/commands/custom-object/publish.js +39 -0
- package/dist/commands/custom-object/receive.d.ts +2 -0
- package/dist/commands/custom-object/receive.js +69 -0
- package/dist/commands/custom-object/register.d.ts +2 -0
- package/dist/commands/custom-object/register.js +69 -0
- package/dist/commands/custom-object/shared.d.ts +5 -0
- package/dist/commands/custom-object/shared.js +14 -0
- package/dist/commands/custom-object/unregister.d.ts +2 -0
- package/dist/commands/custom-object/unregister.js +26 -0
- package/dist/commands/custom-object.d.ts +2 -0
- package/dist/commands/custom-object.js +21 -0
- package/dist/commands/dashboard.d.ts +2 -0
- package/dist/commands/dashboard.js +86 -0
- package/dist/commands/doc/delete.d.ts +2 -0
- package/dist/commands/doc/delete.js +30 -0
- package/dist/commands/doc/edit.d.ts +2 -0
- package/dist/commands/doc/edit.js +82 -0
- package/dist/commands/doc/history.d.ts +2 -0
- package/dist/commands/doc/history.js +38 -0
- package/dist/commands/doc/lint.d.ts +2 -0
- package/dist/commands/doc/lint.js +36 -0
- package/dist/commands/doc/list.d.ts +2 -0
- package/dist/commands/doc/list.js +19 -0
- package/dist/commands/doc/move.d.ts +2 -0
- package/dist/commands/doc/move.js +37 -0
- package/dist/commands/doc/read.d.ts +2 -0
- package/dist/commands/doc/read.js +19 -0
- package/dist/commands/doc/replace-blocks.d.ts +6 -0
- package/dist/commands/doc/replace-blocks.js +40 -0
- package/dist/commands/doc/shared.d.ts +25 -0
- package/dist/commands/doc/shared.js +160 -0
- package/dist/commands/doc/write.d.ts +2 -0
- package/dist/commands/doc/write.js +52 -0
- package/dist/commands/doc.d.ts +2 -0
- package/dist/commands/doc.js +27 -0
- package/dist/commands/human/components.d.ts +4 -0
- package/dist/commands/human/components.js +78 -0
- package/dist/commands/human/feedback.d.ts +2 -0
- package/dist/commands/human/feedback.js +112 -0
- package/dist/commands/human/prompts.d.ts +21 -0
- package/dist/commands/human/prompts.js +326 -0
- package/dist/commands/human/queue.d.ts +3 -0
- package/dist/commands/human/queue.js +191 -0
- package/dist/commands/human/request.d.ts +2 -0
- package/dist/commands/human/request.js +266 -0
- package/dist/commands/human/review.d.ts +2 -0
- package/dist/commands/human/review.js +288 -0
- package/dist/commands/human/shared.d.ts +16 -0
- package/dist/commands/human/shared.js +67 -0
- package/dist/commands/human.d.ts +2 -0
- package/dist/commands/human.js +63 -0
- package/dist/commands/node/bash.d.ts +1 -0
- package/dist/commands/node/bash.js +390 -0
- package/dist/commands/node/create.d.ts +6 -0
- package/dist/commands/node/create.js +363 -0
- package/dist/commands/node/inspect.d.ts +2 -0
- package/dist/commands/node/inspect.js +288 -0
- package/dist/commands/node/lifecycle.d.ts +4 -0
- package/dist/commands/node/lifecycle.js +577 -0
- package/dist/commands/node/message.d.ts +1 -0
- package/dist/commands/node/message.js +170 -0
- package/dist/commands/node/outcome.d.ts +2 -0
- package/dist/commands/node/outcome.js +133 -0
- package/dist/commands/node/pyramid.d.ts +2 -0
- package/dist/commands/node/pyramid.js +79 -0
- package/dist/commands/node/subscription.d.ts +1 -0
- package/dist/commands/node/subscription.js +78 -0
- package/dist/commands/node/wait.d.ts +1 -0
- package/dist/commands/node/wait.js +165 -0
- package/dist/commands/node-context.d.ts +2 -0
- package/dist/commands/node-context.js +145 -0
- package/dist/commands/node-lifecycle-revive.d.ts +12 -0
- package/dist/commands/node-lifecycle-revive.js +217 -0
- package/dist/commands/node-snapshot.d.ts +2 -0
- package/dist/commands/node-snapshot.js +37 -0
- package/dist/commands/node-transcript.d.ts +2 -0
- package/dist/commands/node-transcript.js +59 -0
- package/dist/commands/node-worktree.d.ts +2 -0
- package/dist/commands/node-worktree.js +138 -0
- package/dist/commands/node.d.ts +2 -0
- package/dist/commands/node.js +29 -0
- package/dist/commands/person-settings.d.ts +1 -0
- package/dist/commands/person-settings.js +23 -0
- package/dist/commands/pkg/browse/actions.d.ts +7 -0
- package/dist/commands/pkg/browse/actions.js +198 -0
- package/dist/commands/pkg/browse/catalog.d.ts +9 -0
- package/dist/commands/pkg/browse/catalog.js +461 -0
- package/dist/commands/pkg/browse/command-view.d.ts +3 -0
- package/dist/commands/pkg/browse/command-view.js +217 -0
- package/dist/commands/pkg/browse/detail-panel.d.ts +66 -0
- package/dist/commands/pkg/browse/detail-panel.js +402 -0
- package/dist/commands/pkg/browse/doc-view.d.ts +3 -0
- package/dist/commands/pkg/browse/doc-view.js +84 -0
- package/dist/commands/pkg/browse/list-panel.d.ts +28 -0
- package/dist/commands/pkg/browse/list-panel.js +168 -0
- package/dist/commands/pkg/browse/model.d.ts +223 -0
- package/dist/commands/pkg/browse/model.js +36 -0
- package/dist/commands/pkg/browse/shell.d.ts +93 -0
- package/dist/commands/pkg/browse/shell.js +640 -0
- package/dist/commands/pkg/browse.d.ts +2 -0
- package/dist/commands/pkg/browse.js +27 -0
- package/dist/commands/pkg/market-inspect.d.ts +2 -0
- package/dist/commands/pkg/market-inspect.js +141 -0
- package/dist/commands/pkg/market-manage.d.ts +16 -0
- package/dist/commands/pkg/market-manage.js +327 -0
- package/dist/commands/pkg/market.d.ts +1 -0
- package/dist/commands/pkg/market.js +14 -0
- package/dist/commands/pkg/plugin-env.d.ts +3 -0
- package/dist/commands/pkg/plugin-env.js +65 -0
- package/dist/commands/pkg/plugin-inspect.d.ts +2 -0
- package/dist/commands/pkg/plugin-inspect.js +168 -0
- package/dist/commands/pkg/plugin-manage.d.ts +98 -0
- package/dist/commands/pkg/plugin-manage.js +1024 -0
- package/dist/commands/pkg/plugin.d.ts +1 -0
- package/dist/commands/pkg/plugin.js +14 -0
- package/dist/commands/pkg/shared.d.ts +13 -0
- package/dist/commands/pkg/shared.js +62 -0
- package/dist/commands/pkg.d.ts +2 -0
- package/dist/commands/pkg.js +21 -0
- package/dist/commands/profile/daemon-profiles.d.ts +13 -0
- package/dist/commands/profile/daemon-profiles.js +38 -0
- package/dist/commands/profile/default.d.ts +2 -0
- package/dist/commands/profile/default.js +183 -0
- package/dist/commands/profile/delete.d.ts +1 -0
- package/dist/commands/profile/delete.js +66 -0
- package/dist/commands/profile/env.d.ts +8 -0
- package/dist/commands/profile/env.js +188 -0
- package/dist/commands/profile/kind.d.ts +1 -0
- package/dist/commands/profile/kind.js +27 -0
- package/dist/commands/profile/list.d.ts +1 -0
- package/dist/commands/profile/list.js +45 -0
- package/dist/commands/profile/meta.d.ts +4 -0
- package/dist/commands/profile/meta.js +65 -0
- package/dist/commands/profile/new.d.ts +1 -0
- package/dist/commands/profile/new.js +95 -0
- package/dist/commands/profile/pause.d.ts +2 -0
- package/dist/commands/profile/pause.js +59 -0
- package/dist/commands/profile/project.d.ts +2 -0
- package/dist/commands/profile/project.js +134 -0
- package/dist/commands/profile/rename.d.ts +1 -0
- package/dist/commands/profile/rename.js +41 -0
- package/dist/commands/profile/show.d.ts +1 -0
- package/dist/commands/profile/show.js +55 -0
- package/dist/commands/profile.d.ts +2 -0
- package/dist/commands/profile.js +35 -0
- package/dist/commands/push.d.ts +2 -0
- package/dist/commands/push.js +263 -0
- package/dist/commands/revive.d.ts +2 -0
- package/dist/commands/revive.js +183 -0
- package/dist/commands/surface/node/cycle.d.ts +1 -0
- package/dist/commands/surface/node/cycle.js +83 -0
- package/dist/commands/surface/node/focus.d.ts +1 -0
- package/dist/commands/surface/node/focus.js +60 -0
- package/dist/commands/surface/node/id.d.ts +1 -0
- package/dist/commands/surface/node/id.js +38 -0
- package/dist/commands/surface/node/pin.d.ts +1 -0
- package/dist/commands/surface/node/pin.js +42 -0
- package/dist/commands/surface/node/placement.d.ts +30 -0
- package/dist/commands/surface/node/placement.js +49 -0
- package/dist/commands/surface-dashboard.d.ts +2 -0
- package/dist/commands/surface-dashboard.js +138 -0
- package/dist/commands/surface-edit.d.ts +2 -0
- package/dist/commands/surface-edit.js +157 -0
- package/dist/commands/surface-inbox.d.ts +2 -0
- package/dist/commands/surface-inbox.js +98 -0
- package/dist/commands/surface-inspect.d.ts +2 -0
- package/dist/commands/surface-inspect.js +41 -0
- package/dist/commands/surface-node.d.ts +2 -0
- package/dist/commands/surface-node.js +19 -0
- package/dist/commands/surface-reload.d.ts +7 -0
- package/dist/commands/surface-reload.js +129 -0
- package/dist/commands/surface-tmux-spread.d.ts +2 -0
- package/dist/commands/surface-tmux-spread.js +214 -0
- package/dist/commands/surface.d.ts +2 -0
- package/dist/commands/surface.js +29 -0
- package/dist/commands/sys/branch.d.ts +2 -0
- package/dist/commands/sys/branch.js +19 -0
- package/dist/commands/sys/config.d.ts +1 -0
- package/dist/commands/sys/config.js +353 -0
- package/dist/commands/sys/connect.d.ts +1 -0
- package/dist/commands/sys/connect.js +185 -0
- package/dist/commands/sys/context/admin/actions.d.ts +23 -0
- package/dist/commands/sys/context/admin/actions.js +89 -0
- package/dist/commands/sys/context/admin/detail-panel.d.ts +73 -0
- package/dist/commands/sys/context/admin/detail-panel.js +233 -0
- package/dist/commands/sys/context/admin/docs-panel.d.ts +63 -0
- package/dist/commands/sys/context/admin/docs-panel.js +185 -0
- package/dist/commands/sys/context/admin/list-view.d.ts +62 -0
- package/dist/commands/sys/context/admin/list-view.js +170 -0
- package/dist/commands/sys/context/admin/model.d.ts +123 -0
- package/dist/commands/sys/context/admin/model.js +179 -0
- package/dist/commands/sys/context/admin/rail-panel.d.ts +84 -0
- package/dist/commands/sys/context/admin/rail-panel.js +229 -0
- package/dist/commands/sys/context/admin/read-view.d.ts +27 -0
- package/dist/commands/sys/context/admin/read-view.js +172 -0
- package/dist/commands/sys/context/admin/shell.d.ts +125 -0
- package/dist/commands/sys/context/admin/shell.js +870 -0
- package/dist/commands/sys/context/admin.d.ts +1 -0
- package/dist/commands/sys/context/admin.js +148 -0
- package/dist/commands/sys/context/doc.d.ts +1 -0
- package/dist/commands/sys/context/doc.js +126 -0
- package/dist/commands/sys/context/expose.d.ts +1 -0
- package/dist/commands/sys/context/expose.js +66 -0
- package/dist/commands/sys/context/prompt-review.d.ts +1 -0
- package/dist/commands/sys/context/prompt-review.js +244 -0
- package/dist/commands/sys/context/resolve.d.ts +115 -0
- package/dist/commands/sys/context/resolve.js +326 -0
- package/dist/commands/sys/context/sysprompt.d.ts +1 -0
- package/dist/commands/sys/context/sysprompt.js +95 -0
- package/dist/commands/sys/context.d.ts +2 -0
- package/dist/commands/sys/context.js +21 -0
- package/dist/commands/sys/daemon.d.ts +4 -0
- package/dist/commands/sys/daemon.js +334 -0
- package/dist/commands/sys/db.d.ts +1 -0
- package/dist/commands/sys/db.js +69 -0
- package/dist/commands/sys/desktop.d.ts +5 -0
- package/dist/commands/sys/desktop.js +201 -0
- package/dist/commands/sys/doctor.d.ts +36 -0
- package/dist/commands/sys/doctor.js +633 -0
- package/dist/commands/sys/env.d.ts +1 -0
- package/dist/commands/sys/env.js +39 -0
- package/dist/commands/sys/feedback.d.ts +1 -0
- package/dist/commands/sys/feedback.js +228 -0
- package/dist/commands/sys/import/move.d.ts +55 -0
- package/dist/commands/sys/import/move.js +391 -0
- package/dist/commands/sys/import/resume.d.ts +1 -0
- package/dist/commands/sys/import/resume.js +23 -0
- package/dist/commands/sys/import/start.d.ts +4 -0
- package/dist/commands/sys/import/start.js +92 -0
- package/dist/commands/sys/join.d.ts +3 -0
- package/dist/commands/sys/join.js +85 -0
- package/dist/commands/sys/limits.d.ts +1 -0
- package/dist/commands/sys/limits.js +133 -0
- package/dist/commands/sys/logs.d.ts +1 -0
- package/dist/commands/sys/logs.js +129 -0
- package/dist/commands/sys/machine/rotate.d.ts +1 -0
- package/dist/commands/sys/machine/rotate.js +49 -0
- package/dist/commands/sys/migrate.d.ts +1 -0
- package/dist/commands/sys/migrate.js +79 -0
- package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
- package/dist/commands/sys/panels/broker-limits-panel.js +110 -0
- package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
- package/dist/commands/sys/panels/dependencies-panel.js +80 -0
- package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
- package/dist/commands/sys/panels/keybindings-panel.js +703 -0
- package/dist/commands/sys/panels/models-panel.d.ts +106 -0
- package/dist/commands/sys/panels/models-panel.js +1160 -0
- package/dist/commands/sys/panels/plugin-env-panel.d.ts +19 -0
- package/dist/commands/sys/panels/plugin-env-panel.js +70 -0
- package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
- package/dist/commands/sys/panels/plugins-panel.js +87 -0
- package/dist/commands/sys/panels/prefs-panel.d.ts +22 -0
- package/dist/commands/sys/panels/prefs-panel.js +97 -0
- package/dist/commands/sys/panels/profiles-panel.d.ts +70 -0
- package/dist/commands/sys/panels/profiles-panel.js +655 -0
- package/dist/commands/sys/panels/provider-panel.d.ts +74 -0
- package/dist/commands/sys/panels/provider-panel.js +534 -0
- package/dist/commands/sys/panels/terminal-panel.d.ts +19 -0
- package/dist/commands/sys/panels/terminal-panel.js +67 -0
- package/dist/commands/sys/provider-login.d.ts +8 -0
- package/dist/commands/sys/provider-login.js +99 -0
- package/dist/commands/sys/retry-delivery.d.ts +1 -0
- package/dist/commands/sys/retry-delivery.js +33 -0
- package/dist/commands/sys/settings-shell.d.ts +54 -0
- package/dist/commands/sys/settings-shell.js +400 -0
- package/dist/commands/sys/settings.d.ts +2 -0
- package/dist/commands/sys/settings.js +46 -0
- package/dist/commands/sys/setup-core.d.ts +121 -0
- package/dist/commands/sys/setup-core.js +890 -0
- package/dist/commands/sys/setup-settings-runner.d.ts +13 -0
- package/dist/commands/sys/setup-settings-runner.js +15 -0
- package/dist/commands/sys/setup-wizard.d.ts +52 -0
- package/dist/commands/sys/setup-wizard.js +351 -0
- package/dist/commands/sys/setup.d.ts +6 -0
- package/dist/commands/sys/setup.js +41 -0
- package/dist/commands/sys/shared.d.ts +51 -0
- package/dist/commands/sys/shared.js +81 -0
- package/dist/commands/sys/signin.d.ts +7 -0
- package/dist/commands/sys/signin.js +149 -0
- package/dist/commands/sys/spaces.d.ts +1 -0
- package/dist/commands/sys/spaces.js +22 -0
- package/dist/commands/sys/spend.d.ts +1 -0
- package/dist/commands/sys/spend.js +144 -0
- package/dist/commands/sys/support/prepare.d.ts +13 -0
- package/dist/commands/sys/support/prepare.js +239 -0
- package/dist/commands/sys/support/submit.d.ts +19 -0
- package/dist/commands/sys/support/submit.js +524 -0
- package/dist/commands/sys/support.d.ts +2 -0
- package/dist/commands/sys/support.js +18 -0
- package/dist/commands/sys/sync-deps.d.ts +16 -0
- package/dist/commands/sys/sync-deps.js +445 -0
- package/dist/commands/sys/sync-project-guidance.d.ts +1 -0
- package/dist/commands/sys/sync-project-guidance.js +319 -0
- package/dist/commands/sys/sync-shared.d.ts +44 -0
- package/dist/commands/sys/sync-shared.js +139 -0
- package/dist/commands/sys/sync-skills.d.ts +1 -0
- package/dist/commands/sys/sync-skills.js +297 -0
- package/dist/commands/sys/sync.d.ts +2 -0
- package/dist/commands/sys/sync.js +17 -0
- package/dist/commands/sys/terminal-option.d.ts +112 -0
- package/dist/commands/sys/terminal-option.js +542 -0
- package/dist/commands/sys/tutorial/branch.d.ts +1 -0
- package/dist/commands/sys/tutorial/branch.js +15 -0
- package/dist/commands/sys/tutorial/lessons.d.ts +5 -0
- package/dist/commands/sys/tutorial/lessons.js +107 -0
- package/dist/commands/sys/tutorial/scenario.d.ts +1 -0
- package/dist/commands/sys/tutorial/scenario.js +431 -0
- package/dist/commands/sys/tutorial/tracks.d.ts +1 -0
- package/dist/commands/sys/tutorial/tracks.js +96 -0
- package/dist/commands/sys/update.d.ts +2 -0
- package/dist/commands/sys/update.js +157 -0
- package/dist/commands/sys/worktrees.d.ts +2 -0
- package/dist/commands/sys/worktrees.js +53 -0
- package/dist/commands/sys.d.ts +2 -0
- package/dist/commands/sys.js +31 -0
- package/dist/core/activity-signal.d.ts +7 -0
- package/dist/core/activity-signal.js +38 -0
- package/dist/core/async-array.d.ts +7 -0
- package/dist/core/async-array.js +48 -0
- package/dist/core/auth-file.d.ts +35 -0
- package/dist/core/auth-file.js +161 -0
- package/dist/core/auth-interaction.d.ts +19 -0
- package/dist/core/auth-interaction.js +94 -0
- package/dist/core/bash-guard.d.ts +6 -0
- package/dist/core/bash-guard.js +527 -0
- package/dist/core/bash-job-supervisor.d.ts +5 -0
- package/dist/core/bash-job-supervisor.js +144 -0
- package/dist/core/bash-jobs.d.ts +168 -0
- package/dist/core/bash-jobs.js +455 -0
- package/dist/core/blobs/directory.d.ts +11 -0
- package/dist/core/blobs/directory.js +216 -0
- package/dist/core/blobs/fault.d.ts +3 -0
- package/dist/core/blobs/fault.js +6 -0
- package/dist/core/blobs/index.d.ts +21 -0
- package/dist/core/blobs/index.js +30 -0
- package/dist/core/blobs/r2.d.ts +13 -0
- package/dist/core/blobs/r2.js +104 -0
- package/dist/core/broker-client/client.d.ts +89 -0
- package/dist/core/broker-client/client.js +184 -0
- package/dist/core/broker-client/index.d.ts +2 -0
- package/dist/core/broker-client/index.js +14 -0
- package/dist/core/broker-client/transport-relay.d.ts +47 -0
- package/dist/core/broker-client/transport-relay.js +165 -0
- package/dist/core/broker-client/transport-socket.d.ts +35 -0
- package/dist/core/broker-client/transport-socket.js +187 -0
- package/dist/core/broker-client/transport.d.ts +46 -0
- package/dist/core/broker-client/transport.js +40 -0
- package/dist/core/canvas/app-run.d.ts +3 -0
- package/dist/core/canvas/app-run.js +4 -0
- package/dist/core/canvas/attention.d.ts +18 -0
- package/dist/core/canvas/attention.js +47 -0
- package/dist/core/canvas/browse/app.d.ts +29 -0
- package/dist/core/canvas/browse/app.js +1050 -0
- package/dist/core/canvas/browse/model.d.ts +176 -0
- package/dist/core/canvas/browse/model.js +477 -0
- package/dist/core/canvas/browse/pins.d.ts +4 -0
- package/dist/core/canvas/browse/pins.js +29 -0
- package/dist/core/canvas/browse/render.d.ts +103 -0
- package/dist/core/canvas/browse/render.js +1058 -0
- package/dist/core/canvas/canvas.d.ts +409 -0
- package/dist/core/canvas/canvas.js +1206 -0
- package/dist/core/canvas/crons.d.ts +322 -0
- package/dist/core/canvas/crons.js +541 -0
- package/dist/core/canvas/daemon-actions.d.ts +42 -0
- package/dist/core/canvas/daemon-actions.js +98 -0
- package/dist/core/canvas/db.d.ts +60 -0
- package/dist/core/canvas/db.js +426 -0
- package/dist/core/canvas/deliveries.d.ts +125 -0
- package/dist/core/canvas/deliveries.js +393 -0
- package/dist/core/canvas/delivery-contract.d.ts +37 -0
- package/dist/core/canvas/delivery-contract.js +30 -0
- package/dist/core/canvas/executions.d.ts +125 -0
- package/dist/core/canvas/executions.js +279 -0
- package/dist/core/canvas/extensions.d.ts +9 -0
- package/dist/core/canvas/extensions.js +90 -0
- package/dist/core/canvas/focuses.d.ts +26 -0
- package/dist/core/canvas/focuses.js +82 -0
- package/dist/core/canvas/history.d.ts +104 -0
- package/dist/core/canvas/history.js +480 -0
- package/dist/core/canvas/index.d.ts +14 -0
- package/dist/core/canvas/index.js +16 -0
- package/dist/core/canvas/install-id.d.ts +9 -0
- package/dist/core/canvas/install-id.js +64 -0
- package/dist/core/canvas/labels.d.ts +30 -0
- package/dist/core/canvas/labels.js +43 -0
- package/dist/core/canvas/legacy-person.d.ts +4 -0
- package/dist/core/canvas/legacy-person.js +4 -0
- package/dist/core/canvas/memory-reads.d.ts +24 -0
- package/dist/core/canvas/memory-reads.js +36 -0
- package/dist/core/canvas/meta-file.d.ts +20 -0
- package/dist/core/canvas/meta-file.js +89 -0
- package/dist/core/canvas/nav-render.d.ts +136 -0
- package/dist/core/canvas/nav-render.js +224 -0
- package/dist/core/canvas/node-agent-paths.d.ts +8 -0
- package/dist/core/canvas/node-agent-paths.js +30 -0
- package/dist/core/canvas/node-order.d.ts +24 -0
- package/dist/core/canvas/node-order.js +37 -0
- package/dist/core/canvas/node-recap.d.ts +23 -0
- package/dist/core/canvas/node-recap.js +62 -0
- package/dist/core/canvas/node-tokens.d.ts +19 -0
- package/dist/core/canvas/node-tokens.js +53 -0
- package/dist/core/canvas/outcome-actions.d.ts +23 -0
- package/dist/core/canvas/outcome-actions.js +71 -0
- package/dist/core/canvas/person.d.ts +32 -0
- package/dist/core/canvas/person.js +244 -0
- package/dist/core/canvas/pid.d.ts +6 -0
- package/dist/core/canvas/pid.js +20 -10
- package/dist/core/canvas/reconciler-leases.d.ts +12 -0
- package/dist/core/canvas/reconciler-leases.js +40 -0
- package/dist/core/canvas/recovery.d.ts +127 -0
- package/dist/core/canvas/recovery.js +713 -0
- package/dist/core/canvas/remote-canvas-source.d.ts +71 -0
- package/dist/core/canvas/remote-canvas-source.js +290 -0
- package/dist/core/canvas/remote-transport.d.ts +7 -0
- package/dist/core/canvas/remote-transport.js +57 -0
- package/dist/core/canvas/render-source.d.ts +193 -0
- package/dist/core/canvas/render-source.js +518 -0
- package/dist/core/canvas/schema-chain.d.ts +33 -0
- package/dist/core/canvas/schema-chain.js +110 -0
- package/dist/core/canvas/schema-version.d.ts +30 -0
- package/dist/core/canvas/schema-version.js +58 -0
- package/dist/core/canvas/sessions.d.ts +54 -0
- package/dist/core/canvas/sessions.js +128 -0
- package/dist/core/canvas/source.d.ts +52 -0
- package/dist/core/canvas/source.js +57 -0
- package/dist/core/canvas/status-glyph.d.ts +52 -0
- package/dist/core/canvas/status-glyph.js +132 -0
- package/dist/core/canvas/structured-requests.d.ts +69 -0
- package/dist/core/canvas/structured-requests.js +176 -0
- package/dist/core/canvas/telemetry.d.ts +14 -0
- package/dist/core/canvas/telemetry.js +35 -0
- package/dist/core/canvas/tree.d.ts +33 -0
- package/dist/core/canvas/tree.js +128 -0
- package/dist/core/canvas/types.d.ts +461 -0
- package/dist/core/canvas/types.js +6 -0
- package/dist/core/canvas/waits.d.ts +39 -0
- package/dist/core/canvas/waits.js +104 -0
- package/dist/core/canvas/worktrees.d.ts +41 -0
- package/dist/core/canvas/worktrees.js +97 -0
- package/dist/core/clipboard-text.d.ts +11 -0
- package/dist/core/clipboard-text.js +57 -0
- package/dist/core/command-hooks/artifact.d.ts +16 -0
- package/dist/core/command-hooks/artifact.js +145 -0
- package/dist/core/command-hooks/catalog.d.ts +14 -0
- package/dist/core/command-hooks/catalog.js +38 -0
- package/dist/core/command-hooks/compose.d.ts +15 -0
- package/dist/core/command-hooks/compose.js +101 -0
- package/dist/core/command-hooks/discovery.d.ts +133 -0
- package/dist/core/command-hooks/discovery.js +246 -0
- package/dist/core/command-hooks/help.d.ts +5 -0
- package/dist/core/command-hooks/help.js +18 -0
- package/dist/core/command-hooks/lifecycle-catalog.d.ts +21 -0
- package/dist/core/command-hooks/lifecycle-catalog.js +9 -0
- package/dist/core/command-hooks/lifecycle-create.d.ts +4 -0
- package/dist/core/command-hooks/lifecycle-create.js +51 -0
- package/dist/core/command-hooks/report.d.ts +32 -0
- package/dist/core/command-hooks/report.js +28 -0
- package/dist/core/command-hooks/schema.d.ts +42 -0
- package/dist/core/command-hooks/schema.js +157 -0
- package/dist/core/command-hooks/transport/exec-invoke.d.ts +24 -0
- package/dist/core/command-hooks/transport/exec-invoke.js +315 -0
- package/dist/core/command-hooks/transport/exec-lifecycle.d.ts +23 -0
- package/dist/core/command-hooks/transport/exec-lifecycle.js +248 -0
- package/dist/core/command-hooks/transport/plan.d.ts +3 -0
- package/dist/core/command-hooks/transport/plan.js +30 -0
- package/dist/core/command-manifests/registry.d.ts +68 -0
- package/dist/core/command-manifests/registry.js +118 -0
- package/dist/core/command-plugins/caller-header.d.ts +10 -0
- package/dist/core/command-plugins/caller-header.js +15 -0
- package/dist/core/command-plugins/compose.d.ts +11 -0
- package/dist/core/command-plugins/compose.js +241 -0
- package/dist/core/command-plugins/discovery.d.ts +49 -0
- package/dist/core/command-plugins/discovery.js +240 -0
- package/dist/core/command-plugins/extensions.d.ts +20 -0
- package/dist/core/command-plugins/extensions.js +166 -0
- package/dist/core/command-plugins/help-addenda.d.ts +25 -0
- package/dist/core/command-plugins/help-addenda.js +55 -0
- package/dist/core/command-plugins/presence.d.ts +4 -0
- package/dist/core/command-plugins/presence.js +36 -0
- package/dist/core/command-plugins/transport/exec-invoke.d.ts +42 -0
- package/dist/core/command-plugins/transport/exec-invoke.js +138 -0
- package/dist/core/command-plugins/transport/http-fetch.d.ts +41 -0
- package/dist/core/command-plugins/transport/http-fetch.js +68 -0
- package/dist/core/command-plugins/transport/http-invoke.d.ts +22 -0
- package/dist/core/command-plugins/transport/http-invoke.js +333 -0
- package/dist/core/command-plugins/transport/http-plan.d.ts +75 -0
- package/dist/core/command-plugins/transport/http-plan.js +349 -0
- package/dist/core/command-plugins/transport/sign.d.ts +55 -0
- package/dist/core/command-plugins/transport/sign.js +115 -0
- package/dist/core/command.d.ts +238 -0
- package/dist/core/command.js +848 -0
- package/dist/core/conversation-store/row-store.d.ts +14 -0
- package/dist/core/conversation-store/row-store.js +337 -0
- package/dist/core/directory/issuer.d.ts +8 -0
- package/dist/core/directory/issuer.js +15 -0
- package/dist/core/directory/join.d.ts +57 -0
- package/dist/core/directory/join.js +218 -0
- package/dist/core/directory/person-credential.d.ts +61 -0
- package/dist/core/directory/person-credential.js +220 -0
- package/dist/core/directory/reach.d.ts +3 -0
- package/dist/core/directory/reach.js +19 -0
- package/dist/core/document-lines.d.ts +4 -0
- package/dist/core/document-lines.js +6 -0
- package/dist/core/editor-resolver.d.ts +28 -0
- package/dist/core/editor-resolver.js +77 -0
- package/dist/core/environments.d.ts +21 -0
- package/dist/core/environments.js +56 -0
- package/dist/core/events/outbound.d.ts +21 -0
- package/dist/core/events/outbound.js +92 -0
- package/dist/core/events/read.d.ts +40 -0
- package/dist/core/events/read.js +625 -0
- package/dist/core/fault-classifier.d.ts +36 -0
- package/dist/core/fault-classifier.js +101 -0
- package/dist/core/feed/feed.d.ts +63 -0
- package/dist/core/feed/feed.js +190 -0
- package/dist/core/feed/inbox.d.ts +34 -0
- package/dist/core/feed/inbox.js +93 -0
- package/dist/core/feed/messages.d.ts +88 -0
- package/dist/core/feed/messages.js +206 -0
- package/dist/core/feed/reports.d.ts +10 -0
- package/dist/core/feed/reports.js +58 -0
- package/dist/core/frontmatter.d.ts +8 -0
- package/dist/core/frontmatter.js +35 -0
- package/dist/core/grants/cover.d.ts +14 -0
- package/dist/core/grants/cover.js +66 -0
- package/dist/core/grants/local.d.ts +4 -0
- package/dist/core/grants/local.js +26 -0
- package/dist/core/grants/mirror.d.ts +155 -0
- package/dist/core/grants/mirror.js +379 -0
- package/dist/core/grants/on-sync.d.ts +26 -0
- package/dist/core/grants/on-sync.js +161 -0
- package/dist/core/grants/sandboxes.d.ts +7 -0
- package/dist/core/grants/sandboxes.js +24 -0
- package/dist/core/grants/sync.d.ts +46 -0
- package/dist/core/grants/sync.js +195 -0
- package/dist/core/grants/terminal.d.ts +10 -0
- package/dist/core/grants/terminal.js +25 -0
- package/dist/core/graph/access.d.ts +13 -0
- package/dist/core/graph/access.js +37 -0
- package/dist/core/graph/bodies.d.ts +22 -0
- package/dist/core/graph/bodies.js +68 -0
- package/dist/core/graph/custom.d.ts +98 -0
- package/dist/core/graph/custom.js +298 -0
- package/dist/core/graph/deletion.d.ts +16 -0
- package/dist/core/graph/deletion.js +104 -0
- package/dist/core/graph/documents.d.ts +181 -0
- package/dist/core/graph/documents.js +653 -0
- package/dist/core/graph/edges.d.ts +41 -0
- package/dist/core/graph/edges.js +83 -0
- package/dist/core/graph/events.d.ts +49 -0
- package/dist/core/graph/events.js +315 -0
- package/dist/core/graph/exposures.d.ts +53 -0
- package/dist/core/graph/exposures.js +152 -0
- package/dist/core/graph/jobs.d.ts +107 -0
- package/dist/core/graph/jobs.js +184 -0
- package/dist/core/graph/kinds/action.d.ts +3 -0
- package/dist/core/graph/kinds/action.js +20 -0
- package/dist/core/graph/kinds/custom.d.ts +8 -0
- package/dist/core/graph/kinds/custom.js +25 -0
- package/dist/core/graph/kinds/document.d.ts +20 -0
- package/dist/core/graph/kinds/document.js +133 -0
- package/dist/core/graph/kinds/dto.d.ts +5 -0
- package/dist/core/graph/kinds/dto.js +11 -0
- package/dist/core/graph/kinds/environment.d.ts +2 -0
- package/dist/core/graph/kinds/environment.js +21 -0
- package/dist/core/graph/kinds/job.d.ts +2 -0
- package/dist/core/graph/kinds/job.js +24 -0
- package/dist/core/graph/kinds/kind.d.ts +67 -0
- package/dist/core/graph/kinds/kind.js +15 -0
- package/dist/core/graph/kinds/live-read.d.ts +5 -0
- package/dist/core/graph/kinds/live-read.js +11 -0
- package/dist/core/graph/kinds/node.d.ts +12 -0
- package/dist/core/graph/kinds/node.js +87 -0
- package/dist/core/graph/kinds/owner.d.ts +2 -0
- package/dist/core/graph/kinds/owner.js +26 -0
- package/dist/core/graph/kinds/registry.d.ts +10 -0
- package/dist/core/graph/kinds/registry.js +58 -0
- package/dist/core/graph/kinds/render.d.ts +9 -0
- package/dist/core/graph/kinds/render.js +17 -0
- package/dist/core/graph/names.d.ts +57 -0
- package/dist/core/graph/names.js +183 -0
- package/dist/core/graph/objects.d.ts +88 -0
- package/dist/core/graph/objects.js +273 -0
- package/dist/core/graph/package-docs.d.ts +41 -0
- package/dist/core/graph/package-docs.js +198 -0
- package/dist/core/graph/package-files.d.ts +20 -0
- package/dist/core/graph/package-files.js +146 -0
- package/dist/core/graph/package-kinds.d.ts +22 -0
- package/dist/core/graph/package-kinds.js +49 -0
- package/dist/core/graph/package-reconcile.d.ts +17 -0
- package/dist/core/graph/package-reconcile.js +31 -0
- package/dist/core/graph/reader.d.ts +45 -0
- package/dist/core/graph/reader.js +218 -0
- package/dist/core/graph/receiver-url.d.ts +11 -0
- package/dist/core/graph/receiver-url.js +83 -0
- package/dist/core/graph/receivers.d.ts +28 -0
- package/dist/core/graph/receivers.js +66 -0
- package/dist/core/graph/repo-sync/exchange.d.ts +36 -0
- package/dist/core/graph/repo-sync/exchange.js +422 -0
- package/dist/core/graph/repo-sync/identity.d.ts +32 -0
- package/dist/core/graph/repo-sync/identity.js +147 -0
- package/dist/core/graph/repo-sync/index.d.ts +4 -0
- package/dist/core/graph/repo-sync/index.js +2 -0
- package/dist/core/graph/repo-sync/mirror.d.ts +30 -0
- package/dist/core/graph/repo-sync/mirror.js +170 -0
- package/dist/core/graph/repo-sync/ref-format.d.ts +80 -0
- package/dist/core/graph/repo-sync/ref-format.js +215 -0
- package/dist/core/graph/repo-sync/repos.d.ts +21 -0
- package/dist/core/graph/repo-sync/repos.js +57 -0
- package/dist/core/graph/repo-sync/sync.d.ts +40 -0
- package/dist/core/graph/repo-sync/sync.js +322 -0
- package/dist/core/graph/rules.d.ts +27 -0
- package/dist/core/graph/rules.js +134 -0
- package/dist/core/graph/types.d.ts +131 -0
- package/dist/core/graph/types.js +10 -0
- package/dist/core/graph/watches.d.ts +66 -0
- package/dist/core/graph/watches.js +177 -0
- package/dist/core/human/action-binding.d.ts +23 -0
- package/dist/core/human/action-binding.js +41 -0
- package/dist/core/human/answer-text.d.ts +5 -0
- package/dist/core/human/answer-text.js +100 -0
- package/dist/core/human/answer.d.ts +53 -0
- package/dist/core/human/answer.js +119 -0
- package/dist/core/human/claim.d.ts +23 -0
- package/dist/core/human/claim.js +67 -0
- package/dist/core/human/completion.d.ts +38 -0
- package/dist/core/human/completion.js +27 -0
- package/dist/core/human/component-docs.d.ts +18 -0
- package/dist/core/human/component-docs.js +442 -0
- package/dist/core/human/convention.d.ts +31 -0
- package/dist/core/human/convention.js +82 -0
- package/dist/core/human/feedback-companion.d.ts +19 -0
- package/dist/core/human/feedback-companion.js +92 -0
- package/dist/core/human/feedback.d.ts +62 -0
- package/dist/core/human/feedback.js +88 -0
- package/dist/core/human/page-authoring.d.ts +30 -0
- package/dist/core/human/page-authoring.js +19 -0
- package/dist/core/human/page-errors.d.ts +8 -0
- package/dist/core/human/page-errors.js +14 -0
- package/dist/core/human/page-eval.d.ts +25 -0
- package/dist/core/human/page-eval.js +125 -0
- package/dist/core/human/page-html-markdown.d.ts +8 -0
- package/dist/core/human/page-html-markdown.js +260 -0
- package/dist/core/human/page-markdown.d.ts +3 -0
- package/dist/core/human/page-markdown.js +295 -0
- package/dist/core/human/page-schema.d.ts +291 -0
- package/dist/core/human/page-schema.js +381 -0
- package/dist/core/human/page.d.ts +21 -0
- package/dist/core/human/page.js +251 -0
- package/dist/core/human/request-files.d.ts +14 -0
- package/dist/core/human/request-files.js +54 -0
- package/dist/core/human/requests.d.ts +156 -0
- package/dist/core/human/requests.js +619 -0
- package/dist/core/human/root.d.ts +4 -0
- package/dist/core/human/root.js +11 -0
- package/dist/core/human/summary.d.ts +3 -0
- package/dist/core/human/summary.js +5 -0
- package/dist/core/human/tickets.d.ts +68 -0
- package/dist/core/human/tickets.js +175 -0
- package/dist/core/human/types.d.ts +118 -0
- package/dist/core/human/types.js +1 -0
- package/dist/core/human/visible-paths.d.ts +16 -0
- package/dist/core/human/visible-paths.js +74 -0
- package/dist/core/human-actions.d.ts +25 -0
- package/dist/core/human-actions.js +101 -0
- package/dist/core/import/bundle/blob-keys.d.ts +10 -0
- package/dist/core/import/bundle/blob-keys.js +23 -0
- package/dist/core/import/bundle/layout.d.ts +90 -0
- package/dist/core/import/bundle/layout.js +117 -0
- package/dist/core/import/export/archive.d.ts +11 -0
- package/dist/core/import/export/archive.js +22 -0
- package/dist/core/import/export/cloud.d.ts +23 -0
- package/dist/core/import/export/cloud.js +47 -0
- package/dist/core/import/export/dump.d.ts +34 -0
- package/dist/core/import/export/dump.js +235 -0
- package/dist/core/import/export/files.d.ts +22 -0
- package/dist/core/import/export/files.js +107 -0
- package/dist/core/import/export/inline.d.ts +3 -0
- package/dist/core/import/export/inline.js +15 -0
- package/dist/core/import/export/source.d.ts +2 -0
- package/dist/core/import/export/source.js +5 -0
- package/dist/core/import/export/stores.d.ts +9 -0
- package/dist/core/import/export/stores.js +69 -0
- package/dist/core/inspector/chrome.d.ts +6 -0
- package/dist/core/inspector/chrome.js +14 -0
- package/dist/core/inspector/contract.d.ts +105 -0
- package/dist/core/inspector/contract.js +1 -0
- package/dist/core/inspector/core.d.ts +39 -0
- package/dist/core/inspector/core.js +296 -0
- package/dist/core/inspector/host.d.ts +46 -0
- package/dist/core/inspector/host.js +538 -0
- package/dist/core/inspector/model.d.ts +88 -0
- package/dist/core/inspector/model.js +225 -0
- package/dist/core/inspector/text.d.ts +5 -0
- package/dist/core/inspector/text.js +45 -0
- package/dist/core/inspector/transport.d.ts +6 -0
- package/dist/core/inspector/transport.js +36 -0
- package/dist/core/inspector/tui.d.ts +3 -0
- package/dist/core/inspector/tui.js +295 -0
- package/dist/core/io.js +7 -0
- package/dist/core/keybindings/background-bash.d.ts +13 -0
- package/dist/core/keybindings/background-bash.js +33 -0
- package/dist/core/keybindings/catalog.d.ts +1 -1
- package/dist/core/keybindings/inbox.d.ts +18 -0
- package/dist/core/keybindings/inbox.js +25 -0
- package/dist/core/keybindings/index.d.ts +8 -0
- package/dist/core/keybindings/index.js +7 -0
- package/dist/core/keybindings/match.d.ts +44 -0
- package/dist/core/keybindings/match.js +146 -0
- package/dist/core/keybindings/persistence.d.ts +18 -0
- package/dist/core/keybindings/persistence.js +49 -0
- package/dist/core/keybindings/resolve.d.ts +28 -0
- package/dist/core/keybindings/resolve.js +348 -0
- package/dist/core/layout-migrate/index.d.ts +38 -0
- package/dist/core/layout-migrate/index.js +523 -0
- package/dist/core/layout-migrate/paths.d.ts +30 -0
- package/dist/core/layout-migrate/paths.js +118 -0
- package/dist/core/layout-migrate/stored-paths.d.ts +9 -0
- package/dist/core/layout-migrate/stored-paths.js +424 -0
- package/dist/core/layout-migrate/stores.d.ts +30 -0
- package/dist/core/layout-migrate/stores.js +543 -0
- package/dist/core/ledger/account.d.ts +12 -0
- package/dist/core/ledger/account.js +13 -0
- package/dist/core/ledger/charges.d.ts +16 -0
- package/dist/core/ledger/charges.js +43 -0
- package/dist/core/ledger/check.d.ts +48 -0
- package/dist/core/ledger/check.js +38 -0
- package/dist/core/ledger/chunks.d.ts +8 -0
- package/dist/core/ledger/chunks.js +43 -0
- package/dist/core/ledger/index.d.ts +9 -0
- package/dist/core/ledger/index.js +10 -0
- package/dist/core/ledger/infra-allowance.d.ts +7 -0
- package/dist/core/ledger/infra-allowance.js +31 -0
- package/dist/core/ledger/limits.d.ts +10 -0
- package/dist/core/ledger/limits.js +35 -0
- package/dist/core/ledger/months.d.ts +6 -0
- package/dist/core/ledger/months.js +19 -0
- package/dist/core/ledger/payer.d.ts +34 -0
- package/dist/core/ledger/payer.js +14 -0
- package/dist/core/ledger/read.d.ts +57 -0
- package/dist/core/ledger/read.js +194 -0
- package/dist/core/ledger/totals.d.ts +10 -0
- package/dist/core/ledger/totals.js +34 -0
- package/dist/core/ledger/types.d.ts +75 -0
- package/dist/core/ledger/types.js +2 -0
- package/dist/core/llm/app-rungs.d.ts +16 -0
- package/dist/core/llm/app-rungs.js +59 -0
- package/dist/core/llm/body-limits.d.ts +7 -0
- package/dist/core/llm/body-limits.js +7 -0
- package/dist/core/llm/refusal.d.ts +14 -0
- package/dist/core/llm/refusal.js +22 -0
- package/dist/core/locked-file.d.ts +27 -0
- package/dist/core/locked-file.js +121 -0
- package/dist/core/log.d.ts +2 -0
- package/dist/core/log.js +5 -3
- package/dist/core/manifest-stale.d.ts +18 -0
- package/dist/core/manifest-stale.js +39 -0
- package/dist/core/model-auth/api-credential-store.d.ts +10 -0
- package/dist/core/model-auth/api-credential-store.js +40 -0
- package/dist/core/model-auth/daemon-login.d.ts +13 -0
- package/dist/core/model-auth/daemon-login.js +156 -0
- package/dist/core/model-auth/readiness.d.ts +12 -0
- package/dist/core/model-auth/readiness.js +48 -0
- package/dist/core/model-routes-pool.d.ts +14 -0
- package/dist/core/model-routes-pool.js +50 -0
- package/dist/core/model-routes.d.ts +98 -0
- package/dist/core/model-routes.js +190 -0
- package/dist/core/northlight/previews.d.ts +22 -0
- package/dist/core/northlight/previews.js +87 -0
- package/dist/core/nvim-launch.d.ts +7 -0
- package/dist/core/nvim-launch.js +45 -0
- package/dist/core/output.d.ts +35 -0
- package/dist/core/output.js +99 -0
- package/dist/core/pagination.d.ts +35 -0
- package/dist/core/pagination.js +88 -0
- package/dist/core/peer/client.d.ts +61 -0
- package/dist/core/peer/client.js +167 -0
- package/dist/core/peer/directory.d.ts +71 -0
- package/dist/core/peer/directory.js +167 -0
- package/dist/core/peer/envelope.d.ts +46 -0
- package/dist/core/peer/envelope.js +98 -0
- package/dist/core/peer/names.d.ts +5 -0
- package/dist/core/peer/names.js +8 -0
- package/dist/core/peer/outbox-store.d.ts +76 -0
- package/dist/core/peer/outbox-store.js +84 -0
- package/dist/core/peer/receiver.d.ts +8 -0
- package/dist/core/peer/receiver.js +54 -0
- package/dist/core/peer/stubs.d.ts +90 -0
- package/dist/core/peer/stubs.js +208 -0
- package/dist/core/peer/token.d.ts +13 -0
- package/dist/core/peer/token.js +29 -0
- package/dist/core/peer/version.d.ts +16 -0
- package/dist/core/peer/version.js +23 -0
- package/dist/core/permissions/builtin.d.ts +8 -0
- package/dist/core/permissions/builtin.js +27 -0
- package/dist/core/permissions/ceiling.d.ts +57 -0
- package/dist/core/permissions/ceiling.js +319 -0
- package/dist/core/permissions/compile.d.ts +14 -0
- package/dist/core/permissions/compile.js +175 -0
- package/dist/core/permissions/errors.d.ts +7 -0
- package/dist/core/permissions/errors.js +13 -0
- package/dist/core/permissions/evaluator.d.ts +33 -0
- package/dist/core/permissions/evaluator.js +96 -0
- package/dist/core/permissions/facts.d.ts +56 -0
- package/dist/core/permissions/facts.js +102 -0
- package/dist/core/permissions/schema-parser.d.ts +29 -0
- package/dist/core/permissions/schema-parser.js +151 -0
- package/dist/core/permissions/schemas.d.ts +21 -0
- package/dist/core/permissions/schemas.js +83 -0
- package/dist/core/permissions/sql.d.ts +16 -0
- package/dist/core/permissions/sql.js +31 -0
- package/dist/core/plugin-app.d.ts +31 -0
- package/dist/core/plugin-app.js +58 -0
- package/dist/core/plugin-quarantine.d.ts +16 -0
- package/dist/core/plugin-quarantine.js +70 -0
- package/dist/core/pool-credential-store.d.ts +31 -0
- package/dist/core/pool-credential-store.js +116 -0
- package/dist/core/predicate.d.ts +65 -0
- package/dist/core/predicate.js +191 -0
- package/dist/core/preview-registry.d.ts +59 -0
- package/dist/core/preview-registry.js +403 -0
- package/dist/core/profiles/default-binding.d.ts +15 -0
- package/dist/core/profiles/default-binding.js +29 -0
- package/dist/core/profiles/deletion-reservation.d.ts +12 -0
- package/dist/core/profiles/deletion-reservation.js +42 -0
- package/dist/core/profiles/select.d.ts +46 -0
- package/dist/core/profiles/select.js +738 -0
- package/dist/core/provider-credential.d.ts +6 -0
- package/dist/core/provider-credential.js +17 -0
- package/dist/core/provider-error-recognition.d.ts +30 -0
- package/dist/core/provider-error-recognition.js +82 -0
- package/dist/core/provider-failure.d.ts +42 -0
- package/dist/core/provider-failure.js +145 -0
- package/dist/core/provider-management.d.ts +11 -0
- package/dist/core/provider-management.js +9 -0
- package/dist/core/providers/approval.d.ts +23 -0
- package/dist/core/providers/approval.js +146 -0
- package/dist/core/providers/audit.d.ts +30 -0
- package/dist/core/providers/audit.js +52 -0
- package/dist/core/providers/bundles.d.ts +66 -0
- package/dist/core/providers/bundles.js +638 -0
- package/dist/core/providers/call.d.ts +51 -0
- package/dist/core/providers/call.js +480 -0
- package/dist/core/providers/description.d.ts +34 -0
- package/dist/core/providers/description.js +1 -0
- package/dist/core/providers/device-libs.d.ts +71 -0
- package/dist/core/providers/device-libs.js +202 -0
- package/dist/core/providers/device.d.ts +42 -0
- package/dist/core/providers/device.js +95 -0
- package/dist/core/providers/errors.d.ts +99 -0
- package/dist/core/providers/errors.js +136 -0
- package/dist/core/providers/files.d.ts +90 -0
- package/dist/core/providers/files.js +389 -0
- package/dist/core/providers/inflight.d.ts +13 -0
- package/dist/core/providers/inflight.js +14 -0
- package/dist/core/providers/mint.d.ts +29 -0
- package/dist/core/providers/mint.js +219 -0
- package/dist/core/providers/receipts.d.ts +26 -0
- package/dist/core/providers/receipts.js +61 -0
- package/dist/core/providers/request.d.ts +27 -0
- package/dist/core/providers/request.js +173 -0
- package/dist/core/providers/roots.d.ts +23 -0
- package/dist/core/providers/roots.js +118 -0
- package/dist/core/providers/token-cache.d.ts +54 -0
- package/dist/core/providers/token-cache.js +203 -0
- package/dist/core/remote-canvas-target.d.ts +4 -0
- package/dist/core/remote-canvas-target.js +30 -0
- package/dist/core/review/comments.d.ts +69 -0
- package/dist/core/review/comments.js +296 -0
- package/dist/core/review/companion.d.ts +33 -0
- package/dist/core/review/companion.js +208 -0
- package/dist/core/review/signal.d.ts +5 -0
- package/dist/core/review/signal.js +12 -0
- package/dist/core/review/store.d.ts +44 -0
- package/dist/core/review/store.js +178 -0
- package/dist/core/review/types.d.ts +139 -0
- package/dist/core/review/types.js +23 -0
- package/dist/core/runs/activity.d.ts +11 -0
- package/dist/core/runs/activity.js +57 -0
- package/dist/core/runs/events.d.ts +41 -0
- package/dist/core/runs/events.js +179 -0
- package/dist/core/runs/operations.d.ts +85 -0
- package/dist/core/runs/operations.js +741 -0
- package/dist/core/runs/questions.d.ts +80 -0
- package/dist/core/runs/questions.js +151 -0
- package/dist/core/runtime/banner.d.ts +15 -0
- package/dist/core/runtime/banner.js +53 -0
- package/dist/core/runtime/bearings-render.d.ts +62 -0
- package/dist/core/runtime/bearings-render.js +272 -0
- package/dist/core/runtime/bearings.d.ts +56 -0
- package/dist/core/runtime/bearings.js +199 -0
- package/dist/core/runtime/bin-contributions.d.ts +44 -0
- package/dist/core/runtime/bin-contributions.js +186 -0
- package/dist/core/runtime/blaxel-environment.d.ts +2 -0
- package/dist/core/runtime/blaxel-environment.js +8 -0
- package/dist/core/runtime/broker/bash-job-launch.d.ts +12 -0
- package/dist/core/runtime/broker/bash-job-launch.js +50 -0
- package/dist/core/runtime/broker/model-adapter.d.ts +27 -0
- package/dist/core/runtime/broker/model-adapter.js +413 -0
- package/dist/core/runtime/broker/read-ops.d.ts +27 -0
- package/dist/core/runtime/broker/read-ops.js +172 -0
- package/dist/core/runtime/broker/turn-cause.d.ts +7 -0
- package/dist/core/runtime/broker/turn-cause.js +30 -0
- package/dist/core/runtime/broker-protocol.d.ts +727 -0
- package/dist/core/runtime/broker-protocol.js +152 -0
- package/dist/core/runtime/broker-request.d.ts +37 -0
- package/dist/core/runtime/broker-request.js +86 -0
- package/dist/core/runtime/broker-sdk.d.ts +36 -0
- package/dist/core/runtime/broker-sdk.js +130 -0
- package/dist/core/runtime/canvas-extensions.d.ts +34 -0
- package/dist/core/runtime/canvas-extensions.js +100 -0
- package/dist/core/runtime/close.d.ts +49 -0
- package/dist/core/runtime/close.js +266 -0
- package/dist/core/runtime/command-expansion.d.ts +19 -0
- package/dist/core/runtime/command-expansion.js +104 -0
- package/dist/core/runtime/command-surface.d.ts +38 -0
- package/dist/core/runtime/command-surface.js +117 -0
- package/dist/core/runtime/crtr-theme.d.ts +12 -0
- package/dist/core/runtime/crtr-theme.js +146 -0
- package/dist/core/runtime/deliver-live.d.ts +38 -0
- package/dist/core/runtime/deliver-live.js +87 -0
- package/dist/core/runtime/fault-recovery.d.ts +23 -0
- package/dist/core/runtime/fault-recovery.js +83 -0
- package/dist/core/runtime/fault.d.ts +6 -0
- package/dist/core/runtime/fault.js +17 -0
- package/dist/core/runtime/fleet.d.ts +106 -0
- package/dist/core/runtime/fleet.js +75 -0
- package/dist/core/runtime/focus-viewer.d.ts +45 -0
- package/dist/core/runtime/focus-viewer.js +151 -0
- package/dist/core/runtime/front-door-env.d.ts +5 -0
- package/dist/core/runtime/front-door-env.js +16 -0
- package/dist/core/runtime/headless-pi.d.ts +37 -0
- package/dist/core/runtime/headless-pi.js +173 -0
- package/dist/core/runtime/host.d.ts +74 -0
- package/dist/core/runtime/host.js +695 -0
- package/dist/core/runtime/interactive-deliver.d.ts +22 -0
- package/dist/core/runtime/interactive-deliver.js +51 -0
- package/dist/core/runtime/invocation.d.ts +15 -0
- package/dist/core/runtime/invocation.js +10 -0
- package/dist/core/runtime/kickoff.d.ts +37 -0
- package/dist/core/runtime/kickoff.js +263 -0
- package/dist/core/runtime/launch-prompt.d.ts +8 -0
- package/dist/core/runtime/launch-prompt.js +13 -0
- package/dist/core/runtime/launch-target.d.ts +43 -0
- package/dist/core/runtime/launch-target.js +83 -0
- package/dist/core/runtime/launch.d.ts +206 -0
- package/dist/core/runtime/launch.js +498 -0
- package/dist/core/runtime/ledger.d.ts +10 -0
- package/dist/core/runtime/ledger.js +55 -0
- package/dist/core/runtime/lifecycle.d.ts +47 -0
- package/dist/core/runtime/lifecycle.js +283 -0
- package/dist/core/runtime/managed-provider-cooling.d.ts +24 -0
- package/dist/core/runtime/managed-provider-cooling.js +62 -0
- package/dist/core/runtime/memory-admission.d.ts +38 -0
- package/dist/core/runtime/memory-admission.js +68 -0
- package/dist/core/runtime/model-registry.d.ts +3 -0
- package/dist/core/runtime/model-registry.js +13 -0
- package/dist/core/runtime/model-selection.d.ts +54 -0
- package/dist/core/runtime/model-selection.js +135 -0
- package/dist/core/runtime/model-swap.d.ts +26 -0
- package/dist/core/runtime/model-swap.js +75 -0
- package/dist/core/runtime/naming.d.ts +69 -0
- package/dist/core/runtime/naming.js +298 -0
- package/dist/core/runtime/nerd-font.d.ts +46 -0
- package/dist/core/runtime/nerd-font.js +162 -0
- package/dist/core/runtime/nodes.d.ts +140 -0
- package/dist/core/runtime/nodes.js +506 -0
- package/dist/core/runtime/outcome-document.d.ts +58 -0
- package/dist/core/runtime/outcome-document.js +86 -0
- package/dist/core/runtime/output-result.d.ts +15 -0
- package/dist/core/runtime/output-result.js +32 -0
- package/dist/core/runtime/output-schema-refs.d.ts +3 -0
- package/dist/core/runtime/output-schema-refs.js +100 -0
- package/dist/core/runtime/package-health.d.ts +34 -0
- package/dist/core/runtime/package-health.js +100 -0
- package/dist/core/runtime/persona.d.ts +21 -0
- package/dist/core/runtime/persona.js +54 -0
- package/dist/core/runtime/pi-cli.d.ts +8 -0
- package/dist/core/runtime/pi-cli.js +65 -0
- package/dist/core/runtime/pi-vendored.d.ts +28 -0
- package/dist/core/runtime/pi-vendored.js +63 -0
- package/dist/core/runtime/placement-tmux.d.ts +32 -0
- package/dist/core/runtime/placement-tmux.js +81 -0
- package/dist/core/runtime/placement.d.ts +116 -0
- package/dist/core/runtime/placement.js +418 -0
- package/dist/core/runtime/progress-bar.d.ts +13 -0
- package/dist/core/runtime/progress-bar.js +50 -0
- package/dist/core/runtime/provider-credential-gate.d.ts +8 -0
- package/dist/core/runtime/provider-credential-gate.js +33 -0
- package/dist/core/runtime/recovery-hold.d.ts +21 -0
- package/dist/core/runtime/recovery-hold.js +46 -0
- package/dist/core/runtime/reopen.d.ts +49 -0
- package/dist/core/runtime/reopen.js +160 -0
- package/dist/core/runtime/revive.d.ts +114 -0
- package/dist/core/runtime/revive.js +739 -0
- package/dist/core/runtime/roadmap.d.ts +24 -0
- package/dist/core/runtime/roadmap.js +86 -0
- package/dist/core/runtime/runner/blaxel/client.d.ts +83 -0
- package/dist/core/runtime/runner/blaxel/client.js +140 -0
- package/dist/core/runtime/runner/blaxel/image-build.d.ts +74 -0
- package/dist/core/runtime/runner/blaxel/image-build.js +209 -0
- package/dist/core/runtime/runner/index.d.ts +9 -0
- package/dist/core/runtime/runner/index.js +37 -0
- package/dist/core/runtime/runner/machine/call.d.ts +8 -0
- package/dist/core/runtime/runner/machine/call.js +67 -0
- package/dist/core/runtime/runner/machine/environment.d.ts +1 -0
- package/dist/core/runtime/runner/machine/environment.js +7 -0
- package/dist/core/runtime/runner/machine/ops.d.ts +127 -0
- package/dist/core/runtime/runner/machine/ops.js +41 -0
- package/dist/core/runtime/runner/machine/runner.d.ts +12 -0
- package/dist/core/runtime/runner/machine/runner.js +90 -0
- package/dist/core/runtime/runner/process.d.ts +11 -0
- package/dist/core/runtime/runner/process.js +70 -0
- package/dist/core/runtime/runner/types.d.ts +101 -0
- package/dist/core/runtime/runner/types.js +16 -0
- package/dist/core/runtime/session-branch.d.ts +7 -0
- package/dist/core/runtime/session-branch.js +16 -0
- package/dist/core/runtime/session-cycles.d.ts +45 -0
- package/dist/core/runtime/session-cycles.js +110 -0
- package/dist/core/runtime/session-list-cache.d.ts +37 -0
- package/dist/core/runtime/session-list-cache.js +302 -0
- package/dist/core/runtime/session-visibility.d.ts +37 -0
- package/dist/core/runtime/session-visibility.js +99 -0
- package/dist/core/runtime/setup-marker.d.ts +8 -0
- package/dist/core/runtime/setup-marker.js +46 -0
- package/dist/core/runtime/situational-context.d.ts +16 -0
- package/dist/core/runtime/situational-context.js +54 -0
- package/dist/core/runtime/situational-live.d.ts +9 -0
- package/dist/core/runtime/situational-live.js +41 -0
- package/dist/core/runtime/spawn-env-rows.d.ts +5 -0
- package/dist/core/runtime/spawn-env-rows.js +15 -0
- package/dist/core/runtime/spawn-env.d.ts +40 -0
- package/dist/core/runtime/spawn-env.js +260 -0
- package/dist/core/runtime/spawn.d.ts +160 -0
- package/dist/core/runtime/spawn.js +699 -0
- package/dist/core/runtime/stamp/protocol.d.ts +90 -0
- package/dist/core/runtime/stamp/protocol.js +113 -0
- package/dist/core/runtime/start-check.d.ts +15 -0
- package/dist/core/runtime/start-check.js +31 -0
- package/dist/core/runtime/stop-guard.d.ts +31 -0
- package/dist/core/runtime/stop-guard.js +150 -0
- package/dist/core/runtime/structured-output.d.ts +36 -0
- package/dist/core/runtime/structured-output.js +112 -0
- package/dist/core/runtime/surface-bg.d.ts +13 -0
- package/dist/core/runtime/surface-bg.js +85 -0
- package/dist/core/runtime/tmux-bindings.d.ts +30 -0
- package/dist/core/runtime/tmux-bindings.js +743 -0
- package/dist/core/runtime/tmux-chrome.d.ts +2 -0
- package/dist/core/runtime/tmux-chrome.js +5 -0
- package/dist/core/runtime/tmux-driver.d.ts +328 -0
- package/dist/core/runtime/tmux-driver.js +713 -0
- package/dist/core/runtime/unsandboxed.d.ts +3 -0
- package/dist/core/runtime/unsandboxed.js +16 -0
- package/dist/core/runtime/view-socket.d.ts +61 -0
- package/dist/core/runtime/view-socket.js +194 -0
- package/dist/core/runtime/warm-pool.d.ts +79 -0
- package/dist/core/runtime/warm-pool.js +473 -0
- package/dist/core/scoped-state/db.d.ts +17 -0
- package/dist/core/scoped-state/db.js +261 -0
- package/dist/core/scoped-state/legacy-profiles.d.ts +11 -0
- package/dist/core/scoped-state/legacy-profiles.js +61 -0
- package/dist/core/scoped-state/migrate.d.ts +15 -0
- package/dist/core/scoped-state/migrate.js +332 -0
- package/dist/core/scoped-state/person-rows.d.ts +10 -0
- package/dist/core/scoped-state/person-rows.js +173 -0
- package/dist/core/scoped-state/schema.d.ts +10 -0
- package/dist/core/scoped-state/schema.js +47 -0
- package/dist/core/scopes.d.ts +20 -0
- package/dist/core/scopes.js +48 -0
- package/dist/core/secrets/env-rows.d.ts +18 -0
- package/dist/core/secrets/env-rows.js +40 -0
- package/dist/core/secrets/environment-owner.d.ts +8 -0
- package/dist/core/secrets/environment-owner.js +31 -0
- package/dist/core/secrets/environment-secrets.d.ts +14 -0
- package/dist/core/secrets/environment-secrets.js +14 -0
- package/dist/core/secrets/index.d.ts +2 -0
- package/dist/core/secrets/index.js +2 -0
- package/dist/core/secrets/key.d.ts +3 -0
- package/dist/core/secrets/key.js +33 -0
- package/dist/core/secrets/seal.d.ts +18 -0
- package/dist/core/secrets/seal.js +43 -0
- package/dist/core/secrets.d.ts +50 -0
- package/dist/core/secrets.js +147 -0
- package/dist/core/self-update.d.ts +27 -0
- package/dist/core/self-update.js +77 -0
- package/dist/core/session-model/session-state.d.ts +53 -0
- package/dist/core/session-model/session-state.js +180 -0
- package/dist/core/shell-segments.d.ts +42 -0
- package/dist/core/shell-segments.js +169 -0
- package/dist/core/spaces/cache-env.d.ts +2 -0
- package/dist/core/spaces/cache-env.js +15 -0
- package/dist/core/spaces/file-root.d.ts +23 -0
- package/dist/core/spaces/file-root.js +68 -0
- package/dist/core/spaces/mounts.d.ts +41 -0
- package/dist/core/spaces/mounts.js +126 -0
- package/dist/core/spaces/permissions.d.ts +19 -0
- package/dist/core/spaces/permissions.js +77 -0
- package/dist/core/spaces/process.d.ts +61 -0
- package/dist/core/spaces/process.js +172 -0
- package/dist/core/spaces/runtime-home.d.ts +5 -0
- package/dist/core/spaces/runtime-home.js +8 -0
- package/dist/core/spaces/space.d.ts +9 -0
- package/dist/core/spaces/space.js +58 -0
- package/dist/core/spaces/stop.d.ts +24 -0
- package/dist/core/spaces/stop.js +138 -0
- package/dist/core/spaces/users.d.ts +20 -0
- package/dist/core/spaces/users.js +43 -0
- package/dist/core/sqlite-statements.d.ts +4 -0
- package/dist/core/sqlite-statements.js +17 -0
- package/dist/core/statements.d.ts +17 -0
- package/dist/core/statements.js +81 -0
- package/dist/core/storage/attachments.d.ts +36 -0
- package/dist/core/storage/attachments.js +135 -0
- package/dist/core/storage/client.d.ts +109 -0
- package/dist/core/storage/client.js +231 -0
- package/dist/core/storage/download.d.ts +24 -0
- package/dist/core/storage/download.js +184 -0
- package/dist/core/storage/purge.d.ts +6 -0
- package/dist/core/storage/purge.js +52 -0
- package/dist/core/storage/tables.d.ts +67 -0
- package/dist/core/storage/tables.js +109 -0
- package/dist/core/subscription-state.d.ts +96 -0
- package/dist/core/subscription-state.js +438 -0
- package/dist/core/substrate/delivery/corpus.d.ts +26 -0
- package/dist/core/substrate/delivery/corpus.js +138 -0
- package/dist/core/substrate/delivery/deliver.d.ts +71 -0
- package/dist/core/substrate/delivery/deliver.js +333 -0
- package/dist/core/substrate/delivery/listings.d.ts +30 -0
- package/dist/core/substrate/delivery/listings.js +75 -0
- package/dist/core/substrate/delivery/match.d.ts +28 -0
- package/dist/core/substrate/delivery/match.js +146 -0
- package/dist/core/substrate/delivery/plan.d.ts +57 -0
- package/dist/core/substrate/delivery/plan.js +126 -0
- package/dist/core/substrate/delivery/render-boot.d.ts +20 -0
- package/dist/core/substrate/delivery/render-boot.js +329 -0
- package/dist/core/substrate/delivery/render-event.d.ts +47 -0
- package/dist/core/substrate/delivery/render-event.js +160 -0
- package/dist/core/substrate/delivery/sub-persona-menu.d.ts +2 -0
- package/dist/core/substrate/delivery/sub-persona-menu.js +24 -0
- package/dist/core/substrate/delivery/types.d.ts +30 -0
- package/dist/core/substrate/delivery/types.js +1 -0
- package/dist/core/substrate/gate-explain.d.ts +35 -0
- package/dist/core/substrate/gate-explain.js +397 -0
- package/dist/core/substrate/schema.d.ts +29 -0
- package/dist/core/substrate/schema.js +81 -0
- package/dist/core/substrate/subject-fields.d.ts +52 -0
- package/dist/core/substrate/subject-fields.js +39 -0
- package/dist/core/substrate/subject.d.ts +13 -0
- package/dist/core/substrate/subject.js +60 -0
- package/dist/core/termrender/code-doc.d.ts +12 -0
- package/dist/core/termrender/code-doc.js +92 -0
- package/dist/core/termrender/display.d.ts +16 -0
- package/dist/core/termrender/display.js +56 -0
- package/dist/core/termrender/termrender.d.ts +71 -0
- package/dist/core/termrender/termrender.js +719 -0
- package/dist/core/termrender/version.d.ts +1 -0
- package/dist/core/termrender/version.js +1 -0
- package/dist/core/timing.d.ts +11 -0
- package/dist/core/timing.js +94 -0
- package/dist/core/tui/draw.d.ts +103 -0
- package/dist/core/tui/draw.js +378 -0
- package/dist/core/tui/fuzzy.d.ts +9 -0
- package/dist/core/tui/fuzzy.js +38 -0
- package/dist/core/tui/markdown.d.ts +17 -0
- package/dist/core/tui/markdown.js +407 -0
- package/dist/core/tui/page-host.d.ts +31 -0
- package/dist/core/tui/page-host.js +74 -0
- package/dist/core/tui/panel.d.ts +45 -0
- package/dist/core/tui/panel.js +142 -0
- package/dist/core/tui/terminal.d.ts +23 -0
- package/dist/core/tui/terminal.js +100 -0
- package/dist/core/wake.d.ts +89 -0
- package/dist/core/wake.js +296 -0
- package/dist/core/worktree-containment.d.ts +14 -0
- package/dist/core/worktree-containment.js +48 -0
- package/dist/core/worktree-landing.d.ts +44 -0
- package/dist/core/worktree-landing.js +56 -0
- package/dist/core/worktree-mutation-async.d.ts +23 -0
- package/dist/core/worktree-mutation-async.js +335 -0
- package/dist/core/worktree-remove.d.ts +15 -0
- package/dist/core/worktree-remove.js +84 -0
- package/dist/core/worktree.d.ts +121 -0
- package/dist/core/worktree.js +909 -0
- package/dist/daemon/api/deferred-head.d.ts +14 -0
- package/dist/daemon/api/deferred-head.js +117 -0
- package/dist/daemon/api/environment-of.d.ts +18 -0
- package/dist/daemon/api/environment-of.js +40 -0
- package/dist/daemon/api/handlers/git-credential.d.ts +11 -0
- package/dist/daemon/api/handlers/git-credential.js +64 -0
- package/dist/daemon/api/handlers/providers.d.ts +83 -0
- package/dist/daemon/api/handlers/providers.js +283 -0
- package/dist/daemon/api/handlers/validate.d.ts +23 -0
- package/dist/daemon/api/handlers/validate.js +58 -0
- package/dist/daemon/api/map.d.ts +167 -0
- package/dist/daemon/api/map.js +764 -0
- package/dist/daemon/api/operations.d.ts +18 -0
- package/dist/daemon/api/operations.js +306 -0
- package/dist/daemon/api/principal.d.ts +65 -0
- package/dist/daemon/api/principal.js +143 -0
- package/dist/daemon/api/reader.d.ts +24 -0
- package/dist/daemon/api/reader.js +123 -0
- package/dist/daemon/api/router.d.ts +193 -0
- package/dist/daemon/api/router.js +536 -0
- package/dist/daemon/api/sync-notice.d.ts +17 -0
- package/dist/daemon/api/sync-notice.js +46 -0
- package/dist/daemon/api/viewer-presence.d.ts +20 -0
- package/dist/daemon/api/viewer-presence.js +100 -0
- package/dist/daemon/broker-signals/bus.d.ts +3 -2
- package/dist/daemon/broker-signals/bus.js +3 -2
- package/dist/daemon/companion-retire.d.ts +4 -0
- package/dist/daemon/companion-retire.js +44 -0
- package/dist/daemon/control.d.ts +40 -0
- package/dist/daemon/control.js +22 -0
- package/dist/daemon/cron/authority.d.ts +38 -0
- package/dist/daemon/cron/authority.js +90 -0
- package/dist/daemon/cron/live-runs.d.ts +54 -0
- package/dist/daemon/cron/live-runs.js +66 -0
- package/dist/daemon/cron/run-socket.d.ts +30 -0
- package/dist/daemon/cron/run-socket.js +170 -0
- package/dist/daemon/drain.d.ts +25 -0
- package/dist/daemon/drain.js +76 -0
- package/dist/daemon/human/finish.d.ts +24 -0
- package/dist/daemon/human/finish.js +178 -0
- package/dist/daemon/human/settle.d.ts +44 -0
- package/dist/daemon/human/settle.js +103 -0
- package/dist/daemon/machine-link/config.d.ts +45 -0
- package/dist/daemon/machine-link/config.js +63 -0
- package/dist/daemon/machine-link/credential.d.ts +7 -0
- package/dist/daemon/machine-link/credential.js +24 -0
- package/dist/daemon/machine-link/forward.d.ts +16 -0
- package/dist/daemon/machine-link/forward.js +181 -0
- package/dist/daemon/machine-link/frames.d.ts +49 -0
- package/dist/daemon/machine-link/frames.js +25 -0
- package/dist/daemon/machine-link/holder.d.ts +73 -0
- package/dist/daemon/machine-link/holder.js +272 -0
- package/dist/daemon/machine-link/move-notify.d.ts +4 -0
- package/dist/daemon/machine-link/move-notify.js +15 -0
- package/dist/daemon/manage.d.ts +19 -3
- package/dist/daemon/manage.js +21 -6
- package/dist/daemon/park-activity.d.ts +10 -0
- package/dist/daemon/park-activity.js +33 -0
- package/dist/daemon/park-pending.d.ts +25 -0
- package/dist/daemon/park-pending.js +76 -0
- package/dist/daemon/postgres/binary.d.ts +17 -0
- package/dist/daemon/postgres/binary.js +193 -0
- package/dist/daemon/postgres/cluster.d.ts +37 -0
- package/dist/daemon/postgres/cluster.js +111 -0
- package/dist/daemon/postgres/pins.d.ts +7 -0
- package/dist/daemon/postgres/pins.js +16 -0
- package/dist/daemon/postgres/supervisor.d.ts +95 -0
- package/dist/daemon/postgres/supervisor.js +177 -0
- package/dist/daemon/readiness.d.ts +11 -0
- package/dist/daemon/readiness.js +37 -0
- package/dist/daemon/reconcilers/broker-supervision.d.ts +112 -0
- package/dist/daemon/reconcilers/broker-supervision.js +842 -0
- package/dist/daemon/reconcilers/ledger-sandbox.d.ts +54 -0
- package/dist/daemon/reconcilers/ledger-sandbox.js +249 -0
- package/dist/daemon/reconcilers/live-obligation.d.ts +77 -0
- package/dist/daemon/reconcilers/live-obligation.js +114 -0
- package/dist/daemon/reconcilers/node-lifecycle/launch-failure.d.ts +1 -0
- package/dist/daemon/reconcilers/node-lifecycle/launch-failure.js +8 -0
- package/dist/daemon/reconcilers/node-lifecycle/node-person.d.ts +9 -0
- package/dist/daemon/reconcilers/node-lifecycle/node-person.js +40 -0
- package/dist/daemon/reconcilers/node-lifecycle/remote-wake.d.ts +32 -0
- package/dist/daemon/reconcilers/node-lifecycle/remote-wake.js +124 -0
- package/dist/daemon/reconcilers/recipe-image.d.ts +49 -0
- package/dist/daemon/reconcilers/recipe-image.js +145 -0
- package/dist/daemon/reconcilers/throttled-lane.d.ts +11 -0
- package/dist/daemon/reconcilers/throttled-lane.js +63 -0
- package/dist/daemon/runs/append-section.d.ts +9 -0
- package/dist/daemon/runs/append-section.js +135 -0
- package/dist/daemon/runs/observer.d.ts +17 -0
- package/dist/daemon/runs/observer.js +441 -0
- package/dist/daemon/runs/view-transport.d.ts +19 -0
- package/dist/daemon/runs/view-transport.js +81 -0
- package/dist/daemon/structured-requests/sidecar.d.ts +4 -0
- package/dist/daemon/structured-requests/sidecar.js +5 -0
- package/dist/hook-authoring.d.ts +130 -0
- package/dist/hook-authoring.js +447 -0
- package/dist/hook-process.d.ts +7 -0
- package/dist/hook-process.js +34 -0
- package/dist/launcher/client.d.ts +6 -0
- package/dist/launcher/client.js +52 -0
- package/dist/launcher/limits/policy.d.ts +141 -0
- package/dist/launcher/limits/policy.js +142 -0
- package/dist/launcher/limits/settings.d.ts +19 -0
- package/dist/launcher/limits/settings.js +94 -0
- package/dist/launcher/spec.d.ts +181 -0
- package/dist/launcher/spec.js +10 -0
- package/dist/migrations/004-canvas-documents/apply.d.ts +8 -0
- package/dist/migrations/004-canvas-documents/apply.js +113 -0
- package/dist/migrations/004-canvas-documents/fields.d.ts +24 -0
- package/dist/migrations/004-canvas-documents/fields.js +52 -0
- package/dist/migrations/004-canvas-documents/index.d.ts +16 -0
- package/dist/migrations/004-canvas-documents/index.js +88 -0
- package/dist/migrations/004-canvas-documents/legacy/discover.d.ts +16 -0
- package/dist/migrations/004-canvas-documents/legacy/discover.js +251 -0
- package/dist/migrations/004-canvas-documents/legacy/history.d.ts +5 -0
- package/dist/migrations/004-canvas-documents/legacy/history.js +37 -0
- package/dist/migrations/004-canvas-documents/legacy/nested.d.ts +7 -0
- package/dist/migrations/004-canvas-documents/legacy/nested.js +37 -0
- package/dist/migrations/004-canvas-documents/legacy/parse.d.ts +14 -0
- package/dist/migrations/004-canvas-documents/legacy/parse.js +24 -0
- package/dist/migrations/004-canvas-documents/legacy/types.d.ts +91 -0
- package/dist/migrations/004-canvas-documents/legacy/types.js +3 -0
- package/dist/migrations/004-canvas-documents/plan.d.ts +102 -0
- package/dist/migrations/004-canvas-documents/plan.js +410 -0
- package/dist/migrations/004-canvas-documents/pointers.d.ts +23 -0
- package/dist/migrations/004-canvas-documents/pointers.js +95 -0
- package/dist/migrations/activation.d.ts +17 -0
- package/dist/migrations/activation.js +46 -0
- package/dist/shared/crtr-version.d.ts +2 -0
- package/dist/shared/crtr-version.js +18 -0
- package/dist/shared/inbox-entry-body.js +6 -2
- package/dist/shared/inline-ref-grammar.d.ts +53 -0
- package/dist/shared/inline-ref-grammar.js +99 -0
- package/dist/shared/shell-quote.d.ts +3 -0
- package/dist/shared/shell-quote.js +5 -0
- package/dist/shared/strip-cd-prefix.d.ts +1 -0
- package/dist/shared/strip-cd-prefix.js +13 -0
- package/dist/shared/tool-groups.d.ts +26 -0
- package/dist/shared/tool-groups.js +64 -0
- package/dist/shared/traceparent.d.ts +6 -0
- package/dist/shared/traceparent.js +28 -0
- package/dist/shared/turn-replies.d.ts +27 -0
- package/dist/shared/turn-replies.js +71 -0
- package/package.json +1 -1
|
@@ -0,0 +1,1206 @@
|
|
|
1
|
+
// The canvas data-access layer. Nodes, their sessions, executions, and managed
|
|
2
|
+
// worktrees are SQL-authoritative. Node directories hold only artifacts.
|
|
3
|
+
import { envNodeId } from '../../shared/env.js';
|
|
4
|
+
import { lstatSync, realpathSync, rmdirSync, rmSync, statSync } from 'node:fs';
|
|
5
|
+
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
6
|
+
import { removeTreeBeneath } from '../spaces/open-beneath.js';
|
|
7
|
+
import { emitEvent } from '../events/emit.js';
|
|
8
|
+
import { withCanvasWrite, openDb } from './db.js';
|
|
9
|
+
import { conversationStore, ConversationNotFoundError } from '../conversation-store/index.js';
|
|
10
|
+
import { hasUnseenWakeMail, UNSEEN_WAKE_MAIL_SQL } from './deliveries.js';
|
|
11
|
+
import { isAppRun } from './app-run.js';
|
|
12
|
+
import { registerOutcomeAction } from './outcome-actions.js';
|
|
13
|
+
import { publish } from '../graph/events.js';
|
|
14
|
+
import { nodeObject } from '../graph/objects.js';
|
|
15
|
+
import { findNodeBySessionFileSql } from './sessions.js';
|
|
16
|
+
import { hydrateFault } from './recovery.js';
|
|
17
|
+
import { hasUnreconciledWorktree, openWorktree, readWorktree, worktreeFromRow } from './worktrees.js';
|
|
18
|
+
import { isPidAlive, isPidPresent, recordedPidLiveness } from './pid.js';
|
|
19
|
+
import { ensureHome, jobDir, nodeDir, nodeRunDir } from './paths.js';
|
|
20
|
+
import { appForNode, ensureNodeDirs, nodeAgentDir } from './node-agent-paths.js';
|
|
21
|
+
import { appSpace } from '../layout.js';
|
|
22
|
+
import { createObject, getById, ownerForGrantee, setObjectKind, setObjectName } from '../graph/objects.js';
|
|
23
|
+
import { profileObject } from '../graph/reader.js';
|
|
24
|
+
import { writeActsFor } from '../permissions/facts.js';
|
|
25
|
+
import { CrtrError } from '../errors.js';
|
|
26
|
+
import { deleteNodeWithOwned } from '../graph/deletion.js';
|
|
27
|
+
import { SUBTREE_ALL_IDS_SQL, SUBTREE_IDS_SQL } from './tree.js';
|
|
28
|
+
import { filterAsync, mapAsync } from '../async-array.js';
|
|
29
|
+
function jsonValue(value, field) {
|
|
30
|
+
if (value === undefined || value === null)
|
|
31
|
+
return null;
|
|
32
|
+
const encoded = JSON.stringify(value);
|
|
33
|
+
if (encoded === undefined)
|
|
34
|
+
throw new TypeError(`${field} must be JSON-serializable`);
|
|
35
|
+
return encoded;
|
|
36
|
+
}
|
|
37
|
+
export async function assertRunNotDeleting(db, runId) {
|
|
38
|
+
if ((await db.prepare('SELECT deleting_at FROM nodes WHERE node_id = ?').get(runId))?.deleting_at)
|
|
39
|
+
throw new Error('run is deleting');
|
|
40
|
+
}
|
|
41
|
+
/** The profile's object (made on first use), or null when the profile has no stored manifest to name one from. */
|
|
42
|
+
async function profileObjectFor(db, profileId, app) {
|
|
43
|
+
try {
|
|
44
|
+
return await profileObject(db, profileId, app);
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
if (e instanceof CrtrError && e.code === 'not_found')
|
|
48
|
+
return null;
|
|
49
|
+
throw e;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async function seedRow(meta, db) {
|
|
53
|
+
const app = await ownerForGrantee(db, meta.grantee ?? 'app:terminal');
|
|
54
|
+
// The node sits under its profile's object when it has one; otherwise directly under its app.
|
|
55
|
+
const profile = meta.profile_id ? await profileObjectFor(db, meta.profile_id, app) : null;
|
|
56
|
+
await createObject(db, { id: meta.node_id, type: 'node', kind: meta.kind, owner: (profile ?? app).id, privacy: 'public', name: meta.name, preview: '' });
|
|
57
|
+
// A node directly under an app is readable by the person it was made for.
|
|
58
|
+
if (profile === null && meta.sub)
|
|
59
|
+
await writeActsFor(db, meta.node_id, meta.sub);
|
|
60
|
+
await db.prepare(`INSERT INTO nodes (node_id, description, title, icon, cycles, mode, lifecycle, cwd, host_kind, profile_id, parent, spawned_by, creator, fork_from, fork_source_file, created, passive_default, cycle_pending, model_override, persona_ack_json, review_binding_json, launch_config_json, scopes_json, isolated, status, intent, final_report, finalized_at, deadline_at, "window", tmux_session, pane, sub, grant_id, client_id, metadata_json, run_id, event_cursor, usage_json, deleting_at, caused_by, app) VALUES (${Array(42).fill('?').join(', ')})`)
|
|
61
|
+
.run(meta.node_id, meta.description ?? null, meta.title ?? null, meta.icon ?? null, meta.cycles ?? null, meta.mode, meta.lifecycle, meta.cwd, meta.host_kind ?? null, meta.profile_id ?? null, meta.parent ?? null, meta.spawned_by ?? null, meta.creator ?? null, meta.fork_from ?? null, meta.fork_source_file ?? null, meta.created, meta.passive_default === true ? 1 : 0, meta.cycle_pending === true ? 1 : 0, meta.model_override ?? null, jsonValue(meta.persona_ack, 'persona_ack'), jsonValue(meta.review_binding, 'review_binding'), jsonValue(meta.launch, 'launch'), jsonValue(meta.scopes, 'scopes'), meta.isolated === true ? 1 : 0, meta.status ?? 'active', meta.intent ?? null, meta.final_report ?? null, meta.finalized_at ?? null, meta.deadline_at ?? null, meta.window ?? null, meta.tmux_session ?? null, meta.pane ?? null, meta.sub ?? null, meta.grant_id ?? null, meta.client_id ?? null, meta.metadata_json ?? null, meta.run_id ?? null, meta.event_cursor ?? null, meta.usage_json ?? null, meta.deleting_at ?? null, meta.caused_by ?? null, app.id);
|
|
62
|
+
}
|
|
63
|
+
/** The `node_rows` view projects the active fault's columns under a `fault_`
|
|
64
|
+
* prefix; strip it and hydrate through the same mapper `readFault` uses. */
|
|
65
|
+
function faultFrom(r) {
|
|
66
|
+
if (r['fault_id'] == null)
|
|
67
|
+
return null;
|
|
68
|
+
const columns = Object.entries(r).filter(([key]) => key.startsWith('fault_')).map(([key, value]) => [key === 'fault_id' ? key : key.slice('fault_'.length), value]);
|
|
69
|
+
return hydrateFault(Object.fromEntries(columns));
|
|
70
|
+
}
|
|
71
|
+
function rowFrom(r) {
|
|
72
|
+
const node = {
|
|
73
|
+
node_id: r['node_id'],
|
|
74
|
+
name: r['name'],
|
|
75
|
+
description: r['description'] ?? undefined,
|
|
76
|
+
cycles: r['cycles'] ?? undefined,
|
|
77
|
+
kind: r['kind'],
|
|
78
|
+
mode: r['mode'],
|
|
79
|
+
lifecycle: r['lifecycle'],
|
|
80
|
+
status: r['status'],
|
|
81
|
+
cwd: r['cwd'],
|
|
82
|
+
host_kind: r['host_kind'] ?? null,
|
|
83
|
+
profile_id: r['profile_id'] ?? null,
|
|
84
|
+
scopes: r['scopes_json'] == null ? null : JSON.parse(r['scopes_json']),
|
|
85
|
+
isolated: r['isolated'] === 1,
|
|
86
|
+
grantee: r['grantee'],
|
|
87
|
+
sub: r['sub'] ?? null,
|
|
88
|
+
grant_id: r['grant_id'] ?? null,
|
|
89
|
+
client_id: r['client_id'] ?? null,
|
|
90
|
+
metadata_json: r['metadata_json'] ?? null,
|
|
91
|
+
run_id: r['run_id'] ?? null,
|
|
92
|
+
event_cursor: r['event_cursor'] ?? null,
|
|
93
|
+
last_activity_at: r['last_activity_at'] ?? null,
|
|
94
|
+
usage_json: r['usage_json'] ?? null,
|
|
95
|
+
caused_by: r['caused_by'] ?? null,
|
|
96
|
+
last_turn_error_json: r['last_turn_error_json'] ?? null,
|
|
97
|
+
deleting_at: r['deleting_at'] ?? null,
|
|
98
|
+
parent: r['parent'] ?? null,
|
|
99
|
+
created: r['created'],
|
|
100
|
+
intent: r['intent'] ?? null,
|
|
101
|
+
frozen_at: r['frozen_at'] ?? null,
|
|
102
|
+
respawn_failures: r['respawn_failures'] ?? 0,
|
|
103
|
+
respawn_not_before: r['respawn_not_before'] ?? null,
|
|
104
|
+
launched_at: r['launched_at'] ?? null,
|
|
105
|
+
last_settled_at: r['last_settled_at'] ?? null,
|
|
106
|
+
terminal_reason: r['terminal_reason'] ?? null,
|
|
107
|
+
final_report: r['final_report'] ?? null,
|
|
108
|
+
finalized_at: r['finalized_at'] ?? null,
|
|
109
|
+
outcome_kind: r['outcome_kind'] ?? null,
|
|
110
|
+
outcome_reason: r['outcome_reason'] ?? null,
|
|
111
|
+
outcome_at: r['outcome_at'] ?? null,
|
|
112
|
+
outcome_revision: r['outcome_revision'] ?? 0,
|
|
113
|
+
outcome_detail_json: r['outcome_detail_json'] ?? null,
|
|
114
|
+
deadline_at: r['deadline_at'] ?? null,
|
|
115
|
+
telemetry_tokens_in: r['telemetry_tokens_in'] ?? null,
|
|
116
|
+
telemetry_context_tokens: r['telemetry_context_tokens'] ?? null,
|
|
117
|
+
telemetry_last_activity: r['telemetry_last_activity'] ?? null,
|
|
118
|
+
telemetry_updated_at: r['telemetry_updated_at'] ?? null,
|
|
119
|
+
pi_pid: r['pi_pid'] ?? null,
|
|
120
|
+
pi_pid_identity: r['pi_pid_identity'] ?? null,
|
|
121
|
+
window: r['window'] ?? null,
|
|
122
|
+
tmux_session: r['tmux_session'] ?? null,
|
|
123
|
+
pane: r['pane'] ?? null,
|
|
124
|
+
fault: null,
|
|
125
|
+
streaming: false,
|
|
126
|
+
};
|
|
127
|
+
const pidAlive = isPidPresent(node.pi_pid);
|
|
128
|
+
const fault = faultFrom(r);
|
|
129
|
+
node.fault = fault?.link === 'pi→provider' && fault.retry.by === 'daemon' && fault.retry.disposition === 'auto' && !pidAlive
|
|
130
|
+
? null
|
|
131
|
+
: fault;
|
|
132
|
+
node.streaming = r['turn_open_at'] !== null && r['turn_closed_at'] === null && pidAlive;
|
|
133
|
+
return node;
|
|
134
|
+
}
|
|
135
|
+
async function metaFrom(r, worktree) {
|
|
136
|
+
worktree ??= await readWorktree(r['node_id']);
|
|
137
|
+
return {
|
|
138
|
+
...rowFrom(r),
|
|
139
|
+
title: r['title'] ?? undefined,
|
|
140
|
+
icon: r['icon'] ?? undefined,
|
|
141
|
+
spawned_by: r['spawned_by'] ?? null,
|
|
142
|
+
creator: r['creator'] ?? null,
|
|
143
|
+
fork_from: r['fork_from'] ?? null,
|
|
144
|
+
fork_source_file: r['fork_source_file'] ?? null,
|
|
145
|
+
passive_default: r['passive_default'] === 1,
|
|
146
|
+
cycle_pending: r['cycle_pending'] === 1,
|
|
147
|
+
model_override: r['model_override'] ?? null,
|
|
148
|
+
scopes: r['scopes_json'] == null ? null : JSON.parse(r['scopes_json']),
|
|
149
|
+
persona_ack: r['persona_ack_json'] == null ? undefined : JSON.parse(r['persona_ack_json']),
|
|
150
|
+
review_binding: r['review_binding_json'] == null ? undefined : JSON.parse(r['review_binding_json']),
|
|
151
|
+
launch: r['launch_config_json'] == null ? undefined : JSON.parse(r['launch_config_json']),
|
|
152
|
+
pi_session_id: r['pi_session_id'] ?? null,
|
|
153
|
+
pi_session_file: r['pi_session_file'] ?? null,
|
|
154
|
+
...(worktree === null ? {} : { managed_worktree: worktree }),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
// Nodes
|
|
158
|
+
/** Create a SQL-authoritative node, then ensure its artifact directories exist. */
|
|
159
|
+
export async function createNode(meta, opts = {}) {
|
|
160
|
+
ensureHome();
|
|
161
|
+
await withCanvasWrite(async (db) => {
|
|
162
|
+
await seedRow(meta, db);
|
|
163
|
+
if (meta.managed_worktree !== undefined && meta.managed_worktree !== null)
|
|
164
|
+
await openWorktree(meta.node_id, meta.managed_worktree, db);
|
|
165
|
+
if (opts.outcomeDelivery !== undefined)
|
|
166
|
+
await registerOutcomeAction(db, meta.node_id, opts.outcomeDelivery);
|
|
167
|
+
await opts.withinCreate?.(db, meta);
|
|
168
|
+
});
|
|
169
|
+
await ensureNodeDirs(meta.node_id);
|
|
170
|
+
return await getNode(meta.node_id);
|
|
171
|
+
}
|
|
172
|
+
/** The canonical node record, hydrated from SQL. Null if unknown. */
|
|
173
|
+
export async function getNode(nodeId) {
|
|
174
|
+
const row = await (await openDb()).prepare('SELECT * FROM node_rows WHERE node_id = ?').get(nodeId);
|
|
175
|
+
if (row === undefined)
|
|
176
|
+
return null;
|
|
177
|
+
return await metaFrom(row);
|
|
178
|
+
}
|
|
179
|
+
/** The canonical node records for `nodeIds` in the order given, read with their worktrees in one query. Unknown ids are skipped. */
|
|
180
|
+
export async function getNodes(nodeIds) {
|
|
181
|
+
if (nodeIds.length === 0)
|
|
182
|
+
return [];
|
|
183
|
+
const worktreeProjection = WORKTREE_COLUMNS.map((column) => `w.${column} AS worktree_${column}`).join(', ');
|
|
184
|
+
const rows = await (await openDb())
|
|
185
|
+
.prepareUncached(`SELECT n.*, ${worktreeProjection} FROM node_rows n LEFT JOIN worktrees w ON w.node_id = n.node_id WHERE n.node_id IN (${nodeIds.map(() => '?').join(',')})`)
|
|
186
|
+
.all(...nodeIds);
|
|
187
|
+
const byId = new Map(rows.map((row) => [row['node_id'], row]));
|
|
188
|
+
return await mapAsync(nodeIds.map((id) => byId.get(id)).filter((row) => row !== undefined), async (row) => await metaFrom(row, worktreeFromProjection(row)));
|
|
189
|
+
}
|
|
190
|
+
const CREATE_REQUEST_TTL_MS = 24 * 60 * 60 * 1000;
|
|
191
|
+
function createRequestRecord(row) {
|
|
192
|
+
return { requestKey: row.request_key, nodeId: row.node_id, state: row.state };
|
|
193
|
+
}
|
|
194
|
+
export async function findCreateRequest(requestKey) {
|
|
195
|
+
const existing = await (await openDb()).prepareUncached('SELECT request_key, node_id, state FROM create_requests WHERE request_key = ?').get(requestKey);
|
|
196
|
+
return existing === undefined ? null : createRequestRecord(existing);
|
|
197
|
+
}
|
|
198
|
+
/** Reserve an idempotency key before creation. A null node id means the request
|
|
199
|
+
* has not yet selected a cold-birth identity or claimed a warm spare. */
|
|
200
|
+
export async function reserveCreateRequest(requestKey) {
|
|
201
|
+
return await withCanvasWrite(async (db) => {
|
|
202
|
+
const now = Date.now();
|
|
203
|
+
await db.prepareUncached('DELETE FROM create_requests WHERE expires_at <= ?').run(now);
|
|
204
|
+
// One atomic claim: a concurrent reservation of the same key (another process) waits on the first insert, does nothing,
|
|
205
|
+
// and then reads the row that won.
|
|
206
|
+
await db.prepareUncached("INSERT INTO create_requests (request_key, node_id, expires_at, state) VALUES (?, NULL, ?, 'reserved') ON CONFLICT (request_key) DO NOTHING")
|
|
207
|
+
.run(requestKey, now + CREATE_REQUEST_TTL_MS);
|
|
208
|
+
const winner = await db.prepareUncached('SELECT request_key, node_id, state FROM create_requests WHERE request_key = ?').get(requestKey);
|
|
209
|
+
return createRequestRecord(winner);
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
/** Delete keys past their recovery window; returns how many were removed. */
|
|
213
|
+
export async function pruneExpiredCreateRequests(now = Date.now()) {
|
|
214
|
+
return Number((await (await openDb()).prepareUncached('DELETE FROM create_requests WHERE expires_at <= ?').run(now)).changes);
|
|
215
|
+
}
|
|
216
|
+
/** Bind a reserved key to the node it created (state `complete`). The mapping is
|
|
217
|
+
* durable so a retry after a daemon handover returns the original node. */
|
|
218
|
+
export async function recordCreateRequestNode(requestKey, nodeId) {
|
|
219
|
+
await (await openDb()).prepareUncached("UPDATE create_requests SET node_id = ?, state = 'complete' WHERE request_key = ?").run(nodeId, requestKey);
|
|
220
|
+
}
|
|
221
|
+
/** Reserve a cold-birth node id for a key (state stays `reserved`) so a retry
|
|
222
|
+
* after a daemon restart resumes the same identity instead of minting another.
|
|
223
|
+
* Only the first caller binds: two API processes holding one unbound key race
|
|
224
|
+
* here, and each gets back the id the key actually names. */
|
|
225
|
+
export async function reserveCreateRequestNode(requestKey, nodeId) {
|
|
226
|
+
const db = await openDb();
|
|
227
|
+
await db.prepareUncached("UPDATE create_requests SET node_id = ?, state = 'reserved' WHERE request_key = ? AND node_id IS NULL").run(nodeId, requestKey);
|
|
228
|
+
const bound = await db.prepareUncached('SELECT node_id FROM create_requests WHERE request_key = ?').get(requestKey);
|
|
229
|
+
return bound?.node_id ?? null;
|
|
230
|
+
}
|
|
231
|
+
export async function completeCreateRequest(requestKey, nodeId) {
|
|
232
|
+
await (await openDb()).prepareUncached("UPDATE create_requests SET state = 'complete' WHERE request_key = ? AND node_id = ?").run(requestKey, nodeId);
|
|
233
|
+
}
|
|
234
|
+
/** Forget an unserved reservation after a pre-birth failure. A record that
|
|
235
|
+
* names a durable node is never removed by this path. */
|
|
236
|
+
export async function abandonCreateRequest(requestKey, nodeId) {
|
|
237
|
+
await withCanvasWrite(async (db) => {
|
|
238
|
+
if (nodeId === null) {
|
|
239
|
+
await db.prepareUncached('DELETE FROM create_requests WHERE request_key = ? AND node_id IS NULL').run(requestKey);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
await db.prepareUncached('DELETE FROM create_requests WHERE request_key = ? AND node_id = ?').run(requestKey, nodeId);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
export function canonicalSessionFile(sessionFile) {
|
|
246
|
+
return resolve(sessionFile);
|
|
247
|
+
}
|
|
248
|
+
/** Resolve the crouter node that owns one exact Pi session file. */
|
|
249
|
+
export async function findNodeBySessionFile(sessionFile) {
|
|
250
|
+
const nodeId = await findNodeBySessionFileSql(sessionFile);
|
|
251
|
+
return nodeId === null ? null : await getNode(nodeId);
|
|
252
|
+
}
|
|
253
|
+
/** The indexed row (from the db) — cheap for queries that don't need full meta. */
|
|
254
|
+
export async function getRow(nodeId) {
|
|
255
|
+
const r = await (await openDb()).prepare('SELECT * FROM node_rows WHERE node_id = ?').get(nodeId);
|
|
256
|
+
return r ? rowFrom(r) : null;
|
|
257
|
+
}
|
|
258
|
+
/** The node row whose durable LOCATION pane is `pane`, or null. Lets placement
|
|
259
|
+
* resolve "who sits in this pane" by the first-class `%pane_id` handle (e.g.
|
|
260
|
+
* to adopt a caller's pane as a focus). pane is not UNIQUE in the schema, but a
|
|
261
|
+
* live pane backs at most one node, so this returns the single match. */
|
|
262
|
+
export async function getRowByPane(pane) {
|
|
263
|
+
const r = await (await openDb()).prepare('SELECT * FROM node_rows WHERE pane = ?').get(pane);
|
|
264
|
+
return r ? rowFrom(r) : null;
|
|
265
|
+
}
|
|
266
|
+
/** Nodes whose persisted spawn deadline has elapsed and that remain live work. */
|
|
267
|
+
export async function dueNodeDeadlines(nowIso) {
|
|
268
|
+
return (await (await openDb()).prepare(`SELECT * FROM node_rows
|
|
269
|
+
WHERE deadline_at IS NOT NULL AND outcome_at IS NULL
|
|
270
|
+
AND deadline_at <= ? AND status IN ('active','idle') AND kind != 'human'
|
|
271
|
+
ORDER BY deadline_at, created, node_id`).all(nowIso)).map(rowFrom);
|
|
272
|
+
}
|
|
273
|
+
/** Write a claimed warm spare's deadline before it is handed to its caller. */
|
|
274
|
+
export async function setNodeDeadline(nodeId, deadlineAt) {
|
|
275
|
+
return Number((await (await openDb()).prepare('UPDATE nodes SET deadline_at = ? WHERE node_id = ?').run(deadlineAt, nodeId)).changes) === 1;
|
|
276
|
+
}
|
|
277
|
+
/** Shift active/idle profile deadlines by a completed profile pause duration. */
|
|
278
|
+
export async function shiftProfileNodeDeadlines(profileId, pauseDurationMs) {
|
|
279
|
+
if (!Number.isFinite(pauseDurationMs) || pauseDurationMs <= 0)
|
|
280
|
+
return 0;
|
|
281
|
+
return await withCanvasWrite(async (db) => {
|
|
282
|
+
const rows = await db.prepare(`SELECT node_id, deadline_at FROM nodes
|
|
283
|
+
WHERE profile_id = ? AND deadline_at IS NOT NULL AND status IN ('active', 'idle')`).all(profileId);
|
|
284
|
+
const update = db.prepare('UPDATE nodes SET deadline_at = ? WHERE node_id = ? AND deadline_at = ?');
|
|
285
|
+
let shifted = 0;
|
|
286
|
+
for (const row of rows) {
|
|
287
|
+
const at = Date.parse(row.deadline_at);
|
|
288
|
+
if (Number.isNaN(at))
|
|
289
|
+
continue;
|
|
290
|
+
shifted += Number((await update.run(new Date(at + pauseDurationMs).toISOString(), row.node_id, row.deadline_at)).changes);
|
|
291
|
+
}
|
|
292
|
+
return shifted;
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
function sqlInput(value, field) {
|
|
296
|
+
if (value === null || value === undefined)
|
|
297
|
+
return null;
|
|
298
|
+
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint' || value instanceof Uint8Array)
|
|
299
|
+
return value;
|
|
300
|
+
throw new TypeError(`${field} must be a SQLite scalar`);
|
|
301
|
+
}
|
|
302
|
+
/** Update node identity/configuration columns. Sessions and worktrees have named stores. */
|
|
303
|
+
export async function updateNode(nodeId, patch) {
|
|
304
|
+
const fields = [];
|
|
305
|
+
const add = (key, column = key) => {
|
|
306
|
+
if (Object.prototype.hasOwnProperty.call(patch, key))
|
|
307
|
+
fields.push([column, sqlInput(patch[key], key)]);
|
|
308
|
+
};
|
|
309
|
+
add('description');
|
|
310
|
+
add('title');
|
|
311
|
+
add('icon');
|
|
312
|
+
add('cycles');
|
|
313
|
+
add('mode');
|
|
314
|
+
add('lifecycle');
|
|
315
|
+
add('cwd');
|
|
316
|
+
add('host_kind');
|
|
317
|
+
add('profile_id');
|
|
318
|
+
add('parent');
|
|
319
|
+
add('spawned_by');
|
|
320
|
+
add('creator');
|
|
321
|
+
add('fork_from');
|
|
322
|
+
add('fork_source_file');
|
|
323
|
+
add('model_override');
|
|
324
|
+
if (Object.prototype.hasOwnProperty.call(patch, 'passive_default'))
|
|
325
|
+
fields.push(['passive_default', patch.passive_default === true ? 1 : 0]);
|
|
326
|
+
if (Object.prototype.hasOwnProperty.call(patch, 'cycle_pending'))
|
|
327
|
+
fields.push(['cycle_pending', patch.cycle_pending === true ? 1 : 0]);
|
|
328
|
+
if (Object.prototype.hasOwnProperty.call(patch, 'persona_ack'))
|
|
329
|
+
fields.push(['persona_ack_json', jsonValue(patch.persona_ack, 'persona_ack')]);
|
|
330
|
+
if (Object.prototype.hasOwnProperty.call(patch, 'review_binding'))
|
|
331
|
+
fields.push(['review_binding_json', jsonValue(patch.review_binding, 'review_binding')]);
|
|
332
|
+
// Isolation is fixed at birth; updateNode must never weaken it.
|
|
333
|
+
if (Object.prototype.hasOwnProperty.call(patch, 'isolated'))
|
|
334
|
+
throw new TypeError('isolated cannot change after node creation');
|
|
335
|
+
if (Object.prototype.hasOwnProperty.call(patch, 'scopes'))
|
|
336
|
+
fields.push(['scopes_json', jsonValue(patch.scopes, 'scopes')]);
|
|
337
|
+
if (Object.prototype.hasOwnProperty.call(patch, 'launch'))
|
|
338
|
+
fields.push(['launch_config_json', jsonValue(patch.launch, 'launch')]);
|
|
339
|
+
const has = (key) => Object.prototype.hasOwnProperty.call(patch, key);
|
|
340
|
+
await withCanvasWrite(async (db) => {
|
|
341
|
+
const object = await getById(db, nodeId);
|
|
342
|
+
if (object === null || object.type !== 'node')
|
|
343
|
+
throw new Error(`unknown node: ${nodeId}`);
|
|
344
|
+
if (has('name'))
|
|
345
|
+
await setObjectName(db, object, sqlInput(patch.name, 'name'));
|
|
346
|
+
if (has('kind'))
|
|
347
|
+
await setObjectKind(db, object, sqlInput(patch.kind, 'kind'));
|
|
348
|
+
if (fields.length === 0)
|
|
349
|
+
return;
|
|
350
|
+
// A profile change moves the node under the new profile's object, or back under its app when it has none.
|
|
351
|
+
if (has('profile_id')) {
|
|
352
|
+
const app = await db.prepare('SELECT app FROM nodes WHERE node_id = ?').get(nodeId);
|
|
353
|
+
const appObject = app?.app ? await getById(db, app.app) : null;
|
|
354
|
+
if (appObject) {
|
|
355
|
+
const profile = patch.profile_id ? await profileObjectFor(db, patch.profile_id, appObject) : null;
|
|
356
|
+
await db.prepare('UPDATE objects SET owner = ? WHERE id = ?').run((profile ?? appObject).id, nodeId);
|
|
357
|
+
const sub = (await db.prepare('SELECT sub FROM nodes WHERE node_id = ?').get(nodeId)).sub;
|
|
358
|
+
if (profile === null && sub)
|
|
359
|
+
await writeActsFor(db, nodeId, sub);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
const result = await db.prepareUncached(`UPDATE nodes SET ${fields.map(([column]) => `${column} = ?`).join(', ')} WHERE node_id = ?`).run(...fields.map(([, value]) => value), nodeId);
|
|
363
|
+
if (result.changes !== 1)
|
|
364
|
+
throw new Error(`unknown node: ${nodeId}`);
|
|
365
|
+
});
|
|
366
|
+
return await getNode(nodeId);
|
|
367
|
+
}
|
|
368
|
+
// Atomic runtime setters — each one a single-statement UPDATE on the WAL'd row,
|
|
369
|
+
// the authoritative store for live state. No read-modify-write, so concurrent
|
|
370
|
+
// writers of DIFFERENT fields (the daemon stamping pi_pid while a node flips
|
|
371
|
+
// status) can never clobber each other: WAL serializes the two statements.
|
|
372
|
+
// `"window"` is quoted defensively — it is a SQLite keyword.
|
|
373
|
+
/** Set a node's status. Atomic single-column write. */
|
|
374
|
+
export async function setStatus(nodeId, status) {
|
|
375
|
+
await (await openDb()).prepare('UPDATE nodes SET status = ? WHERE node_id = ?').run(status, nodeId);
|
|
376
|
+
}
|
|
377
|
+
/** Set a node's exit intent. Atomic single-column write. */
|
|
378
|
+
export async function setIntent(nodeId, intent) {
|
|
379
|
+
await (await openDb()).prepare('UPDATE nodes SET intent = ? WHERE node_id = ?').run(intent ?? null, nodeId);
|
|
380
|
+
}
|
|
381
|
+
/** Atomically write status and/or intent, gated on an optional from-status set
|
|
382
|
+
* and/or on the row carrying no committed final_report. The lifecycle state
|
|
383
|
+
* machine (runtime/lifecycle.ts) is the one caller: it owns the legality
|
|
384
|
+
* table and the unknown-node/illegal-move/already-finalized-cancel branching,
|
|
385
|
+
* this only performs the single conditional UPDATE it needs. A PRESENT key in
|
|
386
|
+
* `fields` (even `intent: null`) writes that column; an ABSENT key leaves it
|
|
387
|
+
* unchanged. Returns the row-changed count so the caller can distinguish "no
|
|
388
|
+
* such node", "gate failed", and "already applied" without a second query. */
|
|
389
|
+
export async function transitionStatusIntent(nodeId, fields, opts = {}) {
|
|
390
|
+
// Keep the ordinary lifecycle write exactly as its pre-outcome form: one
|
|
391
|
+
// conditional UPDATE and no transaction boundary.
|
|
392
|
+
if (opts.outcome === undefined) {
|
|
393
|
+
const assignments = [];
|
|
394
|
+
const values = [];
|
|
395
|
+
if (Object.prototype.hasOwnProperty.call(fields, 'status')) {
|
|
396
|
+
assignments.push('status = ?');
|
|
397
|
+
values.push(fields.status ?? null);
|
|
398
|
+
}
|
|
399
|
+
if (Object.prototype.hasOwnProperty.call(fields, 'intent')) {
|
|
400
|
+
assignments.push('intent = ?');
|
|
401
|
+
values.push(fields.intent ?? null);
|
|
402
|
+
}
|
|
403
|
+
if (Object.prototype.hasOwnProperty.call(fields, 'terminal_reason')) {
|
|
404
|
+
assignments.push('terminal_reason = ?');
|
|
405
|
+
values.push(fields.terminal_reason ?? null);
|
|
406
|
+
}
|
|
407
|
+
const predicates = ['node_id = ?'];
|
|
408
|
+
values.push(nodeId);
|
|
409
|
+
if (opts.fromStatuses !== undefined) {
|
|
410
|
+
predicates.push(`status IN (${opts.fromStatuses.map(() => '?').join(', ')})`);
|
|
411
|
+
values.push(...opts.fromStatuses);
|
|
412
|
+
}
|
|
413
|
+
if (opts.requireNoFinalReport === true)
|
|
414
|
+
predicates.push('final_report IS NULL');
|
|
415
|
+
const result = await (await openDb())
|
|
416
|
+
.prepareUncached(`UPDATE nodes SET ${assignments.join(', ')} WHERE ${predicates.join(' AND ')}`)
|
|
417
|
+
.run(...values);
|
|
418
|
+
return Number(result.changes);
|
|
419
|
+
}
|
|
420
|
+
const outcome = opts.outcome;
|
|
421
|
+
return await withCanvasWrite(async (db) => {
|
|
422
|
+
const assignments = [];
|
|
423
|
+
const values = [];
|
|
424
|
+
if (Object.prototype.hasOwnProperty.call(fields, 'status')) {
|
|
425
|
+
assignments.push('status = ?');
|
|
426
|
+
values.push(fields.status ?? null);
|
|
427
|
+
}
|
|
428
|
+
if (Object.prototype.hasOwnProperty.call(fields, 'intent')) {
|
|
429
|
+
assignments.push('intent = ?');
|
|
430
|
+
values.push(fields.intent ?? null);
|
|
431
|
+
}
|
|
432
|
+
if (Object.prototype.hasOwnProperty.call(fields, 'terminal_reason')) {
|
|
433
|
+
assignments.push('terminal_reason = ?');
|
|
434
|
+
values.push(fields.terminal_reason ?? null);
|
|
435
|
+
}
|
|
436
|
+
const outcomeValue = (value, column) => outcome.supersede === true ? '?' : `CASE WHEN outcome_at IS NULL THEN ? ELSE ${column} END`;
|
|
437
|
+
assignments.push(`outcome_kind = ${outcomeValue(outcome.kind, 'outcome_kind')}`, `outcome_reason = ${outcomeValue(outcome.reason, 'outcome_reason')}`, `outcome_detail_json = ${outcomeValue(outcome.detailJson, 'outcome_detail_json')}`, `outcome_revision = ${outcome.supersede === true ? 'outcome_revision + 1' : 'CASE WHEN outcome_at IS NULL THEN outcome_revision + 1 ELSE outcome_revision END'}`, `outcome_at = ${outcomeValue(outcome.at, 'outcome_at')}`);
|
|
438
|
+
values.push(outcome.kind, outcome.reason, outcome.detailJson, outcome.at);
|
|
439
|
+
const predicates = ['node_id = ?'];
|
|
440
|
+
values.push(nodeId);
|
|
441
|
+
if (opts.fromStatuses !== undefined) {
|
|
442
|
+
predicates.push(`status IN (${opts.fromStatuses.map(() => '?').join(', ')})`);
|
|
443
|
+
values.push(...opts.fromStatuses);
|
|
444
|
+
}
|
|
445
|
+
if (opts.requireNoFinalReport === true)
|
|
446
|
+
predicates.push('final_report IS NULL');
|
|
447
|
+
const result = await db.prepareUncached(`UPDATE nodes SET ${assignments.join(', ')} WHERE ${predicates.join(' AND ')}`).run(...values);
|
|
448
|
+
if (Number(result.changes) === 0)
|
|
449
|
+
return 0;
|
|
450
|
+
const latched = await db.prepare('SELECT outcome_at FROM nodes WHERE node_id = ?').get(nodeId);
|
|
451
|
+
if ((outcome.supersede === true || latched.outcome_at === outcome.at) && outcome.documentJson !== null && outcome.documentJson !== undefined) {
|
|
452
|
+
await publish(db, { event: 'outcome', object: await nodeObject(db, nodeId), actor: null,
|
|
453
|
+
attrs: { revision: Number((await db.prepare('SELECT outcome_revision FROM nodes WHERE node_id = ?').get(nodeId)).outcome_revision) },
|
|
454
|
+
messageBody: JSON.parse(outcome.documentJson) });
|
|
455
|
+
}
|
|
456
|
+
return Number(result.changes);
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
/** Read a node's committed-final latch pointer. Pure read, no side effect. */
|
|
460
|
+
export async function getFinalReport(nodeId) {
|
|
461
|
+
const row = await (await openDb()).prepare('SELECT final_report FROM nodes WHERE node_id = ?').get(nodeId);
|
|
462
|
+
return row?.final_report ?? null;
|
|
463
|
+
}
|
|
464
|
+
/** CAS-clear a node's finalization latch (final_report + finalized_at) —
|
|
465
|
+
* retract-pointer-only. Gated on the exact final_report value the caller
|
|
466
|
+
* observed via getFinalReport, so a concurrent clear/refinalize can never be
|
|
467
|
+
* clobbered. Returns true iff the CAS matched and cleared. */
|
|
468
|
+
export async function clearFinalReportIfMatches(nodeId, expectedFinalReport) {
|
|
469
|
+
const result = await (await openDb()).prepare('UPDATE nodes SET final_report = NULL, finalized_at = NULL WHERE node_id = ? AND final_report = ?')
|
|
470
|
+
.run(nodeId, expectedFinalReport);
|
|
471
|
+
return result.changes > 0;
|
|
472
|
+
}
|
|
473
|
+
/** Set a node's tmux presence in one atomic write: the durable LOCATION anchor
|
|
474
|
+
* `pane` (the `%pane_id`) plus its derived cache (`tmux_session` + `window`).
|
|
475
|
+
* All three move together — `pane` joins the others inside the single UPDATE so
|
|
476
|
+
* a move never half-writes the location. `pane` is optional: a caller that does
|
|
477
|
+
* not yet track it (every caller, until the placement layer lands) writes null,
|
|
478
|
+
* which is harmless because nothing reads `pane` yet. */
|
|
479
|
+
export async function setPresence(nodeId, presence) {
|
|
480
|
+
await (await openDb()).prepare('UPDATE nodes SET tmux_session = ?, "window" = ?, pane = ? WHERE node_id = ?')
|
|
481
|
+
.run(presence.tmux_session ?? null, presence.window ?? null, presence.pane ?? null, nodeId);
|
|
482
|
+
}
|
|
483
|
+
export async function recordLaunch(nodeId, at) {
|
|
484
|
+
await (await openDb()).prepare('UPDATE nodes SET launched_at = ?, frozen_at = NULL, respawn_not_before = NULL WHERE node_id = ?')
|
|
485
|
+
.run(at, nodeId);
|
|
486
|
+
}
|
|
487
|
+
export async function recordSettledTurn(nodeId, at) {
|
|
488
|
+
await (await openDb()).prepare('UPDATE nodes SET last_settled_at = ? WHERE node_id = ?').run(at, nodeId);
|
|
489
|
+
}
|
|
490
|
+
export async function setFrozen(nodeId, at) {
|
|
491
|
+
await (await openDb()).prepare('UPDATE nodes SET frozen_at = ? WHERE node_id = ?').run(at, nodeId);
|
|
492
|
+
}
|
|
493
|
+
export async function clearFrozen(nodeId) {
|
|
494
|
+
await (await openDb()).prepare('UPDATE nodes SET frozen_at = NULL WHERE node_id = ?').run(nodeId);
|
|
495
|
+
}
|
|
496
|
+
export async function recordRespawnAttempt(nodeId, attempt) {
|
|
497
|
+
await (await openDb()).prepare('UPDATE nodes SET respawn_failures = ?, respawn_not_before = ? WHERE node_id = ?')
|
|
498
|
+
.run(attempt.failures, attempt.notBefore, nodeId);
|
|
499
|
+
}
|
|
500
|
+
/** The one clause that hides unclaimed warm-pool spares from every listing.
|
|
501
|
+
* A spare is a real node with a booted broker, but nobody has been handed it
|
|
502
|
+
* yet — surfacing it would put a phantom empty conversation in the user's
|
|
503
|
+
* sidebar. Claiming deletes the marker, which is what makes the node visible. */
|
|
504
|
+
const NOT_A_SPARE = 'node_id NOT IN (SELECT node_id FROM warm_pool)';
|
|
505
|
+
/** Every hydrated node whose durable profile identity equals `profileId`.
|
|
506
|
+
* Unlike `listNodes`, this includes unclaimed warm-pool spares: profile
|
|
507
|
+
* deletion owns every matching row, whether or not it is user-visible. */
|
|
508
|
+
const WORKTREE_COLUMNS = [
|
|
509
|
+
'state', 'cleanup_state', 'path', 'branch', 'repo_root', 'base_ref', 'base_sha', 'created_at', 'closed_at',
|
|
510
|
+
'next_attempt_at', 'attempts', 'quarantined', 'sweep_reason', 'sweep_detail', 'sweep_last_at', 'sweep_observed_json',
|
|
511
|
+
'abandoned_json', 'land_intent_json', 'disposal_json',
|
|
512
|
+
];
|
|
513
|
+
function worktreeFromProjection(r) {
|
|
514
|
+
if (r['worktree_state'] === null)
|
|
515
|
+
return null;
|
|
516
|
+
return worktreeFromRow(Object.fromEntries(WORKTREE_COLUMNS.map((column) => [column, r[`worktree_${column}`]])));
|
|
517
|
+
}
|
|
518
|
+
export async function listNodesByProfile(profileId) {
|
|
519
|
+
const worktreeProjection = WORKTREE_COLUMNS.map((column) => `w.${column} AS worktree_${column}`).join(', ');
|
|
520
|
+
const rows = await (await openDb())
|
|
521
|
+
.prepareUncached(`SELECT n.*, ${worktreeProjection} FROM node_rows n LEFT JOIN worktrees w ON w.node_id = n.node_id WHERE n.profile_id = ? ORDER BY n.created`)
|
|
522
|
+
.all(profileId);
|
|
523
|
+
return (await mapAsync(rows, async (row) => await metaFrom(row, worktreeFromProjection(row))));
|
|
524
|
+
}
|
|
525
|
+
/** Browse's first frame: select only fields its rows/tree use. Keep the fault and
|
|
526
|
+
* turn columns for rowFrom's live fault/streaming semantics, but never hydrate
|
|
527
|
+
* outcomes, placement, metadata or the (often large) telemetry activity text. */
|
|
528
|
+
export async function browseNodes() {
|
|
529
|
+
const db = await openDb();
|
|
530
|
+
const rows = await db.prepare(`SELECT
|
|
531
|
+
node_id, name, description, kind, mode, lifecycle, status, cwd, profile_id,
|
|
532
|
+
grantee, parent, created, frozen_at, terminal_reason, final_report,
|
|
533
|
+
telemetry_tokens_in, telemetry_updated_at, pi_pid, turn_open_at, turn_closed_at,
|
|
534
|
+
fault_id, fault_link, fault_op, fault_kind, fault_message, fault_since,
|
|
535
|
+
fault_operation_id, fault_anchor_entry_id, fault_retry_disposition,
|
|
536
|
+
fault_retry_by, fault_retry_attempt, fault_retry_max, fault_retry_next_at,
|
|
537
|
+
fault_provider_error_json
|
|
538
|
+
FROM node_rows WHERE ${NOT_A_SPARE} ORDER BY created`).all();
|
|
539
|
+
return rows.map(rowFrom);
|
|
540
|
+
}
|
|
541
|
+
/** All rows, optionally filtered by status and terminal execution traces. Unclaimed warm spares are excluded. */
|
|
542
|
+
export async function updateNodeTelemetry(nodeId, telemetry) {
|
|
543
|
+
await (await openDb()).prepare(`UPDATE nodes
|
|
544
|
+
SET telemetry_tokens_in = ?,
|
|
545
|
+
telemetry_context_tokens = COALESCE(?, telemetry_context_tokens),
|
|
546
|
+
telemetry_last_activity = COALESCE(?, telemetry_last_activity),
|
|
547
|
+
telemetry_updated_at = ?
|
|
548
|
+
WHERE node_id = ?
|
|
549
|
+
AND (telemetry_updated_at IS NULL OR telemetry_updated_at < ?)`).run(telemetry.tokensIn, telemetry.contextTokens, telemetry.lastActivity, telemetry.updatedAt, nodeId, telemetry.updatedAt);
|
|
550
|
+
}
|
|
551
|
+
/** Stored fields the attach graph displays, plus the two live execution cues it
|
|
552
|
+
* needs. This keeps the interactive graph off the full node-summary projection
|
|
553
|
+
* and its unused runtime, outcome, and placement fields. */
|
|
554
|
+
export async function graphNodes() {
|
|
555
|
+
const rows = await (await openDb()).prepare(`SELECT
|
|
556
|
+
node_id, name, description, cycles, kind, status, frozen_at,
|
|
557
|
+
telemetry_context_tokens, telemetry_last_activity,
|
|
558
|
+
pi_pid, turn_open_at, turn_closed_at,
|
|
559
|
+
fault_id, fault_link, fault_op, fault_kind, fault_message, fault_since,
|
|
560
|
+
fault_operation_id, fault_anchor_entry_id, fault_retry_disposition,
|
|
561
|
+
fault_retry_by, fault_retry_attempt, fault_retry_max, fault_retry_next_at,
|
|
562
|
+
fault_provider_error_json
|
|
563
|
+
FROM node_rows WHERE ${NOT_A_SPARE} ORDER BY created`).all();
|
|
564
|
+
return rows.map((row) => {
|
|
565
|
+
const pid = row['pi_pid'] ?? null;
|
|
566
|
+
const pidAlive = isPidPresent(pid);
|
|
567
|
+
const fault = faultFrom(row);
|
|
568
|
+
return {
|
|
569
|
+
node_id: row['node_id'],
|
|
570
|
+
name: row['name'],
|
|
571
|
+
description: row['description'] ?? null,
|
|
572
|
+
cycles: row['cycles'] ?? null,
|
|
573
|
+
kind: row['kind'],
|
|
574
|
+
status: row['status'],
|
|
575
|
+
frozen_at: row['frozen_at'] ?? null,
|
|
576
|
+
pi_pid: pid,
|
|
577
|
+
telemetry_context_tokens: row['telemetry_context_tokens'] ?? null,
|
|
578
|
+
telemetry_last_activity: row['telemetry_last_activity'] ?? null,
|
|
579
|
+
fault: fault?.link === 'pi→provider' && fault.retry.by === 'daemon' && fault.retry.disposition === 'auto' && !pidAlive
|
|
580
|
+
? null
|
|
581
|
+
: fault,
|
|
582
|
+
streaming: row['turn_open_at'] !== null && row['turn_closed_at'] === null && pidAlive,
|
|
583
|
+
};
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
export async function listNodes(filter) {
|
|
587
|
+
const clauses = [NOT_A_SPARE];
|
|
588
|
+
const params = [];
|
|
589
|
+
if (filter?.under !== undefined) {
|
|
590
|
+
if (filter.underInclusive === true) {
|
|
591
|
+
clauses.push(`(node_id IN (${SUBTREE_ALL_IDS_SQL}) OR node_id = ?)`);
|
|
592
|
+
params.push(filter.under, filter.under, filter.under);
|
|
593
|
+
}
|
|
594
|
+
else {
|
|
595
|
+
clauses.push(`node_id IN (${SUBTREE_IDS_SQL})`);
|
|
596
|
+
params.push(filter.under, filter.under);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
if (filter?.lifecycle !== undefined) {
|
|
600
|
+
clauses.push('lifecycle = ?');
|
|
601
|
+
params.push(filter.lifecycle);
|
|
602
|
+
}
|
|
603
|
+
if (filter?.kind !== undefined) {
|
|
604
|
+
clauses.push('kind = ?');
|
|
605
|
+
params.push(filter.kind);
|
|
606
|
+
}
|
|
607
|
+
if (filter?.mode !== undefined) {
|
|
608
|
+
clauses.push('mode = ?');
|
|
609
|
+
params.push(filter.mode);
|
|
610
|
+
}
|
|
611
|
+
if (filter?.profileId !== undefined) {
|
|
612
|
+
clauses.push('profile_id = ?');
|
|
613
|
+
params.push(filter.profileId);
|
|
614
|
+
}
|
|
615
|
+
if (filter?.profilePrefix !== undefined) {
|
|
616
|
+
clauses.push(`profile_id LIKE ? ESCAPE '\\'`);
|
|
617
|
+
params.push(`${filter.profilePrefix.replace(/[\\%_]/g, (c) => `\\${c}`)}%`);
|
|
618
|
+
}
|
|
619
|
+
if (filter?.parent !== undefined) {
|
|
620
|
+
clauses.push('parent = ?');
|
|
621
|
+
params.push(filter.parent);
|
|
622
|
+
}
|
|
623
|
+
if (filter?.topLevel === true)
|
|
624
|
+
clauses.push('parent IS NULL');
|
|
625
|
+
if (filter?.hanging === true)
|
|
626
|
+
clauses.push('parent IS NOT NULL AND parent NOT IN (SELECT node_id FROM node_rows)');
|
|
627
|
+
if (filter?.status !== undefined) {
|
|
628
|
+
const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
|
|
629
|
+
clauses.push(`status IN (${statuses.map(() => '?').join(',')})`);
|
|
630
|
+
params.push(...statuses);
|
|
631
|
+
}
|
|
632
|
+
if (filter?.withRecordedPid === true)
|
|
633
|
+
clauses.push('pi_pid IS NOT NULL');
|
|
634
|
+
if (filter?.withRecordedPidOrFrozen === true)
|
|
635
|
+
clauses.push('(pi_pid IS NOT NULL OR frozen_at IS NOT NULL)');
|
|
636
|
+
const rows = await (await openDb())
|
|
637
|
+
.prepareUncached(`SELECT * FROM node_rows WHERE ${clauses.join(' AND ')} ORDER BY created`)
|
|
638
|
+
.all(...params);
|
|
639
|
+
return rows.map(rowFrom);
|
|
640
|
+
}
|
|
641
|
+
// idx_nodes_terminal_placement_created (a partial index on placement presence)
|
|
642
|
+
// keeps this from enumerating every terminal row on old-heavy canvases.
|
|
643
|
+
export const terminalPlacementResidueSql = `SELECT
|
|
644
|
+
node_id, created, launched_at, last_settled_at, finalized_at,
|
|
645
|
+
outcome_at, last_activity_at, pane, "window", tmux_session
|
|
646
|
+
FROM nodes
|
|
647
|
+
WHERE ${NOT_A_SPARE}
|
|
648
|
+
AND status IN ('done', 'canceled', 'dead')
|
|
649
|
+
AND (pane IS NOT NULL OR "window" IS NOT NULL OR tmux_session IS NOT NULL)
|
|
650
|
+
ORDER BY created`;
|
|
651
|
+
export async function listTerminalPlacementResidue() {
|
|
652
|
+
return await (await openDb()).prepare(terminalPlacementResidueSql)
|
|
653
|
+
.all();
|
|
654
|
+
}
|
|
655
|
+
/** The daemon's complete supervision set. Live rows participate regardless of
|
|
656
|
+
* PID; terminal rows participate only while they retain a PID or freeze mark. */
|
|
657
|
+
// Materialize and deduplicate IDs first: the view must use node PK lookups,
|
|
658
|
+
// never enumerate its outer historical terminal-status range. The frozen branch
|
|
659
|
+
// matches the partial index idx_nodes_supervision_frozen.
|
|
660
|
+
export const nodesForSupervisionSql = `WITH candidates AS MATERIALIZED (
|
|
661
|
+
SELECT node_id FROM nodes WHERE status IN ('active', 'idle')
|
|
662
|
+
UNION
|
|
663
|
+
SELECT node_id FROM nodes
|
|
664
|
+
WHERE frozen_at IS NOT NULL AND status IN ('done', 'canceled', 'dead')
|
|
665
|
+
UNION
|
|
666
|
+
SELECT node_id FROM executions
|
|
667
|
+
WHERE state != 'exited' AND state = 'running' AND pid IS NOT NULL
|
|
668
|
+
)
|
|
669
|
+
SELECT v.* FROM candidates c CROSS JOIN node_rows v
|
|
670
|
+
WHERE v.node_id = c.node_id
|
|
671
|
+
AND v.node_id NOT IN (SELECT node_id FROM warm_pool)
|
|
672
|
+
AND v.kind != 'human'
|
|
673
|
+
AND (v.status IN ('active', 'idle') OR (v.status IN ('done', 'canceled', 'dead') AND (v.pi_pid IS NOT NULL OR v.frozen_at IS NOT NULL)))
|
|
674
|
+
ORDER BY v.created`;
|
|
675
|
+
export async function listNodesForSupervision() {
|
|
676
|
+
const rows = await (await openDb()).prepare(nodesForSupervisionSql)
|
|
677
|
+
.all();
|
|
678
|
+
return rows.map(rowFrom);
|
|
679
|
+
}
|
|
680
|
+
/** A parked resident the runtime may reopen when wake mail reaches it: `done` +
|
|
681
|
+
* `intent='parked'`, resident, no final latch, and not being deleted. Finalized,
|
|
682
|
+
* canceled, dead, terminal-lifecycle and deleting nodes are never reopened by mail.
|
|
683
|
+
* The SQL form of `isParkedResident` (runtime/lifecycle.ts), which must change with it; `n` is a `nodes` row. */
|
|
684
|
+
export const PARKED_RESIDENT_SQL = (n) => `(${n}.status = 'done' AND ${n}.intent = 'parked' AND ${n}.lifecycle = 'resident' AND ${n}.final_report IS NULL AND ${n}.deleting_at IS NULL)`;
|
|
685
|
+
/** A node the runtime can still bring back to life, so its cwd must keep existing: a live row
|
|
686
|
+
* (`active`/`idle`), a parked resident the lifecycle tick reopens when wake mail arrives
|
|
687
|
+
* (`PARKED_RESIDENT_SQL`), or a terminal row with no final latch that still carries a frozen
|
|
688
|
+
* mark, which the tick thaws (`node-lifecycle/tick.ts` `classifyRow`). `n` is a `nodes` row. */
|
|
689
|
+
export const RESUMABLE_NODE_SQL = (n) => `(${n}.status IN ('active', 'idle') OR ${PARKED_RESIDENT_SQL(n)} OR (${n}.status IN ('done', 'canceled', 'dead') AND ${n}.frozen_at IS NOT NULL AND ${n}.final_report IS NULL))`;
|
|
690
|
+
/** Every resumable node (`RESUMABLE_NODE_SQL`) other than `ownerId`, with the cwd it will run in. */
|
|
691
|
+
export async function resumableNodeCwds(ownerId) {
|
|
692
|
+
return await (await openDb()).prepare(`SELECT node_id, cwd FROM nodes WHERE ${RESUMABLE_NODE_SQL('nodes')} AND node_id != ?`).all(ownerId);
|
|
693
|
+
}
|
|
694
|
+
/** Parked residents with unseen wake mail (`UNSEEN_WAKE_MAIL_SQL`), which nothing else
|
|
695
|
+
* launches: the lifecycle tick reopens them. Each parked resident seeks its own mail
|
|
696
|
+
* through `deliveries_destination`. */
|
|
697
|
+
export async function listParkedResidentsWithWakeMail() {
|
|
698
|
+
const rows = await (await openDb()).prepare(`SELECT v.* FROM node_rows v
|
|
699
|
+
WHERE ${PARKED_RESIDENT_SQL('v')}
|
|
700
|
+
AND EXISTS (SELECT 1 FROM deliveries d WHERE d.destination_id = v.node_id AND ${UNSEEN_WAKE_MAIL_SQL('d')}) AND v.kind != 'human' AND v.node_id NOT IN (SELECT node_id FROM warm_pool)
|
|
701
|
+
ORDER BY v.created`).all();
|
|
702
|
+
return rows.map(rowFrom);
|
|
703
|
+
}
|
|
704
|
+
// Warm pool — spare booted roots awaiting a `prefer_warm` claim (see
|
|
705
|
+
// `runtime/warm-pool.ts` for the recipe key and the mint/refill policy).
|
|
706
|
+
/** Mark an already-spawned node as an unclaimed spare for `recipeKey`. Hides it
|
|
707
|
+
* from every listing until it is claimed. */
|
|
708
|
+
export async function registerWarmSpare(nodeId, recipeKey) {
|
|
709
|
+
await (await openDb()).prepare('INSERT INTO warm_pool (node_id, recipe_key, created) VALUES (?, ?, ?) ON CONFLICT (node_id) DO UPDATE SET recipe_key = excluded.recipe_key, created = excluded.created')
|
|
710
|
+
.run(nodeId, recipeKey, new Date().toISOString());
|
|
711
|
+
}
|
|
712
|
+
/** Take a parked spare OUT of the pool without claiming it — the reaper's
|
|
713
|
+
* first move. Returns false when the marker was already gone (a concurrent
|
|
714
|
+
* claim won it), which is the reaper's signal to leave that node alone: it is
|
|
715
|
+
* somebody's live conversation now, not a spare. Deleting the marker under the
|
|
716
|
+
* write lock is exactly what `claimWarmSpare` does, so the two can never both
|
|
717
|
+
* succeed on the same node. */
|
|
718
|
+
export async function unregisterWarmSpare(nodeId) {
|
|
719
|
+
return (await (await openDb()).prepare('DELETE FROM warm_pool WHERE node_id = ?').run(nodeId)).changes > 0;
|
|
720
|
+
}
|
|
721
|
+
async function warmSpareRowsFor(db, recipeKey) {
|
|
722
|
+
const sql = `SELECT w.node_id AS node_id, w.recipe_key AS recipe_key, w.created AS created,
|
|
723
|
+
n.status AS status, n.pi_pid AS pi_pid, n.pi_pid_identity AS pi_pid_identity
|
|
724
|
+
FROM warm_pool w JOIN node_rows n ON n.node_id = w.node_id` +
|
|
725
|
+
(recipeKey === undefined ? '' : ' WHERE w.recipe_key = ?') +
|
|
726
|
+
' ORDER BY w.created';
|
|
727
|
+
const rows = (recipeKey === undefined ? await db.prepareUncached(sql).all() : await db.prepareUncached(sql).all(recipeKey));
|
|
728
|
+
return rows.map((r) => ({
|
|
729
|
+
node_id: r['node_id'],
|
|
730
|
+
recipe_key: r['recipe_key'],
|
|
731
|
+
created: r['created'],
|
|
732
|
+
status: r['status'],
|
|
733
|
+
pi_pid: r['pi_pid'] ?? null,
|
|
734
|
+
pi_pid_identity: r['pi_pid_identity'] ?? null,
|
|
735
|
+
}));
|
|
736
|
+
}
|
|
737
|
+
/** Every parked spare, oldest first — what the reaper (`runtime/warm-pool.ts`
|
|
738
|
+
* `reapStaleSpares`) sweeps. Deliberately NOT filtered by liveness: judging a
|
|
739
|
+
* spare is the caller's job. */
|
|
740
|
+
export async function listWarmSpares() {
|
|
741
|
+
return await warmSpareRowsFor(await openDb());
|
|
742
|
+
}
|
|
743
|
+
/** True while `nodeId` is an UNCLAIMED spare — nobody owns this conversation
|
|
744
|
+
* yet. `registerWarmSpare` runs the instant the row exists and BEFORE the
|
|
745
|
+
* broker launch, and a claim deletes the marker atomically, so this is a
|
|
746
|
+
* reliable read from inside the booting engine (the context-intro extension
|
|
747
|
+
* asks it at `session_start` to withhold bearings that would otherwise assert
|
|
748
|
+
* the spare's placeholder persona instead of its eventual claimant's). */
|
|
749
|
+
export async function isWarmSpare(nodeId) {
|
|
750
|
+
const row = await (await openDb()).prepare('SELECT 1 FROM warm_pool WHERE node_id = ?').get(nodeId);
|
|
751
|
+
return row !== undefined;
|
|
752
|
+
}
|
|
753
|
+
/** A spare is claimable only when its broker is CONFIRMED alive. Status alone
|
|
754
|
+
* is not enough: a broker torn down by a daemon handover leaves the row at
|
|
755
|
+
* `active`/`idle` with a dead pid, and handing that out would answer a create
|
|
756
|
+
* with a node that has no engine behind it. The probe is identity-aware, so a
|
|
757
|
+
* recycled pid never reads as alive; `indeterminate` (probe failed) is treated
|
|
758
|
+
* as not-claimable — a cold spawn is cheap, a broken node is not. */
|
|
759
|
+
function spareIsClaimable(row) {
|
|
760
|
+
if (row.status !== 'active' && row.status !== 'idle')
|
|
761
|
+
return false;
|
|
762
|
+
return recordedPidLiveness(row.pi_pid, row.pi_pid_identity) === 'alive';
|
|
763
|
+
}
|
|
764
|
+
/** Hand out the oldest CLAIMABLE spare matching `recipeKey`, or null when the
|
|
765
|
+
* pool has none. The select+delete run inside ONE canvas write-lock
|
|
766
|
+
* transaction, so two concurrent creates can never be handed the same spare.
|
|
767
|
+
* A spare whose broker is gone is skipped here and reaped by
|
|
768
|
+
* `reapStaleSpares` — nothing ever resumes a spare (the daemon's row query
|
|
769
|
+
* hides them), so a dead spare is garbage, not a parked one.
|
|
770
|
+
*
|
|
771
|
+
* The claim also restamps the row's `created` to `created` — birth time is a
|
|
772
|
+
* spare's MINT time, and consumers sort conversations on it, so an hour-old
|
|
773
|
+
* spare must not sort as an hour-old conversation. This is the one sanctioned
|
|
774
|
+
* write of `created` after birth. */
|
|
775
|
+
export async function claimWarmSpare(recipeKey, created, opts = {}) {
|
|
776
|
+
return await withCanvasWrite(async (db) => {
|
|
777
|
+
const row = (await warmSpareRowsFor(db, recipeKey)).find(spareIsClaimable);
|
|
778
|
+
if (row === undefined)
|
|
779
|
+
return null;
|
|
780
|
+
// Bind the key to the spare in the same transaction that takes it, so a
|
|
781
|
+
// retry after a handover finishes this spare rather than claiming a second.
|
|
782
|
+
if (opts.requestKey !== undefined) {
|
|
783
|
+
const bound = await db.prepareUncached("UPDATE create_requests SET node_id = ?, state = 'warm_claimed' WHERE request_key = ? AND node_id IS NULL").run(row.node_id, opts.requestKey);
|
|
784
|
+
if (bound.changes === 0)
|
|
785
|
+
return null;
|
|
786
|
+
}
|
|
787
|
+
const res = await db.prepare('DELETE FROM warm_pool WHERE node_id = ?').run(row.node_id);
|
|
788
|
+
if (res.changes === 0)
|
|
789
|
+
return null;
|
|
790
|
+
await db.prepare('UPDATE nodes SET created = ?, deadline_at = ? WHERE node_id = ?')
|
|
791
|
+
.run(created, opts.deadlineAt ?? null, row.node_id);
|
|
792
|
+
if (opts.outcomeDelivery !== undefined)
|
|
793
|
+
await registerOutcomeAction(db, row.node_id, opts.outcomeDelivery);
|
|
794
|
+
return row.node_id;
|
|
795
|
+
});
|
|
796
|
+
}
|
|
797
|
+
/** How many CLAIMABLE spares are parked for `recipeKey` (the depth check a
|
|
798
|
+
* refill reads before minting). Uses the same liveness test as the claim, so a
|
|
799
|
+
* spare the claim would skip can never hold the pool at depth 1 and starve
|
|
800
|
+
* every later create of a warm start. */
|
|
801
|
+
export async function warmSpareCount(recipeKey) {
|
|
802
|
+
return (await warmSpareRowsFor(await openDb(), recipeKey)).filter(spareIsClaimable).length;
|
|
803
|
+
}
|
|
804
|
+
/** Direct children of `id`, oldest first — an indexed point query
|
|
805
|
+
* (`idx_nodes_parent`) instead of a full-table `listNodes()` scan. */
|
|
806
|
+
export async function childrenOf(id) {
|
|
807
|
+
return (await (await openDb()).prepare('SELECT node_id FROM nodes WHERE parent = ? ORDER BY created')
|
|
808
|
+
.all(id)).map((r) => r.node_id);
|
|
809
|
+
}
|
|
810
|
+
/** Every node's lean roster row, oldest first — a single scan indexed by
|
|
811
|
+
* `idx_nodes_created`, with no per-row hydration or N+1 query. */
|
|
812
|
+
export async function rosterNodes() {
|
|
813
|
+
return (await (await openDb())
|
|
814
|
+
.prepareUncached(`SELECT node_id, name, kind, mode, lifecycle, status, cwd, host_kind, parent, created, description
|
|
815
|
+
FROM node_rows WHERE ${NOT_A_SPARE} ORDER BY created`)
|
|
816
|
+
.all()).map((r) => ({
|
|
817
|
+
node_id: r['node_id'],
|
|
818
|
+
name: r['name'],
|
|
819
|
+
kind: r['kind'],
|
|
820
|
+
mode: r['mode'],
|
|
821
|
+
lifecycle: r['lifecycle'],
|
|
822
|
+
status: r['status'],
|
|
823
|
+
cwd: r['cwd'],
|
|
824
|
+
host_kind: r['host_kind'] ?? null,
|
|
825
|
+
parent: r['parent'] ?? null,
|
|
826
|
+
created: r['created'],
|
|
827
|
+
description: r['description'] ?? null,
|
|
828
|
+
}));
|
|
829
|
+
}
|
|
830
|
+
/** Resumable ROOT conversations pinned to `cwd`, most-recently-created first.
|
|
831
|
+
* A "root" is the top of a spine (`parent IS NULL`) that is a real
|
|
832
|
+
* conversation (not a `kind:'human'` ask) and still resumable (`active`/`idle`,
|
|
833
|
+
* never a `done`/`dead`/`canceled` node). This backs the front-door
|
|
834
|
+
* `crtr -c`/`-r` resume: cwd is the key (the Claude-Code mental model — "my
|
|
835
|
+
* last session HERE"), so it never teleports across projects. */
|
|
836
|
+
export async function listResumableRoots(cwd) {
|
|
837
|
+
const rows = await (await openDb())
|
|
838
|
+
.prepareUncached(`SELECT * FROM node_rows
|
|
839
|
+
WHERE parent IS NULL AND kind != 'human'
|
|
840
|
+
AND status IN ('active','idle') AND cwd = ?
|
|
841
|
+
AND ${NOT_A_SPARE}
|
|
842
|
+
ORDER BY created DESC`)
|
|
843
|
+
.all(cwd);
|
|
844
|
+
return rows.map(rowFrom);
|
|
845
|
+
}
|
|
846
|
+
export * from './tree.js';
|
|
847
|
+
/** Close the TOCTOU between checking a target has a natural cycle ahead
|
|
848
|
+
* of it and the write that depends on that (for example, a deferred inbox
|
|
849
|
+
* append). Fresh-reads `nodeId`'s
|
|
850
|
+
* (status, final_report, frozen_at) and either runs `body` (a write) or short-circuits
|
|
851
|
+
* with a `'terminal'`/`'missing'` outcome — the read takes the node row
|
|
852
|
+
* `FOR UPDATE` and holds it through `body`'s write in the same transaction, so
|
|
853
|
+
* a concurrent finish/cancel/finalization/deletion either commits entirely
|
|
854
|
+
* before this reads (observed here, `body` never runs) or waits on the row
|
|
855
|
+
* until `body` commits — never in the gap a separate check-then-write left
|
|
856
|
+
* open. Pass the shared `hasNoNaturalCycle` predicate rather than
|
|
857
|
+
* a bespoke one so the two never drift.
|
|
858
|
+
*
|
|
859
|
+
* A dangling `nodeId` — the row deleted after the
|
|
860
|
+
* caller's own selection but before this guard's fresh read — MUST NEVER run
|
|
861
|
+
* `body`. Reporting `'missing'` distinctly from `'terminal'` (rather than
|
|
862
|
+
* folding it into either the terminal branch or a fabricated "safe" empty
|
|
863
|
+
* snapshot) keeps the two failure shapes from being conflated: a terminal
|
|
864
|
+
* target has a real `status`/`final_report` to report and its own
|
|
865
|
+
* `deferred_no_natural_cycle`-style rejection, while a missing target has
|
|
866
|
+
* nothing to report and belongs to the caller's own not-found contract. */
|
|
867
|
+
export async function withFreshTerminalGuard(nodeId, isTerminal, body) {
|
|
868
|
+
return await withCanvasWrite(async (db) => {
|
|
869
|
+
const row = await db.prepare('SELECT status, final_report, frozen_at FROM nodes WHERE node_id = ? FOR UPDATE')
|
|
870
|
+
.get(nodeId);
|
|
871
|
+
if (row === undefined) {
|
|
872
|
+
return { kind: 'missing' };
|
|
873
|
+
}
|
|
874
|
+
if (isTerminal(row)) {
|
|
875
|
+
return { kind: 'terminal', status: row.status, final_report: row.final_report };
|
|
876
|
+
}
|
|
877
|
+
return { kind: 'ran', result: await body() };
|
|
878
|
+
});
|
|
879
|
+
}
|
|
880
|
+
/** True when this node's identity is still required to own a managed checkout.
|
|
881
|
+
*
|
|
882
|
+
* Ownership outlives the OPEN state. A closed record whose cleanup is still
|
|
883
|
+
* pending names a checkout and a branch that are physically still there, and
|
|
884
|
+
* this node record is the only proof of who they belong to — deleting it turns
|
|
885
|
+
* a retained residual into an ownerless orphan the daemon sweep can never
|
|
886
|
+
* safely reclaim, because it must never guess at a worktree it cannot prove it
|
|
887
|
+
* created. So prune may take this node only once cleanup is COMPLETE. A
|
|
888
|
+
* historical closed record written before the cleanup field existed carries no
|
|
889
|
+
* such proof and counts as incomplete.
|
|
890
|
+
*
|
|
891
|
+
* An abandoned record is deliberately NOT protected: abandon already removed
|
|
892
|
+
* the checkout and retains its branch for a person on purpose, so there is no
|
|
893
|
+
* residual for the sweep to own. */
|
|
894
|
+
async function hasUnreconciledManagedWorktree(nodeId) {
|
|
895
|
+
return await hasUnreconciledWorktree(nodeId);
|
|
896
|
+
}
|
|
897
|
+
/** Whether a row may be removed by an automatic collection sweep. */
|
|
898
|
+
export async function isCollectible(row, opts = {}) {
|
|
899
|
+
if (!['done', 'dead', 'canceled'].includes(row.status)
|
|
900
|
+
|| row.pi_pid !== null
|
|
901
|
+
|| row.frozen_at !== null
|
|
902
|
+
|| await hasUnreconciledManagedWorktree(row.node_id)
|
|
903
|
+
|| row.node_id === envNodeId()
|
|
904
|
+
// App runs (e.g. chat conversations) are deleted only through the runs API.
|
|
905
|
+
|| isAppRun(row))
|
|
906
|
+
return false;
|
|
907
|
+
return opts.pastTtl === true || !['crashed', 'stranded', null].includes(row.terminal_reason ?? null);
|
|
908
|
+
}
|
|
909
|
+
async function nodeConversationIds(nodeIds) {
|
|
910
|
+
if (nodeIds.length === 0)
|
|
911
|
+
return [];
|
|
912
|
+
const placeholders = nodeIds.map(() => '?').join(',');
|
|
913
|
+
const rows = await (await openDb()).prepareUncached(`SELECT s.session_id, s.transcript_path, s.node_id, n.grantee FROM sessions s JOIN node_rows n ON n.node_id = s.node_id WHERE s.node_id IN (${placeholders}) AND s.session_id IS NOT NULL AND s.transcript_path IS NOT NULL ORDER BY s.created_at, s.seq`).all(...nodeIds);
|
|
914
|
+
return [...new Map(rows.map((row) => [row.session_id, { id: row.session_id, path: row.transcript_path, dir: join(appSpace(row.grantee).conversations, row.node_id) }])).values()];
|
|
915
|
+
}
|
|
916
|
+
/** Delete conversations nothing still needs: no sessions row names them, and no fork
|
|
917
|
+
* that has not launched yet (a node with no sessions row) replays them as its source.
|
|
918
|
+
* Runs after the owner's rows are gone, so the store can no longer resolve a path: each file is
|
|
919
|
+
* removed by the path read before. */
|
|
920
|
+
async function deleteNodeConversations(conversations) {
|
|
921
|
+
const db = await openDb();
|
|
922
|
+
const referenced = db.prepare('SELECT 1 FROM sessions WHERE session_id = ? LIMIT 1');
|
|
923
|
+
const pendingFork = db.prepare(`SELECT 1 FROM nodes n WHERE n.fork_source_file LIKE '%\\_' || ? || '.jsonl' ESCAPE '\\'
|
|
924
|
+
AND NOT EXISTS (SELECT 1 FROM sessions s WHERE s.node_id = n.node_id) LIMIT 1`);
|
|
925
|
+
for (const { id, path, dir } of conversations) {
|
|
926
|
+
if (await referenced.get(id) !== undefined || await pendingFork.get(id) !== undefined)
|
|
927
|
+
continue;
|
|
928
|
+
if (lstatSync(path, { throwIfNoEntry: false }) === undefined)
|
|
929
|
+
continue;
|
|
930
|
+
if (!isBeneath(dir, path)) {
|
|
931
|
+
console.error(`[canvas] not deleting transcript outside its node's conversations directory: ${path}`);
|
|
932
|
+
continue;
|
|
933
|
+
}
|
|
934
|
+
try {
|
|
935
|
+
await conversationStore().delete(id, path);
|
|
936
|
+
}
|
|
937
|
+
catch (error) {
|
|
938
|
+
if (!(error instanceof ConversationNotFoundError))
|
|
939
|
+
throw error;
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
/** A node chooses the transcript path it binds, so only a file beneath the deleting
|
|
944
|
+
* node's own conversations directory (no link in the way) is ever removed. */
|
|
945
|
+
function isBeneath(dir, path) {
|
|
946
|
+
try {
|
|
947
|
+
const rel = relative(realpathSync(dir), join(realpathSync(dirname(path)), basename(path)));
|
|
948
|
+
return rel !== '' && rel !== '..' && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);
|
|
949
|
+
}
|
|
950
|
+
catch (error) {
|
|
951
|
+
if (error.code === 'ENOENT')
|
|
952
|
+
return false;
|
|
953
|
+
throw error;
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
/** Delete one node and what it owns, in the caller's transaction; false when it is already gone. */
|
|
957
|
+
async function deleteNodeObject(db, nodeId) {
|
|
958
|
+
const node = await getById(db, nodeId);
|
|
959
|
+
if (node === null || node.deleted_at !== null)
|
|
960
|
+
return false;
|
|
961
|
+
await deleteNodeWithOwned(db, node);
|
|
962
|
+
return true;
|
|
963
|
+
}
|
|
964
|
+
export async function nodeFiles(nodeId) {
|
|
965
|
+
return { nodeId, app: await getNode(nodeId) === null ? null : await appForNode(nodeId) };
|
|
966
|
+
}
|
|
967
|
+
/** Remove the trees an app can write into (the node's agent folder and run
|
|
968
|
+
* folder) without following any link inside them (R18G). Synchronous even on
|
|
969
|
+
* the retention sweep: a plain recursive rm would follow an app-planted link. */
|
|
970
|
+
async function removeNodeAppTrees({ nodeId, app }) {
|
|
971
|
+
if (app !== null)
|
|
972
|
+
removeTreeBeneath(appSpace(app).nodes, await nodeAgentDir(nodeId, app));
|
|
973
|
+
removeTreeBeneath(dirname(nodeRunDir(nodeId)), nodeRunDir(nodeId));
|
|
974
|
+
}
|
|
975
|
+
/** The daemon-owned directories a deleted node owned, removed whole with a plain rm. */
|
|
976
|
+
function nodeOwnedDirs({ nodeId }) {
|
|
977
|
+
return [nodeDir(nodeId)];
|
|
978
|
+
}
|
|
979
|
+
/** A conversation another node still references keeps its file, and so its
|
|
980
|
+
* conversations directory: remove it only when empty. */
|
|
981
|
+
function removeNodeConversationDir({ nodeId, app }) {
|
|
982
|
+
if (app === null)
|
|
983
|
+
return;
|
|
984
|
+
try {
|
|
985
|
+
rmdirSync(join(appSpace(app).conversations, nodeId));
|
|
986
|
+
}
|
|
987
|
+
catch (error) {
|
|
988
|
+
if (!['ENOENT', 'ENOTEMPTY'].includes(error.code ?? ''))
|
|
989
|
+
throw error;
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
/** Remove every directory a deleted node owned. A conversation another node
|
|
993
|
+
* still references keeps its file, and so its conversations directory. */
|
|
994
|
+
export async function removeNodeFiles(files) {
|
|
995
|
+
await removeNodeAppTrees(files);
|
|
996
|
+
for (const dir of nodeOwnedDirs(files))
|
|
997
|
+
rmSync(dir, { recursive: true, force: true });
|
|
998
|
+
removeNodeConversationDir(files);
|
|
999
|
+
}
|
|
1000
|
+
/** Delete ONE node with what it owns ({@link deleteNodeWithOwned}) and remove its on-disk `nodes/<id>/` dir. The single-node
|
|
1001
|
+
* analogue of {@link pruneNodes}, for IMMEDIATE reaping — e.g. an empty node the
|
|
1002
|
+
* user closed or detached from. An open managed worktree is never deleted: its
|
|
1003
|
+
* node retains the ownership needed for `node worktree close`. Pure persisted-state
|
|
1004
|
+
* removal: the caller MUST have already torn down the broker engine +
|
|
1005
|
+
* viewer (this does not signal any process). The node row and its FK-coupled
|
|
1006
|
+
* state are removed in one canvas write boundary. Best-effort dir removal
|
|
1007
|
+
* follows the commit. */
|
|
1008
|
+
export async function deleteNode(nodeId) {
|
|
1009
|
+
if (await hasUnreconciledManagedWorktree(nodeId))
|
|
1010
|
+
return { deleted: false };
|
|
1011
|
+
const files = await nodeFiles(nodeId);
|
|
1012
|
+
const conversations = await nodeConversationIds([nodeId]);
|
|
1013
|
+
const result = await withCanvasWrite(async (db) => {
|
|
1014
|
+
await deleteNodeObject(db, nodeId);
|
|
1015
|
+
return { deleted: true };
|
|
1016
|
+
});
|
|
1017
|
+
await deleteNodeConversations(conversations);
|
|
1018
|
+
await removeNodeFiles(files);
|
|
1019
|
+
return result;
|
|
1020
|
+
}
|
|
1021
|
+
/** Hard-delete a validated set of nodes in one row transaction, then remove
|
|
1022
|
+
* their directories. The caller must tear down engines and viewers first. */
|
|
1023
|
+
export async function deleteNodes(nodeIds) {
|
|
1024
|
+
const ids = [...new Set(nodeIds)];
|
|
1025
|
+
if (ids.length === 0)
|
|
1026
|
+
return [];
|
|
1027
|
+
const blocked = (await filterAsync(ids, hasUnreconciledManagedWorktree));
|
|
1028
|
+
if (blocked.length > 0) {
|
|
1029
|
+
throw new Error(`refusing to delete nodes with unreconciled managed worktrees: ${blocked.join(', ')}`);
|
|
1030
|
+
}
|
|
1031
|
+
const files = (await mapAsync(ids, nodeFiles));
|
|
1032
|
+
const conversations = await nodeConversationIds(ids);
|
|
1033
|
+
const placeholders = ids.map(() => '?').join(',');
|
|
1034
|
+
const existing = (await (await openDb())
|
|
1035
|
+
.prepareUncached(`SELECT node_id FROM nodes WHERE node_id IN (${placeholders}) ORDER BY created`)
|
|
1036
|
+
.all(...ids)).map(({ node_id }) => node_id);
|
|
1037
|
+
const deleted = (await filterAsync(existing, async (id) => await withCanvasWrite(async (db) => await deleteNodeObject(db, id))));
|
|
1038
|
+
await deleteNodeConversations(conversations);
|
|
1039
|
+
for (const id of deleted) {
|
|
1040
|
+
const node = files[ids.indexOf(id)];
|
|
1041
|
+
await eachNodeBestEffort(node, async () => await removeNodeFiles(node));
|
|
1042
|
+
}
|
|
1043
|
+
return deleted;
|
|
1044
|
+
}
|
|
1045
|
+
/** Retention sweep: remove TERMINAL nodes (status dead | done | canceled) whose
|
|
1046
|
+
* last activity ({@link lastActivityMs}) is older than `ttlDays`, bounding the
|
|
1047
|
+
* otherwise-unbounded growth of node rows + dirs. Only {@link isCollectible}
|
|
1048
|
+
* rows qualify, and never one `held` claims. Each node is deleted with what it
|
|
1049
|
+
* owns ({@link deleteNodeWithOwned}); the on-disk `nodes/<id>/` dir is removed too.
|
|
1050
|
+
*
|
|
1051
|
+
* With `includeStale`, ALSO prunes nominally-live (active | idle) nodes past the
|
|
1052
|
+
* TTL whose process is provably gone and that nothing will bring back: no live
|
|
1053
|
+
* `pi_pid`, not sleeping until a wake (`idle-release`), no unseen wake mail,
|
|
1054
|
+
* not frozen, not in respawn backoff, not an app run, not held, and never the CALLER
|
|
1055
|
+
* ($CRTR_NODE_ID). Without the flag, active | idle are NEVER touched.
|
|
1056
|
+
*
|
|
1057
|
+
* Each node's rows change in its own transaction. Dir removals follow after COMMIT — the fs isn't transactional, and by then
|
|
1058
|
+
* the rows are gone, so a re-run never re-finds a half-deleted node. `dryRun`
|
|
1059
|
+
* reports the candidate set and deletes NOTHING. */
|
|
1060
|
+
export async function pruneNodes(opts) {
|
|
1061
|
+
const dryRun = opts.dryRun ?? false;
|
|
1062
|
+
const includeStale = opts.includeStale ?? false;
|
|
1063
|
+
const cutoffMs = Date.now() - opts.ttlDays * 86_400_000;
|
|
1064
|
+
// `created` is a lower bound on last activity, so it is a sound SQL prefilter.
|
|
1065
|
+
const cutoff = new Date(cutoffMs).toISOString();
|
|
1066
|
+
const selfId = envNodeId() ?? '';
|
|
1067
|
+
const db = await openDb();
|
|
1068
|
+
const quiet = (row) => lastActivityMs(row) < cutoffMs;
|
|
1069
|
+
const toPruned = (row) => ({ node_id: row.node_id, status: row.status, created: row.created });
|
|
1070
|
+
const watchedOwners = await ownersOfWatchedDocuments();
|
|
1071
|
+
const terminal = (await filterAsync((await db.prepare(`SELECT * FROM node_rows
|
|
1072
|
+
WHERE status IN ('dead', 'done', 'canceled') AND created < ?
|
|
1073
|
+
ORDER BY created`)
|
|
1074
|
+
.all(cutoff))
|
|
1075
|
+
.map(rowFrom), async (row) => await isCollectible(row, { pastTtl: true }) && quiet(row) && !watchedOwners.has(row.node_id) && !await opts.held(row.node_id)))
|
|
1076
|
+
.map(toPruned);
|
|
1077
|
+
const stale = !includeStale ? [] : (await filterAsync((await db.prepare(`SELECT * FROM node_rows
|
|
1078
|
+
WHERE status IN ('active', 'idle') AND created < ?
|
|
1079
|
+
ORDER BY created`)
|
|
1080
|
+
.all(cutoff))
|
|
1081
|
+
.map(rowFrom), async (row) => row.node_id !== selfId
|
|
1082
|
+
&& !isPidAlive(row.pi_pid ?? null)
|
|
1083
|
+
&& (row.frozen_at ?? null) === null
|
|
1084
|
+
&& (row.respawn_not_before ?? null) === null
|
|
1085
|
+
&& row.intent !== 'idle-release'
|
|
1086
|
+
&& !isAppRun(row)
|
|
1087
|
+
&& !await hasUnseenWakeMail(row.node_id)
|
|
1088
|
+
&& !await hasUnreconciledManagedWorktree(row.node_id)
|
|
1089
|
+
&& quiet(row)
|
|
1090
|
+
&& !await opts.held(row.node_id)))
|
|
1091
|
+
.map(toPruned);
|
|
1092
|
+
const candidates = await retainRunRootsWithMembers([...terminal, ...stale]);
|
|
1093
|
+
if (dryRun || candidates.length === 0)
|
|
1094
|
+
return { pruned: candidates, dryRun };
|
|
1095
|
+
await deletePrunedNodes(candidates, opts.removeDirs);
|
|
1096
|
+
return { pruned: candidates, dryRun };
|
|
1097
|
+
}
|
|
1098
|
+
/** Nodes that own a live document some other live object still watches. Deleting such a node deletes the document under
|
|
1099
|
+
* that watcher (only a link from a live document keeps one), so the sweep leaves the node until the watcher ends. A
|
|
1100
|
+
* watcher is live when it is not a node (a profile, an app, a person) or is a node that is active or idle; a finished
|
|
1101
|
+
* node's watches end with it. */
|
|
1102
|
+
async function ownersOfWatchedDocuments() {
|
|
1103
|
+
const rows = await (await openDb()).prepare(`SELECT DISTINCT d.owner AS owner FROM watches w
|
|
1104
|
+
JOIN objects d ON d.id = w.object AND d.type = 'document' AND d.deleted_at IS NULL
|
|
1105
|
+
JOIN objects o ON o.id = w.watcher AND o.deleted_at IS NULL
|
|
1106
|
+
LEFT JOIN nodes n ON n.node_id = w.watcher
|
|
1107
|
+
WHERE w.watcher != d.owner AND d.owner IS NOT NULL AND (n.node_id IS NULL OR n.status IN ('active', 'idle'))`)
|
|
1108
|
+
.all();
|
|
1109
|
+
return new Set(rows.map((r) => r.owner));
|
|
1110
|
+
}
|
|
1111
|
+
/** A run's nodes all carry the root's `run_id`, and the run observer and every
|
|
1112
|
+
* run-event append read the root's row. A sweep therefore never deletes a run
|
|
1113
|
+
* root while a node of its run survives: a member can be retained alone (its
|
|
1114
|
+
* managed worktree is unreconciled, `held` claims it, it is still live), and
|
|
1115
|
+
* deleting the root under it leaves a `run_id` that points at nothing. The
|
|
1116
|
+
* root goes on a later sweep, once its last member has. */
|
|
1117
|
+
async function retainRunRootsWithMembers(candidates) {
|
|
1118
|
+
const db = await openDb();
|
|
1119
|
+
const members = db.prepare('SELECT node_id FROM nodes WHERE run_id = ? AND node_id != ?');
|
|
1120
|
+
const sweeping = new Set(candidates.map((c) => c.node_id));
|
|
1121
|
+
return (await filterAsync(candidates, async (c) => (await members.all(c.node_id, c.node_id)).every((m) => sweeping.has(m.node_id))));
|
|
1122
|
+
}
|
|
1123
|
+
/** Delete a set of pruned nodes, each with what it owns in its own transaction, followed by best-effort
|
|
1124
|
+
* on-disk `nodes/<id>/` removal. Shared by TTL and count pruning so their
|
|
1125
|
+
* delete semantics never drift. `removeDirs` replaces the synchronous removal
|
|
1126
|
+
* (the daemon passes an async one so a large sweep never blocks its tick). */
|
|
1127
|
+
async function deletePrunedNodes(candidates, removeDirs) {
|
|
1128
|
+
if (candidates.length === 0)
|
|
1129
|
+
return;
|
|
1130
|
+
const files = (await mapAsync(candidates, async (c) => await nodeFiles(c.node_id)));
|
|
1131
|
+
const conversations = await nodeConversationIds(candidates.map((c) => c.node_id));
|
|
1132
|
+
for (const c of candidates)
|
|
1133
|
+
await withCanvasWrite(async (db) => await deleteNodeObject(db, c.node_id));
|
|
1134
|
+
await deleteNodeConversations(conversations);
|
|
1135
|
+
if (removeDirs !== undefined) {
|
|
1136
|
+
for (const node of files) {
|
|
1137
|
+
await eachNodeBestEffort(node, async () => {
|
|
1138
|
+
await removeNodeAppTrees(node);
|
|
1139
|
+
removeNodeConversationDir(node);
|
|
1140
|
+
});
|
|
1141
|
+
}
|
|
1142
|
+
removeDirs(files.flatMap(nodeOwnedDirs));
|
|
1143
|
+
return;
|
|
1144
|
+
}
|
|
1145
|
+
for (const node of files)
|
|
1146
|
+
await eachNodeBestEffort(node, async () => await removeNodeFiles(node));
|
|
1147
|
+
}
|
|
1148
|
+
/** The rows are already gone, so one node's refused or failed removal is
|
|
1149
|
+
* logged and the batch continues: nothing finds these directories later. */
|
|
1150
|
+
async function eachNodeBestEffort(node, remove) {
|
|
1151
|
+
try {
|
|
1152
|
+
remove();
|
|
1153
|
+
}
|
|
1154
|
+
catch (error) {
|
|
1155
|
+
emitEvent({ level: 'error', event: 'canvas.node_files.remove_failed', error, fields: { node_id: node.nodeId } });
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
/** A node's most recent activity (epoch ms): the latest of its lifecycle
|
|
1159
|
+
* timestamps (created, launched, settled, finalized, outcome, last run event)
|
|
1160
|
+
* and the mtime of `job/telemetry.json`, which every turn_end rewrites. 0 when
|
|
1161
|
+
* none is readable. The single clock every retention decision uses. Never throws. */
|
|
1162
|
+
export function lastActivityMs(row) {
|
|
1163
|
+
let latest = 0;
|
|
1164
|
+
for (const value of [row.created, row.launched_at, row.last_settled_at, row.finalized_at, row.outcome_at, row.last_activity_at]) {
|
|
1165
|
+
if (value === null || value === undefined)
|
|
1166
|
+
continue;
|
|
1167
|
+
const t = Date.parse(value);
|
|
1168
|
+
if (Number.isFinite(t) && t > latest)
|
|
1169
|
+
latest = t;
|
|
1170
|
+
}
|
|
1171
|
+
try {
|
|
1172
|
+
const st = statSync(join(jobDir(row.node_id), 'telemetry.json'), { throwIfNoEntry: false });
|
|
1173
|
+
if (st !== undefined && st.mtimeMs > latest)
|
|
1174
|
+
latest = st.mtimeMs;
|
|
1175
|
+
}
|
|
1176
|
+
catch {
|
|
1177
|
+
/* telemetry is disposable */
|
|
1178
|
+
}
|
|
1179
|
+
return latest;
|
|
1180
|
+
}
|
|
1181
|
+
/** Count-based retention sweep: keep every row that is not collectible or that
|
|
1182
|
+
* `held` claims, plus the most recently active collectible rows up to
|
|
1183
|
+
* `maxNodes` in total, so the real retained floor is `max(maxNodes,
|
|
1184
|
+
* retainedCount)`. Bounds the growth the TTL sweep can't (a canvas that never
|
|
1185
|
+
* crosses the TTL still grows without limit). Recency is {@link lastActivityMs}.
|
|
1186
|
+
*
|
|
1187
|
+
* Mirrors {@link pruneNodes} exactly for the delete (shared `deletePrunedNodes`:
|
|
1188
|
+
* transactioned row sweep + FK edge cascade + best-effort dir removal). `dryRun`
|
|
1189
|
+
* reports the candidate set and deletes NOTHING. */
|
|
1190
|
+
export async function pruneToLimit(opts) {
|
|
1191
|
+
const dryRun = opts.dryRun ?? false;
|
|
1192
|
+
const rows = await listNodes();
|
|
1193
|
+
const collectible = (await filterAsync(rows, async (row) => await isCollectible(row) && !await opts.held(row.node_id)));
|
|
1194
|
+
const retainedCount = rows.length - collectible.length;
|
|
1195
|
+
const keep = Math.max(0, opts.maxNodes - retainedCount);
|
|
1196
|
+
const unfiltered = collectible
|
|
1197
|
+
.map((row) => ({ row, recency: lastActivityMs(row) }))
|
|
1198
|
+
.sort((a, b) => b.recency - a.recency)
|
|
1199
|
+
.slice(keep)
|
|
1200
|
+
.map(({ row }) => ({ node_id: row.node_id, status: row.status, created: row.created }));
|
|
1201
|
+
const candidates = await retainRunRootsWithMembers(unfiltered);
|
|
1202
|
+
if (dryRun || candidates.length === 0)
|
|
1203
|
+
return { pruned: candidates, dryRun };
|
|
1204
|
+
await deletePrunedNodes(candidates);
|
|
1205
|
+
return { pruned: candidates, dryRun };
|
|
1206
|
+
}
|