kiokuko-dsh 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 (1032) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja.md +50 -0
  3. package/README.ko.md +50 -0
  4. package/README.md +53 -0
  5. package/README.zh-CN.md +50 -0
  6. package/dist/agent-file/atomic-write.d.ts +93 -0
  7. package/dist/agent-file/atomic-write.d.ts.map +1 -0
  8. package/dist/agent-file/atomic-write.js +1026 -0
  9. package/dist/agent-file/atomic-write.js.map +1 -0
  10. package/dist/agent-file/managed-block.d.ts +23 -0
  11. package/dist/agent-file/managed-block.d.ts.map +1 -0
  12. package/dist/agent-file/managed-block.js +101 -0
  13. package/dist/agent-file/managed-block.js.map +1 -0
  14. package/dist/agent-file/render.d.ts +14 -0
  15. package/dist/agent-file/render.d.ts.map +1 -0
  16. package/dist/agent-file/render.js +63 -0
  17. package/dist/agent-file/render.js.map +1 -0
  18. package/dist/akinator/agent-task.d.ts +72 -0
  19. package/dist/akinator/agent-task.d.ts.map +1 -0
  20. package/dist/akinator/agent-task.js +684 -0
  21. package/dist/akinator/agent-task.js.map +1 -0
  22. package/dist/akinator/capabilities.d.ts +92 -0
  23. package/dist/akinator/capabilities.d.ts.map +1 -0
  24. package/dist/akinator/capabilities.js +364 -0
  25. package/dist/akinator/capabilities.js.map +1 -0
  26. package/dist/akinator/capability-binding.d.ts +11 -0
  27. package/dist/akinator/capability-binding.d.ts.map +1 -0
  28. package/dist/akinator/capability-binding.js +71 -0
  29. package/dist/akinator/capability-binding.js.map +1 -0
  30. package/dist/akinator/domain.d.ts +25 -0
  31. package/dist/akinator/domain.d.ts.map +1 -0
  32. package/dist/akinator/domain.js +266 -0
  33. package/dist/akinator/domain.js.map +1 -0
  34. package/dist/akinator/knowledge-path.d.ts +33 -0
  35. package/dist/akinator/knowledge-path.d.ts.map +1 -0
  36. package/dist/akinator/knowledge-path.js +474 -0
  37. package/dist/akinator/knowledge-path.js.map +1 -0
  38. package/dist/akinator/orchestrator.d.ts +7 -0
  39. package/dist/akinator/orchestrator.d.ts.map +1 -0
  40. package/dist/akinator/orchestrator.js +8 -0
  41. package/dist/akinator/orchestrator.js.map +1 -0
  42. package/dist/akinator/reasoning.d.ts +8 -0
  43. package/dist/akinator/reasoning.d.ts.map +1 -0
  44. package/dist/akinator/reasoning.js +118 -0
  45. package/dist/akinator/reasoning.js.map +1 -0
  46. package/dist/akinator/service.d.ts +32 -0
  47. package/dist/akinator/service.d.ts.map +1 -0
  48. package/dist/akinator/service.js +294 -0
  49. package/dist/akinator/service.js.map +1 -0
  50. package/dist/akinator/skill-discovery-attempt.d.ts +26 -0
  51. package/dist/akinator/skill-discovery-attempt.d.ts.map +1 -0
  52. package/dist/akinator/skill-discovery-attempt.js +469 -0
  53. package/dist/akinator/skill-discovery-attempt.js.map +1 -0
  54. package/dist/akinator/store.d.ts +96 -0
  55. package/dist/akinator/store.d.ts.map +1 -0
  56. package/dist/akinator/store.js +642 -0
  57. package/dist/akinator/store.js.map +1 -0
  58. package/dist/akinator/types.d.ts +70 -0
  59. package/dist/akinator/types.d.ts.map +1 -0
  60. package/dist/akinator/types.js +2 -0
  61. package/dist/akinator/types.js.map +1 -0
  62. package/dist/bin/kiokuko.d.ts +3 -0
  63. package/dist/bin/kiokuko.d.ts.map +1 -0
  64. package/dist/bin/kiokuko.js +13 -0
  65. package/dist/bin/kiokuko.js.map +1 -0
  66. package/dist/cli.d.ts +24 -0
  67. package/dist/cli.d.ts.map +1 -0
  68. package/dist/cli.js +962 -0
  69. package/dist/cli.js.map +1 -0
  70. package/dist/client/server-client.d.ts +22 -0
  71. package/dist/client/server-client.d.ts.map +1 -0
  72. package/dist/client/server-client.js +729 -0
  73. package/dist/client/server-client.js.map +1 -0
  74. package/dist/commands/agent.d.ts +12 -0
  75. package/dist/commands/agent.d.ts.map +1 -0
  76. package/dist/commands/agent.js +1138 -0
  77. package/dist/commands/agent.js.map +1 -0
  78. package/dist/commands/backup.d.ts +6 -0
  79. package/dist/commands/backup.d.ts.map +1 -0
  80. package/dist/commands/backup.js +77 -0
  81. package/dist/commands/backup.js.map +1 -0
  82. package/dist/commands/curator.d.ts +25 -0
  83. package/dist/commands/curator.d.ts.map +1 -0
  84. package/dist/commands/curator.js +58 -0
  85. package/dist/commands/curator.js.map +1 -0
  86. package/dist/commands/doctor.d.ts +61 -0
  87. package/dist/commands/doctor.d.ts.map +1 -0
  88. package/dist/commands/doctor.js +522 -0
  89. package/dist/commands/doctor.js.map +1 -0
  90. package/dist/commands/embeddings.d.ts +40 -0
  91. package/dist/commands/embeddings.d.ts.map +1 -0
  92. package/dist/commands/embeddings.js +317 -0
  93. package/dist/commands/embeddings.js.map +1 -0
  94. package/dist/commands/enno.d.ts +7 -0
  95. package/dist/commands/enno.d.ts.map +1 -0
  96. package/dist/commands/enno.js +76 -0
  97. package/dist/commands/enno.js.map +1 -0
  98. package/dist/commands/export.d.ts +17 -0
  99. package/dist/commands/export.d.ts.map +1 -0
  100. package/dist/commands/export.js +233 -0
  101. package/dist/commands/export.js.map +1 -0
  102. package/dist/commands/import.d.ts +24 -0
  103. package/dist/commands/import.d.ts.map +1 -0
  104. package/dist/commands/import.js +778 -0
  105. package/dist/commands/import.js.map +1 -0
  106. package/dist/commands/init.d.ts +34 -0
  107. package/dist/commands/init.d.ts.map +1 -0
  108. package/dist/commands/init.js +637 -0
  109. package/dist/commands/init.js.map +1 -0
  110. package/dist/commands/ledger.d.ts +7 -0
  111. package/dist/commands/ledger.d.ts.map +1 -0
  112. package/dist/commands/ledger.js +66 -0
  113. package/dist/commands/ledger.js.map +1 -0
  114. package/dist/commands/purge.d.ts +10 -0
  115. package/dist/commands/purge.d.ts.map +1 -0
  116. package/dist/commands/purge.js +29 -0
  117. package/dist/commands/purge.js.map +1 -0
  118. package/dist/commands/serve.d.ts +34 -0
  119. package/dist/commands/serve.d.ts.map +1 -0
  120. package/dist/commands/serve.js +120 -0
  121. package/dist/commands/serve.js.map +1 -0
  122. package/dist/commands/server-status.d.ts +20 -0
  123. package/dist/commands/server-status.d.ts.map +1 -0
  124. package/dist/commands/server-status.js +21 -0
  125. package/dist/commands/server-status.js.map +1 -0
  126. package/dist/commands/server.d.ts +13 -0
  127. package/dist/commands/server.d.ts.map +1 -0
  128. package/dist/commands/server.js +89 -0
  129. package/dist/commands/server.js.map +1 -0
  130. package/dist/commands/setup.d.ts +105 -0
  131. package/dist/commands/setup.d.ts.map +1 -0
  132. package/dist/commands/setup.js +793 -0
  133. package/dist/commands/setup.js.map +1 -0
  134. package/dist/commands/skills.d.ts +9 -0
  135. package/dist/commands/skills.d.ts.map +1 -0
  136. package/dist/commands/skills.js +317 -0
  137. package/dist/commands/skills.js.map +1 -0
  138. package/dist/commands/use.d.ts +40 -0
  139. package/dist/commands/use.d.ts.map +1 -0
  140. package/dist/commands/use.js +1090 -0
  141. package/dist/commands/use.js.map +1 -0
  142. package/dist/config/paths.d.ts +57 -0
  143. package/dist/config/paths.d.ts.map +1 -0
  144. package/dist/config/paths.js +352 -0
  145. package/dist/config/paths.js.map +1 -0
  146. package/dist/config/project-config.d.ts +11 -0
  147. package/dist/config/project-config.d.ts.map +1 -0
  148. package/dist/config/project-config.js +97 -0
  149. package/dist/config/project-config.js.map +1 -0
  150. package/dist/context/broker.d.ts +99 -0
  151. package/dist/context/broker.d.ts.map +1 -0
  152. package/dist/context/broker.js +923 -0
  153. package/dist/context/broker.js.map +1 -0
  154. package/dist/context/delivery-migration.d.ts +40 -0
  155. package/dist/context/delivery-migration.d.ts.map +1 -0
  156. package/dist/context/delivery-migration.js +367 -0
  157. package/dist/context/delivery-migration.js.map +1 -0
  158. package/dist/context/delivery.d.ts +61 -0
  159. package/dist/context/delivery.d.ts.map +1 -0
  160. package/dist/context/delivery.js +886 -0
  161. package/dist/context/delivery.js.map +1 -0
  162. package/dist/context/feedback.d.ts +73 -0
  163. package/dist/context/feedback.d.ts.map +1 -0
  164. package/dist/context/feedback.js +993 -0
  165. package/dist/context/feedback.js.map +1 -0
  166. package/dist/context/nudge-store.d.ts +57 -0
  167. package/dist/context/nudge-store.d.ts.map +1 -0
  168. package/dist/context/nudge-store.js +227 -0
  169. package/dist/context/nudge-store.js.map +1 -0
  170. package/dist/context/nudge-validation.d.ts +26 -0
  171. package/dist/context/nudge-validation.d.ts.map +1 -0
  172. package/dist/context/nudge-validation.js +122 -0
  173. package/dist/context/nudge-validation.js.map +1 -0
  174. package/dist/context/nudges.d.ts +38 -0
  175. package/dist/context/nudges.d.ts.map +1 -0
  176. package/dist/context/nudges.js +131 -0
  177. package/dist/context/nudges.js.map +1 -0
  178. package/dist/context/origin.d.ts +9 -0
  179. package/dist/context/origin.d.ts.map +1 -0
  180. package/dist/context/origin.js +15 -0
  181. package/dist/context/origin.js.map +1 -0
  182. package/dist/context/ranking.d.ts +92 -0
  183. package/dist/context/ranking.d.ts.map +1 -0
  184. package/dist/context/ranking.js +560 -0
  185. package/dist/context/ranking.js.map +1 -0
  186. package/dist/context/recommendations.d.ts +80 -0
  187. package/dist/context/recommendations.d.ts.map +1 -0
  188. package/dist/context/recommendations.js +341 -0
  189. package/dist/context/recommendations.js.map +1 -0
  190. package/dist/context/run-state.d.ts +26 -0
  191. package/dist/context/run-state.d.ts.map +1 -0
  192. package/dist/context/run-state.js +399 -0
  193. package/dist/context/run-state.js.map +1 -0
  194. package/dist/context/scoped-broker.d.ts +77 -0
  195. package/dist/context/scoped-broker.d.ts.map +1 -0
  196. package/dist/context/scoped-broker.js +690 -0
  197. package/dist/context/scoped-broker.js.map +1 -0
  198. package/dist/context/selection-state.d.ts +32 -0
  199. package/dist/context/selection-state.d.ts.map +1 -0
  200. package/dist/context/selection-state.js +369 -0
  201. package/dist/context/selection-state.js.map +1 -0
  202. package/dist/db/adapter.d.ts +27 -0
  203. package/dist/db/adapter.d.ts.map +1 -0
  204. package/dist/db/adapter.js +41 -0
  205. package/dist/db/adapter.js.map +1 -0
  206. package/dist/db/capabilities.d.ts +21 -0
  207. package/dist/db/capabilities.d.ts.map +1 -0
  208. package/dist/db/capabilities.js +57 -0
  209. package/dist/db/capabilities.js.map +1 -0
  210. package/dist/db/connection.d.ts +21 -0
  211. package/dist/db/connection.d.ts.map +1 -0
  212. package/dist/db/connection.js +129 -0
  213. package/dist/db/connection.js.map +1 -0
  214. package/dist/db/migrate.d.ts +40 -0
  215. package/dist/db/migrate.d.ts.map +1 -0
  216. package/dist/db/migrate.js +216 -0
  217. package/dist/db/migrate.js.map +1 -0
  218. package/dist/db/sqlite-retry.d.ts +11 -0
  219. package/dist/db/sqlite-retry.d.ts.map +1 -0
  220. package/dist/db/sqlite-retry.js +70 -0
  221. package/dist/db/sqlite-retry.js.map +1 -0
  222. package/dist/db/transaction.d.ts +17 -0
  223. package/dist/db/transaction.d.ts.map +1 -0
  224. package/dist/db/transaction.js +68 -0
  225. package/dist/db/transaction.js.map +1 -0
  226. package/dist/db/upgrade-backup.d.ts +59 -0
  227. package/dist/db/upgrade-backup.d.ts.map +1 -0
  228. package/dist/db/upgrade-backup.js +773 -0
  229. package/dist/db/upgrade-backup.js.map +1 -0
  230. package/dist/dsh/advisory-runner.d.ts +32 -0
  231. package/dist/dsh/advisory-runner.d.ts.map +1 -0
  232. package/dist/dsh/advisory-runner.js +111 -0
  233. package/dist/dsh/advisory-runner.js.map +1 -0
  234. package/dist/dsh/agent-state.d.ts +49 -0
  235. package/dist/dsh/agent-state.d.ts.map +1 -0
  236. package/dist/dsh/agent-state.js +103 -0
  237. package/dist/dsh/agent-state.js.map +1 -0
  238. package/dist/dsh/capability-catalog.d.ts +24 -0
  239. package/dist/dsh/capability-catalog.d.ts.map +1 -0
  240. package/dist/dsh/capability-catalog.js +108 -0
  241. package/dist/dsh/capability-catalog.js.map +1 -0
  242. package/dist/dsh/commands.d.ts +43 -0
  243. package/dist/dsh/commands.d.ts.map +1 -0
  244. package/dist/dsh/commands.js +83 -0
  245. package/dist/dsh/commands.js.map +1 -0
  246. package/dist/dsh/composition.d.ts +64 -0
  247. package/dist/dsh/composition.d.ts.map +1 -0
  248. package/dist/dsh/composition.js +104 -0
  249. package/dist/dsh/composition.js.map +1 -0
  250. package/dist/dsh/config.d.ts +7 -0
  251. package/dist/dsh/config.d.ts.map +1 -0
  252. package/dist/dsh/config.js +6 -0
  253. package/dist/dsh/config.js.map +1 -0
  254. package/dist/dsh/context-injection.d.ts +24 -0
  255. package/dist/dsh/context-injection.d.ts.map +1 -0
  256. package/dist/dsh/context-injection.js +61 -0
  257. package/dist/dsh/context-injection.js.map +1 -0
  258. package/dist/dsh/enno-controller.d.ts +94 -0
  259. package/dist/dsh/enno-controller.d.ts.map +1 -0
  260. package/dist/dsh/enno-controller.js +137 -0
  261. package/dist/dsh/enno-controller.js.map +1 -0
  262. package/dist/dsh/index.d.ts +31 -0
  263. package/dist/dsh/index.d.ts.map +1 -0
  264. package/dist/dsh/index.js +52 -0
  265. package/dist/dsh/index.js.map +1 -0
  266. package/dist/dsh/intake-gate.d.ts +50 -0
  267. package/dist/dsh/intake-gate.d.ts.map +1 -0
  268. package/dist/dsh/intake-gate.js +77 -0
  269. package/dist/dsh/intake-gate.js.map +1 -0
  270. package/dist/dsh/intake-profile-resolver.d.ts +22 -0
  271. package/dist/dsh/intake-profile-resolver.d.ts.map +1 -0
  272. package/dist/dsh/intake-profile-resolver.js +44 -0
  273. package/dist/dsh/intake-profile-resolver.js.map +1 -0
  274. package/dist/dsh/message-sources.d.ts +28 -0
  275. package/dist/dsh/message-sources.d.ts.map +1 -0
  276. package/dist/dsh/message-sources.js +62 -0
  277. package/dist/dsh/message-sources.js.map +1 -0
  278. package/dist/dsh/parity.d.ts +18 -0
  279. package/dist/dsh/parity.d.ts.map +1 -0
  280. package/dist/dsh/parity.js +105 -0
  281. package/dist/dsh/parity.js.map +1 -0
  282. package/dist/dsh/prompt-policy.d.ts +18 -0
  283. package/dist/dsh/prompt-policy.d.ts.map +1 -0
  284. package/dist/dsh/prompt-policy.js +16 -0
  285. package/dist/dsh/prompt-policy.js.map +1 -0
  286. package/dist/dsh/runtime.d.ts +40 -0
  287. package/dist/dsh/runtime.d.ts.map +1 -0
  288. package/dist/dsh/runtime.js +237 -0
  289. package/dist/dsh/runtime.js.map +1 -0
  290. package/dist/dsh/session-bridge.d.ts +98 -0
  291. package/dist/dsh/session-bridge.d.ts.map +1 -0
  292. package/dist/dsh/session-bridge.js +202 -0
  293. package/dist/dsh/session-bridge.js.map +1 -0
  294. package/dist/dsh/standard-skill-provider.d.ts +50 -0
  295. package/dist/dsh/standard-skill-provider.d.ts.map +1 -0
  296. package/dist/dsh/standard-skill-provider.js +71 -0
  297. package/dist/dsh/standard-skill-provider.js.map +1 -0
  298. package/dist/dsh/tool-policy.d.ts +40 -0
  299. package/dist/dsh/tool-policy.d.ts.map +1 -0
  300. package/dist/dsh/tool-policy.js +125 -0
  301. package/dist/dsh/tool-policy.js.map +1 -0
  302. package/dist/dsh/tools.d.ts +85 -0
  303. package/dist/dsh/tools.d.ts.map +1 -0
  304. package/dist/dsh/tools.js +156 -0
  305. package/dist/dsh/tools.js.map +1 -0
  306. package/dist/dsh/user-interaction.d.ts +51 -0
  307. package/dist/dsh/user-interaction.d.ts.map +1 -0
  308. package/dist/dsh/user-interaction.js +92 -0
  309. package/dist/dsh/user-interaction.js.map +1 -0
  310. package/dist/embedding/backend.d.ts +27 -0
  311. package/dist/embedding/backend.d.ts.map +1 -0
  312. package/dist/embedding/backend.js +67 -0
  313. package/dist/embedding/backend.js.map +1 -0
  314. package/dist/embedding/config.d.ts +10 -0
  315. package/dist/embedding/config.d.ts.map +1 -0
  316. package/dist/embedding/config.js +142 -0
  317. package/dist/embedding/config.js.map +1 -0
  318. package/dist/embedding/diagnostics.d.ts +34 -0
  319. package/dist/embedding/diagnostics.d.ts.map +1 -0
  320. package/dist/embedding/diagnostics.js +274 -0
  321. package/dist/embedding/diagnostics.js.map +1 -0
  322. package/dist/embedding/document.d.ts +20 -0
  323. package/dist/embedding/document.d.ts.map +1 -0
  324. package/dist/embedding/document.js +122 -0
  325. package/dist/embedding/document.js.map +1 -0
  326. package/dist/embedding/javascript-backend.d.ts +11 -0
  327. package/dist/embedding/javascript-backend.d.ts.map +1 -0
  328. package/dist/embedding/javascript-backend.js +164 -0
  329. package/dist/embedding/javascript-backend.js.map +1 -0
  330. package/dist/embedding/jobs.d.ts +67 -0
  331. package/dist/embedding/jobs.d.ts.map +1 -0
  332. package/dist/embedding/jobs.js +259 -0
  333. package/dist/embedding/jobs.js.map +1 -0
  334. package/dist/embedding/local-model-loader.d.ts +24 -0
  335. package/dist/embedding/local-model-loader.d.ts.map +1 -0
  336. package/dist/embedding/local-model-loader.js +64 -0
  337. package/dist/embedding/local-model-loader.js.map +1 -0
  338. package/dist/embedding/local-transformers-provider.d.ts +17 -0
  339. package/dist/embedding/local-transformers-provider.d.ts.map +1 -0
  340. package/dist/embedding/local-transformers-provider.js +54 -0
  341. package/dist/embedding/local-transformers-provider.js.map +1 -0
  342. package/dist/embedding/model-download.d.ts +32 -0
  343. package/dist/embedding/model-download.d.ts.map +1 -0
  344. package/dist/embedding/model-download.js +41 -0
  345. package/dist/embedding/model-download.js.map +1 -0
  346. package/dist/embedding/model-installation.d.ts +17 -0
  347. package/dist/embedding/model-installation.d.ts.map +1 -0
  348. package/dist/embedding/model-installation.js +71 -0
  349. package/dist/embedding/model-installation.js.map +1 -0
  350. package/dist/embedding/model-manifest.d.ts +18 -0
  351. package/dist/embedding/model-manifest.d.ts.map +1 -0
  352. package/dist/embedding/model-manifest.js +86 -0
  353. package/dist/embedding/model-manifest.js.map +1 -0
  354. package/dist/embedding/openai-compatible-provider.d.ts +24 -0
  355. package/dist/embedding/openai-compatible-provider.d.ts.map +1 -0
  356. package/dist/embedding/openai-compatible-provider.js +330 -0
  357. package/dist/embedding/openai-compatible-provider.js.map +1 -0
  358. package/dist/embedding/presets/local-small.d.ts +8 -0
  359. package/dist/embedding/presets/local-small.d.ts.map +1 -0
  360. package/dist/embedding/presets/local-small.js +67 -0
  361. package/dist/embedding/presets/local-small.js.map +1 -0
  362. package/dist/embedding/presets/manifest.d.ts +27 -0
  363. package/dist/embedding/presets/manifest.d.ts.map +1 -0
  364. package/dist/embedding/presets/manifest.js +5 -0
  365. package/dist/embedding/presets/manifest.js.map +1 -0
  366. package/dist/embedding/profile.d.ts +10 -0
  367. package/dist/embedding/profile.d.ts.map +1 -0
  368. package/dist/embedding/profile.js +67 -0
  369. package/dist/embedding/profile.js.map +1 -0
  370. package/dist/embedding/provider.d.ts +13 -0
  371. package/dist/embedding/provider.d.ts.map +1 -0
  372. package/dist/embedding/provider.js +17 -0
  373. package/dist/embedding/provider.js.map +1 -0
  374. package/dist/embedding/query-cache.d.ts +45 -0
  375. package/dist/embedding/query-cache.d.ts.map +1 -0
  376. package/dist/embedding/query-cache.js +181 -0
  377. package/dist/embedding/query-cache.js.map +1 -0
  378. package/dist/embedding/runtime.d.ts +14 -0
  379. package/dist/embedding/runtime.d.ts.map +1 -0
  380. package/dist/embedding/runtime.js +407 -0
  381. package/dist/embedding/runtime.js.map +1 -0
  382. package/dist/embedding/settings.d.ts +6 -0
  383. package/dist/embedding/settings.d.ts.map +1 -0
  384. package/dist/embedding/settings.js +69 -0
  385. package/dist/embedding/settings.js.map +1 -0
  386. package/dist/embedding/setup-lock.d.ts +7 -0
  387. package/dist/embedding/setup-lock.d.ts.map +1 -0
  388. package/dist/embedding/setup-lock.js +35 -0
  389. package/dist/embedding/setup-lock.js.map +1 -0
  390. package/dist/embedding/setup-service.d.ts +53 -0
  391. package/dist/embedding/setup-service.d.ts.map +1 -0
  392. package/dist/embedding/setup-service.js +184 -0
  393. package/dist/embedding/setup-service.js.map +1 -0
  394. package/dist/embedding/sqlite-vec-backend.d.ts +9 -0
  395. package/dist/embedding/sqlite-vec-backend.d.ts.map +1 -0
  396. package/dist/embedding/sqlite-vec-backend.js +106 -0
  397. package/dist/embedding/sqlite-vec-backend.js.map +1 -0
  398. package/dist/embedding/sqlite-vec-loader.d.ts +17 -0
  399. package/dist/embedding/sqlite-vec-loader.d.ts.map +1 -0
  400. package/dist/embedding/sqlite-vec-loader.js +51 -0
  401. package/dist/embedding/sqlite-vec-loader.js.map +1 -0
  402. package/dist/embedding/store.d.ts +66 -0
  403. package/dist/embedding/store.d.ts.map +1 -0
  404. package/dist/embedding/store.js +490 -0
  405. package/dist/embedding/store.js.map +1 -0
  406. package/dist/embedding/types.d.ts +126 -0
  407. package/dist/embedding/types.d.ts.map +1 -0
  408. package/dist/embedding/types.js +2 -0
  409. package/dist/embedding/types.js.map +1 -0
  410. package/dist/embedding/vector.d.ts +9 -0
  411. package/dist/embedding/vector.d.ts.map +1 -0
  412. package/dist/embedding/vector.js +90 -0
  413. package/dist/embedding/vector.js.map +1 -0
  414. package/dist/embedding/worker.d.ts +23 -0
  415. package/dist/embedding/worker.d.ts.map +1 -0
  416. package/dist/embedding/worker.js +84 -0
  417. package/dist/embedding/worker.js.map +1 -0
  418. package/dist/enno-oduno/adapters.d.ts +21 -0
  419. package/dist/enno-oduno/adapters.d.ts.map +1 -0
  420. package/dist/enno-oduno/adapters.js +253 -0
  421. package/dist/enno-oduno/adapters.js.map +1 -0
  422. package/dist/enno-oduno/advisory-store.d.ts +31 -0
  423. package/dist/enno-oduno/advisory-store.d.ts.map +1 -0
  424. package/dist/enno-oduno/advisory-store.js +105 -0
  425. package/dist/enno-oduno/advisory-store.js.map +1 -0
  426. package/dist/enno-oduno/advisory.d.ts +18 -0
  427. package/dist/enno-oduno/advisory.d.ts.map +1 -0
  428. package/dist/enno-oduno/advisory.js +310 -0
  429. package/dist/enno-oduno/advisory.js.map +1 -0
  430. package/dist/enno-oduno/confirmation.d.ts +4 -0
  431. package/dist/enno-oduno/confirmation.d.ts.map +1 -0
  432. package/dist/enno-oduno/confirmation.js +127 -0
  433. package/dist/enno-oduno/confirmation.js.map +1 -0
  434. package/dist/enno-oduno/directives.d.ts +12 -0
  435. package/dist/enno-oduno/directives.d.ts.map +1 -0
  436. package/dist/enno-oduno/directives.js +276 -0
  437. package/dist/enno-oduno/directives.js.map +1 -0
  438. package/dist/enno-oduno/enno-oduno.d.mts +2 -0
  439. package/dist/enno-oduno/enno-oduno.d.mts.map +1 -0
  440. package/dist/enno-oduno/enno-oduno.mjs +3 -0
  441. package/dist/enno-oduno/enno-oduno.mjs.map +1 -0
  442. package/dist/enno-oduno/experts.d.ts +6 -0
  443. package/dist/enno-oduno/experts.d.ts.map +1 -0
  444. package/dist/enno-oduno/experts.js +32 -0
  445. package/dist/enno-oduno/experts.js.map +1 -0
  446. package/dist/enno-oduno/goki.d.mts +2 -0
  447. package/dist/enno-oduno/goki.d.mts.map +1 -0
  448. package/dist/enno-oduno/goki.mjs +3 -0
  449. package/dist/enno-oduno/goki.mjs.map +1 -0
  450. package/dist/enno-oduno/handoff.d.ts +4 -0
  451. package/dist/enno-oduno/handoff.d.ts.map +1 -0
  452. package/dist/enno-oduno/handoff.js +18 -0
  453. package/dist/enno-oduno/handoff.js.map +1 -0
  454. package/dist/enno-oduno/harness.d.ts +20 -0
  455. package/dist/enno-oduno/harness.d.ts.map +1 -0
  456. package/dist/enno-oduno/harness.js +66 -0
  457. package/dist/enno-oduno/harness.js.map +1 -0
  458. package/dist/enno-oduno/instructions.d.ts +9 -0
  459. package/dist/enno-oduno/instructions.d.ts.map +1 -0
  460. package/dist/enno-oduno/instructions.js +12 -0
  461. package/dist/enno-oduno/instructions.js.map +1 -0
  462. package/dist/enno-oduno/plan-recovery.d.ts +44 -0
  463. package/dist/enno-oduno/plan-recovery.d.ts.map +1 -0
  464. package/dist/enno-oduno/plan-recovery.js +160 -0
  465. package/dist/enno-oduno/plan-recovery.js.map +1 -0
  466. package/dist/enno-oduno/repository-state.d.ts +8 -0
  467. package/dist/enno-oduno/repository-state.d.ts.map +1 -0
  468. package/dist/enno-oduno/repository-state.js +139 -0
  469. package/dist/enno-oduno/repository-state.js.map +1 -0
  470. package/dist/enno-oduno/role-runner.d.ts +9 -0
  471. package/dist/enno-oduno/role-runner.d.ts.map +1 -0
  472. package/dist/enno-oduno/role-runner.js +219 -0
  473. package/dist/enno-oduno/role-runner.js.map +1 -0
  474. package/dist/enno-oduno/sanitize.d.ts +17 -0
  475. package/dist/enno-oduno/sanitize.d.ts.map +1 -0
  476. package/dist/enno-oduno/sanitize.js +88 -0
  477. package/dist/enno-oduno/sanitize.js.map +1 -0
  478. package/dist/enno-oduno/schemas.d.ts +962 -0
  479. package/dist/enno-oduno/schemas.d.ts.map +1 -0
  480. package/dist/enno-oduno/schemas.js +609 -0
  481. package/dist/enno-oduno/schemas.js.map +1 -0
  482. package/dist/enno-oduno/service.d.ts +57 -0
  483. package/dist/enno-oduno/service.d.ts.map +1 -0
  484. package/dist/enno-oduno/service.js +1379 -0
  485. package/dist/enno-oduno/service.js.map +1 -0
  486. package/dist/enno-oduno/skills.d.ts +22 -0
  487. package/dist/enno-oduno/skills.d.ts.map +1 -0
  488. package/dist/enno-oduno/skills.js +127 -0
  489. package/dist/enno-oduno/skills.js.map +1 -0
  490. package/dist/enno-oduno/store.d.ts +106 -0
  491. package/dist/enno-oduno/store.d.ts.map +1 -0
  492. package/dist/enno-oduno/store.js +712 -0
  493. package/dist/enno-oduno/store.js.map +1 -0
  494. package/dist/enno-oduno/types.d.ts +457 -0
  495. package/dist/enno-oduno/types.d.ts.map +1 -0
  496. package/dist/enno-oduno/types.js +66 -0
  497. package/dist/enno-oduno/types.js.map +1 -0
  498. package/dist/enno-oduno/validation-errors.d.ts +93 -0
  499. package/dist/enno-oduno/validation-errors.d.ts.map +1 -0
  500. package/dist/enno-oduno/validation-errors.js +152 -0
  501. package/dist/enno-oduno/validation-errors.js.map +1 -0
  502. package/dist/enno-oduno/verifier.d.ts +10 -0
  503. package/dist/enno-oduno/verifier.d.ts.map +1 -0
  504. package/dist/enno-oduno/verifier.js +214 -0
  505. package/dist/enno-oduno/verifier.js.map +1 -0
  506. package/dist/enno-oduno/zenki.d.mts +2 -0
  507. package/dist/enno-oduno/zenki.d.mts.map +1 -0
  508. package/dist/enno-oduno/zenki.mjs +3 -0
  509. package/dist/enno-oduno/zenki.mjs.map +1 -0
  510. package/dist/errors.d.ts +13 -0
  511. package/dist/errors.d.ts.map +1 -0
  512. package/dist/errors.js +60 -0
  513. package/dist/errors.js.map +1 -0
  514. package/dist/gateway/agent-service.d.ts +72 -0
  515. package/dist/gateway/agent-service.d.ts.map +1 -0
  516. package/dist/gateway/agent-service.js +594 -0
  517. package/dist/gateway/agent-service.js.map +1 -0
  518. package/dist/gateway/checkpoint-mutation-service.d.ts +33 -0
  519. package/dist/gateway/checkpoint-mutation-service.d.ts.map +1 -0
  520. package/dist/gateway/checkpoint-mutation-service.js +513 -0
  521. package/dist/gateway/checkpoint-mutation-service.js.map +1 -0
  522. package/dist/gateway/checkpoint-service.d.ts +40 -0
  523. package/dist/gateway/checkpoint-service.d.ts.map +1 -0
  524. package/dist/gateway/checkpoint-service.js +149 -0
  525. package/dist/gateway/checkpoint-service.js.map +1 -0
  526. package/dist/gateway/nudge-delivery-service.d.ts +21 -0
  527. package/dist/gateway/nudge-delivery-service.d.ts.map +1 -0
  528. package/dist/gateway/nudge-delivery-service.js +67 -0
  529. package/dist/gateway/nudge-delivery-service.js.map +1 -0
  530. package/dist/ledger/archive.d.ts +48 -0
  531. package/dist/ledger/archive.d.ts.map +1 -0
  532. package/dist/ledger/archive.js +1261 -0
  533. package/dist/ledger/archive.js.map +1 -0
  534. package/dist/ledger/checkpoint-contract.d.ts +144 -0
  535. package/dist/ledger/checkpoint-contract.d.ts.map +1 -0
  536. package/dist/ledger/checkpoint-contract.js +91 -0
  537. package/dist/ledger/checkpoint-contract.js.map +1 -0
  538. package/dist/ledger/checkpoint-eligibility.d.ts +17 -0
  539. package/dist/ledger/checkpoint-eligibility.d.ts.map +1 -0
  540. package/dist/ledger/checkpoint-eligibility.js +19 -0
  541. package/dist/ledger/checkpoint-eligibility.js.map +1 -0
  542. package/dist/ledger/hash.d.ts +22 -0
  543. package/dist/ledger/hash.d.ts.map +1 -0
  544. package/dist/ledger/hash.js +25 -0
  545. package/dist/ledger/hash.js.map +1 -0
  546. package/dist/ledger/maintenance.d.ts +68 -0
  547. package/dist/ledger/maintenance.d.ts.map +1 -0
  548. package/dist/ledger/maintenance.js +767 -0
  549. package/dist/ledger/maintenance.js.map +1 -0
  550. package/dist/ledger/projection.d.ts +38 -0
  551. package/dist/ledger/projection.d.ts.map +1 -0
  552. package/dist/ledger/projection.js +315 -0
  553. package/dist/ledger/projection.js.map +1 -0
  554. package/dist/ledger/promotion.d.ts +19 -0
  555. package/dist/ledger/promotion.d.ts.map +1 -0
  556. package/dist/ledger/promotion.js +310 -0
  557. package/dist/ledger/promotion.js.map +1 -0
  558. package/dist/ledger/query.d.ts +41 -0
  559. package/dist/ledger/query.d.ts.map +1 -0
  560. package/dist/ledger/query.js +321 -0
  561. package/dist/ledger/query.js.map +1 -0
  562. package/dist/ledger/redaction.d.ts +8 -0
  563. package/dist/ledger/redaction.d.ts.map +1 -0
  564. package/dist/ledger/redaction.js +40 -0
  565. package/dist/ledger/redaction.js.map +1 -0
  566. package/dist/ledger/store.d.ts +45 -0
  567. package/dist/ledger/store.d.ts.map +1 -0
  568. package/dist/ledger/store.js +327 -0
  569. package/dist/ledger/store.js.map +1 -0
  570. package/dist/ledger/types.d.ts +115 -0
  571. package/dist/ledger/types.d.ts.map +1 -0
  572. package/dist/ledger/types.js +27 -0
  573. package/dist/ledger/types.js.map +1 -0
  574. package/dist/ledger/validate.d.ts +10 -0
  575. package/dist/ledger/validate.d.ts.map +1 -0
  576. package/dist/ledger/validate.js +178 -0
  577. package/dist/ledger/validate.js.map +1 -0
  578. package/dist/mcp/bounded-stdio-transport.d.ts +26 -0
  579. package/dist/mcp/bounded-stdio-transport.d.ts.map +1 -0
  580. package/dist/mcp/bounded-stdio-transport.js +121 -0
  581. package/dist/mcp/bounded-stdio-transport.js.map +1 -0
  582. package/dist/mcp/request-deadline.d.ts +51 -0
  583. package/dist/mcp/request-deadline.d.ts.map +1 -0
  584. package/dist/mcp/request-deadline.js +155 -0
  585. package/dist/mcp/request-deadline.js.map +1 -0
  586. package/dist/mcp/runtime-owner.d.ts +27 -0
  587. package/dist/mcp/runtime-owner.d.ts.map +1 -0
  588. package/dist/mcp/runtime-owner.js +129 -0
  589. package/dist/mcp/runtime-owner.js.map +1 -0
  590. package/dist/mcp/server.d.ts +24 -0
  591. package/dist/mcp/server.d.ts.map +1 -0
  592. package/dist/mcp/server.js +502 -0
  593. package/dist/mcp/server.js.map +1 -0
  594. package/dist/memory/audit.d.ts +13 -0
  595. package/dist/memory/audit.d.ts.map +1 -0
  596. package/dist/memory/audit.js +15 -0
  597. package/dist/memory/audit.js.map +1 -0
  598. package/dist/memory/checkpoint-contract.d.ts +490 -0
  599. package/dist/memory/checkpoint-contract.d.ts.map +1 -0
  600. package/dist/memory/checkpoint-contract.js +106 -0
  601. package/dist/memory/checkpoint-contract.js.map +1 -0
  602. package/dist/memory/curator-trust.d.ts +15 -0
  603. package/dist/memory/curator-trust.d.ts.map +1 -0
  604. package/dist/memory/curator-trust.js +58 -0
  605. package/dist/memory/curator-trust.js.map +1 -0
  606. package/dist/memory/curator.d.ts +115 -0
  607. package/dist/memory/curator.d.ts.map +1 -0
  608. package/dist/memory/curator.js +706 -0
  609. package/dist/memory/curator.js.map +1 -0
  610. package/dist/memory/entries.d.ts +75 -0
  611. package/dist/memory/entries.d.ts.map +1 -0
  612. package/dist/memory/entries.js +355 -0
  613. package/dist/memory/entries.js.map +1 -0
  614. package/dist/memory/federated-retrieval.d.ts +79 -0
  615. package/dist/memory/federated-retrieval.d.ts.map +1 -0
  616. package/dist/memory/federated-retrieval.js +515 -0
  617. package/dist/memory/federated-retrieval.js.map +1 -0
  618. package/dist/memory/hybrid-retrieval.d.ts +33 -0
  619. package/dist/memory/hybrid-retrieval.d.ts.map +1 -0
  620. package/dist/memory/hybrid-retrieval.js +398 -0
  621. package/dist/memory/hybrid-retrieval.js.map +1 -0
  622. package/dist/memory/lifecycle.d.ts +29 -0
  623. package/dist/memory/lifecycle.d.ts.map +1 -0
  624. package/dist/memory/lifecycle.js +65 -0
  625. package/dist/memory/lifecycle.js.map +1 -0
  626. package/dist/memory/portability.d.ts +10 -0
  627. package/dist/memory/portability.d.ts.map +1 -0
  628. package/dist/memory/portability.js +44 -0
  629. package/dist/memory/portability.js.map +1 -0
  630. package/dist/memory/rebuild-search.d.ts +24 -0
  631. package/dist/memory/rebuild-search.d.ts.map +1 -0
  632. package/dist/memory/rebuild-search.js +167 -0
  633. package/dist/memory/rebuild-search.js.map +1 -0
  634. package/dist/memory/retrieval-query.d.ts +16 -0
  635. package/dist/memory/retrieval-query.d.ts.map +1 -0
  636. package/dist/memory/retrieval-query.js +161 -0
  637. package/dist/memory/retrieval-query.js.map +1 -0
  638. package/dist/memory/retrieval.d.ts +56 -0
  639. package/dist/memory/retrieval.d.ts.map +1 -0
  640. package/dist/memory/retrieval.js +101 -0
  641. package/dist/memory/retrieval.js.map +1 -0
  642. package/dist/memory/revisions.d.ts +123 -0
  643. package/dist/memory/revisions.d.ts.map +1 -0
  644. package/dist/memory/revisions.js +759 -0
  645. package/dist/memory/revisions.js.map +1 -0
  646. package/dist/memory/scoped-memory.d.ts +76 -0
  647. package/dist/memory/scoped-memory.d.ts.map +1 -0
  648. package/dist/memory/scoped-memory.js +539 -0
  649. package/dist/memory/scoped-memory.js.map +1 -0
  650. package/dist/memory/secrets.d.ts +8 -0
  651. package/dist/memory/secrets.d.ts.map +1 -0
  652. package/dist/memory/secrets.js +54 -0
  653. package/dist/memory/secrets.js.map +1 -0
  654. package/dist/memory/structured-memory.d.ts +60 -0
  655. package/dist/memory/structured-memory.d.ts.map +1 -0
  656. package/dist/memory/structured-memory.js +341 -0
  657. package/dist/memory/structured-memory.js.map +1 -0
  658. package/dist/memory/workspaces.d.ts +26 -0
  659. package/dist/memory/workspaces.d.ts.map +1 -0
  660. package/dist/memory/workspaces.js +159 -0
  661. package/dist/memory/workspaces.js.map +1 -0
  662. package/dist/model-tools/contracts.d.ts +1297 -0
  663. package/dist/model-tools/contracts.d.ts.map +1 -0
  664. package/dist/model-tools/contracts.js +104 -0
  665. package/dist/model-tools/contracts.js.map +1 -0
  666. package/dist/model-tools/registry.d.ts +8 -0
  667. package/dist/model-tools/registry.d.ts.map +1 -0
  668. package/dist/model-tools/registry.js +59 -0
  669. package/dist/model-tools/registry.js.map +1 -0
  670. package/dist/package-version.d.ts +2 -0
  671. package/dist/package-version.d.ts.map +1 -0
  672. package/dist/package-version.js +7 -0
  673. package/dist/package-version.js.map +1 -0
  674. package/dist/repository/binding.d.ts +32 -0
  675. package/dist/repository/binding.d.ts.map +1 -0
  676. package/dist/repository/binding.js +208 -0
  677. package/dist/repository/binding.js.map +1 -0
  678. package/dist/repository/cwd-schema.d.ts +4 -0
  679. package/dist/repository/cwd-schema.d.ts.map +1 -0
  680. package/dist/repository/cwd-schema.js +8 -0
  681. package/dist/repository/cwd-schema.js.map +1 -0
  682. package/dist/repository/detect-root.d.ts +13 -0
  683. package/dist/repository/detect-root.d.ts.map +1 -0
  684. package/dist/repository/detect-root.js +77 -0
  685. package/dist/repository/detect-root.js.map +1 -0
  686. package/dist/repository/framework-version.d.ts +8 -0
  687. package/dist/repository/framework-version.d.ts.map +1 -0
  688. package/dist/repository/framework-version.js +29 -0
  689. package/dist/repository/framework-version.js.map +1 -0
  690. package/dist/repository/git-origin.d.ts +2 -0
  691. package/dist/repository/git-origin.d.ts.map +1 -0
  692. package/dist/repository/git-origin.js +15 -0
  693. package/dist/repository/git-origin.js.map +1 -0
  694. package/dist/repository/gitignore.d.ts +8 -0
  695. package/dist/repository/gitignore.d.ts.map +1 -0
  696. package/dist/repository/gitignore.js +21 -0
  697. package/dist/repository/gitignore.js.map +1 -0
  698. package/dist/repository/identity-value.d.ts +4 -0
  699. package/dist/repository/identity-value.d.ts.map +1 -0
  700. package/dist/repository/identity-value.js +24 -0
  701. package/dist/repository/identity-value.js.map +1 -0
  702. package/dist/repository/identity.d.ts +19 -0
  703. package/dist/repository/identity.d.ts.map +1 -0
  704. package/dist/repository/identity.js +25 -0
  705. package/dist/repository/identity.js.map +1 -0
  706. package/dist/repository/project-fingerprint.d.ts +33 -0
  707. package/dist/repository/project-fingerprint.d.ts.map +1 -0
  708. package/dist/repository/project-fingerprint.js +429 -0
  709. package/dist/repository/project-fingerprint.js.map +1 -0
  710. package/dist/repository/remote-url.d.ts +3 -0
  711. package/dist/repository/remote-url.d.ts.map +1 -0
  712. package/dist/repository/remote-url.js +35 -0
  713. package/dist/repository/remote-url.js.map +1 -0
  714. package/dist/runtime-version.d.ts +6 -0
  715. package/dist/runtime-version.d.ts.map +1 -0
  716. package/dist/runtime-version.js +33 -0
  717. package/dist/runtime-version.js.map +1 -0
  718. package/dist/security/sanitize.d.ts +4 -0
  719. package/dist/security/sanitize.d.ts.map +1 -0
  720. package/dist/security/sanitize.js +174 -0
  721. package/dist/security/sanitize.js.map +1 -0
  722. package/dist/serialization/boundary-json.d.ts +20 -0
  723. package/dist/serialization/boundary-json.d.ts.map +1 -0
  724. package/dist/serialization/boundary-json.js +129 -0
  725. package/dist/serialization/boundary-json.js.map +1 -0
  726. package/dist/serialization/envelope.d.ts +20 -0
  727. package/dist/serialization/envelope.d.ts.map +1 -0
  728. package/dist/serialization/envelope.js +11 -0
  729. package/dist/serialization/envelope.js.map +1 -0
  730. package/dist/serialization/validate.d.ts +38 -0
  731. package/dist/serialization/validate.d.ts.map +1 -0
  732. package/dist/serialization/validate.js +233 -0
  733. package/dist/serialization/validate.js.map +1 -0
  734. package/dist/server/agent-application.d.ts +6 -0
  735. package/dist/server/agent-application.d.ts.map +1 -0
  736. package/dist/server/agent-application.js +74 -0
  737. package/dist/server/agent-application.js.map +1 -0
  738. package/dist/server/agent-checkpoint-use-case.d.ts +41 -0
  739. package/dist/server/agent-checkpoint-use-case.d.ts.map +1 -0
  740. package/dist/server/agent-checkpoint-use-case.js +159 -0
  741. package/dist/server/agent-checkpoint-use-case.js.map +1 -0
  742. package/dist/server/app.d.ts +5 -0
  743. package/dist/server/app.d.ts.map +1 -0
  744. package/dist/server/app.js +87 -0
  745. package/dist/server/app.js.map +1 -0
  746. package/dist/server/auth.d.ts +2 -0
  747. package/dist/server/auth.d.ts.map +1 -0
  748. package/dist/server/auth.js +22 -0
  749. package/dist/server/auth.js.map +1 -0
  750. package/dist/server/http.d.ts +86 -0
  751. package/dist/server/http.d.ts.map +1 -0
  752. package/dist/server/http.js +455 -0
  753. package/dist/server/http.js.map +1 -0
  754. package/dist/server/idempotency.d.ts +6 -0
  755. package/dist/server/idempotency.d.ts.map +1 -0
  756. package/dist/server/idempotency.js +210 -0
  757. package/dist/server/idempotency.js.map +1 -0
  758. package/dist/server/instance-lock.d.ts +17 -0
  759. package/dist/server/instance-lock.d.ts.map +1 -0
  760. package/dist/server/instance-lock.js +118 -0
  761. package/dist/server/instance-lock.js.map +1 -0
  762. package/dist/server/router.d.ts +29 -0
  763. package/dist/server/router.d.ts.map +1 -0
  764. package/dist/server/router.js +129 -0
  765. package/dist/server/router.js.map +1 -0
  766. package/dist/server/routes/agent-capability-gate.d.ts +43 -0
  767. package/dist/server/routes/agent-capability-gate.d.ts.map +1 -0
  768. package/dist/server/routes/agent-capability-gate.js +202 -0
  769. package/dist/server/routes/agent-capability-gate.js.map +1 -0
  770. package/dist/server/routes/agent-events.d.ts +5 -0
  771. package/dist/server/routes/agent-events.d.ts.map +1 -0
  772. package/dist/server/routes/agent-events.js +53 -0
  773. package/dist/server/routes/agent-events.js.map +1 -0
  774. package/dist/server/routes/agent-intake.d.ts +5 -0
  775. package/dist/server/routes/agent-intake.d.ts.map +1 -0
  776. package/dist/server/routes/agent-intake.js +50 -0
  777. package/dist/server/routes/agent-intake.js.map +1 -0
  778. package/dist/server/routes/agent-promotions.d.ts +5 -0
  779. package/dist/server/routes/agent-promotions.d.ts.map +1 -0
  780. package/dist/server/routes/agent-promotions.js +55 -0
  781. package/dist/server/routes/agent-promotions.js.map +1 -0
  782. package/dist/server/routes/agent-runs.d.ts +32 -0
  783. package/dist/server/routes/agent-runs.d.ts.map +1 -0
  784. package/dist/server/routes/agent-runs.js +165 -0
  785. package/dist/server/routes/agent-runs.js.map +1 -0
  786. package/dist/server/routes/request-binding.d.ts +5 -0
  787. package/dist/server/routes/request-binding.d.ts.map +1 -0
  788. package/dist/server/routes/request-binding.js +49 -0
  789. package/dist/server/routes/request-binding.js.map +1 -0
  790. package/dist/server/routes/task5-support.d.ts +4 -0
  791. package/dist/server/routes/task5-support.d.ts.map +1 -0
  792. package/dist/server/routes/task5-support.js +6 -0
  793. package/dist/server/routes/task5-support.js.map +1 -0
  794. package/dist/server/routes/task5.d.ts +5 -0
  795. package/dist/server/routes/task5.d.ts.map +1 -0
  796. package/dist/server/routes/task5.js +85 -0
  797. package/dist/server/routes/task5.js.map +1 -0
  798. package/dist/server/runtime-descriptor.d.ts +24 -0
  799. package/dist/server/runtime-descriptor.d.ts.map +1 -0
  800. package/dist/server/runtime-descriptor.js +156 -0
  801. package/dist/server/runtime-descriptor.js.map +1 -0
  802. package/dist/server/write-queue.d.ts +20 -0
  803. package/dist/server/write-queue.d.ts.map +1 -0
  804. package/dist/server/write-queue.js +83 -0
  805. package/dist/server/write-queue.js.map +1 -0
  806. package/dist/setup/claude-config.d.ts +8 -0
  807. package/dist/setup/claude-config.d.ts.map +1 -0
  808. package/dist/setup/claude-config.js +95 -0
  809. package/dist/setup/claude-config.js.map +1 -0
  810. package/dist/setup/client-detection.d.ts +13 -0
  811. package/dist/setup/client-detection.d.ts.map +1 -0
  812. package/dist/setup/client-detection.js +64 -0
  813. package/dist/setup/client-detection.js.map +1 -0
  814. package/dist/setup/enno-client-config.d.ts +9 -0
  815. package/dist/setup/enno-client-config.d.ts.map +1 -0
  816. package/dist/setup/enno-client-config.js +172 -0
  817. package/dist/setup/enno-client-config.js.map +1 -0
  818. package/dist/setup/hermes-config.d.ts +7 -0
  819. package/dist/setup/hermes-config.d.ts.map +1 -0
  820. package/dist/setup/hermes-config.js +145 -0
  821. package/dist/setup/hermes-config.js.map +1 -0
  822. package/dist/setup/legacy-client-cleanup.d.ts +6 -0
  823. package/dist/setup/legacy-client-cleanup.d.ts.map +1 -0
  824. package/dist/setup/legacy-client-cleanup.js +152 -0
  825. package/dist/setup/legacy-client-cleanup.js.map +1 -0
  826. package/dist/setup/managed-text.d.ts +6 -0
  827. package/dist/setup/managed-text.d.ts.map +1 -0
  828. package/dist/setup/managed-text.js +52 -0
  829. package/dist/setup/managed-text.js.map +1 -0
  830. package/dist/setup/mcp-conflict.d.ts +4 -0
  831. package/dist/setup/mcp-conflict.d.ts.map +1 -0
  832. package/dist/setup/mcp-conflict.js +15 -0
  833. package/dist/setup/mcp-conflict.js.map +1 -0
  834. package/dist/setup/opencode-config.d.ts +8 -0
  835. package/dist/setup/opencode-config.d.ts.map +1 -0
  836. package/dist/setup/opencode-config.js +98 -0
  837. package/dist/setup/opencode-config.js.map +1 -0
  838. package/dist/setup/project-agent-refresh.d.ts +41 -0
  839. package/dist/setup/project-agent-refresh.d.ts.map +1 -0
  840. package/dist/setup/project-agent-refresh.js +158 -0
  841. package/dist/setup/project-agent-refresh.js.map +1 -0
  842. package/dist/setup/render.d.ts +13 -0
  843. package/dist/setup/render.d.ts.map +1 -0
  844. package/dist/setup/render.js +334 -0
  845. package/dist/setup/render.js.map +1 -0
  846. package/dist/setup/standard-skills.d.ts +60 -0
  847. package/dist/setup/standard-skills.d.ts.map +1 -0
  848. package/dist/setup/standard-skills.js +133 -0
  849. package/dist/setup/standard-skills.js.map +1 -0
  850. package/dist/setup/strict-json.d.ts +7 -0
  851. package/dist/setup/strict-json.d.ts.map +1 -0
  852. package/dist/setup/strict-json.js +98 -0
  853. package/dist/setup/strict-json.js.map +1 -0
  854. package/dist/setup/strict-toml.d.ts +18 -0
  855. package/dist/setup/strict-toml.d.ts.map +1 -0
  856. package/dist/setup/strict-toml.js +491 -0
  857. package/dist/setup/strict-toml.js.map +1 -0
  858. package/dist/skills/cache.d.ts +15 -0
  859. package/dist/skills/cache.d.ts.map +1 -0
  860. package/dist/skills/cache.js +19 -0
  861. package/dist/skills/cache.js.map +1 -0
  862. package/dist/skills/candidate-ranking.d.ts +15 -0
  863. package/dist/skills/candidate-ranking.d.ts.map +1 -0
  864. package/dist/skills/candidate-ranking.js +52 -0
  865. package/dist/skills/candidate-ranking.js.map +1 -0
  866. package/dist/skills/chunking.d.ts +11 -0
  867. package/dist/skills/chunking.d.ts.map +1 -0
  868. package/dist/skills/chunking.js +291 -0
  869. package/dist/skills/chunking.js.map +1 -0
  870. package/dist/skills/config.d.ts +19 -0
  871. package/dist/skills/config.d.ts.map +1 -0
  872. package/dist/skills/config.js +103 -0
  873. package/dist/skills/config.js.map +1 -0
  874. package/dist/skills/discovery-service.d.ts +26 -0
  875. package/dist/skills/discovery-service.d.ts.map +1 -0
  876. package/dist/skills/discovery-service.js +929 -0
  877. package/dist/skills/discovery-service.js.map +1 -0
  878. package/dist/skills/external-transport.d.ts +2 -0
  879. package/dist/skills/external-transport.d.ts.map +1 -0
  880. package/dist/skills/external-transport.js +30 -0
  881. package/dist/skills/external-transport.js.map +1 -0
  882. package/dist/skills/find.d.ts +17 -0
  883. package/dist/skills/find.d.ts.map +1 -0
  884. package/dist/skills/find.js +59 -0
  885. package/dist/skills/find.js.map +1 -0
  886. package/dist/skills/gap-detection.d.ts +23 -0
  887. package/dist/skills/gap-detection.d.ts.map +1 -0
  888. package/dist/skills/gap-detection.js +62 -0
  889. package/dist/skills/gap-detection.js.map +1 -0
  890. package/dist/skills/import-preparation.d.ts +4 -0
  891. package/dist/skills/import-preparation.d.ts.map +1 -0
  892. package/dist/skills/import-preparation.js +20 -0
  893. package/dist/skills/import-preparation.js.map +1 -0
  894. package/dist/skills/materialization-authority.d.ts +11 -0
  895. package/dist/skills/materialization-authority.d.ts.map +1 -0
  896. package/dist/skills/materialization-authority.js +92 -0
  897. package/dist/skills/materialization-authority.js.map +1 -0
  898. package/dist/skills/materialization-service.d.ts +22 -0
  899. package/dist/skills/materialization-service.d.ts.map +1 -0
  900. package/dist/skills/materialization-service.js +101 -0
  901. package/dist/skills/materialization-service.js.map +1 -0
  902. package/dist/skills/official-catalog.d.ts +31 -0
  903. package/dist/skills/official-catalog.d.ts.map +1 -0
  904. package/dist/skills/official-catalog.js +110 -0
  905. package/dist/skills/official-catalog.js.map +1 -0
  906. package/dist/skills/providers/schema.d.ts +30 -0
  907. package/dist/skills/providers/schema.d.ts.map +1 -0
  908. package/dist/skills/providers/schema.js +354 -0
  909. package/dist/skills/providers/schema.js.map +1 -0
  910. package/dist/skills/providers/skills-sh-compat.d.ts +17 -0
  911. package/dist/skills/providers/skills-sh-compat.d.ts.map +1 -0
  912. package/dist/skills/providers/skills-sh-compat.js +73 -0
  913. package/dist/skills/providers/skills-sh-compat.js.map +1 -0
  914. package/dist/skills/providers/skills-sh-v1.d.ts +23 -0
  915. package/dist/skills/providers/skills-sh-v1.d.ts.map +1 -0
  916. package/dist/skills/providers/skills-sh-v1.js +152 -0
  917. package/dist/skills/providers/skills-sh-v1.js.map +1 -0
  918. package/dist/skills/query-builder.d.ts +18 -0
  919. package/dist/skills/query-builder.d.ts.map +1 -0
  920. package/dist/skills/query-builder.js +93 -0
  921. package/dist/skills/query-builder.js.map +1 -0
  922. package/dist/skills/source/errors.d.ts +9 -0
  923. package/dist/skills/source/errors.d.ts.map +1 -0
  924. package/dist/skills/source/errors.js +15 -0
  925. package/dist/skills/source/errors.js.map +1 -0
  926. package/dist/skills/source/frontmatter.d.ts +9 -0
  927. package/dist/skills/source/frontmatter.d.ts.map +1 -0
  928. package/dist/skills/source/frontmatter.js +77 -0
  929. package/dist/skills/source/frontmatter.js.map +1 -0
  930. package/dist/skills/source/github-fetcher.d.ts +20 -0
  931. package/dist/skills/source/github-fetcher.d.ts.map +1 -0
  932. package/dist/skills/source/github-fetcher.js +296 -0
  933. package/dist/skills/source/github-fetcher.js.map +1 -0
  934. package/dist/skills/source/snapshot-validator.d.ts +28 -0
  935. package/dist/skills/source/snapshot-validator.d.ts.map +1 -0
  936. package/dist/skills/source/snapshot-validator.js +186 -0
  937. package/dist/skills/source/snapshot-validator.js.map +1 -0
  938. package/dist/skills/store.d.ts +180 -0
  939. package/dist/skills/store.d.ts.map +1 -0
  940. package/dist/skills/store.js +1712 -0
  941. package/dist/skills/store.js.map +1 -0
  942. package/dist/skills/types.d.ts +171 -0
  943. package/dist/skills/types.d.ts.map +1 -0
  944. package/dist/skills/types.js +2 -0
  945. package/dist/skills/types.js.map +1 -0
  946. package/dist/web/i18n.d.ts +184 -0
  947. package/dist/web/i18n.d.ts.map +1 -0
  948. package/dist/web/i18n.js +733 -0
  949. package/dist/web/i18n.js.map +1 -0
  950. package/dist/web/server.d.ts +16 -0
  951. package/dist/web/server.d.ts.map +1 -0
  952. package/dist/web/server.js +862 -0
  953. package/dist/web/server.js.map +1 -0
  954. package/dist/web/ui.d.ts +6 -0
  955. package/dist/web/ui.d.ts.map +1 -0
  956. package/dist/web/ui.js +1328 -0
  957. package/dist/web/ui.js.map +1 -0
  958. package/docs/README.ja.md +14 -0
  959. package/docs/README.md +16 -0
  960. package/docs/agent-file.md +72 -0
  961. package/docs/agent-gateway.md +104 -0
  962. package/docs/architecture.md +12 -0
  963. package/docs/cli-contract.md +39 -0
  964. package/docs/client-compatibility.md +299 -0
  965. package/docs/concepts.ja.md +25 -0
  966. package/docs/concepts.md +33 -0
  967. package/docs/database.md +11 -0
  968. package/docs/dsh-plugin.md +108 -0
  969. package/docs/enno-oduno.ja.md +22 -0
  970. package/docs/enno-oduno.md +35 -0
  971. package/docs/execution-ledger.md +89 -0
  972. package/docs/getting-started.ja.md +88 -0
  973. package/docs/getting-started.md +99 -0
  974. package/docs/release-notes-0.1.18.md +103 -0
  975. package/docs/retrieval-evaluation.md +10 -0
  976. package/docs/security-and-trust.ja.md +29 -0
  977. package/docs/security-and-trust.md +39 -0
  978. package/docs/security.md +11 -0
  979. package/docs/semantic-retrieval.ja.md +18 -0
  980. package/docs/semantic-retrieval.md +26 -0
  981. package/docs/sqlite-driver-adr.md +8 -0
  982. package/dsh/cordis.patch.yml +7 -0
  983. package/migrations/001_initial.sql +123 -0
  984. package/migrations/002_fts.sql +22 -0
  985. package/migrations/003_akinator.sql +30 -0
  986. package/migrations/004_agent_gateway.sql +261 -0
  987. package/migrations/005_hybrid_search.sql +40 -0
  988. package/migrations/006_context_v2.sql +4 -0
  989. package/migrations/007_akinator_reasoning.sql +59 -0
  990. package/migrations/008_federated_memory.sql +46 -0
  991. package/migrations/009_external_skill_discovery.sql +126 -0
  992. package/migrations/010_nudge_deliveries.sql +50 -0
  993. package/migrations/011_nudge_integrity.sql +52 -0
  994. package/migrations/012_context_delivery_v4.sql +3 -0
  995. package/migrations/013_enno_oduno.sql +176 -0
  996. package/migrations/014_oduno_reflection_phases.sql +40 -0
  997. package/migrations/015_skill_discovery_attempt_digests.sql +90 -0
  998. package/migrations/016_enno_advisory_rounds.sql +67 -0
  999. package/migrations/017_enno_advisory_protocol_v2.sql +101 -0
  1000. package/migrations/018_enno_repository_routing.sql +5 -0
  1001. package/migrations/019_enno_execution_integrity.sql +149 -0
  1002. package/migrations/020_cjk_fts.sql +80 -0
  1003. package/migrations/021_semantic_embeddings.sql +122 -0
  1004. package/migrations/022_embedding_setup_v2.sql +236 -0
  1005. package/migrations/023_enno_dsh_client.sql +291 -0
  1006. package/migrations/down/020_cjk_fts.sql +38 -0
  1007. package/migrations/down/021_semantic_embeddings.sql +17 -0
  1008. package/migrations/down/022_embedding_setup_v2.sql +133 -0
  1009. package/package.json +101 -0
  1010. package/skills/kiokuko-enno-oduno/SKILL.md +209 -0
  1011. package/skills/kiokuko-enno-oduno/enno-oduno.png +0 -0
  1012. package/skills/kiokuko-simple-work/SKILL.md +112 -0
  1013. package/skills/kiokuko-single-purpose-functions/SKILL.md +82 -0
  1014. package/skills/kiokuko-single-purpose-functions/references/boundaries-and-ownership.md +50 -0
  1015. package/skills/kiokuko-single-purpose-functions/references/domain-and-types.md +48 -0
  1016. package/skills/kiokuko-single-purpose-functions/references/effects-and-data.md +43 -0
  1017. package/skills/kiokuko-single-purpose-functions/references/kiokuko-patterns.md +344 -0
  1018. package/skills/kiokuko-single-purpose-functions/references/problem-shaping-and-language.md +84 -0
  1019. package/skills/kiokuko-single-purpose-functions/references/protocols-and-idempotency.md +42 -0
  1020. package/skills/kiokuko-single-purpose-functions/references/review-checklist.md +97 -0
  1021. package/skills/kiokuko-single-purpose-functions/references/verification.md +41 -0
  1022. package/skills/kiokuko-soul/SKILL.md +104 -0
  1023. package/skills/kiokuko-ui-design-soul/SKILL.md +73 -0
  1024. package/skills/kiokuko-ui-design-soul/references/accessibility-and-navigation.md +31 -0
  1025. package/skills/kiokuko-ui-design-soul/references/async-recovery.md +49 -0
  1026. package/skills/kiokuko-ui-design-soul/references/forms-and-controls.md +35 -0
  1027. package/skills/kiokuko-ui-design-soul/references/interaction-feedback.md +34 -0
  1028. package/skills/kiokuko-ui-design-soul/references/responsive-and-platform.md +38 -0
  1029. package/skills/kiokuko-ui-design-soul/references/safety-and-review.md +39 -0
  1030. package/skills/kiokuko-ui-design-soul/references/ui-checklist.md +71 -0
  1031. package/skills/memory-reasoning/SKILL.md +52 -0
  1032. package/templates/AGENTS.md +46 -0
@@ -0,0 +1,1261 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { isSqliteCorruptionError, isSqliteUniqueConstraintError } from '../db/sqlite-retry.js';
3
+ import { withImmediateTransaction } from '../db/transaction.js';
4
+ import { KiokukoError } from '../errors.js';
5
+ import { findSecret } from '../memory/secrets.js';
6
+ import { canonicalJson, compareCanonicalStrings, requireWorkspace } from '../serialization/validate.js';
7
+ import { hashLedgerEvent, GENESIS_HASH } from './hash.js';
8
+ import { entryOriginMatchesWorkspace, isContextEntryOrigin } from '../context/origin.js';
9
+ import { DEFAULT_NUDGE_RATE_LIMIT, NUDGE_CODES, NUDGE_POLICY_VERSION, NUDGE_PRIORITY } from '../context/nudges.js';
10
+ import { parseStoredNudgeDelivery, validateStoredNudgeHistory } from '../context/nudge-validation.js';
11
+ import { CAPTURE_PROFILES, COVERAGE_LEVELS, LEDGER_EVENT_TYPES, RUN_STATUSES, TERMINAL_RUN_STATUSES, } from './types.js';
12
+ export const LEDGER_ARCHIVE_FORMAT = 'kiokuko-ledger-jsonl';
13
+ export const LEDGER_ARCHIVE_API_VERSION = '1';
14
+ export const LEDGER_ARCHIVE_VERSION = 3;
15
+ const LEGACY_LEDGER_ARCHIVE_VERSION = 2;
16
+ const SUPPORTED_LEDGER_ARCHIVE_VERSIONS = new Set([LEGACY_LEDGER_ARCHIVE_VERSION, LEDGER_ARCHIVE_VERSION]);
17
+ export const MAX_ARCHIVE_LINE_COUNT = 10_000;
18
+ export const MAX_ARCHIVE_LINE_BYTES = 512 * 1024;
19
+ export const MAX_ARCHIVE_TOTAL_BYTES = 64 * 1024 * 1024;
20
+ const COMMENT_MAX_BYTES = 4 * 1024;
21
+ const IDENTIFIER_MAX_LENGTH = 256;
22
+ const TEXT_MAX_LENGTH = 16 * 1024;
23
+ const TIMESTAMP_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
24
+ const HASH_PATTERN = /^[0-9a-f]{64}$/;
25
+ const PROFILE_FIELDS = new Set(['taskType', 'target', 'expected', 'constraints']);
26
+ const PROFILE_SOURCES = new Set(['inferred', 'client_supplied', 'user_answer']);
27
+ const TASK_TYPES = new Set(['build', 'debug', 'research', 'review', 'devops', 'writing', 'analysis']);
28
+ const REDACTION_KINDS = new Set([
29
+ 'sensitive_key', 'secret_pattern', 'url', 'home_path', 'preview_truncated', 'environment_value', 'hidden_reasoning',
30
+ ]);
31
+ const CONTEXT_FEEDBACK_VERDICTS = new Set(['helpful', 'irrelevant', 'stale', 'conflicting']);
32
+ const RECOMMENDATION_VERDICTS = new Set(['accepted', 'dismissed', 'resolved']);
33
+ const EVIDENCE_KINDS = new Set(['command', 'test', 'file', 'diff', 'url', 'artifact']);
34
+ const PURGE_TARGET_TYPES = new Set(['run', 'event', 'evidence', 'delivery', 'feedback', 'memory_link']);
35
+ const EMPTY_COUNTS = {
36
+ runs: 0,
37
+ sessions: 0,
38
+ answers: 0,
39
+ runIntakes: 0,
40
+ intakeFeedback: 0,
41
+ events: 0,
42
+ evidence: 0,
43
+ deliveries: 0,
44
+ deliveryEntries: 0,
45
+ nudgeDeliveries: 0,
46
+ contextFeedback: 0,
47
+ runFeedback: 0,
48
+ memoryLinks: 0,
49
+ purgeAudit: 0,
50
+ };
51
+ const RECORD_FIELDS = {
52
+ checksum: ['type', 'sha256'],
53
+ manifest: ['type', 'apiVersion', 'archiveVersion', 'format', 'workspace', 'counts'],
54
+ runs: [
55
+ 'type', 'run_id', 'workspace', 'client_kind', 'client_version', 'source_session_id', 'parent_run_id',
56
+ 'protocol_version', 'capture_profile', 'coverage_json', 'status', 'title', 'task_hash', 'metadata_json',
57
+ 'last_sequence', 'last_source_sequence', 'started_at', 'ended_at', 'created_at', 'updated_at',
58
+ ],
59
+ sessions: ['type', 'id', 'workspace', 'task_text', 'profile_json', 'status', 'question_count', 'created_at', 'updated_at'],
60
+ answers: ['type', 'session_id', 'question_id', 'answer_json', 'created_at'],
61
+ runIntakes: [
62
+ 'type', 'run_id', 'session_id', 'policy_version', 'profile_schema_version', 'profile_sources_json',
63
+ 'initial_profile_hash', 'recommended_tags_json', 'linked_at', 'finalized_at',
64
+ ],
65
+ intakeFeedback: [
66
+ 'type', 'feedback_id', 'run_id', 'session_id', 'question_id', 'profile_field', 'verdict', 'comment',
67
+ 'actor', 'idempotency_key', 'created_at',
68
+ ],
69
+ events: [
70
+ 'type', 'event_id', 'run_id', 'sequence', 'source_event_id', 'source_sequence', 'event_type', 'source_type',
71
+ 'actor', 'outcome', 'occurred_at', 'ingested_at', 'payload_json', 'redaction_json', 'previous_hash', 'event_hash',
72
+ ],
73
+ evidence: [
74
+ 'type', 'evidence_id', 'run_id', 'event_id', 'kind', 'locator', 'digest_algorithm', 'digest', 'byte_size', 'summary', 'created_at',
75
+ ],
76
+ deliveries: [
77
+ 'type', 'delivery_id', 'run_id', 'through_sequence', 'intake_session_id', 'task_profile_hash', 'query_hash',
78
+ 'policy_version', 'score_schema_version', 'char_budget', 'char_count', 'truncated', 'created_at',
79
+ ],
80
+ deliveryEntries: ['type', 'delivery_id', 'entry_id', 'entry_revision', 'rank', 'score_components_json', 'selection_reason_json', 'origin_scope'],
81
+ nudgeDeliveries: [
82
+ 'type', 'id', 'run_id', 'policy_version', 'code', 'occurrence_id', 'checkpoint_id',
83
+ 'through_sequence', 'priority', 'evidence_event_ids_json', 'reference_ids_json', 'delivered_at',
84
+ ],
85
+ contextFeedback: ['type', 'feedback_id', 'delivery_id', 'entry_id', 'run_id', 'verdict', 'comment', 'actor', 'idempotency_key', 'created_at'],
86
+ runFeedback: [
87
+ 'type', 'feedback_id', 'run_id', 'outcome', 'recommendation_code', 'recommendation_verdict', 'rating', 'comment',
88
+ 'actor', 'idempotency_key', 'created_at',
89
+ ],
90
+ memoryLinks: ['type', 'link_id', 'run_id', 'event_id', 'delivery_id', 'entry_id', 'created_at'],
91
+ purgeAudit: [
92
+ 'type', 'purge_id', 'run_id', 'event_id', 'delivery_id', 'entry_id', 'target_type', 'target_id', 'actor', 'reason', 'created_at',
93
+ ],
94
+ };
95
+ const TABLE_FIELDS = {
96
+ runs: RECORD_FIELDS.runs.slice(1),
97
+ sessions: RECORD_FIELDS.sessions.slice(1),
98
+ answers: RECORD_FIELDS.answers.slice(1),
99
+ runIntakes: RECORD_FIELDS.runIntakes.slice(1),
100
+ intakeFeedback: RECORD_FIELDS.intakeFeedback.slice(1),
101
+ events: RECORD_FIELDS.events.slice(1),
102
+ evidence: RECORD_FIELDS.evidence.slice(1),
103
+ deliveries: RECORD_FIELDS.deliveries.slice(1),
104
+ deliveryEntries: RECORD_FIELDS.deliveryEntries.slice(1),
105
+ nudgeDeliveries: RECORD_FIELDS.nudgeDeliveries.slice(1),
106
+ contextFeedback: RECORD_FIELDS.contextFeedback.slice(1),
107
+ runFeedback: RECORD_FIELDS.runFeedback.slice(1),
108
+ memoryLinks: RECORD_FIELDS.memoryLinks.slice(1),
109
+ purgeAudit: RECORD_FIELDS.purgeAudit.slice(1),
110
+ };
111
+ const TABLE_NAMES = {
112
+ runs: 'ledger_runs',
113
+ sessions: 'akinator_sessions',
114
+ answers: 'akinator_answers',
115
+ runIntakes: 'run_intakes',
116
+ intakeFeedback: 'intake_feedback',
117
+ events: 'ledger_events',
118
+ evidence: 'ledger_evidence',
119
+ deliveries: 'context_deliveries',
120
+ deliveryEntries: 'context_delivery_entries',
121
+ nudgeDeliveries: 'nudge_deliveries',
122
+ contextFeedback: 'context_feedback',
123
+ runFeedback: 'run_feedback',
124
+ memoryLinks: 'ledger_memory_links',
125
+ purgeAudit: 'ledger_purge_audit',
126
+ };
127
+ const UNIQUE_CONSTRAINT_TARGETS = {
128
+ runs: ['ledger_runs.run_id'],
129
+ sessions: ['akinator_sessions.id'],
130
+ answers: ['akinator_answers.session_id, akinator_answers.question_id'],
131
+ runIntakes: ['run_intakes.run_id', 'run_intakes.session_id'],
132
+ intakeFeedback: ['intake_feedback.feedback_id', 'intake_feedback.run_id, intake_feedback.actor, intake_feedback.idempotency_key'],
133
+ events: ['ledger_events.event_id', 'ledger_events.run_id, ledger_events.sequence', 'ledger_events.run_id, ledger_events.source_event_id'],
134
+ evidence: ['ledger_evidence.evidence_id'],
135
+ deliveries: ['context_deliveries.delivery_id'],
136
+ deliveryEntries: ['context_delivery_entries.delivery_id, context_delivery_entries.entry_id'],
137
+ nudgeDeliveries: [
138
+ 'nudge_deliveries.id',
139
+ 'nudge_deliveries.run_id, nudge_deliveries.policy_version, nudge_deliveries.occurrence_id',
140
+ 'nudge_deliveries.run_id, nudge_deliveries.policy_version, nudge_deliveries.checkpoint_id',
141
+ ],
142
+ contextFeedback: ['context_feedback.feedback_id', 'context_feedback.run_id, context_feedback.actor, context_feedback.idempotency_key'],
143
+ runFeedback: ['run_feedback.feedback_id', 'run_feedback.run_id, run_feedback.actor, run_feedback.idempotency_key'],
144
+ memoryLinks: ['ledger_memory_links.link_id'],
145
+ purgeAudit: ['ledger_purge_audit.purge_id'],
146
+ };
147
+ const RECORD_NAMES = {
148
+ runs: 'run',
149
+ sessions: 'session',
150
+ answers: 'answer',
151
+ runIntakes: 'run_intake',
152
+ intakeFeedback: 'intake_feedback',
153
+ events: 'event',
154
+ evidence: 'evidence',
155
+ deliveries: 'delivery',
156
+ deliveryEntries: 'delivery_entry',
157
+ nudgeDeliveries: 'nudge_delivery',
158
+ contextFeedback: 'context_feedback',
159
+ runFeedback: 'run_feedback',
160
+ memoryLinks: 'memory_link',
161
+ purgeAudit: 'purge_audit',
162
+ };
163
+ const RECORD_TYPES = new Map(Object.entries(RECORD_NAMES).map(([key, value]) => [value, key]));
164
+ function fail(code, message, details = {}) {
165
+ throw new KiokukoError(code, message, details);
166
+ }
167
+ function validation() {
168
+ return fail('VALIDATION_ERROR', 'Ledger archive validation failed');
169
+ }
170
+ function integrity() {
171
+ return fail('INTEGRITY_ERROR', 'Ledger archive integrity validation failed');
172
+ }
173
+ function conflict() {
174
+ return fail('CONFLICT', 'Ledger archive conflicts with existing data');
175
+ }
176
+ function notFound() {
177
+ return fail('NOT_FOUND', 'Ledger archive reference was not found');
178
+ }
179
+ function databaseFailure() {
180
+ return fail('DATABASE_ERROR', 'Ledger archive database operation failed');
181
+ }
182
+ function canonicalIntegrityFailure(error) {
183
+ if (error instanceof KiokukoError && error.code === 'VALIDATION_ERROR')
184
+ integrity();
185
+ throw error;
186
+ }
187
+ function isObject(value) {
188
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
189
+ return false;
190
+ const prototype = Object.getPrototypeOf(value);
191
+ return prototype === Object.prototype || prototype === null;
192
+ }
193
+ function assertObject(value) {
194
+ if (!isObject(value))
195
+ validation();
196
+ }
197
+ function assertFields(value, fields) {
198
+ const allowed = new Set(fields);
199
+ if (Object.keys(value).length !== fields.length || Object.keys(value).some((field) => !allowed.has(field)))
200
+ validation();
201
+ }
202
+ function stringValue(value, nonEmpty = true, maximum = TEXT_MAX_LENGTH) {
203
+ if (typeof value !== 'string' || (nonEmpty && value.length === 0) || value.length > maximum || value.includes('\u0000'))
204
+ validation();
205
+ return value;
206
+ }
207
+ function nullableString(value, maximum = TEXT_MAX_LENGTH) {
208
+ if (value === null)
209
+ return null;
210
+ return stringValue(value, true, maximum);
211
+ }
212
+ function integerValue(value, minimum = 0) {
213
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < minimum)
214
+ validation();
215
+ return value;
216
+ }
217
+ function nullableInteger(value, minimum = 0) {
218
+ if (value === null)
219
+ return null;
220
+ return integerValue(value, minimum);
221
+ }
222
+ function timestampValue(value, nullable = false) {
223
+ if (nullable && value === null)
224
+ return null;
225
+ if (typeof value !== 'string' || !TIMESTAMP_PATTERN.test(value))
226
+ validation();
227
+ const date = new Date(value);
228
+ if (Number.isNaN(date.getTime()) || date.toISOString() !== value)
229
+ validation();
230
+ return value;
231
+ }
232
+ function hashValue(value, nullable = false) {
233
+ if (nullable && value === null)
234
+ return null;
235
+ if (typeof value !== 'string' || !HASH_PATTERN.test(value))
236
+ validation();
237
+ return value;
238
+ }
239
+ function enumValue(value, allowed) {
240
+ if (typeof value !== 'string' || !allowed.has(value))
241
+ validation();
242
+ return value;
243
+ }
244
+ function parsedJson(value, validator) {
245
+ if (typeof value !== 'string')
246
+ integrity();
247
+ let parsed;
248
+ try {
249
+ parsed = JSON.parse(value);
250
+ }
251
+ catch (error) {
252
+ if (error instanceof SyntaxError)
253
+ integrity();
254
+ throw error;
255
+ }
256
+ let canonical;
257
+ try {
258
+ canonical = canonicalJson(parsed);
259
+ }
260
+ catch (error) {
261
+ canonicalIntegrityFailure(error);
262
+ }
263
+ if (canonical !== value)
264
+ integrity();
265
+ validator(parsed);
266
+ return value;
267
+ }
268
+ function anyJson(value) {
269
+ try {
270
+ canonicalJson(value);
271
+ }
272
+ catch (error) {
273
+ canonicalIntegrityFailure(error);
274
+ }
275
+ }
276
+ function objectJson(value) {
277
+ if (!isObject(value))
278
+ integrity();
279
+ anyJson(value);
280
+ }
281
+ function coverageJson(value) {
282
+ if (!isObject(value))
283
+ integrity();
284
+ const fields = ['run', 'tool', 'command', 'file', 'approval'];
285
+ if (Object.keys(value).length !== fields.length || fields.some((field) => typeof value[field] !== 'string' || !COVERAGE_LEVELS.includes(value[field])))
286
+ integrity();
287
+ }
288
+ function metadataJson(value) {
289
+ objectJson(value);
290
+ }
291
+ function profileJson(value) {
292
+ if (!isObject(value) || Object.keys(value).length !== 4 || [...PROFILE_FIELDS].some((field) => !Object.hasOwn(value, field)))
293
+ integrity();
294
+ if (value.taskType !== null && (typeof value.taskType !== 'string' || !TASK_TYPES.has(value.taskType)))
295
+ integrity();
296
+ for (const field of ['target', 'expected', 'constraints']) {
297
+ if (value[field] !== null && typeof value[field] !== 'string')
298
+ integrity();
299
+ }
300
+ }
301
+ function answerJson(value) {
302
+ anyJson(value);
303
+ }
304
+ function profileSourcesJson(value) {
305
+ if (!isObject(value))
306
+ integrity();
307
+ for (const [field, source] of Object.entries(value)) {
308
+ if (!PROFILE_FIELDS.has(field) || typeof source !== 'string' || !PROFILE_SOURCES.has(source))
309
+ integrity();
310
+ }
311
+ }
312
+ function tagsJson(value) {
313
+ if (!Array.isArray(value))
314
+ integrity();
315
+ const seen = new Set();
316
+ for (const tag of value) {
317
+ if (typeof tag !== 'string' || tag.trim().length === 0 || tag.length > 200 || seen.has(tag))
318
+ integrity();
319
+ seen.add(tag);
320
+ }
321
+ }
322
+ function nudgeIdListJson(value) {
323
+ if (!Array.isArray(value) || value.length > 16)
324
+ integrity();
325
+ const seen = new Set();
326
+ for (const item of value) {
327
+ const id = stringValue(item, true, IDENTIFIER_MAX_LENGTH);
328
+ if (seen.has(id))
329
+ integrity();
330
+ seen.add(id);
331
+ }
332
+ for (let index = 1; index < value.length; index += 1) {
333
+ if (compareCanonicalStrings(String(value[index - 1]), String(value[index])) > 0)
334
+ integrity();
335
+ }
336
+ }
337
+ function redactionJson(value) {
338
+ if (!Array.isArray(value))
339
+ integrity();
340
+ for (const item of value) {
341
+ if (!isObject(item) || Object.keys(item).length !== 2 || typeof item.path !== 'string' || item.path.length === 0 || typeof item.kind !== 'string' || !REDACTION_KINDS.has(item.kind))
342
+ integrity();
343
+ }
344
+ }
345
+ function scoreJson(value) {
346
+ objectJson(value);
347
+ }
348
+ function commentValue(value) {
349
+ const result = nullableString(value, TEXT_MAX_LENGTH);
350
+ if (result !== null && Buffer.byteLength(result, 'utf8') > COMMENT_MAX_BYTES)
351
+ integrity();
352
+ return result;
353
+ }
354
+ function secretScan(record) {
355
+ let serialized;
356
+ try {
357
+ serialized = canonicalJson(record);
358
+ }
359
+ catch (error) {
360
+ canonicalIntegrityFailure(error);
361
+ }
362
+ const finding = findSecret(serialized);
363
+ if (finding)
364
+ fail('SECURITY_REJECTION', 'Ledger archive contains secret residue', { kind: finding.kind });
365
+ }
366
+ function normalizeRecord(type, source, workspace, importing) {
367
+ const raw = { type, ...source };
368
+ assertObject(raw);
369
+ assertFields(raw, RECORD_FIELDS[type]);
370
+ const normalized = { type };
371
+ switch (type) {
372
+ case 'runs': {
373
+ if (stringValue(raw.workspace) !== workspace)
374
+ validation();
375
+ normalized.run_id = stringValue(raw.run_id, true, IDENTIFIER_MAX_LENGTH);
376
+ normalized.workspace = workspace;
377
+ normalized.client_kind = stringValue(raw.client_kind, true, IDENTIFIER_MAX_LENGTH);
378
+ normalized.client_version = nullableString(raw.client_version, IDENTIFIER_MAX_LENGTH);
379
+ normalized.source_session_id = nullableString(raw.source_session_id, IDENTIFIER_MAX_LENGTH);
380
+ normalized.parent_run_id = nullableString(raw.parent_run_id, IDENTIFIER_MAX_LENGTH);
381
+ normalized.protocol_version = stringValue(raw.protocol_version, true, 32);
382
+ normalized.capture_profile = enumValue(raw.capture_profile, new Set(CAPTURE_PROFILES));
383
+ normalized.coverage_json = parsedJson(raw.coverage_json, coverageJson);
384
+ normalized.status = enumValue(raw.status, new Set(RUN_STATUSES));
385
+ normalized.title = nullableString(raw.title);
386
+ normalized.task_hash = hashValue(raw.task_hash, true);
387
+ normalized.metadata_json = parsedJson(raw.metadata_json, metadataJson);
388
+ normalized.last_sequence = integerValue(raw.last_sequence);
389
+ normalized.last_source_sequence = nullableInteger(raw.last_source_sequence);
390
+ normalized.started_at = timestampValue(raw.started_at);
391
+ normalized.ended_at = timestampValue(raw.ended_at, true);
392
+ normalized.created_at = timestampValue(raw.created_at);
393
+ normalized.updated_at = timestampValue(raw.updated_at);
394
+ if (normalized.protocol_version !== '1')
395
+ validation();
396
+ const terminal = TERMINAL_RUN_STATUSES.includes(normalized.status);
397
+ if (terminal !== (normalized.ended_at !== null))
398
+ integrity();
399
+ break;
400
+ }
401
+ case 'sessions':
402
+ if (stringValue(raw.workspace) !== workspace)
403
+ validation();
404
+ normalized.id = stringValue(raw.id, true, IDENTIFIER_MAX_LENGTH);
405
+ normalized.workspace = workspace;
406
+ normalized.task_text = stringValue(raw.task_text);
407
+ normalized.profile_json = parsedJson(raw.profile_json, profileJson);
408
+ normalized.status = enumValue(raw.status, new Set(['active', 'ready', 'exhausted']));
409
+ const questionCount = integerValue(raw.question_count);
410
+ normalized.question_count = questionCount;
411
+ if (questionCount > 3)
412
+ integrity();
413
+ normalized.created_at = timestampValue(raw.created_at);
414
+ normalized.updated_at = timestampValue(raw.updated_at);
415
+ break;
416
+ case 'answers':
417
+ normalized.session_id = stringValue(raw.session_id, true, IDENTIFIER_MAX_LENGTH);
418
+ normalized.question_id = enumValue(raw.question_id, PROFILE_FIELDS);
419
+ normalized.answer_json = parsedJson(raw.answer_json, answerJson);
420
+ normalized.created_at = timestampValue(raw.created_at);
421
+ break;
422
+ case 'runIntakes':
423
+ normalized.run_id = stringValue(raw.run_id, true, IDENTIFIER_MAX_LENGTH);
424
+ normalized.session_id = stringValue(raw.session_id, true, IDENTIFIER_MAX_LENGTH);
425
+ normalized.policy_version = stringValue(raw.policy_version, true, IDENTIFIER_MAX_LENGTH);
426
+ normalized.profile_schema_version = integerValue(raw.profile_schema_version, 1);
427
+ normalized.profile_sources_json = parsedJson(raw.profile_sources_json, profileSourcesJson);
428
+ normalized.initial_profile_hash = hashValue(raw.initial_profile_hash, true);
429
+ normalized.recommended_tags_json = parsedJson(raw.recommended_tags_json, tagsJson);
430
+ normalized.linked_at = timestampValue(raw.linked_at);
431
+ normalized.finalized_at = timestampValue(raw.finalized_at, true);
432
+ if (normalized.finalized_at !== null && normalized.initial_profile_hash === null)
433
+ integrity();
434
+ break;
435
+ case 'intakeFeedback':
436
+ normalized.feedback_id = stringValue(raw.feedback_id, true, IDENTIFIER_MAX_LENGTH);
437
+ normalized.run_id = stringValue(raw.run_id, true, IDENTIFIER_MAX_LENGTH);
438
+ normalized.session_id = stringValue(raw.session_id, true, IDENTIFIER_MAX_LENGTH);
439
+ normalized.question_id = nullableString(raw.question_id, IDENTIFIER_MAX_LENGTH);
440
+ normalized.profile_field = nullableString(raw.profile_field, IDENTIFIER_MAX_LENGTH);
441
+ if ((normalized.question_id === null) === (normalized.profile_field === null))
442
+ validation();
443
+ if (normalized.question_id !== null)
444
+ enumValue(normalized.question_id, PROFILE_FIELDS);
445
+ if (normalized.profile_field !== null)
446
+ enumValue(normalized.profile_field, PROFILE_FIELDS);
447
+ normalized.verdict = enumValue(raw.verdict, new Set(['helpful', 'unnecessary', 'corrected']));
448
+ normalized.comment = commentValue(raw.comment);
449
+ normalized.actor = stringValue(raw.actor, true, IDENTIFIER_MAX_LENGTH);
450
+ normalized.idempotency_key = hashValue(raw.idempotency_key);
451
+ normalized.created_at = timestampValue(raw.created_at);
452
+ break;
453
+ case 'events':
454
+ normalized.event_id = stringValue(raw.event_id, true, IDENTIFIER_MAX_LENGTH);
455
+ normalized.run_id = stringValue(raw.run_id, true, IDENTIFIER_MAX_LENGTH);
456
+ normalized.sequence = integerValue(raw.sequence, 1);
457
+ normalized.source_event_id = nullableString(raw.source_event_id, IDENTIFIER_MAX_LENGTH);
458
+ normalized.source_sequence = nullableInteger(raw.source_sequence);
459
+ normalized.event_type = enumValue(raw.event_type, new Set(LEDGER_EVENT_TYPES));
460
+ normalized.source_type = nullableString(raw.source_type, IDENTIFIER_MAX_LENGTH);
461
+ normalized.actor = stringValue(raw.actor, true, IDENTIFIER_MAX_LENGTH);
462
+ normalized.outcome = nullableString(raw.outcome);
463
+ normalized.occurred_at = timestampValue(raw.occurred_at, true);
464
+ normalized.ingested_at = timestampValue(raw.ingested_at);
465
+ normalized.payload_json = parsedJson(raw.payload_json, answerJson);
466
+ normalized.redaction_json = parsedJson(raw.redaction_json, redactionJson);
467
+ normalized.previous_hash = hashValue(raw.previous_hash);
468
+ normalized.event_hash = hashValue(raw.event_hash);
469
+ break;
470
+ case 'evidence':
471
+ normalized.evidence_id = stringValue(raw.evidence_id, true, IDENTIFIER_MAX_LENGTH);
472
+ normalized.run_id = stringValue(raw.run_id, true, IDENTIFIER_MAX_LENGTH);
473
+ normalized.event_id = nullableString(raw.event_id, IDENTIFIER_MAX_LENGTH);
474
+ normalized.kind = enumValue(raw.kind, EVIDENCE_KINDS);
475
+ normalized.locator = stringValue(raw.locator);
476
+ normalized.digest_algorithm = nullableString(raw.digest_algorithm, IDENTIFIER_MAX_LENGTH);
477
+ normalized.digest = nullableString(raw.digest, IDENTIFIER_MAX_LENGTH);
478
+ normalized.byte_size = nullableInteger(raw.byte_size);
479
+ normalized.summary = nullableString(raw.summary);
480
+ normalized.created_at = timestampValue(raw.created_at);
481
+ break;
482
+ case 'deliveries':
483
+ normalized.delivery_id = stringValue(raw.delivery_id, true, IDENTIFIER_MAX_LENGTH);
484
+ normalized.run_id = stringValue(raw.run_id, true, IDENTIFIER_MAX_LENGTH);
485
+ normalized.through_sequence = integerValue(raw.through_sequence);
486
+ normalized.intake_session_id = nullableString(raw.intake_session_id, IDENTIFIER_MAX_LENGTH);
487
+ normalized.task_profile_hash = hashValue(raw.task_profile_hash);
488
+ normalized.query_hash = hashValue(raw.query_hash);
489
+ normalized.policy_version = stringValue(raw.policy_version, true, IDENTIFIER_MAX_LENGTH);
490
+ const scoreSchemaVersion = integerValue(raw.score_schema_version, 1);
491
+ if (scoreSchemaVersion !== 1 && scoreSchemaVersion !== 2)
492
+ integrity();
493
+ normalized.score_schema_version = scoreSchemaVersion;
494
+ normalized.char_budget = integerValue(raw.char_budget);
495
+ normalized.char_count = integerValue(raw.char_count);
496
+ const truncated = integerValue(raw.truncated);
497
+ const charCount = Number(normalized.char_count);
498
+ const charBudget = Number(normalized.char_budget);
499
+ normalized.truncated = truncated;
500
+ if (truncated > 1 || charCount > charBudget)
501
+ integrity();
502
+ normalized.created_at = timestampValue(raw.created_at);
503
+ break;
504
+ case 'deliveryEntries':
505
+ normalized.delivery_id = stringValue(raw.delivery_id, true, IDENTIFIER_MAX_LENGTH);
506
+ normalized.entry_id = stringValue(raw.entry_id, true, IDENTIFIER_MAX_LENGTH);
507
+ normalized.entry_revision = integerValue(raw.entry_revision, 1);
508
+ normalized.rank = integerValue(raw.rank, 1);
509
+ normalized.score_components_json = parsedJson(raw.score_components_json, scoreJson);
510
+ normalized.selection_reason_json = parsedJson(raw.selection_reason_json, tagsJson);
511
+ normalized.origin_scope = enumValue(raw.origin_scope, new Set(['project', 'ecosystem', 'global']));
512
+ break;
513
+ case 'nudgeDeliveries':
514
+ normalized.id = stringValue(raw.id, true, IDENTIFIER_MAX_LENGTH);
515
+ normalized.run_id = stringValue(raw.run_id, true, IDENTIFIER_MAX_LENGTH);
516
+ normalized.policy_version = stringValue(raw.policy_version, true, IDENTIFIER_MAX_LENGTH);
517
+ if (normalized.policy_version !== NUDGE_POLICY_VERSION)
518
+ validation();
519
+ const nudgeCode = enumValue(raw.code, new Set(NUDGE_CODES));
520
+ normalized.code = nudgeCode;
521
+ normalized.occurrence_id = stringValue(raw.occurrence_id, true, IDENTIFIER_MAX_LENGTH);
522
+ normalized.checkpoint_id = stringValue(raw.checkpoint_id, true, IDENTIFIER_MAX_LENGTH);
523
+ normalized.through_sequence = integerValue(raw.through_sequence);
524
+ normalized.priority = integerValue(raw.priority, 1);
525
+ if (normalized.priority !== NUDGE_PRIORITY[nudgeCode])
526
+ integrity();
527
+ normalized.evidence_event_ids_json = parsedJson(raw.evidence_event_ids_json, nudgeIdListJson);
528
+ normalized.reference_ids_json = parsedJson(raw.reference_ids_json, nudgeIdListJson);
529
+ normalized.delivered_at = timestampValue(raw.delivered_at);
530
+ break;
531
+ case 'contextFeedback':
532
+ normalized.feedback_id = stringValue(raw.feedback_id, true, IDENTIFIER_MAX_LENGTH);
533
+ normalized.delivery_id = stringValue(raw.delivery_id, true, IDENTIFIER_MAX_LENGTH);
534
+ normalized.entry_id = stringValue(raw.entry_id, true, IDENTIFIER_MAX_LENGTH);
535
+ normalized.run_id = stringValue(raw.run_id, true, IDENTIFIER_MAX_LENGTH);
536
+ normalized.verdict = enumValue(raw.verdict, CONTEXT_FEEDBACK_VERDICTS);
537
+ normalized.comment = commentValue(raw.comment);
538
+ normalized.actor = stringValue(raw.actor, true, IDENTIFIER_MAX_LENGTH);
539
+ normalized.idempotency_key = hashValue(raw.idempotency_key);
540
+ normalized.created_at = timestampValue(raw.created_at);
541
+ break;
542
+ case 'runFeedback':
543
+ normalized.feedback_id = stringValue(raw.feedback_id, true, IDENTIFIER_MAX_LENGTH);
544
+ normalized.run_id = stringValue(raw.run_id, true, IDENTIFIER_MAX_LENGTH);
545
+ normalized.outcome = nullableString(raw.outcome);
546
+ normalized.recommendation_code = nullableString(raw.recommendation_code, IDENTIFIER_MAX_LENGTH);
547
+ normalized.recommendation_verdict = raw.recommendation_verdict === null ? null : enumValue(raw.recommendation_verdict, RECOMMENDATION_VERDICTS);
548
+ const rating = nullableInteger(raw.rating, 1);
549
+ normalized.rating = rating;
550
+ if (rating !== null && rating > 5)
551
+ integrity();
552
+ normalized.comment = commentValue(raw.comment);
553
+ normalized.actor = stringValue(raw.actor, true, IDENTIFIER_MAX_LENGTH);
554
+ normalized.idempotency_key = hashValue(raw.idempotency_key);
555
+ normalized.created_at = timestampValue(raw.created_at);
556
+ if (normalized.recommendation_code === null !== (normalized.recommendation_verdict === null))
557
+ integrity();
558
+ if (normalized.outcome === null && normalized.recommendation_code === null && normalized.rating === null)
559
+ integrity();
560
+ break;
561
+ case 'memoryLinks':
562
+ normalized.link_id = stringValue(raw.link_id, true, IDENTIFIER_MAX_LENGTH);
563
+ normalized.run_id = stringValue(raw.run_id, true, IDENTIFIER_MAX_LENGTH);
564
+ normalized.event_id = nullableString(raw.event_id, IDENTIFIER_MAX_LENGTH);
565
+ normalized.delivery_id = nullableString(raw.delivery_id, IDENTIFIER_MAX_LENGTH);
566
+ normalized.entry_id = stringValue(raw.entry_id, true, IDENTIFIER_MAX_LENGTH);
567
+ normalized.created_at = timestampValue(raw.created_at);
568
+ if (normalized.event_id === null && normalized.delivery_id === null)
569
+ integrity();
570
+ break;
571
+ case 'purgeAudit':
572
+ normalized.purge_id = stringValue(raw.purge_id, true, IDENTIFIER_MAX_LENGTH);
573
+ normalized.run_id = nullableString(raw.run_id, IDENTIFIER_MAX_LENGTH);
574
+ normalized.event_id = nullableString(raw.event_id, IDENTIFIER_MAX_LENGTH);
575
+ normalized.delivery_id = nullableString(raw.delivery_id, IDENTIFIER_MAX_LENGTH);
576
+ normalized.entry_id = nullableString(raw.entry_id, IDENTIFIER_MAX_LENGTH);
577
+ normalized.target_type = enumValue(raw.target_type, PURGE_TARGET_TYPES);
578
+ normalized.target_id = stringValue(raw.target_id, true, IDENTIFIER_MAX_LENGTH);
579
+ normalized.actor = stringValue(raw.actor, true, IDENTIFIER_MAX_LENGTH);
580
+ normalized.reason = nullableString(raw.reason);
581
+ normalized.created_at = timestampValue(raw.created_at);
582
+ break;
583
+ }
584
+ const result = normalized;
585
+ if (!importing)
586
+ secretScan(result);
587
+ return result;
588
+ }
589
+ function rows(database, sql, ...parameters) {
590
+ try {
591
+ return database.prepare(sql).all(...parameters);
592
+ }
593
+ catch (error) {
594
+ if (isSqliteCorruptionError(error))
595
+ integrity();
596
+ throw error;
597
+ }
598
+ }
599
+ function queryRows(database, type, workspace) {
600
+ const fields = TABLE_FIELDS[type].join(', ');
601
+ const scoped = {
602
+ runs: { sql: `SELECT ${fields} FROM ledger_runs WHERE workspace = ? ORDER BY run_id ASC`, parameters: [workspace] },
603
+ sessions: { sql: `SELECT s.${TABLE_FIELDS.sessions.join(', s.')} FROM akinator_sessions AS s JOIN run_intakes AS ri ON ri.session_id = s.id JOIN ledger_runs AS lr ON lr.run_id = ri.run_id WHERE lr.workspace = ? ORDER BY s.id ASC`, parameters: [workspace] },
604
+ answers: { sql: `SELECT a.${TABLE_FIELDS.answers.join(', a.')} FROM akinator_answers AS a JOIN akinator_sessions AS s ON s.id = a.session_id JOIN run_intakes AS ri ON ri.session_id = s.id JOIN ledger_runs AS lr ON lr.run_id = ri.run_id WHERE lr.workspace = ? ORDER BY a.session_id ASC, a.question_id ASC`, parameters: [workspace] },
605
+ runIntakes: { sql: `SELECT ri.${TABLE_FIELDS.runIntakes.join(', ri.')} FROM run_intakes AS ri JOIN ledger_runs AS lr ON lr.run_id = ri.run_id WHERE lr.workspace = ? ORDER BY ri.run_id ASC`, parameters: [workspace] },
606
+ intakeFeedback: { sql: `SELECT f.${TABLE_FIELDS.intakeFeedback.join(', f.')} FROM intake_feedback AS f JOIN ledger_runs AS lr ON lr.run_id = f.run_id WHERE lr.workspace = ? ORDER BY f.feedback_id ASC`, parameters: [workspace] },
607
+ events: { sql: `SELECT e.${TABLE_FIELDS.events.join(', e.')} FROM ledger_events AS e JOIN ledger_runs AS lr ON lr.run_id = e.run_id WHERE lr.workspace = ? ORDER BY e.run_id ASC, e.sequence ASC`, parameters: [workspace] },
608
+ evidence: { sql: `SELECT e.${TABLE_FIELDS.evidence.join(', e.')} FROM ledger_evidence AS e JOIN ledger_runs AS lr ON lr.run_id = e.run_id WHERE lr.workspace = ? ORDER BY e.run_id ASC, e.evidence_id ASC`, parameters: [workspace] },
609
+ deliveries: { sql: `SELECT d.${TABLE_FIELDS.deliveries.join(', d.')} FROM context_deliveries AS d JOIN ledger_runs AS lr ON lr.run_id = d.run_id WHERE lr.workspace = ? ORDER BY d.run_id ASC, d.delivery_id ASC`, parameters: [workspace] },
610
+ deliveryEntries: { sql: `SELECT c.${TABLE_FIELDS.deliveryEntries.join(', c.')} FROM context_delivery_entries AS c JOIN context_deliveries AS d ON d.delivery_id = c.delivery_id JOIN ledger_runs AS lr ON lr.run_id = d.run_id WHERE lr.workspace = ? ORDER BY c.delivery_id ASC, c.entry_id ASC`, parameters: [workspace] },
611
+ nudgeDeliveries: { sql: `SELECT n.${TABLE_FIELDS.nudgeDeliveries.join(', n.')} FROM nudge_deliveries AS n JOIN ledger_runs AS lr ON lr.run_id = n.run_id WHERE lr.workspace = ? ORDER BY n.run_id ASC, n.through_sequence ASC, n.id ASC`, parameters: [workspace] },
612
+ contextFeedback: { sql: `SELECT f.${TABLE_FIELDS.contextFeedback.join(', f.')} FROM context_feedback AS f JOIN ledger_runs AS lr ON lr.run_id = f.run_id WHERE lr.workspace = ? ORDER BY f.feedback_id ASC`, parameters: [workspace] },
613
+ runFeedback: { sql: `SELECT f.${TABLE_FIELDS.runFeedback.join(', f.')} FROM run_feedback AS f JOIN ledger_runs AS lr ON lr.run_id = f.run_id WHERE lr.workspace = ? ORDER BY f.feedback_id ASC`, parameters: [workspace] },
614
+ memoryLinks: { sql: `SELECT l.${TABLE_FIELDS.memoryLinks.join(', l.')} FROM ledger_memory_links AS l JOIN ledger_runs AS lr ON lr.run_id = l.run_id WHERE lr.workspace = ? ORDER BY l.link_id ASC`, parameters: [workspace] },
615
+ purgeAudit: { sql: `SELECT p.${TABLE_FIELDS.purgeAudit.join(', p.')} FROM ledger_purge_audit AS p WHERE EXISTS (SELECT 1 FROM ledger_runs AS r WHERE r.run_id = p.run_id AND r.workspace = ?) OR EXISTS (SELECT 1 FROM ledger_events AS e JOIN ledger_runs AS r ON r.run_id = e.run_id WHERE e.event_id = p.event_id AND r.workspace = ?) OR EXISTS (SELECT 1 FROM context_deliveries AS d JOIN ledger_runs AS r ON r.run_id = d.run_id WHERE d.delivery_id = p.delivery_id AND r.workspace = ?) OR EXISTS (SELECT 1 FROM entries AS e WHERE e.id = p.entry_id AND e.workspace = ?) ORDER BY p.purge_id ASC`, parameters: [workspace, workspace, workspace, workspace] },
616
+ };
617
+ const selected = scoped[type];
618
+ const result = rows(database, selected.sql, ...selected.parameters);
619
+ return result.map((row) => normalizeRecord(type, row, workspace, false));
620
+ }
621
+ function countRecords(records) {
622
+ const counts = { ...EMPTY_COUNTS };
623
+ for (const type of Object.keys(counts))
624
+ counts[type] = records.get(type)?.length ?? 0;
625
+ return counts;
626
+ }
627
+ function checkBounds(content) {
628
+ if (typeof content !== 'string' || Buffer.byteLength(content, 'utf8') > MAX_ARCHIVE_TOTAL_BYTES || !content.endsWith('\n'))
629
+ validation();
630
+ const lines = content.split('\n');
631
+ if (lines.at(-1) !== '')
632
+ validation();
633
+ const serialized = lines.slice(0, -1);
634
+ if (serialized.length > MAX_ARCHIVE_LINE_COUNT || serialized.some((line) => line.length === 0 || Buffer.byteLength(line, 'utf8') > MAX_ARCHIVE_LINE_BYTES))
635
+ validation();
636
+ return serialized;
637
+ }
638
+ function buildArchive(workspace, records) {
639
+ const counts = countRecords(records);
640
+ const manifest = {
641
+ type: 'manifest',
642
+ apiVersion: LEDGER_ARCHIVE_API_VERSION,
643
+ archiveVersion: LEDGER_ARCHIVE_VERSION,
644
+ format: LEDGER_ARCHIVE_FORMAT,
645
+ workspace,
646
+ counts,
647
+ };
648
+ secretScan(manifest);
649
+ const ordered = Object.keys(counts).flatMap((type) => (records.get(type) ?? []).map((record) => ({ ...record, type: RECORD_NAMES[type] })));
650
+ const payloadLines = [manifest, ...ordered].map((record) => canonicalJson(record));
651
+ const payload = `${payloadLines.join('\n')}\n`;
652
+ const checksum = createHash('sha256').update(payload, 'utf8').digest('hex');
653
+ const content = `${canonicalJson({ type: 'checksum', sha256: checksum })}\n${payload}`;
654
+ checkBounds(content);
655
+ return { workspace, counts, checksum, content };
656
+ }
657
+ export function exportLedgerArchive(database, options) {
658
+ const workspace = requireWorkspace(options.workspace);
659
+ const records = new Map();
660
+ for (const type of Object.keys(EMPTY_COUNTS))
661
+ records.set(type, queryRows(database, type, workspace));
662
+ validateGraph(records, workspace);
663
+ validateMemoryReferences(database, records, workspace);
664
+ return buildArchive(workspace, records);
665
+ }
666
+ function parseLine(line, fields) {
667
+ let parsed;
668
+ try {
669
+ parsed = JSON.parse(line);
670
+ }
671
+ catch (error) {
672
+ if (error instanceof SyntaxError)
673
+ integrity();
674
+ throw error;
675
+ }
676
+ assertObject(parsed);
677
+ assertFields(parsed, fields);
678
+ try {
679
+ if (canonicalJson(parsed) !== line)
680
+ integrity();
681
+ }
682
+ catch (error) {
683
+ canonicalIntegrityFailure(error);
684
+ }
685
+ return parsed;
686
+ }
687
+ function parseCounts(value, archiveVersion) {
688
+ assertObject(value);
689
+ const fields = Object.keys(EMPTY_COUNTS).filter((field) => (archiveVersion !== LEGACY_LEDGER_ARCHIVE_VERSION || field !== 'nudgeDeliveries'));
690
+ assertFields(value, fields);
691
+ const counts = { ...EMPTY_COUNTS };
692
+ for (const type of fields)
693
+ counts[type] = integerValue(value[type]);
694
+ return counts;
695
+ }
696
+ function parseArchive(content) {
697
+ const lines = checkBounds(content);
698
+ if (lines.length < 2)
699
+ integrity();
700
+ const checksum = parseLine(lines[0], RECORD_FIELDS.checksum);
701
+ if (checksum.type !== 'checksum' || typeof checksum.sha256 !== 'string' || !HASH_PATTERN.test(checksum.sha256))
702
+ integrity();
703
+ const payload = `${lines.slice(1).join('\n')}\n`;
704
+ const actual = createHash('sha256').update(payload, 'utf8').digest('hex');
705
+ if (actual !== checksum.sha256)
706
+ integrity();
707
+ const manifest = parseLine(lines[1], RECORD_FIELDS.manifest);
708
+ if (manifest.type !== 'manifest'
709
+ || manifest.apiVersion !== LEDGER_ARCHIVE_API_VERSION
710
+ || typeof manifest.archiveVersion !== 'number'
711
+ || !SUPPORTED_LEDGER_ARCHIVE_VERSIONS.has(manifest.archiveVersion)
712
+ || manifest.format !== LEDGER_ARCHIVE_FORMAT)
713
+ validation();
714
+ const archiveVersion = manifest.archiveVersion;
715
+ secretScan(manifest);
716
+ const workspace = requireWorkspace(manifest.workspace);
717
+ const counts = parseCounts(manifest.counts, archiveVersion);
718
+ const records = new Map();
719
+ for (const type of Object.keys(EMPTY_COUNTS))
720
+ records.set(type, []);
721
+ const seenManifest = [manifest];
722
+ if (seenManifest.length !== 1)
723
+ integrity();
724
+ for (const line of lines.slice(2)) {
725
+ let raw;
726
+ try {
727
+ raw = JSON.parse(line);
728
+ }
729
+ catch (error) {
730
+ if (error instanceof SyntaxError)
731
+ integrity();
732
+ throw error;
733
+ }
734
+ assertObject(raw);
735
+ if (raw.type === 'manifest' || raw.type === 'checksum')
736
+ integrity();
737
+ const type = raw.type;
738
+ if (typeof type !== 'string')
739
+ validation();
740
+ const archiveType = RECORD_TYPES.get(type);
741
+ if (!archiveType)
742
+ validation();
743
+ if (archiveVersion === LEGACY_LEDGER_ARCHIVE_VERSION && archiveType === 'nudgeDeliveries')
744
+ validation();
745
+ const parsed = parseLine(line, RECORD_FIELDS[archiveType]);
746
+ const normalized = normalizeRecord(archiveType, parsed, workspace, true);
747
+ secretScan(normalized);
748
+ const bucket = records.get(archiveType);
749
+ if (!bucket)
750
+ integrity();
751
+ bucket.push(normalized);
752
+ }
753
+ for (const type of Object.keys(counts)) {
754
+ if (records.get(type)?.length !== counts[type])
755
+ integrity();
756
+ }
757
+ return { workspace, counts, records };
758
+ }
759
+ function identity(type, record) {
760
+ switch (type) {
761
+ case 'runs': return String(record.run_id);
762
+ case 'sessions': return String(record.id);
763
+ case 'answers': return `${record.session_id}\u0000${record.question_id}`;
764
+ case 'runIntakes': return String(record.run_id);
765
+ case 'intakeFeedback': return String(record.feedback_id);
766
+ case 'events': return String(record.event_id);
767
+ case 'evidence': return String(record.evidence_id);
768
+ case 'deliveries': return String(record.delivery_id);
769
+ case 'deliveryEntries': return `${record.delivery_id}\u0000${record.entry_id}`;
770
+ case 'nudgeDeliveries': return String(record.id);
771
+ case 'contextFeedback': return String(record.feedback_id);
772
+ case 'runFeedback': return String(record.feedback_id);
773
+ case 'memoryLinks': return String(record.link_id);
774
+ case 'purgeAudit': return String(record.purge_id);
775
+ }
776
+ }
777
+ function ensureUniqueRecords(records) {
778
+ const globalEvents = new Set();
779
+ for (const type of Object.keys(EMPTY_COUNTS)) {
780
+ const seen = new Set();
781
+ for (const record of records.get(type) ?? []) {
782
+ const key = identity(type, record);
783
+ if (seen.has(key))
784
+ integrity();
785
+ seen.add(key);
786
+ if (type === 'events') {
787
+ if (globalEvents.has(String(record.event_id)))
788
+ integrity();
789
+ globalEvents.add(String(record.event_id));
790
+ }
791
+ }
792
+ }
793
+ }
794
+ function byId(records, type, key) {
795
+ return (records.get(type) ?? []).find((record) => identity(type, record) === key);
796
+ }
797
+ function validateGraph(records, workspace) {
798
+ ensureUniqueRecords(records);
799
+ const runs = records.get('runs') ?? [];
800
+ const sessions = records.get('sessions') ?? [];
801
+ const intakes = records.get('runIntakes') ?? [];
802
+ const runIds = new Set(runs.map((record) => String(record.run_id)));
803
+ const sessionIds = new Set(sessions.map((record) => String(record.id)));
804
+ const intakeByRun = new Map();
805
+ const intakeBySession = new Map();
806
+ for (const intake of intakes) {
807
+ const runId = String(intake.run_id);
808
+ const sessionId = String(intake.session_id);
809
+ if (!runIds.has(runId) || !sessionIds.has(sessionId) || intakeByRun.has(runId) || intakeBySession.has(sessionId))
810
+ integrity();
811
+ intakeByRun.set(runId, intake);
812
+ intakeBySession.set(sessionId, intake);
813
+ }
814
+ for (const session of sessions) {
815
+ if (String(session.workspace) !== workspace)
816
+ integrity();
817
+ }
818
+ const eventsByRun = new Map();
819
+ for (const event of records.get('events') ?? []) {
820
+ const runId = String(event.run_id);
821
+ if (!runIds.has(runId))
822
+ integrity();
823
+ const list = eventsByRun.get(runId) ?? [];
824
+ list.push(event);
825
+ eventsByRun.set(runId, list);
826
+ }
827
+ for (const run of runs) {
828
+ const runId = String(run.run_id);
829
+ const parent = run.parent_run_id === null ? null : String(run.parent_run_id);
830
+ if (parent !== null && !runIds.has(parent))
831
+ integrity();
832
+ const eventRows = [...(eventsByRun.get(runId) ?? [])].sort((left, right) => Number(left.sequence) - Number(right.sequence));
833
+ if (eventRows.length !== Number(run.last_sequence))
834
+ integrity();
835
+ let previous = GENESIS_HASH;
836
+ let maxSource = null;
837
+ for (let index = 0; index < eventRows.length; index += 1) {
838
+ const event = eventRows[index];
839
+ if (Number(event.sequence) !== index + 1 || event.previous_hash !== previous)
840
+ integrity();
841
+ const calculated = hashLedgerEvent({
842
+ runId,
843
+ sequence: Number(event.sequence),
844
+ eventId: String(event.event_id),
845
+ previousHash: String(event.previous_hash),
846
+ eventType: String(event.event_type),
847
+ ...(event.source_event_id === null ? {} : { sourceEventId: String(event.source_event_id) }),
848
+ ...(event.source_sequence === null ? {} : { sourceSequence: Number(event.source_sequence) }),
849
+ ...(event.source_type === null ? {} : { sourceType: String(event.source_type) }),
850
+ actor: String(event.actor),
851
+ ...(event.outcome === null ? {} : { outcome: String(event.outcome) }),
852
+ ...(event.occurred_at === null ? {} : { occurredAt: String(event.occurred_at) }),
853
+ ingestedAt: String(event.ingested_at),
854
+ payload: JSON.parse(String(event.payload_json)),
855
+ redaction: JSON.parse(String(event.redaction_json)),
856
+ });
857
+ if (calculated !== event.event_hash)
858
+ integrity();
859
+ previous = String(event.event_hash);
860
+ if (event.source_sequence !== null)
861
+ maxSource = maxSource === null ? Number(event.source_sequence) : Math.max(maxSource, Number(event.source_sequence));
862
+ }
863
+ if ((run.last_source_sequence === null ? null : Number(run.last_source_sequence)) !== maxSource)
864
+ integrity();
865
+ if (run.status === 'active') {
866
+ const intake = intakeByRun.get(runId);
867
+ const session = intake ? byId(records, 'sessions', String(intake.session_id)) : undefined;
868
+ if (!intake || !session || !['ready', 'exhausted'].includes(String(session.status)))
869
+ integrity();
870
+ }
871
+ }
872
+ for (const intake of intakes) {
873
+ if (intake.finalized_at !== null) {
874
+ const session = byId(records, 'sessions', String(intake.session_id));
875
+ if (!session || !['ready', 'exhausted'].includes(String(session.status)))
876
+ integrity();
877
+ }
878
+ }
879
+ for (const answer of records.get('answers') ?? []) {
880
+ if (!sessionIds.has(String(answer.session_id)))
881
+ integrity();
882
+ }
883
+ for (const feedback of records.get('intakeFeedback') ?? []) {
884
+ const intake = intakeByRun.get(String(feedback.run_id));
885
+ if (!intake || intake.session_id !== feedback.session_id)
886
+ integrity();
887
+ }
888
+ const eventIds = new Set((records.get('events') ?? []).map((event) => String(event.event_id)));
889
+ const eventById = new Map((records.get('events') ?? []).map((event) => [String(event.event_id), event]));
890
+ for (const evidence of records.get('evidence') ?? []) {
891
+ if (!runIds.has(String(evidence.run_id)) || (evidence.event_id !== null && !eventIds.has(String(evidence.event_id))))
892
+ integrity();
893
+ }
894
+ const deliveryById = new Map((records.get('deliveries') ?? []).map((delivery) => [String(delivery.delivery_id), delivery]));
895
+ for (const delivery of records.get('deliveries') ?? []) {
896
+ const run = byId(records, 'runs', String(delivery.run_id));
897
+ if (!run || Number(delivery.through_sequence) > Number(run.last_sequence))
898
+ integrity();
899
+ if (delivery.intake_session_id !== null) {
900
+ const intake = intakeByRun.get(String(delivery.run_id));
901
+ if (!intake || intake.session_id !== delivery.intake_session_id)
902
+ integrity();
903
+ }
904
+ }
905
+ const nudgeOccurrences = new Set();
906
+ const nudgeCheckpoints = new Set();
907
+ const nudgeHistory = new Map();
908
+ for (const nudge of records.get('nudgeDeliveries') ?? []) {
909
+ const run = byId(records, 'runs', String(nudge.run_id));
910
+ if (!run || Number(nudge.through_sequence) > Number(run.last_sequence))
911
+ integrity();
912
+ const occurrenceKey = `${nudge.run_id}\u0000${nudge.policy_version}\u0000${nudge.occurrence_id}`;
913
+ const checkpointKey = `${nudge.run_id}\u0000${nudge.policy_version}\u0000${nudge.checkpoint_id}`;
914
+ if (nudgeOccurrences.has(occurrenceKey) || nudgeCheckpoints.has(checkpointKey))
915
+ integrity();
916
+ nudgeOccurrences.add(occurrenceKey);
917
+ nudgeCheckpoints.add(checkpointKey);
918
+ const stored = parseStoredNudgeDelivery(nudge);
919
+ const historyKey = `${stored.policyVersion}\u0000${nudge.run_id}`;
920
+ const history = nudgeHistory.get(historyKey) ?? [];
921
+ history.push(stored);
922
+ nudgeHistory.set(historyKey, history);
923
+ let evidenceEventIds;
924
+ try {
925
+ evidenceEventIds = JSON.parse(String(nudge.evidence_event_ids_json));
926
+ }
927
+ catch {
928
+ integrity();
929
+ }
930
+ if (!Array.isArray(evidenceEventIds))
931
+ integrity();
932
+ for (const eventId of evidenceEventIds) {
933
+ const event = eventById.get(String(eventId));
934
+ if (!event || event.run_id !== nudge.run_id || Number(event.sequence) > Number(nudge.through_sequence))
935
+ integrity();
936
+ }
937
+ }
938
+ for (const history of nudgeHistory.values()) {
939
+ validateStoredNudgeHistory(history, DEFAULT_NUDGE_RATE_LIMIT);
940
+ }
941
+ const deliveryEntries = new Set();
942
+ for (const entry of records.get('deliveryEntries') ?? []) {
943
+ const key = `${entry.delivery_id}\u0000${entry.entry_id}`;
944
+ if (deliveryEntries.has(key) || !deliveryById.has(String(entry.delivery_id)))
945
+ integrity();
946
+ deliveryEntries.add(key);
947
+ }
948
+ for (const feedback of records.get('contextFeedback') ?? []) {
949
+ const delivery = deliveryById.get(String(feedback.delivery_id));
950
+ if (!delivery || delivery.run_id !== feedback.run_id || !deliveryEntries.has(`${feedback.delivery_id}\u0000${feedback.entry_id}`))
951
+ integrity();
952
+ }
953
+ for (const feedback of records.get('runFeedback') ?? []) {
954
+ if (!runIds.has(String(feedback.run_id)))
955
+ integrity();
956
+ }
957
+ for (const link of records.get('memoryLinks') ?? []) {
958
+ if (!runIds.has(String(link.run_id)))
959
+ integrity();
960
+ if (link.event_id === null && link.delivery_id === null)
961
+ integrity();
962
+ if (link.event_id !== null) {
963
+ const event = (records.get('events') ?? []).find((candidate) => candidate.event_id === link.event_id);
964
+ if (!event || event.run_id !== link.run_id)
965
+ integrity();
966
+ }
967
+ if (link.delivery_id !== null) {
968
+ const delivery = deliveryById.get(String(link.delivery_id));
969
+ if (!delivery || delivery.run_id !== link.run_id)
970
+ integrity();
971
+ }
972
+ }
973
+ for (const purge of records.get('purgeAudit') ?? []) {
974
+ if (purge.run_id !== null && !runIds.has(String(purge.run_id)))
975
+ integrity();
976
+ if (purge.event_id !== null && !eventIds.has(String(purge.event_id)))
977
+ integrity();
978
+ if (purge.delivery_id !== null && !deliveryById.has(String(purge.delivery_id)))
979
+ integrity();
980
+ }
981
+ }
982
+ function exactEntryReference(database, entryId, revision) {
983
+ return rows(database, `
984
+ SELECT e.id, e.workspace AS entry_workspace, er.revision,
985
+ er.workspace AS revision_workspace
986
+ FROM entries AS e
987
+ JOIN entry_revisions AS er
988
+ ON er.entry_id = e.id AND er.revision = ?
989
+ WHERE e.id = ?
990
+ `, revision, entryId)[0];
991
+ }
992
+ function validateMemoryReferences(database, records, workspace) {
993
+ const deliveryEntries = new Map();
994
+ for (const record of records.get('deliveryEntries') ?? []) {
995
+ const origin = isContextEntryOrigin(record.origin_scope) ? record.origin_scope : integrity();
996
+ const entryId = String(record.entry_id);
997
+ const entryRevision = Number(record.entry_revision);
998
+ const entry = exactEntryReference(database, entryId, entryRevision);
999
+ if (!entry)
1000
+ notFound();
1001
+ if (typeof entry.entry_workspace !== 'string'
1002
+ || entry.revision_workspace !== entry.entry_workspace
1003
+ || !entryOriginMatchesWorkspace({ origin, runWorkspace: workspace, entryWorkspace: entry.entry_workspace }))
1004
+ conflict();
1005
+ deliveryEntries.set(`${record.delivery_id}\u0000${entryId}`, record);
1006
+ }
1007
+ for (const feedback of records.get('contextFeedback') ?? []) {
1008
+ const deliveryEntry = deliveryEntries.get(`${feedback.delivery_id}\u0000${feedback.entry_id}`);
1009
+ if (!deliveryEntry)
1010
+ integrity();
1011
+ const entry = exactEntryReference(database, String(feedback.entry_id), Number(deliveryEntry.entry_revision));
1012
+ const origin = isContextEntryOrigin(deliveryEntry.origin_scope) ? deliveryEntry.origin_scope : integrity();
1013
+ if (!entry)
1014
+ notFound();
1015
+ if (typeof entry.entry_workspace !== 'string'
1016
+ || entry.revision_workspace !== entry.entry_workspace
1017
+ || !entryOriginMatchesWorkspace({ origin, runWorkspace: workspace, entryWorkspace: entry.entry_workspace }))
1018
+ conflict();
1019
+ }
1020
+ // Memory links are intentionally narrower than delivery provenance: they may
1021
+ // reference only the run project or Global, never an arbitrary foreign project.
1022
+ for (const link of records.get('memoryLinks') ?? []) {
1023
+ const entry = rows(database, 'SELECT id, workspace FROM entries WHERE id = ?', String(link.entry_id))[0];
1024
+ if (!entry)
1025
+ notFound();
1026
+ if (entry.workspace !== workspace && entry.workspace !== 'global')
1027
+ conflict();
1028
+ }
1029
+ }
1030
+ function selectExisting(database, type, record) {
1031
+ const fields = TABLE_FIELDS[type].join(', ');
1032
+ const table = TABLE_NAMES[type];
1033
+ let sql = `SELECT ${fields} FROM ${table} WHERE `;
1034
+ const parameters = [];
1035
+ switch (type) {
1036
+ case 'runs':
1037
+ sql += 'run_id = ?';
1038
+ parameters.push(String(record.run_id));
1039
+ break;
1040
+ case 'sessions':
1041
+ sql += 'id = ?';
1042
+ parameters.push(String(record.id));
1043
+ break;
1044
+ case 'answers':
1045
+ sql += 'session_id = ? AND question_id = ?';
1046
+ parameters.push(String(record.session_id), String(record.question_id));
1047
+ break;
1048
+ case 'runIntakes':
1049
+ sql += 'run_id = ?';
1050
+ parameters.push(String(record.run_id));
1051
+ break;
1052
+ case 'intakeFeedback':
1053
+ sql += 'feedback_id = ?';
1054
+ parameters.push(String(record.feedback_id));
1055
+ break;
1056
+ case 'events':
1057
+ sql += 'event_id = ?';
1058
+ parameters.push(String(record.event_id));
1059
+ break;
1060
+ case 'evidence':
1061
+ sql += 'evidence_id = ?';
1062
+ parameters.push(String(record.evidence_id));
1063
+ break;
1064
+ case 'deliveries':
1065
+ sql += 'delivery_id = ?';
1066
+ parameters.push(String(record.delivery_id));
1067
+ break;
1068
+ case 'deliveryEntries':
1069
+ sql += 'delivery_id = ? AND entry_id = ?';
1070
+ parameters.push(String(record.delivery_id), String(record.entry_id));
1071
+ break;
1072
+ case 'nudgeDeliveries':
1073
+ sql += 'id = ?';
1074
+ parameters.push(String(record.id));
1075
+ break;
1076
+ case 'contextFeedback':
1077
+ sql += 'feedback_id = ?';
1078
+ parameters.push(String(record.feedback_id));
1079
+ break;
1080
+ case 'runFeedback':
1081
+ sql += 'feedback_id = ?';
1082
+ parameters.push(String(record.feedback_id));
1083
+ break;
1084
+ case 'memoryLinks':
1085
+ sql += 'link_id = ?';
1086
+ parameters.push(String(record.link_id));
1087
+ break;
1088
+ case 'purgeAudit':
1089
+ sql += 'purge_id = ?';
1090
+ parameters.push(String(record.purge_id));
1091
+ break;
1092
+ }
1093
+ return rows(database, sql, ...parameters)[0];
1094
+ }
1095
+ function hasUniqueConflict(database, type, record) {
1096
+ let sql;
1097
+ const parameters = [];
1098
+ switch (type) {
1099
+ case 'runIntakes':
1100
+ sql = 'SELECT 1 AS present FROM run_intakes WHERE session_id = ?';
1101
+ parameters.push(String(record.session_id));
1102
+ break;
1103
+ case 'events':
1104
+ if (record.source_event_id !== null) {
1105
+ sql = 'SELECT 1 AS present FROM ledger_events WHERE run_id = ? AND source_event_id = ?';
1106
+ parameters.push(String(record.run_id), String(record.source_event_id));
1107
+ }
1108
+ if (!sql) {
1109
+ sql = 'SELECT 1 AS present FROM ledger_events WHERE run_id = ? AND sequence = ?';
1110
+ parameters.push(String(record.run_id), Number(record.sequence));
1111
+ }
1112
+ break;
1113
+ case 'deliveryEntries':
1114
+ sql = 'SELECT 1 AS present FROM context_delivery_entries WHERE delivery_id = ? AND entry_id = ?';
1115
+ parameters.push(String(record.delivery_id), String(record.entry_id));
1116
+ break;
1117
+ case 'intakeFeedback':
1118
+ sql = 'SELECT 1 AS present FROM intake_feedback WHERE run_id = ? AND actor = ? AND idempotency_key = ?';
1119
+ parameters.push(String(record.run_id), String(record.actor), String(record.idempotency_key));
1120
+ break;
1121
+ case 'contextFeedback':
1122
+ sql = 'SELECT 1 AS present FROM context_feedback WHERE run_id = ? AND actor = ? AND idempotency_key = ?';
1123
+ parameters.push(String(record.run_id), String(record.actor), String(record.idempotency_key));
1124
+ break;
1125
+ case 'runFeedback':
1126
+ sql = 'SELECT 1 AS present FROM run_feedback WHERE run_id = ? AND actor = ? AND idempotency_key = ?';
1127
+ parameters.push(String(record.run_id), String(record.actor), String(record.idempotency_key));
1128
+ break;
1129
+ default: return false;
1130
+ }
1131
+ return rows(database, sql, ...parameters).length > 0;
1132
+ }
1133
+ function ensureMemoryReference(database, record, workspace) {
1134
+ if (record.type !== 'memoryLinks')
1135
+ return;
1136
+ const entryId = String(record.entry_id);
1137
+ const entry = rows(database, 'SELECT id, workspace FROM entries WHERE id = ?', entryId)[0];
1138
+ if (!entry)
1139
+ notFound();
1140
+ if (entry.workspace !== workspace && entry.workspace !== 'global')
1141
+ conflict();
1142
+ }
1143
+ function compareExisting(database, type, record, workspace) {
1144
+ const existing = selectExisting(database, type, record);
1145
+ if (existing) {
1146
+ const normalized = normalizeRecord(type, existing, String(record.workspace ?? ''), true);
1147
+ if (canonicalJson(normalized) !== canonicalJson(record))
1148
+ conflict();
1149
+ return 'duplicate';
1150
+ }
1151
+ if (hasUniqueConflict(database, type, record))
1152
+ conflict();
1153
+ ensureMemoryReference(database, record, workspace);
1154
+ return 'new';
1155
+ }
1156
+ function insertRecord(database, type, record) {
1157
+ const fields = [...TABLE_FIELDS[type]];
1158
+ const values = fields.map((field) => record[field]);
1159
+ if (type === 'deliveries') {
1160
+ fields.push('external_sync_summary_json');
1161
+ values.push('{}');
1162
+ }
1163
+ const placeholders = fields.map(() => '?').join(', ');
1164
+ try {
1165
+ database.prepare(`INSERT INTO ${TABLE_NAMES[type]} (${fields.join(', ')}) VALUES (${placeholders})`).run(...values);
1166
+ }
1167
+ catch (error) {
1168
+ if (isSqliteUniqueConstraintError(error, UNIQUE_CONSTRAINT_TARGETS[type]))
1169
+ conflict();
1170
+ if (isSqliteCorruptionError(error))
1171
+ integrity();
1172
+ throw error;
1173
+ }
1174
+ }
1175
+ function orderedForImport(records) {
1176
+ const output = [];
1177
+ const runRecords = records.get('runs') ?? [];
1178
+ const emittedRuns = new Set();
1179
+ const emitRun = (run) => {
1180
+ const runId = String(run.run_id);
1181
+ if (emittedRuns.has(runId))
1182
+ return;
1183
+ const parentId = run.parent_run_id === null ? null : String(run.parent_run_id);
1184
+ if (parentId !== null) {
1185
+ const parent = runRecords.find((candidate) => String(candidate.run_id) === parentId);
1186
+ if (parent)
1187
+ emitRun(parent);
1188
+ }
1189
+ emittedRuns.add(runId);
1190
+ output.push(run);
1191
+ };
1192
+ for (const run of runRecords)
1193
+ emitRun(run);
1194
+ const orderedTypes = [
1195
+ 'sessions', 'answers', 'runIntakes', 'intakeFeedback', 'events', 'evidence', 'deliveries', 'nudgeDeliveries',
1196
+ 'deliveryEntries', 'contextFeedback', 'runFeedback', 'memoryLinks', 'purgeAudit',
1197
+ ];
1198
+ for (const type of orderedTypes)
1199
+ output.push(...(records.get(type) ?? []));
1200
+ return output;
1201
+ }
1202
+ function emptyCounts() {
1203
+ return { ...EMPTY_COUNTS };
1204
+ }
1205
+ export function importLedgerArchive(database, options) {
1206
+ const parsed = parseArchive(options.content);
1207
+ if (options.workspace !== undefined && requireWorkspace(options.workspace) !== parsed.workspace)
1208
+ validation();
1209
+ validateGraph(parsed.records, parsed.workspace);
1210
+ if (database === undefined && !options.dryRun)
1211
+ databaseFailure();
1212
+ const imported = emptyCounts();
1213
+ const duplicates = emptyCounts();
1214
+ let conflicts = 0;
1215
+ const ordered = orderedForImport(parsed.records);
1216
+ if (database === undefined) {
1217
+ for (const record of ordered)
1218
+ imported[record.type] += 1;
1219
+ return { workspace: parsed.workspace, dryRun: true, counts: parsed.counts, imported, duplicates, conflicts };
1220
+ }
1221
+ const db = database;
1222
+ try {
1223
+ validateMemoryReferences(db, parsed.records, parsed.workspace);
1224
+ for (const record of ordered) {
1225
+ const type = record.type;
1226
+ try {
1227
+ const result = compareExisting(db, type, record, parsed.workspace);
1228
+ if (result === 'duplicate')
1229
+ duplicates[type] += 1;
1230
+ else
1231
+ imported[type] += 1;
1232
+ }
1233
+ catch (error) {
1234
+ if (options.dryRun && error instanceof KiokukoError && error.code === 'CONFLICT') {
1235
+ conflicts += 1;
1236
+ continue;
1237
+ }
1238
+ throw error;
1239
+ }
1240
+ }
1241
+ if (options.dryRun)
1242
+ return { workspace: parsed.workspace, dryRun: true, counts: parsed.counts, imported, duplicates, conflicts };
1243
+ withImmediateTransaction(db, () => {
1244
+ for (const record of ordered) {
1245
+ const type = record.type;
1246
+ if (duplicates[type] > 0 && selectExisting(db, type, record))
1247
+ continue;
1248
+ insertRecord(db, type, record);
1249
+ }
1250
+ });
1251
+ }
1252
+ catch (error) {
1253
+ if (error instanceof KiokukoError)
1254
+ throw error;
1255
+ if (isSqliteCorruptionError(error))
1256
+ integrity();
1257
+ throw error;
1258
+ }
1259
+ return { workspace: parsed.workspace, dryRun: false, counts: parsed.counts, imported, duplicates, conflicts };
1260
+ }
1261
+ //# sourceMappingURL=archive.js.map