@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,83 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { EventBus } from "./event-bus.js";
3
+ /**
4
+ * View projector (PL-004 Phase B; L5 View — read-only projections).
5
+ *
6
+ * Per PRD § L5 + slice IMPL § Guard Checkpoint Focus item 5+6:
7
+ * - 6 built-in views over Phase A's queue_items + queue_transitions tables.
8
+ * - Custom view registration via views_custom table.
9
+ * - Read-only over Phase A state + Phase B state. NO writes to queue_items
10
+ * or queue_transitions from this module.
11
+ * - Sub-100 ms latency target (per PRD § Acceptance Criteria); achieved by
12
+ * leaning on Phase A's existing indexes.
13
+ * - Fixture rig exclusion default: rig names matching `^test-` or `^fixture-`
14
+ * are excluded; opt-in via OPENRIG_VIEW_INCLUDE_FIXTURES=1.
15
+ *
16
+ * Custom views in views_custom store a SQL string (`definition`) that the
17
+ * projector executes verbatim. Operator-defined; no taxonomy enforced.
18
+ *
19
+ * Pattern mirrors Phase A's queue-repository.ts read-API shape.
20
+ */
21
+ export declare const BUILT_IN_VIEW_NAMES: readonly ["recently-active", "founder", "pod-load", "escalations", "held", "activity"];
22
+ export type BuiltInViewName = (typeof BUILT_IN_VIEW_NAMES)[number];
23
+ export interface ViewQueryResult {
24
+ viewName: string;
25
+ generatedAt: string;
26
+ rows: Record<string, unknown>[];
27
+ rowCount: number;
28
+ }
29
+ export interface CustomView {
30
+ viewId: string;
31
+ viewName: string;
32
+ definition: string;
33
+ registeredBySession: string;
34
+ registeredAt: string;
35
+ lastEvaluatedAt: string | null;
36
+ }
37
+ export declare class ViewProjectorError extends Error {
38
+ readonly code: string;
39
+ constructor(code: string, message: string);
40
+ }
41
+ export declare class ViewProjector {
42
+ readonly db: Database.Database;
43
+ private readonly eventBus;
44
+ private readonly now;
45
+ constructor(db: Database.Database, eventBus: EventBus, opts?: {
46
+ now?: () => Date;
47
+ });
48
+ /**
49
+ * Run a view by name. Built-in names (BUILT_IN_VIEW_NAMES) dispatch to
50
+ * hardcoded SQL; other names dispatch to custom-view lookup.
51
+ */
52
+ show(viewName: string, opts?: {
53
+ rig?: string;
54
+ limit?: number;
55
+ }): ViewQueryResult;
56
+ list(): {
57
+ builtIn: BuiltInViewName[];
58
+ custom: CustomView[];
59
+ };
60
+ private runBuiltIn;
61
+ private runCustom;
62
+ /**
63
+ * Register a custom view. UNIQUE on view_name; re-registration of the
64
+ * same name updates the definition (operator-friendly: edit views.yaml,
65
+ * re-register, get the new query).
66
+ */
67
+ registerCustomView(input: {
68
+ viewName: string;
69
+ definition: string;
70
+ registeredBySession: string;
71
+ }): CustomView;
72
+ getCustomView(viewName: string): CustomView | null;
73
+ listCustomViews(): CustomView[];
74
+ /**
75
+ * Used by routes/views.ts to emit view.changed when underlying state
76
+ * changes. Phase B does not auto-evaluate; callers (route SSE handlers)
77
+ * subscribe to event-bus events and trigger this notify.
78
+ */
79
+ notifyViewChanged(viewName: string, cause: string): void;
80
+ private getCustomViewByIdOrThrow;
81
+ private rowToCustomView;
82
+ }
83
+ //# sourceMappingURL=view-projector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-projector.d.ts","sourceRoot":"","sources":["../../src/domain/view-projector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;;;;;;;;;;;;;;GAiBG;AAEH,eAAO,MAAM,mBAAmB,wFAOtB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAWD,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAI1C;AAmBD,qBAAa,aAAa;IACxB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;gBAG/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,QAAQ,EAClB,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE;IAO7B;;;OAGG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe;IAYhF,IAAI,IAAI;QAAE,OAAO,EAAE,eAAe,EAAE,CAAC;QAAC,MAAM,EAAE,UAAU,EAAE,CAAA;KAAE;IAI5D,OAAO,CAAC,UAAU;IAyHlB,OAAO,CAAC,SAAS;IA4BjB;;;;OAIG;IACH,kBAAkB,CAAC,KAAK,EAAE;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,GAAG,UAAU;IAgCd,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAOlD,eAAe,IAAI,UAAU,EAAE;IAO/B;;;;OAIG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IASxD,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,eAAe;CAUxB"}
@@ -0,0 +1,296 @@
1
+ import { ulid } from "ulid";
2
+ /**
3
+ * View projector (PL-004 Phase B; L5 View — read-only projections).
4
+ *
5
+ * Per PRD § L5 + slice IMPL § Guard Checkpoint Focus item 5+6:
6
+ * - 6 built-in views over Phase A's queue_items + queue_transitions tables.
7
+ * - Custom view registration via views_custom table.
8
+ * - Read-only over Phase A state + Phase B state. NO writes to queue_items
9
+ * or queue_transitions from this module.
10
+ * - Sub-100 ms latency target (per PRD § Acceptance Criteria); achieved by
11
+ * leaning on Phase A's existing indexes.
12
+ * - Fixture rig exclusion default: rig names matching `^test-` or `^fixture-`
13
+ * are excluded; opt-in via OPENRIG_VIEW_INCLUDE_FIXTURES=1.
14
+ *
15
+ * Custom views in views_custom store a SQL string (`definition`) that the
16
+ * projector executes verbatim. Operator-defined; no taxonomy enforced.
17
+ *
18
+ * Pattern mirrors Phase A's queue-repository.ts read-API shape.
19
+ */
20
+ export const BUILT_IN_VIEW_NAMES = [
21
+ "recently-active",
22
+ "founder",
23
+ "pod-load",
24
+ "escalations",
25
+ "held",
26
+ "activity",
27
+ ];
28
+ export class ViewProjectorError extends Error {
29
+ code;
30
+ constructor(code, message) {
31
+ super(message);
32
+ this.code = code;
33
+ }
34
+ }
35
+ /**
36
+ * Detect fixture rigs by session name suffix `@<rig>` where <rig> starts
37
+ * with `test-` or `fixture-`. Used to filter views by default; opt-in via
38
+ * OPENRIG_VIEW_INCLUDE_FIXTURES=1.
39
+ */
40
+ function fixtureExclusionClause() {
41
+ if (process.env.OPENRIG_VIEW_INCLUDE_FIXTURES === "1")
42
+ return "1=1";
43
+ // Exclude qitems whose source_session OR destination_session has a rig
44
+ // name starting with test- or fixture-.
45
+ return `(
46
+ destination_session NOT LIKE '%@test-%' AND
47
+ destination_session NOT LIKE '%@fixture-%' AND
48
+ source_session NOT LIKE '%@test-%' AND
49
+ source_session NOT LIKE '%@fixture-%'
50
+ )`;
51
+ }
52
+ export class ViewProjector {
53
+ db;
54
+ eventBus;
55
+ now;
56
+ constructor(db, eventBus, opts) {
57
+ this.db = db;
58
+ this.eventBus = eventBus;
59
+ this.now = opts?.now ?? (() => new Date());
60
+ }
61
+ /**
62
+ * Run a view by name. Built-in names (BUILT_IN_VIEW_NAMES) dispatch to
63
+ * hardcoded SQL; other names dispatch to custom-view lookup.
64
+ */
65
+ show(viewName, opts) {
66
+ const limit = Math.max(1, Math.min(opts?.limit ?? 100, 1000));
67
+ if (BUILT_IN_VIEW_NAMES.includes(viewName)) {
68
+ return this.runBuiltIn(viewName, opts?.rig, limit);
69
+ }
70
+ const custom = this.getCustomView(viewName);
71
+ if (!custom) {
72
+ throw new ViewProjectorError("view_not_found", `view '${viewName}' is not registered (built-in or custom)`);
73
+ }
74
+ return this.runCustom(custom, limit);
75
+ }
76
+ list() {
77
+ return { builtIn: [...BUILT_IN_VIEW_NAMES], custom: this.listCustomViews() };
78
+ }
79
+ runBuiltIn(name, rig, limit) {
80
+ const fixtureClause = fixtureExclusionClause();
81
+ const rigClause = rig ? `AND (destination_session LIKE ? OR source_session LIKE ?)` : "";
82
+ const rigParams = rig ? [`%@${rig}`, `%@${rig}`] : [];
83
+ let sql;
84
+ let params = [];
85
+ switch (name) {
86
+ case "recently-active":
87
+ // qitems by ts_updated DESC; live states (pending/in-progress/blocked).
88
+ sql = `
89
+ SELECT qitem_id, source_session, destination_session, state, priority, tier, ts_updated, body
90
+ FROM queue_items
91
+ WHERE state IN ('pending', 'in-progress', 'blocked')
92
+ AND ${fixtureClause}
93
+ ${rigClause}
94
+ ORDER BY ts_updated DESC
95
+ LIMIT ?
96
+ `;
97
+ params = [...rigParams, limit];
98
+ break;
99
+ case "founder":
100
+ // priority='critical' OR tier='critical' OR tier='fast'.
101
+ sql = `
102
+ SELECT qitem_id, source_session, destination_session, state, priority, tier, ts_updated
103
+ FROM queue_items
104
+ WHERE (priority = 'critical' OR tier IN ('critical', 'fast'))
105
+ AND state IN ('pending', 'in-progress', 'blocked')
106
+ AND ${fixtureClause}
107
+ ${rigClause}
108
+ ORDER BY ts_updated DESC
109
+ LIMIT ?
110
+ `;
111
+ params = [...rigParams, limit];
112
+ break;
113
+ case "pod-load":
114
+ // R1 NOTE 4: PRD § L5 names this view "per-pod queue-item counts",
115
+ // but Phase A's queue_items table does not carry pod metadata —
116
+ // destination_session is `<member>@<rig>` shape and there is no
117
+ // pod_id column. v0 interpretation: group by destination_session
118
+ // (i.e., per-seat counts). When pod metadata becomes available
119
+ // (Phase D workflow runtime or later), this view should be
120
+ // upgraded to GROUP BY pod_id with destination_session aggregation
121
+ // as a sub-grouping. Documented v0 behavior preserves the view
122
+ // name but reduces the grouping key.
123
+ sql = `
124
+ SELECT destination_session AS pod, COUNT(*) AS active_count
125
+ FROM queue_items
126
+ WHERE state IN ('pending', 'in-progress', 'blocked')
127
+ AND ${fixtureClause}
128
+ ${rigClause}
129
+ GROUP BY destination_session
130
+ ORDER BY active_count DESC
131
+ LIMIT ?
132
+ `;
133
+ params = [...rigParams, limit];
134
+ break;
135
+ case "escalations":
136
+ // closure_reason = 'escalation' OR transition note matches.
137
+ sql = `
138
+ SELECT qitem_id, source_session, destination_session, state, closure_reason, closure_target, ts_updated
139
+ FROM queue_items
140
+ WHERE closure_reason = 'escalation'
141
+ AND ${fixtureClause}
142
+ ${rigClause}
143
+ ORDER BY ts_updated DESC
144
+ LIMIT ?
145
+ `;
146
+ params = [...rigParams, limit];
147
+ break;
148
+ case "held":
149
+ // state = 'blocked' OR blocked_on is non-null.
150
+ sql = `
151
+ SELECT qitem_id, source_session, destination_session, state, blocked_on, ts_updated, body
152
+ FROM queue_items
153
+ WHERE (state = 'blocked' OR blocked_on IS NOT NULL)
154
+ AND ${fixtureClause}
155
+ ${rigClause}
156
+ ORDER BY ts_updated DESC
157
+ LIMIT ?
158
+ `;
159
+ params = [...rigParams, limit];
160
+ break;
161
+ case "activity": {
162
+ // Recent transitions joined with qitem state. Fixture-clause must
163
+ // reference queue_items columns, so use the prefixed clause.
164
+ const fixtureClauseQI = fixtureClause === "1=1"
165
+ ? "1=1"
166
+ : `(
167
+ q.destination_session NOT LIKE '%@test-%' AND
168
+ q.destination_session NOT LIKE '%@fixture-%' AND
169
+ q.source_session NOT LIKE '%@test-%' AND
170
+ q.source_session NOT LIKE '%@fixture-%'
171
+ )`;
172
+ const rigClauseQI = rig
173
+ ? `AND (q.destination_session LIKE ? OR q.source_session LIKE ?)`
174
+ : "";
175
+ sql = `
176
+ SELECT t.transition_id, t.qitem_id, t.ts, t.state, t.actor_session, t.transition_note,
177
+ q.destination_session, q.source_session
178
+ FROM queue_transitions t
179
+ JOIN queue_items q ON t.qitem_id = q.qitem_id
180
+ WHERE ${fixtureClauseQI}
181
+ ${rigClauseQI}
182
+ ORDER BY t.ts DESC
183
+ LIMIT ?
184
+ `;
185
+ params = [...rigParams, limit];
186
+ break;
187
+ }
188
+ }
189
+ const rows = this.db.prepare(sql).all(...params);
190
+ return {
191
+ viewName: name,
192
+ generatedAt: this.now().toISOString(),
193
+ rows,
194
+ rowCount: rows.length,
195
+ };
196
+ }
197
+ runCustom(view, limit) {
198
+ // Custom view definitions are operator-supplied SQL. Append LIMIT if
199
+ // the operator's SQL does not already include one. We do not parse SQL;
200
+ // operators are responsible for the definition's correctness.
201
+ const sql = view.definition.toLowerCase().includes("limit")
202
+ ? view.definition
203
+ : `${view.definition.trim().replace(/;$/, "")} LIMIT ${limit}`;
204
+ let rows;
205
+ try {
206
+ rows = this.db.prepare(sql).all();
207
+ }
208
+ catch (err) {
209
+ throw new ViewProjectorError("view_query_failed", `custom view '${view.viewName}' query failed: ${err.message}`);
210
+ }
211
+ // Touch last_evaluated_at (best-effort; not transactional).
212
+ this.db
213
+ .prepare(`UPDATE views_custom SET last_evaluated_at = ? WHERE view_id = ?`)
214
+ .run(this.now().toISOString(), view.viewId);
215
+ return {
216
+ viewName: view.viewName,
217
+ generatedAt: this.now().toISOString(),
218
+ rows,
219
+ rowCount: rows.length,
220
+ };
221
+ }
222
+ /**
223
+ * Register a custom view. UNIQUE on view_name; re-registration of the
224
+ * same name updates the definition (operator-friendly: edit views.yaml,
225
+ * re-register, get the new query).
226
+ */
227
+ registerCustomView(input) {
228
+ if (BUILT_IN_VIEW_NAMES.includes(input.viewName)) {
229
+ throw new ViewProjectorError("view_name_reserved", `view name '${input.viewName}' is a reserved built-in name; choose a different name`);
230
+ }
231
+ const existing = this.db
232
+ .prepare(`SELECT * FROM views_custom WHERE view_name = ?`)
233
+ .get(input.viewName);
234
+ const registeredAt = this.now().toISOString();
235
+ if (existing) {
236
+ this.db
237
+ .prepare(`UPDATE views_custom
238
+ SET definition = ?, registered_by_session = ?, registered_at = ?
239
+ WHERE view_id = ?`)
240
+ .run(input.definition, input.registeredBySession, registeredAt, existing.view_id);
241
+ return this.getCustomViewByIdOrThrow(existing.view_id);
242
+ }
243
+ const viewId = ulid();
244
+ this.db
245
+ .prepare(`INSERT INTO views_custom (
246
+ view_id, view_name, definition, registered_by_session, registered_at
247
+ ) VALUES (?, ?, ?, ?, ?)`)
248
+ .run(viewId, input.viewName, input.definition, input.registeredBySession, registeredAt);
249
+ return this.getCustomViewByIdOrThrow(viewId);
250
+ }
251
+ getCustomView(viewName) {
252
+ const row = this.db
253
+ .prepare(`SELECT * FROM views_custom WHERE view_name = ?`)
254
+ .get(viewName);
255
+ return row ? this.rowToCustomView(row) : null;
256
+ }
257
+ listCustomViews() {
258
+ const rows = this.db
259
+ .prepare(`SELECT * FROM views_custom ORDER BY view_name ASC`)
260
+ .all();
261
+ return rows.map((r) => this.rowToCustomView(r));
262
+ }
263
+ /**
264
+ * Used by routes/views.ts to emit view.changed when underlying state
265
+ * changes. Phase B does not auto-evaluate; callers (route SSE handlers)
266
+ * subscribe to event-bus events and trigger this notify.
267
+ */
268
+ notifyViewChanged(viewName, cause) {
269
+ const persisted = this.eventBus.persistWithinTransaction({
270
+ type: "view.changed",
271
+ viewName,
272
+ cause,
273
+ });
274
+ this.eventBus.notifySubscribers(persisted);
275
+ }
276
+ getCustomViewByIdOrThrow(viewId) {
277
+ const row = this.db
278
+ .prepare(`SELECT * FROM views_custom WHERE view_id = ?`)
279
+ .get(viewId);
280
+ if (!row) {
281
+ throw new ViewProjectorError("view_not_found", `custom view ${viewId} not found after write`);
282
+ }
283
+ return this.rowToCustomView(row);
284
+ }
285
+ rowToCustomView(row) {
286
+ return {
287
+ viewId: row.view_id,
288
+ viewName: row.view_name,
289
+ definition: row.definition,
290
+ registeredBySession: row.registered_by_session,
291
+ registeredAt: row.registered_at,
292
+ lastEvaluatedAt: row.last_evaluated_at,
293
+ };
294
+ }
295
+ }
296
+ //# sourceMappingURL=view-projector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-projector.js","sourceRoot":"","sources":["../../src/domain/view-projector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type Database from "better-sqlite3";
2
+ /**
3
+ * Watchdog history log (PL-004 Phase C; append-only audit writer).
4
+ *
5
+ * Per slice IMPL § Guard Checkpoint Focus item 2:
6
+ * - Pure `not_due` polls are NOT recorded (matches POC; minimizes
7
+ * table size). Only `sent` / `skipped` / `terminal` outcomes pass
8
+ * through this log.
9
+ * - Append-only API surface: only `record()` exposed. UPDATE/DELETE
10
+ * are not exposed. SQLite has no view/role layer so direct SQL
11
+ * could mutate, but the contract is enforced at this domain
12
+ * boundary.
13
+ */
14
+ export type WatchdogOutcome = "sent" | "skipped" | "terminal";
15
+ export interface WatchdogHistoryRecordInput {
16
+ jobId: string;
17
+ evaluatedAt: string;
18
+ outcome: WatchdogOutcome;
19
+ skipReason?: string | null;
20
+ deliveryTargetSession?: string | null;
21
+ deliveryStatus?: string | null;
22
+ deliveryMessage?: string | null;
23
+ evaluationNotes?: Record<string, unknown> | null;
24
+ }
25
+ export interface WatchdogHistoryEntry {
26
+ historyId: string;
27
+ jobId: string;
28
+ evaluatedAt: string;
29
+ outcome: WatchdogOutcome;
30
+ skipReason: string | null;
31
+ deliveryTargetSession: string | null;
32
+ deliveryStatus: string | null;
33
+ deliveryMessage: string | null;
34
+ evaluationNotes: Record<string, unknown> | null;
35
+ }
36
+ export declare class WatchdogHistoryLog {
37
+ private readonly db;
38
+ constructor(db: Database.Database);
39
+ /**
40
+ * Append a meaningful evaluation outcome. Returns the persisted entry.
41
+ * Caller MUST NOT invoke this for `not_due` pure-skip outcomes — those
42
+ * are not recorded (per POC + IMPL guidance).
43
+ */
44
+ record(input: WatchdogHistoryRecordInput): WatchdogHistoryEntry;
45
+ listForJob(jobId: string, limit?: number): WatchdogHistoryEntry[];
46
+ listAll(limit?: number): WatchdogHistoryEntry[];
47
+ countForJob(jobId: string): number;
48
+ }
49
+ //# sourceMappingURL=watchdog-history-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchdog-history-log.d.ts","sourceRoot":"","sources":["../../src/domain/watchdog-history-log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,eAAe,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,eAAe,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACjD;AAcD,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAElD;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,0BAA0B,GAAG,oBAAoB;IAkC/D,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,oBAAoB,EAAE;IAU7D,OAAO,CAAC,KAAK,SAAM,GAAG,oBAAoB,EAAE;IAU5C,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAMnC"}
@@ -0,0 +1,67 @@
1
+ import { ulid } from "ulid";
2
+ export class WatchdogHistoryLog {
3
+ db;
4
+ constructor(db) {
5
+ this.db = db;
6
+ }
7
+ /**
8
+ * Append a meaningful evaluation outcome. Returns the persisted entry.
9
+ * Caller MUST NOT invoke this for `not_due` pure-skip outcomes — those
10
+ * are not recorded (per POC + IMPL guidance).
11
+ */
12
+ record(input) {
13
+ const historyId = ulid();
14
+ this.db
15
+ .prepare(`INSERT INTO watchdog_history (
16
+ history_id, job_id, evaluated_at, outcome,
17
+ skip_reason, delivery_target_session, delivery_status,
18
+ delivery_message, evaluation_notes
19
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`)
20
+ .run(historyId, input.jobId, input.evaluatedAt, input.outcome, input.skipReason ?? null, input.deliveryTargetSession ?? null, input.deliveryStatus ?? null, input.deliveryMessage ?? null, input.evaluationNotes ? JSON.stringify(input.evaluationNotes) : null);
21
+ return {
22
+ historyId,
23
+ jobId: input.jobId,
24
+ evaluatedAt: input.evaluatedAt,
25
+ outcome: input.outcome,
26
+ skipReason: input.skipReason ?? null,
27
+ deliveryTargetSession: input.deliveryTargetSession ?? null,
28
+ deliveryStatus: input.deliveryStatus ?? null,
29
+ deliveryMessage: input.deliveryMessage ?? null,
30
+ evaluationNotes: input.evaluationNotes ?? null,
31
+ };
32
+ }
33
+ listForJob(jobId, limit = 50) {
34
+ const rows = this.db
35
+ .prepare(`SELECT * FROM watchdog_history WHERE job_id = ?
36
+ ORDER BY evaluated_at DESC, history_id DESC LIMIT ?`)
37
+ .all(jobId, limit);
38
+ return rows.map(rowToEntry);
39
+ }
40
+ listAll(limit = 100) {
41
+ const rows = this.db
42
+ .prepare(`SELECT * FROM watchdog_history
43
+ ORDER BY evaluated_at DESC, history_id DESC LIMIT ?`)
44
+ .all(limit);
45
+ return rows.map(rowToEntry);
46
+ }
47
+ countForJob(jobId) {
48
+ const row = this.db
49
+ .prepare(`SELECT COUNT(*) AS n FROM watchdog_history WHERE job_id = ?`)
50
+ .get(jobId);
51
+ return row.n;
52
+ }
53
+ }
54
+ function rowToEntry(row) {
55
+ return {
56
+ historyId: row.history_id,
57
+ jobId: row.job_id,
58
+ evaluatedAt: row.evaluated_at,
59
+ outcome: row.outcome,
60
+ skipReason: row.skip_reason,
61
+ deliveryTargetSession: row.delivery_target_session,
62
+ deliveryStatus: row.delivery_status,
63
+ deliveryMessage: row.delivery_message,
64
+ evaluationNotes: row.evaluation_notes ? JSON.parse(row.evaluation_notes) : null,
65
+ };
66
+ }
67
+ //# sourceMappingURL=watchdog-history-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchdog-history-log.js","sourceRoot":"","sources":["../../src/domain/watchdog-history-log.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAoD5B,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAEtD;;;;OAIG;IACH,MAAM,CAAC,KAAiC;QACtC,MAAM,SAAS,GAAG,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;;;;6CAIqC,CACtC;aACA,GAAG,CACF,SAAS,EACT,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,UAAU,IAAI,IAAI,EACxB,KAAK,CAAC,qBAAqB,IAAI,IAAI,EACnC,KAAK,CAAC,cAAc,IAAI,IAAI,EAC5B,KAAK,CAAC,eAAe,IAAI,IAAI,EAC7B,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CACrE,CAAC;QACJ,OAAO;YACL,SAAS;YACT,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;YACpC,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,IAAI,IAAI;YAC1D,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI;YAC5C,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;YAC9C,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;SAC/C,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,KAAa,EAAE,KAAK,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;6DACqD,CACtD;aACA,GAAG,CAAC,KAAK,EAAE,KAAK,CAAiB,CAAC;QACrC,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,KAAK,GAAG,GAAG;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;6DACqD,CACtD;aACA,GAAG,CAAC,KAAK,CAAiB,CAAC;QAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,WAAW,CAAC,KAAa;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,6DAA6D,CAAC;aACtE,GAAG,CAAC,KAAK,CAAkB,CAAC;QAC/B,OAAO,GAAG,CAAC,CAAC,CAAC;IACf,CAAC;CACF;AAED,SAAS,UAAU,CAAC,GAAe;IACjC,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,KAAK,EAAE,GAAG,CAAC,MAAM;QACjB,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,OAAO,EAAE,GAAG,CAAC,OAA0B;QACvC,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,qBAAqB,EAAE,GAAG,CAAC,uBAAuB;QAClD,cAAc,EAAE,GAAG,CAAC,eAAe;QACnC,eAAe,EAAE,GAAG,CAAC,gBAAgB;QACrC,eAAe,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI;KAChF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,81 @@
1
+ import type Database from "better-sqlite3";
2
+ /**
3
+ * Watchdog jobs repository (PL-004 Phase C; extended in Phase D).
4
+ *
5
+ * Owns all reads/writes against `watchdog_jobs`. Pure persistence; no
6
+ * event-bus, no scheduler, no policy dispatch. Composed by the
7
+ * scheduler and policy engine.
8
+ *
9
+ * Phase D v1 accepts FOUR policy values (the orch-ratified Phase C
10
+ * `workflow-keepalive` deferral has been lifted; the policy module
11
+ * now exists at `policies/workflow-keepalive.ts` and reads from the
12
+ * SQLite `workflow_instances` table introduced in Phase D):
13
+ * - periodic-reminder (Phase C)
14
+ * - artifact-pool-ready (Phase C)
15
+ * - edge-artifact-required (Phase C)
16
+ * - workflow-keepalive (Phase D)
17
+ *
18
+ * PHASE_C_POLICIES retained as a deprecated alias for callers that
19
+ * still reference it; new code uses PHASE_D_POLICIES.
20
+ */
21
+ export declare const PHASE_D_POLICIES: readonly ["periodic-reminder", "artifact-pool-ready", "edge-artifact-required", "workflow-keepalive"];
22
+ /** @deprecated since Phase D — use PHASE_D_POLICIES. */
23
+ export declare const PHASE_C_POLICIES: readonly ["periodic-reminder", "artifact-pool-ready", "edge-artifact-required", "workflow-keepalive"];
24
+ export type WatchdogPolicyName = (typeof PHASE_D_POLICIES)[number];
25
+ export type WatchdogJobState = "active" | "stopped" | "terminal";
26
+ export interface WatchdogJob {
27
+ jobId: string;
28
+ policy: WatchdogPolicyName;
29
+ specYaml: string;
30
+ targetSession: string;
31
+ intervalSeconds: number;
32
+ activeWakeIntervalSeconds: number | null;
33
+ scanIntervalSeconds: number | null;
34
+ lastEvaluationAt: string | null;
35
+ lastFireAt: string | null;
36
+ actionable: boolean;
37
+ lastActionableAt: string | null;
38
+ state: WatchdogJobState;
39
+ registeredBySession: string;
40
+ registeredAt: string;
41
+ terminalReason: string | null;
42
+ }
43
+ export interface RegisterWatchdogJobInput {
44
+ policy: string;
45
+ specYaml: string;
46
+ targetSession: string;
47
+ intervalSeconds: number;
48
+ activeWakeIntervalSeconds?: number | null;
49
+ scanIntervalSeconds?: number | null;
50
+ registeredBySession: string;
51
+ }
52
+ export declare class WatchdogJobsError extends Error {
53
+ readonly code: string;
54
+ readonly details?: Record<string, unknown> | undefined;
55
+ constructor(code: string, message: string, details?: Record<string, unknown> | undefined);
56
+ }
57
+ export declare class WatchdogJobsRepository {
58
+ private readonly db;
59
+ private readonly now;
60
+ constructor(db: Database.Database, now?: () => Date);
61
+ register(input: RegisterWatchdogJobInput): WatchdogJob;
62
+ getById(jobId: string): WatchdogJob | null;
63
+ getByIdOrThrow(jobId: string): WatchdogJob;
64
+ listAll(): WatchdogJob[];
65
+ listActive(): WatchdogJob[];
66
+ recordEvaluation(jobId: string, evaluatedAt: string, fired: boolean): void;
67
+ /**
68
+ * R1 fix: write the actionable-state machine columns. Mirrors POC
69
+ * engine's `state.actionable` + `state.last_actionable_at`. Called
70
+ * by the policy engine after every meaningful evaluation:
71
+ * - newActionable=false (skip): clears actionable + last_actionable_at.
72
+ * - newActionable=true with no preserveLastActionableAt: stamps
73
+ * last_actionable_at to evaluatedAt (newly actionable).
74
+ * - newActionable=true with preserveLastActionableAt set: keeps the
75
+ * existing first-actionable timestamp (continued actionable window).
76
+ */
77
+ setActionable(jobId: string, newActionable: boolean, evaluatedAt: string, preserveLastActionableAt?: string | null): void;
78
+ markTerminal(jobId: string, reason: string): void;
79
+ stop(jobId: string, reason?: string): WatchdogJob;
80
+ }
81
+ //# sourceMappingURL=watchdog-jobs-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchdog-jobs-repository.d.ts","sourceRoot":"","sources":["../../src/domain/watchdog-jobs-repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C;;;;;;;;;;;;;;;;;;GAkBG;AAEH,eAAO,MAAM,gBAAgB,uGAKnB,CAAC;AAEX,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,uGAAmB,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,kBAAkB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE,gBAAgB,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,yBAAyB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAoBD,qBAAa,iBAAkB,SAAQ,KAAK;aAExB,IAAI,EAAE,MAAM;aAEZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjC,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAKpD;AAED,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBADH,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,GAAG,GAAE,MAAM,IAAuB;IAGrD,QAAQ,CAAC,KAAK,EAAE,wBAAwB,GAAG,WAAW;IA+CtD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAO1C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IAY1C,OAAO,IAAI,WAAW,EAAE;IAOxB,UAAU,IAAI,WAAW,EAAE;IAO3B,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAc1E;;;;;;;;;OASG;IACH,aAAa,CACX,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,OAAO,EACtB,WAAW,EAAE,MAAM,EACnB,wBAAwB,GAAE,MAAM,GAAG,IAAW,GAC7C,IAAI;IAiBP,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQjD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAqB,GAAG,WAAW;CAe9D"}