@openrig/cli 0.1.11 → 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 +192 -60
- 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 +15 -2
- 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 +11 -6
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +322 -34
- 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/codex-thread-id.d.ts.map +1 -1
- package/daemon/dist/domain/codex-thread-id.js +44 -15
- package/daemon/dist/domain/codex-thread-id.js.map +1 -1
- package/daemon/dist/domain/context-monitor.d.ts +12 -7
- package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
- package/daemon/dist/domain/context-monitor.js +51 -3
- package/daemon/dist/domain/context-monitor.js.map +1 -1
- 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 +89 -4
- 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 +208 -31
- 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 +50 -2
- package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +476 -24
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
- package/daemon/dist/domain/resume-metadata-refresher.js +27 -7
- package/daemon/dist/domain/resume-metadata-refresher.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 +63 -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 +30 -1
- package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/domain/runtime-adapter.js +14 -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 +27 -3
- package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.js +125 -40
- 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 +76 -1
- package/daemon/dist/domain/transcript-store.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +323 -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 +41 -5
- package/daemon/dist/routes/sessions.js.map +1 -1
- package/daemon/dist/routes/snapshots.js +66 -17
- 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/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/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +19 -8
- package/dist/commands/doctor.js.map +1 -1
- 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/import.d.ts.map +1 -1
- package/dist/commands/import.js +2 -1
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/preflight.js +1 -1
- package/dist/commands/preflight.js.map +1 -1
- 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 +69 -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.d.ts.map +1 -1
- package/dist/commands/setup.js +20 -8
- 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 +1 -0
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +65 -4
- 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/dist/system-preflight.d.ts.map +1 -1
- package/dist/system-preflight.js +16 -5
- package/dist/system-preflight.js.map +1 -1
- package/dist/tmux-health.d.ts +16 -0
- package/dist/tmux-health.d.ts.map +1 -0
- package/dist/tmux-health.js +105 -0
- package/dist/tmux-health.js.map +1 -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-lEO-zBxz.js → index-GNYaWmBj.js} +9 -9
- package/ui/dist/index.html +2 -2
|
@@ -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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-thread-id.d.ts","sourceRoot":"","sources":["../../src/domain/codex-thread-id.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"codex-thread-id.d.ts","sourceRoot":"","sources":["../../src/domain/codex-thread-id.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAEtE,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAW1E;AAED,wBAAgB,mCAAmC,CACjD,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,EACzC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GACjC,MAAM,GAAG,SAAS,CAMpB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import os from "node:os";
|
|
2
2
|
import nodePath from "node:path";
|
|
3
|
+
import fs from "node:fs";
|
|
3
4
|
import { execFileSync } from "node:child_process";
|
|
4
5
|
import Database from "better-sqlite3";
|
|
5
6
|
export function defaultResolveHomeDirByPid(pid) {
|
|
@@ -40,26 +41,54 @@ function safeUserHomeDir() {
|
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
43
|
function readCodexThreadIdFromLogs(pid, homeDir, exists) {
|
|
43
|
-
const dbPath
|
|
44
|
-
if (exists && !exists(dbPath))
|
|
45
|
-
return undefined;
|
|
46
|
-
try {
|
|
47
|
-
const db = new Database(dbPath, { readonly: true });
|
|
44
|
+
for (const dbPath of resolveCodexLogDbPaths(homeDir, exists)) {
|
|
48
45
|
try {
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
46
|
+
const db = new Database(dbPath, { readonly: true });
|
|
47
|
+
try {
|
|
48
|
+
const row = db.prepare(`SELECT thread_id
|
|
49
|
+
FROM logs
|
|
50
|
+
WHERE process_uuid LIKE ?
|
|
51
|
+
AND thread_id IS NOT NULL
|
|
52
|
+
ORDER BY ts DESC, ts_nanos DESC, id DESC
|
|
53
|
+
LIMIT 1`).get(`pid:${pid}:%`);
|
|
54
|
+
if (row?.thread_id) {
|
|
55
|
+
return row.thread_id;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
db.close();
|
|
60
|
+
}
|
|
56
61
|
}
|
|
57
|
-
|
|
58
|
-
|
|
62
|
+
catch {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
function resolveCodexLogDbPaths(homeDir, exists) {
|
|
69
|
+
const codexDir = nodePath.join(homeDir, ".codex");
|
|
70
|
+
const discovered = [];
|
|
71
|
+
try {
|
|
72
|
+
for (const entry of fs.readdirSync(codexDir)) {
|
|
73
|
+
const match = entry.match(/^logs_(\d+)\.sqlite$/);
|
|
74
|
+
if (!match)
|
|
75
|
+
continue;
|
|
76
|
+
discovered.push({
|
|
77
|
+
version: Number(match[1]),
|
|
78
|
+
path: nodePath.join(codexDir, entry),
|
|
79
|
+
});
|
|
59
80
|
}
|
|
60
81
|
}
|
|
61
82
|
catch {
|
|
62
|
-
|
|
83
|
+
// Best effort only; fall back to the historical filename below.
|
|
84
|
+
}
|
|
85
|
+
if (discovered.length === 0) {
|
|
86
|
+
discovered.push({ version: 1, path: nodePath.join(codexDir, "logs_1.sqlite") });
|
|
63
87
|
}
|
|
88
|
+
return discovered
|
|
89
|
+
.sort((a, b) => b.version - a.version)
|
|
90
|
+
.map((entry) => entry.path)
|
|
91
|
+
.filter((path, index, paths) => paths.indexOf(path) === index)
|
|
92
|
+
.filter((path) => !exists || exists(path));
|
|
64
93
|
}
|
|
65
94
|
//# sourceMappingURL=codex-thread-id.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-thread-id.js","sourceRoot":"","sources":["../../src/domain/codex-thread-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,MAAM,UAAU,0BAA0B,CAAC,GAAW;IACpD,IAAI,CAAC;QACH,wEAAwE;QACxE,gFAAgF;QAChF,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9G,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACpD,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,GAAW,EACX,cAAyC,EACzC,MAAkC;IAElC,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,cAAyC;IAC5D,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAChC,GAAW,EACX,OAAe,EACf,MAAkC;IAElC,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"codex-thread-id.js","sourceRoot":"","sources":["../../src/domain/codex-thread-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import type Database from "better-sqlite3";
|
|
2
2
|
import type { ContextUsageStore } from "./context-usage-store.js";
|
|
3
|
+
import { type NodeBinding, type ReadinessResult } from "./runtime-adapter.js";
|
|
3
4
|
/** Default polling interval: 30 seconds. */
|
|
4
5
|
export declare const DEFAULT_POLL_INTERVAL_MS = 30000;
|
|
6
|
+
interface ClaudeContextProvisioner {
|
|
7
|
+
ensureContextCollector(binding: {
|
|
8
|
+
cwd?: string | null;
|
|
9
|
+
tmuxSession?: string | null;
|
|
10
|
+
}): void;
|
|
11
|
+
checkReady?(binding: NodeBinding): Promise<ReadinessResult>;
|
|
12
|
+
}
|
|
5
13
|
/**
|
|
6
14
|
* Polls known managed Claude sidecar files and persists the latest
|
|
7
15
|
* normalized context telemetry. Scheduler-only: no queries, no response
|
|
@@ -12,19 +20,16 @@ export declare class ContextMonitor {
|
|
|
12
20
|
private store;
|
|
13
21
|
private claudeContextProvisioner;
|
|
14
22
|
private timer;
|
|
15
|
-
constructor(db: Database.Database, store: ContextUsageStore, claudeContextProvisioner?:
|
|
16
|
-
ensureContextCollector(binding: {
|
|
17
|
-
cwd?: string | null;
|
|
18
|
-
tmuxSession?: string | null;
|
|
19
|
-
}): void;
|
|
20
|
-
});
|
|
23
|
+
constructor(db: Database.Database, store: ContextUsageStore, claudeContextProvisioner?: ClaudeContextProvisioner);
|
|
21
24
|
/** Discover active managed Claude sessions and poll their sidecar files. */
|
|
22
|
-
pollOnce(): void
|
|
25
|
+
pollOnce(): Promise<void>;
|
|
23
26
|
/** Start polling at the given interval. Idempotent. */
|
|
24
27
|
start(intervalMs?: number): void;
|
|
25
28
|
/** Stop polling. Safe to call before start or multiple times. */
|
|
26
29
|
stop(): void;
|
|
27
30
|
/** Query for managed Claude sessions that are currently running. */
|
|
28
31
|
private getEligibleSessions;
|
|
32
|
+
private normalizeStartupStatus;
|
|
29
33
|
}
|
|
34
|
+
export {};
|
|
30
35
|
//# sourceMappingURL=context-monitor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-monitor.d.ts","sourceRoot":"","sources":["../../src/domain/context-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"context-monitor.d.ts","sourceRoot":"","sources":["../../src/domain/context-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AAE9B,4CAA4C;AAC5C,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAU/C,UAAU,wBAAwB;IAChC,sBAAsB,CAAC,OAAO,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5F,UAAU,CAAC,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC7D;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,wBAAwB,CAAkC;IAClE,OAAO,CAAC,KAAK,CAA+C;gBAG1D,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,iBAAiB,EACxB,wBAAwB,CAAC,EAAE,wBAAwB;IAOrD,4EAA4E;IACtE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB/B,uDAAuD;IACvD,KAAK,CAAC,UAAU,GAAE,MAAiC,GAAG,IAAI;IAW1D,iEAAiE;IACjE,IAAI,IAAI,IAAI;IAOZ,oEAAoE;IACpE,OAAO,CAAC,mBAAmB;YAmBb,sBAAsB;CAsCrC"}
|