@cleocode/core 2026.6.12 → 2026.6.13

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 (385) hide show
  1. package/dist/conduit/local-transport.d.ts +12 -0
  2. package/dist/conduit/local-transport.d.ts.map +1 -1
  3. package/dist/conduit/local-transport.js +53 -23
  4. package/dist/conduit/local-transport.js.map +1 -1
  5. package/dist/crypto/credentials.d.ts +37 -0
  6. package/dist/crypto/credentials.d.ts.map +1 -1
  7. package/dist/crypto/credentials.js +110 -0
  8. package/dist/crypto/credentials.js.map +1 -1
  9. package/dist/dispatch/contracts/derive-output-contract.d.ts +86 -0
  10. package/dist/dispatch/contracts/derive-output-contract.d.ts.map +1 -0
  11. package/dist/dispatch/contracts/derive-output-contract.js +347 -0
  12. package/dist/dispatch/contracts/derive-output-contract.js.map +1 -0
  13. package/dist/dispatch/contracts/ensures-schema.d.ts +77 -0
  14. package/dist/dispatch/contracts/ensures-schema.d.ts.map +1 -0
  15. package/dist/dispatch/contracts/ensures-schema.js +91 -0
  16. package/dist/dispatch/contracts/ensures-schema.js.map +1 -0
  17. package/dist/dispatch/contracts/output-contracts.d.ts +27 -5
  18. package/dist/dispatch/contracts/output-contracts.d.ts.map +1 -1
  19. package/dist/dispatch/contracts/output-contracts.js +29 -6
  20. package/dist/dispatch/contracts/output-contracts.js.map +1 -1
  21. package/dist/docs/export-document.js +2294 -1250
  22. package/dist/docs/export-document.js.map +3 -3
  23. package/dist/go/driver.d.ts +132 -7
  24. package/dist/go/driver.d.ts.map +1 -1
  25. package/dist/go/driver.js +135 -10
  26. package/dist/go/driver.js.map +1 -1
  27. package/dist/go/index.d.ts +1 -1
  28. package/dist/go/index.d.ts.map +1 -1
  29. package/dist/go/index.js +1 -1
  30. package/dist/go/index.js.map +1 -1
  31. package/dist/index.d.ts +1 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +5 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/internal.d.ts +13 -10
  36. package/dist/internal.d.ts.map +1 -1
  37. package/dist/internal.js +11 -11
  38. package/dist/internal.js.map +1 -1
  39. package/dist/lifecycle/engine-ops.d.ts.map +1 -1
  40. package/dist/lifecycle/engine-ops.js +7 -4
  41. package/dist/lifecycle/engine-ops.js.map +1 -1
  42. package/dist/lifecycle/ivtr-loop.d.ts +108 -183
  43. package/dist/lifecycle/ivtr-loop.d.ts.map +1 -1
  44. package/dist/lifecycle/ivtr-loop.js +207 -522
  45. package/dist/lifecycle/ivtr-loop.js.map +1 -1
  46. package/dist/llm/auxiliary-fallback.js +1 -1
  47. package/dist/llm/auxiliary-fallback.js.map +1 -1
  48. package/dist/llm/cli-ops.d.ts +14 -1
  49. package/dist/llm/cli-ops.d.ts.map +1 -1
  50. package/dist/llm/cli-ops.js +41 -12
  51. package/dist/llm/cli-ops.js.map +1 -1
  52. package/dist/llm/concrete-session.d.ts.map +1 -1
  53. package/dist/llm/concrete-session.js +4 -0
  54. package/dist/llm/concrete-session.js.map +1 -1
  55. package/dist/llm/credentials.d.ts +35 -0
  56. package/dist/llm/credentials.d.ts.map +1 -1
  57. package/dist/llm/credentials.js +49 -0
  58. package/dist/llm/credentials.js.map +1 -1
  59. package/dist/llm/index.d.ts +4 -0
  60. package/dist/llm/index.d.ts.map +1 -1
  61. package/dist/llm/index.js +4 -0
  62. package/dist/llm/index.js.map +1 -1
  63. package/dist/llm/pi/gondolin-loader.d.ts +241 -0
  64. package/dist/llm/pi/gondolin-loader.d.ts.map +1 -0
  65. package/dist/llm/pi/gondolin-loader.js +195 -0
  66. package/dist/llm/pi/gondolin-loader.js.map +1 -0
  67. package/dist/llm/pi/index.d.ts +28 -0
  68. package/dist/llm/pi/index.d.ts.map +1 -0
  69. package/dist/llm/pi/index.js +27 -0
  70. package/dist/llm/pi/index.js.map +1 -0
  71. package/dist/llm/pi/pi-agent-adapter.d.ts +135 -0
  72. package/dist/llm/pi/pi-agent-adapter.d.ts.map +1 -0
  73. package/dist/llm/pi/pi-agent-adapter.js +329 -0
  74. package/dist/llm/pi/pi-agent-adapter.js.map +1 -0
  75. package/dist/llm/pi/pi-errors.d.ts +161 -0
  76. package/dist/llm/pi/pi-errors.d.ts.map +1 -0
  77. package/dist/llm/pi/pi-errors.js +296 -0
  78. package/dist/llm/pi/pi-errors.js.map +1 -0
  79. package/dist/llm/pi/pi-execution-env.d.ts +286 -0
  80. package/dist/llm/pi/pi-execution-env.d.ts.map +1 -0
  81. package/dist/llm/pi/pi-execution-env.js +406 -0
  82. package/dist/llm/pi/pi-execution-env.js.map +1 -0
  83. package/dist/llm/pi/pi-gondolin-env.d.ts +227 -0
  84. package/dist/llm/pi/pi-gondolin-env.d.ts.map +1 -0
  85. package/dist/llm/pi/pi-gondolin-env.js +541 -0
  86. package/dist/llm/pi/pi-gondolin-env.js.map +1 -0
  87. package/dist/llm/pi/pi-session-storage.d.ts +154 -0
  88. package/dist/llm/pi/pi-session-storage.d.ts.map +1 -0
  89. package/dist/llm/pi/pi-session-storage.js +314 -0
  90. package/dist/llm/pi/pi-session-storage.js.map +1 -0
  91. package/dist/llm/pi/pi-stream-fn.d.ts +124 -0
  92. package/dist/llm/pi/pi-stream-fn.d.ts.map +1 -0
  93. package/dist/llm/pi/pi-stream-fn.js +504 -0
  94. package/dist/llm/pi/pi-stream-fn.js.map +1 -0
  95. package/dist/llm/pi/pi-tool-bridge.d.ts +99 -0
  96. package/dist/llm/pi/pi-tool-bridge.d.ts.map +1 -0
  97. package/dist/llm/pi/pi-tool-bridge.js +117 -0
  98. package/dist/llm/pi/pi-tool-bridge.js.map +1 -0
  99. package/dist/llm/pi/pi-types.d.ts +56 -0
  100. package/dist/llm/pi/pi-types.d.ts.map +1 -0
  101. package/dist/llm/pi/pi-types.js +16 -0
  102. package/dist/llm/pi/pi-types.js.map +1 -0
  103. package/dist/llm/pi/resolve-execution-env.d.ts +194 -0
  104. package/dist/llm/pi/resolve-execution-env.d.ts.map +1 -0
  105. package/dist/llm/pi/resolve-execution-env.js +132 -0
  106. package/dist/llm/pi/resolve-execution-env.js.map +1 -0
  107. package/dist/llm/plugin-facade.js +2253 -1151
  108. package/dist/llm/plugin-facade.js.map +3 -3
  109. package/dist/llm/role-executor.d.ts.map +1 -1
  110. package/dist/llm/role-executor.js +8 -5
  111. package/dist/llm/role-executor.js.map +1 -1
  112. package/dist/llm/role-resolver.d.ts +46 -14
  113. package/dist/llm/role-resolver.d.ts.map +1 -1
  114. package/dist/llm/role-resolver.js +178 -20
  115. package/dist/llm/role-resolver.js.map +1 -1
  116. package/dist/llm/sealed-credential.d.ts +125 -0
  117. package/dist/llm/sealed-credential.d.ts.map +1 -0
  118. package/dist/llm/sealed-credential.js +133 -0
  119. package/dist/llm/sealed-credential.js.map +1 -0
  120. package/dist/llm/session-factory.d.ts.map +1 -1
  121. package/dist/llm/session-factory.js +6 -2
  122. package/dist/llm/session-factory.js.map +1 -1
  123. package/dist/llm/system-key.d.ts +67 -0
  124. package/dist/llm/system-key.d.ts.map +1 -0
  125. package/dist/llm/system-key.js +87 -0
  126. package/dist/llm/system-key.js.map +1 -0
  127. package/dist/llm/system-of-use-registry.d.ts +119 -0
  128. package/dist/llm/system-of-use-registry.d.ts.map +1 -0
  129. package/dist/llm/system-of-use-registry.js +200 -0
  130. package/dist/llm/system-of-use-registry.js.map +1 -0
  131. package/dist/llm/system-resolver.d.ts +32 -10
  132. package/dist/llm/system-resolver.d.ts.map +1 -1
  133. package/dist/llm/system-resolver.js +70 -18
  134. package/dist/llm/system-resolver.js.map +1 -1
  135. package/dist/memory/brain-writer-thread.d.ts.map +1 -1
  136. package/dist/memory/brain-writer-thread.js +116 -11
  137. package/dist/memory/brain-writer-thread.js.map +1 -1
  138. package/dist/memory/claude-mem-migration.d.ts.map +1 -1
  139. package/dist/memory/claude-mem-migration.js +21 -0
  140. package/dist/memory/claude-mem-migration.js.map +1 -1
  141. package/dist/memory/graph-memory-bridge.d.ts.map +1 -1
  142. package/dist/memory/graph-memory-bridge.js +32 -25
  143. package/dist/memory/graph-memory-bridge.js.map +1 -1
  144. package/dist/memory/llm-backend-resolver.js +23 -5
  145. package/dist/memory/llm-backend-resolver.js.map +1 -1
  146. package/dist/nexus/migrations/M-split-graph.d.ts.map +1 -1
  147. package/dist/nexus/migrations/M-split-graph.js +60 -53
  148. package/dist/nexus/migrations/M-split-graph.js.map +1 -1
  149. package/dist/orchestrate/pivot.d.ts.map +1 -1
  150. package/dist/orchestrate/pivot.js +20 -2
  151. package/dist/orchestrate/pivot.js.map +1 -1
  152. package/dist/release/engine-ops.js +2 -2
  153. package/dist/release/engine-ops.js.map +1 -1
  154. package/dist/routing/capability-matrix.d.ts.map +1 -1
  155. package/dist/routing/capability-matrix.js +0 -57
  156. package/dist/routing/capability-matrix.js.map +1 -1
  157. package/dist/selfimprove/budget.d.ts +206 -0
  158. package/dist/selfimprove/budget.d.ts.map +1 -0
  159. package/dist/selfimprove/budget.js +203 -0
  160. package/dist/selfimprove/budget.js.map +1 -0
  161. package/dist/selfimprove/dhq-adapter.d.ts +105 -0
  162. package/dist/selfimprove/dhq-adapter.d.ts.map +1 -0
  163. package/dist/selfimprove/dhq-adapter.js +95 -0
  164. package/dist/selfimprove/dhq-adapter.js.map +1 -0
  165. package/dist/selfimprove/draft-pr.d.ts +129 -0
  166. package/dist/selfimprove/draft-pr.d.ts.map +1 -0
  167. package/dist/selfimprove/draft-pr.js +158 -0
  168. package/dist/selfimprove/draft-pr.js.map +1 -0
  169. package/dist/selfimprove/envelope-diff.d.ts +162 -0
  170. package/dist/selfimprove/envelope-diff.d.ts.map +1 -0
  171. package/dist/selfimprove/envelope-diff.js +321 -0
  172. package/dist/selfimprove/envelope-diff.js.map +1 -0
  173. package/dist/selfimprove/replay.d.ts +121 -0
  174. package/dist/selfimprove/replay.d.ts.map +1 -0
  175. package/dist/selfimprove/replay.js +109 -0
  176. package/dist/selfimprove/replay.js.map +1 -0
  177. package/dist/selfimprove/run-loop.d.ts +148 -0
  178. package/dist/selfimprove/run-loop.d.ts.map +1 -0
  179. package/dist/selfimprove/run-loop.js +240 -0
  180. package/dist/selfimprove/run-loop.js.map +1 -0
  181. package/dist/selfimprove/scenario.d.ts +145 -0
  182. package/dist/selfimprove/scenario.d.ts.map +1 -0
  183. package/dist/selfimprove/scenario.js +243 -0
  184. package/dist/selfimprove/scenario.js.map +1 -0
  185. package/dist/sentient/daemon-entry.js +5 -0
  186. package/dist/sentient/daemon-entry.js.map +1 -1
  187. package/dist/sentient/daemon.d.ts.map +1 -1
  188. package/dist/sentient/daemon.js +19 -0
  189. package/dist/sentient/daemon.js.map +1 -1
  190. package/dist/sentient/hygiene-scan.d.ts.map +1 -1
  191. package/dist/sentient/hygiene-scan.js +14 -6
  192. package/dist/sentient/hygiene-scan.js.map +1 -1
  193. package/dist/sessions/briefing.d.ts.map +1 -1
  194. package/dist/sessions/briefing.js +13 -9
  195. package/dist/sessions/briefing.js.map +1 -1
  196. package/dist/sessions/connection-session-handle.d.ts +161 -0
  197. package/dist/sessions/connection-session-handle.d.ts.map +1 -0
  198. package/dist/sessions/connection-session-handle.js +168 -0
  199. package/dist/sessions/connection-session-handle.js.map +1 -0
  200. package/dist/sessions/handoff.d.ts.map +1 -1
  201. package/dist/sessions/handoff.js +9 -0
  202. package/dist/sessions/handoff.js.map +1 -1
  203. package/dist/sessions/index.d.ts +4 -1
  204. package/dist/sessions/index.d.ts.map +1 -1
  205. package/dist/sessions/index.js +31 -1
  206. package/dist/sessions/index.js.map +1 -1
  207. package/dist/sessions/session-id.d.ts +34 -0
  208. package/dist/sessions/session-id.d.ts.map +1 -1
  209. package/dist/sessions/session-id.js +37 -0
  210. package/dist/sessions/session-id.js.map +1 -1
  211. package/dist/sessions/session-manifest-mirror.d.ts +115 -0
  212. package/dist/sessions/session-manifest-mirror.d.ts.map +1 -0
  213. package/dist/sessions/session-manifest-mirror.js +250 -0
  214. package/dist/sessions/session-manifest-mirror.js.map +1 -0
  215. package/dist/sessions/session-switch.d.ts.map +1 -1
  216. package/dist/sessions/session-switch.js +5 -2
  217. package/dist/sessions/session-switch.js.map +1 -1
  218. package/dist/store/converters.d.ts.map +1 -1
  219. package/dist/store/converters.js +2 -0
  220. package/dist/store/converters.js.map +1 -1
  221. package/dist/store/db-helpers.d.ts.map +1 -1
  222. package/dist/store/db-helpers.js +2 -0
  223. package/dist/store/db-helpers.js.map +1 -1
  224. package/dist/store/dual-scope-db.d.ts.map +1 -1
  225. package/dist/store/dual-scope-db.js +87 -47
  226. package/dist/store/dual-scope-db.js.map +1 -1
  227. package/dist/store/pi-session-store.d.ts +151 -0
  228. package/dist/store/pi-session-store.d.ts.map +1 -0
  229. package/dist/store/pi-session-store.js +166 -0
  230. package/dist/store/pi-session-store.js.map +1 -0
  231. package/dist/store/safety-data-accessor.d.ts +1 -0
  232. package/dist/store/safety-data-accessor.d.ts.map +1 -1
  233. package/dist/store/safety-data-accessor.js +5 -0
  234. package/dist/store/safety-data-accessor.js.map +1 -1
  235. package/dist/store/schema/cleo-global/accounts.d.ts +357 -0
  236. package/dist/store/schema/cleo-global/accounts.d.ts.map +1 -0
  237. package/dist/store/schema/cleo-global/accounts.js +136 -0
  238. package/dist/store/schema/cleo-global/accounts.js.map +1 -0
  239. package/dist/store/schema/cleo-global/index.d.ts +2 -0
  240. package/dist/store/schema/cleo-global/index.d.ts.map +1 -1
  241. package/dist/store/schema/cleo-global/index.js +2 -0
  242. package/dist/store/schema/cleo-global/index.js.map +1 -1
  243. package/dist/store/schema/cleo-global/session-manifest.d.ts +217 -0
  244. package/dist/store/schema/cleo-global/session-manifest.d.ts.map +1 -0
  245. package/dist/store/schema/cleo-global/session-manifest.js +99 -0
  246. package/dist/store/schema/cleo-global/session-manifest.js.map +1 -0
  247. package/dist/store/schema/cleo-project/tasks-core.d.ts +16 -0
  248. package/dist/store/schema/cleo-project/tasks-core.d.ts.map +1 -1
  249. package/dist/store/schema/cleo-project/tasks-core.js +14 -0
  250. package/dist/store/schema/cleo-project/tasks-core.js.map +1 -1
  251. package/dist/store/schema/tasks.d.ts +16 -0
  252. package/dist/store/schema/tasks.d.ts.map +1 -1
  253. package/dist/store/schema/tasks.js +10 -0
  254. package/dist/store/schema/tasks.js.map +1 -1
  255. package/dist/store/selfimprove-dhq-schema.d.ts +284 -0
  256. package/dist/store/selfimprove-dhq-schema.d.ts.map +1 -0
  257. package/dist/store/selfimprove-dhq-schema.js +128 -0
  258. package/dist/store/selfimprove-dhq-schema.js.map +1 -0
  259. package/dist/store/selfimprove-dhq-store.d.ts +175 -0
  260. package/dist/store/selfimprove-dhq-store.d.ts.map +1 -0
  261. package/dist/store/selfimprove-dhq-store.js +182 -0
  262. package/dist/store/selfimprove-dhq-store.js.map +1 -0
  263. package/dist/store/session-store.d.ts +52 -13
  264. package/dist/store/session-store.d.ts.map +1 -1
  265. package/dist/store/session-store.js +71 -13
  266. package/dist/store/session-store.js.map +1 -1
  267. package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
  268. package/dist/store/sqlite-data-accessor.js +7 -0
  269. package/dist/store/sqlite-data-accessor.js.map +1 -1
  270. package/dist/store/umbrella-data-accessor.d.ts +1 -0
  271. package/dist/store/umbrella-data-accessor.d.ts.map +1 -1
  272. package/dist/store/umbrella-data-accessor.js +5 -0
  273. package/dist/store/umbrella-data-accessor.js.map +1 -1
  274. package/dist/store/validation-schemas.d.ts +32 -0
  275. package/dist/store/validation-schemas.d.ts.map +1 -1
  276. package/dist/store/writer-lease-schema.d.ts +392 -0
  277. package/dist/store/writer-lease-schema.d.ts.map +1 -0
  278. package/dist/store/writer-lease-schema.js +142 -0
  279. package/dist/store/writer-lease-schema.js.map +1 -0
  280. package/dist/store/writer-lease.d.ts +368 -0
  281. package/dist/store/writer-lease.d.ts.map +1 -0
  282. package/dist/store/writer-lease.js +1002 -0
  283. package/dist/store/writer-lease.js.map +1 -0
  284. package/dist/tasks/backfill-child-projections.d.ts.map +1 -1
  285. package/dist/tasks/backfill-child-projections.js +14 -9
  286. package/dist/tasks/backfill-child-projections.js.map +1 -1
  287. package/dist/tasks/complete.d.ts.map +1 -1
  288. package/dist/tasks/complete.js +7 -10
  289. package/dist/tasks/complete.js.map +1 -1
  290. package/dist/tasks/duplicate-detector.d.ts.map +1 -1
  291. package/dist/tasks/duplicate-detector.js +14 -7
  292. package/dist/tasks/duplicate-detector.js.map +1 -1
  293. package/dist/telemetry/index.d.ts.map +1 -1
  294. package/dist/telemetry/index.js +10 -4
  295. package/dist/telemetry/index.js.map +1 -1
  296. package/dist/tools/agent-registry.d.ts +250 -0
  297. package/dist/tools/agent-registry.d.ts.map +1 -0
  298. package/dist/tools/agent-registry.js +292 -0
  299. package/dist/tools/agent-registry.js.map +1 -0
  300. package/dist/tools/agent-tool-families.d.ts +107 -0
  301. package/dist/tools/agent-tool-families.d.ts.map +1 -0
  302. package/dist/tools/agent-tool-families.js +527 -0
  303. package/dist/tools/agent-tool-families.js.map +1 -0
  304. package/dist/tools/browser-driver.d.ts +183 -0
  305. package/dist/tools/browser-driver.d.ts.map +1 -0
  306. package/dist/tools/browser-driver.js +242 -0
  307. package/dist/tools/browser-driver.js.map +1 -0
  308. package/dist/tools/builtin-agent-tools.d.ts +36 -0
  309. package/dist/tools/builtin-agent-tools.d.ts.map +1 -0
  310. package/dist/tools/builtin-agent-tools.js +150 -0
  311. package/dist/tools/builtin-agent-tools.js.map +1 -0
  312. package/dist/tools/dispatch.d.ts +370 -0
  313. package/dist/tools/dispatch.d.ts.map +1 -0
  314. package/dist/tools/dispatch.js +505 -0
  315. package/dist/tools/dispatch.js.map +1 -0
  316. package/dist/tools/env-scrub.d.ts +93 -0
  317. package/dist/tools/env-scrub.d.ts.map +1 -0
  318. package/dist/tools/env-scrub.js +176 -0
  319. package/dist/tools/env-scrub.js.map +1 -0
  320. package/dist/tools/fs.d.ts +30 -0
  321. package/dist/tools/fs.d.ts.map +1 -1
  322. package/dist/tools/fs.js +55 -2
  323. package/dist/tools/fs.js.map +1 -1
  324. package/dist/tools/guard.d.ts +15 -0
  325. package/dist/tools/guard.d.ts.map +1 -1
  326. package/dist/tools/guard.js +49 -12
  327. package/dist/tools/guard.js.map +1 -1
  328. package/dist/tools/index.d.ts +10 -0
  329. package/dist/tools/index.d.ts.map +1 -1
  330. package/dist/tools/index.js +37 -0
  331. package/dist/tools/index.js.map +1 -1
  332. package/dist/tools/pty.d.ts +45 -0
  333. package/dist/tools/pty.d.ts.map +1 -0
  334. package/dist/tools/pty.js +166 -0
  335. package/dist/tools/pty.js.map +1 -0
  336. package/dist/tools/schema-gen.d.ts +57 -0
  337. package/dist/tools/schema-gen.d.ts.map +1 -0
  338. package/dist/tools/schema-gen.js +52 -0
  339. package/dist/tools/schema-gen.js.map +1 -0
  340. package/dist/tools/shell.d.ts +12 -0
  341. package/dist/tools/shell.d.ts.map +1 -1
  342. package/dist/tools/shell.js +14 -1
  343. package/dist/tools/shell.js.map +1 -1
  344. package/dist/tools/web-agent-tools.d.ts +72 -0
  345. package/dist/tools/web-agent-tools.d.ts.map +1 -0
  346. package/dist/tools/web-agent-tools.js +393 -0
  347. package/dist/tools/web-agent-tools.js.map +1 -0
  348. package/dist/tools/web-search-backends.d.ts +156 -0
  349. package/dist/tools/web-search-backends.d.ts.map +1 -0
  350. package/dist/tools/web-search-backends.js +290 -0
  351. package/dist/tools/web-search-backends.js.map +1 -0
  352. package/dist/validation/ops.d.ts +1 -15
  353. package/dist/validation/ops.d.ts.map +1 -1
  354. package/dist/validation/ops.js +0 -20
  355. package/dist/validation/ops.js.map +1 -1
  356. package/migrations/drizzle-cleo-global/20260607000000_t11891-writer-leases/migration.sql +55 -0
  357. package/migrations/drizzle-cleo-global/20260607010000_t11639-session-manifest/migration.sql +43 -0
  358. package/migrations/drizzle-cleo-global/20260608000000_t11899-pi-session-tree/migration.sql +52 -0
  359. package/migrations/drizzle-cleo-global/20260608010000_t11709-accounts-credential-pool/migration.sql +72 -0
  360. package/migrations/drizzle-cleo-global/20260608020000_t11889-selfimprove-dhq/migration.sql +64 -0
  361. package/migrations/drizzle-cleo-project/20260607000000_t11891-writer-leases/migration.sql +55 -0
  362. package/migrations/drizzle-cleo-project/20260607010000_t11639-session-parent/migration.sql +22 -0
  363. package/migrations/drizzle-cleo-project/20260608000000_t11899-pi-session-tree/migration.sql +52 -0
  364. package/migrations/drizzle-cleo-project/20260608020000_t11889-selfimprove-dhq/migration.sql +64 -0
  365. package/package.json +15 -13
  366. package/dist/lifecycle/chain-composition.d.ts +0 -30
  367. package/dist/lifecycle/chain-composition.d.ts.map +0 -1
  368. package/dist/lifecycle/chain-composition.js +0 -152
  369. package/dist/lifecycle/chain-composition.js.map +0 -1
  370. package/dist/lifecycle/chain-store.d.ts +0 -70
  371. package/dist/lifecycle/chain-store.d.ts.map +0 -1
  372. package/dist/lifecycle/chain-store.js +0 -246
  373. package/dist/lifecycle/chain-store.js.map +0 -1
  374. package/dist/lifecycle/default-chain.d.ts +0 -39
  375. package/dist/lifecycle/default-chain.d.ts.map +0 -1
  376. package/dist/lifecycle/default-chain.js +0 -176
  377. package/dist/lifecycle/default-chain.js.map +0 -1
  378. package/dist/lifecycle/tessera-engine.d.ts +0 -48
  379. package/dist/lifecycle/tessera-engine.d.ts.map +0 -1
  380. package/dist/lifecycle/tessera-engine.js +0 -249
  381. package/dist/lifecycle/tessera-engine.js.map +0 -1
  382. package/dist/validation/chain-validation.d.ts +0 -43
  383. package/dist/validation/chain-validation.d.ts.map +0 -1
  384. package/dist/validation/chain-validation.js +0 -146
  385. package/dist/validation/chain-validation.js.map +0 -1
@@ -0,0 +1,392 @@
1
+ /**
2
+ * Drizzle ORM schema for the **DbWriterLease** arbitration tables (T11627 ST-2).
3
+ *
4
+ * Two operational tables co-located inside EACH scope's consolidated `cleo.db`
5
+ * (project + global), migrated via the existing `drizzle-cleo-project` /
6
+ * `drizzle-cleo-global` migration sets so lease state lives next to the data it
7
+ * guards and is auto-split by the dual-cleo.db boundary
8
+ * ({@link resolveDualScopeDbPath}). They are NOT part of the exodus target shape
9
+ * under `schema/cleo-project/` — they are pure runtime infrastructure that the
10
+ * lease engine ({@link withWriterLease}) reads and writes via `BEGIN IMMEDIATE`.
11
+ *
12
+ * ## `_writer_leases` — exactly ONE active row per (scope, lane)
13
+ *
14
+ * AC1 (one writer per scope/lane) is enforced by a **partial UNIQUE index**
15
+ * `WHERE active = 1`. drizzle-orm does **not** surface partial-`WHERE` indexes in
16
+ * its typed schema API (cf. `conduit-schema.ts:339` `project_agent_refs.enabled`,
17
+ * `agent-registry-schema.ts`), so the index is emitted as **raw SQL in the lease
18
+ * baseline migration** — this module declares only the full-column table. This is
19
+ * the established repo pattern, not a deviation. The runtime bootstrap asserts the
20
+ * index exists via {@link assertWriterLeaseActiveIndexPresent} so a missing index
21
+ * (e.g. a migration that never ran) fails loudly instead of silently allowing two
22
+ * active rows.
23
+ *
24
+ * ## `_writer_queue` — FIFO + priority waiters
25
+ *
26
+ * Ordered `priority ASC, ticket ASC` (priority-then-FIFO). The full (non-partial)
27
+ * ordering index IS expressible in drizzle and is declared inline here; only the
28
+ * partial-unique active-row index requires raw SQL.
29
+ *
30
+ * @module
31
+ * @task T11627
32
+ * @epic T11625
33
+ * @see ./writer-lease.ts — the engine that arbitrates over these tables
34
+ * @see ../../migrations/drizzle-cleo-project — project lease migration (raw partial index)
35
+ * @see ../../migrations/drizzle-cleo-global — global lease migration (raw partial index)
36
+ */
37
+ import type { DatabaseSync } from 'node:sqlite';
38
+ /**
39
+ * The physical name of the lease table. Exported so the engine, the bootstrap
40
+ * assertion, and tests all reference the single source of truth.
41
+ */
42
+ export declare const WRITER_LEASES_TABLE: "_writer_leases";
43
+ /**
44
+ * The physical name of the lease waiter-queue table.
45
+ */
46
+ export declare const WRITER_QUEUE_TABLE: "_writer_queue";
47
+ /**
48
+ * The physical name of the partial-UNIQUE active-row index. Asserted present at
49
+ * bootstrap because drizzle cannot emit it (raw SQL in the baseline migration).
50
+ */
51
+ export declare const WRITER_LEASES_ACTIVE_INDEX: "ux_writer_leases_active";
52
+ /**
53
+ * `_writer_leases` — at most ONE active row per `(scope, lane)`.
54
+ *
55
+ * The single-active invariant is enforced by the raw-SQL partial-UNIQUE index
56
+ * `ux_writer_leases_active ON _writer_leases (scope, lane) WHERE active = 1`
57
+ * (emitted in the baseline migration — drizzle cannot model partial `WHERE`).
58
+ * This declaration intentionally carries only the full-column table; do NOT add
59
+ * a `.unique()` here (it would emit a NON-partial unique that wrongly forbids a
60
+ * second released row for the same lane).
61
+ */
62
+ export declare const writerLeases: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
63
+ name: "_writer_leases";
64
+ schema: undefined;
65
+ columns: {
66
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
67
+ name: string;
68
+ tableName: "_writer_leases";
69
+ dataType: "number int53";
70
+ data: number;
71
+ driverParam: number;
72
+ notNull: true;
73
+ hasDefault: true;
74
+ isPrimaryKey: true;
75
+ isAutoincrement: false;
76
+ hasRuntimeDefault: false;
77
+ enumValues: undefined;
78
+ baseColumn: never;
79
+ identity: undefined;
80
+ generated: undefined;
81
+ }, {}>;
82
+ scope: import("drizzle-orm/sqlite-core").SQLiteColumn<{
83
+ name: string;
84
+ tableName: "_writer_leases";
85
+ dataType: "string";
86
+ data: string;
87
+ driverParam: string;
88
+ notNull: true;
89
+ hasDefault: false;
90
+ isPrimaryKey: false;
91
+ isAutoincrement: false;
92
+ hasRuntimeDefault: false;
93
+ enumValues: [string, ...string[]];
94
+ baseColumn: never;
95
+ identity: undefined;
96
+ generated: undefined;
97
+ }, {}>;
98
+ lane: import("drizzle-orm/sqlite-core").SQLiteColumn<{
99
+ name: string;
100
+ tableName: "_writer_leases";
101
+ dataType: "string";
102
+ data: string;
103
+ driverParam: string;
104
+ notNull: true;
105
+ hasDefault: false;
106
+ isPrimaryKey: false;
107
+ isAutoincrement: false;
108
+ hasRuntimeDefault: false;
109
+ enumValues: [string, ...string[]];
110
+ baseColumn: never;
111
+ identity: undefined;
112
+ generated: undefined;
113
+ }, {}>;
114
+ holderId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
115
+ name: string;
116
+ tableName: "_writer_leases";
117
+ dataType: "string";
118
+ data: string;
119
+ driverParam: string;
120
+ notNull: true;
121
+ hasDefault: false;
122
+ isPrimaryKey: false;
123
+ isAutoincrement: false;
124
+ hasRuntimeDefault: false;
125
+ enumValues: [string, ...string[]];
126
+ baseColumn: never;
127
+ identity: undefined;
128
+ generated: undefined;
129
+ }, {}>;
130
+ holderPid: import("drizzle-orm/sqlite-core").SQLiteColumn<{
131
+ name: string;
132
+ tableName: "_writer_leases";
133
+ dataType: "number int53";
134
+ data: number;
135
+ driverParam: number;
136
+ notNull: true;
137
+ hasDefault: false;
138
+ isPrimaryKey: false;
139
+ isAutoincrement: false;
140
+ hasRuntimeDefault: false;
141
+ enumValues: undefined;
142
+ baseColumn: never;
143
+ identity: undefined;
144
+ generated: undefined;
145
+ }, {}>;
146
+ epoch: import("drizzle-orm/sqlite-core").SQLiteColumn<{
147
+ name: string;
148
+ tableName: "_writer_leases";
149
+ dataType: "number int53";
150
+ data: number;
151
+ driverParam: number;
152
+ notNull: true;
153
+ hasDefault: false;
154
+ isPrimaryKey: false;
155
+ isAutoincrement: false;
156
+ hasRuntimeDefault: false;
157
+ enumValues: undefined;
158
+ baseColumn: never;
159
+ identity: undefined;
160
+ generated: undefined;
161
+ }, {}>;
162
+ acquiredAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
163
+ name: string;
164
+ tableName: "_writer_leases";
165
+ dataType: "number int53";
166
+ data: number;
167
+ driverParam: number;
168
+ notNull: true;
169
+ hasDefault: false;
170
+ isPrimaryKey: false;
171
+ isAutoincrement: false;
172
+ hasRuntimeDefault: false;
173
+ enumValues: undefined;
174
+ baseColumn: never;
175
+ identity: undefined;
176
+ generated: undefined;
177
+ }, {}>;
178
+ heartbeatAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
179
+ name: string;
180
+ tableName: "_writer_leases";
181
+ dataType: "number int53";
182
+ data: number;
183
+ driverParam: number;
184
+ notNull: true;
185
+ hasDefault: false;
186
+ isPrimaryKey: false;
187
+ isAutoincrement: false;
188
+ hasRuntimeDefault: false;
189
+ enumValues: undefined;
190
+ baseColumn: never;
191
+ identity: undefined;
192
+ generated: undefined;
193
+ }, {}>;
194
+ ttlMs: import("drizzle-orm/sqlite-core").SQLiteColumn<{
195
+ name: string;
196
+ tableName: "_writer_leases";
197
+ dataType: "number int53";
198
+ data: number;
199
+ driverParam: number;
200
+ notNull: true;
201
+ hasDefault: false;
202
+ isPrimaryKey: false;
203
+ isAutoincrement: false;
204
+ hasRuntimeDefault: false;
205
+ enumValues: undefined;
206
+ baseColumn: never;
207
+ identity: undefined;
208
+ generated: undefined;
209
+ }, {}>;
210
+ reentrancyDepth: import("drizzle-orm/sqlite-core").SQLiteColumn<{
211
+ name: string;
212
+ tableName: "_writer_leases";
213
+ dataType: "number int53";
214
+ data: number;
215
+ driverParam: number;
216
+ notNull: true;
217
+ hasDefault: true;
218
+ isPrimaryKey: false;
219
+ isAutoincrement: false;
220
+ hasRuntimeDefault: false;
221
+ enumValues: undefined;
222
+ baseColumn: never;
223
+ identity: undefined;
224
+ generated: undefined;
225
+ }, {}>;
226
+ active: import("drizzle-orm/sqlite-core").SQLiteColumn<{
227
+ name: string;
228
+ tableName: "_writer_leases";
229
+ dataType: "number int53";
230
+ data: number;
231
+ driverParam: number;
232
+ notNull: true;
233
+ hasDefault: true;
234
+ isPrimaryKey: false;
235
+ isAutoincrement: false;
236
+ hasRuntimeDefault: false;
237
+ enumValues: undefined;
238
+ baseColumn: never;
239
+ identity: undefined;
240
+ generated: undefined;
241
+ }, {}>;
242
+ };
243
+ dialect: "sqlite";
244
+ }>;
245
+ /**
246
+ * `_writer_queue` — FIFO + priority waiters per `(scope, lane)`.
247
+ *
248
+ * Grant order is `priority ASC, ticket ASC` (priority-then-FIFO). The ordering
249
+ * index below is a normal multi-column index — fully expressible in drizzle.
250
+ */
251
+ export declare const writerQueue: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
252
+ name: "_writer_queue";
253
+ schema: undefined;
254
+ columns: {
255
+ ticket: import("drizzle-orm/sqlite-core").SQLiteColumn<{
256
+ name: string;
257
+ tableName: "_writer_queue";
258
+ dataType: "number int53";
259
+ data: number;
260
+ driverParam: number;
261
+ notNull: true;
262
+ hasDefault: true;
263
+ isPrimaryKey: true;
264
+ isAutoincrement: false;
265
+ hasRuntimeDefault: false;
266
+ enumValues: undefined;
267
+ baseColumn: never;
268
+ identity: undefined;
269
+ generated: undefined;
270
+ }, {}>;
271
+ scope: import("drizzle-orm/sqlite-core").SQLiteColumn<{
272
+ name: string;
273
+ tableName: "_writer_queue";
274
+ dataType: "string";
275
+ data: string;
276
+ driverParam: string;
277
+ notNull: true;
278
+ hasDefault: false;
279
+ isPrimaryKey: false;
280
+ isAutoincrement: false;
281
+ hasRuntimeDefault: false;
282
+ enumValues: [string, ...string[]];
283
+ baseColumn: never;
284
+ identity: undefined;
285
+ generated: undefined;
286
+ }, {}>;
287
+ lane: import("drizzle-orm/sqlite-core").SQLiteColumn<{
288
+ name: string;
289
+ tableName: "_writer_queue";
290
+ dataType: "string";
291
+ data: string;
292
+ driverParam: string;
293
+ notNull: true;
294
+ hasDefault: false;
295
+ isPrimaryKey: false;
296
+ isAutoincrement: false;
297
+ hasRuntimeDefault: false;
298
+ enumValues: [string, ...string[]];
299
+ baseColumn: never;
300
+ identity: undefined;
301
+ generated: undefined;
302
+ }, {}>;
303
+ holderId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
304
+ name: string;
305
+ tableName: "_writer_queue";
306
+ dataType: "string";
307
+ data: string;
308
+ driverParam: string;
309
+ notNull: true;
310
+ hasDefault: false;
311
+ isPrimaryKey: false;
312
+ isAutoincrement: false;
313
+ hasRuntimeDefault: false;
314
+ enumValues: [string, ...string[]];
315
+ baseColumn: never;
316
+ identity: undefined;
317
+ generated: undefined;
318
+ }, {}>;
319
+ priority: import("drizzle-orm/sqlite-core").SQLiteColumn<{
320
+ name: string;
321
+ tableName: "_writer_queue";
322
+ dataType: "number int53";
323
+ data: number;
324
+ driverParam: number;
325
+ notNull: true;
326
+ hasDefault: true;
327
+ isPrimaryKey: false;
328
+ isAutoincrement: false;
329
+ hasRuntimeDefault: false;
330
+ enumValues: undefined;
331
+ baseColumn: never;
332
+ identity: undefined;
333
+ generated: undefined;
334
+ }, {}>;
335
+ enqueuedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
336
+ name: string;
337
+ tableName: "_writer_queue";
338
+ dataType: "number int53";
339
+ data: number;
340
+ driverParam: number;
341
+ notNull: true;
342
+ hasDefault: false;
343
+ isPrimaryKey: false;
344
+ isAutoincrement: false;
345
+ hasRuntimeDefault: false;
346
+ enumValues: undefined;
347
+ baseColumn: never;
348
+ identity: undefined;
349
+ generated: undefined;
350
+ }, {}>;
351
+ deadlineAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
352
+ name: string;
353
+ tableName: "_writer_queue";
354
+ dataType: "number int53";
355
+ data: number;
356
+ driverParam: number;
357
+ notNull: true;
358
+ hasDefault: false;
359
+ isPrimaryKey: false;
360
+ isAutoincrement: false;
361
+ hasRuntimeDefault: false;
362
+ enumValues: undefined;
363
+ baseColumn: never;
364
+ identity: undefined;
365
+ generated: undefined;
366
+ }, {}>;
367
+ };
368
+ dialect: "sqlite";
369
+ }>;
370
+ /**
371
+ * Assert that the raw-SQL partial-UNIQUE active-row index is physically present
372
+ * on the given native `cleo.db` handle.
373
+ *
374
+ * Because drizzle cannot emit a partial-`WHERE` index, AC1 enforcement depends
375
+ * entirely on the hand-written baseline migration having run. This check makes a
376
+ * missing index a loud, immediate failure at bootstrap (or in T8) rather than a
377
+ * silent loss of the single-active-writer invariant.
378
+ *
379
+ * @param nativeDb - The native `DatabaseSync` handle for a scope's `cleo.db`.
380
+ * @throws {Error} `E_WRITER_LEASE_INDEX_MISSING` if `ux_writer_leases_active` is
381
+ * absent (the lease migration did not run, or the partial index was dropped).
382
+ *
383
+ * @example
384
+ * ```ts
385
+ * const nativeDb = (handle.db as { $client: DatabaseSync }).$client;
386
+ * assertWriterLeaseActiveIndexPresent(nativeDb); // throws if AC1 index missing
387
+ * ```
388
+ *
389
+ * @task T11627
390
+ */
391
+ export declare function assertWriterLeaseActiveIndexPresent(nativeDb: DatabaseSync): void;
392
+ //# sourceMappingURL=writer-lease-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer-lease-schema.d.ts","sourceRoot":"","sources":["../../src/store/writer-lease-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAG,gBAAyB,CAAC;AAE7D;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAG,eAAwB,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAG,yBAAkC,CAAC;AAE7E;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuBvB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqBvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAYhF"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Drizzle ORM schema for the **DbWriterLease** arbitration tables (T11627 ST-2).
3
+ *
4
+ * Two operational tables co-located inside EACH scope's consolidated `cleo.db`
5
+ * (project + global), migrated via the existing `drizzle-cleo-project` /
6
+ * `drizzle-cleo-global` migration sets so lease state lives next to the data it
7
+ * guards and is auto-split by the dual-cleo.db boundary
8
+ * ({@link resolveDualScopeDbPath}). They are NOT part of the exodus target shape
9
+ * under `schema/cleo-project/` — they are pure runtime infrastructure that the
10
+ * lease engine ({@link withWriterLease}) reads and writes via `BEGIN IMMEDIATE`.
11
+ *
12
+ * ## `_writer_leases` — exactly ONE active row per (scope, lane)
13
+ *
14
+ * AC1 (one writer per scope/lane) is enforced by a **partial UNIQUE index**
15
+ * `WHERE active = 1`. drizzle-orm does **not** surface partial-`WHERE` indexes in
16
+ * its typed schema API (cf. `conduit-schema.ts:339` `project_agent_refs.enabled`,
17
+ * `agent-registry-schema.ts`), so the index is emitted as **raw SQL in the lease
18
+ * baseline migration** — this module declares only the full-column table. This is
19
+ * the established repo pattern, not a deviation. The runtime bootstrap asserts the
20
+ * index exists via {@link assertWriterLeaseActiveIndexPresent} so a missing index
21
+ * (e.g. a migration that never ran) fails loudly instead of silently allowing two
22
+ * active rows.
23
+ *
24
+ * ## `_writer_queue` — FIFO + priority waiters
25
+ *
26
+ * Ordered `priority ASC, ticket ASC` (priority-then-FIFO). The full (non-partial)
27
+ * ordering index IS expressible in drizzle and is declared inline here; only the
28
+ * partial-unique active-row index requires raw SQL.
29
+ *
30
+ * @module
31
+ * @task T11627
32
+ * @epic T11625
33
+ * @see ./writer-lease.ts — the engine that arbitrates over these tables
34
+ * @see ../../migrations/drizzle-cleo-project — project lease migration (raw partial index)
35
+ * @see ../../migrations/drizzle-cleo-global — global lease migration (raw partial index)
36
+ */
37
+ import { index, integer, sqliteTable, text } from 'drizzle-orm/sqlite-core';
38
+ /**
39
+ * The physical name of the lease table. Exported so the engine, the bootstrap
40
+ * assertion, and tests all reference the single source of truth.
41
+ */
42
+ export const WRITER_LEASES_TABLE = '_writer_leases';
43
+ /**
44
+ * The physical name of the lease waiter-queue table.
45
+ */
46
+ export const WRITER_QUEUE_TABLE = '_writer_queue';
47
+ /**
48
+ * The physical name of the partial-UNIQUE active-row index. Asserted present at
49
+ * bootstrap because drizzle cannot emit it (raw SQL in the baseline migration).
50
+ */
51
+ export const WRITER_LEASES_ACTIVE_INDEX = 'ux_writer_leases_active';
52
+ /**
53
+ * `_writer_leases` — at most ONE active row per `(scope, lane)`.
54
+ *
55
+ * The single-active invariant is enforced by the raw-SQL partial-UNIQUE index
56
+ * `ux_writer_leases_active ON _writer_leases (scope, lane) WHERE active = 1`
57
+ * (emitted in the baseline migration — drizzle cannot model partial `WHERE`).
58
+ * This declaration intentionally carries only the full-column table; do NOT add
59
+ * a `.unique()` here (it would emit a NON-partial unique that wrongly forbids a
60
+ * second released row for the same lane).
61
+ */
62
+ export const writerLeases = sqliteTable(WRITER_LEASES_TABLE, {
63
+ /** Surrogate primary key (autoincrement via INTEGER PRIMARY KEY rowid alias). */
64
+ id: integer('id').primaryKey(),
65
+ /** The cleo.db scope — `'project'` | `'global'`. */
66
+ scope: text('scope').notNull(),
67
+ /** The write lane — `'tasks'` | `'brain'` | `'bulk'`. */
68
+ lane: text('lane').notNull(),
69
+ /** Process+lane holder identity (e.g. `pid-42:tasks`). */
70
+ holderId: text('holder_id').notNull(),
71
+ /** OS process id of the holder, used for stale-holder pid-liveness reclaim. */
72
+ holderPid: integer('holder_pid').notNull(),
73
+ /** Monotonic fence, bumped on reclaim; epoch-CAS rejects a stale holder's write. */
74
+ epoch: integer('epoch').notNull(),
75
+ /** Acquisition timestamp (epoch ms). */
76
+ acquiredAt: integer('acquired_at').notNull(),
77
+ /** Last heartbeat timestamp (epoch ms), advanced by renew. */
78
+ heartbeatAt: integer('heartbeat_at').notNull(),
79
+ /** Lease time-to-live in milliseconds. */
80
+ ttlMs: integer('ttl_ms').notNull(),
81
+ /** Re-entrancy depth — the durable refcount; row freed when it returns to 0. */
82
+ reentrancyDepth: integer('reentrancy_depth').notNull().default(1),
83
+ /** `1` while held, `0` once released. The partial-unique index keys on `active = 1`. */
84
+ active: integer('active').notNull().default(1),
85
+ });
86
+ /**
87
+ * `_writer_queue` — FIFO + priority waiters per `(scope, lane)`.
88
+ *
89
+ * Grant order is `priority ASC, ticket ASC` (priority-then-FIFO). The ordering
90
+ * index below is a normal multi-column index — fully expressible in drizzle.
91
+ */
92
+ export const writerQueue = sqliteTable(WRITER_QUEUE_TABLE, {
93
+ /** Monotonic ticket (AUTOINCREMENT) — the FIFO tiebreak within a priority. */
94
+ ticket: integer('ticket').primaryKey({ autoIncrement: true }),
95
+ /** The cleo.db scope being queued for. */
96
+ scope: text('scope').notNull(),
97
+ /** The write lane being queued for. */
98
+ lane: text('lane').notNull(),
99
+ /** The waiter's holder identity. */
100
+ holderId: text('holder_id').notNull(),
101
+ /** Advisory priority — lower acquires sooner. `0` = highest. */
102
+ priority: integer('priority').notNull().default(100),
103
+ /** Enqueue timestamp (epoch ms). */
104
+ enqueuedAt: integer('enqueued_at').notNull(),
105
+ /** Aging-promotion target (epoch ms) — a waiter past this is promoted to `0`. */
106
+ deadlineAt: integer('deadline_at').notNull(),
107
+ }, (table) => [
108
+ index('ix_writer_queue_order').on(table.scope, table.lane, table.priority, table.ticket),
109
+ ]);
110
+ /**
111
+ * Assert that the raw-SQL partial-UNIQUE active-row index is physically present
112
+ * on the given native `cleo.db` handle.
113
+ *
114
+ * Because drizzle cannot emit a partial-`WHERE` index, AC1 enforcement depends
115
+ * entirely on the hand-written baseline migration having run. This check makes a
116
+ * missing index a loud, immediate failure at bootstrap (or in T8) rather than a
117
+ * silent loss of the single-active-writer invariant.
118
+ *
119
+ * @param nativeDb - The native `DatabaseSync` handle for a scope's `cleo.db`.
120
+ * @throws {Error} `E_WRITER_LEASE_INDEX_MISSING` if `ux_writer_leases_active` is
121
+ * absent (the lease migration did not run, or the partial index was dropped).
122
+ *
123
+ * @example
124
+ * ```ts
125
+ * const nativeDb = (handle.db as { $client: DatabaseSync }).$client;
126
+ * assertWriterLeaseActiveIndexPresent(nativeDb); // throws if AC1 index missing
127
+ * ```
128
+ *
129
+ * @task T11627
130
+ */
131
+ export function assertWriterLeaseActiveIndexPresent(nativeDb) {
132
+ const row = nativeDb
133
+ .prepare(`SELECT name FROM sqlite_master WHERE type = 'index' AND name = ?`)
134
+ .get(WRITER_LEASES_ACTIVE_INDEX);
135
+ if (!row) {
136
+ throw new Error(`E_WRITER_LEASE_INDEX_MISSING: partial-unique active-row index ` +
137
+ `"${WRITER_LEASES_ACTIVE_INDEX}" is absent from this cleo.db. The lease ` +
138
+ `baseline migration (drizzle-cleo-{project,global}/…_t11891-writer-leases) ` +
139
+ `did not run, so the single-active-writer invariant (AC1) is unenforced.`);
140
+ }
141
+ }
142
+ //# sourceMappingURL=writer-lease-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer-lease-schema.js","sourceRoot":"","sources":["../../src/store/writer-lease-schema.ts"],"names":[],"mappings":"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"}