@shivaedev/work-fleet 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +2 -2
  3. package/dist/admit.d.ts +54 -0
  4. package/dist/admit.d.ts.map +1 -1
  5. package/dist/engine/abandonStalled.d.ts +9807 -0
  6. package/dist/engine/abandonStalled.d.ts.map +1 -0
  7. package/dist/engine/abandonStalled.js +55 -0
  8. package/dist/engine/abandonStalled.js.map +1 -0
  9. package/dist/engine/applyResolution.d.ts +108 -0
  10. package/dist/engine/applyResolution.d.ts.map +1 -1
  11. package/dist/engine/applyResolution.js +3 -0
  12. package/dist/engine/applyResolution.js.map +1 -1
  13. package/dist/engine/approveBrief.d.ts +164 -2
  14. package/dist/engine/approveBrief.d.ts.map +1 -1
  15. package/dist/engine/approveBrief.js +7 -5
  16. package/dist/engine/approveBrief.js.map +1 -1
  17. package/dist/engine/authorizeResolution.d.ts +942 -24
  18. package/dist/engine/authorizeResolution.d.ts.map +1 -1
  19. package/dist/engine/boardBrief.d.ts +162 -0
  20. package/dist/engine/boardBrief.d.ts.map +1 -1
  21. package/dist/engine/capacityRetry.d.ts +2883 -75
  22. package/dist/engine/capacityRetry.d.ts.map +1 -1
  23. package/dist/engine/closeDecisions.d.ts +108 -0
  24. package/dist/engine/closeDecisions.d.ts.map +1 -1
  25. package/dist/engine/completeBoardWork.d.ts +108 -0
  26. package/dist/engine/completeBoardWork.d.ts.map +1 -1
  27. package/dist/engine/completeReport.d.ts +108 -0
  28. package/dist/engine/completeReport.d.ts.map +1 -1
  29. package/dist/engine/continueCommand.d.ts +54 -0
  30. package/dist/engine/continueCommand.d.ts.map +1 -1
  31. package/dist/engine/continueWorker.d.ts +108 -0
  32. package/dist/engine/continueWorker.d.ts.map +1 -1
  33. package/dist/engine/deliverPendingAnswers.d.ts +1104 -24
  34. package/dist/engine/deliverPendingAnswers.d.ts.map +1 -1
  35. package/dist/engine/dispatchCommand.d.ts +54 -0
  36. package/dist/engine/dispatchCommand.d.ts.map +1 -1
  37. package/dist/engine/ensureDecisionOwner.d.ts +108 -0
  38. package/dist/engine/ensureDecisionOwner.d.ts.map +1 -1
  39. package/dist/engine/ensurePublication.d.ts +108 -0
  40. package/dist/engine/ensurePublication.d.ts.map +1 -1
  41. package/dist/engine/exhaustedCheckRepairs.d.ts.map +1 -1
  42. package/dist/engine/exhaustedCheckRepairs.js +3 -1
  43. package/dist/engine/exhaustedCheckRepairs.js.map +1 -1
  44. package/dist/engine/inspectRenewal.d.ts +108 -0
  45. package/dist/engine/inspectRenewal.d.ts.map +1 -1
  46. package/dist/engine/launchInput.d.ts +54 -0
  47. package/dist/engine/launchInput.d.ts.map +1 -1
  48. package/dist/engine/launchReceipt.d.ts +54 -0
  49. package/dist/engine/launchReceipt.d.ts.map +1 -1
  50. package/dist/engine/makeAdopt.d.ts +108 -0
  51. package/dist/engine/makeAdopt.d.ts.map +1 -1
  52. package/dist/engine/makeAdopt.js +10 -0
  53. package/dist/engine/makeAdopt.js.map +1 -1
  54. package/dist/engine/makeAdvance.d.ts +54 -0
  55. package/dist/engine/makeAdvance.d.ts.map +1 -1
  56. package/dist/engine/makeDeliver.d.ts +108 -0
  57. package/dist/engine/makeDeliver.d.ts.map +1 -1
  58. package/dist/engine/makeHuman.d.ts +108 -0
  59. package/dist/engine/makeHuman.d.ts.map +1 -1
  60. package/dist/engine/makeLaunch.d.ts +108 -0
  61. package/dist/engine/makeLaunch.d.ts.map +1 -1
  62. package/dist/engine/makeObserve.d.ts +108 -0
  63. package/dist/engine/makeObserve.d.ts.map +1 -1
  64. package/dist/engine/makeReview.d.ts +108 -0
  65. package/dist/engine/makeReview.d.ts.map +1 -1
  66. package/dist/engine/makeState.d.ts +888 -24
  67. package/dist/engine/makeState.d.ts.map +1 -1
  68. package/dist/engine/makeValidate.d.ts +108 -0
  69. package/dist/engine/makeValidate.d.ts.map +1 -1
  70. package/dist/engine/mergeReadiness.d.ts +1212 -24
  71. package/dist/engine/mergeReadiness.d.ts.map +1 -1
  72. package/dist/engine/observeDeliveryFailure.d.ts +996 -24
  73. package/dist/engine/observeDeliveryFailure.d.ts.map +1 -1
  74. package/dist/engine/observeRenewal.d.ts +189 -0
  75. package/dist/engine/observeRenewal.d.ts.map +1 -1
  76. package/dist/engine/observedAttempt.d.ts.map +1 -1
  77. package/dist/engine/observedAttempt.js +3 -0
  78. package/dist/engine/observedAttempt.js.map +1 -1
  79. package/dist/engine/obtainReview.d.ts +54 -0
  80. package/dist/engine/obtainReview.d.ts.map +1 -1
  81. package/dist/engine/operationRecord.d.ts +726 -24
  82. package/dist/engine/operationRecord.d.ts.map +1 -1
  83. package/dist/engine/persistTerminalReceipts.d.ts +108 -0
  84. package/dist/engine/persistTerminalReceipts.d.ts.map +1 -1
  85. package/dist/engine/prepareCommand.d.ts +54 -0
  86. package/dist/engine/prepareCommand.d.ts.map +1 -1
  87. package/dist/engine/prepareCommand.js +19 -0
  88. package/dist/engine/prepareCommand.js.map +1 -1
  89. package/dist/engine/queueAnswerCommand.d.ts +54 -0
  90. package/dist/engine/queueAnswerCommand.d.ts.map +1 -1
  91. package/dist/engine/readOrContinueReview.d.ts +54 -0
  92. package/dist/engine/readOrContinueReview.d.ts.map +1 -1
  93. package/dist/engine/readRetry.d.ts +1995 -51
  94. package/dist/engine/readRetry.d.ts.map +1 -1
  95. package/dist/engine/reassignCommand.d.ts +54 -0
  96. package/dist/engine/reassignCommand.d.ts.map +1 -1
  97. package/dist/engine/reconcileAttempt.d.ts +81 -0
  98. package/dist/engine/reconcileAttempt.d.ts.map +1 -1
  99. package/dist/engine/reconcileCommand.d.ts +54 -0
  100. package/dist/engine/reconcileCommand.d.ts.map +1 -1
  101. package/dist/engine/recoverStall.d.ts +1023 -24
  102. package/dist/engine/recoverStall.d.ts.map +1 -1
  103. package/dist/engine/recoverStall.js +5 -1
  104. package/dist/engine/recoverStall.js.map +1 -1
  105. package/dist/engine/recoverUnobservable.d.ts +1023 -24
  106. package/dist/engine/recoverUnobservable.d.ts.map +1 -1
  107. package/dist/engine/refreshBrief.d.ts +1997 -53
  108. package/dist/engine/refreshBrief.d.ts.map +1 -1
  109. package/dist/engine/refreshReviewResult.d.ts +108 -0
  110. package/dist/engine/refreshReviewResult.d.ts.map +1 -1
  111. package/dist/engine/releaseClosedPreparation.d.ts +996 -24
  112. package/dist/engine/releaseClosedPreparation.d.ts.map +1 -1
  113. package/dist/engine/releaseExecution.d.ts +996 -24
  114. package/dist/engine/releaseExecution.d.ts.map +1 -1
  115. package/dist/engine/releaseFinishedWork.d.ts +54 -0
  116. package/dist/engine/releaseFinishedWork.d.ts.map +1 -1
  117. package/dist/engine/repository.d.ts +672 -24
  118. package/dist/engine/repository.d.ts.map +1 -1
  119. package/dist/engine/repository.js +1 -0
  120. package/dist/engine/repository.js.map +1 -1
  121. package/dist/engine/requestConflictRepair.d.ts +996 -24
  122. package/dist/engine/requestConflictRepair.d.ts.map +1 -1
  123. package/dist/engine/requestRework.d.ts +108 -0
  124. package/dist/engine/requestRework.d.ts.map +1 -1
  125. package/dist/engine/resolveCommand.d.ts +54 -0
  126. package/dist/engine/resolveCommand.d.ts.map +1 -1
  127. package/dist/engine/resolveExecution.d.ts +996 -24
  128. package/dist/engine/resolveExecution.d.ts.map +1 -1
  129. package/dist/engine/resolveExecution.js +3 -1
  130. package/dist/engine/resolveExecution.js.map +1 -1
  131. package/dist/engine/resumeAttempt.d.ts +1023 -24
  132. package/dist/engine/resumeAttempt.d.ts.map +1 -1
  133. package/dist/engine/retireUnacknowledged.d.ts +108 -0
  134. package/dist/engine/retireUnacknowledged.d.ts.map +1 -1
  135. package/dist/engine/retryTerminal.d.ts +942 -24
  136. package/dist/engine/retryTerminal.d.ts.map +1 -1
  137. package/dist/engine/scheduler.d.ts +108 -0
  138. package/dist/engine/scheduler.d.ts.map +1 -1
  139. package/dist/engine/sessionCleanup.d.ts +108 -0
  140. package/dist/engine/sessionCleanup.d.ts.map +1 -1
  141. package/dist/engine/sessionCleanup.js +3 -1
  142. package/dist/engine/sessionCleanup.js.map +1 -1
  143. package/dist/engine/sessionStatus.d.ts.map +1 -1
  144. package/dist/engine/sessionStatus.js +3 -0
  145. package/dist/engine/sessionStatus.js.map +1 -1
  146. package/dist/engine/settleMergedDelivery.d.ts +996 -24
  147. package/dist/engine/settleMergedDelivery.d.ts.map +1 -1
  148. package/dist/engine/steerBrief.d.ts +10340 -0
  149. package/dist/engine/steerBrief.d.ts.map +1 -0
  150. package/dist/engine/steerBrief.js +42 -0
  151. package/dist/engine/steerBrief.js.map +1 -0
  152. package/dist/engine/submissionFailure.d.ts +888 -24
  153. package/dist/engine/submissionFailure.d.ts.map +1 -1
  154. package/dist/engine/submitLaunch.d.ts +942 -24
  155. package/dist/engine/submitLaunch.d.ts.map +1 -1
  156. package/dist/engine/views.js +1 -0
  157. package/dist/engine/views.js.map +1 -1
  158. package/dist/engine/workerReport.d.ts +162 -0
  159. package/dist/engine/workerReport.d.ts.map +1 -1
  160. package/dist/fleet.d.ts +540 -0
  161. package/dist/fleet.d.ts.map +1 -1
  162. package/dist/host/admission.d.ts +108 -0
  163. package/dist/host/admission.d.ts.map +1 -1
  164. package/dist/host/admission.js +2 -1
  165. package/dist/host/admission.js.map +1 -1
  166. package/dist/host/answerWork.d.ts +54 -0
  167. package/dist/host/answerWork.d.ts.map +1 -1
  168. package/dist/host/commands.d.ts +108 -0
  169. package/dist/host/commands.d.ts.map +1 -1
  170. package/dist/host/daemon.d.ts +600 -0
  171. package/dist/host/daemon.d.ts.map +1 -1
  172. package/dist/host/daemonClient.d.ts +691 -91
  173. package/dist/host/daemonClient.d.ts.map +1 -1
  174. package/dist/host/daemonContract.d.ts +984 -0
  175. package/dist/host/daemonContract.d.ts.map +1 -1
  176. package/dist/host/githubCheckState.d.ts +4 -0
  177. package/dist/host/githubCheckState.d.ts.map +1 -1
  178. package/dist/host/githubCheckState.js +17 -2
  179. package/dist/host/githubCheckState.js.map +1 -1
  180. package/dist/host/readWaitStates.d.ts.map +1 -1
  181. package/dist/host/readWaitStates.js +13 -4
  182. package/dist/host/readWaitStates.js.map +1 -1
  183. package/dist/host/reassignWork.d.ts +54 -0
  184. package/dist/host/reassignWork.d.ts.map +1 -1
  185. package/dist/host/recordPayloads.d.ts.map +1 -1
  186. package/dist/host/recordPayloads.js +8 -3
  187. package/dist/host/recordPayloads.js.map +1 -1
  188. package/dist/host/releaseWork.d.ts +108 -0
  189. package/dist/host/releaseWork.d.ts.map +1 -1
  190. package/dist/host/status.d.ts +30 -0
  191. package/dist/host/status.d.ts.map +1 -1
  192. package/dist/model.d.ts +144 -0
  193. package/dist/model.d.ts.map +1 -1
  194. package/dist/model.js +14 -1
  195. package/dist/model.js.map +1 -1
  196. package/dist/operations.d.ts +1224 -0
  197. package/dist/operations.d.ts.map +1 -1
  198. package/dist/packageInfo.d.ts +1 -1
  199. package/dist/packageInfo.js +1 -1
  200. package/dist/prompt/briefEdit.d.ts +2 -0
  201. package/dist/prompt/briefEdit.d.ts.map +1 -0
  202. package/dist/prompt/briefEdit.js +41 -0
  203. package/dist/prompt/briefEdit.js.map +1 -0
  204. package/dist/prompt/worker.d.ts.map +1 -1
  205. package/dist/prompt/worker.js +11 -2
  206. package/dist/prompt/worker.js.map +1 -1
  207. package/dist/qualifyDependencies.d.ts +54 -0
  208. package/dist/qualifyDependencies.d.ts.map +1 -1
  209. package/dist/scheduling/areas.d.ts +162 -0
  210. package/dist/scheduling/areas.d.ts.map +1 -1
  211. package/dist/storage/attemptV12.d.ts +108 -0
  212. package/dist/storage/attemptV12.d.ts.map +1 -0
  213. package/dist/storage/attemptV12.js +94 -0
  214. package/dist/storage/attemptV12.js.map +1 -0
  215. package/dist/storage/createCollections.d.ts +5 -0
  216. package/dist/storage/createCollections.d.ts.map +1 -0
  217. package/dist/storage/createCollections.js +21 -0
  218. package/dist/storage/createCollections.js.map +1 -0
  219. package/dist/storage/cycleV12.d.ts +287 -0
  220. package/dist/storage/cycleV12.d.ts.map +1 -0
  221. package/dist/storage/cycleV12.js +124 -0
  222. package/dist/storage/cycleV12.js.map +1 -0
  223. package/dist/storage/fleetMigrations.d.ts +0 -39
  224. package/dist/storage/fleetMigrations.d.ts.map +1 -1
  225. package/dist/storage/fleetMigrations.js +3 -9
  226. package/dist/storage/fleetMigrations.js.map +1 -1
  227. package/dist/storage/legacyColumns.d.ts +40 -0
  228. package/dist/storage/legacyColumns.d.ts.map +1 -0
  229. package/dist/storage/legacyColumns.js +12 -0
  230. package/dist/storage/legacyColumns.js.map +1 -0
  231. package/dist/storage/makeForeignReservations.d.ts +15 -0
  232. package/dist/storage/makeForeignReservations.d.ts.map +1 -0
  233. package/dist/storage/makeForeignReservations.js +34 -0
  234. package/dist/storage/makeForeignReservations.js.map +1 -0
  235. package/dist/storage/makePostgresFleetStore.d.ts +36 -16
  236. package/dist/storage/makePostgresFleetStore.d.ts.map +1 -1
  237. package/dist/storage/makePostgresFleetStore.js +24 -32
  238. package/dist/storage/makePostgresFleetStore.js.map +1 -1
  239. package/dist/storage/model.d.ts +53 -59
  240. package/dist/storage/model.d.ts.map +1 -1
  241. package/dist/storage/model.js +18 -60
  242. package/dist/storage/model.js.map +1 -1
  243. package/dist/storage/operationEntries.d.ts +6 -5
  244. package/dist/storage/operationEntries.d.ts.map +1 -1
  245. package/dist/storage/operationEntries.js +12 -15
  246. package/dist/storage/operationEntries.js.map +1 -1
  247. package/dist/storage/preparationV12.d.ts +44 -0
  248. package/dist/storage/preparationV12.d.ts.map +1 -0
  249. package/dist/storage/preparationV12.js +30 -0
  250. package/dist/storage/preparationV12.js.map +1 -0
  251. package/dist/storage/readRecords.d.ts +4 -0
  252. package/dist/storage/readRecords.d.ts.map +1 -0
  253. package/dist/storage/readRecords.js +10 -0
  254. package/dist/storage/readRecords.js.map +1 -0
  255. package/dist/storage/recordChildren.d.ts +11 -0
  256. package/dist/storage/recordChildren.d.ts.map +1 -0
  257. package/dist/storage/recordChildren.js +105 -0
  258. package/dist/storage/recordChildren.js.map +1 -0
  259. package/dist/storage/recordShape.d.ts +23 -0
  260. package/dist/storage/recordShape.d.ts.map +1 -0
  261. package/dist/storage/recordShape.js +112 -0
  262. package/dist/storage/recordShape.js.map +1 -0
  263. package/dist/storage/recordValue.d.ts +9 -6
  264. package/dist/storage/recordValue.d.ts.map +1 -1
  265. package/dist/storage/recordValue.js +42 -32
  266. package/dist/storage/recordValue.js.map +1 -1
  267. package/dist/storage/shapeV12.d.ts +794 -0
  268. package/dist/storage/shapeV12.d.ts.map +1 -0
  269. package/dist/storage/shapeV12.js +10 -0
  270. package/dist/storage/shapeV12.js.map +1 -0
  271. package/dist/storage/textRecordValue.d.ts +3 -0
  272. package/dist/storage/textRecordValue.d.ts.map +1 -0
  273. package/dist/storage/textRecordValue.js +13 -0
  274. package/dist/storage/textRecordValue.js.map +1 -0
  275. package/dist/storage/typedDecisionsV12.d.ts +103 -0
  276. package/dist/storage/typedDecisionsV12.d.ts.map +1 -0
  277. package/dist/storage/typedDecisionsV12.js +97 -0
  278. package/dist/storage/typedDecisionsV12.js.map +1 -0
  279. package/dist/storage/typedTables.d.ts +4 -0
  280. package/dist/storage/typedTables.d.ts.map +1 -0
  281. package/dist/storage/typedTables.js +39 -0
  282. package/dist/storage/typedTables.js.map +1 -0
  283. package/package.json +8 -8
  284. package/src/engine/abandonStalled.ts +63 -0
  285. package/src/engine/applyResolution.ts +3 -0
  286. package/src/engine/approveBrief.ts +34 -32
  287. package/src/engine/exhaustedCheckRepairs.ts +3 -1
  288. package/src/engine/makeAdopt.ts +12 -0
  289. package/src/engine/observedAttempt.ts +3 -0
  290. package/src/engine/prepareCommand.ts +21 -0
  291. package/src/engine/recoverStall.ts +6 -2
  292. package/src/engine/repository.ts +1 -0
  293. package/src/engine/resolveExecution.ts +3 -1
  294. package/src/engine/sessionCleanup.ts +3 -1
  295. package/src/engine/sessionStatus.ts +5 -0
  296. package/src/engine/steerBrief.ts +54 -0
  297. package/src/engine/views.ts +1 -0
  298. package/src/host/admission.ts +2 -1
  299. package/src/host/githubCheckState.ts +19 -4
  300. package/src/host/readWaitStates.ts +12 -11
  301. package/src/host/recordPayloads.ts +11 -3
  302. package/src/model.ts +20 -1
  303. package/src/packageInfo.ts +1 -1
  304. package/src/prompt/briefEdit.ts +44 -0
  305. package/src/prompt/worker.ts +11 -2
  306. package/src/storage/attemptV12.ts +95 -0
  307. package/src/storage/createCollections.ts +21 -0
  308. package/src/storage/cycleV12.ts +125 -0
  309. package/src/storage/fleetMigrations.ts +3 -10
  310. package/src/storage/legacyColumns.ts +12 -0
  311. package/src/storage/makeForeignReservations.ts +41 -0
  312. package/src/storage/makePostgresFleetStore.ts +30 -43
  313. package/src/storage/model.ts +19 -69
  314. package/src/storage/operationEntries.ts +12 -22
  315. package/src/storage/preparationV12.ts +31 -0
  316. package/src/storage/readRecords.ts +12 -0
  317. package/src/storage/recordChildren.ts +131 -0
  318. package/src/storage/recordShape.ts +137 -0
  319. package/src/storage/recordValue.ts +47 -34
  320. package/src/storage/shapeV12.ts +11 -0
  321. package/src/storage/textRecordValue.ts +16 -0
  322. package/src/storage/typedDecisionsV12.ts +100 -0
  323. package/src/storage/typedTables.ts +39 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapeV12.d.ts","sourceRoot":"","sources":["../../src/storage/shapeV12.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAD2B,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAAL,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yCAIC,QAAQ;;;;;CAEpC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { attemptV12 } from "#storage/attemptV12.ts";
2
+ import { cycleV12 } from "#storage/cycleV12.ts";
3
+ const cycle = { ...cycleV12.fields, attempts: { array: attemptV12 } };
4
+ export const shapeV12 = {
5
+ fields: {
6
+ ...cycle,
7
+ history: { array: { fields: { ...cycle, archivedAt: "number" } } },
8
+ },
9
+ };
10
+ //# sourceMappingURL=shapeV12.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapeV12.js","sourceRoot":"","sources":["../../src/storage/shapeV12.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,MAAM,KAAK,GAAG,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC;AACtE,MAAM,CAAC,MAAM,QAAQ,GAAG;IACvB,MAAM,EAAE;QACP,GAAG,KAAK;QACR,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;KAClE;CACwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Effect, Schema } from "effect";
2
+ export declare const textRecordValue: (row: Readonly<Record<string, unknown>>, structured: readonly string[]) => Effect.Effect<Record<string, unknown>, Schema.SchemaError, never>;
3
+ //# sourceMappingURL=textRecordValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textRecordValue.d.ts","sourceRoot":"","sources":["../../src/storage/textRecordValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGxC,eAAO,MAAM,eAAe,8IAY1B,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { legacyColumns } from "#storage/legacyColumns.ts";
3
+ export const textRecordValue = Effect.fn("FleetStore.textRecordValue")(function* (row, structured) {
4
+ const value = {};
5
+ for (const name of Object.keys(legacyColumns)) {
6
+ const field = row[structured.includes(name) ? `legacy_${name}` : name];
7
+ if (field !== null) {
8
+ value[name] = structured.includes(name) ? yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Unknown))(field) : field;
9
+ }
10
+ }
11
+ return value;
12
+ });
13
+ //# sourceMappingURL=textRecordValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textRecordValue.js","sourceRoot":"","sources":["../../src/storage/textRecordValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,QAAQ,CAAC,EAC/E,GAAsC,EACtC,UAA6B;IAE7B,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACnI,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC,CAAC"}
@@ -0,0 +1,103 @@
1
+ export declare const decisionV12: {
2
+ readonly fields: {
3
+ readonly attentionOwner: "string";
4
+ readonly boardAcknowledgementDisposition: "string";
5
+ readonly code: "string";
6
+ readonly id: "string";
7
+ readonly links: {
8
+ readonly array: "string";
9
+ };
10
+ readonly publicationWork: {
11
+ readonly fields: {
12
+ readonly approved: "boolean";
13
+ readonly areas: {
14
+ readonly array: "string";
15
+ };
16
+ readonly context: "string";
17
+ readonly deliverable: "string";
18
+ readonly dependsOn: {
19
+ readonly array: "string";
20
+ };
21
+ readonly revision: "string";
22
+ readonly sourcePath: "string";
23
+ readonly status: "string";
24
+ readonly workId: "string";
25
+ };
26
+ };
27
+ readonly published: {
28
+ readonly fields: {
29
+ readonly itemId: "string";
30
+ readonly questionId: "string";
31
+ readonly request: "string";
32
+ readonly revision: "string";
33
+ readonly sourcePath: "string";
34
+ readonly workId: "string";
35
+ readonly workRevision: "string";
36
+ readonly workSourcePath: "string";
37
+ };
38
+ };
39
+ readonly reason: "string";
40
+ readonly recommendation: "string";
41
+ readonly worker: {
42
+ readonly fields: {
43
+ readonly sessionId: "string";
44
+ readonly turnId: "string";
45
+ };
46
+ };
47
+ };
48
+ };
49
+ export declare const responsesV12: {
50
+ readonly array: {
51
+ readonly fields: {
52
+ readonly action: "string";
53
+ readonly boardAcknowledged: "boolean";
54
+ readonly boardAcknowledgementDisposition: "string";
55
+ readonly decisionId: "string";
56
+ readonly processedAt: "number";
57
+ readonly published: {
58
+ readonly fields: {
59
+ readonly itemId: "string";
60
+ readonly questionId: "string";
61
+ readonly request: "string";
62
+ readonly revision: "string";
63
+ readonly sourcePath: "string";
64
+ readonly workId: "string";
65
+ readonly workRevision: "string";
66
+ readonly workSourcePath: "string";
67
+ };
68
+ };
69
+ readonly questionId: "string";
70
+ readonly questionRevision: "string";
71
+ readonly responseId: "string";
72
+ readonly type: "string";
73
+ };
74
+ };
75
+ };
76
+ export declare const supersededDecisionsV12: {
77
+ readonly array: {
78
+ readonly fields: {
79
+ readonly boardAcknowledged: "boolean";
80
+ readonly boardAcknowledgementDisposition: "string";
81
+ readonly published: {
82
+ readonly fields: {
83
+ readonly itemId: "string";
84
+ readonly questionId: "string";
85
+ readonly request: "string";
86
+ readonly revision: "string";
87
+ readonly sourcePath: "string";
88
+ readonly workId: "string";
89
+ readonly workRevision: "string";
90
+ readonly workSourcePath: "string";
91
+ };
92
+ };
93
+ readonly reassignedTo: {
94
+ readonly fields: {
95
+ readonly attentionOwner: "string";
96
+ readonly decisionId: "string";
97
+ };
98
+ };
99
+ readonly supersededAt: "number";
100
+ };
101
+ };
102
+ };
103
+ //# sourceMappingURL=typedDecisionsV12.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typedDecisionsV12.d.ts","sourceRoot":"","sources":["../../src/storage/typedDecisionsV12.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW;;iBAEtB,cAAc,EAAE,QAAQ;iBACxB,+BAA+B,EAAE,QAAQ;iBACzC,IAAI,EAAE,QAAQ;iBACd,EAAE,EAAE,QAAQ;iBACZ,KAAK;qBAAI,KAAK,EAAE,QAAQ;;iBACxB,eAAe;qBACd,MAAM;yBACL,QAAQ,EAAE,SAAS;yBACnB,KAAK;6BAAI,KAAK,EAAE,QAAQ;;yBACxB,OAAO,EAAE,QAAQ;yBACjB,WAAW,EAAE,QAAQ;yBACrB,SAAS;6BAAI,KAAK,EAAE,QAAQ;;yBAC5B,QAAQ,EAAE,QAAQ;yBAClB,UAAU,EAAE,QAAQ;yBACpB,MAAM,EAAE,QAAQ;yBAChB,MAAM,EAAE,QAAQ;;;iBAGlB,SAAS;qBACR,MAAM;yBACL,MAAM,EAAE,QAAQ;yBAChB,UAAU,EAAE,QAAQ;yBACpB,OAAO,EAAE,QAAQ;yBACjB,QAAQ,EAAE,QAAQ;yBAClB,UAAU,EAAE,QAAQ;yBACpB,MAAM,EAAE,QAAQ;yBAChB,YAAY,EAAE,QAAQ;yBACtB,cAAc,EAAE,QAAQ;;;iBAG1B,MAAM,EAAE,QAAQ;iBAChB,cAAc,EAAE,QAAQ;iBACxB,MAAM;qBACL,MAAM;yBACL,SAAS,EAAE,QAAQ;yBACnB,MAAM,EAAE,QAAQ;;;;CAIM,CAAC;AAE3B,eAAO,MAAM,YAAY;;iBAEvB,MAAM;qBACL,MAAM,EAAE,QAAQ;qBAChB,iBAAiB,EAAE,SAAS;qBAC5B,+BAA+B,EAAE,QAAQ;qBACzC,UAAU,EAAE,QAAQ;qBACpB,WAAW,EAAE,QAAQ;qBACrB,SAAS;yBACR,MAAM;6BACL,MAAM,EAAE,QAAQ;6BAChB,UAAU,EAAE,QAAQ;6BACpB,OAAO,EAAE,QAAQ;6BACjB,QAAQ,EAAE,QAAQ;6BAClB,UAAU,EAAE,QAAQ;6BACpB,MAAM,EAAE,QAAQ;6BAChB,YAAY,EAAE,QAAQ;6BACtB,cAAc,EAAE,QAAQ;;;qBAG1B,UAAU,EAAE,QAAQ;qBACpB,gBAAgB,EAAE,QAAQ;qBAC1B,UAAU,EAAE,QAAQ;qBACpB,IAAI,EAAE,QAAQ;;;CAGS,CAAC;AAE3B,eAAO,MAAM,sBAAsB;;iBAEjC,MAAM;qBACL,iBAAiB,EAAE,SAAS;qBAC5B,+BAA+B,EAAE,QAAQ;qBACzC,SAAS;yBACR,MAAM;6BACL,MAAM,EAAE,QAAQ;6BAChB,UAAU,EAAE,QAAQ;6BACpB,OAAO,EAAE,QAAQ;6BACjB,QAAQ,EAAE,QAAQ;6BAClB,UAAU,EAAE,QAAQ;6BACpB,MAAM,EAAE,QAAQ;6BAChB,YAAY,EAAE,QAAQ;6BACtB,cAAc,EAAE,QAAQ;;;qBAG1B,YAAY;yBACX,MAAM;6BACL,cAAc,EAAE,QAAQ;6BACxB,UAAU,EAAE,QAAQ;;;qBAGtB,YAAY,EAAE,QAAQ;;;CAGC,CAAC"}
@@ -0,0 +1,97 @@
1
+ export const decisionV12 = {
2
+ fields: {
3
+ attentionOwner: "string",
4
+ boardAcknowledgementDisposition: "string",
5
+ code: "string",
6
+ id: "string",
7
+ links: { array: "string" },
8
+ publicationWork: {
9
+ fields: {
10
+ approved: "boolean",
11
+ areas: { array: "string" },
12
+ context: "string",
13
+ deliverable: "string",
14
+ dependsOn: { array: "string" },
15
+ revision: "string",
16
+ sourcePath: "string",
17
+ status: "string",
18
+ workId: "string",
19
+ },
20
+ },
21
+ published: {
22
+ fields: {
23
+ itemId: "string",
24
+ questionId: "string",
25
+ request: "string",
26
+ revision: "string",
27
+ sourcePath: "string",
28
+ workId: "string",
29
+ workRevision: "string",
30
+ workSourcePath: "string",
31
+ },
32
+ },
33
+ reason: "string",
34
+ recommendation: "string",
35
+ worker: {
36
+ fields: {
37
+ sessionId: "string",
38
+ turnId: "string",
39
+ },
40
+ },
41
+ },
42
+ };
43
+ export const responsesV12 = {
44
+ array: {
45
+ fields: {
46
+ action: "string",
47
+ boardAcknowledged: "boolean",
48
+ boardAcknowledgementDisposition: "string",
49
+ decisionId: "string",
50
+ processedAt: "number",
51
+ published: {
52
+ fields: {
53
+ itemId: "string",
54
+ questionId: "string",
55
+ request: "string",
56
+ revision: "string",
57
+ sourcePath: "string",
58
+ workId: "string",
59
+ workRevision: "string",
60
+ workSourcePath: "string",
61
+ },
62
+ },
63
+ questionId: "string",
64
+ questionRevision: "string",
65
+ responseId: "string",
66
+ type: "string",
67
+ },
68
+ },
69
+ };
70
+ export const supersededDecisionsV12 = {
71
+ array: {
72
+ fields: {
73
+ boardAcknowledged: "boolean",
74
+ boardAcknowledgementDisposition: "string",
75
+ published: {
76
+ fields: {
77
+ itemId: "string",
78
+ questionId: "string",
79
+ request: "string",
80
+ revision: "string",
81
+ sourcePath: "string",
82
+ workId: "string",
83
+ workRevision: "string",
84
+ workSourcePath: "string",
85
+ },
86
+ },
87
+ reassignedTo: {
88
+ fields: {
89
+ attentionOwner: "string",
90
+ decisionId: "string",
91
+ },
92
+ },
93
+ supersededAt: "number",
94
+ },
95
+ },
96
+ };
97
+ //# sourceMappingURL=typedDecisionsV12.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typedDecisionsV12.js","sourceRoot":"","sources":["../../src/storage/typedDecisionsV12.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG;IAC1B,MAAM,EAAE;QACP,cAAc,EAAE,QAAQ;QACxB,+BAA+B,EAAE,QAAQ;QACzC,IAAI,EAAE,QAAQ;QACd,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC1B,eAAe,EAAE;YAChB,MAAM,EAAE;gBACP,QAAQ,EAAE,SAAS;gBACnB,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;gBAC1B,OAAO,EAAE,QAAQ;gBACjB,WAAW,EAAE,QAAQ;gBACrB,SAAS,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;gBAC9B,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,QAAQ;gBACpB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,QAAQ;aAChB;SACD;QACD,SAAS,EAAE;YACV,MAAM,EAAE;gBACP,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,QAAQ;gBACpB,OAAO,EAAE,QAAQ;gBACjB,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,QAAQ;gBACpB,MAAM,EAAE,QAAQ;gBAChB,YAAY,EAAE,QAAQ;gBACtB,cAAc,EAAE,QAAQ;aACxB;SACD;QACD,MAAM,EAAE,QAAQ;QAChB,cAAc,EAAE,QAAQ;QACxB,MAAM,EAAE;YACP,MAAM,EAAE;gBACP,SAAS,EAAE,QAAQ;gBACnB,MAAM,EAAE,QAAQ;aAChB;SACD;KACD;CACwB,CAAC;AAE3B,MAAM,CAAC,MAAM,YAAY,GAAG;IAC3B,KAAK,EAAE;QACN,MAAM,EAAE;YACP,MAAM,EAAE,QAAQ;YAChB,iBAAiB,EAAE,SAAS;YAC5B,+BAA+B,EAAE,QAAQ;YACzC,UAAU,EAAE,QAAQ;YACpB,WAAW,EAAE,QAAQ;YACrB,SAAS,EAAE;gBACV,MAAM,EAAE;oBACP,MAAM,EAAE,QAAQ;oBAChB,UAAU,EAAE,QAAQ;oBACpB,OAAO,EAAE,QAAQ;oBACjB,QAAQ,EAAE,QAAQ;oBAClB,UAAU,EAAE,QAAQ;oBACpB,MAAM,EAAE,QAAQ;oBAChB,YAAY,EAAE,QAAQ;oBACtB,cAAc,EAAE,QAAQ;iBACxB;aACD;YACD,UAAU,EAAE,QAAQ;YACpB,gBAAgB,EAAE,QAAQ;YAC1B,UAAU,EAAE,QAAQ;YACpB,IAAI,EAAE,QAAQ;SACd;KACD;CACwB,CAAC;AAE3B,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACrC,KAAK,EAAE;QACN,MAAM,EAAE;YACP,iBAAiB,EAAE,SAAS;YAC5B,+BAA+B,EAAE,QAAQ;YACzC,SAAS,EAAE;gBACV,MAAM,EAAE;oBACP,MAAM,EAAE,QAAQ;oBAChB,UAAU,EAAE,QAAQ;oBACpB,OAAO,EAAE,QAAQ;oBACjB,QAAQ,EAAE,QAAQ;oBAClB,UAAU,EAAE,QAAQ;oBACpB,MAAM,EAAE,QAAQ;oBAChB,YAAY,EAAE,QAAQ;oBACtB,cAAc,EAAE,QAAQ;iBACxB;aACD;YACD,YAAY,EAAE;gBACb,MAAM,EAAE;oBACP,cAAc,EAAE,QAAQ;oBACxB,UAAU,EAAE,QAAQ;iBACpB;aACD;YACD,YAAY,EAAE,QAAQ;SACtB;KACD;CACwB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ export declare const typedTables: (namespace: string) => Effect.Effect<void, Schema.SchemaError | import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
4
+ //# sourceMappingURL=typedTables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typedTables.d.ts","sourceRoot":"","sources":["../../src/storage/typedTables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AASvC,eAAO,MAAM,WAAW,8HA4BtB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { SqlClient } from "effect/sql";
3
+ import { createCollections } from "#storage/createCollections.ts";
4
+ import { legacyColumns } from "#storage/legacyColumns.ts";
5
+ import { modelFromColumns } from "#storage/model.ts";
6
+ import { inputColumns, makeRecordChildren } from "#storage/recordChildren.ts";
7
+ import { shapeColumns, sqlTypes } from "#storage/recordShape.ts";
8
+ import { shapeV12 } from "#storage/shapeV12.ts";
9
+ import { textRecordValue } from "#storage/textRecordValue.ts";
10
+ export const typedTables = Effect.fn("FleetStore.typedTables")(function* (namespace) {
11
+ const sql = yield* SqlClient.SqlClient;
12
+ const table = `${namespace}_records`;
13
+ const structured = Object.entries(legacyColumns)
14
+ .filter(([_name, kind]) => kind === "json")
15
+ .map(([name]) => name);
16
+ for (const name of structured) {
17
+ yield* sql `alter table ${sql(table)} rename column ${sql(name)} to ${sql(`legacy_${name}`)}`;
18
+ }
19
+ const columns = shapeColumns(shapeV12);
20
+ for (const [name, kind] of Object.entries(columns)) {
21
+ if (!(name in legacyColumns) || structured.includes(name)) {
22
+ yield* sql `alter table ${sql(table)} add column ${sql(name)} ${sql.literal(sqlTypes[kind])}`;
23
+ }
24
+ }
25
+ yield* createCollections(namespace, shapeV12);
26
+ const rows = yield* sql `select * from ${sql(table)} order by admission_order`;
27
+ const model = modelFromColumns(columns);
28
+ const saveChildren = yield* makeRecordChildren(namespace, shapeV12);
29
+ for (const row of rows) {
30
+ const value = yield* textRecordValue(row, structured);
31
+ const input = yield* Schema.decodeUnknownEffect(model.insert)({ ...inputColumns(value, shapeV12), "work_id": row.work_id });
32
+ yield* sql `update ${sql(table)} set ${sql.update(yield* Schema.encodeEffect(model.insert)(input))} where work_id = ${row.work_id}`;
33
+ yield* saveChildren(String(row.work_id), value, false);
34
+ }
35
+ for (const name of structured) {
36
+ yield* sql `alter table ${sql(table)} drop column ${sql(`legacy_${name}`)}`;
37
+ }
38
+ });
39
+ //# sourceMappingURL=typedTables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typedTables.js","sourceRoot":"","sources":["../../src/storage/typedTables.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shivaedev/work-fleet",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Optional Board-backed execution, review and authorized delivery",
5
5
  "homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/work-fleet#readme",
6
6
  "bugs": {
@@ -45,20 +45,20 @@
45
45
  ],
46
46
  "dependencies": {
47
47
  "@effect/sql-pg": "4.0.4",
48
- "@shivaedev/effect-contract": "0.5.0",
48
+ "@shivaedev/effect-contract": "0.5.1",
49
49
  "@shivaedev/effect-service": "0.3.0",
50
- "@shivaedev/effect-sql": "0.3.0",
51
- "@shivaedev/platform": "0.8.0",
52
- "@shivaedev/work-board": "0.14.0",
50
+ "@shivaedev/effect-sql": "0.5.0",
51
+ "@shivaedev/platform": "0.14.0",
52
+ "@shivaedev/work-board": "0.14.1",
53
53
  "yaml": "2.9.1"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@effect/platform-node": "4.0.4",
57
57
  "@effect/platform-node-shared": "4.0.4",
58
58
  "@effect/vitest": "4.0.4",
59
- "@shivaedev/effect-test": "0.4.0",
60
- "@shivaedev/effect-test-sql": "0.3.0",
61
- "@shivaedev/quality": "0.20.0",
59
+ "@shivaedev/effect-test": "0.5.0",
60
+ "@shivaedev/effect-test-sql": "0.4.0",
61
+ "@shivaedev/quality": "0.22.0",
62
62
  "@types/node": "24.19.1",
63
63
  "@typescript/native": "npm:typescript@7.0.2",
64
64
  "effect": "4.0.4",
@@ -0,0 +1,63 @@
1
+ import { Effect, Result } from "effect";
2
+ import type { EngineState } from "#engine/makeState.ts";
3
+ import type { Attempt, FleetRecord } from "#model.ts";
4
+ import type { SessionObservation } from "#session/schema.ts";
5
+ import type { Versioned } from "#storage/model.ts";
6
+
7
+ export const abandonStalled = Effect.fn("Fleet.abandonStalled")(function* (state: EngineState, stored: Versioned<FleetRecord>) {
8
+ const latest = stored.value.attempts.at(-1);
9
+ if (!hasStalledAttempt(stored.value) || latest?.abandoned !== undefined) {
10
+ return stored;
11
+ }
12
+ const targets = stored.value.attempts.filter((attempt) => attempt === latest || ["submitting", "accepted", "running"].includes(attempt.status));
13
+ const at = state.policy.now();
14
+ let current = yield* state.save(stored, {
15
+ ...stored.value,
16
+ attempts: stored.value.attempts.map((attempt) =>
17
+ targets.includes(attempt)
18
+ ? {
19
+ ...attempt,
20
+ abandoned: attempt.abandoned ?? { at, observation: lastObservation(attempt) },
21
+ output: undefined,
22
+ sessionUnusable: true,
23
+ status: "failed" as const,
24
+ }
25
+ : attempt,
26
+ ),
27
+ });
28
+ for (const attempt of targets) {
29
+ const receipt = attempt.receipt;
30
+ if (receipt === undefined) {
31
+ continue;
32
+ }
33
+ const interrupted = yield* state.sessions.interrupt(receipt).pipe(Effect.timeout("5 seconds"), Effect.result);
34
+ const observed = yield* state.sessions.observe(receipt).pipe(Effect.timeout("5 seconds"), Effect.result);
35
+ const abandoned = {
36
+ at: attempt.abandoned?.at ?? at,
37
+ interruptError: Result.isFailure(interrupted) ? interrupted.failure.message : undefined,
38
+ observation: Result.isSuccess(observed) ? observed.success : (attempt.abandoned?.observation ?? lastObservation(attempt)),
39
+ observationError: Result.isFailure(observed) ? observed.failure.message : undefined,
40
+ };
41
+ current = yield* state.save(current, {
42
+ ...current.value,
43
+ attempts: current.value.attempts.map((saved) => (saved.operationId === attempt.operationId ? { ...saved, abandoned } : saved)),
44
+ });
45
+ }
46
+ return current;
47
+ });
48
+
49
+ function hasStalledAttempt(record: FleetRecord): boolean {
50
+ const latest = record.attempts.at(-1);
51
+ return record.decision?.code === "session-stalled" || (latest?.sessionUnusable === true && (latest.stallRecovery?.count ?? 0) >= 2);
52
+ }
53
+
54
+ function lastObservation(attempt: Attempt): SessionObservation | undefined {
55
+ return attempt.receipt === undefined || attempt.status === "submitting"
56
+ ? undefined
57
+ : {
58
+ execution: attempt.status,
59
+ output: attempt.output ?? "",
60
+ provisioning: "unknown",
61
+ receipt: attempt.receipt,
62
+ };
63
+ }
@@ -69,6 +69,9 @@ function retryRework(state: EngineState) {
69
69
  return undefined;
70
70
  }
71
71
  const latest = record.attempts.at(-1);
72
+ if (latest?.role === "reviewer" && latest.abandoned !== undefined) {
73
+ return undefined;
74
+ }
72
75
  let changes = body.trim();
73
76
  if (record.decision?.code === "pr-conflicting") {
74
77
  changes = ["GitHub reports a conflict with main. Fetch and merge main, resolve the conflicts, and retain the requested changes.", changes]
@@ -1,10 +1,12 @@
1
1
  import { Effect } from "effect";
2
2
  import { workRevision } from "#board/workRevision.ts";
3
+ import { abandonStalled } from "#engine/abandonStalled.ts";
3
4
  import { authorizeBrief, briefChanged } from "#engine/boardBrief.ts";
4
5
  import { closeDecisions } from "#engine/closeDecisions.ts";
5
6
  import { ensurePublication } from "#engine/ensurePublication.ts";
6
7
  import { launchPrompt } from "#engine/makeLaunch.ts";
7
8
  import type { EngineState } from "#engine/makeState.ts";
9
+ import { briefSteerIntent, steerBrief } from "#engine/steerBrief.ts";
8
10
  import { executing, type FleetRecord } from "#model.ts";
9
11
  import type { BoardWork, DecisionResponse } from "#policy.ts";
10
12
  import type { Versioned } from "#storage/model.ts";
@@ -17,41 +19,41 @@ export function approveBrief(state: EngineState) {
17
19
  responses?: readonly DecisionResponse[],
18
20
  ) {
19
21
  yield* authorizeBrief(work);
20
- const stored = yield* ensurePublication(state)(input);
22
+ const stored = yield* ensurePublication(state)(input).pipe(Effect.flatMap((current) => abandonStalled(state, current)));
21
23
  const record = stored.value;
22
24
  const published = record.decision?.published;
23
25
  const approvedPrompt = prompt ?? revisedPrompt(record, work);
24
- return yield* state
25
- .save(stored, {
26
- ...record,
27
- areas: work.areas,
28
- attempts: record.attempts.map((attempt) =>
29
- attempt.role === "reviewer" && attempt.reviewRevision === undefined
30
- ? { ...attempt, reviewRevision: workRevision(record.boardRevision, record.boardContext) }
31
- : attempt,
32
- ),
33
- blocker: undefined,
34
- boardContext: work.context,
35
- boardRevision: work.revision,
36
- boardSourcePath: work.sourcePath,
37
- checks: undefined,
38
- decision: undefined,
39
- decisionAcknowledged: undefined,
40
- decisionPublished: undefined,
41
- launchRetry: revisedRetry(record, approvedPrompt, state.policy.workerGuidance),
42
- mergeAreasReleased: undefined,
43
- mergeReadyAt: undefined,
44
- mergeReadyHead: undefined,
45
- prompt: approvedPrompt,
46
- responses: responses ?? record.responses,
47
- review: undefined,
48
- stage: resumedStage(record),
49
- supersededDecisions:
50
- published === undefined
51
- ? record.supersededDecisions
52
- : [...(record.supersededDecisions ?? []), { published, supersededAt: state.policy.now() }],
53
- })
54
- .pipe(Effect.flatMap(closeDecisions(state)));
26
+ const updated: FleetRecord = {
27
+ ...record,
28
+ areas: work.areas,
29
+ attempts: record.attempts.map((attempt) =>
30
+ attempt.role === "reviewer" && attempt.reviewRevision === undefined
31
+ ? { ...attempt, reviewRevision: workRevision(record.boardRevision, record.boardContext) }
32
+ : attempt,
33
+ ),
34
+ blocker: undefined,
35
+ boardContext: work.context,
36
+ boardRevision: work.revision,
37
+ boardSourcePath: work.sourcePath,
38
+ checks: undefined,
39
+ decision: undefined,
40
+ decisionAcknowledged: undefined,
41
+ decisionPublished: undefined,
42
+ launchRetry: revisedRetry(record, approvedPrompt, state.policy.workerGuidance),
43
+ mergeAreasReleased: undefined,
44
+ mergeReadyAt: undefined,
45
+ mergeReadyHead: undefined,
46
+ prompt: approvedPrompt,
47
+ responses: responses ?? record.responses,
48
+ review: undefined,
49
+ stage: resumedStage(record),
50
+ supersededDecisions:
51
+ published === undefined
52
+ ? record.supersededDecisions
53
+ : [...(record.supersededDecisions ?? []), { published, supersededAt: state.policy.now() }],
54
+ };
55
+ const approved = yield* state.save(stored, briefSteerIntent(record, updated, state.policy.now())).pipe(Effect.flatMap(closeDecisions(state)));
56
+ return yield* steerBrief(state, approved, record);
55
57
  });
56
58
  }
57
59
 
@@ -1,7 +1,9 @@
1
1
  import type { FleetRecord } from "#model.ts";
2
2
 
3
3
  export function exhaustedCheckRepairs(record: FleetRecord, failures: readonly string[]): readonly string[] {
4
- const repairs = record.attempts.filter((attempt) => attempt.role !== "reviewer").slice(-3);
4
+ const repairs = record.attempts
5
+ .filter((attempt) => attempt.role !== "reviewer" && !(attempt.role === "repair" && attempt.status === "failed" && attempt.receipt === undefined))
6
+ .slice(-3);
5
7
  if (repairs.length < 3 || repairs.some((attempt) => attempt.role !== "repair" || attempt.status !== "completed")) {
6
8
  return [];
7
9
  }
@@ -40,6 +40,18 @@ export function makeAdopt(state: EngineState) {
40
40
  }
41
41
  const result = adopted.success;
42
42
  yield* validateResult(stored.value, result);
43
+ if (
44
+ latest.role === "repair"
45
+ && latest.checkFailures !== undefined
46
+ && result.kind === "change"
47
+ && stored.value.result?.kind === "change"
48
+ && result.pr === stored.value.result.pr
49
+ && result.head === stored.value.result.head
50
+ && stored.value.review?.head === result.head
51
+ && stored.value.review.verdict === "approved"
52
+ ) {
53
+ return yield* save(stored, { ...stored.value, checks: undefined, result, stage: "validating" });
54
+ }
43
55
  return yield* save(stored, { ...stored.value, checks: undefined, result, review: undefined, stage: "reviewing" });
44
56
  });
45
57
  }
@@ -2,6 +2,9 @@ import type { Attempt } from "#model.ts";
2
2
  import type { SessionObservation } from "#session/schema.ts";
3
3
 
4
4
  export function observedAttempt(attempt: Attempt, observation: SessionObservation, now: number): Attempt {
5
+ if (attempt.abandoned !== undefined) {
6
+ return attempt;
7
+ }
5
8
  const signature = observation.progress === undefined ? undefined : JSON.stringify(observation.progress);
6
9
  const progress = signature === undefined || signature === attempt.progress?.signature ? attempt.progress : { at: now, signature };
7
10
  return {
@@ -43,12 +43,33 @@ export function prepareCommand(state: EngineState) {
43
43
  if (unusedPreparation(existing.value)) {
44
44
  return yield* save(existing, { ...current, history: existing.value.history });
45
45
  }
46
+ if (refreshablePreparation(existing.value, work, input)) {
47
+ return yield* save(existing, {
48
+ ...existing.value,
49
+ cwd: input.cwd,
50
+ launch: input.launch,
51
+ preparation: input.preparation,
52
+ prompt: input.prompt,
53
+ });
54
+ }
46
55
  return yield* renewPreparation(state, existing, current, work);
47
56
  });
48
57
  }
49
58
  function unusedPreparation(record: FleetRecord): boolean {
50
59
  return record.stage === "prepared" && record.attempts.length === 0 && record.decision === undefined && (record.responses?.length ?? 0) === 0;
51
60
  }
61
+ function refreshablePreparation(record: FleetRecord, work: BoardWork, input: PrepareWork): boolean {
62
+ return (
63
+ record.stage === "prepared"
64
+ && record.decision === undefined
65
+ && record.result === undefined
66
+ && !executing(record)
67
+ && !briefChanged(record, work)
68
+ && record.cwd === input.cwd
69
+ && record.preparation.ownedPaths.length === input.preparation.ownedPaths.length
70
+ && record.preparation.ownedPaths.every((path, index) => path === input.preparation.ownedPaths[index])
71
+ );
72
+ }
52
73
  const renewPreparation = Effect.fn("Fleet.renewPreparation")(function* (
53
74
  state: EngineState,
54
75
  input: Versioned<FleetRecord>,
@@ -30,11 +30,15 @@ export const recoverStall = Effect.fn("Fleet.recoverStall")(function* (
30
30
  }
31
31
  const count = recovery?.count ?? 0;
32
32
  if (count >= 2) {
33
+ const exhausted = yield* state.save(stored, {
34
+ ...stored.value,
35
+ attempts: stored.value.attempts.map((entry) => (entry.operationId === attempt.operationId ? { ...entry, sessionUnusable: true } : entry)),
36
+ });
33
37
  return yield* state.decision(
34
- stored,
38
+ exhausted,
35
39
  "session-stalled",
36
40
  "Provider turn stalled after automatic steer and interrupt recovery",
37
- "Inspect the worker thread and retry or safely release",
41
+ "Retry in a fresh session or abandon the stalled turn and release ownership",
38
42
  );
39
43
  }
40
44
  if (count === 0) {
@@ -60,6 +60,7 @@ const FleetSessionJournal = defineService({
60
60
  const original = stored.value.attempts.find((attempt) => attempt.operationId === operationId);
61
61
  if (
62
62
  original === undefined
63
+ || original.abandoned !== undefined
63
64
  || (original.sessionId === undefined && original.status !== "submitting")
64
65
  || (original.role === "reviewer"
65
66
  && allAttempts(stored.value).some((attempt) => attempt.role !== "reviewer" && attempt.sessionId === sessionId))
@@ -1,4 +1,5 @@
1
1
  import { Effect } from "effect";
2
+ import { abandonStalled } from "#engine/abandonStalled.ts";
2
3
  import { authorizeResolution } from "#engine/authorizeResolution.ts";
3
4
  import type { EngineState } from "#engine/makeState.ts";
4
5
  import { releaseExecution } from "#engine/releaseExecution.ts";
@@ -14,7 +15,8 @@ export const resolveExecution = Effect.fn("Fleet.resolveExecution")(function* (
14
15
  if (action === "retry") {
15
16
  yield* authorizeResolution(state, stored.value, action);
16
17
  }
17
- const fenced = yield* retireUnacknowledged(state, stored);
18
+ const resolved = yield* abandonStalled(state, stored);
19
+ const fenced = yield* retireUnacknowledged(state, resolved);
18
20
  const current = action === "release" && executing(fenced.value) ? yield* releaseExecution(state, fenced) : fenced;
19
21
  if (action === "release") {
20
22
  yield* authorizeResolution(state, current.value, action);