@amsterdamdatalabs/enact-operator 0.1.2

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 (377) hide show
  1. package/README.md +33 -0
  2. package/dist/index.d.ts +24 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +24 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lanes/autopilot/index.d.ts +95 -0
  7. package/dist/lanes/autopilot/index.d.ts.map +1 -0
  8. package/dist/lanes/autopilot/index.js +499 -0
  9. package/dist/lanes/autopilot/index.js.map +1 -0
  10. package/dist/lanes/ralph/index.d.ts +118 -0
  11. package/dist/lanes/ralph/index.d.ts.map +1 -0
  12. package/dist/lanes/ralph/index.js +680 -0
  13. package/dist/lanes/ralph/index.js.map +1 -0
  14. package/dist/lanes/team/index.d.ts +110 -0
  15. package/dist/lanes/team/index.d.ts.map +1 -0
  16. package/dist/lanes/team/index.js +748 -0
  17. package/dist/lanes/team/index.js.map +1 -0
  18. package/dist/lanes/team/roles.d.ts +15 -0
  19. package/dist/lanes/team/roles.d.ts.map +1 -0
  20. package/dist/lanes/team/roles.js +89 -0
  21. package/dist/lanes/team/roles.js.map +1 -0
  22. package/dist/lanes/ultrawork/burst.d.ts +69 -0
  23. package/dist/lanes/ultrawork/burst.d.ts.map +1 -0
  24. package/dist/lanes/ultrawork/burst.js +254 -0
  25. package/dist/lanes/ultrawork/burst.js.map +1 -0
  26. package/dist/lanes/ultrawork/index.d.ts +159 -0
  27. package/dist/lanes/ultrawork/index.d.ts.map +1 -0
  28. package/dist/lanes/ultrawork/index.js +919 -0
  29. package/dist/lanes/ultrawork/index.js.map +1 -0
  30. package/dist/lanes/ultrawork/phases.d.ts +57 -0
  31. package/dist/lanes/ultrawork/phases.d.ts.map +1 -0
  32. package/dist/lanes/ultrawork/phases.js +116 -0
  33. package/dist/lanes/ultrawork/phases.js.map +1 -0
  34. package/dist/mcp/activation.d.ts +5 -0
  35. package/dist/mcp/activation.d.ts.map +1 -0
  36. package/dist/mcp/activation.js +234 -0
  37. package/dist/mcp/activation.js.map +1 -0
  38. package/dist/mcp/cli.d.ts +11 -0
  39. package/dist/mcp/cli.d.ts.map +1 -0
  40. package/dist/mcp/cli.js +140 -0
  41. package/dist/mcp/cli.js.map +1 -0
  42. package/dist/mcp/continuation.d.ts +5 -0
  43. package/dist/mcp/continuation.d.ts.map +1 -0
  44. package/dist/mcp/continuation.js +360 -0
  45. package/dist/mcp/continuation.js.map +1 -0
  46. package/dist/mcp/jobs.d.ts +5 -0
  47. package/dist/mcp/jobs.d.ts.map +1 -0
  48. package/dist/mcp/jobs.js +212 -0
  49. package/dist/mcp/jobs.js.map +1 -0
  50. package/dist/mcp/laneSupport.d.ts +19 -0
  51. package/dist/mcp/laneSupport.d.ts.map +1 -0
  52. package/dist/mcp/laneSupport.js +21 -0
  53. package/dist/mcp/laneSupport.js.map +1 -0
  54. package/dist/mcp/lanes/autopilot.d.ts +5 -0
  55. package/dist/mcp/lanes/autopilot.d.ts.map +1 -0
  56. package/dist/mcp/lanes/autopilot.js +227 -0
  57. package/dist/mcp/lanes/autopilot.js.map +1 -0
  58. package/dist/mcp/lanes/ralph.d.ts +5 -0
  59. package/dist/mcp/lanes/ralph.d.ts.map +1 -0
  60. package/dist/mcp/lanes/ralph.js +392 -0
  61. package/dist/mcp/lanes/ralph.js.map +1 -0
  62. package/dist/mcp/lanes/team.d.ts +5 -0
  63. package/dist/mcp/lanes/team.d.ts.map +1 -0
  64. package/dist/mcp/lanes/team.js +413 -0
  65. package/dist/mcp/lanes/team.js.map +1 -0
  66. package/dist/mcp/lanes/ultrawork.d.ts +5 -0
  67. package/dist/mcp/lanes/ultrawork.d.ts.map +1 -0
  68. package/dist/mcp/lanes/ultrawork.js +497 -0
  69. package/dist/mcp/lanes/ultrawork.js.map +1 -0
  70. package/dist/mcp/linkage.d.ts +5 -0
  71. package/dist/mcp/linkage.d.ts.map +1 -0
  72. package/dist/mcp/linkage.js +126 -0
  73. package/dist/mcp/linkage.js.map +1 -0
  74. package/dist/mcp/planning.d.ts +5 -0
  75. package/dist/mcp/planning.d.ts.map +1 -0
  76. package/dist/mcp/planning.js +584 -0
  77. package/dist/mcp/planning.js.map +1 -0
  78. package/dist/mcp/rpcTransport.d.ts +17 -0
  79. package/dist/mcp/rpcTransport.d.ts.map +1 -0
  80. package/dist/mcp/rpcTransport.js +90 -0
  81. package/dist/mcp/rpcTransport.js.map +1 -0
  82. package/dist/mcp/schemas/ralphVerify.d.ts +32 -0
  83. package/dist/mcp/schemas/ralphVerify.d.ts.map +1 -0
  84. package/dist/mcp/schemas/ralphVerify.js +20 -0
  85. package/dist/mcp/schemas/ralphVerify.js.map +1 -0
  86. package/dist/mcp/server.d.ts +5 -0
  87. package/dist/mcp/server.d.ts.map +1 -0
  88. package/dist/mcp/server.js +176 -0
  89. package/dist/mcp/server.js.map +1 -0
  90. package/dist/mcp/system.d.ts +5 -0
  91. package/dist/mcp/system.d.ts.map +1 -0
  92. package/dist/mcp/system.js +445 -0
  93. package/dist/mcp/system.js.map +1 -0
  94. package/dist/mcp/toolFilter.d.ts +2 -0
  95. package/dist/mcp/toolFilter.d.ts.map +1 -0
  96. package/dist/mcp/toolFilter.js +2 -0
  97. package/dist/mcp/toolFilter.js.map +1 -0
  98. package/dist/mcp/toolPartitions.d.ts +20 -0
  99. package/dist/mcp/toolPartitions.d.ts.map +1 -0
  100. package/dist/mcp/toolPartitions.js +280 -0
  101. package/dist/mcp/toolPartitions.js.map +1 -0
  102. package/dist/mcp/toolRuntime.d.ts +9 -0
  103. package/dist/mcp/toolRuntime.d.ts.map +1 -0
  104. package/dist/mcp/toolRuntime.js +179 -0
  105. package/dist/mcp/toolRuntime.js.map +1 -0
  106. package/dist/mcp/workflow.d.ts +12 -0
  107. package/dist/mcp/workflow.d.ts.map +1 -0
  108. package/dist/mcp/workflow.js +723 -0
  109. package/dist/mcp/workflow.js.map +1 -0
  110. package/dist/operator/hooks/hookDispatcher.d.ts +39 -0
  111. package/dist/operator/hooks/hookDispatcher.d.ts.map +1 -0
  112. package/dist/operator/hooks/hookDispatcher.js +58 -0
  113. package/dist/operator/hooks/hookDispatcher.js.map +1 -0
  114. package/dist/operator/hooks/hookGating.d.ts +28 -0
  115. package/dist/operator/hooks/hookGating.d.ts.map +1 -0
  116. package/dist/operator/hooks/hookGating.js +61 -0
  117. package/dist/operator/hooks/hookGating.js.map +1 -0
  118. package/dist/operator/hooks/hooks.d.ts +20 -0
  119. package/dist/operator/hooks/hooks.d.ts.map +1 -0
  120. package/dist/operator/hooks/hooks.js +124 -0
  121. package/dist/operator/hooks/hooks.js.map +1 -0
  122. package/dist/operator/hooks/toolGuardHooks.d.ts +86 -0
  123. package/dist/operator/hooks/toolGuardHooks.d.ts.map +1 -0
  124. package/dist/operator/hooks/toolGuardHooks.js +163 -0
  125. package/dist/operator/hooks/toolGuardHooks.js.map +1 -0
  126. package/dist/operator/hud.d.ts +115 -0
  127. package/dist/operator/hud.d.ts.map +1 -0
  128. package/dist/operator/hud.js +229 -0
  129. package/dist/operator/hud.js.map +1 -0
  130. package/dist/operator/missions.d.ts +125 -0
  131. package/dist/operator/missions.d.ts.map +1 -0
  132. package/dist/operator/missions.js +304 -0
  133. package/dist/operator/missions.js.map +1 -0
  134. package/dist/operator/operatorCore.d.ts +11 -0
  135. package/dist/operator/operatorCore.d.ts.map +1 -0
  136. package/dist/operator/operatorCore.js +9 -0
  137. package/dist/operator/operatorCore.js.map +1 -0
  138. package/dist/operator/operatorRuntimeCore.d.ts +17 -0
  139. package/dist/operator/operatorRuntimeCore.d.ts.map +1 -0
  140. package/dist/operator/operatorRuntimeCore.js +17 -0
  141. package/dist/operator/operatorRuntimeCore.js.map +1 -0
  142. package/dist/operator/runtime.d.ts +74 -0
  143. package/dist/operator/runtime.d.ts.map +1 -0
  144. package/dist/operator/runtime.js +357 -0
  145. package/dist/operator/runtime.js.map +1 -0
  146. package/dist/shared/core/bootstrap.d.ts +16 -0
  147. package/dist/shared/core/bootstrap.d.ts.map +1 -0
  148. package/dist/shared/core/bootstrap.js +77 -0
  149. package/dist/shared/core/bootstrap.js.map +1 -0
  150. package/dist/shared/core/contract.d.ts +71 -0
  151. package/dist/shared/core/contract.d.ts.map +1 -0
  152. package/dist/shared/core/contract.js +452 -0
  153. package/dist/shared/core/contract.js.map +1 -0
  154. package/dist/shared/core/events.d.ts +57 -0
  155. package/dist/shared/core/events.d.ts.map +1 -0
  156. package/dist/shared/core/events.js +36 -0
  157. package/dist/shared/core/events.js.map +1 -0
  158. package/dist/shared/core/jobs.d.ts +46 -0
  159. package/dist/shared/core/jobs.d.ts.map +1 -0
  160. package/dist/shared/core/jobs.js +137 -0
  161. package/dist/shared/core/jobs.js.map +1 -0
  162. package/dist/shared/core/json.d.ts +12 -0
  163. package/dist/shared/core/json.d.ts.map +1 -0
  164. package/dist/shared/core/json.js +52 -0
  165. package/dist/shared/core/json.js.map +1 -0
  166. package/dist/shared/core/layoutMigration.d.ts +11 -0
  167. package/dist/shared/core/layoutMigration.d.ts.map +1 -0
  168. package/dist/shared/core/layoutMigration.js +56 -0
  169. package/dist/shared/core/layoutMigration.js.map +1 -0
  170. package/dist/shared/core/lifecycle.d.ts +61 -0
  171. package/dist/shared/core/lifecycle.d.ts.map +1 -0
  172. package/dist/shared/core/lifecycle.js +123 -0
  173. package/dist/shared/core/lifecycle.js.map +1 -0
  174. package/dist/shared/core/packagePaths.d.ts +2 -0
  175. package/dist/shared/core/packagePaths.d.ts.map +1 -0
  176. package/dist/shared/core/packagePaths.js +9 -0
  177. package/dist/shared/core/packagePaths.js.map +1 -0
  178. package/dist/shared/core/terminology.d.ts +38 -0
  179. package/dist/shared/core/terminology.d.ts.map +1 -0
  180. package/dist/shared/core/terminology.js +54 -0
  181. package/dist/shared/core/terminology.js.map +1 -0
  182. package/dist/shared/core/types.d.ts +30 -0
  183. package/dist/shared/core/types.d.ts.map +1 -0
  184. package/dist/shared/core/types.js +2 -0
  185. package/dist/shared/core/types.js.map +1 -0
  186. package/dist/shared/diagnostics/doctor.d.ts +19 -0
  187. package/dist/shared/diagnostics/doctor.d.ts.map +1 -0
  188. package/dist/shared/diagnostics/doctor.js +82 -0
  189. package/dist/shared/diagnostics/doctor.js.map +1 -0
  190. package/dist/shared/diagnostics/hostRollout.d.ts +16 -0
  191. package/dist/shared/diagnostics/hostRollout.d.ts.map +1 -0
  192. package/dist/shared/diagnostics/hostRollout.js +78 -0
  193. package/dist/shared/diagnostics/hostRollout.js.map +1 -0
  194. package/dist/shared/observability/emit.d.ts +3 -0
  195. package/dist/shared/observability/emit.d.ts.map +1 -0
  196. package/dist/shared/observability/emit.js +17 -0
  197. package/dist/shared/observability/emit.js.map +1 -0
  198. package/dist/shared/observability/testWorkspace.d.ts +4 -0
  199. package/dist/shared/observability/testWorkspace.d.ts.map +1 -0
  200. package/dist/shared/observability/testWorkspace.js +35 -0
  201. package/dist/shared/observability/testWorkspace.js.map +1 -0
  202. package/dist/shared/state/installRegistry.d.ts +22 -0
  203. package/dist/shared/state/installRegistry.d.ts.map +1 -0
  204. package/dist/shared/state/installRegistry.js +51 -0
  205. package/dist/shared/state/installRegistry.js.map +1 -0
  206. package/dist/shared/state/session.d.ts +18 -0
  207. package/dist/shared/state/session.d.ts.map +1 -0
  208. package/dist/shared/state/session.js +127 -0
  209. package/dist/shared/state/session.js.map +1 -0
  210. package/dist/shared/state/state.d.ts +16 -0
  211. package/dist/shared/state/state.d.ts.map +1 -0
  212. package/dist/shared/state/state.js +91 -0
  213. package/dist/shared/state/state.js.map +1 -0
  214. package/dist/shared/state/tasks.d.ts +113 -0
  215. package/dist/shared/state/tasks.d.ts.map +1 -0
  216. package/dist/shared/state/tasks.js +274 -0
  217. package/dist/shared/state/tasks.js.map +1 -0
  218. package/dist/shared/workflow/activation/activeSkill.d.ts +46 -0
  219. package/dist/shared/workflow/activation/activeSkill.d.ts.map +1 -0
  220. package/dist/shared/workflow/activation/activeSkill.js +158 -0
  221. package/dist/shared/workflow/activation/activeSkill.js.map +1 -0
  222. package/dist/shared/workflow/activation/gateProfiles.d.ts +26 -0
  223. package/dist/shared/workflow/activation/gateProfiles.d.ts.map +1 -0
  224. package/dist/shared/workflow/activation/gateProfiles.js +102 -0
  225. package/dist/shared/workflow/activation/gateProfiles.js.map +1 -0
  226. package/dist/shared/workflow/activation/modeMatrix.d.ts +28 -0
  227. package/dist/shared/workflow/activation/modeMatrix.d.ts.map +1 -0
  228. package/dist/shared/workflow/activation/modeMatrix.js +91 -0
  229. package/dist/shared/workflow/activation/modeMatrix.js.map +1 -0
  230. package/dist/shared/workflow/activation/skillActivation.d.ts +74 -0
  231. package/dist/shared/workflow/activation/skillActivation.d.ts.map +1 -0
  232. package/dist/shared/workflow/activation/skillActivation.js +485 -0
  233. package/dist/shared/workflow/activation/skillActivation.js.map +1 -0
  234. package/dist/shared/workflow/activation/skillVariant.d.ts +18 -0
  235. package/dist/shared/workflow/activation/skillVariant.d.ts.map +1 -0
  236. package/dist/shared/workflow/activation/skillVariant.js +44 -0
  237. package/dist/shared/workflow/activation/skillVariant.js.map +1 -0
  238. package/dist/shared/workflow/authority/authority.d.ts +34 -0
  239. package/dist/shared/workflow/authority/authority.d.ts.map +1 -0
  240. package/dist/shared/workflow/authority/authority.js +64 -0
  241. package/dist/shared/workflow/authority/authority.js.map +1 -0
  242. package/dist/shared/workflow/closure/closureManifest.d.ts +39 -0
  243. package/dist/shared/workflow/closure/closureManifest.d.ts.map +1 -0
  244. package/dist/shared/workflow/closure/closureManifest.js +62 -0
  245. package/dist/shared/workflow/closure/closureManifest.js.map +1 -0
  246. package/dist/shared/workflow/closure/closureRequirements.d.ts +12 -0
  247. package/dist/shared/workflow/closure/closureRequirements.d.ts.map +1 -0
  248. package/dist/shared/workflow/closure/closureRequirements.js +30 -0
  249. package/dist/shared/workflow/closure/closureRequirements.js.map +1 -0
  250. package/dist/shared/workflow/closure/contractParity.d.ts +24 -0
  251. package/dist/shared/workflow/closure/contractParity.d.ts.map +1 -0
  252. package/dist/shared/workflow/closure/contractParity.js +238 -0
  253. package/dist/shared/workflow/closure/contractParity.js.map +1 -0
  254. package/dist/shared/workflow/closure/contractParityContext.d.ts +8 -0
  255. package/dist/shared/workflow/closure/contractParityContext.d.ts.map +1 -0
  256. package/dist/shared/workflow/closure/contractParityContext.js +50 -0
  257. package/dist/shared/workflow/closure/contractParityContext.js.map +1 -0
  258. package/dist/shared/workflow/closure/scopeGuard.d.ts +11 -0
  259. package/dist/shared/workflow/closure/scopeGuard.d.ts.map +1 -0
  260. package/dist/shared/workflow/closure/scopeGuard.js +69 -0
  261. package/dist/shared/workflow/closure/scopeGuard.js.map +1 -0
  262. package/dist/shared/workflow/closure/ultragoalArtifact.d.ts +13 -0
  263. package/dist/shared/workflow/closure/ultragoalArtifact.d.ts.map +1 -0
  264. package/dist/shared/workflow/closure/ultragoalArtifact.js +31 -0
  265. package/dist/shared/workflow/closure/ultragoalArtifact.js.map +1 -0
  266. package/dist/shared/workflow/closure/workflowReconcile.d.ts +70 -0
  267. package/dist/shared/workflow/closure/workflowReconcile.d.ts.map +1 -0
  268. package/dist/shared/workflow/closure/workflowReconcile.js +267 -0
  269. package/dist/shared/workflow/closure/workflowReconcile.js.map +1 -0
  270. package/dist/shared/workflow/continuation/continuation.d.ts +109 -0
  271. package/dist/shared/workflow/continuation/continuation.d.ts.map +1 -0
  272. package/dist/shared/workflow/continuation/continuation.js +550 -0
  273. package/dist/shared/workflow/continuation/continuation.js.map +1 -0
  274. package/dist/shared/workflow/continuation/continuationEventReservations.d.ts +17 -0
  275. package/dist/shared/workflow/continuation/continuationEventReservations.d.ts.map +1 -0
  276. package/dist/shared/workflow/continuation/continuationEventReservations.js +88 -0
  277. package/dist/shared/workflow/continuation/continuationEventReservations.js.map +1 -0
  278. package/dist/shared/workflow/continuation/continuationFollowUp.d.ts +114 -0
  279. package/dist/shared/workflow/continuation/continuationFollowUp.d.ts.map +1 -0
  280. package/dist/shared/workflow/continuation/continuationFollowUp.js +330 -0
  281. package/dist/shared/workflow/continuation/continuationFollowUp.js.map +1 -0
  282. package/dist/shared/workflow/continuation/continuationOrchestrator.d.ts +66 -0
  283. package/dist/shared/workflow/continuation/continuationOrchestrator.d.ts.map +1 -0
  284. package/dist/shared/workflow/continuation/continuationOrchestrator.js +144 -0
  285. package/dist/shared/workflow/continuation/continuationOrchestrator.js.map +1 -0
  286. package/dist/shared/workflow/continuation/hookContinuation.d.ts +44 -0
  287. package/dist/shared/workflow/continuation/hookContinuation.d.ts.map +1 -0
  288. package/dist/shared/workflow/continuation/hookContinuation.js +85 -0
  289. package/dist/shared/workflow/continuation/hookContinuation.js.map +1 -0
  290. package/dist/shared/workflow/continuation/stopPolicy.d.ts +38 -0
  291. package/dist/shared/workflow/continuation/stopPolicy.d.ts.map +1 -0
  292. package/dist/shared/workflow/continuation/stopPolicy.js +435 -0
  293. package/dist/shared/workflow/continuation/stopPolicy.js.map +1 -0
  294. package/dist/shared/workflow/continuation/stopVerdict.d.ts +31 -0
  295. package/dist/shared/workflow/continuation/stopVerdict.d.ts.map +1 -0
  296. package/dist/shared/workflow/continuation/stopVerdict.js +98 -0
  297. package/dist/shared/workflow/continuation/stopVerdict.js.map +1 -0
  298. package/dist/shared/workflow/delegation/delegatedSession.d.ts +118 -0
  299. package/dist/shared/workflow/delegation/delegatedSession.d.ts.map +1 -0
  300. package/dist/shared/workflow/delegation/delegatedSession.js +496 -0
  301. package/dist/shared/workflow/delegation/delegatedSession.js.map +1 -0
  302. package/dist/shared/workflow/delegation/delegationPrompt.d.ts +3 -0
  303. package/dist/shared/workflow/delegation/delegationPrompt.d.ts.map +1 -0
  304. package/dist/shared/workflow/delegation/delegationPrompt.js +15 -0
  305. package/dist/shared/workflow/delegation/delegationPrompt.js.map +1 -0
  306. package/dist/shared/workflow/delegation/sessionTasks.d.ts +40 -0
  307. package/dist/shared/workflow/delegation/sessionTasks.d.ts.map +1 -0
  308. package/dist/shared/workflow/delegation/sessionTasks.js +73 -0
  309. package/dist/shared/workflow/delegation/sessionTasks.js.map +1 -0
  310. package/dist/shared/workflow/delegation/subagentRuntime.d.ts +26 -0
  311. package/dist/shared/workflow/delegation/subagentRuntime.d.ts.map +1 -0
  312. package/dist/shared/workflow/delegation/subagentRuntime.js +231 -0
  313. package/dist/shared/workflow/delegation/subagentRuntime.js.map +1 -0
  314. package/dist/shared/workflow/delivery/adoAuxiliaryRuntime.d.ts +79 -0
  315. package/dist/shared/workflow/delivery/adoAuxiliaryRuntime.d.ts.map +1 -0
  316. package/dist/shared/workflow/delivery/adoAuxiliaryRuntime.js +166 -0
  317. package/dist/shared/workflow/delivery/adoAuxiliaryRuntime.js.map +1 -0
  318. package/dist/shared/workflow/delivery/finalWave.d.ts +57 -0
  319. package/dist/shared/workflow/delivery/finalWave.d.ts.map +1 -0
  320. package/dist/shared/workflow/delivery/finalWave.js +123 -0
  321. package/dist/shared/workflow/delivery/finalWave.js.map +1 -0
  322. package/dist/shared/workflow/delivery/lifecyclePushMap.d.ts +68 -0
  323. package/dist/shared/workflow/delivery/lifecyclePushMap.d.ts.map +1 -0
  324. package/dist/shared/workflow/delivery/lifecyclePushMap.js +82 -0
  325. package/dist/shared/workflow/delivery/lifecyclePushMap.js.map +1 -0
  326. package/dist/shared/workflow/delivery/prSidecar.d.ts +7 -0
  327. package/dist/shared/workflow/delivery/prSidecar.d.ts.map +1 -0
  328. package/dist/shared/workflow/delivery/prSidecar.js +4 -0
  329. package/dist/shared/workflow/delivery/prSidecar.js.map +1 -0
  330. package/dist/shared/workflow/delivery/reviewStaleness.d.ts +37 -0
  331. package/dist/shared/workflow/delivery/reviewStaleness.d.ts.map +1 -0
  332. package/dist/shared/workflow/delivery/reviewStaleness.js +94 -0
  333. package/dist/shared/workflow/delivery/reviewStaleness.js.map +1 -0
  334. package/dist/shared/workflow/planning/hyperplan.d.ts +40 -0
  335. package/dist/shared/workflow/planning/hyperplan.d.ts.map +1 -0
  336. package/dist/shared/workflow/planning/hyperplan.js +133 -0
  337. package/dist/shared/workflow/planning/hyperplan.js.map +1 -0
  338. package/dist/shared/workflow/planning/notepad.d.ts +17 -0
  339. package/dist/shared/workflow/planning/notepad.d.ts.map +1 -0
  340. package/dist/shared/workflow/planning/notepad.js +84 -0
  341. package/dist/shared/workflow/planning/notepad.js.map +1 -0
  342. package/dist/shared/workflow/planning/planFormat.d.ts +3 -0
  343. package/dist/shared/workflow/planning/planFormat.d.ts.map +1 -0
  344. package/dist/shared/workflow/planning/planFormat.js +14 -0
  345. package/dist/shared/workflow/planning/planFormat.js.map +1 -0
  346. package/package.json +155 -0
  347. package/runtime/hooks/_continuation.mjs +2 -0
  348. package/runtime/hooks/_lib.mjs +2 -0
  349. package/runtime/hooks/_toolGuards.mjs +2 -0
  350. package/runtime/hooks/lanes/resolveSkillActivation.mjs +241 -0
  351. package/runtime/hooks/lanes/user-prompt-submit.mjs +326 -0
  352. package/runtime/hooks/layout-dir.mjs +2 -0
  353. package/runtime/hooks/lifecycle/pre-compact.mjs +121 -0
  354. package/runtime/hooks/lifecycle/session-start.mjs +356 -0
  355. package/runtime/hooks/lifecycle/stop.mjs +223 -0
  356. package/runtime/hooks/observability.mjs +2 -0
  357. package/runtime/hooks/post-tool-use-failure.mjs +5 -0
  358. package/runtime/hooks/post-tool-use.mjs +4 -0
  359. package/runtime/hooks/pre-compact.mjs +4 -0
  360. package/runtime/hooks/pre-tool-use.mjs +4 -0
  361. package/runtime/hooks/resolveSkillActivation.mjs +4 -0
  362. package/runtime/hooks/root-dir.mjs +2 -0
  363. package/runtime/hooks/session-start.mjs +4 -0
  364. package/runtime/hooks/shared/_continuation.mjs +341 -0
  365. package/runtime/hooks/shared/_lib.mjs +60 -0
  366. package/runtime/hooks/shared/_toolGuards.mjs +237 -0
  367. package/runtime/hooks/shared/config.mjs +143 -0
  368. package/runtime/hooks/shared/layout-dir.mjs +12 -0
  369. package/runtime/hooks/shared/observability.mjs +257 -0
  370. package/runtime/hooks/shared/root-dir.mjs +9 -0
  371. package/runtime/hooks/stop.mjs +4 -0
  372. package/runtime/hooks/subagent-tracker.mjs +4 -0
  373. package/runtime/hooks/subagents/subagent-tracker.mjs +106 -0
  374. package/runtime/hooks/tools/post-tool-use-failure.mjs +251 -0
  375. package/runtime/hooks/tools/post-tool-use.mjs +205 -0
  376. package/runtime/hooks/tools/pre-tool-use.mjs +268 -0
  377. package/runtime/hooks/user-prompt-submit.mjs +4 -0
@@ -0,0 +1,680 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { dirname } from 'node:path';
4
+ import { z } from 'zod';
5
+ import { ensureLayout, layoutPath, readJsonFile, validateJsonFile, writeJson, appendLedger, upsertInboxItem, createEvidenceHorizon, defaultGoalScopeForRoot, goalScopeRank, resolveGateProfile, createLaneTrackerTask, syncLaneTrackerTasks, assertLifecycleTransitionAllowed, buildLifecycleCore, lifecycleNow, recordLifecyclePhaseTransition, resolveLifecycleRetargetScopeAndProfile, resolveLifecycleStartScopeAndProfile, } from '../../operator/operatorRuntimeCore.js';
6
+ import { clearContinuationState } from '../../shared/workflow/continuation/continuation.js';
7
+ const RALPH_SCHEMA_VERSION = 1;
8
+ const DEFAULT_GATES = [
9
+ { id: 'doctor', name: 'Operator doctor' },
10
+ { id: 'tests', name: 'Real tests' },
11
+ { id: 'contract-parity', name: 'Contract-parity audit' },
12
+ ];
13
+ const RalphVerificationGateSchema = z.object({
14
+ id: z.string(),
15
+ name: z.string(),
16
+ status: z.enum(['pending', 'passed', 'failed']),
17
+ evidence: z.string().optional(),
18
+ ranAt: z.string().optional(),
19
+ });
20
+ const RalphHistoryEntrySchema = z.object({
21
+ phase: z.enum(['idle', 'running', 'verifying', 'blocked', 'completed', 'aborted']),
22
+ at: z.string(),
23
+ by: z.string().optional(),
24
+ note: z.string().optional(),
25
+ retargetEvent: z.object({
26
+ oldGoal: z.string(),
27
+ newGoal: z.string(),
28
+ retargetMode: z.enum(['replace-intent', 'narrow-scope', 'resume-unchanged']),
29
+ preservedState: z.enum(['preserved', 'narrowed', 'replaced', 'forked']),
30
+ reason: z.string().optional(),
31
+ }).optional(),
32
+ });
33
+ const RalphActivationMetadataSchema = z.object({
34
+ rawMarker: z.string().optional(),
35
+ source: z.enum(['hook', 'cli', 'mcp']).optional(),
36
+ detectedAt: z.string().optional(),
37
+ originalGoal: z.string().optional(),
38
+ }).catchall(z.unknown());
39
+ const EvidenceHorizonSchema = z.object({
40
+ commitHash: z.string(),
41
+ verificationRunId: z.string(),
42
+ verificationRunTimestamp: z.string(),
43
+ sessionSequence: z.number(),
44
+ });
45
+ const ArchitectVerdictSchema = z.object({
46
+ verdict: z.enum(['GO', 'NO-GO']),
47
+ reasons: z.array(z.string()),
48
+ evidencePointers: z.array(z.string()),
49
+ });
50
+ const RalphStateSchema = z.object({
51
+ schemaVersion: z.literal(RALPH_SCHEMA_VERSION),
52
+ id: z.string(),
53
+ active: z.boolean(),
54
+ phase: z.enum(['idle', 'running', 'verifying', 'blocked', 'completed', 'aborted']),
55
+ goal: z.string(),
56
+ sessionId: z.string().optional(),
57
+ taskIds: z.array(z.string()),
58
+ verificationGates: z.array(RalphVerificationGateSchema),
59
+ blockerReason: z.string().optional(),
60
+ blockerCategory: z.enum(['code-local', 'dependency-local', 'workflow-state-local', 'governance-platform-global']).optional(),
61
+ abortReason: z.string().optional(),
62
+ completionSummary: z.string().optional(),
63
+ history: z.array(RalphHistoryEntrySchema),
64
+ activationMetadata: RalphActivationMetadataSchema.optional(),
65
+ goalScope: z.enum(['repo-local', 'operator-runtime', 'operator-replacement']).optional(),
66
+ gateProfile: z.enum(['repo-delivery', 'operator-runtime', 'operator-replacement', 'benchmark-harness']).optional(),
67
+ linkedUltraworkId: z.string().optional(),
68
+ taskId: z.string().optional(),
69
+ evidenceHorizon: EvidenceHorizonSchema.optional(),
70
+ architectVerdict: ArchitectVerdictSchema.optional(),
71
+ architectLoop: z.boolean().optional(),
72
+ scopeFidelity: z.enum(['PASS', 'FAIL']).optional(),
73
+ scopeViolations: z.array(z.string()).optional(),
74
+ createdAt: z.string(),
75
+ updatedAt: z.string(),
76
+ });
77
+ const VALID_TRANSITIONS = {
78
+ idle: ['running'],
79
+ running: ['verifying', 'blocked', 'aborted'],
80
+ verifying: ['running', 'completed', 'blocked', 'aborted'],
81
+ blocked: ['running', 'aborted'],
82
+ completed: [],
83
+ aborted: [],
84
+ };
85
+ function defaultClosureScopeForGoalScope(scope) {
86
+ if (scope === 'operator-replacement')
87
+ return 'repo-end-to-end';
88
+ if (scope === 'operator-runtime')
89
+ return 'lane-local';
90
+ return 'integration';
91
+ }
92
+ function trackerStatusForRalphPhase(phase) {
93
+ switch (phase) {
94
+ case 'running':
95
+ return 'in_progress';
96
+ case 'verifying':
97
+ return 'review';
98
+ case 'blocked':
99
+ return 'blocked';
100
+ case 'completed':
101
+ return 'completed';
102
+ case 'aborted':
103
+ return 'cancelled';
104
+ default:
105
+ return null;
106
+ }
107
+ }
108
+ function ralphFile(root) {
109
+ return layoutPath(root, 'state', 'ralph.json');
110
+ }
111
+ function closureManifestFile(root) {
112
+ return layoutPath(root, 'state', 'closure-manifest.json');
113
+ }
114
+ const RALPH_WORKING_HEADERS = [
115
+ '## Confirmed Requirements',
116
+ '## Technical Decisions',
117
+ '## Research Findings',
118
+ '## Open Questions',
119
+ '## Scope Boundaries',
120
+ ];
121
+ function ralphSessionWorkingFile(root, sessionId) {
122
+ return layoutPath(root, 'ralph', sessionId, 'working.md');
123
+ }
124
+ function ralphLiveWorkingFile(root) {
125
+ return layoutPath(root, 'state', 'ralph-working.md');
126
+ }
127
+ function buildInitialRalphWorkingMemory() {
128
+ return `${RALPH_WORKING_HEADERS.join('\n\n')}\n`;
129
+ }
130
+ function ensureWorkingFile(path) {
131
+ if (existsSync(path))
132
+ return;
133
+ mkdirSync(dirname(path), { recursive: true });
134
+ writeFileSync(path, buildInitialRalphWorkingMemory(), 'utf8');
135
+ }
136
+ function appendTimestampedSectionEntry(path, section, entry) {
137
+ ensureWorkingFile(path);
138
+ const raw = readFileSync(path, 'utf8');
139
+ const lines = raw.split('\n');
140
+ const sectionIndex = lines.findIndex((line) => line.trim() === section);
141
+ if (sectionIndex < 0)
142
+ return;
143
+ let endIndex = lines.length;
144
+ for (let i = sectionIndex + 1; i < lines.length; i += 1) {
145
+ if (RALPH_WORKING_HEADERS.includes(lines[i].trim())) {
146
+ endIndex = i;
147
+ break;
148
+ }
149
+ }
150
+ const timestamped = `- [${now()}] ${entry}`;
151
+ lines.splice(endIndex, 0, timestamped);
152
+ writeFileSync(path, `${lines.join('\n').replace(/\n*$/, '\n')}`, 'utf8');
153
+ }
154
+ function appendRalphWorkingMemoryEntry(root, state, section, entry) {
155
+ const sessionId = state.sessionId ?? state.id;
156
+ const livePath = ralphLiveWorkingFile(root);
157
+ const sessionPath = ralphSessionWorkingFile(root, sessionId);
158
+ appendTimestampedSectionEntry(livePath, section, entry);
159
+ appendTimestampedSectionEntry(sessionPath, section, entry);
160
+ }
161
+ function now() {
162
+ return lifecycleNow();
163
+ }
164
+ function migrateRalphState(raw) {
165
+ if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
166
+ throw new Error('Ralph state must be an object.');
167
+ }
168
+ const state = raw;
169
+ const schemaVersion = typeof state.schemaVersion === 'number' ? state.schemaVersion : 0;
170
+ if (schemaVersion !== 0 && schemaVersion !== RALPH_SCHEMA_VERSION) {
171
+ throw new Error(`Unsupported Ralph schemaVersion ${schemaVersion}.`);
172
+ }
173
+ const verificationGates = Array.isArray(state.verificationGates)
174
+ ? [...state.verificationGates]
175
+ : [];
176
+ if (!verificationGates.some((gate) => {
177
+ if (gate === null || typeof gate !== 'object' || Array.isArray(gate))
178
+ return false;
179
+ return gate.id === 'contract-parity';
180
+ })) {
181
+ verificationGates.push({ id: 'contract-parity', name: 'Contract-parity audit', status: 'pending' });
182
+ }
183
+ // Forward-fill new optional fields on old records
184
+ const goalScope = state.goalScope === 'repo-local'
185
+ || state.goalScope === 'operator-runtime'
186
+ || state.goalScope === 'operator-replacement'
187
+ ? state.goalScope
188
+ : undefined;
189
+ const gateProfile = state.gateProfile === 'repo-delivery'
190
+ || state.gateProfile === 'operator-runtime'
191
+ || state.gateProfile === 'operator-replacement'
192
+ || state.gateProfile === 'benchmark-harness'
193
+ ? state.gateProfile
194
+ : undefined;
195
+ const linkedUltraworkId = typeof state.linkedUltraworkId === 'string' ? state.linkedUltraworkId : undefined;
196
+ const taskId = typeof state.taskId === 'string' ? state.taskId : undefined;
197
+ const validBlockerCategories = [
198
+ 'code-local',
199
+ 'dependency-local',
200
+ 'workflow-state-local',
201
+ 'governance-platform-global',
202
+ ];
203
+ const blockerCategory = validBlockerCategories.includes(state.blockerCategory)
204
+ ? state.blockerCategory
205
+ : undefined;
206
+ const architectVerdict = state.architectVerdict && typeof state.architectVerdict === 'object'
207
+ ? state.architectVerdict
208
+ : undefined;
209
+ const architectLoop = typeof state.architectLoop === 'boolean' ? state.architectLoop : undefined;
210
+ const scopeFidelity = state.scopeFidelity === 'PASS' || state.scopeFidelity === 'FAIL'
211
+ ? state.scopeFidelity
212
+ : undefined;
213
+ const scopeViolations = Array.isArray(state.scopeViolations)
214
+ ? state.scopeViolations.filter((item) => typeof item === 'string')
215
+ : undefined;
216
+ return {
217
+ ...state,
218
+ schemaVersion: RALPH_SCHEMA_VERSION,
219
+ verificationGates,
220
+ taskIds: Array.isArray(state.taskIds)
221
+ ? state.taskIds
222
+ : [],
223
+ goalScope,
224
+ gateProfile,
225
+ linkedUltraworkId,
226
+ blockerCategory,
227
+ taskId,
228
+ architectVerdict,
229
+ architectLoop,
230
+ scopeFidelity,
231
+ scopeViolations,
232
+ };
233
+ }
234
+ function load(root) {
235
+ const path = ralphFile(root);
236
+ const raw = readJsonFile(path);
237
+ if (raw === undefined) {
238
+ return null;
239
+ }
240
+ return validateJsonFile(path, migrateRalphState(raw), RalphStateSchema);
241
+ }
242
+ function save(root, state) {
243
+ const next = { ...state, schemaVersion: RALPH_SCHEMA_VERSION, updatedAt: now() };
244
+ writeJson(ralphFile(root), next);
245
+ return next;
246
+ }
247
+ export function startRalph(root, opts) {
248
+ ensureLayout(root);
249
+ const existing = load(root);
250
+ if (existing && existing.active) {
251
+ throw new Error(`Ralph is already active (id=${existing.id}, phase=${existing.phase}). Abort or complete it before starting a new one.`);
252
+ }
253
+ // ── Profile selection guard (D4) ─────────────────────────────────────────
254
+ // explicitProfile: caller supplied gateProfile directly
255
+ const explicitProfile = opts.gateProfile;
256
+ const { resolvedProfile, resolvedScope } = explicitProfile === undefined && opts.gates !== undefined
257
+ ? {
258
+ resolvedProfile: undefined,
259
+ resolvedScope: opts.goalScope ?? defaultGoalScopeForRoot(root),
260
+ }
261
+ : resolveLifecycleStartScopeAndProfile(root, {
262
+ text: opts.goal,
263
+ explicitGoalScope: opts.goalScope,
264
+ explicitGateProfile: explicitProfile,
265
+ contextLabel: 'operator_ralph_start',
266
+ hint: "Supply gateProfile='operator-replacement' for Operator self-hosting work, or 'operator-runtime' for runtime health checks.",
267
+ });
268
+ // Determine gate source:
269
+ // 1. explicit gates param wins (backward compat, custom overrides)
270
+ // 2. resolved profile (explicit or inferred) → use profile-resolved gates
271
+ // 3. fallback to DEFAULT_GATES only when no profile resolved (legacy)
272
+ let gateSource;
273
+ if (opts.gates !== undefined) {
274
+ gateSource = opts.gates;
275
+ }
276
+ else if (resolvedProfile !== undefined) {
277
+ const profileGateIds = resolveGateProfile(resolvedProfile);
278
+ gateSource = profileGateIds.map((id) => ({ id, name: id }));
279
+ }
280
+ else {
281
+ gateSource = DEFAULT_GATES;
282
+ }
283
+ const timestamp = lifecycleNow();
284
+ const gates = gateSource.map((g) => ({ id: g.id, name: g.name, status: 'pending' }));
285
+ const initialEntry = { phase: 'running', at: timestamp };
286
+ const state = save(root, {
287
+ schemaVersion: RALPH_SCHEMA_VERSION,
288
+ ...buildLifecycleCore({
289
+ id: `ralph_${randomUUID().slice(0, 12)}`,
290
+ phase: 'running',
291
+ history: [initialEntry],
292
+ goalScope: resolvedScope,
293
+ gateProfile: resolvedProfile,
294
+ }),
295
+ goal: opts.goal,
296
+ sessionId: opts.sessionId,
297
+ taskIds: opts.taskIds ?? [],
298
+ verificationGates: gates,
299
+ activationMetadata: opts.activationMetadata,
300
+ linkedUltraworkId: opts.linkedUltraworkId,
301
+ taskId: opts.taskId,
302
+ });
303
+ const shouldBootstrapLocalTracker = state.taskId === undefined && state.taskIds.length === 0;
304
+ const bootstrappedState = shouldBootstrapLocalTracker
305
+ ? save(root, {
306
+ ...state,
307
+ taskIds: [
308
+ createLaneTrackerTask(root, {
309
+ title: opts.goal,
310
+ ownerMode: 'ralph',
311
+ ownerStateId: state.id,
312
+ initialStatus: 'in_progress',
313
+ closureScope: defaultClosureScopeForGoalScope(resolvedScope),
314
+ goalScope: resolvedScope,
315
+ gateProfile: resolvedProfile,
316
+ }).id,
317
+ ],
318
+ })
319
+ : state;
320
+ appendLedger(root, { kind: 'session', action: 'ralph_start', detail: `Ralph started: ${opts.goal}` });
321
+ appendRalphWorkingMemoryEntry(root, bootstrappedState, '## Confirmed Requirements', `Session started with goal: ${opts.goal}`);
322
+ upsertInboxItem(root, {
323
+ kind: 'system',
324
+ subject: 'Ralph started',
325
+ body: opts.goal,
326
+ status: 'open',
327
+ });
328
+ clearContinuationState(root, 'ralph started', 'operator_ralph_start');
329
+ return bootstrappedState;
330
+ }
331
+ export function getRalph(root) {
332
+ return load(root);
333
+ }
334
+ export function advanceRalph(root, opts) {
335
+ ensureLayout(root);
336
+ const state = load(root);
337
+ if (!state) {
338
+ throw new Error('No Ralph state found. Start Ralph first.');
339
+ }
340
+ assertLifecycleTransitionAllowed('Ralph', state.id, state.phase, opts.toPhase, VALID_TRANSITIONS);
341
+ const entry = { phase: opts.toPhase, at: lifecycleNow(), by: opts.by, note: opts.note };
342
+ const next = save(root, {
343
+ ...state,
344
+ phase: opts.toPhase,
345
+ history: [...state.history, entry],
346
+ });
347
+ recordLifecyclePhaseTransition(root, {
348
+ modeType: 'ralph',
349
+ laneId: state.id,
350
+ fromPhase: state.phase,
351
+ toPhase: opts.toPhase,
352
+ trigger: opts.trigger,
353
+ sessionAction: `ralph_advance_${opts.toPhase}`,
354
+ sessionDetail: opts.note ?? `Transitioned to ${opts.toPhase}`,
355
+ actor: opts.by,
356
+ sessionId: state.sessionId,
357
+ runId: state.taskId ?? state.id,
358
+ });
359
+ appendRalphWorkingMemoryEntry(root, next, '## Technical Decisions', `Phase advanced to ${opts.toPhase}${opts.note ? ` (${opts.note})` : ''}`);
360
+ clearContinuationState(root, `ralph advanced to ${opts.toPhase}`, 'operator_ralph_advance');
361
+ const trackerStatus = trackerStatusForRalphPhase(opts.toPhase);
362
+ if (trackerStatus) {
363
+ syncLaneTrackerTasks(root, {
364
+ ownerMode: 'ralph',
365
+ ownerStateId: state.id,
366
+ taskIds: next.taskIds,
367
+ status: trackerStatus,
368
+ });
369
+ }
370
+ return next;
371
+ }
372
+ export function retargetRalph(root, opts) {
373
+ ensureLayout(root);
374
+ const state = load(root);
375
+ if (!state) {
376
+ throw new Error('Cannot retarget Ralph: no Ralph state found.');
377
+ }
378
+ if (state.phase === 'completed' || state.phase === 'aborted') {
379
+ throw new Error(`Cannot retarget Ralph "${state.id}": session is in terminal phase="${state.phase}".`);
380
+ }
381
+ const { resolvedProfile, resolvedScope } = resolveLifecycleRetargetScopeAndProfile(root, {
382
+ text: opts.goal,
383
+ explicitGoalScope: opts.goalScope,
384
+ explicitGateProfile: opts.gateProfile,
385
+ currentGoalScope: state.goalScope,
386
+ currentGateProfile: state.gateProfile,
387
+ contextLabel: 'operator_ralph_retarget',
388
+ });
389
+ if (state.goalScope && resolvedScope && goalScopeRank(resolvedScope) > goalScopeRank(state.goalScope)) {
390
+ throw new Error(`Cannot retarget Ralph "${state.id}": requested scope "${resolvedScope}" would broaden active scope "${state.goalScope}". Start a new session instead.`);
391
+ }
392
+ const event = {
393
+ oldGoal: state.goal,
394
+ newGoal: opts.goal,
395
+ retargetMode: opts.mode,
396
+ preservedState: opts.mode === 'resume-unchanged'
397
+ ? 'preserved'
398
+ : opts.mode === 'narrow-scope'
399
+ ? 'narrowed'
400
+ : 'replaced',
401
+ reason: opts.note ?? `Retargeted goal from "${state.goal}" to "${opts.goal}".`,
402
+ };
403
+ const entry = {
404
+ phase: state.phase,
405
+ at: lifecycleNow(),
406
+ by: opts.by,
407
+ note: opts.note ?? `Retargeted goal from "${state.goal}" to "${opts.goal}"`,
408
+ retargetEvent: event,
409
+ };
410
+ let verificationGates = state.verificationGates;
411
+ if (resolvedProfile !== undefined) {
412
+ verificationGates = resolveGateProfile(resolvedProfile).map((id) => ({ id, name: id, status: 'pending' }));
413
+ }
414
+ const next = save(root, {
415
+ ...state,
416
+ goal: opts.mode === 'resume-unchanged' ? state.goal : opts.goal,
417
+ goalScope: resolvedScope,
418
+ gateProfile: resolvedProfile,
419
+ linkedUltraworkId: opts.linkedUltraworkId ?? state.linkedUltraworkId,
420
+ verificationGates,
421
+ history: [...state.history, entry],
422
+ });
423
+ appendLedger(root, {
424
+ kind: 'session',
425
+ action: 'ralph_retarget',
426
+ detail: `Retargeted Ralph "${state.id}" via ${opts.mode}`,
427
+ metadata: { id: state.id, mode: opts.mode, goalScope: resolvedScope, gateProfile: resolvedProfile },
428
+ });
429
+ if (opts.mode !== 'resume-unchanged') {
430
+ syncLaneTrackerTasks(root, {
431
+ ownerMode: 'ralph',
432
+ ownerStateId: state.id,
433
+ taskIds: next.taskIds,
434
+ title: opts.goal,
435
+ closureScope: defaultClosureScopeForGoalScope(resolvedScope),
436
+ });
437
+ }
438
+ clearContinuationState(root, `ralph retargeted via ${opts.mode}`, 'operator_ralph_retarget');
439
+ return next;
440
+ }
441
+ export function recordVerification(root, gateId, result) {
442
+ ensureLayout(root);
443
+ const state = load(root);
444
+ if (!state) {
445
+ throw new Error('No Ralph state found. Start Ralph first.');
446
+ }
447
+ const gateIndex = state.verificationGates.findIndex((g) => g.id === gateId);
448
+ if (gateIndex < 0) {
449
+ throw new Error(`Unknown gate id: "${gateId}". Known gates: [${state.verificationGates.map((g) => g.id).join(', ')}].`);
450
+ }
451
+ const gates = state.verificationGates.map((g, i) => {
452
+ if (i !== gateIndex)
453
+ return g;
454
+ return { ...g, status: result.status, evidence: result.evidence, ranAt: now() };
455
+ });
456
+ const next = save(root, {
457
+ ...state,
458
+ verificationGates: gates,
459
+ architectVerdict: result.architectVerdict ?? state.architectVerdict,
460
+ architectLoop: result.architectLoop ?? state.architectLoop,
461
+ scopeFidelity: result.scopeFidelity ?? state.scopeFidelity,
462
+ scopeViolations: result.scopeViolations ?? state.scopeViolations,
463
+ });
464
+ appendLedger(root, {
465
+ kind: 'review',
466
+ action: `ralph_gate_${result.status}`,
467
+ detail: `Gate "${gateId}" ${result.status}${result.evidence ? ': ' + result.evidence : ''}`,
468
+ });
469
+ const waveVerdict = result.status === 'passed'
470
+ && (next.architectVerdict?.verdict ?? null) === 'GO'
471
+ && (next.scopeFidelity ?? 'PASS') === 'PASS'
472
+ && (next.scopeViolations ?? []).length === 0
473
+ && next.verificationGates.every((gate) => gate.status === 'passed')
474
+ ? 'GO'
475
+ : 'NO-GO';
476
+ const closureManifest = {
477
+ lane: 'ralph',
478
+ sessionId: next.id,
479
+ gateId,
480
+ gateStatus: result.status,
481
+ updatedAt: now(),
482
+ architectVerdict: next.architectVerdict,
483
+ scopeFidelity: next.scopeFidelity,
484
+ scopeViolations: next.scopeViolations,
485
+ verificationGates: next.verificationGates,
486
+ waveVerdict,
487
+ waveResult: result.waveResult,
488
+ };
489
+ writeJson(closureManifestFile(root), closureManifest);
490
+ appendRalphWorkingMemoryEntry(root, next, '## Research Findings', `Verification gate ${gateId} recorded as ${result.status}${result.evidence ? `: ${result.evidence}` : ''}`);
491
+ clearContinuationState(root, `ralph gate ${gateId} recorded as ${result.status}`, 'operator_ralph_verify');
492
+ return next;
493
+ }
494
+ export function pauseRalph(root, note) {
495
+ ensureLayout(root);
496
+ const state = load(root);
497
+ if (!state) {
498
+ throw new Error('No Ralph state found. Start Ralph first.');
499
+ }
500
+ const next = save(root, { ...state, active: false });
501
+ appendLedger(root, {
502
+ kind: 'session',
503
+ action: 'ralph_pause',
504
+ detail: note ?? `Ralph paused at phase=${state.phase}`,
505
+ });
506
+ return next;
507
+ }
508
+ export function resumeRalph(root, note) {
509
+ ensureLayout(root);
510
+ const state = load(root);
511
+ if (!state) {
512
+ throw new Error('No Ralph state found. Start Ralph first.');
513
+ }
514
+ const resumablePhases = ['running', 'verifying', 'blocked'];
515
+ if (!resumablePhases.includes(state.phase)) {
516
+ throw new Error(`Cannot resume Ralph in phase "${state.phase}". Resumable phases: [${resumablePhases.join(', ')}].`);
517
+ }
518
+ const next = save(root, { ...state, active: true });
519
+ appendLedger(root, {
520
+ kind: 'session',
521
+ action: 'ralph_resume',
522
+ detail: note ?? `Ralph resumed at phase=${state.phase}`,
523
+ });
524
+ return next;
525
+ }
526
+ export function abortRalph(root, reason) {
527
+ ensureLayout(root);
528
+ const state = load(root);
529
+ if (!state) {
530
+ throw new Error('No Ralph state found. Start Ralph first.');
531
+ }
532
+ const allowed = VALID_TRANSITIONS[state.phase];
533
+ if (!allowed.includes('aborted')) {
534
+ throw new Error(`Cannot abort Ralph from phase "${state.phase}". Already terminal.`);
535
+ }
536
+ const entry = { phase: 'aborted', at: now(), note: reason };
537
+ const next = save(root, {
538
+ ...state,
539
+ phase: 'aborted',
540
+ active: false,
541
+ abortReason: reason,
542
+ history: [...state.history, entry],
543
+ });
544
+ appendLedger(root, { kind: 'session', action: 'ralph_abort', detail: reason });
545
+ upsertInboxItem(root, {
546
+ kind: 'system',
547
+ subject: 'Ralph aborted',
548
+ body: reason,
549
+ status: 'open',
550
+ });
551
+ syncLaneTrackerTasks(root, {
552
+ ownerMode: 'ralph',
553
+ ownerStateId: state.id,
554
+ taskIds: next.taskIds,
555
+ status: 'cancelled',
556
+ result: reason,
557
+ });
558
+ clearContinuationState(root, reason, 'operator_ralph_abort');
559
+ return next;
560
+ }
561
+ export function completeRalph(root, summary) {
562
+ ensureLayout(root);
563
+ const state = load(root);
564
+ if (!state) {
565
+ throw new Error('No Ralph state found. Start Ralph first.');
566
+ }
567
+ if (state.phase !== 'verifying') {
568
+ throw new Error(`completeRalph requires phase="verifying", current phase="${state.phase}".`);
569
+ }
570
+ const failedOrPending = state.verificationGates.filter((g) => g.status !== 'passed');
571
+ if (failedOrPending.length > 0) {
572
+ throw new Error(`Cannot complete Ralph: gates not passed: [${failedOrPending.map((g) => `${g.id}(${g.status})`).join(', ')}].`);
573
+ }
574
+ if (state.architectLoop === true && state.architectVerdict?.verdict === 'NO-GO') {
575
+ throw new Error(`Cannot complete Ralph: architect verdict is NO-GO. Reasons: [${state.architectVerdict.reasons.join(', ')}].`);
576
+ }
577
+ if (!state.architectVerdict || state.architectVerdict.verdict !== 'GO') {
578
+ throw new Error('Cannot complete Ralph: missing architect approval. Run operator_ralph_verify with architectVerdict.verdict="GO" before completing.');
579
+ }
580
+ if (state.scopeFidelity === 'FAIL') {
581
+ throw new Error(`Cannot complete Ralph: scope-fidelity failed. Prohibited patterns found: [${(state.scopeViolations ?? []).join(', ')}].`);
582
+ }
583
+ // Phase 3 completion guard: contract-parity gate must be passed
584
+ const contractParityGate = state.verificationGates.find((g) => g.id === 'contract-parity');
585
+ if (contractParityGate && contractParityGate.status !== 'passed') {
586
+ throw new Error(`Cannot complete Ralph: contract-parity gate is "${contractParityGate.status}". Run operator_contract_parity_run and record the result before completing.`);
587
+ }
588
+ const entry = { phase: 'completed', at: now(), note: summary };
589
+ const next = save(root, {
590
+ ...state,
591
+ phase: 'completed',
592
+ active: false,
593
+ completionSummary: summary,
594
+ history: [...state.history, entry],
595
+ });
596
+ appendLedger(root, { kind: 'session', action: 'ralph_complete', detail: summary });
597
+ upsertInboxItem(root, {
598
+ kind: 'system',
599
+ subject: 'Ralph completed',
600
+ body: summary,
601
+ status: 'open',
602
+ });
603
+ syncLaneTrackerTasks(root, {
604
+ ownerMode: 'ralph',
605
+ ownerStateId: state.id,
606
+ taskIds: next.taskIds,
607
+ status: 'completed',
608
+ result: summary,
609
+ });
610
+ clearContinuationState(root, 'ralph completed', 'operator_ralph_complete');
611
+ return next;
612
+ }
613
+ export function blockRalph(root, reason, blockerCategory) {
614
+ ensureLayout(root);
615
+ const state = load(root);
616
+ if (!state) {
617
+ throw new Error('No Ralph state found. Start Ralph first.');
618
+ }
619
+ const allowed = VALID_TRANSITIONS[state.phase];
620
+ if (!allowed.includes('blocked')) {
621
+ throw new Error(`Cannot block Ralph from phase "${state.phase}". Allowed from ${state.phase}: [${allowed.join(', ') || 'none'}].`);
622
+ }
623
+ const entry = { phase: 'blocked', at: now(), note: reason };
624
+ const next = save(root, {
625
+ ...state,
626
+ phase: 'blocked',
627
+ blockerReason: reason,
628
+ blockerCategory,
629
+ evidenceHorizon: createEvidenceHorizon(root),
630
+ history: [...state.history, entry],
631
+ });
632
+ appendLedger(root, { kind: 'session', action: 'ralph_block', detail: reason });
633
+ syncLaneTrackerTasks(root, {
634
+ ownerMode: 'ralph',
635
+ ownerStateId: state.id,
636
+ taskIds: next.taskIds,
637
+ status: 'blocked',
638
+ result: reason,
639
+ });
640
+ return next;
641
+ }
642
+ // ── Phase 8 — AzDo task link helpers ────────────────────────────────────────
643
+ export function linkRalphTask(root, taskId) {
644
+ ensureLayout(root);
645
+ const state = load(root);
646
+ if (!state) {
647
+ throw new Error('No Ralph state found. Start Ralph first.');
648
+ }
649
+ if (state.taskId && state.taskId !== taskId) {
650
+ throw new Error(`Ralph "${state.id}" already linked to "${state.taskId}". ` +
651
+ `Call unlinkRalphTask first to retarget.`);
652
+ }
653
+ const next = save(root, { ...state, taskId });
654
+ appendLedger(root, {
655
+ kind: 'session',
656
+ action: 'ralph_link_task',
657
+ detail: `Ralph "${state.id}" linked to task "${taskId}"`,
658
+ metadata: { modeType: 'ralph', modeId: state.id, taskId },
659
+ });
660
+ return next;
661
+ }
662
+ export function unlinkRalphTask(root) {
663
+ ensureLayout(root);
664
+ const state = load(root);
665
+ if (!state) {
666
+ throw new Error('No Ralph state found. Start Ralph first.');
667
+ }
668
+ const previous = state.taskId;
669
+ const { taskId: _removed, ...rest } = state;
670
+ void _removed;
671
+ const next = save(root, rest);
672
+ appendLedger(root, {
673
+ kind: 'session',
674
+ action: 'ralph_unlink_task',
675
+ detail: `Ralph "${state.id}" unlinked from task "${previous ?? 'none'}"`,
676
+ metadata: { modeType: 'ralph', modeId: state.id, previousTaskId: previous ?? null },
677
+ });
678
+ return next;
679
+ }
680
+ //# sourceMappingURL=index.js.map