@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,71 +1,270 @@
1
1
  import { KiokukoError } from '../errors.js';
2
- import { recallScopedMemory } from '../memory/scoped-memory.js';
3
- import { resolveProjectWorkspace } from '../memory/workspaces.js';
2
+ import { LedgerStore } from '../ledger/store.js';
3
+ import { readEntry } from '../memory/entries.js';
4
+ import { isRetrievableEntry } from '../memory/hybrid-retrieval.js';
5
+ import { effectiveRetrievalScope, hasExplicitApplicability } from '../memory/structured-memory.js';
6
+ import { GLOBAL_WORKSPACE, resolveProjectWorkspace, resolveProjectWorkspaceReadOnly, } from '../memory/workspaces.js';
4
7
  import { getAkinatorContextService } from './service.js';
5
- import { decideExternalSkillFallback, resolveCapabilities } from './capabilities.js';
8
+ import { deriveMemoryUseSignal, hasActionableMemorySelection, memoryReasoningCapabilityAvailability, memoryReasoningRequired, normalizeCapabilityCatalog, resolveCapabilities, } from './capabilities.js';
9
+ import { capabilityCatalogDigest } from './capability-binding.js';
10
+ import { claimAgentTaskSkillDiscoveryAttempt, completeAgentTaskSkillDiscoveryAttempt, failAgentTaskSkillDiscoveryAttempt, readAgentTaskSkillDiscoveryAttempt, } from './skill-discovery-attempt.js';
6
11
  import { AgentGatewayService } from '../gateway/agent-service.js';
7
12
  import { canonicalContentHash } from '../serialization/validate.js';
8
- import { queryScopedContext } from '../context/scoped-broker.js';
13
+ import { queryScopedContextGated, SCOPED_CONTEXT_DEFAULT_CHARACTER_BUDGET, SCOPED_CONTEXT_MAX_CHARACTER_BUDGET, } from '../context/scoped-broker.js';
14
+ import { contextFeedbackSignals } from '../context/feedback.js';
15
+ import { entryOriginMatchesWorkspace } from '../context/origin.js';
16
+ import { readContextBrokerRunState } from '../context/broker.js';
17
+ import { ordinaryContextSelectionStateHash } from '../context/selection-state.js';
9
18
  import { deriveAkinatorReasoning } from './reasoning.js';
10
- const DEFAULT_MAX_CONTEXT_CHARS = 12_000;
19
+ import { assertProjectManifestSnapshotBinding, bindProjectManifestSnapshot, captureProjectManifestSnapshot, resolveProjectFingerprint, } from '../repository/project-fingerprint.js';
20
+ import { readSkillDiscoveryConfig } from '../skills/config.js';
21
+ import { discoverSkills } from '../skills/discovery-service.js';
22
+ import { isExternalSkillReference } from '../skills/store.js';
23
+ const AGENT_TASK_DISCOVERY_BINDING_METADATA_KEY = 'kiokukoAgentTaskDiscoveryBinding';
24
+ const AGENT_TASK_DISCOVERY_BINDING_VERSION = 1;
25
+ const AGENT_TASK_DISCOVERY_BINDING_FIELDS = new Set(['version', 'mode', 'requestDigest']);
26
+ const AGENT_TASK_CONTEXT_BINDING_METADATA_KEY = 'kiokukoAgentTaskContextBinding';
27
+ const AGENT_TASK_CONTEXT_BINDING_VERSION = 1;
28
+ const AGENT_TASK_CONTEXT_BINDING_FIELDS = new Set(['version', 'maxContextChars']);
29
+ const AGENT_TASK_REQUEST_ID_MAX_LENGTH = 256;
30
+ const CONTROL_CHARACTERS = /\p{Cc}/u;
31
+ function taskRequestId(value) {
32
+ if (typeof value !== 'string'
33
+ || value.length === 0
34
+ || value.length > AGENT_TASK_REQUEST_ID_MAX_LENGTH
35
+ || value.trim() !== value
36
+ || CONTROL_CHARACTERS.test(value)) {
37
+ throw new KiokukoError('VALIDATION_ERROR', 'Task request ID must be a bounded non-empty opaque string');
38
+ }
39
+ return value;
40
+ }
41
+ function taskContextCharacterBudget(value) {
42
+ if (value === undefined)
43
+ return SCOPED_CONTEXT_DEFAULT_CHARACTER_BUDGET;
44
+ if (!Number.isSafeInteger(value) || value < 1 || value > SCOPED_CONTEXT_MAX_CHARACTER_BUDGET) {
45
+ throw new KiokukoError('VALIDATION_ERROR', 'Task context character budget is invalid');
46
+ }
47
+ return value;
48
+ }
49
+ function emptySkillDiscovery(mode) {
50
+ return { attempted: false, mode, requirements: [], queries: [], cacheHits: 0, candidates: 0, selected: [], failures: [] };
51
+ }
52
+ function skillDiscoveryRequestIdentity(mode, capabilities) {
53
+ const normalized = normalizeCapabilityCatalog(capabilities);
54
+ const effectiveMode = mode === 'community' && normalized.availability === 'unknown' ? 'official' : mode;
55
+ return {
56
+ mode: effectiveMode,
57
+ capabilityCatalogDigest: capabilityCatalogDigest(capabilities),
58
+ };
59
+ }
60
+ function bindSkillDiscoveryRequest(metadata, request) {
61
+ if (Object.hasOwn(metadata, AGENT_TASK_DISCOVERY_BINDING_METADATA_KEY)) {
62
+ throw new KiokukoError('VALIDATION_ERROR', 'Run metadata contains a reserved task discovery binding');
63
+ }
64
+ return {
65
+ ...metadata,
66
+ [AGENT_TASK_DISCOVERY_BINDING_METADATA_KEY]: {
67
+ version: AGENT_TASK_DISCOVERY_BINDING_VERSION,
68
+ mode: request.mode,
69
+ requestDigest: canonicalContentHash(request),
70
+ },
71
+ };
72
+ }
73
+ function assertSkillDiscoveryRequestBinding(metadata, request) {
74
+ const binding = metadata[AGENT_TASK_DISCOVERY_BINDING_METADATA_KEY];
75
+ if (typeof binding !== 'object'
76
+ || binding === null
77
+ || Array.isArray(binding)
78
+ || Object.getPrototypeOf(binding) !== Object.prototype
79
+ || Object.keys(binding).length !== AGENT_TASK_DISCOVERY_BINDING_FIELDS.size
80
+ || Object.keys(binding).some((key) => !AGENT_TASK_DISCOVERY_BINDING_FIELDS.has(key))
81
+ || binding.version !== AGENT_TASK_DISCOVERY_BINDING_VERSION
82
+ || typeof binding.mode !== 'string'
83
+ || !['off', 'official', 'community'].includes(binding.mode)
84
+ || typeof binding.requestDigest !== 'string'
85
+ || !/^[0-9a-f]{64}$/u.test(binding.requestDigest)) {
86
+ throw new KiokukoError('INTEGRITY_ERROR', 'Run task discovery binding is missing or invalid');
87
+ }
88
+ if (binding.mode !== request.mode || binding.requestDigest !== canonicalContentHash(request)) {
89
+ throw new KiokukoError('CONFLICT', 'Skill discovery request differs from the request bound when the run was opened');
90
+ }
91
+ }
92
+ function bindTaskContextRequest(metadata, maxContextChars) {
93
+ if (Object.hasOwn(metadata, AGENT_TASK_CONTEXT_BINDING_METADATA_KEY)) {
94
+ throw new KiokukoError('VALIDATION_ERROR', 'Run metadata contains a reserved task context binding');
95
+ }
96
+ return {
97
+ ...metadata,
98
+ [AGENT_TASK_CONTEXT_BINDING_METADATA_KEY]: {
99
+ version: AGENT_TASK_CONTEXT_BINDING_VERSION,
100
+ maxContextChars,
101
+ },
102
+ };
103
+ }
104
+ function assertTaskContextRequestBinding(metadata, maxContextChars) {
105
+ const binding = metadata[AGENT_TASK_CONTEXT_BINDING_METADATA_KEY];
106
+ if (typeof binding !== 'object'
107
+ || binding === null
108
+ || Array.isArray(binding)
109
+ || Object.getPrototypeOf(binding) !== Object.prototype
110
+ || Object.keys(binding).length !== AGENT_TASK_CONTEXT_BINDING_FIELDS.size
111
+ || Object.keys(binding).some((key) => !AGENT_TASK_CONTEXT_BINDING_FIELDS.has(key))
112
+ || binding.version !== AGENT_TASK_CONTEXT_BINDING_VERSION
113
+ || typeof binding.maxContextChars !== 'number'
114
+ || !Number.isSafeInteger(binding.maxContextChars)
115
+ || binding.maxContextChars < 1
116
+ || binding.maxContextChars > SCOPED_CONTEXT_MAX_CHARACTER_BUDGET) {
117
+ throw new KiokukoError('INTEGRITY_ERROR', 'Run task context binding is missing or invalid');
118
+ }
119
+ if (binding.maxContextChars !== maxContextChars) {
120
+ throw new KiokukoError('CONFLICT', 'Task context request differs from the request bound when the run was opened');
121
+ }
122
+ }
123
+ function memoryCapabilityUnavailableForTask(context, capabilities) {
124
+ return context.status === 'ready'
125
+ && (context.session.profile.taskType === 'build' || context.session.profile.taskType === 'debug')
126
+ && memoryReasoningCapabilityAvailability(capabilities) !== 'available';
127
+ }
128
+ function authoritativeTaskRun(database, runId, intakeStatus) {
129
+ const run = new LedgerStore(database).readRun(runId);
130
+ if (run === undefined)
131
+ throw new KiokukoError('NOT_FOUND', 'Task run was not found');
132
+ if (run.status !== 'intake' && run.status !== 'active') {
133
+ throw new KiokukoError('CONFLICT', 'Task run is terminal');
134
+ }
135
+ if (intakeStatus !== undefined) {
136
+ const expected = intakeStatus === 'needs_answer' ? 'intake' : 'active';
137
+ if (run.status !== expected) {
138
+ throw new KiokukoError('INTEGRITY_ERROR', 'Task run status does not match its intake state');
139
+ }
140
+ }
141
+ return run;
142
+ }
143
+ function currentAgentTaskContext(database, runId, context) {
144
+ const current = readContextBrokerRunState(database, runId);
145
+ if (current.intakeSessionId !== context.session.id || current.status !== context.status) {
146
+ throw new KiokukoError('INTEGRITY_ERROR', 'Task intake and authoritative broker state disagree');
147
+ }
148
+ return {
149
+ ...context,
150
+ session: { ...context.session, profile: { ...current.taskProfile } },
151
+ recommendedTags: [...current.recommendedTags],
152
+ };
153
+ }
154
+ function currentScopedEntry(database, runWorkspace, item) {
155
+ const row = database.prepare('SELECT workspace FROM entries WHERE id = ?')
156
+ .get(item.entryId);
157
+ if (row === undefined || typeof row.workspace !== 'string' || row.workspace.length === 0) {
158
+ throw new KiokukoError('INTEGRITY_ERROR', 'Scoped context entry is missing or invalid');
159
+ }
160
+ const entry = readEntry(database, { workspace: row.workspace, entryId: item.entryId }, { requireStructuredScope: item.origin !== 'project' });
161
+ if (entry.revision !== item.revision) {
162
+ throw new KiokukoError('CONFLICT', 'Scoped context entry changed after ranking');
163
+ }
164
+ if (!entryOriginMatchesWorkspace({
165
+ origin: item.origin,
166
+ runWorkspace,
167
+ entryWorkspace: entry.workspace,
168
+ })) {
169
+ throw new KiokukoError('INTEGRITY_ERROR', 'Scoped context entry origin is invalid');
170
+ }
171
+ if (item.origin === 'global'
172
+ && (entry.scope.visibility !== 'global' || effectiveRetrievalScope(entry.scope) !== 'global')) {
173
+ throw new KiokukoError('INTEGRITY_ERROR', 'Scoped context global entry scope is invalid');
174
+ }
175
+ if (item.origin === 'ecosystem'
176
+ && (!Object.hasOwn(entry.scope, 'retrievalScope')
177
+ || effectiveRetrievalScope(entry.scope) !== 'ecosystem'
178
+ || !hasExplicitApplicability(entry.scope))) {
179
+ throw new KiokukoError('INTEGRITY_ERROR', 'Scoped context ecosystem entry scope is invalid');
180
+ }
181
+ if (!isRetrievableEntry(database, entry)) {
182
+ throw new KiokukoError('CONFLICT', 'Scoped context entry is no longer retrievable');
183
+ }
184
+ if (entry.status === 'superseded') {
185
+ throw new KiokukoError('CONFLICT', 'Scoped context entry is no longer retrievable');
186
+ }
187
+ return entry;
188
+ }
189
+ function ordinaryScopedItems(database, runWorkspace, scopedContext) {
190
+ return scopedContext.items.filter((item) => {
191
+ const entry = currentScopedEntry(database, runWorkspace, item);
192
+ return !isExternalSkillReference(entry);
193
+ });
194
+ }
195
+ function scopedMemoryUseSignal(database, runWorkspace, scopedContext) {
196
+ const items = ordinaryScopedItems(database, runWorkspace, scopedContext);
197
+ if (hasActionableMemorySelection(items))
198
+ return 'actionable';
199
+ return items.some((item) => contextFeedbackSignals(database, item.entryId)
200
+ .some((signal) => signal.verdict === 'helpful'))
201
+ ? 'actionable'
202
+ : 'none';
203
+ }
204
+ function assertScopedMemoryUseSignal(database, runWorkspace, scopedContext, expected) {
205
+ if (scopedMemoryUseSignal(database, runWorkspace, scopedContext) !== expected) {
206
+ throw new KiokukoError('CONFLICT', 'Scoped memory capability decision changed before context persistence');
207
+ }
208
+ }
209
+ function assertOrdinaryMemoryState(database, workspaces, expectedHash) {
210
+ if (ordinaryContextSelectionStateHash(database, workspaces, { includeEcosystem: true }) !== expectedHash) {
211
+ throw new KiokukoError('CONFLICT', 'Scoped memory catalog changed while context was being prepared');
212
+ }
213
+ }
214
+ function assertAgentTaskSnapshot(database, runId, expectedRun, expectedContext) {
215
+ const currentRun = authoritativeTaskRun(database, runId, expectedContext.status);
216
+ const currentContext = currentAgentTaskContext(database, runId, expectedContext);
217
+ if (currentRun.workspace !== expectedRun.workspace
218
+ || currentRun.status !== expectedRun.status
219
+ || currentRun.lastSequence !== expectedRun.lastSequence
220
+ || canonicalContentHash(currentContext.session.profile) !== canonicalContentHash(expectedContext.session.profile)
221
+ || canonicalContentHash(currentContext.recommendedTags) !== canonicalContentHash(expectedContext.recommendedTags)) {
222
+ throw new KiokukoError('CONFLICT', 'Task run changed while external skills were being discovered');
223
+ }
224
+ }
225
+ function assertCurrentProjectManifest(project, expected) {
226
+ const current = captureProjectManifestSnapshot(project);
227
+ if (current.repositoryId !== expected.repositoryId || current.manifestDigest !== expected.manifestDigest) {
228
+ throw new KiokukoError('CONFLICT', 'Project manifest changed while task context was being prepared');
229
+ }
230
+ }
11
231
  async function requireProject(database, cwd) {
12
232
  const project = await resolveProjectWorkspace(database, cwd);
13
233
  if (!project)
14
234
  throw new KiokukoError('NOT_FOUND', 'No Git repository or .kiokuko.json binding was found for task preparation');
15
235
  return project;
16
236
  }
17
- function boundedReferences(context, maxChars) {
18
- let remaining = maxChars;
19
- const references = [];
20
- for (const entry of context.entries) {
21
- if (remaining <= 0)
22
- break;
23
- const source = entry.summary?.trim() || entry.body;
24
- const snippet = source.slice(0, remaining);
25
- if (snippet.length === 0)
26
- continue;
27
- remaining -= snippet.length;
28
- references.push({
29
- id: entry.id,
30
- title: entry.title,
31
- kind: entry.kind,
32
- status: entry.status,
33
- summary: entry.summary,
34
- snippet,
35
- tags: entry.tags,
36
- provenance: entry.provenance,
37
- metadata: { storedData: true, untrusted: true, instructions: false },
38
- });
237
+ function assertRegisteredProjectLocation(database, project) {
238
+ const registered = database.prepare(`
239
+ SELECT l.repository_id AS repositoryId, r.workspace AS workspace
240
+ FROM repository_locations AS l
241
+ JOIN repositories AS r ON r.repository_id = l.repository_id
242
+ WHERE l.canonical_root = ?
243
+ `).get(project.repositoryRoot);
244
+ if (registered === undefined) {
245
+ throw new KiokukoError('NOT_FOUND', 'Task project location is not registered');
39
246
  }
40
- return references;
41
- }
42
- async function buildPreparedTask(database, project, context, capabilities, maxContextChars = DEFAULT_MAX_CONTEXT_CHARS, run, scopedContext) {
43
- const recalledMemory = context.status === 'needs_answer'
44
- ? null
45
- : await recallScopedMemory(database, {
46
- query: context.session.task,
47
- cwd: project.repositoryRoot,
48
- scope: 'auto',
49
- limit: 8,
50
- maxChars: maxContextChars,
51
- });
52
- const memory = recalledMemory === null || scopedContext === null
53
- ? recalledMemory
54
- : {
55
- ...recalledMemory,
56
- global: recalledMemory.global === null
57
- ? null
58
- : (() => {
59
- const allowed = new Set(scopedContext.items.filter((item) => item.origin === 'global').map((item) => item.entryId));
60
- const items = recalledMemory.global.items.filter((item) => allowed.has(item.id));
61
- return { ...recalledMemory.global, items, count: items.length, truncated: recalledMemory.global.truncated || items.length !== recalledMemory.global.items.length };
62
- })(),
63
- };
247
+ if (registered.repositoryId !== project.repositoryId || registered.workspace !== project.workspace) {
248
+ throw new KiokukoError('CONFLICT', 'Task project location binding changed');
249
+ }
250
+ }
251
+ async function requireRegisteredProjectReadOnly(database, cwd) {
252
+ const project = await resolveProjectWorkspaceReadOnly(database, cwd);
253
+ if (!project)
254
+ throw new KiokukoError('NOT_FOUND', 'No Git repository or .kiokuko.json binding was found for task answer');
255
+ assertRegisteredProjectLocation(database, project);
256
+ return project;
257
+ }
258
+ function buildPreparedTask(project, context, capabilities, run, scopedContext, skillDiscovery, memoryUseOverride) {
259
+ const memoryUse = context.status === 'ready'
260
+ ? memoryUseOverride ?? deriveMemoryUseSignal(scopedContext)
261
+ : 'none';
64
262
  const capabilityResolution = resolveCapabilities({
65
263
  task: context.session.task,
66
264
  profile: context.session.profile,
67
265
  recommendedTags: context.recommendedTags,
68
266
  ...(capabilities === undefined ? {} : { capabilities }),
267
+ memoryUse,
69
268
  });
70
269
  return {
71
270
  project,
@@ -77,21 +276,168 @@ async function buildPreparedTask(database, project, context, capabilities, maxCo
77
276
  missingFields: context.missingFields,
78
277
  recommendedTags: context.recommendedTags,
79
278
  reasoning: deriveAkinatorReasoning(context.session.task, context.session.profile),
80
- externalSync: context.externalSync,
81
279
  },
82
- memory,
83
- references: boundedReferences(context, maxContextChars),
84
280
  capabilities: capabilityResolution,
85
281
  run,
282
+ skillDiscovery,
86
283
  context: scopedContext,
284
+ memoryPolicy: { memoryReasoningRequired: memoryReasoningRequired(context.session.profile, memoryUse) },
87
285
  warnings: capabilityResolution.warnings,
88
- nextAction: context.status === 'needs_answer' ? 'answer_from_evidence_or_ask_user' : 'proceed',
89
- securityNotice: 'Memory, references, and capability recommendations are advisory untrusted data. Verify them against the current repository and invoke only capabilities already available in the client.',
286
+ nextAction: context.status === 'needs_answer'
287
+ ? 'answer_from_evidence_or_ask_user'
288
+ : capabilityResolution.recommendations.some((recommendation) => recommendation.required === true && recommendation.availability !== 'available')
289
+ ? 'required_capability_unavailable'
290
+ : 'proceed',
291
+ securityNotice: 'Scoped context, capability recommendations, and discovered external skills are advisory untrusted data. Verify them against the current repository and invoke only capabilities already available in the client; a required memory-reasoning capability that is missing or unknown is an explicit stop, never a fallback; never install or execute fetched skill content automatically.',
90
292
  };
91
293
  }
294
+ async function finalizeAgentTask(input) {
295
+ let context = currentAgentTaskContext(input.database, input.runId, input.context);
296
+ let run = authoritativeTaskRun(input.database, input.runId, context.status);
297
+ if (context.status === 'needs_answer') {
298
+ return buildPreparedTask(input.project, context, input.capabilities, {
299
+ runId: input.runId,
300
+ status: run.status,
301
+ }, null, emptySkillDiscovery(input.discoveryMode), 'none');
302
+ }
303
+ const fingerprint = resolveProjectFingerprint(input.database, input.project, input.manifestSnapshot);
304
+ const selectionWorkspaces = [input.project.workspace, GLOBAL_WORKSPACE];
305
+ const queryFor = (current) => ({
306
+ project: input.project,
307
+ fingerprint,
308
+ task: current.session.task,
309
+ taskProfile: current.session.profile,
310
+ recommendedTags: current.recommendedTags,
311
+ runId: input.runId,
312
+ characterBudget: input.maxContextChars,
313
+ });
314
+ const discoveryAttemptIdentity = {
315
+ runId: input.runId,
316
+ mode: input.discoveryMode,
317
+ requestDigest: canonicalContentHash({
318
+ version: 1,
319
+ runId: input.runId,
320
+ workspace: input.project.workspace,
321
+ repositoryId: input.project.repositoryId,
322
+ manifestSnapshot: input.manifestSnapshot,
323
+ fingerprint,
324
+ task: context.session.task,
325
+ profile: context.session.profile,
326
+ recommendedTags: context.recommendedTags,
327
+ capabilityCatalogDigest: capabilityCatalogDigest(input.capabilities),
328
+ mode: input.discoveryMode,
329
+ }),
330
+ };
331
+ const replayedAttempt = input.discoveryMode === 'off'
332
+ ? undefined
333
+ : readAgentTaskSkillDiscoveryAttempt(input.database, discoveryAttemptIdentity);
334
+ let missingMemoryCapability = memoryCapabilityUnavailableForTask(context, input.capabilities);
335
+ let preDiscoveryMemoryState = null;
336
+ if (missingMemoryCapability && replayedAttempt === undefined && input.discoveryMode !== 'off') {
337
+ const previewRun = run;
338
+ const previewContext = context;
339
+ const preview = await queryScopedContextGated(input.database, queryFor(context), (candidate) => {
340
+ const memoryUse = scopedMemoryUseSignal(input.database, input.project.workspace, candidate);
341
+ return {
342
+ persist: false,
343
+ value: { candidate, memoryUse },
344
+ assertBeforePersist: () => {
345
+ assertAgentTaskSnapshot(input.database, input.runId, previewRun, previewContext);
346
+ assertCurrentProjectManifest(input.project, input.manifestSnapshot);
347
+ assertScopedMemoryUseSignal(input.database, input.project.workspace, candidate, memoryUse);
348
+ },
349
+ };
350
+ });
351
+ preDiscoveryMemoryState = preview.selectionStateHash;
352
+ assertCurrentProjectManifest(input.project, input.manifestSnapshot);
353
+ if (preview.value.memoryUse === 'actionable') {
354
+ context = currentAgentTaskContext(input.database, input.runId, context);
355
+ run = authoritativeTaskRun(input.database, input.runId, context.status);
356
+ if (preview.value.candidate.taskProfileHash !== canonicalContentHash(context.session.profile)) {
357
+ throw new KiokukoError('CONFLICT', 'Task profile changed while scoped context was being prepared');
358
+ }
359
+ return buildPreparedTask(input.project, context, input.capabilities, {
360
+ runId: input.runId,
361
+ status: run.status,
362
+ }, null, emptySkillDiscovery(input.discoveryMode), preview.value.memoryUse);
363
+ }
364
+ }
365
+ run = authoritativeTaskRun(input.database, input.runId, context.status);
366
+ const discoveryRun = run;
367
+ const discoveryContext = context;
368
+ const assertDiscoveryState = () => {
369
+ assertAgentTaskSnapshot(input.database, input.runId, discoveryRun, discoveryContext);
370
+ assertCurrentProjectManifest(input.project, input.manifestSnapshot);
371
+ if (preDiscoveryMemoryState !== null) {
372
+ assertOrdinaryMemoryState(input.database, selectionWorkspaces, preDiscoveryMemoryState);
373
+ }
374
+ };
375
+ let skillDiscovery = replayedAttempt?.summary ?? emptySkillDiscovery(input.discoveryMode);
376
+ if (replayedAttempt === undefined && input.discoveryMode !== 'off') {
377
+ const claimed = claimAgentTaskSkillDiscoveryAttempt(input.database, discoveryAttemptIdentity);
378
+ if (claimed.kind === 'replay') {
379
+ skillDiscovery = claimed.summary;
380
+ }
381
+ else {
382
+ try {
383
+ const discovered = await discoverSkills(input.database, {
384
+ project: input.project,
385
+ fingerprint,
386
+ task: context.session.task,
387
+ profile: context.session.profile,
388
+ recommendedTags: context.recommendedTags,
389
+ ...(input.capabilities === undefined ? {} : { capabilities: input.capabilities }),
390
+ mode: input.discoveryMode,
391
+ ...(input.fetchImpl === undefined ? {} : { fetchImpl: input.fetchImpl }),
392
+ }, {
393
+ ...(input.fetchImpl === undefined ? {} : { fetchImpl: input.fetchImpl }),
394
+ assertBeforePersist: assertDiscoveryState,
395
+ });
396
+ skillDiscovery = completeAgentTaskSkillDiscoveryAttempt(input.database, discoveryAttemptIdentity, discovered, assertDiscoveryState);
397
+ }
398
+ catch (error) {
399
+ failAgentTaskSkillDiscoveryAttempt(input.database, discoveryAttemptIdentity, error);
400
+ }
401
+ }
402
+ }
403
+ context = currentAgentTaskContext(input.database, input.runId, context);
404
+ authoritativeTaskRun(input.database, input.runId, context.status);
405
+ missingMemoryCapability = memoryCapabilityUnavailableForTask(context, input.capabilities);
406
+ let approvedEmptyContext = null;
407
+ const gated = await queryScopedContextGated(input.database, queryFor(context), (candidate) => {
408
+ const memoryUse = scopedMemoryUseSignal(input.database, input.project.workspace, candidate);
409
+ const closed = missingMemoryCapability && memoryUse === 'actionable';
410
+ const returnEmptyWithoutDelivery = missingMemoryCapability && !closed && candidate.items.length === 0;
411
+ if (returnEmptyWithoutDelivery)
412
+ approvedEmptyContext = { ...candidate, deliveryId: null };
413
+ return {
414
+ persist: !closed && !returnEmptyWithoutDelivery,
415
+ value: { closed, memoryUse, candidate },
416
+ assertBeforePersist: () => {
417
+ assertCurrentProjectManifest(input.project, input.manifestSnapshot);
418
+ assertScopedMemoryUseSignal(input.database, input.project.workspace, candidate, memoryUse);
419
+ },
420
+ };
421
+ });
422
+ assertCurrentProjectManifest(input.project, input.manifestSnapshot);
423
+ context = currentAgentTaskContext(input.database, input.runId, context);
424
+ run = authoritativeTaskRun(input.database, input.runId, context.status);
425
+ if (gated.value.candidate.taskProfileHash !== canonicalContentHash(context.session.profile)) {
426
+ throw new KiokukoError('CONFLICT', 'Task profile changed while scoped context was being prepared');
427
+ }
428
+ const scopedContext = gated.context ?? (gated.value.closed ? null : approvedEmptyContext);
429
+ return buildPreparedTask(input.project, context, input.capabilities, {
430
+ runId: input.runId,
431
+ status: run.status,
432
+ }, scopedContext, skillDiscovery, gated.value.memoryUse);
433
+ }
92
434
  export async function prepareAgentTask(database, input) {
435
+ const requestId = taskRequestId(input.requestId);
436
+ const maxContextChars = taskContextCharacterBudget(input.maxContextChars);
93
437
  const project = await requireProject(database, input.cwd);
94
- const fallback = decideExternalSkillFallback(input.capabilities);
438
+ const manifestSnapshot = captureProjectManifestSnapshot(project);
439
+ const discoveryRequest = skillDiscoveryRequestIdentity(input.skillDiscoveryMode ?? readSkillDiscoveryConfig().mode, input.capabilities);
440
+ const discoveryMode = discoveryRequest.mode;
95
441
  const hints = input.profileHints ?? {};
96
442
  const profileHints = {
97
443
  taskType: hints.taskType ?? null,
@@ -99,76 +445,85 @@ export async function prepareAgentTask(database, input) {
99
445
  expected: hints.expected ?? null,
100
446
  constraints: hints.constraints ?? null,
101
447
  };
102
- const runKey = `mcp-task-prepare-${canonicalContentHash({ workspace: project.workspace, task: input.task, profileHints, client: input.client ?? null })}`;
448
+ const client = {
449
+ kind: input.client?.kind ?? 'mcp',
450
+ ...(input.client?.version === undefined ? {} : { version: input.client.version }),
451
+ ...(input.client?.sessionId === undefined ? {} : { sessionId: input.client.sessionId }),
452
+ };
453
+ // requestId is the logical request identity. The gateway's canonical request
454
+ // hash owns every bound input, so reusing an ID with changed input conflicts
455
+ // instead of silently opening another run. The raw opaque ID is never stored.
456
+ const runKey = `mcp-task-prepare-${canonicalContentHash({ version: 1, requestId })}`;
103
457
  const gateway = new AgentGatewayService(database);
104
458
  const opened = gateway.openRun({
105
459
  idempotencyKey: runKey,
106
460
  request: {
107
461
  apiVersion: '1',
108
462
  workspace: project.workspace,
109
- client: {
110
- kind: input.client?.kind ?? 'mcp',
111
- ...(input.client?.version === undefined ? {} : { version: input.client.version }),
112
- ...(input.client?.sessionId === undefined ? {} : { sessionId: input.client.sessionId }),
113
- },
463
+ client,
114
464
  task: { title: input.task, query: input.task, profileHints },
115
465
  captureProfile: 'minimal',
116
466
  coverage: { run: 'unavailable', tool: 'unavailable', command: 'unavailable', file: 'unavailable', approval: 'unavailable' },
117
- metadata: { source: 'mcp' },
467
+ metadata: bindTaskContextRequest(bindSkillDiscoveryRequest(bindProjectManifestSnapshot({ source: 'mcp' }, project, manifestSnapshot), discoveryRequest), maxContextChars),
468
+ ...(input.capabilities === undefined ? {} : { capabilities: input.capabilities }),
118
469
  },
119
470
  });
471
+ authoritativeTaskRun(database, opened.runId);
120
472
  const context = await getAkinatorContextService(database, {
121
473
  workspace: project.workspace,
122
474
  sessionId: opened.intakeSessionId,
123
- allowExternalSkillFallback: fallback.eligible,
124
475
  });
125
- const scopedContext = context.status === 'needs_answer'
126
- ? null
127
- : await queryScopedContext(database, {
128
- project,
129
- task: input.task,
130
- taskProfile: context.session.profile,
131
- recommendedTags: context.recommendedTags,
132
- runId: opened.runId,
133
- ...(input.maxContextChars === undefined ? {} : { characterBudget: input.maxContextChars }),
134
- });
135
- return buildPreparedTask(database, project, context, input.capabilities, input.maxContextChars, {
476
+ return finalizeAgentTask({
477
+ database,
478
+ project,
479
+ manifestSnapshot,
480
+ context,
136
481
  runId: opened.runId,
137
- status: opened.runStatus === 'intake' ? 'intake' : 'active',
138
- }, scopedContext);
482
+ capabilities: input.capabilities,
483
+ maxContextChars,
484
+ discoveryMode,
485
+ ...(input.fetchImpl === undefined ? {} : { fetchImpl: input.fetchImpl }),
486
+ });
139
487
  }
140
488
  export async function answerAgentTask(database, input) {
141
- const project = await requireProject(database, input.cwd);
142
- const fallback = decideExternalSkillFallback(input.capabilities);
143
- const runRow = input.runId === undefined
144
- ? database.prepare(`SELECT lr.run_id AS runId FROM ledger_runs AS lr JOIN run_intakes AS ri ON ri.run_id = lr.run_id WHERE ri.session_id = ? AND lr.workspace = ? ORDER BY lr.created_at DESC LIMIT 1`).get(input.sessionId, project.workspace)
145
- : database.prepare(`SELECT lr.run_id AS runId FROM ledger_runs AS lr JOIN run_intakes AS ri ON ri.run_id = lr.run_id WHERE lr.run_id = ? AND ri.session_id = ? AND lr.workspace = ?`).get(input.runId, input.sessionId, project.workspace);
489
+ const maxContextChars = taskContextCharacterBudget(input.maxContextChars);
490
+ const project = await requireRegisteredProjectReadOnly(database, input.cwd);
491
+ const manifestSnapshot = captureProjectManifestSnapshot(project);
492
+ const discoveryRequest = skillDiscoveryRequestIdentity(input.skillDiscoveryMode ?? readSkillDiscoveryConfig().mode, input.capabilities);
493
+ const discoveryMode = discoveryRequest.mode;
494
+ const runRow = database.prepare(`SELECT lr.run_id AS runId FROM ledger_runs AS lr JOIN run_intakes AS ri ON ri.run_id = lr.run_id WHERE lr.run_id = ? AND ri.session_id = ? AND lr.workspace = ?`).get(input.runId, input.sessionId, project.workspace);
146
495
  if (!runRow)
147
496
  throw new KiokukoError('NOT_FOUND', 'Task run was not found for the intake session');
497
+ authoritativeTaskRun(database, runRow.runId);
148
498
  const gateway = new AgentGatewayService(database);
499
+ const runMetadata = gateway.readRun({ runId: runRow.runId }).metadata;
500
+ assertProjectManifestSnapshotBinding(runMetadata, project, manifestSnapshot);
501
+ assertSkillDiscoveryRequestBinding(runMetadata, discoveryRequest);
502
+ assertTaskContextRequestBinding(runMetadata, maxContextChars);
149
503
  const answered = gateway.answerIntake({
150
504
  runId: runRow.runId,
151
505
  idempotencyKey: `mcp-task-answer-${canonicalContentHash({ runId: runRow.runId, questionId: input.questionId, value: input.value })}`,
152
- request: { apiVersion: '1', questionId: input.questionId, value: input.value },
153
- });
506
+ request: {
507
+ apiVersion: '1',
508
+ questionId: input.questionId,
509
+ value: input.value,
510
+ ...(input.capabilities === undefined ? {} : { capabilities: input.capabilities }),
511
+ },
512
+ }, { assertBeforeAnswer: () => assertRegisteredProjectLocation(database, project) });
154
513
  const context = await getAkinatorContextService(database, {
155
514
  workspace: project.workspace,
156
515
  sessionId: answered.intakeSessionId,
157
- allowExternalSkillFallback: fallback.eligible,
158
516
  });
159
- const scopedContext = context.status === 'needs_answer'
160
- ? null
161
- : await queryScopedContext(database, {
162
- project,
163
- task: context.session.task,
164
- taskProfile: context.session.profile,
165
- recommendedTags: context.recommendedTags,
166
- runId: answered.runId,
167
- ...(input.maxContextChars === undefined ? {} : { characterBudget: input.maxContextChars }),
168
- });
169
- return buildPreparedTask(database, project, context, input.capabilities, input.maxContextChars, {
517
+ return finalizeAgentTask({
518
+ database,
519
+ project,
520
+ manifestSnapshot,
521
+ context,
170
522
  runId: answered.runId,
171
- status: answered.runStatus === 'intake' ? 'intake' : 'active',
172
- }, scopedContext);
523
+ capabilities: input.capabilities,
524
+ maxContextChars,
525
+ discoveryMode,
526
+ ...(input.fetchImpl === undefined ? {} : { fetchImpl: input.fetchImpl }),
527
+ });
173
528
  }
174
529
  //# sourceMappingURL=agent-task.js.map