@north-light/crouter 0.3.170 → 0.3.172
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 +37 -11
- package/dist/api/client.js +84 -15
- package/dist/api/dto/human.d.ts +53 -39
- package/dist/api/dto/human.js +2 -3
- package/dist/api/dto/inbox.d.ts +0 -1
- package/dist/api/dto/nodes.d.ts +12 -0
- package/dist/api/dto/review-comments.d.ts +137 -0
- package/dist/api/dto/review-comments.js +5 -0
- package/dist/api/dto/reviews.d.ts +109 -0
- package/dist/api/dto/reviews.js +5 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +2 -0
- package/dist/api/routes.d.ts +17 -4
- package/dist/api/routes.js +21 -5
- package/dist/build-root.d.ts +1 -16
- package/dist/build-root.js +1 -25
- package/dist/builtin-memory/00-runtime-base.md +7 -5
- package/dist/builtin-memory/04-base-worker.md +1 -1
- package/dist/builtin-memory/04-orchestration-kernel.md +7 -7
- package/dist/builtin-memory/05-kinds/design/00-base.md +1 -1
- package/dist/builtin-memory/05-kinds/design/01-orchestrator.md +1 -1
- package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -1
- package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -1
- package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -1
- package/dist/builtin-memory/05-kinds/plan/01-orchestrator.md +1 -1
- package/dist/builtin-memory/05-kinds/review/00-base.md +1 -1
- package/dist/builtin-memory/05-kinds/review/companion/00-base.md +20 -0
- package/dist/builtin-memory/05-kinds/spec/00-base.md +3 -7
- package/dist/builtin-memory/05-kinds/spec/01-orchestrator.md +3 -3
- package/dist/builtin-memory/05-kinds/spec/requirements.md +3 -3
- package/dist/builtin-memory/design.md +2 -2
- package/dist/builtin-memory/insights/capture.md +50 -0
- package/dist/builtin-memory/insights/init.md +45 -0
- package/dist/builtin-memory/insights/listen.md +9 -0
- package/dist/builtin-memory/internal/agent-shaping.md +2 -2
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/plugins.md +12 -11
- package/dist/builtin-memory/internal/storage-tiers.md +2 -2
- package/dist/builtin-memory/{planning.md → plan/roadmap.md} +3 -3
- package/dist/builtin-memory/plan.md +19 -0
- package/dist/builtin-memory/spec/guide.md +38 -0
- package/dist/builtin-memory/spec/requirements.md +31 -0
- package/dist/builtin-memory/spec/roadmap.md +35 -0
- package/dist/builtin-memory/spec.md +10 -86
- package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +3 -4
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +49 -5
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.d.ts +56 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +920 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +221 -156
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +4 -5
- package/dist/cli.js +2 -6
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +7 -35
- package/dist/clients/attach/__tests__/attach-keybindings.test.js +32 -16
- package/dist/clients/attach/__tests__/context-message.test.js +142 -6
- package/dist/clients/attach/__tests__/crtr-output.test.js +29 -45
- package/dist/clients/attach/__tests__/diagram.test.js +1 -1
- package/dist/clients/attach/__tests__/file-review-focus.test.js +48 -0
- package/dist/clients/attach/__tests__/group-activity.test.js +266 -0
- package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +32 -0
- package/dist/clients/attach/__tests__/session-identity-refresh.test.js +32 -0
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +1 -2
- package/dist/clients/attach/chrome/header.d.ts +10 -0
- package/dist/clients/attach/chrome/header.js +30 -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/status-line.d.ts +3 -0
- package/dist/clients/attach/chrome/status-line.js +5 -0
- package/dist/clients/attach/chrome/widgets.js +11 -21
- package/dist/clients/attach/command.js +11 -7
- package/dist/clients/attach/config.d.ts +4 -0
- package/dist/clients/attach/config.js +3 -0
- package/dist/clients/attach/input/controller.d.ts +19 -0
- package/dist/clients/attach/input/controller.js +62 -28
- package/dist/clients/attach/input/titled-editor.d.ts +0 -4
- package/dist/clients/attach/input/titled-editor.js +2 -10
- package/dist/clients/attach/overlays/file-review.d.ts +9 -5
- package/dist/clients/attach/overlays/file-review.js +9 -70
- package/dist/clients/attach/overlays/help.d.ts +33 -0
- package/dist/clients/attach/overlays/help.js +204 -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/chat-view.d.ts +117 -12
- package/dist/clients/attach/render/chat-view.js +604 -135
- package/dist/clients/attach/render/context-message.d.ts +2 -1
- package/dist/clients/attach/render/context-message.js +17 -13
- package/dist/clients/attach/render/crtr-output.js +1 -3
- package/dist/clients/attach/render/diagram.js +2 -2
- package/dist/clients/attach/render/edit-diff.d.ts +4 -1
- package/dist/clients/attach/render/edit-diff.js +7 -11
- package/dist/clients/attach/render/group-activity.d.ts +32 -0
- package/dist/clients/attach/render/group-activity.js +206 -0
- package/dist/clients/attach/render/group-recap.d.ts +10 -0
- package/dist/clients/attach/render/group-recap.js +93 -0
- package/dist/clients/attach/render/html-markdown.d.ts +17 -0
- package/dist/clients/attach/render/html-markdown.js +228 -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/scroll-animation.d.ts +8 -0
- package/dist/clients/attach/render/scroll-animation.js +80 -0
- package/dist/clients/attach/render/tool-calls.js +6 -6
- 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/viewport.d.ts +29 -0
- package/dist/clients/attach/render/viewport.js +159 -0
- package/dist/clients/attach/session/bindings.d.ts +10 -7
- package/dist/clients/attach/session/bindings.js +23 -8
- package/dist/clients/attach/session/connection.js +4 -5
- package/dist/clients/attach/session/context.d.ts +6 -4
- package/dist/clients/attach/session/frame.d.ts +34 -0
- package/dist/clients/attach/session/frame.js +176 -0
- package/dist/clients/attach/session/frames.d.ts +4 -1
- package/dist/clients/attach/session/frames.js +14 -1
- package/dist/clients/attach/session/identity.js +4 -3
- package/dist/clients/attach/session/input-wiring.d.ts +14 -4
- package/dist/clients/attach/session/input-wiring.js +15 -13
- 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 +10 -2
- package/dist/clients/attach/session/keys.js +13 -5
- package/dist/clients/attach/session/layout.d.ts +10 -8
- package/dist/clients/attach/session/layout.js +33 -34
- package/dist/clients/attach/session/mouse.d.ts +18 -0
- package/dist/clients/attach/session/mouse.js +64 -0
- package/dist/clients/attach/session/pane-tag.d.ts +3 -0
- package/dist/clients/attach/session/pane-tag.js +51 -8
- package/dist/clients/attach/session/reconnect.d.ts +3 -0
- package/dist/clients/attach/session/reconnect.js +42 -5
- 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 +64 -0
- package/dist/clients/attach/session/surface-host.js +255 -0
- package/dist/clients/attach/session/whip.d.ts +17 -0
- package/dist/clients/attach/session/whip.js +334 -0
- package/dist/clients/attach/slash/dispatch.d.ts +13 -1
- package/dist/clients/attach/slash/dispatch.js +51 -29
- package/dist/clients/attach/viewer.js +907 -819
- package/dist/clients/conversation/conversation.d.ts +65 -0
- package/dist/clients/conversation/conversation.js +318 -0
- package/dist/clients/conversation/frames.d.ts +30 -0
- package/dist/clients/conversation/frames.js +52 -0
- package/dist/clients/conversation/region.d.ts +51 -0
- package/dist/clients/conversation/region.js +265 -0
- package/dist/clients/conversation/submit.d.ts +38 -0
- package/dist/clients/conversation/submit.js +51 -0
- package/dist/clients/inbox/__tests__/inbox-controller.test.js +247 -0
- package/dist/clients/inbox/__tests__/mount-panel.test.js +776 -0
- package/dist/clients/inbox/controller.d.ts +79 -0
- package/dist/clients/inbox/controller.js +448 -0
- package/dist/clients/inbox/deck-adapter.d.ts +29 -0
- package/dist/clients/inbox/deck-adapter.js +62 -0
- package/dist/clients/inbox/layout.d.ts +8 -0
- package/dist/clients/inbox/layout.js +9 -0
- package/dist/clients/inbox/resolve.d.ts +10 -0
- package/dist/clients/inbox/resolve.js +34 -0
- package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +29 -0
- package/dist/clients/inbox/review/__tests__/remap.test.js +196 -0
- package/dist/clients/inbox/review/__tests__/review-core.test.js +341 -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/columns.d.ts +22 -0
- package/dist/clients/inbox/review/columns.js +40 -0
- package/dist/clients/inbox/review/comments-client.d.ts +66 -0
- package/dist/clients/inbox/review/comments-client.js +98 -0
- package/dist/clients/inbox/review/composition.d.ts +60 -0
- package/dist/clients/inbox/review/composition.js +278 -0
- package/dist/clients/inbox/review/document-region.d.ts +120 -0
- package/dist/clients/inbox/review/document-region.js +902 -0
- package/dist/clients/inbox/review/frame.d.ts +45 -0
- package/dist/clients/inbox/review/frame.js +215 -0
- package/dist/clients/inbox/review/keys.d.ts +67 -0
- package/dist/clients/inbox/review/keys.js +130 -0
- package/dist/clients/inbox/review/launch.d.ts +10 -0
- package/dist/clients/inbox/review/launch.js +129 -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 +13 -0
- package/dist/clients/inbox/review/nvim.js +42 -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 +30 -0
- package/dist/clients/inbox/review/review-client.js +107 -0
- package/dist/clients/inbox/review/roundtrip.d.ts +5 -0
- package/dist/clients/inbox/review/roundtrip.js +36 -0
- package/dist/clients/inbox/review/state.d.ts +143 -0
- package/dist/clients/inbox/review/state.js +282 -0
- package/dist/clients/inbox/review-adapter.d.ts +29 -0
- package/dist/clients/inbox/review-adapter.js +92 -0
- package/dist/clients/inbox/review-visibility.d.ts +5 -0
- package/dist/clients/inbox/review-visibility.js +19 -0
- package/dist/clients/inbox/surface.d.ts +19 -0
- package/dist/clients/inbox/surface.js +128 -0
- package/dist/clients/inbox/tui/ansi.d.ts +66 -0
- package/dist/clients/inbox/tui/ansi.js +317 -0
- package/dist/clients/inbox/tui/clipboard.d.ts +2 -0
- package/dist/clients/inbox/tui/clipboard.js +26 -0
- package/dist/clients/inbox/tui/input.d.ts +7 -0
- package/dist/clients/inbox/tui/input.js +653 -0
- package/dist/clients/inbox/tui/keys.d.ts +28 -0
- package/dist/clients/inbox/tui/keys.js +111 -0
- package/dist/clients/inbox/tui/panel.d.ts +2 -0
- package/dist/clients/inbox/tui/panel.js +217 -0
- package/dist/clients/inbox/tui/render.d.ts +37 -0
- package/dist/clients/inbox/tui/render.js +476 -0
- package/dist/clients/inbox/tui/types.d.ts +57 -0
- package/dist/clients/inbox/tui/types.js +1 -0
- package/dist/clients/inbox/tui.d.ts +6 -0
- package/dist/clients/inbox/tui.js +74 -0
- package/dist/clients/surfaces/host.d.ts +66 -0
- package/dist/clients/surfaces/host.js +1 -0
- package/dist/clients/surfaces/region.d.ts +16 -0
- package/dist/clients/surfaces/region.js +1 -0
- package/dist/clients/web/__tests__/push-engine.test.js +14 -158
- package/dist/clients/web/dev-server.d.ts +3 -3
- package/dist/clients/web/dev-server.js +9 -23
- package/dist/clients/web/events.js +4 -6
- package/dist/clients/web/push-engine.d.ts +2 -66
- package/dist/clients/web/push-engine.js +30 -161
- package/dist/clients/web/push-registry.d.ts +0 -4
- package/dist/clients/web/push-registry.js +2 -7
- package/dist/clients/web/server.js +3 -35
- package/dist/clients/web/web-client/shared/protocol.d.ts +0 -108
- package/dist/clients/web/web-cmd.js +2 -2
- package/dist/commands/__tests__/human.test.js +27 -15
- package/dist/commands/api-client.js +3 -3
- package/dist/commands/canvas-browse.js +1 -1
- package/dist/commands/canvas-issue.js +1 -1
- package/dist/commands/canvas-use.js +1 -1
- package/dist/commands/human/doc.d.ts +2 -0
- package/dist/commands/human/doc.js +98 -0
- package/dist/commands/human/inbox.d.ts +2 -0
- package/dist/commands/human/inbox.js +101 -0
- package/dist/commands/human/prompts.d.ts +2 -3
- package/dist/commands/human/prompts.js +27 -180
- package/dist/commands/human/queue.d.ts +1 -5
- package/dist/commands/human/queue.js +54 -216
- package/dist/commands/human/review.d.ts +2 -0
- package/dist/commands/human/review.js +298 -0
- package/dist/commands/human/shared.d.ts +2 -69
- package/dist/commands/human/shared.js +1 -181
- package/dist/commands/human.js +15 -20
- package/dist/commands/memory/__tests__/lint.test.d.ts +1 -0
- package/dist/commands/memory/__tests__/lint.test.js +15 -0
- package/dist/commands/memory/delete.js +2 -2
- package/dist/commands/memory/lint.d.ts +1 -0
- package/dist/commands/memory/lint.js +21 -3
- package/dist/commands/memory/read.js +4 -4
- package/dist/commands/node.js +8 -7
- package/dist/commands/pkg/plugin-manage.js +143 -68
- package/dist/commands/surface-inspect.js +2 -2
- package/dist/commands/surface.js +6 -12
- package/dist/commands/sys/__tests__/setup-core.test.js +9 -5
- package/dist/commands/sys/__tests__/setup-front-door.test.js +7 -42
- package/dist/commands/sys/config.js +29 -3
- package/dist/commands/sys/feedback.js +1 -1
- package/dist/commands/sys/setup-core.d.ts +12 -11
- package/dist/commands/sys/setup-core.js +55 -46
- package/dist/commands/sys/setup-wizard.d.ts +4 -1
- package/dist/commands/sys/setup-wizard.js +50 -9
- package/dist/commands/sys/sync-deps.js +1 -1
- package/dist/commands/sys.js +4 -6
- package/dist/core/__tests__/broker-sdk-wiring.test.js +6 -1
- package/dist/core/__tests__/broker-snapshot-history.test.js +9 -1
- package/dist/core/__tests__/dead-node-policy-table.test.js +3 -4
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +8 -5
- package/dist/core/__tests__/fixtures/fake-engine.js +28 -2
- package/dist/core/__tests__/full/broker-provider-retry.test.js +87 -2
- package/dist/core/__tests__/full/broker-whip-interrupt.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-whip-interrupt.test.js +39 -0
- package/dist/core/__tests__/full/detach-focus.test.js +1 -1
- package/dist/core/__tests__/human-deliver-e2e.test.js +64 -64
- package/dist/core/__tests__/human-deliver.test.js +71 -345
- package/dist/core/__tests__/inline-memory-refs.test.js +2 -12
- package/dist/core/__tests__/memory-resolver-precedence.test.js +12 -15
- package/dist/core/__tests__/migration.test.js +10 -0
- package/dist/core/__tests__/model-pin-durability.test.js +14 -0
- package/dist/core/__tests__/phase4-review-migration.test.d.ts +1 -0
- package/dist/core/__tests__/phase4-review-migration.test.js +100 -0
- package/dist/core/__tests__/phase4-review-store.test.d.ts +1 -0
- package/dist/core/__tests__/phase4-review-store.test.js +143 -0
- package/dist/core/__tests__/remote-canvas-target.test.js +2 -2
- package/dist/core/__tests__/revive.test.js +22 -53
- package/dist/core/__tests__/session-cycles.test.js +48 -18
- package/dist/core/__tests__/spawn-no-kickoff.test.js +8 -12
- package/dist/core/__tests__/stop-guard.test.js +16 -1
- package/dist/core/__tests__/tmux-surface.test.js +21 -25
- package/dist/core/asset-root.d.ts +7 -0
- package/dist/core/asset-root.js +18 -0
- package/dist/core/broker-client/client.d.ts +0 -7
- package/dist/core/broker-client/client.js +4 -10
- package/dist/core/broker-client/transport-relay.d.ts +3 -4
- package/dist/core/broker-client/transport-relay.js +3 -4
- package/dist/core/canvas/__tests__/attention.test.js +1 -1
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +1 -1
- package/dist/core/canvas/__tests__/remote-transport.test.d.ts +1 -0
- package/dist/core/{view/__tests__/transport-remote.test.js → canvas/__tests__/remote-transport.test.js} +2 -2
- package/dist/core/canvas/__tests__/render-remote.test.js +1 -1
- package/dist/core/canvas/attention.js +4 -4
- package/dist/core/canvas/canvas.d.ts +6 -11
- package/dist/core/canvas/canvas.js +11 -33
- package/dist/core/canvas/db.js +207 -38
- package/dist/core/canvas/extensions.d.ts +1 -1
- package/dist/core/canvas/extensions.js +8 -1
- package/dist/core/canvas/index.d.ts +0 -1
- package/dist/core/canvas/index.js +0 -1
- package/dist/core/canvas/nav-model.d.ts +1 -1
- package/dist/core/canvas/nav-model.js +1 -1
- package/dist/core/canvas/paths.d.ts +5 -0
- package/dist/core/canvas/paths.js +16 -0
- package/dist/core/canvas/remote-canvas-source.js +2 -2
- package/dist/core/canvas/remote-transport.d.ts +7 -0
- package/dist/core/{view/transport-remote.js → canvas/remote-transport.js} +3 -4
- package/dist/core/canvas/source.js +1 -1
- package/dist/core/canvas/status-glyph.js +4 -12
- package/dist/core/canvas/types.d.ts +10 -35
- package/dist/core/clipboard-text.d.ts +8 -0
- package/dist/core/clipboard-text.js +18 -0
- package/dist/core/command-manifests/registry.d.ts +1 -3
- package/dist/core/command-plugins/bundle.d.ts +29 -0
- package/dist/core/command-plugins/bundle.js +198 -0
- package/dist/core/command-plugins/discovery.d.ts +0 -8
- package/dist/core/command-plugins/discovery.js +2 -39
- package/dist/core/command-plugins/transport/http-fetch.d.ts +4 -30
- package/dist/core/command-plugins/transport/http-fetch.js +17 -95
- package/dist/core/command.d.ts +1 -13
- package/dist/core/command.js +1 -16
- package/dist/core/config.d.ts +4 -0
- package/dist/core/config.js +28 -3
- package/dist/core/document-lines.d.ts +4 -0
- package/dist/core/document-lines.js +6 -0
- package/dist/core/feed/feed.d.ts +2 -0
- package/dist/core/feed/feed.js +11 -7
- package/dist/core/human/__tests__/inbox-cancel-worker.d.ts +1 -0
- package/dist/core/human/__tests__/inbox-cancel-worker.js +7 -0
- package/dist/core/human/__tests__/inbox-claim-worker.d.ts +1 -0
- package/dist/core/human/__tests__/inbox-claim-worker.js +17 -0
- package/dist/core/human/__tests__/inbox-core.test.d.ts +1 -0
- package/dist/core/human/__tests__/inbox-core.test.js +144 -0
- package/dist/core/human/__tests__/inbox-stale-claim-worker.d.ts +1 -0
- package/dist/core/human/__tests__/inbox-stale-claim-worker.js +8 -0
- package/dist/core/human/__tests__/visible-paths.test.d.ts +1 -0
- package/dist/{clients/attach → core/human}/__tests__/visible-paths.test.js +9 -0
- package/dist/core/human/claim.d.ts +23 -0
- package/dist/core/human/claim.js +67 -0
- package/dist/core/human/convention.d.ts +30 -0
- package/dist/core/human/convention.js +202 -0
- package/dist/core/human/deck-factories.d.ts +8 -0
- package/dist/core/human/deck-factories.js +15 -0
- package/dist/core/human/deck-schema.d.ts +70 -0
- package/dist/core/human/deck-schema.js +92 -0
- package/dist/core/human/root.d.ts +7 -0
- package/dist/core/human/root.js +37 -0
- package/dist/core/human/scan.d.ts +3 -0
- package/dist/core/human/scan.js +76 -0
- package/dist/core/human/summary.d.ts +8 -0
- package/dist/core/human/summary.js +44 -0
- package/dist/core/human/tickets.d.ts +49 -0
- package/dist/core/human/tickets.js +190 -0
- package/dist/core/human/types.d.ts +136 -0
- package/dist/core/human/types.js +5 -0
- package/dist/{clients/attach → core/human}/visible-paths.d.ts +1 -1
- package/dist/{clients/attach → core/human}/visible-paths.js +3 -2
- 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 +4 -5
- package/dist/core/inspector/core.js +3 -5
- package/dist/core/inspector/host.d.ts +46 -0
- package/dist/core/{tui → inspector}/host.js +42 -208
- package/dist/core/inspector/text.d.ts +2 -2
- package/dist/core/inspector/transport.d.ts +6 -0
- package/dist/core/inspector/transport.js +36 -0
- package/dist/core/inspector/tui.d.ts +2 -2
- package/dist/core/inspector/tui.js +15 -15
- package/dist/core/keybindings/__tests__/inbox-affordance.test.js +11 -11
- package/dist/core/keybindings/__tests__/resolve.test.js +10 -19
- package/dist/core/keybindings/attach-control.d.ts +9 -3
- package/dist/core/keybindings/attach-control.js +3 -1
- package/dist/core/keybindings/catalog.d.ts +6 -5
- package/dist/core/keybindings/catalog.js +61 -133
- package/dist/core/keybindings/inbox.d.ts +5 -6
- package/dist/core/keybindings/inbox.js +9 -10
- package/dist/core/keybindings/index.d.ts +3 -3
- package/dist/core/keybindings/index.js +3 -3
- package/dist/core/keybindings/persistence.d.ts +5 -1
- package/dist/core/keybindings/persistence.js +24 -6
- package/dist/core/keybindings/resolve.d.ts +6 -0
- package/dist/core/keybindings/resolve.js +10 -3
- package/dist/core/memory/inline-ref-grammar.js +2 -3
- package/dist/core/memory-resolver.d.ts +27 -29
- package/dist/core/memory-resolver.js +45 -39
- package/dist/core/model-routes.d.ts +33 -0
- package/dist/core/model-routes.js +42 -3
- package/dist/core/preview-registry.js +17 -55
- package/dist/core/profiles/select.js +3 -3
- package/dist/core/{view/remote-canvas-target.d.ts → remote-canvas-target.d.ts} +2 -2
- package/dist/core/{view/remote-canvas-target.js → remote-canvas-target.js} +4 -4
- package/dist/core/review/__tests__/capture-origin.test.d.ts +1 -0
- package/dist/core/review/__tests__/capture-origin.test.js +139 -0
- package/dist/core/review/__tests__/comments.test.d.ts +1 -0
- package/dist/core/review/__tests__/comments.test.js +98 -0
- package/dist/core/review/__tests__/project.test.d.ts +1 -0
- package/dist/core/review/__tests__/project.test.js +71 -0
- package/dist/core/review/__tests__/remap.test.d.ts +1 -0
- package/dist/core/review/__tests__/remap.test.js +159 -0
- package/dist/core/review/__tests__/stage-identity.test.d.ts +1 -0
- package/dist/core/review/__tests__/stage-identity.test.js +140 -0
- package/dist/core/review/birth.d.ts +7 -0
- package/dist/core/review/birth.js +23 -0
- package/dist/core/review/comments.d.ts +69 -0
- package/dist/core/review/comments.js +295 -0
- package/dist/core/review/companion.d.ts +35 -0
- package/dist/core/review/companion.js +205 -0
- package/dist/core/review/document.d.ts +27 -0
- package/dist/core/review/document.js +138 -0
- package/dist/core/review/project.d.ts +13 -0
- package/dist/core/review/project.js +58 -0
- package/dist/core/review/realize.d.ts +19 -0
- package/dist/core/review/realize.js +217 -0
- package/dist/core/review/remap.d.ts +24 -0
- package/dist/core/review/remap.js +156 -0
- package/dist/core/review/signal.d.ts +5 -0
- package/dist/core/review/signal.js +31 -0
- package/dist/core/review/stage.d.ts +26 -0
- package/dist/core/review/stage.js +184 -0
- package/dist/core/review/store.d.ts +46 -0
- package/dist/core/review/store.js +163 -0
- package/dist/core/review/ticket-filter.d.ts +17 -0
- package/dist/core/review/ticket-filter.js +32 -0
- package/dist/core/review/types.d.ts +130 -0
- package/dist/core/review/types.js +23 -0
- package/dist/core/runtime/__tests__/session-visibility.test.d.ts +1 -0
- package/dist/core/runtime/__tests__/session-visibility.test.js +119 -0
- package/dist/core/runtime/bearings.d.ts +5 -17
- package/dist/core/runtime/bearings.js +88 -71
- package/dist/core/runtime/broker-protocol.d.ts +31 -8
- package/dist/core/runtime/broker.d.ts +15 -1
- package/dist/core/runtime/broker.js +573 -141
- package/dist/core/runtime/canvas-extensions.d.ts +4 -5
- package/dist/core/runtime/canvas-extensions.js +5 -5
- package/dist/core/runtime/front-door.js +4 -4
- package/dist/core/runtime/headless-pi.d.ts +24 -0
- package/dist/core/runtime/headless-pi.js +152 -0
- package/dist/core/runtime/kickoff.d.ts +1 -5
- package/dist/core/runtime/kickoff.js +1 -5
- package/dist/core/runtime/model-registry.d.ts +3 -0
- package/dist/core/runtime/model-registry.js +13 -0
- package/dist/core/runtime/naming-persist.d.ts +4 -0
- package/dist/core/runtime/naming-persist.js +27 -1
- package/dist/core/runtime/naming.d.ts +17 -12
- package/dist/core/runtime/naming.js +91 -140
- package/dist/core/runtime/node-read.js +19 -10
- package/dist/core/runtime/nodes.d.ts +9 -14
- package/dist/core/runtime/nodes.js +3 -53
- package/dist/core/runtime/package-health.d.ts +6 -21
- package/dist/core/runtime/package-health.js +12 -123
- package/dist/core/runtime/placement-tmux.d.ts +2 -1
- package/dist/core/runtime/placement-tmux.js +6 -4
- package/dist/core/runtime/placement.d.ts +1 -0
- package/dist/core/runtime/placement.js +4 -8
- package/dist/core/runtime/promote.js +3 -0
- package/dist/core/runtime/recap.d.ts +2 -7
- package/dist/core/runtime/recap.js +35 -69
- package/dist/core/runtime/revive.js +34 -77
- package/dist/core/runtime/session-cycles.d.ts +4 -0
- package/dist/core/runtime/session-cycles.js +14 -1
- package/dist/core/runtime/session-visibility.d.ts +37 -0
- package/dist/core/runtime/session-visibility.js +83 -0
- package/dist/core/runtime/spawn.js +10 -22
- package/dist/core/runtime/stop-guard.d.ts +1 -1
- package/dist/core/runtime/stop-guard.js +18 -13
- package/dist/core/runtime/surface-bg.js +1 -1
- package/dist/core/runtime/tmux-chrome.d.ts +1 -1
- package/dist/core/runtime/tmux-chrome.js +1 -1
- package/dist/core/runtime/tmux.d.ts +35 -7
- package/dist/core/runtime/tmux.js +439 -62
- package/dist/core/runtime/tool-group-summary.d.ts +19 -0
- package/dist/core/runtime/tool-group-summary.js +88 -0
- package/dist/core/scope.d.ts +2 -7
- package/dist/core/scope.js +9 -35
- package/dist/core/substrate/schema.d.ts +2 -2
- 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 +12 -0
- package/dist/core/termrender/display.js +19 -0
- package/dist/core/termrender/termrender.d.ts +73 -0
- package/dist/core/termrender/termrender.js +795 -0
- package/dist/core/termrender/version.d.ts +1 -0
- package/dist/core/termrender/version.js +1 -0
- package/dist/core/tui/terminal.js +1 -2
- package/dist/core/user-settings.d.ts +71 -3
- package/dist/core/user-settings.js +83 -1
- package/dist/daemon/api/__tests__/inbox.test.js +44 -133
- package/dist/daemon/api/handlers/human.d.ts +0 -10
- package/dist/daemon/api/handlers/human.js +104 -702
- package/dist/daemon/api/handlers/inbox.js +113 -142
- package/dist/daemon/api/handlers/review-comments.d.ts +2 -0
- package/dist/daemon/api/handlers/review-comments.js +500 -0
- package/dist/daemon/api/handlers/reviews.d.ts +2 -0
- package/dist/daemon/api/handlers/reviews.js +287 -0
- package/dist/daemon/api/map.d.ts +22 -7
- package/dist/daemon/api/map.js +159 -11
- package/dist/daemon/api/server.js +4 -0
- package/dist/daemon/cron-run.js +6 -9
- package/dist/daemon/crtrd.js +17 -33
- package/dist/daemon/fleet.d.ts +1 -8
- package/dist/daemon/fleet.js +4 -30
- package/dist/daemon/human/finish.d.ts +14 -0
- package/dist/daemon/human/finish.js +115 -0
- package/dist/daemon/human/sweep.d.ts +6 -0
- package/dist/daemon/human/sweep.js +49 -0
- package/dist/daemon/messaging/node-message.d.ts +18 -0
- package/dist/daemon/messaging/node-message.js +70 -0
- package/dist/daemon/review/comment-notify.d.ts +26 -0
- package/dist/daemon/review/comment-notify.js +107 -0
- package/dist/daemon/review/deliver.d.ts +7 -0
- package/dist/daemon/review/deliver.js +56 -0
- package/dist/daemon/review/finish.d.ts +22 -0
- package/dist/daemon/review/finish.js +254 -0
- package/dist/daemon/review/sweep.d.ts +11 -0
- package/dist/daemon/review/sweep.js +120 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -2
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +42 -64
- package/dist/pi-extensions/__tests__/canvas-recap.test.d.ts +1 -0
- package/dist/pi-extensions/__tests__/canvas-recap.test.js +159 -0
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +16 -38
- package/dist/pi-extensions/__tests__/canvas-structured-output.test.d.ts +1 -0
- package/dist/pi-extensions/__tests__/canvas-structured-output.test.js +63 -0
- package/dist/pi-extensions/canvas-context-intro.d.ts +8 -11
- package/dist/pi-extensions/canvas-context-intro.js +50 -104
- package/dist/pi-extensions/canvas-recap.d.ts +15 -2
- package/dist/pi-extensions/canvas-recap.js +192 -69
- package/dist/pi-extensions/canvas-review-boundary.d.ts +59 -0
- package/dist/pi-extensions/canvas-review-boundary.js +81 -0
- package/dist/pi-extensions/canvas-stophook.d.ts +3 -3
- package/dist/pi-extensions/canvas-stophook.js +78 -128
- package/dist/pi-extensions/canvas-structured-output.js +52 -8
- package/dist/shared/generated-context.d.ts +29 -4
- package/dist/shared/generated-context.js +122 -7
- package/dist/shared/tool-groups.d.ts +23 -0
- package/dist/shared/tool-groups.js +60 -0
- package/dist/shared/working-activity.d.ts +8 -0
- package/dist/shared/working-activity.js +26 -0
- package/dist/types.d.ts +36 -2
- package/dist/types.js +51 -0
- package/dist/web-client/assets/index-CCPaLeW7.css +2 -0
- package/dist/web-client/assets/index-kyOWsnZK.js +86 -0
- package/dist/web-client/index.html +2 -2
- package/dist/web-client/sw.js +1 -1
- package/docs/compat/hearth-crtr-v4.md +2 -2
- package/docs/compat/hearth-crtr-v5.md +4 -2
- package/docs/public-api.md +3 -3
- package/package.json +21 -14
- package/runtime.lock.json +4661 -1453
- package/scripts/postinstall.mjs +15 -2
- package/dist/builtin-pi-packages/pi-mode-switch/README.md +0 -36
- package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +0 -36
- package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +0 -449
- package/dist/builtin-pi-packages/pi-mode-switch/package.json +0 -14
- package/dist/builtin-pi-packages/pi-mode-switch/tsconfig.json +0 -9
- package/dist/builtin-views/_lib/states.mjs +0 -161
- package/dist/builtin-views/canvas/core.mjs +0 -657
- package/dist/builtin-views/canvas/text.mjs +0 -58
- package/dist/builtin-views/canvas/tui.mjs +0 -168
- package/dist/builtin-views/canvas/web.jsx +0 -121
- package/dist/builtin-views/chat/core.mjs +0 -684
- package/dist/builtin-views/chat/text.mjs +0 -101
- package/dist/builtin-views/chat/tui.mjs +0 -360
- package/dist/builtin-views/chat/web.jsx +0 -362
- package/dist/builtin-views/git-pr/core.mjs +0 -673
- package/dist/builtin-views/git-pr/text.mjs +0 -84
- package/dist/builtin-views/git-pr/tui.mjs +0 -301
- package/dist/builtin-views/git-pr/web.jsx +0 -216
- package/dist/builtin-views/inbox/_lib/render.mjs +0 -175
- package/dist/builtin-views/inbox/core.mjs +0 -1273
- package/dist/builtin-views/inbox/text.mjs +0 -73
- package/dist/builtin-views/inbox/tui.mjs +0 -314
- package/dist/builtin-views/inbox/web.jsx +0 -188
- package/dist/builtin-views/linkedin/core.mjs +0 -906
- package/dist/builtin-views/linkedin/text.mjs +0 -69
- package/dist/builtin-views/linkedin/tui.mjs +0 -413
- package/dist/builtin-views/linkedin/web.jsx +0 -206
- package/dist/builtin-views/prompt-review/core.mjs +0 -735
- package/dist/builtin-views/prompt-review/text.mjs +0 -15
- package/dist/builtin-views/prompt-review/tui.mjs +0 -196
- package/dist/builtin-views/prompt-review/web.jsx +0 -484
- package/dist/builtin-views/workspace-sidebar/__tests__/core.test.js +0 -50
- package/dist/builtin-views/workspace-sidebar/__tests__/core.test.ts +0 -53
- package/dist/builtin-views/workspace-sidebar/core.mjs +0 -670
- package/dist/builtin-views/workspace-sidebar/text.mjs +0 -53
- package/dist/builtin-views/workspace-sidebar/tui.mjs +0 -141
- package/dist/builtin-views/workspace-sidebar/web.jsx +0 -109
- package/dist/clients/attach/session/mode.d.ts +0 -25
- package/dist/clients/attach/session/mode.js +0 -97
- package/dist/commands/sys/promptstudio.d.ts +0 -2
- package/dist/commands/sys/promptstudio.js +0 -65
- package/dist/commands/view-cycle.d.ts +0 -2
- package/dist/commands/view-cycle.js +0 -130
- package/dist/commands/view-list.d.ts +0 -2
- package/dist/commands/view-list.js +0 -66
- package/dist/commands/view-new.d.ts +0 -2
- package/dist/commands/view-new.js +0 -74
- package/dist/commands/view-pick.d.ts +0 -6
- package/dist/commands/view-pick.js +0 -129
- package/dist/commands/view-run.d.ts +0 -2
- package/dist/commands/view-run.js +0 -214
- package/dist/commands/view.d.ts +0 -2
- package/dist/commands/view.js +0 -31
- package/dist/commands/workspace.d.ts +0 -2
- package/dist/commands/workspace.js +0 -165
- package/dist/core/__tests__/chat-view-reconnect.test.js +0 -105
- package/dist/core/__tests__/full/consult-startup-failure.test.js +0 -124
- package/dist/core/canvas/__tests__/human-work-outbox.test.js +0 -123
- package/dist/core/canvas/human-work-outbox.d.ts +0 -73
- package/dist/core/canvas/human-work-outbox.js +0 -261
- package/dist/core/command-plugins/store.d.ts +0 -16
- package/dist/core/command-plugins/store.js +0 -64
- package/dist/core/keybindings/__tests__/bespoke-consumers.test.js +0 -40
- package/dist/core/runtime/fault-recovery-nudge.d.ts +0 -3
- package/dist/core/runtime/fault-recovery-nudge.js +0 -3
- package/dist/core/tui/__tests__/host-keybindings.test.js +0 -113
- package/dist/core/tui/host.d.ts +0 -66
- package/dist/core/view/__tests__/transport-cache.test.js +0 -62
- package/dist/core/view/bridge.d.ts +0 -10
- package/dist/core/view/bridge.js +0 -31
- package/dist/core/view/chrome.d.ts +0 -9
- package/dist/core/view/chrome.js +0 -22
- package/dist/core/view/contract.d.ts +0 -205
- package/dist/core/view/contract.js +0 -23
- package/dist/core/view/loader.d.ts +0 -31
- package/dist/core/view/loader.js +0 -188
- package/dist/core/view/stream-local.d.ts +0 -3
- package/dist/core/view/stream-local.js +0 -231
- package/dist/core/view/transport-cache.d.ts +0 -8
- package/dist/core/view/transport-cache.js +0 -38
- package/dist/core/view/transport-local.d.ts +0 -7
- package/dist/core/view/transport-local.js +0 -83
- package/dist/core/view/transport-remote.d.ts +0 -2
- package/dist/core/view/transport.d.ts +0 -10
- package/dist/core/view/transport.js +0 -15
- package/dist/pi-extensions/naming-tool.d.ts +0 -24
- package/dist/pi-extensions/naming-tool.js +0 -67
- package/dist/prompts/view.d.ts +0 -7
- package/dist/prompts/view.js +0 -172
- package/dist/web/ViewChrome.d.ts +0 -7
- package/dist/web/ViewChrome.js +0 -28
- package/dist/web/ViewPane.d.ts +0 -39
- package/dist/web/ViewPane.js +0 -48
- package/dist/web/index.d.ts +0 -8
- package/dist/web/index.js +0 -22
- package/dist/web/runtime.d.ts +0 -39
- package/dist/web/runtime.js +0 -232
- package/dist/web/states.d.ts +0 -24
- package/dist/web/states.js +0 -24
- package/dist/web/transport-http.d.ts +0 -5
- package/dist/web/transport-http.js +0 -34
- package/dist/web/transport-stream.d.ts +0 -3
- package/dist/web/transport-stream.js +0 -204
- package/dist/web-client/assets/index-U_NZ66VE.js +0 -79
- package/dist/web-client/assets/index-aaeu4adv.css +0 -2
- /package/dist/{builtin-views/workspace-sidebar/__tests__/core.test.d.ts → clients/attach/__tests__/file-review-focus.test.d.ts} +0 -0
- /package/dist/clients/attach/__tests__/{visible-paths.test.d.ts → group-activity.test.d.ts} +0 -0
- /package/dist/{core/__tests__/chat-view-reconnect.test.d.ts → clients/attach/__tests__/input-controller-extension-command.test.d.ts} +0 -0
- /package/dist/{core/__tests__/full/consult-startup-failure.test.d.ts → clients/attach/__tests__/session-identity-refresh.test.d.ts} +0 -0
- /package/dist/{core/canvas/__tests__/human-work-outbox.test.d.ts → clients/inbox/__tests__/inbox-controller.test.d.ts} +0 -0
- /package/dist/{core/keybindings/__tests__/bespoke-consumers.test.d.ts → clients/inbox/__tests__/mount-panel.test.d.ts} +0 -0
- /package/dist/{core/tui/__tests__/host-keybindings.test.d.ts → clients/inbox/review/__tests__/editor-roundtrip.test.d.ts} +0 -0
- /package/dist/{core/view/__tests__/transport-cache.test.d.ts → clients/inbox/review/__tests__/remap.test.d.ts} +0 -0
- /package/dist/{core/view/__tests__/transport-remote.test.d.ts → clients/inbox/review/__tests__/review-core.test.d.ts} +0 -0
|
@@ -199,44 +199,44 @@ test('tmux installer remaps owned pairs and preserves occupied user bindings', (
|
|
|
199
199
|
// item name between the previous group and the header).
|
|
200
200
|
assert.ok((defaultMenu.match(/'' "-#\[bold\]/g) ?? []).length >= 3, defaultMenu);
|
|
201
201
|
assert.ok(defaultMenu.indexOf('promote to orchestrator') > defaultMenu.indexOf('-#[bold]Lifecycle'));
|
|
202
|
-
assert.match(defaultMenu, /"create ›"
|
|
202
|
+
assert.match(defaultMenu, /"create ›" c .*display-menu.*idea.*bug/);
|
|
203
203
|
assert.match(defaultMenu, /"Alt\+C to close" M-c refresh-client/);
|
|
204
204
|
const explore = defaultMenu.indexOf('-#[bold]Explore');
|
|
205
205
|
const currentNode = defaultMenu.indexOf('-#[bold]Current node');
|
|
206
206
|
const lifecycle = defaultMenu.indexOf('-#[bold]Lifecycle');
|
|
207
207
|
const system = defaultMenu.indexOf('-#[bold]System');
|
|
208
|
-
for (const item of ['
|
|
208
|
+
for (const item of ['find node', 'canvas graph', 'go to manager', 'inspect ›', 'display ›']) {
|
|
209
209
|
assert.ok(defaultMenu.indexOf(item) > explore && defaultMenu.indexOf(item) < currentNode, `${item} belongs in Explore`);
|
|
210
210
|
}
|
|
211
|
-
assert.match(defaultMenu, /"
|
|
212
|
-
for (const item of ['background bash
|
|
211
|
+
assert.match(defaultMenu, /"inspect ›" i .*display-menu.*metadata.*context \+ reports/);
|
|
212
|
+
for (const item of ['background running bash', 'copy node id']) {
|
|
213
213
|
assert.ok(defaultMenu.indexOf(item) > currentNode && defaultMenu.indexOf(item) < lifecycle, `${item} belongs to the current node`);
|
|
214
214
|
}
|
|
215
215
|
assert.ok(defaultMenu.indexOf('fork into idle root') > lifecycle && defaultMenu.indexOf('fork into idle root') < system, 'fork belongs in Lifecycle');
|
|
216
|
-
assert.match(defaultMenu, /"
|
|
217
|
-
assert.match(defaultMenu, /"attach ›" a .*display-menu.*search profile files/);
|
|
216
|
+
assert.match(defaultMenu, /"display ›" z .*display-menu.*fold finished tool calls/);
|
|
217
|
+
assert.match(defaultMenu, /"attach viewer ›" a .*display-menu.*search profile files/);
|
|
218
|
+
// File review is reachable from the top-level menu and alt+shift+R only:
|
|
219
|
+
// its attach-submenu selector ships unbound, so the row must not render.
|
|
220
|
+
assert.doesNotMatch(defaultMenu, /"review a file" r /);
|
|
218
221
|
assert.match(defaultMenu, /send-keys -l/);
|
|
219
222
|
assert.match(defaultMenu, /crtr\.attach\.profile-files/, 'the menu path must work while the profile-files direct binding is disabled by default');
|
|
220
|
-
// Matched with its selector, so the Explore group's "
|
|
221
|
-
//
|
|
222
|
-
assert.ok(defaultMenu.indexOf('settings
|
|
223
|
+
// Matched with its selector, so the Explore group's "display ›" item
|
|
224
|
+
// cannot satisfy this assertion by substring.
|
|
225
|
+
assert.ok(defaultMenu.indexOf('settings , ') > system, 'settings belongs in System');
|
|
223
226
|
assert.ok(defaultMenu.indexOf('create ›') > system, 'create belongs in System');
|
|
224
|
-
assert.match(tmuxBinding(socket, 'root', 'M-v') ?? '', /switch-client/);
|
|
225
227
|
// The inbox toggle installs at its default key (alt+i → M-i) in the same sweep.
|
|
226
|
-
assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /
|
|
228
|
+
assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /crtr human inbox toggle/);
|
|
227
229
|
const attachMenuDisabled = Object.fromEntries(ATTACH_CONTROL_BINDINGS.map(({ menuId }) => [menuId, []]));
|
|
228
230
|
const withoutAttach = installTmuxBindings(resolveKeybindings(attachMenuDisabled));
|
|
229
231
|
assert.equal(withoutAttach.ok, true, JSON.stringify(withoutAttach.diagnostics));
|
|
230
232
|
const menuWithoutAttach = tmuxBinding(socket, 'root', 'M-c') ?? '';
|
|
231
|
-
assert.doesNotMatch(menuWithoutAttach, /attach ›/, 'an empty attach submenu must hide its opener');
|
|
233
|
+
assert.doesNotMatch(menuWithoutAttach, /attach viewer ›/, 'an empty attach submenu must hide its opener');
|
|
232
234
|
assert.doesNotMatch(menuWithoutAttach, /search profile files/);
|
|
233
235
|
const remapped = installTmuxBindings(resolveKeybindings({
|
|
234
236
|
'crtr.tmux.menu.open': ['alt+shift+z'],
|
|
235
237
|
'crtr.tmux.menu.graph': ['shift+z'],
|
|
236
238
|
'crtr.tmux.menu-global.fold-tools': ['alt+shift+f'],
|
|
237
239
|
'crtr.tmux.node.next': [],
|
|
238
|
-
'crtr.tmux.view.next': ['alt+z > n'],
|
|
239
|
-
'crtr.tmux.view.previous': ['alt+z > p'],
|
|
240
240
|
}));
|
|
241
241
|
assert.equal(remapped.ok, true, JSON.stringify(remapped.diagnostics));
|
|
242
242
|
assert.equal(tmuxBinding(socket, 'root', 'M-c'), null);
|
|
@@ -247,16 +247,12 @@ test('tmux installer remaps owned pairs and preserves occupied user bindings', (
|
|
|
247
247
|
assert.match(foldTools, /fold-tools/);
|
|
248
248
|
assert.doesNotMatch(foldTools, /#\{pane_id\}/);
|
|
249
249
|
const menu = tmuxBinding(socket, 'root', 'M-S-Z') ?? '';
|
|
250
|
-
assert.match(menu, /graph
|
|
250
|
+
assert.match(menu, /canvas graph/);
|
|
251
251
|
assert.match(menu, /Z/);
|
|
252
252
|
assert.match(menu, /"Alt\+Shift\+Z to close" M-S-Z refresh-client/);
|
|
253
|
-
const prefix = tmuxBinding(socket, 'root', 'M-z') ?? '';
|
|
254
|
-
assert.match(prefix, /switch-client/);
|
|
255
253
|
const again = installTmuxBindings(resolveKeybindings({
|
|
256
254
|
'crtr.tmux.menu.open': ['alt+shift+y'],
|
|
257
255
|
'crtr.tmux.node.next': [],
|
|
258
|
-
'crtr.tmux.view.next': ['alt+z > n'],
|
|
259
|
-
'crtr.tmux.view.previous': ['alt+z > p'],
|
|
260
256
|
}));
|
|
261
257
|
assert.equal(again.ok, true, JSON.stringify(again.diagnostics));
|
|
262
258
|
isolatedTmux(socket, ['bind-key', '-T', 'root', 'M-S-Z', 'display-message', 'user-owned']);
|
|
@@ -297,11 +293,11 @@ test('tmux installer replaces an untracked stale crouter menu even when a partia
|
|
|
297
293
|
]);
|
|
298
294
|
const stale = tmuxBinding(socket, 'root', 'M-c') ?? '';
|
|
299
295
|
assert.match(stale, /crtr canvas chord/);
|
|
300
|
-
assert.doesNotMatch(stale, /background bash
|
|
296
|
+
assert.doesNotMatch(stale, /background running bash/);
|
|
301
297
|
const result = installTmuxBindings(resolveKeybindings());
|
|
302
298
|
assert.equal(result.ok, true, JSON.stringify(result.diagnostics));
|
|
303
299
|
assert.ok(!result.diagnostics.some((d) => d.bindingId === 'crtr.tmux.menu.open'), JSON.stringify(result.diagnostics));
|
|
304
|
-
assert.match(tmuxBinding(socket, 'root', 'M-c') ?? '', /background bash
|
|
300
|
+
assert.match(tmuxBinding(socket, 'root', 'M-c') ?? '', /background running bash/);
|
|
305
301
|
}
|
|
306
302
|
finally {
|
|
307
303
|
if (priorTmux === undefined)
|
|
@@ -340,7 +336,7 @@ test('tmux installer rebinds/disables the inbox toggle and adopts the legacy hl-
|
|
|
340
336
|
assert.equal(first.ok, true, JSON.stringify(first.diagnostics));
|
|
341
337
|
// Adopted, not foreign: M-i is now crouter's inbox toggle, no occupied diag.
|
|
342
338
|
assert.ok(!first.diagnostics.some((d) => d.bindingId === 'crtr.tmux.inbox.toggle'), JSON.stringify(first.diagnostics));
|
|
343
|
-
assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /
|
|
339
|
+
assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /crtr human inbox toggle/);
|
|
344
340
|
assert.ok(first.installed.some((pair) => pair.table === 'root' && pair.key === 'M-i'));
|
|
345
341
|
// The obsolete flat key file is deleted by the cleanup.
|
|
346
342
|
assert.equal(existsSync(legacyKeyFile), false, 'legacy inbox-key file should be removed');
|
|
@@ -349,7 +345,7 @@ test('tmux installer rebinds/disables the inbox toggle and adopts the legacy hl-
|
|
|
349
345
|
const rebound = installTmuxBindings(resolveKeybindings({ 'crtr.tmux.inbox.toggle': ['alt+j'] }));
|
|
350
346
|
assert.equal(rebound.ok, true, JSON.stringify(rebound.diagnostics));
|
|
351
347
|
assert.equal(tmuxBinding(socket, 'root', 'M-i'), null);
|
|
352
|
-
assert.match(tmuxBinding(socket, 'root', 'M-j') ?? '', /
|
|
348
|
+
assert.match(tmuxBinding(socket, 'root', 'M-j') ?? '', /crtr human inbox toggle/);
|
|
353
349
|
// Disable via empty gesture list: no inbox key installed at all, no error.
|
|
354
350
|
const disabled = installTmuxBindings(resolveKeybindings({ 'crtr.tmux.inbox.toggle': [] }));
|
|
355
351
|
assert.equal(disabled.ok, true, JSON.stringify(disabled.diagnostics));
|
|
@@ -399,7 +395,7 @@ test('tmux installer adopts the legacy hl-owned inbox key when a crouter manifes
|
|
|
399
395
|
// Cleanup ran despite the existing manifest: M-i is crouter's tracked inbox
|
|
400
396
|
// toggle, no occupied/foreign diagnostic, and the key file is gone.
|
|
401
397
|
assert.ok(!result.diagnostics.some((d) => d.bindingId === 'crtr.tmux.inbox.toggle'), JSON.stringify(result.diagnostics));
|
|
402
|
-
assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /
|
|
398
|
+
assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /crtr human inbox toggle/);
|
|
403
399
|
assert.ok(result.installed.some((pair) => pair.table === 'root' && pair.key === 'M-i'));
|
|
404
400
|
assert.equal(existsSync(legacyKeyFile), false, 'legacy inbox-key file should be removed');
|
|
405
401
|
}
|
|
@@ -446,7 +442,7 @@ test('tmux installer removes a legacy custom inbox key recorded in the state fil
|
|
|
446
442
|
// The orphaned custom-key binding is gone — not left as an untracked live
|
|
447
443
|
// shortcut — and was not imported into crouter's config (M-z stays unbound).
|
|
448
444
|
assert.equal(tmuxBinding(socket, 'root', 'M-z'), null, 'legacy custom key must be unbound');
|
|
449
|
-
assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /
|
|
445
|
+
assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /crtr human inbox toggle/);
|
|
450
446
|
assert.equal(existsSync(legacyKeyFile), false, 'legacy inbox-key file should be removed');
|
|
451
447
|
}
|
|
452
448
|
finally {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** The source or runtime directory containing every shipped asset tree.
|
|
2
|
+
*
|
|
3
|
+
* `import.meta.url` names the module when loaded directly, but names the
|
|
4
|
+
* attach viewer bundle when esbuild inlines this module. Walking to the
|
|
5
|
+
* directory marked by the built-in assets preserves one resolution rule for
|
|
6
|
+
* both loading contexts. */
|
|
7
|
+
export declare function assetRoot(): string;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
/** The source or runtime directory containing every shipped asset tree.
|
|
5
|
+
*
|
|
6
|
+
* `import.meta.url` names the module when loaded directly, but names the
|
|
7
|
+
* attach viewer bundle when esbuild inlines this module. Walking to the
|
|
8
|
+
* directory marked by the built-in assets preserves one resolution rule for
|
|
9
|
+
* both loading contexts. */
|
|
10
|
+
export function assetRoot() {
|
|
11
|
+
for (let current = dirname(fileURLToPath(import.meta.url));; current = dirname(current)) {
|
|
12
|
+
if (existsSync(join(current, 'builtin-memory')) && existsSync(join(current, 'builtin-pi-packages')))
|
|
13
|
+
return current;
|
|
14
|
+
const parent = dirname(current);
|
|
15
|
+
if (parent === current)
|
|
16
|
+
throw new Error(`cannot locate crouter assets from ${import.meta.url}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -16,12 +16,6 @@ export interface BrokerClientOptions {
|
|
|
16
16
|
* to attach a remote node instead; every method behaves identically either
|
|
17
17
|
* way. */
|
|
18
18
|
transport?: Transport;
|
|
19
|
-
/** Re-emit a `data` frame that matches no in-flight request as a generic
|
|
20
|
-
* `frame` event. OFF by default: the attach viewer's frame router would
|
|
21
|
-
* mis-handle a stray `data` frame as a pi `AgentSessionEvent`. The operator
|
|
22
|
-
* view (`core/view/stream-local.ts`) passes read-op replies through to its
|
|
23
|
-
* own consumer and is the one caller that needs `true`. */
|
|
24
|
-
emitUnmatchedDataFrames?: boolean;
|
|
25
19
|
}
|
|
26
20
|
/** The reconnect supervisor's give-up predicate (extracted pure so it is
|
|
27
21
|
* testable without a socket or TUI). After a broker close the viewer KEEPS
|
|
@@ -51,7 +45,6 @@ export interface BrokerClient {
|
|
|
51
45
|
export declare class BrokerClient extends EventEmitter {
|
|
52
46
|
private readonly nodeId;
|
|
53
47
|
private readonly transport;
|
|
54
|
-
private readonly emitUnmatchedDataFrames;
|
|
55
48
|
private closeEmitted;
|
|
56
49
|
/** Tracks live connect↔close state so {@link request} can fail fast on a
|
|
57
50
|
* dead/absent connection rather than parking a promise the reply will
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// client.ts — THE broker protocol client. Every Node process that talks to a
|
|
2
2
|
// node's broker over `view.sock` uses this one class: the `crtr surface attach`
|
|
3
|
-
// viewer, `
|
|
4
|
-
//
|
|
3
|
+
// viewer, `auth-reload`, `model-swap`, and the human-prompt dequeue path.
|
|
4
|
+
// (The browser has its own module under
|
|
5
5
|
// `clients/web/web-client/` until that is made isomorphic — see the target
|
|
6
6
|
// architecture note; `daemon/api/bridge.ts` is a byte relay, not a client.)
|
|
7
7
|
//
|
|
@@ -57,7 +57,6 @@ export function reconnectShouldGiveUp(row) {
|
|
|
57
57
|
export class BrokerClient extends EventEmitter {
|
|
58
58
|
nodeId;
|
|
59
59
|
transport;
|
|
60
|
-
emitUnmatchedDataFrames;
|
|
61
60
|
closeEmitted = false;
|
|
62
61
|
/** Tracks live connect↔close state so {@link request} can fail fast on a
|
|
63
62
|
* dead/absent connection rather than parking a promise the reply will
|
|
@@ -76,7 +75,6 @@ export class BrokerClient extends EventEmitter {
|
|
|
76
75
|
constructor(nodeId, options = {}) {
|
|
77
76
|
super();
|
|
78
77
|
this.nodeId = nodeId;
|
|
79
|
-
this.emitUnmatchedDataFrames = options.emitUnmatchedDataFrames ?? false;
|
|
80
78
|
this.transport = options.transport ?? new SocketTransport(nodeId);
|
|
81
79
|
this.transport.on('connect', () => {
|
|
82
80
|
this.closeEmitted = false;
|
|
@@ -148,9 +146,8 @@ export class BrokerClient extends EventEmitter {
|
|
|
148
146
|
// would otherwise treat a `data` frame as an AgentSessionEvent). A `data`
|
|
149
147
|
// frame is ALWAYS a reply, so by default it is swallowed unconditionally —
|
|
150
148
|
// even a late post-timeout one (no pending entry) is dropped, never leaked
|
|
151
|
-
// to the router
|
|
152
|
-
//
|
|
153
|
-
// an uncorrelated error still flows through.
|
|
149
|
+
// to the router. An `error` is correlated only when its `id` matches an
|
|
150
|
+
// in-flight request; an uncorrelated error still flows through.
|
|
154
151
|
if (frame.type === 'data') {
|
|
155
152
|
const entry = typeof frame.id === 'string' ? this.pending.get(frame.id) : undefined;
|
|
156
153
|
if (entry) {
|
|
@@ -158,9 +155,6 @@ export class BrokerClient extends EventEmitter {
|
|
|
158
155
|
clearTimeout(entry.timer);
|
|
159
156
|
entry.resolve(frame);
|
|
160
157
|
}
|
|
161
|
-
else if (this.emitUnmatchedDataFrames) {
|
|
162
|
-
this.emit('frame', frame);
|
|
163
|
-
}
|
|
164
158
|
return;
|
|
165
159
|
}
|
|
166
160
|
if (frame.type === 'error' && typeof frame.id === 'string' && this.pending.has(frame.id)) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EventEmitter } from 'node:events';
|
|
2
2
|
import type { ClientToBroker } from '../runtime/broker-protocol.js';
|
|
3
3
|
import { type Transport } from './transport.js';
|
|
4
|
-
/** A resolved remote canvas target — see `core/
|
|
4
|
+
/** A resolved remote canvas target — see `core/remote-canvas-target.ts` for how
|
|
5
5
|
* this is assembled from config (`relayTokenRef`) plus the 0600 secrets store
|
|
6
6
|
* via `resolveRemoteCanvasTarget`. This transport itself never takes the
|
|
7
7
|
* token from argv — `canvas config add --relay-token -` is the only accepted
|
|
@@ -29,9 +29,8 @@ export declare class RelayTransport extends EventEmitter implements Transport {
|
|
|
29
29
|
destroy(): void;
|
|
30
30
|
private onMessage;
|
|
31
31
|
private onError;
|
|
32
|
-
/** WS close codes mirror the
|
|
33
|
-
*
|
|
34
|
-
* transport-stream.ts`'s `classifyClose`): 1008 invalid id, or a 1011 whose
|
|
32
|
+
/** WS close codes mirror the browser relay client's semantics: 1008 invalid
|
|
33
|
+
* id, or a 1011 whose
|
|
35
34
|
* REASON starts with "no running broker"/"no node " (the relay's exact
|
|
36
35
|
* wording — `src/clients/web/server.ts`), are the terminal "gone" signals —
|
|
37
36
|
* surfaced as BrokerUnavailableError so the reconnect supervisor's normal
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
//
|
|
14
14
|
// The relay token is the SAME in-guest credential model-auth-front already
|
|
15
15
|
// gates on; holding it is the in-guest trust tier, not a new one. Callers
|
|
16
|
-
// must keep it off argv/shell history (see `core/
|
|
16
|
+
// must keep it off argv/shell history (see `core/remote-canvas-target.ts`) — this
|
|
17
17
|
// transport only ever sends it as a request header, never logs it.
|
|
18
18
|
import { EventEmitter } from 'node:events';
|
|
19
19
|
import { WebSocket } from 'ws';
|
|
@@ -132,9 +132,8 @@ export class RelayTransport extends EventEmitter {
|
|
|
132
132
|
this.emitError(new Error(`relay transport error: ${err.message}`));
|
|
133
133
|
// 'close' follows 'error'; teardown converges there.
|
|
134
134
|
}
|
|
135
|
-
/** WS close codes mirror the
|
|
136
|
-
*
|
|
137
|
-
* transport-stream.ts`'s `classifyClose`): 1008 invalid id, or a 1011 whose
|
|
135
|
+
/** WS close codes mirror the browser relay client's semantics: 1008 invalid
|
|
136
|
+
* id, or a 1011 whose
|
|
138
137
|
* REASON starts with "no running broker"/"no node " (the relay's exact
|
|
139
138
|
* wording — `src/clients/web/server.ts`), are the terminal "gone" signals —
|
|
140
139
|
* surfaced as BrokerUnavailableError so the reconnect supervisor's normal
|
|
@@ -4,7 +4,7 @@ import assert from 'node:assert/strict';
|
|
|
4
4
|
import { mkdtempSync, rmSync, mkdirSync } from 'node:fs';
|
|
5
5
|
import { tmpdir } from 'node:os';
|
|
6
6
|
import { join } from 'node:path';
|
|
7
|
-
import { atomicWriteJson, deckPath } from '
|
|
7
|
+
import { atomicWriteJson, deckPath } from '../../human/convention.js';
|
|
8
8
|
import { createNode } from '../canvas.js';
|
|
9
9
|
import { closeDb } from '../db.js';
|
|
10
10
|
import { nodeDir } from '../paths.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// remote-canvas-source.test.ts — `RemoteCanvasSource` (`../remote-canvas-source.ts`)
|
|
2
2
|
// over its real wire contract: a POST to `/__crtr/source` carrying
|
|
3
|
-
// `{kind:'exec', bin, args}` (see
|
|
3
|
+
// `{kind:'exec', bin, args}` (see `../remote-transport.ts`), bearer-
|
|
4
4
|
// authed. Mirrors `src/core/broker-client/__tests__/transport-relay.test.ts`'s
|
|
5
5
|
// `startMockRelay` shape — a plain `node:http` server standing in for the
|
|
6
6
|
// remote canvas's `/__crtr/source` endpoint, recording every request so
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// transport
|
|
1
|
+
// remote-transport.test.ts — `createRemoteExec` (`../remote-transport.ts`), the
|
|
2
2
|
// Node-side POST transport `RemoteCanvasSource` shells every remote read
|
|
3
3
|
// through. Covers the one thing a bare `fetch(...)` with no
|
|
4
4
|
// AbortController/timeout doesn't give you for free: a hung endpoint fails
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { test } from 'node:test';
|
|
9
9
|
import assert from 'node:assert/strict';
|
|
10
10
|
import { createServer } from 'node:http';
|
|
11
|
-
import { createRemoteExec } from '../transport
|
|
11
|
+
import { createRemoteExec } from '../remote-transport.js';
|
|
12
12
|
function startStalledServer() {
|
|
13
13
|
return new Promise((resolve) => {
|
|
14
14
|
// Accept the connection but never write a response — the request just
|
|
@@ -19,7 +19,7 @@ import { createServer } from 'node:http';
|
|
|
19
19
|
import { mkdtempSync, rmSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
20
20
|
import { tmpdir } from 'node:os';
|
|
21
21
|
import { join } from 'node:path';
|
|
22
|
-
import { atomicWriteJson, deckPath } from '
|
|
22
|
+
import { atomicWriteJson, deckPath } from '#core/human/convention';
|
|
23
23
|
import { RemoteCanvasSource } from '../remote-canvas-source.js';
|
|
24
24
|
import { dashboardRowsAllFromSource, enrichRowsFromSource, loadPreviewFromSource, renderForestFromSource } from '../render.js';
|
|
25
25
|
import { createNode } from '../canvas.js';
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
// node, so storage identity and attribution come from the canvas graph rather
|
|
6
6
|
// than duplicated attribution fields in deck/review data.
|
|
7
7
|
import { basename } from 'node:path';
|
|
8
|
-
import { scanInbox } from '
|
|
9
|
-
import {
|
|
8
|
+
import { scanInbox } from '../human/scan.js';
|
|
9
|
+
import { filterTerminalReviewTickets } from '../review/ticket-filter.js';
|
|
10
10
|
import { getNode, listNodes, view } from './canvas.js';
|
|
11
11
|
function askingNodeId(ticketDir) {
|
|
12
12
|
const bridge = getNode(basename(ticketDir));
|
|
@@ -38,14 +38,14 @@ function ticketCounts() {
|
|
|
38
38
|
}
|
|
39
39
|
const counts = new Map();
|
|
40
40
|
try {
|
|
41
|
-
for (const ticket of scanInbox(
|
|
41
|
+
for (const ticket of filterTerminalReviewTickets(scanInbox())) {
|
|
42
42
|
const nodeId = askingNodeId(ticket.dir);
|
|
43
43
|
if (nodeId !== null)
|
|
44
44
|
counts.set(nodeId, (counts.get(nodeId) ?? 0) + 1);
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
catch {
|
|
48
|
-
//
|
|
48
|
+
// An unavailable ticket store or absent root has no display consequence.
|
|
49
49
|
}
|
|
50
50
|
ticketCountCache = { at: Date.now(), counts };
|
|
51
51
|
return counts;
|
|
@@ -295,10 +295,8 @@ export interface DeleteNodeResult {
|
|
|
295
295
|
* GCs its edges) and remove its on-disk `nodes/<id>/` dir. The single-node
|
|
296
296
|
* analogue of {@link pruneNodes}, for IMMEDIATE reaping — e.g. an empty node the
|
|
297
297
|
* user closed or detached from. An open managed worktree is never deleted: its
|
|
298
|
-
* node retains the ownership needed for `node worktree close`.
|
|
299
|
-
*
|
|
300
|
-
* is still needed for delivery (integrated-review Major-2). Pure persisted-
|
|
301
|
-
* state removal: the caller MUST have already torn down the broker engine +
|
|
298
|
+
* node retains the ownership needed for `node worktree close`. Pure persisted-state
|
|
299
|
+
* removal: the caller MUST have already torn down the broker engine +
|
|
302
300
|
* viewer (this does not signal any process). The node row and its FK-coupled
|
|
303
301
|
* state are removed in one canvas write boundary. Best-effort dir removal
|
|
304
302
|
* follows the commit. */
|
|
@@ -334,14 +332,11 @@ export declare function pruneNodes(opts: {
|
|
|
334
332
|
*
|
|
335
333
|
* Protected (never a prune candidate, regardless of recency rank): any
|
|
336
334
|
* non-terminal node — status active|idle — REGARDLESS of `pi_pid` liveness,
|
|
337
|
-
* a node with an open managed worktree
|
|
338
|
-
* (`armed`/`pending`) follow-up human-work receipt. A crashed-but-non-terminal row
|
|
335
|
+
* or a node with an open managed worktree. A crashed-but-non-terminal row
|
|
339
336
|
* (dead pid, status still active/idle) must survive for daemon crash-recovery
|
|
340
|
-
* to resume, an open worktree must retain its node ownership until
|
|
341
|
-
* `node worktree close
|
|
342
|
-
*
|
|
343
|
-
* eligible for count-based pruning. The caller ($CRTR_NODE_ID) is also always
|
|
344
|
-
* protected.
|
|
337
|
+
* to resume, and an open worktree must retain its node ownership until
|
|
338
|
+
* `node worktree close`; neither is eligible for count-based pruning. The caller
|
|
339
|
+
* ($CRTR_NODE_ID) is also always protected.
|
|
345
340
|
*
|
|
346
341
|
* Algorithm: order ALL nodes by recency DESC (telemetry.json mtime, falling back
|
|
347
342
|
* to `created`); `target = max(maxNodes, protectedCount)`; delete every node
|
|
@@ -22,8 +22,8 @@ import { ensureHome, ensureNodeDirs, nodeMetaPath, nodeDir, nodesRoot, jobDir, }
|
|
|
22
22
|
* can ever leak onto disk even when a fully-hydrated NodeMeta is handed in. */
|
|
23
23
|
const IDENTITY_KEYS = [
|
|
24
24
|
'node_id', 'name', 'description', 'icon', 'cycles', 'created', 'cwd', 'host_kind', 'profile_id', 'kind', 'mode',
|
|
25
|
-
'lifecycle', 'persona_ack', 'parent', 'spawned_by', 'fork_from', '
|
|
26
|
-
'
|
|
25
|
+
'lifecycle', 'persona_ack', 'parent', 'spawned_by', 'fork_from', 'review_binding', 'passive_default', 'pi_session_id',
|
|
26
|
+
'pi_session_file', 'cycle_pending', 'model_override',
|
|
27
27
|
'launch', 'managed_worktree',
|
|
28
28
|
];
|
|
29
29
|
/** Project any node object down to its durable-identity subset. */
|
|
@@ -713,36 +713,17 @@ export function rebuildIndex() {
|
|
|
713
713
|
function hasOpenManagedWorktree(nodeId) {
|
|
714
714
|
return getNode(nodeId)?.managed_worktree?.state === 'open';
|
|
715
715
|
}
|
|
716
|
-
/** True when this node still carries a LIVE (`armed`/`pending`) follow-up human-work
|
|
717
|
-
* receipt (design-followup-consult-v2.md §B.4; integrated-review Major-2).
|
|
718
|
-
* An `armed` fork has not yet committed its final report; a `pending` fork
|
|
719
|
-
* HAS committed it (promoted atomically inside `commitCanonicalFinal`'s own
|
|
720
|
-
* transaction) but the receipt has not yet been acknowledged by
|
|
721
|
-
* `submitFollowUpResult` — in both cases the node's on-disk report payload
|
|
722
|
-
* (`reports/<final_report>` once pending) is still needed for delivery, so
|
|
723
|
-
* neither status may ever be pruned/deleted out from under it. Queried via
|
|
724
|
-
* raw SQL against the `consult_outbox` table directly (not the
|
|
725
|
-
* `human-work-outbox.ts` peer module) to avoid a canvas.ts↔human-work-outbox.ts
|
|
726
|
-
* import cycle — that module itself imports `getNode` from here. */
|
|
727
|
-
function hasLiveFollowUpReceipt(nodeId) {
|
|
728
|
-
const r = openDb()
|
|
729
|
-
.prepare("SELECT 1 FROM consult_outbox WHERE node_id = ? AND work_kind = 'follow_up' AND status IN ('armed', 'pending') LIMIT 1")
|
|
730
|
-
.get(nodeId);
|
|
731
|
-
return r !== undefined;
|
|
732
|
-
}
|
|
733
716
|
/** Hard-delete ONE node: drop its row (the edges→nodes FK, ON DELETE CASCADE,
|
|
734
717
|
* GCs its edges) and remove its on-disk `nodes/<id>/` dir. The single-node
|
|
735
718
|
* analogue of {@link pruneNodes}, for IMMEDIATE reaping — e.g. an empty node the
|
|
736
719
|
* user closed or detached from. An open managed worktree is never deleted: its
|
|
737
|
-
* node retains the ownership needed for `node worktree close`.
|
|
738
|
-
*
|
|
739
|
-
* is still needed for delivery (integrated-review Major-2). Pure persisted-
|
|
740
|
-
* state removal: the caller MUST have already torn down the broker engine +
|
|
720
|
+
* node retains the ownership needed for `node worktree close`. Pure persisted-state
|
|
721
|
+
* removal: the caller MUST have already torn down the broker engine +
|
|
741
722
|
* viewer (this does not signal any process). The node row and its FK-coupled
|
|
742
723
|
* state are removed in one canvas write boundary. Best-effort dir removal
|
|
743
724
|
* follows the commit. */
|
|
744
725
|
export function deleteNode(nodeId) {
|
|
745
|
-
if (hasOpenManagedWorktree(nodeId)
|
|
726
|
+
if (hasOpenManagedWorktree(nodeId))
|
|
746
727
|
return { deleted: false };
|
|
747
728
|
const result = withCanvasWrite((db) => {
|
|
748
729
|
db.prepare('DELETE FROM nodes WHERE node_id = ?').run(nodeId);
|
|
@@ -802,7 +783,7 @@ export function pruneNodes(opts) {
|
|
|
802
783
|
status: r['status'],
|
|
803
784
|
created: r['created'],
|
|
804
785
|
}));
|
|
805
|
-
const candidates = [...terminal, ...stale].filter((node) => !hasOpenManagedWorktree(node.node_id)
|
|
786
|
+
const candidates = [...terminal, ...stale].filter((node) => !hasOpenManagedWorktree(node.node_id));
|
|
806
787
|
if (dryRun || candidates.length === 0)
|
|
807
788
|
return { pruned: candidates, dryRun };
|
|
808
789
|
deletePrunedNodes(candidates);
|
|
@@ -850,14 +831,11 @@ function recencyMs(nodeId, created) {
|
|
|
850
831
|
*
|
|
851
832
|
* Protected (never a prune candidate, regardless of recency rank): any
|
|
852
833
|
* non-terminal node — status active|idle — REGARDLESS of `pi_pid` liveness,
|
|
853
|
-
* a node with an open managed worktree
|
|
854
|
-
* (`armed`/`pending`) follow-up human-work receipt. A crashed-but-non-terminal row
|
|
834
|
+
* or a node with an open managed worktree. A crashed-but-non-terminal row
|
|
855
835
|
* (dead pid, status still active/idle) must survive for daemon crash-recovery
|
|
856
|
-
* to resume, an open worktree must retain its node ownership until
|
|
857
|
-
* `node worktree close
|
|
858
|
-
*
|
|
859
|
-
* eligible for count-based pruning. The caller ($CRTR_NODE_ID) is also always
|
|
860
|
-
* protected.
|
|
836
|
+
* to resume, and an open worktree must retain its node ownership until
|
|
837
|
+
* `node worktree close`; neither is eligible for count-based pruning. The caller
|
|
838
|
+
* ($CRTR_NODE_ID) is also always protected.
|
|
861
839
|
*
|
|
862
840
|
* Algorithm: order ALL nodes by recency DESC (telemetry.json mtime, falling back
|
|
863
841
|
* to `created`); `target = max(maxNodes, protectedCount)`; delete every node
|
|
@@ -882,7 +860,7 @@ export function pruneToLimit(opts) {
|
|
|
882
860
|
status: r.status,
|
|
883
861
|
created: r.created,
|
|
884
862
|
recency: recencyMs(r.node_id, r.created),
|
|
885
|
-
protected: r.status === 'active' || r.status === 'idle' || hasOpenManagedWorktree(r.node_id)
|
|
863
|
+
protected: r.status === 'active' || r.status === 'idle' || hasOpenManagedWorktree(r.node_id),
|
|
886
864
|
}))
|
|
887
865
|
.sort((a, b) => b.recency - a.recency);
|
|
888
866
|
const protectedCount = ranked.filter((r) => r.protected).length;
|