@qlingzzy/qling 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/LICENSE +21 -0
  3. package/README.en.md +129 -0
  4. package/README.md +416 -0
  5. package/dist/agent/subtask.d.ts +21 -0
  6. package/dist/agent/subtask.d.ts.map +1 -0
  7. package/dist/agent/subtask.js +55 -0
  8. package/dist/agent-loop.d.ts +151 -0
  9. package/dist/agent-loop.d.ts.map +1 -0
  10. package/dist/agent-loop.js +1498 -0
  11. package/dist/agents/isolation-policy.d.ts +14 -0
  12. package/dist/agents/isolation-policy.d.ts.map +1 -0
  13. package/dist/agents/isolation-policy.js +52 -0
  14. package/dist/channels/console-channel.d.ts +15 -0
  15. package/dist/channels/console-channel.d.ts.map +1 -0
  16. package/dist/channels/console-channel.js +66 -0
  17. package/dist/channels/registry.d.ts +10 -0
  18. package/dist/channels/registry.d.ts.map +1 -0
  19. package/dist/channels/registry.js +25 -0
  20. package/dist/channels/slack-channel.d.ts +35 -0
  21. package/dist/channels/slack-channel.d.ts.map +1 -0
  22. package/dist/channels/slack-channel.js +232 -0
  23. package/dist/channels/telegram-channel.d.ts +32 -0
  24. package/dist/channels/telegram-channel.d.ts.map +1 -0
  25. package/dist/channels/telegram-channel.js +167 -0
  26. package/dist/channels/types.d.ts +31 -0
  27. package/dist/channels/types.d.ts.map +1 -0
  28. package/dist/channels/types.js +4 -0
  29. package/dist/cli/bootstrap.d.ts +39 -0
  30. package/dist/cli/bootstrap.d.ts.map +1 -0
  31. package/dist/cli/bootstrap.js +138 -0
  32. package/dist/cli/channel-bootstrap.d.ts +23 -0
  33. package/dist/cli/channel-bootstrap.d.ts.map +1 -0
  34. package/dist/cli/channel-bootstrap.js +46 -0
  35. package/dist/cli/daemon-control.d.ts +31 -0
  36. package/dist/cli/daemon-control.d.ts.map +1 -0
  37. package/dist/cli/daemon-control.js +177 -0
  38. package/dist/cli/guidance-panel.d.ts +11 -0
  39. package/dist/cli/guidance-panel.d.ts.map +1 -0
  40. package/dist/cli/guidance-panel.js +16 -0
  41. package/dist/cli/mcp-control.d.ts +7 -0
  42. package/dist/cli/mcp-control.d.ts.map +1 -0
  43. package/dist/cli/mcp-control.js +119 -0
  44. package/dist/cli/mission-views.d.ts +13 -0
  45. package/dist/cli/mission-views.d.ts.map +1 -0
  46. package/dist/cli/mission-views.js +82 -0
  47. package/dist/cli/setup.d.ts +9 -0
  48. package/dist/cli/setup.d.ts.map +1 -0
  49. package/dist/cli/setup.js +140 -0
  50. package/dist/cli/startup-contract.d.ts +23 -0
  51. package/dist/cli/startup-contract.d.ts.map +1 -0
  52. package/dist/cli/startup-contract.js +694 -0
  53. package/dist/commands/agents.d.ts +3 -0
  54. package/dist/commands/agents.d.ts.map +1 -0
  55. package/dist/commands/agents.js +44 -0
  56. package/dist/commands/checkpoint.d.ts +3 -0
  57. package/dist/commands/checkpoint.d.ts.map +1 -0
  58. package/dist/commands/checkpoint.js +52 -0
  59. package/dist/commands/claude-style.d.ts +12 -0
  60. package/dist/commands/claude-style.d.ts.map +1 -0
  61. package/dist/commands/claude-style.js +560 -0
  62. package/dist/commands/clear.d.ts +3 -0
  63. package/dist/commands/clear.d.ts.map +1 -0
  64. package/dist/commands/clear.js +20 -0
  65. package/dist/commands/compact.d.ts +3 -0
  66. package/dist/commands/compact.d.ts.map +1 -0
  67. package/dist/commands/compact.js +23 -0
  68. package/dist/commands/config.d.ts +3 -0
  69. package/dist/commands/config.d.ts.map +1 -0
  70. package/dist/commands/config.js +22 -0
  71. package/dist/commands/connect.d.ts +3 -0
  72. package/dist/commands/connect.d.ts.map +1 -0
  73. package/dist/commands/connect.js +102 -0
  74. package/dist/commands/context.d.ts +3 -0
  75. package/dist/commands/context.d.ts.map +1 -0
  76. package/dist/commands/context.js +13 -0
  77. package/dist/commands/dashboard.d.ts +3 -0
  78. package/dist/commands/dashboard.d.ts.map +1 -0
  79. package/dist/commands/dashboard.js +22 -0
  80. package/dist/commands/detach.d.ts +3 -0
  81. package/dist/commands/detach.d.ts.map +1 -0
  82. package/dist/commands/detach.js +44 -0
  83. package/dist/commands/distill.d.ts +3 -0
  84. package/dist/commands/distill.d.ts.map +1 -0
  85. package/dist/commands/distill.js +23 -0
  86. package/dist/commands/doctor.d.ts +3 -0
  87. package/dist/commands/doctor.d.ts.map +1 -0
  88. package/dist/commands/doctor.js +13 -0
  89. package/dist/commands/dream.d.ts +3 -0
  90. package/dist/commands/dream.d.ts.map +1 -0
  91. package/dist/commands/dream.js +59 -0
  92. package/dist/commands/export.d.ts +3 -0
  93. package/dist/commands/export.d.ts.map +1 -0
  94. package/dist/commands/export.js +18 -0
  95. package/dist/commands/exports.d.ts +3 -0
  96. package/dist/commands/exports.d.ts.map +1 -0
  97. package/dist/commands/exports.js +15 -0
  98. package/dist/commands/goal.d.ts +3 -0
  99. package/dist/commands/goal.d.ts.map +1 -0
  100. package/dist/commands/goal.js +147 -0
  101. package/dist/commands/help.d.ts +4 -0
  102. package/dist/commands/help.d.ts.map +1 -0
  103. package/dist/commands/help.js +75 -0
  104. package/dist/commands/hooks.d.ts +3 -0
  105. package/dist/commands/hooks.d.ts.map +1 -0
  106. package/dist/commands/hooks.js +14 -0
  107. package/dist/commands/index.d.ts +29 -0
  108. package/dist/commands/index.d.ts.map +1 -0
  109. package/dist/commands/index.js +417 -0
  110. package/dist/commands/knowledge.d.ts +8 -0
  111. package/dist/commands/knowledge.d.ts.map +1 -0
  112. package/dist/commands/knowledge.js +191 -0
  113. package/dist/commands/loop.d.ts +3 -0
  114. package/dist/commands/loop.d.ts.map +1 -0
  115. package/dist/commands/loop.js +138 -0
  116. package/dist/commands/mcp.d.ts +3 -0
  117. package/dist/commands/mcp.d.ts.map +1 -0
  118. package/dist/commands/mcp.js +57 -0
  119. package/dist/commands/memory.d.ts +3 -0
  120. package/dist/commands/memory.d.ts.map +1 -0
  121. package/dist/commands/memory.js +215 -0
  122. package/dist/commands/mission.d.ts +3 -0
  123. package/dist/commands/mission.d.ts.map +1 -0
  124. package/dist/commands/mission.js +129 -0
  125. package/dist/commands/permissions.d.ts +3 -0
  126. package/dist/commands/permissions.d.ts.map +1 -0
  127. package/dist/commands/permissions.js +82 -0
  128. package/dist/commands/privacy.d.ts +3 -0
  129. package/dist/commands/privacy.d.ts.map +1 -0
  130. package/dist/commands/privacy.js +13 -0
  131. package/dist/commands/recap.d.ts +3 -0
  132. package/dist/commands/recap.d.ts.map +1 -0
  133. package/dist/commands/recap.js +11 -0
  134. package/dist/commands/repomap.d.ts +3 -0
  135. package/dist/commands/repomap.d.ts.map +1 -0
  136. package/dist/commands/repomap.js +146 -0
  137. package/dist/commands/resume.d.ts +3 -0
  138. package/dist/commands/resume.d.ts.map +1 -0
  139. package/dist/commands/resume.js +42 -0
  140. package/dist/commands/runtime.d.ts +61 -0
  141. package/dist/commands/runtime.d.ts.map +1 -0
  142. package/dist/commands/runtime.js +20 -0
  143. package/dist/commands/sessions.d.ts +3 -0
  144. package/dist/commands/sessions.d.ts.map +1 -0
  145. package/dist/commands/sessions.js +34 -0
  146. package/dist/commands/shortcuts.d.ts +3 -0
  147. package/dist/commands/shortcuts.d.ts.map +1 -0
  148. package/dist/commands/shortcuts.js +12 -0
  149. package/dist/commands/skill.d.ts +3 -0
  150. package/dist/commands/skill.d.ts.map +1 -0
  151. package/dist/commands/skill.js +20 -0
  152. package/dist/commands/status.d.ts +3 -0
  153. package/dist/commands/status.d.ts.map +1 -0
  154. package/dist/commands/status.js +31 -0
  155. package/dist/commands/statusline.d.ts +3 -0
  156. package/dist/commands/statusline.d.ts.map +1 -0
  157. package/dist/commands/statusline.js +40 -0
  158. package/dist/commands/storage.d.ts +3 -0
  159. package/dist/commands/storage.d.ts.map +1 -0
  160. package/dist/commands/storage.js +122 -0
  161. package/dist/commands/tasks.d.ts +3 -0
  162. package/dist/commands/tasks.d.ts.map +1 -0
  163. package/dist/commands/tasks.js +117 -0
  164. package/dist/commands/types.d.ts +14 -0
  165. package/dist/commands/types.d.ts.map +1 -0
  166. package/dist/commands/types.js +1 -0
  167. package/dist/commands/verify.d.ts +3 -0
  168. package/dist/commands/verify.d.ts.map +1 -0
  169. package/dist/commands/verify.js +86 -0
  170. package/dist/config-report.d.ts +35 -0
  171. package/dist/config-report.d.ts.map +1 -0
  172. package/dist/config-report.js +100 -0
  173. package/dist/config.d.ts +217 -0
  174. package/dist/config.d.ts.map +1 -0
  175. package/dist/config.js +690 -0
  176. package/dist/context-compactor.d.ts +27 -0
  177. package/dist/context-compactor.d.ts.map +1 -0
  178. package/dist/context-compactor.js +489 -0
  179. package/dist/context-report.d.ts +35 -0
  180. package/dist/context-report.d.ts.map +1 -0
  181. package/dist/context-report.js +172 -0
  182. package/dist/daemon.d.ts +2 -0
  183. package/dist/daemon.d.ts.map +1 -0
  184. package/dist/daemon.js +316 -0
  185. package/dist/dashboard-server.d.ts +18 -0
  186. package/dist/dashboard-server.d.ts.map +1 -0
  187. package/dist/dashboard-server.js +325 -0
  188. package/dist/discovery-registry.d.ts +28 -0
  189. package/dist/discovery-registry.d.ts.map +1 -0
  190. package/dist/discovery-registry.js +106 -0
  191. package/dist/discovery-types.d.ts +54 -0
  192. package/dist/discovery-types.d.ts.map +1 -0
  193. package/dist/discovery-types.js +5 -0
  194. package/dist/doctor.d.ts +31 -0
  195. package/dist/doctor.d.ts.map +1 -0
  196. package/dist/doctor.js +343 -0
  197. package/dist/eval/runner.d.ts +10 -0
  198. package/dist/eval/runner.d.ts.map +1 -0
  199. package/dist/eval/runner.js +78 -0
  200. package/dist/eval/tasks.d.ts +3 -0
  201. package/dist/eval/tasks.d.ts.map +1 -0
  202. package/dist/eval/tasks.js +179 -0
  203. package/dist/eval/types.d.ts +31 -0
  204. package/dist/eval/types.d.ts.map +1 -0
  205. package/dist/eval/types.js +4 -0
  206. package/dist/git/auto-commit.d.ts +28 -0
  207. package/dist/git/auto-commit.d.ts.map +1 -0
  208. package/dist/git/auto-commit.js +112 -0
  209. package/dist/guard/approval.d.ts +16 -0
  210. package/dist/guard/approval.d.ts.map +1 -0
  211. package/dist/guard/approval.js +68 -0
  212. package/dist/guard/content-filter.d.ts +15 -0
  213. package/dist/guard/content-filter.d.ts.map +1 -0
  214. package/dist/guard/content-filter.js +102 -0
  215. package/dist/guard/permissions.d.ts +17 -0
  216. package/dist/guard/permissions.d.ts.map +1 -0
  217. package/dist/guard/permissions.js +54 -0
  218. package/dist/guard/rate-limit.d.ts +14 -0
  219. package/dist/guard/rate-limit.d.ts.map +1 -0
  220. package/dist/guard/rate-limit.js +47 -0
  221. package/dist/guard.d.ts +21 -0
  222. package/dist/guard.d.ts.map +1 -0
  223. package/dist/guard.js +144 -0
  224. package/dist/help-topics.d.ts +19 -0
  225. package/dist/help-topics.d.ts.map +1 -0
  226. package/dist/help-topics.js +391 -0
  227. package/dist/hooks-report.d.ts +23 -0
  228. package/dist/hooks-report.d.ts.map +1 -0
  229. package/dist/hooks-report.js +44 -0
  230. package/dist/i18n/index.d.ts +5 -0
  231. package/dist/i18n/index.d.ts.map +1 -0
  232. package/dist/i18n/index.js +4 -0
  233. package/dist/i18n/zh-cn.d.ts +180 -0
  234. package/dist/i18n/zh-cn.d.ts.map +1 -0
  235. package/dist/i18n/zh-cn.js +184 -0
  236. package/dist/index.d.ts +3 -0
  237. package/dist/index.d.ts.map +1 -0
  238. package/dist/index.js +1157 -0
  239. package/dist/knowledge-agent.d.ts +47 -0
  240. package/dist/knowledge-agent.d.ts.map +1 -0
  241. package/dist/knowledge-agent.js +320 -0
  242. package/dist/local-status-report.d.ts +23 -0
  243. package/dist/local-status-report.d.ts.map +1 -0
  244. package/dist/local-status-report.js +63 -0
  245. package/dist/local-storage-report.d.ts +32 -0
  246. package/dist/local-storage-report.d.ts.map +1 -0
  247. package/dist/local-storage-report.js +171 -0
  248. package/dist/mcp/bridge.d.ts +11 -0
  249. package/dist/mcp/bridge.d.ts.map +1 -0
  250. package/dist/mcp/bridge.js +37 -0
  251. package/dist/mcp/client.d.ts +26 -0
  252. package/dist/mcp/client.d.ts.map +1 -0
  253. package/dist/mcp/client.js +209 -0
  254. package/dist/mcp/http-transport.d.ts +21 -0
  255. package/dist/mcp/http-transport.d.ts.map +1 -0
  256. package/dist/mcp/http-transport.js +126 -0
  257. package/dist/mcp/presets.d.ts +22 -0
  258. package/dist/mcp/presets.d.ts.map +1 -0
  259. package/dist/mcp/presets.js +80 -0
  260. package/dist/mcp/registry.d.ts +23 -0
  261. package/dist/mcp/registry.d.ts.map +1 -0
  262. package/dist/mcp/registry.js +85 -0
  263. package/dist/mcp/stdio-transport.d.ts +25 -0
  264. package/dist/mcp/stdio-transport.d.ts.map +1 -0
  265. package/dist/mcp/stdio-transport.js +92 -0
  266. package/dist/mcp/store.d.ts +41 -0
  267. package/dist/mcp/store.d.ts.map +1 -0
  268. package/dist/mcp/store.js +100 -0
  269. package/dist/mcp/types.d.ts +40 -0
  270. package/dist/mcp/types.d.ts.map +1 -0
  271. package/dist/mcp/types.js +4 -0
  272. package/dist/mcp-report.d.ts +30 -0
  273. package/dist/mcp-report.d.ts.map +1 -0
  274. package/dist/mcp-report.js +104 -0
  275. package/dist/memory/cognitive-index.d.ts +56 -0
  276. package/dist/memory/cognitive-index.d.ts.map +1 -0
  277. package/dist/memory/cognitive-index.js +265 -0
  278. package/dist/memory/compactor.d.ts +28 -0
  279. package/dist/memory/compactor.d.ts.map +1 -0
  280. package/dist/memory/compactor.js +92 -0
  281. package/dist/memory/consolidation.d.ts +13 -0
  282. package/dist/memory/consolidation.d.ts.map +1 -0
  283. package/dist/memory/consolidation.js +77 -0
  284. package/dist/memory/embedding.d.ts +15 -0
  285. package/dist/memory/embedding.d.ts.map +1 -0
  286. package/dist/memory/embedding.js +59 -0
  287. package/dist/memory/memory-llm-dream.d.ts +3 -0
  288. package/dist/memory/memory-llm-dream.d.ts.map +1 -0
  289. package/dist/memory/memory-llm-dream.js +59 -0
  290. package/dist/memory/projection-worker.d.ts +30 -0
  291. package/dist/memory/projection-worker.d.ts.map +1 -0
  292. package/dist/memory/projection-worker.js +92 -0
  293. package/dist/memory/semantic-index.d.ts +18 -0
  294. package/dist/memory/semantic-index.d.ts.map +1 -0
  295. package/dist/memory/semantic-index.js +86 -0
  296. package/dist/memory/wal.d.ts +33 -0
  297. package/dist/memory/wal.d.ts.map +1 -0
  298. package/dist/memory/wal.js +131 -0
  299. package/dist/memory-report.d.ts +120 -0
  300. package/dist/memory-report.d.ts.map +1 -0
  301. package/dist/memory-report.js +726 -0
  302. package/dist/memory.d.ts +149 -0
  303. package/dist/memory.d.ts.map +1 -0
  304. package/dist/memory.js +632 -0
  305. package/dist/metrics/agent-telemetry.d.ts +14 -0
  306. package/dist/metrics/agent-telemetry.d.ts.map +1 -0
  307. package/dist/metrics/agent-telemetry.js +44 -0
  308. package/dist/metrics/collector.d.ts +17 -0
  309. package/dist/metrics/collector.d.ts.map +1 -0
  310. package/dist/metrics/collector.js +137 -0
  311. package/dist/metrics/types.d.ts +14 -0
  312. package/dist/metrics/types.d.ts.map +1 -0
  313. package/dist/metrics/types.js +4 -0
  314. package/dist/mission/manager.d.ts +28 -0
  315. package/dist/mission/manager.d.ts.map +1 -0
  316. package/dist/mission/manager.js +208 -0
  317. package/dist/mission/types.d.ts +37 -0
  318. package/dist/mission/types.d.ts.map +1 -0
  319. package/dist/mission/types.js +5 -0
  320. package/dist/onboarding/tutorial.d.ts +33 -0
  321. package/dist/onboarding/tutorial.d.ts.map +1 -0
  322. package/dist/onboarding/tutorial.js +96 -0
  323. package/dist/output-style.d.ts +14 -0
  324. package/dist/output-style.d.ts.map +1 -0
  325. package/dist/output-style.js +29 -0
  326. package/dist/package-version.d.ts +12 -0
  327. package/dist/package-version.d.ts.map +1 -0
  328. package/dist/package-version.js +42 -0
  329. package/dist/permissions-report.d.ts +42 -0
  330. package/dist/permissions-report.d.ts.map +1 -0
  331. package/dist/permissions-report.js +120 -0
  332. package/dist/pipeline/consistency-checker.d.ts +8 -0
  333. package/dist/pipeline/consistency-checker.d.ts.map +1 -0
  334. package/dist/pipeline/consistency-checker.js +40 -0
  335. package/dist/pipeline/example-generator.d.ts +4 -0
  336. package/dist/pipeline/example-generator.d.ts.map +1 -0
  337. package/dist/pipeline/example-generator.js +64 -0
  338. package/dist/pipeline/hooks.d.ts +68 -0
  339. package/dist/pipeline/hooks.d.ts.map +1 -0
  340. package/dist/pipeline/hooks.js +377 -0
  341. package/dist/pipeline/sections.d.ts +41 -0
  342. package/dist/pipeline/sections.d.ts.map +1 -0
  343. package/dist/pipeline/sections.js +244 -0
  344. package/dist/pipeline/verification.d.ts +12 -0
  345. package/dist/pipeline/verification.d.ts.map +1 -0
  346. package/dist/pipeline/verification.js +138 -0
  347. package/dist/privacy-report.d.ts +24 -0
  348. package/dist/privacy-report.d.ts.map +1 -0
  349. package/dist/privacy-report.js +78 -0
  350. package/dist/providers/presets.d.ts +25 -0
  351. package/dist/providers/presets.d.ts.map +1 -0
  352. package/dist/providers/presets.js +205 -0
  353. package/dist/recap.d.ts +38 -0
  354. package/dist/recap.d.ts.map +1 -0
  355. package/dist/recap.js +154 -0
  356. package/dist/repl.d.ts +41 -0
  357. package/dist/repl.d.ts.map +1 -0
  358. package/dist/repl.js +396 -0
  359. package/dist/runtime-paths.d.ts +32 -0
  360. package/dist/runtime-paths.d.ts.map +1 -0
  361. package/dist/runtime-paths.js +134 -0
  362. package/dist/sdk.d.ts +12 -0
  363. package/dist/sdk.d.ts.map +1 -0
  364. package/dist/sdk.js +18 -0
  365. package/dist/session/daemon-session-api.d.ts +22 -0
  366. package/dist/session/daemon-session-api.d.ts.map +1 -0
  367. package/dist/session/daemon-session-api.js +48 -0
  368. package/dist/session/durable-session-supervisor.d.ts +24 -0
  369. package/dist/session/durable-session-supervisor.d.ts.map +1 -0
  370. package/dist/session/durable-session-supervisor.js +195 -0
  371. package/dist/session/goal-controller.d.ts +43 -0
  372. package/dist/session/goal-controller.d.ts.map +1 -0
  373. package/dist/session/goal-controller.js +77 -0
  374. package/dist/session/goal-evaluator.d.ts +29 -0
  375. package/dist/session/goal-evaluator.d.ts.map +1 -0
  376. package/dist/session/goal-evaluator.js +100 -0
  377. package/dist/session/loop-prompt.d.ts +14 -0
  378. package/dist/session/loop-prompt.d.ts.map +1 -0
  379. package/dist/session/loop-prompt.js +49 -0
  380. package/dist/session/session-goal-manager.d.ts +51 -0
  381. package/dist/session/session-goal-manager.d.ts.map +1 -0
  382. package/dist/session/session-goal-manager.js +118 -0
  383. package/dist/session/session-registry.d.ts +40 -0
  384. package/dist/session/session-registry.d.ts.map +1 -0
  385. package/dist/session/session-registry.js +124 -0
  386. package/dist/session/session-scheduler.d.ts +59 -0
  387. package/dist/session/session-scheduler.d.ts.map +1 -0
  388. package/dist/session/session-scheduler.js +170 -0
  389. package/dist/session-checkpoint-report.d.ts +22 -0
  390. package/dist/session-checkpoint-report.d.ts.map +1 -0
  391. package/dist/session-checkpoint-report.js +99 -0
  392. package/dist/session-export-index.d.ts +23 -0
  393. package/dist/session-export-index.d.ts.map +1 -0
  394. package/dist/session-export-index.js +96 -0
  395. package/dist/session-export.d.ts +28 -0
  396. package/dist/session-export.d.ts.map +1 -0
  397. package/dist/session-export.js +99 -0
  398. package/dist/session-goal-report.d.ts +37 -0
  399. package/dist/session-goal-report.d.ts.map +1 -0
  400. package/dist/session-goal-report.js +219 -0
  401. package/dist/session-list-report.d.ts +16 -0
  402. package/dist/session-list-report.d.ts.map +1 -0
  403. package/dist/session-list-report.js +60 -0
  404. package/dist/session-task-report.d.ts +23 -0
  405. package/dist/session-task-report.d.ts.map +1 -0
  406. package/dist/session-task-report.js +183 -0
  407. package/dist/shortcuts.d.ts +2 -0
  408. package/dist/shortcuts.d.ts.map +1 -0
  409. package/dist/shortcuts.js +32 -0
  410. package/dist/skills/registry.d.ts +8 -0
  411. package/dist/skills/registry.d.ts.map +1 -0
  412. package/dist/skills/registry.js +119 -0
  413. package/dist/skills/types.d.ts +7 -0
  414. package/dist/skills/types.d.ts.map +1 -0
  415. package/dist/skills/types.js +4 -0
  416. package/dist/statusline.d.ts +37 -0
  417. package/dist/statusline.d.ts.map +1 -0
  418. package/dist/statusline.js +207 -0
  419. package/dist/tools/bash.d.ts +10 -0
  420. package/dist/tools/bash.d.ts.map +1 -0
  421. package/dist/tools/bash.js +278 -0
  422. package/dist/tools/browser-fetch.d.ts +7 -0
  423. package/dist/tools/browser-fetch.d.ts.map +1 -0
  424. package/dist/tools/browser-fetch.js +133 -0
  425. package/dist/tools/error-utils.d.ts +9 -0
  426. package/dist/tools/error-utils.d.ts.map +1 -0
  427. package/dist/tools/error-utils.js +35 -0
  428. package/dist/tools/index.d.ts +27 -0
  429. package/dist/tools/index.d.ts.map +1 -0
  430. package/dist/tools/index.js +86 -0
  431. package/dist/tools/patch.d.ts +22 -0
  432. package/dist/tools/patch.d.ts.map +1 -0
  433. package/dist/tools/patch.js +458 -0
  434. package/dist/tools/planner.d.ts +7 -0
  435. package/dist/tools/planner.d.ts.map +1 -0
  436. package/dist/tools/planner.js +148 -0
  437. package/dist/tools/read.d.ts +8 -0
  438. package/dist/tools/read.d.ts.map +1 -0
  439. package/dist/tools/read.js +114 -0
  440. package/dist/tools/search.d.ts +11 -0
  441. package/dist/tools/search.d.ts.map +1 -0
  442. package/dist/tools/search.js +636 -0
  443. package/dist/tools/skill.d.ts +8 -0
  444. package/dist/tools/skill.d.ts.map +1 -0
  445. package/dist/tools/skill.js +181 -0
  446. package/dist/tools/subtask.d.ts +9 -0
  447. package/dist/tools/subtask.d.ts.map +1 -0
  448. package/dist/tools/subtask.js +120 -0
  449. package/dist/tools/todo.d.ts +8 -0
  450. package/dist/tools/todo.d.ts.map +1 -0
  451. package/dist/tools/todo.js +170 -0
  452. package/dist/tools/url-fetch.d.ts +11 -0
  453. package/dist/tools/url-fetch.d.ts.map +1 -0
  454. package/dist/tools/url-fetch.js +208 -0
  455. package/dist/tools/vision-analyze.d.ts +9 -0
  456. package/dist/tools/vision-analyze.d.ts.map +1 -0
  457. package/dist/tools/vision-analyze.js +179 -0
  458. package/dist/tools/write.d.ts +7 -0
  459. package/dist/tools/write.d.ts.map +1 -0
  460. package/dist/tools/write.js +128 -0
  461. package/dist/tui/chrome.d.ts +7 -0
  462. package/dist/tui/chrome.d.ts.map +1 -0
  463. package/dist/tui/chrome.js +22 -0
  464. package/dist/tui/input-buffer.d.ts +37 -0
  465. package/dist/tui/input-buffer.d.ts.map +1 -0
  466. package/dist/tui/input-buffer.js +228 -0
  467. package/dist/tui/input-history.d.ts +11 -0
  468. package/dist/tui/input-history.d.ts.map +1 -0
  469. package/dist/tui/input-history.js +69 -0
  470. package/dist/tui/input-queue.d.ts +27 -0
  471. package/dist/tui/input-queue.d.ts.map +1 -0
  472. package/dist/tui/input-queue.js +85 -0
  473. package/dist/tui/markdown.d.ts +10 -0
  474. package/dist/tui/markdown.d.ts.map +1 -0
  475. package/dist/tui/markdown.js +396 -0
  476. package/dist/tui/progress.d.ts +3 -0
  477. package/dist/tui/progress.d.ts.map +1 -0
  478. package/dist/tui/progress.js +13 -0
  479. package/dist/tui/shell.d.ts +67 -0
  480. package/dist/tui/shell.d.ts.map +1 -0
  481. package/dist/tui/shell.js +271 -0
  482. package/dist/tui/streaming-repl.d.ts +39 -0
  483. package/dist/tui/streaming-repl.d.ts.map +1 -0
  484. package/dist/tui/streaming-repl.js +460 -0
  485. package/dist/tui/streaming-tui.d.ts +174 -0
  486. package/dist/tui/streaming-tui.d.ts.map +1 -0
  487. package/dist/tui/streaming-tui.js +1049 -0
  488. package/dist/types.d.ts +221 -0
  489. package/dist/types.d.ts.map +1 -0
  490. package/dist/types.js +37 -0
  491. package/dist/utils/symbol-extractor.d.ts +8 -0
  492. package/dist/utils/symbol-extractor.d.ts.map +1 -0
  493. package/dist/utils/symbol-extractor.js +190 -0
  494. package/dist/workflow-runtime.d.ts +45 -0
  495. package/dist/workflow-runtime.d.ts.map +1 -0
  496. package/dist/workflow-runtime.js +146 -0
  497. package/dist/workflow-types.d.ts +73 -0
  498. package/dist/workflow-types.d.ts.map +1 -0
  499. package/dist/workflow-types.js +34 -0
  500. package/docs/docker.md +66 -0
  501. package/docs/install.md +159 -0
  502. package/docs/sdk.md +67 -0
  503. package/docs/skills.md +51 -0
  504. package/package.json +102 -0
  505. package/scripts/bootstrap.mjs +63 -0
  506. package/scripts/check_image.ps1 +18 -0
  507. package/scripts/clean-dist.mjs +18 -0
  508. package/scripts/copy_image.ps1 +5 -0
  509. package/scripts/eval-smoke.mjs +17 -0
  510. package/skills/examples/repo-triage/SKILL.md +50 -0
  511. package/skills/qling.md +42 -0
  512. package/skills/templates/SKILL.md +37 -0
@@ -0,0 +1,726 @@
1
+ import { access, readFile } from "fs/promises";
2
+ import { join, dirname } from "path";
3
+ import Database from "better-sqlite3";
4
+ const DEFAULT_MEMORY_COUNT = 10;
5
+ const MAX_MEMORY_COUNT = 50;
6
+ function getMemoryDir(stateDir) {
7
+ const normalized = stateDir.replace(/\\/g, "/");
8
+ if (normalized.includes("/memory/workspace") ||
9
+ normalized.includes("/memory/global") ||
10
+ normalized.endsWith("/memory")) {
11
+ return stateDir;
12
+ }
13
+ return join(stateDir, "memory");
14
+ }
15
+ function getRuntimeRootDir(stateDir, memoryDir) {
16
+ if (memoryDir !== stateDir) {
17
+ return stateDir;
18
+ }
19
+ const normalized = stateDir.replace(/\\/g, "/");
20
+ if (normalized.includes("/memory/workspace/")) {
21
+ return dirname(dirname(dirname(stateDir)));
22
+ }
23
+ if (normalized.includes("/memory/global")) {
24
+ return dirname(dirname(stateDir));
25
+ }
26
+ if (normalized.endsWith("/memory")) {
27
+ return dirname(stateDir);
28
+ }
29
+ return stateDir;
30
+ }
31
+ export function parseMemoryReportCount(value) {
32
+ if (value === undefined || value === null || value === "")
33
+ return DEFAULT_MEMORY_COUNT;
34
+ const parsed = Number(value);
35
+ if (!Number.isFinite(parsed) || parsed <= 0)
36
+ return DEFAULT_MEMORY_COUNT;
37
+ return Math.min(Math.floor(parsed), MAX_MEMORY_COUNT);
38
+ }
39
+ export function parseMemorySearchArgs(args) {
40
+ const trimmed = args.map((arg) => String(arg).trim()).filter(Boolean);
41
+ if (!trimmed.length)
42
+ return { query: "", count: DEFAULT_MEMORY_COUNT };
43
+ const last = trimmed[trimmed.length - 1];
44
+ const lastIsNumeric = /^-?\d+(?:\.\d+)?$/.test(last);
45
+ const count = lastIsNumeric ? parseMemoryReportCount(last) : DEFAULT_MEMORY_COUNT;
46
+ const queryParts = lastIsNumeric ? trimmed.slice(0, -1) : trimmed;
47
+ return {
48
+ query: queryParts.join(" ").trim(),
49
+ count,
50
+ };
51
+ }
52
+ function emptyCounts() {
53
+ return {
54
+ embeddings: null,
55
+ kgNodes: null,
56
+ kgEdges: null,
57
+ distilledPractices: null,
58
+ };
59
+ }
60
+ function formatCreatedAt(value) {
61
+ const numeric = typeof value === "number" ? value : Number(value);
62
+ if (!Number.isFinite(numeric) || numeric <= 0)
63
+ return "-";
64
+ const date = new Date(numeric);
65
+ return Number.isNaN(date.getTime()) ? "-" : date.toISOString();
66
+ }
67
+ function normalizePreview(content, maxLength = 140) {
68
+ const compact = content.replace(/\s+/g, " ").trim();
69
+ if (compact.length <= maxLength)
70
+ return compact;
71
+ return `${compact.slice(0, maxLength - 1)}…`;
72
+ }
73
+ function normalizeEntry(value) {
74
+ if (!value || typeof value !== "object")
75
+ return null;
76
+ const raw = value;
77
+ if (typeof raw.id !== "string" || !raw.id.trim())
78
+ return null;
79
+ if (typeof raw.content !== "string")
80
+ return null;
81
+ return {
82
+ id: raw.id,
83
+ content: raw.content,
84
+ source: typeof raw.source === "string" ? raw.source : "unknown",
85
+ createdAt: typeof raw.createdAt === "number" ? raw.createdAt : Number(raw.createdAt) || 0,
86
+ importance: typeof raw.importance === "number" ? raw.importance : Number(raw.importance) || 0,
87
+ };
88
+ }
89
+ async function loadPersistedEntries(memoryFile, warnings) {
90
+ try {
91
+ const raw = await readFile(memoryFile, "utf8");
92
+ const parsed = JSON.parse(raw);
93
+ const values = Array.isArray(parsed)
94
+ ? parsed
95
+ : parsed && typeof parsed === "object" && Array.isArray(parsed.entries)
96
+ ? parsed.entries
97
+ : [];
98
+ return values.map(normalizeEntry).filter((entry) => entry !== null);
99
+ }
100
+ catch (error) {
101
+ const code = error && typeof error === "object" ? error.code : undefined;
102
+ if (code !== "ENOENT") {
103
+ warnings.push(`memory.json unreadable: ${error instanceof Error ? error.message : String(error)}`);
104
+ }
105
+ return [];
106
+ }
107
+ }
108
+ async function exists(path) {
109
+ try {
110
+ await access(path);
111
+ return true;
112
+ }
113
+ catch {
114
+ return false;
115
+ }
116
+ }
117
+ function countTable(db, table) {
118
+ const tableRow = db
119
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name = ?")
120
+ .get(table);
121
+ if (!tableRow?.name)
122
+ return null;
123
+ const row = db.prepare(`SELECT COUNT(*) AS count FROM ${table}`).get();
124
+ return Number(row?.count ?? 0);
125
+ }
126
+ function hasTable(db, table) {
127
+ const row = db
128
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name = ?")
129
+ .get(table);
130
+ return Boolean(row?.name);
131
+ }
132
+ async function readCognitiveIndexCounts(dbPath, warnings) {
133
+ if (!(await exists(dbPath)))
134
+ return emptyCounts();
135
+ let db = null;
136
+ try {
137
+ db = new Database(dbPath, { readonly: true, fileMustExist: true });
138
+ return {
139
+ embeddings: countTable(db, "embeddings"),
140
+ kgNodes: countTable(db, "kg_nodes"),
141
+ kgEdges: countTable(db, "kg_edges"),
142
+ distilledPractices: countTable(db, "distilled_practices"),
143
+ };
144
+ }
145
+ catch (error) {
146
+ warnings.push(`cognitive_knowledge.db unreadable: ${error instanceof Error ? error.message : String(error)}`);
147
+ return emptyCounts();
148
+ }
149
+ finally {
150
+ db?.close();
151
+ }
152
+ }
153
+ function sortEntries(entries) {
154
+ return [...entries].sort((left, right) => {
155
+ const timeDelta = right.createdAt - left.createdAt;
156
+ if (timeDelta !== 0)
157
+ return timeDelta;
158
+ const importanceDelta = right.importance - left.importance;
159
+ if (importanceDelta !== 0)
160
+ return importanceDelta;
161
+ return left.id.localeCompare(right.id);
162
+ });
163
+ }
164
+ function toReportEntry(entry) {
165
+ return {
166
+ ...entry,
167
+ createdAtIso: formatCreatedAt(entry.createdAt),
168
+ preview: normalizePreview(entry.content),
169
+ };
170
+ }
171
+ function valueToPreview(value) {
172
+ if (typeof value === "string")
173
+ return value;
174
+ if (typeof value === "number" || typeof value === "boolean")
175
+ return String(value);
176
+ if (value === null || value === undefined)
177
+ return "";
178
+ return JSON.stringify(value);
179
+ }
180
+ function summarizeJsonField(raw, id, label, warnings) {
181
+ try {
182
+ const parsed = JSON.parse(raw);
183
+ const values = Array.isArray(parsed)
184
+ ? parsed
185
+ : parsed && typeof parsed === "object" && Array.isArray(parsed.files)
186
+ ? parsed.files
187
+ : parsed && typeof parsed === "object" && Array.isArray(parsed.commands)
188
+ ? parsed.commands
189
+ : [parsed];
190
+ const previewItems = values.map(valueToPreview).filter(Boolean);
191
+ return {
192
+ count: previewItems.length,
193
+ preview: previewItems.slice(0, 3).join(" | ") || "-",
194
+ };
195
+ }
196
+ catch (error) {
197
+ warnings.push(`${id} ${label} json unreadable: ${error instanceof Error ? error.message : String(error)}`);
198
+ return {
199
+ count: raw ? 1 : 0,
200
+ preview: raw || "-",
201
+ };
202
+ }
203
+ }
204
+ function unique(values) {
205
+ return Array.from(new Set(values));
206
+ }
207
+ function tokenizeQuery(query) {
208
+ return unique(query.toLowerCase().split(/\s+/).map((token) => token.trim()).filter(Boolean));
209
+ }
210
+ function matchEntry(entry, query) {
211
+ const normalizedQuery = query.toLowerCase().trim();
212
+ if (!normalizedQuery)
213
+ return null;
214
+ const content = entry.content.toLowerCase();
215
+ const source = entry.source.toLowerCase();
216
+ const id = entry.id.toLowerCase();
217
+ const tokens = tokenizeQuery(normalizedQuery);
218
+ let score = 0;
219
+ const matchedVia = [];
220
+ if (content.includes(normalizedQuery)) {
221
+ score += 10;
222
+ matchedVia.push("content:phrase");
223
+ }
224
+ for (const token of tokens) {
225
+ if (content.includes(token)) {
226
+ score += 5;
227
+ matchedVia.push(`content:${token}`);
228
+ }
229
+ if (source.includes(token)) {
230
+ score += 3;
231
+ matchedVia.push(`source:${token}`);
232
+ }
233
+ if (id.includes(token)) {
234
+ score += 2;
235
+ matchedVia.push(`id:${token}`);
236
+ }
237
+ }
238
+ if (!matchedVia.length)
239
+ return null;
240
+ return { score, matchedVia: unique(matchedVia) };
241
+ }
242
+ export async function buildLocalMemoryReport(stateDir, options = {}) {
243
+ const requestedCount = parseMemoryReportCount(options.count);
244
+ const memoryDir = getMemoryDir(stateDir);
245
+ const memoryFile = join(memoryDir, "memory.json");
246
+ const cognitiveIndexDb = join(memoryDir, "cognitive_knowledge.db");
247
+ const warnings = [];
248
+ const entries = sortEntries(await loadPersistedEntries(memoryFile, warnings));
249
+ const cognitiveIndex = await readCognitiveIndexCounts(cognitiveIndexDb, warnings);
250
+ return {
251
+ stateDir,
252
+ memoryDir,
253
+ memoryFile,
254
+ cognitiveIndexDb,
255
+ entries: entries.slice(0, requestedCount).map(toReportEntry),
256
+ totalEntries: entries.length,
257
+ requestedCount,
258
+ truncated: entries.length > requestedCount,
259
+ cognitiveIndex,
260
+ warnings,
261
+ };
262
+ }
263
+ export async function buildLocalMemorySourcesReport(stateDir) {
264
+ const memoryDir = getMemoryDir(stateDir);
265
+ const runtimeRootDir = getRuntimeRootDir(stateDir, memoryDir);
266
+ const sourceSpecs = [
267
+ {
268
+ id: "persisted_memory",
269
+ label: "Persisted memory",
270
+ path: join(memoryDir, "memory.json"),
271
+ role: "context recall",
272
+ boundary: "条目内容可被显式列表、搜索和详情审计;本报告只检查文件存在性。",
273
+ },
274
+ {
275
+ id: "cognitive_index",
276
+ label: "Cognitive index",
277
+ path: join(memoryDir, "cognitive_knowledge.db"),
278
+ role: "context recall metadata",
279
+ boundary: "只用于向量、知识图谱和蒸馏实践索引;本报告不打开数据库。",
280
+ },
281
+ {
282
+ id: "session_checkpoints",
283
+ label: "Session checkpoints",
284
+ path: join(runtimeRootDir, "sessions"),
285
+ role: "resume metadata",
286
+ boundary: "用于会话恢复和 checkpoint;本报告不读取 session 正文。",
287
+ },
288
+ {
289
+ id: "goal_task_state",
290
+ label: "Goal and task state",
291
+ path: runtimeRootDir,
292
+ role: "task progress metadata",
293
+ boundary: "goal/task 进度保存在 session-goals、session-tasks 等本地文件;本报告不读取任务正文。",
294
+ },
295
+ ];
296
+ const sources = await Promise.all(sourceSpecs.map(async (source) => ({
297
+ ...source,
298
+ exists: await exists(source.path),
299
+ })));
300
+ return { stateDir, sources };
301
+ }
302
+ export async function searchLocalMemoryEntries(stateDir, request) {
303
+ const requestedCount = parseMemoryReportCount(request.count);
304
+ const query = (request.query ?? "").trim();
305
+ const memoryDir = getMemoryDir(stateDir);
306
+ const memoryFile = join(memoryDir, "memory.json");
307
+ const warnings = [];
308
+ const entries = await loadPersistedEntries(memoryFile, warnings);
309
+ const matches = query
310
+ ? entries.flatMap((entry) => {
311
+ const match = matchEntry(entry, query);
312
+ if (!match)
313
+ return [];
314
+ return [{ ...toReportEntry(entry), ...match }];
315
+ })
316
+ : [];
317
+ matches.sort((left, right) => {
318
+ const scoreDelta = right.score - left.score;
319
+ if (scoreDelta !== 0)
320
+ return scoreDelta;
321
+ const importanceDelta = right.importance - left.importance;
322
+ if (importanceDelta !== 0)
323
+ return importanceDelta;
324
+ const timeDelta = right.createdAt - left.createdAt;
325
+ if (timeDelta !== 0)
326
+ return timeDelta;
327
+ return left.id.localeCompare(right.id);
328
+ });
329
+ return {
330
+ stateDir,
331
+ memoryDir,
332
+ memoryFile,
333
+ query,
334
+ entries: matches.slice(0, requestedCount),
335
+ totalEntries: entries.length,
336
+ totalMatches: matches.length,
337
+ requestedCount,
338
+ truncated: matches.length > requestedCount,
339
+ warnings,
340
+ };
341
+ }
342
+ export async function listLocalMemoryPractices(stateDir, options = {}) {
343
+ const requestedCount = parseMemoryReportCount(options.count);
344
+ const memoryDir = getMemoryDir(stateDir);
345
+ const cognitiveIndexDb = join(memoryDir, "cognitive_knowledge.db");
346
+ const warnings = [];
347
+ if (!(await exists(cognitiveIndexDb))) {
348
+ return {
349
+ stateDir,
350
+ memoryDir,
351
+ cognitiveIndexDb,
352
+ entries: [],
353
+ totalPractices: 0,
354
+ requestedCount,
355
+ truncated: false,
356
+ warnings,
357
+ };
358
+ }
359
+ let db = null;
360
+ try {
361
+ db = new Database(cognitiveIndexDb, { readonly: true, fileMustExist: true });
362
+ if (!hasTable(db, "distilled_practices")) {
363
+ return {
364
+ stateDir,
365
+ memoryDir,
366
+ cognitiveIndexDb,
367
+ entries: [],
368
+ totalPractices: 0,
369
+ requestedCount,
370
+ truncated: false,
371
+ warnings,
372
+ };
373
+ }
374
+ const rows = db
375
+ .prepare(`
376
+ SELECT id, task_pattern, action_json, context_json, confidence, hit_count, created_at
377
+ FROM distilled_practices
378
+ ORDER BY confidence DESC, hit_count DESC, created_at DESC, id ASC
379
+ `)
380
+ .all();
381
+ const entries = rows.map((row) => {
382
+ const action = summarizeJsonField(String(row.action_json ?? ""), row.id, "action_json", warnings);
383
+ const context = summarizeJsonField(String(row.context_json ?? ""), row.id, "context_json", warnings);
384
+ return {
385
+ id: String(row.id),
386
+ taskPattern: String(row.task_pattern ?? ""),
387
+ confidence: Number(row.confidence ?? 0),
388
+ hitCount: Number(row.hit_count ?? 0),
389
+ createdAt: Number(row.created_at ?? 0),
390
+ createdAtIso: formatCreatedAt(Number(row.created_at ?? 0)),
391
+ actionCount: action.count,
392
+ actionPreview: action.preview,
393
+ contextCount: context.count,
394
+ contextPreview: context.preview,
395
+ };
396
+ });
397
+ return {
398
+ stateDir,
399
+ memoryDir,
400
+ cognitiveIndexDb,
401
+ entries: entries.slice(0, requestedCount),
402
+ totalPractices: entries.length,
403
+ requestedCount,
404
+ truncated: entries.length > requestedCount,
405
+ warnings,
406
+ };
407
+ }
408
+ catch (error) {
409
+ warnings.push(`cognitive_knowledge.db unreadable: ${error instanceof Error ? error.message : String(error)}`);
410
+ return {
411
+ stateDir,
412
+ memoryDir,
413
+ cognitiveIndexDb,
414
+ entries: [],
415
+ totalPractices: 0,
416
+ requestedCount,
417
+ truncated: false,
418
+ warnings,
419
+ };
420
+ }
421
+ finally {
422
+ db?.close();
423
+ }
424
+ }
425
+ function emptyGraphReport(stateDir, memoryDir, cognitiveIndexDb, requestedCount, warnings = []) {
426
+ return {
427
+ stateDir,
428
+ memoryDir,
429
+ cognitiveIndexDb,
430
+ entries: [],
431
+ totalNodes: 0,
432
+ totalEdges: 0,
433
+ requestedCount,
434
+ truncated: false,
435
+ warnings,
436
+ };
437
+ }
438
+ function relationLabelForNode(nodeId, edge, nodesById) {
439
+ if (edge.source === nodeId) {
440
+ const target = nodesById.get(edge.target);
441
+ return `${edge.relation} -> ${target?.label || edge.target}`;
442
+ }
443
+ const source = nodesById.get(edge.source);
444
+ return `${edge.relation} <- ${source?.label || edge.source}`;
445
+ }
446
+ export async function listLocalMemoryGraph(stateDir, options = {}) {
447
+ const requestedCount = parseMemoryReportCount(options.count);
448
+ const memoryDir = getMemoryDir(stateDir);
449
+ const cognitiveIndexDb = join(memoryDir, "cognitive_knowledge.db");
450
+ const warnings = [];
451
+ if (!(await exists(cognitiveIndexDb))) {
452
+ return emptyGraphReport(stateDir, memoryDir, cognitiveIndexDb, requestedCount, warnings);
453
+ }
454
+ let db = null;
455
+ try {
456
+ db = new Database(cognitiveIndexDb, { readonly: true, fileMustExist: true });
457
+ if (!hasTable(db, "kg_nodes") || !hasTable(db, "kg_edges")) {
458
+ return emptyGraphReport(stateDir, memoryDir, cognitiveIndexDb, requestedCount, warnings);
459
+ }
460
+ const nodes = db
461
+ .prepare("SELECT id, type, label, last_seen FROM kg_nodes")
462
+ .all();
463
+ const edges = db
464
+ .prepare("SELECT source, target, relation, weight FROM kg_edges")
465
+ .all();
466
+ const nodesById = new Map(nodes.map((node) => [String(node.id), node]));
467
+ const edgesByNode = new Map();
468
+ for (const edge of edges) {
469
+ const source = String(edge.source);
470
+ const target = String(edge.target);
471
+ edgesByNode.set(source, [...(edgesByNode.get(source) ?? []), edge]);
472
+ edgesByNode.set(target, [...(edgesByNode.get(target) ?? []), edge]);
473
+ }
474
+ const entries = nodes.map((node) => {
475
+ const id = String(node.id);
476
+ const relatedEdges = edgesByNode.get(id) ?? [];
477
+ const outgoing = relatedEdges.filter((edge) => String(edge.source) === id).length;
478
+ const incoming = relatedEdges.filter((edge) => String(edge.target) === id).length;
479
+ const preview = relatedEdges
480
+ .map((edge) => relationLabelForNode(id, edge, nodesById))
481
+ .slice(0, 3)
482
+ .join(" | ");
483
+ const lastSeen = Number(node.last_seen ?? 0);
484
+ return {
485
+ id,
486
+ type: String(node.type ?? "unknown"),
487
+ label: String(node.label ?? id),
488
+ lastSeen,
489
+ lastSeenIso: formatCreatedAt(lastSeen),
490
+ outgoing,
491
+ incoming,
492
+ degree: outgoing + incoming,
493
+ relationPreview: preview || "-",
494
+ };
495
+ });
496
+ entries.sort((left, right) => {
497
+ const timeDelta = right.lastSeen - left.lastSeen;
498
+ if (timeDelta !== 0)
499
+ return timeDelta;
500
+ const degreeDelta = right.degree - left.degree;
501
+ if (degreeDelta !== 0)
502
+ return degreeDelta;
503
+ return left.id.localeCompare(right.id);
504
+ });
505
+ return {
506
+ stateDir,
507
+ memoryDir,
508
+ cognitiveIndexDb,
509
+ entries: entries.slice(0, requestedCount),
510
+ totalNodes: entries.length,
511
+ totalEdges: edges.length,
512
+ requestedCount,
513
+ truncated: entries.length > requestedCount,
514
+ warnings,
515
+ };
516
+ }
517
+ catch (error) {
518
+ warnings.push(`cognitive_knowledge.db unreadable: ${error instanceof Error ? error.message : String(error)}`);
519
+ return emptyGraphReport(stateDir, memoryDir, cognitiveIndexDb, requestedCount, warnings);
520
+ }
521
+ finally {
522
+ db?.close();
523
+ }
524
+ }
525
+ export async function findLocalMemoryEntry(stateDir, id) {
526
+ const memoryDir = getMemoryDir(stateDir);
527
+ const memoryFile = join(memoryDir, "memory.json");
528
+ const entries = sortEntries(await loadPersistedEntries(memoryFile, []));
529
+ const found = entries.find((entry) => entry.id === id);
530
+ return found ? toReportEntry(found) : null;
531
+ }
532
+ function formatCount(value) {
533
+ return value === null ? "unavailable" : String(value);
534
+ }
535
+ export function formatLocalMemoryReport(report) {
536
+ const lines = [
537
+ "",
538
+ "🧠 本地记忆",
539
+ "-----------------------------------------",
540
+ `State dir : ${report.stateDir}`,
541
+ `Memory : ${report.memoryFile}`,
542
+ `Entries : ${report.entries.length}/${report.totalEntries}`,
543
+ `Index : embeddings=${formatCount(report.cognitiveIndex.embeddings)} kg_nodes=${formatCount(report.cognitiveIndex.kgNodes)} kg_edges=${formatCount(report.cognitiveIndex.kgEdges)} distilled_practices=${formatCount(report.cognitiveIndex.distilledPractices)}`,
544
+ ];
545
+ if (report.truncated) {
546
+ lines.push(`Limit : 显示最近 ${report.requestedCount} 条`);
547
+ }
548
+ for (const warning of report.warnings) {
549
+ lines.push(`Warning : ${warning}`);
550
+ }
551
+ if (!report.entries.length) {
552
+ lines.push("Status : 暂无本地持久化记忆;继续使用轻灵后会自动沉淀,或使用现有 memory 能力写入。");
553
+ lines.push("-----------------------------------------");
554
+ lines.push("说明 : 只读取本地 memory.json 与索引表计数,不读取会话正文、不调用模型、不联网。");
555
+ lines.push("");
556
+ return lines;
557
+ }
558
+ lines.push("");
559
+ report.entries.forEach((entry, index) => {
560
+ lines.push(`${index + 1}. ${entry.id}`);
561
+ lines.push(` 来源 : ${entry.source}`);
562
+ lines.push(` 创建时间 : ${entry.createdAtIso}`);
563
+ lines.push(` 重要度 : ${entry.importance}`);
564
+ lines.push(` 预览 : ${entry.preview}`);
565
+ });
566
+ lines.push("-----------------------------------------");
567
+ lines.push("说明 : 列表只读取本地持久化记忆与索引元数据;用 /memory show <id> 审计单条内容。");
568
+ lines.push("");
569
+ return lines;
570
+ }
571
+ export function formatLocalMemorySourcesReport(report) {
572
+ const lines = [
573
+ "",
574
+ "🧭 本地记忆来源",
575
+ "-----------------------------------------",
576
+ `State dir : ${report.stateDir}`,
577
+ "",
578
+ ];
579
+ report.sources.forEach((source, index) => {
580
+ lines.push(`${index + 1}. ${source.id}`);
581
+ lines.push(` 名称 : ${source.label}`);
582
+ lines.push(` 路径 : ${source.path}`);
583
+ lines.push(` 状态 : ${source.exists ? "exists" : "missing"}`);
584
+ lines.push(` 角色 : ${source.role}`);
585
+ lines.push(` 边界 : ${source.boundary}`);
586
+ });
587
+ lines.push("-----------------------------------------");
588
+ lines.push("说明 : 只读检查本地来源路径是否存在;不读取 session 正文、不调用模型、不联网。");
589
+ lines.push("");
590
+ return lines;
591
+ }
592
+ export function formatLocalMemorySearchReport(report) {
593
+ const lines = [
594
+ "",
595
+ "🔎 本地记忆搜索",
596
+ "-----------------------------------------",
597
+ `Query : ${report.query || "(empty)"}`,
598
+ `Memory : ${report.memoryFile}`,
599
+ `Matches : ${report.entries.length}/${report.totalMatches}`,
600
+ `Entries : ${report.totalEntries}`,
601
+ ];
602
+ if (report.truncated) {
603
+ lines.push(`Limit : 显示前 ${report.requestedCount} 条`);
604
+ }
605
+ for (const warning of report.warnings) {
606
+ lines.push(`Warning : ${warning}`);
607
+ }
608
+ if (!report.query) {
609
+ lines.push("Status : 请输入搜索词。用法: /memory search <query> [count]");
610
+ lines.push("-----------------------------------------");
611
+ lines.push("说明 : 只读取本地 memory.json,不读取会话正文、不调用模型、不联网。");
612
+ lines.push("");
613
+ return lines;
614
+ }
615
+ if (!report.entries.length) {
616
+ lines.push("Status : 无本地匹配。");
617
+ lines.push("-----------------------------------------");
618
+ lines.push("说明 : 只读取本地 memory.json,不读取会话正文、不调用模型、不联网。");
619
+ lines.push("");
620
+ return lines;
621
+ }
622
+ lines.push("");
623
+ report.entries.forEach((entry, index) => {
624
+ lines.push(`${index + 1}. ${entry.id}`);
625
+ lines.push(` Source : ${entry.source}`);
626
+ lines.push(` Created : ${entry.createdAtIso}`);
627
+ lines.push(` Importance: ${entry.importance}`);
628
+ lines.push(` Matched via: ${entry.matchedVia.join(", ")}`);
629
+ lines.push(` Preview : ${entry.preview}`);
630
+ });
631
+ lines.push("-----------------------------------------");
632
+ lines.push("说明 : 搜索只输出本地记忆预览和匹配路径;用 /memory show <id> 审计完整内容。");
633
+ lines.push("");
634
+ return lines;
635
+ }
636
+ export function formatLocalMemoryPracticesReport(report) {
637
+ const lines = [
638
+ "",
639
+ "🧪 本地蒸馏实践",
640
+ "-----------------------------------------",
641
+ `DB : ${report.cognitiveIndexDb}`,
642
+ `Count : ${report.entries.length}/${report.totalPractices}`,
643
+ ];
644
+ if (report.truncated) {
645
+ lines.push(`Limit : 显示前 ${report.requestedCount} 条`);
646
+ }
647
+ for (const warning of report.warnings) {
648
+ lines.push(`Warning : ${warning}`);
649
+ }
650
+ if (!report.entries.length) {
651
+ lines.push("Status : 暂无本地蒸馏实践。");
652
+ lines.push("-----------------------------------------");
653
+ lines.push("说明 : 只读取本地 cognitive_knowledge.db 的 distilled_practices 表,不读取会话正文、不调用模型、不联网。");
654
+ lines.push("");
655
+ return lines;
656
+ }
657
+ lines.push("");
658
+ report.entries.forEach((entry, index) => {
659
+ lines.push(`${index + 1}. ${entry.id}`);
660
+ lines.push(` 任务模式 : ${entry.taskPattern}`);
661
+ lines.push(` 置信度 : ${entry.confidence}`);
662
+ lines.push(` 命中次数 : ${entry.hitCount}`);
663
+ lines.push(` 创建时间 : ${entry.createdAtIso}`);
664
+ lines.push(` 动作预览 : (${entry.actionCount}) ${entry.actionPreview}`);
665
+ lines.push(` 上下文 : (${entry.contextCount}) ${entry.contextPreview}`);
666
+ });
667
+ lines.push("-----------------------------------------");
668
+ lines.push("说明 : 只读展示本地成功实践摘要;不读取 session 正文、不写入索引。");
669
+ lines.push("");
670
+ return lines;
671
+ }
672
+ export function formatLocalMemoryGraphReport(report) {
673
+ const lines = [
674
+ "",
675
+ "🕸️ 本地知识图谱",
676
+ "-----------------------------------------",
677
+ `DB : ${report.cognitiveIndexDb}`,
678
+ `Nodes : ${report.entries.length}/${report.totalNodes}`,
679
+ `Edges : ${report.totalEdges}`,
680
+ ];
681
+ if (report.truncated) {
682
+ lines.push(`Limit : 显示前 ${report.requestedCount} 个节点`);
683
+ }
684
+ for (const warning of report.warnings) {
685
+ lines.push(`Warning : ${warning}`);
686
+ }
687
+ if (!report.entries.length) {
688
+ lines.push("Status : 暂无本地知识图谱;继续使用轻灵后会自动沉淀命令、文件与任务关联。");
689
+ lines.push("-----------------------------------------");
690
+ lines.push("说明 : 只读取本地 cognitive_knowledge.db 的 kg_nodes/kg_edges 元数据,不读取会话正文、不调用模型、不联网。");
691
+ lines.push("");
692
+ return lines;
693
+ }
694
+ lines.push("");
695
+ report.entries.forEach((entry, index) => {
696
+ lines.push(`${index + 1}. ${entry.id}`);
697
+ lines.push(` 类型 : ${entry.type}`);
698
+ lines.push(` 标签 : ${entry.label}`);
699
+ lines.push(` 最后出现 : ${entry.lastSeenIso}`);
700
+ lines.push(` 连接度 : ${entry.degree} (out=${entry.outgoing}, in=${entry.incoming})`);
701
+ lines.push(` 关系预览 : ${entry.relationPreview}`);
702
+ });
703
+ lines.push("-----------------------------------------");
704
+ lines.push("说明 : 只读展示本地知识图谱节点与关系摘要;不读取 metadata、session 正文、不写入索引。");
705
+ lines.push("");
706
+ return lines;
707
+ }
708
+ export function formatLocalMemoryEntry(entry) {
709
+ if (!entry) {
710
+ return ["未找到指定本地记忆。"];
711
+ }
712
+ return [
713
+ "",
714
+ "🧠 本地记忆详情",
715
+ "-----------------------------------------",
716
+ `ID : ${entry.id}`,
717
+ `Source : ${entry.source}`,
718
+ `Created : ${entry.createdAtIso}`,
719
+ `Importance: ${entry.importance}`,
720
+ "",
721
+ entry.content,
722
+ "-----------------------------------------",
723
+ "说明 : 只读取本地 memory.json 中的指定条目,不读取会话正文、不调用模型、不联网。",
724
+ "",
725
+ ];
726
+ }