@jungjaehoon/mama-os 0.28.5 → 0.29.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 (454) hide show
  1. package/dist/agent/agent-loop.d.ts +0 -4
  2. package/dist/agent/agent-loop.d.ts.map +1 -1
  3. package/dist/agent/agent-loop.js +44 -12
  4. package/dist/agent/agent-loop.js.map +1 -1
  5. package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
  6. package/dist/agent/code-act/host-bridge.js +53 -3
  7. package/dist/agent/code-act/host-bridge.js.map +1 -1
  8. package/dist/agent/code-act/tool-policy.d.ts.map +1 -1
  9. package/dist/agent/code-act/tool-policy.js +5 -0
  10. package/dist/agent/code-act/tool-policy.js.map +1 -1
  11. package/dist/agent/codex-auth.d.ts +0 -1
  12. package/dist/agent/codex-auth.d.ts.map +1 -1
  13. package/dist/agent/codex-auth.js +0 -4
  14. package/dist/agent/codex-auth.js.map +1 -1
  15. package/dist/agent/codex-home.d.ts +0 -2
  16. package/dist/agent/codex-home.d.ts.map +1 -1
  17. package/dist/agent/codex-home.js +0 -66
  18. package/dist/agent/codex-home.js.map +1 -1
  19. package/dist/agent/context-compile-service.d.ts +9 -0
  20. package/dist/agent/context-compile-service.d.ts.map +1 -1
  21. package/dist/agent/context-compile-service.js +6 -0
  22. package/dist/agent/context-compile-service.js.map +1 -1
  23. package/dist/agent/context-prompt-builder.d.ts +0 -6
  24. package/dist/agent/context-prompt-builder.d.ts.map +1 -1
  25. package/dist/agent/context-prompt-builder.js +0 -131
  26. package/dist/agent/context-prompt-builder.js.map +1 -1
  27. package/dist/agent/contract-extractor.d.ts +0 -4
  28. package/dist/agent/contract-extractor.d.ts.map +1 -1
  29. package/dist/agent/contract-extractor.js +0 -68
  30. package/dist/agent/contract-extractor.js.map +1 -1
  31. package/dist/agent/gateway-tool-executor.d.ts +20 -15
  32. package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
  33. package/dist/agent/gateway-tool-executor.js +236 -90
  34. package/dist/agent/gateway-tool-executor.js.map +1 -1
  35. package/dist/agent/gateway-tools.md +7 -4
  36. package/dist/agent/skill-loader.d.ts +0 -7
  37. package/dist/agent/skill-loader.d.ts.map +1 -1
  38. package/dist/agent/skill-loader.js +0 -86
  39. package/dist/agent/skill-loader.js.map +1 -1
  40. package/dist/agent/token-estimator.d.ts +0 -8
  41. package/dist/agent/token-estimator.d.ts.map +1 -1
  42. package/dist/agent/token-estimator.js +0 -14
  43. package/dist/agent/token-estimator.js.map +1 -1
  44. package/dist/agent/tool-registry.d.ts.map +1 -1
  45. package/dist/agent/tool-registry.js +23 -5
  46. package/dist/agent/tool-registry.js.map +1 -1
  47. package/dist/agent/types.d.ts +27 -1
  48. package/dist/agent/types.d.ts.map +1 -1
  49. package/dist/agent/types.js.map +1 -1
  50. package/dist/api/agent-graph-handler.d.ts +9 -0
  51. package/dist/api/agent-graph-handler.d.ts.map +1 -1
  52. package/dist/api/agent-graph-handler.js +27 -1
  53. package/dist/api/agent-graph-handler.js.map +1 -1
  54. package/dist/api/entity-audit-handler.d.ts +1 -2
  55. package/dist/api/entity-audit-handler.d.ts.map +1 -1
  56. package/dist/api/entity-audit-handler.js +0 -5
  57. package/dist/api/entity-audit-handler.js.map +1 -1
  58. package/dist/api/index.d.ts +1 -9
  59. package/dist/api/index.d.ts.map +1 -1
  60. package/dist/api/index.js +4 -17
  61. package/dist/api/index.js.map +1 -1
  62. package/dist/api/intelligence-handler.d.ts +0 -5
  63. package/dist/api/intelligence-handler.d.ts.map +1 -1
  64. package/dist/api/intelligence-handler.js +0 -15
  65. package/dist/api/intelligence-handler.js.map +1 -1
  66. package/dist/api/types.d.ts +1 -5
  67. package/dist/api/types.d.ts.map +1 -1
  68. package/dist/api/types.js +0 -14
  69. package/dist/api/types.js.map +1 -1
  70. package/dist/cli/commands/start.d.ts +117 -3
  71. package/dist/cli/commands/start.d.ts.map +1 -1
  72. package/dist/cli/commands/start.js +223 -62
  73. package/dist/cli/commands/start.js.map +1 -1
  74. package/dist/cli/config/config-manager.d.ts +0 -5
  75. package/dist/cli/config/config-manager.d.ts.map +1 -1
  76. package/dist/cli/config/config-manager.js +0 -29
  77. package/dist/cli/config/config-manager.js.map +1 -1
  78. package/dist/cli/config/types.d.ts.map +1 -1
  79. package/dist/cli/config/types.js +3 -0
  80. package/dist/cli/config/types.js.map +1 -1
  81. package/dist/cli/runtime/agent-loop-init.d.ts.map +1 -1
  82. package/dist/cli/runtime/agent-loop-init.js +9 -1
  83. package/dist/cli/runtime/agent-loop-init.js.map +1 -1
  84. package/dist/cli/runtime/api-routes-init.d.ts.map +1 -1
  85. package/dist/cli/runtime/api-routes-init.js +32 -5
  86. package/dist/cli/runtime/api-routes-init.js.map +1 -1
  87. package/dist/cli/runtime/api-server-init.d.ts.map +1 -1
  88. package/dist/cli/runtime/api-server-init.js +2 -0
  89. package/dist/cli/runtime/api-server-init.js.map +1 -1
  90. package/dist/cli/runtime/gateway-init.d.ts +1 -1
  91. package/dist/cli/runtime/gateway-init.d.ts.map +1 -1
  92. package/dist/cli/runtime/gateway-init.js +11 -38
  93. package/dist/cli/runtime/gateway-init.js.map +1 -1
  94. package/dist/cli/runtime/gateway-wiring.d.ts.map +1 -1
  95. package/dist/cli/runtime/gateway-wiring.js +6 -120
  96. package/dist/cli/runtime/gateway-wiring.js.map +1 -1
  97. package/dist/cli/utils/pid-manager.d.ts +0 -10
  98. package/dist/cli/utils/pid-manager.d.ts.map +1 -1
  99. package/dist/cli/utils/pid-manager.js +0 -26
  100. package/dist/cli/utils/pid-manager.js.map +1 -1
  101. package/dist/connectors/framework/polling-scheduler.d.ts +33 -1
  102. package/dist/connectors/framework/polling-scheduler.d.ts.map +1 -1
  103. package/dist/connectors/framework/polling-scheduler.js +46 -40
  104. package/dist/connectors/framework/polling-scheduler.js.map +1 -1
  105. package/dist/connectors/trello/query-tools.d.ts +32 -5
  106. package/dist/connectors/trello/query-tools.d.ts.map +1 -1
  107. package/dist/connectors/trello/query-tools.js +56 -17
  108. package/dist/connectors/trello/query-tools.js.map +1 -1
  109. package/dist/db/agent-store.d.ts +0 -4
  110. package/dist/db/agent-store.d.ts.map +1 -1
  111. package/dist/db/agent-store.js +0 -65
  112. package/dist/db/agent-store.js.map +1 -1
  113. package/dist/envelope/enforcer.d.ts.map +1 -1
  114. package/dist/envelope/enforcer.js +10 -1
  115. package/dist/envelope/enforcer.js.map +1 -1
  116. package/dist/envelope/index.d.ts +0 -1
  117. package/dist/envelope/index.d.ts.map +1 -1
  118. package/dist/envelope/index.js +0 -1
  119. package/dist/envelope/index.js.map +1 -1
  120. package/dist/envelope/signature.d.ts +0 -1
  121. package/dist/envelope/signature.d.ts.map +1 -1
  122. package/dist/envelope/signature.js +0 -7
  123. package/dist/envelope/signature.js.map +1 -1
  124. package/dist/envelope/tool-connector-scope.d.ts +35 -0
  125. package/dist/envelope/tool-connector-scope.d.ts.map +1 -0
  126. package/dist/envelope/tool-connector-scope.js +57 -0
  127. package/dist/envelope/tool-connector-scope.js.map +1 -0
  128. package/dist/evidence/effects.d.ts +107 -0
  129. package/dist/evidence/effects.d.ts.map +1 -0
  130. package/dist/evidence/effects.js +281 -0
  131. package/dist/evidence/effects.js.map +1 -0
  132. package/dist/evidence/read.d.ts +75 -0
  133. package/dist/evidence/read.d.ts.map +1 -0
  134. package/dist/evidence/read.js +105 -0
  135. package/dist/evidence/read.js.map +1 -0
  136. package/dist/gateways/base-gateway.d.ts +23 -3
  137. package/dist/gateways/base-gateway.d.ts.map +1 -1
  138. package/dist/gateways/base-gateway.js +15 -2
  139. package/dist/gateways/base-gateway.js.map +1 -1
  140. package/dist/gateways/discord.d.ts +4 -16
  141. package/dist/gateways/discord.d.ts.map +1 -1
  142. package/dist/gateways/discord.js +22 -189
  143. package/dist/gateways/discord.js.map +1 -1
  144. package/dist/gateways/index.d.ts +2 -1
  145. package/dist/gateways/index.d.ts.map +1 -1
  146. package/dist/gateways/message-router.d.ts +13 -20
  147. package/dist/gateways/message-router.d.ts.map +1 -1
  148. package/dist/gateways/message-router.js +32 -3
  149. package/dist/gateways/message-router.js.map +1 -1
  150. package/dist/gateways/slack.d.ts +2 -12
  151. package/dist/gateways/slack.d.ts.map +1 -1
  152. package/dist/gateways/slack.js +6 -220
  153. package/dist/gateways/slack.js.map +1 -1
  154. package/dist/gateways/telegram.d.ts +2 -2
  155. package/dist/gateways/telegram.d.ts.map +1 -1
  156. package/dist/gateways/telegram.js +3 -2
  157. package/dist/gateways/telegram.js.map +1 -1
  158. package/dist/gateways/turn-contract.d.ts +104 -0
  159. package/dist/gateways/turn-contract.d.ts.map +1 -0
  160. package/dist/{memory/consult-contract.js → gateways/turn-contract.js} +1 -1
  161. package/dist/gateways/turn-contract.js.map +1 -0
  162. package/dist/memory/provenance-live.d.ts +111 -0
  163. package/dist/memory/provenance-live.d.ts.map +1 -0
  164. package/dist/memory/provenance-live.js +381 -0
  165. package/dist/memory/provenance-live.js.map +1 -0
  166. package/dist/memory/provenance-resolver.d.ts +184 -0
  167. package/dist/memory/provenance-resolver.d.ts.map +1 -0
  168. package/dist/memory/provenance-resolver.js +152 -0
  169. package/dist/memory/provenance-resolver.js.map +1 -0
  170. package/dist/multi-agent/agent-event-bus.d.ts +1 -0
  171. package/dist/multi-agent/agent-event-bus.d.ts.map +1 -1
  172. package/dist/multi-agent/bmad-templates.d.ts +0 -18
  173. package/dist/multi-agent/bmad-templates.d.ts.map +1 -1
  174. package/dist/multi-agent/bmad-templates.js +0 -127
  175. package/dist/multi-agent/bmad-templates.js.map +1 -1
  176. package/dist/multi-agent/dashboard-agent-persona.js +3 -3
  177. package/dist/operator/board-reconcile.d.ts +2 -3
  178. package/dist/operator/board-reconcile.d.ts.map +1 -1
  179. package/dist/operator/board-reconcile.js +18 -32
  180. package/dist/operator/board-reconcile.js.map +1 -1
  181. package/dist/operator/changes-projection.d.ts +70 -0
  182. package/dist/operator/changes-projection.d.ts.map +1 -0
  183. package/dist/operator/changes-projection.js +109 -0
  184. package/dist/operator/changes-projection.js.map +1 -0
  185. package/dist/operator/external-correlation.d.ts +94 -0
  186. package/dist/operator/external-correlation.d.ts.map +1 -0
  187. package/dist/operator/external-correlation.js +177 -0
  188. package/dist/operator/external-correlation.js.map +1 -0
  189. package/dist/operator/operator-trigger-loop.d.ts +9 -1
  190. package/dist/operator/operator-trigger-loop.d.ts.map +1 -1
  191. package/dist/operator/operator-trigger-loop.js +8 -4
  192. package/dist/operator/operator-trigger-loop.js.map +1 -1
  193. package/dist/operator/provenance-lookup.d.ts +18 -0
  194. package/dist/operator/provenance-lookup.d.ts.map +1 -0
  195. package/dist/operator/provenance-lookup.js +54 -0
  196. package/dist/operator/provenance-lookup.js.map +1 -0
  197. package/dist/operator/report-carry.d.ts +18 -1
  198. package/dist/operator/report-carry.d.ts.map +1 -1
  199. package/dist/operator/report-carry.js +22 -3
  200. package/dist/operator/report-carry.js.map +1 -1
  201. package/dist/operator/report-run.d.ts +35 -0
  202. package/dist/operator/report-run.d.ts.map +1 -1
  203. package/dist/operator/report-run.js +184 -24
  204. package/dist/operator/report-run.js.map +1 -1
  205. package/dist/operator/situation-report.d.ts.map +1 -1
  206. package/dist/operator/situation-report.js +9 -2
  207. package/dist/operator/situation-report.js.map +1 -1
  208. package/dist/operator/task-ledger.d.ts +84 -2
  209. package/dist/operator/task-ledger.d.ts.map +1 -1
  210. package/dist/operator/task-ledger.js +274 -31
  211. package/dist/operator/task-ledger.js.map +1 -1
  212. package/dist/operator/worker-run.js +1 -1
  213. package/dist/operator/worker-run.js.map +1 -1
  214. package/dist/operator/workorder-hooks.d.ts +79 -4
  215. package/dist/operator/workorder-hooks.d.ts.map +1 -1
  216. package/dist/operator/workorder-hooks.js +152 -20
  217. package/dist/operator/workorder-hooks.js.map +1 -1
  218. package/dist/operator/workorder-publishers.d.ts +2 -0
  219. package/dist/operator/workorder-publishers.d.ts.map +1 -1
  220. package/dist/operator/workorder-publishers.js +8 -1
  221. package/dist/operator/workorder-publishers.js.map +1 -1
  222. package/dist/utils/untrusted-content.d.ts +11 -0
  223. package/dist/utils/untrusted-content.d.ts.map +1 -1
  224. package/dist/utils/untrusted-content.js +20 -0
  225. package/dist/utils/untrusted-content.js.map +1 -1
  226. package/package.json +4 -3
  227. package/scripts/backfill-channel-keys.ts +451 -0
  228. package/dist/agent/auto-recall.d.ts +0 -48
  229. package/dist/agent/auto-recall.d.ts.map +0 -1
  230. package/dist/agent/auto-recall.js +0 -192
  231. package/dist/agent/auto-recall.js.map +0 -1
  232. package/dist/agent/claude-client.d.ts +0 -50
  233. package/dist/agent/claude-client.d.ts.map +0 -1
  234. package/dist/agent/claude-client.js +0 -219
  235. package/dist/agent/claude-client.js.map +0 -1
  236. package/dist/agent/delegation-executor.d.ts +0 -49
  237. package/dist/agent/delegation-executor.d.ts.map +0 -1
  238. package/dist/agent/delegation-executor.js +0 -692
  239. package/dist/agent/delegation-executor.js.map +0 -1
  240. package/dist/agent/mcp-executor.d.ts +0 -60
  241. package/dist/agent/mcp-executor.d.ts.map +0 -1
  242. package/dist/agent/mcp-executor.js +0 -190
  243. package/dist/agent/mcp-executor.js.map +0 -1
  244. package/dist/agent/process-tree.d.ts +0 -6
  245. package/dist/agent/process-tree.d.ts.map +0 -1
  246. package/dist/agent/process-tree.js +0 -21
  247. package/dist/agent/process-tree.js.map +0 -1
  248. package/dist/agent/streaming-callback-manager.d.ts +0 -85
  249. package/dist/agent/streaming-callback-manager.d.ts.map +0 -1
  250. package/dist/agent/streaming-callback-manager.js +0 -103
  251. package/dist/agent/streaming-callback-manager.js.map +0 -1
  252. package/dist/agent/token-budget.d.ts +0 -49
  253. package/dist/agent/token-budget.d.ts.map +0 -1
  254. package/dist/agent/token-budget.js +0 -92
  255. package/dist/agent/token-budget.js.map +0 -1
  256. package/dist/connectors/kagemusha/history-compiler.d.ts +0 -18
  257. package/dist/connectors/kagemusha/history-compiler.d.ts.map +0 -1
  258. package/dist/connectors/kagemusha/history-compiler.js +0 -35
  259. package/dist/connectors/kagemusha/history-compiler.js.map +0 -1
  260. package/dist/db/migrations/wiki-artifacts.d.ts +0 -3
  261. package/dist/db/migrations/wiki-artifacts.d.ts.map +0 -1
  262. package/dist/db/migrations/wiki-artifacts.js +0 -24
  263. package/dist/db/migrations/wiki-artifacts.js.map +0 -1
  264. package/dist/envelope/subset.d.ts +0 -9
  265. package/dist/envelope/subset.d.ts.map +0 -1
  266. package/dist/envelope/subset.js +0 -67
  267. package/dist/envelope/subset.js.map +0 -1
  268. package/dist/memory/consult-contract.d.ts +0 -8
  269. package/dist/memory/consult-contract.d.ts.map +0 -1
  270. package/dist/memory/consult-contract.js.map +0 -1
  271. package/dist/multi-agent/agent-message-queue.d.ts +0 -104
  272. package/dist/multi-agent/agent-message-queue.d.ts.map +0 -1
  273. package/dist/multi-agent/agent-message-queue.js +0 -227
  274. package/dist/multi-agent/agent-message-queue.js.map +0 -1
  275. package/dist/multi-agent/background-task-manager.d.ts +0 -248
  276. package/dist/multi-agent/background-task-manager.d.ts.map +0 -1
  277. package/dist/multi-agent/background-task-manager.js +0 -415
  278. package/dist/multi-agent/background-task-manager.js.map +0 -1
  279. package/dist/multi-agent/category-router.d.ts +0 -56
  280. package/dist/multi-agent/category-router.d.ts.map +0 -1
  281. package/dist/multi-agent/category-router.js +0 -99
  282. package/dist/multi-agent/category-router.js.map +0 -1
  283. package/dist/multi-agent/council-engine.d.ts +0 -60
  284. package/dist/multi-agent/council-engine.d.ts.map +0 -1
  285. package/dist/multi-agent/council-engine.js +0 -284
  286. package/dist/multi-agent/council-engine.js.map +0 -1
  287. package/dist/multi-agent/delegation-format-validator.d.ts +0 -22
  288. package/dist/multi-agent/delegation-format-validator.d.ts.map +0 -1
  289. package/dist/multi-agent/delegation-format-validator.js +0 -31
  290. package/dist/multi-agent/delegation-format-validator.js.map +0 -1
  291. package/dist/multi-agent/delegation-manager.d.ts +0 -128
  292. package/dist/multi-agent/delegation-manager.d.ts.map +0 -1
  293. package/dist/multi-agent/delegation-manager.js +0 -276
  294. package/dist/multi-agent/delegation-manager.js.map +0 -1
  295. package/dist/multi-agent/i18n-messages.d.ts +0 -35
  296. package/dist/multi-agent/i18n-messages.d.ts.map +0 -1
  297. package/dist/multi-agent/i18n-messages.js +0 -54
  298. package/dist/multi-agent/i18n-messages.js.map +0 -1
  299. package/dist/multi-agent/index.d.ts +0 -31
  300. package/dist/multi-agent/index.d.ts.map +0 -1
  301. package/dist/multi-agent/index.js +0 -46
  302. package/dist/multi-agent/index.js.map +0 -1
  303. package/dist/multi-agent/multi-agent-base.d.ts +0 -223
  304. package/dist/multi-agent/multi-agent-base.d.ts.map +0 -1
  305. package/dist/multi-agent/multi-agent-base.js +0 -592
  306. package/dist/multi-agent/multi-agent-base.js.map +0 -1
  307. package/dist/multi-agent/multi-agent-discord.d.ts +0 -142
  308. package/dist/multi-agent/multi-agent-discord.d.ts.map +0 -1
  309. package/dist/multi-agent/multi-agent-discord.js +0 -1235
  310. package/dist/multi-agent/multi-agent-discord.js.map +0 -1
  311. package/dist/multi-agent/multi-agent-slack.d.ts +0 -146
  312. package/dist/multi-agent/multi-agent-slack.d.ts.map +0 -1
  313. package/dist/multi-agent/multi-agent-slack.js +0 -953
  314. package/dist/multi-agent/multi-agent-slack.js.map +0 -1
  315. package/dist/multi-agent/multi-bot-manager.d.ts +0 -119
  316. package/dist/multi-agent/multi-bot-manager.d.ts.map +0 -1
  317. package/dist/multi-agent/multi-bot-manager.js +0 -449
  318. package/dist/multi-agent/multi-bot-manager.js.map +0 -1
  319. package/dist/multi-agent/orchestrator.d.ts +0 -110
  320. package/dist/multi-agent/orchestrator.d.ts.map +0 -1
  321. package/dist/multi-agent/orchestrator.js +0 -436
  322. package/dist/multi-agent/orchestrator.js.map +0 -1
  323. package/dist/multi-agent/rate-limiter.d.ts +0 -76
  324. package/dist/multi-agent/rate-limiter.d.ts.map +0 -1
  325. package/dist/multi-agent/rate-limiter.js +0 -128
  326. package/dist/multi-agent/rate-limiter.js.map +0 -1
  327. package/dist/multi-agent/shared-context.d.ts +0 -127
  328. package/dist/multi-agent/shared-context.d.ts.map +0 -1
  329. package/dist/multi-agent/shared-context.js +0 -239
  330. package/dist/multi-agent/shared-context.js.map +0 -1
  331. package/dist/multi-agent/slack-config-validator.d.ts +0 -42
  332. package/dist/multi-agent/slack-config-validator.d.ts.map +0 -1
  333. package/dist/multi-agent/slack-config-validator.js +0 -194
  334. package/dist/multi-agent/slack-config-validator.js.map +0 -1
  335. package/dist/multi-agent/slack-multi-bot-manager.d.ts +0 -143
  336. package/dist/multi-agent/slack-multi-bot-manager.d.ts.map +0 -1
  337. package/dist/multi-agent/slack-multi-bot-manager.js +0 -413
  338. package/dist/multi-agent/slack-multi-bot-manager.js.map +0 -1
  339. package/dist/multi-agent/swarm/swarm-anti-pattern-detector.d.ts +0 -98
  340. package/dist/multi-agent/swarm/swarm-anti-pattern-detector.d.ts.map +0 -1
  341. package/dist/multi-agent/swarm/swarm-anti-pattern-detector.js +0 -225
  342. package/dist/multi-agent/swarm/swarm-anti-pattern-detector.js.map +0 -1
  343. package/dist/multi-agent/swarm/swarm-db.d.ts +0 -175
  344. package/dist/multi-agent/swarm/swarm-db.d.ts.map +0 -1
  345. package/dist/multi-agent/swarm/swarm-db.js +0 -313
  346. package/dist/multi-agent/swarm/swarm-db.js.map +0 -1
  347. package/dist/multi-agent/swarm/swarm-event-reporter.d.ts +0 -116
  348. package/dist/multi-agent/swarm/swarm-event-reporter.d.ts.map +0 -1
  349. package/dist/multi-agent/swarm/swarm-event-reporter.js +0 -243
  350. package/dist/multi-agent/swarm/swarm-event-reporter.js.map +0 -1
  351. package/dist/multi-agent/swarm/swarm-mama-adapter.d.ts +0 -57
  352. package/dist/multi-agent/swarm/swarm-mama-adapter.d.ts.map +0 -1
  353. package/dist/multi-agent/swarm/swarm-mama-adapter.js +0 -87
  354. package/dist/multi-agent/swarm/swarm-mama-adapter.js.map +0 -1
  355. package/dist/multi-agent/swarm/swarm-manager.d.ts +0 -122
  356. package/dist/multi-agent/swarm/swarm-manager.d.ts.map +0 -1
  357. package/dist/multi-agent/swarm/swarm-manager.js +0 -199
  358. package/dist/multi-agent/swarm/swarm-manager.js.map +0 -1
  359. package/dist/multi-agent/swarm/swarm-task-learner.d.ts +0 -104
  360. package/dist/multi-agent/swarm/swarm-task-learner.d.ts.map +0 -1
  361. package/dist/multi-agent/swarm/swarm-task-learner.js +0 -211
  362. package/dist/multi-agent/swarm/swarm-task-learner.js.map +0 -1
  363. package/dist/multi-agent/swarm/swarm-task-runner.d.ts +0 -155
  364. package/dist/multi-agent/swarm/swarm-task-runner.d.ts.map +0 -1
  365. package/dist/multi-agent/swarm/swarm-task-runner.js +0 -615
  366. package/dist/multi-agent/swarm/swarm-task-runner.js.map +0 -1
  367. package/dist/multi-agent/swarm/wave-engine.d.ts +0 -96
  368. package/dist/multi-agent/swarm/wave-engine.d.ts.map +0 -1
  369. package/dist/multi-agent/swarm/wave-engine.js +0 -123
  370. package/dist/multi-agent/swarm/wave-engine.js.map +0 -1
  371. package/dist/multi-agent/system-reminder.d.ts +0 -206
  372. package/dist/multi-agent/system-reminder.d.ts.map +0 -1
  373. package/dist/multi-agent/system-reminder.js +0 -455
  374. package/dist/multi-agent/system-reminder.js.map +0 -1
  375. package/dist/multi-agent/task-continuation.d.ts +0 -74
  376. package/dist/multi-agent/task-continuation.d.ts.map +0 -1
  377. package/dist/multi-agent/task-continuation.js +0 -172
  378. package/dist/multi-agent/task-continuation.js.map +0 -1
  379. package/dist/multi-agent/ultrawork-state.d.ts +0 -57
  380. package/dist/multi-agent/ultrawork-state.d.ts.map +0 -1
  381. package/dist/multi-agent/ultrawork-state.js +0 -191
  382. package/dist/multi-agent/ultrawork-state.js.map +0 -1
  383. package/dist/multi-agent/ultrawork.d.ts +0 -152
  384. package/dist/multi-agent/ultrawork.d.ts.map +0 -1
  385. package/dist/multi-agent/ultrawork.js +0 -879
  386. package/dist/multi-agent/ultrawork.js.map +0 -1
  387. package/dist/multi-agent/work-tracker.d.ts +0 -22
  388. package/dist/multi-agent/work-tracker.d.ts.map +0 -1
  389. package/dist/multi-agent/work-tracker.js +0 -45
  390. package/dist/multi-agent/work-tracker.js.map +0 -1
  391. package/dist/multi-agent/workflow-engine.d.ts +0 -87
  392. package/dist/multi-agent/workflow-engine.d.ts.map +0 -1
  393. package/dist/multi-agent/workflow-engine.js +0 -604
  394. package/dist/multi-agent/workflow-engine.js.map +0 -1
  395. package/dist/onboarding/all-tools.d.ts +0 -18
  396. package/dist/onboarding/all-tools.d.ts.map +0 -1
  397. package/dist/onboarding/all-tools.js +0 -149
  398. package/dist/onboarding/all-tools.js.map +0 -1
  399. package/dist/onboarding/autonomous-discovery-tools.d.ts +0 -23
  400. package/dist/onboarding/autonomous-discovery-tools.d.ts.map +0 -1
  401. package/dist/onboarding/autonomous-discovery-tools.js +0 -268
  402. package/dist/onboarding/autonomous-discovery-tools.js.map +0 -1
  403. package/dist/onboarding/onboarding-state.d.ts +0 -70
  404. package/dist/onboarding/onboarding-state.d.ts.map +0 -1
  405. package/dist/onboarding/onboarding-state.js +0 -183
  406. package/dist/onboarding/onboarding-state.js.map +0 -1
  407. package/dist/onboarding/personality-quiz.d.ts +0 -35
  408. package/dist/onboarding/personality-quiz.d.ts.map +0 -1
  409. package/dist/onboarding/personality-quiz.js +0 -219
  410. package/dist/onboarding/personality-quiz.js.map +0 -1
  411. package/dist/onboarding/phase-5-summary.d.ts +0 -26
  412. package/dist/onboarding/phase-5-summary.d.ts.map +0 -1
  413. package/dist/onboarding/phase-5-summary.js +0 -153
  414. package/dist/onboarding/phase-5-summary.js.map +0 -1
  415. package/dist/onboarding/phase-6-security.d.ts +0 -33
  416. package/dist/onboarding/phase-6-security.d.ts.map +0 -1
  417. package/dist/onboarding/phase-6-security.js +0 -473
  418. package/dist/onboarding/phase-6-security.js.map +0 -1
  419. package/dist/onboarding/phase-7-integrations.d.ts +0 -91
  420. package/dist/onboarding/phase-7-integrations.d.ts.map +0 -1
  421. package/dist/onboarding/phase-7-integrations.js +0 -725
  422. package/dist/onboarding/phase-7-integrations.js.map +0 -1
  423. package/dist/onboarding/phase-8-demo.d.ts +0 -43
  424. package/dist/onboarding/phase-8-demo.d.ts.map +0 -1
  425. package/dist/onboarding/phase-8-demo.js +0 -346
  426. package/dist/onboarding/phase-8-demo.js.map +0 -1
  427. package/dist/onboarding/phase-9-finalization.d.ts +0 -27
  428. package/dist/onboarding/phase-9-finalization.d.ts.map +0 -1
  429. package/dist/onboarding/phase-9-finalization.js +0 -417
  430. package/dist/onboarding/phase-9-finalization.js.map +0 -1
  431. package/dist/onboarding/ritual-prompt.d.ts +0 -2
  432. package/dist/onboarding/ritual-prompt.d.ts.map +0 -1
  433. package/dist/onboarding/ritual-prompt.js +0 -285
  434. package/dist/onboarding/ritual-prompt.js.map +0 -1
  435. package/dist/onboarding/ritual-tools.d.ts +0 -17
  436. package/dist/onboarding/ritual-tools.d.ts.map +0 -1
  437. package/dist/onboarding/ritual-tools.js +0 -93
  438. package/dist/onboarding/ritual-tools.js.map +0 -1
  439. package/dist/setup/setup-tools.d.ts +0 -13
  440. package/dist/setup/setup-tools.d.ts.map +0 -1
  441. package/dist/setup/setup-tools.js +0 -106
  442. package/dist/setup/setup-tools.js.map +0 -1
  443. package/dist/utils/slack-input-validator.d.ts +0 -74
  444. package/dist/utils/slack-input-validator.d.ts.map +0 -1
  445. package/dist/utils/slack-input-validator.js +0 -275
  446. package/dist/utils/slack-input-validator.js.map +0 -1
  447. package/dist/utils/slack-rate-limiter.d.ts +0 -139
  448. package/dist/utils/slack-rate-limiter.d.ts.map +0 -1
  449. package/dist/utils/slack-rate-limiter.js +0 -324
  450. package/dist/utils/slack-rate-limiter.js.map +0 -1
  451. package/dist/wiki/wiki-compiler.d.ts +0 -13
  452. package/dist/wiki/wiki-compiler.d.ts.map +0 -1
  453. package/dist/wiki/wiki-compiler.js +0 -82
  454. package/dist/wiki/wiki-compiler.js.map +0 -1
@@ -23,6 +23,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
23
23
  exports.TaskLedger = exports.WORKORDER_CHANNEL_PREFIX = exports.TEMPORAL_WORKORDER_MAX_ATTEMPTS = exports.WORKORDER_KINDS = exports.TASK_KINDS = exports.TASK_PRIORITIES = exports.TASK_STATUSES = void 0;
24
24
  const node_crypto_1 = require("node:crypto");
25
25
  const operator_task_temporal_js_1 = require("../db/migrations/operator-task-temporal.js");
26
+ const effects_js_1 = require("../evidence/effects.js");
26
27
  const temporal_effect_js_1 = require("./temporal-effect.js");
27
28
  const task_temporal_js_1 = require("./task-temporal.js");
28
29
  exports.TASK_STATUSES = [
@@ -44,6 +45,31 @@ exports.TEMPORAL_WORKORDER_MAX_ATTEMPTS = 3;
44
45
  exports.WORKORDER_CHANNEL_PREFIX = 'workorder:';
45
46
  const KNOWN_WORKORDER_CHANNELS = exports.WORKORDER_KINDS.map((workKind) => `${exports.WORKORDER_CHANNEL_PREFIX}${workKind}`);
46
47
  const KNOWN_WORKORDER_CHANNELS_SQL = KNOWN_WORKORDER_CHANNELS.map(() => '?').join(',');
48
+ const PRIORITY_RANK = { high: 0, normal: 1, low: 2 };
49
+ function encodeListCursor(payload) {
50
+ return Buffer.from(JSON.stringify(payload), 'utf8').toString('base64url');
51
+ }
52
+ /** Loud on anything malformed or from a different ordering: a cursor silently
53
+ * reinterpreted under another order would skip or repeat rows, which is exactly
54
+ * the incompleteness this page contract exists to rule out. */
55
+ function decodeListCursor(cursor, order) {
56
+ let parsed;
57
+ try {
58
+ parsed = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8'));
59
+ }
60
+ catch {
61
+ throw new Error('[task-ledger] malformed list cursor');
62
+ }
63
+ const payload = parsed;
64
+ if (!payload || payload.order !== order || !Array.isArray(payload.k)) {
65
+ throw new Error(`[task-ledger] list cursor does not belong to order '${order}'`);
66
+ }
67
+ const expected = order === 'deadline_priority' ? 4 : 2;
68
+ if (payload.k.length !== expected || payload.k.some((value) => value === null)) {
69
+ throw new Error('[task-ledger] malformed list cursor');
70
+ }
71
+ return payload;
72
+ }
47
73
  const ISO_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
48
74
  function isoToEpochMs(iso) {
49
75
  if (!iso)
@@ -134,6 +160,9 @@ class TaskLedger {
134
160
  CREATE INDEX IF NOT EXISTS idx_operator_no_update_scope
135
161
  ON operator_no_update_notes(scope, id);
136
162
  `);
163
+ // Same database as the tasks, so a change and its cause commit or roll back together.
164
+ // A ledger that can disagree with the rows it describes is worse than no ledger.
165
+ (0, effects_js_1.ensureEffectLedger)(this.db);
137
166
  this.upgradeSchema();
138
167
  const foreignKeyViolations = this.db.pragma('foreign_key_check');
139
168
  if (foreignKeyViolations.length > 0) {
@@ -260,8 +289,20 @@ class TaskLedger {
260
289
  return row.count;
261
290
  }
262
291
  list(filter = {}) {
263
- // Owner surface only - system workorder rows never appear in board/REST/
264
- // gateway listings (Stage-2 kind filter; workorders have dedicated readers).
292
+ const { where, params } = this.buildListPredicate(filter);
293
+ const rawLimit = Number(filter.limit);
294
+ const limit = Number.isFinite(rawLimit) ? Math.max(1, Math.min(200, Math.floor(rawLimit))) : 50;
295
+ const rows = this.db
296
+ .prepare(`SELECT * FROM operator_tasks
297
+ ${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}
298
+ ORDER BY ${TaskLedger.orderSql(filter.order)}
299
+ LIMIT ?`)
300
+ .all(...params, limit);
301
+ return rows.map((row) => this.toRecord(row));
302
+ }
303
+ /** Shared filter predicate. Owner surface only - system workorder rows never appear in
304
+ * board/REST/gateway listings (Stage-2 kind filter; workorders have dedicated readers). */
305
+ buildListPredicate(filter) {
265
306
  const where = [`kind = 'owner'`];
266
307
  const params = [];
267
308
  if (filter.status) {
@@ -277,21 +318,77 @@ class TaskLedger {
277
318
  const like = `%${filter.search}%`;
278
319
  params.push(like, like, like);
279
320
  }
280
- const order = filter.order === 'updated'
321
+ return { where, params };
322
+ }
323
+ /** ORDER BY for both list() and listPage(); the trailing id makes it a TOTAL order,
324
+ * which is what lets a keyset cursor resume without skipping or repeating a row.
325
+ * LIMIT applies AFTER ordering, so a bounded read still returns the true top-N. */
326
+ static orderSql(order) {
327
+ return order === 'updated'
281
328
  ? 'updated_at DESC, id DESC'
282
329
  : // deadline asc NULLS LAST, then priority high>normal>low, then id.
283
- // LIMIT applies AFTER ordering so the true top-N is returned.
284
- `CASE WHEN deadline IS NULL THEN 1 ELSE 0 END ASC, deadline ASC,
285
- CASE priority WHEN 'high' THEN 0 WHEN 'normal' THEN 1 ELSE 2 END ASC, id ASC`;
330
+ `CASE WHEN deadline IS NULL THEN 1 ELSE 0 END ASC, COALESCE(deadline, '') ASC,
331
+ CASE priority WHEN 'high' THEN 0 WHEN 'normal' THEN 1 ELSE 2 END ASC, id ASC`;
332
+ }
333
+ static cursorFor(record, order) {
334
+ if (order === 'updated') {
335
+ return { order, k: [record.updatedAt, record.id] };
336
+ }
337
+ return {
338
+ order,
339
+ k: [
340
+ record.deadlineIso === null ? 1 : 0,
341
+ record.deadlineIso ?? '',
342
+ PRIORITY_RANK[record.priority] ?? 2,
343
+ record.id,
344
+ ],
345
+ };
346
+ }
347
+ /**
348
+ * One page of the same ordered set, with the totals that make completeness provable.
349
+ *
350
+ * Keyset, not OFFSET: an offset page silently skips or repeats rows when the set
351
+ * changes between pages, which would leave a "whole situation" claim resting on a
352
+ * read that quietly lost items.
353
+ */
354
+ listPage(filter = {}) {
355
+ const order = filter.order === 'updated' ? 'updated' : 'deadline_priority';
356
+ const { where, params } = this.buildListPredicate(filter);
286
357
  const rawLimit = Number(filter.limit);
287
358
  const limit = Number.isFinite(rawLimit) ? Math.max(1, Math.min(200, Math.floor(rawLimit))) : 50;
359
+ const totalRow = this.db
360
+ .prepare(`SELECT COUNT(*) AS total FROM operator_tasks WHERE ${where.join(' AND ')}`)
361
+ .get(...params);
362
+ const pageWhere = [...where];
363
+ const pageParams = [...params];
364
+ if (filter.cursor) {
365
+ const { k } = decodeListCursor(filter.cursor, order);
366
+ if (order === 'updated') {
367
+ pageWhere.push('(updated_at, id) < (?, ?)');
368
+ }
369
+ else {
370
+ pageWhere.push(`(CASE WHEN deadline IS NULL THEN 1 ELSE 0 END, COALESCE(deadline, ''),
371
+ CASE priority WHEN 'high' THEN 0 WHEN 'normal' THEN 1 ELSE 2 END, id) > (?, ?, ?, ?)`);
372
+ }
373
+ pageParams.push(...k);
374
+ }
375
+ // limit + 1 probes for a next page instead of guessing from a full page, so the
376
+ // final page never hands out a cursor that resolves to nothing.
288
377
  const rows = this.db
289
378
  .prepare(`SELECT * FROM operator_tasks
290
- ${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}
291
- ORDER BY ${order}
379
+ WHERE ${pageWhere.join(' AND ')}
380
+ ORDER BY ${TaskLedger.orderSql(filter.order)}
292
381
  LIMIT ?`)
293
- .all(...params, limit);
294
- return rows.map((row) => this.toRecord(row));
382
+ .all(...pageParams, limit + 1);
383
+ const hasMore = rows.length > limit;
384
+ const tasks = rows.slice(0, limit).map((row) => this.toRecord(row));
385
+ const last = tasks[tasks.length - 1];
386
+ return {
387
+ tasks,
388
+ total: totalRow.total,
389
+ returned: tasks.length,
390
+ nextCursor: hasMore && last ? encodeListCursor(TaskLedger.cursorFor(last, order)) : null,
391
+ };
295
392
  }
296
393
  /** Internal bounded page for temporal reconciliation; excludes rows that can never be candidates. */
297
394
  listTemporalScanPage(input) {
@@ -327,7 +424,7 @@ class TaskLedger {
327
424
  * (source_channel, source_event_id) UPSERTS - the existing row gets the new
328
425
  * latest_event (and title stays) instead of a near-duplicate row appearing.
329
426
  */
330
- create(input) {
427
+ create(input, origin = {}) {
331
428
  if (!input.title || input.title.trim() === '') {
332
429
  throw new Error('task title must be a non-empty string');
333
430
  }
@@ -373,22 +470,114 @@ class TaskLedger {
373
470
  ...(input.due_at !== undefined ? { due_at: input.due_at } : {}),
374
471
  ...(input.confirmed !== undefined ? { confirmed: input.confirmed } : {}),
375
472
  ...(input.latest_event !== undefined ? { latest_event: input.latest_event } : {}),
473
+ },
474
+ // A duplicate delivery of the same event: here the cause genuinely is known,
475
+ // because it is the event the row is keyed on.
476
+ {
477
+ ...origin,
478
+ causeEventIds: input.source_event_id ? [input.source_event_id] : origin.causeEventIds,
376
479
  });
377
480
  }
378
481
  }
379
- const result = this.db
380
- .prepare(`INSERT INTO operator_tasks
482
+ let createdId = 0;
483
+ this.db.exec('BEGIN IMMEDIATE');
484
+ try {
485
+ const result = this.db
486
+ .prepare(`INSERT INTO operator_tasks
381
487
  (title, status, priority, assignee, deadline, due_at, deadline_offset_minutes,
382
488
  revision, temporal_epoch, source_channel, source_event_id, latest_event,
383
489
  auto_created, confirmed, created_at, updated_at)
384
490
  VALUES (?, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?, ?, ?, ?, ?)`)
385
- .run(input.title.trim(), input.status ?? 'pending', input.priority ?? 'normal', input.assignee ?? null, normalizedDeadline, exactDue?.dueAt ?? null, exactDue?.offsetMinutes ?? null, initialTemporalEpoch, input.source_channel ?? null, input.source_event_id ?? null, input.latest_event ?? null, 1, input.confirmed ? 1 : 0, now, now);
386
- const created = this.getById(Number(result.lastInsertRowid));
491
+ .run(input.title.trim(), input.status ?? 'pending', input.priority ?? 'normal', input.assignee ?? null, normalizedDeadline, exactDue?.dueAt ?? null, exactDue?.offsetMinutes ?? null, initialTemporalEpoch, input.source_channel ?? null, input.source_event_id ?? null, input.latest_event ?? null, 1, input.confirmed ? 1 : 0, now, now);
492
+ createdId = Number(result.lastInsertRowid);
493
+ this.recordTaskChange({
494
+ kind: 'task_create',
495
+ taskId: createdId,
496
+ // The HOST batch wins. `source_event_id` arrives on agent-authored task_create
497
+ // input, so letting it take precedence made the attribution the agent's to choose:
498
+ // any 1-200 character string passes the ledger's shape check, and the change was
499
+ // then stamped `attributed` on a cause nobody could resolve. The run id is already
500
+ // protected for exactly this reason; the cause was not. Found in review.
501
+ //
502
+ // The agent's field is still USED when the host handed the run no batch - a named
503
+ // source event is better evidence than none, and an unbounded run has nothing else.
504
+ // It is weaker evidence, not worthless.
505
+ //
506
+ // A plain spread would be wrong in the other direction: an absent caller field must
507
+ // not erase what the host knows.
508
+ origin: {
509
+ ...origin,
510
+ causeEventIds: origin.causeEventIds && origin.causeEventIds.length > 0
511
+ ? origin.causeEventIds
512
+ : input.source_event_id
513
+ ? [input.source_event_id]
514
+ : origin.causeEventIds,
515
+ },
516
+ channel: input.source_channel ?? null,
517
+ // Everything the INSERT wrote. A hash over two of fifteen columns cannot tell two
518
+ // materially different writes apart, which is most of what a receipt is for.
519
+ payload: {
520
+ title: input.title.trim(),
521
+ status: input.status ?? 'pending',
522
+ priority: input.priority ?? 'normal',
523
+ assignee: input.assignee ?? null,
524
+ deadline: normalizedDeadline,
525
+ due_at: exactDue?.dueAt ?? null,
526
+ deadline_offset_minutes: exactDue?.offsetMinutes ?? null,
527
+ temporal_epoch: initialTemporalEpoch,
528
+ source_channel: input.source_channel ?? null,
529
+ source_event_id: input.source_event_id ?? null,
530
+ latest_event: input.latest_event ?? null,
531
+ confirmed: input.confirmed ? 1 : 0,
532
+ },
533
+ atMs: now,
534
+ });
535
+ this.db.exec('COMMIT');
536
+ }
537
+ catch (error) {
538
+ this.db.exec('ROLLBACK');
539
+ throw error;
540
+ }
541
+ const created = this.getById(createdId);
387
542
  if (!created)
388
543
  throw new Error('task_create: inserted row could not be read back');
389
544
  return created;
390
545
  }
391
- update(id, patch) {
546
+ /**
547
+ * Write the effect row for a task change.
548
+ *
549
+ * Called from inside the same transaction as the write it describes. The cause is the
550
+ * event the caller already recorded on the row - the tool has always accepted it, and
551
+ * 178 of the 179 owner tasks that carry one resolve to a real indexed event, so this is
552
+ * attribution that already exists rather than a new burden on the agent.
553
+ *
554
+ * When there is no cause the change is still recorded, marked unattributed. That is the
555
+ * honest reading of `task_update`, which has never had a cause field at all: the system
556
+ * has been changing owner work items without recording why, and the ledger's job is to
557
+ * show how often, not to pretend otherwise or to start refusing writes.
558
+ */
559
+ recordTaskChange(input) {
560
+ const common = {
561
+ runId: input.origin.runId ?? null,
562
+ channelId: input.channel,
563
+ kind: input.kind,
564
+ targetType: 'task',
565
+ targetId: String(input.taskId),
566
+ payload: input.payload,
567
+ atMs: input.atMs,
568
+ };
569
+ // A cause the ledger cannot use makes the change unattributed - it never makes the
570
+ // change fail. Some live rows carry 400-character legacy source identifiers, and an
571
+ // operator that cannot close a work item because its upstream id is malformed is a
572
+ // worse system than one that admits it does not know why the item changed.
573
+ const causes = (input.origin.causeEventIds ?? []).filter(effects_js_1.isUsableCause);
574
+ if (causes.length > 0) {
575
+ (0, effects_js_1.recordEffect)(this.db, { ...common, sourceEventIds: causes });
576
+ return;
577
+ }
578
+ (0, effects_js_1.recordUnattributedChange)(this.db, common);
579
+ }
580
+ update(id, patch, origin = {}) {
392
581
  if (patch.status === 'failed') {
393
582
  throw new Error(`task_update: 'failed' is a system-only status`);
394
583
  }
@@ -491,24 +680,43 @@ class TaskLedger {
491
680
  ];
492
681
  const changedColumns = persistedColumns.filter((column) => next[column] !== existing[column]);
493
682
  if (changedColumns.length === 0) {
683
+ // Nothing moved, so nothing is recorded. This is the whole point of the ledger:
684
+ // a call that ran is not a change, and the two must not be countable as one.
685
+ //
686
+ // The read-back happens after the catch, not here: a throw between COMMIT and
687
+ // return would send this into the catch and issue ROLLBACK with no open
688
+ // transaction, replacing the real error with a confusing one.
494
689
  this.db.exec('COMMIT');
495
- return this.toRecord(existing);
496
690
  }
497
- const nextRevision = existing.revision + 1;
498
- const sets = changedColumns.map((column) => `${column} = ?`);
499
- const values = changedColumns.map((column) => next[column]);
500
- sets.push('revision = ?', 'updated_at = ?');
501
- values.push(nextRevision, this.now());
502
- this.db
503
- .prepare(`UPDATE operator_tasks SET ${sets.join(', ')} WHERE id = ?`)
504
- .run(...values, id);
505
- if (temporalChanged || terminalToOpen) {
506
- this.supersedeTemporalGenerationsInTransaction(id, Number(next.temporal_epoch));
507
- }
508
- else if (openToTerminal) {
509
- this.supersedeAllActiveTemporalGenerationsInTransaction(id);
691
+ else {
692
+ const nextRevision = existing.revision + 1;
693
+ const sets = changedColumns.map((column) => `${column} = ?`);
694
+ const values = changedColumns.map((column) => next[column]);
695
+ const updatedAt = this.now();
696
+ sets.push('revision = ?', 'updated_at = ?');
697
+ values.push(nextRevision, updatedAt);
698
+ this.db
699
+ .prepare(`UPDATE operator_tasks SET ${sets.join(', ')} WHERE id = ?`)
700
+ .run(...values, id);
701
+ this.recordTaskChange({
702
+ kind: 'task_update',
703
+ taskId: id,
704
+ origin,
705
+ channel: existing.source_channel,
706
+ payload: {
707
+ revision: nextRevision,
708
+ changed: Object.fromEntries(changedColumns.map((column) => [column, next[column]])),
709
+ },
710
+ atMs: updatedAt,
711
+ });
712
+ if (temporalChanged || terminalToOpen) {
713
+ this.supersedeTemporalGenerationsInTransaction(id, Number(next.temporal_epoch));
714
+ }
715
+ else if (openToTerminal) {
716
+ this.supersedeAllActiveTemporalGenerationsInTransaction(id);
717
+ }
718
+ this.db.exec('COMMIT');
510
719
  }
511
- this.db.exec('COMMIT');
512
720
  }
513
721
  catch (error) {
514
722
  this.db.exec('ROLLBACK');
@@ -733,6 +941,20 @@ class TaskLedger {
733
941
  this.assertTemporalContextMatches(suppliedContext, trustedContext);
734
942
  return trustedContext;
735
943
  }
944
+ /**
945
+ * What this system changed, and what it changed it for.
946
+ *
947
+ * Reads live beside the writes because the effect ledger shares the tasks database on
948
+ * purpose. Exposed here rather than by handing out the connection: the ledger owns both
949
+ * halves, so a change and its account of itself cannot drift apart.
950
+ */
951
+ listChanges(query = {}) {
952
+ return (0, effects_js_1.listEffects)(this.db, query);
953
+ }
954
+ /** Of what this system changed, how much rests on evidence. */
955
+ changeCoverage(sinceMs, targetType) {
956
+ return (0, effects_js_1.changeCoverage)(this.db, sinceMs, targetType);
957
+ }
736
958
  getTemporalEffect(attemptId) {
737
959
  const row = this.db
738
960
  .prepare(`SELECT * FROM operator_temporal_effects WHERE workorder_attempt_id = ?`)
@@ -970,6 +1192,27 @@ class TaskLedger {
970
1192
  if (ownerUpdate.changes !== 1) {
971
1193
  throw new Error(`temporal effect lost owner task revision for task ${context.taskId}`);
972
1194
  }
1195
+ // The same ledger as every other owner-task change. This is the canonical case -
1196
+ // a scheduled run closing a work item - and leaving it out would have meant the
1197
+ // effect ledger could not see the one change type it was built to account for,
1198
+ // with its receipt filed in a second table nobody joins against.
1199
+ //
1200
+ // Unattributed, and correctly so: a temporal check fires because a clock advanced,
1201
+ // not because an event arrived. Its evidence is the context packet, which today
1202
+ // carries recalled memories and zero connector events - measured, not assumed.
1203
+ // Recording it as attributed would name a cause that does not exist.
1204
+ this.recordTaskChange({
1205
+ kind: 'task_update',
1206
+ taskId: context.taskId,
1207
+ origin: { runId: null },
1208
+ channel: existing.source_channel,
1209
+ payload: {
1210
+ revision: afterRevision,
1211
+ outcome: input.outcome,
1212
+ changed: Object.fromEntries(changedFields.map((column) => [column, next[column]])),
1213
+ },
1214
+ atMs: now,
1215
+ });
973
1216
  if (rescheduled) {
974
1217
  this.supersedeTemporalGenerationsInTransaction(context.taskId, Number(next.temporal_epoch), context.generationKey, now);
975
1218
  }