@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,636 @@
1
+ // ============================================================
2
+ // 轻灵 - search 工具
3
+ // 文件内容搜索(grep)和文件名搜索(glob)
4
+ // 优先使用 ripgrep,失败时降级到 Node 原生遍历(带智能忽略与 .gitignore 过滤)
5
+ // ============================================================
6
+ import { readdir, readFile, stat } from "fs/promises";
7
+ import { existsSync } from "fs";
8
+ import { basename, join, relative } from "path";
9
+ import { execFile } from "child_process";
10
+ import { getErrorMessage, toolError, toolSuccess } from "./error-utils.js";
11
+ import { getRuntimeRootsFromEnv, isWithinAllowedRoots, resolveToolPath } from "../runtime-paths.js";
12
+ const MAX_SEARCH_FILE_BYTES = 2 * 1024 * 1024; // 2MB
13
+ const DEFAULT_IGNORES = new Set([
14
+ "node_modules",
15
+ ".git",
16
+ "dist",
17
+ "build",
18
+ "coverage",
19
+ "out",
20
+ "target",
21
+ ".qling",
22
+ ".idea",
23
+ ".vscode",
24
+ "bin",
25
+ "obj",
26
+ ]);
27
+ export const searchTool = {
28
+ name: "search",
29
+ description: "Search file contents (grep) or find files by name (glob). Returns matching lines with file paths and line numbers, or file paths only.",
30
+ longDescription: `搜索文件内容或按名称查找文件。**不会修改任何文件**。
31
+
32
+ **两种模式**:
33
+
34
+ 1. **内容搜索**(target="content",默认):
35
+ - 用正则表达式在文件中搜索
36
+ - 返回匹配的行号和内容
37
+ - 支持文件类型过滤(file_glob)
38
+ - 支持上下文行(context)
39
+
40
+ 2. **文件搜索**(target="files"):
41
+ - 用 glob 模式查找文件名
42
+ - 返回匹配的文件路径列表`,
43
+ parameters: {
44
+ type: "object",
45
+ properties: {
46
+ pattern: {
47
+ type: "string",
48
+ description: "Regex pattern for content search, or glob pattern for file search",
49
+ },
50
+ path: {
51
+ type: "string",
52
+ description: "Directory or file to search in (default: current directory)",
53
+ },
54
+ target: {
55
+ type: "string",
56
+ enum: ["content", "files"],
57
+ description: "Search target: 'content' for grep, 'files' for file name search",
58
+ },
59
+ file_glob: {
60
+ type: "string",
61
+ description: "Filter files by glob pattern (e.g. '*.ts', '*.json')",
62
+ },
63
+ context: {
64
+ type: "number",
65
+ description: "Context lines around matches (default: 0)",
66
+ },
67
+ limit: {
68
+ type: "number",
69
+ description: "Max results to return (default: 50)",
70
+ },
71
+ },
72
+ required: ["pattern"],
73
+ },
74
+ paramSchema: {
75
+ pattern: {
76
+ type: "string",
77
+ description: "搜索模式。内容搜索用正则表达式,文件搜索用 glob 模式。",
78
+ minLength: 1,
79
+ },
80
+ path: {
81
+ type: "string",
82
+ description: "搜索路径。默认当前目录。",
83
+ },
84
+ target: {
85
+ type: "string",
86
+ description: "搜索目标:content=内容搜索(grep),files=文件名搜索(find)",
87
+ enum: ["content", "files"],
88
+ default: "content",
89
+ },
90
+ file_glob: {
91
+ type: "string",
92
+ description: "文件类型过滤,如 *.ts, *.json",
93
+ },
94
+ context: {
95
+ type: "number",
96
+ description: "匹配行的上下文行数。默认 0。",
97
+ minimum: 0,
98
+ maximum: 10,
99
+ default: 0,
100
+ },
101
+ limit: {
102
+ type: "number",
103
+ description: "最大返回结果数。默认 50。",
104
+ minimum: 1,
105
+ maximum: 200,
106
+ default: 50,
107
+ },
108
+ },
109
+ examples: [
110
+ 'search pattern="TODO" file_glob="*.ts"',
111
+ 'search pattern="export.*function" path="src/"',
112
+ 'search pattern="*.json" target="files"',
113
+ 'search pattern="error" context=2 limit=20',
114
+ ],
115
+ seeAlso: ["read", "bash"],
116
+ scenes: ["coding", "data"],
117
+ priority: 8,
118
+ readOnly: true,
119
+ destructive: false,
120
+ concurrencySafe: true,
121
+ effortHint: "low",
122
+ };
123
+ export async function runSearch(args) {
124
+ const pattern = String(args.pattern ?? "").trim();
125
+ if (!pattern) {
126
+ return toolError("SEARCH_EMPTY_PATTERN", "pattern is required");
127
+ }
128
+ const roots = getRuntimeRootsFromEnv();
129
+ const searchPath = args.path ?? roots.workspaceDir ?? roots.fileCacheDir;
130
+ const target = args.target ?? "content";
131
+ if (target !== "content" && target !== "files") {
132
+ return toolError("SEARCH_INVALID_TARGET", `unsupported target: ${target}`);
133
+ }
134
+ const context = clamp(args.context ?? 0, 0, 10);
135
+ const limit = clamp(args.limit ?? 50, 1, 200);
136
+ const absPath = resolveToolPath(searchPath, roots, "workspace");
137
+ if (!isWithinAllowedRoots(absPath, roots)) {
138
+ return toolError("SEARCH_OUTSIDE_ALLOWED_ROOT", `${absPath} is outside allowed roots`);
139
+ }
140
+ try {
141
+ await stat(absPath);
142
+ }
143
+ catch (err) {
144
+ const code = err?.code;
145
+ if (code === "EACCES" || code === "EPERM") {
146
+ return toolError("SEARCH_PERMISSION_DENIED", `permission denied for ${searchPath}`);
147
+ }
148
+ return toolError("SEARCH_PATH_NOT_FOUND", `path not found: ${searchPath}`);
149
+ }
150
+ // 1. Try Ripgrep first
151
+ const rgResult = await searchWithRipgrep(absPath, pattern, target, args.file_glob, context, limit);
152
+ if (rgResult !== null) {
153
+ return rgResult;
154
+ }
155
+ // 2. Try Git grep fallback
156
+ const gitGrepResult = await searchWithGitGrep(absPath, pattern, target, args.file_glob, context, limit);
157
+ if (gitGrepResult !== null) {
158
+ return gitGrepResult;
159
+ }
160
+ // 3. Fallback to Node.js native search
161
+ try {
162
+ if (target === "files") {
163
+ return await searchFilesNative(absPath, pattern, limit);
164
+ }
165
+ return await searchContentNative(absPath, pattern, args.file_glob, context, limit);
166
+ }
167
+ catch (err) {
168
+ return toolError("SEARCH_FAILED", getErrorMessage(err));
169
+ }
170
+ }
171
+ async function searchWithRipgrep(absPath, pattern, target, fileGlob, context, limit) {
172
+ return new Promise((resolve) => {
173
+ let args = ["--color=never"];
174
+ // Add default ignores explicitly to rg
175
+ for (const folder of DEFAULT_IGNORES) {
176
+ args.push("--glob", `!**/${folder}/**`);
177
+ }
178
+ // Add .gitignore explicitly if it exists
179
+ const gitignorePath = join(absPath, ".gitignore");
180
+ if (existsSync(gitignorePath)) {
181
+ args.push("--ignore-file", gitignorePath);
182
+ }
183
+ if (target === "files") {
184
+ args.push("--files");
185
+ if (fileGlob) {
186
+ args.push("--glob", fileGlob);
187
+ }
188
+ }
189
+ else {
190
+ args.push("--line-number", "--with-filename");
191
+ if (context > 0) {
192
+ args.push("-C", String(context));
193
+ }
194
+ if (fileGlob) {
195
+ args.push("--glob", fileGlob);
196
+ }
197
+ args.push("-e", pattern);
198
+ }
199
+ args.push(absPath);
200
+ execFile("rg", args, { maxBuffer: 10 * 1024 * 1024 }, (err, stdout, stderr) => {
201
+ if (err && err.code !== 1 && err.code !== 0) {
202
+ // Ripgrep not installed/available, fallback
203
+ resolve(null);
204
+ return;
205
+ }
206
+ const rawLines = stdout.split(/\r?\n/).map(l => l.trim()).filter(Boolean);
207
+ if (rawLines.length === 0) {
208
+ resolve(toolSuccess("No matches found."));
209
+ return;
210
+ }
211
+ if (target === "files") {
212
+ const flags = process.platform === "win32" ? "i" : "";
213
+ const matcher = globToRegExp(pattern, flags);
214
+ const filteredLines = rawLines.filter(l => matcher.test(basename(l)));
215
+ if (filteredLines.length === 0) {
216
+ resolve(toolSuccess("No files found matching pattern."));
217
+ return;
218
+ }
219
+ const truncated = filteredLines.length > limit;
220
+ const sliced = filteredLines.slice(0, limit);
221
+ const suffix = truncated ? `\n... (truncated at ${limit} results)` : "";
222
+ resolve(toolSuccess(`Found ${truncated ? `${limit}+` : filteredLines.length} file(s):\n${sliced.join("\n")}${suffix}`));
223
+ return;
224
+ }
225
+ // Parse and format content matches uniformly to match Node fallback
226
+ const parsedLines = [];
227
+ for (const line of rawLines) {
228
+ const m = line.match(/^(.*?)([:-])(\d+)\2(.*)$/);
229
+ if (m) {
230
+ parsedLines.push({
231
+ file: m[1],
232
+ isMatch: m[2] === ":",
233
+ line: parseInt(m[3], 10),
234
+ content: m[4],
235
+ });
236
+ }
237
+ }
238
+ if (context <= 0) {
239
+ const truncated = parsedLines.length > limit;
240
+ const sliced = parsedLines.slice(0, limit);
241
+ const suffix = truncated ? `\n... (truncated at ${limit} results)` : "";
242
+ const formatted = sliced.map(pl => `${pl.file}:${pl.line}:${pl.content}`).join("\n");
243
+ resolve(toolSuccess(`${truncated ? `${limit}+` : parsedLines.length} match(es):\n${formatted}${suffix}`));
244
+ return;
245
+ }
246
+ // Group context blocks
247
+ const fileGroups = new Map();
248
+ for (const pl of parsedLines) {
249
+ if (!fileGroups.has(pl.file)) {
250
+ fileGroups.set(pl.file, []);
251
+ }
252
+ fileGroups.get(pl.file).push(pl);
253
+ }
254
+ const formattedBlocks = [];
255
+ let matchCount = 0;
256
+ let truncated = false;
257
+ for (const [file, fileLines] of fileGroups.entries()) {
258
+ fileLines.sort((a, b) => a.line - b.line);
259
+ const matchesInFile = fileLines.filter(l => l.isMatch);
260
+ for (const matchLine of matchesInFile) {
261
+ matchCount++;
262
+ if (matchCount > limit) {
263
+ truncated = true;
264
+ break;
265
+ }
266
+ const start = matchLine.line - context;
267
+ const end = matchLine.line + context;
268
+ const blockLines = fileLines.filter(l => l.line >= start && l.line <= end);
269
+ const block = [`${file}:${matchLine.line}:`];
270
+ for (const bl of blockLines) {
271
+ const marker = bl.line === matchLine.line ? ">" : " ";
272
+ block.push(` ${marker} ${bl.line}: ${bl.content}`);
273
+ }
274
+ formattedBlocks.push(block.join("\n"));
275
+ }
276
+ if (truncated)
277
+ break;
278
+ }
279
+ const suffix = truncated ? `\n... (truncated at ${limit} results)` : "";
280
+ resolve(toolSuccess(`${truncated ? `${limit}+` : matchCount} match(es):\n${formattedBlocks.join("\n")}${suffix}`));
281
+ });
282
+ });
283
+ }
284
+ async function loadGitignores(absPath) {
285
+ const gitignorePath = join(absPath, ".gitignore");
286
+ if (!existsSync(gitignorePath))
287
+ return [];
288
+ try {
289
+ const content = await readFile(gitignorePath, "utf-8");
290
+ const lines = content
291
+ .split(/\r?\n/)
292
+ .map((l) => l.trim())
293
+ .filter((l) => l && !l.startsWith("#"));
294
+ return lines.map((line) => {
295
+ let regexStr = line
296
+ .replace(/\./g, "\\.")
297
+ .replace(/\*/g, ".*")
298
+ .replace(/\?/g, ".");
299
+ if (line.endsWith("/")) {
300
+ regexStr = regexStr + ".*";
301
+ }
302
+ else {
303
+ regexStr = regexStr + "($|/.*)";
304
+ }
305
+ if (!line.startsWith("/")) {
306
+ regexStr = "(^|/)" + regexStr;
307
+ }
308
+ else {
309
+ regexStr = "^" + regexStr.slice(1);
310
+ }
311
+ try {
312
+ const regex = new RegExp(regexStr);
313
+ return (p) => regex.test(p);
314
+ }
315
+ catch {
316
+ return () => false;
317
+ }
318
+ });
319
+ }
320
+ catch {
321
+ return [];
322
+ }
323
+ }
324
+ async function searchWithGitGrep(absPath, pattern, target, fileGlob, context, limit) {
325
+ return new Promise((resolve) => {
326
+ let args = [];
327
+ if (target === "files") {
328
+ args = ["ls-files", absPath];
329
+ execFile("git", args, { maxBuffer: 10 * 1024 * 1024, cwd: absPath }, (err, stdout, stderr) => {
330
+ if (err) {
331
+ resolve(null);
332
+ return;
333
+ }
334
+ const rawLines = stdout.split(/\r?\n/).map(l => l.trim()).filter(Boolean);
335
+ const flags = process.platform === "win32" ? "i" : "";
336
+ const matcher = globToRegExp(pattern, flags);
337
+ const fileMatcher = fileGlob ? globToRegExp(fileGlob, flags) : null;
338
+ const matched = [];
339
+ for (const line of rawLines) {
340
+ const absFile = join(absPath, line);
341
+ if (fileMatcher && !fileMatcher.test(basename(absFile))) {
342
+ continue;
343
+ }
344
+ if (!matcher.test(basename(absFile))) {
345
+ continue;
346
+ }
347
+ matched.push(absFile);
348
+ }
349
+ if (matched.length === 0) {
350
+ resolve(toolSuccess("No files found matching pattern."));
351
+ return;
352
+ }
353
+ const truncated = matched.length > limit;
354
+ const sliced = matched.slice(0, limit);
355
+ const suffix = truncated ? `\n... (truncated at ${limit} results)` : "";
356
+ resolve(toolSuccess(`Found ${truncated ? `${limit}+` : matched.length} file(s):\n${sliced.join("\n")}${suffix}`));
357
+ });
358
+ }
359
+ else {
360
+ args = ["grep", "-n", "-I", "--no-color"];
361
+ if (context > 0) {
362
+ args.push("-C", String(context));
363
+ }
364
+ args.push("-e", pattern);
365
+ execFile("git", args, { maxBuffer: 10 * 1024 * 1024, cwd: absPath }, (err, stdout, stderr) => {
366
+ if (err && err.code !== 1 && err.code !== 0) {
367
+ resolve(null);
368
+ return;
369
+ }
370
+ const rawLines = stdout.split(/\r?\n/).map(l => l.trim()).filter(Boolean);
371
+ if (rawLines.length === 0) {
372
+ resolve(toolSuccess("No matches found."));
373
+ return;
374
+ }
375
+ const parsedLines = [];
376
+ const flags = process.platform === "win32" ? "i" : "";
377
+ const fileMatcher = fileGlob ? globToRegExp(fileGlob, flags) : null;
378
+ for (const line of rawLines) {
379
+ const m = line.match(/^(.*?)([:-])(\d+)\2(.*)$/);
380
+ if (m) {
381
+ const relativeFile = m[1];
382
+ const absFile = join(absPath, relativeFile);
383
+ if (fileMatcher && !fileMatcher.test(basename(absFile))) {
384
+ continue;
385
+ }
386
+ parsedLines.push({
387
+ file: absFile,
388
+ isMatch: m[2] === ":",
389
+ line: parseInt(m[3], 10),
390
+ content: m[4],
391
+ });
392
+ }
393
+ }
394
+ if (parsedLines.length === 0) {
395
+ resolve(toolSuccess("No matches found."));
396
+ return;
397
+ }
398
+ if (context <= 0) {
399
+ const truncated = parsedLines.length > limit;
400
+ const sliced = parsedLines.slice(0, limit);
401
+ const suffix = truncated ? `\n... (truncated at ${limit} results)` : "";
402
+ const formatted = sliced.map(pl => `${pl.file}:${pl.line}:${pl.content}`).join("\n");
403
+ resolve(toolSuccess(`${truncated ? `${limit}+` : parsedLines.length} match(es):\n${formatted}${suffix}`));
404
+ return;
405
+ }
406
+ // Group context blocks
407
+ const fileGroups = new Map();
408
+ for (const pl of parsedLines) {
409
+ if (!fileGroups.has(pl.file)) {
410
+ fileGroups.set(pl.file, []);
411
+ }
412
+ fileGroups.get(pl.file).push(pl);
413
+ }
414
+ const formattedBlocks = [];
415
+ let matchCount = 0;
416
+ let truncated = false;
417
+ for (const [file, fileLines] of fileGroups.entries()) {
418
+ fileLines.sort((a, b) => a.line - b.line);
419
+ const matchesInFile = fileLines.filter(l => l.isMatch);
420
+ for (const matchLine of matchesInFile) {
421
+ matchCount++;
422
+ if (matchCount > limit) {
423
+ truncated = true;
424
+ break;
425
+ }
426
+ const start = matchLine.line - context;
427
+ const end = matchLine.line + context;
428
+ const blockLines = fileLines.filter(l => l.line >= start && l.line <= end);
429
+ const block = [`${file}:${matchLine.line}:`];
430
+ for (const bl of blockLines) {
431
+ const marker = bl.line === matchLine.line ? ">" : " ";
432
+ block.push(` ${marker} ${bl.line}: ${bl.content}`);
433
+ }
434
+ formattedBlocks.push(block.join("\n"));
435
+ }
436
+ if (truncated)
437
+ break;
438
+ }
439
+ const suffix = truncated ? `\n... (truncated at ${limit} results)` : "";
440
+ resolve(toolSuccess(`${truncated ? `${limit}+` : matchCount} match(es):\n${formattedBlocks.join("\n")}${suffix}`));
441
+ });
442
+ }
443
+ });
444
+ }
445
+ async function searchFilesNative(absPath, pattern, limit) {
446
+ const flags = process.platform === "win32" ? "i" : "";
447
+ const matcher = globToRegExp(pattern, flags);
448
+ const matched = [];
449
+ let truncated = false;
450
+ let budgetExceeded = false;
451
+ try {
452
+ await walkFiles(absPath, async (filePath) => {
453
+ if (!matcher.test(basename(filePath))) {
454
+ return true;
455
+ }
456
+ matched.push(filePath);
457
+ if (matched.length >= limit) {
458
+ truncated = true;
459
+ return false;
460
+ }
461
+ return true;
462
+ });
463
+ }
464
+ catch (err) {
465
+ if (err instanceof Error && err.message === "TRAVERSAL_BUDGET_EXCEEDED") {
466
+ budgetExceeded = true;
467
+ }
468
+ else {
469
+ throw err;
470
+ }
471
+ }
472
+ if (matched.length === 0) {
473
+ if (budgetExceeded) {
474
+ return toolSuccess("No files found matching pattern. (Warning: Traversal budget of 10,000 files was exceeded)");
475
+ }
476
+ return toolSuccess("No files found matching pattern.");
477
+ }
478
+ const suffix = (truncated ? `\n... (truncated at ${limit} results)` : "") +
479
+ (budgetExceeded ? `\n⚠️ Warning: Search traversal budget of 10,000 files was exceeded. Results may be incomplete.` : "");
480
+ return toolSuccess(`Found ${truncated ? `${limit}+` : matched.length} file(s):\n${matched.join("\n")}${suffix}`);
481
+ }
482
+ async function searchContentNative(absPath, pattern, fileGlob, context, limit) {
483
+ const flags = process.platform === "win32" ? "i" : "";
484
+ const contentRegex = buildRegex(pattern, flags);
485
+ const fileMatcher = fileGlob ? globToRegExp(fileGlob, flags) : null;
486
+ const outputs = [];
487
+ let matches = 0;
488
+ let truncated = false;
489
+ let budgetExceeded = false;
490
+ try {
491
+ await walkFiles(absPath, async (filePath) => {
492
+ if (fileMatcher && !fileMatcher.test(basename(filePath))) {
493
+ return true;
494
+ }
495
+ let text;
496
+ try {
497
+ const fileStat = await stat(filePath);
498
+ if (fileStat.size > MAX_SEARCH_FILE_BYTES) {
499
+ return true;
500
+ }
501
+ text = await readFile(filePath, "utf-8");
502
+ }
503
+ catch {
504
+ return true;
505
+ }
506
+ const lines = text.split(/\r?\n/);
507
+ for (let i = 0; i < lines.length; i++) {
508
+ const line = lines[i];
509
+ if (!contentRegex.test(line))
510
+ continue;
511
+ matches++;
512
+ outputs.push(formatMatch(filePath, lines, i, context));
513
+ if (matches >= limit) {
514
+ truncated = true;
515
+ return false;
516
+ }
517
+ }
518
+ return true;
519
+ });
520
+ }
521
+ catch (err) {
522
+ if (err instanceof Error && err.message === "TRAVERSAL_BUDGET_EXCEEDED") {
523
+ budgetExceeded = true;
524
+ }
525
+ else {
526
+ throw err;
527
+ }
528
+ }
529
+ if (matches === 0) {
530
+ if (budgetExceeded) {
531
+ return toolSuccess("No matches found. (Warning: Traversal budget of 10,000 files was exceeded)");
532
+ }
533
+ return toolSuccess("No matches found.");
534
+ }
535
+ const suffix = (truncated ? `\n... (truncated at ${limit} results)` : "") +
536
+ (budgetExceeded ? `\n⚠️ Warning: Search traversal budget of 10,000 files was exceeded. Results may be incomplete.` : "");
537
+ return toolSuccess(`${truncated ? `${limit}+` : matches} match(es):\n${outputs.join("\n")}${suffix}`);
538
+ }
539
+ function formatMatch(filePath, lines, matchIndex, context) {
540
+ if (context <= 0) {
541
+ return `${filePath}:${matchIndex + 1}:${lines[matchIndex]}`;
542
+ }
543
+ const start = Math.max(0, matchIndex - context);
544
+ const end = Math.min(lines.length - 1, matchIndex + context);
545
+ const block = [`${filePath}:${matchIndex + 1}:`];
546
+ for (let i = start; i <= end; i++) {
547
+ const marker = i === matchIndex ? ">" : " ";
548
+ block.push(` ${marker} ${i + 1}: ${lines[i]}`);
549
+ }
550
+ return block.join("\n");
551
+ }
552
+ async function walkFiles(rootPath, onFile) {
553
+ const rootStat = await stat(rootPath);
554
+ if (rootStat.isFile()) {
555
+ await onFile(rootPath);
556
+ return;
557
+ }
558
+ if (!rootStat.isDirectory())
559
+ return;
560
+ const gitignores = await loadGitignores(rootPath);
561
+ const stack = [rootPath];
562
+ let visitCount = 0;
563
+ const TRAVERSAL_BUDGET = 10000;
564
+ while (stack.length > 0) {
565
+ const current = stack.pop();
566
+ visitCount++;
567
+ if (visitCount > TRAVERSAL_BUDGET) {
568
+ throw new Error("TRAVERSAL_BUDGET_EXCEEDED");
569
+ }
570
+ let entries;
571
+ try {
572
+ entries = await readdir(current, { withFileTypes: true });
573
+ }
574
+ catch {
575
+ continue;
576
+ }
577
+ for (let i = entries.length - 1; i >= 0; i--) {
578
+ const entry = entries[i];
579
+ const nameLower = entry.name.toLowerCase();
580
+ // Check default ignores
581
+ if (DEFAULT_IGNORES.has(nameLower)) {
582
+ continue;
583
+ }
584
+ const fullPath = join(current, entry.name);
585
+ const relativePath = relative(rootPath, fullPath).replace(/\\/g, "/");
586
+ // Check gitignore matches
587
+ if (gitignores.some((fn) => fn(relativePath))) {
588
+ continue;
589
+ }
590
+ if (entry.isDirectory()) {
591
+ stack.push(fullPath);
592
+ continue;
593
+ }
594
+ if (!entry.isFile())
595
+ continue;
596
+ visitCount++;
597
+ if (visitCount > TRAVERSAL_BUDGET) {
598
+ throw new Error("TRAVERSAL_BUDGET_EXCEEDED");
599
+ }
600
+ const shouldContinue = await onFile(fullPath);
601
+ if (!shouldContinue)
602
+ return;
603
+ }
604
+ }
605
+ }
606
+ function globToRegExp(glob, flags = "") {
607
+ let pattern = "^";
608
+ for (const ch of glob) {
609
+ if (ch === "*") {
610
+ pattern += ".*";
611
+ continue;
612
+ }
613
+ if (ch === "?") {
614
+ pattern += ".";
615
+ continue;
616
+ }
617
+ pattern += escapeRegExp(ch);
618
+ }
619
+ pattern += "$";
620
+ return new RegExp(pattern, flags);
621
+ }
622
+ function buildRegex(pattern, flags = "") {
623
+ try {
624
+ return new RegExp(pattern, flags);
625
+ }
626
+ catch (err) {
627
+ const msg = getErrorMessage(err);
628
+ throw new Error(`[SEARCH_INVALID_REGEX] invalid regex pattern: ${msg}`);
629
+ }
630
+ }
631
+ function escapeRegExp(char) {
632
+ return char.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
633
+ }
634
+ function clamp(value, min, max) {
635
+ return Math.max(min, Math.min(max, value));
636
+ }
@@ -0,0 +1,8 @@
1
+ import { ToolDefinition, ToolResult } from "../types.js";
2
+ export declare function getSkillDirs(): string[];
3
+ export declare const skillTool: ToolDefinition;
4
+ export declare function runSkill(args: {
5
+ name?: string;
6
+ query?: string;
7
+ }): Promise<ToolResult>;
8
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/tools/skill.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQzD,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAUvC;AAiCD,eAAO,MAAM,SAAS,EAAE,cAmEvB,CAAC;AAEF,wBAAsB,QAAQ,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CA4D3F"}