@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,207 @@
|
|
|
1
|
+
import { SeatIdentityStore } from "./seat-identity-store.js";
|
|
2
|
+
/** Default identity-reconcile cadence: 5s. Process identity changes rarely
|
|
3
|
+
* (a seat's pane/process is stable for its whole life), and the check is
|
|
4
|
+
* more expensive than the 1Hz activity poll (per-seat pane PID + command
|
|
5
|
+
* tmux reads), so a slower cadence is the right cost/freshness trade. */
|
|
6
|
+
export const DEFAULT_IDENTITY_POLL_INTERVAL_MS = 5000;
|
|
7
|
+
/** Foreground commands that read as a bare shell (a seat that dropped to a
|
|
8
|
+
* prompt, or an orphan/QA-squat shell occupying the pane). Mirrors the
|
|
9
|
+
* SessionFingerprinter SHELL_NAMES vocabulary. `pane_current_command` may
|
|
10
|
+
* carry a login-shell `-` prefix. */
|
|
11
|
+
const SHELL_COMMANDS = new Set([
|
|
12
|
+
"bash", "zsh", "fish", "sh", "dash", "tcsh", "csh",
|
|
13
|
+
"-bash", "-zsh", "-fish", "-sh", "-dash", "-tcsh", "-csh",
|
|
14
|
+
]);
|
|
15
|
+
/**
|
|
16
|
+
* Classify the pane's foreground command against the registered runtime.
|
|
17
|
+
*
|
|
18
|
+
* Deliberately LENIENT to preserve the slice-15 no-false-green-for-live-seats
|
|
19
|
+
* invariant: a genuinely-live claude/codex TUI usually reports its host
|
|
20
|
+
* process (`node`) as `pane_current_command`, NOT the literal runtime name, so
|
|
21
|
+
* we only declare `mismatch` on a POSITIVE contradiction — a different known
|
|
22
|
+
* agent runtime, or a bare shell where an agent was expected (the process
|
|
23
|
+
* died / an orphan shell squatted the pane). Ambiguous commands (`node`,
|
|
24
|
+
* `python`, empty) never down-rank.
|
|
25
|
+
*
|
|
26
|
+
* Mirrors SessionFingerprinter's Layer-1 process-command vocabulary; we do NOT
|
|
27
|
+
* run the full 4-layer scan (cmux query + pane-content capture) per poll — it
|
|
28
|
+
* is far more expensive at fleet scale and its content layer would not change
|
|
29
|
+
* the down-rank decision here (the reconcile only needs to distinguish
|
|
30
|
+
* "process contradicts the seat" from "no contradiction").
|
|
31
|
+
*/
|
|
32
|
+
export function classifyPaneRuntimeMatch(command, expectedRuntime) {
|
|
33
|
+
if (!command)
|
|
34
|
+
return "match"; // no signal — never false-mismatch a present pane
|
|
35
|
+
const cmd = command.trim().toLowerCase();
|
|
36
|
+
const expectsAgent = expectedRuntime === "claude-code" || expectedRuntime === "codex";
|
|
37
|
+
// Positive same-runtime signal.
|
|
38
|
+
if (expectedRuntime === "claude-code" && cmd.includes("claude"))
|
|
39
|
+
return "match";
|
|
40
|
+
if (expectedRuntime === "codex" && cmd.includes("codex"))
|
|
41
|
+
return "match";
|
|
42
|
+
// Cross-runtime contradiction (a DIFFERENT agent occupies the pane).
|
|
43
|
+
if (expectedRuntime === "claude-code" && cmd.includes("codex"))
|
|
44
|
+
return "mismatch";
|
|
45
|
+
if (expectedRuntime === "codex" && cmd.includes("claude"))
|
|
46
|
+
return "mismatch";
|
|
47
|
+
// A bare shell where an agent runtime was expected — the agent process is
|
|
48
|
+
// gone or an orphan/squat shell occupies the pane.
|
|
49
|
+
if (expectsAgent && SHELL_COMMANDS.has(cmd))
|
|
50
|
+
return "mismatch";
|
|
51
|
+
// Ambiguous / expected-shell (terminal nodes) — no contradiction.
|
|
52
|
+
return "match";
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* OPR.0.4.3.19 — periodic reconciler for the liveness identity verdict (the
|
|
56
|
+
* THIRD axis). Mirrors SeatActivityService.start(): polls every running
|
|
57
|
+
* tmux-bound managed seat, reconciles the current pane PID/command against the
|
|
58
|
+
* registered seat, and persists the verdict to `seat_identity_verdicts`.
|
|
59
|
+
* Projections then read the cheap persisted verdict synchronously.
|
|
60
|
+
*
|
|
61
|
+
* Non-inference: this reconciler reads ONLY tmux pane process identity vs the
|
|
62
|
+
* registered binding. It NEVER reads queue/classifier/hook heartbeats, and it
|
|
63
|
+
* does NOT touch `terminalActive` / `hasAssignedWork`.
|
|
64
|
+
*/
|
|
65
|
+
export class SeatIdentityReconciler {
|
|
66
|
+
db;
|
|
67
|
+
tmux;
|
|
68
|
+
now;
|
|
69
|
+
store;
|
|
70
|
+
timer = null;
|
|
71
|
+
constructor(deps) {
|
|
72
|
+
this.db = deps.db;
|
|
73
|
+
this.tmux = deps.tmux;
|
|
74
|
+
this.now = deps.now ?? (() => new Date());
|
|
75
|
+
this.store = new SeatIdentityStore(deps.db);
|
|
76
|
+
}
|
|
77
|
+
runningSeats() {
|
|
78
|
+
return this.db.prepare(`
|
|
79
|
+
SELECT n.id as node_id, n.runtime as runtime,
|
|
80
|
+
s.session_name as session_name, b.tmux_pane as tmux_pane
|
|
81
|
+
FROM nodes n
|
|
82
|
+
JOIN sessions s ON s.node_id = n.id
|
|
83
|
+
AND s.id = (SELECT s2.id FROM sessions s2 WHERE s2.node_id = n.id ORDER BY s2.id DESC LIMIT 1)
|
|
84
|
+
LEFT JOIN bindings b ON b.node_id = n.id
|
|
85
|
+
WHERE s.status = 'running'
|
|
86
|
+
AND s.session_name IS NOT NULL
|
|
87
|
+
AND COALESCE(b.attachment_type, 'tmux') = 'tmux'
|
|
88
|
+
`).all();
|
|
89
|
+
}
|
|
90
|
+
/** Reconcile every running tmux-bound seat once and persist the verdicts. */
|
|
91
|
+
async reconcileAll() {
|
|
92
|
+
const seats = this.runningSeats();
|
|
93
|
+
// Prune verdicts for nodes no longer running (keep the table bounded).
|
|
94
|
+
this.store.pruneExcept(seats.map((s) => s.node_id));
|
|
95
|
+
if (seats.length === 0)
|
|
96
|
+
return;
|
|
97
|
+
const observedAt = this.now().toISOString();
|
|
98
|
+
// One tmux availability probe per poll. If tmux is entirely unreachable
|
|
99
|
+
// (throws) OR reports zero live sessions while we have running seats in
|
|
100
|
+
// the DB, treat it as a transient tmux blip and record `tmux_unavailable`
|
|
101
|
+
// for every seat — NEVER down-rank a live fleet on an infra hiccup.
|
|
102
|
+
let liveSessions = null;
|
|
103
|
+
try {
|
|
104
|
+
const sessions = await this.tmux.listSessions();
|
|
105
|
+
liveSessions = new Set(sessions.map((s) => s.name));
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
liveSessions = null;
|
|
109
|
+
}
|
|
110
|
+
if (liveSessions === null || liveSessions.size === 0) {
|
|
111
|
+
for (const seat of seats) {
|
|
112
|
+
this.store.upsert(this.tmuxUnavailableVerdict(seat, observedAt));
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
for (const seat of seats) {
|
|
117
|
+
try {
|
|
118
|
+
this.store.upsert(await this.computeVerdict(seat, liveSessions, observedAt));
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// A single seat's tmux failure must not crash the loop; record it as
|
|
122
|
+
// an unknown (non-down-ranking) observation.
|
|
123
|
+
this.store.upsert(this.tmuxUnavailableVerdict(seat, observedAt));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
tmuxUnavailableVerdict(seat, observedAt) {
|
|
128
|
+
return {
|
|
129
|
+
nodeId: seat.node_id,
|
|
130
|
+
verdict: "tmux_unavailable",
|
|
131
|
+
evidenceSource: null,
|
|
132
|
+
reason: "tmux_unavailable",
|
|
133
|
+
evidence: { registeredPane: seat.tmux_pane, observedPid: null, observedCommand: null, matchedLayer: null },
|
|
134
|
+
sessionName: seat.session_name,
|
|
135
|
+
observedAt,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
async computeVerdict(seat, liveSessions, observedAt) {
|
|
139
|
+
const base = {
|
|
140
|
+
nodeId: seat.node_id,
|
|
141
|
+
sessionName: seat.session_name,
|
|
142
|
+
observedAt,
|
|
143
|
+
};
|
|
144
|
+
// No registered pane to reconcile against — we cannot verify identity.
|
|
145
|
+
// Non-down-ranking (unknown), so a missing binding pane never flips a live
|
|
146
|
+
// seat non-green.
|
|
147
|
+
if (!seat.tmux_pane) {
|
|
148
|
+
return {
|
|
149
|
+
...base,
|
|
150
|
+
verdict: "tmux_unavailable",
|
|
151
|
+
evidenceSource: null,
|
|
152
|
+
reason: "tmux_unavailable",
|
|
153
|
+
evidence: { registeredPane: null, observedPid: null, observedCommand: null, matchedLayer: null },
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
const pid = await this.tmux.getPanePid(seat.tmux_pane);
|
|
157
|
+
if (pid === null) {
|
|
158
|
+
// The registered pane no longer resolves. Distinguish "the whole tmux
|
|
159
|
+
// session is gone" from "the pane within a live session is gone".
|
|
160
|
+
const sessionAlive = liveSessions.has(seat.session_name);
|
|
161
|
+
return {
|
|
162
|
+
...base,
|
|
163
|
+
verdict: "pane_missing",
|
|
164
|
+
evidenceSource: sessionAlive ? "pane_process" : "tmux_session",
|
|
165
|
+
reason: sessionAlive ? "pane_pid_gone" : "session_missing",
|
|
166
|
+
evidence: { registeredPane: seat.tmux_pane, observedPid: null, observedCommand: null, matchedLayer: null },
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
const command = await this.tmux.getPaneCommand(seat.tmux_pane);
|
|
170
|
+
const match = classifyPaneRuntimeMatch(command, seat.runtime);
|
|
171
|
+
if (match === "mismatch") {
|
|
172
|
+
return {
|
|
173
|
+
...base,
|
|
174
|
+
verdict: "mismatch",
|
|
175
|
+
evidenceSource: "pane_process",
|
|
176
|
+
reason: "process_identity_mismatch",
|
|
177
|
+
evidence: { registeredPane: seat.tmux_pane, observedPid: pid, observedCommand: command, matchedLayer: 1 },
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
return {
|
|
181
|
+
...base,
|
|
182
|
+
verdict: "verified",
|
|
183
|
+
evidenceSource: "pane_process",
|
|
184
|
+
reason: null,
|
|
185
|
+
evidence: { registeredPane: seat.tmux_pane, observedPid: pid, observedCommand: command, matchedLayer: 1 },
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/** Start the scheduler. Idempotent — calling twice is a no-op. */
|
|
189
|
+
start(intervalMs = DEFAULT_IDENTITY_POLL_INTERVAL_MS) {
|
|
190
|
+
if (this.timer)
|
|
191
|
+
return;
|
|
192
|
+
this.timer = setInterval(() => {
|
|
193
|
+
void this.reconcileAll();
|
|
194
|
+
}, intervalMs);
|
|
195
|
+
if (this.timer && typeof this.timer === "object" && "unref" in this.timer) {
|
|
196
|
+
this.timer.unref();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/** Stop the scheduler. Safe to call before start or multiple times. */
|
|
200
|
+
stop() {
|
|
201
|
+
if (this.timer) {
|
|
202
|
+
clearInterval(this.timer);
|
|
203
|
+
this.timer = null;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=seat-identity-reconciler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-identity-reconciler.js","sourceRoot":"","sources":["../../src/domain/seat-identity-reconciler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
import type { SeatIdentityVerdict } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* OPR.0.4.3.19 — explicit, durable store for the per-node liveness identity
|
|
5
|
+
* verdict (migration 046 `seat_identity_verdicts`). The reconciler writes;
|
|
6
|
+
* node-inventory reads. Kept as a thin, stateless wrapper over the table so
|
|
7
|
+
* the liveness truth lives in the DB, never in transient in-memory state
|
|
8
|
+
* (dev-guard plan-review caveat).
|
|
9
|
+
*
|
|
10
|
+
* Reads are DEFENSIVE: fixtures that bypass the canonical migration list (no
|
|
11
|
+
* `seat_identity_verdicts` table) get an empty map/undefined rather than a
|
|
12
|
+
* crash — the projection degrades to "no verdict" (never down-ranks), matching
|
|
13
|
+
* the fail-open-on-unknown contract.
|
|
14
|
+
*/
|
|
15
|
+
export declare class SeatIdentityStore {
|
|
16
|
+
private readonly db;
|
|
17
|
+
constructor(db: Database.Database);
|
|
18
|
+
/** Upsert one node's verdict (last-writer-wins per node). */
|
|
19
|
+
upsert(v: SeatIdentityVerdict): void;
|
|
20
|
+
/** Read all verdicts for the nodes of a rig, keyed by node_id. Defensive. */
|
|
21
|
+
getForRig(rigId: string): Map<string, SeatIdentityVerdict>;
|
|
22
|
+
/** Read a single node's verdict, or null. Defensive. */
|
|
23
|
+
getForNode(nodeId: string): SeatIdentityVerdict | null;
|
|
24
|
+
/** Drop verdicts for nodes no longer in the live set (memory/table hygiene). */
|
|
25
|
+
pruneExcept(liveNodeIds: string[]): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=seat-identity-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-identity-store.d.ts","sourceRoot":"","sources":["../../src/domain/seat-identity-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAgCtD;;;;;;;;;;;GAWG;AACH,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAElD,6DAA6D;IAC7D,MAAM,CAAC,CAAC,EAAE,mBAAmB,GAAG,IAAI;IA6BpC,6EAA6E;IAC7E,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAe1D,wDAAwD;IACxD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAWtD,gFAAgF;IAChF,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI;CAczC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
function rowToVerdict(row) {
|
|
2
|
+
return {
|
|
3
|
+
nodeId: row.node_id,
|
|
4
|
+
verdict: row.verdict,
|
|
5
|
+
evidenceSource: row.evidence_source,
|
|
6
|
+
reason: row.reason,
|
|
7
|
+
evidence: {
|
|
8
|
+
registeredPane: row.registered_pane,
|
|
9
|
+
observedPid: row.observed_pid,
|
|
10
|
+
observedCommand: row.observed_command,
|
|
11
|
+
matchedLayer: row.matched_layer,
|
|
12
|
+
},
|
|
13
|
+
sessionName: row.session_name,
|
|
14
|
+
observedAt: row.observed_at,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* OPR.0.4.3.19 — explicit, durable store for the per-node liveness identity
|
|
19
|
+
* verdict (migration 046 `seat_identity_verdicts`). The reconciler writes;
|
|
20
|
+
* node-inventory reads. Kept as a thin, stateless wrapper over the table so
|
|
21
|
+
* the liveness truth lives in the DB, never in transient in-memory state
|
|
22
|
+
* (dev-guard plan-review caveat).
|
|
23
|
+
*
|
|
24
|
+
* Reads are DEFENSIVE: fixtures that bypass the canonical migration list (no
|
|
25
|
+
* `seat_identity_verdicts` table) get an empty map/undefined rather than a
|
|
26
|
+
* crash — the projection degrades to "no verdict" (never down-ranks), matching
|
|
27
|
+
* the fail-open-on-unknown contract.
|
|
28
|
+
*/
|
|
29
|
+
export class SeatIdentityStore {
|
|
30
|
+
db;
|
|
31
|
+
constructor(db) {
|
|
32
|
+
this.db = db;
|
|
33
|
+
}
|
|
34
|
+
/** Upsert one node's verdict (last-writer-wins per node). */
|
|
35
|
+
upsert(v) {
|
|
36
|
+
this.db.prepare(`
|
|
37
|
+
INSERT INTO seat_identity_verdicts
|
|
38
|
+
(node_id, verdict, evidence_source, reason, registered_pane, observed_pid, observed_command, matched_layer, session_name, observed_at)
|
|
39
|
+
VALUES (@node_id, @verdict, @evidence_source, @reason, @registered_pane, @observed_pid, @observed_command, @matched_layer, @session_name, @observed_at)
|
|
40
|
+
ON CONFLICT(node_id) DO UPDATE SET
|
|
41
|
+
verdict = excluded.verdict,
|
|
42
|
+
evidence_source = excluded.evidence_source,
|
|
43
|
+
reason = excluded.reason,
|
|
44
|
+
registered_pane = excluded.registered_pane,
|
|
45
|
+
observed_pid = excluded.observed_pid,
|
|
46
|
+
observed_command = excluded.observed_command,
|
|
47
|
+
matched_layer = excluded.matched_layer,
|
|
48
|
+
session_name = excluded.session_name,
|
|
49
|
+
observed_at = excluded.observed_at
|
|
50
|
+
`).run({
|
|
51
|
+
node_id: v.nodeId,
|
|
52
|
+
verdict: v.verdict,
|
|
53
|
+
evidence_source: v.evidenceSource,
|
|
54
|
+
reason: v.reason,
|
|
55
|
+
registered_pane: v.evidence.registeredPane,
|
|
56
|
+
observed_pid: v.evidence.observedPid,
|
|
57
|
+
observed_command: v.evidence.observedCommand,
|
|
58
|
+
matched_layer: v.evidence.matchedLayer,
|
|
59
|
+
session_name: v.sessionName,
|
|
60
|
+
observed_at: v.observedAt,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/** Read all verdicts for the nodes of a rig, keyed by node_id. Defensive. */
|
|
64
|
+
getForRig(rigId) {
|
|
65
|
+
const out = new Map();
|
|
66
|
+
try {
|
|
67
|
+
const rows = this.db.prepare(`
|
|
68
|
+
SELECT v.* FROM seat_identity_verdicts v
|
|
69
|
+
JOIN nodes n ON n.id = v.node_id
|
|
70
|
+
WHERE n.rig_id = ?
|
|
71
|
+
`).all(rigId);
|
|
72
|
+
for (const row of rows)
|
|
73
|
+
out.set(row.node_id, rowToVerdict(row));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Table absent (partial fixture) — degrade to no verdicts.
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
/** Read a single node's verdict, or null. Defensive. */
|
|
81
|
+
getForNode(nodeId) {
|
|
82
|
+
try {
|
|
83
|
+
const row = this.db.prepare("SELECT * FROM seat_identity_verdicts WHERE node_id = ?").get(nodeId);
|
|
84
|
+
return row ? rowToVerdict(row) : null;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Drop verdicts for nodes no longer in the live set (memory/table hygiene). */
|
|
91
|
+
pruneExcept(liveNodeIds) {
|
|
92
|
+
try {
|
|
93
|
+
const existing = this.db.prepare("SELECT node_id FROM seat_identity_verdicts").all();
|
|
94
|
+
const live = new Set(liveNodeIds);
|
|
95
|
+
const del = this.db.prepare("DELETE FROM seat_identity_verdicts WHERE node_id = ?");
|
|
96
|
+
for (const r of existing) {
|
|
97
|
+
if (!live.has(r.node_id))
|
|
98
|
+
del.run(r.node_id);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Table absent — nothing to prune.
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=seat-identity-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-identity-store.js","sourceRoot":"","sources":["../../src/domain/seat-identity-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { RigRepository } from "./rig-repository.js";
|
|
2
|
+
import type { TmuxAdapter } from "../adapters/tmux.js";
|
|
3
|
+
export interface SeatSwitchClientRequest {
|
|
4
|
+
seatRef: string;
|
|
5
|
+
/** Target a specific attached client; required when multiple are attached. */
|
|
6
|
+
client?: string | null;
|
|
7
|
+
/** Target window index; defaults to 0 (the canonical seat window). */
|
|
8
|
+
toWindow?: number | null;
|
|
9
|
+
}
|
|
10
|
+
export interface SeatSwitchClientSuccess {
|
|
11
|
+
seat_ref: string;
|
|
12
|
+
session: string;
|
|
13
|
+
window: number;
|
|
14
|
+
target: string;
|
|
15
|
+
client: string;
|
|
16
|
+
/** VIEW-ONLY marker: switch-client never mutates routing/bindings/identity. */
|
|
17
|
+
mutated: false;
|
|
18
|
+
retargeted: true;
|
|
19
|
+
}
|
|
20
|
+
interface ClientRef {
|
|
21
|
+
name: string;
|
|
22
|
+
session: string;
|
|
23
|
+
}
|
|
24
|
+
export type SeatSwitchClientResult = {
|
|
25
|
+
ok: true;
|
|
26
|
+
result: SeatSwitchClientSuccess;
|
|
27
|
+
} | {
|
|
28
|
+
ok: false;
|
|
29
|
+
code: "seat_ref_required" | "seat_not_found" | "seat_ambiguous" | "missing_canonical_session" | "session_not_found" | "window_not_found" | "no_client" | "ambiguous_client" | "client_not_found" | "switch_failed" | "tmux_probe_failed";
|
|
30
|
+
message: string;
|
|
31
|
+
guidance?: string;
|
|
32
|
+
/** Attached clients, surfaced on the ambiguous / not-found paths so the
|
|
33
|
+
* operator can re-run with an explicit --client. */
|
|
34
|
+
clients?: ClientRef[];
|
|
35
|
+
matches?: Array<{
|
|
36
|
+
rig_name: string;
|
|
37
|
+
logical_id: string;
|
|
38
|
+
current_occupant: string | null;
|
|
39
|
+
}>;
|
|
40
|
+
};
|
|
41
|
+
export declare class SeatSwitchClientService {
|
|
42
|
+
private rigRepo;
|
|
43
|
+
private tmuxAdapter;
|
|
44
|
+
constructor(deps: {
|
|
45
|
+
rigRepo: RigRepository;
|
|
46
|
+
tmuxAdapter: TmuxAdapter;
|
|
47
|
+
});
|
|
48
|
+
/** Honest probe-failure result. The tmux adapter intentionally RETHROWS
|
|
49
|
+
* unexpected probe failures (permission / socket errors). Every probe here
|
|
50
|
+
* (hasSession / listWindows / listClients) routes a throw through this so it
|
|
51
|
+
* surfaces as a structured tmux_probe_failed (-> HTTP 502) that names the
|
|
52
|
+
* failed operation, never an unstructured 500. */
|
|
53
|
+
private probeFailed;
|
|
54
|
+
switchClient(req: SeatSwitchClientRequest): Promise<SeatSwitchClientResult>;
|
|
55
|
+
}
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=seat-switch-client-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-switch-client-service.d.ts","sourceRoot":"","sources":["../../src/domain/seat-switch-client-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,qBAAqB,CAAC;AAuB/E,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,OAAO,EAAE,KAAK,CAAC;IACf,UAAU,EAAE,IAAI,CAAC;CAClB;AAED,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,uBAAuB,CAAA;CAAE,GAC7C;IACE,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EACA,mBAAmB,GACnB,gBAAgB,GAChB,gBAAgB,GAChB,2BAA2B,GAC3B,mBAAmB,GACnB,kBAAkB,GAClB,WAAW,GACX,kBAAkB,GAClB,kBAAkB,GAClB,eAAe,GACf,mBAAmB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;yDACqD;IACrD,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CAC5F,CAAC;AAEN,qBAAa,uBAAuB;IAClC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,WAAW,CAAc;gBAErB,IAAI,EAAE;QAAE,OAAO,EAAE,aAAa,CAAC;QAAC,WAAW,EAAE,WAAW,CAAA;KAAE;IAKtE;;;;uDAImD;IACnD,OAAO,CAAC,WAAW;IASb,YAAY,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC;CAmIlF"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { SeatStatusService } from "./seat-status-service.js";
|
|
2
|
+
/**
|
|
3
|
+
* OPR.0.4.3.26 — seat-recovery switch-client VIEW retarget.
|
|
4
|
+
*
|
|
5
|
+
* Points an already-attached tmux client (a human terminal / CMUX tile) at the
|
|
6
|
+
* seat's canonical session/window. It is deliberately VIEW-ONLY: the only
|
|
7
|
+
* dependencies are `rigRepo` (read, via SeatStatusService) and `tmuxAdapter`
|
|
8
|
+
* (probe + switch). It holds NO SessionRegistry write surface, NO ClaimService,
|
|
9
|
+
* NO SeatHandoverService, and never calls converge/reconcile — so it is
|
|
10
|
+
* structurally incapable of mutating routing, bindings, sessions, transcripts,
|
|
11
|
+
* or node identity. It composes AFTER the routing-repair verbs
|
|
12
|
+
* (`reconcile-session` / seat handover) as a distinct step.
|
|
13
|
+
*/
|
|
14
|
+
const RECONCILE_GUIDANCE = "Repair routing first (rig reconcile-session <session>, or rig seat handover <seat> ...), then re-run switch-client. switch-client only retargets a client's view; it never repairs routing.";
|
|
15
|
+
function attachGuidance(session) {
|
|
16
|
+
return `Attach a client first: tmux attach -t ${session} (or open the seat in CMUX), then re-run switch-client. switch-client never opens a new terminal.`;
|
|
17
|
+
}
|
|
18
|
+
export class SeatSwitchClientService {
|
|
19
|
+
rigRepo;
|
|
20
|
+
tmuxAdapter;
|
|
21
|
+
constructor(deps) {
|
|
22
|
+
this.rigRepo = deps.rigRepo;
|
|
23
|
+
this.tmuxAdapter = deps.tmuxAdapter;
|
|
24
|
+
}
|
|
25
|
+
/** Honest probe-failure result. The tmux adapter intentionally RETHROWS
|
|
26
|
+
* unexpected probe failures (permission / socket errors). Every probe here
|
|
27
|
+
* (hasSession / listWindows / listClients) routes a throw through this so it
|
|
28
|
+
* surfaces as a structured tmux_probe_failed (-> HTTP 502) that names the
|
|
29
|
+
* failed operation, never an unstructured 500. */
|
|
30
|
+
probeFailed(operation, err) {
|
|
31
|
+
return {
|
|
32
|
+
ok: false,
|
|
33
|
+
code: "tmux_probe_failed",
|
|
34
|
+
message: `tmux ${operation} probe failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
35
|
+
guidance: RECONCILE_GUIDANCE,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async switchClient(req) {
|
|
39
|
+
// 1. Resolve seat -> canonical session, READ-ONLY (no binding mutation).
|
|
40
|
+
const statusService = new SeatStatusService({ rigRepo: this.rigRepo });
|
|
41
|
+
const status = statusService.getStatus(req.seatRef);
|
|
42
|
+
if (!status.ok) {
|
|
43
|
+
// Propagate the read-only resolution errors verbatim (seat_ref_required /
|
|
44
|
+
// seat_not_found / seat_ambiguous, incl. the ambiguity match list).
|
|
45
|
+
if (status.code === "seat_ambiguous") {
|
|
46
|
+
return { ok: false, code: "seat_ambiguous", message: status.message, guidance: status.guidance, matches: status.matches };
|
|
47
|
+
}
|
|
48
|
+
return { ok: false, code: status.code, message: status.message, guidance: status.guidance };
|
|
49
|
+
}
|
|
50
|
+
const session = status.status.current_occupant;
|
|
51
|
+
if (!session) {
|
|
52
|
+
return {
|
|
53
|
+
ok: false,
|
|
54
|
+
code: "missing_canonical_session",
|
|
55
|
+
message: `Seat "${req.seatRef}" has no canonical tmux session to view.`,
|
|
56
|
+
guidance: RECONCILE_GUIDANCE,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// 2. Probe the canonical session (read-only). A genuine probe failure
|
|
60
|
+
// (permission, etc.) is surfaced honestly rather than swallowed.
|
|
61
|
+
let sessionLive;
|
|
62
|
+
try {
|
|
63
|
+
sessionLive = await this.tmuxAdapter.hasSession(session);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
return this.probeFailed(`has-session for "${session}"`, err);
|
|
67
|
+
}
|
|
68
|
+
if (!sessionLive) {
|
|
69
|
+
return {
|
|
70
|
+
ok: false,
|
|
71
|
+
code: "session_not_found",
|
|
72
|
+
message: `Canonical session "${session}" for seat "${req.seatRef}" is not live.`,
|
|
73
|
+
guidance: RECONCILE_GUIDANCE,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// 3. Resolve the target window. Default = 0 (the canonical seat window).
|
|
77
|
+
// An explicit --to-window is verified against the live session so the
|
|
78
|
+
// operator gets actionable guidance, never a raw tmux failure.
|
|
79
|
+
const windowIndex = req.toWindow ?? 0;
|
|
80
|
+
if (req.toWindow != null) {
|
|
81
|
+
let windows;
|
|
82
|
+
try {
|
|
83
|
+
windows = await this.tmuxAdapter.listWindows(session);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
return this.probeFailed(`list-windows for "${session}"`, err);
|
|
87
|
+
}
|
|
88
|
+
if (!windows.some((w) => w.index === req.toWindow)) {
|
|
89
|
+
const available = windows.map((w) => w.index).join(", ") || "none";
|
|
90
|
+
return {
|
|
91
|
+
ok: false,
|
|
92
|
+
code: "window_not_found",
|
|
93
|
+
message: `Window ${req.toWindow} does not exist in session "${session}".`,
|
|
94
|
+
guidance: `Available windows: ${available}.`,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// 4. Select the attached client to retarget.
|
|
99
|
+
let clients;
|
|
100
|
+
try {
|
|
101
|
+
clients = await this.tmuxAdapter.listClients();
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
return this.probeFailed("list-clients", err);
|
|
105
|
+
}
|
|
106
|
+
if (clients.length === 0) {
|
|
107
|
+
return {
|
|
108
|
+
ok: false,
|
|
109
|
+
code: "no_client",
|
|
110
|
+
message: `No attached tmux client to retarget for seat "${req.seatRef}".`,
|
|
111
|
+
guidance: attachGuidance(session),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
let targetClient;
|
|
115
|
+
if (req.client) {
|
|
116
|
+
const match = clients.find((cl) => cl.name === req.client);
|
|
117
|
+
if (!match) {
|
|
118
|
+
return {
|
|
119
|
+
ok: false,
|
|
120
|
+
code: "client_not_found",
|
|
121
|
+
message: `No attached client named "${req.client}".`,
|
|
122
|
+
guidance: "Re-run with a --client from the attached clients list.",
|
|
123
|
+
clients: clients.map((cl) => ({ name: cl.name, session: cl.session })),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
targetClient = match.name;
|
|
127
|
+
}
|
|
128
|
+
else if (clients.length === 1) {
|
|
129
|
+
targetClient = clients[0].name;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// Never silently retarget one of several humans' views — force an
|
|
133
|
+
// explicit --client selection.
|
|
134
|
+
return {
|
|
135
|
+
ok: false,
|
|
136
|
+
code: "ambiguous_client",
|
|
137
|
+
message: `Multiple attached clients; specify one with --client <name>.`,
|
|
138
|
+
guidance: "Re-run with --client set to one of the attached clients.",
|
|
139
|
+
clients: clients.map((cl) => ({ name: cl.name, session: cl.session })),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// 5. Retarget the client's VIEW (the only side effect; not a mutation of
|
|
143
|
+
// OpenRig routing/identity).
|
|
144
|
+
const target = `${session}:${windowIndex}`;
|
|
145
|
+
const switchResult = await this.tmuxAdapter.switchClient(targetClient, target);
|
|
146
|
+
if (!switchResult.ok) {
|
|
147
|
+
return {
|
|
148
|
+
ok: false,
|
|
149
|
+
code: "switch_failed",
|
|
150
|
+
message: `tmux switch-client failed: ${switchResult.message}`,
|
|
151
|
+
guidance: RECONCILE_GUIDANCE,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
ok: true,
|
|
156
|
+
result: {
|
|
157
|
+
seat_ref: req.seatRef,
|
|
158
|
+
session,
|
|
159
|
+
window: windowIndex,
|
|
160
|
+
target,
|
|
161
|
+
client: targetClient,
|
|
162
|
+
mutated: false,
|
|
163
|
+
retargeted: true,
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=seat-switch-client-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-switch-client-service.js","sourceRoot":"","sources":["../../src/domain/seat-switch-client-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,9 @@ export type SelfAttachSuccess = {
|
|
|
15
15
|
env: {
|
|
16
16
|
OPENRIG_NODE_ID: string;
|
|
17
17
|
OPENRIG_SESSION_NAME: string;
|
|
18
|
+
OPENRIG_RUNTIME?: string;
|
|
19
|
+
OPENRIG_URL?: string;
|
|
20
|
+
OPENRIG_ACTIVITY_HOOK_TOKEN?: string;
|
|
18
21
|
};
|
|
19
22
|
};
|
|
20
23
|
export type SelfAttachFailureCode = "rig_not_found" | "node_not_found" | "pod_not_found" | "already_bound" | "duplicate_logical_id" | "invalid_member_name" | "runtime_required" | "runtime_mismatch";
|
|
@@ -37,6 +40,10 @@ interface SelfAttachServiceDeps {
|
|
|
37
40
|
tmuxSession?: string | null;
|
|
38
41
|
}): void;
|
|
39
42
|
};
|
|
43
|
+
activityEnv?: {
|
|
44
|
+
url?: string;
|
|
45
|
+
token?: string;
|
|
46
|
+
};
|
|
40
47
|
}
|
|
41
48
|
interface AttachToNodeOptions {
|
|
42
49
|
rigId: string;
|
|
@@ -75,6 +82,7 @@ export declare class SelfAttachService {
|
|
|
75
82
|
private tmuxAdapter;
|
|
76
83
|
private transcriptStore;
|
|
77
84
|
private claudeContextProvisioner;
|
|
85
|
+
private activityEnv;
|
|
78
86
|
constructor(deps: SelfAttachServiceDeps);
|
|
79
87
|
attachToNode(opts: AttachToNodeOptions): Promise<SelfAttachResult>;
|
|
80
88
|
attachToPod(opts: AttachToPodOptions): Promise<SelfAttachResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self-attach-service.d.ts","sourceRoot":"","sources":["../../src/domain/self-attach-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,cAAc,CAAC;IACxC,GAAG,EAAE;QACH,eAAe,EAAE,MAAM,CAAC;QACxB,oBAAoB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"self-attach-service.d.ts","sourceRoot":"","sources":["../../src/domain/self-attach-service.ts"],"names":[],"mappings":"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"}
|