@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
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { FinalizationError, pushFinal, redeliverFinalReport } from '../../core/feed/feed.js';
|
|
2
|
+
import { deliverNodeMessage } from '../messaging/node-message.js';
|
|
3
|
+
function approvalBody(review, resultPath) {
|
|
4
|
+
const summary = review.changed
|
|
5
|
+
? `The human reviewed and approved \`${review.file}\`. The document changed during review; re-read it before continuing. Review conversation: node \`${review.companion_node_id}\`.`
|
|
6
|
+
: `The human reviewed and approved \`${review.file}\`. The document was not modified.`;
|
|
7
|
+
return `${summary}\n\nDurable review result: ${resultPath}`;
|
|
8
|
+
}
|
|
9
|
+
/** Render the immutable approval fact without replaying comment text. */
|
|
10
|
+
export function renderApprovalMessage(review, resultPath) {
|
|
11
|
+
return approvalBody(review, resultPath);
|
|
12
|
+
}
|
|
13
|
+
function recordedFailedFanout(review, reportBasename) {
|
|
14
|
+
const error = review.delivery_error;
|
|
15
|
+
if (error === null || !error.includes(reportBasename))
|
|
16
|
+
return false;
|
|
17
|
+
const failed = /delivery failed for (.+)$/.exec(error)?.[1]?.split(', ') ?? [];
|
|
18
|
+
return failed.includes(review.origin_node_id);
|
|
19
|
+
}
|
|
20
|
+
/** Deliver an approval through its origin-specific canonical route. */
|
|
21
|
+
export async function deliverApproval(review, resultPath) {
|
|
22
|
+
const body = renderApprovalMessage(review, resultPath);
|
|
23
|
+
if (review.origin_kind === 'inline') {
|
|
24
|
+
const delivery = await deliverNodeMessage({
|
|
25
|
+
node_id: review.origin_node_id,
|
|
26
|
+
body,
|
|
27
|
+
label: 'human review approved',
|
|
28
|
+
from: 'crtrd',
|
|
29
|
+
mode: 'interactive',
|
|
30
|
+
data: { review_id: review.review_id, result_path: resultPath },
|
|
31
|
+
});
|
|
32
|
+
return { receipt: delivery.entry_id };
|
|
33
|
+
}
|
|
34
|
+
if (review.bridge_node_id === null) {
|
|
35
|
+
throw new Error(`ticket review ${review.review_id} has no bridge node`);
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const result = await pushFinal(review.bridge_node_id, body);
|
|
39
|
+
return { receipt: result.reportPath.split('/').at(-1) ?? null };
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (!(error instanceof FinalizationError) || error.code !== 'already_finalized')
|
|
43
|
+
throw error;
|
|
44
|
+
const reportBasename = error.reportPath;
|
|
45
|
+
if (reportBasename === undefined)
|
|
46
|
+
throw error;
|
|
47
|
+
// A committed final with no failed-delivery ledger is the crash window
|
|
48
|
+
// after a successful fanout and before the review ledger was marked.
|
|
49
|
+
if (review.delivery_error === null)
|
|
50
|
+
return { receipt: reportBasename };
|
|
51
|
+
if (!recordedFailedFanout(review, reportBasename))
|
|
52
|
+
throw error;
|
|
53
|
+
const result = redeliverFinalReport(review.bridge_node_id, review.origin_node_id, reportBasename, body);
|
|
54
|
+
return { receipt: result.reportPath.split('/').at(-1) ?? null };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { TicketResult } from '../../core/human/types.js';
|
|
2
|
+
import { type ReviewRecord, type ReviewResult } from '../../core/review/types.js';
|
|
3
|
+
export interface ReviewApprovalFinishOutcome {
|
|
4
|
+
outcome: 'settled' | 'already_settled';
|
|
5
|
+
record: ReviewRecord;
|
|
6
|
+
result: ReviewResult;
|
|
7
|
+
}
|
|
8
|
+
export interface ReviewCancellationFinishOutcome {
|
|
9
|
+
outcome: 'settled' | 'already_settled';
|
|
10
|
+
record: ReviewRecord;
|
|
11
|
+
ticket_result?: TicketResult;
|
|
12
|
+
}
|
|
13
|
+
export type ReviewFinishOutcome = ReviewApprovalFinishOutcome | ReviewCancellationFinishOutcome;
|
|
14
|
+
/** Retire a companion only through a lifecycle transition legal for its current status. */
|
|
15
|
+
export declare function retireCompanion(nodeId: string, outcome: 'approved' | 'canceled'): 'retired' | 'already' | 'missing';
|
|
16
|
+
/** Commit approval once, then independently finish its projection, delivery, and companion retirement ledgers. */
|
|
17
|
+
export declare function submitReviewApproval(reviewId: string): Promise<ReviewApprovalFinishOutcome>;
|
|
18
|
+
/** Cancel an open review once; ticket cancellation remains owned by the retained human-ticket finisher. */
|
|
19
|
+
export declare function cancelReview(reviewId: string, args: {
|
|
20
|
+
reason?: string;
|
|
21
|
+
actor?: string;
|
|
22
|
+
}): Promise<ReviewCancellationFinishOutcome>;
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { withCanvasWrite } from '../../core/canvas/db.js';
|
|
2
|
+
import { getNode } from '../../core/canvas/canvas.js';
|
|
3
|
+
import { responsePath } from '../../core/human/convention.js';
|
|
4
|
+
import { ticketDir } from '../../core/human/root.js';
|
|
5
|
+
import { readTicketResult } from '../../core/human/tickets.js';
|
|
6
|
+
import { projectReviewResult, buildReviewResult } from '../../core/review/project.js';
|
|
7
|
+
import { reviewResultPath } from '../../core/canvas/paths.js';
|
|
8
|
+
import { snapshotCommentsLocked } from '../../core/review/comments.js';
|
|
9
|
+
import { readReviewSource } from '../../core/review/document.js';
|
|
10
|
+
import { signalReviewActivity } from '../../core/review/signal.js';
|
|
11
|
+
import { approveReviewLocked, cancelReviewRow, getReview, markDelivered, markDeliveryError, markProjected, markProjectionError, } from '../../core/review/store.js';
|
|
12
|
+
import { ReviewOperationError } from '../../core/review/types.js';
|
|
13
|
+
import { transition } from '../../core/runtime/lifecycle.js';
|
|
14
|
+
import { headlessBrokerHost } from '../../core/runtime/host.js';
|
|
15
|
+
import { cancelHumanTicket, deliverTerminalResult } from '../human/finish.js';
|
|
16
|
+
import { deliverApproval } from './deliver.js';
|
|
17
|
+
/** One daemon serializes terminal side effects for each immutable review row. */
|
|
18
|
+
const finishChains = new Map();
|
|
19
|
+
function now() {
|
|
20
|
+
return new Date().toISOString();
|
|
21
|
+
}
|
|
22
|
+
function errorText(error) {
|
|
23
|
+
return error instanceof Error ? error.message : String(error);
|
|
24
|
+
}
|
|
25
|
+
function unknownReview(reviewId) {
|
|
26
|
+
throw new ReviewOperationError('unknown_review', 'review was not found', { received: reviewId });
|
|
27
|
+
}
|
|
28
|
+
function requireVisibleReview(reviewId) {
|
|
29
|
+
const review = getReview(reviewId);
|
|
30
|
+
if (review === null || review.state === 'binding')
|
|
31
|
+
return unknownReview(reviewId);
|
|
32
|
+
return review;
|
|
33
|
+
}
|
|
34
|
+
function terminalConflict(review, requested) {
|
|
35
|
+
throw new ReviewOperationError('review_terminal', 'review already has a terminal outcome', {
|
|
36
|
+
state: review.state,
|
|
37
|
+
requested,
|
|
38
|
+
review,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function approvedResult(review) {
|
|
42
|
+
if (review.result_json === null)
|
|
43
|
+
throw new Error(`approved review lacks its immutable result: ${review.review_id}`);
|
|
44
|
+
return JSON.parse(review.result_json);
|
|
45
|
+
}
|
|
46
|
+
function resultPath(review) {
|
|
47
|
+
if (review.origin_kind === 'inline')
|
|
48
|
+
return reviewResultPath(review.review_id);
|
|
49
|
+
if (review.bridge_node_id === null)
|
|
50
|
+
throw new Error(`ticket review lacks its bridge node: ${review.review_id}`);
|
|
51
|
+
return responsePath(ticketDir(review.bridge_node_id));
|
|
52
|
+
}
|
|
53
|
+
function ticketResult(review) {
|
|
54
|
+
return review.origin_kind === 'ticket' && review.bridge_node_id !== null
|
|
55
|
+
? readTicketResult(ticketDir(review.bridge_node_id)) ?? undefined
|
|
56
|
+
: undefined;
|
|
57
|
+
}
|
|
58
|
+
function isPostReplayAlreadyResolved(error) {
|
|
59
|
+
return error instanceof Error
|
|
60
|
+
&& 'status' in error
|
|
61
|
+
&& error.status === 409
|
|
62
|
+
&& 'code' in error
|
|
63
|
+
&& error.code === 'ticket_already_resolved';
|
|
64
|
+
}
|
|
65
|
+
async function serializedFinish(reviewId, work) {
|
|
66
|
+
const prior = finishChains.get(reviewId) ?? Promise.resolve();
|
|
67
|
+
const run = prior.catch(() => { }).then(work);
|
|
68
|
+
const tail = run.then(() => { }, () => { });
|
|
69
|
+
finishChains.set(reviewId, tail);
|
|
70
|
+
try {
|
|
71
|
+
return await run;
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
if (finishChains.get(reviewId) === tail)
|
|
75
|
+
finishChains.delete(reviewId);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Retire a companion only through a lifecycle transition legal for its current status. */
|
|
79
|
+
export function retireCompanion(nodeId, outcome) {
|
|
80
|
+
const node = getNode(nodeId);
|
|
81
|
+
if (node === null)
|
|
82
|
+
return 'missing';
|
|
83
|
+
if (node.status === 'done' || node.status === 'canceled')
|
|
84
|
+
return 'already';
|
|
85
|
+
if (outcome === 'approved' && (node.status === 'active' || node.status === 'idle')) {
|
|
86
|
+
transition(nodeId, 'finish');
|
|
87
|
+
try {
|
|
88
|
+
headlessBrokerHost.teardown(nodeId);
|
|
89
|
+
}
|
|
90
|
+
catch { /* the terminal transition is authoritative */ }
|
|
91
|
+
return 'retired';
|
|
92
|
+
}
|
|
93
|
+
// Cancellation is legal from every status. An already-dead companion cannot
|
|
94
|
+
// be finished, so it is retired as canceled even when approval won.
|
|
95
|
+
transition(nodeId, 'cancel');
|
|
96
|
+
if (node.status === 'active' || node.status === 'idle') {
|
|
97
|
+
try {
|
|
98
|
+
headlessBrokerHost.teardown(nodeId);
|
|
99
|
+
}
|
|
100
|
+
catch { /* the terminal transition is authoritative */ }
|
|
101
|
+
}
|
|
102
|
+
return 'retired';
|
|
103
|
+
}
|
|
104
|
+
async function finishApproved(review, result) {
|
|
105
|
+
let current = requireVisibleReview(review.review_id);
|
|
106
|
+
if (current.projected_at === null) {
|
|
107
|
+
try {
|
|
108
|
+
projectReviewResult(current, result);
|
|
109
|
+
markProjected(current.review_id, now());
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
markProjectionError(current.review_id, errorText(error));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
current = requireVisibleReview(review.review_id);
|
|
116
|
+
if (current.delivered_at === null) {
|
|
117
|
+
try {
|
|
118
|
+
const delivery = await deliverApproval(current, resultPath(current));
|
|
119
|
+
markDelivered(current.review_id, delivery.receipt, now());
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
markDeliveryError(current.review_id, errorText(error));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
current = requireVisibleReview(review.review_id);
|
|
126
|
+
retireCompanion(current.companion_node_id, 'approved');
|
|
127
|
+
return requireVisibleReview(review.review_id);
|
|
128
|
+
}
|
|
129
|
+
async function finishCanceled(review, winningWrite, args) {
|
|
130
|
+
let current = requireVisibleReview(review.review_id);
|
|
131
|
+
let canceledTicket;
|
|
132
|
+
if (current.origin_kind === 'inline') {
|
|
133
|
+
if (current.projected_at === null)
|
|
134
|
+
markProjected(current.review_id, now());
|
|
135
|
+
current = requireVisibleReview(review.review_id);
|
|
136
|
+
if (current.delivered_at === null)
|
|
137
|
+
markDelivered(current.review_id, null, now());
|
|
138
|
+
}
|
|
139
|
+
else if (current.bridge_node_id === null) {
|
|
140
|
+
markProjectionError(current.review_id, `ticket review lacks its bridge node: ${current.review_id}`);
|
|
141
|
+
markDeliveryError(current.review_id, `ticket review lacks its bridge node: ${current.review_id}`);
|
|
142
|
+
}
|
|
143
|
+
else if (current.delivered_at === null) {
|
|
144
|
+
try {
|
|
145
|
+
if (winningWrite) {
|
|
146
|
+
canceledTicket = await cancelHumanTicket(current.bridge_node_id, args);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const delivered = await deliverTerminalResult(current.bridge_node_id);
|
|
150
|
+
if (!delivered)
|
|
151
|
+
throw new Error(`ticket cancellation is not available for delivery: ${current.bridge_node_id}`);
|
|
152
|
+
canceledTicket = ticketResult(current);
|
|
153
|
+
}
|
|
154
|
+
if (canceledTicket === undefined)
|
|
155
|
+
throw new Error(`ticket cancellation result is missing: ${current.bridge_node_id}`);
|
|
156
|
+
markProjected(current.review_id, now());
|
|
157
|
+
markDelivered(current.review_id, null, now());
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
if (winningWrite && isPostReplayAlreadyResolved(error)) {
|
|
161
|
+
try {
|
|
162
|
+
const delivered = await deliverTerminalResult(current.bridge_node_id);
|
|
163
|
+
if (!delivered)
|
|
164
|
+
throw new Error(`ticket cancellation is not available for delivery: ${current.bridge_node_id}`);
|
|
165
|
+
canceledTicket = ticketResult(current);
|
|
166
|
+
if (canceledTicket === undefined)
|
|
167
|
+
throw new Error(`ticket cancellation result is missing: ${current.bridge_node_id}`);
|
|
168
|
+
markProjected(current.review_id, now());
|
|
169
|
+
markDelivered(current.review_id, null, now());
|
|
170
|
+
}
|
|
171
|
+
catch (replayError) {
|
|
172
|
+
markDeliveryError(current.review_id, errorText(replayError));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
// cancelHumanTicket publishes response.json before fanout. Preserve that
|
|
177
|
+
// publication ledger even when the retained delivery path reports a failure.
|
|
178
|
+
if (ticketResult(current) !== undefined)
|
|
179
|
+
markProjected(current.review_id, now());
|
|
180
|
+
markDeliveryError(current.review_id, errorText(error));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
current = requireVisibleReview(review.review_id);
|
|
185
|
+
if (canceledTicket === undefined)
|
|
186
|
+
canceledTicket = ticketResult(current);
|
|
187
|
+
retireCompanion(current.companion_node_id, 'canceled');
|
|
188
|
+
return { record: requireVisibleReview(review.review_id), ...(canceledTicket === undefined ? {} : { ticket_result: canceledTicket }) };
|
|
189
|
+
}
|
|
190
|
+
/** Commit approval once, then independently finish its projection, delivery, and companion retirement ledgers. */
|
|
191
|
+
export async function submitReviewApproval(reviewId) {
|
|
192
|
+
const initial = requireVisibleReview(reviewId);
|
|
193
|
+
if (initial.state === 'canceled')
|
|
194
|
+
return terminalConflict(initial, 'submit');
|
|
195
|
+
if (initial.state === 'approved') {
|
|
196
|
+
const result = approvedResult(initial);
|
|
197
|
+
const record = await serializedFinish(reviewId, () => finishApproved(initial, result));
|
|
198
|
+
return { outcome: 'already_settled', record, result };
|
|
199
|
+
}
|
|
200
|
+
const source = readReviewSource(initial.file, 'submit');
|
|
201
|
+
const committed = withCanvasWrite((db) => {
|
|
202
|
+
const review = requireVisibleReview(reviewId);
|
|
203
|
+
if (review.state === 'canceled')
|
|
204
|
+
return terminalConflict(review, 'submit');
|
|
205
|
+
if (review.state === 'approved')
|
|
206
|
+
return { outcome: 'already_settled', review, result: approvedResult(review) };
|
|
207
|
+
if (review.state !== 'open')
|
|
208
|
+
throw new ReviewOperationError('review_not_open', 'review is not open', { review_id: reviewId, state: review.state });
|
|
209
|
+
const snapshot = snapshotCommentsLocked(db, reviewId);
|
|
210
|
+
const at = now();
|
|
211
|
+
const result = buildReviewResult(review, snapshot, source.sha256, at);
|
|
212
|
+
if (!approveReviewLocked(db, {
|
|
213
|
+
review_id: reviewId,
|
|
214
|
+
approved_at: at,
|
|
215
|
+
approved_sha256: source.sha256,
|
|
216
|
+
changed: result.changed,
|
|
217
|
+
comments_total: snapshot.total,
|
|
218
|
+
comments_unresolved: snapshot.unresolved,
|
|
219
|
+
result_json: JSON.stringify(result),
|
|
220
|
+
})) {
|
|
221
|
+
const winner = requireVisibleReview(reviewId);
|
|
222
|
+
if (winner.state === 'approved')
|
|
223
|
+
return { outcome: 'already_settled', review: winner, result: approvedResult(winner) };
|
|
224
|
+
return terminalConflict(winner, 'submit');
|
|
225
|
+
}
|
|
226
|
+
return { outcome: 'settled', review: requireVisibleReview(reviewId), result };
|
|
227
|
+
});
|
|
228
|
+
if (committed.outcome === 'settled')
|
|
229
|
+
signalReviewActivity();
|
|
230
|
+
const record = await serializedFinish(reviewId, () => finishApproved(committed.review, committed.result));
|
|
231
|
+
return { outcome: committed.outcome, record, result: committed.result };
|
|
232
|
+
}
|
|
233
|
+
/** Cancel an open review once; ticket cancellation remains owned by the retained human-ticket finisher. */
|
|
234
|
+
export async function cancelReview(reviewId, args) {
|
|
235
|
+
const initial = requireVisibleReview(reviewId);
|
|
236
|
+
if (initial.state === 'approved')
|
|
237
|
+
return terminalConflict(initial, 'cancel');
|
|
238
|
+
const winningWrite = initial.state === 'open'
|
|
239
|
+
&& cancelReviewRow(reviewId, { at: now(), reason: args.reason ?? '', actor: args.actor ?? null });
|
|
240
|
+
const review = requireVisibleReview(reviewId);
|
|
241
|
+
if (review.state === 'approved')
|
|
242
|
+
return terminalConflict(review, 'cancel');
|
|
243
|
+
if (review.state !== 'canceled') {
|
|
244
|
+
throw new ReviewOperationError('review_not_open', 'review is not open', { review_id: reviewId, state: review.state });
|
|
245
|
+
}
|
|
246
|
+
if (winningWrite)
|
|
247
|
+
signalReviewActivity();
|
|
248
|
+
const finished = await serializedFinish(reviewId, () => finishCanceled(review, winningWrite, args));
|
|
249
|
+
return {
|
|
250
|
+
outcome: winningWrite ? 'settled' : 'already_settled',
|
|
251
|
+
record: finished.record,
|
|
252
|
+
...(finished.ticket_result === undefined ? {} : { ticket_result: finished.ticket_result }),
|
|
253
|
+
};
|
|
254
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ReviewSweepResult {
|
|
2
|
+
realized: number;
|
|
3
|
+
collected: number;
|
|
4
|
+
reprojected: number;
|
|
5
|
+
failed: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Recover only pre-exposure review work at daemon startup. Terminal delivery and
|
|
9
|
+
* retirement are intentionally outside this pass and require an explicit repeat.
|
|
10
|
+
*/
|
|
11
|
+
export declare function sweepReviews(): Promise<ReviewSweepResult>;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { existsSync, readdirSync, rmSync } from 'node:fs';
|
|
2
|
+
import { basename } from 'node:path';
|
|
3
|
+
import { reviewPath } from '../../core/human/convention.js';
|
|
4
|
+
import { ticketDir } from '../../core/human/root.js';
|
|
5
|
+
import { submitReview } from '../../core/human/tickets.js';
|
|
6
|
+
import { reviewsRoot } from '../../core/canvas/paths.js';
|
|
7
|
+
import { projectReviewResult } from '../../core/review/project.js';
|
|
8
|
+
import { realizeReview } from '../../core/review/realize.js';
|
|
9
|
+
import { listBindingReviews, listReviews, markProjected, markProjectionError, } from '../../core/review/store.js';
|
|
10
|
+
import { ReviewOperationError } from '../../core/review/types.js';
|
|
11
|
+
function errorText(error) {
|
|
12
|
+
return error instanceof Error ? error.message : String(error);
|
|
13
|
+
}
|
|
14
|
+
function isMissingPath(error) {
|
|
15
|
+
return error?.code === 'ENOENT';
|
|
16
|
+
}
|
|
17
|
+
/** Republish the ticket projection only after its canonical review is already open. */
|
|
18
|
+
function republishTicketReview(review) {
|
|
19
|
+
if (review.bridge_node_id === null)
|
|
20
|
+
throw new Error(`ticket review has no bridge node: ${review.review_id}`);
|
|
21
|
+
if (review.subtitle === null)
|
|
22
|
+
throw new Error(`ticket review has no subtitle: ${review.review_id}`);
|
|
23
|
+
const dir = ticketDir(review.bridge_node_id);
|
|
24
|
+
if (existsSync(reviewPath(dir)))
|
|
25
|
+
return;
|
|
26
|
+
submitReview({
|
|
27
|
+
dir,
|
|
28
|
+
review: {
|
|
29
|
+
file: review.file,
|
|
30
|
+
...(review.output_path === null ? {} : { output: review.output_path }),
|
|
31
|
+
title: basename(review.file),
|
|
32
|
+
subtitle: review.subtitle,
|
|
33
|
+
source: { nodeId: review.origin_node_id },
|
|
34
|
+
blockedSince: review.created,
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/** Reproject only an immutable, already-approved canonical result. */
|
|
39
|
+
function reprojectApprovedReview(review) {
|
|
40
|
+
if (review.result_json === null)
|
|
41
|
+
throw new Error(`approved review lacks its immutable result: ${review.review_id}`);
|
|
42
|
+
projectReviewResult(review, JSON.parse(review.result_json));
|
|
43
|
+
markProjected(review.review_id, new Date().toISOString());
|
|
44
|
+
}
|
|
45
|
+
/** Remove only direct review directories that are no longer referenced by a row. */
|
|
46
|
+
function collectOrphanReviewDirectories(reviewIds) {
|
|
47
|
+
let entries;
|
|
48
|
+
try {
|
|
49
|
+
entries = readdirSync(reviewsRoot(), { withFileTypes: true });
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (isMissingPath(error))
|
|
53
|
+
return 0;
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
let collected = 0;
|
|
57
|
+
for (const entry of entries) {
|
|
58
|
+
if (!entry.isDirectory() || reviewIds.has(entry.name))
|
|
59
|
+
continue;
|
|
60
|
+
rmSync(`${reviewsRoot()}/${entry.name}`, { recursive: true, force: true });
|
|
61
|
+
collected += 1;
|
|
62
|
+
}
|
|
63
|
+
return collected;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Recover only pre-exposure review work at daemon startup. Terminal delivery and
|
|
67
|
+
* retirement are intentionally outside this pass and require an explicit repeat.
|
|
68
|
+
*/
|
|
69
|
+
export async function sweepReviews() {
|
|
70
|
+
let realized = 0;
|
|
71
|
+
let collected = 0;
|
|
72
|
+
let reprojected = 0;
|
|
73
|
+
let failed = 0;
|
|
74
|
+
const bindings = listBindingReviews();
|
|
75
|
+
for (const review of bindings) {
|
|
76
|
+
try {
|
|
77
|
+
await realizeReview(review.review_id);
|
|
78
|
+
realized += 1;
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
// A missing immutable branch is an expected recovery outcome: realization
|
|
82
|
+
// cancels the binding and never captures a replacement branch.
|
|
83
|
+
if (!(error instanceof ReviewOperationError && error.code === 'branch_lost'))
|
|
84
|
+
failed += 1;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
const reviewIds = new Set([
|
|
89
|
+
...listBindingReviews().map((review) => review.review_id),
|
|
90
|
+
...listReviews({}).map((review) => review.review_id),
|
|
91
|
+
]);
|
|
92
|
+
collected = collectOrphanReviewDirectories(reviewIds);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
failed += 1;
|
|
96
|
+
}
|
|
97
|
+
for (const review of listReviews({ state: 'approved' })) {
|
|
98
|
+
if (review.projected_at !== null)
|
|
99
|
+
continue;
|
|
100
|
+
try {
|
|
101
|
+
reprojectApprovedReview(review);
|
|
102
|
+
reprojected += 1;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
markProjectionError(review.review_id, errorText(error));
|
|
106
|
+
failed += 1;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
for (const review of listReviews({ state: 'open' })) {
|
|
110
|
+
if (review.origin_kind !== 'ticket')
|
|
111
|
+
continue;
|
|
112
|
+
try {
|
|
113
|
+
republishTicketReview(review);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
failed += 1;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { realized, collected, reprojected, failed };
|
|
120
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -24,4 +24,6 @@ export type { BuildEnvelopeInput, ErrorClass, ErrorClassCode, ErrorClassHints, E
|
|
|
24
24
|
export { validateCommandManifest } from './core/command-manifests/manifest.js';
|
|
25
25
|
export type { CommandManifestValidation, ValidatedCommandManifest } from './core/command-manifests/manifest.js';
|
|
26
26
|
export type { CommandManifestIssue, TransportKind } from './core/command-manifests/schema.js';
|
|
27
|
+
export { validatePluginBundle } from './core/command-plugins/bundle.js';
|
|
28
|
+
export type { BundleIssue, PluginBundleValidation, ValidatedBundle } from './core/command-plugins/bundle.js';
|
|
27
29
|
export { SUBTREE_NAMES } from './build-root.js';
|
package/dist/index.js
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
//
|
|
3
3
|
// This barrel is the ONLY supported way to import crouter as a library; the
|
|
4
4
|
// `exports` map gates off deep subpath imports, so consumers depend on exactly
|
|
5
|
-
// the symbols re-exported here
|
|
6
|
-
// the runtime through the `@north-light/crouter/web` seam.
|
|
5
|
+
// the symbols re-exported here.
|
|
7
6
|
// Everything below is a stable, server-facing surface: runtime control that
|
|
8
7
|
// keeps the canvas-row ⇄ pi-session lockstep guarantees, read-only canvas/
|
|
9
8
|
// telemetry queries, and the broker socket client + wire protocol. Nothing
|
|
@@ -44,4 +43,5 @@ export { nowIso } from './core/fs-utils.js';
|
|
|
44
43
|
export { validateOperationId, buildEnvelope, operationIdContext, errorClassCodes, serializeEventRecord, errorClassFromError, } from './core/events/index.js';
|
|
45
44
|
// ── Command-manifest compatibility ───────────────────────────────────────
|
|
46
45
|
export { validateCommandManifest } from './core/command-manifests/manifest.js';
|
|
46
|
+
export { validatePluginBundle } from './core/command-plugins/bundle.js';
|
|
47
47
|
export { SUBTREE_NAMES } from './build-root.js';
|