@telora/daemon 0.15.1 → 0.15.3

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 (356) hide show
  1. package/README.md +11 -11
  2. package/build-info.json +2 -2
  3. package/dist/assembly-engine.d.ts +1 -1
  4. package/dist/assembly-engine.d.ts.map +1 -1
  5. package/dist/assembly-resolvers.js +41 -41
  6. package/dist/assembly-resolvers.js.map +1 -1
  7. package/dist/branch-status.d.ts +4 -4
  8. package/dist/branch-status.d.ts.map +1 -1
  9. package/dist/branch-status.js +23 -23
  10. package/dist/branch-status.js.map +1 -1
  11. package/dist/cli/connect.js +1 -1
  12. package/dist/cli/connect.js.map +1 -1
  13. package/dist/completion-detector.d.ts +1 -1
  14. package/dist/completion-detector.js +1 -1
  15. package/dist/completion-handler.d.ts +1 -1
  16. package/dist/completion-handler.js +4 -4
  17. package/dist/completion-handler.js.map +1 -1
  18. package/dist/condition-evaluators.js +4 -4
  19. package/dist/condition-evaluators.js.map +1 -1
  20. package/dist/control-state.d.ts +6 -6
  21. package/dist/control-state.d.ts.map +1 -1
  22. package/dist/control-state.js +43 -43
  23. package/dist/control-state.js.map +1 -1
  24. package/dist/crash-recovery-scan.d.ts +1 -1
  25. package/dist/crash-recovery-scan.js +20 -20
  26. package/dist/crash-recovery-scan.js.map +1 -1
  27. package/dist/crash-recovery-types.d.ts +3 -3
  28. package/dist/crash-recovery-types.d.ts.map +1 -1
  29. package/dist/crash-recovery-types.js +2 -2
  30. package/dist/crash-recovery-types.js.map +1 -1
  31. package/dist/crash-recovery.d.ts +3 -3
  32. package/dist/crash-recovery.d.ts.map +1 -1
  33. package/dist/crash-recovery.js +21 -21
  34. package/dist/crash-recovery.js.map +1 -1
  35. package/dist/daemon-process.d.ts +1 -1
  36. package/dist/daemon-process.d.ts.map +1 -1
  37. package/dist/dag-validator.d.ts +6 -6
  38. package/dist/dag-validator.d.ts.map +1 -1
  39. package/dist/dag-validator.js +2 -2
  40. package/dist/dag-validator.js.map +1 -1
  41. package/dist/delivery-guards.d.ts +1 -1
  42. package/dist/delivery-guards.js +1 -1
  43. package/dist/delivery-lifecycle.d.ts +5 -5
  44. package/dist/delivery-lifecycle.d.ts.map +1 -1
  45. package/dist/delivery-lifecycle.js +12 -12
  46. package/dist/delivery-lifecycle.js.map +1 -1
  47. package/dist/delivery-merge.js +1 -1
  48. package/dist/delivery-merge.js.map +1 -1
  49. package/dist/dependency-resolver.d.ts +7 -7
  50. package/dist/dependency-resolver.d.ts.map +1 -1
  51. package/dist/dependency-resolver.js.map +1 -1
  52. package/dist/directive-executor.d.ts +15 -15
  53. package/dist/directive-executor.d.ts.map +1 -1
  54. package/dist/directive-executor.js +76 -76
  55. package/dist/directive-executor.js.map +1 -1
  56. package/dist/evaluation-context.d.ts +2 -2
  57. package/dist/evaluation-context.d.ts.map +1 -1
  58. package/dist/evaluation-context.js +4 -4
  59. package/dist/evaluation-context.js.map +1 -1
  60. package/dist/focus-completion-event.d.ts +97 -0
  61. package/dist/focus-completion-event.d.ts.map +1 -0
  62. package/dist/focus-completion-event.js +257 -0
  63. package/dist/focus-completion-event.js.map +1 -0
  64. package/dist/focus-completion.d.ts +85 -0
  65. package/dist/focus-completion.d.ts.map +1 -0
  66. package/dist/focus-completion.js +459 -0
  67. package/dist/focus-completion.js.map +1 -0
  68. package/dist/focus-engine.d.ts +47 -0
  69. package/dist/focus-engine.d.ts.map +1 -0
  70. package/dist/focus-engine.js +421 -0
  71. package/dist/focus-engine.js.map +1 -0
  72. package/dist/focus-executor.d.ts +55 -0
  73. package/dist/focus-executor.d.ts.map +1 -0
  74. package/dist/focus-executor.js +549 -0
  75. package/dist/focus-executor.js.map +1 -0
  76. package/dist/focus-lifecycle.d.ts +61 -0
  77. package/dist/focus-lifecycle.d.ts.map +1 -0
  78. package/dist/focus-lifecycle.js +544 -0
  79. package/dist/focus-lifecycle.js.map +1 -0
  80. package/dist/focus-merge.d.ts +77 -0
  81. package/dist/focus-merge.d.ts.map +1 -0
  82. package/dist/focus-merge.js +378 -0
  83. package/dist/focus-merge.js.map +1 -0
  84. package/dist/focus-prompt-builder.d.ts +35 -0
  85. package/dist/focus-prompt-builder.d.ts.map +1 -0
  86. package/dist/focus-prompt-builder.js +138 -0
  87. package/dist/focus-prompt-builder.js.map +1 -0
  88. package/dist/focus-provisioning.d.ts +16 -0
  89. package/dist/focus-provisioning.d.ts.map +1 -0
  90. package/dist/focus-provisioning.js +119 -0
  91. package/dist/focus-provisioning.js.map +1 -0
  92. package/dist/focus-spawn-helpers.d.ts +67 -0
  93. package/dist/focus-spawn-helpers.d.ts.map +1 -0
  94. package/dist/focus-spawn-helpers.js +160 -0
  95. package/dist/focus-spawn-helpers.js.map +1 -0
  96. package/dist/focus-team-lifecycle.d.ts +50 -0
  97. package/dist/focus-team-lifecycle.d.ts.map +1 -0
  98. package/dist/focus-team-lifecycle.js +256 -0
  99. package/dist/focus-team-lifecycle.js.map +1 -0
  100. package/dist/focus-team-state.d.ts +24 -0
  101. package/dist/focus-team-state.d.ts.map +1 -0
  102. package/dist/focus-team-state.js +43 -0
  103. package/dist/focus-team-state.js.map +1 -0
  104. package/dist/focus-worktree-state.d.ts +47 -0
  105. package/dist/focus-worktree-state.d.ts.map +1 -0
  106. package/dist/focus-worktree-state.js +104 -0
  107. package/dist/focus-worktree-state.js.map +1 -0
  108. package/dist/git-merge.d.ts +5 -5
  109. package/dist/git-merge.d.ts.map +1 -1
  110. package/dist/git-merge.js +5 -5
  111. package/dist/git-merge.js.map +1 -1
  112. package/dist/git-state-detector.d.ts +1 -1
  113. package/dist/git-state-detector.js +9 -9
  114. package/dist/git-state-detector.js.map +1 -1
  115. package/dist/git-utils.d.ts +1 -1
  116. package/dist/git-utils.js +1 -1
  117. package/dist/git.d.ts +2 -2
  118. package/dist/git.d.ts.map +1 -1
  119. package/dist/git.js +3 -3
  120. package/dist/git.js.map +1 -1
  121. package/dist/heartbeat.d.ts +4 -4
  122. package/dist/heartbeat.d.ts.map +1 -1
  123. package/dist/heartbeat.js +7 -7
  124. package/dist/heartbeat.js.map +1 -1
  125. package/dist/index.d.ts +1 -1
  126. package/dist/index.js +10 -10
  127. package/dist/index.js.map +1 -1
  128. package/dist/listener-auto-advance.d.ts +2 -2
  129. package/dist/listener-auto-advance.js +21 -21
  130. package/dist/listener-auto-advance.js.map +1 -1
  131. package/dist/listener.d.ts +12 -12
  132. package/dist/listener.d.ts.map +1 -1
  133. package/dist/listener.js +80 -75
  134. package/dist/listener.js.map +1 -1
  135. package/dist/loop-engine.d.ts +20 -20
  136. package/dist/loop-engine.d.ts.map +1 -1
  137. package/dist/loop-engine.js +82 -82
  138. package/dist/loop-engine.js.map +1 -1
  139. package/dist/loop-event-bus.d.ts +5 -5
  140. package/dist/loop-event-bus.d.ts.map +1 -1
  141. package/dist/loop-event-bus.js +3 -3
  142. package/dist/loop-llm-client.d.ts +1 -1
  143. package/dist/loop-llm-client.js +1 -1
  144. package/dist/loop-variance.d.ts +1 -1
  145. package/dist/loop-variance.js +1 -1
  146. package/dist/merge-detector.d.ts +6 -6
  147. package/dist/merge-detector.d.ts.map +1 -1
  148. package/dist/merge-detector.js +47 -47
  149. package/dist/merge-detector.js.map +1 -1
  150. package/dist/otlp-log-parser.js +2 -2
  151. package/dist/otlp-log-parser.js.map +1 -1
  152. package/dist/otlp-metric-parser.js +1 -1
  153. package/dist/otlp-metric-parser.js.map +1 -1
  154. package/dist/otlp-receiver.d.ts +1 -1
  155. package/dist/otlp-receiver.js +7 -7
  156. package/dist/otlp-receiver.js.map +1 -1
  157. package/dist/otlp-types.d.ts +1 -1
  158. package/dist/otlp-types.d.ts.map +1 -1
  159. package/dist/otlp-types.js +3 -3
  160. package/dist/otlp-types.js.map +1 -1
  161. package/dist/output-monitor.d.ts +6 -6
  162. package/dist/output-monitor.d.ts.map +1 -1
  163. package/dist/output-monitor.js +11 -11
  164. package/dist/output-monitor.js.map +1 -1
  165. package/dist/planning-prompt-builder.d.ts +17 -15
  166. package/dist/planning-prompt-builder.d.ts.map +1 -1
  167. package/dist/planning-prompt-builder.js +34 -32
  168. package/dist/planning-prompt-builder.js.map +1 -1
  169. package/dist/pm/mitigation-correlator.d.ts +7 -7
  170. package/dist/pm/mitigation-correlator.d.ts.map +1 -1
  171. package/dist/pm/mitigation-correlator.js +33 -33
  172. package/dist/pm/mitigation-correlator.js.map +1 -1
  173. package/dist/pm-engine.js +1 -1
  174. package/dist/pm-engine.js.map +1 -1
  175. package/dist/prompt-builder.d.ts +1 -1
  176. package/dist/prompt-builder.js +9 -9
  177. package/dist/prompt-builder.js.map +1 -1
  178. package/dist/prompts/starter-prompt.d.ts +2 -2
  179. package/dist/prompts/starter-prompt.d.ts.map +1 -1
  180. package/dist/prompts/starter-prompt.js +6 -6
  181. package/dist/qa-crash-recovery.d.ts +10 -10
  182. package/dist/qa-crash-recovery.d.ts.map +1 -1
  183. package/dist/qa-crash-recovery.js +32 -32
  184. package/dist/qa-crash-recovery.js.map +1 -1
  185. package/dist/qa-dev-server.d.ts +3 -3
  186. package/dist/qa-dev-server.d.ts.map +1 -1
  187. package/dist/qa-dev-server.js +3 -3
  188. package/dist/qa-dev-server.js.map +1 -1
  189. package/dist/qa-orchestrator.d.ts +18 -18
  190. package/dist/qa-orchestrator.d.ts.map +1 -1
  191. package/dist/qa-orchestrator.js +47 -47
  192. package/dist/qa-orchestrator.js.map +1 -1
  193. package/dist/qa-provisioner.d.ts +3 -3
  194. package/dist/qa-provisioner.d.ts.map +1 -1
  195. package/dist/qa-provisioner.js +14 -14
  196. package/dist/qa-provisioner.js.map +1 -1
  197. package/dist/qa-state.d.ts +10 -10
  198. package/dist/qa-state.d.ts.map +1 -1
  199. package/dist/qa-state.js +11 -11
  200. package/dist/qa-state.js.map +1 -1
  201. package/dist/queries/control-state.d.ts +5 -5
  202. package/dist/queries/control-state.d.ts.map +1 -1
  203. package/dist/queries/control-state.js +4 -4
  204. package/dist/queries/control-state.js.map +1 -1
  205. package/dist/queries/deliveries.d.ts +28 -24
  206. package/dist/queries/deliveries.d.ts.map +1 -1
  207. package/dist/queries/deliveries.js +32 -28
  208. package/dist/queries/deliveries.js.map +1 -1
  209. package/dist/queries/focuses.d.ts +97 -0
  210. package/dist/queries/focuses.d.ts.map +1 -0
  211. package/dist/queries/focuses.js +136 -0
  212. package/dist/queries/focuses.js.map +1 -0
  213. package/dist/queries/index.d.ts +3 -3
  214. package/dist/queries/index.d.ts.map +1 -1
  215. package/dist/queries/index.js +2 -2
  216. package/dist/queries/index.js.map +1 -1
  217. package/dist/queries/qa.d.ts +16 -16
  218. package/dist/queries/qa.d.ts.map +1 -1
  219. package/dist/queries/qa.js +22 -22
  220. package/dist/queries/qa.js.map +1 -1
  221. package/dist/queries/schemas.d.ts +40 -34
  222. package/dist/queries/schemas.d.ts.map +1 -1
  223. package/dist/queries/schemas.js +31 -26
  224. package/dist/queries/schemas.js.map +1 -1
  225. package/dist/queries/sessions.d.ts +1 -1
  226. package/dist/queries/sessions.d.ts.map +1 -1
  227. package/dist/queries/sessions.js +2 -2
  228. package/dist/queries/sessions.js.map +1 -1
  229. package/dist/queries/shared.js +10 -10
  230. package/dist/queries/shared.js.map +1 -1
  231. package/dist/queries/workflows.d.ts +1 -1
  232. package/dist/queries/workflows.js +1 -1
  233. package/dist/queries/worktrees.d.ts +7 -7
  234. package/dist/queries/worktrees.d.ts.map +1 -1
  235. package/dist/queries/worktrees.js +7 -7
  236. package/dist/queries/worktrees.js.map +1 -1
  237. package/dist/review-defect-detector.d.ts +125 -0
  238. package/dist/review-defect-detector.d.ts.map +1 -0
  239. package/dist/review-defect-detector.js +289 -0
  240. package/dist/review-defect-detector.js.map +1 -0
  241. package/dist/session-lifecycle.d.ts +17 -17
  242. package/dist/session-lifecycle.d.ts.map +1 -1
  243. package/dist/session-lifecycle.js +82 -82
  244. package/dist/session-lifecycle.js.map +1 -1
  245. package/dist/spawn-cooldown.d.ts +8 -8
  246. package/dist/spawn-cooldown.d.ts.map +1 -1
  247. package/dist/spawn-cooldown.js +15 -15
  248. package/dist/spawn-cooldown.js.map +1 -1
  249. package/dist/spawn-environment.d.ts +2 -2
  250. package/dist/spawn-environment.d.ts.map +1 -1
  251. package/dist/spawn-environment.js +3 -3
  252. package/dist/spawn-environment.js.map +1 -1
  253. package/dist/spawner-lifecycle.d.ts +2 -2
  254. package/dist/spawner-lifecycle.d.ts.map +1 -1
  255. package/dist/spawner-lifecycle.js +3 -3
  256. package/dist/spawner-lifecycle.js.map +1 -1
  257. package/dist/spawner-resolution.d.ts +3 -3
  258. package/dist/spawner-resolution.d.ts.map +1 -1
  259. package/dist/spawner-resolution.js +4 -4
  260. package/dist/spawner-resolution.js.map +1 -1
  261. package/dist/spawner-stream-handlers.js +2 -2
  262. package/dist/spawner-stream-handlers.js.map +1 -1
  263. package/dist/spawner.d.ts +1 -1
  264. package/dist/spawner.d.ts.map +1 -1
  265. package/dist/spawner.js +6 -6
  266. package/dist/spawner.js.map +1 -1
  267. package/dist/stage-classifier.d.ts +1 -1
  268. package/dist/stage-classifier.js +1 -1
  269. package/dist/state-cascade.d.ts +25 -25
  270. package/dist/state-cascade.d.ts.map +1 -1
  271. package/dist/state-cascade.js +89 -89
  272. package/dist/state-cascade.js.map +1 -1
  273. package/dist/strategy-completion-event.d.ts +37 -3
  274. package/dist/strategy-completion-event.d.ts.map +1 -1
  275. package/dist/strategy-completion-event.js +78 -9
  276. package/dist/strategy-completion-event.js.map +1 -1
  277. package/dist/strategy-completion.d.ts +11 -0
  278. package/dist/strategy-completion.d.ts.map +1 -1
  279. package/dist/strategy-completion.js +22 -1
  280. package/dist/strategy-completion.js.map +1 -1
  281. package/dist/strategy-executor.d.ts.map +1 -1
  282. package/dist/strategy-executor.js +46 -14
  283. package/dist/strategy-executor.js.map +1 -1
  284. package/dist/strategy-merge.d.ts.map +1 -1
  285. package/dist/strategy-merge.js +4 -0
  286. package/dist/strategy-merge.js.map +1 -1
  287. package/dist/strategy-team-lifecycle.d.ts.map +1 -1
  288. package/dist/strategy-team-lifecycle.js +3 -0
  289. package/dist/strategy-team-lifecycle.js.map +1 -1
  290. package/dist/supabase.d.ts +4 -4
  291. package/dist/supabase.d.ts.map +1 -1
  292. package/dist/supabase.js +5 -5
  293. package/dist/supabase.js.map +1 -1
  294. package/dist/task-converter.d.ts +4 -4
  295. package/dist/task-converter.d.ts.map +1 -1
  296. package/dist/task-converter.js +1 -1
  297. package/dist/task-converter.js.map +1 -1
  298. package/dist/team-prompt-base.d.ts +59 -19
  299. package/dist/team-prompt-base.d.ts.map +1 -1
  300. package/dist/team-prompt-base.js +206 -25
  301. package/dist/team-prompt-base.js.map +1 -1
  302. package/dist/team-spawner.d.ts +9 -9
  303. package/dist/team-spawner.d.ts.map +1 -1
  304. package/dist/team-spawner.js +87 -83
  305. package/dist/team-spawner.js.map +1 -1
  306. package/dist/telemetry-writer.d.ts +2 -2
  307. package/dist/telemetry-writer.d.ts.map +1 -1
  308. package/dist/templates/claude-md.js +8 -8
  309. package/dist/templates/claude-settings.d.ts +1 -1
  310. package/dist/templates/claude-settings.js +2 -2
  311. package/dist/templates/claude-settings.js.map +1 -1
  312. package/dist/trigger-executor.d.ts +4 -4
  313. package/dist/trigger-executor.d.ts.map +1 -1
  314. package/dist/trigger-executor.js +11 -11
  315. package/dist/trigger-executor.js.map +1 -1
  316. package/dist/types/dag.d.ts +1 -1
  317. package/dist/types/delivery.d.ts +3 -3
  318. package/dist/types/delivery.d.ts.map +1 -1
  319. package/dist/types/focus.d.ts +214 -0
  320. package/dist/types/focus.d.ts.map +1 -0
  321. package/dist/types/focus.js +5 -0
  322. package/dist/types/focus.js.map +1 -0
  323. package/dist/types/index.d.ts +1 -1
  324. package/dist/types/index.d.ts.map +1 -1
  325. package/dist/types/index.js +1 -1
  326. package/dist/types/index.js.map +1 -1
  327. package/dist/types/merge.d.ts +1 -1
  328. package/dist/types/session.d.ts +2 -2
  329. package/dist/types/session.d.ts.map +1 -1
  330. package/dist/types/strategy.d.ts +7 -0
  331. package/dist/types/strategy.d.ts.map +1 -1
  332. package/dist/unified-engine-lifecycle.js +11 -11
  333. package/dist/unified-engine-lifecycle.js.map +1 -1
  334. package/dist/unified-init.d.ts +1 -1
  335. package/dist/unified-init.js +9 -9
  336. package/dist/unified-init.js.map +1 -1
  337. package/dist/unified-shell-config.d.ts +4 -4
  338. package/dist/unified-shell-config.d.ts.map +1 -1
  339. package/dist/unified-shell-config.js +5 -5
  340. package/dist/unified-shell-config.js.map +1 -1
  341. package/dist/unified-shell-status.js +3 -3
  342. package/dist/unified-shell-status.js.map +1 -1
  343. package/dist/unified-shell.d.ts +1 -1
  344. package/dist/unified-shell.js +4 -4
  345. package/dist/unified-shell.js.map +1 -1
  346. package/dist/workflow-engine.d.ts +1 -1
  347. package/dist/workflow-engine.d.ts.map +1 -1
  348. package/dist/worktree-focus.d.ts +69 -0
  349. package/dist/worktree-focus.d.ts.map +1 -0
  350. package/dist/worktree-focus.js +214 -0
  351. package/dist/worktree-focus.js.map +1 -0
  352. package/dist/worktree.d.ts +10 -10
  353. package/dist/worktree.d.ts.map +1 -1
  354. package/dist/worktree.js +39 -39
  355. package/dist/worktree.js.map +1 -1
  356. package/package.json +2 -2
@@ -0,0 +1,459 @@
1
+ /**
2
+ * Focus team completion handling.
3
+ *
4
+ * Manages the post-execution lifecycle: advancing delivery statuses
5
+ * based on issue completion, merging the focus branch, cleaning up
6
+ * worktrees, and updating session records.
7
+ */
8
+ import { filterWorkIssues, filterContextGroups, ACTIVE_WORK_STATUSES } from './constants.js';
9
+ import { updateSession, reportGitState, getDeliveryIssues, getDeliverySessionCount, updateIssueStatus, fetchEffectiveWorkflow, updateDeliveryStatus, getActiveFocuses, } from './supabase.js';
10
+ import { hasPendingSpawnDirective } from './directive-executor.js';
11
+ import { advanceDeliveryStage } from './delivery-lifecycle.js';
12
+ import { withRetry } from '@telora/daemon-core';
13
+ import { mergeFocusBranch, escalateMergeConflict } from './focus-merge.js';
14
+ import { mergeIntegrationToMain } from './git-merge.js';
15
+ import { recordSessionCompleted } from './agent-state.js';
16
+ import { triggerCheck } from './listener.js';
17
+ import { emitLoopTrigger } from './loop-event-bus.js';
18
+ import { getActiveTeams } from './focus-team-state.js';
19
+ import { commitWipChanges, worktreeHasUncommittedChanges, branchHasUnmergedCommits, runGitSync } from './git.js';
20
+ import { computeGitDiffStats } from './git-utils.js';
21
+ import { getFocusDeliveries, updateFocusStatus, fetchFocusWorkflowWithTransitions } from './queries/focuses.js';
22
+ // ── Stage classification (re-exported for consumers) ─────────────────
23
+ import { isStatusAgentActionable } from './stage-classifier.js';
24
+ export { isStatusTerminal, isStatusAgentActionable } from './stage-classifier.js';
25
+ // ── Merge gate ───────────────────────────────────────────────────────
26
+ /**
27
+ * Decide whether to attempt mergeFocusBranch on team exit.
28
+ *
29
+ * Skip merge when:
30
+ * - The team did not succeed (failed exit or unclean shutdown), OR
31
+ * - The team is still in its planning phase (no deliveries scoped, nothing
32
+ * to merge -- this covers cancellation mid-planning).
33
+ *
34
+ * Exported for unit testing the gate logic in isolation.
35
+ */
36
+ export function shouldAttemptMerge(succeeded, teamState) {
37
+ return succeeded && !teamState.planningPhase;
38
+ }
39
+ /**
40
+ * Handle the team lead process exiting.
41
+ *
42
+ * Responsibilities:
43
+ * - Report git state for all known deliveries
44
+ * - Advance delivery statuses based on issue completion
45
+ * - Merge focus branch to integration (if successful)
46
+ * - Clean up worktree
47
+ * - Update session record
48
+ * - Record heartbeat counters
49
+ * - Trigger re-poll for next work
50
+ */
51
+ export async function handleTeamCompletion(params) {
52
+ const { config, teamState, sessionId, code, signal } = params;
53
+ const { focusId, focusName, organizationId, branchName } = teamState;
54
+ const worktreePath = teamState.worktreePath;
55
+ const exitCode = code ?? 1;
56
+ // Proactive termination: when the daemon terminates a team because all work
57
+ // is done (no open issues, all deliveries terminal, etc.), it sets
58
+ // shutdownReason = 'work_complete' before sending SIGTERM.
59
+ // Node.js may report SIGTERM as either signal='SIGTERM' or code=143 (128+15)
60
+ const wasSigterm = signal === 'SIGTERM' || exitCode === 143;
61
+ const proactivelyTerminated = teamState.phase === 'shutting_down' &&
62
+ wasSigterm &&
63
+ teamState.shutdownReason === 'work_complete';
64
+ const succeeded = exitCode === 0 || proactivelyTerminated;
65
+ let exitReason = exitCode === 0
66
+ ? 'Focus team completed.'
67
+ : proactivelyTerminated
68
+ ? teamState.mergedDeliveryIds.size > 0
69
+ ? `Focus team terminated: ${teamState.mergedDeliveryIds.size} deliveries merged.`
70
+ : 'Focus team terminated: all work complete.'
71
+ : signal
72
+ ? `Team lead terminated by signal: ${signal}`
73
+ : `Team lead exited with code: ${exitCode}`;
74
+ // Fetch fresh delivery list to include mid-flight additions
75
+ let allDeliveries;
76
+ try {
77
+ allDeliveries = await getFocusDeliveries(focusId);
78
+ }
79
+ catch (err) {
80
+ console.warn(`[focus-executor] Failed to fetch deliveries for gitState reporting, falling back to knownDeliveryIds:`, err.message);
81
+ // Empty knownDeliveryIds (planning teams that exited without scoping) yields
82
+ // an empty fallback array -- subsequent loops are intentional no-ops.
83
+ allDeliveries = [...teamState.knownDeliveryIds].map(id => ({
84
+ id, name: '', description: null, priorityRank: 0,
85
+ executionStatus: 'coding', acceptanceCriteria: null,
86
+ techContext: null, currentWorkflowStageId: null,
87
+ mergeCommitSha: null, gitState: null,
88
+ stageDescription: null,
89
+ }));
90
+ }
91
+ // Only report git state for deliveries the team actually worked on:
92
+ // those in coding status (not queued — queued means work never started),
93
+ // excluding already-merged ones.
94
+ const workedDeliveryIds = allDeliveries
95
+ .filter(d => d.executionStatus === 'coding' &&
96
+ !teamState.mergedDeliveryIds.has(d.id))
97
+ .map(d => d.id);
98
+ // Report worktree_complete for worked deliveries only
99
+ for (const deliveryId of workedDeliveryIds) {
100
+ reportGitState(deliveryId, 'worktree_complete').catch(err => console.warn(`[focus-executor] reportGitState worktree_complete failed for ${deliveryId}:`, err.message));
101
+ }
102
+ // ── Read-only audit safety net ──────────────────────────────────
103
+ // If this was a read-only session, revert any file modifications and
104
+ // block merging if the agent somehow committed despite the pre-commit hook.
105
+ if (teamState.readOnly) {
106
+ // Revert any uncommitted changes
107
+ const hasChanges = worktreeHasUncommittedChanges(worktreePath);
108
+ if (hasChanges) {
109
+ console.warn(`[focus-executor] Read-only audit "${focusName}" left uncommitted changes. Reverting.`);
110
+ runGitSync(['checkout', '.'], worktreePath);
111
+ runGitSync(['clean', '-fd'], worktreePath);
112
+ }
113
+ // Check if the agent somehow committed (bypassed hook)
114
+ if (branchHasUnmergedCommits(branchName, config.integrationBranch, config.repoPath)) {
115
+ console.error(`[focus-executor] READ-ONLY VIOLATION: Audit "${focusName}" has commits on ${branchName}. ` +
116
+ `These will NOT be merged. Manual review required.`);
117
+ exitReason = `Read-only audit violation: commits detected on ${branchName}. Merge skipped.`;
118
+ // Update session as failed due to read-only violation
119
+ try {
120
+ await withRetry(() => updateSession(sessionId, {
121
+ status: 'failed',
122
+ exit_reason: exitReason,
123
+ exit_category: 'error',
124
+ ended_at: new Date().toISOString(),
125
+ }), { maxAttempts: 3, baseDelayMs: 1000, label: 'session-update-readonly-violation' });
126
+ }
127
+ catch (err) {
128
+ console.warn(`[focus-executor] Failed to update session after retries:`, err.message);
129
+ }
130
+ // Record heartbeat and clean up
131
+ recordSessionCompleted(0, 0);
132
+ const activeTeams = getActiveTeams();
133
+ teamState.phase = 'terminated';
134
+ activeTeams.delete(focusId);
135
+ return;
136
+ }
137
+ }
138
+ // Commit any uncommitted WIP changes left by the agent (crash, kill, timeout).
139
+ // Only needed when the agent didn't exit cleanly — a clean exit means the
140
+ // agent committed its own work.
141
+ if (!succeeded) {
142
+ try {
143
+ commitWipChanges(worktreePath, focusName);
144
+ }
145
+ catch (err) {
146
+ console.warn(`[focus-executor] WIP commit failed for "${focusName}": ${err.message}`);
147
+ }
148
+ }
149
+ // Advance delivery statuses based on issue completion
150
+ if (succeeded) {
151
+ await advanceDeliveryStatuses(config, teamState, sessionId);
152
+ }
153
+ // Merge focus branch to integration if team succeeded.
154
+ // For proactive terminations, this is a no-op merge since all deliveries
155
+ // were already merged mid-flight. The merge still runs for safety
156
+ // (handles any commits the team lead made after the last incremental merge).
157
+ // Pass workedDeliveryIds so git state is only reported for deliveries
158
+ // that were actually in coding status (not queued deliveries that never started).
159
+ //
160
+ // Planning-phase exit: if the team exited while still in planning (no
161
+ // deliveries scoped), skip the merge entirely. There is nothing to merge
162
+ // and the merge guard would early-return anyway. Skipping makes the cleanup
163
+ // path explicit for cancellation mid-planning.
164
+ let mergeSucceeded = false;
165
+ if (shouldAttemptMerge(succeeded, teamState)) {
166
+ const mergeResult = await mergeFocusBranch(config, teamState, sessionId, branchName, workedDeliveryIds);
167
+ mergeSucceeded = mergeResult.mergeSucceeded;
168
+ if (mergeResult.exitReason) {
169
+ exitReason += ` ${mergeResult.exitReason}`;
170
+ }
171
+ // Escalate merge failure for worked deliveries only
172
+ if (!mergeSucceeded) {
173
+ for (const deliveryId of workedDeliveryIds) {
174
+ if (!teamState.mergedDeliveryIds.has(deliveryId)) {
175
+ escalateMergeConflict({
176
+ organizationId,
177
+ sessionId,
178
+ deliveryId,
179
+ deliveryName: focusName,
180
+ branchName,
181
+ integrationBranch: config.integrationBranch,
182
+ mergeError: mergeResult.exitReason,
183
+ }).catch(err => console.warn(`[focus-executor] escalateMergeConflict failed for ${deliveryId}:`, err.message));
184
+ }
185
+ }
186
+ }
187
+ }
188
+ // ── CI: merge integration → main ──────────────────────────────
189
+ // When CI is enabled, merge the integration branch into main after
190
+ // a successful focus merge. CD additionally pushes main to remote.
191
+ if (mergeSucceeded && teamState.pipelineConfig?.ci?.enabled) {
192
+ const pushToRemote = teamState.pipelineConfig?.cd?.enabled ?? false;
193
+ const ciLabel = pushToRemote ? 'CI+CD' : 'CI';
194
+ console.log(`[${ciLabel}] Merging integration to main for "${focusName}"${pushToRemote ? ' (will push to remote)' : ''}`);
195
+ try {
196
+ const ciResult = await mergeIntegrationToMain({
197
+ config,
198
+ focusName,
199
+ pushToRemote,
200
+ });
201
+ if (ciResult.success) {
202
+ console.log(`[${ciLabel}] Successfully merged integration to main for "${focusName}"`);
203
+ // Update git state for worked deliveries
204
+ for (const deliveryId of workedDeliveryIds) {
205
+ const newState = pushToRemote ? 'pushed_to_remote' : 'merged_to_main';
206
+ reportGitState(deliveryId, newState).catch(err => console.warn(`[${ciLabel}] reportGitState ${newState} failed for ${deliveryId}:`, err.message));
207
+ }
208
+ exitReason += ` ${ciLabel}: merged to main${pushToRemote ? ' and pushed to remote' : ''}.`;
209
+ }
210
+ else {
211
+ console.error(`[${ciLabel}] Failed to merge integration to main for "${focusName}": ${ciResult.error}`);
212
+ exitReason += ` ${ciLabel} failed: ${ciResult.error}`;
213
+ }
214
+ }
215
+ catch (err) {
216
+ console.error(`[${ciLabel}] Error merging integration to main for "${focusName}":`, err.message);
217
+ exitReason += ` ${ciLabel} error: ${err.message}`;
218
+ }
219
+ }
220
+ // Worktree is focus-owned — do NOT remove on team completion.
221
+ // It persists for the next team session or QA use.
222
+ // Removal only happens via coordinated teardown when focus is deactivated.
223
+ // Compute git diff stats from all commits on this branch since integration
224
+ let diffStats = { linesAdded: 0, linesRemoved: 0 };
225
+ try {
226
+ diffStats = computeGitDiffStats(worktreePath, `${config.integrationBranch}..${branchName}`);
227
+ }
228
+ catch (err) {
229
+ console.debug(`[focus-executor] Failed to compute git diff stats for "${focusName}":`, err.message);
230
+ }
231
+ // Determine exit category for failed sessions
232
+ const exitCategory = succeeded
233
+ ? null
234
+ : teamState.shutdownReason === 'user_stopped'
235
+ ? 'user_stopped'
236
+ : 'error';
237
+ // Update session
238
+ try {
239
+ await withRetry(() => updateSession(sessionId, {
240
+ status: succeeded ? 'completed' : 'failed',
241
+ exit_reason: exitReason,
242
+ ...(exitCategory ? { exit_category: exitCategory } : {}),
243
+ ended_at: new Date().toISOString(),
244
+ lines_added: diffStats.linesAdded,
245
+ lines_removed: diffStats.linesRemoved,
246
+ }), { maxAttempts: 3, baseDelayMs: 1000, label: 'session-update-completion' });
247
+ }
248
+ catch (err) {
249
+ console.warn(`[focus-executor] Failed to update session after retries:`, err.message);
250
+ }
251
+ // Review exit handler: if the focus is in in_review when the review
252
+ // team exits, route deliveries based on outcome:
253
+ // - Deliveries with open issues → iterating (review found gaps)
254
+ // - Deliveries with no open issues → done (review passed)
255
+ // Then move the focus back to verify.
256
+ try {
257
+ const focuses = await getActiveFocuses(organizationId, teamState.productId);
258
+ const current = focuses.find(s => s.focus_id === focusId);
259
+ if (current?.status === 'in_review') {
260
+ // If a spawn directive is pending, the team was terminated to make room
261
+ // for a new team (e.g., directive executor spawning the review team).
262
+ // Don't run the review exit handler — the new team will handle it.
263
+ if (hasPendingSpawnDirective(focusId)) {
264
+ console.log(`[focus-executor] Skipping review exit handler for "${focusName}" -- pending spawn directive`);
265
+ }
266
+ else {
267
+ // Route in_review deliveries based on review outcome:
268
+ // - Has open issues (review found gaps) → iterating
269
+ // - No open issues (review passed) → done
270
+ const reviewDeliveries = await getFocusDeliveries(focusId);
271
+ for (const d of reviewDeliveries) {
272
+ if (d.executionStatus === 'in_review') {
273
+ try {
274
+ const [issues, dWorkflow] = await Promise.all([
275
+ getDeliveryIssues(d.id),
276
+ fetchEffectiveWorkflow(d.id),
277
+ ]);
278
+ const workIssues = filterWorkIssues(issues);
279
+ const openWork = workIssues.filter(i => ACTIVE_WORK_STATUSES.has(i.status));
280
+ if (openWork.length > 0) {
281
+ // Review created issues — send back to iterating for the team to address
282
+ const iteratingStage = dWorkflow.stages.find(s => s.name === 'iterating');
283
+ await updateDeliveryStatus(d.id, 'iterating', iteratingStage?.id ?? null);
284
+ console.log(`[focus-executor] Delivery "${d.name}" moved from in_review to iterating: ${openWork.length} open issue(s)`);
285
+ }
286
+ else {
287
+ // Review passed — move to done
288
+ const doneStage = dWorkflow.stages.find(s => s.name === 'done');
289
+ await updateDeliveryStatus(d.id, 'done', doneStage?.id ?? null);
290
+ console.log(`[focus-executor] Delivery "${d.name}" moved from in_review to done (review passed)`);
291
+ }
292
+ }
293
+ catch (err) {
294
+ console.warn(`[focus-executor] Failed to route delivery "${d.name}" after review: ${err.message}`);
295
+ }
296
+ }
297
+ }
298
+ // Move focus back to verify
299
+ const workflow = await fetchFocusWorkflowWithTransitions(focusId);
300
+ const verifyStage = workflow.stages.find(s => s.name === 'verify');
301
+ if (verifyStage) {
302
+ await updateFocusStatus(focusId, 'verify', verifyStage.id, { reviewRequestedAt: null });
303
+ console.log(`[focus-executor] Review complete for "${focusName}" -- focus moved to verify`);
304
+ emitLoopTrigger({
305
+ type: 'review_completed',
306
+ focusId,
307
+ detail: `review complete -- "${focusName}" moved to verify`,
308
+ });
309
+ }
310
+ } // end if !hasPendingSpawnDirective
311
+ }
312
+ }
313
+ catch (err) {
314
+ console.warn(`[focus-executor] Review exit handler failed for "${focusName}":`, err.message);
315
+ }
316
+ // Record heartbeat
317
+ recordSessionCompleted(0, 0);
318
+ // Clean up team state
319
+ const activeTeams = getActiveTeams();
320
+ teamState.phase = 'terminated';
321
+ activeTeams.delete(focusId);
322
+ // Trigger re-poll to pick up next work
323
+ if (succeeded) {
324
+ triggerCheck();
325
+ }
326
+ console.log(`[focus-executor] Team for "${focusName}" cleaned up (merge: ${mergeSucceeded ? 'yes' : 'no'})`);
327
+ }
328
+ const defaultDeps = {
329
+ getFocusDeliveries,
330
+ getDeliveryIssues,
331
+ getDeliverySessionCount,
332
+ updateIssueStatus,
333
+ fetchEffectiveWorkflow,
334
+ updateDeliveryStatus,
335
+ advanceDeliveryStage,
336
+ };
337
+ /**
338
+ * Advance delivery statuses after team completion.
339
+ *
340
+ * Re-queries all deliveries for the focus from the database rather
341
+ * than relying on the spawn-time snapshot in teamState.knownDeliveryIds.
342
+ * This ensures deliveries added mid-flight (after the team was spawned)
343
+ * are discovered and advanced, and that stale deliveryStageIds don't
344
+ * cause deliveries to be skipped.
345
+ *
346
+ * For each delivery in 'coding' status:
347
+ * - All issues Done (or no issues): advance via workflow (coding -> verify -> done)
348
+ * - Open issues remain: re-queue to 'queued' so the next team session picks it up
349
+ */
350
+ export async function advanceDeliveryStatuses(config, teamState, sessionId, deps = defaultDeps) {
351
+ // Re-query deliveries fresh from the DB to discover mid-flight additions
352
+ let deliveries;
353
+ try {
354
+ deliveries = await deps.getFocusDeliveries(teamState.focusId);
355
+ }
356
+ catch (err) {
357
+ console.warn(`[focus-executor] Failed to fetch deliveries for focus ${teamState.focusId}:`, err.message);
358
+ return;
359
+ }
360
+ for (const delivery of deliveries) {
361
+ // Skip deliveries that were already merged mid-flight
362
+ if (teamState.mergedDeliveryIds.has(delivery.id)) {
363
+ continue;
364
+ }
365
+ // Only advance deliveries in agent-actionable status.
366
+ if (!isStatusAgentActionable(delivery.executionStatus ?? '')) {
367
+ continue;
368
+ }
369
+ try {
370
+ const [issues, sessionCount, workflow] = await Promise.all([
371
+ deps.getDeliveryIssues(delivery.id),
372
+ deps.getDeliverySessionCount(delivery.id),
373
+ deps.fetchEffectiveWorkflow(delivery.id),
374
+ ]);
375
+ // Context Groups are reference material, not actionable work — exclude from open count
376
+ const workIssues = filterWorkIssues(issues);
377
+ const contextGroups = filterContextGroups(issues);
378
+ const openCount = workIssues.filter(i => i.status !== 'Done').length;
379
+ const totalWork = workIssues.length;
380
+ // Use currentWorkflowStageId from the fresh query, falling back to
381
+ // the teamState cache for deliveries known at spawn time
382
+ const currentStageId = delivery.currentWorkflowStageId
383
+ ?? teamState.deliveryStageIds.get(delivery.id)
384
+ ?? null;
385
+ if (!currentStageId) {
386
+ console.warn(`[focus-executor] Delivery ${delivery.id}: no workflow stage ID, skipping advance`);
387
+ continue;
388
+ }
389
+ // Re-queue deliveries with open work issues so the next team picks them up
390
+ if (totalWork > 0 && openCount > 0) {
391
+ // Already queued — leave it there
392
+ if (delivery.executionStatus === 'queued') {
393
+ continue;
394
+ }
395
+ const queuedStage = workflow.stages.find(s => s.name === 'queued');
396
+ if (queuedStage) {
397
+ console.log(`[focus-executor] Delivery ${delivery.id}: ${openCount}/${totalWork} work issues still open, re-queuing`);
398
+ await deps.updateDeliveryStatus(delivery.id, 'queued', queuedStage.id);
399
+ teamState.deliveryStageIds.set(delivery.id, queuedStage.id);
400
+ }
401
+ else {
402
+ console.warn(`[focus-executor] Delivery ${delivery.id}: ${openCount}/${totalWork} work issues still open, no queued stage in workflow — leaving in ${delivery.executionStatus}`);
403
+ }
404
+ continue;
405
+ }
406
+ // Auto-close Context Groups when all work issues are done
407
+ for (const cg of contextGroups) {
408
+ if (cg.status !== 'Done') {
409
+ try {
410
+ await deps.updateIssueStatus(cg.id, 'Done');
411
+ console.log(`[focus-executor] Auto-closed Context Group "${cg.title}" (all work issues done)`);
412
+ }
413
+ catch (err) {
414
+ console.warn(`[focus-executor] Failed to auto-close Context Group "${cg.title}":`, err.message);
415
+ }
416
+ }
417
+ }
418
+ // If delivery is queued, step through coding first (workflow doesn't
419
+ // allow queued -> verify directly). Update the stage ID for the
420
+ // subsequent advance call.
421
+ let effectiveStageId = currentStageId;
422
+ if (delivery.executionStatus === 'queued') {
423
+ const codingStage = workflow.stages.find(s => s.name === 'coding');
424
+ if (codingStage) {
425
+ console.log(`[focus-executor] Delivery ${delivery.id}: stepping queued -> coding before verify advance`);
426
+ await deps.updateDeliveryStatus(delivery.id, 'coding', codingStage.id);
427
+ effectiveStageId = codingStage.id;
428
+ }
429
+ }
430
+ console.log(`[focus-executor] Delivery ${delivery.id}: ${totalWork === 0 ? 'no issues' : `all ${totalWork} work issues done`}, advancing via workflow`);
431
+ const result = await deps.advanceDeliveryStage({
432
+ deliveryId: delivery.id,
433
+ deliveryName: delivery.name,
434
+ organizationId: teamState.organizationId,
435
+ workflow,
436
+ currentStageId: effectiveStageId,
437
+ exitCode: 0,
438
+ openIssueCount: openCount,
439
+ sessionCount,
440
+ policyFailureMode: config.policyFailureMode,
441
+ sessionId,
442
+ });
443
+ // Track the new stage ID for potential future advances
444
+ teamState.deliveryStageIds.set(delivery.id, result.deliveryStageId ?? null);
445
+ // Notify loop engine of delivery completion (verify or done)
446
+ if (result.advanced && (result.deliveryStatus === 'verify' || result.deliveryStatus === 'done')) {
447
+ emitLoopTrigger({
448
+ type: 'delivery_completed',
449
+ focusId: teamState.focusId,
450
+ detail: `${delivery.name} -> ${result.deliveryStatus}`,
451
+ });
452
+ }
453
+ }
454
+ catch (err) {
455
+ console.warn(`[focus-executor] Failed to check/advance delivery ${delivery.id}:`, err.message);
456
+ }
457
+ }
458
+ }
459
+ //# sourceMappingURL=focus-completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-completion.js","sourceRoot":"","sources":["../src/focus-completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * FocusEngine -- ExecutionEngine adapter for the focus-based daemon.
3
+ *
4
+ * Wraps the existing daemon modules (listener, heartbeat, spawner, git, etc.)
5
+ * behind the ExecutionEngine interface from @telora/daemon-core. This allows
6
+ * the unified process shell to manage the focus engine without knowing
7
+ * its internals.
8
+ *
9
+ * Lifecycle (called by the process shell):
10
+ * 1. init(config) -- validate, connect to Supabase, init git
11
+ * 2. recoverFromCrash() -- reconcile orphaned state from previous run
12
+ * 3. start() -- begin polling loops and heartbeat
13
+ * 4. stop() -- stop accepting new work
14
+ * 5. shutdown() -- graceful cleanup (kill teams, WIP commit, drain)
15
+ */
16
+ import type { ExecutionEngine, EngineHealth, ResourceUsage, BaseConfig } from '@telora/daemon-core';
17
+ import { ResourceGovernor } from '@telora/daemon-core';
18
+ export declare class FocusEngine implements ExecutionEngine {
19
+ readonly name = "focus";
20
+ /** Daemon config, set during init(). */
21
+ private config;
22
+ /** Optional resource governor for global concurrency limiting. */
23
+ private governor;
24
+ /** Interval handles for periodic tasks (cleared in stop/shutdown). */
25
+ private intervals;
26
+ /** Last scanned timestamp for git activity per product (reset on restart). */
27
+ private lastGitScanTimestamps;
28
+ /**
29
+ * Inject a ResourceGovernor for global concurrency limiting.
30
+ * Called by the process shell after construction but before start().
31
+ */
32
+ setGovernor(gov: ResourceGovernor): void;
33
+ init(config: BaseConfig & Record<string, unknown>): Promise<void>;
34
+ recoverFromCrash(): Promise<void>;
35
+ start(): Promise<void>;
36
+ private scanAndUpsertGitActivity;
37
+ stop(): void;
38
+ shutdown(): Promise<void>;
39
+ healthCheck(): EngineHealth;
40
+ getResourceUsage(): ResourceUsage;
41
+ /**
42
+ * Assert that config has been set (init() was called) and return it.
43
+ * Throws a clear error if called before init().
44
+ */
45
+ private requireConfig;
46
+ }
47
+ //# sourceMappingURL=focus-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-engine.d.ts","sourceRoot":"","sources":["../src/focus-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,aAAa,EACb,UAAU,EACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAA2B,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AA0ChF,qBAAa,WAAY,YAAW,eAAe;IACjD,QAAQ,CAAC,IAAI,WAAW;IAExB,wCAAwC;IACxC,OAAO,CAAC,MAAM,CAA6B;IAE3C,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAiC;IAEjD,sEAAsE;IACtE,OAAO,CAAC,SAAS,CAAwC;IAEzD,8EAA8E;IAC9E,OAAO,CAAC,qBAAqB,CAA6B;IAE1D;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI;IAUlC,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCjE,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoGjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAkEd,wBAAwB;IA+BtC,IAAI,IAAI,IAAI;IAeN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAsH/B,WAAW,IAAI,YAAY;IA0D3B,gBAAgB,IAAI,aAAa;IAwBjC;;;OAGG;IACH,OAAO,CAAC,aAAa;CAStB"}