@openrig/cli 0.1.12 → 0.2.0
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/openrig-activity-hook-relay.cjs +104 -0
- package/daemon/dist/adapters/claude-code-adapter.d.ts +14 -6
- package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +183 -65
- package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/daemon/dist/adapters/claude-resume.d.ts +5 -0
- package/daemon/dist/adapters/claude-resume.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-resume.js +13 -0
- package/daemon/dist/adapters/claude-resume.js.map +1 -1
- package/daemon/dist/adapters/codex-resume.d.ts +8 -1
- package/daemon/dist/adapters/codex-resume.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-resume.js +74 -5
- package/daemon/dist/adapters/codex-resume.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts +9 -5
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +255 -28
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/terminal-adapter.d.ts +2 -1
- package/daemon/dist/adapters/terminal-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/terminal-adapter.js +7 -1
- package/daemon/dist/adapters/terminal-adapter.js.map +1 -1
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +53 -5
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/db/migrations/021_seat_handover_observability.d.ts +3 -0
- package/daemon/dist/db/migrations/021_seat_handover_observability.d.ts.map +1 -0
- package/daemon/dist/db/migrations/021_seat_handover_observability.js +11 -0
- package/daemon/dist/db/migrations/021_seat_handover_observability.js.map +1 -0
- package/daemon/dist/db/migrations/022_node_codex_config_profile.d.ts +3 -0
- package/daemon/dist/db/migrations/022_node_codex_config_profile.d.ts.map +1 -0
- package/daemon/dist/db/migrations/022_node_codex_config_profile.js +7 -0
- package/daemon/dist/db/migrations/022_node_codex_config_profile.js.map +1 -0
- package/daemon/dist/db/migrations/023_stream_items.d.ts +16 -0
- package/daemon/dist/db/migrations/023_stream_items.d.ts.map +1 -0
- package/daemon/dist/db/migrations/023_stream_items.js +37 -0
- package/daemon/dist/db/migrations/023_stream_items.js.map +1 -0
- package/daemon/dist/db/migrations/024_queue_items.d.ts +19 -0
- package/daemon/dist/db/migrations/024_queue_items.d.ts.map +1 -0
- package/daemon/dist/db/migrations/024_queue_items.js +52 -0
- package/daemon/dist/db/migrations/024_queue_items.js.map +1 -0
- package/daemon/dist/db/migrations/025_queue_transitions.d.ts +13 -0
- package/daemon/dist/db/migrations/025_queue_transitions.d.ts.map +1 -0
- package/daemon/dist/db/migrations/025_queue_transitions.js +28 -0
- package/daemon/dist/db/migrations/025_queue_transitions.js.map +1 -0
- package/daemon/dist/db/migrations/026_inbox_entries.d.ts +14 -0
- package/daemon/dist/db/migrations/026_inbox_entries.d.ts.map +1 -0
- package/daemon/dist/db/migrations/026_inbox_entries.js +35 -0
- package/daemon/dist/db/migrations/026_inbox_entries.js.map +1 -0
- package/daemon/dist/db/migrations/027_outbox_entries.d.ts +12 -0
- package/daemon/dist/db/migrations/027_outbox_entries.d.ts.map +1 -0
- package/daemon/dist/db/migrations/027_outbox_entries.js +30 -0
- package/daemon/dist/db/migrations/027_outbox_entries.js.map +1 -0
- package/daemon/dist/db/migrations/028_project_classifications.d.ts +26 -0
- package/daemon/dist/db/migrations/028_project_classifications.d.ts.map +1 -0
- package/daemon/dist/db/migrations/028_project_classifications.js +44 -0
- package/daemon/dist/db/migrations/028_project_classifications.js.map +1 -0
- package/daemon/dist/db/migrations/029_classifier_leases.d.ts +22 -0
- package/daemon/dist/db/migrations/029_classifier_leases.d.ts.map +1 -0
- package/daemon/dist/db/migrations/029_classifier_leases.js +41 -0
- package/daemon/dist/db/migrations/029_classifier_leases.js.map +1 -0
- package/daemon/dist/db/migrations/030_views_custom.d.ts +15 -0
- package/daemon/dist/db/migrations/030_views_custom.d.ts.map +1 -0
- package/daemon/dist/db/migrations/030_views_custom.js +27 -0
- package/daemon/dist/db/migrations/030_views_custom.js.map +1 -0
- package/daemon/dist/db/migrations/031_watchdog_jobs.d.ts +34 -0
- package/daemon/dist/db/migrations/031_watchdog_jobs.d.ts.map +1 -0
- package/daemon/dist/db/migrations/031_watchdog_jobs.js +59 -0
- package/daemon/dist/db/migrations/031_watchdog_jobs.js.map +1 -0
- package/daemon/dist/db/migrations/032_watchdog_history.d.ts +28 -0
- package/daemon/dist/db/migrations/032_watchdog_history.d.ts.map +1 -0
- package/daemon/dist/db/migrations/032_watchdog_history.js +46 -0
- package/daemon/dist/db/migrations/032_watchdog_history.js.map +1 -0
- package/daemon/dist/db/migrations/033_workflow_specs.d.ts +30 -0
- package/daemon/dist/db/migrations/033_workflow_specs.d.ts.map +1 -0
- package/daemon/dist/db/migrations/033_workflow_specs.js +50 -0
- package/daemon/dist/db/migrations/033_workflow_specs.js.map +1 -0
- package/daemon/dist/db/migrations/034_workflow_instances.d.ts +42 -0
- package/daemon/dist/db/migrations/034_workflow_instances.d.ts.map +1 -0
- package/daemon/dist/db/migrations/034_workflow_instances.js +63 -0
- package/daemon/dist/db/migrations/034_workflow_instances.js.map +1 -0
- package/daemon/dist/db/migrations/035_workflow_step_trails.d.ts +29 -0
- package/daemon/dist/db/migrations/035_workflow_step_trails.d.ts.map +1 -0
- package/daemon/dist/db/migrations/035_workflow_step_trails.js +48 -0
- package/daemon/dist/db/migrations/035_workflow_step_trails.js.map +1 -0
- package/daemon/dist/db/migrations/036_watchdog_policy_enum_extension.d.ts +35 -0
- package/daemon/dist/db/migrations/036_watchdog_policy_enum_extension.d.ts.map +1 -0
- package/daemon/dist/db/migrations/036_watchdog_policy_enum_extension.js +43 -0
- package/daemon/dist/db/migrations/036_watchdog_policy_enum_extension.js.map +1 -0
- package/daemon/dist/domain/agent-activity-store.d.ts +42 -0
- package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -0
- package/daemon/dist/domain/agent-activity-store.js +177 -0
- package/daemon/dist/domain/agent-activity-store.js.map +1 -0
- package/daemon/dist/domain/agent-manifest.d.ts.map +1 -1
- package/daemon/dist/domain/agent-manifest.js +3 -0
- package/daemon/dist/domain/agent-manifest.js.map +1 -1
- package/daemon/dist/domain/agent-starter-resolver.d.ts +100 -0
- package/daemon/dist/domain/agent-starter-resolver.d.ts.map +1 -0
- package/daemon/dist/domain/agent-starter-resolver.js +200 -0
- package/daemon/dist/domain/agent-starter-resolver.js.map +1 -0
- package/daemon/dist/domain/classifier-lease-manager.d.ts +130 -0
- package/daemon/dist/domain/classifier-lease-manager.d.ts.map +1 -0
- package/daemon/dist/domain/classifier-lease-manager.js +285 -0
- package/daemon/dist/domain/classifier-lease-manager.js.map +1 -0
- package/daemon/dist/domain/context-usage-store.d.ts +1 -1
- package/daemon/dist/domain/context-usage-store.js +1 -1
- package/daemon/dist/domain/context-usage-store.js.map +1 -1
- package/daemon/dist/domain/hot-potato-enforcer.d.ts +45 -0
- package/daemon/dist/domain/hot-potato-enforcer.d.ts.map +1 -0
- package/daemon/dist/domain/hot-potato-enforcer.js +94 -0
- package/daemon/dist/domain/hot-potato-enforcer.js.map +1 -0
- package/daemon/dist/domain/inbox-handler.d.ts +68 -0
- package/daemon/dist/domain/inbox-handler.d.ts.map +1 -0
- package/daemon/dist/domain/inbox-handler.js +177 -0
- package/daemon/dist/domain/inbox-handler.js.map +1 -0
- package/daemon/dist/domain/native-resume-probe.d.ts +1 -1
- package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
- package/daemon/dist/domain/native-resume-probe.js +67 -0
- package/daemon/dist/domain/native-resume-probe.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts +29 -1
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +160 -38
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/node-launcher.d.ts +2 -0
- package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/node-launcher.js +14 -2
- package/daemon/dist/domain/node-launcher.js.map +1 -1
- package/daemon/dist/domain/outbox-handler.d.ts +48 -0
- package/daemon/dist/domain/outbox-handler.d.ts.map +1 -0
- package/daemon/dist/domain/outbox-handler.js +106 -0
- package/daemon/dist/domain/outbox-handler.js.map +1 -0
- package/daemon/dist/domain/policies/artifact-pool-helpers.d.ts +64 -0
- package/daemon/dist/domain/policies/artifact-pool-helpers.d.ts.map +1 -0
- package/daemon/dist/domain/policies/artifact-pool-helpers.js +226 -0
- package/daemon/dist/domain/policies/artifact-pool-helpers.js.map +1 -0
- package/daemon/dist/domain/policies/artifact-pool-ready.d.ts +3 -0
- package/daemon/dist/domain/policies/artifact-pool-ready.d.ts.map +1 -0
- package/daemon/dist/domain/policies/artifact-pool-ready.js +41 -0
- package/daemon/dist/domain/policies/artifact-pool-ready.js.map +1 -0
- package/daemon/dist/domain/policies/edge-artifact-required.d.ts +3 -0
- package/daemon/dist/domain/policies/edge-artifact-required.d.ts.map +1 -0
- package/daemon/dist/domain/policies/edge-artifact-required.js +90 -0
- package/daemon/dist/domain/policies/edge-artifact-required.js.map +1 -0
- package/daemon/dist/domain/policies/periodic-reminder.d.ts +3 -0
- package/daemon/dist/domain/policies/periodic-reminder.d.ts.map +1 -0
- package/daemon/dist/domain/policies/periodic-reminder.js +30 -0
- package/daemon/dist/domain/policies/periodic-reminder.js.map +1 -0
- package/daemon/dist/domain/policies/types.d.ts +51 -0
- package/daemon/dist/domain/policies/types.d.ts.map +1 -0
- package/daemon/dist/domain/policies/types.js +9 -0
- package/daemon/dist/domain/policies/types.js.map +1 -0
- package/daemon/dist/domain/policies/workflow-keepalive.d.ts +7 -0
- package/daemon/dist/domain/policies/workflow-keepalive.d.ts.map +1 -0
- package/daemon/dist/domain/policies/workflow-keepalive.js +123 -0
- package/daemon/dist/domain/policies/workflow-keepalive.js.map +1 -0
- package/daemon/dist/domain/project-classifier.d.ts +75 -0
- package/daemon/dist/domain/project-classifier.d.ts.map +1 -0
- package/daemon/dist/domain/project-classifier.js +132 -0
- package/daemon/dist/domain/project-classifier.js.map +1 -0
- package/daemon/dist/domain/projection-planner.d.ts +1 -0
- package/daemon/dist/domain/projection-planner.d.ts.map +1 -1
- package/daemon/dist/domain/projection-planner.js +3 -0
- package/daemon/dist/domain/projection-planner.js.map +1 -1
- package/daemon/dist/domain/ps-projection.d.ts +31 -0
- package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
- package/daemon/dist/domain/ps-projection.js +38 -0
- package/daemon/dist/domain/ps-projection.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +322 -0
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -0
- package/daemon/dist/domain/queue-repository.js +686 -0
- package/daemon/dist/domain/queue-repository.js.map +1 -0
- package/daemon/dist/domain/queue-transition-log.d.ts +38 -0
- package/daemon/dist/domain/queue-transition-log.d.ts.map +1 -0
- package/daemon/dist/domain/queue-transition-log.js +52 -0
- package/daemon/dist/domain/queue-transition-log.js.map +1 -0
- package/daemon/dist/domain/restore-check-service.d.ts +203 -0
- package/daemon/dist/domain/restore-check-service.d.ts.map +1 -0
- package/daemon/dist/domain/restore-check-service.js +1047 -0
- package/daemon/dist/domain/restore-check-service.js.map +1 -0
- package/daemon/dist/domain/restore-orchestrator.d.ts +49 -3
- package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +460 -62
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
- package/daemon/dist/domain/rig-expansion-service.js +13 -0
- package/daemon/dist/domain/rig-expansion-service.js.map +1 -1
- package/daemon/dist/domain/rig-repository.d.ts +17 -1
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +63 -5
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-codec.js +13 -0
- package/daemon/dist/domain/rigspec-codec.js.map +1 -1
- package/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-exporter.js +2 -0
- package/daemon/dist/domain/rigspec-exporter.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +61 -1
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-schema.js +196 -0
- package/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/daemon/dist/domain/runtime-adapter.d.ts +27 -2
- package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/domain/runtime-adapter.js +5 -0
- package/daemon/dist/domain/runtime-adapter.js.map +1 -1
- package/daemon/dist/domain/seat-handover-planner.d.ts +84 -0
- package/daemon/dist/domain/seat-handover-planner.d.ts.map +1 -0
- package/daemon/dist/domain/seat-handover-planner.js +188 -0
- package/daemon/dist/domain/seat-handover-planner.js.map +1 -0
- package/daemon/dist/domain/seat-handover-service.d.ts +104 -0
- package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -0
- package/daemon/dist/domain/seat-handover-service.js +343 -0
- package/daemon/dist/domain/seat-handover-service.js.map +1 -0
- package/daemon/dist/domain/seat-status-service.d.ts +50 -0
- package/daemon/dist/domain/seat-status-service.d.ts.map +1 -0
- package/daemon/dist/domain/seat-status-service.js +66 -0
- package/daemon/dist/domain/seat-status-service.js.map +1 -0
- package/daemon/dist/domain/session-source-rebuild-resolver.d.ts +53 -0
- package/daemon/dist/domain/session-source-rebuild-resolver.d.ts.map +1 -0
- package/daemon/dist/domain/session-source-rebuild-resolver.js +59 -0
- package/daemon/dist/domain/session-source-rebuild-resolver.js.map +1 -0
- package/daemon/dist/domain/session-transport.d.ts +30 -0
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +322 -12
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/snapshot-repository.d.ts +18 -0
- package/daemon/dist/domain/snapshot-repository.d.ts.map +1 -1
- package/daemon/dist/domain/snapshot-repository.js +77 -0
- package/daemon/dist/domain/snapshot-repository.js.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.d.ts +22 -3
- package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.js +31 -5
- package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
- package/daemon/dist/domain/stream-store.d.ts +56 -0
- package/daemon/dist/domain/stream-store.d.ts.map +1 -0
- package/daemon/dist/domain/stream-store.js +108 -0
- package/daemon/dist/domain/stream-store.js.map +1 -0
- package/daemon/dist/domain/transcript-redaction.d.ts +13 -0
- package/daemon/dist/domain/transcript-redaction.d.ts.map +1 -0
- package/daemon/dist/domain/transcript-redaction.js +34 -0
- package/daemon/dist/domain/transcript-redaction.js.map +1 -0
- package/daemon/dist/domain/transcript-store.d.ts +15 -0
- package/daemon/dist/domain/transcript-store.d.ts.map +1 -1
- package/daemon/dist/domain/transcript-store.js +57 -1
- package/daemon/dist/domain/transcript-store.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +316 -3
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/view-event-bridge.d.ts +12 -0
- package/daemon/dist/domain/view-event-bridge.d.ts.map +1 -0
- package/daemon/dist/domain/view-event-bridge.js +92 -0
- package/daemon/dist/domain/view-event-bridge.js.map +1 -0
- package/daemon/dist/domain/view-projector.d.ts +83 -0
- package/daemon/dist/domain/view-projector.d.ts.map +1 -0
- package/daemon/dist/domain/view-projector.js +296 -0
- package/daemon/dist/domain/view-projector.js.map +1 -0
- package/daemon/dist/domain/watchdog-history-log.d.ts +49 -0
- package/daemon/dist/domain/watchdog-history-log.d.ts.map +1 -0
- package/daemon/dist/domain/watchdog-history-log.js +67 -0
- package/daemon/dist/domain/watchdog-history-log.js.map +1 -0
- package/daemon/dist/domain/watchdog-jobs-repository.d.ts +81 -0
- package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -0
- package/daemon/dist/domain/watchdog-jobs-repository.js +164 -0
- package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -0
- package/daemon/dist/domain/watchdog-policy-engine.d.ts +92 -0
- package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -0
- package/daemon/dist/domain/watchdog-policy-engine.js +442 -0
- package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -0
- package/daemon/dist/domain/watchdog-scheduler.d.ts +76 -0
- package/daemon/dist/domain/watchdog-scheduler.d.ts.map +1 -0
- package/daemon/dist/domain/watchdog-scheduler.js +112 -0
- package/daemon/dist/domain/watchdog-scheduler.js.map +1 -0
- package/daemon/dist/domain/workflow-instance-store.d.ts +46 -0
- package/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-instance-store.js +116 -0
- package/daemon/dist/domain/workflow-instance-store.js.map +1 -0
- package/daemon/dist/domain/workflow-projector.d.ts +64 -0
- package/daemon/dist/domain/workflow-projector.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-projector.js +424 -0
- package/daemon/dist/domain/workflow-projector.js.map +1 -0
- package/daemon/dist/domain/workflow-runtime.d.ts +63 -0
- package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-runtime.js +150 -0
- package/daemon/dist/domain/workflow-runtime.js.map +1 -0
- package/daemon/dist/domain/workflow-spec-cache.d.ts +35 -0
- package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-spec-cache.js +171 -0
- package/daemon/dist/domain/workflow-spec-cache.js.map +1 -0
- package/daemon/dist/domain/workflow-step-trail-log.d.ts +27 -0
- package/daemon/dist/domain/workflow-step-trail-log.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-step-trail-log.js +73 -0
- package/daemon/dist/domain/workflow-step-trail-log.js.map +1 -0
- package/daemon/dist/domain/workflow-types.d.ts +108 -0
- package/daemon/dist/domain/workflow-types.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-types.js +11 -0
- package/daemon/dist/domain/workflow-types.js.map +1 -0
- package/daemon/dist/domain/workflow-validator.d.ts +31 -0
- package/daemon/dist/domain/workflow-validator.d.ts.map +1 -0
- package/daemon/dist/domain/workflow-validator.js +115 -0
- package/daemon/dist/domain/workflow-validator.js.map +1 -0
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +21 -2
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/routes/activity.d.ts +3 -0
- package/daemon/dist/routes/activity.d.ts.map +1 -0
- package/daemon/dist/routes/activity.js +47 -0
- package/daemon/dist/routes/activity.js.map +1 -0
- package/daemon/dist/routes/projects.d.ts +12 -0
- package/daemon/dist/routes/projects.d.ts.map +1 -0
- package/daemon/dist/routes/projects.js +178 -0
- package/daemon/dist/routes/projects.js.map +1 -0
- package/daemon/dist/routes/queue.d.ts +10 -0
- package/daemon/dist/routes/queue.d.ts.map +1 -0
- package/daemon/dist/routes/queue.js +374 -0
- package/daemon/dist/routes/queue.js.map +1 -0
- package/daemon/dist/routes/restore-check.d.ts +3 -0
- package/daemon/dist/routes/restore-check.d.ts.map +1 -0
- package/daemon/dist/routes/restore-check.js +200 -0
- package/daemon/dist/routes/restore-check.js.map +1 -0
- package/daemon/dist/routes/rigs.d.ts.map +1 -1
- package/daemon/dist/routes/rigs.js +60 -4
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/seat.d.ts +3 -0
- package/daemon/dist/routes/seat.d.ts.map +1 -0
- package/daemon/dist/routes/seat.js +69 -0
- package/daemon/dist/routes/seat.js.map +1 -0
- package/daemon/dist/routes/sessions.d.ts.map +1 -1
- package/daemon/dist/routes/sessions.js +25 -4
- package/daemon/dist/routes/sessions.js.map +1 -1
- package/daemon/dist/routes/snapshots.js +66 -29
- package/daemon/dist/routes/snapshots.js.map +1 -1
- package/daemon/dist/routes/stream.d.ts +9 -0
- package/daemon/dist/routes/stream.d.ts.map +1 -0
- package/daemon/dist/routes/stream.js +119 -0
- package/daemon/dist/routes/stream.js.map +1 -0
- package/daemon/dist/routes/transcripts.d.ts.map +1 -1
- package/daemon/dist/routes/transcripts.js +38 -0
- package/daemon/dist/routes/transcripts.js.map +1 -1
- package/daemon/dist/routes/transport.d.ts.map +1 -1
- package/daemon/dist/routes/transport.js +21 -0
- package/daemon/dist/routes/transport.js.map +1 -1
- package/daemon/dist/routes/up.js +24 -3
- package/daemon/dist/routes/up.js.map +1 -1
- package/daemon/dist/routes/views.d.ts +13 -0
- package/daemon/dist/routes/views.d.ts.map +1 -0
- package/daemon/dist/routes/views.js +120 -0
- package/daemon/dist/routes/views.js.map +1 -0
- package/daemon/dist/routes/watchdog.d.ts +18 -0
- package/daemon/dist/routes/watchdog.d.ts.map +1 -0
- package/daemon/dist/routes/watchdog.js +148 -0
- package/daemon/dist/routes/watchdog.js.map +1 -0
- package/daemon/dist/routes/workflow.d.ts +20 -0
- package/daemon/dist/routes/workflow.d.ts.map +1 -0
- package/daemon/dist/routes/workflow.js +184 -0
- package/daemon/dist/routes/workflow.js.map +1 -0
- package/daemon/dist/server.d.ts +30 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +33 -0
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +202 -8
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/agent-spec.md +12 -5
- package/daemon/docs/reference/agent-startup-guide.md +9 -9
- package/daemon/specs/agents/apps/vault-specialist/agent.yaml +1 -1
- package/daemon/specs/agents/design/product-designer/agent.yaml +1 -1
- package/daemon/specs/agents/development/implementer/agent.yaml +1 -1
- package/daemon/specs/agents/development/qa/agent.yaml +1 -1
- package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -1
- package/daemon/specs/agents/product-management/pm/agent.yaml +4 -0
- package/daemon/specs/agents/research/analyst/agent.yaml +1 -1
- package/daemon/specs/agents/research/synthesizer/agent.yaml +1 -1
- package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -1
- package/daemon/specs/agents/shared/agent.yaml +17 -0
- package/daemon/specs/agents/shared/runtime/claude-mcp.fragment.json +12 -0
- package/daemon/specs/agents/shared/runtime/claude-settings.fragment.json +16 -0
- package/daemon/specs/agents/shared/runtime/codex-config.fragment.toml +5 -0
- package/daemon/specs/agents/shared/skills/claude-compact-in-place/SKILL.md +100 -0
- package/daemon/specs/agents/shared/skills/core/openrig-operator/SKILL.md +110 -0
- package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +44 -1
- package/daemon/specs/agents/shared/skills/mental-model-ha/SKILL.md +3 -0
- package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +3 -0
- package/daemon/specs/agents/shared/skills/rig-architect/SKILL.md +11 -1
- package/dist/bin-wrapper.js +0 -0
- package/dist/commands/capture.d.ts +7 -1
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +59 -1
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/compact-plan.d.ts +9 -0
- package/dist/commands/compact-plan.d.ts.map +1 -0
- package/dist/commands/compact-plan.js +354 -0
- package/dist/commands/compact-plan.js.map +1 -0
- package/dist/commands/context.d.ts +9 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +220 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/expand.d.ts.map +1 -1
- package/dist/commands/expand.js +15 -4
- package/dist/commands/expand.js.map +1 -1
- package/dist/commands/heartbeat.d.ts +99 -0
- package/dist/commands/heartbeat.d.ts.map +1 -0
- package/dist/commands/heartbeat.js +393 -0
- package/dist/commands/heartbeat.js.map +1 -0
- package/dist/commands/project.d.ts +14 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +157 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/ps.d.ts +20 -3
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +455 -33
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts +16 -0
- package/dist/commands/queue.d.ts.map +1 -0
- package/dist/commands/queue.js +401 -0
- package/dist/commands/queue.js.map +1 -0
- package/dist/commands/restore-check.d.ts +9 -0
- package/dist/commands/restore-check.d.ts.map +1 -0
- package/dist/commands/restore-check.js +234 -0
- package/dist/commands/restore-check.js.map +1 -0
- package/dist/commands/restore-packet.d.ts +9 -0
- package/dist/commands/restore-packet.d.ts.map +1 -0
- package/dist/commands/restore-packet.js +383 -0
- package/dist/commands/restore-packet.js.map +1 -0
- package/dist/commands/restore.d.ts.map +1 -1
- package/dist/commands/restore.js +44 -1
- package/dist/commands/restore.js.map +1 -1
- package/dist/commands/seat.d.ts +5 -0
- package/dist/commands/seat.d.ts.map +1 -0
- package/dist/commands/seat.js +170 -0
- package/dist/commands/seat.js.map +1 -0
- package/dist/commands/send.d.ts +12 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +93 -5
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/setup.js +3 -3
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/specs.d.ts.map +1 -1
- package/dist/commands/specs.js +99 -16
- package/dist/commands/specs.js.map +1 -1
- package/dist/commands/stream.d.ts +12 -0
- package/dist/commands/stream.d.ts.map +1 -0
- package/dist/commands/stream.js +111 -0
- package/dist/commands/stream.js.map +1 -0
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +63 -3
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/view.d.ts +12 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +82 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/commands/watchdog.d.ts +15 -0
- package/dist/commands/watchdog.d.ts.map +1 -0
- package/dist/commands/watchdog.js +120 -0
- package/dist/commands/watchdog.js.map +1 -0
- package/dist/commands/whoami.d.ts +8 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +60 -1
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/workflow.d.ts +17 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +138 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/cross-host-cli-helpers.d.ts +12 -0
- package/dist/cross-host-cli-helpers.d.ts.map +1 -0
- package/dist/cross-host-cli-helpers.js +48 -0
- package/dist/cross-host-cli-helpers.js.map +1 -0
- package/dist/cross-host-executor.d.ts +84 -0
- package/dist/cross-host-executor.d.ts.map +1 -0
- package/dist/cross-host-executor.js +138 -0
- package/dist/cross-host-executor.js.map +1 -0
- package/dist/host-registry.d.ts +50 -0
- package/dist/host-registry.d.ts.map +1 -0
- package/dist/host-registry.js +116 -0
- package/dist/host-registry.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +22 -2
- package/dist/mcp-server.js.map +1 -1
- package/dist/restore-packet/claude-transcript-parser.d.ts +12 -0
- package/dist/restore-packet/claude-transcript-parser.d.ts.map +1 -0
- package/dist/restore-packet/claude-transcript-parser.js +221 -0
- package/dist/restore-packet/claude-transcript-parser.js.map +1 -0
- package/dist/restore-packet/codex-jsonl-parser.d.ts +11 -0
- package/dist/restore-packet/codex-jsonl-parser.d.ts.map +1 -0
- package/dist/restore-packet/codex-jsonl-parser.js +159 -0
- package/dist/restore-packet/codex-jsonl-parser.js.map +1 -0
- package/dist/restore-packet/omitted-records.d.ts +60 -0
- package/dist/restore-packet/omitted-records.d.ts.map +1 -0
- package/dist/restore-packet/omitted-records.js +116 -0
- package/dist/restore-packet/omitted-records.js.map +1 -0
- package/dist/restore-packet/packet-writer.d.ts +59 -0
- package/dist/restore-packet/packet-writer.d.ts.map +1 -0
- package/dist/restore-packet/packet-writer.js +224 -0
- package/dist/restore-packet/packet-writer.js.map +1 -0
- package/dist/restore-packet/redaction.d.ts +30 -0
- package/dist/restore-packet/redaction.d.ts.map +1 -0
- package/dist/restore-packet/redaction.js +71 -0
- package/dist/restore-packet/redaction.js.map +1 -0
- package/dist/restore-packet/runtime-detect.d.ts +19 -0
- package/dist/restore-packet/runtime-detect.d.ts.map +1 -0
- package/dist/restore-packet/runtime-detect.js +81 -0
- package/dist/restore-packet/runtime-detect.js.map +1 -0
- package/dist/restore-packet/schema-validator.d.ts +13 -0
- package/dist/restore-packet/schema-validator.d.ts.map +1 -0
- package/dist/restore-packet/schema-validator.js +245 -0
- package/dist/restore-packet/schema-validator.js.map +1 -0
- package/dist/restore-packet/types.d.ts +76 -0
- package/dist/restore-packet/types.d.ts.map +1 -0
- package/dist/restore-packet/types.js +15 -0
- package/dist/restore-packet/types.js.map +1 -0
- package/dist/schemas/restore-summary.schema.json +98 -0
- package/package.json +10 -3
- package/scripts/check-abi.mjs +123 -0
- package/ui/dist/assets/{index-DlMH-REm.css → index-Dec25siz.css} +1 -1
- package/ui/dist/assets/{index-Ccd-jwRN.js → index-GNYaWmBj.js} +2 -2
- package/ui/dist/index.html +2 -2
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join, basename } from "node:path";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
/**
|
|
5
|
+
* Thrown by `resolveStarter` when the no-credentials scan fails. Per
|
|
6
|
+
* review-independent finding 2, the resolver MUST throw rather than
|
|
7
|
+
* return a structured "ok: false" result the orchestrator could ignore;
|
|
8
|
+
* a failed scan is a hard refusal point that aborts the launch.
|
|
9
|
+
*/
|
|
10
|
+
export class AgentStarterCredentialScanFailedError extends Error {
|
|
11
|
+
starterName;
|
|
12
|
+
reason;
|
|
13
|
+
constructor(starterName, reason) {
|
|
14
|
+
super(`Agent Starter "${starterName}" credential scan failed: ${reason}`);
|
|
15
|
+
this.name = "AgentStarterCredentialScanFailedError";
|
|
16
|
+
this.starterName = starterName;
|
|
17
|
+
this.reason = reason;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const DEFAULT_ENV_VAR = "OPENRIG_AGENT_STARTER_ROOT";
|
|
21
|
+
const DEFAULT_HOME_SUBPATH = ".openrig/agent-starters";
|
|
22
|
+
const DEFAULT_SUBSTRATE_FALLBACK = "/Users/wrandom/code/substrate/shared-docs/openrig-work/specs/agent-starters";
|
|
23
|
+
export class AgentStarterResolver {
|
|
24
|
+
registryRoot;
|
|
25
|
+
exists;
|
|
26
|
+
readFile;
|
|
27
|
+
constructor(opts = {}) {
|
|
28
|
+
this.exists = opts.exists ?? existsSync;
|
|
29
|
+
this.readFile = opts.readFile ?? ((p) => readFileSync(p, "utf-8"));
|
|
30
|
+
this.registryRoot = AgentStarterResolver.resolveRegistryRoot(opts, this.exists);
|
|
31
|
+
}
|
|
32
|
+
/** Exposed for tests + diagnostics. */
|
|
33
|
+
getRegistryRoot() {
|
|
34
|
+
return this.registryRoot;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Look up the registry root via the documented chain:
|
|
38
|
+
* opts.registryRoot > env[envVarName] > homeDirRoot (if exists) > substrateFallback
|
|
39
|
+
*
|
|
40
|
+
* The first three are explicit; the substrate fallback is the dogfood
|
|
41
|
+
* default and always returns even if the path doesn't exist (resolveStarter
|
|
42
|
+
* will throw with a missing-entry error when the fallback is dead). This
|
|
43
|
+
* keeps the constructor side-effect-free; the file-existence check lives
|
|
44
|
+
* inside `resolveStarter`.
|
|
45
|
+
*/
|
|
46
|
+
static resolveRegistryRoot(opts, exists) {
|
|
47
|
+
if (typeof opts.registryRoot === "string" && opts.registryRoot !== "") {
|
|
48
|
+
return opts.registryRoot;
|
|
49
|
+
}
|
|
50
|
+
const env = opts.env ?? process.env;
|
|
51
|
+
const envVarName = opts.envVarName ?? DEFAULT_ENV_VAR;
|
|
52
|
+
const fromEnv = env[envVarName];
|
|
53
|
+
if (typeof fromEnv === "string" && fromEnv !== "") {
|
|
54
|
+
return fromEnv;
|
|
55
|
+
}
|
|
56
|
+
const homeBase = opts.homeDirRoot
|
|
57
|
+
?? join(env.HOME ?? os.homedir(), DEFAULT_HOME_SUBPATH);
|
|
58
|
+
if (exists(homeBase)) {
|
|
59
|
+
return homeBase;
|
|
60
|
+
}
|
|
61
|
+
return opts.substrateFallback ?? DEFAULT_SUBSTRATE_FALLBACK;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Resolve a starter by registry name. THROWS on:
|
|
65
|
+
* - missing registry entry (no `<root>/<name>.yaml`);
|
|
66
|
+
* - malformed YAML (best-effort detection — empty file, unparseable
|
|
67
|
+
* front-matter shape — driver does not pull in a YAML parser at
|
|
68
|
+
* M1 to keep the dependency surface narrow);
|
|
69
|
+
* - failed no-credentials scan (`AgentStarterCredentialScanFailedError`).
|
|
70
|
+
*
|
|
71
|
+
* On a clean scan, emits `ResolvedStartupFile[]`. v1 M1 scaffolding
|
|
72
|
+
* shape: one entry per registry-relative file the starter declares
|
|
73
|
+
* (currently the registry entry YAML itself, treated as guidance_merge
|
|
74
|
+
* content; later milestones can extend the resolver to walk the
|
|
75
|
+
* priming-pack manifest's `read_full` paths once M2/M3 wiring is in
|
|
76
|
+
* place). All emitted files are tagged `appliesOn: ["fresh_start"]`
|
|
77
|
+
* because starter context seeds a fresh-launch conversation.
|
|
78
|
+
*/
|
|
79
|
+
resolveStarter(name) {
|
|
80
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(name)) {
|
|
81
|
+
throw new Error(`Agent Starter resolver: invalid name ${JSON.stringify(name)} (must be alphanumeric with optional "_" or "-")`);
|
|
82
|
+
}
|
|
83
|
+
const registryPath = join(this.registryRoot, `${name}.yaml`);
|
|
84
|
+
if (!this.exists(registryPath)) {
|
|
85
|
+
throw new Error(`Agent Starter resolver: no registry entry found at ${registryPath}`);
|
|
86
|
+
}
|
|
87
|
+
let content;
|
|
88
|
+
try {
|
|
89
|
+
content = this.readFile(registryPath);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
throw new Error(`Agent Starter resolver: failed to read ${registryPath}: ${err.message}`);
|
|
93
|
+
}
|
|
94
|
+
if (typeof content !== "string" || content.trim() === "") {
|
|
95
|
+
throw new Error(`Agent Starter resolver: ${registryPath} is empty or unreadable`);
|
|
96
|
+
}
|
|
97
|
+
// Smoke check that the file parses as YAML front-matter shape: it must
|
|
98
|
+
// contain `starter_id:` line. Keeps M1 dependency surface narrow (no
|
|
99
|
+
// yaml parser pulled in); M2 can swap in a real parser when it walks
|
|
100
|
+
// the priming-pack manifest.
|
|
101
|
+
if (!/^starter_id:\s*\S+/m.test(content)) {
|
|
102
|
+
throw new Error(`Agent Starter resolver: ${registryPath} does not match registry-entry shape (missing "starter_id:" field)`);
|
|
103
|
+
}
|
|
104
|
+
// Path-aware + content-aware credential scan. Mirrors the v0 wrapper
|
|
105
|
+
// helper at `specs/agent-starters/lib/agent-starter-helpers.sh`
|
|
106
|
+
// `scan_starter_file`. THROWS on match (per finding 2: refuse, do
|
|
107
|
+
// not return).
|
|
108
|
+
const scanResult = scanForCredentials(content, registryPath);
|
|
109
|
+
if (!scanResult.ok) {
|
|
110
|
+
throw new AgentStarterCredentialScanFailedError(name, scanResult.reason);
|
|
111
|
+
}
|
|
112
|
+
// M1 scaffolding shape: one ResolvedStartupFile pointing at the
|
|
113
|
+
// registry entry itself. The orchestrator's `deliverStartup` seam
|
|
114
|
+
// already accepts `deliveryHint: "guidance_merge"`. Later milestones
|
|
115
|
+
// (M2 instantiator integration; M3 Claude e2e; M4 Codex parity) can
|
|
116
|
+
// extend the resolver to walk the priming-pack manifest's `read_full`
|
|
117
|
+
// paths if the e2e proof requires richer per-layer artifacts. The
|
|
118
|
+
// type contract and refusal semantics are what M1 is locking in.
|
|
119
|
+
const files = [
|
|
120
|
+
{
|
|
121
|
+
path: basename(registryPath),
|
|
122
|
+
absolutePath: registryPath,
|
|
123
|
+
ownerRoot: this.registryRoot,
|
|
124
|
+
deliveryHint: "guidance_merge",
|
|
125
|
+
required: true,
|
|
126
|
+
appliesOn: ["fresh_start"],
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
return { files, registryPath };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// --- No-credentials scan (mirrors `lib/agent-starter-helpers.sh::scan_starter_file`) ---
|
|
133
|
+
const CRED_PATH_LITERALS = [
|
|
134
|
+
".claude/.credentials.json",
|
|
135
|
+
".codex/auth.json",
|
|
136
|
+
".aws/credentials",
|
|
137
|
+
".ssh/",
|
|
138
|
+
];
|
|
139
|
+
const CRED_PATH_RE = /(credentials|auth\.json|secrets|tokens?\.json)([^a-zA-Z0-9._-]|$)/;
|
|
140
|
+
const CRED_STRING_RE = /(api[_-]?key|secret[_-]?key|bearer[_-]?token|sk-[A-Za-z0-9]{20,}|gh[ps]_[A-Za-z0-9]{20,}|password[\s]*[:=])/i;
|
|
141
|
+
function scanForCredentials(content, filePath) {
|
|
142
|
+
// Allowlist exception: `transcript_path` field values under
|
|
143
|
+
// `~/.claude/projects/` or `~/.openrig/transcripts/` are accepted
|
|
144
|
+
// (mirrors the v0 wrapper); same paths under any other field/key/comment
|
|
145
|
+
// are rejected as suspicious copying.
|
|
146
|
+
const transcriptPath = extractFieldValue(content, "transcript_path");
|
|
147
|
+
let lineNo = 0;
|
|
148
|
+
for (const rawLine of content.split("\n")) {
|
|
149
|
+
lineNo += 1;
|
|
150
|
+
const line = rawLine;
|
|
151
|
+
// Allowlist check for transcript_path's own line.
|
|
152
|
+
const stripped = line.replace(/^\s+/, "");
|
|
153
|
+
let isAllowlistedTranscript = false;
|
|
154
|
+
if (transcriptPath && stripped.startsWith("transcript_path:")) {
|
|
155
|
+
if (transcriptPath.includes("/.claude/projects/")
|
|
156
|
+
|| transcriptPath.includes("/.openrig/transcripts/")) {
|
|
157
|
+
isAllowlistedTranscript = true;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// 1. Literal credential paths.
|
|
161
|
+
// Refusal reason intentionally REDACTS the matched line content. The
|
|
162
|
+
// daemon-tier resolver flows error messages into logs/API responses;
|
|
163
|
+
// echoing the matched line would leak the credential-bearing content
|
|
164
|
+
// the deny-list is meant to catch. Operators see refusal code + line
|
|
165
|
+
// number + file path; that's enough to triage. Closes the v0 wrapper
|
|
166
|
+
// diagnostic-`match`-field caveat at the daemon-tier productization
|
|
167
|
+
// layer (per M1 Revision 2 finding 3).
|
|
168
|
+
for (const literal of CRED_PATH_LITERALS) {
|
|
169
|
+
if (line.includes(literal)) {
|
|
170
|
+
return {
|
|
171
|
+
ok: false,
|
|
172
|
+
reason: `credential_path_disallowed: line ${lineNo} of ${filePath} matches a deny-list literal credential path (content redacted)`,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// 2. Path regex (credentials|auth.json|secrets|tokens.json).
|
|
177
|
+
if (!isAllowlistedTranscript && CRED_PATH_RE.test(line)) {
|
|
178
|
+
return {
|
|
179
|
+
ok: false,
|
|
180
|
+
reason: `credential_path_disallowed: line ${lineNo} of ${filePath} matches credential path pattern (content redacted)`,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
// 3. Credential string regex (case-insensitive).
|
|
184
|
+
if (CRED_STRING_RE.test(line)) {
|
|
185
|
+
return {
|
|
186
|
+
ok: false,
|
|
187
|
+
reason: `credential_content_disallowed: line ${lineNo} of ${filePath} matches credential content pattern (content redacted)`,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return { ok: true };
|
|
192
|
+
}
|
|
193
|
+
function extractFieldValue(content, field) {
|
|
194
|
+
const re = new RegExp(`^\\s*${field}:\\s*(.*?)\\s*$`, "m");
|
|
195
|
+
const match = content.match(re);
|
|
196
|
+
if (!match || !match[1])
|
|
197
|
+
return "";
|
|
198
|
+
return match[1].replace(/^['"]|['"]$/g, "").trim();
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=agent-starter-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-starter-resolver.js","sourceRoot":"","sources":["../../src/domain/agent-starter-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,MAAM,SAAS,CAAC;AA0DzB;;;;;GAKG;AACH,MAAM,OAAO,qCAAsC,SAAQ,KAAK;IACrD,WAAW,CAAS;IACpB,MAAM,CAAS;IACxB,YAAY,WAAmB,EAAE,MAAc;QAC7C,KAAK,CAAC,kBAAkB,WAAW,6BAA6B,MAAM,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,GAAG,uCAAuC,CAAC;QACpD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,MAAM,eAAe,GAAG,4BAA4B,CAAC;AACrD,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;AACvD,MAAM,0BAA0B,GAC9B,6EAA6E,CAAC;AAEhF,MAAM,OAAO,oBAAoB;IACd,YAAY,CAAS;IACrB,MAAM,CAAW;IACjB,QAAQ,CAAa;IAEtC,YAAY,OAAiC,EAAE;QAC7C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,YAAY,GAAG,oBAAoB,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;IAED,uCAAuC;IACvC,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,mBAAmB,CACxB,IAA8B,EAC9B,MAAgB;QAEhB,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,KAAK,EAAE,EAAE,CAAC;YACtE,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,eAAe,CAAC;QACtD,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;QAChC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YAClD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW;eAC5B,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,oBAAoB,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,IAAI,0BAA0B,CAAC;IAC9D,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,cAAc,CAAC,IAAY;QACzB,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,wCAAwC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,kDAAkD,CAC/G,CAAC;QACJ,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,sDAAsD,YAAY,EAAE,CACrE,CAAC;QACJ,CAAC;QACD,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,0CAA0C,YAAY,KAAM,GAAa,CAAC,OAAO,EAAE,CACpF,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CACb,2BAA2B,YAAY,yBAAyB,CACjE,CAAC;QACJ,CAAC;QACD,uEAAuE;QACvE,qEAAqE;QACrE,qEAAqE;QACrE,6BAA6B;QAC7B,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CACb,2BAA2B,YAAY,oEAAoE,CAC5G,CAAC;QACJ,CAAC;QAED,qEAAqE;QACrE,gEAAgE;QAChE,kEAAkE;QAClE,eAAe;QACf,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACnB,MAAM,IAAI,qCAAqC,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAC3E,CAAC;QAED,gEAAgE;QAChE,kEAAkE;QAClE,qEAAqE;QACrE,oEAAoE;QACpE,sEAAsE;QACtE,kEAAkE;QAClE,iEAAiE;QACjE,MAAM,KAAK,GAA0B;YACnC;gBACE,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC;gBAC5B,YAAY,EAAE,YAAY;gBAC1B,SAAS,EAAE,IAAI,CAAC,YAAY;gBAC5B,YAAY,EAAE,gBAAgB;gBAC9B,QAAQ,EAAE,IAAI;gBACd,SAAS,EAAE,CAAC,aAAa,CAAC;aAC3B;SACF,CAAC;QAEF,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IACjC,CAAC;CACF;AAED,0FAA0F;AAE1F,MAAM,kBAAkB,GAAG;IACzB,2BAA2B;IAC3B,kBAAkB;IAClB,kBAAkB;IAClB,OAAO;CACR,CAAC;AAEF,MAAM,YAAY,GAAG,mEAAmE,CAAC;AACzF,MAAM,cAAc,GAAG,8GAA8G,CAAC;AAEtI,SAAS,kBAAkB,CACzB,OAAe,EACf,QAAgB;IAEhB,4DAA4D;IAC5D,kEAAkE;IAClE,yEAAyE;IACzE,sCAAsC;IACtC,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAErE,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,CAAC,CAAC;QACZ,MAAM,IAAI,GAAG,OAAO,CAAC;QAErB,kDAAkD;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,uBAAuB,GAAG,KAAK,CAAC;QACpC,IAAI,cAAc,IAAI,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC9D,IACE,cAAc,CAAC,QAAQ,CAAC,oBAAoB,CAAC;mBAC1C,cAAc,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EACpD,CAAC;gBACD,uBAAuB,GAAG,IAAI,CAAC;YACjC,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,qEAAqE;QACrE,qEAAqE;QACrE,qEAAqE;QACrE,qEAAqE;QACrE,qEAAqE;QACrE,oEAAoE;QACpE,uCAAuC;QACvC,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;YACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,oCAAoC,MAAM,OAAO,QAAQ,iEAAiE;iBACnI,CAAC;YACJ,CAAC;QACH,CAAC;QAED,6DAA6D;QAC7D,IAAI,CAAC,uBAAuB,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,oCAAoC,MAAM,OAAO,QAAQ,qDAAqD;aACvH,CAAC;QACJ,CAAC;QAED,iDAAiD;QACjD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,uCAAuC,MAAM,OAAO,QAAQ,wDAAwD;aAC7H,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,KAAa;IACvD,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,QAAQ,KAAK,iBAAiB,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
import type { EventBus } from "./event-bus.js";
|
|
3
|
+
/**
|
|
4
|
+
* Classifier lease manager (PL-004 Phase B; L2 founder-resolved).
|
|
5
|
+
*
|
|
6
|
+
* Daemon-enforced single-writer lease for the project (classifier) primitive.
|
|
7
|
+
* Per PRD § L2 hard rule + slice IMPL § Guard Checkpoint Focus item 2:
|
|
8
|
+
*
|
|
9
|
+
* - Single-writer: at most one lease in `state='active'` at any time, enforced
|
|
10
|
+
* via partial UNIQUE index `idx_classifier_leases_active_singleton`.
|
|
11
|
+
* - TTL-based expiry: every lease has an `expires_at` (acquired_at + ttlMs).
|
|
12
|
+
* - Heartbeat: `last_heartbeat` is updated by the lease holder. Stale heartbeat
|
|
13
|
+
* past TTL signals deadness.
|
|
14
|
+
* - Deadness detection: caller of `evaluateDeadness` is the project verb path
|
|
15
|
+
* OR a watchdog. The manager itself does NOT auto-reclaim — only marks
|
|
16
|
+
* `expired` when heartbeat is stale.
|
|
17
|
+
* - Reclaim is OPERATOR-VERB ONLY: `rig project --reclaim-classifier
|
|
18
|
+
* [--if-dead]`. Daemon does NOT auto-reclaim. The reclaim path takes the
|
|
19
|
+
* active lease away from the previous holder and emits classifier.reclaimed.
|
|
20
|
+
*
|
|
21
|
+
* Pattern mirrors Phase A's hot-potato-enforcer.ts shape: pure validation +
|
|
22
|
+
* lifecycle methods, no Hono. Routes import this; this does not import routes.
|
|
23
|
+
*/
|
|
24
|
+
export declare const LEASE_STATES: readonly ["active", "expired", "reclaimed"];
|
|
25
|
+
export type LeaseState = (typeof LEASE_STATES)[number];
|
|
26
|
+
export interface ClassifierLease {
|
|
27
|
+
leaseId: string;
|
|
28
|
+
classifierSession: string;
|
|
29
|
+
acquiredAt: string;
|
|
30
|
+
expiresAt: string;
|
|
31
|
+
lastHeartbeat: string;
|
|
32
|
+
state: LeaseState;
|
|
33
|
+
reclaimedBySession: string | null;
|
|
34
|
+
reclaimReason: string | null;
|
|
35
|
+
}
|
|
36
|
+
export declare class ClassifierLeaseError extends Error {
|
|
37
|
+
readonly code: string;
|
|
38
|
+
readonly meta: Record<string, unknown> | undefined;
|
|
39
|
+
constructor(code: string, message: string, meta?: Record<string, unknown>);
|
|
40
|
+
}
|
|
41
|
+
export interface ClassifierLeaseManagerOptions {
|
|
42
|
+
ttlMs?: number;
|
|
43
|
+
/** For tests: inject a deterministic clock. Defaults to `() => new Date()`. */
|
|
44
|
+
now?: () => Date;
|
|
45
|
+
/**
|
|
46
|
+
* Liveness check (per PRD: via whoami-service / node-inventory). Returns
|
|
47
|
+
* true if the session is still alive. The lease-manager calls this when
|
|
48
|
+
* evaluating deadness; if the function returns false AND the lease's
|
|
49
|
+
* heartbeat is stale, the lease is marked expired.
|
|
50
|
+
*
|
|
51
|
+
* Defaults to `() => true` (no liveness check; tests can stub).
|
|
52
|
+
*/
|
|
53
|
+
isAlive?: (classifierSession: string) => boolean;
|
|
54
|
+
}
|
|
55
|
+
export declare class ClassifierLeaseManager {
|
|
56
|
+
readonly db: Database.Database;
|
|
57
|
+
private readonly eventBus;
|
|
58
|
+
private readonly ttlMs;
|
|
59
|
+
private readonly now;
|
|
60
|
+
private isAlive;
|
|
61
|
+
constructor(db: Database.Database, eventBus: EventBus, opts?: ClassifierLeaseManagerOptions);
|
|
62
|
+
/**
|
|
63
|
+
* Wire post-construction liveness check (used by startup.ts when
|
|
64
|
+
* whoami-service is constructed later in the dep graph).
|
|
65
|
+
*/
|
|
66
|
+
attachIsAlive(check: (classifierSession: string) => boolean): void;
|
|
67
|
+
/**
|
|
68
|
+
* Acquire the active lease for a classifier session. Fails with
|
|
69
|
+
* `lease_held` (409) if another session currently holds an active lease
|
|
70
|
+
* AND that session is alive. If the held lease is by a dead session, the
|
|
71
|
+
* caller should first invoke `evaluateDeadness` (which marks it expired)
|
|
72
|
+
* or use the operator reclaim path.
|
|
73
|
+
*
|
|
74
|
+
* Idempotent for the SAME classifier_session: re-calling acquire on the
|
|
75
|
+
* lease holder's behalf returns the existing lease unchanged (heartbeat
|
|
76
|
+
* is updated separately via `heartbeat`).
|
|
77
|
+
*/
|
|
78
|
+
acquire(classifierSession: string): ClassifierLease;
|
|
79
|
+
/**
|
|
80
|
+
* Heartbeat from the lease holder. Updates `last_heartbeat` and extends
|
|
81
|
+
* `expires_at` by the TTL (sliding-window TTL semantics).
|
|
82
|
+
*/
|
|
83
|
+
heartbeat(leaseId: string, classifierSession: string): ClassifierLease;
|
|
84
|
+
/**
|
|
85
|
+
* Evaluate deadness for the currently-active lease. If the lease's
|
|
86
|
+
* heartbeat is stale (now > expires_at) OR the holder is reported dead
|
|
87
|
+
* by `isAlive`, mark the lease expired and emit classifier.lease_expired
|
|
88
|
+
* + classifier.dead. Returns the (now-expired) lease, or null if no
|
|
89
|
+
* active lease exists or it remains alive.
|
|
90
|
+
*
|
|
91
|
+
* Called by: project verb path (before acquire, to clear dead leases),
|
|
92
|
+
* watchdog (periodic sweep), or operator-driven check.
|
|
93
|
+
*
|
|
94
|
+
* Per PRD: this method does NOT reclaim — it only marks expired. The
|
|
95
|
+
* next `acquire` call by ANY session can then succeed (since the partial
|
|
96
|
+
* UNIQUE on state='active' is now empty).
|
|
97
|
+
*/
|
|
98
|
+
evaluateDeadness(): ClassifierLease | null;
|
|
99
|
+
/**
|
|
100
|
+
* Operator-verb reclaim. Per PRD § L2 hard rule: ONLY this path may take
|
|
101
|
+
* an active lease away from its holder. Daemon does NOT auto-reclaim.
|
|
102
|
+
*
|
|
103
|
+
* - If `ifDead`: only succeed when isAlive(holder) returns false. If the
|
|
104
|
+
* holder is alive, refuse with `lease_still_active`.
|
|
105
|
+
* - If `!ifDead`: take the lease unconditionally.
|
|
106
|
+
*
|
|
107
|
+
* Marks the active lease state='reclaimed', records reclaimed_by_session
|
|
108
|
+
* + reclaim_reason, and emits classifier.reclaimed. The next acquire
|
|
109
|
+
* (by ANY session) can then succeed.
|
|
110
|
+
*/
|
|
111
|
+
reclaim(byClassifierSession: string, opts?: {
|
|
112
|
+
ifDead?: boolean;
|
|
113
|
+
reason?: string;
|
|
114
|
+
}): ClassifierLease;
|
|
115
|
+
/**
|
|
116
|
+
* Validation hook used by project-classifier: returns the active lease
|
|
117
|
+
* iff the supplied session holds it, else throws. Centralizes the
|
|
118
|
+
* "must hold the lease to project" check.
|
|
119
|
+
*/
|
|
120
|
+
requireActiveHolder(classifierSession: string): ClassifierLease;
|
|
121
|
+
getActiveLease(): ClassifierLease | null;
|
|
122
|
+
getById(leaseId: string): ClassifierLease | null;
|
|
123
|
+
list(opts?: {
|
|
124
|
+
classifierSession?: string;
|
|
125
|
+
limit?: number;
|
|
126
|
+
}): ClassifierLease[];
|
|
127
|
+
private getByIdOrThrow;
|
|
128
|
+
private rowToLease;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=classifier-lease-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier-lease-manager.d.ts","sourceRoot":"","sources":["../../src/domain/classifier-lease-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,eAAO,MAAM,YAAY,6CAA8C,CAAC;AACxE,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;IAClB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAaD,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;gBACvC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAK1E;AAWD,MAAM,WAAW,6BAA6B;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC;CAClD;AAED,qBAAa,sBAAsB;IACjC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,OAAO,CAAyC;gBAGtD,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,QAAQ,EAClB,IAAI,CAAC,EAAE,6BAA6B;IAStC;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI;IAIlE;;;;;;;;;;OAUG;IACH,OAAO,CAAC,iBAAiB,EAAE,MAAM,GAAG,eAAe;IA0CnD;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,eAAe;IAiCtE;;;;;;;;;;;;;OAaG;IACH,gBAAgB,IAAI,eAAe,GAAG,IAAI;IAuC1C;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,mBAAmB,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe;IA4CnG;;;;OAIG;IACH,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,GAAG,eAAe;IAwB/D,cAAc,IAAI,eAAe,GAAG,IAAI;IAOxC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAOhD,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe,EAAE;IAgB9E,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,UAAU;CAYnB"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { ulid } from "ulid";
|
|
2
|
+
/**
|
|
3
|
+
* Classifier lease manager (PL-004 Phase B; L2 founder-resolved).
|
|
4
|
+
*
|
|
5
|
+
* Daemon-enforced single-writer lease for the project (classifier) primitive.
|
|
6
|
+
* Per PRD § L2 hard rule + slice IMPL § Guard Checkpoint Focus item 2:
|
|
7
|
+
*
|
|
8
|
+
* - Single-writer: at most one lease in `state='active'` at any time, enforced
|
|
9
|
+
* via partial UNIQUE index `idx_classifier_leases_active_singleton`.
|
|
10
|
+
* - TTL-based expiry: every lease has an `expires_at` (acquired_at + ttlMs).
|
|
11
|
+
* - Heartbeat: `last_heartbeat` is updated by the lease holder. Stale heartbeat
|
|
12
|
+
* past TTL signals deadness.
|
|
13
|
+
* - Deadness detection: caller of `evaluateDeadness` is the project verb path
|
|
14
|
+
* OR a watchdog. The manager itself does NOT auto-reclaim — only marks
|
|
15
|
+
* `expired` when heartbeat is stale.
|
|
16
|
+
* - Reclaim is OPERATOR-VERB ONLY: `rig project --reclaim-classifier
|
|
17
|
+
* [--if-dead]`. Daemon does NOT auto-reclaim. The reclaim path takes the
|
|
18
|
+
* active lease away from the previous holder and emits classifier.reclaimed.
|
|
19
|
+
*
|
|
20
|
+
* Pattern mirrors Phase A's hot-potato-enforcer.ts shape: pure validation +
|
|
21
|
+
* lifecycle methods, no Hono. Routes import this; this does not import routes.
|
|
22
|
+
*/
|
|
23
|
+
export const LEASE_STATES = ["active", "expired", "reclaimed"];
|
|
24
|
+
export class ClassifierLeaseError extends Error {
|
|
25
|
+
code;
|
|
26
|
+
meta;
|
|
27
|
+
constructor(code, message, meta) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.code = code;
|
|
30
|
+
this.meta = meta;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Default lease TTL: 15 minutes. Per PRD: "TTL-based"; concrete value is
|
|
35
|
+
* implementation choice. 15 min is the operator-friendly midpoint between
|
|
36
|
+
* stale-detection latency (longer = slower deadness signal) and unnecessary
|
|
37
|
+
* heartbeat traffic (shorter = more wake-ups). Configurable via constructor
|
|
38
|
+
* option for tests + future tuning.
|
|
39
|
+
*/
|
|
40
|
+
const DEFAULT_LEASE_TTL_MS = 15 * 60 * 1000;
|
|
41
|
+
export class ClassifierLeaseManager {
|
|
42
|
+
db;
|
|
43
|
+
eventBus;
|
|
44
|
+
ttlMs;
|
|
45
|
+
now;
|
|
46
|
+
isAlive;
|
|
47
|
+
constructor(db, eventBus, opts) {
|
|
48
|
+
this.db = db;
|
|
49
|
+
this.eventBus = eventBus;
|
|
50
|
+
this.ttlMs = opts?.ttlMs ?? DEFAULT_LEASE_TTL_MS;
|
|
51
|
+
this.now = opts?.now ?? (() => new Date());
|
|
52
|
+
this.isAlive = opts?.isAlive ?? (() => true);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Wire post-construction liveness check (used by startup.ts when
|
|
56
|
+
* whoami-service is constructed later in the dep graph).
|
|
57
|
+
*/
|
|
58
|
+
attachIsAlive(check) {
|
|
59
|
+
this.isAlive = check;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Acquire the active lease for a classifier session. Fails with
|
|
63
|
+
* `lease_held` (409) if another session currently holds an active lease
|
|
64
|
+
* AND that session is alive. If the held lease is by a dead session, the
|
|
65
|
+
* caller should first invoke `evaluateDeadness` (which marks it expired)
|
|
66
|
+
* or use the operator reclaim path.
|
|
67
|
+
*
|
|
68
|
+
* Idempotent for the SAME classifier_session: re-calling acquire on the
|
|
69
|
+
* lease holder's behalf returns the existing lease unchanged (heartbeat
|
|
70
|
+
* is updated separately via `heartbeat`).
|
|
71
|
+
*/
|
|
72
|
+
acquire(classifierSession) {
|
|
73
|
+
const active = this.getActiveLease();
|
|
74
|
+
if (active) {
|
|
75
|
+
if (active.classifierSession === classifierSession) {
|
|
76
|
+
// Idempotent re-acquire by current holder.
|
|
77
|
+
return active;
|
|
78
|
+
}
|
|
79
|
+
throw new ClassifierLeaseError("lease_held", `classifier lease is held by ${active.classifierSession} until ${active.expiresAt}; reclaim via 'rig project --reclaim-classifier' if needed`, { holder: active.classifierSession, expiresAt: active.expiresAt });
|
|
80
|
+
}
|
|
81
|
+
const leaseId = ulid();
|
|
82
|
+
const acquiredAt = this.now().toISOString();
|
|
83
|
+
const expiresAt = new Date(this.now().getTime() + this.ttlMs).toISOString();
|
|
84
|
+
const txn = this.db.transaction(() => {
|
|
85
|
+
this.db
|
|
86
|
+
.prepare(`INSERT INTO classifier_leases (
|
|
87
|
+
lease_id, classifier_session, acquired_at, expires_at,
|
|
88
|
+
last_heartbeat, state
|
|
89
|
+
) VALUES (?, ?, ?, ?, ?, 'active')`)
|
|
90
|
+
.run(leaseId, classifierSession, acquiredAt, expiresAt, acquiredAt);
|
|
91
|
+
return this.eventBus.persistWithinTransaction({
|
|
92
|
+
type: "classifier.lease_acquired",
|
|
93
|
+
leaseId,
|
|
94
|
+
classifierSession,
|
|
95
|
+
acquiredAt,
|
|
96
|
+
expiresAt,
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
const persisted = txn();
|
|
100
|
+
this.eventBus.notifySubscribers(persisted);
|
|
101
|
+
return this.getByIdOrThrow(leaseId);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Heartbeat from the lease holder. Updates `last_heartbeat` and extends
|
|
105
|
+
* `expires_at` by the TTL (sliding-window TTL semantics).
|
|
106
|
+
*/
|
|
107
|
+
heartbeat(leaseId, classifierSession) {
|
|
108
|
+
const lease = this.getById(leaseId);
|
|
109
|
+
if (!lease) {
|
|
110
|
+
throw new ClassifierLeaseError("lease_not_found", `lease ${leaseId} not found`);
|
|
111
|
+
}
|
|
112
|
+
if (lease.classifierSession !== classifierSession) {
|
|
113
|
+
throw new ClassifierLeaseError("lease_session_mismatch", `lease ${leaseId} is held by ${lease.classifierSession}, not ${classifierSession}`);
|
|
114
|
+
}
|
|
115
|
+
if (lease.state !== "active") {
|
|
116
|
+
throw new ClassifierLeaseError("lease_not_active", `lease ${leaseId} is in state ${lease.state}; cannot heartbeat`);
|
|
117
|
+
}
|
|
118
|
+
const now = this.now();
|
|
119
|
+
const lastHeartbeat = now.toISOString();
|
|
120
|
+
const expiresAt = new Date(now.getTime() + this.ttlMs).toISOString();
|
|
121
|
+
this.db
|
|
122
|
+
.prepare(`UPDATE classifier_leases
|
|
123
|
+
SET last_heartbeat = ?, expires_at = ?
|
|
124
|
+
WHERE lease_id = ?`)
|
|
125
|
+
.run(lastHeartbeat, expiresAt, leaseId);
|
|
126
|
+
return this.getByIdOrThrow(leaseId);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Evaluate deadness for the currently-active lease. If the lease's
|
|
130
|
+
* heartbeat is stale (now > expires_at) OR the holder is reported dead
|
|
131
|
+
* by `isAlive`, mark the lease expired and emit classifier.lease_expired
|
|
132
|
+
* + classifier.dead. Returns the (now-expired) lease, or null if no
|
|
133
|
+
* active lease exists or it remains alive.
|
|
134
|
+
*
|
|
135
|
+
* Called by: project verb path (before acquire, to clear dead leases),
|
|
136
|
+
* watchdog (periodic sweep), or operator-driven check.
|
|
137
|
+
*
|
|
138
|
+
* Per PRD: this method does NOT reclaim — it only marks expired. The
|
|
139
|
+
* next `acquire` call by ANY session can then succeed (since the partial
|
|
140
|
+
* UNIQUE on state='active' is now empty).
|
|
141
|
+
*/
|
|
142
|
+
evaluateDeadness() {
|
|
143
|
+
const active = this.getActiveLease();
|
|
144
|
+
if (!active)
|
|
145
|
+
return null;
|
|
146
|
+
const nowIso = this.now().toISOString();
|
|
147
|
+
const ttlPassed = nowIso > active.expiresAt;
|
|
148
|
+
const sessionDead = !this.isAlive(active.classifierSession);
|
|
149
|
+
if (!ttlPassed && !sessionDead)
|
|
150
|
+
return null;
|
|
151
|
+
const events = [];
|
|
152
|
+
const txn = this.db.transaction(() => {
|
|
153
|
+
this.db
|
|
154
|
+
.prepare(`UPDATE classifier_leases SET state = 'expired' WHERE lease_id = ? AND state = 'active'`)
|
|
155
|
+
.run(active.leaseId);
|
|
156
|
+
events.push(this.eventBus.persistWithinTransaction({
|
|
157
|
+
type: "classifier.lease_expired",
|
|
158
|
+
leaseId: active.leaseId,
|
|
159
|
+
classifierSession: active.classifierSession,
|
|
160
|
+
expiredAt: nowIso,
|
|
161
|
+
}));
|
|
162
|
+
if (sessionDead) {
|
|
163
|
+
events.push(this.eventBus.persistWithinTransaction({
|
|
164
|
+
type: "classifier.dead",
|
|
165
|
+
leaseId: active.leaseId,
|
|
166
|
+
classifierSession: active.classifierSession,
|
|
167
|
+
lastHeartbeat: active.lastHeartbeat,
|
|
168
|
+
detectedAt: nowIso,
|
|
169
|
+
}));
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
txn();
|
|
173
|
+
for (const e of events)
|
|
174
|
+
this.eventBus.notifySubscribers(e);
|
|
175
|
+
return this.getByIdOrThrow(active.leaseId);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Operator-verb reclaim. Per PRD § L2 hard rule: ONLY this path may take
|
|
179
|
+
* an active lease away from its holder. Daemon does NOT auto-reclaim.
|
|
180
|
+
*
|
|
181
|
+
* - If `ifDead`: only succeed when isAlive(holder) returns false. If the
|
|
182
|
+
* holder is alive, refuse with `lease_still_active`.
|
|
183
|
+
* - If `!ifDead`: take the lease unconditionally.
|
|
184
|
+
*
|
|
185
|
+
* Marks the active lease state='reclaimed', records reclaimed_by_session
|
|
186
|
+
* + reclaim_reason, and emits classifier.reclaimed. The next acquire
|
|
187
|
+
* (by ANY session) can then succeed.
|
|
188
|
+
*/
|
|
189
|
+
reclaim(byClassifierSession, opts) {
|
|
190
|
+
const active = this.getActiveLease();
|
|
191
|
+
if (!active) {
|
|
192
|
+
throw new ClassifierLeaseError("no_active_lease", "no active classifier lease to reclaim");
|
|
193
|
+
}
|
|
194
|
+
if (opts?.ifDead === true && this.isAlive(active.classifierSession)) {
|
|
195
|
+
throw new ClassifierLeaseError("lease_still_active", `classifier lease holder ${active.classifierSession} is still alive; --if-dead refuses to reclaim`, { holder: active.classifierSession });
|
|
196
|
+
}
|
|
197
|
+
const reason = opts?.reason ?? (opts?.ifDead ? "operator-reclaim --if-dead" : "operator-reclaim");
|
|
198
|
+
const reclaimedAt = this.now().toISOString();
|
|
199
|
+
const txn = this.db.transaction(() => {
|
|
200
|
+
this.db
|
|
201
|
+
.prepare(`UPDATE classifier_leases
|
|
202
|
+
SET state = 'reclaimed',
|
|
203
|
+
reclaimed_by_session = ?,
|
|
204
|
+
reclaim_reason = ?
|
|
205
|
+
WHERE lease_id = ? AND state = 'active'`)
|
|
206
|
+
.run(byClassifierSession, reason, active.leaseId);
|
|
207
|
+
return this.eventBus.persistWithinTransaction({
|
|
208
|
+
type: "classifier.reclaimed",
|
|
209
|
+
leaseId: active.leaseId,
|
|
210
|
+
previousClassifierSession: active.classifierSession,
|
|
211
|
+
reclaimedBySession: byClassifierSession,
|
|
212
|
+
reason,
|
|
213
|
+
reclaimedAt,
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
const persisted = txn();
|
|
217
|
+
this.eventBus.notifySubscribers(persisted);
|
|
218
|
+
return this.getByIdOrThrow(active.leaseId);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Validation hook used by project-classifier: returns the active lease
|
|
222
|
+
* iff the supplied session holds it, else throws. Centralizes the
|
|
223
|
+
* "must hold the lease to project" check.
|
|
224
|
+
*/
|
|
225
|
+
requireActiveHolder(classifierSession) {
|
|
226
|
+
const active = this.getActiveLease();
|
|
227
|
+
if (!active) {
|
|
228
|
+
throw new ClassifierLeaseError("no_active_lease", "no active classifier lease; call acquire first");
|
|
229
|
+
}
|
|
230
|
+
if (active.classifierSession !== classifierSession) {
|
|
231
|
+
throw new ClassifierLeaseError("lease_held", `classifier lease is held by ${active.classifierSession}, not ${classifierSession}`, { holder: active.classifierSession });
|
|
232
|
+
}
|
|
233
|
+
if (active.expiresAt < this.now().toISOString()) {
|
|
234
|
+
throw new ClassifierLeaseError("lease_expired", `classifier lease for ${classifierSession} expired at ${active.expiresAt}`);
|
|
235
|
+
}
|
|
236
|
+
return active;
|
|
237
|
+
}
|
|
238
|
+
getActiveLease() {
|
|
239
|
+
const row = this.db
|
|
240
|
+
.prepare(`SELECT * FROM classifier_leases WHERE state = 'active' LIMIT 1`)
|
|
241
|
+
.get();
|
|
242
|
+
return row ? this.rowToLease(row) : null;
|
|
243
|
+
}
|
|
244
|
+
getById(leaseId) {
|
|
245
|
+
const row = this.db
|
|
246
|
+
.prepare(`SELECT * FROM classifier_leases WHERE lease_id = ?`)
|
|
247
|
+
.get(leaseId);
|
|
248
|
+
return row ? this.rowToLease(row) : null;
|
|
249
|
+
}
|
|
250
|
+
list(opts) {
|
|
251
|
+
const limit = opts?.limit ?? 100;
|
|
252
|
+
const conditions = [];
|
|
253
|
+
const params = [];
|
|
254
|
+
if (opts?.classifierSession) {
|
|
255
|
+
conditions.push("classifier_session = ?");
|
|
256
|
+
params.push(opts.classifierSession);
|
|
257
|
+
}
|
|
258
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
259
|
+
params.push(limit);
|
|
260
|
+
const rows = this.db
|
|
261
|
+
.prepare(`SELECT * FROM classifier_leases ${where} ORDER BY acquired_at DESC LIMIT ?`)
|
|
262
|
+
.all(...params);
|
|
263
|
+
return rows.map((r) => this.rowToLease(r));
|
|
264
|
+
}
|
|
265
|
+
getByIdOrThrow(leaseId) {
|
|
266
|
+
const lease = this.getById(leaseId);
|
|
267
|
+
if (!lease) {
|
|
268
|
+
throw new ClassifierLeaseError("lease_not_found", `lease ${leaseId} not found after write`);
|
|
269
|
+
}
|
|
270
|
+
return lease;
|
|
271
|
+
}
|
|
272
|
+
rowToLease(row) {
|
|
273
|
+
return {
|
|
274
|
+
leaseId: row.lease_id,
|
|
275
|
+
classifierSession: row.classifier_session,
|
|
276
|
+
acquiredAt: row.acquired_at,
|
|
277
|
+
expiresAt: row.expires_at,
|
|
278
|
+
lastHeartbeat: row.last_heartbeat,
|
|
279
|
+
state: row.state,
|
|
280
|
+
reclaimedBySession: row.reclaimed_by_session,
|
|
281
|
+
reclaimReason: row.reclaim_reason,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=classifier-lease-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier-lease-manager.js","sourceRoot":"","sources":["../../src/domain/classifier-lease-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type Database from "better-sqlite3";
|
|
2
2
|
import type { ContextUsage, ContextUnknownReason } from "./types.js";
|
|
3
3
|
/** Freshness threshold: samples older than this are considered stale for compact displays. */
|
|
4
|
-
export declare const FRESHNESS_THRESHOLD_MS =
|
|
4
|
+
export declare const FRESHNESS_THRESHOLD_MS = 600000;
|
|
5
5
|
export interface ContextUsageStoreOpts {
|
|
6
6
|
stateDir: string;
|
|
7
7
|
}
|