@askdkc/kiokuko 0.1.17 → 0.1.19

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 (534) hide show
  1. package/README.ja.md +91 -112
  2. package/README.ko.md +90 -102
  3. package/README.md +103 -262
  4. package/README.zh-CN.md +88 -102
  5. package/dist/agent-file/atomic-write.d.ts +90 -3
  6. package/dist/agent-file/atomic-write.d.ts.map +1 -1
  7. package/dist/agent-file/atomic-write.js +990 -14
  8. package/dist/agent-file/atomic-write.js.map +1 -1
  9. package/dist/agent-file/managed-block.d.ts +12 -1
  10. package/dist/agent-file/managed-block.d.ts.map +1 -1
  11. package/dist/agent-file/managed-block.js +49 -4
  12. package/dist/agent-file/managed-block.js.map +1 -1
  13. package/dist/agent-file/render.d.ts +1 -1
  14. package/dist/agent-file/render.d.ts.map +1 -1
  15. package/dist/agent-file/render.js +10 -7
  16. package/dist/agent-file/render.js.map +1 -1
  17. package/dist/akinator/agent-task.d.ts +11 -22
  18. package/dist/akinator/agent-task.d.ts.map +1 -1
  19. package/dist/akinator/agent-task.js +454 -99
  20. package/dist/akinator/agent-task.js.map +1 -1
  21. package/dist/akinator/capabilities.d.ts +18 -6
  22. package/dist/akinator/capabilities.d.ts.map +1 -1
  23. package/dist/akinator/capabilities.js +72 -35
  24. package/dist/akinator/capabilities.js.map +1 -1
  25. package/dist/akinator/capability-binding.d.ts +11 -0
  26. package/dist/akinator/capability-binding.d.ts.map +1 -0
  27. package/dist/akinator/capability-binding.js +56 -0
  28. package/dist/akinator/capability-binding.js.map +1 -0
  29. package/dist/akinator/domain.js +2 -2
  30. package/dist/akinator/domain.js.map +1 -1
  31. package/dist/akinator/knowledge-path.d.ts.map +1 -1
  32. package/dist/akinator/knowledge-path.js +409 -39
  33. package/dist/akinator/knowledge-path.js.map +1 -1
  34. package/dist/akinator/orchestrator.d.ts +3 -4
  35. package/dist/akinator/orchestrator.d.ts.map +1 -1
  36. package/dist/akinator/orchestrator.js +1 -4
  37. package/dist/akinator/orchestrator.js.map +1 -1
  38. package/dist/akinator/service.d.ts +0 -4
  39. package/dist/akinator/service.d.ts.map +1 -1
  40. package/dist/akinator/service.js +19 -35
  41. package/dist/akinator/service.js.map +1 -1
  42. package/dist/akinator/skill-discovery-attempt.d.ts +20 -0
  43. package/dist/akinator/skill-discovery-attempt.d.ts.map +1 -0
  44. package/dist/akinator/skill-discovery-attempt.js +390 -0
  45. package/dist/akinator/skill-discovery-attempt.js.map +1 -0
  46. package/dist/akinator/store.d.ts.map +1 -1
  47. package/dist/akinator/store.js +107 -52
  48. package/dist/akinator/store.js.map +1 -1
  49. package/dist/akinator/types.d.ts +0 -12
  50. package/dist/akinator/types.d.ts.map +1 -1
  51. package/dist/bin/kiokuko.js +0 -0
  52. package/dist/cli.d.ts +2 -0
  53. package/dist/cli.d.ts.map +1 -1
  54. package/dist/cli.js +534 -148
  55. package/dist/cli.js.map +1 -1
  56. package/dist/client/server-client.d.ts +5 -3
  57. package/dist/client/server-client.d.ts.map +1 -1
  58. package/dist/client/server-client.js +486 -181
  59. package/dist/client/server-client.js.map +1 -1
  60. package/dist/commands/agent.d.ts +2 -0
  61. package/dist/commands/agent.d.ts.map +1 -1
  62. package/dist/commands/agent.js +861 -86
  63. package/dist/commands/agent.js.map +1 -1
  64. package/dist/commands/backup.d.ts +2 -1
  65. package/dist/commands/backup.d.ts.map +1 -1
  66. package/dist/commands/backup.js +64 -8
  67. package/dist/commands/backup.js.map +1 -1
  68. package/dist/commands/doctor.d.ts +5 -1
  69. package/dist/commands/doctor.d.ts.map +1 -1
  70. package/dist/commands/doctor.js +70 -26
  71. package/dist/commands/doctor.js.map +1 -1
  72. package/dist/commands/export.d.ts +0 -4
  73. package/dist/commands/export.d.ts.map +1 -1
  74. package/dist/commands/export.js +191 -32
  75. package/dist/commands/export.js.map +1 -1
  76. package/dist/commands/import.d.ts +10 -1
  77. package/dist/commands/import.d.ts.map +1 -1
  78. package/dist/commands/import.js +592 -113
  79. package/dist/commands/import.js.map +1 -1
  80. package/dist/commands/init.d.ts +19 -1
  81. package/dist/commands/init.d.ts.map +1 -1
  82. package/dist/commands/init.js +569 -22
  83. package/dist/commands/init.js.map +1 -1
  84. package/dist/commands/purge.d.ts.map +1 -1
  85. package/dist/commands/purge.js +3 -0
  86. package/dist/commands/purge.js.map +1 -1
  87. package/dist/commands/setup.d.ts +34 -8
  88. package/dist/commands/setup.d.ts.map +1 -1
  89. package/dist/commands/setup.js +418 -86
  90. package/dist/commands/setup.js.map +1 -1
  91. package/dist/commands/skills.d.ts +9 -0
  92. package/dist/commands/skills.d.ts.map +1 -0
  93. package/dist/commands/skills.js +317 -0
  94. package/dist/commands/skills.js.map +1 -0
  95. package/dist/commands/use.d.ts +10 -2
  96. package/dist/commands/use.d.ts.map +1 -1
  97. package/dist/commands/use.js +851 -73
  98. package/dist/commands/use.js.map +1 -1
  99. package/dist/config/paths.d.ts +11 -1
  100. package/dist/config/paths.d.ts.map +1 -1
  101. package/dist/config/paths.js +64 -29
  102. package/dist/config/paths.js.map +1 -1
  103. package/dist/config/project-config.d.ts +1 -0
  104. package/dist/config/project-config.d.ts.map +1 -1
  105. package/dist/config/project-config.js +70 -32
  106. package/dist/config/project-config.js.map +1 -1
  107. package/dist/context/broker.d.ts +28 -14
  108. package/dist/context/broker.d.ts.map +1 -1
  109. package/dist/context/broker.js +604 -145
  110. package/dist/context/broker.js.map +1 -1
  111. package/dist/context/delivery.d.ts +6 -21
  112. package/dist/context/delivery.d.ts.map +1 -1
  113. package/dist/context/delivery.js +196 -147
  114. package/dist/context/delivery.js.map +1 -1
  115. package/dist/context/feedback.d.ts +11 -12
  116. package/dist/context/feedback.d.ts.map +1 -1
  117. package/dist/context/feedback.js +229 -261
  118. package/dist/context/feedback.js.map +1 -1
  119. package/dist/context/ranking.d.ts +1 -12
  120. package/dist/context/ranking.d.ts.map +1 -1
  121. package/dist/context/ranking.js +13 -4
  122. package/dist/context/ranking.js.map +1 -1
  123. package/dist/context/recommendations.d.ts +0 -5
  124. package/dist/context/recommendations.d.ts.map +1 -1
  125. package/dist/context/recommendations.js +0 -1
  126. package/dist/context/recommendations.js.map +1 -1
  127. package/dist/context/run-state.d.ts +26 -0
  128. package/dist/context/run-state.d.ts.map +1 -0
  129. package/dist/context/run-state.js +399 -0
  130. package/dist/context/run-state.js.map +1 -0
  131. package/dist/context/scoped-broker.d.ts +17 -5
  132. package/dist/context/scoped-broker.d.ts.map +1 -1
  133. package/dist/context/scoped-broker.js +512 -106
  134. package/dist/context/scoped-broker.js.map +1 -1
  135. package/dist/context/selection-state.d.ts +19 -0
  136. package/dist/context/selection-state.d.ts.map +1 -0
  137. package/dist/context/selection-state.js +250 -0
  138. package/dist/context/selection-state.js.map +1 -0
  139. package/dist/db/adapter.d.ts +5 -3
  140. package/dist/db/adapter.d.ts.map +1 -1
  141. package/dist/db/adapter.js +6 -3
  142. package/dist/db/adapter.js.map +1 -1
  143. package/dist/db/capabilities.d.ts.map +1 -1
  144. package/dist/db/capabilities.js +34 -16
  145. package/dist/db/capabilities.js.map +1 -1
  146. package/dist/db/connection.d.ts +8 -0
  147. package/dist/db/connection.d.ts.map +1 -1
  148. package/dist/db/connection.js +55 -26
  149. package/dist/db/connection.js.map +1 -1
  150. package/dist/db/migrate.d.ts +28 -7
  151. package/dist/db/migrate.d.ts.map +1 -1
  152. package/dist/db/migrate.js +106 -78
  153. package/dist/db/migrate.js.map +1 -1
  154. package/dist/db/sqlite-retry.d.ts +11 -0
  155. package/dist/db/sqlite-retry.d.ts.map +1 -0
  156. package/dist/db/sqlite-retry.js +66 -0
  157. package/dist/db/sqlite-retry.js.map +1 -0
  158. package/dist/db/transaction.d.ts +13 -0
  159. package/dist/db/transaction.d.ts.map +1 -1
  160. package/dist/db/transaction.js +53 -24
  161. package/dist/db/transaction.js.map +1 -1
  162. package/dist/db/upgrade-backup.d.ts +58 -2
  163. package/dist/db/upgrade-backup.d.ts.map +1 -1
  164. package/dist/db/upgrade-backup.js +757 -28
  165. package/dist/db/upgrade-backup.js.map +1 -1
  166. package/dist/errors.js +1 -1
  167. package/dist/errors.js.map +1 -1
  168. package/dist/gateway/agent-service.d.ts +4 -1
  169. package/dist/gateway/agent-service.d.ts.map +1 -1
  170. package/dist/gateway/agent-service.js +71 -58
  171. package/dist/gateway/agent-service.js.map +1 -1
  172. package/dist/gateway/checkpoint-service.d.ts +1 -0
  173. package/dist/gateway/checkpoint-service.d.ts.map +1 -1
  174. package/dist/gateway/checkpoint-service.js +47 -24
  175. package/dist/gateway/checkpoint-service.js.map +1 -1
  176. package/dist/ledger/archive.d.ts +1 -4
  177. package/dist/ledger/archive.d.ts.map +1 -1
  178. package/dist/ledger/archive.js +77 -39
  179. package/dist/ledger/archive.js.map +1 -1
  180. package/dist/ledger/maintenance.d.ts +0 -11
  181. package/dist/ledger/maintenance.d.ts.map +1 -1
  182. package/dist/ledger/maintenance.js +24 -40
  183. package/dist/ledger/maintenance.js.map +1 -1
  184. package/dist/ledger/projection.d.ts +0 -1
  185. package/dist/ledger/projection.d.ts.map +1 -1
  186. package/dist/ledger/projection.js.map +1 -1
  187. package/dist/ledger/promotion.d.ts +0 -9
  188. package/dist/ledger/promotion.d.ts.map +1 -1
  189. package/dist/ledger/promotion.js.map +1 -1
  190. package/dist/ledger/query.d.ts +1 -15
  191. package/dist/ledger/query.d.ts.map +1 -1
  192. package/dist/ledger/query.js.map +1 -1
  193. package/dist/ledger/store.d.ts +0 -1
  194. package/dist/ledger/store.d.ts.map +1 -1
  195. package/dist/ledger/store.js +11 -8
  196. package/dist/ledger/store.js.map +1 -1
  197. package/dist/ledger/types.d.ts +0 -4
  198. package/dist/ledger/types.d.ts.map +1 -1
  199. package/dist/ledger/types.js.map +1 -1
  200. package/dist/ledger/validate.d.ts.map +1 -1
  201. package/dist/ledger/validate.js +0 -5
  202. package/dist/ledger/validate.js.map +1 -1
  203. package/dist/mcp/server.d.ts +4 -0
  204. package/dist/mcp/server.d.ts.map +1 -1
  205. package/dist/mcp/server.js +105 -54
  206. package/dist/mcp/server.js.map +1 -1
  207. package/dist/memory/audit.d.ts +0 -1
  208. package/dist/memory/audit.d.ts.map +1 -1
  209. package/dist/memory/audit.js +0 -1
  210. package/dist/memory/audit.js.map +1 -1
  211. package/dist/memory/curator.d.ts.map +1 -1
  212. package/dist/memory/curator.js +172 -96
  213. package/dist/memory/curator.js.map +1 -1
  214. package/dist/memory/entries.d.ts +12 -2
  215. package/dist/memory/entries.d.ts.map +1 -1
  216. package/dist/memory/entries.js +198 -114
  217. package/dist/memory/entries.js.map +1 -1
  218. package/dist/memory/federated-retrieval.d.ts +12 -1
  219. package/dist/memory/federated-retrieval.d.ts.map +1 -1
  220. package/dist/memory/federated-retrieval.js +183 -70
  221. package/dist/memory/federated-retrieval.js.map +1 -1
  222. package/dist/memory/hybrid-retrieval.d.ts +5 -11
  223. package/dist/memory/hybrid-retrieval.d.ts.map +1 -1
  224. package/dist/memory/hybrid-retrieval.js +78 -58
  225. package/dist/memory/hybrid-retrieval.js.map +1 -1
  226. package/dist/memory/lifecycle.d.ts.map +1 -1
  227. package/dist/memory/lifecycle.js +17 -13
  228. package/dist/memory/lifecycle.js.map +1 -1
  229. package/dist/memory/rebuild-search.d.ts +5 -0
  230. package/dist/memory/rebuild-search.d.ts.map +1 -1
  231. package/dist/memory/rebuild-search.js +101 -76
  232. package/dist/memory/rebuild-search.js.map +1 -1
  233. package/dist/memory/retrieval-query.d.ts +0 -5
  234. package/dist/memory/retrieval-query.d.ts.map +1 -1
  235. package/dist/memory/retrieval-query.js +0 -5
  236. package/dist/memory/retrieval-query.js.map +1 -1
  237. package/dist/memory/retrieval.d.ts.map +1 -1
  238. package/dist/memory/retrieval.js +25 -131
  239. package/dist/memory/retrieval.js.map +1 -1
  240. package/dist/memory/revisions.d.ts +76 -1
  241. package/dist/memory/revisions.d.ts.map +1 -1
  242. package/dist/memory/revisions.js +539 -35
  243. package/dist/memory/revisions.js.map +1 -1
  244. package/dist/memory/scoped-memory.d.ts +16 -1
  245. package/dist/memory/scoped-memory.d.ts.map +1 -1
  246. package/dist/memory/scoped-memory.js +240 -107
  247. package/dist/memory/scoped-memory.js.map +1 -1
  248. package/dist/memory/secrets.d.ts +2 -0
  249. package/dist/memory/secrets.d.ts.map +1 -1
  250. package/dist/memory/secrets.js +36 -0
  251. package/dist/memory/secrets.js.map +1 -1
  252. package/dist/memory/structured-memory.d.ts +3 -2
  253. package/dist/memory/structured-memory.d.ts.map +1 -1
  254. package/dist/memory/structured-memory.js +54 -22
  255. package/dist/memory/structured-memory.js.map +1 -1
  256. package/dist/memory/workspaces.d.ts +9 -0
  257. package/dist/memory/workspaces.d.ts.map +1 -1
  258. package/dist/memory/workspaces.js +67 -0
  259. package/dist/memory/workspaces.js.map +1 -1
  260. package/dist/package-version.d.ts +2 -0
  261. package/dist/package-version.d.ts.map +1 -0
  262. package/dist/package-version.js +7 -0
  263. package/dist/package-version.js.map +1 -0
  264. package/dist/repository/binding.d.ts +5 -0
  265. package/dist/repository/binding.d.ts.map +1 -1
  266. package/dist/repository/binding.js +117 -17
  267. package/dist/repository/binding.js.map +1 -1
  268. package/dist/repository/framework-version.d.ts +8 -0
  269. package/dist/repository/framework-version.d.ts.map +1 -0
  270. package/dist/repository/framework-version.js +29 -0
  271. package/dist/repository/framework-version.js.map +1 -0
  272. package/dist/repository/identity-value.d.ts +4 -0
  273. package/dist/repository/identity-value.d.ts.map +1 -0
  274. package/dist/repository/identity-value.js +24 -0
  275. package/dist/repository/identity-value.js.map +1 -0
  276. package/dist/repository/identity.d.ts.map +1 -1
  277. package/dist/repository/identity.js +2 -0
  278. package/dist/repository/identity.js.map +1 -1
  279. package/dist/repository/project-fingerprint.d.ts +14 -2
  280. package/dist/repository/project-fingerprint.d.ts.map +1 -1
  281. package/dist/repository/project-fingerprint.js +312 -33
  282. package/dist/repository/project-fingerprint.js.map +1 -1
  283. package/dist/repository/remote-url.d.ts +0 -1
  284. package/dist/repository/remote-url.d.ts.map +1 -1
  285. package/dist/repository/remote-url.js +0 -1
  286. package/dist/repository/remote-url.js.map +1 -1
  287. package/dist/runtime-version.d.ts +2 -1
  288. package/dist/runtime-version.d.ts.map +1 -1
  289. package/dist/runtime-version.js +21 -4
  290. package/dist/runtime-version.js.map +1 -1
  291. package/dist/serialization/boundary-json.d.ts +20 -0
  292. package/dist/serialization/boundary-json.d.ts.map +1 -0
  293. package/dist/serialization/boundary-json.js +129 -0
  294. package/dist/serialization/boundary-json.js.map +1 -0
  295. package/dist/serialization/envelope.js +1 -1
  296. package/dist/serialization/envelope.js.map +1 -1
  297. package/dist/serialization/validate.d.ts +7 -0
  298. package/dist/serialization/validate.d.ts.map +1 -1
  299. package/dist/serialization/validate.js +53 -13
  300. package/dist/serialization/validate.js.map +1 -1
  301. package/dist/server/app.js +1 -1
  302. package/dist/server/app.js.map +1 -1
  303. package/dist/server/http.d.ts +4 -3
  304. package/dist/server/http.d.ts.map +1 -1
  305. package/dist/server/http.js +90 -50
  306. package/dist/server/http.js.map +1 -1
  307. package/dist/server/idempotency.d.ts +0 -6
  308. package/dist/server/idempotency.d.ts.map +1 -1
  309. package/dist/server/idempotency.js.map +1 -1
  310. package/dist/server/router.d.ts.map +1 -1
  311. package/dist/server/router.js +21 -4
  312. package/dist/server/router.js.map +1 -1
  313. package/dist/server/routes/agent-capability-gate.d.ts +40 -0
  314. package/dist/server/routes/agent-capability-gate.d.ts.map +1 -0
  315. package/dist/server/routes/agent-capability-gate.js +182 -0
  316. package/dist/server/routes/agent-capability-gate.js.map +1 -0
  317. package/dist/server/routes/agent-events.d.ts.map +1 -1
  318. package/dist/server/routes/agent-events.js +8 -1
  319. package/dist/server/routes/agent-events.js.map +1 -1
  320. package/dist/server/routes/agent-intake.d.ts.map +1 -1
  321. package/dist/server/routes/agent-intake.js +10 -2
  322. package/dist/server/routes/agent-intake.js.map +1 -1
  323. package/dist/server/routes/agent-promotions.d.ts.map +1 -1
  324. package/dist/server/routes/agent-promotions.js +5 -2
  325. package/dist/server/routes/agent-promotions.js.map +1 -1
  326. package/dist/server/routes/agent-runs.d.ts.map +1 -1
  327. package/dist/server/routes/agent-runs.js +18 -4
  328. package/dist/server/routes/agent-runs.js.map +1 -1
  329. package/dist/server/routes/request-binding.d.ts +5 -0
  330. package/dist/server/routes/request-binding.d.ts.map +1 -0
  331. package/dist/server/routes/request-binding.js +49 -0
  332. package/dist/server/routes/request-binding.js.map +1 -0
  333. package/dist/server/routes/task5-support.d.ts +1 -8
  334. package/dist/server/routes/task5-support.d.ts.map +1 -1
  335. package/dist/server/routes/task5-support.js +1 -17
  336. package/dist/server/routes/task5-support.js.map +1 -1
  337. package/dist/server/routes/task5.d.ts.map +1 -1
  338. package/dist/server/routes/task5.js +106 -36
  339. package/dist/server/routes/task5.js.map +1 -1
  340. package/dist/server/write-queue.js +2 -2
  341. package/dist/server/write-queue.js.map +1 -1
  342. package/dist/setup/claude-config.d.ts +2 -1
  343. package/dist/setup/claude-config.d.ts.map +1 -1
  344. package/dist/setup/claude-config.js +54 -4
  345. package/dist/setup/claude-config.js.map +1 -1
  346. package/dist/setup/client-detection.d.ts +7 -2
  347. package/dist/setup/client-detection.d.ts.map +1 -1
  348. package/dist/setup/client-detection.js +27 -9
  349. package/dist/setup/client-detection.js.map +1 -1
  350. package/dist/setup/hermes-config.d.ts +2 -1
  351. package/dist/setup/hermes-config.d.ts.map +1 -1
  352. package/dist/setup/hermes-config.js +53 -12
  353. package/dist/setup/hermes-config.js.map +1 -1
  354. package/dist/setup/legacy-client-cleanup.d.ts +6 -0
  355. package/dist/setup/legacy-client-cleanup.d.ts.map +1 -0
  356. package/dist/setup/legacy-client-cleanup.js +152 -0
  357. package/dist/setup/legacy-client-cleanup.js.map +1 -0
  358. package/dist/setup/managed-text.d.ts.map +1 -1
  359. package/dist/setup/managed-text.js +11 -1
  360. package/dist/setup/managed-text.js.map +1 -1
  361. package/dist/setup/opencode-config.d.ts +2 -1
  362. package/dist/setup/opencode-config.d.ts.map +1 -1
  363. package/dist/setup/opencode-config.js +57 -5
  364. package/dist/setup/opencode-config.js.map +1 -1
  365. package/dist/setup/render.d.ts +2 -1
  366. package/dist/setup/render.d.ts.map +1 -1
  367. package/dist/setup/render.js +91 -17
  368. package/dist/setup/render.js.map +1 -1
  369. package/dist/setup/standard-skills.d.ts +16 -2
  370. package/dist/setup/standard-skills.d.ts.map +1 -1
  371. package/dist/setup/standard-skills.js +37 -13
  372. package/dist/setup/standard-skills.js.map +1 -1
  373. package/dist/setup/strict-json.d.ts +7 -0
  374. package/dist/setup/strict-json.d.ts.map +1 -0
  375. package/dist/setup/strict-json.js +98 -0
  376. package/dist/setup/strict-json.js.map +1 -0
  377. package/dist/setup/strict-toml.d.ts +7 -0
  378. package/dist/setup/strict-toml.d.ts.map +1 -0
  379. package/dist/setup/strict-toml.js +470 -0
  380. package/dist/setup/strict-toml.js.map +1 -0
  381. package/dist/skills/cache.d.ts +15 -0
  382. package/dist/skills/cache.d.ts.map +1 -0
  383. package/dist/skills/cache.js +19 -0
  384. package/dist/skills/cache.js.map +1 -0
  385. package/dist/skills/candidate-ranking.d.ts +15 -0
  386. package/dist/skills/candidate-ranking.d.ts.map +1 -0
  387. package/dist/skills/candidate-ranking.js +52 -0
  388. package/dist/skills/candidate-ranking.js.map +1 -0
  389. package/dist/skills/chunking.d.ts +11 -0
  390. package/dist/skills/chunking.d.ts.map +1 -0
  391. package/dist/skills/chunking.js +291 -0
  392. package/dist/skills/chunking.js.map +1 -0
  393. package/dist/skills/config.d.ts +19 -0
  394. package/dist/skills/config.d.ts.map +1 -0
  395. package/dist/skills/config.js +103 -0
  396. package/dist/skills/config.js.map +1 -0
  397. package/dist/skills/discovery-service.d.ts +26 -0
  398. package/dist/skills/discovery-service.d.ts.map +1 -0
  399. package/dist/skills/discovery-service.js +921 -0
  400. package/dist/skills/discovery-service.js.map +1 -0
  401. package/dist/skills/external-transport.d.ts +2 -0
  402. package/dist/skills/external-transport.d.ts.map +1 -0
  403. package/dist/skills/external-transport.js +30 -0
  404. package/dist/skills/external-transport.js.map +1 -0
  405. package/dist/skills/find.d.ts +16 -0
  406. package/dist/skills/find.d.ts.map +1 -0
  407. package/dist/skills/find.js +58 -0
  408. package/dist/skills/find.js.map +1 -0
  409. package/dist/skills/gap-detection.d.ts +23 -0
  410. package/dist/skills/gap-detection.d.ts.map +1 -0
  411. package/dist/skills/gap-detection.js +62 -0
  412. package/dist/skills/gap-detection.js.map +1 -0
  413. package/dist/skills/import-preparation.d.ts +4 -0
  414. package/dist/skills/import-preparation.d.ts.map +1 -0
  415. package/dist/skills/import-preparation.js +20 -0
  416. package/dist/skills/import-preparation.js.map +1 -0
  417. package/dist/skills/materialization-authority.d.ts +11 -0
  418. package/dist/skills/materialization-authority.d.ts.map +1 -0
  419. package/dist/skills/materialization-authority.js +92 -0
  420. package/dist/skills/materialization-authority.js.map +1 -0
  421. package/dist/skills/materialization-service.d.ts +22 -0
  422. package/dist/skills/materialization-service.d.ts.map +1 -0
  423. package/dist/skills/materialization-service.js +101 -0
  424. package/dist/skills/materialization-service.js.map +1 -0
  425. package/dist/skills/official-catalog.d.ts +31 -0
  426. package/dist/skills/official-catalog.d.ts.map +1 -0
  427. package/dist/skills/official-catalog.js +110 -0
  428. package/dist/skills/official-catalog.js.map +1 -0
  429. package/dist/skills/providers/schema.d.ts +30 -0
  430. package/dist/skills/providers/schema.d.ts.map +1 -0
  431. package/dist/skills/providers/schema.js +354 -0
  432. package/dist/skills/providers/schema.js.map +1 -0
  433. package/dist/skills/providers/skills-sh-compat.d.ts +17 -0
  434. package/dist/skills/providers/skills-sh-compat.d.ts.map +1 -0
  435. package/dist/skills/providers/skills-sh-compat.js +71 -0
  436. package/dist/skills/providers/skills-sh-compat.js.map +1 -0
  437. package/dist/skills/providers/skills-sh-v1.d.ts +23 -0
  438. package/dist/skills/providers/skills-sh-v1.d.ts.map +1 -0
  439. package/dist/skills/providers/skills-sh-v1.js +134 -0
  440. package/dist/skills/providers/skills-sh-v1.js.map +1 -0
  441. package/dist/skills/query-builder.d.ts +18 -0
  442. package/dist/skills/query-builder.d.ts.map +1 -0
  443. package/dist/skills/query-builder.js +93 -0
  444. package/dist/skills/query-builder.js.map +1 -0
  445. package/dist/skills/source/errors.d.ts +9 -0
  446. package/dist/skills/source/errors.d.ts.map +1 -0
  447. package/dist/skills/source/errors.js +15 -0
  448. package/dist/skills/source/errors.js.map +1 -0
  449. package/dist/skills/source/frontmatter.d.ts +9 -0
  450. package/dist/skills/source/frontmatter.d.ts.map +1 -0
  451. package/dist/skills/source/frontmatter.js +77 -0
  452. package/dist/skills/source/frontmatter.js.map +1 -0
  453. package/dist/skills/source/github-fetcher.d.ts +20 -0
  454. package/dist/skills/source/github-fetcher.d.ts.map +1 -0
  455. package/dist/skills/source/github-fetcher.js +292 -0
  456. package/dist/skills/source/github-fetcher.js.map +1 -0
  457. package/dist/skills/source/snapshot-validator.d.ts +28 -0
  458. package/dist/skills/source/snapshot-validator.d.ts.map +1 -0
  459. package/dist/skills/source/snapshot-validator.js +186 -0
  460. package/dist/skills/source/snapshot-validator.js.map +1 -0
  461. package/dist/skills/store.d.ts +181 -0
  462. package/dist/skills/store.d.ts.map +1 -0
  463. package/dist/skills/store.js +1710 -0
  464. package/dist/skills/store.js.map +1 -0
  465. package/dist/skills/types.d.ts +169 -0
  466. package/dist/skills/types.d.ts.map +1 -0
  467. package/dist/skills/types.js +2 -0
  468. package/dist/skills/types.js.map +1 -0
  469. package/dist/web/i18n.d.ts +32 -0
  470. package/dist/web/i18n.d.ts.map +1 -1
  471. package/dist/web/i18n.js +128 -0
  472. package/dist/web/i18n.js.map +1 -1
  473. package/dist/web/server.d.ts.map +1 -1
  474. package/dist/web/server.js +386 -38
  475. package/dist/web/server.js.map +1 -1
  476. package/dist/web/ui.d.ts +4 -0
  477. package/dist/web/ui.d.ts.map +1 -1
  478. package/dist/web/ui.js +382 -6
  479. package/dist/web/ui.js.map +1 -1
  480. package/migrations/009_external_skill_discovery.sql +126 -0
  481. package/package.json +4 -3
  482. package/skills/kiokuko-single-purpose-functions/SKILL.md +288 -0
  483. package/skills/kiokuko-single-purpose-functions/references/kiokuko-patterns.md +344 -0
  484. package/skills/kiokuko-single-purpose-functions/references/review-checklist.md +97 -0
  485. package/skills/kiokuko-ui-design-soul/SKILL.md +1186 -28
  486. package/templates/AGENTS.md +8 -7
  487. package/dist/client/runtime-discovery.d.ts +0 -15
  488. package/dist/client/runtime-discovery.d.ts.map +0 -1
  489. package/dist/client/runtime-discovery.js +0 -45
  490. package/dist/client/runtime-discovery.js.map +0 -1
  491. package/dist/commands/call.d.ts +0 -7
  492. package/dist/commands/call.d.ts.map +0 -1
  493. package/dist/commands/call.js +0 -10
  494. package/dist/commands/call.js.map +0 -1
  495. package/dist/commands/link.d.ts +0 -6
  496. package/dist/commands/link.d.ts.map +0 -1
  497. package/dist/commands/link.js +0 -6
  498. package/dist/commands/link.js.map +0 -1
  499. package/dist/commands/promote.d.ts +0 -6
  500. package/dist/commands/promote.d.ts.map +0 -1
  501. package/dist/commands/promote.js +0 -6
  502. package/dist/commands/promote.js.map +0 -1
  503. package/dist/commands/read.d.ts +0 -6
  504. package/dist/commands/read.d.ts.map +0 -1
  505. package/dist/commands/read.js +0 -4
  506. package/dist/commands/read.js.map +0 -1
  507. package/dist/commands/recall.d.ts +0 -6
  508. package/dist/commands/recall.d.ts.map +0 -1
  509. package/dist/commands/recall.js +0 -4
  510. package/dist/commands/recall.js.map +0 -1
  511. package/dist/commands/record.d.ts +0 -6
  512. package/dist/commands/record.d.ts.map +0 -1
  513. package/dist/commands/record.js +0 -4
  514. package/dist/commands/record.js.map +0 -1
  515. package/dist/commands/search.d.ts +0 -6
  516. package/dist/commands/search.d.ts.map +0 -1
  517. package/dist/commands/search.js +0 -4
  518. package/dist/commands/search.js.map +0 -1
  519. package/dist/commands/supersede.d.ts +0 -6
  520. package/dist/commands/supersede.d.ts.map +0 -1
  521. package/dist/commands/supersede.js +0 -6
  522. package/dist/commands/supersede.js.map +0 -1
  523. package/dist/knowledge/sources.d.ts +0 -72
  524. package/dist/knowledge/sources.d.ts.map +0 -1
  525. package/dist/knowledge/sources.js +0 -388
  526. package/dist/knowledge/sources.js.map +0 -1
  527. package/dist/setup/opencode-evidence.d.ts +0 -37
  528. package/dist/setup/opencode-evidence.d.ts.map +0 -1
  529. package/dist/setup/opencode-evidence.js +0 -58
  530. package/dist/setup/opencode-evidence.js.map +0 -1
  531. package/dist/setup/opencode-loop-guard.d.ts +0 -9
  532. package/dist/setup/opencode-loop-guard.d.ts.map +0 -1
  533. package/dist/setup/opencode-loop-guard.js +0 -248
  534. package/dist/setup/opencode-loop-guard.js.map +0 -1
@@ -1,19 +1,25 @@
1
1
  import { withImmediateTransaction } from '../db/transaction.js';
2
2
  import { KiokukoError } from '../errors.js';
3
- import { CONTEXT_RANKING_COMPONENTS, CONTEXT_RANKING_COMPONENTS_V2, CONTEXT_SELECTION_REASON_ORDER, } from './ranking.js';
4
- import { sanitizeJson } from '../security/sanitize.js';
5
- import { canonicalJson } from '../serialization/validate.js';
3
+ import { CONTEXT_RANKING_VERSION, CONTEXT_RANKING_COMPONENTS, CONTEXT_RANKING_COMPONENTS_V2, CONTEXT_SELECTION_REASON_ORDER, } from './ranking.js';
4
+ import { canonicalContentHash, canonicalJson } from '../serialization/validate.js';
5
+ import { effectiveRetrievalScope, hasExplicitApplicability, } from '../memory/structured-memory.js';
6
+ import { readEntry } from '../memory/entries.js';
7
+ import { isRetrievableEntry } from '../memory/hybrid-retrieval.js';
6
8
  import { entryOriginMatchesWorkspace, isContextEntryOrigin } from './origin.js';
9
+ import { RUN_STATUSES } from '../ledger/types.js';
10
+ import { RECOMMENDATION_POLICY_VERSION } from './recommendations.js';
11
+ import { readContextRunProfileBinding } from './run-state.js';
7
12
  const MAX_IDENTIFIER_BYTES = 256;
8
13
  const MAX_ITEMS = 100;
9
14
  const MAX_SCORE_COMPONENT = 1_000_000;
10
15
  const MAX_CHAR_BUDGET = 100_000;
11
- const MAX_EXTERNAL_SUMMARY_BYTES = 16 * 1024;
12
- const MAX_EXTERNAL_ERROR_BYTES = 1024;
13
- const MAX_SOURCES = 16;
14
16
  const MAX_LIMIT = 100;
15
17
  const DEFAULT_LIMIT = 100;
16
18
  const DELIVERY_CURSOR_VERSION = 1;
19
+ // The persisted score schema is the mode discriminant: v1 is the generic
20
+ // broker contract and v2 is the scoped broker contract.
21
+ const GENERIC_DELIVERY_POLICY_VERSION = `${CONTEXT_RANKING_VERSION}+${RECOMMENDATION_POLICY_VERSION}`;
22
+ const SCOPED_DELIVERY_POLICY_VERSION = 'context-ranking-v4';
17
23
  const VALIDATION_MESSAGE = 'Context delivery input is invalid';
18
24
  const NOT_FOUND_MESSAGE = 'Context delivery target was not found';
19
25
  const CONFLICT_MESSAGE = 'Context delivery conflicts with existing record';
@@ -37,15 +43,47 @@ function databaseFailure() {
37
43
  function integrity() {
38
44
  return fail('INTEGRITY_ERROR', INTEGRITY_MESSAGE);
39
45
  }
46
+ function scopedIdentityIntegrity() {
47
+ return fail('INTEGRITY_ERROR', 'Stored scoped context character accounting is invalid');
48
+ }
40
49
  function isKiokukoError(error) {
41
50
  return error instanceof KiokukoError;
42
51
  }
43
- function normalizeDatabaseError(error) {
52
+ const SQLITE_CONSTRAINT_PRIMARY_KEY = 1_555;
53
+ const SQLITE_CONSTRAINT_UNIQUE = 2_067;
54
+ const NO_UNIQUENESS_FAILURES = new Set();
55
+ const SQLITE_OPERATIONAL_PRIMARY_CODES = new Set([5, 6, 7, 8, 9, 10, 13, 14, 15, 22, 23]);
56
+ const SQLITE_INTEGRITY_PRIMARY_CODES = new Set([11, 24, 26]);
57
+ const DELIVERY_UNIQUENESS_FAILURES = new Set([
58
+ 'UNIQUE constraint failed: context_deliveries.delivery_id',
59
+ 'UNIQUE constraint failed: context_delivery_entries.delivery_id, context_delivery_entries.entry_id',
60
+ ]);
61
+ function nodeSqliteFailure(error) {
62
+ if (!(error instanceof Error))
63
+ return null;
64
+ const failure = error;
65
+ if (failure.code !== 'ERR_SQLITE_ERROR'
66
+ || typeof failure.errcode !== 'number'
67
+ || !Number.isSafeInteger(failure.errcode)
68
+ || failure.errcode < 0)
69
+ return null;
70
+ return failure;
71
+ }
72
+ function normalizeDatabaseError(error, uniquenessFailures = NO_UNIQUENESS_FAILURES) {
44
73
  if (isKiokukoError(error))
45
74
  throw error;
46
- if (error instanceof Error && /unique|constraint/i.test(error.message))
75
+ const failure = nodeSqliteFailure(error);
76
+ if (failure === null)
77
+ throw error;
78
+ if ((failure.errcode === SQLITE_CONSTRAINT_PRIMARY_KEY || failure.errcode === SQLITE_CONSTRAINT_UNIQUE)
79
+ && uniquenessFailures.has(failure.message))
47
80
  conflict();
48
- databaseFailure();
81
+ const primaryResultCode = failure.errcode & 0xff;
82
+ if (SQLITE_INTEGRITY_PRIMARY_CODES.has(primaryResultCode))
83
+ integrity();
84
+ if (SQLITE_OPERATIONAL_PRIMARY_CODES.has(primaryResultCode))
85
+ databaseFailure();
86
+ throw error;
49
87
  }
50
88
  function isPlainObject(value) {
51
89
  try {
@@ -157,6 +195,14 @@ function positiveSafeInteger(value) {
157
195
  validation();
158
196
  return value;
159
197
  }
198
+ function validatedScoreSchemaVersion(value, onInvalid) {
199
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || (value !== 1 && value !== 2))
200
+ onInvalid();
201
+ return value;
202
+ }
203
+ function deliveryPolicyVersion(version) {
204
+ return version === 1 ? GENERIC_DELIVERY_POLICY_VERSION : SCOPED_DELIVERY_POLICY_VERSION;
205
+ }
160
206
  function storedNonNegativeSafeInteger(value) {
161
207
  if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0)
162
208
  integrity();
@@ -277,74 +323,14 @@ function validateDeliveryItems(value, scoreSchemaVersion) {
277
323
  };
278
324
  });
279
325
  }
280
- function sanitizeExternalError(value, workspace) {
281
- if (typeof value !== 'string' || value.length === 0)
282
- validation();
283
- let sanitized;
284
- try {
285
- sanitized = sanitizeJson({ error: value }, { workspace }).value;
286
- }
287
- catch {
288
- validation();
289
- }
290
- if (!isPlainObject(sanitized))
291
- validation();
292
- const error = readField(sanitized, 'error');
293
- if (typeof error !== 'string' || error.length === 0 || Buffer.byteLength(error, 'utf8') > MAX_EXTERNAL_ERROR_BYTES)
294
- validation();
295
- return error;
296
- }
297
- function validateExternalSummary(value, workspace) {
298
- const object = objectInput(value, ['attempted', 'imported', 'sources'], true);
299
- const attempted = booleanValue(readField(object, 'attempted'));
300
- const imported = nonNegativeSafeInteger(readField(object, 'imported'));
301
- const sourceArray = arrayInput(readField(object, 'sources'));
302
- if (sourceArray.length > MAX_SOURCES)
303
- validation();
304
- const sourceIds = new Set();
305
- const sources = sourceArray.map((source) => {
306
- const sourceObject = objectInput(source, ['sourceId', 'commit', 'documents', 'imported', 'error'], false);
307
- for (const field of ['sourceId', 'commit', 'documents', 'imported']) {
308
- if (!hasOwn(sourceObject, field))
309
- validation();
310
- }
311
- const sourceId = boundedIdentifier(readField(sourceObject, 'sourceId'));
312
- if (sourceIds.has(sourceId))
313
- validation();
314
- sourceIds.add(sourceId);
315
- const rawCommit = readField(sourceObject, 'commit');
316
- const commit = rawCommit === null
317
- ? null
318
- : typeof rawCommit === 'string' && rawCommit.length > 0 && /^[0-9a-f]+$/u.test(rawCommit) && Buffer.byteLength(rawCommit, 'utf8') <= MAX_IDENTIFIER_BYTES
319
- ? rawCommit
320
- : validation();
321
- const documents = nonNegativeSafeInteger(readField(sourceObject, 'documents'));
322
- const sourceImported = nonNegativeSafeInteger(readField(sourceObject, 'imported'));
323
- if (sourceImported > documents)
324
- validation();
325
- const result = { sourceId, commit, documents, imported: sourceImported };
326
- if (hasOwn(sourceObject, 'error'))
327
- result.error = sanitizeExternalError(readField(sourceObject, 'error'), workspace);
328
- return result;
329
- });
330
- if (!attempted && (imported !== 0 || sources.length !== 0))
331
- validation();
332
- const sourceTotal = sources.reduce((total, source) => total + source.imported, 0);
333
- if (imported !== sourceTotal)
334
- validation();
335
- const summary = { attempted, imported, sources };
336
- if (Buffer.byteLength(canonicalJson(summary), 'utf8') > MAX_EXTERNAL_SUMMARY_BYTES)
337
- validation();
338
- return summary;
339
- }
340
326
  function validateContextDeliveryInput(value) {
341
327
  try {
342
328
  const object = objectInput(value, [
343
329
  'workspace', 'deliveryId', 'runId', 'throughSequence', 'intakeSessionId', 'taskProfileHash',
344
- 'queryHash', 'policyVersion', 'externalSyncSummary', 'charBudget', 'charCount', 'truncated',
330
+ 'queryHash', 'policyVersion', 'charBudget', 'charCount', 'truncated',
345
331
  'createdAt', 'items', 'scoreSchemaVersion',
346
332
  ], false);
347
- for (const field of ['workspace', 'deliveryId', 'runId', 'throughSequence', 'intakeSessionId', 'taskProfileHash', 'queryHash', 'policyVersion', 'externalSyncSummary', 'charBudget', 'charCount', 'truncated', 'createdAt', 'items']) {
333
+ for (const field of ['workspace', 'deliveryId', 'runId', 'throughSequence', 'intakeSessionId', 'taskProfileHash', 'queryHash', 'policyVersion', 'charBudget', 'charCount', 'truncated', 'createdAt', 'items']) {
348
334
  if (!hasOwn(object, field))
349
335
  validation();
350
336
  }
@@ -357,7 +343,6 @@ function validateContextDeliveryInput(value) {
357
343
  const taskProfileHash = hash(readField(object, 'taskProfileHash'));
358
344
  const queryHash = hash(readField(object, 'queryHash'));
359
345
  const policyVersion = boundedIdentifier(readField(object, 'policyVersion'));
360
- const externalSyncSummary = validateExternalSummary(readField(object, 'externalSyncSummary'), workspace);
361
346
  const charBudget = readField(object, 'charBudget');
362
347
  if (typeof charBudget !== 'number' || !Number.isSafeInteger(charBudget) || charBudget < 1 || charBudget > MAX_CHAR_BUDGET)
363
348
  validation();
@@ -366,8 +351,10 @@ function validateContextDeliveryInput(value) {
366
351
  validation();
367
352
  const truncated = booleanValue(readField(object, 'truncated'));
368
353
  const createdAt = timestamp(readField(object, 'createdAt'));
369
- const scoreSchemaVersion = object.scoreSchemaVersion === undefined ? undefined : positiveSafeInteger(object.scoreSchemaVersion);
370
- const items = validateDeliveryItems(readField(object, 'items'), scoreSchemaVersion ?? 1);
354
+ const parsedScoreSchemaVersion = validatedScoreSchemaVersion(object.scoreSchemaVersion === undefined ? 1 : object.scoreSchemaVersion, validation);
355
+ if (policyVersion !== deliveryPolicyVersion(parsedScoreSchemaVersion))
356
+ validation();
357
+ const items = validateDeliveryItems(readField(object, 'items'), parsedScoreSchemaVersion);
371
358
  return {
372
359
  workspace,
373
360
  deliveryId,
@@ -377,13 +364,12 @@ function validateContextDeliveryInput(value) {
377
364
  taskProfileHash,
378
365
  queryHash,
379
366
  policyVersion,
380
- externalSyncSummary,
381
367
  charBudget,
382
368
  charCount,
383
369
  truncated,
384
370
  createdAt,
385
371
  items,
386
- ...(scoreSchemaVersion === undefined ? {} : { scoreSchemaVersion }),
372
+ ...(object.scoreSchemaVersion === undefined ? {} : { scoreSchemaVersion: parsedScoreSchemaVersion }),
387
373
  };
388
374
  }
389
375
  catch {
@@ -461,7 +447,6 @@ function canonicalDeliveryBody(input) {
461
447
  taskProfileHash: input.taskProfileHash,
462
448
  queryHash: input.queryHash,
463
449
  policyVersion: input.policyVersion,
464
- externalSyncSummary: input.externalSyncSummary,
465
450
  charBudget: input.charBudget,
466
451
  charCount: input.charCount,
467
452
  truncated: input.truncated,
@@ -477,56 +462,111 @@ function canonicalDeliveryBody(input) {
477
462
  scoreSchemaVersion: input.scoreSchemaVersion ?? 1,
478
463
  });
479
464
  }
465
+ function scopedDeliveryId(input) {
466
+ return `context-${canonicalContentHash({
467
+ kind: 'scoped-context-delivery-v1',
468
+ workspace: input.workspace,
469
+ runId: input.runId,
470
+ throughSequence: input.throughSequence,
471
+ intakeSessionId: input.intakeSessionId,
472
+ taskProfileHash: input.taskProfileHash,
473
+ queryHash: input.queryHash,
474
+ policyVersion: input.policyVersion,
475
+ charBudget: input.charBudget,
476
+ charCount: input.charCount,
477
+ truncated: input.truncated,
478
+ createdAt: input.createdAt,
479
+ scoreSchemaVersion: input.scoreSchemaVersion ?? 1,
480
+ items: input.items.map((item) => ({
481
+ entryId: item.entryId,
482
+ entryRevision: item.entryRevision,
483
+ rank: item.rank,
484
+ scoreComponents: item.scoreComponents,
485
+ selectionReasons: item.selectionReasons,
486
+ ...(item.origin === undefined ? {} : { origin: item.origin }),
487
+ })),
488
+ })}`;
489
+ }
480
490
  function selectHeaderByDeliveryId(database, deliveryId) {
481
491
  return database.prepare(`
482
492
  SELECT cd.delivery_id, cd.run_id, cd.through_sequence, cd.intake_session_id,
483
493
  cd.task_profile_hash, cd.query_hash, cd.policy_version,
484
- cd.external_sync_summary_json, cd.char_budget, cd.char_count,
485
- cd.truncated, cd.created_at, cd.score_schema_version,
494
+ cd.char_budget, cd.char_count, cd.truncated, cd.created_at, cd.score_schema_version,
486
495
  lr.workspace AS run_workspace, lr.last_sequence AS run_last_sequence
487
496
  FROM context_deliveries AS cd
488
497
  LEFT JOIN ledger_runs AS lr ON lr.run_id = cd.run_id
489
498
  WHERE cd.delivery_id = ?
490
499
  `).get(deliveryId);
491
500
  }
501
+ function strictCurrentEntry(database, workspace, entryId, requireStructuredScope) {
502
+ try {
503
+ return readEntry(database, { workspace, entryId }, { requireStructuredScope });
504
+ }
505
+ catch (error) {
506
+ if (isKiokukoError(error) && error.code === 'INTEGRITY_ERROR')
507
+ integrity();
508
+ throw error;
509
+ }
510
+ }
492
511
  function assertRunForWrite(database, input) {
493
- const run = database.prepare('SELECT run_id, last_sequence FROM ledger_runs WHERE run_id = ? AND workspace = ?').get(input.runId, input.workspace);
512
+ const run = database.prepare('SELECT run_id, status, last_sequence FROM ledger_runs WHERE run_id = ? AND workspace = ?')
513
+ .get(input.runId, input.workspace);
494
514
  if (!run)
495
515
  notFound();
496
516
  if (typeof run.run_id !== 'string')
497
517
  integrity();
518
+ if (typeof run.status !== 'string' || !RUN_STATUSES.includes(run.status))
519
+ integrity();
498
520
  const lastSequence = storedNonNegativeSafeInteger(run.last_sequence);
499
- if (input.throughSequence > lastSequence)
521
+ if (run.status !== 'active' || input.throughSequence !== lastSequence)
500
522
  conflict();
501
- if (input.intakeSessionId !== null) {
502
- const intake = database.prepare(`
503
- SELECT ri.session_id, s.id AS session_id_join, s.workspace AS session_workspace
504
- FROM run_intakes AS ri
505
- LEFT JOIN akinator_sessions AS s ON s.id = ri.session_id
506
- WHERE ri.run_id = ?
507
- `).get(input.runId);
508
- if (!intake || intake.session_id !== input.intakeSessionId || intake.session_id_join !== input.intakeSessionId || intake.session_workspace !== input.workspace)
509
- notFound();
523
+ let binding;
524
+ try {
525
+ binding = readContextRunProfileBinding(database, input.runId, input.throughSequence);
510
526
  }
527
+ catch (error) {
528
+ if (isKiokukoError(error) && (error.code === 'NOT_FOUND' || error.code === 'INTEGRITY_ERROR'))
529
+ integrity();
530
+ throw error;
531
+ }
532
+ if (binding.workspace !== input.workspace)
533
+ integrity();
534
+ if (input.intakeSessionId !== binding.intakeSessionId)
535
+ notFound();
536
+ if (input.taskProfileHash !== binding.profileHash)
537
+ conflict();
511
538
  for (const item of input.items) {
512
- const entry = database.prepare(`
513
- SELECT e.id, e.workspace, r.workspace AS revision_workspace, r.scope_json
539
+ const candidate = database.prepare(`
540
+ SELECT e.id, e.workspace, r.workspace AS revision_workspace
514
541
  FROM entry_revisions AS r
515
542
  JOIN entries AS e ON e.id = r.entry_id
516
543
  WHERE r.entry_id = ? AND r.revision = ?
517
544
  `).get(item.entryId, item.entryRevision);
518
- if (!entry || entry.id !== item.entryId)
545
+ if (!candidate || candidate.id !== item.entryId)
519
546
  notFound();
520
- const entryWorkspace = typeof entry.workspace === 'string' ? entry.workspace : notFound();
547
+ if (typeof candidate.workspace !== 'string' || candidate.workspace.length === 0)
548
+ integrity();
549
+ const entryWorkspace = candidate.workspace;
521
550
  const origin = item.origin ?? 'project';
522
- if (entry.revision_workspace !== entryWorkspace || !entryOriginMatchesWorkspace({ origin, runWorkspace: input.workspace, entryWorkspace }))
551
+ if (candidate.revision_workspace !== entryWorkspace)
552
+ integrity();
553
+ const entry = strictCurrentEntry(database, entryWorkspace, item.entryId, origin !== 'project');
554
+ if (entry.revision !== item.entryRevision)
555
+ conflict();
556
+ if (!isRetrievableEntry(database, entry) || entry.status === 'superseded')
557
+ conflict();
558
+ if (!entryOriginMatchesWorkspace({ origin, runWorkspace: input.workspace, entryWorkspace: entry.workspace }))
523
559
  notFound();
524
560
  if (origin === 'global') {
525
- if (entry.workspace !== 'global' || typeof entry.scope_json !== 'string' || !/"visibility"\s*:\s*"global"/u.test(entry.scope_json))
561
+ if (entry.workspace !== 'global' || entry.scope.visibility !== 'global' || effectiveRetrievalScope(entry.scope) !== 'global')
562
+ notFound();
563
+ }
564
+ else if (origin === 'ecosystem') {
565
+ if (!hasOwn(entry.scope, 'retrievalScope')
566
+ || effectiveRetrievalScope(entry.scope) !== 'ecosystem'
567
+ || !hasExplicitApplicability(entry.scope))
526
568
  notFound();
527
569
  }
528
- else if (origin === 'ecosystem' && (typeof entry.scope_json !== 'string' || (!/"retrievalScope"\s*:\s*"ecosystem"/u.test(entry.scope_json) && !/"applicability"\s*:/u.test(entry.scope_json))))
529
- notFound();
530
570
  }
531
571
  }
532
572
  function validateStoredJson(value) {
@@ -536,31 +576,24 @@ function validateStoredJson(value) {
536
576
  try {
537
577
  parsed = JSON.parse(value);
538
578
  }
539
- catch {
540
- integrity();
541
- }
542
- try {
543
- if (canonicalJson(parsed) !== value)
579
+ catch (error) {
580
+ if (error instanceof SyntaxError || error instanceof RangeError)
544
581
  integrity();
582
+ throw error;
545
583
  }
546
- catch {
547
- integrity();
548
- }
549
- return parsed;
550
- }
551
- function validateStoredExternalSummary(value, workspace) {
584
+ let canonical;
552
585
  try {
553
- const parsed = validateStoredJson(value);
554
- const normalized = validateExternalSummary(parsed, workspace);
555
- if (canonicalJson(normalized) !== value)
556
- integrity();
557
- return normalized;
586
+ canonical = canonicalJson(parsed);
558
587
  }
559
588
  catch (error) {
560
- if (isKiokukoError(error) && error.code === 'INTEGRITY_ERROR')
561
- throw error;
562
- integrity();
589
+ if (error instanceof RangeError
590
+ || (error instanceof KiokukoError && error.code === 'VALIDATION_ERROR'))
591
+ integrity();
592
+ throw error;
563
593
  }
594
+ if (canonical !== value)
595
+ integrity();
596
+ return parsed;
564
597
  }
565
598
  function validateStoredHeader(row, workspace) {
566
599
  const deliveryId = boundedStoredIdentifier(row.delivery_id);
@@ -577,8 +610,9 @@ function validateStoredHeader(row, workspace) {
577
610
  const taskProfileHash = storedHash(row.task_profile_hash);
578
611
  const queryHash = storedHash(row.query_hash);
579
612
  const policyVersion = boundedStoredIdentifier(row.policy_version);
580
- const scoreSchemaVersion = storedPositiveSafeInteger(row.score_schema_version);
581
- const externalSyncSummary = validateStoredExternalSummary(row.external_sync_summary_json, workspace);
613
+ const scoreSchemaVersion = validatedScoreSchemaVersion(row.score_schema_version, integrity);
614
+ if (policyVersion !== deliveryPolicyVersion(scoreSchemaVersion))
615
+ integrity();
582
616
  const charBudget = storedPositiveSafeInteger(row.char_budget);
583
617
  if (charBudget > MAX_CHAR_BUDGET)
584
618
  integrity();
@@ -596,7 +630,6 @@ function validateStoredHeader(row, workspace) {
596
630
  taskProfileHash,
597
631
  queryHash,
598
632
  policyVersion,
599
- externalSyncSummary,
600
633
  charBudget,
601
634
  charCount,
602
635
  truncated,
@@ -651,16 +684,19 @@ function validateStoredEntries(database, header) {
651
684
  return { entryId, entryRevision, rank, scoreComponents: score, selectionReasons: reasons, ...(origin === 'project' ? {} : { origin }) };
652
685
  });
653
686
  }
654
- function assertStoredIntakeLink(database, header) {
655
- if (header.intakeSessionId === null)
656
- return;
657
- const intake = database.prepare(`
658
- SELECT ri.run_id, ri.session_id, s.id AS session_id_join, s.workspace AS session_workspace
659
- FROM run_intakes AS ri
660
- LEFT JOIN akinator_sessions AS s ON s.id = ri.session_id
661
- WHERE ri.run_id = ?
662
- `).get(header.runId);
663
- if (!intake || intake.run_id !== header.runId || intake.session_id !== header.intakeSessionId || intake.session_id_join !== header.intakeSessionId || intake.session_workspace !== header.workspace)
687
+ function assertStoredProfileBinding(database, header) {
688
+ let binding;
689
+ try {
690
+ binding = readContextRunProfileBinding(database, header.runId, header.throughSequence);
691
+ }
692
+ catch (error) {
693
+ if (isKiokukoError(error) && (error.code === 'NOT_FOUND' || error.code === 'INTEGRITY_ERROR'))
694
+ integrity();
695
+ throw error;
696
+ }
697
+ if (binding.workspace !== header.workspace
698
+ || header.intakeSessionId !== binding.intakeSessionId
699
+ || header.taskProfileHash !== binding.profileHash)
664
700
  integrity();
665
701
  }
666
702
  function readStoredDelivery(database, workspace, deliveryId) {
@@ -672,33 +708,40 @@ function readStoredDelivery(database, workspace, deliveryId) {
672
708
  if (row.run_workspace !== workspace)
673
709
  notFound();
674
710
  const header = validateStoredHeader(row, workspace);
675
- assertStoredIntakeLink(database, header);
711
+ assertStoredProfileBinding(database, header);
676
712
  const items = validateStoredEntries(database, header);
713
+ const complete = { ...header, items };
714
+ if ((header.scoreSchemaVersion ?? 1) === 2 && header.deliveryId !== scopedDeliveryId(complete))
715
+ scopedIdentityIntegrity();
677
716
  const view = {
678
- ...header,
717
+ ...complete,
679
718
  items: items.map((item) => ({ ...item, scoreComponents: { ...item.scoreComponents }, selectionReasons: [...item.selectionReasons], untrusted: true })),
680
719
  untrusted: true,
681
720
  };
682
721
  return view;
683
722
  }
684
- function writeContextDelivery(database, input) {
723
+ function writeContextDelivery(database, input, options = {}) {
724
+ if ((input.scoreSchemaVersion ?? 1) === 2 && input.deliveryId !== scopedDeliveryId(input))
725
+ validation();
726
+ assertRunForWrite(database, input);
685
727
  const existing = selectHeaderByDeliveryId(database, input.deliveryId);
686
728
  if (existing) {
687
729
  if (existing.run_workspace !== input.workspace)
688
730
  conflict();
689
731
  const stored = readStoredDelivery(database, input.workspace, input.deliveryId);
690
- if (canonicalDeliveryBody(stored) === canonicalDeliveryBody(input))
732
+ if (canonicalDeliveryBody(stored) === canonicalDeliveryBody(input)) {
733
+ options.assertBeforePersist?.();
691
734
  return stored;
735
+ }
692
736
  conflict();
693
737
  }
694
- assertRunForWrite(database, input);
695
- const summaryJson = canonicalJson(input.externalSyncSummary);
738
+ options.assertBeforePersist?.();
696
739
  database.prepare(`
697
740
  INSERT INTO context_deliveries (
698
741
  delivery_id, run_id, through_sequence, intake_session_id, task_profile_hash, query_hash,
699
742
  policy_version, external_sync_summary_json, char_budget, char_count, truncated, created_at, score_schema_version
700
743
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
701
- `).run(input.deliveryId, input.runId, input.throughSequence, input.intakeSessionId, input.taskProfileHash, input.queryHash, input.policyVersion, summaryJson, input.charBudget, input.charCount, input.truncated ? 1 : 0, input.createdAt, input.scoreSchemaVersion ?? 1);
744
+ `).run(input.deliveryId, input.runId, input.throughSequence, input.intakeSessionId, input.taskProfileHash, input.queryHash, input.policyVersion, '{}', input.charBudget, input.charCount, input.truncated ? 1 : 0, input.createdAt, input.scoreSchemaVersion ?? 1);
702
745
  for (const item of input.items) {
703
746
  database.prepare(`
704
747
  INSERT INTO context_delivery_entries (
@@ -708,22 +751,26 @@ function writeContextDelivery(database, input) {
708
751
  }
709
752
  return readStoredDelivery(database, input.workspace, input.deliveryId);
710
753
  }
711
- export function recordContextDeliveryInTransaction(database, input) {
754
+ export function recordContextDeliveryInTransaction(database, input, options = {}) {
712
755
  const validated = validateContextDeliveryInput(input);
756
+ if (options.assertBeforePersist !== undefined && typeof options.assertBeforePersist !== 'function')
757
+ validation();
713
758
  try {
714
- return writeContextDelivery(database, validated);
759
+ return writeContextDelivery(database, validated, options);
715
760
  }
716
761
  catch (error) {
717
- normalizeDatabaseError(error);
762
+ normalizeDatabaseError(error, DELIVERY_UNIQUENESS_FAILURES);
718
763
  }
719
764
  }
720
- export function recordContextDelivery(database, input) {
765
+ export function recordContextDelivery(database, input, options = {}) {
721
766
  const validated = validateContextDeliveryInput(input);
767
+ if (options.assertBeforePersist !== undefined && typeof options.assertBeforePersist !== 'function')
768
+ validation();
722
769
  try {
723
- return withImmediateTransaction(database, () => writeContextDelivery(database, validated));
770
+ return withImmediateTransaction(database, () => writeContextDelivery(database, validated, options));
724
771
  }
725
772
  catch (error) {
726
- normalizeDatabaseError(error);
773
+ normalizeDatabaseError(error, DELIVERY_UNIQUENESS_FAILURES);
727
774
  }
728
775
  }
729
776
  export function readContextDelivery(database, input) {
@@ -754,8 +801,7 @@ export function listContextDeliveries(database, input) {
754
801
  const rows = database.prepare(`
755
802
  SELECT cd.delivery_id, cd.run_id, cd.through_sequence, cd.intake_session_id,
756
803
  cd.task_profile_hash, cd.query_hash, cd.policy_version,
757
- cd.external_sync_summary_json, cd.char_budget, cd.char_count,
758
- cd.truncated, cd.created_at, cd.score_schema_version,
804
+ cd.char_budget, cd.char_count, cd.truncated, cd.created_at, cd.score_schema_version,
759
805
  lr.workspace AS run_workspace, lr.last_sequence AS run_last_sequence
760
806
  FROM context_deliveries AS cd
761
807
  LEFT JOIN ledger_runs AS lr ON lr.run_id = cd.run_id
@@ -766,10 +812,13 @@ export function listContextDeliveries(database, input) {
766
812
  const pageRows = rows.slice(0, validated.limit);
767
813
  const items = pageRows.map((row) => {
768
814
  const header = validateStoredHeader(row, validated.workspace);
769
- assertStoredIntakeLink(database, header);
815
+ assertStoredProfileBinding(database, header);
770
816
  const storedItems = validateStoredEntries(database, header);
817
+ const complete = { ...header, items: storedItems };
818
+ if ((header.scoreSchemaVersion ?? 1) === 2 && header.deliveryId !== scopedDeliveryId(complete))
819
+ scopedIdentityIntegrity();
771
820
  return {
772
- ...header,
821
+ ...complete,
773
822
  items: storedItems.map((item) => ({ ...item, scoreComponents: { ...item.scoreComponents }, selectionReasons: [...item.selectionReasons], untrusted: true })),
774
823
  untrusted: true,
775
824
  };