@shivaedev/work-fleet 0.6.0 → 0.7.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 (427) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +6 -4
  3. package/dist/DecisionCode.d.ts +1 -1
  4. package/dist/DecisionCode.d.ts.map +1 -1
  5. package/dist/DecisionCode.js +1 -0
  6. package/dist/DecisionCode.js.map +1 -1
  7. package/dist/admit.d.ts +2 -2
  8. package/dist/board/acknowledgeDecision.d.ts.map +1 -1
  9. package/dist/board/acknowledgeDecision.js +7 -3
  10. package/dist/board/acknowledgeDecision.js.map +1 -1
  11. package/dist/board/briefRevision.d.ts +1 -1
  12. package/dist/board/briefRevision.d.ts.map +1 -1
  13. package/dist/board/briefRevision.js +1 -1
  14. package/dist/board/briefRevision.js.map +1 -1
  15. package/dist/board/closePublishedDecision.d.ts +22 -0
  16. package/dist/board/closePublishedDecision.d.ts.map +1 -0
  17. package/dist/board/closePublishedDecision.js +41 -0
  18. package/dist/board/closePublishedDecision.js.map +1 -0
  19. package/dist/board/decisionAnswer.d.ts +2 -2
  20. package/dist/board/decisionAnswer.d.ts.map +1 -1
  21. package/dist/board/decisionAnswer.js +8 -8
  22. package/dist/board/decisionAnswer.js.map +1 -1
  23. package/dist/board/decisionReading.js +2 -2
  24. package/dist/board/decisionReading.js.map +1 -1
  25. package/dist/board/documents.d.ts +1 -2
  26. package/dist/board/documents.d.ts.map +1 -1
  27. package/dist/board/documents.js +4 -4
  28. package/dist/board/documents.js.map +1 -1
  29. package/dist/board/fleetField.d.ts +1 -1
  30. package/dist/board/fleetField.d.ts.map +1 -1
  31. package/dist/board/markdown.d.ts.map +1 -1
  32. package/dist/board/markdown.js +6 -5
  33. package/dist/board/markdown.js.map +1 -1
  34. package/dist/board/publish.d.ts +1 -1
  35. package/dist/board/publish.d.ts.map +1 -1
  36. package/dist/board/publish.js +10 -8
  37. package/dist/board/publish.js.map +1 -1
  38. package/dist/board/publishReport.js +2 -2
  39. package/dist/board/publishReport.js.map +1 -1
  40. package/dist/board/readDocument.js +1 -1
  41. package/dist/board/readDocument.js.map +1 -1
  42. package/dist/board/readPass.d.ts +1 -1
  43. package/dist/board/readPass.d.ts.map +1 -1
  44. package/dist/board/readPass.js +1 -1
  45. package/dist/board/readPass.js.map +1 -1
  46. package/dist/board/reportIdentity.js +1 -1
  47. package/dist/board/reportIdentity.js.map +1 -1
  48. package/dist/board/reportLinks.js +1 -1
  49. package/dist/board/reportLinks.js.map +1 -1
  50. package/dist/board/schema.d.ts +13 -13
  51. package/dist/board/schema.js +2 -2
  52. package/dist/board/schema.js.map +1 -1
  53. package/dist/board/upgradeDecisionClosure.d.ts +5 -0
  54. package/dist/board/upgradeDecisionClosure.d.ts.map +1 -0
  55. package/dist/board/upgradeDecisionClosure.js +46 -0
  56. package/dist/board/upgradeDecisionClosure.js.map +1 -0
  57. package/dist/board/workRevision.js +2 -2
  58. package/dist/board/workRevision.js.map +1 -1
  59. package/dist/board/writeHealth.d.ts +1 -1
  60. package/dist/board/writeHealth.d.ts.map +1 -1
  61. package/dist/board/writeHealth.js +1 -1
  62. package/dist/board/writeHealth.js.map +1 -1
  63. package/dist/board/writePublished.d.ts +1 -1
  64. package/dist/board/writePublished.d.ts.map +1 -1
  65. package/dist/board/writePublished.js +5 -1
  66. package/dist/board/writePublished.js.map +1 -1
  67. package/dist/cli.js +11 -5
  68. package/dist/cli.js.map +1 -1
  69. package/dist/engine/abandonStalled.d.ts +530 -533
  70. package/dist/engine/abandonStalled.d.ts.map +1 -1
  71. package/dist/engine/admissionOrder.d.ts +4 -4
  72. package/dist/engine/applyResolution.d.ts +4 -4
  73. package/dist/engine/approveBrief.d.ts +6 -6
  74. package/dist/engine/authorizeResolution.d.ts +528 -531
  75. package/dist/engine/authorizeResolution.d.ts.map +1 -1
  76. package/dist/engine/authorizeResolution.js +1 -1
  77. package/dist/engine/authorizeResolution.js.map +1 -1
  78. package/dist/engine/boardBrief.d.ts +7 -6
  79. package/dist/engine/boardBrief.d.ts.map +1 -1
  80. package/dist/engine/boardBrief.js +3 -10
  81. package/dist/engine/boardBrief.js.map +1 -1
  82. package/dist/engine/capacityRetry.d.ts +1715 -1724
  83. package/dist/engine/capacityRetry.d.ts.map +1 -1
  84. package/dist/engine/closeDecisions.d.ts +4 -4
  85. package/dist/engine/completeBoardWork.d.ts +4 -4
  86. package/dist/engine/completeReport.d.ts +277 -280
  87. package/dist/engine/completeReport.d.ts.map +1 -1
  88. package/dist/engine/continueCommand.d.ts +2 -2
  89. package/dist/engine/continueWorker.d.ts +4 -4
  90. package/dist/engine/decisionCopy.d.ts +15 -0
  91. package/dist/engine/decisionCopy.d.ts.map +1 -0
  92. package/dist/engine/decisionCopy.js +44 -0
  93. package/dist/engine/decisionCopy.js.map +1 -0
  94. package/dist/engine/deliverPendingAnswers.d.ts +534 -537
  95. package/dist/engine/deliverPendingAnswers.d.ts.map +1 -1
  96. package/dist/engine/dispatchCommand.d.ts +2 -2
  97. package/dist/engine/dispatchCommand.d.ts.map +1 -1
  98. package/dist/engine/dispatchCommand.js +4 -27
  99. package/dist/engine/dispatchCommand.js.map +1 -1
  100. package/dist/engine/dispatchFailure.d.ts +9391 -0
  101. package/dist/engine/dispatchFailure.d.ts.map +1 -0
  102. package/dist/engine/dispatchFailure.js +24 -0
  103. package/dist/engine/dispatchFailure.js.map +1 -0
  104. package/dist/engine/ensureDecisionOwner.d.ts +4 -4
  105. package/dist/engine/ensurePublication.d.ts +4 -4
  106. package/dist/engine/failureCode.js +1 -1
  107. package/dist/engine/failureCode.js.map +1 -1
  108. package/dist/engine/health.d.ts +1 -1
  109. package/dist/engine/health.d.ts.map +1 -1
  110. package/dist/engine/inspectRenewal.d.ts +4 -4
  111. package/dist/engine/launchInput.d.ts +2 -2
  112. package/dist/engine/launchReceipt.d.ts +2 -2
  113. package/dist/engine/makeAdopt.d.ts +4 -4
  114. package/dist/engine/makeAdvance.d.ts +2 -2
  115. package/dist/engine/makeDeliver.d.ts +4 -4
  116. package/dist/engine/makeDeliver.d.ts.map +1 -1
  117. package/dist/engine/makeDeliver.js +5 -1
  118. package/dist/engine/makeDeliver.js.map +1 -1
  119. package/dist/engine/makeHuman.d.ts +4 -4
  120. package/dist/engine/makeLaunch.d.ts +4 -4
  121. package/dist/engine/makeObserve.d.ts +4 -4
  122. package/dist/engine/makeReview.d.ts +4 -4
  123. package/dist/engine/makeState.d.ts +533 -536
  124. package/dist/engine/makeState.d.ts.map +1 -1
  125. package/dist/engine/makeState.js +9 -2
  126. package/dist/engine/makeState.js.map +1 -1
  127. package/dist/engine/makeValidate.d.ts +4 -4
  128. package/dist/engine/mergeReadiness.d.ts +536 -539
  129. package/dist/engine/mergeReadiness.d.ts.map +1 -1
  130. package/dist/engine/mergeReadiness.js +1 -1
  131. package/dist/engine/mergeReadiness.js.map +1 -1
  132. package/dist/engine/missingBoardWork.d.ts +9936 -0
  133. package/dist/engine/missingBoardWork.d.ts.map +1 -0
  134. package/dist/engine/missingBoardWork.js +17 -0
  135. package/dist/engine/missingBoardWork.js.map +1 -0
  136. package/dist/engine/observeDeliveryFailure.d.ts +530 -533
  137. package/dist/engine/observeDeliveryFailure.d.ts.map +1 -1
  138. package/dist/engine/observeRenewal.d.ts +6 -6
  139. package/dist/engine/obtainReview.d.ts +2 -2
  140. package/dist/engine/operationRecord.d.ts +26 -26
  141. package/dist/engine/persistTerminalReceipts.d.ts +4 -4
  142. package/dist/engine/prepareCommand.d.ts +2 -2
  143. package/dist/engine/queueAnswerCommand.d.ts +2 -2
  144. package/dist/engine/readOrContinueReview.d.ts +2 -2
  145. package/dist/engine/readResolution.d.ts +1 -1
  146. package/dist/engine/readResolution.js +1 -1
  147. package/dist/engine/readResolution.js.map +1 -1
  148. package/dist/engine/readRetry.d.ts +1177 -1183
  149. package/dist/engine/readRetry.d.ts.map +1 -1
  150. package/dist/engine/reassignCommand.d.ts +2 -2
  151. package/dist/engine/reconcileAttempt.d.ts +2 -2
  152. package/dist/engine/reconcileCommand.d.ts +2 -2
  153. package/dist/engine/reconcileCommand.d.ts.map +1 -1
  154. package/dist/engine/reconcileCommand.js +2 -1
  155. package/dist/engine/reconcileCommand.js.map +1 -1
  156. package/dist/engine/recordResponseCommand.d.ts +2 -2
  157. package/dist/engine/recoverStall.d.ts +530 -533
  158. package/dist/engine/recoverStall.d.ts.map +1 -1
  159. package/dist/engine/recoverUnobservable.d.ts +530 -533
  160. package/dist/engine/recoverUnobservable.d.ts.map +1 -1
  161. package/dist/engine/refreshBrief.d.ts +1177 -1183
  162. package/dist/engine/refreshBrief.d.ts.map +1 -1
  163. package/dist/engine/refreshReviewResult.d.ts +4 -4
  164. package/dist/engine/releaseClosedPreparation.d.ts +530 -533
  165. package/dist/engine/releaseClosedPreparation.d.ts.map +1 -1
  166. package/dist/engine/releaseExecution.d.ts +530 -533
  167. package/dist/engine/releaseExecution.d.ts.map +1 -1
  168. package/dist/engine/releaseFinishedWork.d.ts +2 -2
  169. package/dist/engine/repository.d.ts +24 -24
  170. package/dist/engine/repository.js +1 -1
  171. package/dist/engine/repository.js.map +1 -1
  172. package/dist/engine/requestConflictRepair.d.ts +530 -533
  173. package/dist/engine/requestConflictRepair.d.ts.map +1 -1
  174. package/dist/engine/requestRework.d.ts +4 -4
  175. package/dist/engine/resolveCommand.d.ts +2 -2
  176. package/dist/engine/resolveExecution.d.ts +530 -533
  177. package/dist/engine/resolveExecution.d.ts.map +1 -1
  178. package/dist/engine/resumeAttempt.d.ts +530 -533
  179. package/dist/engine/resumeAttempt.d.ts.map +1 -1
  180. package/dist/engine/retireUnacknowledged.d.ts +4 -4
  181. package/dist/engine/retryTerminal.d.ts +528 -531
  182. package/dist/engine/retryTerminal.d.ts.map +1 -1
  183. package/dist/engine/saveLaunch.d.ts +532 -535
  184. package/dist/engine/saveLaunch.d.ts.map +1 -1
  185. package/dist/engine/saveLaunch.js +2 -1
  186. package/dist/engine/saveLaunch.js.map +1 -1
  187. package/dist/engine/scheduler.d.ts +4 -4
  188. package/dist/engine/scheduler.d.ts.map +1 -1
  189. package/dist/engine/scheduler.js +4 -1
  190. package/dist/engine/scheduler.js.map +1 -1
  191. package/dist/engine/sessionCleanup.d.ts +4 -4
  192. package/dist/engine/settleMergedDelivery.d.ts +530 -533
  193. package/dist/engine/settleMergedDelivery.d.ts.map +1 -1
  194. package/dist/engine/situations/choices.d.ts +20 -0
  195. package/dist/engine/situations/choices.d.ts.map +1 -0
  196. package/dist/engine/situations/choices.js +21 -0
  197. package/dist/engine/situations/choices.js.map +1 -0
  198. package/dist/engine/situations/service.d.ts +60 -0
  199. package/dist/engine/situations/service.d.ts.map +1 -0
  200. package/dist/engine/situations/service.js +51 -0
  201. package/dist/engine/situations/service.js.map +1 -0
  202. package/dist/engine/situations/stop.d.ts +25 -0
  203. package/dist/engine/situations/stop.d.ts.map +1 -0
  204. package/dist/engine/situations/stop.js +25 -0
  205. package/dist/engine/situations/stop.js.map +1 -0
  206. package/dist/engine/situations/work.d.ts +114 -0
  207. package/dist/engine/situations/work.d.ts.map +1 -0
  208. package/dist/engine/situations/work.js +91 -0
  209. package/dist/engine/situations/work.js.map +1 -0
  210. package/dist/engine/steerBrief.d.ts +532 -535
  211. package/dist/engine/steerBrief.d.ts.map +1 -1
  212. package/dist/engine/submissionFailure.d.ts +526 -529
  213. package/dist/engine/submissionFailure.d.ts.map +1 -1
  214. package/dist/engine/submitLaunch.d.ts +528 -531
  215. package/dist/engine/submitLaunch.d.ts.map +1 -1
  216. package/dist/engine/threadNames.js +1 -1
  217. package/dist/engine/threadNames.js.map +1 -1
  218. package/dist/engine/workerReport.d.ts +7 -7
  219. package/dist/engine/workerReport.d.ts.map +1 -1
  220. package/dist/exposeFailure.js +1 -1
  221. package/dist/exposeFailure.js.map +1 -1
  222. package/dist/fleet.d.ts +26 -26
  223. package/dist/fleet.js +1 -1
  224. package/dist/fleet.js.map +1 -1
  225. package/dist/host/actionCommands.d.ts +10 -10
  226. package/dist/host/actionCommands.d.ts.map +1 -1
  227. package/dist/host/actionCommands.js +6 -6
  228. package/dist/host/actionCommands.js.map +1 -1
  229. package/dist/host/admission.d.ts +4 -4
  230. package/dist/host/answerWork.d.ts +4 -3
  231. package/dist/host/answerWork.d.ts.map +1 -1
  232. package/dist/host/cliOptions.d.ts +5 -1
  233. package/dist/host/cliOptions.d.ts.map +1 -1
  234. package/dist/host/cliOptions.js +6 -4
  235. package/dist/host/cliOptions.js.map +1 -1
  236. package/dist/host/commands.d.ts +1 -1
  237. package/dist/host/commands.d.ts.map +1 -1
  238. package/dist/host/configSettings.d.ts +5 -5
  239. package/dist/host/daemon.d.ts +133 -132
  240. package/dist/host/daemon.d.ts.map +1 -1
  241. package/dist/host/daemon.js +7 -3
  242. package/dist/host/daemon.js.map +1 -1
  243. package/dist/host/daemonClient.d.ts +28 -28
  244. package/dist/host/daemonClient.js +1 -1
  245. package/dist/host/daemonClient.js.map +1 -1
  246. package/dist/host/daemonContract.d.ts +146 -146
  247. package/dist/host/daemonContract.d.ts.map +1 -1
  248. package/dist/host/daemonContract.js +1 -1
  249. package/dist/host/daemonContract.js.map +1 -1
  250. package/dist/host/daemonDiagnostics.js +1 -1
  251. package/dist/host/daemonDiagnostics.js.map +1 -1
  252. package/dist/host/daemonHandlers.d.ts +1 -1
  253. package/dist/host/daemonHandlers.d.ts.map +1 -1
  254. package/dist/host/daemonPort.d.ts +6 -0
  255. package/dist/host/daemonPort.d.ts.map +1 -0
  256. package/dist/host/daemonPort.js +40 -0
  257. package/dist/host/daemonPort.js.map +1 -0
  258. package/dist/host/daemonSnapshots.d.ts +1 -1
  259. package/dist/host/daemonSnapshots.d.ts.map +1 -1
  260. package/dist/host/daemonSnapshots.js +1 -1
  261. package/dist/host/daemonSnapshots.js.map +1 -1
  262. package/dist/host/fleetStatus.d.ts +5 -5
  263. package/dist/host/follow.d.ts +1 -0
  264. package/dist/host/follow.d.ts.map +1 -1
  265. package/dist/host/follow.js +10 -4
  266. package/dist/host/follow.js.map +1 -1
  267. package/dist/host/followCommands.d.ts +2 -2
  268. package/dist/host/followCommands.d.ts.map +1 -1
  269. package/dist/host/followCommands.js +4 -2
  270. package/dist/host/followCommands.js.map +1 -1
  271. package/dist/host/githubApi.js +1 -1
  272. package/dist/host/githubApi.js.map +1 -1
  273. package/dist/host/githubDelivery.js +3 -1
  274. package/dist/host/githubDelivery.js.map +1 -1
  275. package/dist/host/healthLayer.js +1 -1
  276. package/dist/host/healthLayer.js.map +1 -1
  277. package/dist/host/integrations.js +1 -1
  278. package/dist/host/integrations.js.map +1 -1
  279. package/dist/host/mainSource.js +1 -1
  280. package/dist/host/mainSource.js.map +1 -1
  281. package/dist/host/providerHealth.js +1 -1
  282. package/dist/host/providerHealth.js.map +1 -1
  283. package/dist/host/quota.js +1 -1
  284. package/dist/host/quota.js.map +1 -1
  285. package/dist/host/recordDecisionResponse.d.ts +3 -2
  286. package/dist/host/recordDecisionResponse.d.ts.map +1 -1
  287. package/dist/host/recordDecisionResponse.js +1 -1
  288. package/dist/host/recordDecisionResponse.js.map +1 -1
  289. package/dist/host/releaseWork.d.ts +6 -5
  290. package/dist/host/releaseWork.d.ts.map +1 -1
  291. package/dist/host/releaseWork.js +2 -2
  292. package/dist/host/releaseWork.js.map +1 -1
  293. package/dist/host/renderStatus.d.ts +4 -1
  294. package/dist/host/renderStatus.d.ts.map +1 -1
  295. package/dist/host/renderStatus.js +6 -6
  296. package/dist/host/renderStatus.js.map +1 -1
  297. package/dist/host/reportBoard.js +1 -1
  298. package/dist/host/reportBoard.js.map +1 -1
  299. package/dist/host/runtime.d.ts +2 -2
  300. package/dist/host/runtime.d.ts.map +1 -1
  301. package/dist/host/runtime.js +1 -1
  302. package/dist/host/runtime.js.map +1 -1
  303. package/dist/host/statusLayer.js +2 -2
  304. package/dist/host/statusLayer.js.map +1 -1
  305. package/dist/host/watch.d.ts.map +1 -1
  306. package/dist/host/watch.js +1 -1
  307. package/dist/host/watch.js.map +1 -1
  308. package/dist/model.d.ts +9 -9
  309. package/dist/model.js +1 -1
  310. package/dist/model.js.map +1 -1
  311. package/dist/operations.d.ts +57 -57
  312. package/dist/packageInfo.d.ts +1 -1
  313. package/dist/packageInfo.js +1 -1
  314. package/dist/policy.d.ts +3 -2
  315. package/dist/policy.d.ts.map +1 -1
  316. package/dist/policy.js +2 -1
  317. package/dist/policy.js.map +1 -1
  318. package/dist/prompt/briefEdit.js +1 -1
  319. package/dist/prompt/briefEdit.js.map +1 -1
  320. package/dist/providers/codexCloud.js +1 -1
  321. package/dist/providers/codexCloud.js.map +1 -1
  322. package/dist/providers/codexLocal.js +1 -1
  323. package/dist/providers/codexLocal.js.map +1 -1
  324. package/dist/qualifyDependencies.d.ts +2 -2
  325. package/dist/reportFileDirectory.js +1 -1
  326. package/dist/reportFileDirectory.js.map +1 -1
  327. package/dist/scheduling/admission.d.ts +6 -6
  328. package/dist/scheduling/areas.d.ts +6 -6
  329. package/dist/scheduling/backPressure.d.ts +6 -6
  330. package/dist/session/schema.d.ts +1 -1
  331. package/dist/session/service.js +1 -1
  332. package/dist/session/service.js.map +1 -1
  333. package/dist/storage/fleetMigrations.d.ts.map +1 -1
  334. package/dist/storage/fleetMigrations.js +5 -0
  335. package/dist/storage/fleetMigrations.js.map +1 -1
  336. package/dist/storage/makeFleetTransaction.d.ts +1 -1
  337. package/dist/storage/makeFleetTransaction.d.ts.map +1 -1
  338. package/dist/storage/makeFleetTransaction.js +1 -1
  339. package/dist/storage/makeFleetTransaction.js.map +1 -1
  340. package/dist/storage/makeForeignReservations.d.ts.map +1 -1
  341. package/dist/storage/makeForeignReservations.js +16 -4
  342. package/dist/storage/makeForeignReservations.js.map +1 -1
  343. package/package.json +8 -9
  344. package/src/DecisionCode.ts +1 -0
  345. package/src/board/acknowledgeDecision.ts +7 -3
  346. package/src/board/briefRevision.ts +2 -2
  347. package/src/board/closePublishedDecision.ts +51 -0
  348. package/src/board/decisionAnswer.ts +11 -9
  349. package/src/board/decisionReading.ts +3 -3
  350. package/src/board/documents.ts +5 -6
  351. package/src/board/fleetField.ts +1 -1
  352. package/src/board/markdown.ts +6 -5
  353. package/src/board/publish.ts +10 -8
  354. package/src/board/publishReport.ts +2 -2
  355. package/src/board/readDocument.ts +1 -1
  356. package/src/board/readPass.ts +2 -2
  357. package/src/board/reportIdentity.ts +1 -1
  358. package/src/board/reportLinks.ts +1 -1
  359. package/src/board/schema.ts +2 -2
  360. package/src/board/upgradeDecisionClosure.ts +61 -0
  361. package/src/board/workRevision.ts +2 -2
  362. package/src/board/writeHealth.ts +2 -2
  363. package/src/board/writePublished.ts +13 -4
  364. package/src/cli.ts +13 -5
  365. package/src/engine/authorizeResolution.ts +1 -1
  366. package/src/engine/boardBrief.ts +11 -19
  367. package/src/engine/decisionCopy.ts +63 -0
  368. package/src/engine/dispatchCommand.ts +4 -34
  369. package/src/engine/dispatchFailure.ts +25 -0
  370. package/src/engine/failureCode.ts +1 -1
  371. package/src/engine/health.ts +1 -1
  372. package/src/engine/makeDeliver.ts +5 -1
  373. package/src/engine/makeState.ts +14 -4
  374. package/src/engine/mergeReadiness.ts +0 -2
  375. package/src/engine/missingBoardWork.ts +24 -0
  376. package/src/engine/readResolution.ts +2 -2
  377. package/src/engine/reconcileCommand.ts +7 -1
  378. package/src/engine/repository.ts +1 -1
  379. package/src/engine/saveLaunch.ts +2 -0
  380. package/src/engine/scheduler.ts +4 -1
  381. package/src/engine/situations/choices.ts +36 -0
  382. package/src/engine/situations/service.ts +82 -0
  383. package/src/engine/situations/stop.ts +60 -0
  384. package/src/engine/situations/work.ts +94 -0
  385. package/src/engine/threadNames.ts +1 -1
  386. package/src/exposeFailure.ts +1 -1
  387. package/src/fleet.ts +1 -1
  388. package/src/host/actionCommands.ts +6 -6
  389. package/src/host/cliOptions.ts +10 -5
  390. package/src/host/daemon.ts +7 -3
  391. package/src/host/daemonClient.ts +1 -1
  392. package/src/host/daemonContract.ts +1 -1
  393. package/src/host/daemonDiagnostics.ts +1 -1
  394. package/src/host/daemonPort.ts +50 -0
  395. package/src/host/daemonSnapshots.ts +1 -1
  396. package/src/host/follow.ts +16 -5
  397. package/src/host/followCommands.ts +4 -2
  398. package/src/host/githubApi.ts +1 -1
  399. package/src/host/githubDelivery.ts +3 -1
  400. package/src/host/healthLayer.ts +1 -1
  401. package/src/host/integrations.ts +1 -1
  402. package/src/host/mainSource.ts +1 -1
  403. package/src/host/providerHealth.ts +1 -1
  404. package/src/host/quota.ts +1 -1
  405. package/src/host/recordDecisionResponse.ts +1 -1
  406. package/src/host/releaseWork.ts +2 -2
  407. package/src/host/renderStatus.ts +6 -7
  408. package/src/host/reportBoard.ts +1 -1
  409. package/src/host/runtime.ts +1 -1
  410. package/src/host/statusLayer.ts +3 -3
  411. package/src/host/watch.ts +4 -1
  412. package/src/model.ts +1 -1
  413. package/src/packageInfo.ts +1 -1
  414. package/src/policy.ts +2 -1
  415. package/src/prompt/briefEdit.ts +1 -1
  416. package/src/providers/codexCloud.ts +1 -1
  417. package/src/providers/codexLocal.ts +1 -1
  418. package/src/reportFileDirectory.ts +1 -1
  419. package/src/session/service.ts +1 -1
  420. package/src/storage/fleetMigrations.ts +5 -0
  421. package/src/storage/makeFleetTransaction.ts +2 -2
  422. package/src/storage/makeForeignReservations.ts +15 -4
  423. package/dist/engine/releaseOnly.d.ts +0 -3
  424. package/dist/engine/releaseOnly.d.ts.map +0 -1
  425. package/dist/engine/releaseOnly.js +0 -19
  426. package/dist/engine/releaseOnly.js.map +0 -1
  427. package/src/engine/releaseOnly.ts +0 -24
@@ -1 +1 @@
1
- {"version":3,"file":"fleetMigrations.js","sourceRoot":"","sources":["../../src/storage/fleetMigrations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fleetMigrations.js","sourceRoot":"","sources":["../../src/storage/fleetMigrations.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,5 @@ import { Effect } from "effect";
2
2
  import * as Reactivity from "effect/reactivity/Reactivity";
3
3
  import { SqlClient } from "effect/sql";
4
4
  import { type Key } from "@shivaedev/effect-contract/keys.ts";
5
- export declare const makeFleetTransaction: Effect.Effect<<A, E, R>(keys: readonly Key[], body: Effect.Effect<A, E, R>) => Effect.Effect<A, import("effect/sql/SqlError").SqlError | Exclude<E, import("effect/sql/SqlError").SqlError>, Exclude<Exclude<R, SqlClient.SqlClient>, Reactivity.Reactivity>>, never, SqlClient.SqlClient>;
5
+ export declare const makeFleetTransaction: Effect.Effect<<A, E, R>(keys: readonly Key[] | ((value: A) => readonly Key[]), body: Effect.Effect<A, E, R>) => Effect.Effect<A, import("effect/sql/SqlError").SqlError | Exclude<E, import("effect/sql/SqlError").SqlError>, Exclude<Exclude<R, SqlClient.SqlClient>, Reactivity.Reactivity>>, never, SqlClient.SqlClient>;
6
6
  //# sourceMappingURL=makeFleetTransaction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"makeFleetTransaction.d.ts","sourceRoot":"","sources":["../../src/storage/makeFleetTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAoB,KAAK,GAAG,EAAE,MAAM,oCAAoC,CAAC;AAGhF,eAAO,MAAM,oBAAoB,iBAIxB,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,SAAS,GAAG,EAAE,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,gNAKlE,CAAC"}
1
+ {"version":3,"file":"makeFleetTransaction.d.ts","sourceRoot":"","sources":["../../src/storage/makeFleetTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAoB,KAAK,GAAG,EAAE,MAAM,oCAAoC,CAAC;AAGhF,eAAO,MAAM,oBAAoB,iBAIxB,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,SAAS,GAAG,EAAE,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,gNAKnG,CAAC"}
@@ -7,6 +7,6 @@ export const makeFleetTransaction = Effect.gen(function* () {
7
7
  const sql = yield* SqlClient.SqlClient;
8
8
  const current = yield* Effect.serviceOption(Reactivity.Reactivity);
9
9
  const reactivity = current._tag === "Some" ? current.value : yield* Reactivity.make;
10
- return (keys, body) => transact(Effect.tap(body, () => invalidateOnCommit(invalidationKeys(keys))), { onSqlError: (error) => error }).pipe(Effect.provideService(SqlClient.SqlClient, sql), Effect.provideService(Reactivity.Reactivity, reactivity));
10
+ return (keys, body) => transact(Effect.tap(body, (value) => invalidateOnCommit(invalidationKeys(typeof keys === "function" ? keys(value) : keys))), { onSqlError: (error) => error }).pipe(Effect.provideService(SqlClient.SqlClient, sql), Effect.provideService(Reactivity.Reactivity, reactivity));
11
11
  });
12
12
  //# sourceMappingURL=makeFleetTransaction.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"makeFleetTransaction.js","sourceRoot":"","sources":["../../src/storage/makeFleetTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAY,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAEjF,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACvD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;IACpF,OAAO,CAAU,IAAoB,EAAE,IAA4B,EAAE,EAAE,CACtE,QAAQ,CACP,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAClE,EAAE,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAChC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AACpH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"makeFleetTransaction.js","sourceRoot":"","sources":["../../src/storage/makeFleetTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAY,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAEjF,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACvD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;IACpF,OAAO,CAAU,IAAqD,EAAE,IAA4B,EAAE,EAAE,CACvG,QAAQ,CACP,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAClH,EAAE,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAChC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AACpH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"makeForeignReservations.d.ts","sourceRoot":"","sources":["../../src/storage/makeForeignReservations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAMvC,eAAO,MAAM,uBAAuB;;;;;;4BAWV,MAAM;4BAQN,MAAM,cAAa;QAAE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE;8BAcrG,CAAC"}
1
+ {"version":3,"file":"makeForeignReservations.d.ts","sourceRoot":"","sources":["../../src/storage/makeForeignReservations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAMvC,eAAO,MAAM,uBAAuB;;;;;;;4BA8BV,MAAM,cAAa;QAAE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE;8BAcrG,CAAC"}
@@ -13,12 +13,24 @@ export const makeForeignReservations = Effect.fn("FleetStore.makeForeignReservat
13
13
  tableName: `${namespace}_foreign_reservations`,
14
14
  });
15
15
  const lock = sql `select pg_advisory_xact_lock(hashtextextended(${`work_fleet_admission:${namespace}`}, 0))`;
16
+ function exists(owner) {
17
+ return reservations.findMany({ where: { owner } }).pipe(Effect.map((rows) => rows.length > 0));
18
+ }
16
19
  return {
17
20
  foreignReservations: () => reservations.findMany({ orderBy: { direction: "asc", field: "owner" } }),
18
- releaseForeign: (owner) => commit([fleetRecords.list], Effect.gen(function* () {
19
- yield* lock;
20
- yield* reservations.delete(owner);
21
- })),
21
+ releaseForeign: Effect.fn("FleetStore.releaseForeign")(function* (owner) {
22
+ if (!(yield* exists(owner))) {
23
+ return;
24
+ }
25
+ yield* commit((deleted) => (deleted ? [fleetRecords.list] : []), Effect.gen(function* () {
26
+ yield* lock;
27
+ if (!(yield* exists(owner))) {
28
+ return false;
29
+ }
30
+ yield* reservations.delete(owner);
31
+ return true;
32
+ }));
33
+ }),
22
34
  reserveForeign: (owner, occupancy = { backlog: true, executing: true }) => commit([fleetRecords.list], Effect.gen(function* () {
23
35
  yield* lock;
24
36
  const existing = yield* reservations.findMany({ where: { owner } });
@@ -1 +1 @@
1
- {"version":3,"file":"makeForeignReservations.js","sourceRoot":"","sources":["../../src/storage/makeForeignReservations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,EAAE,CAAC,oCAAoC,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAiB;IAClH,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,oBAAoB,CAAC;IAC3C,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC,qBAAqB,EAAE;QACjE,QAAQ,EAAE,OAAO;QACjB,UAAU,EAAE,cAAc;QAC1B,SAAS,EAAE,GAAG,SAAS,uBAAuB;KAC9C,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,GAAG,CAAA,iDAAiD,wBAAwB,SAAS,EAAE,OAAO,CAAC;IAC5G,OAAO;QACN,mBAAmB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;QACnG,cAAc,EAAE,CAAC,KAAa,EAAE,EAAE,CACjC,MAAM,CACL,CAAC,YAAY,CAAC,IAAI,CAAC,EACnB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACnB,KAAK,CAAC,CAAC,IAAI,CAAC;YACZ,KAAK,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC,CAAC,CACF;QACF,cAAc,EAAE,CAAC,KAAa,EAAE,SAAS,GAA+D,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAC7I,MAAM,CACL,CAAC,YAAY,CAAC,IAAI,CAAC,EACnB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACnB,KAAK,CAAC,CAAC,IAAI,CAAC;YACZ,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACpE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,KAAK,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACP,KAAK,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;YACzD,CAAC;QACF,CAAC,CAAC,CACF;KACF,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"makeForeignReservations.js","sourceRoot":"","sources":["../../src/storage/makeForeignReservations.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.6.0",
3
+ "version": "0.7.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": {
@@ -24,9 +24,8 @@
24
24
  },
25
25
  "exports": {
26
26
  "./*.ts": {
27
- "types": "./dist/*.d.ts",
28
27
  "source": "./src/*.ts",
29
- "import": "./dist/*.js",
28
+ "types": "./dist/*.d.ts",
30
29
  "default": "./dist/*.js"
31
30
  },
32
31
  "./package.json": "./package.json"
@@ -46,20 +45,20 @@
46
45
  "dependencies": {
47
46
  "@effect/sql-pg": "4.0.4",
48
47
  "@shivaedev/effect-contract": "0.5.1",
49
- "@shivaedev/effect-service": "0.3.0",
48
+ "@shivaedev/effect-service": "0.4.0",
50
49
  "@shivaedev/effect-sql": "0.5.1",
51
- "@shivaedev/platform": "0.15.0",
52
- "@shivaedev/work-board": "0.17.1",
50
+ "@shivaedev/platform": "0.16.0",
51
+ "@shivaedev/work-board": "0.18.0",
53
52
  "yaml": "2.9.1"
54
53
  },
55
54
  "devDependencies": {
56
55
  "@effect/platform-node": "4.0.4",
57
56
  "@effect/platform-node-shared": "4.0.4",
58
57
  "@effect/vitest": "4.0.4",
59
- "@shivaedev/effect-test": "0.5.0",
58
+ "@shivaedev/effect-test": "0.6.0",
60
59
  "@shivaedev/effect-test-sql": "0.5.4",
61
- "@shivaedev/quality": "0.24.0",
62
- "@shivaedev/test-story": "0.7.0",
60
+ "@shivaedev/quality": "0.25.0",
61
+ "@shivaedev/test-story": "0.7.1",
63
62
  "@types/node": "24.19.2",
64
63
  "@typescript/native": "npm:typescript@7.0.2",
65
64
  "effect": "4.0.4",
@@ -20,6 +20,7 @@ export const DecisionCode = Schema.Literals([
20
20
  "integration-failure",
21
21
  "no-change-checks-unconfigured",
22
22
  "not-ancestor",
23
+ "pr-closed",
23
24
  "pr-conflicting",
24
25
  "pr-head-moved",
25
26
  "provider-quota-unavailable",
@@ -1,7 +1,8 @@
1
1
  import { Effect } from "effect";
2
- import { attention } from "@shivaedev/work-board/integration/attention.ts";
3
- import { board as boardApi } from "@shivaedev/work-board/integration/board.ts";
4
- import { responses } from "@shivaedev/work-board/integration/responses.ts";
2
+ import { attention } from "@shivaedev/work-board/server/integration/attention.ts";
3
+ import { board as boardApi } from "@shivaedev/work-board/server/integration/board.ts";
4
+ import { responses } from "@shivaedev/work-board/server/integration/responses.ts";
5
+ import { closePublishedDecision } from "#board/closePublishedDecision.ts";
5
6
  import { type BoardSnapshot, recordBoardSource } from "#board/readPass.ts";
6
7
  import { BoardAcknowledgementStale, type BoardDecisionAcknowledgement } from "#board/schema.ts";
7
8
  import { BoardFailure } from "#policy.ts";
@@ -49,5 +50,8 @@ export function acknowledgeDecision(root: string, realRoot: string, snapshot: Ef
49
50
  Effect.mapError(() => new BoardFailure({ message: "The managed request acknowledgement could not be recorded on Board." })),
50
51
  );
51
52
  yield* recordBoardSource(realRoot, file, content, receiptDocument.parsed);
53
+ if (input.disposition === "superseded") {
54
+ yield* closePublishedDecision(root, realRoot, source);
55
+ }
52
56
  });
53
57
  }
@@ -1,5 +1,5 @@
1
- import type { ParsedMetadata } from "@shivaedev/work-board/integration/board.ts";
2
- import { responses } from "@shivaedev/work-board/integration/responses.ts";
1
+ import type { ParsedMetadata } from "@shivaedev/work-board/server/integration/board.ts";
2
+ import { responses } from "@shivaedev/work-board/server/integration/responses.ts";
3
3
  import { fleetDeliverable } from "#board/fleetField.ts";
4
4
 
5
5
  const { revisionOf } = responses;
@@ -0,0 +1,51 @@
1
+ import { Effect } from "effect";
2
+ import { parseDocument } from "yaml";
3
+ import { board } from "@shivaedev/work-board/server/integration/board.ts";
4
+ import type { BoardDocument } from "#board/documents.ts";
5
+ import { recordBoardSource } from "#board/readPass.ts";
6
+ import { writeCompletion } from "#board/writeCompletion.ts";
7
+ import { BoardFailure } from "#policy.ts";
8
+
9
+ export function publishedDecision(document: BoardDocument) {
10
+ const { fields, body, diagnostics } = document.parsed;
11
+ const workId = fields.relationships?.find((relation) => relation.kind === "relates_to")?.target;
12
+ const request = fields.attention?.[0];
13
+ if (
14
+ diagnostics.length > 0
15
+ || fields.kind !== "decision"
16
+ || !fields.id?.startsWith("decision.")
17
+ || workId === undefined
18
+ || !body.startsWith(`# Fleet decision for ${workId}\n`)
19
+ || fields.attention?.length !== 1
20
+ || request?.managed !== true
21
+ || !request.id.startsWith(`${workId}.`)
22
+ ) {
23
+ return;
24
+ }
25
+ const sequence = Number(request.id.slice(workId.length + 1));
26
+ return Number.isSafeInteger(sequence) ? { request, sequence, workId } : undefined;
27
+ }
28
+
29
+ export const closePublishedDecision = Effect.fn("FleetBoard.closePublishedDecision")(function* (
30
+ root: string,
31
+ realRoot: string,
32
+ document: BoardDocument,
33
+ ) {
34
+ const decision = publishedDecision(document);
35
+ if (decision === undefined || decision.request.state !== "open") {
36
+ return;
37
+ }
38
+ const header = document.parsed.raw;
39
+ if (header === undefined) {
40
+ return;
41
+ }
42
+ const metadata = parseDocument(header.replace(/^---\r?\n/u, "").replace(/---\r?\n?$/u, ""));
43
+ metadata.setIn(["attention", 0, "state"], "closed");
44
+ const content = `---\n${metadata.toString()}---\n${document.parsed.body}`;
45
+ yield* writeCompletion(root, realRoot, document.file, document.source, content).pipe(
46
+ Effect.mapError((error) => new BoardFailure({ message: error.message })),
47
+ );
48
+ const parsed = board.metadataParse(content);
49
+ yield* recordBoardSource(realRoot, document.file, content, parsed);
50
+ return { file: document.file, parsed, source: content };
51
+ });
@@ -1,12 +1,14 @@
1
- import { releaseOnly } from "#engine/releaseOnly.ts";
2
- import type { Decision } from "#policy.ts";
1
+ import type { DecisionCopy } from "#engine/decisionCopy.ts";
2
+ import type { Choice } from "#engine/situations/choices.ts";
3
3
 
4
- export function decisionAnswer(input: Decision) {
5
- if (input.worker !== undefined) {
6
- return "Record your answer on this item’s answer card to continue the worker in its existing thread. Use a guided release answer or the release command to free terminal ownership instead.";
4
+ export function decisionAnswer({ question }: DecisionCopy) {
5
+ if (question === undefined) {
6
+ return undefined;
7
7
  }
8
- const explanation = releaseOnly(input.code);
9
- const retryText = "### Request changes\nFleet keeps the branch and PR and works on your answer";
10
- const retry = explanation === undefined ? `:::option{id="retry"}\n${retryText}\n:::\n\n` : "";
11
- return `${explanation === undefined ? "" : `${explanation}\n\n`}::::question{id="fleet-action" select="one"}\n### How should Fleet proceed?\n\n${retry}:::option{id="release"}\n### Release\nFleet stops and hands the work back\n:::\n::::`;
8
+ const retry = question.retry === undefined ? "" : `${option("retry", question.retry)}\n`;
9
+ return `::::question{id="fleet-action" select="one"}\n### ${question.title}\n\n${retry}${option("release", question.release)}::::`;
10
+ }
11
+
12
+ function option(id: string, choice: Choice) {
13
+ return `:::option{id="${id}"}\n### ${choice.label}\n${choice.outcome}\n:::\n`;
12
14
  }
@@ -1,7 +1,7 @@
1
1
  import { Effect } from "effect";
2
- import { board } from "@shivaedev/work-board/integration/board.ts";
3
- import type { Reading } from "@shivaedev/work-board/integration/responses.ts";
4
- import { responses } from "@shivaedev/work-board/integration/responses.ts";
2
+ import { board } from "@shivaedev/work-board/server/integration/board.ts";
3
+ import type { Reading } from "@shivaedev/work-board/server/integration/responses.ts";
4
+ import { responses } from "@shivaedev/work-board/server/integration/responses.ts";
5
5
  import type { BoardDocument } from "#board/documents.ts";
6
6
  import type { BoardDecision, BoardDecisionReading } from "#board/schema.ts";
7
7
  import { BoardFailure } from "#policy.ts";
@@ -1,6 +1,6 @@
1
1
  import { Effect, FileSystem, Path } from "effect";
2
- import type { MetadataDocument } from "@shivaedev/work-board/integration/board.ts";
3
- import { board as boardApi } from "@shivaedev/work-board/integration/board.ts";
2
+ import type { MetadataDocument } from "@shivaedev/work-board/server/integration/board.ts";
3
+ import { board as boardApi } from "@shivaedev/work-board/server/integration/board.ts";
4
4
  import { readDocument } from "#board/readDocument.ts";
5
5
  import { BoardSnapshot, readSnapshot } from "#board/readPass.ts";
6
6
  import { BoardFailure } from "#policy.ts";
@@ -13,6 +13,9 @@ export const snapshotDocument = Effect.fn("FleetBoard.snapshotDocument")(functio
13
13
  const matches = snapshot.model.ids.get(workId);
14
14
  const found = matches?.length === 1 ? snapshot.files.get(matches[0]?.file ?? "") : undefined;
15
15
  if (found === undefined) {
16
+ if (matches === undefined && snapshot.problems.size === 0) {
17
+ return yield* Effect.fail(new BoardFailure({ code: "board-item-missing", message: `Board item no longer exists: ${workId}`, workId }));
18
+ }
16
19
  const message = [
17
20
  `Board identity is missing or ambiguous: ${workId}`,
18
21
  ...Array.from(snapshot.problems.values(), (failure) => failure.message),
@@ -83,7 +86,3 @@ export function boardDocuments(root: string, realRoot: string) {
83
86
  export function boundSnapshot(root: string, realRoot: string, fs: FileSystem.FileSystem, path: Path.Path) {
84
87
  return boardSnapshot(root, realRoot).pipe(Effect.provideService(FileSystem.FileSystem, fs), Effect.provideService(Path.Path, path));
85
88
  }
86
-
87
- export function boundDocuments(root: string, realRoot: string, fs: FileSystem.FileSystem, path: Path.Path) {
88
- return boardDocuments(root, realRoot).pipe(Effect.provideService(FileSystem.FileSystem, fs), Effect.provideService(Path.Path, path));
89
- }
@@ -1,5 +1,5 @@
1
1
  import { parse } from "yaml";
2
- import type { ParsedMetadata } from "@shivaedev/work-board/integration/board.ts";
2
+ import type { ParsedMetadata } from "@shivaedev/work-board/server/integration/board.ts";
3
3
 
4
4
  const APPROVAL = "fleet";
5
5
  const LAUNCH = "fleet-launch";
@@ -1,15 +1,16 @@
1
1
  import { Context, Effect, FileSystem, Layer, Path, Schema } from "effect";
2
- import { defineService } from "@shivaedev/effect-service/define-service.ts";
3
- import { board as boardApi } from "@shivaedev/work-board/integration/board.ts";
2
+ import { defineService } from "@shivaedev/effect-service/defineService.ts";
3
+ import { board as boardApi } from "@shivaedev/work-board/server/integration/board.ts";
4
4
  import { acknowledgeDecision } from "#board/acknowledgeDecision.ts";
5
5
  import { briefRevision } from "#board/briefRevision.ts";
6
6
  import { completionMarkdown } from "#board/completionMarkdown.ts";
7
7
  import { decisionReading } from "#board/decisionReading.ts";
8
- import { boundDocuments, boundSnapshot, refreshSnapshotDocument, snapshotDocument } from "#board/documents.ts";
8
+ import { boundSnapshot, refreshSnapshotDocument, snapshotDocument } from "#board/documents.ts";
9
9
  import { fleetApproved, fleetDeliverable, fleetPriority } from "#board/fleetField.ts";
10
10
  import { publishBoard } from "#board/publish.ts";
11
11
  import { publishReport } from "#board/publishReport.ts";
12
12
  import { workMetadata } from "#board/readPass.ts";
13
+ import { upgradeDecisionClosure } from "#board/upgradeDecisionClosure.ts";
13
14
  import { workRevision } from "#board/workRevision.ts";
14
15
  import { writeCompletion } from "#board/writeCompletion.ts";
15
16
  import { BoardFailure, BoardGateway, Priority } from "#policy.ts";
@@ -24,8 +25,8 @@ const MarkdownBoard = defineService({
24
25
  const fs = yield* FileSystem.FileSystem;
25
26
  const path = yield* Path.Path;
26
27
  const realRoot = yield* fs.realPath(root);
27
- const documents = boundDocuments(root, realRoot, fs, path);
28
- const snapshot = boundSnapshot(root, realRoot, fs, path);
28
+ const snapshot = boundSnapshot(root, realRoot, fs, path).pipe(Effect.tap((current) => upgradeDecisionClosure(root, realRoot, current, fs)));
29
+ const documents = snapshot.pipe(Effect.map((current) => current.documents.filter((document) => !current.problems.has(document.file))));
29
30
  const get = Effect.fn("FleetBoard.get")(function* (workId: string, options?: { readonly fresh?: boolean }) {
30
31
  const current = yield* snapshot;
31
32
  const found = yield* options?.fresh
@@ -1,11 +1,12 @@
1
1
  import { relative } from "node:path";
2
2
  import { Clock, Effect } from "effect";
3
- import { board as boardApi } from "@shivaedev/work-board/integration/board.ts";
4
- import { responses } from "@shivaedev/work-board/integration/responses.ts";
3
+ import { board as boardApi } from "@shivaedev/work-board/server/integration/board.ts";
4
+ import { responses } from "@shivaedev/work-board/server/integration/responses.ts";
5
5
  import { decisionAnswer } from "#board/decisionAnswer.ts";
6
6
  import type { BoardDocument } from "#board/documents.ts";
7
7
  import { recordBoardSource } from "#board/readPass.ts";
8
8
  import type { BoardDecision } from "#board/schema.ts";
9
+ import { type DecisionCopy, decisionCopy } from "#engine/decisionCopy.ts";
9
10
  import { BoardFailure, type BoardWork, type Decision } from "#policy.ts";
10
11
 
11
12
  const { publish, questionFrom, questionId, questionMarkdown, revisionOf } = responses;
@@ -23,14 +24,14 @@ function linked(text: string): string {
23
24
  return url.protocol === "https:" || url.protocol === "http:" ? `<${url.href.replaceAll("<", "%3C").replaceAll(">", "%3E")}>` : quoted(text);
24
25
  }
25
26
 
26
- function decisionSource(itemId: string, work: BoardWork, input: Decision): string {
27
+ function decisionSource(itemId: string, work: BoardWork, input: Decision, copy: DecisionCopy): string {
27
28
  const metadata = {
28
29
  attention: [
29
30
  {
30
31
  id: input.id,
31
32
  kind: "decision",
32
33
  managed: true,
33
- reason: input.reason,
34
+ reason: copy.reason,
34
35
  "response_from": [input.attentionOwner ?? "orchestrator"],
35
36
  state: "open",
36
37
  unblocks: [work.workId],
@@ -40,8 +41,8 @@ function decisionSource(itemId: string, work: BoardWork, input: Decision): strin
40
41
  kind: "decision",
41
42
  relationships: [{ kind: "relates_to", target: work.workId }],
42
43
  };
43
- const answer = decisionAnswer(input);
44
- return `---\n${JSON.stringify(metadata)}\n---\n# Fleet decision for ${work.workId}\n\n## Decision\n\n${quoted(input.reason)}\n\n## Recommendation\n\n${quoted(input.recommendation)}\n\n## Relevant links\n\n${input.links.map(linked).join("\n\n")}\n\n${answer}\n\n## Reviewed Board work\n\n${quoted(work.context)}\n`;
44
+ const answer = decisionAnswer(copy);
45
+ return `---\n${JSON.stringify(metadata)}\n---\n# Fleet decision for ${work.workId}\n\n## Decision\n\n${quoted(copy.reason)}\n\n## Recommendation\n\n${quoted(copy.recommendation)}\n\n## Relevant links\n\n${input.links.map(linked).join("\n\n")}\n\n${answer === undefined ? "" : `${answer}\n\n`}## Reviewed Board work\n\n${quoted(work.context)}\n`;
45
46
  }
46
47
 
47
48
  export function publishBoard(root: string, realRoot: string, documents: Effect.Effect<readonly BoardDocument[], BoardFailure>) {
@@ -49,7 +50,8 @@ export function publishBoard(root: string, realRoot: string, documents: Effect.E
49
50
  const workSourcePath = relative(realRoot, work.sourcePath);
50
51
  const itemId = `decision.${revisionOf(JSON.stringify([work.workId, work.revision, workSourcePath, input.id, input.reason, input.recommendation, input.links, ...(input.worker === undefined ? [] : [input.worker])]))}`;
51
52
  const existing = input.published === undefined ? undefined : (yield* documents).find((document) => document.file === input.published?.sourcePath);
52
- const context = existing?.parsed.fields.id === itemId ? existing.source : decisionSource(itemId, work, input);
53
+ const copy = decisionCopy(input);
54
+ const context = existing?.parsed.fields.id === itemId ? existing.source : decisionSource(itemId, work, input, copy);
53
55
  const parsed = boardApi.metadataParse(context);
54
56
  if (new TextEncoder().encode(context).length > 256 * 1024 || parsed.diagnostics.length > 0) {
55
57
  return yield* Effect.fail(new BoardFailure({ message: "Fleet decision context exceeds Board limits or contains invalid attention metadata." }));
@@ -82,7 +84,7 @@ export function publishBoard(root: string, realRoot: string, documents: Effect.E
82
84
  question: {
83
85
  deadline: registeredAt + 48 * 60 * 60 * 1000,
84
86
  item: itemId,
85
- reason: input.reason,
87
+ reason: copy.reason,
86
88
  registeredAt,
87
89
  request: input.id,
88
90
  reviewedRevision: revision,
@@ -1,7 +1,7 @@
1
1
  import { relative } from "node:path";
2
2
  import { Effect } from "effect";
3
- import { board } from "@shivaedev/work-board/integration/board.ts";
4
- import { responses } from "@shivaedev/work-board/integration/responses.ts";
3
+ import { board } from "@shivaedev/work-board/server/integration/board.ts";
4
+ import { responses } from "@shivaedev/work-board/server/integration/responses.ts";
5
5
  import { briefRevision } from "#board/briefRevision.ts";
6
6
  import type { BoardDocument } from "#board/documents.ts";
7
7
  import { recordBoardSource, workMetadata } from "#board/readPass.ts";
@@ -1,5 +1,5 @@
1
1
  import { Effect, FileSystem } from "effect";
2
- import { board as boardApi } from "@shivaedev/work-board/integration/board.ts";
2
+ import { board as boardApi } from "@shivaedev/work-board/server/integration/board.ts";
3
3
  import { STATUS_MARKER } from "#board/statusMarkdown.ts";
4
4
  import { BoardFailure } from "#policy.ts";
5
5
 
@@ -1,7 +1,7 @@
1
1
  import { join } from "node:path";
2
2
  import { Context, Effect, type FileSystem, type Path } from "effect";
3
- import type { MetadataModel, ParsedMetadata } from "@shivaedev/work-board/integration/board.ts";
4
- import { board as boardApi } from "@shivaedev/work-board/integration/board.ts";
3
+ import type { MetadataModel, ParsedMetadata } from "@shivaedev/work-board/server/integration/board.ts";
4
+ import { board as boardApi } from "@shivaedev/work-board/server/integration/board.ts";
5
5
  import type { BoardDocument } from "#board/documents.ts";
6
6
  import type { BoardFailure, BoardWork } from "#policy.ts";
7
7
 
@@ -1,4 +1,4 @@
1
- import { responses } from "@shivaedev/work-board/integration/responses.ts";
1
+ import { responses } from "@shivaedev/work-board/server/integration/responses.ts";
2
2
  import type { BoardWork } from "#policy.ts";
3
3
  import type { SessionReceipt } from "#session/schema.ts";
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { basename } from "node:path";
2
- import { responses } from "@shivaedev/work-board/integration/responses.ts";
2
+ import { responses } from "@shivaedev/work-board/server/integration/responses.ts";
3
3
  import type { ReportFile, UnavailableAttachment } from "#reportAttachments.ts";
4
4
 
5
5
  const { revisionOf } = responses;
@@ -1,6 +1,6 @@
1
1
  import { Schema } from "effect";
2
- import { attention } from "@shivaedev/work-board/integration/attention.ts";
3
- import { responses } from "@shivaedev/work-board/integration/responses.ts";
2
+ import { attention } from "@shivaedev/work-board/server/integration/attention.ts";
3
+ import { responses } from "@shivaedev/work-board/server/integration/responses.ts";
4
4
  import { SessionReceipt } from "#session/schema.ts";
5
5
 
6
6
  const { RequestReceipt } = attention;
@@ -0,0 +1,61 @@
1
+ import { Effect, type FileSystem } from "effect";
2
+ import { responses } from "@shivaedev/work-board/server/integration/responses.ts";
3
+ import { closePublishedDecision, publishedDecision } from "#board/closePublishedDecision.ts";
4
+ import type { BoardDocument } from "#board/documents.ts";
5
+ import type { BoardSnapshot } from "#board/readPass.ts";
6
+ import { writePublished } from "#board/writePublished.ts";
7
+ import { BoardFailure } from "#policy.ts";
8
+
9
+ const MARKER = ".fleet-decision-closure-v1.json";
10
+
11
+ export const upgradeDecisionClosure = Effect.fn("FleetBoard.upgradeDecisionClosure")(function* (
12
+ root: string,
13
+ realRoot: string,
14
+ snapshot: BoardSnapshot,
15
+ fs: FileSystem.FileSystem,
16
+ ) {
17
+ if (yield* fs.exists(`${realRoot}/${MARKER}`).pipe(Effect.mapError((error) => new BoardFailure({ message: error.message })))) {
18
+ return;
19
+ }
20
+ if (snapshot.problems.size > 0) {
21
+ yield* Effect.logWarning("Fleet decision closure upgrade deferred because the Board has problems", { problems: snapshot.problems.size });
22
+ return;
23
+ }
24
+ const documents = snapshot.documents;
25
+ const latest = latestSequences(documents);
26
+ const superseded = new Set(
27
+ documents.flatMap((document) => {
28
+ const receipt = document.parsed.fields.requestReceipt;
29
+ return receipt?.disposition === "superseded" ? [receipt.question] : [];
30
+ }),
31
+ );
32
+ const questions = new Map(
33
+ documents.flatMap((document) => {
34
+ const question = responses.questionFrom(document);
35
+ return question === undefined ? [] : [[question.question.source, question.id] as const];
36
+ }),
37
+ );
38
+ for (const document of documents) {
39
+ const decision = publishedDecision(document);
40
+ if (decision !== undefined && (decision.sequence < (latest.get(decision.workId) ?? -1) || superseded.has(questions.get(document.file) ?? ""))) {
41
+ const closed = yield* closePublishedDecision(root, realRoot, document);
42
+ if (closed !== undefined) {
43
+ snapshot.record(closed);
44
+ }
45
+ }
46
+ }
47
+ yield* writePublished(root, realRoot, MARKER, '{"version":1}\n', (source) => source === '{"version":1}\n').pipe(
48
+ Effect.mapError((error) => new BoardFailure({ message: error.message })),
49
+ );
50
+ });
51
+
52
+ function latestSequences(documents: readonly BoardDocument[]) {
53
+ const latest = new Map<string, number>();
54
+ for (const document of documents) {
55
+ const decision = publishedDecision(document);
56
+ if (decision !== undefined) {
57
+ latest.set(decision.workId, Math.max(latest.get(decision.workId) ?? -1, decision.sequence));
58
+ }
59
+ }
60
+ return latest;
61
+ }
@@ -1,5 +1,5 @@
1
- import { board as boardApi } from "@shivaedev/work-board/integration/board.ts";
2
- import { responses } from "@shivaedev/work-board/integration/responses.ts";
1
+ import { board as boardApi } from "@shivaedev/work-board/server/integration/board.ts";
2
+ import { responses } from "@shivaedev/work-board/server/integration/responses.ts";
3
3
  import { briefRevision } from "#board/briefRevision.ts";
4
4
 
5
5
  const { revisionOf } = responses;
@@ -1,6 +1,6 @@
1
1
  import { Effect, Schema } from "effect";
2
- import type { FleetHealth as BoardFleetHealth } from "@shivaedev/work-board/integration/diagnostics.ts";
3
- import { diagnostics as diagnosticsApi } from "@shivaedev/work-board/integration/diagnostics.ts";
2
+ import type { FleetHealth as BoardFleetHealth } from "@shivaedev/work-board/server/integration/diagnostics.ts";
3
+ import { diagnostics as diagnosticsApi } from "@shivaedev/work-board/server/integration/diagnostics.ts";
4
4
  import { writePublished } from "#board/writePublished.ts";
5
5
  import { BoardFailure } from "#policy.ts";
6
6
 
@@ -4,7 +4,12 @@ import { Effect } from "effect";
4
4
  import { type ReportDirectory, validateReportDirectory, withReportDirectory } from "#reportFileDirectory.ts";
5
5
  import { hasFileCode, ReportFileFailure, reportFileIo, withReportFile } from "#reportFileFailure.ts";
6
6
 
7
- function unchanged(folder: string, name: "status.md" | "health.json", content: string, owns: (source: string) => boolean) {
7
+ function unchanged(
8
+ folder: string,
9
+ name: "status.md" | "health.json" | ".fleet-decision-closure-v1.json",
10
+ content: string,
11
+ owns: (source: string) => boolean,
12
+ ) {
8
13
  const label = `fleet/${name}`;
9
14
  return withReportFile(
10
15
  label,
@@ -27,7 +32,7 @@ function unchanged(folder: string, name: "status.md" | "health.json", content: s
27
32
  const publish = Effect.fnUntraced(function* (
28
33
  directory: ReportDirectory,
29
34
  target: ReportDirectory,
30
- name: "status.md" | "health.json",
35
+ name: "status.md" | "health.json" | ".fleet-decision-closure-v1.json",
31
36
  content: string,
32
37
  owns: (source: string) => boolean,
33
38
  ) {
@@ -54,13 +59,17 @@ const publish = Effect.fnUntraced(function* (
54
59
  export const writePublished = Effect.fn("Fleet.writePublished")(function* (
55
60
  root: string,
56
61
  realRoot: string,
57
- name: "status.md" | "health.json",
62
+ name: "status.md" | "health.json" | ".fleet-decision-closure-v1.json",
58
63
  content: string,
59
64
  owns: (source: string) => boolean,
60
65
  ) {
61
- const label = `fleet/${name}`;
66
+ const upgrade = name === ".fleet-decision-closure-v1.json";
67
+ const label = upgrade ? name : `fleet/${name}`;
62
68
  return yield* withReportDirectory(label, root, realRoot, (directory) =>
63
69
  Effect.gen(function* () {
70
+ if (upgrade) {
71
+ return yield* publish(directory, directory, name, content, owns);
72
+ }
64
73
  yield* reportFileIo(label, () => mkdir(`${directory.folder}/fleet`)).pipe(
65
74
  Effect.catchTag("ReportFileFailure", (error) => (hasFileCode(error.cause, "EEXIST") ? Effect.void : Effect.fail(error))),
66
75
  );