@openrig/cli 0.4.2 → 0.4.4
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/openrig-start.md +6 -0
- package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +42 -2
- package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +115 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +12 -12
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts +46 -0
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +167 -3
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/tmux.d.ts +31 -0
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +62 -0
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/build-info.d.ts +12 -0
- package/daemon/dist/build-info.d.ts.map +1 -0
- package/daemon/dist/build-info.js +11 -0
- package/daemon/dist/build-info.js.map +1 -0
- package/daemon/dist/db/migrations/045_resume_verification.d.ts +29 -0
- package/daemon/dist/db/migrations/045_resume_verification.d.ts.map +1 -0
- package/daemon/dist/db/migrations/045_resume_verification.js +34 -0
- package/daemon/dist/db/migrations/045_resume_verification.js.map +1 -0
- package/daemon/dist/db/migrations/046_seat_identity_verdicts.d.ts +41 -0
- package/daemon/dist/db/migrations/046_seat_identity_verdicts.d.ts.map +1 -0
- package/daemon/dist/db/migrations/046_seat_identity_verdicts.js +56 -0
- package/daemon/dist/db/migrations/046_seat_identity_verdicts.js.map +1 -0
- package/daemon/dist/db/migrations/047_events_node_type_index.d.ts +48 -0
- package/daemon/dist/db/migrations/047_events_node_type_index.d.ts.map +1 -0
- package/daemon/dist/db/migrations/047_events_node_type_index.js +52 -0
- package/daemon/dist/db/migrations/047_events_node_type_index.js.map +1 -0
- package/daemon/dist/db/migrations/048_queue_item_evidence_ref.d.ts +18 -0
- package/daemon/dist/db/migrations/048_queue_item_evidence_ref.d.ts.map +1 -0
- package/daemon/dist/db/migrations/048_queue_item_evidence_ref.js +22 -0
- package/daemon/dist/db/migrations/048_queue_item_evidence_ref.js.map +1 -0
- package/daemon/dist/domain/activity-endpoint.d.ts +25 -0
- package/daemon/dist/domain/activity-endpoint.d.ts.map +1 -0
- package/daemon/dist/domain/activity-endpoint.js +91 -0
- package/daemon/dist/domain/activity-endpoint.js.map +1 -0
- package/daemon/dist/domain/claim-service.d.ts +36 -0
- package/daemon/dist/domain/claim-service.d.ts.map +1 -1
- package/daemon/dist/domain/claim-service.js +90 -0
- package/daemon/dist/domain/claim-service.js.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts +57 -0
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.js +149 -3
- package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
- package/daemon/dist/domain/event-loop-monitor.d.ts +100 -0
- package/daemon/dist/domain/event-loop-monitor.d.ts.map +1 -0
- package/daemon/dist/domain/event-loop-monitor.js +127 -0
- package/daemon/dist/domain/event-loop-monitor.js.map +1 -0
- package/daemon/dist/domain/feed/attention-aggregator.d.ts +31 -0
- package/daemon/dist/domain/feed/attention-aggregator.d.ts.map +1 -0
- package/daemon/dist/domain/feed/attention-aggregator.js +119 -0
- package/daemon/dist/domain/feed/attention-aggregator.js.map +1 -0
- package/daemon/dist/domain/files/file-write-service.d.ts +11 -2
- package/daemon/dist/domain/files/file-write-service.d.ts.map +1 -1
- package/daemon/dist/domain/files/file-write-service.js +77 -0
- package/daemon/dist/domain/files/file-write-service.js.map +1 -1
- package/daemon/dist/domain/gate-predicate.d.ts +29 -0
- package/daemon/dist/domain/gate-predicate.d.ts.map +1 -0
- package/daemon/dist/domain/gate-predicate.js +73 -0
- package/daemon/dist/domain/gate-predicate.js.map +1 -0
- package/daemon/dist/domain/graph-projection.d.ts +7 -1
- package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
- package/daemon/dist/domain/graph-projection.js +19 -1
- package/daemon/dist/domain/graph-projection.js.map +1 -1
- package/daemon/dist/domain/hosts/fanout-contract.d.ts +33 -0
- package/daemon/dist/domain/hosts/fanout-contract.d.ts.map +1 -0
- package/daemon/dist/domain/hosts/fanout-contract.js +23 -0
- package/daemon/dist/domain/hosts/fanout-contract.js.map +1 -0
- package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts +49 -0
- package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts.map +1 -0
- package/daemon/dist/domain/hosts/hosts-registry-reader.js +165 -0
- package/daemon/dist/domain/hosts/hosts-registry-reader.js.map +1 -0
- package/daemon/dist/domain/hosts/remote-daemon-http.d.ts +35 -0
- package/daemon/dist/domain/hosts/remote-daemon-http.d.ts.map +1 -0
- package/daemon/dist/domain/hosts/remote-daemon-http.js +105 -0
- package/daemon/dist/domain/hosts/remote-daemon-http.js.map +1 -0
- package/daemon/dist/domain/human-route-enforcer.d.ts +71 -0
- package/daemon/dist/domain/human-route-enforcer.d.ts.map +1 -0
- package/daemon/dist/domain/human-route-enforcer.js +80 -0
- package/daemon/dist/domain/human-route-enforcer.js.map +1 -0
- package/daemon/dist/domain/mission-control/audit-browse.d.ts +8 -0
- package/daemon/dist/domain/mission-control/audit-browse.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/audit-browse.js +19 -0
- package/daemon/dist/domain/mission-control/audit-browse.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts +1 -1
- package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-action-log.js +4 -0
- package/daemon/dist/domain/mission-control/mission-control-action-log.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js +1 -1
- package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-read-layer.js +1 -1
- package/daemon/dist/domain/mission-control/mission-control-read-layer.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts +28 -0
- package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-write-contract.js +125 -0
- package/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts +7 -1
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +84 -5
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/periodic-snapshot-scheduler.d.ts +4 -0
- package/daemon/dist/domain/periodic-snapshot-scheduler.d.ts.map +1 -1
- package/daemon/dist/domain/periodic-snapshot-scheduler.js +11 -0
- package/daemon/dist/domain/periodic-snapshot-scheduler.js.map +1 -1
- package/daemon/dist/domain/policies/idle-gate-qitem.d.ts +14 -0
- package/daemon/dist/domain/policies/idle-gate-qitem.d.ts.map +1 -0
- package/daemon/dist/domain/policies/idle-gate-qitem.js +114 -0
- package/daemon/dist/domain/policies/idle-gate-qitem.js.map +1 -0
- package/daemon/dist/domain/ps-projection.d.ts +28 -1
- package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
- package/daemon/dist/domain/ps-projection.js +39 -0
- package/daemon/dist/domain/ps-projection.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +25 -1
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +111 -7
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.d.ts +8 -0
- package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +109 -27
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.d.ts +25 -1
- package/daemon/dist/domain/restore-plan-preview.d.ts.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.js +72 -4
- package/daemon/dist/domain/restore-plan-preview.js.map +1 -1
- package/daemon/dist/domain/resume-metadata-refresher.d.ts +44 -2
- package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
- package/daemon/dist/domain/resume-metadata-refresher.js +92 -6
- package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
- package/daemon/dist/domain/resume-token-capture.d.ts +50 -0
- package/daemon/dist/domain/resume-token-capture.d.ts.map +1 -0
- package/daemon/dist/domain/resume-token-capture.js +63 -0
- package/daemon/dist/domain/resume-token-capture.js.map +1 -0
- package/daemon/dist/domain/review/brief-spine.d.ts +19 -0
- package/daemon/dist/domain/review/brief-spine.d.ts.map +1 -0
- package/daemon/dist/domain/review/brief-spine.js +86 -0
- package/daemon/dist/domain/review/brief-spine.js.map +1 -0
- package/daemon/dist/domain/review/compose.d.ts +228 -0
- package/daemon/dist/domain/review/compose.d.ts.map +1 -0
- package/daemon/dist/domain/review/compose.js +773 -0
- package/daemon/dist/domain/review/compose.js.map +1 -0
- package/daemon/dist/domain/review/freeze.d.ts +31 -0
- package/daemon/dist/domain/review/freeze.d.ts.map +1 -0
- package/daemon/dist/domain/review/freeze.js +257 -0
- package/daemon/dist/domain/review/freeze.js.map +1 -0
- package/daemon/dist/domain/review/gather.d.ts +100 -0
- package/daemon/dist/domain/review/gather.d.ts.map +1 -0
- package/daemon/dist/domain/review/gather.js +676 -0
- package/daemon/dist/domain/review/gather.js.map +1 -0
- package/daemon/dist/domain/review/types.d.ts +258 -0
- package/daemon/dist/domain/review/types.d.ts.map +1 -0
- package/daemon/dist/domain/review/types.js +35 -0
- package/daemon/dist/domain/review/types.js.map +1 -0
- package/daemon/dist/domain/rig-status-compose.d.ts +62 -0
- package/daemon/dist/domain/rig-status-compose.d.ts.map +1 -0
- package/daemon/dist/domain/rig-status-compose.js +149 -0
- package/daemon/dist/domain/rig-status-compose.js.map +1 -0
- package/daemon/dist/domain/rig-teardown.d.ts +3 -1
- package/daemon/dist/domain/rig-teardown.d.ts.map +1 -1
- package/daemon/dist/domain/rig-teardown.js +4 -19
- package/daemon/dist/domain/rig-teardown.js.map +1 -1
- package/daemon/dist/domain/route-timing-recorder.d.ts +42 -0
- package/daemon/dist/domain/route-timing-recorder.d.ts.map +1 -0
- package/daemon/dist/domain/route-timing-recorder.js +62 -0
- package/daemon/dist/domain/route-timing-recorder.js.map +1 -0
- package/daemon/dist/domain/scope/scope-approve.d.ts +64 -0
- package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -0
- package/daemon/dist/domain/scope/scope-approve.js +153 -0
- package/daemon/dist/domain/scope/scope-approve.js.map +1 -0
- package/daemon/dist/domain/scope/scope-audit.d.ts +11 -1
- package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-audit.js +203 -2
- package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
- package/daemon/dist/domain/seat-handover-service.d.ts +50 -7
- package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-handover-service.js +273 -33
- package/daemon/dist/domain/seat-handover-service.js.map +1 -1
- package/daemon/dist/domain/seat-identity-reconciler.d.ts +59 -0
- package/daemon/dist/domain/seat-identity-reconciler.d.ts.map +1 -0
- package/daemon/dist/domain/seat-identity-reconciler.js +207 -0
- package/daemon/dist/domain/seat-identity-reconciler.js.map +1 -0
- package/daemon/dist/domain/seat-identity-store.d.ts +27 -0
- package/daemon/dist/domain/seat-identity-store.d.ts.map +1 -0
- package/daemon/dist/domain/seat-identity-store.js +106 -0
- package/daemon/dist/domain/seat-identity-store.js.map +1 -0
- package/daemon/dist/domain/seat-switch-client-service.d.ts +57 -0
- package/daemon/dist/domain/seat-switch-client-service.d.ts.map +1 -0
- package/daemon/dist/domain/seat-switch-client-service.js +168 -0
- package/daemon/dist/domain/seat-switch-client-service.js.map +1 -0
- package/daemon/dist/domain/self-attach-service.d.ts +8 -0
- package/daemon/dist/domain/self-attach-service.d.ts.map +1 -1
- package/daemon/dist/domain/self-attach-service.js +20 -7
- package/daemon/dist/domain/self-attach-service.js.map +1 -1
- package/daemon/dist/domain/session-registry.d.ts +35 -4
- package/daemon/dist/domain/session-registry.d.ts.map +1 -1
- package/daemon/dist/domain/session-registry.js +89 -10
- package/daemon/dist/domain/session-registry.js.map +1 -1
- package/daemon/dist/domain/session-transport.d.ts +8 -1
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +143 -37
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.js +34 -2
- package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
- package/daemon/dist/domain/startup-proof.d.ts +63 -0
- package/daemon/dist/domain/startup-proof.d.ts.map +1 -0
- package/daemon/dist/domain/startup-proof.js +165 -0
- package/daemon/dist/domain/startup-proof.js.map +1 -0
- package/daemon/dist/domain/successor-session-launcher.d.ts +103 -0
- package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -0
- package/daemon/dist/domain/successor-session-launcher.js +246 -0
- package/daemon/dist/domain/successor-session-launcher.js.map +1 -0
- package/daemon/dist/domain/topology/multi-rig-launcher.d.ts +49 -0
- package/daemon/dist/domain/topology/multi-rig-launcher.d.ts.map +1 -0
- package/daemon/dist/domain/topology/multi-rig-launcher.js +132 -0
- package/daemon/dist/domain/topology/multi-rig-launcher.js.map +1 -0
- package/daemon/dist/domain/topology/remote-up-leaf.d.ts +29 -0
- package/daemon/dist/domain/topology/remote-up-leaf.d.ts.map +1 -0
- package/daemon/dist/domain/topology/remote-up-leaf.js +60 -0
- package/daemon/dist/domain/topology/remote-up-leaf.js.map +1 -0
- package/daemon/dist/domain/topology/topology-manifest.d.ts +34 -0
- package/daemon/dist/domain/topology/topology-manifest.d.ts.map +1 -0
- package/daemon/dist/domain/topology/topology-manifest.js +195 -0
- package/daemon/dist/domain/topology/topology-manifest.js.map +1 -0
- package/daemon/dist/domain/types.d.ts +86 -0
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js +8 -0
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/up-command-router.d.ts +1 -1
- package/daemon/dist/domain/up-command-router.d.ts.map +1 -1
- package/daemon/dist/domain/up-command-router.js +34 -2
- package/daemon/dist/domain/up-command-router.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts +17 -0
- package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.js +109 -0
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/watchdog-jobs-repository.d.ts +2 -2
- package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-jobs-repository.js +4 -0
- package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.js +19 -0
- package/daemon/dist/domain/watchdog-policy-engine.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 +51 -6
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.d.ts +11 -0
- package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.js +82 -0
- package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +18 -1
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/routes/activity.d.ts.map +1 -1
- package/daemon/dist/routes/activity.js +26 -0
- package/daemon/dist/routes/activity.js.map +1 -1
- package/daemon/dist/routes/agent-images.d.ts.map +1 -1
- package/daemon/dist/routes/agent-images.js +139 -0
- package/daemon/dist/routes/agent-images.js.map +1 -1
- package/daemon/dist/routes/compaction.d.ts +17 -0
- package/daemon/dist/routes/compaction.d.ts.map +1 -0
- package/daemon/dist/routes/compaction.js +125 -0
- package/daemon/dist/routes/compaction.js.map +1 -0
- package/daemon/dist/routes/config.d.ts.map +1 -1
- package/daemon/dist/routes/config.js +15 -6
- package/daemon/dist/routes/config.js.map +1 -1
- package/daemon/dist/routes/files.d.ts.map +1 -1
- package/daemon/dist/routes/files.js +45 -1
- package/daemon/dist/routes/files.js.map +1 -1
- package/daemon/dist/routes/mission-control.d.ts.map +1 -1
- package/daemon/dist/routes/mission-control.js +67 -2
- package/daemon/dist/routes/mission-control.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts +8 -2
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +44 -4
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/restore-check.d.ts +10 -0
- package/daemon/dist/routes/restore-check.d.ts.map +1 -1
- package/daemon/dist/routes/restore-check.js +46 -37
- package/daemon/dist/routes/restore-check.js.map +1 -1
- package/daemon/dist/routes/review.d.ts +3 -0
- package/daemon/dist/routes/review.d.ts.map +1 -0
- package/daemon/dist/routes/review.js +169 -0
- package/daemon/dist/routes/review.js.map +1 -0
- package/daemon/dist/routes/rigs.d.ts.map +1 -1
- package/daemon/dist/routes/rigs.js +70 -1
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/scope-approve.d.ts +3 -0
- package/daemon/dist/routes/scope-approve.d.ts.map +1 -0
- package/daemon/dist/routes/scope-approve.js +55 -0
- package/daemon/dist/routes/scope-approve.js.map +1 -0
- package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
- package/daemon/dist/routes/scope-audit.js +28 -1
- package/daemon/dist/routes/scope-audit.js.map +1 -1
- package/daemon/dist/routes/seat.d.ts.map +1 -1
- package/daemon/dist/routes/seat.js +53 -2
- package/daemon/dist/routes/seat.js.map +1 -1
- package/daemon/dist/routes/sessions.d.ts.map +1 -1
- package/daemon/dist/routes/sessions.js +44 -9
- 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 +49 -9
- package/daemon/dist/routes/slices.js.map +1 -1
- package/daemon/dist/routes/snapshots.d.ts.map +1 -1
- package/daemon/dist/routes/snapshots.js +16 -1
- package/daemon/dist/routes/snapshots.js.map +1 -1
- package/daemon/dist/routes/terminal-ws.d.ts.map +1 -1
- package/daemon/dist/routes/terminal-ws.js +58 -21
- package/daemon/dist/routes/terminal-ws.js.map +1 -1
- package/daemon/dist/routes/transport.d.ts.map +1 -1
- package/daemon/dist/routes/transport.js +12 -5
- package/daemon/dist/routes/transport.js.map +1 -1
- package/daemon/dist/routes/up.d.ts.map +1 -1
- package/daemon/dist/routes/up.js +84 -0
- package/daemon/dist/routes/up.js.map +1 -1
- package/daemon/dist/routes/workspace.js +2 -2
- package/daemon/dist/server.d.ts +33 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +41 -1
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts +1 -0
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +108 -20
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/agent-startup-guide.md +1 -1
- package/daemon/docs/reference/product-factory-vps-runbook.md +132 -0
- package/daemon/docs/reference/sdlc-conventions.md +187 -0
- package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/builder/guidance/role.md +1 -0
- package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/lead/guidance/role.md +1 -0
- package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/planner/guidance/role.md +1 -0
- package/daemon/specs/agents/conveyor/reviewer/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/reviewer/guidance/role.md +1 -0
- package/daemon/specs/agents/design/product-designer/agent.yaml +1 -1
- package/daemon/specs/agents/design/product-designer/guidance/role.md +1 -0
- package/daemon/specs/agents/development/implementer/agent.yaml +1 -1
- package/daemon/specs/agents/development/implementer/guidance/role.md +1 -0
- package/daemon/specs/agents/development/qa/agent.yaml +1 -1
- package/daemon/specs/agents/development/qa/guidance/role.md +1 -0
- package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -1
- package/daemon/specs/agents/orchestration/orchestrator/guidance/role.md +1 -0
- package/daemon/specs/agents/product-management/pm/agent.yaml +1 -0
- package/daemon/specs/agents/product-management/pm/guidance/role.md +13 -0
- package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -1
- package/daemon/specs/agents/review/independent-reviewer/guidance/role.md +1 -0
- package/daemon/specs/agents/shared/agent.yaml +2 -0
- package/daemon/specs/agents/shared/skills/core/mission-slice-sop/SKILL.md +115 -0
- package/daemon/specs/agents/shared/skills/core/openrig-operator/SKILL.md +4 -4
- package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +69 -23
- package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +3 -3
- package/daemon/specs/rigs/focused/pm-team/CULTURE.md +4 -0
- package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +1 -1
- package/daemon/specs/rigs/launch/kernel/agents/operator/agent/startup/context.md +1 -1
- package/daemon/specs/rigs/preview/product-team/CULTURE.md +4 -0
- package/dist/build-info.d.ts +8 -0
- package/dist/build-info.d.ts.map +1 -0
- package/dist/build-info.js +11 -0
- package/dist/build-info.js.map +1 -0
- package/dist/commands/compact.d.ts +15 -0
- package/dist/commands/compact.d.ts.map +1 -0
- package/dist/commands/compact.js +62 -0
- package/dist/commands/compact.js.map +1 -0
- package/dist/commands/config-init-workspace.d.ts.map +1 -1
- package/dist/commands/config-init-workspace.js +20 -4
- package/dist/commands/config-init-workspace.js.map +1 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +18 -2
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/doctor.js +2 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/expand.js +1 -1
- package/dist/commands/expand.js.map +1 -1
- package/dist/commands/file.d.ts +7 -0
- package/dist/commands/file.d.ts.map +1 -0
- package/dist/commands/file.js +77 -0
- package/dist/commands/file.js.map +1 -0
- package/dist/commands/fork.d.ts +4 -0
- package/dist/commands/fork.d.ts.map +1 -0
- package/dist/commands/fork.js +101 -0
- package/dist/commands/fork.js.map +1 -0
- package/dist/commands/host.d.ts +34 -0
- package/dist/commands/host.d.ts.map +1 -0
- package/dist/commands/host.js +448 -0
- package/dist/commands/host.js.map +1 -0
- package/dist/commands/launch.d.ts.map +1 -1
- package/dist/commands/launch.js +34 -4
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/proof.d.ts +54 -0
- package/dist/commands/proof.d.ts.map +1 -0
- package/dist/commands/proof.js +311 -0
- package/dist/commands/proof.js.map +1 -0
- package/dist/commands/ps.d.ts +41 -7
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +357 -135
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts +6 -0
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +154 -4
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/reconcile-session.d.ts.map +1 -1
- package/dist/commands/reconcile-session.js +2 -2
- package/dist/commands/reconcile-session.js.map +1 -1
- package/dist/commands/restore-check.d.ts.map +1 -1
- package/dist/commands/restore-check.js +93 -0
- package/dist/commands/restore-check.js.map +1 -1
- package/dist/commands/scope.d.ts.map +1 -1
- package/dist/commands/scope.js +191 -4
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/seat.d.ts +17 -0
- package/dist/commands/seat.d.ts.map +1 -1
- package/dist/commands/seat.js +145 -32
- package/dist/commands/seat.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +161 -11
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/start.d.ts +5 -0
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/startup-proof.d.ts +24 -0
- package/dist/commands/startup-proof.d.ts.map +1 -0
- package/dist/commands/startup-proof.js +100 -0
- package/dist/commands/startup-proof.js.map +1 -0
- package/dist/commands/unclaim.js +2 -2
- package/dist/commands/unclaim.js.map +1 -1
- package/dist/commands/up.d.ts +2 -0
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +79 -2
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/watchdog.js +2 -2
- package/dist/commands/watchdog.js.map +1 -1
- package/dist/commands/workspace.js +6 -6
- package/dist/commands/workspace.js.map +1 -1
- package/dist/config-store.d.ts +4 -0
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +68 -0
- package/dist/config-store.js.map +1 -1
- package/dist/cross-host-executor.d.ts +1 -0
- package/dist/cross-host-executor.d.ts.map +1 -1
- package/dist/cross-host-executor.js +4 -1
- package/dist/cross-host-executor.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +23 -0
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +54 -6
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/host-registry.d.ts +9 -0
- package/dist/host-registry.d.ts.map +1 -1
- package/dist/host-registry.js +32 -2
- package/dist/host-registry.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/codex-auth.d.ts +24 -0
- package/dist/lib/codex-auth.d.ts.map +1 -1
- package/dist/lib/codex-auth.js +89 -17
- package/dist/lib/codex-auth.js.map +1 -1
- package/dist/lib/file-transfer.d.ts +89 -0
- package/dist/lib/file-transfer.d.ts.map +1 -0
- package/dist/lib/file-transfer.js +300 -0
- package/dist/lib/file-transfer.js.map +1 -0
- package/dist/lib/hosts/fanout-contract.d.ts +33 -0
- package/dist/lib/hosts/fanout-contract.d.ts.map +1 -0
- package/dist/lib/hosts/fanout-contract.js +23 -0
- package/dist/lib/hosts/fanout-contract.js.map +1 -0
- package/dist/lib/scope/scope-audit.d.ts +11 -1
- package/dist/lib/scope/scope-audit.d.ts.map +1 -1
- package/dist/lib/scope/scope-audit.js +203 -2
- package/dist/lib/scope/scope-audit.js.map +1 -1
- package/dist/lib/scope/templates.d.ts +1 -0
- package/dist/lib/scope/templates.d.ts.map +1 -1
- package/dist/lib/scope/templates.js +9 -0
- package/dist/lib/scope/templates.js.map +1 -1
- package/dist/lib/scope-templates/backlog-deprecation.md +16 -0
- package/dist/lib/scope-templates/backlog-tech-debt.md +16 -0
- package/dist/lib/scope-templates/bug-fix.md +16 -0
- package/dist/lib/scope-templates/implementation-prd.md +33 -0
- package/dist/lib/scope-templates/mission-placeholder.md +41 -0
- package/dist/lib/scope-templates/mission-progress.md +2 -0
- package/dist/lib/scope-templates/mission-release.md +41 -0
- package/dist/lib/scope-templates/placeholder.md +12 -4
- package/dist/lib/scope-templates/proof.md +6 -0
- package/dist/lib/scope-templates/release-feature.md +14 -6
- package/dist/lib/scope-templates/research.md +16 -0
- package/dist/lib/scope-templates/slice-progress.md +2 -0
- package/dist/openrig-compat.d.ts +19 -0
- package/dist/openrig-compat.d.ts.map +1 -1
- package/dist/openrig-compat.js +31 -1
- package/dist/openrig-compat.js.map +1 -1
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +11 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
- package/ui/dist/assets/index-D69ZhNIr.js +598 -0
- package/ui/dist/assets/index-DJYun-8d.css +32 -0
- package/ui/dist/index.html +23 -2
- package/ui/dist/assets/index-CnqRX7A3.css +0 -32
- package/ui/dist/assets/index-CtL9jXFt.js +0 -582
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export interface SshHostEntry {
|
|
2
|
+
id: string;
|
|
3
|
+
transport: "ssh";
|
|
4
|
+
target: string;
|
|
5
|
+
user?: string;
|
|
6
|
+
notes?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface HttpHostEntry {
|
|
9
|
+
id: string;
|
|
10
|
+
transport: "http";
|
|
11
|
+
url: string;
|
|
12
|
+
bearer_env?: string;
|
|
13
|
+
bearer_file?: string;
|
|
14
|
+
notes?: string;
|
|
15
|
+
}
|
|
16
|
+
export type HostEntry = SshHostEntry | HttpHostEntry;
|
|
17
|
+
export interface HostRegistry {
|
|
18
|
+
hosts: HostEntry[];
|
|
19
|
+
}
|
|
20
|
+
export type HostRegistryLoadResult = {
|
|
21
|
+
ok: true;
|
|
22
|
+
registry: HostRegistry;
|
|
23
|
+
} | {
|
|
24
|
+
ok: false;
|
|
25
|
+
error: string;
|
|
26
|
+
};
|
|
27
|
+
export type HostResolution = {
|
|
28
|
+
ok: true;
|
|
29
|
+
host: HostEntry;
|
|
30
|
+
} | {
|
|
31
|
+
ok: false;
|
|
32
|
+
error: string;
|
|
33
|
+
};
|
|
34
|
+
export declare function defaultHostRegistryPath(): string;
|
|
35
|
+
/** Load + validate the operator's hosts registry (read-only). Mirrors the CLI
|
|
36
|
+
* loader's error surfaces so operators see one vocabulary everywhere. */
|
|
37
|
+
export declare function loadHostRegistry(path?: string): HostRegistryLoadResult;
|
|
38
|
+
export declare function validateHostRegistry(parsed: unknown, sourcePath: string): HostRegistryLoadResult;
|
|
39
|
+
/** Resolve a host id for placement. Unknown id names the requested id and
|
|
40
|
+
* lists up to 10 known ids — the FR-4 per-entry validation message rides
|
|
41
|
+
* this (what/why/fix, before any launch attempt). */
|
|
42
|
+
export declare function resolveHost(registry: HostRegistry, id: string): HostResolution;
|
|
43
|
+
/** FR-4: placement requires a transport that can carry remote-up. v0 that is
|
|
44
|
+
* the http transport (the shipped remote single-rig leaf is POST /api/up
|
|
45
|
+
* over runRemoteHttpOp); ssh-transport hosts are reachable for send/capture
|
|
46
|
+
* but cannot carry remote-up — a structured per-entry error, not a launch
|
|
47
|
+
* attempt. */
|
|
48
|
+
export declare function resolvePlacementHost(registry: HostRegistry, id: string): HostResolution;
|
|
49
|
+
//# sourceMappingURL=hosts-registry-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosts-registry-reader.d.ts","sourceRoot":"","sources":["../../../src/domain/hosts/hosts-registry-reader.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,aAAa,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAIjC,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;0EAC0E;AAC1E,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAkC,GAAG,sBAAsB,CAoBjG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,sBAAsB,CAuFhG;AAED;;sDAEsD;AACtD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,cAAc,CAW9E;AAED;;;;eAIe;AACf,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,cAAc,CAUvF"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// OPR.0.4.4.11 — the SHARED daemon-side hosts-registry read module (the P3/P4
|
|
2
|
+
// interface cell, pm-lead ruling c): P3 uses it for topology placement
|
|
3
|
+
// resolution + validation messages; P4's fan-out aggregation consumes the
|
|
4
|
+
// SAME module. Land once, here; P4 must not re-implement it.
|
|
5
|
+
//
|
|
6
|
+
// READ-ONLY FOREVER (arch ruling 3): the registry is operator-managed YAML at
|
|
7
|
+
// ~/.openrig/hosts.yaml; nothing in the daemon ever writes it. This module
|
|
8
|
+
// MIRRORS the CLI's packages/cli/src/host-registry.ts schema + validation
|
|
9
|
+
// (incl. the exactly-one-bearer rule) — the CLI copy is deliberately
|
|
10
|
+
// untouched this slice (no-unification boundary); the twin is held in sync by
|
|
11
|
+
// packages/daemon/test/hosts-registry-parity.test.ts, the same discipline as
|
|
12
|
+
// the scope-audit CLI/daemon twins.
|
|
13
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
14
|
+
import { parse as parseYaml } from "yaml";
|
|
15
|
+
import { getDefaultOpenRigPath } from "../../openrig-compat.js";
|
|
16
|
+
const KNOWN_TRANSPORTS = new Set(["ssh", "http"]);
|
|
17
|
+
export function defaultHostRegistryPath() {
|
|
18
|
+
return getDefaultOpenRigPath("hosts.yaml");
|
|
19
|
+
}
|
|
20
|
+
/** Load + validate the operator's hosts registry (read-only). Mirrors the CLI
|
|
21
|
+
* loader's error surfaces so operators see one vocabulary everywhere. */
|
|
22
|
+
export function loadHostRegistry(path = defaultHostRegistryPath()) {
|
|
23
|
+
if (!existsSync(path)) {
|
|
24
|
+
return {
|
|
25
|
+
ok: false,
|
|
26
|
+
error: `host registry not found at ${path}. Create it with a 'hosts:' array; transport: ssh (target + user) or http (url + bearer_env/bearer_file).`,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
let raw;
|
|
30
|
+
try {
|
|
31
|
+
raw = readFileSync(path, "utf-8");
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
return { ok: false, error: `failed to read host registry at ${path}: ${err.message}` };
|
|
35
|
+
}
|
|
36
|
+
let parsed;
|
|
37
|
+
try {
|
|
38
|
+
parsed = parseYaml(raw);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
return { ok: false, error: `failed to parse host registry YAML at ${path}: ${err.message}` };
|
|
42
|
+
}
|
|
43
|
+
return validateHostRegistry(parsed, path);
|
|
44
|
+
}
|
|
45
|
+
export function validateHostRegistry(parsed, sourcePath) {
|
|
46
|
+
if (parsed === null || typeof parsed !== "object") {
|
|
47
|
+
return { ok: false, error: `host registry at ${sourcePath} must be a YAML object with a 'hosts' array` };
|
|
48
|
+
}
|
|
49
|
+
const obj = parsed;
|
|
50
|
+
const hosts = obj["hosts"];
|
|
51
|
+
if (!Array.isArray(hosts)) {
|
|
52
|
+
return { ok: false, error: `host registry at ${sourcePath}: 'hosts' must be an array` };
|
|
53
|
+
}
|
|
54
|
+
const seenIds = new Set();
|
|
55
|
+
const validated = [];
|
|
56
|
+
for (let i = 0; i < hosts.length; i++) {
|
|
57
|
+
const raw = hosts[i];
|
|
58
|
+
const prefix = `host registry at ${sourcePath}: hosts[${i}]`;
|
|
59
|
+
if (raw === null || typeof raw !== "object") {
|
|
60
|
+
return { ok: false, error: `${prefix}: must be an object with id/transport/target` };
|
|
61
|
+
}
|
|
62
|
+
const entry = raw;
|
|
63
|
+
const id = entry["id"];
|
|
64
|
+
if (typeof id !== "string" || id.trim() === "") {
|
|
65
|
+
return { ok: false, error: `${prefix}.id: required non-empty string` };
|
|
66
|
+
}
|
|
67
|
+
if (seenIds.has(id)) {
|
|
68
|
+
return { ok: false, error: `${prefix}.id: duplicate host id '${id}' (each host id must be unique within the registry)` };
|
|
69
|
+
}
|
|
70
|
+
seenIds.add(id);
|
|
71
|
+
const transport = entry["transport"];
|
|
72
|
+
if (typeof transport !== "string" || !KNOWN_TRANSPORTS.has(transport)) {
|
|
73
|
+
return {
|
|
74
|
+
ok: false,
|
|
75
|
+
error: `${prefix}.transport: must be one of ${[...KNOWN_TRANSPORTS].sort().join(", ")} (got ${JSON.stringify(transport)})`,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const notes = entry["notes"];
|
|
79
|
+
if (notes !== undefined && typeof notes !== "string") {
|
|
80
|
+
return { ok: false, error: `${prefix}.notes: optional, but if present must be a string` };
|
|
81
|
+
}
|
|
82
|
+
if (transport === "ssh") {
|
|
83
|
+
const target = entry["target"];
|
|
84
|
+
if (typeof target !== "string" || target.trim() === "") {
|
|
85
|
+
return { ok: false, error: `${prefix}.target: required non-empty string (an ssh target)` };
|
|
86
|
+
}
|
|
87
|
+
const user = entry["user"];
|
|
88
|
+
if (user !== undefined && (typeof user !== "string" || user.trim() === "")) {
|
|
89
|
+
return { ok: false, error: `${prefix}.user: optional, but if present must be a non-empty string` };
|
|
90
|
+
}
|
|
91
|
+
validated.push({
|
|
92
|
+
id,
|
|
93
|
+
transport: "ssh",
|
|
94
|
+
target,
|
|
95
|
+
...(user !== undefined ? { user: user } : {}),
|
|
96
|
+
...(notes !== undefined ? { notes: notes } : {}),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
else if (transport === "http") {
|
|
100
|
+
const url = entry["url"];
|
|
101
|
+
if (typeof url !== "string" || url.trim() === "") {
|
|
102
|
+
return { ok: false, error: `${prefix}.url: required non-empty string (the remote daemon's base URL)` };
|
|
103
|
+
}
|
|
104
|
+
const bearerEnv = entry["bearer_env"];
|
|
105
|
+
const bearerFile = entry["bearer_file"];
|
|
106
|
+
const hasEnv = bearerEnv !== undefined;
|
|
107
|
+
const hasFile = bearerFile !== undefined;
|
|
108
|
+
if (!hasEnv && !hasFile) {
|
|
109
|
+
return { ok: false, error: `${prefix}: http transport requires exactly one of bearer_env or bearer_file` };
|
|
110
|
+
}
|
|
111
|
+
if (hasEnv && hasFile) {
|
|
112
|
+
return { ok: false, error: `${prefix}: specify exactly one of bearer_env or bearer_file, not both` };
|
|
113
|
+
}
|
|
114
|
+
if (hasEnv && (typeof bearerEnv !== "string" || bearerEnv.trim() === "")) {
|
|
115
|
+
return { ok: false, error: `${prefix}.bearer_env: must be a non-empty env var name` };
|
|
116
|
+
}
|
|
117
|
+
if (hasFile && (typeof bearerFile !== "string" || bearerFile.trim() === "")) {
|
|
118
|
+
return { ok: false, error: `${prefix}.bearer_file: must be a non-empty file path` };
|
|
119
|
+
}
|
|
120
|
+
validated.push({
|
|
121
|
+
id,
|
|
122
|
+
transport: "http",
|
|
123
|
+
url: url,
|
|
124
|
+
...(hasEnv ? { bearer_env: bearerEnv } : {}),
|
|
125
|
+
...(hasFile ? { bearer_file: bearerFile } : {}),
|
|
126
|
+
...(notes !== undefined ? { notes: notes } : {}),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return { ok: true, registry: { hosts: validated } };
|
|
131
|
+
}
|
|
132
|
+
/** Resolve a host id for placement. Unknown id names the requested id and
|
|
133
|
+
* lists up to 10 known ids — the FR-4 per-entry validation message rides
|
|
134
|
+
* this (what/why/fix, before any launch attempt). */
|
|
135
|
+
export function resolveHost(registry, id) {
|
|
136
|
+
const match = registry.hosts.find((h) => h.id === id);
|
|
137
|
+
if (match)
|
|
138
|
+
return { ok: true, host: match };
|
|
139
|
+
const knownIds = registry.hosts.map((h) => h.id).slice(0, 10);
|
|
140
|
+
const idsHint = knownIds.length > 0
|
|
141
|
+
? ` Known host ids: ${knownIds.join(", ")}${registry.hosts.length > knownIds.length ? ` (+${registry.hosts.length - knownIds.length} more)` : ""}.`
|
|
142
|
+
: " (registry is empty)";
|
|
143
|
+
return {
|
|
144
|
+
ok: false,
|
|
145
|
+
error: `unknown host id '${id}'.${idsHint}`,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/** FR-4: placement requires a transport that can carry remote-up. v0 that is
|
|
149
|
+
* the http transport (the shipped remote single-rig leaf is POST /api/up
|
|
150
|
+
* over runRemoteHttpOp); ssh-transport hosts are reachable for send/capture
|
|
151
|
+
* but cannot carry remote-up — a structured per-entry error, not a launch
|
|
152
|
+
* attempt. */
|
|
153
|
+
export function resolvePlacementHost(registry, id) {
|
|
154
|
+
const res = resolveHost(registry, id);
|
|
155
|
+
if (!res.ok)
|
|
156
|
+
return res;
|
|
157
|
+
if (res.host.transport !== "http") {
|
|
158
|
+
return {
|
|
159
|
+
ok: false,
|
|
160
|
+
error: `host '${id}' uses transport '${res.host.transport}', which cannot carry remote rig-up. Placement requires an http-transport host (url + bearer_env/bearer_file) — update the registry entry or launch that rig locally.`,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
return res;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=hosts-registry-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosts-registry-reader.js","sourceRoot":"","sources":["../../../src/domain/hosts/hosts-registry-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { HttpHostEntry } from "./hosts-registry-reader.js";
|
|
2
|
+
export interface RemoteJsonDeps {
|
|
3
|
+
/** Injected for tests; defaults to global fetch. */
|
|
4
|
+
fetchImpl?: typeof fetch;
|
|
5
|
+
env?: Record<string, string | undefined>;
|
|
6
|
+
readFile?: (path: string) => string;
|
|
7
|
+
}
|
|
8
|
+
export interface RemoteJsonOptions extends RemoteJsonDeps {
|
|
9
|
+
method: "GET" | "POST";
|
|
10
|
+
body?: unknown;
|
|
11
|
+
/** REQUIRED — the caller names its deadline class explicitly. */
|
|
12
|
+
timeoutMs: number;
|
|
13
|
+
}
|
|
14
|
+
export type RemoteJsonFailureKind = "bearer" | "timeout" | "network" | "http";
|
|
15
|
+
export interface RemoteJsonFailure {
|
|
16
|
+
ok: false;
|
|
17
|
+
kind: RemoteJsonFailureKind;
|
|
18
|
+
/** For kind=timeout: whether the deadline fired before headers
|
|
19
|
+
* ("request") or while reading the body ("body"). */
|
|
20
|
+
phase?: "request" | "body";
|
|
21
|
+
/** HTTP status when headers arrived (kind=http, or kind=timeout/phase=body). */
|
|
22
|
+
status?: number;
|
|
23
|
+
/** Bearer message / network error message / remote error text (may be ""). */
|
|
24
|
+
detail: string;
|
|
25
|
+
}
|
|
26
|
+
export type RemoteJsonResult = {
|
|
27
|
+
ok: true;
|
|
28
|
+
status: number;
|
|
29
|
+
payload: unknown;
|
|
30
|
+
} | RemoteJsonFailure;
|
|
31
|
+
/** One bounded daemon→daemon JSON exchange. The single deadline covers
|
|
32
|
+
* request + body; every outcome is structured — this function never hangs
|
|
33
|
+
* and never throws. */
|
|
34
|
+
export declare function remoteJsonRequest(host: HttpHostEntry, path: string, opts: RemoteJsonOptions): Promise<RemoteJsonResult>;
|
|
35
|
+
//# sourceMappingURL=remote-daemon-http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-daemon-http.d.ts","sourceRoot":"","sources":["../../../src/domain/hosts/remote-daemon-http.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAE9E,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,qBAAqB,CAAC;IAC5B;0DACsD;IACtD,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,iBAAiB,CAAC;AAwBlG;;wBAEwB;AACxB,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmD7H"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// OPR.0.4.4.15 — the SHARED daemon→daemon HTTP core (arch cell 1, RATIFIED).
|
|
2
|
+
//
|
|
3
|
+
// Extracted from topology/remote-up-leaf.ts so the P4 aggregation fan-out
|
|
4
|
+
// does not mint a second copy of security-adjacent transport code (bearer
|
|
5
|
+
// resolution + bounded-abort discipline + status classification). The
|
|
6
|
+
// up-leaf is now a thin consumer that FORMATS this module's structured
|
|
7
|
+
// result into its shipped error strings (its tests byte-preserved).
|
|
8
|
+
//
|
|
9
|
+
// DEADLINE IS A REQUIRED ARGUMENT (arch sharpening, no module default):
|
|
10
|
+
// the up-leaf passes its 120s long-running rig-up budget at ITS call-site;
|
|
11
|
+
// the attention aggregator passes its 5s read-class deadline at ITS
|
|
12
|
+
// call-site. A buried default would invite the next consumer to silently
|
|
13
|
+
// inherit the wrong class.
|
|
14
|
+
//
|
|
15
|
+
// The G-R2B1-1 discipline is structural here: ONE deadline armed through
|
|
16
|
+
// the WHOLE exchange — request AND body parse (2xx or error body). A host
|
|
17
|
+
// that sends headers and never finishes the body yields a structured
|
|
18
|
+
// timeout, never a hung caller. The body race is explicit against the
|
|
19
|
+
// signal (a hand-built/proxied Response is not necessarily wired to the
|
|
20
|
+
// controller — no trust in fetch internals).
|
|
21
|
+
import { readFileSync } from "node:fs";
|
|
22
|
+
/** Mirrors the CLI's resolveRemoteBearer (host-registry.ts): exactly-one of
|
|
23
|
+
* bearer_env / bearer_file, resolved at call time. */
|
|
24
|
+
function resolveBearer(host, deps) {
|
|
25
|
+
const env = deps.env ?? process.env;
|
|
26
|
+
const readFile = deps.readFile ?? ((p) => readFileSync(p, "utf-8"));
|
|
27
|
+
if (host.bearer_env) {
|
|
28
|
+
const token = env[host.bearer_env]?.trim();
|
|
29
|
+
if (token)
|
|
30
|
+
return { ok: true, token };
|
|
31
|
+
return { ok: false, detail: `bearer env var ${host.bearer_env} is not set or empty for host ${host.id}` };
|
|
32
|
+
}
|
|
33
|
+
if (host.bearer_file) {
|
|
34
|
+
try {
|
|
35
|
+
const token = readFile(host.bearer_file).trim();
|
|
36
|
+
if (token)
|
|
37
|
+
return { ok: true, token };
|
|
38
|
+
return { ok: false, detail: `bearer file ${host.bearer_file} is empty for host ${host.id}` };
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return { ok: false, detail: `bearer file ${host.bearer_file} not readable for host ${host.id}` };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { ok: false, detail: `host ${host.id} has no bearer_env or bearer_file configured` };
|
|
45
|
+
}
|
|
46
|
+
/** One bounded daemon→daemon JSON exchange. The single deadline covers
|
|
47
|
+
* request + body; every outcome is structured — this function never hangs
|
|
48
|
+
* and never throws. */
|
|
49
|
+
export async function remoteJsonRequest(host, path, opts) {
|
|
50
|
+
const bearer = resolveBearer(host, opts);
|
|
51
|
+
if (!bearer.ok)
|
|
52
|
+
return { ok: false, kind: "bearer", detail: bearer.detail };
|
|
53
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
54
|
+
const url = `${host.url.replace(/\/$/, "")}${path}`;
|
|
55
|
+
const controller = new AbortController();
|
|
56
|
+
const timer = setTimeout(() => controller.abort(), opts.timeoutMs);
|
|
57
|
+
let res;
|
|
58
|
+
try {
|
|
59
|
+
res = await fetchImpl(url, {
|
|
60
|
+
method: opts.method,
|
|
61
|
+
headers: {
|
|
62
|
+
...(opts.body !== undefined ? { "Content-Type": "application/json" } : {}),
|
|
63
|
+
Authorization: `Bearer ${bearer.token}`,
|
|
64
|
+
},
|
|
65
|
+
...(opts.body !== undefined ? { body: JSON.stringify(opts.body) } : {}),
|
|
66
|
+
signal: controller.signal,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
if (controller.signal.aborted)
|
|
72
|
+
return { ok: false, kind: "timeout", phase: "request", detail: "" };
|
|
73
|
+
return { ok: false, kind: "network", detail: err.message };
|
|
74
|
+
}
|
|
75
|
+
// Body parse under the SAME still-armed deadline, raced explicitly.
|
|
76
|
+
const abortRace = new Promise((_resolve, reject) => {
|
|
77
|
+
const onAbort = () => reject(new Error("body read aborted"));
|
|
78
|
+
if (controller.signal.aborted)
|
|
79
|
+
onAbort();
|
|
80
|
+
else
|
|
81
|
+
controller.signal.addEventListener("abort", onAbort, { once: true });
|
|
82
|
+
});
|
|
83
|
+
let payload;
|
|
84
|
+
let bodyTimedOut = false;
|
|
85
|
+
try {
|
|
86
|
+
payload = await Promise.race([res.json(), abortRace]);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
if (controller.signal.aborted)
|
|
90
|
+
bodyTimedOut = true;
|
|
91
|
+
// else: non-JSON body — payload stays undefined; status is the honest detail
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
clearTimeout(timer);
|
|
95
|
+
}
|
|
96
|
+
if (bodyTimedOut)
|
|
97
|
+
return { ok: false, kind: "timeout", phase: "body", status: res.status, detail: "" };
|
|
98
|
+
if (res.status >= 200 && res.status < 300)
|
|
99
|
+
return { ok: true, status: res.status, payload };
|
|
100
|
+
const remoteError = payload && typeof payload === "object" && typeof payload.error === "string"
|
|
101
|
+
? payload.error
|
|
102
|
+
: "";
|
|
103
|
+
return { ok: false, kind: "http", status: res.status, detail: remoteError };
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=remote-daemon-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-daemon-http.js","sourceRoot":"","sources":["../../../src/domain/hosts/remote-daemon-http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Human-route enforcement (OPR.0.4.4.19 FR-4 + FR-5; conventions C6 + C3).
|
|
3
|
+
*
|
|
4
|
+
* Sibling of hot-potato-enforcer.ts: a pure domain validator wired at the
|
|
5
|
+
* QueueRepository write paths (create / handoff / handoff-and-complete, and
|
|
6
|
+
* the FR-6 park transition) so every surface — CLI, HTTP, future UI —
|
|
7
|
+
* inherits the same guarantee. NOT enforced at the route, NOT at the CLI.
|
|
8
|
+
*
|
|
9
|
+
* THE scoping predicate (PRD §5 — the complete trigger list, BR-1):
|
|
10
|
+
*
|
|
11
|
+
* tier = 'human-gate'
|
|
12
|
+
* OR is_human_seat_session(destination_session)
|
|
13
|
+
* OR (state = 'blocked' AND is_human_seat_session(blocked_on)) [FR-6]
|
|
14
|
+
*
|
|
15
|
+
* When the predicate is FALSE, this module validates NOTHING: ordinary
|
|
16
|
+
* agent-to-agent queue traffic gains zero new required fields, zero new
|
|
17
|
+
* rejection paths, zero new warns (BR-1 zero-friction boundary). Do not
|
|
18
|
+
* broaden the trigger by destination tag, body text, or state alone.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* The EXACT human-seat regex. Single TS source of truth — the same pattern
|
|
22
|
+
* QueueRepository registers as the SQLite `is_human_seat_session` function
|
|
23
|
+
* (queue-repository.ts constructor) so SQL-side and TS-side checks cannot
|
|
24
|
+
* drift. Mirrors the UI's feed-classifier isHumanSeat.
|
|
25
|
+
*/
|
|
26
|
+
export declare const HUMAN_SEAT_SESSION_PATTERN: RegExp;
|
|
27
|
+
export declare function isHumanSeatSession(value: unknown): boolean;
|
|
28
|
+
export interface HumanRouteRequest {
|
|
29
|
+
tier: string | null | undefined;
|
|
30
|
+
destinationSession: string;
|
|
31
|
+
summary: string | null | undefined;
|
|
32
|
+
evidenceRef: string | null | undefined;
|
|
33
|
+
}
|
|
34
|
+
export interface HumanRouteValidationOk {
|
|
35
|
+
ok: true;
|
|
36
|
+
/** True when the §5 predicate matched (the item is human-routed). */
|
|
37
|
+
humanRouted: boolean;
|
|
38
|
+
}
|
|
39
|
+
export interface HumanRouteValidationErr {
|
|
40
|
+
ok: false;
|
|
41
|
+
code: "human_route_fields_required";
|
|
42
|
+
message: string;
|
|
43
|
+
missingFields: string[];
|
|
44
|
+
}
|
|
45
|
+
export type HumanRouteValidation = HumanRouteValidationOk | HumanRouteValidationErr;
|
|
46
|
+
/**
|
|
47
|
+
* Validate the C6/C3 structure of a NEW qitem (create / the created half of a
|
|
48
|
+
* handoff). Fires ONLY when the item is human-routed via legs 1–2 of the §5
|
|
49
|
+
* predicate (human-gate tier, human-seat destination). The park leg
|
|
50
|
+
* (blocked_on a human seat) is validated by {@link validateHumanPark} at the
|
|
51
|
+
* blocked-transition write path.
|
|
52
|
+
*/
|
|
53
|
+
export declare function validateHumanRoute(req: HumanRouteRequest): HumanRouteValidation;
|
|
54
|
+
export interface HumanParkRequest {
|
|
55
|
+
/** The blocker the item is being parked on (qitem id OR human-seat session). */
|
|
56
|
+
blockedOn: string | null | undefined;
|
|
57
|
+
/** Effective values at park time: the value provided on the park call,
|
|
58
|
+
* falling back to what the item already carries. */
|
|
59
|
+
summary: string | null | undefined;
|
|
60
|
+
evidenceRef: string | null | undefined;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* OPR.0.4.4.19 FR-6 — leg-1 park enforcement (§5 predicate leg 3). Fires
|
|
64
|
+
* ONLY when the blocker is a human seat; blocking on another qitem (today's
|
|
65
|
+
* shipped usage) requires nothing new. The parked qitem itself — id, slice
|
|
66
|
+
* tag, summary — IS the what-it-unblocks (arch-ruled: no decision_descriptor
|
|
67
|
+
* field). Enforcement symmetry: park requires summary + evidence_ref like
|
|
68
|
+
* FR-7's resolve requires non-empty decision text.
|
|
69
|
+
*/
|
|
70
|
+
export declare function validateHumanPark(req: HumanParkRequest): HumanRouteValidation;
|
|
71
|
+
//# sourceMappingURL=human-route-enforcer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human-route-enforcer.d.ts","sourceRoot":"","sources":["../../src/domain/human-route-enforcer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,QAA+C,CAAC;AAEvF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE1D;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,IAAI,CAAC;IACT,qEAAqE;IACrE,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,6BAA6B,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,oBAAoB,GAAG,sBAAsB,GAAG,uBAAuB,CAAC;AAMpF;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,oBAAoB,CAQ/E;AAED,MAAM,WAAW,gBAAgB;IAC/B,gFAAgF;IAChF,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC;yDACqD;IACrD,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACxC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,GAAG,oBAAoB,CAQ7E"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Human-route enforcement (OPR.0.4.4.19 FR-4 + FR-5; conventions C6 + C3).
|
|
3
|
+
*
|
|
4
|
+
* Sibling of hot-potato-enforcer.ts: a pure domain validator wired at the
|
|
5
|
+
* QueueRepository write paths (create / handoff / handoff-and-complete, and
|
|
6
|
+
* the FR-6 park transition) so every surface — CLI, HTTP, future UI —
|
|
7
|
+
* inherits the same guarantee. NOT enforced at the route, NOT at the CLI.
|
|
8
|
+
*
|
|
9
|
+
* THE scoping predicate (PRD §5 — the complete trigger list, BR-1):
|
|
10
|
+
*
|
|
11
|
+
* tier = 'human-gate'
|
|
12
|
+
* OR is_human_seat_session(destination_session)
|
|
13
|
+
* OR (state = 'blocked' AND is_human_seat_session(blocked_on)) [FR-6]
|
|
14
|
+
*
|
|
15
|
+
* When the predicate is FALSE, this module validates NOTHING: ordinary
|
|
16
|
+
* agent-to-agent queue traffic gains zero new required fields, zero new
|
|
17
|
+
* rejection paths, zero new warns (BR-1 zero-friction boundary). Do not
|
|
18
|
+
* broaden the trigger by destination tag, body text, or state alone.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* The EXACT human-seat regex. Single TS source of truth — the same pattern
|
|
22
|
+
* QueueRepository registers as the SQLite `is_human_seat_session` function
|
|
23
|
+
* (queue-repository.ts constructor) so SQL-side and TS-side checks cannot
|
|
24
|
+
* drift. Mirrors the UI's feed-classifier isHumanSeat.
|
|
25
|
+
*/
|
|
26
|
+
export const HUMAN_SEAT_SESSION_PATTERN = /^human(?:-[A-Za-z0-9._-]+)?@(kernel|host)$/;
|
|
27
|
+
export function isHumanSeatSession(value) {
|
|
28
|
+
return typeof value === "string" && HUMAN_SEAT_SESSION_PATTERN.test(value);
|
|
29
|
+
}
|
|
30
|
+
function isBlank(value) {
|
|
31
|
+
return value === null || value === undefined || value.trim().length === 0;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Validate the C6/C3 structure of a NEW qitem (create / the created half of a
|
|
35
|
+
* handoff). Fires ONLY when the item is human-routed via legs 1–2 of the §5
|
|
36
|
+
* predicate (human-gate tier, human-seat destination). The park leg
|
|
37
|
+
* (blocked_on a human seat) is validated by {@link validateHumanPark} at the
|
|
38
|
+
* blocked-transition write path.
|
|
39
|
+
*/
|
|
40
|
+
export function validateHumanRoute(req) {
|
|
41
|
+
return validateRequiredFields(req.tier === "human-gate" || isHumanSeatSession(req.destinationSession), req.summary, req.evidenceRef, "human-routed queue items", "Provide --summary / --evidence-ref (ordinary agent-to-agent items are unaffected).");
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* OPR.0.4.4.19 FR-6 — leg-1 park enforcement (§5 predicate leg 3). Fires
|
|
45
|
+
* ONLY when the blocker is a human seat; blocking on another qitem (today's
|
|
46
|
+
* shipped usage) requires nothing new. The parked qitem itself — id, slice
|
|
47
|
+
* tag, summary — IS the what-it-unblocks (arch-ruled: no decision_descriptor
|
|
48
|
+
* field). Enforcement symmetry: park requires summary + evidence_ref like
|
|
49
|
+
* FR-7's resolve requires non-empty decision text.
|
|
50
|
+
*/
|
|
51
|
+
export function validateHumanPark(req) {
|
|
52
|
+
return validateRequiredFields(isHumanSeatSession(req.blockedOn), req.summary, req.evidenceRef, "parking a qitem on a human seat", "Provide them at park time (rig queue block --summary --evidence-ref) or on the item beforehand; blocking on another qitem requires nothing new.");
|
|
53
|
+
}
|
|
54
|
+
function validateRequiredFields(predicateFired, summary, evidenceRef, subject, remedy) {
|
|
55
|
+
if (!predicateFired) {
|
|
56
|
+
return { ok: true, humanRouted: false };
|
|
57
|
+
}
|
|
58
|
+
const missing = [];
|
|
59
|
+
if (isBlank(summary))
|
|
60
|
+
missing.push("summary");
|
|
61
|
+
if (isBlank(evidenceRef))
|
|
62
|
+
missing.push("evidence_ref");
|
|
63
|
+
if (missing.length === 0) {
|
|
64
|
+
return { ok: true, humanRouted: true };
|
|
65
|
+
}
|
|
66
|
+
const why = [];
|
|
67
|
+
if (missing.includes("summary")) {
|
|
68
|
+
why.push("summary: a decision the human reads must be in plain language (convention C6)");
|
|
69
|
+
}
|
|
70
|
+
if (missing.includes("evidence_ref")) {
|
|
71
|
+
why.push("evidence_ref: the human must have a durable artifact to judge (convention C3)");
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
ok: false,
|
|
75
|
+
code: "human_route_fields_required",
|
|
76
|
+
message: `${subject} require${subject.endsWith("s") ? "" : "s"} ${missing.join(" + ")} — ${why.join("; ")}. ${remedy}`,
|
|
77
|
+
missingFields: missing,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=human-route-enforcer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human-route-enforcer.js","sourceRoot":"","sources":["../../src/domain/human-route-enforcer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,4CAA4C,CAAC;AAEvF,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAwBD,SAAS,OAAO,CAAC,KAAgC;IAC/C,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAsB;IACvD,OAAO,sBAAsB,CAC3B,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,kBAAkB,CAAC,GAAG,CAAC,kBAAkB,CAAC,EACvE,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,WAAW,EACf,0BAA0B,EAC1B,oFAAoF,CACrF,CAAC;AACJ,CAAC;AAWD;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAqB;IACrD,OAAO,sBAAsB,CAC3B,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,EACjC,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,WAAW,EACf,iCAAiC,EACjC,iJAAiJ,CAClJ,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,cAAuB,EACvB,OAAkC,EAClC,WAAsC,EACtC,OAAe,EACf,MAAc;IAEd,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAC1C,CAAC;IACD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,OAAO,CAAC,WAAW,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACvD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACzC,CAAC;IACD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;IAC5F,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO;QACL,EAAE,EAAE,KAAK;QACT,IAAI,EAAE,6BAA6B;QACnC,OAAO,EAAE,GAAG,OAAO,WAAW,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE;QACtH,aAAa,EAAE,OAAO;KACvB,CAAC;AACJ,CAAC"}
|
|
@@ -12,6 +12,14 @@ export interface AuditQueryInput {
|
|
|
12
12
|
limit?: number;
|
|
13
13
|
/** Pagination cursor: returns rows whose action_id < beforeId. */
|
|
14
14
|
beforeId?: string;
|
|
15
|
+
/** OPR.0.4.4.19 FR-9 — the scope-approval target filters (the pinned
|
|
16
|
+
* audit_notes_json shape's read path). These make Packet 2's one-query
|
|
17
|
+
* UNVERIFIED-stamp cross-check real: filter by the stable scope target
|
|
18
|
+
* (tier + dot-ID + canonical path) and/or approval scope. */
|
|
19
|
+
scopeTier?: string;
|
|
20
|
+
scopeId?: string;
|
|
21
|
+
scopePath?: string;
|
|
22
|
+
approvalScope?: string;
|
|
15
23
|
}
|
|
16
24
|
export interface AuditQueryResult {
|
|
17
25
|
rows: MissionControlActionEntry[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-browse.d.ts","sourceRoot":"","sources":["../../../src/domain/mission-control/audit-browse.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,KAAK,yBAAyB,EAG/B,MAAM,iCAAiC,CAAC;AAEzC,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"audit-browse.d.ts","sourceRoot":"","sources":["../../../src/domain/mission-control/audit-browse.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,KAAK,yBAAyB,EAG/B,MAAM,iCAAiC,CAAC;AAEzC,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;kEAG8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,yBAAyB,EAAE,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAoBD,qBAAa,yBAAyB;IACxB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAElD,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB;CAyEhD"}
|
|
@@ -33,6 +33,25 @@ export class MissionControlAuditBrowse {
|
|
|
33
33
|
where.push("actor_session = ?");
|
|
34
34
|
params.push(input.actorSession);
|
|
35
35
|
}
|
|
36
|
+
// OPR.0.4.4.19 FR-9 — filter on the pinned audit_notes_json shape via
|
|
37
|
+
// SQLite JSON1 (ships with better-sqlite3). NULL audit_notes_json rows
|
|
38
|
+
// simply don't match.
|
|
39
|
+
if (input.scopeTier) {
|
|
40
|
+
where.push("json_extract(audit_notes_json, '$.scope_tier') = ?");
|
|
41
|
+
params.push(input.scopeTier);
|
|
42
|
+
}
|
|
43
|
+
if (input.scopeId) {
|
|
44
|
+
where.push("json_extract(audit_notes_json, '$.scope_id') = ?");
|
|
45
|
+
params.push(input.scopeId);
|
|
46
|
+
}
|
|
47
|
+
if (input.scopePath) {
|
|
48
|
+
where.push("json_extract(audit_notes_json, '$.scope_path') = ?");
|
|
49
|
+
params.push(input.scopePath);
|
|
50
|
+
}
|
|
51
|
+
if (input.approvalScope) {
|
|
52
|
+
where.push("json_extract(audit_notes_json, '$.approval_scope') = ?");
|
|
53
|
+
params.push(input.approvalScope);
|
|
54
|
+
}
|
|
36
55
|
if (input.since) {
|
|
37
56
|
where.push("acted_at >= ?");
|
|
38
57
|
params.push(input.since);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-browse.js","sourceRoot":"","sources":["../../../src/domain/mission-control/audit-browse.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,yEAAyE;AACzE,kEAAkE;AAClE,yEAAyE;AACzE,EAAE;AACF,6DAA6D;AAC7D,uEAAuE;AAGvE,OAAO,EAGL,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"audit-browse.js","sourceRoot":"","sources":["../../../src/domain/mission-control/audit-browse.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type Database from "better-sqlite3";
|
|
2
|
-
export declare const MISSION_CONTROL_VERBS: readonly ["approve", "deny", "route", "annotate", "hold", "drop", "handoff"];
|
|
2
|
+
export declare const MISSION_CONTROL_VERBS: readonly ["approve", "deny", "route", "annotate", "hold", "drop", "handoff", "resolve"];
|
|
3
3
|
export type MissionControlVerb = (typeof MISSION_CONTROL_VERBS)[number];
|
|
4
4
|
export interface MissionControlActionRecordInput {
|
|
5
5
|
actionVerb: MissionControlVerb;
|