@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,118 @@
1
+ import * as fs from "fs/promises";
2
+ import { existsSync } from "fs";
3
+ import * as path from "path";
4
+ function cloneGoal(goal) {
5
+ return goal ? { ...goal } : null;
6
+ }
7
+ export class SessionGoalManager {
8
+ goalsDir;
9
+ stateFile;
10
+ clock;
11
+ goal = null;
12
+ constructor(options) {
13
+ this.goalsDir = path.join(options.stateDir, "session-goals");
14
+ this.stateFile = path.join(this.goalsDir, `${options.sessionId}.json`);
15
+ this.clock = options.clock ?? (() => Date.now());
16
+ }
17
+ async init() {
18
+ await fs.mkdir(this.goalsDir, { recursive: true });
19
+ await this.loadGoal();
20
+ }
21
+ async setGoal(condition, baseline, options = {}) {
22
+ const now = this.clock();
23
+ this.goal = {
24
+ condition: condition.trim(),
25
+ status: "active",
26
+ runner: options.runner ?? "session",
27
+ pending: options.pending ?? false,
28
+ createdAt: now,
29
+ updatedAt: now,
30
+ baselineTurns: baseline.turnCount,
31
+ baselineTokens: baseline.tokens,
32
+ evaluatedTurns: 0,
33
+ lastReason: "goal_activated",
34
+ lastDecision: null,
35
+ };
36
+ await this.saveGoal();
37
+ return cloneGoal(this.goal);
38
+ }
39
+ async markEvaluation(result) {
40
+ const goal = this.getGoalOrThrow();
41
+ const now = this.clock();
42
+ goal.updatedAt = now;
43
+ goal.evaluatedTurns += 1;
44
+ goal.lastReason = result.reason;
45
+ goal.lastDecision = result.done ? "done" : "continue";
46
+ goal.pending = goal.runner === "daemon" ? !result.done : false;
47
+ if (result.done) {
48
+ goal.status = "achieved";
49
+ goal.achievedAt = now;
50
+ }
51
+ await this.saveGoal();
52
+ return cloneGoal(goal);
53
+ }
54
+ async clearGoal(reason) {
55
+ const goal = this.goal;
56
+ const now = this.clock();
57
+ if (!goal) {
58
+ const cleared = {
59
+ condition: "",
60
+ status: "cleared",
61
+ runner: "session",
62
+ pending: false,
63
+ createdAt: now,
64
+ updatedAt: now,
65
+ clearedAt: now,
66
+ baselineTurns: 0,
67
+ baselineTokens: 0,
68
+ evaluatedTurns: 0,
69
+ lastReason: reason,
70
+ lastDecision: "cleared",
71
+ };
72
+ this.goal = cleared;
73
+ await this.saveGoal();
74
+ return cloneGoal(cleared);
75
+ }
76
+ goal.status = "cleared";
77
+ goal.pending = false;
78
+ goal.updatedAt = now;
79
+ goal.clearedAt = now;
80
+ goal.lastReason = reason;
81
+ goal.lastDecision = "cleared";
82
+ await this.saveGoal();
83
+ return cloneGoal(goal);
84
+ }
85
+ async getGoalStatus() {
86
+ await this.loadGoal();
87
+ return cloneGoal(this.goal);
88
+ }
89
+ getActiveGoal(runner) {
90
+ if (!this.goal || this.goal.status !== "active") {
91
+ return null;
92
+ }
93
+ if (runner && (this.goal.runner ?? "session") !== runner) {
94
+ return null;
95
+ }
96
+ return cloneGoal(this.goal);
97
+ }
98
+ getGoalOrThrow() {
99
+ if (!this.goal) {
100
+ throw new Error("session goal not found");
101
+ }
102
+ return this.goal;
103
+ }
104
+ async loadGoal() {
105
+ if (!existsSync(this.stateFile))
106
+ return;
107
+ const raw = await fs.readFile(this.stateFile, "utf-8");
108
+ const parsed = JSON.parse(raw);
109
+ this.goal = {
110
+ ...parsed,
111
+ runner: parsed.runner ?? "session",
112
+ pending: parsed.pending ?? false,
113
+ };
114
+ }
115
+ async saveGoal() {
116
+ await fs.writeFile(this.stateFile, JSON.stringify(this.goal, null, 2), "utf-8");
117
+ }
118
+ }
@@ -0,0 +1,40 @@
1
+ import type { Message } from "../types.js";
2
+ export interface SavedSessionSnapshot {
3
+ version: number;
4
+ name: string;
5
+ sessionId: string;
6
+ workspaceDir: string | null;
7
+ createdAt: string;
8
+ updatedAt: string;
9
+ messages: Message[];
10
+ turnCount: number;
11
+ sessionTokens: number;
12
+ compactionCount: number;
13
+ }
14
+ export interface SavedSessionSummary {
15
+ name: string;
16
+ sessionId: string;
17
+ workspaceDir: string | null;
18
+ createdAt: string;
19
+ updatedAt: string;
20
+ turnCount: number;
21
+ messageCount: number;
22
+ sessionTokens: number;
23
+ compactionCount: number;
24
+ }
25
+ export interface SessionRegistryOptions {
26
+ stateDir: string;
27
+ }
28
+ export declare class SessionRegistry {
29
+ private readonly sessionsDir;
30
+ constructor(options: SessionRegistryOptions);
31
+ save(snapshot: Omit<SavedSessionSnapshot, "version">): Promise<string>;
32
+ list(): Promise<SavedSessionSummary[]>;
33
+ load(nameOrSessionId: string): Promise<SavedSessionSnapshot | null>;
34
+ loadLatest(): Promise<SavedSessionSnapshot | null>;
35
+ private getSnapshotPath;
36
+ private normalizeName;
37
+ private normalizeSnapshot;
38
+ private readSnapshot;
39
+ }
40
+ //# sourceMappingURL=session-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../../src/session/session-registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAoBD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,EAAE,sBAAsB;IAIrC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAQtE,IAAI,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAmBtC,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAmBnE,UAAU,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAQxD,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,iBAAiB;YAeX,YAAY;CAmC3B"}
@@ -0,0 +1,124 @@
1
+ import * as fs from "fs/promises";
2
+ import { existsSync } from "fs";
3
+ import * as path from "path";
4
+ function cloneMessages(messages) {
5
+ return messages.map((message) => ({ ...message }));
6
+ }
7
+ function toSummary(snapshot) {
8
+ return {
9
+ name: snapshot.name,
10
+ sessionId: snapshot.sessionId,
11
+ workspaceDir: snapshot.workspaceDir,
12
+ createdAt: snapshot.createdAt,
13
+ updatedAt: snapshot.updatedAt,
14
+ turnCount: snapshot.turnCount,
15
+ messageCount: snapshot.messages.length,
16
+ sessionTokens: snapshot.sessionTokens,
17
+ compactionCount: snapshot.compactionCount,
18
+ };
19
+ }
20
+ export class SessionRegistry {
21
+ sessionsDir;
22
+ constructor(options) {
23
+ this.sessionsDir = path.join(options.stateDir, "sessions");
24
+ }
25
+ async save(snapshot) {
26
+ await fs.mkdir(this.sessionsDir, { recursive: true });
27
+ const normalized = this.normalizeSnapshot(snapshot);
28
+ const filePath = this.getSnapshotPath(normalized.name);
29
+ await fs.writeFile(filePath, JSON.stringify(normalized, null, 2), "utf-8");
30
+ return filePath;
31
+ }
32
+ async list() {
33
+ await fs.mkdir(this.sessionsDir, { recursive: true });
34
+ const files = await fs.readdir(this.sessionsDir);
35
+ const snapshots = [];
36
+ for (const file of files) {
37
+ if (!file.endsWith(".json"))
38
+ continue;
39
+ const snapshot = await this.readSnapshot(path.join(this.sessionsDir, file));
40
+ if (!snapshot)
41
+ continue;
42
+ snapshots.push(toSummary(snapshot));
43
+ }
44
+ return snapshots.sort((left, right) => {
45
+ const diff = Date.parse(right.updatedAt) - Date.parse(left.updatedAt);
46
+ if (diff !== 0)
47
+ return diff;
48
+ return right.name.localeCompare(left.name);
49
+ });
50
+ }
51
+ async load(nameOrSessionId) {
52
+ await fs.mkdir(this.sessionsDir, { recursive: true });
53
+ const normalizedRef = this.normalizeName(nameOrSessionId);
54
+ const directPath = this.getSnapshotPath(normalizedRef);
55
+ const direct = await this.readSnapshot(directPath);
56
+ if (direct) {
57
+ return direct;
58
+ }
59
+ const summaries = await this.list();
60
+ const matched = summaries.find((summary) => summary.name === normalizedRef || summary.sessionId === normalizedRef);
61
+ if (!matched) {
62
+ return null;
63
+ }
64
+ return this.readSnapshot(this.getSnapshotPath(matched.name));
65
+ }
66
+ async loadLatest() {
67
+ const summaries = await this.list();
68
+ if (summaries.length === 0) {
69
+ return null;
70
+ }
71
+ return this.readSnapshot(this.getSnapshotPath(summaries[0].name));
72
+ }
73
+ getSnapshotPath(name) {
74
+ return path.join(this.sessionsDir, `${this.normalizeName(name)}.json`);
75
+ }
76
+ normalizeName(name) {
77
+ return path.basename(name).replace(/\.json$/i, "");
78
+ }
79
+ normalizeSnapshot(snapshot) {
80
+ return {
81
+ version: 1,
82
+ name: this.normalizeName(snapshot.name),
83
+ sessionId: snapshot.sessionId.trim(),
84
+ workspaceDir: snapshot.workspaceDir ?? null,
85
+ createdAt: snapshot.createdAt,
86
+ updatedAt: snapshot.updatedAt,
87
+ messages: cloneMessages(snapshot.messages ?? []),
88
+ turnCount: snapshot.turnCount ?? 0,
89
+ sessionTokens: snapshot.sessionTokens ?? 0,
90
+ compactionCount: snapshot.compactionCount ?? 0,
91
+ };
92
+ }
93
+ async readSnapshot(filePath) {
94
+ if (!existsSync(filePath)) {
95
+ return null;
96
+ }
97
+ try {
98
+ const raw = JSON.parse(await fs.readFile(filePath, "utf-8"));
99
+ const name = this.normalizeName(path.basename(filePath));
100
+ const savedAt = typeof raw.savedAt === "string" ? raw.savedAt : new Date(0).toISOString();
101
+ const createdAt = typeof raw.createdAt === "string" ? raw.createdAt : savedAt;
102
+ const updatedAt = typeof raw.updatedAt === "string" ? raw.updatedAt : savedAt;
103
+ return {
104
+ version: typeof raw.version === "number" ? raw.version : 1,
105
+ name: typeof raw.name === "string" && raw.name.trim() ? this.normalizeName(raw.name) : name,
106
+ sessionId: typeof raw.sessionId === "string" && raw.sessionId.trim()
107
+ ? raw.sessionId
108
+ : name,
109
+ workspaceDir: typeof raw.workspaceDir === "string" && raw.workspaceDir.trim()
110
+ ? raw.workspaceDir
111
+ : null,
112
+ createdAt,
113
+ updatedAt,
114
+ messages: Array.isArray(raw.messages) ? cloneMessages(raw.messages) : [],
115
+ turnCount: typeof raw.turnCount === "number" ? raw.turnCount : 0,
116
+ sessionTokens: typeof raw.sessionTokens === "number" ? raw.sessionTokens : 0,
117
+ compactionCount: typeof raw.compactionCount === "number" ? raw.compactionCount : 0,
118
+ };
119
+ }
120
+ catch {
121
+ return null;
122
+ }
123
+ }
124
+ }
@@ -0,0 +1,59 @@
1
+ export type SessionTaskKind = "loop";
2
+ export type SessionTaskMode = "fixed" | "default";
3
+ export type SessionTaskStatus = "active" | "running" | "completed" | "canceled";
4
+ export type SessionTaskRunner = "session" | "daemon";
5
+ export interface SessionTask {
6
+ id: string;
7
+ kind: SessionTaskKind;
8
+ prompt: string;
9
+ intervalMs: number;
10
+ mode: SessionTaskMode;
11
+ runner: SessionTaskRunner;
12
+ status: SessionTaskStatus;
13
+ pending: boolean;
14
+ createdAt: number;
15
+ updatedAt: number;
16
+ lastRunAt?: number;
17
+ nextRunAt: number;
18
+ }
19
+ export interface SessionSchedulerOptions {
20
+ stateDir: string;
21
+ sessionId: string;
22
+ onDue?: (task: SessionTask) => Promise<void>;
23
+ clock?: () => number;
24
+ pollIntervalMs?: number;
25
+ runner?: SessionTaskRunner;
26
+ }
27
+ export interface DueRunResult {
28
+ triggered: number;
29
+ }
30
+ export declare class SessionScheduler {
31
+ private readonly tasksDir;
32
+ private readonly stateFile;
33
+ private readonly onDue;
34
+ private readonly clock;
35
+ private readonly pollIntervalMs;
36
+ private readonly runner;
37
+ private readonly tasks;
38
+ private busy;
39
+ private timer;
40
+ constructor(options: SessionSchedulerOptions);
41
+ init(): Promise<void>;
42
+ start(): void;
43
+ stop(): Promise<void>;
44
+ setBusy(value: boolean): void;
45
+ createLoopTask(options: {
46
+ prompt: string;
47
+ intervalMs: number;
48
+ mode: SessionTaskMode;
49
+ runner?: SessionTaskRunner;
50
+ }): Promise<SessionTask>;
51
+ listTasks(): Promise<SessionTask[]>;
52
+ cancelTask(id: string): Promise<SessionTask>;
53
+ cancelAllTasks(): Promise<number>;
54
+ runDueTasksOnce(): Promise<DueRunResult>;
55
+ private getTaskOrThrow;
56
+ private loadTasks;
57
+ private saveTasks;
58
+ }
59
+ //# sourceMappingURL=session-scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-scheduler.d.ts","sourceRoot":"","sources":["../../src/session/session-scheduler.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC;AACrC,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,SAAS,CAAC;AAClD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;AAChF,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuC;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;IACxD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,KAAK,CAA+C;gBAEhD,OAAO,EAAE,uBAAuB;IAStC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,KAAK,IAAI,IAAI;IAOP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIvB,cAAc,CAAC,OAAO,EAAE;QAC5B,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,eAAe,CAAC;QACtB,MAAM,CAAC,EAAE,iBAAiB,CAAC;KAC5B,GAAG,OAAO,CAAC,WAAW,CAAC;IAqBlB,SAAS,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAOnC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAU5C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAiBjC,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC;IAqD9C,OAAO,CAAC,cAAc;YAQR,SAAS;YAaT,SAAS;CAMxB"}
@@ -0,0 +1,170 @@
1
+ import * as fs from "fs/promises";
2
+ import { existsSync } from "fs";
3
+ import * as path from "path";
4
+ function cloneTask(task) {
5
+ return { ...task };
6
+ }
7
+ export class SessionScheduler {
8
+ tasksDir;
9
+ stateFile;
10
+ onDue;
11
+ clock;
12
+ pollIntervalMs;
13
+ runner;
14
+ tasks = new Map();
15
+ busy = false;
16
+ timer = null;
17
+ constructor(options) {
18
+ this.tasksDir = path.join(options.stateDir, "session-tasks");
19
+ this.stateFile = path.join(this.tasksDir, `${options.sessionId}.json`);
20
+ this.onDue = options.onDue ?? (async () => { });
21
+ this.clock = options.clock ?? (() => Date.now());
22
+ this.pollIntervalMs = options.pollIntervalMs ?? 1000;
23
+ this.runner = options.runner ?? "session";
24
+ }
25
+ async init() {
26
+ await fs.mkdir(this.tasksDir, { recursive: true });
27
+ await this.loadTasks();
28
+ }
29
+ start() {
30
+ if (this.timer)
31
+ return;
32
+ this.timer = setInterval(() => {
33
+ void this.runDueTasksOnce();
34
+ }, this.pollIntervalMs);
35
+ }
36
+ async stop() {
37
+ if (this.timer) {
38
+ clearInterval(this.timer);
39
+ this.timer = null;
40
+ }
41
+ }
42
+ setBusy(value) {
43
+ this.busy = value;
44
+ }
45
+ async createLoopTask(options) {
46
+ await this.loadTasks();
47
+ const now = this.clock();
48
+ const task = {
49
+ id: `tsk_loop_${now.toString(36)}_${Math.random().toString(36).slice(2, 6)}`,
50
+ kind: "loop",
51
+ prompt: options.prompt,
52
+ intervalMs: Math.max(1_000, Math.floor(options.intervalMs)),
53
+ mode: options.mode,
54
+ runner: options.runner ?? this.runner,
55
+ status: "active",
56
+ pending: false,
57
+ createdAt: now,
58
+ updatedAt: now,
59
+ nextRunAt: now + Math.max(1_000, Math.floor(options.intervalMs)),
60
+ };
61
+ this.tasks.set(task.id, task);
62
+ await this.saveTasks();
63
+ return cloneTask(task);
64
+ }
65
+ async listTasks() {
66
+ await this.loadTasks();
67
+ return Array.from(this.tasks.values())
68
+ .sort((a, b) => a.createdAt - b.createdAt)
69
+ .map(cloneTask);
70
+ }
71
+ async cancelTask(id) {
72
+ await this.loadTasks();
73
+ const task = this.getTaskOrThrow(id);
74
+ task.status = "canceled";
75
+ task.pending = false;
76
+ task.updatedAt = this.clock();
77
+ await this.saveTasks();
78
+ return cloneTask(task);
79
+ }
80
+ async cancelAllTasks() {
81
+ await this.loadTasks();
82
+ let count = 0;
83
+ for (const task of this.tasks.values()) {
84
+ if (task.status === "active" || task.status === "running") {
85
+ task.status = "canceled";
86
+ task.pending = false;
87
+ task.updatedAt = this.clock();
88
+ count++;
89
+ }
90
+ }
91
+ if (count > 0) {
92
+ await this.saveTasks();
93
+ }
94
+ return count;
95
+ }
96
+ async runDueTasksOnce() {
97
+ await this.loadTasks();
98
+ const now = this.clock();
99
+ let triggered = 0;
100
+ let dirty = false;
101
+ const tasks = Array.from(this.tasks.values()).sort((a, b) => a.nextRunAt - b.nextRunAt);
102
+ for (const task of tasks) {
103
+ if (task.status === "canceled" || task.status === "completed") {
104
+ continue;
105
+ }
106
+ if ((task.runner ?? "session") !== this.runner) {
107
+ continue;
108
+ }
109
+ const isDue = task.pending || task.nextRunAt <= now;
110
+ if (!isDue)
111
+ continue;
112
+ if (this.busy) {
113
+ if (!task.pending) {
114
+ task.pending = true;
115
+ task.updatedAt = now;
116
+ dirty = true;
117
+ }
118
+ continue;
119
+ }
120
+ task.pending = false;
121
+ task.status = "running";
122
+ task.updatedAt = now;
123
+ await this.saveTasks();
124
+ try {
125
+ await this.onDue(cloneTask(task));
126
+ triggered++;
127
+ }
128
+ finally {
129
+ const currentTask = this.tasks.get(task.id);
130
+ if (currentTask && currentTask.status !== "canceled") {
131
+ currentTask.status = "active";
132
+ currentTask.lastRunAt = now;
133
+ currentTask.nextRunAt = now + currentTask.intervalMs;
134
+ currentTask.updatedAt = this.clock();
135
+ }
136
+ await this.saveTasks();
137
+ }
138
+ }
139
+ if (dirty) {
140
+ await this.saveTasks();
141
+ }
142
+ return { triggered };
143
+ }
144
+ getTaskOrThrow(id) {
145
+ const task = this.tasks.get(id);
146
+ if (!task) {
147
+ throw new Error(`session task not found: ${id}`);
148
+ }
149
+ return task;
150
+ }
151
+ async loadTasks() {
152
+ if (!existsSync(this.stateFile))
153
+ return;
154
+ const raw = await fs.readFile(this.stateFile, "utf-8");
155
+ const parsed = JSON.parse(raw);
156
+ this.tasks.clear();
157
+ for (const task of parsed) {
158
+ this.tasks.set(task.id, {
159
+ ...task,
160
+ runner: task.runner ?? "session",
161
+ });
162
+ }
163
+ }
164
+ async saveTasks() {
165
+ const payload = Array.from(this.tasks.values())
166
+ .sort((a, b) => a.createdAt - b.createdAt)
167
+ .map(cloneTask);
168
+ await fs.writeFile(this.stateFile, JSON.stringify(payload, null, 2), "utf-8");
169
+ }
170
+ }
@@ -0,0 +1,22 @@
1
+ export interface LocalSessionCheckpointRequest {
2
+ name?: string;
3
+ sessionRef?: string;
4
+ force?: boolean;
5
+ }
6
+ export interface LocalSessionCheckpointResult {
7
+ stateDir: string;
8
+ sessionsDir: string;
9
+ sourceName: string;
10
+ sourceSessionId: string;
11
+ checkpointName: string;
12
+ checkpointPath: string;
13
+ updatedAt: string;
14
+ turnCount: number;
15
+ messageCount: number;
16
+ sessionTokens: number;
17
+ compactionCount: number;
18
+ }
19
+ export declare function parseLocalSessionCheckpointArgs(args: string[]): LocalSessionCheckpointRequest;
20
+ export declare function createLocalSessionCheckpoint(stateDir: string, request?: LocalSessionCheckpointRequest, now?: Date): Promise<LocalSessionCheckpointResult>;
21
+ export declare function formatLocalSessionCheckpointResult(result: LocalSessionCheckpointResult): string[];
22
+ //# sourceMappingURL=session-checkpoint-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-checkpoint-report.d.ts","sourceRoot":"","sources":["../src/session-checkpoint-report.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,6BAA6B;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,6BAA6B,CA0B7F;AAED,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,6BAAkC,EAC3C,GAAG,OAAa,GACf,OAAO,CAAC,4BAA4B,CAAC,CAmCvC;AAED,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,4BAA4B,GAAG,MAAM,EAAE,CAmBjG"}
@@ -0,0 +1,99 @@
1
+ import { join } from "path";
2
+ import { SessionRegistry } from "./session/session-registry.js";
3
+ export function parseLocalSessionCheckpointArgs(args) {
4
+ const nameParts = [];
5
+ let sessionRef;
6
+ for (let i = 0; i < args.length; i++) {
7
+ const arg = args[i];
8
+ if (arg === "--force" || arg === "-f") {
9
+ continue;
10
+ }
11
+ if (arg === "--session" || arg === "-s") {
12
+ sessionRef = args[i + 1];
13
+ i++;
14
+ continue;
15
+ }
16
+ if (arg.startsWith("--session=")) {
17
+ sessionRef = arg.slice("--session=".length).trim() || undefined;
18
+ continue;
19
+ }
20
+ nameParts.push(arg);
21
+ }
22
+ return {
23
+ name: nameParts.join(" ").trim() || undefined,
24
+ sessionRef,
25
+ force: args.includes("--force") || args.includes("-f"),
26
+ };
27
+ }
28
+ export async function createLocalSessionCheckpoint(stateDir, request = {}, now = new Date()) {
29
+ const registry = new SessionRegistry({ stateDir });
30
+ const source = request.sessionRef
31
+ ? await registry.load(request.sessionRef)
32
+ : await registry.loadLatest();
33
+ if (!source) {
34
+ const suffix = request.sessionRef ? `: ${request.sessionRef}` : "";
35
+ throw new Error(`未找到可保存的本地会话快照${suffix}`);
36
+ }
37
+ const checkpointName = request.name?.trim() || defaultCheckpointName(now);
38
+ if (request.name?.trim() && !request.force) {
39
+ const existing = await registry.load(checkpointName);
40
+ if (existing) {
41
+ throw new Error(`本地检查点已存在: ${checkpointName}。如需覆盖,请显式添加 --force。`);
42
+ }
43
+ }
44
+ const updatedAt = now.toISOString();
45
+ const checkpointPath = await registry.save(copySnapshot(source, checkpointName, updatedAt));
46
+ return {
47
+ stateDir,
48
+ sessionsDir: join(stateDir, "sessions"),
49
+ sourceName: source.name,
50
+ sourceSessionId: source.sessionId,
51
+ checkpointName,
52
+ checkpointPath,
53
+ updatedAt,
54
+ turnCount: source.turnCount,
55
+ messageCount: source.messages.length,
56
+ sessionTokens: source.sessionTokens,
57
+ compactionCount: source.compactionCount,
58
+ };
59
+ }
60
+ export function formatLocalSessionCheckpointResult(result) {
61
+ return [
62
+ "",
63
+ "💾 本地会话检查点",
64
+ "-----------------------------------------",
65
+ `State dir : ${result.stateDir}`,
66
+ `Sessions : ${result.sessionsDir}`,
67
+ `Source : ${result.sourceName} | ${result.sourceSessionId}`,
68
+ `Checkpoint: ${result.checkpointName}`,
69
+ `Path : ${result.checkpointPath}`,
70
+ `Updated : ${formatTime(result.updatedAt)}`,
71
+ `Turns : ${result.turnCount}`,
72
+ `Messages : ${result.messageCount}`,
73
+ `Tokens : ${result.sessionTokens.toLocaleString()}`,
74
+ `Compacts : ${result.compactionCount}`,
75
+ "-----------------------------------------",
76
+ "说明 : 只复制本地会话快照;不输出消息正文、不调用模型、不联网。",
77
+ "",
78
+ ];
79
+ }
80
+ function copySnapshot(source, name, updatedAt) {
81
+ return {
82
+ name,
83
+ sessionId: source.sessionId,
84
+ workspaceDir: source.workspaceDir,
85
+ createdAt: source.createdAt,
86
+ updatedAt,
87
+ messages: source.messages.map((message) => ({ ...message })),
88
+ turnCount: source.turnCount,
89
+ sessionTokens: source.sessionTokens,
90
+ compactionCount: source.compactionCount,
91
+ };
92
+ }
93
+ function defaultCheckpointName(now) {
94
+ return `checkpoint-${now.toISOString().replace(/[:.]/g, "-")}`;
95
+ }
96
+ function formatTime(value) {
97
+ const ts = Date.parse(value);
98
+ return Number.isNaN(ts) ? value : new Date(ts).toLocaleString();
99
+ }
@@ -0,0 +1,23 @@
1
+ import type { SlashCommandContext } from "./commands/runtime.js";
2
+ export interface SessionExportIndexEntry {
3
+ name: string;
4
+ path: string;
5
+ sizeBytes: number;
6
+ modifiedAt: string;
7
+ modifiedAtMs: number;
8
+ }
9
+ export interface SessionExportIndexReport {
10
+ exportsDir: string;
11
+ entries: SessionExportIndexEntry[];
12
+ total: number;
13
+ requestedCount: number;
14
+ truncated: boolean;
15
+ }
16
+ export interface SessionExportIndexOptions {
17
+ count?: number;
18
+ env?: NodeJS.ProcessEnv | Record<string, string | undefined>;
19
+ }
20
+ export declare function parseSessionExportCount(value?: string | number): number;
21
+ export declare function listSessionExportFiles(context: SlashCommandContext, options?: SessionExportIndexOptions): Promise<SessionExportIndexReport>;
22
+ export declare function formatSessionExportIndex(report: SessionExportIndexReport): string[];
23
+ //# sourceMappingURL=session-export-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-export-index.d.ts","sourceRoot":"","sources":["../src/session-export-index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAMjE,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC9D;AAED,wBAAgB,uBAAuB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAKvE;AAkBD,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,wBAAwB,CAAC,CAsCnC;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,EAAE,CAiCnF"}