@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,560 @@
1
+ import { existsSync } from "fs";
2
+ import { mkdir, writeFile } from "fs/promises";
3
+ import { spawn, execFile } from "child_process";
4
+ import { promisify } from "util";
5
+ import { join } from "path";
6
+ import { formatPresetTableLines, getProviderPreset, resolveModelCandidates, } from "../providers/presets.js";
7
+ const execFileAsync = promisify(execFile);
8
+ const DEFAULT_MODELS = resolveModelCandidates();
9
+ function workspaceOf(context) {
10
+ return context.workspaceDir || context.agentLoop?.getWorkspaceDir?.() || process.cwd();
11
+ }
12
+ function formatBoundary(command, replacement) {
13
+ return [
14
+ "",
15
+ `⛔ ${command} 在轻灵本地不可用`,
16
+ "-----------------------------------------",
17
+ "原因 : 该命令依赖 Claude 账号、云端服务、桌面/移动端或平台专属能力。",
18
+ replacement ? `替代 : ${replacement}` : "替代 : 使用 /help 查看轻灵本地可用命令。",
19
+ "边界 : 这是本地说明;不调用模型、不联网、不上传、不修改配置。",
20
+ "-----------------------------------------",
21
+ "",
22
+ ];
23
+ }
24
+ function createUnavailableCommand(name, description, replacement, aliases = [], argumentHint = "") {
25
+ return {
26
+ name,
27
+ aliases,
28
+ description,
29
+ usage: `${name}${argumentHint ? ` ${argumentHint}` : ""}`,
30
+ category: "cloud",
31
+ argumentHint,
32
+ availability: "unsupported",
33
+ claudeCompatibleName: name,
34
+ execute: async (_args, context) => {
35
+ for (const line of formatBoundary(name, replacement))
36
+ context.writeLine(line);
37
+ },
38
+ };
39
+ }
40
+ export const usageCommand = {
41
+ name: "/usage",
42
+ aliases: ["/cost", "/stats"],
43
+ description: "查看本地 token 与上下文预算使用情况",
44
+ usage: "/usage",
45
+ category: "session",
46
+ availability: "local",
47
+ claudeCompatibleName: "/usage",
48
+ execute: async (_args, context) => {
49
+ const stats = typeof context.agentLoop.getSessionStats === "function"
50
+ ? await context.agentLoop.getSessionStats()
51
+ : { sessionId: "unknown", turnCount: 0, tokens: 0, tokenSource: "unknown", compactions: 0 };
52
+ const maxTokens = Number(process.env.QLING_MAX_TOKEN_BUDGET ?? process.env.QLING_RUNTIME_MAX_TOKEN_BUDGET ?? "120000");
53
+ const tokens = Math.max(0, Number(stats.tokens ?? 0));
54
+ const pct = Number.isFinite(maxTokens) && maxTokens > 0 ? Math.round((tokens / maxTokens) * 100) : null;
55
+ context.writeLine("");
56
+ context.writeLine("📈 【本地用量】");
57
+ context.writeLine("-----------------------------------------");
58
+ context.writeLine(`Session : ${stats.sessionId ?? "unknown"}`);
59
+ context.writeLine(`Turns : ${Number(stats.turnCount ?? 0)}`);
60
+ context.writeLine(`Tokens : ${tokens.toLocaleString()}`);
61
+ context.writeLine(`Source : ${stats.tokenSource ?? "unknown"}`);
62
+ context.writeLine(`Context : ${pct === null ? "unknown" : `${pct}% of ${maxTokens.toLocaleString()}`}`);
63
+ context.writeLine(`Compacts : ${Number(stats.compactions ?? 0)}`);
64
+ context.writeLine("边界 : provider usage 优先;缺失时使用本地估算,不代表最终账单。");
65
+ context.writeLine("-----------------------------------------");
66
+ context.writeLine("");
67
+ },
68
+ };
69
+ export const modelCommand = {
70
+ name: "/model",
71
+ description: "查看或切换当前会话模型 / Provider 预设",
72
+ usage: "/model [list|use <preset>|model]",
73
+ category: "session",
74
+ argumentHint: "[list|use <preset>|<model>]",
75
+ availability: "local",
76
+ claudeCompatibleName: "/model",
77
+ execute: async (args, context) => {
78
+ const loop = context.agentLoop;
79
+ const currentModel = typeof loop.getModel === "function"
80
+ ? loop.getModel()
81
+ : process.env.QLING_LLM_MODEL || "unknown";
82
+ const currentProvider = typeof loop.getProvider === "function"
83
+ ? loop.getProvider()
84
+ : process.env.QLING_LLM_PROVIDER || "unknown";
85
+ const currentEndpoint = typeof loop.getEndpoint === "function"
86
+ ? loop.getEndpoint()
87
+ : process.env.QLING_LLM_ENDPOINT || "unknown";
88
+ const sub = (args[0] ?? "").trim().toLowerCase();
89
+ const rest = args.slice(1).join(" ").trim();
90
+ context.writeLine("");
91
+ context.writeLine("🤖 【模型 / Provider】");
92
+ context.writeLine("-----------------------------------------");
93
+ if (!sub) {
94
+ context.writeLine(`Provider : ${currentProvider}`);
95
+ context.writeLine(`Endpoint : ${currentEndpoint}`);
96
+ context.writeLine(`Model : ${currentModel}`);
97
+ context.writeLine(`候选模型 : ${DEFAULT_MODELS.join(", ")}`);
98
+ context.writeLine("用法 : /model list");
99
+ context.writeLine(" : /model use <preset|序号>");
100
+ context.writeLine(" : /model <model>");
101
+ context.writeLine("边界 : 默认只影响当前进程;不写 ~/.qling/.env。");
102
+ context.writeLine("-----------------------------------------");
103
+ context.writeLine("");
104
+ return;
105
+ }
106
+ if (sub === "list" || sub === "ls" || sub === "presets") {
107
+ context.writeLine("可用 Provider 预设:");
108
+ for (const line of formatPresetTableLines()) {
109
+ context.writeLine(line);
110
+ }
111
+ context.writeLine("");
112
+ context.writeLine("切换整包: /model use ollama");
113
+ context.writeLine("只改模型: /model deepseek-chat");
114
+ context.writeLine("-----------------------------------------");
115
+ context.writeLine("");
116
+ return;
117
+ }
118
+ if (sub === "use" || sub === "preset") {
119
+ const presetKey = rest || args[1] || "";
120
+ if (!presetKey) {
121
+ context.writeError("❌ 用法: /model use <preset|序号>,例如 /model use ollama");
122
+ context.writeLine("-----------------------------------------");
123
+ context.writeLine("");
124
+ return;
125
+ }
126
+ const preset = getProviderPreset(presetKey);
127
+ if (!preset) {
128
+ context.writeError(`❌ 未找到预设 '${presetKey}'。运行 /model list 查看。`);
129
+ context.writeLine("-----------------------------------------");
130
+ context.writeLine("");
131
+ return;
132
+ }
133
+ if (typeof loop.applyLlmSession === "function") {
134
+ loop.applyLlmSession({
135
+ provider: preset.provider,
136
+ endpoint: preset.endpoint,
137
+ model: preset.model,
138
+ apiKey: preset.requiresApiKey ? undefined : "",
139
+ });
140
+ }
141
+ else if (typeof loop.setModel === "function") {
142
+ loop.setModel(preset.model);
143
+ process.env.QLING_LLM_PROVIDER = preset.provider;
144
+ process.env.QLING_LLM_ENDPOINT = preset.endpoint;
145
+ process.env.QLING_LLM_MODEL = preset.model;
146
+ }
147
+ else {
148
+ context.writeError("❌ 当前 AgentLoop 不支持 session 级模型切换。");
149
+ context.writeLine("-----------------------------------------");
150
+ context.writeLine("");
151
+ return;
152
+ }
153
+ await context.onModelChanged?.(preset.model);
154
+ context.writeLine(`已应用预设: ${preset.id} (${preset.displayName})`);
155
+ context.writeLine(`Provider : ${currentProvider} -> ${preset.provider}`);
156
+ context.writeLine(`Endpoint : ${currentEndpoint} -> ${preset.endpoint}`);
157
+ context.writeLine(`Model : ${currentModel} -> ${preset.model}`);
158
+ context.writeLine(preset.requiresApiKey
159
+ ? "密钥 : 仍使用当前进程已有 API key(不写盘)。"
160
+ : "密钥 : 本地预设,无需 API key。");
161
+ context.writeLine("范围 : 仅当前会话/当前进程,不写入默认配置。");
162
+ context.writeLine("-----------------------------------------");
163
+ context.writeLine("");
164
+ return;
165
+ }
166
+ // 兼容:/model <modelName> 仅切换 model
167
+ const nextModel = args.join(" ").trim();
168
+ if (typeof loop.setModel !== "function" && typeof loop.applyLlmSession !== "function") {
169
+ context.writeError("❌ 当前 AgentLoop 不支持 session 级模型切换。");
170
+ context.writeLine("-----------------------------------------");
171
+ context.writeLine("");
172
+ return;
173
+ }
174
+ if (typeof loop.applyLlmSession === "function") {
175
+ loop.applyLlmSession({ model: nextModel });
176
+ }
177
+ else {
178
+ loop.setModel(nextModel);
179
+ process.env.QLING_LLM_MODEL = nextModel;
180
+ }
181
+ await context.onModelChanged?.(nextModel);
182
+ context.writeLine(`已切换模型: ${currentModel} -> ${nextModel}`);
183
+ context.writeLine(`Provider : ${currentProvider}(未改)`);
184
+ context.writeLine(`Endpoint : ${currentEndpoint}(未改)`);
185
+ context.writeLine("范围 : 仅当前会话/当前进程,不写入默认配置。");
186
+ context.writeLine("提示 : 换供应商请用 /model use <preset>");
187
+ context.writeLine("-----------------------------------------");
188
+ context.writeLine("");
189
+ },
190
+ };
191
+ export const planCommand = {
192
+ name: "/plan",
193
+ description: "Plan Mode:只读规划(禁 write/patch/bash 等)或排队计划 prompt",
194
+ usage: "/plan [on|off|status|description]",
195
+ category: "session",
196
+ argumentHint: "[on|off|status|description]",
197
+ availability: "local",
198
+ claudeCompatibleName: "/plan",
199
+ execute: async (args, context) => {
200
+ const loop = context.agentLoop;
201
+ const sub = (args[0] ?? "").trim().toLowerCase();
202
+ const hasPlanApi = typeof loop.isPlanMode === "function" && typeof loop.setPlanMode === "function";
203
+ const writeStatus = (mode) => {
204
+ context.writeLine("");
205
+ context.writeLine("🧭 【Plan Mode】");
206
+ context.writeLine("-----------------------------------------");
207
+ context.writeLine(`当前模式 : ${mode}`);
208
+ context.writeLine("说明 : plan=只读规划(禁 write/patch/bash/subtask/browser_fetch)");
209
+ context.writeLine(" : agent=正常工具权限");
210
+ context.writeLine("用法 : /plan on | /plan off | /plan status");
211
+ context.writeLine(" : /plan <任务描述> → 进入 plan 并排队计划 prompt");
212
+ context.writeLine("边界 : 仅当前进程;不写配置文件。");
213
+ context.writeLine("-----------------------------------------");
214
+ context.writeLine("");
215
+ };
216
+ if (!sub || sub === "status") {
217
+ const mode = hasPlanApi
218
+ ? loop.isPlanMode()
219
+ ? "plan"
220
+ : "agent"
221
+ : process.env.QLING_PLAN_MODE === "1"
222
+ ? "plan"
223
+ : "agent";
224
+ writeStatus(mode);
225
+ return;
226
+ }
227
+ if (sub === "on" || sub === "enable" || sub === "enter") {
228
+ if (!hasPlanApi) {
229
+ context.writeError("❌ 当前 AgentLoop 不支持 Plan Mode。");
230
+ return;
231
+ }
232
+ loop.setPlanMode(true);
233
+ writeStatus("plan");
234
+ context.writeLine("✅ 已进入 Plan Mode。写工具将被拒绝,直到 /plan off。");
235
+ context.writeLine("");
236
+ return;
237
+ }
238
+ if (sub === "off" || sub === "disable" || sub === "exit" || sub === "agent") {
239
+ if (!hasPlanApi) {
240
+ context.writeError("❌ 当前 AgentLoop 不支持 Plan Mode。");
241
+ return;
242
+ }
243
+ loop.setPlanMode(false);
244
+ writeStatus("agent");
245
+ context.writeLine("✅ 已退出 Plan Mode,恢复正常工具权限。");
246
+ context.writeLine("");
247
+ return;
248
+ }
249
+ // /plan <description> → 进入 plan mode + 排队计划 prompt
250
+ const description = args.join(" ").trim();
251
+ if (hasPlanApi) {
252
+ loop.setPlanMode(true);
253
+ }
254
+ const prompt = [
255
+ "你正处于轻灵 Plan Mode(只读规划)。",
256
+ "约束:不要调用 write/patch/bash/subtask/browser_fetch;只做阅读、搜索与计划输出。",
257
+ "请先给出分步实施计划,标出风险与验证方式,再等待用户确认。",
258
+ "用户确认后可用 /plan off 退出 Plan Mode 再实施。",
259
+ "",
260
+ `任务: ${description}`,
261
+ ].join("\n");
262
+ if (!context.setImmediatePrompt) {
263
+ context.writeLine("");
264
+ context.writeLine("🧭 已进入 Plan Mode(当前会话不支持排队 prompt)");
265
+ context.writeLine("-----------------------------------------");
266
+ context.writeLine(`任务 : ${description}`);
267
+ context.writeLine("边界 : 写工具已禁用;请直接输入规划请求。");
268
+ context.writeLine("-----------------------------------------");
269
+ context.writeLine("");
270
+ return;
271
+ }
272
+ context.setImmediatePrompt(prompt);
273
+ context.writeLine("");
274
+ context.writeLine("🧭 已进入 Plan Mode 并排队计划请求");
275
+ context.writeLine("-----------------------------------------");
276
+ context.writeLine(`任务 : ${description}`);
277
+ context.writeLine("边界 : 写工具禁用;计划作为下一条 prompt 执行。");
278
+ context.writeLine("退出 : /plan off");
279
+ context.writeLine("-----------------------------------------");
280
+ context.writeLine("");
281
+ },
282
+ };
283
+ export const expandCommand = {
284
+ name: "/expand",
285
+ aliases: ["/展开", "/折叠"],
286
+ description: "切换长工具输出默认展开/折叠(与 Ctrl+O 同源)",
287
+ usage: "/expand [on|off|status]",
288
+ category: "session",
289
+ argumentHint: "[on|off|status]",
290
+ availability: "local",
291
+ execute: async (args, context) => {
292
+ const sub = (args[0] ?? "toggle").toLowerCase();
293
+ const toolOutput = context.toolOutput;
294
+ context.writeLine("");
295
+ context.writeLine("📄 【工具输出折叠】");
296
+ context.writeLine("-----------------------------------------");
297
+ if (!toolOutput) {
298
+ context.writeLine("状态 : 当前会话未挂载 TUI 工具输出控制。");
299
+ context.writeLine("替代 : 在交互 TUI 中使用 Ctrl+O。");
300
+ context.writeLine("-----------------------------------------");
301
+ context.writeLine("");
302
+ return;
303
+ }
304
+ if (sub === "status" || sub === "状态") {
305
+ context.writeLine(`当前 : ${toolOutput.expanded ? "展开" : "折叠"}`);
306
+ }
307
+ else if (sub === "on" || sub === "expand" || sub === "展开") {
308
+ toolOutput.setExpanded(true);
309
+ context.writeLine("已切换 : 展开后续长工具输出");
310
+ }
311
+ else if (sub === "off" || sub === "collapse" || sub === "折叠") {
312
+ toolOutput.setExpanded(false);
313
+ context.writeLine("已切换 : 折叠后续长工具输出");
314
+ }
315
+ else {
316
+ const next = toolOutput.toggle();
317
+ context.writeLine(`已切换 : ${next ? "展开" : "折叠"}后续长工具输出`);
318
+ }
319
+ context.writeLine("快捷键 : Ctrl+O");
320
+ context.writeLine("边界 : 仅影响后续工具输出;不重绘历史块。");
321
+ context.writeLine("-----------------------------------------");
322
+ context.writeLine("");
323
+ },
324
+ };
325
+ export const diffCommand = {
326
+ name: "/diff",
327
+ description: "查看当前工作区 Git 变更摘要(支持 /diff full 查看完整 diff)",
328
+ usage: "/diff [full]",
329
+ category: "git",
330
+ availability: "local",
331
+ claudeCompatibleName: "/diff",
332
+ execute: async (args, context) => {
333
+ const cwd = workspaceOf(context);
334
+ const showFull = args.includes("full") || args.includes("--full");
335
+ context.writeLine("");
336
+ context.writeLine("🧾 【Git Diff】");
337
+ context.writeLine("-----------------------------------------");
338
+ try {
339
+ const status = await execFileAsync("git", ["status", "--short"], { cwd, timeout: 10_000 });
340
+ const stat = await execFileAsync("git", ["diff", "--stat"], { cwd, timeout: 10_000 });
341
+ const statusText = String(status.stdout || "").trim();
342
+ const statText = String(stat.stdout || "").trim();
343
+ context.writeLine(`Workspace : ${cwd}`);
344
+ context.writeLine(statusText ? statusText : "(working tree clean)");
345
+ if (statText) {
346
+ context.writeLine("");
347
+ context.writeLine(statText);
348
+ }
349
+ if (showFull) {
350
+ try {
351
+ const full = await execFileAsync("git", ["diff"], { cwd, timeout: 15_000 });
352
+ const fullText = String(full.stdout || "").trim();
353
+ if (fullText) {
354
+ context.writeLine("\n--- full diff (truncated if long) ---");
355
+ context.writeLine(fullText.slice(0, 2000) + (fullText.length > 2000 ? "\n... (truncated)" : ""));
356
+ }
357
+ }
358
+ catch { }
359
+ }
360
+ context.writeLine("边界 : 只读 git status/diff,不修改文件。使用 /diff full 查看内容。");
361
+ }
362
+ catch {
363
+ context.writeLine(`Workspace : ${cwd}`);
364
+ context.writeLine("状态 : 非 Git 仓库或 Git 不可用。");
365
+ context.writeLine("边界 : 未执行任何修改。");
366
+ }
367
+ context.writeLine("-----------------------------------------");
368
+ context.writeLine("");
369
+ },
370
+ };
371
+ export const commitCommand = {
372
+ name: "/commit",
373
+ description: "安全提交当前 Git 变更(本地操作,自动 add -A)",
374
+ usage: "/commit [message]",
375
+ category: "git",
376
+ availability: "local",
377
+ claudeCompatibleName: "/commit",
378
+ execute: async (args, context) => {
379
+ const cwd = workspaceOf(context);
380
+ const message = args.join(" ").trim() || "chore: qling agent update";
381
+ context.writeLine("");
382
+ context.writeLine("🧾 【Git Commit】");
383
+ context.writeLine("-----------------------------------------");
384
+ try {
385
+ const status = await execFileAsync("git", ["status", "--porcelain"], { cwd, timeout: 5000 });
386
+ if (!String(status.stdout || "").trim()) {
387
+ context.writeLine("工作区干净,无需提交。");
388
+ context.writeLine("边界 : 只读/本地 git 操作。");
389
+ context.writeLine("-----------------------------------------");
390
+ context.writeLine("");
391
+ return;
392
+ }
393
+ await execFileAsync("git", ["add", "-A"], { cwd, timeout: 10000 });
394
+ const res = await execFileAsync("git", ["commit", "-m", message], { cwd, timeout: 10000 });
395
+ context.writeLine("✅ 提交成功");
396
+ context.writeLine(String(res.stdout || res.stderr || "").trim() || "Committed.");
397
+ }
398
+ catch (err) {
399
+ context.writeLine("❌ 提交失败: " + (err.message || String(err)));
400
+ context.writeLine("提示: 确保在 git repo 内,无冲突,message 有效。");
401
+ }
402
+ context.writeLine("边界 : 本地 git 操作;危险命令仍受 guard 保护(如果通过 bash 工具)。");
403
+ context.writeLine("-----------------------------------------");
404
+ context.writeLine("");
405
+ },
406
+ };
407
+ async function writeClipboardFallback(text) {
408
+ if (process.platform !== "win32") {
409
+ throw new Error("clipboard fallback only implemented for Windows");
410
+ }
411
+ await new Promise((resolve, reject) => {
412
+ const child = spawn("powershell", ["-NoProfile", "-Command", "Set-Clipboard -Value ([Console]::In.ReadToEnd())"], {
413
+ stdio: ["pipe", "ignore", "pipe"],
414
+ windowsHide: true,
415
+ });
416
+ let err = "";
417
+ child.stderr.on("data", (chunk) => {
418
+ err += String(chunk);
419
+ });
420
+ child.on("error", reject);
421
+ child.on("close", (code) => {
422
+ if (code === 0)
423
+ resolve();
424
+ else
425
+ reject(new Error(err || `Set-Clipboard exited with ${code}`));
426
+ });
427
+ child.stdin.end(text);
428
+ });
429
+ }
430
+ export const copyCommand = {
431
+ name: "/copy",
432
+ description: "复制最近第 N 条 assistant 回复",
433
+ usage: "/copy [N]",
434
+ category: "session",
435
+ argumentHint: "[N]",
436
+ availability: "local",
437
+ claudeCompatibleName: "/copy",
438
+ execute: async (args, context) => {
439
+ const n = Math.max(1, Number.parseInt(args[0] ?? "1", 10) || 1);
440
+ const messages = typeof context.agentLoop.getMessagesSnapshot === "function"
441
+ ? context.agentLoop.getMessagesSnapshot()
442
+ : [];
443
+ const replies = messages.filter((message) => message?.role === "assistant" && String(message.content ?? "").trim());
444
+ const selected = replies[replies.length - n];
445
+ if (!selected) {
446
+ context.writeError("❌ 没有可复制的 assistant 回复。");
447
+ return;
448
+ }
449
+ const content = String(selected.content);
450
+ try {
451
+ if (context.writeClipboard)
452
+ await context.writeClipboard(content);
453
+ else
454
+ await writeClipboardFallback(content);
455
+ context.writeLine(`✅ 已复制第 ${n} 条最近 assistant 回复 (${content.length} chars)。`);
456
+ }
457
+ catch (err) {
458
+ context.writeError(`❌ 剪贴板不可用: ${err instanceof Error ? err.message : String(err)}`);
459
+ context.writeLine(content.slice(0, 1000));
460
+ }
461
+ },
462
+ };
463
+ function formatGuide(workspace) {
464
+ return [
465
+ "# 轻灵项目指南",
466
+ "",
467
+ "## 项目边界",
468
+ "- 本文件由 `/init` 生成,用于记录本仓库的本地协作规则。",
469
+ "- 轻灵优先 local-first:命令、记忆、会话和诊断默认留在本机。",
470
+ "",
471
+ "## 常用命令",
472
+ "- `/help` 查看本地 slash 命令。",
473
+ "- `/context` 查看上下文占用。",
474
+ "- `/diff` 查看 Git 变更摘要。",
475
+ "- `/checkpoint` 保存本地恢复点。",
476
+ "",
477
+ `Workspace: ${workspace}`,
478
+ "",
479
+ ].join("\n");
480
+ }
481
+ export const initCommand = {
482
+ name: "/init",
483
+ description: "生成轻灵本地项目指南",
484
+ usage: "/init [--force]",
485
+ category: "core",
486
+ argumentHint: "[--force]",
487
+ availability: "local",
488
+ claudeCompatibleName: "/init",
489
+ execute: async (args, context) => {
490
+ const force = args.includes("--force");
491
+ const cwd = workspaceOf(context);
492
+ const target = join(cwd, "AGENTS.md");
493
+ if (existsSync(target) && !force) {
494
+ context.writeError("❌ AGENTS.md 已存在;如需覆盖请使用 /init --force。");
495
+ return;
496
+ }
497
+ await mkdir(cwd, { recursive: true });
498
+ await writeFile(target, formatGuide(cwd), "utf-8");
499
+ context.writeLine("");
500
+ context.writeLine("📝 已生成轻灵本地项目指南");
501
+ context.writeLine("-----------------------------------------");
502
+ context.writeLine(`Path : ${target}`);
503
+ context.writeLine("边界 : 只写入本地 AGENTS.md;不调用模型、不联网。");
504
+ context.writeLine("-----------------------------------------");
505
+ context.writeLine("");
506
+ },
507
+ };
508
+ export const rewindCommand = {
509
+ name: "/rewind",
510
+ aliases: ["/undo"],
511
+ description: "查看可恢复会话点,不自动回滚代码",
512
+ usage: "/rewind",
513
+ category: "session",
514
+ availability: "local",
515
+ claudeCompatibleName: "/rewind",
516
+ execute: async (_args, context) => {
517
+ const sessions = context.listSavedSessions
518
+ ? await context.listSavedSessions()
519
+ : typeof context.agentLoop.listSessionsDetailed === "function"
520
+ ? await context.agentLoop.listSessionsDetailed()
521
+ : [];
522
+ context.writeLine("");
523
+ context.writeLine("⏪ 【可恢复点】");
524
+ context.writeLine("-----------------------------------------");
525
+ if (!sessions.length) {
526
+ context.writeLine("(无)");
527
+ }
528
+ else {
529
+ for (const session of sessions.slice(0, 8)) {
530
+ context.writeLine(`- ${session.name} | ${session.sessionId} | turns=${session.turnCount}`);
531
+ }
532
+ }
533
+ context.writeLine("下一步 : 使用 /resume <session> 恢复会话,或 /checkpoint 保存新恢复点。");
534
+ context.writeLine("边界 : 不自动回滚代码、不修改文件。");
535
+ context.writeLine("-----------------------------------------");
536
+ context.writeLine("");
537
+ },
538
+ };
539
+ export const unavailableClaudeCommands = [
540
+ createUnavailableCommand("/login", "Claude 账号登录入口", "/config 查看本地 provider 配置"),
541
+ createUnavailableCommand("/logout", "Claude 账号退出入口", "/config 查看本地 provider 配置"),
542
+ createUnavailableCommand("/desktop", "打开 Claude Desktop 会话", "/export 导出当前会话", ["/app"]),
543
+ createUnavailableCommand("/mobile", "显示 Claude 移动端二维码", "/sessions 与 /resume 在本地恢复会话", ["/ios", "/android"]),
544
+ createUnavailableCommand("/teleport", "拉取 Claude Web 会话", "/resume 恢复本地会话", ["/tp"]),
545
+ createUnavailableCommand("/upgrade", "打开 Claude 订阅升级页"),
546
+ createUnavailableCommand("/privacy-settings", "Claude 账号隐私设置", "/privacy 查看轻灵本地隐私边界"),
547
+ createUnavailableCommand("/feedback", "提交 Claude 反馈", "/doctor 先做本地诊断", ["/bug", "/share"], "[report]"),
548
+ createUnavailableCommand("/install-github-app", "安装 Claude GitHub App"),
549
+ createUnavailableCommand("/web-setup", "连接 Claude Web GitHub"),
550
+ createUnavailableCommand("/schedule", "创建 Claude 云端 routine", "/loop daemon 使用本地持久任务", ["/routines"], "[description]"),
551
+ createUnavailableCommand("/radio", "打开 Claude FM"),
552
+ createUnavailableCommand("/stickers", "订购 Claude Code stickers"),
553
+ createUnavailableCommand("/background", "Claude cloud/background agent", "/detach 或 /mission 使用轻灵本地后台能力", ["/bg"], "[prompt]"),
554
+ createUnavailableCommand("/branch", "Claude 会话分支", "/checkpoint 与 /resume 使用本地恢复点", [], "[name]"),
555
+ createUnavailableCommand("/fork", "Claude forked subagent", "/agents 查看轻灵本地后台任务", [], "<directive>"),
556
+ createUnavailableCommand("/remote-control", "Claude remote control", "/sessions 与 /resume 使用本地会话", ["/rc"]),
557
+ createUnavailableCommand("/plugin", "Claude 插件管理", "/mcp 查看轻灵本地 MCP", [], "[subcommand]"),
558
+ createUnavailableCommand("/theme", "Claude 主题选择", "/shortcuts 查看轻灵 TUI 输入能力"),
559
+ createUnavailableCommand("/tui", "Claude renderer 切换", "/statusline 查看轻灵 TUI 状态线", [], "[default|fullscreen]"),
560
+ ];
@@ -0,0 +1,3 @@
1
+ import { SlashCommand } from "./types.js";
2
+ export declare const clearCommand: SlashCommand;
3
+ //# sourceMappingURL=clear.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear.d.ts","sourceRoot":"","sources":["../../src/commands/clear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,eAAO,MAAM,YAAY,EAAE,YAmB1B,CAAC"}
@@ -0,0 +1,20 @@
1
+ export const clearCommand = {
2
+ name: "/clear",
3
+ aliases: ["/reset", "/new"],
4
+ description: "清空当前对话上下文记忆",
5
+ usage: "/clear",
6
+ execute: async (_args, context) => {
7
+ context.agentLoop.reset();
8
+ if (context.goalController && typeof context.goalController.clearGoal === "function") {
9
+ await context.goalController.clearGoal("conversation_reset");
10
+ }
11
+ const canceled = context.scheduler && typeof context.scheduler.cancelAllTasks === "function"
12
+ ? await context.scheduler.cancelAllTasks()
13
+ : 0;
14
+ if (typeof context.agentLoop.checkpointSession === "function") {
15
+ await context.agentLoop.checkpointSession();
16
+ }
17
+ context.writeLine("");
18
+ context.writeLine(`✨ 会话已重置,已开启新话题。${canceled > 0 ? `已同步取消 ${canceled} 个 loop 任务。` : ""}`);
19
+ },
20
+ };
@@ -0,0 +1,3 @@
1
+ import { SlashCommand } from "./types.js";
2
+ export declare const compactCommand: SlashCommand;
3
+ //# sourceMappingURL=compact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compact.d.ts","sourceRoot":"","sources":["../../src/commands/compact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,eAAO,MAAM,cAAc,EAAE,YAuB5B,CAAC"}
@@ -0,0 +1,23 @@
1
+ export const compactCommand = {
2
+ name: "/compact",
3
+ description: "手动触发当前上下文压缩",
4
+ usage: "/compact",
5
+ execute: async (_args, context) => {
6
+ if (typeof context.agentLoop.compactSessionNow !== "function") {
7
+ context.writeError("❌ 当前 AgentLoop 不支持手动上下文压缩。");
8
+ return;
9
+ }
10
+ const result = await context.agentLoop.compactSessionNow();
11
+ if (typeof context.agentLoop.checkpointSession === "function") {
12
+ await context.agentLoop.checkpointSession();
13
+ }
14
+ context.writeLine("");
15
+ context.writeLine("🗜️ 【上下文压缩】");
16
+ context.writeLine("-----------------------------------------");
17
+ context.writeLine(`压缩前消息数 : ${result.beforeCount}`);
18
+ context.writeLine(`压缩后消息数 : ${result.afterCount}`);
19
+ context.writeLine(`发生压缩 : ${result.changed ? "是" : "否"}`);
20
+ context.writeLine("-----------------------------------------");
21
+ context.writeLine("");
22
+ },
23
+ };
@@ -0,0 +1,3 @@
1
+ import { SlashCommand } from "./types.js";
2
+ export declare const configCommand: SlashCommand;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,eAAO,MAAM,aAAa,EAAE,YAqB3B,CAAC"}
@@ -0,0 +1,22 @@
1
+ export const configCommand = {
2
+ name: "/config",
3
+ aliases: ["/settings"],
4
+ description: "查看当前生效配置",
5
+ usage: "/config",
6
+ execute: async (_args, context) => {
7
+ context.writeLine("");
8
+ context.writeLine("⚙️ 【当前环境配置】");
9
+ context.writeLine("-----------------------------------------");
10
+ context.writeLine(`Provider : ${process.env.QLING_LLM_PROVIDER || "未设置"}`);
11
+ context.writeLine(`Model : ${process.env.QLING_LLM_MODEL || "未设置"}`);
12
+ context.writeLine(`Endpoint : ${process.env.QLING_LLM_ENDPOINT || "默认"}`);
13
+ context.writeLine(`Workspace : ${context.workspaceDir || process.cwd()}`);
14
+ context.writeLine(`Vision : ${process.env.QLING_FEATURES_VISION_TOOL === "true" ? "开启" : "关闭"}`);
15
+ context.writeLine(`Memory : ${process.env.QLING_FEATURES_SEMANTIC_MEMORY === "true" ? "语义" : "传统"}`);
16
+ context.writeLine(`Isolation : ${process.env.QLING_AGENTS_ISOLATION_MODE || "worktree"}`);
17
+ context.writeLine(`RequireGit : ${process.env.QLING_AGENTS_ISOLATION_REQUIRE_GIT || "true"}`);
18
+ context.writeLine(`NonGit : ${process.env.QLING_AGENTS_ISOLATION_NON_GIT_POLICY || "warn"}`);
19
+ context.writeLine("-----------------------------------------");
20
+ context.writeLine("");
21
+ },
22
+ };
@@ -0,0 +1,3 @@
1
+ import { SlashCommand } from "./types.js";
2
+ export declare const connectCommand: SlashCommand;
3
+ //# sourceMappingURL=connect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAwC1C,eAAO,MAAM,cAAc,EAAE,YA6D5B,CAAC"}