@telora/daemon 0.12.33

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 (473) hide show
  1. package/.env.example +64 -0
  2. package/README.md +229 -0
  3. package/build-info.json +4 -0
  4. package/dist/activity-tracker.d.ts +13 -0
  5. package/dist/activity-tracker.d.ts.map +1 -0
  6. package/dist/activity-tracker.js +19 -0
  7. package/dist/activity-tracker.js.map +1 -0
  8. package/dist/agent-state.d.ts +45 -0
  9. package/dist/agent-state.d.ts.map +1 -0
  10. package/dist/agent-state.js +61 -0
  11. package/dist/agent-state.js.map +1 -0
  12. package/dist/audit-hooks.d.ts +12 -0
  13. package/dist/audit-hooks.d.ts.map +1 -0
  14. package/dist/audit-hooks.js +45 -0
  15. package/dist/audit-hooks.js.map +1 -0
  16. package/dist/auto-update.d.ts +42 -0
  17. package/dist/auto-update.d.ts.map +1 -0
  18. package/dist/auto-update.js +96 -0
  19. package/dist/auto-update.js.map +1 -0
  20. package/dist/branch-status.d.ts +40 -0
  21. package/dist/branch-status.d.ts.map +1 -0
  22. package/dist/branch-status.js +107 -0
  23. package/dist/branch-status.js.map +1 -0
  24. package/dist/completion-detector.d.ts +87 -0
  25. package/dist/completion-detector.d.ts.map +1 -0
  26. package/dist/completion-detector.js +160 -0
  27. package/dist/completion-detector.js.map +1 -0
  28. package/dist/completion-handler.d.ts +48 -0
  29. package/dist/completion-handler.d.ts.map +1 -0
  30. package/dist/completion-handler.js +200 -0
  31. package/dist/completion-handler.js.map +1 -0
  32. package/dist/condition-evaluators.d.ts +31 -0
  33. package/dist/condition-evaluators.d.ts.map +1 -0
  34. package/dist/condition-evaluators.js +416 -0
  35. package/dist/condition-evaluators.js.map +1 -0
  36. package/dist/config.d.ts +55 -0
  37. package/dist/config.d.ts.map +1 -0
  38. package/dist/config.js +311 -0
  39. package/dist/config.js.map +1 -0
  40. package/dist/control-state.d.ts +41 -0
  41. package/dist/control-state.d.ts.map +1 -0
  42. package/dist/control-state.js +204 -0
  43. package/dist/control-state.js.map +1 -0
  44. package/dist/crash-recovery-cleanup.d.ts +21 -0
  45. package/dist/crash-recovery-cleanup.d.ts.map +1 -0
  46. package/dist/crash-recovery-cleanup.js +198 -0
  47. package/dist/crash-recovery-cleanup.js.map +1 -0
  48. package/dist/crash-recovery-scan.d.ts +19 -0
  49. package/dist/crash-recovery-scan.d.ts.map +1 -0
  50. package/dist/crash-recovery-scan.js +145 -0
  51. package/dist/crash-recovery-scan.js.map +1 -0
  52. package/dist/crash-recovery-types.d.ts +54 -0
  53. package/dist/crash-recovery-types.d.ts.map +1 -0
  54. package/dist/crash-recovery-types.js +13 -0
  55. package/dist/crash-recovery-types.js.map +1 -0
  56. package/dist/crash-recovery.d.ts +88 -0
  57. package/dist/crash-recovery.d.ts.map +1 -0
  58. package/dist/crash-recovery.js +448 -0
  59. package/dist/crash-recovery.js.map +1 -0
  60. package/dist/daemon-logs.d.ts +19 -0
  61. package/dist/daemon-logs.d.ts.map +1 -0
  62. package/dist/daemon-logs.js +81 -0
  63. package/dist/daemon-logs.js.map +1 -0
  64. package/dist/daemon-process.d.ts +154 -0
  65. package/dist/daemon-process.d.ts.map +1 -0
  66. package/dist/daemon-process.js +427 -0
  67. package/dist/daemon-process.js.map +1 -0
  68. package/dist/dag-validator.d.ts +52 -0
  69. package/dist/dag-validator.d.ts.map +1 -0
  70. package/dist/dag-validator.js +199 -0
  71. package/dist/dag-validator.js.map +1 -0
  72. package/dist/delivery-guards.d.ts +41 -0
  73. package/dist/delivery-guards.d.ts.map +1 -0
  74. package/dist/delivery-guards.js +195 -0
  75. package/dist/delivery-guards.js.map +1 -0
  76. package/dist/delivery-lifecycle.d.ts +110 -0
  77. package/dist/delivery-lifecycle.d.ts.map +1 -0
  78. package/dist/delivery-lifecycle.js +353 -0
  79. package/dist/delivery-lifecycle.js.map +1 -0
  80. package/dist/delivery-merge.d.ts +17 -0
  81. package/dist/delivery-merge.d.ts.map +1 -0
  82. package/dist/delivery-merge.js +89 -0
  83. package/dist/delivery-merge.js.map +1 -0
  84. package/dist/dependency-resolver.d.ts +77 -0
  85. package/dist/dependency-resolver.d.ts.map +1 -0
  86. package/dist/dependency-resolver.js +337 -0
  87. package/dist/dependency-resolver.js.map +1 -0
  88. package/dist/evaluation-context.d.ts +49 -0
  89. package/dist/evaluation-context.d.ts.map +1 -0
  90. package/dist/evaluation-context.js +98 -0
  91. package/dist/evaluation-context.js.map +1 -0
  92. package/dist/git-activity.d.ts +24 -0
  93. package/dist/git-activity.d.ts.map +1 -0
  94. package/dist/git-activity.js +97 -0
  95. package/dist/git-activity.js.map +1 -0
  96. package/dist/git-branch.d.ts +33 -0
  97. package/dist/git-branch.d.ts.map +1 -0
  98. package/dist/git-branch.js +88 -0
  99. package/dist/git-branch.js.map +1 -0
  100. package/dist/git-integration.d.ts +27 -0
  101. package/dist/git-integration.d.ts.map +1 -0
  102. package/dist/git-integration.js +82 -0
  103. package/dist/git-integration.js.map +1 -0
  104. package/dist/git-merge-helpers.d.ts +48 -0
  105. package/dist/git-merge-helpers.d.ts.map +1 -0
  106. package/dist/git-merge-helpers.js +105 -0
  107. package/dist/git-merge-helpers.js.map +1 -0
  108. package/dist/git-merge-lock.d.ts +67 -0
  109. package/dist/git-merge-lock.d.ts.map +1 -0
  110. package/dist/git-merge-lock.js +157 -0
  111. package/dist/git-merge-lock.js.map +1 -0
  112. package/dist/git-merge-strategies.d.ts +39 -0
  113. package/dist/git-merge-strategies.d.ts.map +1 -0
  114. package/dist/git-merge-strategies.js +127 -0
  115. package/dist/git-merge-strategies.js.map +1 -0
  116. package/dist/git-merge.d.ts +80 -0
  117. package/dist/git-merge.d.ts.map +1 -0
  118. package/dist/git-merge.js +373 -0
  119. package/dist/git-merge.js.map +1 -0
  120. package/dist/git-state-detector.d.ts +24 -0
  121. package/dist/git-state-detector.d.ts.map +1 -0
  122. package/dist/git-state-detector.js +122 -0
  123. package/dist/git-state-detector.js.map +1 -0
  124. package/dist/git-types.d.ts +40 -0
  125. package/dist/git-types.d.ts.map +1 -0
  126. package/dist/git-types.js +23 -0
  127. package/dist/git-types.js.map +1 -0
  128. package/dist/git-utils.d.ts +28 -0
  129. package/dist/git-utils.d.ts.map +1 -0
  130. package/dist/git-utils.js +57 -0
  131. package/dist/git-utils.js.map +1 -0
  132. package/dist/git.d.ts +24 -0
  133. package/dist/git.d.ts.map +1 -0
  134. package/dist/git.js +64 -0
  135. package/dist/git.js.map +1 -0
  136. package/dist/guard-engine.d.ts +19 -0
  137. package/dist/guard-engine.d.ts.map +1 -0
  138. package/dist/guard-engine.js +21 -0
  139. package/dist/guard-engine.js.map +1 -0
  140. package/dist/guard-evaluator.d.ts +47 -0
  141. package/dist/guard-evaluator.d.ts.map +1 -0
  142. package/dist/guard-evaluator.js +193 -0
  143. package/dist/guard-evaluator.js.map +1 -0
  144. package/dist/heartbeat.d.ts +73 -0
  145. package/dist/heartbeat.d.ts.map +1 -0
  146. package/dist/heartbeat.js +306 -0
  147. package/dist/heartbeat.js.map +1 -0
  148. package/dist/index.d.ts +32 -0
  149. package/dist/index.d.ts.map +1 -0
  150. package/dist/index.js +493 -0
  151. package/dist/index.js.map +1 -0
  152. package/dist/listener-auto-advance.d.ts +29 -0
  153. package/dist/listener-auto-advance.d.ts.map +1 -0
  154. package/dist/listener-auto-advance.js +172 -0
  155. package/dist/listener-auto-advance.js.map +1 -0
  156. package/dist/listener-review.d.ts +37 -0
  157. package/dist/listener-review.d.ts.map +1 -0
  158. package/dist/listener-review.js +217 -0
  159. package/dist/listener-review.js.map +1 -0
  160. package/dist/listener.d.ts +57 -0
  161. package/dist/listener.d.ts.map +1 -0
  162. package/dist/listener.js +361 -0
  163. package/dist/listener.js.map +1 -0
  164. package/dist/log-manager.d.ts +18 -0
  165. package/dist/log-manager.d.ts.map +1 -0
  166. package/dist/log-manager.js +18 -0
  167. package/dist/log-manager.js.map +1 -0
  168. package/dist/otlp-log-parser.d.ts +21 -0
  169. package/dist/otlp-log-parser.d.ts.map +1 -0
  170. package/dist/otlp-log-parser.js +143 -0
  171. package/dist/otlp-log-parser.js.map +1 -0
  172. package/dist/otlp-metric-parser.d.ts +20 -0
  173. package/dist/otlp-metric-parser.d.ts.map +1 -0
  174. package/dist/otlp-metric-parser.js +113 -0
  175. package/dist/otlp-metric-parser.js.map +1 -0
  176. package/dist/otlp-port-manager.d.ts +26 -0
  177. package/dist/otlp-port-manager.d.ts.map +1 -0
  178. package/dist/otlp-port-manager.js +130 -0
  179. package/dist/otlp-port-manager.js.map +1 -0
  180. package/dist/otlp-receiver.d.ts +51 -0
  181. package/dist/otlp-receiver.d.ts.map +1 -0
  182. package/dist/otlp-receiver.js +663 -0
  183. package/dist/otlp-receiver.js.map +1 -0
  184. package/dist/otlp-types.d.ts +92 -0
  185. package/dist/otlp-types.d.ts.map +1 -0
  186. package/dist/otlp-types.js +133 -0
  187. package/dist/otlp-types.js.map +1 -0
  188. package/dist/output-monitor.d.ts +33 -0
  189. package/dist/output-monitor.d.ts.map +1 -0
  190. package/dist/output-monitor.js +67 -0
  191. package/dist/output-monitor.js.map +1 -0
  192. package/dist/planning-prompt-builder.d.ts +67 -0
  193. package/dist/planning-prompt-builder.d.ts.map +1 -0
  194. package/dist/planning-prompt-builder.js +515 -0
  195. package/dist/planning-prompt-builder.js.map +1 -0
  196. package/dist/prompt-builder.d.ts +14 -0
  197. package/dist/prompt-builder.d.ts.map +1 -0
  198. package/dist/prompt-builder.js +174 -0
  199. package/dist/prompt-builder.js.map +1 -0
  200. package/dist/qa-crash-recovery.d.ts +77 -0
  201. package/dist/qa-crash-recovery.d.ts.map +1 -0
  202. package/dist/qa-crash-recovery.js +243 -0
  203. package/dist/qa-crash-recovery.js.map +1 -0
  204. package/dist/qa-dev-server.d.ts +73 -0
  205. package/dist/qa-dev-server.d.ts.map +1 -0
  206. package/dist/qa-dev-server.js +279 -0
  207. package/dist/qa-dev-server.js.map +1 -0
  208. package/dist/qa-orchestrator.d.ts +79 -0
  209. package/dist/qa-orchestrator.d.ts.map +1 -0
  210. package/dist/qa-orchestrator.js +349 -0
  211. package/dist/qa-orchestrator.js.map +1 -0
  212. package/dist/qa-port-allocator.d.ts +34 -0
  213. package/dist/qa-port-allocator.d.ts.map +1 -0
  214. package/dist/qa-port-allocator.js +75 -0
  215. package/dist/qa-port-allocator.js.map +1 -0
  216. package/dist/qa-provisioner.d.ts +33 -0
  217. package/dist/qa-provisioner.d.ts.map +1 -0
  218. package/dist/qa-provisioner.js +141 -0
  219. package/dist/qa-provisioner.js.map +1 -0
  220. package/dist/qa-state.d.ts +93 -0
  221. package/dist/qa-state.d.ts.map +1 -0
  222. package/dist/qa-state.js +74 -0
  223. package/dist/qa-state.js.map +1 -0
  224. package/dist/queries/control-state.d.ts +25 -0
  225. package/dist/queries/control-state.d.ts.map +1 -0
  226. package/dist/queries/control-state.js +34 -0
  227. package/dist/queries/control-state.js.map +1 -0
  228. package/dist/queries/daemon-connection.d.ts +25 -0
  229. package/dist/queries/daemon-connection.d.ts.map +1 -0
  230. package/dist/queries/daemon-connection.js +28 -0
  231. package/dist/queries/daemon-connection.js.map +1 -0
  232. package/dist/queries/deliveries.d.ts +100 -0
  233. package/dist/queries/deliveries.d.ts.map +1 -0
  234. package/dist/queries/deliveries.js +184 -0
  235. package/dist/queries/deliveries.js.map +1 -0
  236. package/dist/queries/git-activity.d.ts +20 -0
  237. package/dist/queries/git-activity.d.ts.map +1 -0
  238. package/dist/queries/git-activity.js +22 -0
  239. package/dist/queries/git-activity.js.map +1 -0
  240. package/dist/queries/guards.d.ts +47 -0
  241. package/dist/queries/guards.d.ts.map +1 -0
  242. package/dist/queries/guards.js +138 -0
  243. package/dist/queries/guards.js.map +1 -0
  244. package/dist/queries/index.d.ts +19 -0
  245. package/dist/queries/index.d.ts.map +1 -0
  246. package/dist/queries/index.js +17 -0
  247. package/dist/queries/index.js.map +1 -0
  248. package/dist/queries/issues.d.ts +41 -0
  249. package/dist/queries/issues.d.ts.map +1 -0
  250. package/dist/queries/issues.js +67 -0
  251. package/dist/queries/issues.js.map +1 -0
  252. package/dist/queries/qa.d.ts +79 -0
  253. package/dist/queries/qa.d.ts.map +1 -0
  254. package/dist/queries/qa.js +85 -0
  255. package/dist/queries/qa.js.map +1 -0
  256. package/dist/queries/roles.d.ts +13 -0
  257. package/dist/queries/roles.d.ts.map +1 -0
  258. package/dist/queries/roles.js +39 -0
  259. package/dist/queries/roles.js.map +1 -0
  260. package/dist/queries/schemas.d.ts +777 -0
  261. package/dist/queries/schemas.d.ts.map +1 -0
  262. package/dist/queries/schemas.js +391 -0
  263. package/dist/queries/schemas.js.map +1 -0
  264. package/dist/queries/sessions.d.ts +64 -0
  265. package/dist/queries/sessions.d.ts.map +1 -0
  266. package/dist/queries/sessions.js +100 -0
  267. package/dist/queries/sessions.js.map +1 -0
  268. package/dist/queries/shared.d.ts +61 -0
  269. package/dist/queries/shared.d.ts.map +1 -0
  270. package/dist/queries/shared.js +187 -0
  271. package/dist/queries/shared.js.map +1 -0
  272. package/dist/queries/strategies.d.ts +69 -0
  273. package/dist/queries/strategies.d.ts.map +1 -0
  274. package/dist/queries/strategies.js +80 -0
  275. package/dist/queries/strategies.js.map +1 -0
  276. package/dist/queries/workflows.d.ts +17 -0
  277. package/dist/queries/workflows.d.ts.map +1 -0
  278. package/dist/queries/workflows.js +49 -0
  279. package/dist/queries/workflows.js.map +1 -0
  280. package/dist/queries/worktrees.d.ts +38 -0
  281. package/dist/queries/worktrees.d.ts.map +1 -0
  282. package/dist/queries/worktrees.js +37 -0
  283. package/dist/queries/worktrees.js.map +1 -0
  284. package/dist/self-update.d.ts +94 -0
  285. package/dist/self-update.d.ts.map +1 -0
  286. package/dist/self-update.js +438 -0
  287. package/dist/self-update.js.map +1 -0
  288. package/dist/session-lifecycle.d.ts +77 -0
  289. package/dist/session-lifecycle.d.ts.map +1 -0
  290. package/dist/session-lifecycle.js +379 -0
  291. package/dist/session-lifecycle.js.map +1 -0
  292. package/dist/shutdown-state.d.ts +17 -0
  293. package/dist/shutdown-state.d.ts.map +1 -0
  294. package/dist/shutdown-state.js +22 -0
  295. package/dist/shutdown-state.js.map +1 -0
  296. package/dist/spawn-cooldown.d.ts +14 -0
  297. package/dist/spawn-cooldown.d.ts.map +1 -0
  298. package/dist/spawn-cooldown.js +34 -0
  299. package/dist/spawn-cooldown.js.map +1 -0
  300. package/dist/spawn-environment.d.ts +35 -0
  301. package/dist/spawn-environment.d.ts.map +1 -0
  302. package/dist/spawn-environment.js +48 -0
  303. package/dist/spawn-environment.js.map +1 -0
  304. package/dist/spawner-liveness.d.ts +23 -0
  305. package/dist/spawner-liveness.d.ts.map +1 -0
  306. package/dist/spawner-liveness.js +99 -0
  307. package/dist/spawner-liveness.js.map +1 -0
  308. package/dist/spawner-resolution.d.ts +27 -0
  309. package/dist/spawner-resolution.d.ts.map +1 -0
  310. package/dist/spawner-resolution.js +99 -0
  311. package/dist/spawner-resolution.js.map +1 -0
  312. package/dist/spawner-timeout.d.ts +32 -0
  313. package/dist/spawner-timeout.d.ts.map +1 -0
  314. package/dist/spawner-timeout.js +124 -0
  315. package/dist/spawner-timeout.js.map +1 -0
  316. package/dist/spawner.d.ts +77 -0
  317. package/dist/spawner.d.ts.map +1 -0
  318. package/dist/spawner.js +734 -0
  319. package/dist/spawner.js.map +1 -0
  320. package/dist/strategy-completion.d.ts +110 -0
  321. package/dist/strategy-completion.d.ts.map +1 -0
  322. package/dist/strategy-completion.js +434 -0
  323. package/dist/strategy-completion.js.map +1 -0
  324. package/dist/strategy-engine.d.ts +47 -0
  325. package/dist/strategy-engine.d.ts.map +1 -0
  326. package/dist/strategy-engine.js +419 -0
  327. package/dist/strategy-engine.js.map +1 -0
  328. package/dist/strategy-executor.d.ts +93 -0
  329. package/dist/strategy-executor.d.ts.map +1 -0
  330. package/dist/strategy-executor.js +775 -0
  331. package/dist/strategy-executor.js.map +1 -0
  332. package/dist/strategy-lifecycle.d.ts +61 -0
  333. package/dist/strategy-lifecycle.d.ts.map +1 -0
  334. package/dist/strategy-lifecycle.js +516 -0
  335. package/dist/strategy-lifecycle.js.map +1 -0
  336. package/dist/strategy-merge.d.ts +72 -0
  337. package/dist/strategy-merge.d.ts.map +1 -0
  338. package/dist/strategy-merge.js +371 -0
  339. package/dist/strategy-merge.js.map +1 -0
  340. package/dist/strategy-prompt-builder.d.ts +62 -0
  341. package/dist/strategy-prompt-builder.d.ts.map +1 -0
  342. package/dist/strategy-prompt-builder.js +538 -0
  343. package/dist/strategy-prompt-builder.js.map +1 -0
  344. package/dist/strategy-provisioning.d.ts +16 -0
  345. package/dist/strategy-provisioning.d.ts.map +1 -0
  346. package/dist/strategy-provisioning.js +119 -0
  347. package/dist/strategy-provisioning.js.map +1 -0
  348. package/dist/strategy-team-state.d.ts +24 -0
  349. package/dist/strategy-team-state.d.ts.map +1 -0
  350. package/dist/strategy-team-state.js +43 -0
  351. package/dist/strategy-team-state.js.map +1 -0
  352. package/dist/strategy-teardown.d.ts +24 -0
  353. package/dist/strategy-teardown.d.ts.map +1 -0
  354. package/dist/strategy-teardown.js +158 -0
  355. package/dist/strategy-teardown.js.map +1 -0
  356. package/dist/strategy-worktree-state.d.ts +47 -0
  357. package/dist/strategy-worktree-state.d.ts.map +1 -0
  358. package/dist/strategy-worktree-state.js +104 -0
  359. package/dist/strategy-worktree-state.js.map +1 -0
  360. package/dist/supabase.d.ts +36 -0
  361. package/dist/supabase.d.ts.map +1 -0
  362. package/dist/supabase.js +50 -0
  363. package/dist/supabase.js.map +1 -0
  364. package/dist/task-converter.d.ts +61 -0
  365. package/dist/task-converter.d.ts.map +1 -0
  366. package/dist/task-converter.js +286 -0
  367. package/dist/task-converter.js.map +1 -0
  368. package/dist/task-dag-builder.d.ts +14 -0
  369. package/dist/task-dag-builder.d.ts.map +1 -0
  370. package/dist/task-dag-builder.js +17 -0
  371. package/dist/task-dag-builder.js.map +1 -0
  372. package/dist/team-prompt-base.d.ts +114 -0
  373. package/dist/team-prompt-base.d.ts.map +1 -0
  374. package/dist/team-prompt-base.js +531 -0
  375. package/dist/team-prompt-base.js.map +1 -0
  376. package/dist/team-prompt-variants.d.ts +27 -0
  377. package/dist/team-prompt-variants.d.ts.map +1 -0
  378. package/dist/team-prompt-variants.js +134 -0
  379. package/dist/team-prompt-variants.js.map +1 -0
  380. package/dist/team-spawner.d.ts +50 -0
  381. package/dist/team-spawner.d.ts.map +1 -0
  382. package/dist/team-spawner.js +410 -0
  383. package/dist/team-spawner.js.map +1 -0
  384. package/dist/telemetry-writer.d.ts +66 -0
  385. package/dist/telemetry-writer.d.ts.map +1 -0
  386. package/dist/telemetry-writer.js +96 -0
  387. package/dist/telemetry-writer.js.map +1 -0
  388. package/dist/trigger-executor.d.ts +56 -0
  389. package/dist/trigger-executor.d.ts.map +1 -0
  390. package/dist/trigger-executor.js +313 -0
  391. package/dist/trigger-executor.js.map +1 -0
  392. package/dist/types/config.d.ts +60 -0
  393. package/dist/types/config.d.ts.map +1 -0
  394. package/dist/types/config.js +5 -0
  395. package/dist/types/config.js.map +1 -0
  396. package/dist/types/dag.d.ts +53 -0
  397. package/dist/types/dag.d.ts.map +1 -0
  398. package/dist/types/dag.js +5 -0
  399. package/dist/types/dag.js.map +1 -0
  400. package/dist/types/delivery.d.ts +71 -0
  401. package/dist/types/delivery.d.ts.map +1 -0
  402. package/dist/types/delivery.js +5 -0
  403. package/dist/types/delivery.js.map +1 -0
  404. package/dist/types/index.d.ts +15 -0
  405. package/dist/types/index.d.ts.map +1 -0
  406. package/dist/types/index.js +15 -0
  407. package/dist/types/index.js.map +1 -0
  408. package/dist/types/issue.d.ts +22 -0
  409. package/dist/types/issue.d.ts.map +1 -0
  410. package/dist/types/issue.js +5 -0
  411. package/dist/types/issue.js.map +1 -0
  412. package/dist/types/merge.d.ts +28 -0
  413. package/dist/types/merge.d.ts.map +1 -0
  414. package/dist/types/merge.js +5 -0
  415. package/dist/types/merge.js.map +1 -0
  416. package/dist/types/session.d.ts +98 -0
  417. package/dist/types/session.d.ts.map +1 -0
  418. package/dist/types/session.js +5 -0
  419. package/dist/types/session.js.map +1 -0
  420. package/dist/types/strategy.d.ts +175 -0
  421. package/dist/types/strategy.d.ts.map +1 -0
  422. package/dist/types/strategy.js +5 -0
  423. package/dist/types/strategy.js.map +1 -0
  424. package/dist/types/workflow.d.ts +34 -0
  425. package/dist/types/workflow.d.ts.map +1 -0
  426. package/dist/types/workflow.js +9 -0
  427. package/dist/types/workflow.js.map +1 -0
  428. package/dist/types.d.ts +9 -0
  429. package/dist/types.d.ts.map +1 -0
  430. package/dist/types.js +9 -0
  431. package/dist/types.js.map +1 -0
  432. package/dist/unified-init.d.ts +16 -0
  433. package/dist/unified-init.d.ts.map +1 -0
  434. package/dist/unified-init.js +183 -0
  435. package/dist/unified-init.js.map +1 -0
  436. package/dist/unified-shell-config.d.ts +34 -0
  437. package/dist/unified-shell-config.d.ts.map +1 -0
  438. package/dist/unified-shell-config.js +238 -0
  439. package/dist/unified-shell-config.js.map +1 -0
  440. package/dist/unified-shell-status.d.ts +15 -0
  441. package/dist/unified-shell-status.d.ts.map +1 -0
  442. package/dist/unified-shell-status.js +100 -0
  443. package/dist/unified-shell-status.js.map +1 -0
  444. package/dist/unified-shell.d.ts +50 -0
  445. package/dist/unified-shell.d.ts.map +1 -0
  446. package/dist/unified-shell.js +682 -0
  447. package/dist/unified-shell.js.map +1 -0
  448. package/dist/version-check.d.ts +19 -0
  449. package/dist/version-check.d.ts.map +1 -0
  450. package/dist/version-check.js +67 -0
  451. package/dist/version-check.js.map +1 -0
  452. package/dist/workflow-engine.d.ts +95 -0
  453. package/dist/workflow-engine.d.ts.map +1 -0
  454. package/dist/workflow-engine.js +165 -0
  455. package/dist/workflow-engine.js.map +1 -0
  456. package/dist/worktree-merge.d.ts +23 -0
  457. package/dist/worktree-merge.d.ts.map +1 -0
  458. package/dist/worktree-merge.js +57 -0
  459. package/dist/worktree-merge.js.map +1 -0
  460. package/dist/worktree-safety.d.ts +48 -0
  461. package/dist/worktree-safety.d.ts.map +1 -0
  462. package/dist/worktree-safety.js +113 -0
  463. package/dist/worktree-safety.js.map +1 -0
  464. package/dist/worktree-strategy.d.ts +69 -0
  465. package/dist/worktree-strategy.d.ts.map +1 -0
  466. package/dist/worktree-strategy.js +214 -0
  467. package/dist/worktree-strategy.js.map +1 -0
  468. package/dist/worktree.d.ts +159 -0
  469. package/dist/worktree.d.ts.map +1 -0
  470. package/dist/worktree.js +512 -0
  471. package/dist/worktree.js.map +1 -0
  472. package/package.json +76 -0
  473. package/scripts/telora-daemon-wrapper.sh +31 -0
package/.env.example ADDED
@@ -0,0 +1,64 @@
1
+ # Telora Agent Orchestration Daemon Configuration
2
+ #
3
+ # Uses tracker-based authentication - same as Telora MCP server.
4
+ # You can use the same TELORA_TRACKER_ID and TELORA_URL as your MCP config.
5
+
6
+ # Telora API Connection (required)
7
+ # Copy these from your .mcp.json telora-products config
8
+ TELORA_URL=http://127.0.0.1:54321
9
+ TELORA_TRACKER_ID=your-tracker-uuid
10
+
11
+ # Organization to watch (required)
12
+ TELORA_ORGANIZATION_ID=your-organization-uuid
13
+
14
+ # Product to scope the daemon to (optional)
15
+ # If set, daemon only picks up deliveries for this product.
16
+ # If not set, daemon picks up ALL org deliveries.
17
+ # TELORA_PRODUCT_ID=your-product-uuid
18
+
19
+ # Repository path (optional, defaults to cwd)
20
+ TELORA_REPO_PATH=/path/to/your/repo
21
+
22
+ # Claude Code executable (optional, defaults to 'claude')
23
+ CLAUDE_CODE_PATH=claude
24
+
25
+ # MCP configuration file (optional)
26
+ # If set, daemon passes this to spawned Claude Code instances
27
+ MCP_CONFIG_PATH=/path/to/mcp-config.json
28
+
29
+ # Log directory (optional, defaults to .telora/logs in repo)
30
+ TELORA_LOG_DIR=/path/to/logs
31
+
32
+ # Worktree directory for parallel agent branches (optional, defaults to .telora/worktrees in repo)
33
+ # Each agent session gets its own worktree for branch isolation
34
+ TELORA_WORKTREE_DIR=/path/to/worktrees
35
+
36
+ # Integration branch (optional, defaults to 'integration')
37
+ # Agents merge their work to this branch on successful completion instead of main.
38
+ # Human reviewers promote changes from integration to main after review.
39
+ TELORA_INTEGRATION_BRANCH=integration
40
+
41
+ # Session limits (optional)
42
+ MAX_TOTAL_SESSIONS=5
43
+ SESSION_TIMEOUT_MS=3600000
44
+ TOKEN_LIMIT=200000
45
+ COST_LIMIT=10.0
46
+
47
+ # Merge lock settings (optional)
48
+ # How long to wait for the merge lock before timing out (ms, default: 300000 = 5 min)
49
+ MERGE_LOCK_TIMEOUT_MS=300000
50
+ # Log a contention warning if lock acquisition takes longer than this (ms, default: 30000 = 30s)
51
+ MERGE_LOCK_CONTENTION_WARNING_MS=30000
52
+
53
+ # Guard evaluation failure mode (optional, default: fail-open)
54
+ # "fail-open" = allow transition when guard evaluation errors
55
+ # "fail-closed" = block transition when guard evaluation errors
56
+ TELORA_POLICY_FAILURE_MODE=fail-open
57
+
58
+ # Log retention policy (optional)
59
+ # Delete log files older than this many days (default: 7)
60
+ LOG_MAX_AGE_DAYS=7
61
+ # Maximum total size of all log files in bytes (default: 1073741824 = 1 GB)
62
+ LOG_MAX_TOTAL_BYTES=1073741824
63
+ # Maximum number of log files to keep (default: 500)
64
+ LOG_MAX_FILES=500
package/README.md ADDED
@@ -0,0 +1,229 @@
1
+ # @telora/daemon
2
+
3
+ Agent orchestration daemon for Telora - spawns and manages Claude Code instances to work on deliveries autonomously.
4
+
5
+ ## Overview
6
+
7
+ The Telora daemon watches for active strategies in your Telora organization and spawns Claude Code Agent Teams to execute them. Each strategy gets a single Agent Team that coordinates work across all deliveries and issues.
8
+
9
+ Key features:
10
+ - **Strategy-level Agent Teams**: One team per strategy manages all deliveries, building a task DAG and coordinating parallel execution
11
+ - **Multi-repo support**: Multiple daemons can run against the same Telora org, each handling strategies for different repos
12
+ - **Integration branch workflow**: Teams work on isolated branches, auto-merge to integration on success
13
+ - **Worktree isolation**: Each team gets its own git worktree
14
+ - **Dynamic delivery pickup**: Teams detect and incorporate new deliveries added mid-execution
15
+
16
+ ## Installation
17
+
18
+ The `@telora/daemon` package is published to an internal Gitea npm registry. You need registry access before installing.
19
+
20
+ ```bash
21
+ # Configure npm to use the Telora registry for @telora packages
22
+ # Replace the URL below with your organization's Gitea instance URL
23
+ echo '@telora:registry=https://<your-gitea-host>/api/packages/syntelyos/npm/' >> ~/.npmrc
24
+
25
+ # Global installation
26
+ npm install -g @telora/daemon
27
+
28
+ # Or run directly with npx
29
+ npx @telora/daemon
30
+ ```
31
+
32
+ > **Note:** The registry URL is organization-specific. Ask your team lead for the correct URL if you don't have it. The registry requires a valid npm token for authentication.
33
+
34
+ ## Quick Start
35
+
36
+ ### Option 1: Interactive Setup (Recommended)
37
+
38
+ ```bash
39
+ cd /path/to/your/repo
40
+ npx @telora/daemon init
41
+ ```
42
+
43
+ The setup wizard will guide you through:
44
+ - Telora URL configuration
45
+ - Organization ID
46
+ - Integration branch name
47
+ - Max concurrent agents
48
+
49
+ Then set your tracker ID and start the daemon:
50
+
51
+ ```bash
52
+ export TELORA_TRACKER_ID=your-tracker-id-here
53
+ telora-daemon
54
+ ```
55
+
56
+ ### Option 2: Manual Setup
57
+
58
+ 1. **Get your Tracker ID** from Telora:
59
+ - Go to Settings → AI Work Trackers
60
+ - Click "Generate Tracker ID" on your profile
61
+ - Copy the tracker ID
62
+
63
+ 2. **Configure environment variables** in your repo:
64
+
65
+ ```bash
66
+ cd /path/to/your/repo
67
+
68
+ # Create .env file
69
+ cat > .env << EOF
70
+ TELORA_URL=https://your-telora-instance.supabase.co
71
+ TELORA_TRACKER_ID=your-tracker-id-here
72
+ TELORA_ORGANIZATION_ID=your-org-id-here
73
+ EOF
74
+ ```
75
+
76
+ 3. **Start the daemon**:
77
+
78
+ ```bash
79
+ telora-daemon
80
+ ```
81
+
82
+ ## Configuration
83
+
84
+ The daemon is configured via environment variables:
85
+
86
+ | Variable | Required | Default | Description |
87
+ |----------|----------|---------|-------------|
88
+ | `TELORA_URL` | Yes | - | Telora API URL |
89
+ | `TELORA_TRACKER_ID` | Yes | - | Your tracker ID for authentication |
90
+ | `TELORA_ORGANIZATION_ID` | Yes | - | Organization to watch for work |
91
+ | `TELORA_REPO_PATH` | No | `cwd()` | Path to git repository |
92
+ | `TELORA_INTEGRATION_BRANCH` | No | `integration` | Branch for agent merges |
93
+ | `TELORA_WORKTREE_DIR` | No | `.telora/worktrees` | Directory for git worktrees |
94
+ | `TELORA_LOG_DIR` | No | `.telora/logs` | Directory for agent logs |
95
+ | `CLAUDE_CODE_PATH` | No | `claude` | Path to Claude Code executable |
96
+ | `MCP_CONFIG_PATH` | No | - | Path to MCP config file |
97
+ | `MAX_TOTAL_SESSIONS` | No | `5` | Max concurrent agents |
98
+ | `SESSION_TIMEOUT_MS` | No | `3600000` | Session timeout (1 hour) |
99
+ | `TOKEN_LIMIT` | No | `200000` | Max tokens per session |
100
+ | `COST_LIMIT` | No | `10.0` | Max cost per session ($) |
101
+
102
+ ## CLI Options
103
+
104
+ ```bash
105
+ telora-daemon [options]
106
+
107
+ Options:
108
+ -V, --version Output version number
109
+ -v, --verbose Enable verbose logging
110
+ -c, --config <path> Path to config file (default: .telora/daemon.json)
111
+ --dry-run Print configuration and exit
112
+ -h, --help Display help
113
+ ```
114
+
115
+ ## Config File
116
+
117
+ Instead of environment variables, you can use a JSON config file. The daemon looks for `.telora/daemon.json` by default.
118
+
119
+ ```json
120
+ {
121
+ "teloraUrl": "https://your-telora-instance.supabase.co",
122
+ "organizationId": "your-organization-uuid",
123
+ "productId": "your-product-uuid",
124
+ "integrationBranch": "integration",
125
+ "maxTotalSessions": 5
126
+ }
127
+ ```
128
+
129
+ **Configuration priority** (highest to lowest):
130
+ 1. Environment variables
131
+ 2. Config file values
132
+ 3. Default values
133
+
134
+ **Security note:** The `trackerId` must always be set via the `TELORA_TRACKER_ID` environment variable. It cannot be set in the config file (which is safe to commit to git).
135
+
136
+ Available config file fields:
137
+ - `teloraUrl` - Telora API URL
138
+ - `organizationId` - Organization UUID
139
+ - `productId` - Product UUID (scopes daemon to one product; omit to handle all)
140
+ - `repoPath` - Repository path
141
+ - `worktreeDir` - Worktree directory
142
+ - `integrationBranch` - Integration branch name
143
+ - `claudeCodePath` - Claude Code executable path
144
+ - `mcpConfigPath` - MCP config file path
145
+ - `logDir` - Log directory
146
+ - `maxTotalSessions` - Max concurrent agents
147
+ - `sessionTimeoutMs` - Session timeout in milliseconds
148
+ - `tokenLimit` - Max tokens per session
149
+ - `costLimit` - Max cost per session in dollars
150
+
151
+ ## How It Works
152
+
153
+ ### Strategy Team Execution Model
154
+
155
+ 1. **Strategy polling**: The daemon polls Telora every 30 seconds for active strategies with an assigned agent role and queued deliveries
156
+ 2. **Filtering**: Only picks up strategies for the configured `productId` (if set)
157
+ 3. **Team spawning**: For each ready strategy, spawns a single Claude Code Agent Team (one team per strategy)
158
+ 4. **Task DAG**: The team lead reads all deliveries and issues, builds a dependency graph respecting delivery priority and file overlap
159
+ 5. **Parallel execution**: Workers execute issues in parallel where safe (no file conflicts), sequentially where needed
160
+ 6. **Delivery progression**: As issues complete, deliveries advance through workflow stages (coding -> verify -> done)
161
+ 7. **Merge on success**: When all deliveries are complete, the strategy branch is merged to integration
162
+ 8. **Dynamic pickup**: If new deliveries are added to the strategy mid-execution, the team incorporates them automatically
163
+
164
+ ### Key daemon modules
165
+
166
+ - `strategy-executor.ts` - Strategy team lifecycle (spawn, monitor, completion)
167
+ - `task-dag-builder.ts` - Pure function that builds dependency graphs from deliveries/issues
168
+ - `strategy-prompt-builder.ts` - Builds the team lead's prompt with all context
169
+ - `delivery-lifecycle.ts` - Extracted guard evaluation, stage transition, git merge functions
170
+ - `completion-handler.ts` - Per-delivery completion (used by team lead for sub-delivery transitions)
171
+ - `spawner.ts` - Process spawning with Agent Teams mode always enabled
172
+
173
+ ## Multi-Repo Setup
174
+
175
+ To run agents on multiple repositories:
176
+
177
+ 1. Set `productId` in each daemon's `.telora/daemon.json` (or `TELORA_PRODUCT_ID` env var)
178
+ 2. Run one daemon per repository:
179
+
180
+ ```bash
181
+ # Terminal 1 - Repo A (productId set in .telora/daemon.json)
182
+ cd /path/to/repo-a
183
+ telora-daemon
184
+
185
+ # Terminal 2 - Repo B (productId set in .telora/daemon.json)
186
+ cd /path/to/repo-b
187
+ telora-daemon
188
+ ```
189
+
190
+ Each daemon only picks up deliveries for the configured product.
191
+
192
+ ## Signals
193
+
194
+ - `SIGINT` / `SIGTERM`: Graceful shutdown (waits for agents to checkpoint)
195
+ - `SIGUSR1`: Print status of running agents
196
+
197
+ ## Running in Production vs Development
198
+
199
+ **For production use**, always run the daemon with the compiled version:
200
+
201
+ ```bash
202
+ # Global install (recommended)
203
+ npm install -g @telora/daemon
204
+ telora-daemon
205
+
206
+ # Or from source
207
+ cd packages/daemon
208
+ npm run build
209
+ npm start
210
+ ```
211
+
212
+ **Do NOT use `npm run dev`** (watch mode) when agents are running. The file watcher will restart the daemon whenever source files change, which kills any running agents and may leave sessions in a stuck "running" state.
213
+
214
+ If you need to modify daemon code while agents are working:
215
+ 1. Wait for agents to complete
216
+ 2. Or stop the daemon gracefully (Ctrl+C)
217
+ 3. Make your changes
218
+ 4. Restart the daemon
219
+
220
+ ## Requirements
221
+
222
+ - Node.js 20+
223
+ - Claude Code CLI (`claude`) installed and authenticated
224
+ - Git repository with write access
225
+ - Active Telora account with AI Work Tracker
226
+
227
+ ## License
228
+
229
+ MIT
@@ -0,0 +1,4 @@
1
+ {
2
+ "commitSha": "9f5498a7",
3
+ "builtAt": "2026-03-18T10:09:18.751Z"
4
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Daemon-specific ActivityTracker -- thin wrapper around @telora/daemon-core.
3
+ *
4
+ * Re-exports the shared ActivitySnapshot type and provides a daemon-specific
5
+ * ActivityTracker subclass that flushes snapshots to agent_sessions via
6
+ * updateSession().
7
+ */
8
+ import { ActivityTracker as CoreActivityTracker, type ActivitySnapshot } from '@telora/daemon-core';
9
+ export type { ActivitySnapshot };
10
+ export declare class ActivityTracker extends CoreActivityTracker {
11
+ constructor(sessionId: string);
12
+ }
13
+ //# sourceMappingURL=activity-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-tracker.d.ts","sourceRoot":"","sources":["../src/activity-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,IAAI,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGpG,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC,qBAAa,eAAgB,SAAQ,mBAAmB;gBAC1C,SAAS,EAAE,MAAM;CAO9B"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Daemon-specific ActivityTracker -- thin wrapper around @telora/daemon-core.
3
+ *
4
+ * Re-exports the shared ActivitySnapshot type and provides a daemon-specific
5
+ * ActivityTracker subclass that flushes snapshots to agent_sessions via
6
+ * updateSession().
7
+ */
8
+ import { ActivityTracker as CoreActivityTracker } from '@telora/daemon-core';
9
+ import { updateSession } from './queries/sessions.js';
10
+ export class ActivityTracker extends CoreActivityTracker {
11
+ constructor(sessionId) {
12
+ super(sessionId, async (snapshot) => {
13
+ await updateSession(sessionId, {
14
+ activity_summary: snapshot,
15
+ });
16
+ });
17
+ }
18
+ }
19
+ //# sourceMappingURL=activity-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-tracker.js","sourceRoot":"","sources":["../src/activity-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,IAAI,mBAAmB,EAAyB,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAItD,MAAM,OAAO,eAAgB,SAAQ,mBAAmB;IACtD,YAAY,SAAiB;QAC3B,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,QAA0B,EAAE,EAAE;YACpD,MAAM,aAAa,CAAC,SAAS,EAAE;gBAC7B,gBAAgB,EAAE,QAA8C;aACjE,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Shared agent state module -- breaks the circular dependency between
3
+ * heartbeat.ts and spawner.ts by centralizing state that both modules need.
4
+ *
5
+ * Contains:
6
+ * - Running agents map (read by heartbeat, written by spawner)
7
+ * - Session completion counters (written by spawner/completion-handler, read by heartbeat)
8
+ * - Activity tracking (written by spawner/listener, read by heartbeat)
9
+ */
10
+ import type { RunningAgent } from './types.js';
11
+ /**
12
+ * Get map of running agents.
13
+ */
14
+ export declare function getRunningAgents(): Map<string, RunningAgent>;
15
+ /**
16
+ * Record a completed session (called by spawner when an agent finishes).
17
+ */
18
+ export declare function recordSessionCompleted(tokens: number, cost: number): void;
19
+ /**
20
+ * Get current session completion counters (read by heartbeat).
21
+ */
22
+ export declare function getSessionCounters(): {
23
+ completedSessionCount: number;
24
+ totalTokensUsed: number;
25
+ totalCost: number;
26
+ };
27
+ /**
28
+ * Bootstrap session counters from database values.
29
+ * Called by heartbeat on startup to reflect cumulative history.
30
+ */
31
+ export declare function setSessionCounters(counters: {
32
+ completedSessionCount: number;
33
+ totalTokensUsed: number;
34
+ totalCost: number;
35
+ }): void;
36
+ /**
37
+ * Record daemon activity. Call this whenever meaningful work occurs
38
+ * (spawning agents, completing sessions, polling, merges, etc.).
39
+ */
40
+ export declare function recordActivity(): void;
41
+ /**
42
+ * Get the last activity timestamp (for diagnostics/testing).
43
+ */
44
+ export declare function getLastActivityAt(): Date;
45
+ //# sourceMappingURL=agent-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-state.d.ts","sourceRoot":"","sources":["../src/agent-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/C;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAE5D;AAQD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAIzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB,CAEA;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE;IAC3C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAIP;AAMD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Shared agent state module -- breaks the circular dependency between
3
+ * heartbeat.ts and spawner.ts by centralizing state that both modules need.
4
+ *
5
+ * Contains:
6
+ * - Running agents map (read by heartbeat, written by spawner)
7
+ * - Session completion counters (written by spawner/completion-handler, read by heartbeat)
8
+ * - Activity tracking (written by spawner/listener, read by heartbeat)
9
+ */
10
+ // ── Running agents map ──────────────────────────────────────────────
11
+ /** Running agents map: sessionId -> RunningAgent */
12
+ const runningAgents = new Map();
13
+ /**
14
+ * Get map of running agents.
15
+ */
16
+ export function getRunningAgents() {
17
+ return runningAgents;
18
+ }
19
+ // ── Session completion counters ─────────────────────────────────────
20
+ let completedSessionCount = 0;
21
+ let totalTokensUsed = 0;
22
+ let totalCost = 0;
23
+ /**
24
+ * Record a completed session (called by spawner when an agent finishes).
25
+ */
26
+ export function recordSessionCompleted(tokens, cost) {
27
+ completedSessionCount++;
28
+ totalTokensUsed += tokens;
29
+ totalCost += cost;
30
+ }
31
+ /**
32
+ * Get current session completion counters (read by heartbeat).
33
+ */
34
+ export function getSessionCounters() {
35
+ return { completedSessionCount, totalTokensUsed, totalCost };
36
+ }
37
+ /**
38
+ * Bootstrap session counters from database values.
39
+ * Called by heartbeat on startup to reflect cumulative history.
40
+ */
41
+ export function setSessionCounters(counters) {
42
+ completedSessionCount = counters.completedSessionCount;
43
+ totalTokensUsed = counters.totalTokensUsed;
44
+ totalCost = counters.totalCost;
45
+ }
46
+ // ── Activity tracking ───────────────────────────────────────────────
47
+ let lastActivityAt = new Date();
48
+ /**
49
+ * Record daemon activity. Call this whenever meaningful work occurs
50
+ * (spawning agents, completing sessions, polling, merges, etc.).
51
+ */
52
+ export function recordActivity() {
53
+ lastActivityAt = new Date();
54
+ }
55
+ /**
56
+ * Get the last activity timestamp (for diagnostics/testing).
57
+ */
58
+ export function getLastActivityAt() {
59
+ return lastActivityAt;
60
+ }
61
+ //# sourceMappingURL=agent-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-state.js","sourceRoot":"","sources":["../src/agent-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,uEAAuE;AAEvE,oDAAoD;AACpD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,uEAAuE;AAEvE,IAAI,qBAAqB,GAAG,CAAC,CAAC;AAC9B,IAAI,eAAe,GAAG,CAAC,CAAC;AACxB,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,IAAY;IACjE,qBAAqB,EAAE,CAAC;IACxB,eAAe,IAAI,MAAM,CAAC;IAC1B,SAAS,IAAI,IAAI,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAKhC,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAIlC;IACC,qBAAqB,GAAG,QAAQ,CAAC,qBAAqB,CAAC;IACvD,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC;IAC3C,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;AACjC,CAAC;AAED,uEAAuE;AAEvE,IAAI,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Pre-commit hook management for read-only audit sessions.
3
+ *
4
+ * Installs a git pre-commit hook in a worktree that blocks all commits,
5
+ * providing an informative message about the read-only audit mode.
6
+ */
7
+ /**
8
+ * Install a pre-commit hook in a worktree that blocks all commits.
9
+ * Used for read-only audit sessions.
10
+ */
11
+ export declare function installAuditPreCommitHook(worktreePath: string): void;
12
+ //# sourceMappingURL=audit-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-hooks.d.ts","sourceRoot":"","sources":["../src/audit-hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAiCpE"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Pre-commit hook management for read-only audit sessions.
3
+ *
4
+ * Installs a git pre-commit hook in a worktree that blocks all commits,
5
+ * providing an informative message about the read-only audit mode.
6
+ */
7
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { runGitSync } from './git-types.js';
10
+ /**
11
+ * Install a pre-commit hook in a worktree that blocks all commits.
12
+ * Used for read-only audit sessions.
13
+ */
14
+ export function installAuditPreCommitHook(worktreePath) {
15
+ // Create a custom hooks directory inside the worktree
16
+ const hooksDir = join(worktreePath, '.telora-hooks');
17
+ if (!existsSync(hooksDir)) {
18
+ mkdirSync(hooksDir, { recursive: true });
19
+ }
20
+ const hookScript = [
21
+ '#!/bin/bash',
22
+ 'echo ""',
23
+ 'echo "========================================================"',
24
+ 'echo " READ-ONLY AUDIT SESSION"',
25
+ 'echo "========================================================"',
26
+ 'echo ""',
27
+ 'echo " Commits are blocked. This session operates in"',
28
+ 'echo " read-only audit mode by design."',
29
+ 'echo ""',
30
+ 'echo " Your job is discovery only:"',
31
+ 'echo " - Log findings as issues via MCP tools"',
32
+ 'echo " - Create remediation deliveries for fixes"',
33
+ 'echo " - Do NOT modify or commit code changes"',
34
+ 'echo ""',
35
+ 'echo "========================================================"',
36
+ 'echo ""',
37
+ 'exit 1',
38
+ '',
39
+ ].join('\n');
40
+ const hookPath = join(hooksDir, 'pre-commit');
41
+ writeFileSync(hookPath, hookScript, { mode: 0o755 });
42
+ // Point this worktree's git config at the custom hooks directory
43
+ runGitSync(['config', 'core.hooksPath', hooksDir], worktreePath);
44
+ }
45
+ //# sourceMappingURL=audit-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-hooks.js","sourceRoot":"","sources":["../src/audit-hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,YAAoB;IAC5D,sDAAsD;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,UAAU,GAAG;QACjB,aAAa;QACb,SAAS;QACT,iEAAiE;QACjE,kCAAkC;QAClC,iEAAiE;QACjE,SAAS;QACT,wDAAwD;QACxD,0CAA0C;QAC1C,SAAS;QACT,sCAAsC;QACtC,iDAAiD;QACjD,oDAAoD;QACpD,iDAAiD;QACjD,SAAS;QACT,iEAAiE;QACjE,SAAS;QACT,QAAQ;QACR,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC9C,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAErD,iEAAiE;IACjE,UAAU,CAAC,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Daemon auto-update module.
3
+ *
4
+ * Periodically checks the npm registry for a newer version of @telora/daemon.
5
+ * When an update is detected and all engines are idle, installs the new version
6
+ * globally and signals the process to exit with code 75 (restart-after-update).
7
+ *
8
+ * A wrapper script or systemd RestartForceExitStatus=75 handles the actual
9
+ * process restart, which then runs the newly installed version.
10
+ */
11
+ /** Exit code that signals "restart after self-update". */
12
+ export declare const EXIT_CODE_UPDATE = 75;
13
+ export interface AutoUpdateOptions {
14
+ /** Current daemon version string (e.g., "0.10.48"). */
15
+ currentVersion: string;
16
+ /** npm package name (default: "@telora/daemon"). */
17
+ packageName?: string;
18
+ /** Check interval in milliseconds (default: 3600000 = 1 hour). */
19
+ intervalMs?: number;
20
+ /** Callback that returns true when all engines are idle. */
21
+ isIdle: () => boolean;
22
+ /** Called when update is installed and the process should exit with code 75. */
23
+ onUpdateReady: () => void;
24
+ }
25
+ /**
26
+ * Run `npm install -g <package>@latest` as a child process.
27
+ * Returns true on success, false on failure.
28
+ */
29
+ export declare function performSelfUpdate(packageName: string): Promise<boolean>;
30
+ /**
31
+ * Start a periodic auto-update check loop.
32
+ *
33
+ * Each cycle:
34
+ * 1. Check npm registry for a newer version
35
+ * 2. If update available and engines are idle, install it
36
+ * 3. On successful install, call onUpdateReady (which triggers exit 75)
37
+ * 4. If engines are busy, defer to the next cycle
38
+ *
39
+ * Returns a cleanup function that stops the timer.
40
+ */
41
+ export declare function startAutoUpdateLoop(opts: AutoUpdateOptions): () => void;
42
+ //# sourceMappingURL=auto-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAInC,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB,gFAAgF;IAChF,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBvE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAgEvE"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Daemon auto-update module.
3
+ *
4
+ * Periodically checks the npm registry for a newer version of @telora/daemon.
5
+ * When an update is detected and all engines are idle, installs the new version
6
+ * globally and signals the process to exit with code 75 (restart-after-update).
7
+ *
8
+ * A wrapper script or systemd RestartForceExitStatus=75 handles the actual
9
+ * process restart, which then runs the newly installed version.
10
+ */
11
+ import { execFile } from 'node:child_process';
12
+ import { checkForUpdates } from './version-check.js';
13
+ /** Exit code that signals "restart after self-update". */
14
+ export const EXIT_CODE_UPDATE = 75;
15
+ const DEFAULT_INTERVAL_MS = 3_600_000; // 1 hour
16
+ /**
17
+ * Run `npm install -g <package>@latest` as a child process.
18
+ * Returns true on success, false on failure.
19
+ */
20
+ export function performSelfUpdate(packageName) {
21
+ return new Promise((resolve) => {
22
+ const target = `${packageName}@latest`;
23
+ console.log(`[auto-update] Installing ${target}...`);
24
+ execFile('npm', ['install', '-g', target], { timeout: 120_000 }, (err, stdout, stderr) => {
25
+ if (err) {
26
+ console.warn(`[auto-update] npm install failed: ${err.message}`);
27
+ if (stderr)
28
+ console.warn(`[auto-update] stderr: ${stderr.trim()}`);
29
+ resolve(false);
30
+ return;
31
+ }
32
+ if (stdout.trim())
33
+ console.log(`[auto-update] ${stdout.trim()}`);
34
+ console.log(`[auto-update] Successfully installed ${target}`);
35
+ resolve(true);
36
+ });
37
+ });
38
+ }
39
+ /**
40
+ * Start a periodic auto-update check loop.
41
+ *
42
+ * Each cycle:
43
+ * 1. Check npm registry for a newer version
44
+ * 2. If update available and engines are idle, install it
45
+ * 3. On successful install, call onUpdateReady (which triggers exit 75)
46
+ * 4. If engines are busy, defer to the next cycle
47
+ *
48
+ * Returns a cleanup function that stops the timer.
49
+ */
50
+ export function startAutoUpdateLoop(opts) {
51
+ const { currentVersion, packageName = '@telora/daemon', intervalMs = DEFAULT_INTERVAL_MS, isIdle, onUpdateReady, } = opts;
52
+ let pendingVersion = null;
53
+ let stopped = false;
54
+ async function tick() {
55
+ if (stopped)
56
+ return;
57
+ try {
58
+ // If we already know about a pending update, skip the registry check
59
+ if (!pendingVersion) {
60
+ const result = await checkForUpdates(currentVersion, packageName);
61
+ if (result?.updateAvailable) {
62
+ pendingVersion = result.latestVersion;
63
+ console.log(`[auto-update] Update available: v${result.latestVersion} (current: v${currentVersion})`);
64
+ }
65
+ }
66
+ if (!pendingVersion)
67
+ return;
68
+ // Only update when idle
69
+ if (!isIdle()) {
70
+ console.log('[auto-update] Engines are busy, deferring update to next cycle');
71
+ return;
72
+ }
73
+ // Install the update
74
+ const ok = await performSelfUpdate(packageName);
75
+ if (!ok) {
76
+ // Reset so we retry the install next cycle
77
+ console.warn('[auto-update] Install failed, will retry next cycle');
78
+ return;
79
+ }
80
+ // Signal the shell to restart
81
+ onUpdateReady();
82
+ }
83
+ catch (err) {
84
+ console.warn(`[auto-update] Unexpected error: ${err instanceof Error ? err.message : String(err)}`);
85
+ }
86
+ }
87
+ const timer = setInterval(() => void tick(), intervalMs);
88
+ // Don't block process exit
89
+ timer.unref();
90
+ console.log(`[auto-update] Enabled (check every ${Math.round(intervalMs / 60_000)}min)`);
91
+ return () => {
92
+ stopped = true;
93
+ clearInterval(timer);
94
+ };
95
+ }
96
+ //# sourceMappingURL=auto-update.js.map