@openrig/cli 0.4.4 → 0.4.7
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/daemon/assets/guidance/CULTURE-default.md +19 -0
- package/daemon/assets/guidance/openrig-start.md +20 -5
- package/daemon/assets/plugins/openrig-core/README.md +1 -1
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/SKILL.md +9 -6
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/precompact-hook.mjs +11 -72
- package/daemon/assets/plugins/openrig-core/skills/forming-an-openrig-mental-model/SKILL.md +34 -22
- package/daemon/assets/plugins/openrig-core/skills/messaging-the-human/SKILL.md +108 -0
- package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +11 -16
- package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +95 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +819 -101
- package/daemon/assets/plugins/openrig-core/skills/queue-handoff/SKILL.md +26 -9
- package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/SKILL.md +11 -9
- package/daemon/assets/plugins/openrig-core/skills/session-compaction-and-restore/SKILL.md +162 -0
- package/daemon/assets/plugins/openrig-core/skills/software-for-agents/SKILL.md +165 -0
- package/daemon/dist/adapters/cmux-transport.d.ts.map +1 -1
- package/daemon/dist/adapters/cmux-transport.js +8 -1
- package/daemon/dist/adapters/cmux-transport.js.map +1 -1
- package/daemon/dist/adapters/cmux.d.ts +9 -0
- package/daemon/dist/adapters/cmux.d.ts.map +1 -1
- package/daemon/dist/adapters/cmux.js +21 -0
- package/daemon/dist/adapters/cmux.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts +3 -0
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +32 -12
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/pi-resume.d.ts +32 -0
- package/daemon/dist/adapters/pi-resume.d.ts.map +1 -0
- package/daemon/dist/adapters/pi-resume.js +125 -0
- package/daemon/dist/adapters/pi-resume.js.map +1 -0
- package/daemon/dist/adapters/pi-runner-protocol.d.ts +88 -0
- package/daemon/dist/adapters/pi-runner-protocol.d.ts.map +1 -0
- package/daemon/dist/adapters/pi-runner-protocol.js +153 -0
- package/daemon/dist/adapters/pi-runner-protocol.js.map +1 -0
- package/daemon/dist/adapters/pi-runner.d.ts +99 -0
- package/daemon/dist/adapters/pi-runner.d.ts.map +1 -0
- package/daemon/dist/adapters/pi-runner.js +519 -0
- package/daemon/dist/adapters/pi-runner.js.map +1 -0
- package/daemon/dist/adapters/pi-runtime-adapter.d.ts +61 -0
- package/daemon/dist/adapters/pi-runtime-adapter.d.ts.map +1 -0
- package/daemon/dist/adapters/pi-runtime-adapter.js +356 -0
- package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -0
- package/daemon/dist/adapters/tmux.d.ts +22 -1
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +40 -1
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/build-info.js +3 -3
- package/daemon/dist/builtins/workflow-specs/branched-remediation.yaml +31 -0
- package/daemon/dist/builtins/workflow-specs/factory-rsi.yaml +152 -0
- package/daemon/dist/builtins/workflow-specs/gated-release.yaml +26 -0
- package/daemon/dist/builtins/workflow-specs/linear-build.yaml +21 -0
- package/daemon/dist/db/migrations/049_workflow_instance_version.d.ts +20 -0
- package/daemon/dist/db/migrations/049_workflow_instance_version.d.ts.map +1 -0
- package/daemon/dist/db/migrations/049_workflow_instance_version.js +24 -0
- package/daemon/dist/db/migrations/049_workflow_instance_version.js.map +1 -0
- package/daemon/dist/db/migrations/050_workflow_spec_json.d.ts +22 -0
- package/daemon/dist/db/migrations/050_workflow_spec_json.d.ts.map +1 -0
- package/daemon/dist/db/migrations/050_workflow_spec_json.js +26 -0
- package/daemon/dist/db/migrations/050_workflow_spec_json.js.map +1 -0
- package/daemon/dist/db/migrations/051_workflow_resume.d.ts +22 -0
- package/daemon/dist/db/migrations/051_workflow_resume.d.ts.map +1 -0
- package/daemon/dist/db/migrations/051_workflow_resume.js +27 -0
- package/daemon/dist/db/migrations/051_workflow_resume.js.map +1 -0
- package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.d.ts +26 -0
- package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.d.ts.map +1 -0
- package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.js +30 -0
- package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.js.map +1 -0
- package/daemon/dist/db/migrations/053_sessions_node_id_index.d.ts +48 -0
- package/daemon/dist/db/migrations/053_sessions_node_id_index.d.ts.map +1 -0
- package/daemon/dist/db/migrations/053_sessions_node_id_index.js +53 -0
- package/daemon/dist/db/migrations/053_sessions_node_id_index.js.map +1 -0
- package/daemon/dist/db/migrations/054_queue_transitions_archive.d.ts +34 -0
- package/daemon/dist/db/migrations/054_queue_transitions_archive.d.ts.map +1 -0
- package/daemon/dist/db/migrations/054_queue_transitions_archive.js +49 -0
- package/daemon/dist/db/migrations/054_queue_transitions_archive.js.map +1 -0
- package/daemon/dist/domain/claim-service.d.ts +11 -0
- package/daemon/dist/domain/claim-service.d.ts.map +1 -1
- package/daemon/dist/domain/claim-service.js +3 -1
- package/daemon/dist/domain/claim-service.js.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts +3 -0
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.js +19 -3
- package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
- package/daemon/dist/domain/cmux-layout-service.d.ts +36 -0
- package/daemon/dist/domain/cmux-layout-service.d.ts.map +1 -1
- package/daemon/dist/domain/cmux-layout-service.js +100 -28
- package/daemon/dist/domain/cmux-layout-service.js.map +1 -1
- package/daemon/dist/domain/context-monitor.d.ts +2 -0
- package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
- package/daemon/dist/domain/context-monitor.js +14 -0
- package/daemon/dist/domain/context-monitor.js.map +1 -1
- package/daemon/dist/domain/discovery-types.d.ts +1 -1
- package/daemon/dist/domain/discovery-types.d.ts.map +1 -1
- package/daemon/dist/domain/feed/attention-aggregator.js +1 -1
- package/daemon/dist/domain/feed/attention-aggregator.js.map +1 -1
- package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts +1 -0
- package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts.map +1 -1
- package/daemon/dist/domain/hosts/hosts-registry-reader.js +31 -10
- package/daemon/dist/domain/hosts/hosts-registry-reader.js.map +1 -1
- package/daemon/dist/domain/hosts/hosts-registry-writer.d.ts +11 -0
- package/daemon/dist/domain/hosts/hosts-registry-writer.d.ts.map +1 -0
- package/daemon/dist/domain/hosts/hosts-registry-writer.js +55 -0
- package/daemon/dist/domain/hosts/hosts-registry-writer.js.map +1 -0
- package/daemon/dist/domain/hosts/read-through.d.ts +28 -0
- package/daemon/dist/domain/hosts/read-through.d.ts.map +1 -0
- package/daemon/dist/domain/hosts/read-through.js +139 -0
- package/daemon/dist/domain/hosts/read-through.js.map +1 -0
- package/daemon/dist/domain/hosts/remote-daemon-http.d.ts +21 -0
- package/daemon/dist/domain/hosts/remote-daemon-http.d.ts.map +1 -1
- package/daemon/dist/domain/hosts/remote-daemon-http.js +56 -4
- package/daemon/dist/domain/hosts/remote-daemon-http.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts +10 -1
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +250 -97
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/node-launcher.d.ts +11 -0
- package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/node-launcher.js +10 -0
- package/daemon/dist/domain/node-launcher.js.map +1 -1
- package/daemon/dist/domain/plugin-vendor-service.d.ts +2 -0
- package/daemon/dist/domain/plugin-vendor-service.d.ts.map +1 -1
- package/daemon/dist/domain/plugin-vendor-service.js +23 -0
- package/daemon/dist/domain/plugin-vendor-service.js.map +1 -1
- package/daemon/dist/domain/policies/workflow-keepalive.d.ts +7 -0
- package/daemon/dist/domain/policies/workflow-keepalive.d.ts.map +1 -1
- package/daemon/dist/domain/policies/workflow-keepalive.js +93 -13
- package/daemon/dist/domain/policies/workflow-keepalive.js.map +1 -1
- package/daemon/dist/domain/projection-lane.d.ts +7 -0
- package/daemon/dist/domain/projection-lane.d.ts.map +1 -0
- package/daemon/dist/domain/projection-lane.js +28 -0
- package/daemon/dist/domain/projection-lane.js.map +1 -0
- package/daemon/dist/domain/ps-projection.d.ts +19 -0
- package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
- package/daemon/dist/domain/ps-projection.js +81 -30
- package/daemon/dist/domain/ps-projection.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +116 -7
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +226 -16
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/queue-retention.d.ts +130 -0
- package/daemon/dist/domain/queue-retention.d.ts.map +1 -0
- package/daemon/dist/domain/queue-retention.js +224 -0
- package/daemon/dist/domain/queue-retention.js.map +1 -0
- package/daemon/dist/domain/restore-orchestrator.d.ts +5 -0
- package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +29 -2
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/resume-token-capture.d.ts +13 -0
- package/daemon/dist/domain/resume-token-capture.d.ts.map +1 -1
- package/daemon/dist/domain/resume-token-capture.js +14 -1
- package/daemon/dist/domain/resume-token-capture.js.map +1 -1
- package/daemon/dist/domain/resume-token-validation.d.ts +1 -1
- package/daemon/dist/domain/resume-token-validation.d.ts.map +1 -1
- package/daemon/dist/domain/resume-token-validation.js +58 -10
- package/daemon/dist/domain/resume-token-validation.js.map +1 -1
- package/daemon/dist/domain/review/compose.d.ts +127 -5
- package/daemon/dist/domain/review/compose.d.ts.map +1 -1
- package/daemon/dist/domain/review/compose.js +244 -19
- package/daemon/dist/domain/review/compose.js.map +1 -1
- package/daemon/dist/domain/review/fleet-compose.d.ts +52 -0
- package/daemon/dist/domain/review/fleet-compose.d.ts.map +1 -0
- package/daemon/dist/domain/review/fleet-compose.js +294 -0
- package/daemon/dist/domain/review/fleet-compose.js.map +1 -0
- package/daemon/dist/domain/review/gather.d.ts +17 -2
- package/daemon/dist/domain/review/gather.d.ts.map +1 -1
- package/daemon/dist/domain/review/gather.js +269 -108
- package/daemon/dist/domain/review/gather.js.map +1 -1
- package/daemon/dist/domain/review/proof-io.d.ts +2 -0
- package/daemon/dist/domain/review/proof-io.d.ts.map +1 -0
- package/daemon/dist/domain/review/proof-io.js +38 -0
- package/daemon/dist/domain/review/proof-io.js.map +1 -0
- package/daemon/dist/domain/review/types.d.ts +104 -1
- package/daemon/dist/domain/review/types.d.ts.map +1 -1
- package/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
- package/daemon/dist/domain/rig-expansion-service.js +3 -0
- package/daemon/dist/domain/rig-expansion-service.js.map +1 -1
- package/daemon/dist/domain/rig-repository.d.ts +7 -6
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +33 -11
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-codec.js +3 -0
- package/daemon/dist/domain/rigspec-codec.js.map +1 -1
- package/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-exporter.js +4 -0
- package/daemon/dist/domain/rigspec-exporter.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +26 -2
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.d.ts +6 -0
- package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.js +26 -1
- package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
- package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-schema.js +20 -1
- package/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/daemon/dist/domain/runtime-verifier.d.ts +7 -1
- package/daemon/dist/domain/runtime-verifier.d.ts.map +1 -1
- package/daemon/dist/domain/runtime-verifier.js +39 -1
- package/daemon/dist/domain/runtime-verifier.js.map +1 -1
- package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts +8 -0
- package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts.map +1 -0
- package/daemon/dist/domain/scope/plan-lock-artifacts.js +57 -0
- package/daemon/dist/domain/scope/plan-lock-artifacts.js.map +1 -0
- package/daemon/dist/domain/scope/scaffold-placeholder.d.ts +38 -0
- package/daemon/dist/domain/scope/scaffold-placeholder.d.ts.map +1 -0
- package/daemon/dist/domain/scope/scaffold-placeholder.js +98 -0
- package/daemon/dist/domain/scope/scaffold-placeholder.js.map +1 -0
- package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-approve.js +22 -1
- package/daemon/dist/domain/scope/scope-approve.js.map +1 -1
- package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-audit.js +57 -20
- package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
- package/daemon/dist/domain/seat-handover-service.d.ts +9 -0
- package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-handover-service.js +2 -0
- package/daemon/dist/domain/seat-handover-service.js.map +1 -1
- package/daemon/dist/domain/seat-identity-store.d.ts +7 -0
- package/daemon/dist/domain/seat-identity-store.d.ts.map +1 -1
- package/daemon/dist/domain/seat-identity-store.js +27 -0
- package/daemon/dist/domain/seat-identity-store.js.map +1 -1
- package/daemon/dist/domain/seat-status-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-status-service.js +6 -4
- package/daemon/dist/domain/seat-status-service.js.map +1 -1
- package/daemon/dist/domain/session-name.d.ts +22 -0
- package/daemon/dist/domain/session-name.d.ts.map +1 -1
- package/daemon/dist/domain/session-name.js +29 -0
- package/daemon/dist/domain/session-name.js.map +1 -1
- package/daemon/dist/domain/session-transport.d.ts +17 -0
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +44 -0
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/slices/qitem-membership.d.ts +17 -0
- package/daemon/dist/domain/slices/qitem-membership.d.ts.map +1 -0
- package/daemon/dist/domain/slices/qitem-membership.js +60 -0
- package/daemon/dist/domain/slices/qitem-membership.js.map +1 -0
- package/daemon/dist/domain/slices/slice-detail-projector.d.ts +5 -0
- package/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -1
- package/daemon/dist/domain/slices/slice-detail-projector.js +161 -16
- package/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -1
- package/daemon/dist/domain/slices/slice-indexer.d.ts +86 -0
- package/daemon/dist/domain/slices/slice-indexer.d.ts.map +1 -1
- package/daemon/dist/domain/slices/slice-indexer.js +422 -45
- package/daemon/dist/domain/slices/slice-indexer.js.map +1 -1
- package/daemon/dist/domain/spec-library-workflow-scanner.d.ts +18 -2
- package/daemon/dist/domain/spec-library-workflow-scanner.d.ts.map +1 -1
- package/daemon/dist/domain/spec-library-workflow-scanner.js +23 -1
- package/daemon/dist/domain/spec-library-workflow-scanner.js.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.d.ts +9 -0
- package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.js +71 -3
- package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
- package/daemon/dist/domain/startup-proof.d.ts +10 -6
- package/daemon/dist/domain/startup-proof.d.ts.map +1 -1
- package/daemon/dist/domain/startup-proof.js +35 -7
- package/daemon/dist/domain/startup-proof.js.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.d.ts +16 -0
- package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.js +13 -0
- package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
- package/daemon/dist/domain/terminal/cmux-provider-adapter.d.ts +28 -0
- package/daemon/dist/domain/terminal/cmux-provider-adapter.d.ts.map +1 -0
- package/daemon/dist/domain/terminal/cmux-provider-adapter.js +100 -0
- package/daemon/dist/domain/terminal/cmux-provider-adapter.js.map +1 -0
- package/daemon/dist/domain/terminal/herdr-adapter.d.ts +94 -0
- package/daemon/dist/domain/terminal/herdr-adapter.d.ts.map +1 -0
- package/daemon/dist/domain/terminal/herdr-adapter.js +307 -0
- package/daemon/dist/domain/terminal/herdr-adapter.js.map +1 -0
- package/daemon/dist/domain/terminal/herdr-transport.d.ts +50 -0
- package/daemon/dist/domain/terminal/herdr-transport.d.ts.map +1 -0
- package/daemon/dist/domain/terminal/herdr-transport.js +145 -0
- package/daemon/dist/domain/terminal/herdr-transport.js.map +1 -0
- package/daemon/dist/domain/terminal/terminal-provider.d.ts +88 -0
- package/daemon/dist/domain/terminal/terminal-provider.d.ts.map +1 -0
- package/daemon/dist/domain/terminal/terminal-provider.js +17 -0
- package/daemon/dist/domain/terminal/terminal-provider.js.map +1 -0
- package/daemon/dist/domain/terminal/terminal-service.d.ts +60 -0
- package/daemon/dist/domain/terminal/terminal-service.d.ts.map +1 -0
- package/daemon/dist/domain/terminal/terminal-service.js +174 -0
- package/daemon/dist/domain/terminal/terminal-service.js.map +1 -0
- package/daemon/dist/domain/terminal/terminal-views-store.d.ts +77 -0
- package/daemon/dist/domain/terminal/terminal-views-store.d.ts.map +1 -0
- package/daemon/dist/domain/terminal/terminal-views-store.js +146 -0
- package/daemon/dist/domain/terminal/terminal-views-store.js.map +1 -0
- package/daemon/dist/domain/terminal/view-composer.d.ts +42 -0
- package/daemon/dist/domain/terminal/view-composer.d.ts.map +1 -0
- package/daemon/dist/domain/terminal/view-composer.js +137 -0
- package/daemon/dist/domain/terminal/view-composer.js.map +1 -0
- package/daemon/dist/domain/tmux-option-defaults.d.ts +89 -0
- package/daemon/dist/domain/tmux-option-defaults.d.ts.map +1 -0
- package/daemon/dist/domain/tmux-option-defaults.js +132 -0
- package/daemon/dist/domain/tmux-option-defaults.js.map +1 -0
- package/daemon/dist/domain/transcript-capture.d.ts +3 -0
- package/daemon/dist/domain/transcript-capture.d.ts.map +1 -1
- package/daemon/dist/domain/transcript-capture.js +28 -0
- package/daemon/dist/domain/transcript-capture.js.map +1 -1
- package/daemon/dist/domain/transcript-store.d.ts +10 -0
- package/daemon/dist/domain/transcript-store.d.ts.map +1 -1
- package/daemon/dist/domain/transcript-store.js +26 -0
- package/daemon/dist/domain/transcript-store.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +38 -1
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.js +92 -0
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/workflow/slice-workflow-projection.d.ts.map +1 -1
- package/daemon/dist/domain/workflow/slice-workflow-projection.js +6 -2
- package/daemon/dist/domain/workflow/slice-workflow-projection.js.map +1 -1
- package/daemon/dist/domain/workflow-boot-sweep.d.ts +28 -0
- package/daemon/dist/domain/workflow-boot-sweep.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-boot-sweep.js +102 -0
- package/daemon/dist/domain/workflow-boot-sweep.js.map +1 -0
- package/daemon/dist/domain/workflow-deadline.d.ts +74 -0
- package/daemon/dist/domain/workflow-deadline.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-deadline.js +165 -0
- package/daemon/dist/domain/workflow-deadline.js.map +1 -0
- package/daemon/dist/domain/workflow-exception-escalation.d.ts +33 -0
- package/daemon/dist/domain/workflow-exception-escalation.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-exception-escalation.js +104 -0
- package/daemon/dist/domain/workflow-exception-escalation.js.map +1 -0
- package/daemon/dist/domain/workflow-exception-router.d.ts +33 -0
- package/daemon/dist/domain/workflow-exception-router.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-exception-router.js +96 -0
- package/daemon/dist/domain/workflow-exception-router.js.map +1 -0
- package/daemon/dist/domain/workflow-exception.d.ts +90 -0
- package/daemon/dist/domain/workflow-exception.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-exception.js +122 -0
- package/daemon/dist/domain/workflow-exception.js.map +1 -0
- package/daemon/dist/domain/workflow-frontier-guard.d.ts +24 -0
- package/daemon/dist/domain/workflow-frontier-guard.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-frontier-guard.js +30 -0
- package/daemon/dist/domain/workflow-frontier-guard.js.map +1 -0
- package/daemon/dist/domain/workflow-instance-store.d.ts +28 -0
- package/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-instance-store.js +66 -10
- package/daemon/dist/domain/workflow-instance-store.js.map +1 -1
- package/daemon/dist/domain/workflow-keepalive-arming.d.ts +35 -0
- package/daemon/dist/domain/workflow-keepalive-arming.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-keepalive-arming.js +87 -0
- package/daemon/dist/domain/workflow-keepalive-arming.js.map +1 -0
- package/daemon/dist/domain/workflow-projector.d.ts +117 -2
- package/daemon/dist/domain/workflow-projector.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-projector.js +672 -41
- package/daemon/dist/domain/workflow-projector.js.map +1 -1
- package/daemon/dist/domain/workflow-role-context.d.ts +57 -0
- package/daemon/dist/domain/workflow-role-context.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-role-context.js +120 -0
- package/daemon/dist/domain/workflow-role-context.js.map +1 -0
- package/daemon/dist/domain/workflow-role-resolver.d.ts +65 -0
- package/daemon/dist/domain/workflow-role-resolver.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-role-resolver.js +108 -0
- package/daemon/dist/domain/workflow-role-resolver.js.map +1 -0
- package/daemon/dist/domain/workflow-runtime.d.ts +157 -1
- package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-runtime.js +718 -11
- package/daemon/dist/domain/workflow-runtime.js.map +1 -1
- package/daemon/dist/domain/workflow-spec-cache.d.ts +26 -1
- package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-spec-cache.js +327 -13
- package/daemon/dist/domain/workflow-spec-cache.js.map +1 -1
- package/daemon/dist/domain/workflow-types.d.ts +143 -8
- package/daemon/dist/domain/workflow-types.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-types.js +14 -1
- package/daemon/dist/domain/workflow-types.js.map +1 -1
- package/daemon/dist/domain/workflow-validator.d.ts +11 -1
- package/daemon/dist/domain/workflow-validator.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-validator.js +246 -1
- package/daemon/dist/domain/workflow-validator.js.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js +9 -4
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.js +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
- package/daemon/dist/index.d.ts +17 -0
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +44 -0
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/routes/activity.js +22 -0
- package/daemon/dist/routes/activity.js.map +1 -1
- package/daemon/dist/routes/hosts.d.ts +5 -0
- package/daemon/dist/routes/hosts.d.ts.map +1 -0
- package/daemon/dist/routes/hosts.js +346 -0
- package/daemon/dist/routes/hosts.js.map +1 -0
- package/daemon/dist/routes/mission-control.js +1 -1
- package/daemon/dist/routes/mission-control.js.map +1 -1
- package/daemon/dist/routes/missions.d.ts +7 -0
- package/daemon/dist/routes/missions.d.ts.map +1 -1
- package/daemon/dist/routes/missions.js +6 -1
- package/daemon/dist/routes/missions.js.map +1 -1
- package/daemon/dist/routes/ps.d.ts.map +1 -1
- package/daemon/dist/routes/ps.js +5 -1
- package/daemon/dist/routes/ps.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts +2 -7
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +272 -10
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/review.d.ts.map +1 -1
- package/daemon/dist/routes/review.js +26 -0
- package/daemon/dist/routes/review.js.map +1 -1
- package/daemon/dist/routes/rigs.d.ts.map +1 -1
- package/daemon/dist/routes/rigs.js +21 -10
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
- package/daemon/dist/routes/scope-audit.js +141 -135
- package/daemon/dist/routes/scope-audit.js.map +1 -1
- package/daemon/dist/routes/seat.js +13 -0
- package/daemon/dist/routes/seat.js.map +1 -1
- package/daemon/dist/routes/sessions.js +2 -1
- package/daemon/dist/routes/sessions.js.map +1 -1
- package/daemon/dist/routes/slices.d.ts.map +1 -1
- package/daemon/dist/routes/slices.js +48 -38
- package/daemon/dist/routes/slices.js.map +1 -1
- package/daemon/dist/routes/terminal.d.ts +11 -0
- package/daemon/dist/routes/terminal.d.ts.map +1 -0
- package/daemon/dist/routes/terminal.js +104 -0
- package/daemon/dist/routes/terminal.js.map +1 -0
- package/daemon/dist/routes/transcripts.d.ts.map +1 -1
- package/daemon/dist/routes/transcripts.js +62 -33
- package/daemon/dist/routes/transcripts.js.map +1 -1
- package/daemon/dist/routes/workflow.d.ts.map +1 -1
- package/daemon/dist/routes/workflow.js +102 -10
- package/daemon/dist/routes/workflow.js.map +1 -1
- package/daemon/dist/server.d.ts +5 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +22 -0
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +235 -12
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/agent-startup-guide.md +1 -0
- package/daemon/specs/agents/apps/vault-specialist/agent.yaml +2 -1
- package/daemon/specs/agents/conveyor/builder/agent.yaml +2 -1
- package/daemon/specs/agents/conveyor/lead/agent.yaml +2 -1
- package/daemon/specs/agents/conveyor/planner/agent.yaml +2 -1
- package/daemon/specs/agents/conveyor/reviewer/agent.yaml +2 -1
- package/daemon/specs/agents/design/product-designer/agent.yaml +12 -2
- package/daemon/specs/agents/development/implementer/agent.yaml +12 -2
- package/daemon/specs/agents/development/qa/agent.yaml +12 -2
- package/daemon/specs/agents/development/qa/guidance/role.md +1 -0
- package/daemon/specs/agents/factory-rsi/dogfood/agent.yaml +30 -0
- package/daemon/specs/agents/factory-rsi/dogfood/guidance/role.md +37 -0
- package/daemon/specs/agents/factory-rsi/release-manager/agent.yaml +30 -0
- package/daemon/specs/agents/factory-rsi/release-manager/guidance/role.md +40 -0
- package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +12 -2
- package/daemon/specs/agents/product-management/pm/agent.yaml +1 -2
- package/daemon/specs/agents/research/analyst/agent.yaml +2 -1
- package/daemon/specs/agents/research/synthesizer/agent.yaml +2 -1
- package/daemon/specs/agents/review/independent-reviewer/agent.yaml +12 -2
- package/daemon/specs/agents/shared/agent.yaml +5 -8
- package/daemon/specs/agents/shared/runtime/claude-settings.fragment.json +13 -1
- package/daemon/specs/agents/shared/skills/core/agent-starters/SKILL.md +132 -0
- package/daemon/{assets/plugins/openrig-core/skills → specs/agents/shared/skills/core}/agent-startup-and-context-ingestion/SKILL.md +27 -19
- package/daemon/specs/agents/shared/skills/core/attention-queue/SKILL.md +264 -0
- package/daemon/specs/agents/shared/skills/core/cross-host-rig-commands/SKILL.md +190 -0
- package/daemon/specs/agents/shared/skills/core/human-in-the-loop/SKILL.md +104 -0
- package/daemon/specs/agents/shared/skills/core/openrig-architect/SKILL.md +25 -8
- package/daemon/specs/agents/shared/skills/core/openrig-cmux/SKILL.md +81 -0
- package/daemon/specs/agents/shared/skills/core/openrig-herdr/SKILL.md +153 -0
- package/daemon/specs/agents/shared/skills/core/openrig-upgrade/SKILL.md +460 -0
- package/daemon/specs/agents/shared/skills/core/rig-bundles-and-shareable-artifacts/SKILL.md +101 -0
- package/daemon/specs/agents/shared/skills/core/rig-lifecycle/SKILL.md +22 -11
- package/daemon/specs/agents/shared/skills/core/session-source-fork/SKILL.md +160 -0
- package/daemon/specs/agents/shared/skills/core/specification-system/SKILL.md +103 -0
- package/daemon/specs/agents/shared/skills/core/topology-mutation-and-seat-management/SKILL.md +118 -0
- package/daemon/specs/agents/shared/skills/core/watchdog/SKILL.md +125 -0
- package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +4 -4
- package/daemon/specs/agents/shared/skills/pods/review-team/SKILL.md +3 -0
- package/daemon/specs/agents/shared/skills/process/brainstorming/OPENRIG.md +3 -3
- package/daemon/specs/agents/shared/skills/process/executing-plans/OPENRIG.md +1 -1
- package/daemon/specs/agents/shared/skills/process/frontend-design/SKILL.md +6 -3
- package/daemon/specs/agents/shared/skills/process/test-driven-development/SKILL.md +1 -1
- package/daemon/specs/agents/shared/skills/process/using-superpowers/OPENRIG.md +1 -1
- package/daemon/specs/agents/shared/skills/process/verification-before-completion/SKILL.md +12 -2
- package/daemon/specs/agents/shared/skills/process/writing-plans/OPENRIG.md +1 -1
- package/daemon/specs/rigs/focused/pm-team/CULTURE.md +1 -1
- package/daemon/specs/rigs/launch/factory-rsi/CULTURE.md +47 -0
- package/daemon/specs/rigs/launch/factory-rsi/rig.yaml +115 -0
- package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/agent.yaml +2 -2
- package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/guidance/role.md +5 -4
- package/daemon/specs/rigs/launch/kernel/agents/operator/agent/agent.yaml +2 -2
- package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +3 -5
- package/daemon/specs/rigs/launch/kernel/agents/queue/worker/agent.yaml +2 -2
- package/daemon/specs/rigs/launch/kernel/culture/CULTURE.md +3 -4
- package/daemon/specs/rigs/preview/product-team/CULTURE.md +1 -1
- package/dist/bin-wrapper.d.ts.map +1 -1
- package/dist/bin-wrapper.js +3 -1
- package/dist/bin-wrapper.js.map +1 -1
- package/dist/build-info.js +3 -3
- package/dist/cli-error.d.ts +33 -0
- package/dist/cli-error.d.ts.map +1 -0
- package/dist/cli-error.js +94 -0
- package/dist/cli-error.js.map +1 -0
- package/dist/commands/broadcast.d.ts +6 -1
- package/dist/commands/broadcast.d.ts.map +1 -1
- package/dist/commands/broadcast.js +101 -15
- package/dist/commands/broadcast.js.map +1 -1
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +99 -8
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/config-init-workspace.js +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +4 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +17 -11
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +5 -0
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/host.d.ts +14 -0
- package/dist/commands/host.d.ts.map +1 -1
- package/dist/commands/host.js +361 -23
- package/dist/commands/host.js.map +1 -1
- package/dist/commands/launch.d.ts.map +1 -1
- package/dist/commands/launch.js +5 -0
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/proof.js +1 -1
- package/dist/commands/proof.js.map +1 -1
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +26 -6
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts +36 -0
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +176 -31
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/restore-packet.d.ts.map +1 -1
- package/dist/commands/restore-packet.js +13 -2
- package/dist/commands/restore-packet.js.map +1 -1
- package/dist/commands/rig.d.ts.map +1 -1
- package/dist/commands/rig.js +122 -0
- package/dist/commands/rig.js.map +1 -1
- package/dist/commands/scope.js +2 -2
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +229 -30
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/slack.d.ts +37 -0
- package/dist/commands/slack.d.ts.map +1 -0
- package/dist/commands/slack.js +274 -0
- package/dist/commands/slack.js.map +1 -0
- package/dist/commands/terminal.d.ts +6 -0
- package/dist/commands/terminal.d.ts.map +1 -0
- package/dist/commands/terminal.js +116 -0
- package/dist/commands/terminal.js.map +1 -0
- package/dist/commands/transcript.d.ts +6 -1
- package/dist/commands/transcript.d.ts.map +1 -1
- package/dist/commands/transcript.js +113 -30
- package/dist/commands/transcript.js.map +1 -1
- package/dist/commands/ui.d.ts +1 -0
- package/dist/commands/ui.d.ts.map +1 -1
- package/dist/commands/ui.js +2 -0
- package/dist/commands/ui.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +10 -1
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +14 -3
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/workflow-errors.d.ts +23 -0
- package/dist/commands/workflow-errors.d.ts.map +1 -0
- package/dist/commands/workflow-errors.js +100 -0
- package/dist/commands/workflow-errors.js.map +1 -0
- package/dist/commands/workflow-follow.d.ts +71 -0
- package/dist/commands/workflow-follow.d.ts.map +1 -0
- package/dist/commands/workflow-follow.js +259 -0
- package/dist/commands/workflow-follow.js.map +1 -0
- package/dist/commands/workflow-render.d.ts +114 -0
- package/dist/commands/workflow-render.d.ts.map +1 -0
- package/dist/commands/workflow-render.js +223 -0
- package/dist/commands/workflow-render.js.map +1 -0
- package/dist/commands/workflow.d.ts +1 -0
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +278 -14
- package/dist/commands/workflow.js.map +1 -1
- package/dist/config-store.d.ts +15 -1
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +103 -0
- package/dist/config-store.js.map +1 -1
- package/dist/cross-host-cli-helpers.d.ts +13 -0
- package/dist/cross-host-cli-helpers.d.ts.map +1 -1
- package/dist/cross-host-cli-helpers.js +27 -0
- package/dist/cross-host-cli-helpers.js.map +1 -1
- package/dist/cross-host-target.d.ts +49 -0
- package/dist/cross-host-target.d.ts.map +1 -0
- package/dist/cross-host-target.js +35 -0
- package/dist/cross-host-target.js.map +1 -0
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +45 -14
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/host-registry.d.ts +14 -1
- package/dist/host-registry.d.ts.map +1 -1
- package/dist/host-registry.js +47 -6
- package/dist/host-registry.js.map +1 -1
- package/dist/host-selection.d.ts +13 -0
- package/dist/host-selection.d.ts.map +1 -0
- package/dist/host-selection.js +54 -0
- package/dist/host-selection.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/scope/scaffold-placeholder.d.ts +38 -0
- package/dist/lib/scope/scaffold-placeholder.d.ts.map +1 -0
- package/dist/lib/scope/scaffold-placeholder.js +98 -0
- package/dist/lib/scope/scaffold-placeholder.js.map +1 -0
- package/dist/lib/scope/scope-audit.d.ts.map +1 -1
- package/dist/lib/scope/scope-audit.js +57 -20
- package/dist/lib/scope/scope-audit.js.map +1 -1
- package/dist/lib/scope-templates/backlog-deprecation.md +1 -1
- package/dist/lib/scope-templates/backlog-tech-debt.md +1 -1
- package/dist/lib/scope-templates/bug-fix.md +1 -1
- package/dist/lib/scope-templates/implementation-prd.md +1 -1
- package/dist/lib/scope-templates/mission-notes.md +7 -2
- package/dist/lib/scope-templates/mission-placeholder.md +1 -1
- package/dist/lib/scope-templates/mission-progress.md +1 -1
- package/dist/lib/scope-templates/mission-release.md +1 -1
- package/dist/lib/scope-templates/placeholder.md +1 -1
- package/dist/lib/scope-templates/proof.md +1 -1
- package/dist/lib/scope-templates/release-feature.md +1 -1
- package/dist/lib/scope-templates/research.md +1 -1
- package/dist/lib/scope-templates/slice-progress.md +1 -1
- package/dist/remote-host-ops.d.ts +1 -0
- package/dist/remote-host-ops.d.ts.map +1 -1
- package/dist/remote-host-ops.js +13 -6
- package/dist/remote-host-ops.js.map +1 -1
- package/dist/session-name.d.ts +23 -0
- package/dist/session-name.d.ts.map +1 -0
- package/dist/session-name.js +61 -0
- package/dist/session-name.js.map +1 -0
- package/dist/slack/config.d.ts +41 -0
- package/dist/slack/config.d.ts.map +1 -0
- package/dist/slack/config.js +60 -0
- package/dist/slack/config.js.map +1 -0
- package/dist/slack/inbound.d.ts +75 -0
- package/dist/slack/inbound.d.ts.map +1 -0
- package/dist/slack/inbound.js +133 -0
- package/dist/slack/inbound.js.map +1 -0
- package/dist/slack/message.d.ts +26 -0
- package/dist/slack/message.d.ts.map +1 -0
- package/dist/slack/message.js +60 -0
- package/dist/slack/message.js.map +1 -0
- package/dist/slack/outbound.d.ts +39 -0
- package/dist/slack/outbound.d.ts.map +1 -0
- package/dist/slack/outbound.js +52 -0
- package/dist/slack/outbound.js.map +1 -0
- package/dist/slack/queue-bridge.d.ts +56 -0
- package/dist/slack/queue-bridge.d.ts.map +1 -0
- package/dist/slack/queue-bridge.js +114 -0
- package/dist/slack/queue-bridge.js.map +1 -0
- package/dist/slack/secrets.d.ts +21 -0
- package/dist/slack/secrets.d.ts.map +1 -0
- package/dist/slack/secrets.js +73 -0
- package/dist/slack/secrets.js.map +1 -0
- package/dist/slack/slack-api.d.ts +49 -0
- package/dist/slack/slack-api.d.ts.map +1 -0
- package/dist/slack/slack-api.js +110 -0
- package/dist/slack/slack-api.js.map +1 -0
- package/dist/slack/state-store.d.ts +62 -0
- package/dist/slack/state-store.d.ts.map +1 -0
- package/dist/slack/state-store.js +132 -0
- package/dist/slack/state-store.js.map +1 -0
- package/package.json +1 -1
- package/ui/dist/assets/index-DkNi0RT8.js +623 -0
- package/ui/dist/assets/index-N-SdPj-I.css +32 -0
- package/ui/dist/index.html +2 -2
- package/daemon/assets/plugins/openrig-core/skills/openrig-architect/SKILL.md +0 -361
- package/daemon/assets/plugins/openrig-core/skills/openrig-operator/SKILL.md +0 -222
- package/daemon/docs/reference/product-factory-vps-runbook.md +0 -132
- package/daemon/specs/agents/shared/skills/core/mission-slice-sop/SKILL.md +0 -115
- package/daemon/specs/agents/shared/skills/core/openrig-installer/SKILL.md +0 -142
- package/daemon/specs/agents/shared/skills/core/openrig-operator/SKILL.md +0 -110
- package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +0 -1245
- package/daemon/specs/agents/shared/skills/core/openrig-user-settings/SKILL.md +0 -153
- package/ui/dist/assets/index-D69ZhNIr.js +0 -598
- package/ui/dist/assets/index-DJYun-8d.css +0 -32
|
@@ -19,8 +19,11 @@
|
|
|
19
19
|
// signal (a hand-built/proxied Response is not necessarily wired to the
|
|
20
20
|
// controller — no trust in fetch internals).
|
|
21
21
|
import { readFileSync } from "node:fs";
|
|
22
|
-
/** Mirrors the CLI's resolveRemoteBearer (host-registry.ts):
|
|
23
|
-
* bearer_env / bearer_file, resolved at call time.
|
|
22
|
+
/** Mirrors the CLI's resolveRemoteBearer (host-registry.ts): at-most-one of
|
|
23
|
+
* bearer_env / bearer_file, resolved at call time. Neither configured is an
|
|
24
|
+
* anonymous (URL-only) host — a tokenless daemon; ok with no token, so no
|
|
25
|
+
* Authorization header is sent. A configured-but-unresolvable pointer still
|
|
26
|
+
* fails (fail-closed). */
|
|
24
27
|
function resolveBearer(host, deps) {
|
|
25
28
|
const env = deps.env ?? process.env;
|
|
26
29
|
const readFile = deps.readFile ?? ((p) => readFileSync(p, "utf-8"));
|
|
@@ -41,7 +44,7 @@ function resolveBearer(host, deps) {
|
|
|
41
44
|
return { ok: false, detail: `bearer file ${host.bearer_file} not readable for host ${host.id}` };
|
|
42
45
|
}
|
|
43
46
|
}
|
|
44
|
-
return { ok:
|
|
47
|
+
return { ok: true };
|
|
45
48
|
}
|
|
46
49
|
/** One bounded daemon→daemon JSON exchange. The single deadline covers
|
|
47
50
|
* request + body; every outcome is structured — this function never hangs
|
|
@@ -60,7 +63,7 @@ export async function remoteJsonRequest(host, path, opts) {
|
|
|
60
63
|
method: opts.method,
|
|
61
64
|
headers: {
|
|
62
65
|
...(opts.body !== undefined ? { "Content-Type": "application/json" } : {}),
|
|
63
|
-
Authorization: `Bearer ${bearer.token}
|
|
66
|
+
...(bearer.token ? { Authorization: `Bearer ${bearer.token}` } : {}),
|
|
64
67
|
},
|
|
65
68
|
...(opts.body !== undefined ? { body: JSON.stringify(opts.body) } : {}),
|
|
66
69
|
signal: controller.signal,
|
|
@@ -102,4 +105,53 @@ export async function remoteJsonRequest(host, path, opts) {
|
|
|
102
105
|
: "";
|
|
103
106
|
return { ok: false, kind: "http", status: res.status, detail: remoteError };
|
|
104
107
|
}
|
|
108
|
+
/** One bounded daemon→daemon GET, body passed through as text for ANY origin
|
|
109
|
+
* status (arch P3 verbatim rule). Same bearer resolution + single-deadline +
|
|
110
|
+
* explicit body race discipline as remoteJsonRequest; never hangs, never
|
|
111
|
+
* throws. */
|
|
112
|
+
export async function remoteRawRequest(host, path, opts) {
|
|
113
|
+
const bearer = resolveBearer(host, opts);
|
|
114
|
+
if (!bearer.ok)
|
|
115
|
+
return { ok: false, kind: "bearer", detail: bearer.detail };
|
|
116
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
117
|
+
const url = `${host.url.replace(/\/$/, "")}${path}`;
|
|
118
|
+
const controller = new AbortController();
|
|
119
|
+
const timer = setTimeout(() => controller.abort(), opts.timeoutMs);
|
|
120
|
+
let res;
|
|
121
|
+
try {
|
|
122
|
+
res = await fetchImpl(url, {
|
|
123
|
+
method: "GET",
|
|
124
|
+
headers: bearer.token ? { Authorization: `Bearer ${bearer.token}` } : {},
|
|
125
|
+
signal: controller.signal,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
clearTimeout(timer);
|
|
130
|
+
if (controller.signal.aborted)
|
|
131
|
+
return { ok: false, kind: "timeout", phase: "request", detail: "" };
|
|
132
|
+
return { ok: false, kind: "network", detail: err.message };
|
|
133
|
+
}
|
|
134
|
+
const abortRace = new Promise((_resolve, reject) => {
|
|
135
|
+
const onAbort = () => reject(new Error("body read aborted"));
|
|
136
|
+
if (controller.signal.aborted)
|
|
137
|
+
onAbort();
|
|
138
|
+
else
|
|
139
|
+
controller.signal.addEventListener("abort", onAbort, { once: true });
|
|
140
|
+
});
|
|
141
|
+
let bodyText = "";
|
|
142
|
+
let bodyTimedOut = false;
|
|
143
|
+
try {
|
|
144
|
+
bodyText = await Promise.race([res.text(), abortRace]);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
if (controller.signal.aborted)
|
|
148
|
+
bodyTimedOut = true;
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
clearTimeout(timer);
|
|
152
|
+
}
|
|
153
|
+
if (bodyTimedOut)
|
|
154
|
+
return { ok: false, kind: "timeout", phase: "body", status: res.status, detail: "" };
|
|
155
|
+
return { ok: true, status: res.status, contentType: res.headers.get("content-type") ?? "application/json", bodyText };
|
|
156
|
+
}
|
|
105
157
|
//# sourceMappingURL=remote-daemon-http.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-daemon-http.js","sourceRoot":"","sources":["../../../src/domain/hosts/remote-daemon-http.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,EAAE;AACF,0EAA0E;AAC1E,0EAA0E;AAC1E,sEAAsE;AACtE,uEAAuE;AACvE,oEAAoE;AACpE,EAAE;AACF,wEAAwE;AACxE,2EAA2E;AAC3E,oEAAoE;AACpE,yEAAyE;AACzE,2BAA2B;AAC3B,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,qEAAqE;AACrE,sEAAsE;AACtE,wEAAwE;AACxE,6CAA6C;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"remote-daemon-http.js","sourceRoot":"","sources":["../../../src/domain/hosts/remote-daemon-http.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import type Database from "better-sqlite3";
|
|
|
2
2
|
import type { NodeInventoryEntry, NodeDetailEntry, NodeRestoreOutcome, NodeLifecycleState, Snapshot, SeatIdentityVerdictKind } from "./types.js";
|
|
3
3
|
import type { RuntimeAdapter } from "./runtime-adapter.js";
|
|
4
4
|
import type { ContextUsageStore } from "./context-usage-store.js";
|
|
5
|
+
import type { TranscriptStore } from "./transcript-store.js";
|
|
5
6
|
import type { AgentActivityStore } from "./agent-activity-store.js";
|
|
6
7
|
import type { SeatActivityService } from "./seat-activity-service.js";
|
|
7
8
|
import type { TmuxAdapter } from "../adapters/tmux.js";
|
|
@@ -36,6 +37,8 @@ export declare function deriveNodeLifecycleState(input: {
|
|
|
36
37
|
* Single source of truth consumed by CLI, UI, and MCP.
|
|
37
38
|
*/
|
|
38
39
|
export declare function getNodeInventory(db: Database.Database, rigId: string): NodeInventoryEntry[];
|
|
40
|
+
export declare function getNodeInventoryForAllRigs(db: Database.Database): Map<string, NodeInventoryEntry[]>;
|
|
41
|
+
export declare function getNodeInventoryForRigs(db: Database.Database, rigIds: ReadonlySet<string>): Map<string, NodeInventoryEntry[]>;
|
|
39
42
|
/**
|
|
40
43
|
* Get detailed node information including startup files, resources, and events.
|
|
41
44
|
* The adapter dependency is optional — when provided, uses live listInstalled;
|
|
@@ -54,7 +57,7 @@ export declare function getNodeDetail(db: Database.Database, rigId: string, logi
|
|
|
54
57
|
* Context-aware wrapper: returns inventory with context usage attached.
|
|
55
58
|
* Uses one daemon-owned ContextUsageStore for all reads.
|
|
56
59
|
*/
|
|
57
|
-
export declare function getNodeInventoryWithContext(db: Database.Database, rigId: string, contextUsageStore: ContextUsageStore): NodeInventoryEntry[];
|
|
60
|
+
export declare function getNodeInventoryWithContext(db: Database.Database, rigId: string, contextUsageStore: ContextUsageStore, transcriptStore?: Pick<TranscriptStore, "getIngestHealth">): NodeInventoryEntry[];
|
|
58
61
|
/**
|
|
59
62
|
* Context-aware wrapper: returns node detail with context usage attached.
|
|
60
63
|
*/
|
|
@@ -76,6 +79,12 @@ export declare function attachTerminalActivityAndWork(entries: NodeInventoryEntr
|
|
|
76
79
|
db: Database.Database;
|
|
77
80
|
seatActivity?: SeatActivityService;
|
|
78
81
|
}): NodeInventoryEntry[];
|
|
82
|
+
/** EXPORTED (OPR.0.4.6.FAC1): the derived canonical coordinate
|
|
83
|
+
* `{pod}-{member}@{rig}` for an inventory entry — the binding layer's
|
|
84
|
+
* ONE string rule (tiebreak key AND recorded destination) reuses
|
|
85
|
+
* exactly this dual-key derivation, never a parallel one. */
|
|
86
|
+
export declare function deriveCanonicalFromEntry(entry: NodeInventoryEntry): string | null;
|
|
87
|
+
export declare function readPendingWorkBySession(db: Database.Database): Map<string, number>;
|
|
79
88
|
export declare function attachAgentActivity(entries: NodeInventoryEntry[], deps: {
|
|
80
89
|
tmuxAdapter: TmuxAdapter;
|
|
81
90
|
activityStore?: AgentActivityStore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-inventory.d.ts","sourceRoot":"","sources":["../../src/domain/node-inventory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAyD,kBAAkB,
|
|
1
|
+
{"version":3,"file":"node-inventory.d.ts","sourceRoot":"","sources":["../../src/domain/node-inventory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { identityVerdictDownranksRunning } from "./types.js";
|
|
2
2
|
import { SeatIdentityStore } from "./seat-identity-store.js";
|
|
3
|
-
import {
|
|
3
|
+
import { buildOrientedMap } from "./startup-proof.js";
|
|
4
4
|
import { probeSessionActivity } from "./session-transport.js";
|
|
5
|
-
import { findLatestUsableSnapshot } from "./rig-repository.js";
|
|
5
|
+
import { findLatestUsableSnapshot, findLatestUsableSnapshotsForAllRigs } from "./rig-repository.js";
|
|
6
6
|
import { resolveNodeWorkspace } from "./workspace/workspace-resolver.js";
|
|
7
7
|
import { deriveCanonicalSessionName } from "./session-name.js";
|
|
8
8
|
import { buildNativeResumeCommand, buildCodexResumeCore } from "./native-resume-probe.js";
|
|
@@ -142,32 +142,47 @@ function deriveContinuityOutcome(row, restoreOutcome) {
|
|
|
142
142
|
return null;
|
|
143
143
|
return restoreOutcome;
|
|
144
144
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
145
|
+
// FS-1 W1.3 S1 — hoist restore-outcome derivation to ONCE-PER-RIG.
|
|
146
|
+
// Prior shape: deriveRestoreOutcome(db, rigId, nodeId) fetched + JSON-parsed the
|
|
147
|
+
// rig's ENTIRE restore-event set once PER NODE inside buildInventoryEntry (K
|
|
148
|
+
// nodes x E events per rig per poll = the dominant W3 residual). This builds a
|
|
149
|
+
// nodeId->outcome map in ONE seq-DESC pass and buildInventoryEntry does an O(1)
|
|
150
|
+
// lookup.
|
|
151
|
+
// OPR.0.3.4.11 + 0.4.0.16: per-node-latest across restore.completed,
|
|
152
|
+
// restore.subset_completed, AND restore.outcome_reconciled. reconciled has a
|
|
153
|
+
// different shape (top-level nodeId/to, not result.nodes[]).
|
|
154
|
+
// BYTE-IDENTICAL BY CONSTRUCTION: the prior per-node reader returned the FIRST
|
|
155
|
+
// event in seq-DESC order that referenced the node. This single seq-DESC pass
|
|
156
|
+
// sets a node's outcome ONLY IF ABSENT — so the first (highest-seq) event
|
|
157
|
+
// referencing a node wins, reproducing exactly that (incl.
|
|
158
|
+
// newer-reconcile-overrides-older-failure). rigId given -> WHERE rig_id=? (the
|
|
159
|
+
// prior single-rig filter); rigId omitted -> all rigs in one pass (a nodeId is
|
|
160
|
+
// referenced only by its own rig's events, so the per-node value is identical).
|
|
161
|
+
// [GUARD AT CODE REVIEW: the only-if-absent set is the one load-bearing
|
|
162
|
+
// semantics cell — it is what preserves first/newest-wins.]
|
|
163
|
+
function buildRestoreOutcomeMap(db, rigId) {
|
|
164
|
+
const stmt = db.prepare(`SELECT type, payload, seq FROM events WHERE type IN ('restore.completed', 'restore.subset_completed', 'restore.outcome_reconciled')${rigId ? " AND rig_id = ?" : ""} ORDER BY seq DESC`);
|
|
165
|
+
const rows = (rigId ? stmt.all(rigId) : stmt.all());
|
|
166
|
+
const map = new Map();
|
|
152
167
|
for (const row of rows) {
|
|
153
168
|
try {
|
|
154
169
|
if (row.type === "restore.outcome_reconciled") {
|
|
155
170
|
const event = JSON.parse(row.payload);
|
|
156
|
-
if (event.nodeId
|
|
157
|
-
|
|
158
|
-
|
|
171
|
+
if (!map.has(event.nodeId))
|
|
172
|
+
map.set(event.nodeId, mapStatus(event.to));
|
|
173
|
+
continue;
|
|
159
174
|
}
|
|
160
175
|
const event = JSON.parse(row.payload);
|
|
161
|
-
const nodeResult
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
176
|
+
for (const nodeResult of event.result.nodes) {
|
|
177
|
+
if (!map.has(nodeResult.nodeId))
|
|
178
|
+
map.set(nodeResult.nodeId, mapStatus(nodeResult.status));
|
|
179
|
+
}
|
|
165
180
|
}
|
|
166
181
|
catch {
|
|
167
182
|
continue;
|
|
168
183
|
}
|
|
169
184
|
}
|
|
170
|
-
return
|
|
185
|
+
return map;
|
|
171
186
|
}
|
|
172
187
|
function mapStatus(status) {
|
|
173
188
|
if (status === "resumed")
|
|
@@ -288,6 +303,27 @@ export function getNodeInventory(db, rigId) {
|
|
|
288
303
|
// per projection (cheap indexed read, defensive to a missing table). Gates
|
|
289
304
|
// the running/active green derivations below.
|
|
290
305
|
const identityVerdicts = new SeatIdentityStore(db).getForRig(rigId);
|
|
306
|
+
// FS-1 W1.3 S1/S2 — the per-node restore-outcome + oriented reads built ONCE
|
|
307
|
+
// for the rig (was a query per node inside the rows.map). rig-scoped restore
|
|
308
|
+
// map = the prior WHERE rig_id=? filter; oriented map is node-scoped/global.
|
|
309
|
+
const restoreOutcomes = buildRestoreOutcomeMap(db, rigId);
|
|
310
|
+
const orienteds = buildOrientedMap(db);
|
|
311
|
+
const rows = queryInventoryRows(db, rigId);
|
|
312
|
+
return rows.map((row) => buildInventoryEntry(db, row, { usableSnapshot, workspaceSpec, identityVerdicts, restoreOutcomes, orienteds }));
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* FS-1 W1.2 — the shared inventory-row query. Extracted verbatim from the prior
|
|
316
|
+
* inline `getNodeInventory` SELECT so the single-rig and all-rigs paths run the
|
|
317
|
+
* IDENTICAL query.
|
|
318
|
+
* - `rigId` given → one rig (`WHERE n.rig_id = ?`, `ORDER BY n.created_at`) —
|
|
319
|
+
* byte-identical to the prior per-rig read.
|
|
320
|
+
* - `rigId` omitted → ALL rigs in one pass (no WHERE; `ORDER BY n.rig_id,
|
|
321
|
+
* n.created_at` so JS grouping preserves each rig's `created_at` order,
|
|
322
|
+
* matching the per-rig ordering exactly).
|
|
323
|
+
* The latest-session subquery (`s2.node_id = n.id ORDER BY id DESC LIMIT 1`)
|
|
324
|
+
* rides the W1.1 index (051, idx_sessions_node_created_id).
|
|
325
|
+
*/
|
|
326
|
+
function runInventoryRowQuery(db, whereClause, orderClause, params) {
|
|
291
327
|
// Join nodes with newest session (max ULID = max session.id string comparison)
|
|
292
328
|
// and the rig name
|
|
293
329
|
const hasCodexConfigProfile = db.prepare("PRAGMA table_info(nodes)").all()
|
|
@@ -295,7 +331,7 @@ export function getNodeInventory(db, rigId) {
|
|
|
295
331
|
const codexConfigProfileSelect = hasCodexConfigProfile
|
|
296
332
|
? "n.codex_config_profile"
|
|
297
333
|
: "NULL";
|
|
298
|
-
const
|
|
334
|
+
const stmt = db.prepare(`
|
|
299
335
|
SELECT
|
|
300
336
|
n.id as node_id,
|
|
301
337
|
n.rig_id,
|
|
@@ -303,6 +339,7 @@ export function getNodeInventory(db, rigId) {
|
|
|
303
339
|
n.logical_id,
|
|
304
340
|
n.pod_id,
|
|
305
341
|
p.namespace as pod_namespace,
|
|
342
|
+
n.role,
|
|
306
343
|
n.runtime,
|
|
307
344
|
n.model,
|
|
308
345
|
${codexConfigProfileSelect} as codex_config_profile,
|
|
@@ -332,82 +369,184 @@ export function getNodeInventory(db, rigId) {
|
|
|
332
369
|
LEFT JOIN sessions s ON s.node_id = n.id
|
|
333
370
|
AND s.id = (SELECT s2.id FROM sessions s2 WHERE s2.node_id = n.id ORDER BY s2.id DESC LIMIT 1)
|
|
334
371
|
LEFT JOIN bindings b ON b.node_id = n.id
|
|
335
|
-
|
|
336
|
-
ORDER BY
|
|
337
|
-
`)
|
|
338
|
-
return
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
handoverResult: row.handover_result ?? null,
|
|
377
|
-
previousOccupant: row.previous_occupant,
|
|
378
|
-
handoverAt: row.handover_at,
|
|
379
|
-
tmuxAttachCommand: row.binding_attachment_type === "tmux" && row.session_name ? `tmux attach -t ${row.session_name}` : null,
|
|
380
|
-
resumeCommand: computeResumeCommand(row.runtime, row.resume_token, row.codex_config_profile),
|
|
381
|
-
// OPR.0.4.0.26: recoveryGuidance is NOT inlined per node in the LIST
|
|
382
|
-
// payload. It duplicated ~47KB of templated prose across all nodes and
|
|
383
|
-
// no node-list consumer reads it. The full guidance is recomputed on
|
|
384
|
-
// the single-node detail path (getNodeDetail / GET
|
|
385
|
-
// /api/rigs/:rigId/nodes/:logicalId) — relocation, not loss.
|
|
386
|
-
recoveryGuidance: null,
|
|
387
|
-
latestError: row.startup_status === "ready" ? null : getLatestError(db, rigId, row.node_id),
|
|
388
|
-
// Extended fields
|
|
389
|
-
model: row.model,
|
|
390
|
-
agentRef: row.agent_ref,
|
|
391
|
-
profile: row.profile,
|
|
392
|
-
codexConfigProfile: row.codex_config_profile,
|
|
393
|
-
resolvedSpecName: row.resolved_spec_name,
|
|
394
|
-
resolvedSpecVersion: row.resolved_spec_version,
|
|
395
|
-
resolvedSpecHash: row.resolved_spec_hash,
|
|
396
|
-
cwd: row.cwd,
|
|
397
|
-
restorePolicy: row.restore_policy,
|
|
398
|
-
resumeType: row.resume_type,
|
|
399
|
-
resumeToken: row.resume_token,
|
|
400
|
-
startupCompletedAt: row.startup_completed_at,
|
|
401
|
-
// PL-007 Workspace Primitive — per-node workspace summary derived
|
|
402
|
-
// from cwd against the rig's typed workspace block. null when the
|
|
403
|
-
// rig has no workspace declaration.
|
|
404
|
-
workspace: resolveNodeWorkspace({ spec: workspaceSpec, cwd: row.cwd }),
|
|
405
|
-
// OPR.0.4.3.19 — the liveness identity verdict (third axis). null when
|
|
406
|
-
// never observed; carries evidence on mismatch/missing.
|
|
407
|
-
identityVerdict,
|
|
408
|
-
heldReason: deriveHeldReason(db, rigId, row.node_id, row.session_status),
|
|
409
|
-
};
|
|
372
|
+
${whereClause}
|
|
373
|
+
ORDER BY ${orderClause}
|
|
374
|
+
`);
|
|
375
|
+
return stmt.all(...params);
|
|
376
|
+
}
|
|
377
|
+
// Single-rig (WHERE n.rig_id=?) or ALL-rigs (no WHERE). Byte-identical SQL/order to
|
|
378
|
+
// the prior inline read; existing single-rig callers are unchanged.
|
|
379
|
+
function queryInventoryRows(db, rigId) {
|
|
380
|
+
return runInventoryRowQuery(db, rigId ? "WHERE n.rig_id = ?" : "", rigId ? "n.created_at" : "n.rig_id, n.created_at", rigId ? [rigId] : []);
|
|
381
|
+
}
|
|
382
|
+
// Scoped to a rig-id SET — every IN value bound as a parameter; per-rig created_at
|
|
383
|
+
// order preserved (same ORDER BY as the all-rigs path). Callers guarantee a
|
|
384
|
+
// non-empty list (empty set → getNodeInventoryForRigs returns early, no query run).
|
|
385
|
+
function queryInventoryRowsForRigs(db, rigIds) {
|
|
386
|
+
const placeholders = rigIds.map(() => "?").join(", ");
|
|
387
|
+
return runInventoryRowQuery(db, `WHERE n.rig_id IN (${placeholders})`, "n.rig_id, n.created_at", rigIds);
|
|
388
|
+
}
|
|
389
|
+
function buildInventoryEntry(db, row, ctx) {
|
|
390
|
+
const { usableSnapshot, workspaceSpec, identityVerdicts, restoreOutcomes, orienteds } = ctx;
|
|
391
|
+
// FS-1 W1.3 S1 — O(1) lookup into the once-per-rig restore-outcome map
|
|
392
|
+
// (byte-identical to the prior per-node deriveRestoreOutcome; "n-a" when a node
|
|
393
|
+
// is referenced by no restore event, matching the prior fall-through).
|
|
394
|
+
const restoreOutcome = restoreOutcomes.get(row.node_id) ?? "n-a";
|
|
395
|
+
// OPR.0.4.3.19 rev1-r2 B1 — a durable verdict is keyed only by node_id, so
|
|
396
|
+
// after a rebind/relaunch (same node, NEW session + NEW pane) a stale
|
|
397
|
+
// `verified` verdict for the OLD pane would otherwise be served for the new
|
|
398
|
+
// pane until the next 5s reconcile tick, suppressing down-rank and rendering
|
|
399
|
+
// a fresh squat/orphan false-green. Make applicability LOAD-BEARING at read
|
|
400
|
+
// time: a stored verdict applies ONLY when it was computed against the
|
|
401
|
+
// current binding (its sessionName === the latest session AND its
|
|
402
|
+
// registeredPane === the current binding pane). Otherwise treat it as ABSENT
|
|
403
|
+
// (null) — a STALE verdict becomes fail-open (never down-ranks a running
|
|
404
|
+
// seat), it does NOT itself down-rank. Only a MATCHING mismatch/pane_missing
|
|
405
|
+
// verdict down-ranks.
|
|
406
|
+
const identityVerdict = applicableVerdict(identityVerdicts.get(row.node_id) ?? null, row);
|
|
407
|
+
const lifecycleState = deriveNodeLifecycleState({
|
|
408
|
+
sessionStatus: row.session_status,
|
|
409
|
+
restoreOutcome,
|
|
410
|
+
nodeId: row.node_id,
|
|
411
|
+
usableSnapshot,
|
|
412
|
+
identityVerdict: identityVerdict?.verdict ?? null,
|
|
410
413
|
});
|
|
414
|
+
return {
|
|
415
|
+
rigId: row.rig_id,
|
|
416
|
+
rigName: row.rig_name,
|
|
417
|
+
logicalId: row.logical_id,
|
|
418
|
+
podId: row.pod_id,
|
|
419
|
+
podNamespace: row.pod_namespace,
|
|
420
|
+
// OPR.0.4.6.FAC1: the seat-side role dimension (nodes.role,
|
|
421
|
+
// declared in the pod-member spec) — the workflow binding layer's
|
|
422
|
+
// candidate filter. null = role-less (never role-resolved).
|
|
423
|
+
role: row.role,
|
|
424
|
+
canonicalSessionName: row.session_name,
|
|
425
|
+
attachmentType: row.binding_attachment_type ?? null,
|
|
426
|
+
nodeKind: deriveNodeKind(row.runtime),
|
|
427
|
+
runtime: row.runtime,
|
|
428
|
+
sessionStatus: row.session_status,
|
|
429
|
+
startupStatus: row.startup_status,
|
|
430
|
+
restoreOutcome,
|
|
431
|
+
// FS-1 W1.3 S2 — O(1) lookup into the fleet-batched oriented map
|
|
432
|
+
// (byte-identical to the prior per-node deriveOriented; "n-a" when a node has
|
|
433
|
+
// no proof events, matching deriveOriented's no-challenge branch).
|
|
434
|
+
oriented: orienteds.get(row.node_id) ?? "n-a",
|
|
435
|
+
lifecycleState,
|
|
436
|
+
occupantLifecycle: deriveOccupantLifecycle(row, identityVerdict?.verdict ?? null),
|
|
437
|
+
continuityOutcome: deriveContinuityOutcome(row, restoreOutcome),
|
|
438
|
+
handoverResult: row.handover_result ?? null,
|
|
439
|
+
previousOccupant: row.previous_occupant,
|
|
440
|
+
handoverAt: row.handover_at,
|
|
441
|
+
tmuxAttachCommand: row.binding_attachment_type === "tmux" && row.session_name ? `tmux attach -t ${row.session_name}` : null,
|
|
442
|
+
resumeCommand: computeResumeCommand(row.runtime, row.resume_token, row.codex_config_profile),
|
|
443
|
+
// OPR.0.4.0.26: recoveryGuidance is NOT inlined per node in the LIST
|
|
444
|
+
// payload. It duplicated ~47KB of templated prose across all nodes and
|
|
445
|
+
// no node-list consumer reads it. The full guidance is recomputed on
|
|
446
|
+
// the single-node detail path (getNodeDetail / GET
|
|
447
|
+
// /api/rigs/:rigId/nodes/:logicalId) — relocation, not loss.
|
|
448
|
+
recoveryGuidance: null,
|
|
449
|
+
latestError: row.startup_status === "ready" ? null : getLatestError(db, row.rig_id, row.node_id),
|
|
450
|
+
// Extended fields
|
|
451
|
+
model: row.model,
|
|
452
|
+
agentRef: row.agent_ref,
|
|
453
|
+
profile: row.profile,
|
|
454
|
+
codexConfigProfile: row.codex_config_profile,
|
|
455
|
+
resolvedSpecName: row.resolved_spec_name,
|
|
456
|
+
resolvedSpecVersion: row.resolved_spec_version,
|
|
457
|
+
resolvedSpecHash: row.resolved_spec_hash,
|
|
458
|
+
cwd: row.cwd,
|
|
459
|
+
restorePolicy: row.restore_policy,
|
|
460
|
+
resumeType: row.resume_type,
|
|
461
|
+
resumeToken: row.resume_token,
|
|
462
|
+
startupCompletedAt: row.startup_completed_at,
|
|
463
|
+
// PL-007 Workspace Primitive — per-node workspace summary derived
|
|
464
|
+
// from cwd against the rig's typed workspace block. null when the
|
|
465
|
+
// rig has no workspace declaration.
|
|
466
|
+
workspace: resolveNodeWorkspace({ spec: workspaceSpec, cwd: row.cwd }),
|
|
467
|
+
// OPR.0.4.3.19 — the liveness identity verdict (third axis). null when
|
|
468
|
+
// never observed; carries evidence on mismatch/missing.
|
|
469
|
+
identityVerdict,
|
|
470
|
+
heldReason: deriveHeldReason(db, row.rig_id, row.node_id, row.session_status),
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
/** FS-1 W1.2 — all-rigs batched form of `readRigWorkspaceJson`: one query,
|
|
474
|
+
* `rigId → WorkspaceSpec`. Rigs with no/malformed workspace are absent (callers
|
|
475
|
+
* default to null — byte-identical to `readRigWorkspaceJson`'s null return). */
|
|
476
|
+
function readAllRigWorkspaceJson(db) {
|
|
477
|
+
const out = new Map();
|
|
478
|
+
try {
|
|
479
|
+
const rows = db.prepare("SELECT id, workspace_json FROM rigs").all();
|
|
480
|
+
for (const row of rows) {
|
|
481
|
+
if (!row.workspace_json)
|
|
482
|
+
continue;
|
|
483
|
+
try {
|
|
484
|
+
out.set(row.id, JSON.parse(row.workspace_json));
|
|
485
|
+
}
|
|
486
|
+
catch { /* malformed → absent → caller null (matches per-rig) */ }
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
catch { /* column/table absent → empty → caller null (matches per-rig defensive path) */ }
|
|
490
|
+
return out;
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* FS-1 W1.2 — the rig-level N+1 collapse. Builds inventory for ALL rigs in a
|
|
494
|
+
* bounded, rig-count-INDEPENDENT set of queries: 3 batched setup reads
|
|
495
|
+
* (snapshots / workspaces / identity verdicts) + 1 all-rigs node SELECT, grouped
|
|
496
|
+
* by rig_id. Every entry is built through the SAME `buildInventoryEntry` that the
|
|
497
|
+
* per-rig `getNodeInventory` uses, so `getNodeInventoryForAllRigs(db).get(rigId)`
|
|
498
|
+
* is byte-identical to `getNodeInventory(db, rigId)` — the collapse changes only
|
|
499
|
+
* HOW the context + rows are fetched (batched vs per-rig), never how an entry is
|
|
500
|
+
* derived. Per-node reads inside `buildInventoryEntry` (`deriveRestoreOutcome`
|
|
501
|
+
* etc.) remain per-node and ride the 047 index — NOT the rig-level N+1 removed here.
|
|
502
|
+
*/
|
|
503
|
+
// Shared batched builder — the common body of the all-rigs and scoped-rigs paths.
|
|
504
|
+
// Builds the fleet setup maps + EXACTLY one fleet startup-orientation
|
|
505
|
+
// (buildOrientedMap) and one fleet restore-outcome (buildRestoreOutcomeMap) scan
|
|
506
|
+
// ONCE, then builds a NodeInventoryEntry for each PROVIDED row via the SAME
|
|
507
|
+
// buildInventoryEntry, grouped by rig_id with per-rig created_at order preserved.
|
|
508
|
+
// `rows` decides the scope (all rigs vs a selected rig set); entry derivation is
|
|
509
|
+
// identical, so a rig's entries are byte-identical regardless of which caller ran.
|
|
510
|
+
function buildInventoryMapFromRows(db, rows) {
|
|
511
|
+
const snapshotByRig = findLatestUsableSnapshotsForAllRigs(db);
|
|
512
|
+
const workspaceByRig = readAllRigWorkspaceJson(db);
|
|
513
|
+
const verdictsByRig = new SeatIdentityStore(db).getForAllRigs();
|
|
514
|
+
// FS-1 W1.3 S1/S2 — the per-node reads built ONCE (O(1) queries, not O(nodes)).
|
|
515
|
+
// Restore map unscoped: a nodeId is referenced only by its own rig's restore
|
|
516
|
+
// events, so each node's value equals the single-rig path.
|
|
517
|
+
const restoreOutcomes = buildRestoreOutcomeMap(db); // one fleet restore-outcome scan
|
|
518
|
+
const orienteds = buildOrientedMap(db); // one fleet startup-orientation scan
|
|
519
|
+
const out = new Map();
|
|
520
|
+
for (const row of rows) {
|
|
521
|
+
const entry = buildInventoryEntry(db, row, {
|
|
522
|
+
usableSnapshot: snapshotByRig.get(row.rig_id) ?? null,
|
|
523
|
+
workspaceSpec: workspaceByRig.get(row.rig_id) ?? null,
|
|
524
|
+
identityVerdicts: verdictsByRig.get(row.rig_id) ?? new Map(),
|
|
525
|
+
restoreOutcomes,
|
|
526
|
+
orienteds,
|
|
527
|
+
});
|
|
528
|
+
let list = out.get(row.rig_id);
|
|
529
|
+
if (!list) {
|
|
530
|
+
list = [];
|
|
531
|
+
out.set(row.rig_id, list);
|
|
532
|
+
}
|
|
533
|
+
list.push(entry);
|
|
534
|
+
}
|
|
535
|
+
return out;
|
|
536
|
+
}
|
|
537
|
+
export function getNodeInventoryForAllRigs(db) {
|
|
538
|
+
return buildInventoryMapFromRows(db, queryInventoryRows(db));
|
|
539
|
+
}
|
|
540
|
+
// slice-04 — inventory for a SELECTED set of rigs only (e.g. the rigs a summary
|
|
541
|
+
// actually returns), so the per-node fold never widens to rigs the caller excluded
|
|
542
|
+
// (e.g. archived). Retains exactly one fleet startup-orientation + one fleet
|
|
543
|
+
// restore-outcome scan via the shared builder. Empty set → empty Map, NO scans and
|
|
544
|
+
// no invalid `IN ()`. getNodeInventoryForRigs(db, {r}).get(r) is byte-identical to
|
|
545
|
+
// the all-rigs path's entry list for r (same rows, same builder).
|
|
546
|
+
export function getNodeInventoryForRigs(db, rigIds) {
|
|
547
|
+
if (rigIds.size === 0)
|
|
548
|
+
return new Map();
|
|
549
|
+
return buildInventoryMapFromRows(db, queryInventoryRowsForRigs(db, [...rigIds]));
|
|
411
550
|
}
|
|
412
551
|
/** PL-007 — read the rig's typed workspace block from `rigs.workspace_json`
|
|
413
552
|
* defensively. Migration 038 may not yet be applied in older test fixtures
|
|
@@ -577,7 +716,7 @@ export function getNodeDetail(db, rigId, logicalId, opts) {
|
|
|
577
716
|
* Context-aware wrapper: returns inventory with context usage attached.
|
|
578
717
|
* Uses one daemon-owned ContextUsageStore for all reads.
|
|
579
718
|
*/
|
|
580
|
-
export function getNodeInventoryWithContext(db, rigId, contextUsageStore) {
|
|
719
|
+
export function getNodeInventoryWithContext(db, rigId, contextUsageStore, transcriptStore) {
|
|
581
720
|
const entries = getNodeInventory(db, rigId);
|
|
582
721
|
// Find node IDs for batch read
|
|
583
722
|
const nodeRows = db.prepare("SELECT id, logical_id FROM nodes WHERE rig_id = ?").all(rigId);
|
|
@@ -595,7 +734,17 @@ export function getNodeInventoryWithContext(db, rigId, contextUsageStore) {
|
|
|
595
734
|
// large fleet; no node-list consumer reads it). All scalars are kept so
|
|
596
735
|
// the ring/table/filter consumers are unaffected. The full currentUsage
|
|
597
736
|
// remains on the detail/whoami path (getNodeDetailWithContext, whoami).
|
|
598
|
-
|
|
737
|
+
const transcriptIngest = transcriptStore && e.canonicalSessionName
|
|
738
|
+
? {
|
|
739
|
+
...transcriptStore.getIngestHealth(e.rigName, e.canonicalSessionName),
|
|
740
|
+
runtime: e.runtime,
|
|
741
|
+
}
|
|
742
|
+
: undefined;
|
|
743
|
+
return {
|
|
744
|
+
...e,
|
|
745
|
+
contextUsage: { ...usage, currentUsage: null },
|
|
746
|
+
...(transcriptIngest ? { transcriptIngest } : {}),
|
|
747
|
+
};
|
|
599
748
|
});
|
|
600
749
|
}
|
|
601
750
|
/**
|
|
@@ -689,7 +838,11 @@ function countPendingForEntry(entry, pendingByDest) {
|
|
|
689
838
|
}
|
|
690
839
|
return count;
|
|
691
840
|
}
|
|
692
|
-
|
|
841
|
+
/** EXPORTED (OPR.0.4.6.FAC1): the derived canonical coordinate
|
|
842
|
+
* `{pod}-{member}@{rig}` for an inventory entry — the binding layer's
|
|
843
|
+
* ONE string rule (tiebreak key AND recorded destination) reuses
|
|
844
|
+
* exactly this dual-key derivation, never a parallel one. */
|
|
845
|
+
export function deriveCanonicalFromEntry(entry) {
|
|
693
846
|
if (!entry.rigName || !entry.logicalId)
|
|
694
847
|
return null;
|
|
695
848
|
const dotIdx = entry.logicalId.indexOf(".");
|
|
@@ -699,7 +852,7 @@ function deriveCanonicalFromEntry(entry) {
|
|
|
699
852
|
const member = entry.logicalId.slice(dotIdx + 1);
|
|
700
853
|
return deriveCanonicalSessionName(pod, member, entry.rigName);
|
|
701
854
|
}
|
|
702
|
-
function readPendingWorkBySession(db) {
|
|
855
|
+
export function readPendingWorkBySession(db) {
|
|
703
856
|
const rows = db.prepare(`
|
|
704
857
|
SELECT destination_session, COUNT(*) as c
|
|
705
858
|
FROM queue_items
|