@xfey/tutti 0.1.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 (564) hide show
  1. package/README.md +50 -0
  2. package/dist/approvals/index.d.ts +3 -0
  3. package/dist/approvals/index.js +3 -0
  4. package/dist/approvals/manager.d.ts +47 -0
  5. package/dist/approvals/manager.js +180 -0
  6. package/dist/approvals/projections.d.ts +34 -0
  7. package/dist/approvals/projections.js +444 -0
  8. package/dist/artifacts/index.d.ts +4 -0
  9. package/dist/artifacts/index.js +4 -0
  10. package/dist/artifacts/manifest.d.ts +48 -0
  11. package/dist/artifacts/manifest.js +334 -0
  12. package/dist/artifacts/preview-runtime.d.ts +97 -0
  13. package/dist/artifacts/preview-runtime.js +585 -0
  14. package/dist/artifacts/static-preview.d.ts +17 -0
  15. package/dist/artifacts/static-preview.js +180 -0
  16. package/dist/chat-assistant/index.d.ts +66 -0
  17. package/dist/chat-assistant/index.js +268 -0
  18. package/dist/checks/index.d.ts +47 -0
  19. package/dist/checks/index.js +169 -0
  20. package/dist/collaboration-state/clarification-messages.d.ts +8 -0
  21. package/dist/collaboration-state/clarification-messages.js +180 -0
  22. package/dist/collaboration-state/clarification-records.d.ts +27 -0
  23. package/dist/collaboration-state/clarification-records.js +266 -0
  24. package/dist/collaboration-state/clarification-round-writes.d.ts +14 -0
  25. package/dist/collaboration-state/clarification-round-writes.js +58 -0
  26. package/dist/collaboration-state/clarification-rounds.d.ts +19 -0
  27. package/dist/collaboration-state/clarification-rounds.js +347 -0
  28. package/dist/collaboration-state/clarification-successors.d.ts +8 -0
  29. package/dist/collaboration-state/clarification-successors.js +318 -0
  30. package/dist/collaboration-state/execution-status.d.ts +3 -0
  31. package/dist/collaboration-state/execution-status.js +8 -0
  32. package/dist/collaboration-state/index.d.ts +17 -0
  33. package/dist/collaboration-state/index.js +16 -0
  34. package/dist/collaboration-state/messages.d.ts +25 -0
  35. package/dist/collaboration-state/messages.js +371 -0
  36. package/dist/collaboration-state/read-state.d.ts +7 -0
  37. package/dist/collaboration-state/read-state.js +136 -0
  38. package/dist/collaboration-state/recovery.d.ts +6 -0
  39. package/dist/collaboration-state/recovery.js +125 -0
  40. package/dist/collaboration-state/run-recording.d.ts +5 -0
  41. package/dist/collaboration-state/run-recording.js +216 -0
  42. package/dist/collaboration-state/run-results.d.ts +12 -0
  43. package/dist/collaboration-state/run-results.js +202 -0
  44. package/dist/collaboration-state/scratchpad-source-state.d.ts +46 -0
  45. package/dist/collaboration-state/scratchpad-source-state.js +207 -0
  46. package/dist/collaboration-state/scratchpad.d.ts +8 -0
  47. package/dist/collaboration-state/scratchpad.js +84 -0
  48. package/dist/collaboration-state/serialization.d.ts +16 -0
  49. package/dist/collaboration-state/serialization.js +71 -0
  50. package/dist/collaboration-state/storage-types.d.ts +136 -0
  51. package/dist/collaboration-state/storage-types.js +2 -0
  52. package/dist/collaboration-state/task-details.d.ts +5 -0
  53. package/dist/collaboration-state/task-details.js +25 -0
  54. package/dist/collaboration-state/types.d.ts +289 -0
  55. package/dist/collaboration-state/types.js +2 -0
  56. package/dist/collaboration-state/worklist.d.ts +11 -0
  57. package/dist/collaboration-state/worklist.js +286 -0
  58. package/dist/control-plane/clarification-commands.d.ts +34 -0
  59. package/dist/control-plane/clarification-commands.js +106 -0
  60. package/dist/control-plane/command-recovery.d.ts +3 -0
  61. package/dist/control-plane/command-recovery.js +79 -0
  62. package/dist/control-plane/context-sync.d.ts +47 -0
  63. package/dist/control-plane/context-sync.js +207 -0
  64. package/dist/control-plane/event-publishers.d.ts +24 -0
  65. package/dist/control-plane/event-publishers.js +192 -0
  66. package/dist/control-plane/execution-status.d.ts +13 -0
  67. package/dist/control-plane/execution-status.js +130 -0
  68. package/dist/control-plane/follow-up-context.d.ts +27 -0
  69. package/dist/control-plane/follow-up-context.js +93 -0
  70. package/dist/control-plane/follow-up-output.d.ts +53 -0
  71. package/dist/control-plane/follow-up-output.js +141 -0
  72. package/dist/control-plane/follow-up-run.d.ts +22 -0
  73. package/dist/control-plane/follow-up-run.js +90 -0
  74. package/dist/control-plane/follow-up-start.d.ts +26 -0
  75. package/dist/control-plane/follow-up-start.js +101 -0
  76. package/dist/control-plane/formatters.d.ts +12 -0
  77. package/dist/control-plane/formatters.js +47 -0
  78. package/dist/control-plane/index.d.ts +62 -0
  79. package/dist/control-plane/index.js +416 -0
  80. package/dist/control-plane/invalidations.d.ts +12 -0
  81. package/dist/control-plane/invalidations.js +67 -0
  82. package/dist/control-plane/procedure-logging.d.ts +11 -0
  83. package/dist/control-plane/procedure-logging.js +95 -0
  84. package/dist/control-plane/project-brief-refresh.d.ts +31 -0
  85. package/dist/control-plane/project-brief-refresh.js +105 -0
  86. package/dist/control-plane/project-context-bootstrap.d.ts +39 -0
  87. package/dist/control-plane/project-context-bootstrap.js +107 -0
  88. package/dist/control-plane/reference-summary-refresh.d.ts +22 -0
  89. package/dist/control-plane/reference-summary-refresh.js +344 -0
  90. package/dist/control-plane/run-lineage.d.ts +8 -0
  91. package/dist/control-plane/run-lineage.js +13 -0
  92. package/dist/control-plane/run-result-recording.d.ts +46 -0
  93. package/dist/control-plane/run-result-recording.js +81 -0
  94. package/dist/control-plane/run-scheduler.d.ts +35 -0
  95. package/dist/control-plane/run-scheduler.js +110 -0
  96. package/dist/control-plane/run-start.d.ts +30 -0
  97. package/dist/control-plane/run-start.js +167 -0
  98. package/dist/control-plane/scratchpad-auto-refresh.d.ts +32 -0
  99. package/dist/control-plane/scratchpad-auto-refresh.js +150 -0
  100. package/dist/control-plane/scratchpad-refresh-start.d.ts +60 -0
  101. package/dist/control-plane/scratchpad-refresh-start.js +240 -0
  102. package/dist/control-plane/scratchpad-refresh.d.ts +29 -0
  103. package/dist/control-plane/scratchpad-refresh.js +55 -0
  104. package/dist/control-plane/scratchpad-source-messages.d.ts +10 -0
  105. package/dist/control-plane/scratchpad-source-messages.js +131 -0
  106. package/dist/control-plane/startup-recovery.d.ts +19 -0
  107. package/dist/control-plane/startup-recovery.js +113 -0
  108. package/dist/control-plane/task-compile-continuation.d.ts +25 -0
  109. package/dist/control-plane/task-compile-continuation.js +127 -0
  110. package/dist/control-plane/task-compile-output.d.ts +29 -0
  111. package/dist/control-plane/task-compile-output.js +122 -0
  112. package/dist/control-plane/task-compile-start.d.ts +43 -0
  113. package/dist/control-plane/task-compile-start.js +280 -0
  114. package/dist/control-plane/task-proposal.d.ts +3 -0
  115. package/dist/control-plane/task-proposal.js +37 -0
  116. package/dist/control-plane/types.d.ts +155 -0
  117. package/dist/control-plane/types.js +2 -0
  118. package/dist/control-plane/workflows/index.d.ts +4 -0
  119. package/dist/control-plane/workflows/index.js +4 -0
  120. package/dist/control-plane/workflows/openai.d.ts +34 -0
  121. package/dist/control-plane/workflows/openai.js +411 -0
  122. package/dist/control-plane/workflows/structured-output-schemas.d.ts +9 -0
  123. package/dist/control-plane/workflows/structured-output-schemas.js +289 -0
  124. package/dist/control-plane/workflows/structured-output-validators.d.ts +15 -0
  125. package/dist/control-plane/workflows/structured-output-validators.js +295 -0
  126. package/dist/control-plane/workflows/structured-output.d.ts +3 -0
  127. package/dist/control-plane/workflows/structured-output.js +3 -0
  128. package/dist/control-plane/workflows/types.d.ts +274 -0
  129. package/dist/control-plane/workflows/types.js +2 -0
  130. package/dist/control-plane/worklist-terminal-feedback.d.ts +15 -0
  131. package/dist/control-plane/worklist-terminal-feedback.js +135 -0
  132. package/dist/index.d.ts +2 -0
  133. package/dist/index.js +32 -0
  134. package/dist/procedure-engine/index.d.ts +56 -0
  135. package/dist/procedure-engine/index.js +163 -0
  136. package/dist/project-brief/index.d.ts +4 -0
  137. package/dist/project-brief/index.js +3 -0
  138. package/dist/project-brief/repository.d.ts +5 -0
  139. package/dist/project-brief/repository.js +97 -0
  140. package/dist/project-brief/source.d.ts +8 -0
  141. package/dist/project-brief/source.js +75 -0
  142. package/dist/project-brief/types.d.ts +40 -0
  143. package/dist/project-brief/types.js +2 -0
  144. package/dist/project-docs/context.d.ts +34 -0
  145. package/dist/project-docs/context.js +86 -0
  146. package/dist/project-timeline/index.d.ts +20 -0
  147. package/dist/project-timeline/index.js +100 -0
  148. package/dist/prompt-templates/index.d.ts +13 -0
  149. package/dist/prompt-templates/index.js +86 -0
  150. package/dist/provider-usage/index.d.ts +37 -0
  151. package/dist/provider-usage/index.js +227 -0
  152. package/dist/providers/index.d.ts +2 -0
  153. package/dist/providers/index.js +2 -0
  154. package/dist/providers/openai/app-server/json-rpc.d.ts +71 -0
  155. package/dist/providers/openai/app-server/json-rpc.js +298 -0
  156. package/dist/providers/openai/app-server/permission-profile.d.ts +64 -0
  157. package/dist/providers/openai/app-server/permission-profile.js +67 -0
  158. package/dist/providers/openai/app-server/provider-config.d.ts +10 -0
  159. package/dist/providers/openai/app-server/provider-config.js +39 -0
  160. package/dist/providers/openai/app-server/read-only-procedure.d.ts +68 -0
  161. package/dist/providers/openai/app-server/read-only-procedure.js +293 -0
  162. package/dist/providers/openai/app-server/runtime-helpers.d.ts +20 -0
  163. package/dist/providers/openai/app-server/runtime-helpers.js +151 -0
  164. package/dist/providers/openai/app-server/skills.d.ts +82 -0
  165. package/dist/providers/openai/app-server/skills.js +222 -0
  166. package/dist/providers/openai/app-server/smoke-cli.d.ts +2 -0
  167. package/dist/providers/openai/app-server/smoke-cli.js +42 -0
  168. package/dist/providers/openai/app-server/smoke-helpers.d.ts +19 -0
  169. package/dist/providers/openai/app-server/smoke-helpers.js +125 -0
  170. package/dist/providers/openai/app-server/smoke-provider-input.d.ts +6 -0
  171. package/dist/providers/openai/app-server/smoke-provider-input.js +20 -0
  172. package/dist/providers/openai/app-server/smoke-types.d.ts +49 -0
  173. package/dist/providers/openai/app-server/smoke-types.js +20 -0
  174. package/dist/providers/openai/app-server/smoke.d.ts +9 -0
  175. package/dist/providers/openai/app-server/smoke.js +157 -0
  176. package/dist/providers/openai/app-server/workspace-write-run.d.ts +87 -0
  177. package/dist/providers/openai/app-server/workspace-write-run.js +379 -0
  178. package/dist/providers/openai/chat-assistant.d.ts +34 -0
  179. package/dist/providers/openai/chat-assistant.js +72 -0
  180. package/dist/providers/openai/codex-app-server.d.ts +126 -0
  181. package/dist/providers/openai/codex-app-server.js +147 -0
  182. package/dist/providers/openai/credential-store.d.ts +31 -0
  183. package/dist/providers/openai/credential-store.js +143 -0
  184. package/dist/providers/openai/credential-validation.d.ts +45 -0
  185. package/dist/providers/openai/credential-validation.js +190 -0
  186. package/dist/providers/openai/index.d.ts +13 -0
  187. package/dist/providers/openai/index.js +13 -0
  188. package/dist/providers/openai/machine-local-files.d.ts +19 -0
  189. package/dist/providers/openai/machine-local-files.js +55 -0
  190. package/dist/providers/openai/model-config.d.ts +4 -0
  191. package/dist/providers/openai/model-config.js +4 -0
  192. package/dist/providers/openai/provider-config-errors.d.ts +6 -0
  193. package/dist/providers/openai/provider-config-errors.js +13 -0
  194. package/dist/providers/openai/provider-config-shape.d.ts +3 -0
  195. package/dist/providers/openai/provider-config-shape.js +108 -0
  196. package/dist/providers/openai/provider-config-toml.d.ts +13 -0
  197. package/dist/providers/openai/provider-config-toml.js +113 -0
  198. package/dist/providers/openai/provider-config.d.ts +73 -0
  199. package/dist/providers/openai/provider-config.js +117 -0
  200. package/dist/providers/openai/provider-setup.d.ts +31 -0
  201. package/dist/providers/openai/provider-setup.js +88 -0
  202. package/dist/providers/openai/sdk-procedure-runner.d.ts +70 -0
  203. package/dist/providers/openai/sdk-procedure-runner.js +123 -0
  204. package/dist/providers/openai/token-usage.d.ts +11 -0
  205. package/dist/providers/openai/token-usage.js +90 -0
  206. package/dist/run-engine/index.d.ts +61 -0
  207. package/dist/run-engine/index.js +140 -0
  208. package/dist/run-pipeline/candidate-diff.d.ts +3 -0
  209. package/dist/run-pipeline/candidate-diff.js +10 -0
  210. package/dist/run-pipeline/openai.d.ts +41 -0
  211. package/dist/run-pipeline/openai.js +548 -0
  212. package/dist/run-pipeline/promotion-reconcile.d.ts +13 -0
  213. package/dist/run-pipeline/promotion-reconcile.js +138 -0
  214. package/dist/run-pipeline/result-projections.d.ts +39 -0
  215. package/dist/run-pipeline/result-projections.js +115 -0
  216. package/dist/run-pipeline/task-run-invocation.d.ts +6 -0
  217. package/dist/run-pipeline/task-run-invocation.js +130 -0
  218. package/dist/run-pipeline/task-run-output.d.ts +38 -0
  219. package/dist/run-pipeline/task-run-output.js +146 -0
  220. package/dist/server-shell/cli/args.d.ts +7 -0
  221. package/dist/server-shell/cli/args.js +30 -0
  222. package/dist/server-shell/cli/cli.d.ts +3 -0
  223. package/dist/server-shell/cli/cli.js +57 -0
  224. package/dist/server-shell/cli/errors.d.ts +9 -0
  225. package/dist/server-shell/cli/errors.js +53 -0
  226. package/dist/server-shell/cli/git-bootstrap.d.ts +24 -0
  227. package/dist/server-shell/cli/git-bootstrap.js +246 -0
  228. package/dist/server-shell/cli/host-lifecycle.d.ts +45 -0
  229. package/dist/server-shell/cli/host-lifecycle.js +298 -0
  230. package/dist/server-shell/cli/host-relay-status.d.ts +6 -0
  231. package/dist/server-shell/cli/host-relay-status.js +43 -0
  232. package/dist/server-shell/cli/host-runtime-endpoint.d.ts +22 -0
  233. package/dist/server-shell/cli/host-runtime-endpoint.js +120 -0
  234. package/dist/server-shell/cli/host-server-runtime.d.ts +30 -0
  235. package/dist/server-shell/cli/host-server-runtime.js +432 -0
  236. package/dist/server-shell/cli/index.d.ts +8 -0
  237. package/dist/server-shell/cli/index.js +8 -0
  238. package/dist/server-shell/cli/launch.d.ts +45 -0
  239. package/dist/server-shell/cli/launch.js +115 -0
  240. package/dist/server-shell/cli/machine-local.d.ts +69 -0
  241. package/dist/server-shell/cli/machine-local.js +223 -0
  242. package/dist/server-shell/cli/project-identity.d.ts +20 -0
  243. package/dist/server-shell/cli/project-identity.js +87 -0
  244. package/dist/server-shell/cli/relay-registration.d.ts +31 -0
  245. package/dist/server-shell/cli/relay-registration.js +61 -0
  246. package/dist/server-shell/command-idempotency/index.d.ts +44 -0
  247. package/dist/server-shell/command-idempotency/index.js +155 -0
  248. package/dist/server-shell/dev-runner/cli.d.ts +2 -0
  249. package/dist/server-shell/dev-runner/cli.js +10 -0
  250. package/dist/server-shell/dev-runner/config.d.ts +38 -0
  251. package/dist/server-shell/dev-runner/config.js +277 -0
  252. package/dist/server-shell/dev-runner/host-cli.d.ts +2 -0
  253. package/dist/server-shell/dev-runner/host-cli.js +22 -0
  254. package/dist/server-shell/dev-runner/index.d.ts +3 -0
  255. package/dist/server-shell/dev-runner/index.js +3 -0
  256. package/dist/server-shell/dev-runner/runner.d.ts +30 -0
  257. package/dist/server-shell/dev-runner/runner.js +236 -0
  258. package/dist/server-shell/http/create-server.d.ts +18 -0
  259. package/dist/server-shell/http/create-server.js +51 -0
  260. package/dist/server-shell/http/host-tunnel.d.ts +15 -0
  261. package/dist/server-shell/http/host-tunnel.js +154 -0
  262. package/dist/server-shell/http/logger.d.ts +7 -0
  263. package/dist/server-shell/http/logger.js +19 -0
  264. package/dist/server-shell/http/routes/agent-context-auth.d.ts +41 -0
  265. package/dist/server-shell/http/routes/agent-context-auth.js +73 -0
  266. package/dist/server-shell/http/routes/agent-context-errors.d.ts +6 -0
  267. package/dist/server-shell/http/routes/agent-context-errors.js +9 -0
  268. package/dist/server-shell/http/routes/agent-context-messages-routes.d.ts +4 -0
  269. package/dist/server-shell/http/routes/agent-context-messages-routes.js +74 -0
  270. package/dist/server-shell/http/routes/agent-context-project-doc-routes.d.ts +4 -0
  271. package/dist/server-shell/http/routes/agent-context-project-doc-routes.js +86 -0
  272. package/dist/server-shell/http/routes/agent-context-project-docs.d.ts +40 -0
  273. package/dist/server-shell/http/routes/agent-context-project-docs.js +98 -0
  274. package/dist/server-shell/http/routes/agent-context-query.d.ts +31 -0
  275. package/dist/server-shell/http/routes/agent-context-query.js +72 -0
  276. package/dist/server-shell/http/routes/agent-context-reference-routes.d.ts +4 -0
  277. package/dist/server-shell/http/routes/agent-context-reference-routes.js +82 -0
  278. package/dist/server-shell/http/routes/agent-context-references.d.ts +21 -0
  279. package/dist/server-shell/http/routes/agent-context-references.js +85 -0
  280. package/dist/server-shell/http/routes/agent-context-shared.d.ts +34 -0
  281. package/dist/server-shell/http/routes/agent-context-shared.js +44 -0
  282. package/dist/server-shell/http/routes/agent-context-skills-routes.d.ts +4 -0
  283. package/dist/server-shell/http/routes/agent-context-skills-routes.js +85 -0
  284. package/dist/server-shell/http/routes/agent-context-workspace-routes.d.ts +4 -0
  285. package/dist/server-shell/http/routes/agent-context-workspace-routes.js +130 -0
  286. package/dist/server-shell/http/routes/agent-context.d.ts +8 -0
  287. package/dist/server-shell/http/routes/agent-context.js +16 -0
  288. package/dist/server-shell/http/routes/health.d.ts +7 -0
  289. package/dist/server-shell/http/routes/health.js +41 -0
  290. package/dist/server-shell/http/routes/local-control.d.ts +40 -0
  291. package/dist/server-shell/http/routes/local-control.js +260 -0
  292. package/dist/server-shell/http/routes/project-api/approval-routes.d.ts +4 -0
  293. package/dist/server-shell/http/routes/project-api/approval-routes.js +64 -0
  294. package/dist/server-shell/http/routes/project-api/artifacts-routes.d.ts +8 -0
  295. package/dist/server-shell/http/routes/project-api/artifacts-routes.js +166 -0
  296. package/dist/server-shell/http/routes/project-api/clarification-routes.d.ts +4 -0
  297. package/dist/server-shell/http/routes/project-api/clarification-routes.js +150 -0
  298. package/dist/server-shell/http/routes/project-api/constants.d.ts +3 -0
  299. package/dist/server-shell/http/routes/project-api/constants.js +3 -0
  300. package/dist/server-shell/http/routes/project-api/errors.d.ts +26 -0
  301. package/dist/server-shell/http/routes/project-api/errors.js +41 -0
  302. package/dist/server-shell/http/routes/project-api/events-stream.d.ts +11 -0
  303. package/dist/server-shell/http/routes/project-api/events-stream.js +55 -0
  304. package/dist/server-shell/http/routes/project-api/execution-routes.d.ts +4 -0
  305. package/dist/server-shell/http/routes/project-api/execution-routes.js +92 -0
  306. package/dist/server-shell/http/routes/project-api/headers.d.ts +2 -0
  307. package/dist/server-shell/http/routes/project-api/headers.js +7 -0
  308. package/dist/server-shell/http/routes/project-api/invalidations.d.ts +10 -0
  309. package/dist/server-shell/http/routes/project-api/invalidations.js +57 -0
  310. package/dist/server-shell/http/routes/project-api/messages-routes.d.ts +8 -0
  311. package/dist/server-shell/http/routes/project-api/messages-routes.js +80 -0
  312. package/dist/server-shell/http/routes/project-api/openapi-approval-routes.d.ts +128 -0
  313. package/dist/server-shell/http/routes/project-api/openapi-approval-routes.js +32 -0
  314. package/dist/server-shell/http/routes/project-api/openapi-artifacts-routes.d.ts +51 -0
  315. package/dist/server-shell/http/routes/project-api/openapi-artifacts-routes.js +56 -0
  316. package/dist/server-shell/http/routes/project-api/openapi-collaboration-routes.d.ts +466 -0
  317. package/dist/server-shell/http/routes/project-api/openapi-collaboration-routes.js +165 -0
  318. package/dist/server-shell/http/routes/project-api/openapi-diagnostic-routes.d.ts +16 -0
  319. package/dist/server-shell/http/routes/project-api/openapi-diagnostic-routes.js +17 -0
  320. package/dist/server-shell/http/routes/project-api/openapi-execution-routes.d.ts +215 -0
  321. package/dist/server-shell/http/routes/project-api/openapi-execution-routes.js +75 -0
  322. package/dist/server-shell/http/routes/project-api/openapi-path-parameters.d.ts +9 -0
  323. package/dist/server-shell/http/routes/project-api/openapi-path-parameters.js +18 -0
  324. package/dist/server-shell/http/routes/project-api/openapi-skills-routes.d.ts +60 -0
  325. package/dist/server-shell/http/routes/project-api/openapi-skills-routes.js +51 -0
  326. package/dist/server-shell/http/routes/project-api/openapi-timeline-routes.d.ts +115 -0
  327. package/dist/server-shell/http/routes/project-api/openapi-timeline-routes.js +17 -0
  328. package/dist/server-shell/http/routes/project-api/openapi-viewer-routes.d.ts +323 -0
  329. package/dist/server-shell/http/routes/project-api/openapi-viewer-routes.js +120 -0
  330. package/dist/server-shell/http/routes/project-api/openapi-workspace-routes.d.ts +1317 -0
  331. package/dist/server-shell/http/routes/project-api/openapi-workspace-routes.js +95 -0
  332. package/dist/server-shell/http/routes/project-api/openapi.d.ts +2457 -0
  333. package/dist/server-shell/http/routes/project-api/openapi.js +30 -0
  334. package/dist/server-shell/http/routes/project-api/payload-validation.d.ts +6 -0
  335. package/dist/server-shell/http/routes/project-api/payload-validation.js +36 -0
  336. package/dist/server-shell/http/routes/project-api/project-docs-helpers.d.ts +9 -0
  337. package/dist/server-shell/http/routes/project-api/project-docs-helpers.js +17 -0
  338. package/dist/server-shell/http/routes/project-api/project-docs-routes.d.ts +8 -0
  339. package/dist/server-shell/http/routes/project-api/project-docs-routes.js +151 -0
  340. package/dist/server-shell/http/routes/project-api/project-timeline-projection.d.ts +8 -0
  341. package/dist/server-shell/http/routes/project-api/project-timeline-projection.js +658 -0
  342. package/dist/server-shell/http/routes/project-api/project-timeline-routes.d.ts +4 -0
  343. package/dist/server-shell/http/routes/project-api/project-timeline-routes.js +23 -0
  344. package/dist/server-shell/http/routes/project-api/read-state-routes.d.ts +8 -0
  345. package/dist/server-shell/http/routes/project-api/read-state-routes.js +82 -0
  346. package/dist/server-shell/http/routes/project-api/reference-files-routes.d.ts +8 -0
  347. package/dist/server-shell/http/routes/project-api/reference-files-routes.js +184 -0
  348. package/dist/server-shell/http/routes/project-api/reference-files.d.ts +17 -0
  349. package/dist/server-shell/http/routes/project-api/reference-files.js +212 -0
  350. package/dist/server-shell/http/routes/project-api/repo-projection.d.ts +3 -0
  351. package/dist/server-shell/http/routes/project-api/repo-projection.js +58 -0
  352. package/dist/server-shell/http/routes/project-api/schemas.d.ts +1351 -0
  353. package/dist/server-shell/http/routes/project-api/schemas.js +441 -0
  354. package/dist/server-shell/http/routes/project-api/session-requirements.d.ts +10 -0
  355. package/dist/server-shell/http/routes/project-api/session-requirements.js +60 -0
  356. package/dist/server-shell/http/routes/project-api/skills-helpers.d.ts +7 -0
  357. package/dist/server-shell/http/routes/project-api/skills-helpers.js +48 -0
  358. package/dist/server-shell/http/routes/project-api/skills-routes.d.ts +8 -0
  359. package/dist/server-shell/http/routes/project-api/skills-routes.js +185 -0
  360. package/dist/server-shell/http/routes/project-api/staged-uploads.d.ts +14 -0
  361. package/dist/server-shell/http/routes/project-api/staged-uploads.js +149 -0
  362. package/dist/server-shell/http/routes/project-api/system-routes.d.ts +8 -0
  363. package/dist/server-shell/http/routes/project-api/system-routes.js +141 -0
  364. package/dist/server-shell/http/routes/project-api/types.d.ts +137 -0
  365. package/dist/server-shell/http/routes/project-api/types.js +2 -0
  366. package/dist/server-shell/http/routes/project-api/viewer-projections.d.ts +17 -0
  367. package/dist/server-shell/http/routes/project-api/viewer-projections.js +102 -0
  368. package/dist/server-shell/http/routes/project-api/viewer-routes.d.ts +4 -0
  369. package/dist/server-shell/http/routes/project-api/viewer-routes.js +100 -0
  370. package/dist/server-shell/http/routes/project-api/workflow-routes.d.ts +4 -0
  371. package/dist/server-shell/http/routes/project-api/workflow-routes.js +85 -0
  372. package/dist/server-shell/http/routes/project-api/workspace-projections.d.ts +5 -0
  373. package/dist/server-shell/http/routes/project-api/workspace-projections.js +103 -0
  374. package/dist/server-shell/http/routes/project-api.d.ts +8 -0
  375. package/dist/server-shell/http/routes/project-api.js +34 -0
  376. package/dist/server-shell/http/sse-replay-buffer.d.ts +54 -0
  377. package/dist/server-shell/http/sse-replay-buffer.js +110 -0
  378. package/dist/server-shell/http/sse.d.ts +12 -0
  379. package/dist/server-shell/http/sse.js +22 -0
  380. package/dist/server-shell/http/static-web.d.ts +6 -0
  381. package/dist/server-shell/http/static-web.js +52 -0
  382. package/dist/server-shell/http/validation.d.ts +13 -0
  383. package/dist/server-shell/http/validation.js +136 -0
  384. package/dist/server-shell/http/workspace-events.d.ts +38 -0
  385. package/dist/server-shell/http/workspace-events.js +98 -0
  386. package/dist/server-shell/session/relay-session-context.d.ts +25 -0
  387. package/dist/server-shell/session/relay-session-context.js +49 -0
  388. package/dist/server-shell/smoke/e2e-client.d.ts +59 -0
  389. package/dist/server-shell/smoke/e2e-client.js +304 -0
  390. package/dist/server-shell/smoke/index.d.ts +2 -0
  391. package/dist/server-shell/smoke/index.js +2 -0
  392. package/dist/skills/constants.d.ts +8 -0
  393. package/dist/skills/constants.js +9 -0
  394. package/dist/skills/errors.d.ts +6 -0
  395. package/dist/skills/errors.js +9 -0
  396. package/dist/skills/index.d.ts +41 -0
  397. package/dist/skills/index.js +171 -0
  398. package/dist/skills/metadata.d.ts +8 -0
  399. package/dist/skills/metadata.js +80 -0
  400. package/dist/skills/zip-import.d.ts +18 -0
  401. package/dist/skills/zip-import.js +241 -0
  402. package/dist/store/command-recovery.d.ts +26 -0
  403. package/dist/store/command-recovery.js +71 -0
  404. package/dist/store/index.d.ts +6 -0
  405. package/dist/store/index.js +6 -0
  406. package/dist/store/lifecycle.d.ts +23 -0
  407. package/dist/store/lifecycle.js +53 -0
  408. package/dist/store/metadata.d.ts +18 -0
  409. package/dist/store/metadata.js +30 -0
  410. package/dist/store/migrations.d.ts +20 -0
  411. package/dist/store/migrations.js +76 -0
  412. package/dist/store/sqlite.d.ts +11 -0
  413. package/dist/store/sqlite.js +21 -0
  414. package/dist/workspace-ops/constants.d.ts +15 -0
  415. package/dist/workspace-ops/constants.js +20 -0
  416. package/dist/workspace-ops/errors.d.ts +8 -0
  417. package/dist/workspace-ops/errors.js +33 -0
  418. package/dist/workspace-ops/git.d.ts +13 -0
  419. package/dist/workspace-ops/git.js +53 -0
  420. package/dist/workspace-ops/index.d.ts +11 -0
  421. package/dist/workspace-ops/index.js +9 -0
  422. package/dist/workspace-ops/mainline.d.ts +2 -0
  423. package/dist/workspace-ops/mainline.js +16 -0
  424. package/dist/workspace-ops/project-doc-templates.d.ts +12 -0
  425. package/dist/workspace-ops/project-doc-templates.js +180 -0
  426. package/dist/workspace-ops/project-docs.d.ts +7 -0
  427. package/dist/workspace-ops/project-docs.js +156 -0
  428. package/dist/workspace-ops/reference-files.d.ts +3 -0
  429. package/dist/workspace-ops/reference-files.js +137 -0
  430. package/dist/workspace-ops/reference-metadata.d.ts +13 -0
  431. package/dist/workspace-ops/reference-metadata.js +86 -0
  432. package/dist/workspace-ops/reference-summaries.d.ts +17 -0
  433. package/dist/workspace-ops/reference-summaries.js +298 -0
  434. package/dist/workspace-ops/run-workspaces.d.ts +18 -0
  435. package/dist/workspace-ops/run-workspaces.js +271 -0
  436. package/dist/workspace-ops/types.d.ts +219 -0
  437. package/dist/workspace-ops/types.js +2 -0
  438. package/dist/workspace-ops/viewer-file.d.ts +4 -0
  439. package/dist/workspace-ops/viewer-file.js +207 -0
  440. package/dist/workspace-ops/viewer-git.d.ts +20 -0
  441. package/dist/workspace-ops/viewer-git.js +111 -0
  442. package/dist/workspace-ops/viewer-paths.d.ts +3 -0
  443. package/dist/workspace-ops/viewer-paths.js +13 -0
  444. package/dist/workspace-ops/viewer-tree.d.ts +9 -0
  445. package/dist/workspace-ops/viewer-tree.js +144 -0
  446. package/dist/workspace-ops/viewer.d.ts +5 -0
  447. package/dist/workspace-ops/viewer.js +5 -0
  448. package/migrations/0001_init.sql +674 -0
  449. package/migrations/0002_allow_sealed_round_successor_note.sql +14 -0
  450. package/migrations/0003_drop_scratchpad_source_message_refs.sql +1 -0
  451. package/migrations/0004_read_state.sql +109 -0
  452. package/migrations/0005_provider_usage.sql +15 -0
  453. package/migrations/0006_scratchpad_source_state.sql +29 -0
  454. package/migrations/0007_workspace_signal_read_state_scopes.sql +74 -0
  455. package/migrations/0008_provider_usage_anchors.sql +32 -0
  456. package/migrations/0009_project_timeline_events.sql +33 -0
  457. package/migrations/0010_project_brief.sql +13 -0
  458. package/migrations/0011_message_author_avatar.sql +5 -0
  459. package/migrations/README.md +44 -0
  460. package/node_modules/@tutti/relay-client/dist/host-control.d.ts +164 -0
  461. package/node_modules/@tutti/relay-client/dist/host-control.js +284 -0
  462. package/node_modules/@tutti/relay-client/dist/index.d.ts +3 -0
  463. package/node_modules/@tutti/relay-client/dist/index.js +3 -0
  464. package/node_modules/@tutti/relay-client/dist/tunnel-frames.d.ts +8 -0
  465. package/node_modules/@tutti/relay-client/dist/tunnel-frames.js +124 -0
  466. package/node_modules/@tutti/relay-client/dist/tunnel-types.d.ts +61 -0
  467. package/node_modules/@tutti/relay-client/dist/tunnel-types.js +2 -0
  468. package/node_modules/@tutti/relay-client/dist/tunnel.d.ts +4 -0
  469. package/node_modules/@tutti/relay-client/dist/tunnel.js +144 -0
  470. package/node_modules/@tutti/relay-client/package.json +18 -0
  471. package/node_modules/@tutti/shared/dist/domain/index.d.ts +59 -0
  472. package/node_modules/@tutti/shared/dist/domain/index.js +37 -0
  473. package/node_modules/@tutti/shared/dist/ids/index.d.ts +85 -0
  474. package/node_modules/@tutti/shared/dist/ids/index.js +88 -0
  475. package/node_modules/@tutti/shared/dist/index.d.ts +6 -0
  476. package/node_modules/@tutti/shared/dist/index.js +6 -0
  477. package/node_modules/@tutti/shared/dist/schemas/api/approvals.d.ts +307 -0
  478. package/node_modules/@tutti/shared/dist/schemas/api/approvals.js +110 -0
  479. package/node_modules/@tutti/shared/dist/schemas/api/artifacts.d.ts +173 -0
  480. package/node_modules/@tutti/shared/dist/schemas/api/artifacts.js +107 -0
  481. package/node_modules/@tutti/shared/dist/schemas/api/clarifications.d.ts +704 -0
  482. package/node_modules/@tutti/shared/dist/schemas/api/clarifications.js +224 -0
  483. package/node_modules/@tutti/shared/dist/schemas/api/index.d.ts +18 -0
  484. package/node_modules/@tutti/shared/dist/schemas/api/index.js +17 -0
  485. package/node_modules/@tutti/shared/dist/schemas/api/messages.d.ts +370 -0
  486. package/node_modules/@tutti/shared/dist/schemas/api/messages.js +134 -0
  487. package/node_modules/@tutti/shared/dist/schemas/api/openapi.d.ts +32 -0
  488. package/node_modules/@tutti/shared/dist/schemas/api/openapi.js +100 -0
  489. package/node_modules/@tutti/shared/dist/schemas/api/primitives.d.ts +109 -0
  490. package/node_modules/@tutti/shared/dist/schemas/api/primitives.js +174 -0
  491. package/node_modules/@tutti/shared/dist/schemas/api/project-timeline.d.ts +149 -0
  492. package/node_modules/@tutti/shared/dist/schemas/api/project-timeline.js +44 -0
  493. package/node_modules/@tutti/shared/dist/schemas/api/provider-config.d.ts +21 -0
  494. package/node_modules/@tutti/shared/dist/schemas/api/provider-config.js +33 -0
  495. package/node_modules/@tutti/shared/dist/schemas/api/provider-usage.d.ts +87 -0
  496. package/node_modules/@tutti/shared/dist/schemas/api/provider-usage.js +48 -0
  497. package/node_modules/@tutti/shared/dist/schemas/api/read-state.d.ts +89 -0
  498. package/node_modules/@tutti/shared/dist/schemas/api/read-state.js +39 -0
  499. package/node_modules/@tutti/shared/dist/schemas/api/runtime-events.d.ts +484 -0
  500. package/node_modules/@tutti/shared/dist/schemas/api/runtime-events.js +185 -0
  501. package/node_modules/@tutti/shared/dist/schemas/api/skills.d.ts +88 -0
  502. package/node_modules/@tutti/shared/dist/schemas/api/skills.js +71 -0
  503. package/node_modules/@tutti/shared/dist/schemas/api/types.d.ts +253 -0
  504. package/node_modules/@tutti/shared/dist/schemas/api/types.js +2 -0
  505. package/node_modules/@tutti/shared/dist/schemas/api/uploads.d.ts +103 -0
  506. package/node_modules/@tutti/shared/dist/schemas/api/uploads.js +78 -0
  507. package/node_modules/@tutti/shared/dist/schemas/api/viewer-reference.d.ts +484 -0
  508. package/node_modules/@tutti/shared/dist/schemas/api/viewer-reference.js +267 -0
  509. package/node_modules/@tutti/shared/dist/schemas/api/work-items.d.ts +264 -0
  510. package/node_modules/@tutti/shared/dist/schemas/api/work-items.js +196 -0
  511. package/node_modules/@tutti/shared/dist/schemas/api/workspace-commands.d.ts +179 -0
  512. package/node_modules/@tutti/shared/dist/schemas/api/workspace-commands.js +137 -0
  513. package/node_modules/@tutti/shared/dist/schemas/domain/index.d.ts +31 -0
  514. package/node_modules/@tutti/shared/dist/schemas/domain/index.js +49 -0
  515. package/node_modules/@tutti/shared/dist/schemas/internal/index.d.ts +46 -0
  516. package/node_modules/@tutti/shared/dist/schemas/internal/index.js +46 -0
  517. package/node_modules/@tutti/shared/dist/utils/command-idempotency/index.d.ts +40 -0
  518. package/node_modules/@tutti/shared/dist/utils/command-idempotency/index.js +100 -0
  519. package/node_modules/@tutti/shared/dist/utils/index.d.ts +5 -0
  520. package/node_modules/@tutti/shared/dist/utils/index.js +5 -0
  521. package/node_modules/@tutti/shared/dist/utils/logging/index.d.ts +34 -0
  522. package/node_modules/@tutti/shared/dist/utils/logging/index.js +130 -0
  523. package/node_modules/@tutti/shared/dist/utils/path-policy/index.d.ts +13 -0
  524. package/node_modules/@tutti/shared/dist/utils/path-policy/index.js +80 -0
  525. package/node_modules/@tutti/shared/dist/utils/redaction/index.d.ts +19 -0
  526. package/node_modules/@tutti/shared/dist/utils/redaction/index.js +158 -0
  527. package/node_modules/@tutti/shared/package.json +63 -0
  528. package/package.json +47 -0
  529. package/prompts/README.md +36 -0
  530. package/prompts/chat-assistant.md +43 -0
  531. package/prompts/codex/README.md +13 -0
  532. package/prompts/codex/no-write-smoke.md +35 -0
  533. package/prompts/procedures/README.md +38 -0
  534. package/prompts/procedures/context-sync.md +66 -0
  535. package/prompts/procedures/follow-up-check.md +83 -0
  536. package/prompts/procedures/project-brief-refresh.md +79 -0
  537. package/prompts/procedures/project-context-bootstrap.md +58 -0
  538. package/prompts/procedures/reference-file-summary.md +49 -0
  539. package/prompts/procedures/scratchpad-refresh.md +83 -0
  540. package/prompts/procedures/task-compile.md +116 -0
  541. package/prompts/prompt-flow-experiment-plan.md +203 -0
  542. package/prompts/prompt-flow-map.md +478 -0
  543. package/prompts/runs/README.md +17 -0
  544. package/prompts/runs/task-continuation.md +148 -0
  545. package/prompts/runs/task-retry.md +153 -0
  546. package/prompts/runs/task-run.md +135 -0
  547. package/prompts/skills/README.md +25 -0
  548. package/prompts/skills/read-main-chat/README.md +8 -0
  549. package/prompts/skills/read-main-chat/SKILL.md +18 -0
  550. package/prompts/skills/read-project-docs/README.md +13 -0
  551. package/prompts/skills/read-project-docs/SKILL.md +42 -0
  552. package/prompts/skills/read-references/README.md +9 -0
  553. package/prompts/skills/read-references/SKILL.md +26 -0
  554. package/prompts/skills/read-scratchpad/README.md +8 -0
  555. package/prompts/skills/read-scratchpad/SKILL.md +16 -0
  556. package/prompts/skills/read-user-skills/README.md +7 -0
  557. package/prompts/skills/read-user-skills/SKILL.md +22 -0
  558. package/prompts/skills/read-worklist/README.md +9 -0
  559. package/prompts/skills/read-worklist/SKILL.md +20 -0
  560. package/web/assets/Tutti-B7gEyTp1.png +0 -0
  561. package/web/assets/Tutti-square-BqFU7F0D.png +0 -0
  562. package/web/assets/index-CWkBgHap.js +29 -0
  563. package/web/assets/index-D8xJY8Gr.css +1 -0
  564. package/web/index.html +13 -0
@@ -0,0 +1,674 @@
1
+ CREATE TABLE IF NOT EXISTS schema_migrations (
2
+ version TEXT PRIMARY KEY,
3
+ checksum TEXT NOT NULL,
4
+ applied_at TEXT NOT NULL
5
+ );
6
+
7
+ CREATE TABLE IF NOT EXISTS store_metadata (
8
+ id TEXT PRIMARY KEY CHECK (id = 'current'),
9
+ project_id TEXT NOT NULL UNIQUE,
10
+ schema_version INTEGER NOT NULL DEFAULT 1 CHECK (schema_version >= 1),
11
+ created_at TEXT NOT NULL,
12
+ updated_at TEXT NOT NULL
13
+ );
14
+
15
+ CREATE TABLE IF NOT EXISTS command_idempotency_records (
16
+ command_id TEXT PRIMARY KEY,
17
+ command_name TEXT NOT NULL,
18
+ target_ref TEXT,
19
+ request_hash TEXT NOT NULL,
20
+ status TEXT NOT NULL CHECK (status IN ('in_progress', 'completed', 'failed')),
21
+ disposition_json TEXT CHECK (
22
+ disposition_json IS NULL
23
+ OR (json_valid(disposition_json) AND json_type(disposition_json) = 'object')
24
+ ),
25
+ created_at TEXT NOT NULL,
26
+ updated_at TEXT NOT NULL,
27
+ completed_at TEXT,
28
+ CHECK (
29
+ (status = 'in_progress' AND completed_at IS NULL AND disposition_json IS NULL)
30
+ OR (status IN ('completed', 'failed') AND completed_at IS NOT NULL AND disposition_json IS NOT NULL)
31
+ )
32
+ );
33
+
34
+ CREATE INDEX IF NOT EXISTS idx_command_idempotency_status
35
+ ON command_idempotency_records (status, updated_at, command_name);
36
+
37
+ CREATE TABLE IF NOT EXISTS task_modules (
38
+ id TEXT PRIMARY KEY,
39
+ name TEXT NOT NULL CHECK (length(name) > 0),
40
+ summary TEXT,
41
+ sort_order INTEGER NOT NULL,
42
+ archived INTEGER NOT NULL DEFAULT 0 CHECK (archived IN (0, 1)),
43
+ created_at TEXT NOT NULL,
44
+ updated_at TEXT
45
+ );
46
+
47
+ CREATE INDEX IF NOT EXISTS idx_task_modules_order
48
+ ON task_modules (archived, sort_order, id);
49
+
50
+ CREATE TABLE IF NOT EXISTS tasks (
51
+ id TEXT PRIMARY KEY,
52
+ module_id TEXT NOT NULL REFERENCES task_modules(id) ON UPDATE CASCADE,
53
+ title TEXT NOT NULL CHECK (length(title) > 0),
54
+ summary TEXT NOT NULL,
55
+ status TEXT NOT NULL CHECK (status IN ('todo', 'running', 'pending', 'done', 'failed')),
56
+ sort_order INTEGER NOT NULL,
57
+ current_activity_ref TEXT,
58
+ active_clarification_thread_id TEXT
59
+ REFERENCES clarification_threads(id)
60
+ DEFERRABLE INITIALLY DEFERRED,
61
+ latest_run_result_id TEXT
62
+ REFERENCES run_results(id)
63
+ DEFERRABLE INITIALLY DEFERRED,
64
+ created_from_workflow_ref TEXT NOT NULL,
65
+ created_at TEXT NOT NULL,
66
+ updated_at TEXT NOT NULL,
67
+ CHECK (
68
+ (status = 'pending' AND active_clarification_thread_id IS NOT NULL)
69
+ OR (status != 'pending' AND active_clarification_thread_id IS NULL)
70
+ )
71
+ );
72
+
73
+ CREATE INDEX IF NOT EXISTS idx_tasks_worklist_order
74
+ ON tasks (module_id, sort_order, id);
75
+
76
+ CREATE INDEX IF NOT EXISTS idx_tasks_status_order
77
+ ON tasks (status, sort_order, id);
78
+
79
+ CREATE INDEX IF NOT EXISTS idx_tasks_active_activity
80
+ ON tasks (current_activity_ref)
81
+ WHERE current_activity_ref IS NOT NULL;
82
+
83
+ CREATE TABLE IF NOT EXISTS task_details (
84
+ task_id TEXT PRIMARY KEY REFERENCES tasks(id) ON DELETE CASCADE,
85
+ contract_json TEXT NOT NULL CHECK (
86
+ json_valid(contract_json) AND json_type(contract_json) = 'object'
87
+ ),
88
+ result_json TEXT NOT NULL DEFAULT '{}' CHECK (
89
+ json_valid(result_json) AND json_type(result_json) = 'object'
90
+ ),
91
+ frozen_contract_since_activity_ref TEXT,
92
+ updated_at TEXT NOT NULL
93
+ );
94
+
95
+ CREATE TABLE IF NOT EXISTS messages (
96
+ id TEXT PRIMARY KEY,
97
+ scope_kind TEXT NOT NULL CHECK (scope_kind IN ('main_chat', 'clarification_round')),
98
+ clarification_round_id TEXT
99
+ REFERENCES clarification_rounds(id)
100
+ DEFERRABLE INITIALLY DEFERRED,
101
+ author_kind TEXT NOT NULL CHECK (author_kind IN ('human', 'system', 'agent')),
102
+ author_ref TEXT,
103
+ author_display_name TEXT,
104
+ message_kind TEXT NOT NULL CHECK (
105
+ message_kind IN (
106
+ 'user_text',
107
+ 'agent_text',
108
+ 'system_notice',
109
+ 'clarification_request',
110
+ 'clarification_card'
111
+ )
112
+ ),
113
+ body TEXT NOT NULL,
114
+ refs_json TEXT CHECK (
115
+ refs_json IS NULL
116
+ OR (json_valid(refs_json) AND json_type(refs_json) = 'object')
117
+ ),
118
+ created_at TEXT NOT NULL,
119
+ CHECK (
120
+ (scope_kind = 'main_chat' AND clarification_round_id IS NULL)
121
+ OR (scope_kind = 'clarification_round' AND clarification_round_id IS NOT NULL)
122
+ ),
123
+ CHECK (message_kind != 'clarification_card' OR scope_kind = 'main_chat'),
124
+ CHECK (message_kind != 'clarification_request' OR scope_kind = 'clarification_round')
125
+ );
126
+
127
+ CREATE INDEX IF NOT EXISTS idx_messages_main_chat_order
128
+ ON messages (created_at, id)
129
+ WHERE scope_kind = 'main_chat';
130
+
131
+ CREATE INDEX IF NOT EXISTS idx_messages_clarification_round_order
132
+ ON messages (clarification_round_id, created_at, id)
133
+ WHERE scope_kind = 'clarification_round';
134
+
135
+ CREATE TABLE IF NOT EXISTS scratchpad (
136
+ id TEXT PRIMARY KEY CHECK (id = 'current'),
137
+ topic TEXT NOT NULL,
138
+ background_summary TEXT NOT NULL,
139
+ current_consensus_json TEXT NOT NULL CHECK (
140
+ json_valid(current_consensus_json) AND json_type(current_consensus_json) = 'array'
141
+ ),
142
+ open_questions_json TEXT NOT NULL CHECK (
143
+ json_valid(open_questions_json) AND json_type(open_questions_json) = 'array'
144
+ ),
145
+ task_changes_json TEXT NOT NULL CHECK (
146
+ json_valid(task_changes_json) AND json_type(task_changes_json) = 'array'
147
+ ),
148
+ source_message_refs_json TEXT NOT NULL CHECK (
149
+ json_valid(source_message_refs_json) AND json_type(source_message_refs_json) = 'array'
150
+ ),
151
+ updated_by_activity_ref TEXT,
152
+ updated_at TEXT NOT NULL
153
+ );
154
+
155
+ CREATE TABLE IF NOT EXISTS clarification_threads (
156
+ id TEXT PRIMARY KEY,
157
+ owner_kind TEXT NOT NULL CHECK (owner_kind IN ('task_compile', 'task')),
158
+ owner_workflow_ref TEXT,
159
+ owner_task_id TEXT REFERENCES tasks(id) DEFERRABLE INITIALLY DEFERRED,
160
+ status TEXT NOT NULL CHECK (status IN ('active', 'closed')),
161
+ current_round_id TEXT
162
+ REFERENCES clarification_rounds(id)
163
+ DEFERRABLE INITIALLY DEFERRED,
164
+ created_from_activity_ref TEXT,
165
+ closed_reason TEXT CHECK (
166
+ closed_reason IS NULL OR closed_reason IN ('resolved', 'contract_changed', 'cancelled')
167
+ ),
168
+ created_at TEXT NOT NULL,
169
+ updated_at TEXT NOT NULL,
170
+ CHECK (
171
+ (owner_kind = 'task_compile' AND owner_workflow_ref IS NOT NULL AND owner_task_id IS NULL)
172
+ OR (owner_kind = 'task' AND owner_task_id IS NOT NULL AND owner_workflow_ref IS NULL)
173
+ ),
174
+ CHECK (
175
+ (status = 'active' AND closed_reason IS NULL)
176
+ OR (status = 'closed' AND closed_reason IS NOT NULL)
177
+ )
178
+ );
179
+
180
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_clarification_threads_active_task_unique
181
+ ON clarification_threads (owner_task_id)
182
+ WHERE owner_kind = 'task' AND status = 'active';
183
+
184
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_clarification_threads_active_task_compile_unique
185
+ ON clarification_threads (owner_workflow_ref)
186
+ WHERE owner_kind = 'task_compile' AND status = 'active';
187
+
188
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_clarification_threads_one_active_global
189
+ ON clarification_threads (status)
190
+ WHERE status = 'active';
191
+
192
+ CREATE INDEX IF NOT EXISTS idx_clarification_threads_current_round
193
+ ON clarification_threads (current_round_id)
194
+ WHERE current_round_id IS NOT NULL;
195
+
196
+ CREATE TABLE IF NOT EXISTS clarification_rounds (
197
+ id TEXT PRIMARY KEY,
198
+ clarification_thread_id TEXT NOT NULL
199
+ REFERENCES clarification_threads(id)
200
+ DEFERRABLE INITIALLY DEFERRED,
201
+ round_index INTEGER NOT NULL CHECK (round_index >= 1),
202
+ status TEXT NOT NULL CHECK (status IN ('writable', 'sealed')),
203
+ request_payload_json TEXT NOT NULL CHECK (
204
+ json_valid(request_payload_json) AND json_type(request_payload_json) = 'object'
205
+ ),
206
+ card_message_id TEXT NOT NULL
207
+ REFERENCES messages(id)
208
+ DEFERRABLE INITIALLY DEFERRED,
209
+ opening_message_id TEXT NOT NULL
210
+ REFERENCES messages(id)
211
+ DEFERRABLE INITIALLY DEFERRED,
212
+ submitted_at TEXT,
213
+ submitted_message_refs_json TEXT CHECK (
214
+ submitted_message_refs_json IS NULL
215
+ OR (
216
+ json_valid(submitted_message_refs_json)
217
+ AND json_type(submitted_message_refs_json) = 'array'
218
+ )
219
+ ),
220
+ submitted_interaction_response_id TEXT
221
+ REFERENCES clarification_interaction_responses(id)
222
+ DEFERRABLE INITIALLY DEFERRED,
223
+ successor_status TEXT NOT NULL DEFAULT 'not_materialized'
224
+ CHECK (successor_status IN ('not_materialized', 'materialized')),
225
+ successor_ref_json TEXT CHECK (
226
+ successor_ref_json IS NULL
227
+ OR (json_valid(successor_ref_json) AND json_type(successor_ref_json) = 'object')
228
+ ),
229
+ created_at TEXT NOT NULL,
230
+ updated_at TEXT NOT NULL,
231
+ UNIQUE (clarification_thread_id, round_index),
232
+ CHECK (
233
+ (status = 'writable' AND submitted_at IS NULL AND submitted_message_refs_json IS NULL)
234
+ OR (status = 'sealed' AND submitted_at IS NOT NULL AND submitted_message_refs_json IS NOT NULL)
235
+ ),
236
+ CHECK (successor_status = 'not_materialized' OR status = 'sealed'),
237
+ CHECK (
238
+ (successor_status = 'not_materialized' AND successor_ref_json IS NULL)
239
+ OR (successor_status = 'materialized' AND successor_ref_json IS NOT NULL)
240
+ )
241
+ );
242
+
243
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_clarification_rounds_one_writable_per_thread
244
+ ON clarification_rounds (clarification_thread_id)
245
+ WHERE status = 'writable';
246
+
247
+ CREATE INDEX IF NOT EXISTS idx_clarification_rounds_order
248
+ ON clarification_rounds (clarification_thread_id, round_index);
249
+
250
+ CREATE INDEX IF NOT EXISTS idx_clarification_rounds_successor_replay
251
+ ON clarification_rounds (successor_status, submitted_at, id)
252
+ WHERE status = 'sealed' AND successor_status = 'not_materialized';
253
+
254
+ CREATE TABLE IF NOT EXISTS clarification_interaction_responses (
255
+ id TEXT PRIMARY KEY,
256
+ clarification_round_id TEXT NOT NULL REFERENCES clarification_rounds(id) ON DELETE CASCADE,
257
+ response_kind TEXT NOT NULL CHECK (response_kind IN ('choice')),
258
+ responder_client_session_id TEXT,
259
+ responder_account_ref TEXT,
260
+ responder_display_name TEXT,
261
+ response_json TEXT NOT NULL CHECK (
262
+ json_valid(response_json) AND json_type(response_json) = 'object'
263
+ ),
264
+ created_at TEXT NOT NULL,
265
+ updated_at TEXT,
266
+ UNIQUE (clarification_round_id)
267
+ );
268
+
269
+ CREATE INDEX IF NOT EXISTS idx_clarification_interaction_responses_round
270
+ ON clarification_interaction_responses (clarification_round_id);
271
+
272
+ CREATE TABLE IF NOT EXISTS run_results (
273
+ id TEXT PRIMARY KEY,
274
+ activity_ref TEXT NOT NULL UNIQUE,
275
+ task_id TEXT NOT NULL REFERENCES tasks(id) DEFERRABLE INITIALLY DEFERRED,
276
+ source_event_ref TEXT NOT NULL,
277
+ run_lineage_json TEXT NOT NULL CHECK (
278
+ json_valid(run_lineage_json) AND json_type(run_lineage_json) = 'object'
279
+ ),
280
+ result_kind TEXT NOT NULL CHECK (result_kind IN ('needs_human', 'finished', 'failed')),
281
+ result_json TEXT NOT NULL CHECK (
282
+ json_valid(result_json) AND json_type(result_json) = 'object'
283
+ ),
284
+ created_at TEXT NOT NULL
285
+ );
286
+
287
+ CREATE INDEX IF NOT EXISTS idx_run_results_task_order
288
+ ON run_results (task_id, created_at, id);
289
+
290
+ CREATE TABLE IF NOT EXISTS recovery_summaries (
291
+ id TEXT PRIMARY KEY,
292
+ affected_activities_json TEXT NOT NULL CHECK (
293
+ json_valid(affected_activities_json) AND json_type(affected_activities_json) = 'array'
294
+ ),
295
+ summary TEXT NOT NULL,
296
+ created_at TEXT NOT NULL
297
+ );
298
+
299
+ CREATE TABLE IF NOT EXISTS clarification_submit_replay_hints (
300
+ clarification_round_id TEXT PRIMARY KEY REFERENCES clarification_rounds(id) ON DELETE CASCADE,
301
+ clarification_thread_id TEXT NOT NULL REFERENCES clarification_threads(id),
302
+ accepted_command_id TEXT,
303
+ replay_attempt_count INTEGER NOT NULL DEFAULT 0 CHECK (replay_attempt_count >= 0),
304
+ last_replayed_at TEXT,
305
+ created_at TEXT NOT NULL,
306
+ updated_at TEXT NOT NULL
307
+ );
308
+
309
+ CREATE INDEX IF NOT EXISTS idx_clarification_submit_replay_hints_thread
310
+ ON clarification_submit_replay_hints (clarification_thread_id);
311
+
312
+ CREATE TRIGGER IF NOT EXISTS trg_messages_no_insert_into_sealed_round
313
+ BEFORE INSERT ON messages
314
+ WHEN NEW.scope_kind = 'clarification_round'
315
+ AND EXISTS (
316
+ SELECT 1
317
+ FROM clarification_rounds
318
+ WHERE id = NEW.clarification_round_id AND status = 'sealed'
319
+ )
320
+ BEGIN
321
+ SELECT RAISE(ABORT, 'cannot insert message into sealed clarification round');
322
+ END;
323
+
324
+ CREATE TRIGGER IF NOT EXISTS trg_messages_no_update_in_sealed_round
325
+ BEFORE UPDATE ON messages
326
+ WHEN OLD.scope_kind = 'clarification_round'
327
+ AND EXISTS (
328
+ SELECT 1
329
+ FROM clarification_rounds
330
+ WHERE id = OLD.clarification_round_id AND status = 'sealed'
331
+ )
332
+ BEGIN
333
+ SELECT RAISE(ABORT, 'cannot update message in sealed clarification round');
334
+ END;
335
+
336
+ CREATE TRIGGER IF NOT EXISTS trg_messages_no_delete_from_sealed_round
337
+ BEFORE DELETE ON messages
338
+ WHEN OLD.scope_kind = 'clarification_round'
339
+ AND EXISTS (
340
+ SELECT 1
341
+ FROM clarification_rounds
342
+ WHERE id = OLD.clarification_round_id AND status = 'sealed'
343
+ )
344
+ BEGIN
345
+ SELECT RAISE(ABORT, 'cannot delete message from sealed clarification round');
346
+ END;
347
+
348
+ CREATE TRIGGER IF NOT EXISTS trg_tasks_active_thread_matches_task_insert
349
+ BEFORE INSERT ON tasks
350
+ WHEN NEW.active_clarification_thread_id IS NOT NULL
351
+ AND NOT EXISTS (
352
+ SELECT 1
353
+ FROM clarification_threads
354
+ WHERE id = NEW.active_clarification_thread_id
355
+ AND owner_kind = 'task'
356
+ AND owner_task_id = NEW.id
357
+ AND status = 'active'
358
+ )
359
+ BEGIN
360
+ SELECT RAISE(ABORT, 'active clarification thread must be active and owned by the task');
361
+ END;
362
+
363
+ CREATE TRIGGER IF NOT EXISTS trg_tasks_active_thread_matches_task_update
364
+ BEFORE UPDATE OF active_clarification_thread_id ON tasks
365
+ WHEN NEW.active_clarification_thread_id IS NOT NULL
366
+ AND NOT EXISTS (
367
+ SELECT 1
368
+ FROM clarification_threads
369
+ WHERE id = NEW.active_clarification_thread_id
370
+ AND owner_kind = 'task'
371
+ AND owner_task_id = NEW.id
372
+ AND status = 'active'
373
+ )
374
+ BEGIN
375
+ SELECT RAISE(ABORT, 'active clarification thread must be active and owned by the task');
376
+ END;
377
+
378
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_threads_no_break_active_task_update
379
+ BEFORE UPDATE OF owner_kind, owner_task_id, status ON clarification_threads
380
+ WHEN EXISTS (
381
+ SELECT 1
382
+ FROM tasks
383
+ WHERE active_clarification_thread_id = OLD.id
384
+ )
385
+ AND NOT EXISTS (
386
+ SELECT 1
387
+ FROM tasks
388
+ WHERE active_clarification_thread_id = OLD.id
389
+ AND id = NEW.owner_task_id
390
+ AND status = 'pending'
391
+ AND NEW.owner_kind = 'task'
392
+ AND NEW.status = 'active'
393
+ )
394
+ BEGIN
395
+ SELECT RAISE(ABORT, 'cannot update clarification thread in a way that breaks an active pending task');
396
+ END;
397
+
398
+ CREATE TRIGGER IF NOT EXISTS trg_tasks_latest_run_result_matches_task_insert
399
+ BEFORE INSERT ON tasks
400
+ WHEN NEW.latest_run_result_id IS NOT NULL
401
+ AND NOT EXISTS (
402
+ SELECT 1
403
+ FROM run_results
404
+ WHERE id = NEW.latest_run_result_id AND task_id = NEW.id
405
+ )
406
+ BEGIN
407
+ SELECT RAISE(ABORT, 'latest run result must belong to the same task');
408
+ END;
409
+
410
+ CREATE TRIGGER IF NOT EXISTS trg_tasks_latest_run_result_matches_task_update
411
+ BEFORE UPDATE OF latest_run_result_id ON tasks
412
+ WHEN NEW.latest_run_result_id IS NOT NULL
413
+ AND NOT EXISTS (
414
+ SELECT 1
415
+ FROM run_results
416
+ WHERE id = NEW.latest_run_result_id AND task_id = NEW.id
417
+ )
418
+ BEGIN
419
+ SELECT RAISE(ABORT, 'latest run result must belong to the same task');
420
+ END;
421
+
422
+ CREATE TRIGGER IF NOT EXISTS trg_run_results_no_break_latest_task_update
423
+ BEFORE UPDATE OF task_id ON run_results
424
+ WHEN EXISTS (
425
+ SELECT 1
426
+ FROM tasks
427
+ WHERE latest_run_result_id = OLD.id
428
+ AND id != NEW.task_id
429
+ )
430
+ BEGIN
431
+ SELECT RAISE(ABORT, 'cannot move latest run result away from the task that references it');
432
+ END;
433
+
434
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_threads_current_round_matches_thread_insert
435
+ BEFORE INSERT ON clarification_threads
436
+ WHEN NEW.current_round_id IS NOT NULL
437
+ AND NOT EXISTS (
438
+ SELECT 1
439
+ FROM clarification_rounds
440
+ WHERE id = NEW.current_round_id AND clarification_thread_id = NEW.id
441
+ )
442
+ BEGIN
443
+ SELECT RAISE(ABORT, 'current round must belong to the same clarification thread');
444
+ END;
445
+
446
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_threads_current_round_matches_thread_update
447
+ BEFORE UPDATE OF current_round_id ON clarification_threads
448
+ WHEN NEW.current_round_id IS NOT NULL
449
+ AND NOT EXISTS (
450
+ SELECT 1
451
+ FROM clarification_rounds
452
+ WHERE id = NEW.current_round_id AND clarification_thread_id = NEW.id
453
+ )
454
+ BEGIN
455
+ SELECT RAISE(ABORT, 'current round must belong to the same clarification thread');
456
+ END;
457
+
458
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_rounds_no_break_current_thread_update
459
+ BEFORE UPDATE OF clarification_thread_id ON clarification_rounds
460
+ WHEN EXISTS (
461
+ SELECT 1
462
+ FROM clarification_threads
463
+ WHERE current_round_id = OLD.id
464
+ AND id != NEW.clarification_thread_id
465
+ )
466
+ BEGIN
467
+ SELECT RAISE(ABORT, 'cannot move a current clarification round to another thread');
468
+ END;
469
+
470
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_round_card_message_matches_insert
471
+ BEFORE INSERT ON clarification_rounds
472
+ WHEN NOT EXISTS (
473
+ SELECT 1
474
+ FROM messages
475
+ WHERE id = NEW.card_message_id
476
+ AND scope_kind = 'main_chat'
477
+ AND message_kind = 'clarification_card'
478
+ )
479
+ BEGIN
480
+ SELECT RAISE(ABORT, 'card message must be a main chat clarification card');
481
+ END;
482
+
483
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_round_card_message_matches_update
484
+ BEFORE UPDATE OF card_message_id ON clarification_rounds
485
+ WHEN NOT EXISTS (
486
+ SELECT 1
487
+ FROM messages
488
+ WHERE id = NEW.card_message_id
489
+ AND scope_kind = 'main_chat'
490
+ AND message_kind = 'clarification_card'
491
+ )
492
+ BEGIN
493
+ SELECT RAISE(ABORT, 'card message must be a main chat clarification card');
494
+ END;
495
+
496
+ CREATE TRIGGER IF NOT EXISTS trg_messages_no_break_card_message_update
497
+ BEFORE UPDATE OF scope_kind, message_kind ON messages
498
+ WHEN EXISTS (
499
+ SELECT 1
500
+ FROM clarification_rounds
501
+ WHERE card_message_id = OLD.id
502
+ )
503
+ AND NOT (
504
+ NEW.scope_kind = 'main_chat'
505
+ AND NEW.message_kind = 'clarification_card'
506
+ )
507
+ BEGIN
508
+ SELECT RAISE(ABORT, 'cannot update card message so it is no longer a main chat clarification card');
509
+ END;
510
+
511
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_round_opening_message_matches_insert
512
+ BEFORE INSERT ON clarification_rounds
513
+ WHEN NOT EXISTS (
514
+ SELECT 1
515
+ FROM messages
516
+ WHERE id = NEW.opening_message_id
517
+ AND scope_kind = 'clarification_round'
518
+ AND clarification_round_id = NEW.id
519
+ AND message_kind = 'clarification_request'
520
+ )
521
+ BEGIN
522
+ SELECT RAISE(ABORT, 'opening message must be a clarification request in the same round');
523
+ END;
524
+
525
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_round_opening_message_matches_update
526
+ BEFORE UPDATE OF opening_message_id ON clarification_rounds
527
+ WHEN NOT EXISTS (
528
+ SELECT 1
529
+ FROM messages
530
+ WHERE id = NEW.opening_message_id
531
+ AND scope_kind = 'clarification_round'
532
+ AND clarification_round_id = NEW.id
533
+ AND message_kind = 'clarification_request'
534
+ )
535
+ BEGIN
536
+ SELECT RAISE(ABORT, 'opening message must be a clarification request in the same round');
537
+ END;
538
+
539
+ CREATE TRIGGER IF NOT EXISTS trg_messages_no_break_opening_message_update
540
+ BEFORE UPDATE OF scope_kind, clarification_round_id, message_kind ON messages
541
+ WHEN EXISTS (
542
+ SELECT 1
543
+ FROM clarification_rounds
544
+ WHERE opening_message_id = OLD.id
545
+ AND (
546
+ NEW.scope_kind != 'clarification_round'
547
+ OR NEW.clarification_round_id != clarification_rounds.id
548
+ OR NEW.message_kind != 'clarification_request'
549
+ )
550
+ )
551
+ BEGIN
552
+ SELECT RAISE(ABORT, 'cannot update opening message so it is no longer a clarification request in the same round');
553
+ END;
554
+
555
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_round_no_mutate_sealed_fields
556
+ BEFORE UPDATE ON clarification_rounds
557
+ WHEN OLD.status = 'sealed'
558
+ AND (
559
+ NEW.clarification_thread_id IS NOT OLD.clarification_thread_id
560
+ OR NEW.round_index IS NOT OLD.round_index
561
+ OR NEW.status IS NOT OLD.status
562
+ OR NEW.request_payload_json IS NOT OLD.request_payload_json
563
+ OR NEW.card_message_id IS NOT OLD.card_message_id
564
+ OR NEW.opening_message_id IS NOT OLD.opening_message_id
565
+ OR NEW.submitted_at IS NOT OLD.submitted_at
566
+ OR NEW.submitted_message_refs_json IS NOT OLD.submitted_message_refs_json
567
+ OR NEW.submitted_interaction_response_id IS NOT OLD.submitted_interaction_response_id
568
+ OR NEW.created_at IS NOT OLD.created_at
569
+ )
570
+ BEGIN
571
+ SELECT RAISE(ABORT, 'cannot mutate sealed clarification round fields');
572
+ END;
573
+
574
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_round_successor_materialized_once
575
+ BEFORE UPDATE OF successor_status, successor_ref_json ON clarification_rounds
576
+ WHEN OLD.successor_status = 'materialized'
577
+ AND (
578
+ NEW.successor_status IS NOT OLD.successor_status
579
+ OR NEW.successor_ref_json IS NOT OLD.successor_ref_json
580
+ )
581
+ BEGIN
582
+ SELECT RAISE(ABORT, 'clarification successor is already materialized');
583
+ END;
584
+
585
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_response_requires_writable_round_insert
586
+ BEFORE INSERT ON clarification_interaction_responses
587
+ WHEN COALESCE(
588
+ (SELECT status FROM clarification_rounds WHERE id = NEW.clarification_round_id),
589
+ ''
590
+ ) != 'writable'
591
+ BEGIN
592
+ SELECT RAISE(ABORT, 'cannot record interaction response for non-writable round');
593
+ END;
594
+
595
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_response_round_id_immutable
596
+ BEFORE UPDATE OF clarification_round_id ON clarification_interaction_responses
597
+ WHEN NEW.clarification_round_id IS NOT OLD.clarification_round_id
598
+ BEGIN
599
+ SELECT RAISE(ABORT, 'cannot move interaction response to another round');
600
+ END;
601
+
602
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_response_requires_writable_round_update
603
+ BEFORE UPDATE ON clarification_interaction_responses
604
+ WHEN COALESCE(
605
+ (SELECT status FROM clarification_rounds WHERE id = NEW.clarification_round_id),
606
+ ''
607
+ ) != 'writable'
608
+ BEGIN
609
+ SELECT RAISE(ABORT, 'cannot update interaction response for non-writable round');
610
+ END;
611
+
612
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_response_requires_writable_round_delete
613
+ BEFORE DELETE ON clarification_interaction_responses
614
+ WHEN COALESCE(
615
+ (SELECT status FROM clarification_rounds WHERE id = OLD.clarification_round_id),
616
+ ''
617
+ ) != 'writable'
618
+ BEGIN
619
+ SELECT RAISE(ABORT, 'cannot delete interaction response for non-writable round');
620
+ END;
621
+
622
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_round_submitted_response_matches_round_insert
623
+ BEFORE INSERT ON clarification_rounds
624
+ WHEN NEW.submitted_interaction_response_id IS NOT NULL
625
+ AND NOT EXISTS (
626
+ SELECT 1
627
+ FROM clarification_interaction_responses
628
+ WHERE id = NEW.submitted_interaction_response_id
629
+ AND clarification_round_id = NEW.id
630
+ )
631
+ BEGIN
632
+ SELECT RAISE(ABORT, 'submitted interaction response must belong to the same round');
633
+ END;
634
+
635
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_submit_replay_hint_matches_round_insert
636
+ BEFORE INSERT ON clarification_submit_replay_hints
637
+ WHEN NOT EXISTS (
638
+ SELECT 1
639
+ FROM clarification_rounds
640
+ WHERE id = NEW.clarification_round_id
641
+ AND clarification_thread_id = NEW.clarification_thread_id
642
+ AND status = 'sealed'
643
+ AND successor_status = 'not_materialized'
644
+ )
645
+ BEGIN
646
+ SELECT RAISE(ABORT, 'replay hint must point to a sealed round without materialized successor');
647
+ END;
648
+
649
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_submit_replay_hint_matches_round_update
650
+ BEFORE UPDATE OF clarification_round_id, clarification_thread_id ON clarification_submit_replay_hints
651
+ WHEN NOT EXISTS (
652
+ SELECT 1
653
+ FROM clarification_rounds
654
+ WHERE id = NEW.clarification_round_id
655
+ AND clarification_thread_id = NEW.clarification_thread_id
656
+ AND status = 'sealed'
657
+ AND successor_status = 'not_materialized'
658
+ )
659
+ BEGIN
660
+ SELECT RAISE(ABORT, 'replay hint must point to a sealed round without materialized successor');
661
+ END;
662
+
663
+ CREATE TRIGGER IF NOT EXISTS trg_clarification_round_submitted_response_matches_round_update
664
+ BEFORE UPDATE OF submitted_interaction_response_id ON clarification_rounds
665
+ WHEN NEW.submitted_interaction_response_id IS NOT NULL
666
+ AND NOT EXISTS (
667
+ SELECT 1
668
+ FROM clarification_interaction_responses
669
+ WHERE id = NEW.submitted_interaction_response_id
670
+ AND clarification_round_id = NEW.id
671
+ )
672
+ BEGIN
673
+ SELECT RAISE(ABORT, 'submitted interaction response must belong to the same round');
674
+ END;
@@ -0,0 +1,14 @@
1
+ DROP TRIGGER IF EXISTS trg_messages_no_insert_into_sealed_round;
2
+
3
+ CREATE TRIGGER IF NOT EXISTS trg_messages_no_insert_into_sealed_round
4
+ BEFORE INSERT ON messages
5
+ WHEN NEW.scope_kind = 'clarification_round'
6
+ AND NEW.message_kind != 'agent_text'
7
+ AND EXISTS (
8
+ SELECT 1
9
+ FROM clarification_rounds
10
+ WHERE id = NEW.clarification_round_id AND status = 'sealed'
11
+ )
12
+ BEGIN
13
+ SELECT RAISE(ABORT, 'cannot insert non-agent message into sealed clarification round');
14
+ END;
@@ -0,0 +1 @@
1
+ ALTER TABLE scratchpad DROP COLUMN source_message_refs_json;