@askdkc/kiokuko 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja.md +112 -0
  3. package/README.ko.md +112 -0
  4. package/README.md +147 -0
  5. package/README.zh-CN.md +112 -0
  6. package/dist/agent-file/atomic-write.d.ts +6 -0
  7. package/dist/agent-file/atomic-write.d.ts.map +1 -0
  8. package/dist/agent-file/atomic-write.js +36 -0
  9. package/dist/agent-file/atomic-write.js.map +1 -0
  10. package/dist/agent-file/managed-block.d.ts +12 -0
  11. package/dist/agent-file/managed-block.d.ts.map +1 -0
  12. package/dist/agent-file/managed-block.js +56 -0
  13. package/dist/agent-file/managed-block.js.map +1 -0
  14. package/dist/agent-file/render.d.ts +14 -0
  15. package/dist/agent-file/render.d.ts.map +1 -0
  16. package/dist/agent-file/render.js +41 -0
  17. package/dist/agent-file/render.js.map +1 -0
  18. package/dist/akinator/domain.d.ts +25 -0
  19. package/dist/akinator/domain.d.ts.map +1 -0
  20. package/dist/akinator/domain.js +255 -0
  21. package/dist/akinator/domain.js.map +1 -0
  22. package/dist/akinator/orchestrator.d.ts +8 -0
  23. package/dist/akinator/orchestrator.d.ts.map +1 -0
  24. package/dist/akinator/orchestrator.js +11 -0
  25. package/dist/akinator/orchestrator.js.map +1 -0
  26. package/dist/akinator/service.d.ts +35 -0
  27. package/dist/akinator/service.d.ts.map +1 -0
  28. package/dist/akinator/service.js +296 -0
  29. package/dist/akinator/service.js.map +1 -0
  30. package/dist/akinator/store.d.ts +96 -0
  31. package/dist/akinator/store.d.ts.map +1 -0
  32. package/dist/akinator/store.js +583 -0
  33. package/dist/akinator/store.js.map +1 -0
  34. package/dist/akinator/types.d.ts +49 -0
  35. package/dist/akinator/types.d.ts.map +1 -0
  36. package/dist/akinator/types.js +2 -0
  37. package/dist/akinator/types.js.map +1 -0
  38. package/dist/bin/kiokuko.d.ts +3 -0
  39. package/dist/bin/kiokuko.d.ts.map +1 -0
  40. package/dist/bin/kiokuko.js +6 -0
  41. package/dist/bin/kiokuko.js.map +1 -0
  42. package/dist/cli.d.ts +10 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +362 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/client/runtime-discovery.d.ts +15 -0
  47. package/dist/client/runtime-discovery.d.ts.map +1 -0
  48. package/dist/client/runtime-discovery.js +45 -0
  49. package/dist/client/runtime-discovery.js.map +1 -0
  50. package/dist/client/server-client.d.ts +20 -0
  51. package/dist/client/server-client.d.ts.map +1 -0
  52. package/dist/client/server-client.js +424 -0
  53. package/dist/client/server-client.js.map +1 -0
  54. package/dist/commands/agent.d.ts +10 -0
  55. package/dist/commands/agent.d.ts.map +1 -0
  56. package/dist/commands/agent.js +283 -0
  57. package/dist/commands/agent.js.map +1 -0
  58. package/dist/commands/backup.d.ts +5 -0
  59. package/dist/commands/backup.d.ts.map +1 -0
  60. package/dist/commands/backup.js +14 -0
  61. package/dist/commands/backup.js.map +1 -0
  62. package/dist/commands/call.d.ts +7 -0
  63. package/dist/commands/call.d.ts.map +1 -0
  64. package/dist/commands/call.js +10 -0
  65. package/dist/commands/call.js.map +1 -0
  66. package/dist/commands/doctor.d.ts +31 -0
  67. package/dist/commands/doctor.d.ts.map +1 -0
  68. package/dist/commands/doctor.js +142 -0
  69. package/dist/commands/doctor.js.map +1 -0
  70. package/dist/commands/export.d.ts +21 -0
  71. package/dist/commands/export.d.ts.map +1 -0
  72. package/dist/commands/export.js +68 -0
  73. package/dist/commands/export.js.map +1 -0
  74. package/dist/commands/import.d.ts +15 -0
  75. package/dist/commands/import.d.ts.map +1 -0
  76. package/dist/commands/import.js +265 -0
  77. package/dist/commands/import.js.map +1 -0
  78. package/dist/commands/init.d.ts +14 -0
  79. package/dist/commands/init.d.ts.map +1 -0
  80. package/dist/commands/init.js +26 -0
  81. package/dist/commands/init.js.map +1 -0
  82. package/dist/commands/ledger.d.ts +7 -0
  83. package/dist/commands/ledger.d.ts.map +1 -0
  84. package/dist/commands/ledger.js +66 -0
  85. package/dist/commands/ledger.js.map +1 -0
  86. package/dist/commands/link.d.ts +6 -0
  87. package/dist/commands/link.d.ts.map +1 -0
  88. package/dist/commands/link.js +6 -0
  89. package/dist/commands/link.js.map +1 -0
  90. package/dist/commands/promote.d.ts +6 -0
  91. package/dist/commands/promote.d.ts.map +1 -0
  92. package/dist/commands/promote.js +6 -0
  93. package/dist/commands/promote.js.map +1 -0
  94. package/dist/commands/purge.d.ts +10 -0
  95. package/dist/commands/purge.d.ts.map +1 -0
  96. package/dist/commands/purge.js +26 -0
  97. package/dist/commands/purge.js.map +1 -0
  98. package/dist/commands/read.d.ts +6 -0
  99. package/dist/commands/read.d.ts.map +1 -0
  100. package/dist/commands/read.js +4 -0
  101. package/dist/commands/read.js.map +1 -0
  102. package/dist/commands/recall.d.ts +6 -0
  103. package/dist/commands/recall.d.ts.map +1 -0
  104. package/dist/commands/recall.js +4 -0
  105. package/dist/commands/recall.js.map +1 -0
  106. package/dist/commands/record.d.ts +6 -0
  107. package/dist/commands/record.d.ts.map +1 -0
  108. package/dist/commands/record.js +4 -0
  109. package/dist/commands/record.js.map +1 -0
  110. package/dist/commands/search.d.ts +6 -0
  111. package/dist/commands/search.d.ts.map +1 -0
  112. package/dist/commands/search.js +4 -0
  113. package/dist/commands/search.js.map +1 -0
  114. package/dist/commands/serve.d.ts +34 -0
  115. package/dist/commands/serve.d.ts.map +1 -0
  116. package/dist/commands/serve.js +120 -0
  117. package/dist/commands/serve.js.map +1 -0
  118. package/dist/commands/server-status.d.ts +20 -0
  119. package/dist/commands/server-status.d.ts.map +1 -0
  120. package/dist/commands/server-status.js +21 -0
  121. package/dist/commands/server-status.js.map +1 -0
  122. package/dist/commands/server.d.ts +13 -0
  123. package/dist/commands/server.d.ts.map +1 -0
  124. package/dist/commands/server.js +89 -0
  125. package/dist/commands/server.js.map +1 -0
  126. package/dist/commands/setup.d.ts +32 -0
  127. package/dist/commands/setup.d.ts.map +1 -0
  128. package/dist/commands/setup.js +121 -0
  129. package/dist/commands/setup.js.map +1 -0
  130. package/dist/commands/supersede.d.ts +6 -0
  131. package/dist/commands/supersede.d.ts.map +1 -0
  132. package/dist/commands/supersede.js +6 -0
  133. package/dist/commands/supersede.js.map +1 -0
  134. package/dist/commands/use.d.ts +28 -0
  135. package/dist/commands/use.d.ts.map +1 -0
  136. package/dist/commands/use.js +176 -0
  137. package/dist/commands/use.js.map +1 -0
  138. package/dist/config/paths.d.ts +18 -0
  139. package/dist/config/paths.d.ts.map +1 -0
  140. package/dist/config/paths.js +104 -0
  141. package/dist/config/paths.js.map +1 -0
  142. package/dist/config/project-config.d.ts +10 -0
  143. package/dist/config/project-config.d.ts.map +1 -0
  144. package/dist/config/project-config.js +59 -0
  145. package/dist/config/project-config.js.map +1 -0
  146. package/dist/context/broker.d.ts +80 -0
  147. package/dist/context/broker.d.ts.map +1 -0
  148. package/dist/context/broker.js +437 -0
  149. package/dist/context/broker.js.map +1 -0
  150. package/dist/context/delivery.d.ts +66 -0
  151. package/dist/context/delivery.d.ts.map +1 -0
  152. package/dist/context/delivery.js +758 -0
  153. package/dist/context/delivery.js.map +1 -0
  154. package/dist/context/feedback.d.ts +75 -0
  155. package/dist/context/feedback.d.ts.map +1 -0
  156. package/dist/context/feedback.js +997 -0
  157. package/dist/context/feedback.js.map +1 -0
  158. package/dist/context/ranking.d.ts +98 -0
  159. package/dist/context/ranking.d.ts.map +1 -0
  160. package/dist/context/ranking.js +513 -0
  161. package/dist/context/ranking.js.map +1 -0
  162. package/dist/context/recommendations.d.ts +85 -0
  163. package/dist/context/recommendations.d.ts.map +1 -0
  164. package/dist/context/recommendations.js +342 -0
  165. package/dist/context/recommendations.js.map +1 -0
  166. package/dist/db/adapter.d.ts +25 -0
  167. package/dist/db/adapter.d.ts.map +1 -0
  168. package/dist/db/adapter.js +37 -0
  169. package/dist/db/adapter.js.map +1 -0
  170. package/dist/db/capabilities.d.ts +13 -0
  171. package/dist/db/capabilities.d.ts.map +1 -0
  172. package/dist/db/capabilities.js +25 -0
  173. package/dist/db/capabilities.js.map +1 -0
  174. package/dist/db/connection.d.ts +6 -0
  175. package/dist/db/connection.d.ts.map +1 -0
  176. package/dist/db/connection.js +42 -0
  177. package/dist/db/connection.js.map +1 -0
  178. package/dist/db/migrate.d.ts +9 -0
  179. package/dist/db/migrate.d.ts.map +1 -0
  180. package/dist/db/migrate.js +102 -0
  181. package/dist/db/migrate.js.map +1 -0
  182. package/dist/db/transaction.d.ts +4 -0
  183. package/dist/db/transaction.d.ts.map +1 -0
  184. package/dist/db/transaction.js +39 -0
  185. package/dist/db/transaction.js.map +1 -0
  186. package/dist/errors.d.ts +9 -0
  187. package/dist/errors.d.ts.map +1 -0
  188. package/dist/errors.js +32 -0
  189. package/dist/errors.js.map +1 -0
  190. package/dist/gateway/agent-service.d.ts +69 -0
  191. package/dist/gateway/agent-service.d.ts.map +1 -0
  192. package/dist/gateway/agent-service.js +581 -0
  193. package/dist/gateway/agent-service.js.map +1 -0
  194. package/dist/gateway/checkpoint-service.d.ts +42 -0
  195. package/dist/gateway/checkpoint-service.d.ts.map +1 -0
  196. package/dist/gateway/checkpoint-service.js +295 -0
  197. package/dist/gateway/checkpoint-service.js.map +1 -0
  198. package/dist/knowledge/sources.d.ts +72 -0
  199. package/dist/knowledge/sources.d.ts.map +1 -0
  200. package/dist/knowledge/sources.js +406 -0
  201. package/dist/knowledge/sources.js.map +1 -0
  202. package/dist/ledger/archive.d.ts +50 -0
  203. package/dist/ledger/archive.d.ts.map +1 -0
  204. package/dist/ledger/archive.js +1072 -0
  205. package/dist/ledger/archive.js.map +1 -0
  206. package/dist/ledger/hash.d.ts +22 -0
  207. package/dist/ledger/hash.d.ts.map +1 -0
  208. package/dist/ledger/hash.js +25 -0
  209. package/dist/ledger/hash.js.map +1 -0
  210. package/dist/ledger/maintenance.d.ts +78 -0
  211. package/dist/ledger/maintenance.d.ts.map +1 -0
  212. package/dist/ledger/maintenance.js +683 -0
  213. package/dist/ledger/maintenance.js.map +1 -0
  214. package/dist/ledger/projection.d.ts +37 -0
  215. package/dist/ledger/projection.d.ts.map +1 -0
  216. package/dist/ledger/projection.js +307 -0
  217. package/dist/ledger/projection.js.map +1 -0
  218. package/dist/ledger/promotion.d.ts +28 -0
  219. package/dist/ledger/promotion.d.ts.map +1 -0
  220. package/dist/ledger/promotion.js +308 -0
  221. package/dist/ledger/promotion.js.map +1 -0
  222. package/dist/ledger/query.d.ts +55 -0
  223. package/dist/ledger/query.d.ts.map +1 -0
  224. package/dist/ledger/query.js +321 -0
  225. package/dist/ledger/query.js.map +1 -0
  226. package/dist/ledger/redaction.d.ts +8 -0
  227. package/dist/ledger/redaction.d.ts.map +1 -0
  228. package/dist/ledger/redaction.js +40 -0
  229. package/dist/ledger/redaction.js.map +1 -0
  230. package/dist/ledger/store.d.ts +46 -0
  231. package/dist/ledger/store.d.ts.map +1 -0
  232. package/dist/ledger/store.js +324 -0
  233. package/dist/ledger/store.js.map +1 -0
  234. package/dist/ledger/types.d.ts +119 -0
  235. package/dist/ledger/types.d.ts.map +1 -0
  236. package/dist/ledger/types.js +22 -0
  237. package/dist/ledger/types.js.map +1 -0
  238. package/dist/ledger/validate.d.ts +10 -0
  239. package/dist/ledger/validate.d.ts.map +1 -0
  240. package/dist/ledger/validate.js +183 -0
  241. package/dist/ledger/validate.js.map +1 -0
  242. package/dist/mcp/server.d.ts +9 -0
  243. package/dist/mcp/server.d.ts.map +1 -0
  244. package/dist/mcp/server.js +86 -0
  245. package/dist/mcp/server.js.map +1 -0
  246. package/dist/memory/audit.d.ts +14 -0
  247. package/dist/memory/audit.d.ts.map +1 -0
  248. package/dist/memory/audit.js +16 -0
  249. package/dist/memory/audit.js.map +1 -0
  250. package/dist/memory/entries.d.ts +65 -0
  251. package/dist/memory/entries.d.ts.map +1 -0
  252. package/dist/memory/entries.js +200 -0
  253. package/dist/memory/entries.js.map +1 -0
  254. package/dist/memory/lifecycle.d.ts +29 -0
  255. package/dist/memory/lifecycle.d.ts.map +1 -0
  256. package/dist/memory/lifecycle.js +61 -0
  257. package/dist/memory/lifecycle.js.map +1 -0
  258. package/dist/memory/retrieval.d.ts +44 -0
  259. package/dist/memory/retrieval.d.ts.map +1 -0
  260. package/dist/memory/retrieval.js +174 -0
  261. package/dist/memory/retrieval.js.map +1 -0
  262. package/dist/memory/scoped-memory.d.ts +41 -0
  263. package/dist/memory/scoped-memory.d.ts.map +1 -0
  264. package/dist/memory/scoped-memory.js +65 -0
  265. package/dist/memory/scoped-memory.js.map +1 -0
  266. package/dist/memory/secrets.d.ts +6 -0
  267. package/dist/memory/secrets.d.ts.map +1 -0
  268. package/dist/memory/secrets.js +17 -0
  269. package/dist/memory/secrets.js.map +1 -0
  270. package/dist/memory/workspaces.d.ts +17 -0
  271. package/dist/memory/workspaces.d.ts.map +1 -0
  272. package/dist/memory/workspaces.js +92 -0
  273. package/dist/memory/workspaces.js.map +1 -0
  274. package/dist/repository/binding.d.ts +19 -0
  275. package/dist/repository/binding.d.ts.map +1 -0
  276. package/dist/repository/binding.js +78 -0
  277. package/dist/repository/binding.js.map +1 -0
  278. package/dist/repository/detect-root.d.ts +12 -0
  279. package/dist/repository/detect-root.d.ts.map +1 -0
  280. package/dist/repository/detect-root.js +57 -0
  281. package/dist/repository/detect-root.js.map +1 -0
  282. package/dist/repository/git-origin.d.ts +2 -0
  283. package/dist/repository/git-origin.d.ts.map +1 -0
  284. package/dist/repository/git-origin.js +15 -0
  285. package/dist/repository/git-origin.js.map +1 -0
  286. package/dist/repository/identity.d.ts +19 -0
  287. package/dist/repository/identity.d.ts.map +1 -0
  288. package/dist/repository/identity.js +23 -0
  289. package/dist/repository/identity.js.map +1 -0
  290. package/dist/repository/remote-url.d.ts +4 -0
  291. package/dist/repository/remote-url.d.ts.map +1 -0
  292. package/dist/repository/remote-url.js +36 -0
  293. package/dist/repository/remote-url.js.map +1 -0
  294. package/dist/security/sanitize.d.ts +4 -0
  295. package/dist/security/sanitize.d.ts.map +1 -0
  296. package/dist/security/sanitize.js +174 -0
  297. package/dist/security/sanitize.js.map +1 -0
  298. package/dist/serialization/envelope.d.ts +20 -0
  299. package/dist/serialization/envelope.d.ts.map +1 -0
  300. package/dist/serialization/envelope.js +11 -0
  301. package/dist/serialization/envelope.js.map +1 -0
  302. package/dist/serialization/validate.d.ts +31 -0
  303. package/dist/serialization/validate.d.ts.map +1 -0
  304. package/dist/serialization/validate.js +168 -0
  305. package/dist/serialization/validate.js.map +1 -0
  306. package/dist/server/agent-application.d.ts +6 -0
  307. package/dist/server/agent-application.d.ts.map +1 -0
  308. package/dist/server/agent-application.js +60 -0
  309. package/dist/server/agent-application.js.map +1 -0
  310. package/dist/server/app.d.ts +5 -0
  311. package/dist/server/app.d.ts.map +1 -0
  312. package/dist/server/app.js +87 -0
  313. package/dist/server/app.js.map +1 -0
  314. package/dist/server/auth.d.ts +2 -0
  315. package/dist/server/auth.d.ts.map +1 -0
  316. package/dist/server/auth.js +22 -0
  317. package/dist/server/auth.js.map +1 -0
  318. package/dist/server/http.d.ts +69 -0
  319. package/dist/server/http.d.ts.map +1 -0
  320. package/dist/server/http.js +349 -0
  321. package/dist/server/http.js.map +1 -0
  322. package/dist/server/idempotency.d.ts +12 -0
  323. package/dist/server/idempotency.d.ts.map +1 -0
  324. package/dist/server/idempotency.js +210 -0
  325. package/dist/server/idempotency.js.map +1 -0
  326. package/dist/server/instance-lock.d.ts +17 -0
  327. package/dist/server/instance-lock.d.ts.map +1 -0
  328. package/dist/server/instance-lock.js +118 -0
  329. package/dist/server/instance-lock.js.map +1 -0
  330. package/dist/server/router.d.ts +29 -0
  331. package/dist/server/router.d.ts.map +1 -0
  332. package/dist/server/router.js +112 -0
  333. package/dist/server/router.js.map +1 -0
  334. package/dist/server/routes/agent-events.d.ts +5 -0
  335. package/dist/server/routes/agent-events.d.ts.map +1 -0
  336. package/dist/server/routes/agent-events.js +46 -0
  337. package/dist/server/routes/agent-events.js.map +1 -0
  338. package/dist/server/routes/agent-intake.d.ts +5 -0
  339. package/dist/server/routes/agent-intake.d.ts.map +1 -0
  340. package/dist/server/routes/agent-intake.js +42 -0
  341. package/dist/server/routes/agent-intake.js.map +1 -0
  342. package/dist/server/routes/agent-promotions.d.ts +5 -0
  343. package/dist/server/routes/agent-promotions.d.ts.map +1 -0
  344. package/dist/server/routes/agent-promotions.js +52 -0
  345. package/dist/server/routes/agent-promotions.js.map +1 -0
  346. package/dist/server/routes/agent-runs.d.ts +25 -0
  347. package/dist/server/routes/agent-runs.d.ts.map +1 -0
  348. package/dist/server/routes/agent-runs.js +151 -0
  349. package/dist/server/routes/agent-runs.js.map +1 -0
  350. package/dist/server/routes/task5-support.d.ts +11 -0
  351. package/dist/server/routes/task5-support.d.ts.map +1 -0
  352. package/dist/server/routes/task5-support.js +22 -0
  353. package/dist/server/routes/task5-support.js.map +1 -0
  354. package/dist/server/routes/task5.d.ts +5 -0
  355. package/dist/server/routes/task5.d.ts.map +1 -0
  356. package/dist/server/routes/task5.js +72 -0
  357. package/dist/server/routes/task5.js.map +1 -0
  358. package/dist/server/runtime-descriptor.d.ts +24 -0
  359. package/dist/server/runtime-descriptor.d.ts.map +1 -0
  360. package/dist/server/runtime-descriptor.js +156 -0
  361. package/dist/server/runtime-descriptor.js.map +1 -0
  362. package/dist/server/write-queue.d.ts +20 -0
  363. package/dist/server/write-queue.d.ts.map +1 -0
  364. package/dist/server/write-queue.js +83 -0
  365. package/dist/server/write-queue.js.map +1 -0
  366. package/dist/setup/managed-text.d.ts +6 -0
  367. package/dist/setup/managed-text.d.ts.map +1 -0
  368. package/dist/setup/managed-text.js +42 -0
  369. package/dist/setup/managed-text.js.map +1 -0
  370. package/dist/setup/opencode-config.d.ts +3 -0
  371. package/dist/setup/opencode-config.d.ts.map +1 -0
  372. package/dist/setup/opencode-config.js +26 -0
  373. package/dist/setup/opencode-config.js.map +1 -0
  374. package/dist/setup/render.d.ts +8 -0
  375. package/dist/setup/render.d.ts.map +1 -0
  376. package/dist/setup/render.js +45 -0
  377. package/dist/setup/render.js.map +1 -0
  378. package/dist/web/server.d.ts +16 -0
  379. package/dist/web/server.d.ts.map +1 -0
  380. package/dist/web/server.js +424 -0
  381. package/dist/web/server.js.map +1 -0
  382. package/dist/web/ui.d.ts +2 -0
  383. package/dist/web/ui.d.ts.map +1 -0
  384. package/dist/web/ui.js +271 -0
  385. package/dist/web/ui.js.map +1 -0
  386. package/migrations/001_initial.sql +89 -0
  387. package/migrations/002_fts.sql +66 -0
  388. package/migrations/003_akinator.sql +30 -0
  389. package/migrations/004_agent_gateway.sql +259 -0
  390. package/package.json +45 -0
  391. package/templates/AGENTS.md +29 -0
@@ -0,0 +1,283 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { TextDecoder } from 'node:util';
4
+ import { KiokukoError } from '../errors.js';
5
+ import { successEnvelope } from '../serialization/envelope.js';
6
+ import { createServerClient, } from '../client/server-client.js';
7
+ const MAX_INPUT_BYTES = 2 * 1024 * 1024;
8
+ const MAX_ID_BYTES = 256;
9
+ const MAX_TEXT_BYTES = 16 * 1024;
10
+ const MAX_INPUT_PATH_BYTES = 4 * 1024;
11
+ const CONTROL_CHARACTERS = /\p{Cc}/u;
12
+ const CAPTURE_PROFILES = new Set(['minimal', 'standard', 'full']);
13
+ function validationError() {
14
+ return new KiokukoError('VALIDATION_ERROR', 'Agent input is invalid');
15
+ }
16
+ function boundedString(value, maximumBytes) {
17
+ if (typeof value !== 'string' || value.length === 0 || value.trim().length === 0
18
+ || Buffer.byteLength(value, 'utf8') > maximumBytes || CONTROL_CHARACTERS.test(value)) {
19
+ throw validationError();
20
+ }
21
+ return value;
22
+ }
23
+ function boundedId(value) {
24
+ return boundedString(value, MAX_ID_BYTES);
25
+ }
26
+ function assertPlainObject(value) {
27
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
28
+ throw validationError();
29
+ const prototype = Object.getPrototypeOf(value);
30
+ if (prototype !== Object.prototype && prototype !== null)
31
+ throw validationError();
32
+ return value;
33
+ }
34
+ function validateInputPath(value) {
35
+ if (value === '-')
36
+ return value;
37
+ return boundedString(value, MAX_INPUT_PATH_BYTES);
38
+ }
39
+ async function readStdinBytes() {
40
+ const chunks = [];
41
+ let size = 0;
42
+ try {
43
+ for await (const chunk of process.stdin) {
44
+ const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, 'utf8');
45
+ size += bytes.byteLength;
46
+ if (size > MAX_INPUT_BYTES)
47
+ throw validationError();
48
+ chunks.push(bytes);
49
+ }
50
+ }
51
+ catch (error) {
52
+ if (error instanceof KiokukoError)
53
+ throw error;
54
+ throw validationError();
55
+ }
56
+ return Buffer.concat(chunks);
57
+ }
58
+ async function readStrictJsonInput(filePath) {
59
+ const safePath = validateInputPath(filePath);
60
+ let bytes;
61
+ try {
62
+ bytes = safePath === '-' ? await readStdinBytes() : await readFile(safePath);
63
+ }
64
+ catch (error) {
65
+ if (error instanceof KiokukoError)
66
+ throw error;
67
+ throw validationError();
68
+ }
69
+ if (bytes.byteLength > MAX_INPUT_BYTES)
70
+ throw validationError();
71
+ let text;
72
+ try {
73
+ text = new TextDecoder('utf-8', { fatal: true }).decode(bytes);
74
+ }
75
+ catch {
76
+ throw validationError();
77
+ }
78
+ try {
79
+ return JSON.parse(text);
80
+ }
81
+ catch {
82
+ throw validationError();
83
+ }
84
+ }
85
+ function captureProfile(value) {
86
+ if (typeof value !== 'string' || !CAPTURE_PROFILES.has(value))
87
+ throw validationError();
88
+ return value;
89
+ }
90
+ function transportCaptureProfile(value) {
91
+ return value === 'full' ? 'diagnostic' : value;
92
+ }
93
+ function runPath(runId, suffix) {
94
+ const id = boundedId(runId);
95
+ if (id === '.' || id === '..' || id.includes('/') || id.includes('\\'))
96
+ throw validationError();
97
+ const encoded = encodeURIComponent(id);
98
+ const path = `/api/v1/agent/runs/${encoded}/${suffix}`;
99
+ if (Buffer.byteLength(path, 'utf8') > MAX_INPUT_PATH_BYTES)
100
+ throw validationError();
101
+ return path;
102
+ }
103
+ function keyFromFactory(dependencies) {
104
+ const factory = dependencies.idempotencyKeyFactory ?? randomUUID;
105
+ try {
106
+ return boundedString(factory(), MAX_ID_BYTES);
107
+ }
108
+ catch (error) {
109
+ if (error instanceof KiokukoError)
110
+ throw error;
111
+ throw validationError();
112
+ }
113
+ }
114
+ function bodyAndKey(value, dependencies) {
115
+ if (Object.prototype.hasOwnProperty.call(value, 'idempotencyKey')) {
116
+ const idempotencyKey = boundedString(value.idempotencyKey, MAX_ID_BYTES);
117
+ const { idempotencyKey: _removed, ...body } = value;
118
+ return { body, idempotencyKey };
119
+ }
120
+ return { body: value, idempotencyKey: keyFromFactory(dependencies) };
121
+ }
122
+ async function readInput(dependencies, filePath) {
123
+ const value = await (dependencies.readJsonInput === undefined
124
+ ? readStrictJsonInput(filePath)
125
+ : dependencies.readJsonInput(validateInputPath(filePath)));
126
+ return assertPlainObject(value);
127
+ }
128
+ async function getClient(dependencies) {
129
+ const factory = dependencies.createClient ?? createServerClient;
130
+ const options = dependencies.fetchImplementation === undefined
131
+ ? {}
132
+ : { fetchImplementation: dependencies.fetchImplementation };
133
+ try {
134
+ return await factory(options);
135
+ }
136
+ catch (error) {
137
+ if (error instanceof KiokukoError)
138
+ throw error;
139
+ throw new KiokukoError('SERVICE_UNAVAILABLE', 'Kiokuko server is unavailable');
140
+ }
141
+ }
142
+ async function sendRequest(dependencies, request) {
143
+ try {
144
+ return await (await getClient(dependencies)).request(request);
145
+ }
146
+ catch (error) {
147
+ if (error instanceof KiokukoError)
148
+ throw error;
149
+ throw new KiokukoError('SERVICE_UNAVAILABLE', 'Kiokuko server is unavailable');
150
+ }
151
+ }
152
+ function responseStatus(data) {
153
+ if (typeof data !== 'object' || data === null || Array.isArray(data))
154
+ return 'completed';
155
+ const value = data;
156
+ for (const field of ['intakeStatus', 'runStatus', 'status']) {
157
+ if (typeof value[field] === 'string')
158
+ return value[field];
159
+ }
160
+ return 'completed';
161
+ }
162
+ function responseQuestion(data) {
163
+ if (typeof data !== 'object' || data === null || Array.isArray(data))
164
+ return undefined;
165
+ const value = data;
166
+ const question = value.currentQuestion;
167
+ if (typeof question !== 'object' || question === null || Array.isArray(question))
168
+ return undefined;
169
+ const id = question.id;
170
+ return typeof id === 'string' ? id : undefined;
171
+ }
172
+ function humanSummary(operation, data) {
173
+ const question = responseQuestion(data);
174
+ const status = responseStatus(data);
175
+ const context = typeof data === 'object' && data !== null && !Array.isArray(data)
176
+ && data.context !== null
177
+ && data.context !== undefined
178
+ ? '; initial context available'
179
+ : '';
180
+ return question === undefined
181
+ ? `Kiokuko ${operation}: ${status}${context}`
182
+ : `Kiokuko ${operation}: ${status} (current question ${question})${context}`;
183
+ }
184
+ function emitResult(json, operation, data) {
185
+ if (json)
186
+ process.stdout.write(`${JSON.stringify(successEnvelope(operation, data))}\n`);
187
+ else
188
+ process.stdout.write(`${humanSummary(operation, data)}\n`);
189
+ }
190
+ export function registerAgentCommand(cli, dependencies = {}) {
191
+ const agent = cli.command('agent').description('Send generic agent lifecycle requests through the Kiokuko server');
192
+ agent.command('open')
193
+ .description('Open an authenticated generic agent run')
194
+ .requiredOption('--workspace <workspace>')
195
+ .requiredOption('--client <kind>')
196
+ .requiredOption('--task <task>')
197
+ .option('--client-version <version>')
198
+ .option('--session-id <id>')
199
+ .option('--capture-profile <profile>', 'Capture profile: minimal, standard, or full', 'standard')
200
+ .option('--json')
201
+ .action(async (options) => {
202
+ const workspace = boundedString(options.workspace, MAX_TEXT_BYTES);
203
+ const clientKind = boundedId(options.client);
204
+ const task = boundedString(options.task, MAX_TEXT_BYTES);
205
+ const profile = captureProfile(options.captureProfile);
206
+ const client = {
207
+ kind: clientKind,
208
+ ...(options.clientVersion === undefined ? {} : { version: boundedId(options.clientVersion) }),
209
+ ...(options.sessionId === undefined ? {} : { sessionId: boundedId(options.sessionId) }),
210
+ };
211
+ const body = {
212
+ apiVersion: '1',
213
+ workspace,
214
+ client,
215
+ task: {
216
+ title: task,
217
+ query: task,
218
+ profileHints: { taskType: null, target: null, expected: null, constraints: null },
219
+ },
220
+ captureProfile: transportCaptureProfile(profile),
221
+ coverage: {
222
+ run: 'declared',
223
+ tool: 'declared',
224
+ command: 'declared',
225
+ file: 'declared',
226
+ approval: 'unavailable',
227
+ },
228
+ metadata: {},
229
+ };
230
+ const data = await sendRequest(dependencies, {
231
+ method: 'POST',
232
+ path: '/api/v1/agent/runs',
233
+ operation: 'agent.open',
234
+ body,
235
+ idempotencyKey: keyFromFactory(dependencies),
236
+ });
237
+ emitResult(options.json, 'agent.open', data);
238
+ });
239
+ agent.command('answer')
240
+ .description('Answer the current agent intake question without inference')
241
+ .argument('<run-id>')
242
+ .requiredOption('--question-id <id>')
243
+ .requiredOption('--value <answer>')
244
+ .option('--json')
245
+ .action(async (runId, options) => {
246
+ const questionId = boundedId(options.questionId);
247
+ const value = boundedString(options.value, MAX_TEXT_BYTES);
248
+ const data = await sendRequest(dependencies, {
249
+ method: 'POST',
250
+ path: runPath(runId, 'intake/answers'),
251
+ operation: 'agent.answer',
252
+ body: { apiVersion: '1', questionId, value },
253
+ idempotencyKey: keyFromFactory(dependencies),
254
+ });
255
+ emitResult(options.json, 'agent.answer', data);
256
+ });
257
+ for (const [name, operation, suffix] of [
258
+ ['events', 'agent.events', 'events'],
259
+ ['checkpoint', 'agent.checkpoint', 'checkpoints'],
260
+ ['close', 'agent.close', 'close'],
261
+ ['feedback', 'agent.feedback', 'feedback'],
262
+ ]) {
263
+ agent.command(name)
264
+ .description(`Send an ${name} request for an agent run`)
265
+ .argument('<run-id>')
266
+ .requiredOption('--input-json <file|->')
267
+ .option('--json')
268
+ .action(async (runId, options) => {
269
+ const input = await readInput(dependencies, options.inputJson);
270
+ const request = bodyAndKey(input, dependencies);
271
+ const data = await sendRequest(dependencies, {
272
+ method: 'POST',
273
+ path: runPath(runId, suffix),
274
+ operation,
275
+ body: request.body,
276
+ idempotencyKey: request.idempotencyKey,
277
+ });
278
+ emitResult(options.json, operation, data);
279
+ });
280
+ }
281
+ return agent;
282
+ }
283
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function createBackup(output: string, databasePath?: string): Promise<{
2
+ output: string;
3
+ databasePath: string;
4
+ }>;
5
+ //# sourceMappingURL=backup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAGA,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAS3H"}
@@ -0,0 +1,14 @@
1
+ import { initializeDatabase } from './init.js';
2
+ import { openConnection } from '../db/connection.js';
3
+ export async function createBackup(output, databasePath) {
4
+ const initialized = await initializeDatabase(databasePath === undefined ? {} : { databasePath });
5
+ const database = openConnection(initialized.databasePath);
6
+ try {
7
+ await database.backup(output);
8
+ }
9
+ finally {
10
+ database.close();
11
+ }
12
+ return { output, databasePath: initialized.databasePath };
13
+ }
14
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,YAAqB;IACtE,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;IACjG,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface CallRequest {
2
+ apiVersion: '1';
3
+ operation: string;
4
+ arguments: Record<string, unknown>;
5
+ }
6
+ export declare function parseCallRequest(value: unknown): CallRequest;
7
+ //# sourceMappingURL=call.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../../src/commands/call.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,GAAG,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAM5D"}
@@ -0,0 +1,10 @@
1
+ export function parseCallRequest(value) {
2
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
3
+ throw new Error('Request must be a JSON object');
4
+ const request = value;
5
+ if (request.apiVersion !== '1' || typeof request.operation !== 'string')
6
+ throw new Error('Invalid call request');
7
+ const args = request.arguments;
8
+ return { apiVersion: '1', operation: request.operation, arguments: typeof args === 'object' && args !== null && !Array.isArray(args) ? args : {} };
9
+ }
10
+ //# sourceMappingURL=call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call.js","sourceRoot":"","sources":["../../src/commands/call.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC1H,MAAM,OAAO,GAAG,KAAgC,CAAC;IACjD,IAAI,OAAO,CAAC,UAAU,KAAK,GAAG,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACjH,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC;IAC/B,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAA+B,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAChL,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { initializeDatabase } from './init.js';
2
+ export interface DoctorCheck {
3
+ ok: boolean;
4
+ count?: number;
5
+ detail?: string;
6
+ }
7
+ export interface DoctorResult {
8
+ ok: boolean;
9
+ databasePath: string;
10
+ currentVersion: number;
11
+ capabilities: Awaited<ReturnType<typeof initializeDatabase>>['capabilities'];
12
+ integrity: string;
13
+ fts5: boolean;
14
+ checks: {
15
+ integrity: DoctorCheck;
16
+ migrations: DoctorCheck;
17
+ fts: DoctorCheck;
18
+ danglingLinks: DoctorCheck;
19
+ contradictions: DoctorCheck;
20
+ bindings: DoctorCheck;
21
+ agentFiles: DoctorCheck;
22
+ permissions: DoctorCheck;
23
+ secrets: DoctorCheck;
24
+ ledger: DoctorCheck;
25
+ runtime: DoctorCheck;
26
+ };
27
+ }
28
+ export declare function runDoctor(options?: {
29
+ databasePath?: string;
30
+ }): Promise<DoctorResult>;
31
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAU/C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE;QACN,SAAS,EAAE,WAAW,CAAC;QACvB,UAAU,EAAE,WAAW,CAAC;QACxB,GAAG,EAAE,WAAW,CAAC;QACjB,aAAa,EAAE,WAAW,CAAC;QAC3B,cAAc,EAAE,WAAW,CAAC;QAC5B,QAAQ,EAAE,WAAW,CAAC;QACtB,UAAU,EAAE,WAAW,CAAC;QACxB,WAAW,EAAE,WAAW,CAAC;QACzB,OAAO,EAAE,WAAW,CAAC;QACrB,MAAM,EAAE,WAAW,CAAC;QACpB,OAAO,EAAE,WAAW,CAAC;KACtB,CAAC;CACH;AA6CD,wBAAsB,SAAS,CAAC,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CA+E9F"}
@@ -0,0 +1,142 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, lstatSync, readFileSync, statSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { initializeDatabase } from './init.js';
5
+ import { openConnection } from '../db/connection.js';
6
+ import { BEGIN_MARKER, END_MARKER } from '../agent-file/managed-block.js';
7
+ import { readProjectConfig } from '../config/project-config.js';
8
+ import { getDatabaseLockPath, getRuntimeDescriptorPath } from '../config/paths.js';
9
+ import { isPidAlive } from '../server/instance-lock.js';
10
+ import { readRuntimeDescriptor } from '../server/runtime-descriptor.js';
11
+ import { inspectLedger } from '../ledger/maintenance.js';
12
+ import { findSecret } from '../memory/secrets.js';
13
+ function count(database, sql, ...parameters) {
14
+ return Number(database.prepare(sql).get(...parameters)?.count ?? 0);
15
+ }
16
+ function balancedMarkers(content) {
17
+ return content.split(BEGIN_MARKER).length - 1 === 1 && content.split(END_MARKER).length - 1 === 1;
18
+ }
19
+ async function runtimeCheck(databasePath) {
20
+ let findings = 0;
21
+ let descriptor;
22
+ let descriptorPresent = false;
23
+ let lockPresent = false;
24
+ try {
25
+ descriptor = await readRuntimeDescriptor(getRuntimeDescriptorPath());
26
+ descriptorPresent = descriptor !== undefined;
27
+ if (descriptor !== undefined) {
28
+ const expected = `sha256:${createHash('sha256').update(path.resolve(databasePath), 'utf8').digest('hex')}`;
29
+ if (descriptor.databaseFingerprint !== expected || !(await isPidAlive(descriptor.pid)))
30
+ findings += 1;
31
+ }
32
+ }
33
+ catch {
34
+ findings += 1;
35
+ }
36
+ const lockPath = getDatabaseLockPath(databasePath);
37
+ try {
38
+ const info = lstatSync(lockPath);
39
+ lockPresent = true;
40
+ if (info.isSymbolicLink() || !info.isFile() || (process.platform !== 'win32' && (info.mode & 0o077) !== 0))
41
+ findings += 1;
42
+ try {
43
+ const value = JSON.parse(readFileSync(lockPath, 'utf8'));
44
+ if (typeof value.instanceId !== 'string' || typeof value.pid !== 'number' || !(await isPidAlive(value.pid)))
45
+ findings += 1;
46
+ if (descriptor !== undefined && value.instanceId !== descriptor.instanceId)
47
+ findings += 1;
48
+ }
49
+ catch {
50
+ findings += 1;
51
+ }
52
+ }
53
+ catch (error) {
54
+ if (!(error instanceof Error && 'code' in error && error.code === 'ENOENT'))
55
+ findings += 1;
56
+ }
57
+ if (descriptorPresent !== lockPresent)
58
+ findings += 1;
59
+ return { ok: findings === 0, count: findings, detail: `findings=${findings}` };
60
+ }
61
+ export async function runDoctor(options = {}) {
62
+ const initialized = await initializeDatabase(options);
63
+ const database = openConnection(initialized.databasePath);
64
+ try {
65
+ const integrity = database.prepare('PRAGMA integrity_check').get()?.integrity_check ?? 'unknown';
66
+ const fts5 = Boolean(database.prepare("SELECT 1 AS present FROM sqlite_master WHERE type = 'table' AND name = 'entries_fts'").get());
67
+ const migrationRows = count(database, 'SELECT COUNT(*) AS count FROM schema_migrations');
68
+ const expectedMigrations = initialized.currentVersion;
69
+ const migrationCheck = { ok: migrationRows === expectedMigrations, count: migrationRows, detail: `expected ${expectedMigrations}` };
70
+ const entryCount = count(database, 'SELECT COUNT(*) AS count FROM entries');
71
+ const ftsCount = fts5 ? count(database, 'SELECT COUNT(*) AS count FROM entries_fts') : 0;
72
+ const ftsCheck = { ok: !fts5 || entryCount === ftsCount, count: Math.abs(entryCount - ftsCount), detail: `entries=${entryCount}, fts=${ftsCount}` };
73
+ const danglingLinks = count(database, `
74
+ SELECT COUNT(*) AS count FROM entry_links l
75
+ LEFT JOIN entries f ON f.id = l.from_entry_id
76
+ LEFT JOIN entries t ON t.id = l.to_entry_id
77
+ WHERE f.id IS NULL OR t.id IS NULL
78
+ `);
79
+ const contradictions = count(database, `
80
+ SELECT COUNT(*) AS count FROM entry_links l
81
+ JOIN entries f ON f.id = l.from_entry_id
82
+ JOIN entries t ON t.id = l.to_entry_id
83
+ WHERE l.relation = 'contradicts' AND f.status = 'verified' AND t.status = 'verified'
84
+ `);
85
+ const bindingRows = database.prepare('SELECT repository_id, canonical_root FROM repository_locations ORDER BY canonical_root').all();
86
+ const missingRoots = bindingRows.filter((row) => !existsSync(row.canonical_root)).length;
87
+ const bindingCheck = { ok: missingRoots === 0, count: missingRoots, detail: `locations=${bindingRows.length}` };
88
+ let missingAgentFiles = 0;
89
+ for (const row of bindingRows) {
90
+ if (!existsSync(row.canonical_root))
91
+ continue;
92
+ const configPath = `${row.canonical_root}/.kiokuko.json`;
93
+ try {
94
+ const config = await readProjectConfig(configPath);
95
+ const agentPath = `${row.canonical_root}/${config.agentFile}`;
96
+ if (!existsSync(agentPath) || !balancedMarkers(readFileSync(agentPath, 'utf8')))
97
+ missingAgentFiles += 1;
98
+ }
99
+ catch {
100
+ missingAgentFiles += 1;
101
+ }
102
+ }
103
+ const agentFilesCheck = { ok: missingAgentFiles === 0, count: missingAgentFiles };
104
+ let secretCount = 0;
105
+ const secretRows = database.prepare('SELECT title, body, summary, scope_json, provenance_json FROM entries').all();
106
+ for (const row of secretRows) {
107
+ if (findSecret(`${row.title}\n${row.body}\n${row.summary ?? ''}\n${row.scope_json}\n${row.provenance_json}`))
108
+ secretCount += 1;
109
+ }
110
+ const permissions = (() => {
111
+ try {
112
+ const mode = statSync(initialized.databasePath).mode & 0o777;
113
+ return { ok: (mode & 0o077) === 0, count: mode, detail: `mode=${mode.toString(8)}` };
114
+ }
115
+ catch {
116
+ return { ok: false, count: 0, detail: 'database file is not accessible' };
117
+ }
118
+ })();
119
+ const ledgerReport = inspectLedger(database);
120
+ const ledgerCheck = { ok: ledgerReport.ok, count: ledgerReport.findingCount, detail: `findings=${ledgerReport.findingCount}` };
121
+ const runtime = await runtimeCheck(initialized.databasePath);
122
+ const checks = {
123
+ integrity: { ok: integrity === 'ok', detail: integrity },
124
+ migrations: migrationCheck,
125
+ fts: ftsCheck,
126
+ danglingLinks: { ok: danglingLinks === 0, count: danglingLinks },
127
+ contradictions: { ok: contradictions === 0, count: contradictions, detail: 'verified contradictions require review' },
128
+ bindings: bindingCheck,
129
+ agentFiles: agentFilesCheck,
130
+ permissions,
131
+ secrets: { ok: secretCount === 0, count: secretCount },
132
+ ledger: ledgerCheck,
133
+ runtime,
134
+ };
135
+ const ok = Object.values(checks).every((check) => check.ok);
136
+ return { ok, databasePath: '<redacted>', currentVersion: initialized.currentVersion, capabilities: initialized.capabilities, integrity, fts5, checks };
137
+ }
138
+ finally {
139
+ database.close();
140
+ }
141
+ }
142
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { SqliteDatabase } from '../db/adapter.js';
2
+ export interface ExportOptions {
3
+ workspace: string;
4
+ output?: string;
5
+ }
6
+ export interface ExportResult {
7
+ workspace: string;
8
+ count: number;
9
+ checksum: string;
10
+ output?: string;
11
+ content: string;
12
+ }
13
+ /**
14
+ * Export a complete workspace snapshot as deterministic, checksummed JSONL.
15
+ * The first line is the checksum of every following line, including its final newline.
16
+ */
17
+ export declare function exportWorkspace(database: SqliteDatabase, options: ExportOptions): ExportResult;
18
+ export declare function writeExport(database: SqliteDatabase, options: ExportOptions & {
19
+ output: string;
20
+ }): Promise<ExportResult>;
21
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAmBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,GAAG,YAAY,CA6D9F;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAI9H"}
@@ -0,0 +1,68 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { writeFile } from 'node:fs/promises';
3
+ import { canonicalJson, requireWorkspace } from '../serialization/validate.js';
4
+ function rows(database, sql, ...parameters) {
5
+ return database.prepare(sql).all(...parameters);
6
+ }
7
+ function canonicalStoredJson(value, label) {
8
+ try {
9
+ return canonicalJson(JSON.parse(String(value)));
10
+ }
11
+ catch {
12
+ throw new Error(`Stored ${label} is not valid JSON`);
13
+ }
14
+ }
15
+ /**
16
+ * Export a complete workspace snapshot as deterministic, checksummed JSONL.
17
+ * The first line is the checksum of every following line, including its final newline.
18
+ */
19
+ export function exportWorkspace(database, options) {
20
+ const workspace = requireWorkspace(options.workspace);
21
+ const entries = rows(database, `SELECT id, workspace, kind, status, title, body, summary, scope_json, provenance_json,
22
+ trust_level, confidence, content_hash, revision, superseded_by, created_by,
23
+ created_at, updated_at, verified_at
24
+ FROM entries WHERE workspace = ? ORDER BY id ASC`, workspace).map((entry) => ({
25
+ ...entry,
26
+ scope_json: canonicalStoredJson(entry.scope_json, 'scope'),
27
+ provenance_json: canonicalStoredJson(entry.provenance_json, 'provenance'),
28
+ }));
29
+ const entryIds = new Set(entries.map((entry) => String(entry.id)));
30
+ const tags = rows(database, `SELECT entry_id, tag FROM tags WHERE entry_id IN (SELECT id FROM entries WHERE workspace = ?)
31
+ ORDER BY entry_id ASC, tag ASC`, workspace);
32
+ const links = rows(database, `SELECT l.from_entry_id, l.to_entry_id, l.relation, l.created_at, l.created_by
33
+ FROM entry_links l
34
+ JOIN entries from_entry ON from_entry.id = l.from_entry_id
35
+ JOIN entries to_entry ON to_entry.id = l.to_entry_id
36
+ WHERE from_entry.workspace = ? AND to_entry.workspace = ?
37
+ ORDER BY l.from_entry_id ASC, l.to_entry_id ASC, l.relation ASC`, workspace, workspace);
38
+ const audit = rows(database, `SELECT event_id, entry_id, workspace, operation, actor, details_json, created_at
39
+ FROM audit_events WHERE workspace = ? ORDER BY event_id ASC`, workspace).filter((event) => event.entry_id === null || entryIds.has(String(event.entry_id))).map((event) => ({
40
+ ...event,
41
+ details_json: canonicalStoredJson(event.details_json, 'audit details'),
42
+ }));
43
+ const manifest = {
44
+ type: 'manifest',
45
+ apiVersion: '1',
46
+ workspace,
47
+ format: 'kiokuko-jsonl',
48
+ version: 2,
49
+ counts: { entries: entries.length, tags: tags.length, links: links.length, audit: audit.length },
50
+ };
51
+ const payloadLines = [
52
+ manifest,
53
+ ...entries.map((entry) => ({ type: 'entry', ...entry })),
54
+ ...tags.map((tag) => ({ type: 'tag', ...tag })),
55
+ ...links.map((link) => ({ type: 'link', ...link })),
56
+ ...audit.map((event) => ({ type: 'audit', ...event })),
57
+ ];
58
+ const payload = `${payloadLines.map((value) => canonicalJson(value)).join('\n')}\n`;
59
+ const checksum = createHash('sha256').update(payload, 'utf8').digest('hex');
60
+ const content = `${canonicalJson({ type: 'checksum', sha256: checksum })}\n${payload}`;
61
+ return { workspace, count: entries.length, checksum, ...(options.output === undefined ? {} : { output: options.output }), content };
62
+ }
63
+ export async function writeExport(database, options) {
64
+ const result = exportWorkspace(database, options);
65
+ await writeFile(options.output, result.content, 'utf8');
66
+ return result;
67
+ }
68
+ //# sourceMappingURL=export.js.map