@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,208 @@
1
+ import { toolError, toolSuccess } from "./error-utils.js";
2
+ import { appendGuardAudit, checkUrlFetchPolicy, redactText } from "../guard.js";
3
+ import { guardConfigFromEnv } from "../config.js";
4
+ const MAX_BODY_CHARS = 200_000;
5
+ export const urlFetchTool = {
6
+ name: "url_fetch",
7
+ description: "Fetch HTTP/HTTPS resources with Guard policy (allowlist, private IP block, redirect policy, redaction).",
8
+ longDescription: `结构化网络请求工具,受 Guard 策略约束。
9
+
10
+ **主要能力**:
11
+ - 仅允许命中的 URL 前缀
12
+ - 可拦截私网/本地 IP
13
+ - 可禁用自动重定向
14
+ - 输出内容自动脱敏
15
+
16
+ **注意**:
17
+ - 默认仅允许 https:// 前缀
18
+ - 非 2xx 响应会返回带错误码的失败结果`,
19
+ parameters: {
20
+ type: "object",
21
+ properties: {
22
+ url: { type: "string", description: "Target URL (http/https)" },
23
+ method: { type: "string", description: "HTTP method (GET/POST/PUT/PATCH/DELETE)" },
24
+ headers: { type: "object", description: "Request headers" },
25
+ body: { type: "string", description: "Request body text" },
26
+ timeout_seconds: { type: "number", description: "Request timeout in seconds (default: 30)" },
27
+ follow_redirects: {
28
+ type: "boolean",
29
+ description: "Override redirect policy (when guard allows)",
30
+ },
31
+ },
32
+ required: ["url"],
33
+ },
34
+ paramSchema: {
35
+ url: {
36
+ type: "string",
37
+ description: "目标 URL(建议 https://)",
38
+ minLength: 8,
39
+ },
40
+ method: {
41
+ type: "string",
42
+ description: "HTTP 方法",
43
+ enum: ["GET", "POST", "PUT", "PATCH", "DELETE"],
44
+ default: "GET",
45
+ },
46
+ headers: {
47
+ type: "object",
48
+ description: "请求头对象",
49
+ },
50
+ body: {
51
+ type: "string",
52
+ description: "请求体文本",
53
+ },
54
+ timeout_seconds: {
55
+ type: "number",
56
+ description: "超时秒数,默认 30,最大 120",
57
+ minimum: 1,
58
+ maximum: 120,
59
+ default: 30,
60
+ },
61
+ follow_redirects: {
62
+ type: "boolean",
63
+ description: "是否允许跟随重定向(若 guard 禁止则不可覆盖)",
64
+ default: false,
65
+ },
66
+ },
67
+ examples: [
68
+ 'url_fetch url="https://example.com"',
69
+ 'url_fetch url="https://api.example.com/v1" method="POST" body="{\\"x\\":1}"',
70
+ ],
71
+ scenes: ["web", "data"],
72
+ seeAlso: ["search", "read"],
73
+ priority: 6,
74
+ readOnly: true,
75
+ destructive: false,
76
+ concurrencySafe: true,
77
+ effortHint: "low",
78
+ };
79
+ export async function runUrlFetch(args) {
80
+ const rawUrl = String(args.url ?? "").trim();
81
+ if (!rawUrl) {
82
+ return toolError("URL_FETCH_MISSING_URL", "url is required");
83
+ }
84
+ let target;
85
+ try {
86
+ target = new URL(rawUrl);
87
+ }
88
+ catch {
89
+ return toolError("URL_FETCH_INVALID_URL", `invalid url: ${rawUrl}`);
90
+ }
91
+ if (target.protocol !== "https:" && target.protocol !== "http:") {
92
+ return toolError("URL_FETCH_UNSUPPORTED_PROTOCOL", `unsupported protocol: ${target.protocol}`);
93
+ }
94
+ const guard = guardConfigFromEnv();
95
+ const decision = await checkUrlFetchPolicy(target, guard);
96
+ if (!decision.allowed) {
97
+ await appendGuardAudit(guard, {
98
+ tool: "url_fetch",
99
+ action: "deny",
100
+ category: decision.category,
101
+ target: target.toString(),
102
+ reason: decision.reason,
103
+ });
104
+ return toolError("URL_FETCH_GUARD_BLOCKED", decision.reason ?? "guard denied url_fetch");
105
+ }
106
+ const method = String(args.method ?? "GET").toUpperCase();
107
+ const supportedMethods = new Set(["GET", "POST", "PUT", "PATCH", "DELETE"]);
108
+ if (!supportedMethods.has(method)) {
109
+ return toolError("URL_FETCH_UNSUPPORTED_METHOD", `unsupported method: ${method}`);
110
+ }
111
+ const timeoutSeconds = Math.max(1, Math.min(120, Number(args.timeout_seconds ?? 30)));
112
+ const followRedirects = args.follow_redirects !== undefined
113
+ ? Boolean(args.follow_redirects) && guard.network.url_fetch.follow_redirects
114
+ : guard.network.url_fetch.follow_redirects;
115
+ const headers = sanitizeHeaders(args.headers ?? {});
116
+ const body = args.body !== undefined ? String(args.body) : undefined;
117
+ let response;
118
+ try {
119
+ response = await fetch(target.toString(), {
120
+ method,
121
+ headers,
122
+ body: body ?? undefined,
123
+ redirect: followRedirects ? "follow" : "manual",
124
+ signal: AbortSignal.timeout(timeoutSeconds * 1000),
125
+ });
126
+ }
127
+ catch (err) {
128
+ const message = err instanceof Error ? err.message : String(err);
129
+ await appendGuardAudit(guard, {
130
+ tool: "url_fetch",
131
+ action: "allow",
132
+ category: "network",
133
+ target: target.toString(),
134
+ reason: message,
135
+ });
136
+ return toolError("URL_FETCH_REQUEST_FAILED", message);
137
+ }
138
+ if (!followRedirects && isRedirect(response.status)) {
139
+ await appendGuardAudit(guard, {
140
+ tool: "url_fetch",
141
+ action: "deny",
142
+ category: "network",
143
+ target: target.toString(),
144
+ status: response.status,
145
+ reason: "redirect blocked by policy",
146
+ });
147
+ return toolError("URL_FETCH_REDIRECT_BLOCKED", `redirect blocked by policy (status=${response.status}, location=${response.headers.get("location") ?? ""})`);
148
+ }
149
+ const contentType = response.headers.get("content-type") ?? "";
150
+ let text = "";
151
+ try {
152
+ if (/^text\/|json|xml|javascript|yaml|html/i.test(contentType)) {
153
+ text = await response.text();
154
+ }
155
+ else {
156
+ const ab = await response.arrayBuffer();
157
+ text = `[binary response omitted] bytes=${ab.byteLength} content-type=${contentType}`;
158
+ }
159
+ }
160
+ catch (err) {
161
+ const message = err instanceof Error ? err.message : String(err);
162
+ return toolError("URL_FETCH_READ_FAILED", message);
163
+ }
164
+ if (text.length > MAX_BODY_CHARS) {
165
+ text = text.slice(0, MAX_BODY_CHARS) + `\n... [truncated at ${MAX_BODY_CHARS} chars]`;
166
+ }
167
+ text = redactText(text, guard);
168
+ if (!response.ok) {
169
+ await appendGuardAudit(guard, {
170
+ tool: "url_fetch",
171
+ action: "allow",
172
+ category: "network",
173
+ target: target.toString(),
174
+ status: response.status,
175
+ reason: `http status ${response.status}`,
176
+ });
177
+ return toolError("URL_FETCH_HTTP_ERROR", `status=${response.status} ${response.statusText}\n${text}`);
178
+ }
179
+ await appendGuardAudit(guard, {
180
+ tool: "url_fetch",
181
+ action: "allow",
182
+ category: "network",
183
+ target: target.toString(),
184
+ status: response.status,
185
+ });
186
+ return toolSuccess([
187
+ `status=${response.status}`,
188
+ `content-type=${contentType || "unknown"}`,
189
+ "",
190
+ text,
191
+ ].join("\n"));
192
+ }
193
+ function sanitizeHeaders(input) {
194
+ const forbidden = new Set(["authorization", "proxy-authorization", "cookie", "set-cookie"]);
195
+ const out = {};
196
+ for (const [k, v] of Object.entries(input)) {
197
+ const key = k.trim();
198
+ if (!key)
199
+ continue;
200
+ if (forbidden.has(key.toLowerCase()))
201
+ continue;
202
+ out[key] = String(v);
203
+ }
204
+ return out;
205
+ }
206
+ function isRedirect(status) {
207
+ return status >= 300 && status < 400;
208
+ }
@@ -0,0 +1,9 @@
1
+ import { ToolDefinition, ToolResult } from "../types.js";
2
+ export declare const visionAnalyzeTool: ToolDefinition;
3
+ export declare function runVisionAnalyze(args: {
4
+ image_path?: string;
5
+ image_url?: string;
6
+ prompt: string;
7
+ detail?: "low" | "high" | "auto";
8
+ }): Promise<ToolResult>;
9
+ //# sourceMappingURL=vision-analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vision-analyze.d.ts","sourceRoot":"","sources":["../../src/tools/vision-analyze.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzD,eAAO,MAAM,iBAAiB,EAAE,cAgE/B,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;CAClC,GAAG,OAAO,CAAC,UAAU,CAAC,CAkHtB"}
@@ -0,0 +1,179 @@
1
+ // ============================================================
2
+ // 轻灵 - vision_analyze 工具 (v0.3)
3
+ // 多模态视觉解析工具,支持分析图片、截图、网页 UI
4
+ // ============================================================
5
+ import axios from "axios";
6
+ import * as fs from "fs/promises";
7
+ import * as path from "path";
8
+ export const visionAnalyzeTool = {
9
+ name: "vision_analyze",
10
+ description: "Analyze images, screenshots, or UI mockups using visual LLMs. Preserves rich artistic and structural details.",
11
+ longDescription: `多模态视觉解析工具。
12
+
13
+ **重要指引**:
14
+ - 当调用此工具后,Agent 应当在回答中**完整保留**模型返回的视觉意象、空间布局、风格描述和氛围分析。
15
+ - 除非用户明确要求提取特定文字,否则不要将丰富的叙述性描述仅压缩为表格。
16
+ - 艺术感和细节描述是此工具的核心产出。`,
17
+ parameters: {
18
+ type: "object",
19
+ properties: {
20
+ image_path: {
21
+ type: "string",
22
+ description: "Local path to the image file or base64 data",
23
+ },
24
+ image_url: {
25
+ type: "string",
26
+ description: "Public URL of the image",
27
+ },
28
+ prompt: {
29
+ type: "string",
30
+ description: "Specific instructions or questions for the visual analysis",
31
+ },
32
+ detail: {
33
+ type: "string",
34
+ enum: ["low", "high", "auto"],
35
+ description: "Level of detail for analysis",
36
+ default: "auto",
37
+ }
38
+ },
39
+ required: ["prompt"],
40
+ },
41
+ paramSchema: {
42
+ image_path: {
43
+ type: "string",
44
+ description: "本地图片路径。支持含空格路径。",
45
+ },
46
+ image_url: {
47
+ type: "string",
48
+ description: "远程图片 URL。确保 Agent 可出网。",
49
+ },
50
+ prompt: {
51
+ type: "string",
52
+ description: "具体的分析指令。例如:'分析这个登录页面的按钮是否居中'。",
53
+ minLength: 5,
54
+ },
55
+ detail: {
56
+ type: "string",
57
+ description: "解析精细度。",
58
+ enum: ["low", "high", "auto"],
59
+ default: "auto",
60
+ }
61
+ },
62
+ examples: [
63
+ 'vision_analyze image_path="screenshots/login.png" prompt="分析页面布局错位原因"',
64
+ 'vision_analyze image_url="https://example.com/chart.jpg" prompt="提取 2024 年 Q3 的收入数据"',
65
+ ],
66
+ scenes: ["visual", "debug", "frontend"],
67
+ priority: 7,
68
+ readOnly: true,
69
+ destructive: false,
70
+ concurrencySafe: true,
71
+ effortHint: "medium",
72
+ };
73
+ export async function runVisionAnalyze(args) {
74
+ // 1. 优先级:Vision 专用变量 > LLM 通用变量 > 默认值
75
+ const provider = process.env.QLING_VISION_PROVIDER || process.env.QLING_LLM_PROVIDER || "openai";
76
+ const model = process.env.QLING_VISION_MODEL || process.env.QLING_LLM_MODEL || "gpt-4o";
77
+ const apiKey = process.env.QLING_LLM_API_KEY || process.env.OPENAI_API_KEY || process.env.DEEPSEEK_API_KEY || "";
78
+ // 2. 解析 Endpoint
79
+ let endpoint = process.env.QLING_VISION_ENDPOINT || process.env.QLING_LLM_ENDPOINT;
80
+ if (!endpoint) {
81
+ endpoint = provider === "openai"
82
+ ? "https://api.openai.com/v1/chat/completions"
83
+ : provider === "deepseek"
84
+ ? "https://api.deepseek.com/chat/completions"
85
+ : "http://localhost:11434/v1/chat/completions";
86
+ }
87
+ else {
88
+ // 确保 endpoint 包含 chat/completions 路径
89
+ if (!endpoint.endsWith("/chat/completions")) {
90
+ endpoint = endpoint.replace(/\/$/, "") + "/chat/completions";
91
+ }
92
+ }
93
+ // 只有非本地提供商才强制要求 API Key
94
+ if (!apiKey && provider !== "local") {
95
+ return {
96
+ tool_call_id: "",
97
+ output: `Error: Missing API Key for vision analysis (${provider}). Please check your configuration.`,
98
+ is_error: true,
99
+ };
100
+ }
101
+ try {
102
+ let content = [{ type: "text", text: args.prompt }];
103
+ if (args.image_path) {
104
+ // 增强:处理含空格的路径并规范化
105
+ const rawPath = args.image_path.replace(/["']/g, "").trim();
106
+ const fullPath = path.isAbsolute(rawPath)
107
+ ? rawPath
108
+ : path.resolve(process.env.QLING_WORKSPACE_DIR || process.cwd(), rawPath);
109
+ try {
110
+ const buffer = await fs.readFile(fullPath);
111
+ const base64 = buffer.toString("base64");
112
+ const ext = path.extname(fullPath).toLowerCase().slice(1) || "png";
113
+ content.push({
114
+ type: "image_url",
115
+ image_url: { url: `data:image/${ext};base64,${base64}`, detail: args.detail || "auto" }
116
+ });
117
+ }
118
+ catch (e) {
119
+ return {
120
+ tool_call_id: "",
121
+ output: `Error: Cannot read image at "${fullPath}". Please check if the file exists and the path is correct.`,
122
+ is_error: true,
123
+ };
124
+ }
125
+ }
126
+ else if (args.image_url) {
127
+ content.push({
128
+ type: "image_url",
129
+ image_url: { url: args.image_url, detail: args.detail || "auto" }
130
+ });
131
+ }
132
+ else {
133
+ return {
134
+ tool_call_id: "",
135
+ output: "Error: Either image_path or image_url must be provided.",
136
+ is_error: true,
137
+ };
138
+ }
139
+ const resp = await axios.post(endpoint, {
140
+ model,
141
+ messages: [{ role: "user", content }],
142
+ max_tokens: 1000,
143
+ }, {
144
+ headers: {
145
+ ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),
146
+ "Content-Type": "application/json",
147
+ },
148
+ timeout: Number(process.env.QLING_VISION_TIMEOUT_MS) || 60000,
149
+ });
150
+ const result = resp.data.choices?.[0]?.message?.content || "";
151
+ // 自动重试机制:如果结果为空,尝试重新调用一次
152
+ const internalArgs = args;
153
+ if (!result && !internalArgs._is_retry) {
154
+ console.warn("⚠️ 视觉分析返回空结果,正在尝试自动重试...");
155
+ return runVisionAnalyze({ ...args, _is_retry: true });
156
+ }
157
+ return {
158
+ tool_call_id: "",
159
+ output: result ? `👁️ 视觉分析结果 (${model} @ ${provider}):\n\n${result}` : "[No analysis result]",
160
+ meta: { model, provider }
161
+ };
162
+ }
163
+ catch (err) {
164
+ const msg = err.response?.data?.error?.message || err.message;
165
+ let userHint = "";
166
+ if (msg.includes("Incorrect API key") || msg.includes("invalid_api_key") || err.response?.status === 401) {
167
+ userHint = `\n\n💡 提示: 检测到 API Key 鉴权失败。当前 Provider 为: ${provider}。 请确保您的 Key 能够访问该提供商的视觉模型。`;
168
+ if (provider !== "local") {
169
+ userHint += "\n如果您想使用本地模型,可设置 QLING_VISION_PROVIDER=local 并启动 Ollama。";
170
+ }
171
+ }
172
+ return {
173
+ tool_call_id: "",
174
+ output: `Error: Vision analysis failed (${provider}): ${msg}${userHint}`,
175
+ is_error: true,
176
+ error: { code: "VISION_FAILED", message: msg, category: "network" }
177
+ };
178
+ }
179
+ }
@@ -0,0 +1,7 @@
1
+ import { ToolDefinition, ToolResult } from "../types.js";
2
+ export declare const writeTool: ToolDefinition;
3
+ export declare function runWrite(args: {
4
+ path: string;
5
+ content: string;
6
+ }): Promise<ToolResult>;
7
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAWzD,eAAO,MAAM,SAAS,EAAE,cAsEvB,CAAC;AAqBF,wBAAsB,QAAQ,CAAC,IAAI,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,UAAU,CAAC,CA6CtB"}
@@ -0,0 +1,128 @@
1
+ import { writeFile, mkdir } from "fs/promises";
2
+ import { dirname } from "path";
3
+ import { getErrorMessage, toolError, toolSuccess } from "./error-utils.js";
4
+ import { checkSensitiveWriteTarget, getRuntimeRootsFromEnv, isPathAllowedForWrite, resolveToolPath, } from "../runtime-paths.js";
5
+ const MAX_WRITE_BYTES = 256 * 1024; // 256KB
6
+ export const writeTool = {
7
+ name: "write",
8
+ description: "Create or overwrite a file with given content. Parent directories are created automatically. Use for code, config, markdown, scripts, or any text files.",
9
+ longDescription: `创建或覆盖文件。**会修改磁盘文件**。
10
+
11
+ **使用场景**:
12
+ - 写入源代码文件(.ts, .js, .py, .java)
13
+ - 写入配置文件(.json, .yaml, .env)
14
+ - 写入 Markdown 文档(README.md, DESIGN.md)
15
+ - 写入脚本文件(.sh, .ps1)
16
+
17
+ **行为**:
18
+ - 父目录不存在时自动创建(recursive: true)
19
+ - 文件已存在时**覆盖**(无确认,无备份)
20
+ - 返回成功消息(含写入路径)
21
+
22
+ **危险警告**:
23
+ - 覆盖系统文件(如 /etc/hosts)可能造成严重后果
24
+ - 建议先 read 检查现有内容
25
+ - Hook 会拦截可疑的目标路径
26
+
27
+ **写入大文件**:
28
+ - 单次写入建议不超过 50KB
29
+ - 超大文件建议分多次写入`,
30
+ parameters: {
31
+ type: "object",
32
+ properties: {
33
+ path: {
34
+ type: "string",
35
+ description: "Absolute or relative path to the file (directories created automatically)",
36
+ },
37
+ content: {
38
+ type: "string",
39
+ description: "The complete content to write to the file",
40
+ },
41
+ },
42
+ required: ["path", "content"],
43
+ },
44
+ paramSchema: {
45
+ path: {
46
+ type: "string",
47
+ description: "目标文件路径。父目录不存在时会自动创建。相对路径以当前工作目录为基准。",
48
+ minLength: 1,
49
+ },
50
+ content: {
51
+ type: "string",
52
+ description: "要写入的完整文件内容。建议不超过 50KB。超大型文件建议分多次写入。",
53
+ },
54
+ },
55
+ examples: [
56
+ 'write path="src/utils.ts" content="export const foo = 1;"',
57
+ 'write path="config.json" content=\'{"version": "1.0"}\'',
58
+ 'write path="scripts/deploy.sh" content="#!/bin/bash\\necho done"',
59
+ ],
60
+ seeAlso: ["read", "bash"],
61
+ scenes: ["coding", "data"],
62
+ priority: 9, // 写入也是高频
63
+ readOnly: false,
64
+ destructive: false, // write 覆盖文件不等于破坏性(是预期行为)
65
+ concurrencySafe: false,
66
+ dangerousPatterns: [
67
+ "/etc/passwd",
68
+ "/etc/shadow",
69
+ "/etc/sudoers",
70
+ "C:\\Windows\\System32",
71
+ "/sys/",
72
+ "/proc/",
73
+ ],
74
+ effortHint: "medium",
75
+ };
76
+ const DANGEROUS_PATHS = [
77
+ "/etc/passwd",
78
+ "/etc/shadow",
79
+ "/etc/sudoers",
80
+ "C:\\Windows\\System32",
81
+ "/sys/",
82
+ "/proc/",
83
+ ];
84
+ function isDangerousPath(filePath) {
85
+ const normalized = filePath.replace(/\\/g, "/").toLowerCase();
86
+ for (const pattern of DANGEROUS_PATHS) {
87
+ if (normalized.includes(pattern.replace(/\\/g, "/").toLowerCase())) {
88
+ return pattern;
89
+ }
90
+ }
91
+ return null;
92
+ }
93
+ export async function runWrite(args) {
94
+ const inputPath = String(args.path ?? "").trim();
95
+ if (!inputPath) {
96
+ return toolError("WRITE_INVALID_PATH", "path is required");
97
+ }
98
+ const content = String(args.content ?? "");
99
+ const byteLength = Buffer.byteLength(content, "utf-8");
100
+ if (byteLength > MAX_WRITE_BYTES) {
101
+ return toolError("WRITE_CONTENT_TOO_LARGE", `content exceeds ${MAX_WRITE_BYTES} bytes (current: ${byteLength})`);
102
+ }
103
+ const roots = getRuntimeRootsFromEnv();
104
+ const resolvedPath = resolveToolPath(inputPath, roots, "workspace");
105
+ if (!isPathAllowedForWrite(resolvedPath, roots)) {
106
+ return toolError("WRITE_OUTSIDE_ALLOWED_ROOT", `${resolvedPath} is outside write sandbox (default: workspace only; set QLING_WRITE_SANDBOX=roots|off to relax)`);
107
+ }
108
+ const sensitive = checkSensitiveWriteTarget(resolvedPath);
109
+ if (sensitive?.blocked) {
110
+ return toolError(sensitive.code, sensitive.reason, { category: "permission" });
111
+ }
112
+ const danger = isDangerousPath(resolvedPath);
113
+ if (danger) {
114
+ return toolError("WRITE_DANGEROUS_PATH", `path "${resolvedPath}" matches dangerous pattern "${danger}"`);
115
+ }
116
+ try {
117
+ await mkdir(dirname(resolvedPath), { recursive: true });
118
+ await writeFile(resolvedPath, content, "utf-8");
119
+ return toolSuccess(`✅ 文件已写入: ${resolvedPath}`);
120
+ }
121
+ catch (err) {
122
+ const code = err?.code;
123
+ if (code === "EACCES" || code === "EPERM") {
124
+ return toolError("WRITE_PERMISSION_DENIED", `permission denied for ${resolvedPath}`);
125
+ }
126
+ return toolError("WRITE_FAILED", getErrorMessage(err));
127
+ }
128
+ }
@@ -0,0 +1,7 @@
1
+ export interface TuiHeaderOptions {
2
+ model: string;
3
+ tools: number;
4
+ cwd: string;
5
+ }
6
+ export declare function formatTuiHeader(options: TuiHeaderOptions): string[];
7
+ //# sourceMappingURL=chrome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../src/tui/chrome.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAaD,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAWnE"}
@@ -0,0 +1,22 @@
1
+ function normalizeCwd(cwd) {
2
+ const normalized = cwd.trim();
3
+ if (!normalized)
4
+ return "-";
5
+ return normalized.replace(/\\/g, "/").replace(/^C:/, "C:");
6
+ }
7
+ function normalizeToolCount(tools) {
8
+ if (!Number.isFinite(tools) || tools <= 0)
9
+ return 0;
10
+ return Math.floor(tools);
11
+ }
12
+ export function formatTuiHeader(options) {
13
+ const model = options.model.trim() || "unknown";
14
+ const tools = normalizeToolCount(options.tools);
15
+ const workspace = normalizeCwd(options.cwd);
16
+ return [
17
+ "轻灵 · Agent CLI",
18
+ `model=${model} tools=${tools} mode=local-first`,
19
+ `workspace=${workspace}`,
20
+ "/help slash · Tab agents · Ctrl+Z restore · Ctrl+O output · /privacy boundary",
21
+ ];
22
+ }
@@ -0,0 +1,37 @@
1
+ export declare class InputBuffer {
2
+ value: string;
3
+ cursorPos: number;
4
+ private history;
5
+ private historyIdx;
6
+ private historyDraft;
7
+ private historyDraftCursorPos;
8
+ constructor(initialHistory?: string[]);
9
+ setHistory(entries: string[]): void;
10
+ getHistory(): string[];
11
+ insertChar(ch: string): void;
12
+ insertNewline(): void;
13
+ backspace(): void;
14
+ moveLeft(): void;
15
+ moveRight(): void;
16
+ moveWordLeft(): void;
17
+ moveWordRight(): void;
18
+ moveLineUp(): void;
19
+ moveLineDown(): void;
20
+ moveStart(): void;
21
+ moveEnd(): void;
22
+ deleteBeforeCursor(): void;
23
+ deleteAfterCursor(): void;
24
+ deleteAfterCursorChar(): void;
25
+ deleteWordBeforeCursor(): void;
26
+ deleteWordAfterCursor(): void;
27
+ historyUp(): void;
28
+ historyDown(): void;
29
+ searchHistory(): boolean;
30
+ clear(): void;
31
+ submit(): string | null;
32
+ private saveHistoryDraft;
33
+ private restoreHistoryDraft;
34
+ private clearHistoryDraft;
35
+ private getLinePosition;
36
+ }
37
+ //# sourceMappingURL=input-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-buffer.d.ts","sourceRoot":"","sources":["../../src/tui/input-buffer.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW;IACtB,KAAK,SAAM;IACX,SAAS,SAAK;IACd,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,qBAAqB,CAAK;gBAEtB,cAAc,GAAE,MAAM,EAAO;IAIzC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAMnC,UAAU,IAAI,MAAM,EAAE;IAItB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAK5B,aAAa,IAAI,IAAI;IAIrB,SAAS,IAAI,IAAI;IAMjB,QAAQ,IAAI,IAAI;IAMhB,SAAS,IAAI,IAAI;IAMjB,YAAY,IAAI,IAAI;IAcpB,aAAa,IAAI,IAAI;IAcrB,UAAU,IAAI,IAAI;IASlB,YAAY,IAAI,IAAI;IASpB,SAAS,IAAI,IAAI;IAIjB,OAAO,IAAI,IAAI;IAIf,kBAAkB,IAAI,IAAI;IAM1B,iBAAiB,IAAI,IAAI;IAKzB,qBAAqB,IAAI,IAAI;IAK7B,sBAAsB,IAAI,IAAI;IAe9B,qBAAqB,IAAI,IAAI;IAmB7B,SAAS,IAAI,IAAI;IASjB,WAAW,IAAI,IAAI;IAYnB,aAAa,IAAI,OAAO;IAuBxB,KAAK,IAAI,IAAI;IAOb,MAAM,IAAI,MAAM,GAAG,IAAI;IASvB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,eAAe;CAiCxB"}