@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,26 @@
|
|
|
1
|
+
import { type NewReviewRow, type ReviewOriginKind, type ReviewRecord } from './types.js';
|
|
2
|
+
export interface StageReviewArgs {
|
|
3
|
+
origin_kind: ReviewOriginKind;
|
|
4
|
+
origin_node_id: string;
|
|
5
|
+
file: string;
|
|
6
|
+
idempotency_key: string;
|
|
7
|
+
subtitle?: string;
|
|
8
|
+
output_path?: string;
|
|
9
|
+
}
|
|
10
|
+
/** A persisted winner needs realization, while a new stage has unreferenced filesystem state to commit or discard. */
|
|
11
|
+
export type StagedReview = {
|
|
12
|
+
existing: ReviewRecord;
|
|
13
|
+
row?: never;
|
|
14
|
+
review_dir?: never;
|
|
15
|
+
} | {
|
|
16
|
+
existing?: never;
|
|
17
|
+
row: NewReviewRow;
|
|
18
|
+
review_dir: string;
|
|
19
|
+
};
|
|
20
|
+
/** Remove only review-directory state that was never committed to a review row. */
|
|
21
|
+
export declare function discardStaging(reviewId: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* Capture an existing origin and write its immutable branch without creating a
|
|
24
|
+
* canvas node or review row. The caller alone commits or discards this stage.
|
|
25
|
+
*/
|
|
26
|
+
export declare function stageReview(args: StageReviewArgs): Promise<StagedReview>;
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { existsSync, readFileSync, realpathSync, rmSync, statSync } from 'node:fs';
|
|
3
|
+
import { isAbsolute } from 'node:path';
|
|
4
|
+
import { getNode } from '../canvas/index.js';
|
|
5
|
+
import { ensureReviewDir, reviewBranchPath, reviewDir } from '../canvas/paths.js';
|
|
6
|
+
import { checkReviewableFile } from '../human/visible-paths.js';
|
|
7
|
+
import { newNodeId } from '../runtime/nodes.js';
|
|
8
|
+
import { captureOrigin, materializeReviewBranch } from './companion.js';
|
|
9
|
+
import { getReviewByIdempotencyKey } from './store.js';
|
|
10
|
+
import { ReviewOperationError, } from './types.js';
|
|
11
|
+
function targetError(file, reason) {
|
|
12
|
+
return new ReviewOperationError('review_target_unreviewable', 'review target cannot be staged', {
|
|
13
|
+
phase: 'create',
|
|
14
|
+
file,
|
|
15
|
+
reason,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
function validateReviewFile(file) {
|
|
19
|
+
if (!isAbsolute(file))
|
|
20
|
+
throw targetError(file, 'not_absolute');
|
|
21
|
+
if (!existsSync(file))
|
|
22
|
+
throw targetError(file, 'missing');
|
|
23
|
+
try {
|
|
24
|
+
if (!statSync(file).isFile())
|
|
25
|
+
throw targetError(file, 'not_a_file');
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (error instanceof ReviewOperationError)
|
|
29
|
+
throw error;
|
|
30
|
+
throw targetError(file, 'missing');
|
|
31
|
+
}
|
|
32
|
+
const reviewable = checkReviewableFile(file);
|
|
33
|
+
if (!reviewable.ok) {
|
|
34
|
+
const reason = reviewable.reason === 'file is not UTF-8 text'
|
|
35
|
+
? 'binary'
|
|
36
|
+
: reviewable.reason === 'file is too large to review (2 MB limit)'
|
|
37
|
+
? 'too_large'
|
|
38
|
+
: reviewable.reason === 'file is too long to review (5,000 line limit)'
|
|
39
|
+
? 'too_many_lines'
|
|
40
|
+
: 'not_a_file';
|
|
41
|
+
throw targetError(file, reason);
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
return realpathSync(file);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
throw targetError(file, 'missing');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function sessionIdentityChanged(error) {
|
|
51
|
+
// R6 materializes through materializeSessionBranchAt(), whose only identity-race
|
|
52
|
+
// signal is this precise error. Other branch errors must not trigger recapture.
|
|
53
|
+
return error instanceof Error && error.message === 'source session id does not match captured coordinates';
|
|
54
|
+
}
|
|
55
|
+
function branchUnavailable(originNodeId) {
|
|
56
|
+
return new ReviewOperationError('review_branch_unavailable', 'review branch could not be materialized', {
|
|
57
|
+
reason: 'materialize_failed',
|
|
58
|
+
origin_node_id: originNodeId,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async function captureStagedOrigin(originNodeId) {
|
|
62
|
+
try {
|
|
63
|
+
return await captureOrigin(originNodeId);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (error instanceof ReviewOperationError && error.code === 'review_origin_missing') {
|
|
67
|
+
throw new ReviewOperationError('review_origin_missing', 'review origin was not found', {
|
|
68
|
+
origin_node_id: originNodeId,
|
|
69
|
+
reason: 'origin_missing',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function originUnstable(originNodeId) {
|
|
76
|
+
return new ReviewOperationError('review_origin_unstable', 'review origin changed sessions while staging', { origin_node_id: originNodeId });
|
|
77
|
+
}
|
|
78
|
+
function materializeWithOneRecapture(reviewId, originNodeId, capture, initialCapturedAt) {
|
|
79
|
+
return (async () => {
|
|
80
|
+
let current = capture;
|
|
81
|
+
let capturedAt = initialCapturedAt;
|
|
82
|
+
try {
|
|
83
|
+
materializeReviewBranch(reviewId, current);
|
|
84
|
+
return { capture: current, capturedAt };
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (!sessionIdentityChanged(error))
|
|
88
|
+
throw branchUnavailable(originNodeId);
|
|
89
|
+
}
|
|
90
|
+
current = await captureStagedOrigin(originNodeId);
|
|
91
|
+
capturedAt = new Date().toISOString();
|
|
92
|
+
try {
|
|
93
|
+
materializeReviewBranch(reviewId, current);
|
|
94
|
+
return { capture: current, capturedAt };
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (sessionIdentityChanged(error))
|
|
98
|
+
throw originUnstable(originNodeId);
|
|
99
|
+
throw branchUnavailable(originNodeId);
|
|
100
|
+
}
|
|
101
|
+
})();
|
|
102
|
+
}
|
|
103
|
+
/** Remove only review-directory state that was never committed to a review row. */
|
|
104
|
+
export function discardStaging(reviewId) {
|
|
105
|
+
try {
|
|
106
|
+
rmSync(reviewDir(reviewId), { recursive: true, force: true });
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Startup collection handles residue that cannot be removed in this process.
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Capture an existing origin and write its immutable branch without creating a
|
|
114
|
+
* canvas node or review row. The caller alone commits or discards this stage.
|
|
115
|
+
*/
|
|
116
|
+
export async function stageReview(args) {
|
|
117
|
+
const existing = getReviewByIdempotencyKey(args.idempotency_key);
|
|
118
|
+
if (existing !== null)
|
|
119
|
+
return { existing };
|
|
120
|
+
if (getNode(args.origin_node_id) === null) {
|
|
121
|
+
throw new ReviewOperationError('review_origin_missing', 'review origin was not found', {
|
|
122
|
+
origin_node_id: args.origin_node_id,
|
|
123
|
+
reason: 'origin_missing',
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
const file = validateReviewFile(args.file);
|
|
127
|
+
const reviewId = newNodeId();
|
|
128
|
+
const companionNodeId = newNodeId();
|
|
129
|
+
try {
|
|
130
|
+
ensureReviewDir(reviewId);
|
|
131
|
+
const initialCapture = await captureStagedOrigin(args.origin_node_id);
|
|
132
|
+
const initialCapturedAt = new Date().toISOString();
|
|
133
|
+
const bytes = readFileSync(file);
|
|
134
|
+
const sha256 = createHash('sha256').update(bytes).digest('hex');
|
|
135
|
+
const { capture, capturedAt } = await materializeWithOneRecapture(reviewId, args.origin_node_id, initialCapture, initialCapturedAt);
|
|
136
|
+
const created = new Date().toISOString();
|
|
137
|
+
return {
|
|
138
|
+
row: {
|
|
139
|
+
review_id: reviewId,
|
|
140
|
+
idempotency_key: args.idempotency_key,
|
|
141
|
+
origin_kind: args.origin_kind,
|
|
142
|
+
origin_node_id: args.origin_node_id,
|
|
143
|
+
bridge_node_id: null,
|
|
144
|
+
companion_node_id: companionNodeId,
|
|
145
|
+
review_dir: reviewDir(reviewId),
|
|
146
|
+
file,
|
|
147
|
+
origin_session_file: capture.sourceFile,
|
|
148
|
+
origin_session_id: capture.sourceSessionId,
|
|
149
|
+
origin_leaf_id: capture.leafId,
|
|
150
|
+
model_spec: capture.modelSpec,
|
|
151
|
+
branch_file: reviewBranchPath(reviewId),
|
|
152
|
+
baseline_sha256: sha256,
|
|
153
|
+
baseline_bytes: bytes.length,
|
|
154
|
+
anchor_base_sha256: sha256,
|
|
155
|
+
anchor_base_bytes: bytes,
|
|
156
|
+
state: 'binding',
|
|
157
|
+
created,
|
|
158
|
+
captured_at: capturedAt,
|
|
159
|
+
opened_at: null,
|
|
160
|
+
output_path: args.output_path ?? null,
|
|
161
|
+
subtitle: args.subtitle ?? null,
|
|
162
|
+
approved_at: null,
|
|
163
|
+
approved_sha256: null,
|
|
164
|
+
changed: null,
|
|
165
|
+
comments_total: null,
|
|
166
|
+
comments_unresolved: null,
|
|
167
|
+
result_json: null,
|
|
168
|
+
canceled_at: null,
|
|
169
|
+
cancel_reason: null,
|
|
170
|
+
cancel_actor: null,
|
|
171
|
+
delivery_entry_id: null,
|
|
172
|
+
delivered_at: null,
|
|
173
|
+
delivery_error: null,
|
|
174
|
+
projected_at: null,
|
|
175
|
+
projection_error: null,
|
|
176
|
+
},
|
|
177
|
+
review_dir: reviewDir(reviewId),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
discardStaging(reviewId);
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
import type { NewReviewRow, ReviewRecord, ReviewState } from './types.js';
|
|
3
|
+
/** Fields written when an open review is conditionally approved. */
|
|
4
|
+
export interface ApproveReviewArgs {
|
|
5
|
+
review_id: string;
|
|
6
|
+
approved_at: string;
|
|
7
|
+
approved_sha256: string;
|
|
8
|
+
changed: boolean;
|
|
9
|
+
comments_total: number;
|
|
10
|
+
comments_unresolved: number;
|
|
11
|
+
result_json: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function mintReviewId(): string;
|
|
14
|
+
/** Atomically claim the idempotency key, without publishing any non-SQLite state. */
|
|
15
|
+
export declare function commitBindingReview(row: NewReviewRow): {
|
|
16
|
+
review_id: string;
|
|
17
|
+
won: boolean;
|
|
18
|
+
};
|
|
19
|
+
export declare function getReview(reviewId: string): ReviewRecord | null;
|
|
20
|
+
export declare function getReviewByIdempotencyKey(key: string): ReviewRecord | null;
|
|
21
|
+
export declare function getReviewByCompanion(nodeId: string): ReviewRecord | null;
|
|
22
|
+
export declare function getReviewByBridge(nodeId: string): ReviewRecord | null;
|
|
23
|
+
export declare function listReviews(filter: {
|
|
24
|
+
state?: ReviewState;
|
|
25
|
+
origin_node_id?: string;
|
|
26
|
+
file?: string;
|
|
27
|
+
}): ReviewRecord[];
|
|
28
|
+
export declare function listBindingReviews(): ReviewRecord[];
|
|
29
|
+
export declare function listUnprojectedTerminalReviews(): ReviewRecord[];
|
|
30
|
+
export declare function bindBridgeNode(reviewId: string, bridgeNodeId: string): boolean;
|
|
31
|
+
export declare function openReviewRow(reviewId: string, openedAt: string): boolean;
|
|
32
|
+
export declare function approveReviewLocked(db: DatabaseSync, args: ApproveReviewArgs): boolean;
|
|
33
|
+
export declare function cancelReviewRow(reviewId: string, args: {
|
|
34
|
+
at: string;
|
|
35
|
+
reason: string;
|
|
36
|
+
actor: string | null;
|
|
37
|
+
}): boolean;
|
|
38
|
+
export declare function markProjected(reviewId: string, at: string): void;
|
|
39
|
+
export declare function markProjectionError(reviewId: string, error: string): void;
|
|
40
|
+
export declare function markDelivered(reviewId: string, receipt: string | null, at: string): void;
|
|
41
|
+
export declare function markDeliveryError(reviewId: string, error: string): void;
|
|
42
|
+
export declare function readAnchorBase(reviewId: string): {
|
|
43
|
+
bytes: Buffer;
|
|
44
|
+
sha256: string;
|
|
45
|
+
} | null;
|
|
46
|
+
export declare function replaceAnchorBaseLocked(db: DatabaseSync, reviewId: string, bytes: Buffer, sha256: string): void;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { newNodeId } from '../runtime/nodes.js';
|
|
3
|
+
import { openDb, withCanvasWrite } from '../canvas/db.js';
|
|
4
|
+
function recordFromRow(raw) {
|
|
5
|
+
return {
|
|
6
|
+
review_id: raw['review_id'],
|
|
7
|
+
idempotency_key: raw['idempotency_key'],
|
|
8
|
+
origin_kind: raw['origin_kind'],
|
|
9
|
+
origin_node_id: raw['origin_node_id'],
|
|
10
|
+
bridge_node_id: raw['bridge_node_id'] ?? null,
|
|
11
|
+
companion_node_id: raw['companion_node_id'],
|
|
12
|
+
review_dir: raw['review_dir'],
|
|
13
|
+
file: raw['file'],
|
|
14
|
+
origin_session_file: raw['origin_session_file'],
|
|
15
|
+
origin_session_id: raw['origin_session_id'],
|
|
16
|
+
origin_leaf_id: raw['origin_leaf_id'],
|
|
17
|
+
model_spec: raw['model_spec'],
|
|
18
|
+
branch_file: raw['branch_file'],
|
|
19
|
+
baseline_sha256: raw['baseline_sha256'],
|
|
20
|
+
baseline_bytes: raw['baseline_bytes'],
|
|
21
|
+
anchor_base_sha256: raw['anchor_base_sha256'],
|
|
22
|
+
state: raw['state'],
|
|
23
|
+
created: raw['created'],
|
|
24
|
+
captured_at: raw['captured_at'],
|
|
25
|
+
opened_at: raw['opened_at'] ?? null,
|
|
26
|
+
output_path: raw['output_path'] ?? null,
|
|
27
|
+
subtitle: raw['subtitle'] ?? null,
|
|
28
|
+
approved_at: raw['approved_at'] ?? null,
|
|
29
|
+
approved_sha256: raw['approved_sha256'] ?? null,
|
|
30
|
+
changed: raw['changed'] === null || raw['changed'] === undefined ? null : raw['changed'] !== 0,
|
|
31
|
+
comments_total: raw['comments_total'] ?? null,
|
|
32
|
+
comments_unresolved: raw['comments_unresolved'] ?? null,
|
|
33
|
+
result_json: raw['result_json'] ?? null,
|
|
34
|
+
canceled_at: raw['canceled_at'] ?? null,
|
|
35
|
+
cancel_reason: raw['cancel_reason'] ?? null,
|
|
36
|
+
cancel_actor: raw['cancel_actor'] ?? null,
|
|
37
|
+
delivery_entry_id: raw['delivery_entry_id'] ?? null,
|
|
38
|
+
delivered_at: raw['delivered_at'] ?? null,
|
|
39
|
+
delivery_error: raw['delivery_error'] ?? null,
|
|
40
|
+
projected_at: raw['projected_at'] ?? null,
|
|
41
|
+
projection_error: raw['projection_error'] ?? null,
|
|
42
|
+
source_missing: !existsSync(raw['file']),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function readRecord(db, where, ...params) {
|
|
46
|
+
const raw = db.prepare(`SELECT * FROM reviews WHERE ${where}`).get(...params);
|
|
47
|
+
return raw === undefined ? null : recordFromRow(raw);
|
|
48
|
+
}
|
|
49
|
+
function readRecords(db, where, ...params) {
|
|
50
|
+
const rows = db.prepare(`SELECT * FROM reviews WHERE ${where} ORDER BY created ASC, review_id ASC`).all(...params);
|
|
51
|
+
return rows.map(recordFromRow);
|
|
52
|
+
}
|
|
53
|
+
export function mintReviewId() {
|
|
54
|
+
return newNodeId();
|
|
55
|
+
}
|
|
56
|
+
/** Atomically claim the idempotency key, without publishing any non-SQLite state. */
|
|
57
|
+
export function commitBindingReview(row) {
|
|
58
|
+
return withCanvasWrite((db) => {
|
|
59
|
+
const inserted = db.prepare(`
|
|
60
|
+
INSERT INTO reviews (
|
|
61
|
+
review_id, idempotency_key, origin_kind, origin_node_id, bridge_node_id,
|
|
62
|
+
companion_node_id, review_dir, file, origin_session_file, origin_session_id,
|
|
63
|
+
origin_leaf_id, model_spec, branch_file, baseline_sha256, baseline_bytes,
|
|
64
|
+
anchor_base_sha256, anchor_base_bytes, state, created, captured_at, opened_at,
|
|
65
|
+
output_path, subtitle, approved_at, approved_sha256, changed, comments_total,
|
|
66
|
+
comments_unresolved, result_json, canceled_at, cancel_reason, cancel_actor,
|
|
67
|
+
delivery_entry_id, delivered_at, delivery_error, projected_at, projection_error
|
|
68
|
+
) VALUES (
|
|
69
|
+
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
|
|
70
|
+
?, ?, ?, ?, ?, ?, ?, ?, ?, ?
|
|
71
|
+
) ON CONFLICT(idempotency_key) DO NOTHING
|
|
72
|
+
`).run(row.review_id, row.idempotency_key, row.origin_kind, row.origin_node_id, row.bridge_node_id, row.companion_node_id, row.review_dir, row.file, row.origin_session_file, row.origin_session_id, row.origin_leaf_id, row.model_spec, row.branch_file, row.baseline_sha256, row.baseline_bytes, row.anchor_base_sha256, row.anchor_base_bytes, 'binding', row.created, row.captured_at, row.opened_at, row.output_path, row.subtitle, row.approved_at, row.approved_sha256, row.changed === null ? null : row.changed ? 1 : 0, row.comments_total, row.comments_unresolved, row.result_json, row.canceled_at, row.cancel_reason, row.cancel_actor, row.delivery_entry_id, row.delivered_at, row.delivery_error, row.projected_at, row.projection_error);
|
|
73
|
+
const winner = db.prepare('SELECT review_id FROM reviews WHERE idempotency_key = ?').get(row.idempotency_key);
|
|
74
|
+
if (winner === undefined)
|
|
75
|
+
throw new Error(`review binding insert did not produce a row: ${row.idempotency_key}`);
|
|
76
|
+
return { review_id: winner.review_id, won: inserted.changes > 0 };
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
export function getReview(reviewId) {
|
|
80
|
+
return readRecord(openDb(), 'review_id = ?', reviewId);
|
|
81
|
+
}
|
|
82
|
+
export function getReviewByIdempotencyKey(key) {
|
|
83
|
+
return readRecord(openDb(), 'idempotency_key = ?', key);
|
|
84
|
+
}
|
|
85
|
+
export function getReviewByCompanion(nodeId) {
|
|
86
|
+
return readRecord(openDb(), "companion_node_id = ? AND state <> 'binding'", nodeId);
|
|
87
|
+
}
|
|
88
|
+
export function getReviewByBridge(nodeId) {
|
|
89
|
+
return readRecord(openDb(), "bridge_node_id = ? AND state <> 'binding'", nodeId);
|
|
90
|
+
}
|
|
91
|
+
export function listReviews(filter) {
|
|
92
|
+
const clauses = ["state <> 'binding'"];
|
|
93
|
+
const params = [];
|
|
94
|
+
if (filter.state !== undefined) {
|
|
95
|
+
clauses.push('state = ?');
|
|
96
|
+
params.push(filter.state);
|
|
97
|
+
}
|
|
98
|
+
if (filter.origin_node_id !== undefined) {
|
|
99
|
+
clauses.push('origin_node_id = ?');
|
|
100
|
+
params.push(filter.origin_node_id);
|
|
101
|
+
}
|
|
102
|
+
if (filter.file !== undefined) {
|
|
103
|
+
clauses.push('file = ?');
|
|
104
|
+
params.push(filter.file);
|
|
105
|
+
}
|
|
106
|
+
return readRecords(openDb(), clauses.join(' AND '), ...params);
|
|
107
|
+
}
|
|
108
|
+
export function listBindingReviews() {
|
|
109
|
+
return readRecords(openDb(), "state = 'binding'");
|
|
110
|
+
}
|
|
111
|
+
export function listUnprojectedTerminalReviews() {
|
|
112
|
+
return readRecords(openDb(), "state IN ('approved', 'canceled') AND projected_at IS NULL");
|
|
113
|
+
}
|
|
114
|
+
export function bindBridgeNode(reviewId, bridgeNodeId) {
|
|
115
|
+
return withCanvasWrite((db) => db.prepare('UPDATE reviews SET bridge_node_id = ? WHERE review_id = ? AND bridge_node_id IS NULL').run(bridgeNodeId, reviewId).changes > 0);
|
|
116
|
+
}
|
|
117
|
+
export function openReviewRow(reviewId, openedAt) {
|
|
118
|
+
return withCanvasWrite((db) => db.prepare("UPDATE reviews SET state = 'open', opened_at = ? WHERE review_id = ? AND state = 'binding'").run(openedAt, reviewId).changes > 0);
|
|
119
|
+
}
|
|
120
|
+
export function approveReviewLocked(db, args) {
|
|
121
|
+
return db.prepare(`
|
|
122
|
+
UPDATE reviews SET
|
|
123
|
+
state = 'approved', approved_at = ?, approved_sha256 = ?, changed = ?,
|
|
124
|
+
comments_total = ?, comments_unresolved = ?, result_json = ?
|
|
125
|
+
WHERE review_id = ? AND state = 'open'
|
|
126
|
+
`).run(args.approved_at, args.approved_sha256, args.changed ? 1 : 0, args.comments_total, args.comments_unresolved, args.result_json, args.review_id).changes > 0;
|
|
127
|
+
}
|
|
128
|
+
export function cancelReviewRow(reviewId, args) {
|
|
129
|
+
return withCanvasWrite((db) => db.prepare(`
|
|
130
|
+
UPDATE reviews SET
|
|
131
|
+
state = 'canceled', canceled_at = ?, cancel_reason = ?, cancel_actor = ?
|
|
132
|
+
WHERE review_id = ? AND state = 'open'
|
|
133
|
+
`).run(args.at, args.reason, args.actor, reviewId).changes > 0);
|
|
134
|
+
}
|
|
135
|
+
export function markProjected(reviewId, at) {
|
|
136
|
+
withCanvasWrite((db) => {
|
|
137
|
+
db.prepare('UPDATE reviews SET projected_at = ?, projection_error = NULL WHERE review_id = ?').run(at, reviewId);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
export function markProjectionError(reviewId, error) {
|
|
141
|
+
withCanvasWrite((db) => {
|
|
142
|
+
db.prepare('UPDATE reviews SET projection_error = ? WHERE review_id = ? AND projected_at IS NULL').run(error, reviewId);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
export function markDelivered(reviewId, receipt, at) {
|
|
146
|
+
withCanvasWrite((db) => {
|
|
147
|
+
db.prepare('UPDATE reviews SET delivery_entry_id = ?, delivered_at = ?, delivery_error = NULL WHERE review_id = ?').run(receipt, at, reviewId);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
export function markDeliveryError(reviewId, error) {
|
|
151
|
+
withCanvasWrite((db) => {
|
|
152
|
+
db.prepare('UPDATE reviews SET delivery_error = ? WHERE review_id = ? AND delivered_at IS NULL').run(error, reviewId);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
export function readAnchorBase(reviewId) {
|
|
156
|
+
const raw = openDb().prepare('SELECT anchor_base_bytes, anchor_base_sha256 FROM reviews WHERE review_id = ?').get(reviewId);
|
|
157
|
+
if (raw === undefined)
|
|
158
|
+
return null;
|
|
159
|
+
return { bytes: Buffer.from(raw.anchor_base_bytes), sha256: raw.anchor_base_sha256 };
|
|
160
|
+
}
|
|
161
|
+
export function replaceAnchorBaseLocked(db, reviewId, bytes, sha256) {
|
|
162
|
+
db.prepare('UPDATE reviews SET anchor_base_bytes = ?, anchor_base_sha256 = ? WHERE review_id = ?').run(bytes, sha256, reviewId);
|
|
163
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal-review ticket visibility filter.
|
|
3
|
+
* Hides canonical review tickets by state; passes pre-cutover tickets unchanged.
|
|
4
|
+
* This module never imports canvas DB directly; daemon call sites apply the filter.
|
|
5
|
+
*/
|
|
6
|
+
import type { TicketSummary } from '../human/types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Determines if a review ticket should be visible based on its canonical review state.
|
|
9
|
+
* A review ticket is hidden when a matching canonical row exists and its state is
|
|
10
|
+
* 'binding', 'approved', or 'canceled'. Pre-cutover tickets (no canonical row) remain visible.
|
|
11
|
+
*/
|
|
12
|
+
export declare function isReviewTicketVisible(bridgeNodeId: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Filters a ticket summary array to remove hidden terminal-review tickets.
|
|
15
|
+
* Deck tickets pass through unchanged. Review tickets are filtered by state.
|
|
16
|
+
*/
|
|
17
|
+
export declare function filterTerminalReviewTickets(items: TicketSummary[]): TicketSummary[];
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal-review ticket visibility filter.
|
|
3
|
+
* Hides canonical review tickets by state; passes pre-cutover tickets unchanged.
|
|
4
|
+
* This module never imports canvas DB directly; daemon call sites apply the filter.
|
|
5
|
+
*/
|
|
6
|
+
import { getReviewByBridge } from './store.js';
|
|
7
|
+
/**
|
|
8
|
+
* Determines if a review ticket should be visible based on its canonical review state.
|
|
9
|
+
* A review ticket is hidden when a matching canonical row exists and its state is
|
|
10
|
+
* 'binding', 'approved', or 'canceled'. Pre-cutover tickets (no canonical row) remain visible.
|
|
11
|
+
*/
|
|
12
|
+
export function isReviewTicketVisible(bridgeNodeId) {
|
|
13
|
+
const review = getReviewByBridge(bridgeNodeId);
|
|
14
|
+
// Pre-cutover ticket with no record: visible
|
|
15
|
+
if (review === null)
|
|
16
|
+
return true;
|
|
17
|
+
// Canonical review exists: hide terminal states, show open
|
|
18
|
+
return review.state === 'open';
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Filters a ticket summary array to remove hidden terminal-review tickets.
|
|
22
|
+
* Deck tickets pass through unchanged. Review tickets are filtered by state.
|
|
23
|
+
*/
|
|
24
|
+
export function filterTerminalReviewTickets(items) {
|
|
25
|
+
return items.filter((item) => {
|
|
26
|
+
// Deck tickets always pass through
|
|
27
|
+
if (item.kind === 'deck')
|
|
28
|
+
return true;
|
|
29
|
+
// Review tickets are filtered by visibility
|
|
30
|
+
return isReviewTicketVisible(item.id);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal review/comment/error vocabulary and constants.
|
|
3
|
+
* Phase 4 implementation: daemon-owned review lifecycle and comment authority.
|
|
4
|
+
* This module declares no HTTP status, DTOs, or I/O.
|
|
5
|
+
*/
|
|
6
|
+
import type { FeedbackComment } from '../human/types.js';
|
|
7
|
+
export type ReviewState = 'binding' | 'open' | 'approved' | 'canceled';
|
|
8
|
+
export type ReviewOriginKind = 'ticket' | 'inline';
|
|
9
|
+
export type CommentStatus = 'open' | 'resolved' | 'deleted';
|
|
10
|
+
export type CommentAuthorKind = 'human' | 'node';
|
|
11
|
+
export type CommentEventKind = 'created' | 'edited' | 'resolved' | 'reopened' | 'deleted' | 'reanchored' | 'notified' | 'notify_failed';
|
|
12
|
+
export type ReviewErrorCode = 'review_origin_missing' | 'review_origin_unforkable' | 'review_origin_unstable' | 'review_branch_unavailable' | 'branch_lost' | 'review_companion_unbound' | 'review_bridge_unsubscribed' | 'review_target_unreviewable' | 'source_unreadable' | 'delivery_unroutable' | 'unknown_review' | 'review_not_open' | 'review_terminal' | 'review_required' | 'stale_document' | 'unknown_comment' | 'comment_deleted' | 'invalid_anchor' | 'anchor_out_of_range' | 'text_too_long' | 'comment_limit_reached' | 'stale_comment' | 'range_batch_incomplete' | 'range_batch_stale';
|
|
13
|
+
/** Limits */
|
|
14
|
+
export declare const COMMENT_TEXT_MAX = 8000;
|
|
15
|
+
export declare const COMMENT_QUOTE_MAX = 4000;
|
|
16
|
+
export declare const COMMENT_LINE_TEXT_MAX = 8000;
|
|
17
|
+
export declare const LIVE_COMMENTS_MAX = 500;
|
|
18
|
+
export declare const COMMENT_EVENTS_PAGE_DEFAULT = 200;
|
|
19
|
+
export declare const COMMENT_EVENTS_PAGE_MAX = 1000;
|
|
20
|
+
export declare const COMPANION_BIND_DEADLINE_MS = 90000;
|
|
21
|
+
export interface CommentAnchor {
|
|
22
|
+
line: number;
|
|
23
|
+
end_line: number;
|
|
24
|
+
col_start?: number;
|
|
25
|
+
col_end?: number;
|
|
26
|
+
quote?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ReviewRow {
|
|
29
|
+
review_id: string;
|
|
30
|
+
idempotency_key: string;
|
|
31
|
+
origin_kind: ReviewOriginKind;
|
|
32
|
+
origin_node_id: string;
|
|
33
|
+
bridge_node_id: string | null;
|
|
34
|
+
companion_node_id: string;
|
|
35
|
+
review_dir: string;
|
|
36
|
+
file: string;
|
|
37
|
+
origin_session_file: string;
|
|
38
|
+
origin_session_id: string;
|
|
39
|
+
origin_leaf_id: string;
|
|
40
|
+
model_spec: string;
|
|
41
|
+
branch_file: string;
|
|
42
|
+
baseline_sha256: string;
|
|
43
|
+
baseline_bytes: number;
|
|
44
|
+
anchor_base_sha256: string;
|
|
45
|
+
anchor_base_bytes: Buffer;
|
|
46
|
+
state: ReviewState;
|
|
47
|
+
created: string;
|
|
48
|
+
captured_at: string;
|
|
49
|
+
opened_at: string | null;
|
|
50
|
+
output_path: string | null;
|
|
51
|
+
subtitle: string | null;
|
|
52
|
+
approved_at: string | null;
|
|
53
|
+
approved_sha256: string | null;
|
|
54
|
+
changed: boolean | null;
|
|
55
|
+
comments_total: number | null;
|
|
56
|
+
comments_unresolved: number | null;
|
|
57
|
+
result_json: string | null;
|
|
58
|
+
canceled_at: string | null;
|
|
59
|
+
cancel_reason: string | null;
|
|
60
|
+
cancel_actor: string | null;
|
|
61
|
+
delivery_entry_id: string | null;
|
|
62
|
+
delivered_at: string | null;
|
|
63
|
+
delivery_error: string | null;
|
|
64
|
+
projected_at: string | null;
|
|
65
|
+
projection_error: string | null;
|
|
66
|
+
}
|
|
67
|
+
export interface ReviewRecord extends Omit<ReviewRow, 'anchor_base_bytes'> {
|
|
68
|
+
source_missing: boolean;
|
|
69
|
+
}
|
|
70
|
+
export interface ReviewComment {
|
|
71
|
+
comment_id: string;
|
|
72
|
+
review_id: string;
|
|
73
|
+
status: CommentStatus;
|
|
74
|
+
revision: number;
|
|
75
|
+
text: string;
|
|
76
|
+
anchor: CommentAnchor;
|
|
77
|
+
anchor_state: 'live' | 'detached';
|
|
78
|
+
anchor_line_text: string;
|
|
79
|
+
anchor_doc_hash: string;
|
|
80
|
+
author: {
|
|
81
|
+
kind: CommentAuthorKind;
|
|
82
|
+
node_id: string | null;
|
|
83
|
+
};
|
|
84
|
+
updated_by: {
|
|
85
|
+
kind: CommentAuthorKind;
|
|
86
|
+
node_id: string | null;
|
|
87
|
+
};
|
|
88
|
+
created_at: string;
|
|
89
|
+
updated_at: string;
|
|
90
|
+
resolved_at: string | null;
|
|
91
|
+
deleted_at: string | null;
|
|
92
|
+
created_seq: number;
|
|
93
|
+
}
|
|
94
|
+
export interface ReviewCommentEvent {
|
|
95
|
+
seq: number;
|
|
96
|
+
review_id: string;
|
|
97
|
+
comment_id: string;
|
|
98
|
+
kind: CommentEventKind;
|
|
99
|
+
state_change: 0 | 1;
|
|
100
|
+
revision_after: number | null;
|
|
101
|
+
actor: {
|
|
102
|
+
kind: CommentAuthorKind | 'system';
|
|
103
|
+
node_id: string | null;
|
|
104
|
+
};
|
|
105
|
+
at: string;
|
|
106
|
+
operation_id: string;
|
|
107
|
+
payload?: unknown;
|
|
108
|
+
}
|
|
109
|
+
export interface ReviewResult {
|
|
110
|
+
schema: 'humanloop.review-response/v1';
|
|
111
|
+
review_id: string;
|
|
112
|
+
file: string;
|
|
113
|
+
submitted: true;
|
|
114
|
+
approved: true;
|
|
115
|
+
changed: boolean;
|
|
116
|
+
baseline_sha256: string;
|
|
117
|
+
approved_sha256: string;
|
|
118
|
+
companion_node_id: string;
|
|
119
|
+
comments_total: number;
|
|
120
|
+
comments_unresolved: number;
|
|
121
|
+
comments: FeedbackComment[];
|
|
122
|
+
submittedAt: string;
|
|
123
|
+
savedAt: string;
|
|
124
|
+
}
|
|
125
|
+
export declare class ReviewOperationError extends Error {
|
|
126
|
+
code: ReviewErrorCode;
|
|
127
|
+
detail: Record<string, unknown>;
|
|
128
|
+
constructor(code: ReviewErrorCode, message: string, detail: Record<string, unknown>);
|
|
129
|
+
}
|
|
130
|
+
export type NewReviewRow = ReviewRow;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal review/comment/error vocabulary and constants.
|
|
3
|
+
* Phase 4 implementation: daemon-owned review lifecycle and comment authority.
|
|
4
|
+
* This module declares no HTTP status, DTOs, or I/O.
|
|
5
|
+
*/
|
|
6
|
+
/** Limits */
|
|
7
|
+
export const COMMENT_TEXT_MAX = 8_000;
|
|
8
|
+
export const COMMENT_QUOTE_MAX = 4_000;
|
|
9
|
+
export const COMMENT_LINE_TEXT_MAX = 8_000;
|
|
10
|
+
export const LIVE_COMMENTS_MAX = 500;
|
|
11
|
+
export const COMMENT_EVENTS_PAGE_DEFAULT = 200;
|
|
12
|
+
export const COMMENT_EVENTS_PAGE_MAX = 1_000;
|
|
13
|
+
export const COMPANION_BIND_DEADLINE_MS = 90_000;
|
|
14
|
+
export class ReviewOperationError extends Error {
|
|
15
|
+
code;
|
|
16
|
+
detail;
|
|
17
|
+
constructor(code, message, detail) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.code = code;
|
|
20
|
+
this.detail = detail;
|
|
21
|
+
this.name = 'ReviewOperationError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|