@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.
Files changed (543) hide show
  1. package/daemon/assets/openrig-activity-hook-relay.cjs +104 -0
  2. package/daemon/dist/adapters/claude-code-adapter.d.ts +14 -6
  3. package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  4. package/daemon/dist/adapters/claude-code-adapter.js +192 -60
  5. package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  6. package/daemon/dist/adapters/claude-resume.d.ts +5 -0
  7. package/daemon/dist/adapters/claude-resume.d.ts.map +1 -1
  8. package/daemon/dist/adapters/claude-resume.js +15 -2
  9. package/daemon/dist/adapters/claude-resume.js.map +1 -1
  10. package/daemon/dist/adapters/codex-resume.d.ts +8 -1
  11. package/daemon/dist/adapters/codex-resume.d.ts.map +1 -1
  12. package/daemon/dist/adapters/codex-resume.js +74 -5
  13. package/daemon/dist/adapters/codex-resume.js.map +1 -1
  14. package/daemon/dist/adapters/codex-runtime-adapter.d.ts +11 -6
  15. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  16. package/daemon/dist/adapters/codex-runtime-adapter.js +322 -34
  17. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  18. package/daemon/dist/adapters/terminal-adapter.d.ts +2 -1
  19. package/daemon/dist/adapters/terminal-adapter.d.ts.map +1 -1
  20. package/daemon/dist/adapters/terminal-adapter.js +7 -1
  21. package/daemon/dist/adapters/terminal-adapter.js.map +1 -1
  22. package/daemon/dist/adapters/tmux.d.ts.map +1 -1
  23. package/daemon/dist/adapters/tmux.js +53 -5
  24. package/daemon/dist/adapters/tmux.js.map +1 -1
  25. package/daemon/dist/db/migrations/021_seat_handover_observability.d.ts +3 -0
  26. package/daemon/dist/db/migrations/021_seat_handover_observability.d.ts.map +1 -0
  27. package/daemon/dist/db/migrations/021_seat_handover_observability.js +11 -0
  28. package/daemon/dist/db/migrations/021_seat_handover_observability.js.map +1 -0
  29. package/daemon/dist/db/migrations/022_node_codex_config_profile.d.ts +3 -0
  30. package/daemon/dist/db/migrations/022_node_codex_config_profile.d.ts.map +1 -0
  31. package/daemon/dist/db/migrations/022_node_codex_config_profile.js +7 -0
  32. package/daemon/dist/db/migrations/022_node_codex_config_profile.js.map +1 -0
  33. package/daemon/dist/db/migrations/023_stream_items.d.ts +16 -0
  34. package/daemon/dist/db/migrations/023_stream_items.d.ts.map +1 -0
  35. package/daemon/dist/db/migrations/023_stream_items.js +37 -0
  36. package/daemon/dist/db/migrations/023_stream_items.js.map +1 -0
  37. package/daemon/dist/db/migrations/024_queue_items.d.ts +19 -0
  38. package/daemon/dist/db/migrations/024_queue_items.d.ts.map +1 -0
  39. package/daemon/dist/db/migrations/024_queue_items.js +52 -0
  40. package/daemon/dist/db/migrations/024_queue_items.js.map +1 -0
  41. package/daemon/dist/db/migrations/025_queue_transitions.d.ts +13 -0
  42. package/daemon/dist/db/migrations/025_queue_transitions.d.ts.map +1 -0
  43. package/daemon/dist/db/migrations/025_queue_transitions.js +28 -0
  44. package/daemon/dist/db/migrations/025_queue_transitions.js.map +1 -0
  45. package/daemon/dist/db/migrations/026_inbox_entries.d.ts +14 -0
  46. package/daemon/dist/db/migrations/026_inbox_entries.d.ts.map +1 -0
  47. package/daemon/dist/db/migrations/026_inbox_entries.js +35 -0
  48. package/daemon/dist/db/migrations/026_inbox_entries.js.map +1 -0
  49. package/daemon/dist/db/migrations/027_outbox_entries.d.ts +12 -0
  50. package/daemon/dist/db/migrations/027_outbox_entries.d.ts.map +1 -0
  51. package/daemon/dist/db/migrations/027_outbox_entries.js +30 -0
  52. package/daemon/dist/db/migrations/027_outbox_entries.js.map +1 -0
  53. package/daemon/dist/db/migrations/028_project_classifications.d.ts +26 -0
  54. package/daemon/dist/db/migrations/028_project_classifications.d.ts.map +1 -0
  55. package/daemon/dist/db/migrations/028_project_classifications.js +44 -0
  56. package/daemon/dist/db/migrations/028_project_classifications.js.map +1 -0
  57. package/daemon/dist/db/migrations/029_classifier_leases.d.ts +22 -0
  58. package/daemon/dist/db/migrations/029_classifier_leases.d.ts.map +1 -0
  59. package/daemon/dist/db/migrations/029_classifier_leases.js +41 -0
  60. package/daemon/dist/db/migrations/029_classifier_leases.js.map +1 -0
  61. package/daemon/dist/db/migrations/030_views_custom.d.ts +15 -0
  62. package/daemon/dist/db/migrations/030_views_custom.d.ts.map +1 -0
  63. package/daemon/dist/db/migrations/030_views_custom.js +27 -0
  64. package/daemon/dist/db/migrations/030_views_custom.js.map +1 -0
  65. package/daemon/dist/db/migrations/031_watchdog_jobs.d.ts +34 -0
  66. package/daemon/dist/db/migrations/031_watchdog_jobs.d.ts.map +1 -0
  67. package/daemon/dist/db/migrations/031_watchdog_jobs.js +59 -0
  68. package/daemon/dist/db/migrations/031_watchdog_jobs.js.map +1 -0
  69. package/daemon/dist/db/migrations/032_watchdog_history.d.ts +28 -0
  70. package/daemon/dist/db/migrations/032_watchdog_history.d.ts.map +1 -0
  71. package/daemon/dist/db/migrations/032_watchdog_history.js +46 -0
  72. package/daemon/dist/db/migrations/032_watchdog_history.js.map +1 -0
  73. package/daemon/dist/db/migrations/033_workflow_specs.d.ts +30 -0
  74. package/daemon/dist/db/migrations/033_workflow_specs.d.ts.map +1 -0
  75. package/daemon/dist/db/migrations/033_workflow_specs.js +50 -0
  76. package/daemon/dist/db/migrations/033_workflow_specs.js.map +1 -0
  77. package/daemon/dist/db/migrations/034_workflow_instances.d.ts +42 -0
  78. package/daemon/dist/db/migrations/034_workflow_instances.d.ts.map +1 -0
  79. package/daemon/dist/db/migrations/034_workflow_instances.js +63 -0
  80. package/daemon/dist/db/migrations/034_workflow_instances.js.map +1 -0
  81. package/daemon/dist/db/migrations/035_workflow_step_trails.d.ts +29 -0
  82. package/daemon/dist/db/migrations/035_workflow_step_trails.d.ts.map +1 -0
  83. package/daemon/dist/db/migrations/035_workflow_step_trails.js +48 -0
  84. package/daemon/dist/db/migrations/035_workflow_step_trails.js.map +1 -0
  85. package/daemon/dist/db/migrations/036_watchdog_policy_enum_extension.d.ts +35 -0
  86. package/daemon/dist/db/migrations/036_watchdog_policy_enum_extension.d.ts.map +1 -0
  87. package/daemon/dist/db/migrations/036_watchdog_policy_enum_extension.js +43 -0
  88. package/daemon/dist/db/migrations/036_watchdog_policy_enum_extension.js.map +1 -0
  89. package/daemon/dist/domain/agent-activity-store.d.ts +42 -0
  90. package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -0
  91. package/daemon/dist/domain/agent-activity-store.js +177 -0
  92. package/daemon/dist/domain/agent-activity-store.js.map +1 -0
  93. package/daemon/dist/domain/agent-manifest.d.ts.map +1 -1
  94. package/daemon/dist/domain/agent-manifest.js +3 -0
  95. package/daemon/dist/domain/agent-manifest.js.map +1 -1
  96. package/daemon/dist/domain/agent-starter-resolver.d.ts +100 -0
  97. package/daemon/dist/domain/agent-starter-resolver.d.ts.map +1 -0
  98. package/daemon/dist/domain/agent-starter-resolver.js +200 -0
  99. package/daemon/dist/domain/agent-starter-resolver.js.map +1 -0
  100. package/daemon/dist/domain/classifier-lease-manager.d.ts +130 -0
  101. package/daemon/dist/domain/classifier-lease-manager.d.ts.map +1 -0
  102. package/daemon/dist/domain/classifier-lease-manager.js +285 -0
  103. package/daemon/dist/domain/classifier-lease-manager.js.map +1 -0
  104. package/daemon/dist/domain/codex-thread-id.d.ts.map +1 -1
  105. package/daemon/dist/domain/codex-thread-id.js +44 -15
  106. package/daemon/dist/domain/codex-thread-id.js.map +1 -1
  107. package/daemon/dist/domain/context-monitor.d.ts +12 -7
  108. package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
  109. package/daemon/dist/domain/context-monitor.js +51 -3
  110. package/daemon/dist/domain/context-monitor.js.map +1 -1
  111. package/daemon/dist/domain/context-usage-store.d.ts +1 -1
  112. package/daemon/dist/domain/context-usage-store.js +1 -1
  113. package/daemon/dist/domain/context-usage-store.js.map +1 -1
  114. package/daemon/dist/domain/hot-potato-enforcer.d.ts +45 -0
  115. package/daemon/dist/domain/hot-potato-enforcer.d.ts.map +1 -0
  116. package/daemon/dist/domain/hot-potato-enforcer.js +94 -0
  117. package/daemon/dist/domain/hot-potato-enforcer.js.map +1 -0
  118. package/daemon/dist/domain/inbox-handler.d.ts +68 -0
  119. package/daemon/dist/domain/inbox-handler.d.ts.map +1 -0
  120. package/daemon/dist/domain/inbox-handler.js +177 -0
  121. package/daemon/dist/domain/inbox-handler.js.map +1 -0
  122. package/daemon/dist/domain/native-resume-probe.d.ts +1 -1
  123. package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
  124. package/daemon/dist/domain/native-resume-probe.js +89 -4
  125. package/daemon/dist/domain/native-resume-probe.js.map +1 -1
  126. package/daemon/dist/domain/node-inventory.d.ts +29 -1
  127. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  128. package/daemon/dist/domain/node-inventory.js +208 -31
  129. package/daemon/dist/domain/node-inventory.js.map +1 -1
  130. package/daemon/dist/domain/node-launcher.d.ts +2 -0
  131. package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
  132. package/daemon/dist/domain/node-launcher.js +14 -2
  133. package/daemon/dist/domain/node-launcher.js.map +1 -1
  134. package/daemon/dist/domain/outbox-handler.d.ts +48 -0
  135. package/daemon/dist/domain/outbox-handler.d.ts.map +1 -0
  136. package/daemon/dist/domain/outbox-handler.js +106 -0
  137. package/daemon/dist/domain/outbox-handler.js.map +1 -0
  138. package/daemon/dist/domain/policies/artifact-pool-helpers.d.ts +64 -0
  139. package/daemon/dist/domain/policies/artifact-pool-helpers.d.ts.map +1 -0
  140. package/daemon/dist/domain/policies/artifact-pool-helpers.js +226 -0
  141. package/daemon/dist/domain/policies/artifact-pool-helpers.js.map +1 -0
  142. package/daemon/dist/domain/policies/artifact-pool-ready.d.ts +3 -0
  143. package/daemon/dist/domain/policies/artifact-pool-ready.d.ts.map +1 -0
  144. package/daemon/dist/domain/policies/artifact-pool-ready.js +41 -0
  145. package/daemon/dist/domain/policies/artifact-pool-ready.js.map +1 -0
  146. package/daemon/dist/domain/policies/edge-artifact-required.d.ts +3 -0
  147. package/daemon/dist/domain/policies/edge-artifact-required.d.ts.map +1 -0
  148. package/daemon/dist/domain/policies/edge-artifact-required.js +90 -0
  149. package/daemon/dist/domain/policies/edge-artifact-required.js.map +1 -0
  150. package/daemon/dist/domain/policies/periodic-reminder.d.ts +3 -0
  151. package/daemon/dist/domain/policies/periodic-reminder.d.ts.map +1 -0
  152. package/daemon/dist/domain/policies/periodic-reminder.js +30 -0
  153. package/daemon/dist/domain/policies/periodic-reminder.js.map +1 -0
  154. package/daemon/dist/domain/policies/types.d.ts +51 -0
  155. package/daemon/dist/domain/policies/types.d.ts.map +1 -0
  156. package/daemon/dist/domain/policies/types.js +9 -0
  157. package/daemon/dist/domain/policies/types.js.map +1 -0
  158. package/daemon/dist/domain/policies/workflow-keepalive.d.ts +7 -0
  159. package/daemon/dist/domain/policies/workflow-keepalive.d.ts.map +1 -0
  160. package/daemon/dist/domain/policies/workflow-keepalive.js +123 -0
  161. package/daemon/dist/domain/policies/workflow-keepalive.js.map +1 -0
  162. package/daemon/dist/domain/project-classifier.d.ts +75 -0
  163. package/daemon/dist/domain/project-classifier.d.ts.map +1 -0
  164. package/daemon/dist/domain/project-classifier.js +132 -0
  165. package/daemon/dist/domain/project-classifier.js.map +1 -0
  166. package/daemon/dist/domain/projection-planner.d.ts +1 -0
  167. package/daemon/dist/domain/projection-planner.d.ts.map +1 -1
  168. package/daemon/dist/domain/projection-planner.js +3 -0
  169. package/daemon/dist/domain/projection-planner.js.map +1 -1
  170. package/daemon/dist/domain/ps-projection.d.ts +31 -0
  171. package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
  172. package/daemon/dist/domain/ps-projection.js +38 -0
  173. package/daemon/dist/domain/ps-projection.js.map +1 -1
  174. package/daemon/dist/domain/queue-repository.d.ts +322 -0
  175. package/daemon/dist/domain/queue-repository.d.ts.map +1 -0
  176. package/daemon/dist/domain/queue-repository.js +686 -0
  177. package/daemon/dist/domain/queue-repository.js.map +1 -0
  178. package/daemon/dist/domain/queue-transition-log.d.ts +38 -0
  179. package/daemon/dist/domain/queue-transition-log.d.ts.map +1 -0
  180. package/daemon/dist/domain/queue-transition-log.js +52 -0
  181. package/daemon/dist/domain/queue-transition-log.js.map +1 -0
  182. package/daemon/dist/domain/restore-check-service.d.ts +203 -0
  183. package/daemon/dist/domain/restore-check-service.d.ts.map +1 -0
  184. package/daemon/dist/domain/restore-check-service.js +1047 -0
  185. package/daemon/dist/domain/restore-check-service.js.map +1 -0
  186. package/daemon/dist/domain/restore-orchestrator.d.ts +50 -2
  187. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  188. package/daemon/dist/domain/restore-orchestrator.js +476 -24
  189. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  190. package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
  191. package/daemon/dist/domain/resume-metadata-refresher.js +27 -7
  192. package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
  193. package/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
  194. package/daemon/dist/domain/rig-expansion-service.js +13 -0
  195. package/daemon/dist/domain/rig-expansion-service.js.map +1 -1
  196. package/daemon/dist/domain/rig-repository.d.ts +17 -1
  197. package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  198. package/daemon/dist/domain/rig-repository.js +63 -5
  199. package/daemon/dist/domain/rig-repository.js.map +1 -1
  200. package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
  201. package/daemon/dist/domain/rigspec-codec.js +13 -0
  202. package/daemon/dist/domain/rigspec-codec.js.map +1 -1
  203. package/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -1
  204. package/daemon/dist/domain/rigspec-exporter.js +2 -0
  205. package/daemon/dist/domain/rigspec-exporter.js.map +1 -1
  206. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  207. package/daemon/dist/domain/rigspec-instantiator.js +63 -1
  208. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  209. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  210. package/daemon/dist/domain/rigspec-schema.js +196 -0
  211. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  212. package/daemon/dist/domain/runtime-adapter.d.ts +30 -1
  213. package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
  214. package/daemon/dist/domain/runtime-adapter.js +14 -0
  215. package/daemon/dist/domain/runtime-adapter.js.map +1 -1
  216. package/daemon/dist/domain/seat-handover-planner.d.ts +84 -0
  217. package/daemon/dist/domain/seat-handover-planner.d.ts.map +1 -0
  218. package/daemon/dist/domain/seat-handover-planner.js +188 -0
  219. package/daemon/dist/domain/seat-handover-planner.js.map +1 -0
  220. package/daemon/dist/domain/seat-handover-service.d.ts +104 -0
  221. package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -0
  222. package/daemon/dist/domain/seat-handover-service.js +343 -0
  223. package/daemon/dist/domain/seat-handover-service.js.map +1 -0
  224. package/daemon/dist/domain/seat-status-service.d.ts +50 -0
  225. package/daemon/dist/domain/seat-status-service.d.ts.map +1 -0
  226. package/daemon/dist/domain/seat-status-service.js +66 -0
  227. package/daemon/dist/domain/seat-status-service.js.map +1 -0
  228. package/daemon/dist/domain/session-source-rebuild-resolver.d.ts +53 -0
  229. package/daemon/dist/domain/session-source-rebuild-resolver.d.ts.map +1 -0
  230. package/daemon/dist/domain/session-source-rebuild-resolver.js +59 -0
  231. package/daemon/dist/domain/session-source-rebuild-resolver.js.map +1 -0
  232. package/daemon/dist/domain/session-transport.d.ts +30 -0
  233. package/daemon/dist/domain/session-transport.d.ts.map +1 -1
  234. package/daemon/dist/domain/session-transport.js +322 -12
  235. package/daemon/dist/domain/session-transport.js.map +1 -1
  236. package/daemon/dist/domain/snapshot-repository.d.ts +18 -0
  237. package/daemon/dist/domain/snapshot-repository.d.ts.map +1 -1
  238. package/daemon/dist/domain/snapshot-repository.js +77 -0
  239. package/daemon/dist/domain/snapshot-repository.js.map +1 -1
  240. package/daemon/dist/domain/startup-orchestrator.d.ts +27 -3
  241. package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
  242. package/daemon/dist/domain/startup-orchestrator.js +125 -40
  243. package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
  244. package/daemon/dist/domain/stream-store.d.ts +56 -0
  245. package/daemon/dist/domain/stream-store.d.ts.map +1 -0
  246. package/daemon/dist/domain/stream-store.js +108 -0
  247. package/daemon/dist/domain/stream-store.js.map +1 -0
  248. package/daemon/dist/domain/transcript-redaction.d.ts +13 -0
  249. package/daemon/dist/domain/transcript-redaction.d.ts.map +1 -0
  250. package/daemon/dist/domain/transcript-redaction.js +34 -0
  251. package/daemon/dist/domain/transcript-redaction.js.map +1 -0
  252. package/daemon/dist/domain/transcript-store.d.ts +15 -0
  253. package/daemon/dist/domain/transcript-store.d.ts.map +1 -1
  254. package/daemon/dist/domain/transcript-store.js +76 -1
  255. package/daemon/dist/domain/transcript-store.js.map +1 -1
  256. package/daemon/dist/domain/types.d.ts +323 -3
  257. package/daemon/dist/domain/types.d.ts.map +1 -1
  258. package/daemon/dist/domain/view-event-bridge.d.ts +12 -0
  259. package/daemon/dist/domain/view-event-bridge.d.ts.map +1 -0
  260. package/daemon/dist/domain/view-event-bridge.js +92 -0
  261. package/daemon/dist/domain/view-event-bridge.js.map +1 -0
  262. package/daemon/dist/domain/view-projector.d.ts +83 -0
  263. package/daemon/dist/domain/view-projector.d.ts.map +1 -0
  264. package/daemon/dist/domain/view-projector.js +296 -0
  265. package/daemon/dist/domain/view-projector.js.map +1 -0
  266. package/daemon/dist/domain/watchdog-history-log.d.ts +49 -0
  267. package/daemon/dist/domain/watchdog-history-log.d.ts.map +1 -0
  268. package/daemon/dist/domain/watchdog-history-log.js +67 -0
  269. package/daemon/dist/domain/watchdog-history-log.js.map +1 -0
  270. package/daemon/dist/domain/watchdog-jobs-repository.d.ts +81 -0
  271. package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -0
  272. package/daemon/dist/domain/watchdog-jobs-repository.js +164 -0
  273. package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -0
  274. package/daemon/dist/domain/watchdog-policy-engine.d.ts +92 -0
  275. package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -0
  276. package/daemon/dist/domain/watchdog-policy-engine.js +442 -0
  277. package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -0
  278. package/daemon/dist/domain/watchdog-scheduler.d.ts +76 -0
  279. package/daemon/dist/domain/watchdog-scheduler.d.ts.map +1 -0
  280. package/daemon/dist/domain/watchdog-scheduler.js +112 -0
  281. package/daemon/dist/domain/watchdog-scheduler.js.map +1 -0
  282. package/daemon/dist/domain/workflow-instance-store.d.ts +46 -0
  283. package/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -0
  284. package/daemon/dist/domain/workflow-instance-store.js +116 -0
  285. package/daemon/dist/domain/workflow-instance-store.js.map +1 -0
  286. package/daemon/dist/domain/workflow-projector.d.ts +64 -0
  287. package/daemon/dist/domain/workflow-projector.d.ts.map +1 -0
  288. package/daemon/dist/domain/workflow-projector.js +424 -0
  289. package/daemon/dist/domain/workflow-projector.js.map +1 -0
  290. package/daemon/dist/domain/workflow-runtime.d.ts +63 -0
  291. package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -0
  292. package/daemon/dist/domain/workflow-runtime.js +150 -0
  293. package/daemon/dist/domain/workflow-runtime.js.map +1 -0
  294. package/daemon/dist/domain/workflow-spec-cache.d.ts +35 -0
  295. package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -0
  296. package/daemon/dist/domain/workflow-spec-cache.js +171 -0
  297. package/daemon/dist/domain/workflow-spec-cache.js.map +1 -0
  298. package/daemon/dist/domain/workflow-step-trail-log.d.ts +27 -0
  299. package/daemon/dist/domain/workflow-step-trail-log.d.ts.map +1 -0
  300. package/daemon/dist/domain/workflow-step-trail-log.js +73 -0
  301. package/daemon/dist/domain/workflow-step-trail-log.js.map +1 -0
  302. package/daemon/dist/domain/workflow-types.d.ts +108 -0
  303. package/daemon/dist/domain/workflow-types.d.ts.map +1 -0
  304. package/daemon/dist/domain/workflow-types.js +11 -0
  305. package/daemon/dist/domain/workflow-types.js.map +1 -0
  306. package/daemon/dist/domain/workflow-validator.d.ts +31 -0
  307. package/daemon/dist/domain/workflow-validator.d.ts.map +1 -0
  308. package/daemon/dist/domain/workflow-validator.js +115 -0
  309. package/daemon/dist/domain/workflow-validator.js.map +1 -0
  310. package/daemon/dist/index.d.ts.map +1 -1
  311. package/daemon/dist/index.js +21 -2
  312. package/daemon/dist/index.js.map +1 -1
  313. package/daemon/dist/routes/activity.d.ts +3 -0
  314. package/daemon/dist/routes/activity.d.ts.map +1 -0
  315. package/daemon/dist/routes/activity.js +47 -0
  316. package/daemon/dist/routes/activity.js.map +1 -0
  317. package/daemon/dist/routes/projects.d.ts +12 -0
  318. package/daemon/dist/routes/projects.d.ts.map +1 -0
  319. package/daemon/dist/routes/projects.js +178 -0
  320. package/daemon/dist/routes/projects.js.map +1 -0
  321. package/daemon/dist/routes/queue.d.ts +10 -0
  322. package/daemon/dist/routes/queue.d.ts.map +1 -0
  323. package/daemon/dist/routes/queue.js +374 -0
  324. package/daemon/dist/routes/queue.js.map +1 -0
  325. package/daemon/dist/routes/restore-check.d.ts +3 -0
  326. package/daemon/dist/routes/restore-check.d.ts.map +1 -0
  327. package/daemon/dist/routes/restore-check.js +200 -0
  328. package/daemon/dist/routes/restore-check.js.map +1 -0
  329. package/daemon/dist/routes/rigs.d.ts.map +1 -1
  330. package/daemon/dist/routes/rigs.js +60 -4
  331. package/daemon/dist/routes/rigs.js.map +1 -1
  332. package/daemon/dist/routes/seat.d.ts +3 -0
  333. package/daemon/dist/routes/seat.d.ts.map +1 -0
  334. package/daemon/dist/routes/seat.js +69 -0
  335. package/daemon/dist/routes/seat.js.map +1 -0
  336. package/daemon/dist/routes/sessions.d.ts.map +1 -1
  337. package/daemon/dist/routes/sessions.js +41 -5
  338. package/daemon/dist/routes/sessions.js.map +1 -1
  339. package/daemon/dist/routes/snapshots.js +66 -17
  340. package/daemon/dist/routes/snapshots.js.map +1 -1
  341. package/daemon/dist/routes/stream.d.ts +9 -0
  342. package/daemon/dist/routes/stream.d.ts.map +1 -0
  343. package/daemon/dist/routes/stream.js +119 -0
  344. package/daemon/dist/routes/stream.js.map +1 -0
  345. package/daemon/dist/routes/transcripts.d.ts.map +1 -1
  346. package/daemon/dist/routes/transcripts.js +38 -0
  347. package/daemon/dist/routes/transcripts.js.map +1 -1
  348. package/daemon/dist/routes/transport.d.ts.map +1 -1
  349. package/daemon/dist/routes/transport.js +21 -0
  350. package/daemon/dist/routes/transport.js.map +1 -1
  351. package/daemon/dist/routes/up.js +24 -3
  352. package/daemon/dist/routes/up.js.map +1 -1
  353. package/daemon/dist/routes/views.d.ts +13 -0
  354. package/daemon/dist/routes/views.d.ts.map +1 -0
  355. package/daemon/dist/routes/views.js +120 -0
  356. package/daemon/dist/routes/views.js.map +1 -0
  357. package/daemon/dist/routes/watchdog.d.ts +18 -0
  358. package/daemon/dist/routes/watchdog.d.ts.map +1 -0
  359. package/daemon/dist/routes/watchdog.js +148 -0
  360. package/daemon/dist/routes/watchdog.js.map +1 -0
  361. package/daemon/dist/routes/workflow.d.ts +20 -0
  362. package/daemon/dist/routes/workflow.d.ts.map +1 -0
  363. package/daemon/dist/routes/workflow.js +184 -0
  364. package/daemon/dist/routes/workflow.js.map +1 -0
  365. package/daemon/dist/server.d.ts +30 -0
  366. package/daemon/dist/server.d.ts.map +1 -1
  367. package/daemon/dist/server.js +33 -0
  368. package/daemon/dist/server.js.map +1 -1
  369. package/daemon/dist/startup.d.ts.map +1 -1
  370. package/daemon/dist/startup.js +202 -8
  371. package/daemon/dist/startup.js.map +1 -1
  372. package/daemon/docs/reference/agent-spec.md +12 -5
  373. package/daemon/docs/reference/agent-startup-guide.md +9 -9
  374. package/daemon/specs/agents/apps/vault-specialist/agent.yaml +1 -1
  375. package/daemon/specs/agents/design/product-designer/agent.yaml +1 -1
  376. package/daemon/specs/agents/development/implementer/agent.yaml +1 -1
  377. package/daemon/specs/agents/development/qa/agent.yaml +1 -1
  378. package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -1
  379. package/daemon/specs/agents/product-management/pm/agent.yaml +4 -0
  380. package/daemon/specs/agents/research/analyst/agent.yaml +1 -1
  381. package/daemon/specs/agents/research/synthesizer/agent.yaml +1 -1
  382. package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -1
  383. package/daemon/specs/agents/shared/agent.yaml +17 -0
  384. package/daemon/specs/agents/shared/runtime/claude-mcp.fragment.json +12 -0
  385. package/daemon/specs/agents/shared/runtime/claude-settings.fragment.json +16 -0
  386. package/daemon/specs/agents/shared/runtime/codex-config.fragment.toml +5 -0
  387. package/daemon/specs/agents/shared/skills/claude-compact-in-place/SKILL.md +100 -0
  388. package/daemon/specs/agents/shared/skills/core/openrig-operator/SKILL.md +110 -0
  389. package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +44 -1
  390. package/daemon/specs/agents/shared/skills/mental-model-ha/SKILL.md +3 -0
  391. package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +3 -0
  392. package/dist/commands/capture.d.ts +7 -1
  393. package/dist/commands/capture.d.ts.map +1 -1
  394. package/dist/commands/capture.js +59 -1
  395. package/dist/commands/capture.js.map +1 -1
  396. package/dist/commands/compact-plan.d.ts +9 -0
  397. package/dist/commands/compact-plan.d.ts.map +1 -0
  398. package/dist/commands/compact-plan.js +354 -0
  399. package/dist/commands/compact-plan.js.map +1 -0
  400. package/dist/commands/context.d.ts +9 -0
  401. package/dist/commands/context.d.ts.map +1 -0
  402. package/dist/commands/context.js +220 -0
  403. package/dist/commands/context.js.map +1 -0
  404. package/dist/commands/doctor.d.ts.map +1 -1
  405. package/dist/commands/doctor.js +19 -8
  406. package/dist/commands/doctor.js.map +1 -1
  407. package/dist/commands/expand.d.ts.map +1 -1
  408. package/dist/commands/expand.js +15 -4
  409. package/dist/commands/expand.js.map +1 -1
  410. package/dist/commands/heartbeat.d.ts +99 -0
  411. package/dist/commands/heartbeat.d.ts.map +1 -0
  412. package/dist/commands/heartbeat.js +393 -0
  413. package/dist/commands/heartbeat.js.map +1 -0
  414. package/dist/commands/import.d.ts.map +1 -1
  415. package/dist/commands/import.js +2 -1
  416. package/dist/commands/import.js.map +1 -1
  417. package/dist/commands/preflight.js +1 -1
  418. package/dist/commands/preflight.js.map +1 -1
  419. package/dist/commands/project.d.ts +14 -0
  420. package/dist/commands/project.d.ts.map +1 -0
  421. package/dist/commands/project.js +157 -0
  422. package/dist/commands/project.js.map +1 -0
  423. package/dist/commands/ps.d.ts +20 -3
  424. package/dist/commands/ps.d.ts.map +1 -1
  425. package/dist/commands/ps.js +455 -33
  426. package/dist/commands/ps.js.map +1 -1
  427. package/dist/commands/queue.d.ts +16 -0
  428. package/dist/commands/queue.d.ts.map +1 -0
  429. package/dist/commands/queue.js +401 -0
  430. package/dist/commands/queue.js.map +1 -0
  431. package/dist/commands/restore-check.d.ts +9 -0
  432. package/dist/commands/restore-check.d.ts.map +1 -0
  433. package/dist/commands/restore-check.js +234 -0
  434. package/dist/commands/restore-check.js.map +1 -0
  435. package/dist/commands/restore-packet.d.ts +9 -0
  436. package/dist/commands/restore-packet.d.ts.map +1 -0
  437. package/dist/commands/restore-packet.js +383 -0
  438. package/dist/commands/restore-packet.js.map +1 -0
  439. package/dist/commands/restore.d.ts.map +1 -1
  440. package/dist/commands/restore.js +69 -1
  441. package/dist/commands/restore.js.map +1 -1
  442. package/dist/commands/seat.d.ts +5 -0
  443. package/dist/commands/seat.d.ts.map +1 -0
  444. package/dist/commands/seat.js +170 -0
  445. package/dist/commands/seat.js.map +1 -0
  446. package/dist/commands/send.d.ts +12 -1
  447. package/dist/commands/send.d.ts.map +1 -1
  448. package/dist/commands/send.js +93 -5
  449. package/dist/commands/send.js.map +1 -1
  450. package/dist/commands/setup.d.ts.map +1 -1
  451. package/dist/commands/setup.js +20 -8
  452. package/dist/commands/setup.js.map +1 -1
  453. package/dist/commands/specs.d.ts.map +1 -1
  454. package/dist/commands/specs.js +99 -16
  455. package/dist/commands/specs.js.map +1 -1
  456. package/dist/commands/stream.d.ts +12 -0
  457. package/dist/commands/stream.d.ts.map +1 -0
  458. package/dist/commands/stream.js +111 -0
  459. package/dist/commands/stream.js.map +1 -0
  460. package/dist/commands/up.d.ts +1 -0
  461. package/dist/commands/up.d.ts.map +1 -1
  462. package/dist/commands/up.js +65 -4
  463. package/dist/commands/up.js.map +1 -1
  464. package/dist/commands/view.d.ts +12 -0
  465. package/dist/commands/view.d.ts.map +1 -0
  466. package/dist/commands/view.js +82 -0
  467. package/dist/commands/view.js.map +1 -0
  468. package/dist/commands/watchdog.d.ts +15 -0
  469. package/dist/commands/watchdog.d.ts.map +1 -0
  470. package/dist/commands/watchdog.js +120 -0
  471. package/dist/commands/watchdog.js.map +1 -0
  472. package/dist/commands/whoami.d.ts +8 -1
  473. package/dist/commands/whoami.d.ts.map +1 -1
  474. package/dist/commands/whoami.js +60 -1
  475. package/dist/commands/whoami.js.map +1 -1
  476. package/dist/commands/workflow.d.ts +17 -0
  477. package/dist/commands/workflow.d.ts.map +1 -0
  478. package/dist/commands/workflow.js +138 -0
  479. package/dist/commands/workflow.js.map +1 -0
  480. package/dist/cross-host-cli-helpers.d.ts +12 -0
  481. package/dist/cross-host-cli-helpers.d.ts.map +1 -0
  482. package/dist/cross-host-cli-helpers.js +48 -0
  483. package/dist/cross-host-cli-helpers.js.map +1 -0
  484. package/dist/cross-host-executor.d.ts +84 -0
  485. package/dist/cross-host-executor.d.ts.map +1 -0
  486. package/dist/cross-host-executor.js +138 -0
  487. package/dist/cross-host-executor.js.map +1 -0
  488. package/dist/host-registry.d.ts +50 -0
  489. package/dist/host-registry.d.ts.map +1 -0
  490. package/dist/host-registry.js +116 -0
  491. package/dist/host-registry.js.map +1 -0
  492. package/dist/index.d.ts +20 -0
  493. package/dist/index.d.ts.map +1 -1
  494. package/dist/index.js +24 -0
  495. package/dist/index.js.map +1 -1
  496. package/dist/mcp-server.d.ts.map +1 -1
  497. package/dist/mcp-server.js +22 -2
  498. package/dist/mcp-server.js.map +1 -1
  499. package/dist/restore-packet/claude-transcript-parser.d.ts +12 -0
  500. package/dist/restore-packet/claude-transcript-parser.d.ts.map +1 -0
  501. package/dist/restore-packet/claude-transcript-parser.js +221 -0
  502. package/dist/restore-packet/claude-transcript-parser.js.map +1 -0
  503. package/dist/restore-packet/codex-jsonl-parser.d.ts +11 -0
  504. package/dist/restore-packet/codex-jsonl-parser.d.ts.map +1 -0
  505. package/dist/restore-packet/codex-jsonl-parser.js +159 -0
  506. package/dist/restore-packet/codex-jsonl-parser.js.map +1 -0
  507. package/dist/restore-packet/omitted-records.d.ts +60 -0
  508. package/dist/restore-packet/omitted-records.d.ts.map +1 -0
  509. package/dist/restore-packet/omitted-records.js +116 -0
  510. package/dist/restore-packet/omitted-records.js.map +1 -0
  511. package/dist/restore-packet/packet-writer.d.ts +59 -0
  512. package/dist/restore-packet/packet-writer.d.ts.map +1 -0
  513. package/dist/restore-packet/packet-writer.js +224 -0
  514. package/dist/restore-packet/packet-writer.js.map +1 -0
  515. package/dist/restore-packet/redaction.d.ts +30 -0
  516. package/dist/restore-packet/redaction.d.ts.map +1 -0
  517. package/dist/restore-packet/redaction.js +71 -0
  518. package/dist/restore-packet/redaction.js.map +1 -0
  519. package/dist/restore-packet/runtime-detect.d.ts +19 -0
  520. package/dist/restore-packet/runtime-detect.d.ts.map +1 -0
  521. package/dist/restore-packet/runtime-detect.js +81 -0
  522. package/dist/restore-packet/runtime-detect.js.map +1 -0
  523. package/dist/restore-packet/schema-validator.d.ts +13 -0
  524. package/dist/restore-packet/schema-validator.d.ts.map +1 -0
  525. package/dist/restore-packet/schema-validator.js +245 -0
  526. package/dist/restore-packet/schema-validator.js.map +1 -0
  527. package/dist/restore-packet/types.d.ts +76 -0
  528. package/dist/restore-packet/types.d.ts.map +1 -0
  529. package/dist/restore-packet/types.js +15 -0
  530. package/dist/restore-packet/types.js.map +1 -0
  531. package/dist/schemas/restore-summary.schema.json +98 -0
  532. package/dist/system-preflight.d.ts.map +1 -1
  533. package/dist/system-preflight.js +16 -5
  534. package/dist/system-preflight.js.map +1 -1
  535. package/dist/tmux-health.d.ts +16 -0
  536. package/dist/tmux-health.d.ts.map +1 -0
  537. package/dist/tmux-health.js +105 -0
  538. package/dist/tmux-health.js.map +1 -0
  539. package/package.json +10 -3
  540. package/scripts/check-abi.mjs +123 -0
  541. package/ui/dist/assets/{index-DlMH-REm.css → index-Dec25siz.css} +1 -1
  542. package/ui/dist/assets/{index-lEO-zBxz.js → index-GNYaWmBj.js} +9 -9
  543. 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":"AAKA,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
+ {"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 = nodePath.join(homeDir, ".codex", "logs_1.sqlite");
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 row = db.prepare(`SELECT thread_id
50
- FROM logs
51
- WHERE process_uuid LIKE ?
52
- AND thread_id IS NOT NULL
53
- ORDER BY ts DESC, ts_nanos DESC, id DESC
54
- LIMIT 1`).get(`pid:${pid}:%`);
55
- return row?.thread_id;
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
- finally {
58
- db.close();
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
- return undefined;
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,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IACjE,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB;;;;;iBAKS,CACV,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAuC,CAAC;YAC5D,OAAO,GAAG,EAAE,SAAS,CAAC;QACxB,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
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;AAElE,4CAA4C;AAC5C,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAQ/C;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,wBAAwB,CAAyG;IACzI,OAAO,CAAC,KAAK,CAA+C;gBAG1D,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,iBAAiB,EACxB,wBAAwB,CAAC,EAAE;QAAE,sBAAsB,CAAC,OAAO,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,GAAG,IAAI,CAAA;KAAE;IAO5H,4EAA4E;IAC5E,QAAQ,IAAI,IAAI;IAmBhB,uDAAuD;IACvD,KAAK,CAAC,UAAU,GAAE,MAAiC,GAAG,IAAI;IAS1D,iEAAiE;IACjE,IAAI,IAAI,IAAI;IAOZ,oEAAoE;IACpE,OAAO,CAAC,mBAAmB;CAa5B"}
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"}