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