@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,15 +1,66 @@
1
- import { canonicalContentHash } from '../serialization/validate.js';
1
+ import { KiokukoError } from '../errors.js';
2
+ import { canonicalContentHash, compareCanonicalStrings } from '../serialization/validate.js';
3
+ import { readEntry } from '../memory/entries.js';
4
+ import { decodeStoredStructuredScope, readEntryRevision } from '../memory/revisions.js';
2
5
  import { ensureGlobalWorkspace, GLOBAL_WORKSPACE, resolveProjectWorkspace } from '../memory/workspaces.js';
3
6
  import { federatedEntries } from '../memory/federated-retrieval.js';
4
- import { recordContextDelivery } from './delivery.js';
5
- import { readRunIntakeLink } from '../akinator/store.js';
7
+ import { isRetrievableEntry } from '../memory/hybrid-retrieval.js';
8
+ import { effectiveRetrievalScope, hasExplicitApplicability } from '../memory/structured-memory.js';
9
+ import { readContextDelivery, recordContextDeliveryInTransaction } from './delivery.js';
6
10
  import { CONTEXT_SELECTION_REASON_ORDER } from './ranking.js';
7
- export const SCOPED_CONTEXT_POLICY_VERSION = 'context-ranking-v3';
11
+ import { withImmediateTransaction } from '../db/transaction.js';
12
+ import { contextFeedbackSignals } from './feedback.js';
13
+ import { captureProjectManifestSnapshot, resolveProjectFingerprint, } from '../repository/project-fingerprint.js';
14
+ import { entryOriginMatchesWorkspace } from './origin.js';
15
+ import { isExternalSkillReference } from '../skills/store.js';
16
+ import { contextRetrievalStateHash, ordinaryContextSelectionStateHash } from './selection-state.js';
17
+ import { readContextRunRetrievalState } from './run-state.js';
18
+ export const SCOPED_CONTEXT_POLICY_VERSION = 'context-ranking-v4';
19
+ export const SCOPED_CONTEXT_DEFAULT_CHARACTER_BUDGET = 8_000;
20
+ export const SCOPED_CONTEXT_MAX_CHARACTER_BUDGET = 100_000;
21
+ function normalizedScopedGateDecision(value) {
22
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
23
+ throw new TypeError('Scoped context gate returned an invalid decision');
24
+ }
25
+ const prototype = Object.getPrototypeOf(value);
26
+ const keys = Reflect.ownKeys(value);
27
+ if ((prototype !== Object.prototype && prototype !== null)
28
+ || keys.some((key) => typeof key !== 'string'
29
+ || key !== 'persist' && key !== 'value' && key !== 'assertBeforePersist')
30
+ || !keys.includes('persist')
31
+ || !keys.includes('value')) {
32
+ throw new TypeError('Scoped context gate returned an invalid decision');
33
+ }
34
+ const persistDescriptor = Object.getOwnPropertyDescriptor(value, 'persist');
35
+ const resultDescriptor = Object.getOwnPropertyDescriptor(value, 'value');
36
+ const assertionDescriptor = Object.getOwnPropertyDescriptor(value, 'assertBeforePersist');
37
+ if (persistDescriptor === undefined
38
+ || !Object.hasOwn(persistDescriptor, 'value')
39
+ || typeof persistDescriptor.value !== 'boolean'
40
+ || resultDescriptor === undefined
41
+ || !Object.hasOwn(resultDescriptor, 'value')
42
+ || assertionDescriptor !== undefined
43
+ && (!Object.hasOwn(assertionDescriptor, 'value') || typeof assertionDescriptor.value !== 'function')) {
44
+ throw new TypeError('Scoped context gate returned an invalid decision');
45
+ }
46
+ return {
47
+ persist: persistDescriptor.value,
48
+ value: resultDescriptor.value,
49
+ ...(assertionDescriptor === undefined
50
+ ? {}
51
+ : { assertBeforePersist: assertionDescriptor.value }),
52
+ };
53
+ }
8
54
  const MAX_LIMIT = 100;
9
- const MAX_BUDGET = 100_000;
10
55
  function normalize(value) {
11
56
  return value.normalize('NFKC').toLowerCase();
12
57
  }
58
+ function characterCount(value) {
59
+ return Array.from(value).length;
60
+ }
61
+ function takeCharacters(value, limit) {
62
+ return Array.from(value).slice(0, Math.max(0, limit)).join('');
63
+ }
13
64
  function textFor(query) {
14
65
  return [
15
66
  query.task,
@@ -60,7 +111,7 @@ function applicabilityScore(entry, queryText, origin) {
60
111
  conflict: false,
61
112
  };
62
113
  }
63
- function entryScore(entry, origin, retrieval, exact, query, queryText) {
114
+ function entryScore(entry, origin, retrieval, exact, queryText) {
64
115
  const scope = origin;
65
116
  const status = entry.status === 'verified' ? 100 : entry.status === 'candidate' ? 40 : 0;
66
117
  const trust = entry.trustLevel === 'system_verified' ? 30 : entry.trustLevel === 'source_verified' ? 25 : entry.trustLevel === 'user_asserted' ? 15 : 0;
@@ -76,7 +127,7 @@ function entryScore(entry, origin, retrieval, exact, query, queryText) {
76
127
  origin: scope,
77
128
  title: entry.title,
78
129
  summary: entry.summary,
79
- bodyPreview: entry.summary ?? entry.body,
130
+ bodyPreview: entry.body,
80
131
  score,
81
132
  scoreComponents: {
82
133
  status,
@@ -99,51 +150,378 @@ function entryScore(entry, origin, retrieval, exact, query, queryText) {
99
150
  };
100
151
  }
101
152
  function feedbackScore(database, entryId) {
102
- const rows = database.prepare(`
103
- SELECT verdict, COUNT(DISTINCT run_id) AS runs
104
- FROM context_feedback
105
- WHERE entry_id = ?
106
- GROUP BY verdict
107
- `).all(entryId);
108
153
  let score = 0;
109
154
  const reasons = [];
110
- for (const row of rows) {
111
- const influence = Math.min(2, Number(row.runs));
112
- if (row.verdict === 'helpful') {
113
- score += 3 * influence;
155
+ for (const signal of contextFeedbackSignals(database, entryId)) {
156
+ if (signal.verdict === 'helpful') {
157
+ score += 3 * signal.boundedInfluence;
114
158
  reasons.push('helpful_feedback');
115
159
  }
116
- if (row.verdict === 'irrelevant') {
117
- score -= 2 * influence;
160
+ if (signal.verdict === 'irrelevant') {
161
+ score -= 2 * signal.boundedInfluence;
118
162
  reasons.push('irrelevant_feedback');
119
163
  }
120
- if (row.verdict === 'stale') {
121
- score -= 3 * influence;
164
+ if (signal.verdict === 'stale') {
165
+ score -= 3 * signal.boundedInfluence;
122
166
  reasons.push('stale_feedback');
123
167
  }
124
- if (row.verdict === 'conflicting') {
125
- score -= 3 * influence;
168
+ if (signal.verdict === 'conflicting') {
169
+ score -= 3 * signal.boundedInfluence;
126
170
  reasons.push('conflicting_feedback');
127
171
  }
128
172
  }
129
173
  return { score: Math.max(-6, Math.min(6, score)), reasons };
130
174
  }
131
- export async function queryScopedContext(database, raw) {
132
- const project = raw.project ?? await resolveProjectWorkspace(database, raw.cwd);
175
+ function assertScopedSelectionState(database, workspaces, expectedHash) {
176
+ if (contextRetrievalStateHash(database, workspaces, { includeEcosystem: workspaces.length > 0 }) !== expectedHash) {
177
+ throw new KiokukoError('CONFLICT', 'Scoped context catalog changed after ranking');
178
+ }
179
+ }
180
+ function fitScopedItems(ordered, limit, characterBudget) {
181
+ const items = [];
182
+ let remaining = characterBudget;
183
+ let truncated = false;
184
+ for (const item of ordered) {
185
+ if (items.length >= limit) {
186
+ truncated = true;
187
+ break;
188
+ }
189
+ const metadataCost = characterCount(item.title) + characterCount(item.summary ?? '');
190
+ if (metadataCost > remaining) {
191
+ if (items.length === 0) {
192
+ throw new KiokukoError('VALIDATION_ERROR', 'Scoped context character budget cannot fit candidate metadata');
193
+ }
194
+ truncated = true;
195
+ break;
196
+ }
197
+ const bodyPreview = takeCharacters(item.bodyPreview, remaining - metadataCost);
198
+ if (characterCount(bodyPreview) < characterCount(item.bodyPreview))
199
+ truncated = true;
200
+ const cost = metadataCost + characterCount(bodyPreview);
201
+ items.push({
202
+ ...item,
203
+ bodyPreview,
204
+ scoreComponents: { ...item.scoreComponents },
205
+ selectionReasons: [...item.selectionReasons],
206
+ });
207
+ remaining -= cost;
208
+ }
209
+ return { items, charCount: characterBudget - remaining, truncated };
210
+ }
211
+ function scopedRunContext(database, runId) {
212
+ if (runId === undefined)
213
+ return null;
214
+ let state;
215
+ try {
216
+ state = readContextRunRetrievalState(database, runId);
217
+ }
218
+ catch (error) {
219
+ if (error instanceof KiokukoError && error.code === 'NOT_FOUND') {
220
+ throw new KiokukoError('VALIDATION_ERROR', 'Scoped context run is invalid');
221
+ }
222
+ throw error;
223
+ }
224
+ return {
225
+ runId,
226
+ workspace: state.run.workspace,
227
+ status: state.run.status,
228
+ throughSequence: state.run.lastSequence,
229
+ createdAt: state.run.createdAt,
230
+ intakeSessionId: state.intakeSessionId,
231
+ profileHash: state.profileHash,
232
+ stateHash: state.stateHash,
233
+ };
234
+ }
235
+ function scopedDeliveryId(delivery) {
236
+ return `context-${canonicalContentHash({
237
+ kind: 'scoped-context-delivery-v1',
238
+ workspace: delivery.workspace,
239
+ runId: delivery.runId,
240
+ throughSequence: delivery.throughSequence,
241
+ intakeSessionId: delivery.intakeSessionId,
242
+ taskProfileHash: delivery.taskProfileHash,
243
+ queryHash: delivery.queryHash,
244
+ policyVersion: delivery.policyVersion,
245
+ charBudget: delivery.charBudget,
246
+ charCount: delivery.charCount,
247
+ truncated: delivery.truncated,
248
+ createdAt: delivery.createdAt,
249
+ scoreSchemaVersion: delivery.scoreSchemaVersion ?? 1,
250
+ items: delivery.items.map((item) => ({
251
+ entryId: item.entryId,
252
+ entryRevision: item.entryRevision,
253
+ rank: item.rank,
254
+ scoreComponents: item.scoreComponents,
255
+ selectionReasons: item.selectionReasons,
256
+ ...(item.origin === undefined ? {} : { origin: item.origin }),
257
+ })),
258
+ })}`;
259
+ }
260
+ function assertScopedDeliveryIdentity(delivery) {
261
+ if (delivery.deliveryId !== scopedDeliveryId(delivery)) {
262
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored scoped context character accounting is invalid');
263
+ }
264
+ }
265
+ function assertScopedReplayDeliveryUnchanged(database, expected) {
266
+ let current;
267
+ try {
268
+ current = readContextDelivery(database, {
269
+ workspace: expected.workspace,
270
+ deliveryId: expected.deliveryId,
271
+ });
272
+ }
273
+ catch (error) {
274
+ if (error instanceof KiokukoError && error.code === 'NOT_FOUND') {
275
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored scoped context delivery disappeared during replay');
276
+ }
277
+ throw error;
278
+ }
279
+ assertScopedDeliveryIdentity(current);
280
+ if (scopedDeliveryId(current) !== scopedDeliveryId(expected)) {
281
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored scoped context delivery changed during replay');
282
+ }
283
+ }
284
+ function currentRetrievableDeliveryEntry(database, runWorkspace, item) {
285
+ const candidate = database.prepare('SELECT workspace FROM entries WHERE id = ?')
286
+ .get(item.entryId);
287
+ if (candidate === undefined) {
288
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored scoped context entry is missing');
289
+ }
290
+ if (typeof candidate.workspace !== 'string' || candidate.workspace.length === 0) {
291
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored scoped context entry is invalid');
292
+ }
293
+ const origin = item.origin ?? 'project';
294
+ let deliveredRevision;
295
+ try {
296
+ deliveredRevision = readEntryRevision(database, {
297
+ workspace: candidate.workspace,
298
+ entryId: item.entryId,
299
+ revision: item.entryRevision,
300
+ });
301
+ }
302
+ catch (error) {
303
+ if (error instanceof KiokukoError && error.code === 'NOT_FOUND') {
304
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored scoped context entry revision is missing');
305
+ }
306
+ throw error;
307
+ }
308
+ const deliveredScope = decodeStoredStructuredScope(deliveredRevision.scope, origin !== 'project').canonicalScope;
309
+ if (!entryOriginMatchesWorkspace({ origin, runWorkspace, entryWorkspace: deliveredRevision.workspace })) {
310
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored scoped context entry origin is invalid');
311
+ }
312
+ if (origin === 'global'
313
+ && (deliveredScope.visibility !== 'global' || effectiveRetrievalScope(deliveredScope) !== 'global')) {
314
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored scoped context entry scope is invalid');
315
+ }
316
+ if (origin === 'ecosystem'
317
+ && (!Object.hasOwn(deliveredScope, 'retrievalScope')
318
+ || effectiveRetrievalScope(deliveredScope) !== 'ecosystem'
319
+ || !hasExplicitApplicability(deliveredScope))) {
320
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored scoped context entry scope is invalid');
321
+ }
322
+ if (isExternalSkillReference(deliveredRevision)) {
323
+ const mappings = database.prepare('SELECT COUNT(*) AS count FROM external_skill_entries WHERE entry_id = ?')
324
+ .get(item.entryId)?.count;
325
+ if (typeof mappings !== 'number' || !Number.isSafeInteger(mappings) || mappings < 1) {
326
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored scoped context external entry mapping is missing');
327
+ }
328
+ }
329
+ const entry = readEntry(database, { workspace: candidate.workspace, entryId: item.entryId }, { requireStructuredScope: origin !== 'project' });
330
+ const retrievable = isRetrievableEntry(database, entry);
331
+ if (entry.revision !== item.entryRevision)
332
+ return null;
333
+ if (!retrievable)
334
+ return null;
335
+ if (entry.status === 'superseded')
336
+ return null;
337
+ return entry;
338
+ }
339
+ function storedDeliveryIsRetrievable(database, delivery, throughSequence, taskProfileHash, limit, characterBudget) {
340
+ assertScopedDeliveryIdentity(delivery);
341
+ if (delivery.throughSequence !== throughSequence)
342
+ return false;
343
+ if (!delivery.items.every((item) => currentRetrievableDeliveryEntry(database, delivery.workspace, item) !== null))
344
+ return false;
345
+ return !(delivery.taskProfileHash !== taskProfileHash
346
+ || delivery.policyVersion !== SCOPED_CONTEXT_POLICY_VERSION
347
+ || delivery.scoreSchemaVersion !== 2
348
+ || delivery.charBudget !== characterBudget
349
+ || delivery.items.length > limit);
350
+ }
351
+ function replayableDelivery(database, run, queryHash, taskProfileHash, limit, characterBudget) {
352
+ if (run === null)
353
+ return null;
354
+ const rows = database.prepare(`
355
+ SELECT delivery_id AS deliveryId
356
+ FROM context_deliveries
357
+ WHERE run_id = ? AND query_hash = ?
358
+ ORDER BY delivery_id ASC
359
+ `).all(run.runId, queryHash);
360
+ for (const row of rows) {
361
+ const delivery = readContextDelivery(database, { workspace: run.workspace, deliveryId: row.deliveryId });
362
+ if (storedDeliveryIsRetrievable(database, delivery, run.throughSequence, taskProfileHash, limit, characterBudget))
363
+ return delivery;
364
+ }
365
+ return null;
366
+ }
367
+ function storedScopedItems(database, delivery) {
368
+ assertScopedDeliveryIdentity(delivery);
369
+ const fullItems = delivery.items.map((item) => {
370
+ const current = currentRetrievableDeliveryEntry(database, delivery.workspace, item);
371
+ if (current === null)
372
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored scoped context entry is no longer retrievable');
373
+ const revision = readEntryRevision(database, {
374
+ entryId: item.entryId,
375
+ workspace: current.workspace,
376
+ revision: item.entryRevision,
377
+ });
378
+ const scoreComponents = item.scoreComponents;
379
+ return {
380
+ entryId: item.entryId,
381
+ revision: item.entryRevision,
382
+ origin: item.origin ?? 'project',
383
+ title: revision.title,
384
+ summary: revision.summary,
385
+ bodyPreview: revision.body,
386
+ score: Object.values(scoreComponents).reduce((total, component) => total + component, 0),
387
+ scoreComponents: { ...scoreComponents },
388
+ selectionReasons: [...item.selectionReasons],
389
+ metadata: { storedData: true, untrusted: true, instructions: false },
390
+ };
391
+ });
392
+ const fitted = fitScopedItems(fullItems, fullItems.length || 1, delivery.charBudget);
393
+ if (fitted.charCount !== delivery.charCount
394
+ || fitted.items.length !== delivery.items.length
395
+ || (fitted.truncated && !delivery.truncated)) {
396
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored scoped context character accounting is invalid');
397
+ }
398
+ return fitted.items;
399
+ }
400
+ function deliveryItems(items) {
401
+ const allowedReasons = new Set(CONTEXT_SELECTION_REASON_ORDER);
402
+ return items.map((item, index) => ({
403
+ entryId: item.entryId,
404
+ entryRevision: item.revision,
405
+ rank: index + 1,
406
+ scoreComponents: { ...item.scoreComponents },
407
+ selectionReasons: [...new Set([
408
+ ...item.selectionReasons.filter((reason) => allowedReasons.has(reason)),
409
+ item.scoreComponents.status >= 100 ? 'verified' : 'candidate',
410
+ ])].sort((left, right) => CONTEXT_SELECTION_REASON_ORDER.findIndex((reason) => reason === left)
411
+ - CONTEXT_SELECTION_REASON_ORDER.findIndex((reason) => reason === right)),
412
+ ...(item.origin === 'project' ? {} : { origin: item.origin }),
413
+ }));
414
+ }
415
+ function deliveryRequest(run, taskProfileHash, queryHash, characterBudget, fitted) {
416
+ return {
417
+ workspace: run.workspace,
418
+ runId: run.runId,
419
+ throughSequence: run.throughSequence,
420
+ intakeSessionId: run.intakeSessionId,
421
+ taskProfileHash,
422
+ queryHash,
423
+ policyVersion: SCOPED_CONTEXT_POLICY_VERSION,
424
+ charBudget: characterBudget,
425
+ charCount: fitted.charCount,
426
+ truncated: fitted.truncated,
427
+ createdAt: run.createdAt,
428
+ scoreSchemaVersion: 2,
429
+ items: deliveryItems(fitted.items),
430
+ };
431
+ }
432
+ async function prepareScopedContext(database, raw) {
433
+ const taskProfileHash = canonicalContentHash(raw.taskProfile);
434
+ const run = scopedRunContext(database, raw.runId);
435
+ if (run !== null && run.profileHash !== taskProfileHash) {
436
+ throw new KiokukoError('CONFLICT', 'Scoped context task profile does not match its run');
437
+ }
438
+ const resolvedProject = raw.project ?? await resolveProjectWorkspace(database, raw.cwd);
439
+ const project = resolvedProject === undefined ? undefined : { ...resolvedProject };
440
+ if (run !== null && (project === undefined || run.workspace !== project.workspace)) {
441
+ throw new KiokukoError('VALIDATION_ERROR', 'Scoped context run is invalid');
442
+ }
443
+ if (raw.fingerprint !== undefined && project === undefined) {
444
+ throw new KiokukoError('VALIDATION_ERROR', 'Scoped context fingerprint requires a project');
445
+ }
446
+ const manifestSnapshot = project === undefined ? undefined : captureProjectManifestSnapshot(project);
447
+ if (raw.fingerprint !== undefined
448
+ && manifestSnapshot !== undefined
449
+ && raw.fingerprint.manifestDigest !== manifestSnapshot.manifestDigest) {
450
+ throw new KiokukoError('CONFLICT', 'Project manifest changed while task context was being prepared');
451
+ }
452
+ const fingerprint = project === undefined || manifestSnapshot === undefined
453
+ ? undefined
454
+ : resolveProjectFingerprint(database, project, manifestSnapshot);
455
+ if (raw.fingerprint !== undefined
456
+ && fingerprint !== undefined
457
+ && canonicalContentHash(raw.fingerprint) !== canonicalContentHash(fingerprint)) {
458
+ throw new KiokukoError('CONFLICT', 'Project manifest changed while task context was being prepared');
459
+ }
460
+ const projectState = project === undefined || fingerprint === undefined ? null : { project, fingerprint };
133
461
  ensureGlobalWorkspace(database);
134
462
  const limit = raw.limit ?? 20;
135
- const characterBudget = raw.characterBudget ?? 8_000;
136
- if (!Number.isSafeInteger(limit) || limit < 1 || limit > MAX_LIMIT || !Number.isSafeInteger(characterBudget) || characterBudget < 1 || characterBudget > MAX_BUDGET) {
137
- throw new Error('Scoped context bounds are invalid');
463
+ const characterBudget = raw.characterBudget ?? SCOPED_CONTEXT_DEFAULT_CHARACTER_BUDGET;
464
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > MAX_LIMIT || !Number.isSafeInteger(characterBudget) || characterBudget < 1 || characterBudget > SCOPED_CONTEXT_MAX_CHARACTER_BUDGET) {
465
+ throw new KiokukoError('VALIDATION_ERROR', 'Scoped context bounds are invalid');
138
466
  }
139
467
  const queryText = textFor(raw);
140
- const taskProfileHash = canonicalContentHash(raw.taskProfile);
141
- const queryHash = canonicalContentHash({ task: raw.task, taskProfile: raw.taskProfile, recommendedTags: raw.recommendedTags ?? [], changedPaths: raw.changedPaths ?? [], errorSignatures: raw.errorSignatures ?? [] });
468
+ const selectionWorkspaces = project === undefined ? [] : [project.workspace, GLOBAL_WORKSPACE];
469
+ const selectionStateHash = ordinaryContextSelectionStateHash(database, selectionWorkspaces, {
470
+ includeEcosystem: project !== undefined,
471
+ });
472
+ const retrievalStateHash = contextRetrievalStateHash(database, selectionWorkspaces, {
473
+ includeEcosystem: project !== undefined,
474
+ });
475
+ const queryHash = canonicalContentHash({
476
+ task: raw.task,
477
+ taskProfile: raw.taskProfile,
478
+ recommendedTags: raw.recommendedTags ?? [],
479
+ changedPaths: raw.changedPaths ?? [],
480
+ errorSignatures: raw.errorSignatures ?? [],
481
+ project: project === undefined ? null : {
482
+ workspace: project.workspace,
483
+ repositoryId: project.repositoryId,
484
+ repositoryRoot: project.repositoryRoot,
485
+ fingerprint,
486
+ },
487
+ limit,
488
+ characterBudget,
489
+ policyVersion: SCOPED_CONTEXT_POLICY_VERSION,
490
+ retrievalStateHash,
491
+ runStateHash: run?.stateHash ?? null,
492
+ });
493
+ const replay = replayableDelivery(database, run, queryHash, taskProfileHash, limit, characterBudget);
494
+ if (replay !== null) {
495
+ return {
496
+ result: {
497
+ project: project ?? null,
498
+ taskProfileHash,
499
+ queryHash,
500
+ policyVersion: SCOPED_CONTEXT_POLICY_VERSION,
501
+ items: storedScopedItems(database, replay),
502
+ deliveryId: replay.deliveryId,
503
+ truncated: replay.truncated,
504
+ untrusted: true,
505
+ },
506
+ replayDelivery: replay,
507
+ selectionStateHash,
508
+ retrievalStateHash,
509
+ selectionWorkspaces,
510
+ pendingDelivery: null,
511
+ run,
512
+ projectState,
513
+ };
514
+ }
142
515
  const candidates = new Map();
143
- const federated = project === undefined ? [] : await federatedEntries(database, { project, query: queryText, limit: 200 });
516
+ const federated = project === undefined ? [] : await federatedEntries(database, {
517
+ project,
518
+ ...(fingerprint === undefined ? {} : { fingerprint }),
519
+ query: queryText,
520
+ limit: 200,
521
+ });
144
522
  for (const hit of federated) {
145
523
  const entry = hit.entry;
146
- const item = entryScore(entry, hit.origin, hit.score, hit.selectionReasons.includes('exact_signal_match'), raw, queryText);
524
+ const item = entryScore(entry, hit.origin, hit.score, hit.selectionReasons.includes('exact_signal_match'), queryText);
147
525
  item.selectionReasons.push(...hit.selectionReasons);
148
526
  item.selectionReasons = [...new Set(item.selectionReasons)];
149
527
  const feedback = feedbackScore(database, entry.id);
@@ -156,86 +534,114 @@ export async function queryScopedContext(database, raw) {
156
534
  if (previous === undefined || item.score > previous.score)
157
535
  candidates.set(item.entryId, item);
158
536
  }
159
- const ordered = [...candidates.values()].sort((left, right) => right.score - left.score || left.entryId.localeCompare(right.entryId));
160
- const items = [];
161
- let remaining = characterBudget;
162
- for (const item of ordered.slice(0, limit + 1)) {
163
- const body = Array.from(item.bodyPreview).slice(0, remaining).join('');
164
- const cost = Array.from(item.title).length + Array.from(item.summary ?? '').length + body.length;
165
- if (remaining <= 0)
166
- break;
167
- items.push({ ...item, bodyPreview: body, scoreComponents: { ...item.scoreComponents }, selectionReasons: [...item.selectionReasons] });
168
- remaining -= cost;
169
- }
170
- let deliveryId = null;
171
- if (raw.runId !== undefined) {
172
- const run = database.prepare('SELECT run_id, workspace, last_sequence, created_at FROM ledger_runs WHERE run_id = ?').get(raw.runId);
173
- if (!run || project === undefined || run.workspace !== project.workspace)
174
- throw new Error('Scoped context run is invalid');
175
- const link = readRunIntakeLink(database, { workspace: run.workspace, runId: raw.runId });
176
- // queryHash is intentionally stable, but delivery_id is a global primary
177
- // key. Include the run so the same successful reasoning path can recur in
178
- // independent runs without colliding, while replay within one run remains
179
- // idempotent.
180
- deliveryId = `context-${canonicalContentHash({ runId: raw.runId, queryHash })}`;
181
- const allowedReasons = new Set(CONTEXT_SELECTION_REASON_ORDER);
182
- const deliveryItems = items.slice(0, limit).map((item, index) => ({
183
- entryId: item.entryId,
184
- entryRevision: item.revision,
185
- rank: index + 1,
186
- scoreComponents: {
187
- status: item.scoreComponents.status,
188
- trust: item.scoreComponents.trust,
189
- confidence: item.scoreComponents.confidence,
190
- retrieval: item.scoreComponents.retrieval,
191
- taskAffinity: item.scoreComponents.taskAffinity,
192
- recommendedTags: item.scoreComponents.recommendedTags,
193
- scopeAffinity: item.scoreComponents.scopeAffinity,
194
- applicability: item.scoreComponents.applicability,
195
- pathOverlap: item.scoreComponents.pathOverlap,
196
- errorSignature: item.scoreComponents.errorSignature,
197
- exactSignal: item.scoreComponents.exactSignal,
198
- feedback: item.scoreComponents.feedback,
199
- recency: 0,
200
- contradiction: 0,
201
- },
202
- selectionReasons: [...new Set([...item.selectionReasons.filter((reason) => allowedReasons.has(reason)), item.scoreComponents.status >= 100 ? 'verified' : 'candidate'])]
203
- .sort((left, right) => CONTEXT_SELECTION_REASON_ORDER.findIndex((reason) => reason === left) - CONTEXT_SELECTION_REASON_ORDER.findIndex((reason) => reason === right)),
204
- ...(item.origin === 'project' ? {} : { origin: item.origin }),
205
- }));
206
- recordContextDelivery(database, {
207
- workspace: run.workspace,
208
- deliveryId,
209
- runId: raw.runId,
210
- throughSequence: run.last_sequence,
211
- intakeSessionId: link.sessionId,
537
+ const ordered = [...candidates.values()].sort((left, right) => right.score - left.score || compareCanonicalStrings(left.entryId, right.entryId));
538
+ const fitted = fitScopedItems(ordered, limit, characterBudget);
539
+ return {
540
+ result: {
541
+ project: project ?? null,
212
542
  taskProfileHash,
213
543
  queryHash,
214
544
  policyVersion: SCOPED_CONTEXT_POLICY_VERSION,
215
- externalSyncSummary: { attempted: false, imported: 0, sources: [] },
216
- charBudget: characterBudget,
217
- charCount: deliveryItems.reduce((total, item) => total + (items.find((candidate) => candidate.entryId === item.entryId)?.bodyPreview.length ?? 0), 0),
218
- truncated: ordered.length > limit || items.length > limit,
219
- createdAt: run.created_at,
220
- scoreSchemaVersion: 2,
221
- items: deliveryItems,
545
+ items: fitted.items,
546
+ deliveryId: null,
547
+ truncated: fitted.truncated,
548
+ untrusted: true,
549
+ },
550
+ replayDelivery: null,
551
+ selectionStateHash,
552
+ retrievalStateHash,
553
+ selectionWorkspaces,
554
+ pendingDelivery: run === null ? null : deliveryRequest(run, taskProfileHash, queryHash, characterBudget, fitted),
555
+ run,
556
+ projectState,
557
+ };
558
+ }
559
+ function assertPreparedScopedRun(database, run) {
560
+ const current = readContextRunRetrievalState(database, run.runId);
561
+ if (run.status !== 'active'
562
+ || current.run.workspace !== run.workspace
563
+ || current.run.status !== run.status
564
+ || current.run.lastSequence !== run.throughSequence
565
+ || current.intakeSessionId !== run.intakeSessionId
566
+ || current.profileHash !== run.profileHash
567
+ || current.stateHash !== run.stateHash) {
568
+ throw new KiokukoError('CONFLICT', 'Scoped context run changed before persistence');
569
+ }
570
+ }
571
+ function assertPreparedScopedState(database, prepared) {
572
+ if (prepared.projectState !== null) {
573
+ const manifestSnapshot = captureProjectManifestSnapshot(prepared.projectState.project);
574
+ if (manifestSnapshot.manifestDigest !== prepared.projectState.fingerprint.manifestDigest) {
575
+ throw new KiokukoError('CONFLICT', 'Scoped context project state changed after ranking');
576
+ }
577
+ const currentFingerprint = resolveProjectFingerprint(database, prepared.projectState.project, manifestSnapshot, { readOnly: true });
578
+ if (canonicalContentHash(currentFingerprint) !== canonicalContentHash(prepared.projectState.fingerprint)) {
579
+ throw new KiokukoError('CONFLICT', 'Scoped context project state changed after ranking');
580
+ }
581
+ }
582
+ if (prepared.run !== null)
583
+ assertPreparedScopedRun(database, prepared.run);
584
+ const workspace = prepared.run?.workspace ?? prepared.result.project?.workspace;
585
+ if (workspace !== undefined && prepared.result.items.some((item) => currentRetrievableDeliveryEntry(database, workspace, {
586
+ entryId: item.entryId,
587
+ entryRevision: item.revision,
588
+ origin: item.origin,
589
+ }) === null)) {
590
+ throw new KiokukoError('CONFLICT', 'Scoped context selection changed before return');
591
+ }
592
+ assertScopedSelectionState(database, prepared.selectionWorkspaces, prepared.retrievalStateHash);
593
+ if (prepared.replayDelivery !== null) {
594
+ assertScopedReplayDeliveryUnchanged(database, prepared.replayDelivery);
595
+ }
596
+ }
597
+ function persistPreparedScopedContext(database, prepared, assertBeforePersist) {
598
+ if (prepared.pendingDelivery === null) {
599
+ return withImmediateTransaction(database, () => {
600
+ assertPreparedScopedState(database, prepared);
601
+ if (assertBeforePersist !== undefined) {
602
+ assertBeforePersist();
603
+ assertPreparedScopedState(database, prepared);
604
+ }
605
+ return prepared.result;
222
606
  });
223
607
  }
224
- return {
225
- project: project ?? null,
226
- taskProfileHash,
227
- queryHash,
228
- policyVersion: SCOPED_CONTEXT_POLICY_VERSION,
229
- items: items.slice(0, limit),
230
- deliveryId,
231
- truncated: ordered.length > limit || items.length > limit,
232
- untrusted: true,
233
- };
608
+ const request = prepared.pendingDelivery;
609
+ return withImmediateTransaction(database, () => {
610
+ if (prepared.run === null)
611
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored scoped context run is invalid');
612
+ assertPreparedScopedState(database, prepared);
613
+ if (assertBeforePersist !== undefined) {
614
+ assertBeforePersist();
615
+ assertPreparedScopedState(database, prepared);
616
+ }
617
+ const delivery = recordContextDeliveryInTransaction(database, { ...request, deliveryId: scopedDeliveryId(request) });
618
+ return {
619
+ ...prepared.result,
620
+ items: storedScopedItems(database, delivery),
621
+ deliveryId: delivery.deliveryId,
622
+ truncated: delivery.truncated,
623
+ };
624
+ });
234
625
  }
235
- export function entryOrigin(entry) {
236
- return entry.workspace === GLOBAL_WORKSPACE ? 'global' : 'project';
626
+ export async function queryScopedContext(database, raw) {
627
+ return persistPreparedScopedContext(database, await prepareScopedContext(database, raw));
237
628
  }
238
- export function structuredScope(entry) {
239
- return { ...entry.scope };
629
+ export async function queryScopedContextGated(database, raw, decide) {
630
+ const prepared = await prepareScopedContext(database, raw);
631
+ const decision = normalizedScopedGateDecision(decide(prepared.result));
632
+ if (!decision.persist) {
633
+ withImmediateTransaction(database, () => {
634
+ assertPreparedScopedState(database, prepared);
635
+ if (decision.assertBeforePersist !== undefined) {
636
+ decision.assertBeforePersist();
637
+ assertPreparedScopedState(database, prepared);
638
+ }
639
+ });
640
+ }
641
+ return {
642
+ context: decision.persist ? persistPreparedScopedContext(database, prepared, decision.assertBeforePersist) : null,
643
+ value: decision.value,
644
+ selectionStateHash: prepared.selectionStateHash,
645
+ };
240
646
  }
241
647
  //# sourceMappingURL=scoped-broker.js.map