@qlingzzy/qling 1.0.0 → 1.1.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 (254) hide show
  1. package/CHANGELOG.md +154 -0
  2. package/README.en.md +82 -17
  3. package/README.md +15 -7
  4. package/dist/agent/main-loop.d.ts +120 -0
  5. package/dist/agent/main-loop.d.ts.map +1 -0
  6. package/dist/agent/main-loop.js +279 -0
  7. package/dist/agent/subtask-parallel.d.ts +29 -0
  8. package/dist/agent/subtask-parallel.d.ts.map +1 -0
  9. package/dist/agent/subtask-parallel.js +107 -0
  10. package/dist/agent/subtask.d.ts +13 -0
  11. package/dist/agent/subtask.d.ts.map +1 -1
  12. package/dist/agent/subtask.js +79 -24
  13. package/dist/agent/system-prompt.d.ts +39 -0
  14. package/dist/agent/system-prompt.d.ts.map +1 -0
  15. package/dist/agent/system-prompt.js +89 -0
  16. package/dist/agent/tool-orchestrator.d.ts +66 -0
  17. package/dist/agent/tool-orchestrator.d.ts.map +1 -0
  18. package/dist/agent/tool-orchestrator.js +355 -0
  19. package/dist/agent-loop.d.ts +29 -16
  20. package/dist/agent-loop.d.ts.map +1 -1
  21. package/dist/agent-loop.js +262 -807
  22. package/dist/agents/roles.d.ts +57 -0
  23. package/dist/agents/roles.d.ts.map +1 -0
  24. package/dist/agents/roles.js +198 -0
  25. package/dist/commands/agents.d.ts.map +1 -1
  26. package/dist/commands/agents.js +17 -3
  27. package/dist/commands/claude-style.d.ts.map +1 -1
  28. package/dist/commands/claude-style.js +19 -10
  29. package/dist/commands/help.d.ts.map +1 -1
  30. package/dist/commands/help.js +3 -2
  31. package/dist/commands/index.d.ts.map +1 -1
  32. package/dist/commands/index.js +6 -0
  33. package/dist/commands/mode.d.ts +16 -0
  34. package/dist/commands/mode.d.ts.map +1 -0
  35. package/dist/commands/mode.js +67 -0
  36. package/dist/commands/recover.d.ts +3 -0
  37. package/dist/commands/recover.d.ts.map +1 -0
  38. package/dist/commands/recover.js +69 -0
  39. package/dist/commands/runtime.d.ts +2 -0
  40. package/dist/commands/runtime.d.ts.map +1 -1
  41. package/dist/commands/runtime.js +2 -0
  42. package/dist/commands/trace.d.ts +3 -0
  43. package/dist/commands/trace.d.ts.map +1 -0
  44. package/dist/commands/trace.js +45 -0
  45. package/dist/commands/verify.js +2 -2
  46. package/dist/config-report.d.ts +0 -1
  47. package/dist/config-report.d.ts.map +1 -1
  48. package/dist/config-report.js +1 -2
  49. package/dist/config.d.ts +0 -1
  50. package/dist/config.d.ts.map +1 -1
  51. package/dist/config.js +0 -1
  52. package/dist/context-report.d.ts +13 -7
  53. package/dist/context-report.d.ts.map +1 -1
  54. package/dist/context-report.js +64 -61
  55. package/dist/context-tool-hygiene.d.ts +36 -0
  56. package/dist/context-tool-hygiene.d.ts.map +1 -0
  57. package/dist/context-tool-hygiene.js +125 -0
  58. package/dist/dashboard/client.d.ts +2 -0
  59. package/dist/dashboard/client.d.ts.map +1 -0
  60. package/dist/dashboard/client.js +305 -0
  61. package/dist/dashboard/model.d.ts +13 -0
  62. package/dist/dashboard/model.d.ts.map +1 -0
  63. package/dist/dashboard/model.js +112 -0
  64. package/dist/dashboard/page.d.ts +3 -0
  65. package/dist/dashboard/page.d.ts.map +1 -0
  66. package/dist/dashboard/page.js +204 -0
  67. package/dist/dashboard/types.d.ts +63 -0
  68. package/dist/dashboard/types.d.ts.map +1 -0
  69. package/dist/dashboard/types.js +1 -0
  70. package/dist/dashboard-server.d.ts +24 -4
  71. package/dist/dashboard-server.d.ts.map +1 -1
  72. package/dist/dashboard-server.js +397 -302
  73. package/dist/discovery-registry.d.ts +17 -3
  74. package/dist/discovery-registry.d.ts.map +1 -1
  75. package/dist/discovery-registry.js +78 -3
  76. package/dist/doctor.d.ts +8 -0
  77. package/dist/doctor.d.ts.map +1 -1
  78. package/dist/doctor.js +116 -0
  79. package/dist/eval/llm-tasks.d.ts +5 -0
  80. package/dist/eval/llm-tasks.d.ts.map +1 -0
  81. package/dist/eval/llm-tasks.js +125 -0
  82. package/dist/eval/repo-tasks.d.ts +12 -0
  83. package/dist/eval/repo-tasks.d.ts.map +1 -0
  84. package/dist/eval/repo-tasks.js +220 -0
  85. package/dist/eval/runner.d.ts +3 -1
  86. package/dist/eval/runner.d.ts.map +1 -1
  87. package/dist/eval/runner.js +23 -4
  88. package/dist/eval/tasks.d.ts.map +1 -1
  89. package/dist/eval/tasks.js +186 -0
  90. package/dist/eval/types.d.ts +8 -5
  91. package/dist/eval/types.d.ts.map +1 -1
  92. package/dist/execution/event-bus.d.ts +44 -0
  93. package/dist/execution/event-bus.d.ts.map +1 -0
  94. package/dist/execution/event-bus.js +76 -0
  95. package/dist/execution/failure-classifier.d.ts +11 -0
  96. package/dist/execution/failure-classifier.d.ts.map +1 -0
  97. package/dist/execution/failure-classifier.js +66 -0
  98. package/dist/execution/progress-detector.d.ts +3 -0
  99. package/dist/execution/progress-detector.d.ts.map +1 -0
  100. package/dist/execution/progress-detector.js +23 -0
  101. package/dist/execution/recovery-controller.d.ts +24 -0
  102. package/dist/execution/recovery-controller.d.ts.map +1 -0
  103. package/dist/execution/recovery-controller.js +114 -0
  104. package/dist/execution/recovery-messages.d.ts +24 -0
  105. package/dist/execution/recovery-messages.d.ts.map +1 -0
  106. package/dist/execution/recovery-messages.js +48 -0
  107. package/dist/execution/recovery-metrics.d.ts +16 -0
  108. package/dist/execution/recovery-metrics.d.ts.map +1 -0
  109. package/dist/execution/recovery-metrics.js +73 -0
  110. package/dist/execution/recovery-strategy-planner.d.ts +6 -0
  111. package/dist/execution/recovery-strategy-planner.d.ts.map +1 -0
  112. package/dist/execution/recovery-strategy-planner.js +24 -0
  113. package/dist/execution/run-trace-store.d.ts +29 -0
  114. package/dist/execution/run-trace-store.d.ts.map +1 -0
  115. package/dist/execution/run-trace-store.js +140 -0
  116. package/dist/execution/staged-verifier.d.ts +33 -0
  117. package/dist/execution/staged-verifier.d.ts.map +1 -0
  118. package/dist/execution/staged-verifier.js +39 -0
  119. package/dist/execution/types.d.ts +58 -0
  120. package/dist/execution/types.d.ts.map +1 -0
  121. package/dist/execution/types.js +1 -0
  122. package/dist/execution/verification-loop.d.ts +58 -0
  123. package/dist/execution/verification-loop.d.ts.map +1 -0
  124. package/dist/execution/verification-loop.js +195 -0
  125. package/dist/execution/verification-stages.d.ts +17 -0
  126. package/dist/execution/verification-stages.d.ts.map +1 -0
  127. package/dist/execution/verification-stages.js +102 -0
  128. package/dist/help-topics.d.ts.map +1 -1
  129. package/dist/help-topics.js +11 -0
  130. package/dist/index.js +0 -8
  131. package/dist/lsp/ts-service.d.ts +36 -0
  132. package/dist/lsp/ts-service.d.ts.map +1 -0
  133. package/dist/lsp/ts-service.js +291 -0
  134. package/dist/memory/lifecycle.d.ts +19 -0
  135. package/dist/memory/lifecycle.d.ts.map +1 -0
  136. package/dist/memory/lifecycle.js +53 -0
  137. package/dist/memory.d.ts +0 -16
  138. package/dist/memory.d.ts.map +1 -1
  139. package/dist/memory.js +0 -36
  140. package/dist/metrics/collector.d.ts +7 -0
  141. package/dist/metrics/collector.d.ts.map +1 -1
  142. package/dist/metrics/collector.js +60 -0
  143. package/dist/mission/manager.d.ts +1 -0
  144. package/dist/mission/manager.d.ts.map +1 -1
  145. package/dist/mission/manager.js +9 -0
  146. package/dist/mission/progress-notify.d.ts +39 -0
  147. package/dist/mission/progress-notify.d.ts.map +1 -0
  148. package/dist/mission/progress-notify.js +386 -0
  149. package/dist/pipeline/hooks.d.ts +1 -1
  150. package/dist/pipeline/hooks.d.ts.map +1 -1
  151. package/dist/pipeline/hooks.js +1 -0
  152. package/dist/pipeline/sections.d.ts +8 -4
  153. package/dist/pipeline/sections.d.ts.map +1 -1
  154. package/dist/pipeline/sections.js +70 -27
  155. package/dist/pipeline/verification.d.ts +1 -0
  156. package/dist/pipeline/verification.d.ts.map +1 -1
  157. package/dist/pipeline/verification.js +10 -7
  158. package/dist/providers/llm-client.d.ts +38 -0
  159. package/dist/providers/llm-client.d.ts.map +1 -0
  160. package/dist/providers/llm-client.js +105 -0
  161. package/dist/sdk.d.ts +1 -0
  162. package/dist/sdk.d.ts.map +1 -1
  163. package/dist/sdk.js +1 -0
  164. package/dist/session/durable-session-supervisor.d.ts.map +1 -1
  165. package/dist/session/durable-session-supervisor.js +13 -6
  166. package/dist/session/session-persistence.d.ts +29 -0
  167. package/dist/session/session-persistence.d.ts.map +1 -0
  168. package/dist/session/session-persistence.js +45 -0
  169. package/dist/session/session-scheduler.d.ts +8 -1
  170. package/dist/session/session-scheduler.d.ts.map +1 -1
  171. package/dist/session/session-scheduler.js +33 -4
  172. package/dist/session-task-report.d.ts +1 -0
  173. package/dist/session-task-report.d.ts.map +1 -1
  174. package/dist/session-task-report.js +2 -1
  175. package/dist/shortcuts.d.ts.map +1 -1
  176. package/dist/shortcuts.js +1 -0
  177. package/dist/skills/registry.d.ts.map +1 -1
  178. package/dist/skills/registry.js +10 -0
  179. package/dist/skills/security-scan.d.ts +15 -0
  180. package/dist/skills/security-scan.d.ts.map +1 -0
  181. package/dist/skills/security-scan.js +95 -0
  182. package/dist/skills/types.d.ts +2 -0
  183. package/dist/skills/types.d.ts.map +1 -1
  184. package/dist/statusline.d.ts +3 -3
  185. package/dist/statusline.d.ts.map +1 -1
  186. package/dist/statusline.js +9 -17
  187. package/dist/token-usage.d.ts +27 -0
  188. package/dist/token-usage.d.ts.map +1 -0
  189. package/dist/token-usage.js +107 -0
  190. package/dist/tools/bash.d.ts.map +1 -1
  191. package/dist/tools/bash.js +5 -3
  192. package/dist/tools/browser-act-session.d.ts +48 -0
  193. package/dist/tools/browser-act-session.d.ts.map +1 -0
  194. package/dist/tools/browser-act-session.js +168 -0
  195. package/dist/tools/browser-act.d.ts +14 -0
  196. package/dist/tools/browser-act.d.ts.map +1 -0
  197. package/dist/tools/browser-act.js +297 -0
  198. package/dist/tools/code-symbols.d.ts +35 -0
  199. package/dist/tools/code-symbols.d.ts.map +1 -0
  200. package/dist/tools/code-symbols.js +257 -0
  201. package/dist/tools/index.d.ts +4 -1
  202. package/dist/tools/index.d.ts.map +1 -1
  203. package/dist/tools/index.js +22 -2
  204. package/dist/tools/lsp.d.ts +13 -0
  205. package/dist/tools/lsp.d.ts.map +1 -0
  206. package/dist/tools/lsp.js +136 -0
  207. package/dist/tools/patch.d.ts +5 -0
  208. package/dist/tools/patch.d.ts.map +1 -1
  209. package/dist/tools/patch.js +25 -4
  210. package/dist/tools/search.d.ts +7 -0
  211. package/dist/tools/search.d.ts.map +1 -1
  212. package/dist/tools/search.js +20 -3
  213. package/dist/tools/skill.d.ts +2 -0
  214. package/dist/tools/skill.d.ts.map +1 -1
  215. package/dist/tools/skill.js +47 -14
  216. package/dist/tools/subtask.d.ts +3 -1
  217. package/dist/tools/subtask.d.ts.map +1 -1
  218. package/dist/tools/subtask.js +151 -56
  219. package/dist/tui/shell.d.ts +12 -0
  220. package/dist/tui/shell.d.ts.map +1 -1
  221. package/dist/tui/shell.js +36 -3
  222. package/dist/tui/streaming-repl.d.ts +1 -0
  223. package/dist/tui/streaming-repl.d.ts.map +1 -1
  224. package/dist/tui/streaming-repl.js +27 -4
  225. package/dist/tui/streaming-tui.d.ts +10 -0
  226. package/dist/tui/streaming-tui.d.ts.map +1 -1
  227. package/dist/tui/streaming-tui.js +70 -12
  228. package/dist/types.d.ts +0 -8
  229. package/dist/types.d.ts.map +1 -1
  230. package/dist/workflow-runtime.d.ts.map +1 -1
  231. package/dist/workflow-runtime.js +10 -2
  232. package/dist/workflow-types.d.ts +2 -0
  233. package/dist/workflow-types.d.ts.map +1 -1
  234. package/docs/install.md +29 -8
  235. package/docs/skills.md +56 -7
  236. package/docs/web-routing.md +83 -0
  237. package/package.json +18 -4
  238. package/scripts/dep-layers.mjs +275 -0
  239. package/scripts/eval-llm.mjs +27 -0
  240. package/scripts/eval-recovery.mjs +101 -0
  241. package/scripts/eval-tasks.mjs +20 -0
  242. package/scripts/validate-packaging.mjs +51 -0
  243. package/skills/examples/README.md +23 -0
  244. package/skills/examples/add-function/SKILL.md +31 -0
  245. package/skills/examples/fix-failing-test/SKILL.md +32 -0
  246. package/skills/examples/pr-summary/SKILL.md +34 -0
  247. package/skills/lifecycle-build/SKILL.md +22 -0
  248. package/skills/lifecycle-plan/SKILL.md +32 -0
  249. package/skills/lifecycle-review/SKILL.md +25 -0
  250. package/skills/lifecycle-ship/SKILL.md +22 -0
  251. package/skills/lifecycle-spec/SKILL.md +24 -0
  252. package/skills/lifecycle-test/SKILL.md +21 -0
  253. package/skills/opencli/SKILL.md +222 -0
  254. package/skills/qling.md +14 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,eAAO,MAAM,YAAY,EAAE,YAwC1B,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ export const traceCommand = {
4
+ name: "/trace",
5
+ aliases: ["/轨迹"],
6
+ description: "查看脱敏后的本地执行摘要轨迹",
7
+ usage: "/trace current | last | show <runId> | export <runId>",
8
+ category: "session",
9
+ argumentHint: "current | last | show <runId> | export <runId>",
10
+ examples: ["/trace last", "/trace show run_abc"],
11
+ execute: async (args, context) => {
12
+ const agent = context.agentLoop;
13
+ if (typeof agent.listRunTraceIds !== "function" || typeof agent.readRunTrace !== "function") {
14
+ context.writeError("轨迹查询不可用:当前 AgentLoop 未启用本地摘要轨迹。");
15
+ return;
16
+ }
17
+ const sub = (args[0] ?? "last").toLowerCase();
18
+ const ids = await agent.listRunTraceIds();
19
+ let runId = args[1];
20
+ if (sub === "current")
21
+ runId = agent.getActiveRun?.()?.runId;
22
+ if (sub === "last")
23
+ runId = ids[0];
24
+ if (!runId || !["current", "last", "show", "export"].includes(sub)) {
25
+ context.writeError(ids.length === 0 ? "暂无本地执行轨迹。" : "用法: /trace current | last | show <runId> | export <runId>");
26
+ return;
27
+ }
28
+ const events = await agent.readRunTrace(runId);
29
+ if (sub === "export") {
30
+ const root = typeof agent.getRuntimeRootDir === "function" ? agent.getRuntimeRootDir() : path.join(process.cwd(), ".qling");
31
+ const exportDir = path.join(root, "exports");
32
+ const exportPath = path.join(exportDir, `trace-${runId}.jsonl`);
33
+ await mkdir(exportDir, { recursive: true });
34
+ await writeFile(exportPath, events.map((event) => JSON.stringify(event)).join("\n") + "\n", "utf8");
35
+ context.writeLine(`脱敏轨迹已导出: ${exportPath}`);
36
+ context.writeLine("边界: 导出不包含 prompt、模型思考或工具正文。");
37
+ return;
38
+ }
39
+ context.writeLine(`执行轨迹 ${runId} (${events.length} events)`);
40
+ for (const event of events) {
41
+ context.writeLine(`${new Date(event.timestamp).toISOString()} ${event.type} ${event.status ?? "-"} ${event.category ?? "-"} ${event.fingerprint ?? "-"}`);
42
+ }
43
+ context.writeLine("边界: 仅显示脱敏摘要,不包含 prompt、模型思考或工具正文。");
44
+ },
45
+ };
@@ -30,11 +30,11 @@ export const verifyCommand = {
30
30
  context.writeLine("-----------------------------------------");
31
31
  if (cmd) {
32
32
  context.writeLine(`当前验证命令 : ${cmd}`);
33
- context.writeLine(`自动自愈状态 : 已开启 (写操作后自动触发,上限 3 )`);
33
+ context.writeLine(`自动恢复状态 : 已开启 (同因最多 2 次,策略预算 4 次)`);
34
34
  }
35
35
  else {
36
36
  context.writeLine("当前验证命令 : (未设置)");
37
- context.writeLine("自动自愈状态 : 已关闭");
37
+ context.writeLine("自动恢复状态 : 已关闭");
38
38
  }
39
39
  context.writeLine("-----------------------------------------");
40
40
  context.writeLine("");
@@ -8,7 +8,6 @@ export interface LocalConfigReport {
8
8
  stateDir: string;
9
9
  cacheDir: string;
10
10
  maxSteps: number;
11
- maxTokenBudget: number;
12
11
  permissionMode: string;
13
12
  permissionRuleCount: number;
14
13
  features: Record<string, boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"config-report.d.ts","sourceRoot":"","sources":["../src/config-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,SAAS,GAAG,eAAe,CAAC;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,OAAO,CAAC;QACvB,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,OAAO,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,GAAG,EAAE;QACH,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;CACxB;AAaD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAkBzE;AAUD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB,CAoC7E;AAQD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAwB3E"}
1
+ {"version":3,"file":"config-report.d.ts","sourceRoot":"","sources":["../src/config-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,SAAS,GAAG,eAAe,CAAC;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,OAAO,CAAC;QACvB,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,OAAO,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,GAAG,EAAE;QACH,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;CACxB;AAaD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAkBzE;AAUD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB,CAoC7E;AAQD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAwB3E"}
@@ -42,7 +42,6 @@ export function buildLocalConfigReport(config) {
42
42
  stateDir: safeText(config.runtime.file_state_dir),
43
43
  cacheDir: safeText(config.runtime.file_cache_dir),
44
44
  maxSteps: Number(config.runtime.max_steps ?? 0),
45
- maxTokenBudget: Number(config.runtime.max_token_budget ?? 0),
46
45
  permissionMode: safeText(config.guard.permissions.default, "allow"),
47
46
  permissionRuleCount: config.guard.permissions.rules?.length ?? 0,
48
47
  features: {
@@ -85,7 +84,7 @@ export function formatLocalConfigReport(report) {
85
84
  `Workspace : ${report.workspaceDir}`,
86
85
  `State dir : ${report.stateDir}`,
87
86
  `Cache dir : ${report.cacheDir}`,
88
- `Runtime : max_steps=${report.maxSteps} max_tokens=${report.maxTokenBudget.toLocaleString()}`,
87
+ `Runtime : max_steps=${report.maxSteps}`,
89
88
  `Permissions: ${formatPermissionMode(report.permissionMode)}`,
90
89
  `Rules : ${report.permissionRuleCount}`,
91
90
  `Features : ${formatFeatureFlags(report.features)}`,
package/dist/config.d.ts CHANGED
@@ -74,7 +74,6 @@ export interface QlingConfig {
74
74
  file_state_dir: string;
75
75
  max_steps: number;
76
76
  parse_retries: number;
77
- max_token_budget: number;
78
77
  tool_repeat_limit: number;
79
78
  timeout_ms: number;
80
79
  };
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -21,7 +21,6 @@ export function buildDefaultConfig() {
21
21
  file_state_dir: DEFAULT_STATE_DIR,
22
22
  max_steps: 50,
23
23
  parse_retries: 2,
24
- max_token_budget: 120000,
25
24
  tool_repeat_limit: 6,
26
25
  timeout_ms: 300000,
27
26
  },
@@ -1,16 +1,19 @@
1
1
  import type { SlashCommandContext } from "./commands/runtime.js";
2
+ import { type TokenUsageSource } from "./token-usage.js";
3
+ import { type ContextLayerEstimate } from "./context-tool-hygiene.js";
2
4
  export interface ContextReport {
3
5
  sessionId: string;
4
6
  turnCount: number;
5
7
  messageCount: number;
6
8
  tokens: number;
7
- tokenSource: "provider" | "estimate" | "unknown";
9
+ promptTokens: number;
10
+ completionTokens: number;
11
+ tokenSource: TokenUsageSource;
8
12
  tokenSourceDescription: string;
9
- maxTokens: number | null;
10
- tokenUsagePercent: number | null;
11
- contextLevel: "ok" | "watch" | "critical" | "unknown";
12
13
  recommendation: string;
13
14
  compactions: number;
15
+ /** 本地字符层估计(非 provider token) */
16
+ layers: ContextLayerEstimate | null;
14
17
  workspaceDir: string;
15
18
  stateDir: string;
16
19
  cacheDir: string;
@@ -20,15 +23,18 @@ export interface ContextReport {
20
23
  }
21
24
  export interface ContextReportOptions {
22
25
  env?: NodeJS.ProcessEnv | Record<string, string | undefined>;
23
- maxTokens?: number | null;
24
26
  }
25
27
  export interface LocalContextReportOptions {
26
28
  workspaceDir: string;
27
29
  stateDir: string;
28
30
  cacheDir?: string;
29
- maxTokens?: number | null;
30
31
  }
31
- export declare function formatTokenUsage(tokens: number, maxTokens: number | null | undefined): string;
32
+ export declare function formatTokenUsage(options: {
33
+ tokens: number;
34
+ promptTokens?: number;
35
+ completionTokens?: number;
36
+ source?: TokenUsageSource;
37
+ }): string;
32
38
  export declare function buildContextReport(context: SlashCommandContext, options?: ContextReportOptions): Promise<ContextReport>;
33
39
  export declare function buildLocalContextReport(options: LocalContextReportOptions): Promise<ContextReport>;
34
40
  export declare function formatContextReport(report: ContextReport): string[];
@@ -1 +1 @@
1
- {"version":3,"file":"context-report.d.ts","sourceRoot":"","sources":["../src/context-report.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAIjE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IACjD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,IAAI,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IACtD,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAoBD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAO7F;AAiCD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,CA2CxB;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,aAAa,CAAC,CA6BxG;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAsCnE"}
1
+ {"version":3,"file":"context-report.d.ts","sourceRoot":"","sources":["../src/context-report.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGjE,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAYD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B,GAAG,MAAM,CAOT;AAyBD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,CAiDxB;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,aAAa,CAAC,CAwBxG;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CA2DnE"}
@@ -2,6 +2,8 @@ import { join } from "path";
2
2
  import { homedir } from "os";
3
3
  import { formatLocalPanel } from "./output-style.js";
4
4
  import { SessionRegistry } from "./session/session-registry.js";
5
+ import { formatProviderTokenLine, } from "./token-usage.js";
6
+ import { estimateContextLayers, } from "./context-tool-hygiene.js";
5
7
  function resolveStateDir(env, agentLoop) {
6
8
  return env?.QLING_FILE_STATE_DIR
7
9
  || agentLoop.getRuntimeRootDir?.()
@@ -10,52 +12,31 @@ function resolveStateDir(env, agentLoop) {
10
12
  function resolveCacheDir(env, stateDir) {
11
13
  return env?.QLING_FILE_CACHE_DIR || join(stateDir, "cache");
12
14
  }
13
- function resolveMaxTokens(options, agentLoop) {
14
- if (typeof options.maxTokens === "number" && options.maxTokens > 0) {
15
- return options.maxTokens;
16
- }
17
- const fromAgent = agentLoop.getTokenBudget?.()?.maxTokens ?? agentLoop.tokenBudget?.maxTokens;
18
- return typeof fromAgent === "number" && fromAgent > 0 ? fromAgent : null;
19
- }
20
- export function formatTokenUsage(tokens, maxTokens) {
21
- const used = Number(tokens ?? 0);
22
- if (!maxTokens || maxTokens <= 0) {
23
- return `${used.toLocaleString()} / unknown`;
24
- }
25
- const pct = Math.round((used / maxTokens) * 100);
26
- return `${used.toLocaleString()} / ${maxTokens.toLocaleString()} (${pct}%)`;
27
- }
28
- function classifyContextLevel(percent) {
29
- if (percent === null)
30
- return "unknown";
31
- if (percent >= 90)
32
- return "critical";
33
- if (percent >= 70)
34
- return "watch";
35
- return "ok";
36
- }
37
- function describeContextRecommendation(level) {
38
- switch (level) {
39
- case "critical":
40
- return "立即保存 checkpoint 并执行 /compact,避免后续回复被截断或上下文丢失。";
41
- case "watch":
42
- return "建议在继续长任务前保存 checkpoint;如输出变长,提前 /compact。";
43
- case "ok":
44
- return "当前上下文占用正常,可继续推进。";
45
- default:
46
- return "未配置可用 token 预算,建议设置 max token budget 以获得准确上下文水位。";
47
- }
15
+ export function formatTokenUsage(options) {
16
+ return formatProviderTokenLine({
17
+ tokens: options.tokens,
18
+ promptTokens: options.promptTokens,
19
+ completionTokens: options.completionTokens,
20
+ source: options.source,
21
+ });
48
22
  }
49
23
  function describeTokenSource(source) {
50
24
  switch (source) {
51
25
  case "provider":
52
- return "provider reported usage; suitable for accurate accounting when the provider returns usage.";
53
- case "estimate":
54
- return "local estimate; useful for context planning but not exact billing.";
26
+ return "provider 官方 usage(prompt/completion/total 字段);适合账单与用量统计。";
55
27
  default:
56
- return "unknown; provider usage and local estimate are unavailable.";
28
+ return "unknown:本会话尚未收到 provider usage;不会用本地字符估算伪造 token。";
57
29
  }
58
30
  }
31
+ function describeRecommendation(options) {
32
+ if (options.tokenSource === "unknown") {
33
+ return "当前无官方 usage。请确认模型 API 返回 usage;部分代理层可能剥离该字段。";
34
+ }
35
+ if (options.compactions > 0 || options.messageCount >= 40) {
36
+ return "上下文较长或已压缩过,可按需 /compact 或保存 checkpoint 后继续。";
37
+ }
38
+ return "Token 来自 provider 官方 usage,可继续推进。";
39
+ }
59
40
  export async function buildContextReport(context, options = {}) {
60
41
  const env = options.env ?? process.env;
61
42
  const agentLoop = context.agentLoop;
@@ -65,6 +46,8 @@ export async function buildContextReport(context, options = {}) {
65
46
  sessionId: agentLoop.getSessionId?.() ?? "",
66
47
  turnCount: agentLoop.turnCount ?? 0,
67
48
  tokens: agentLoop.sessionTokens ?? 0,
49
+ promptTokens: 0,
50
+ completionTokens: 0,
68
51
  tokenSource: "unknown",
69
52
  compactions: agentLoop.compactionCount ?? 0,
70
53
  };
@@ -74,23 +57,27 @@ export async function buildContextReport(context, options = {}) {
74
57
  const savedSessions = context.listSavedSessions ? await context.listSavedSessions() : [];
75
58
  const stateDir = resolveStateDir(env, agentLoop);
76
59
  const cacheDir = resolveCacheDir(env, stateDir);
77
- const maxTokens = resolveMaxTokens(options, agentLoop);
78
60
  const tokens = Number(stats.tokens ?? 0);
79
- const tokenUsagePercent = maxTokens ? Math.round((tokens / maxTokens) * 100) : null;
61
+ const promptTokens = Number(stats.promptTokens ?? 0);
62
+ const completionTokens = Number(stats.completionTokens ?? 0);
80
63
  const tokenSource = normalizeTokenSource(stats.tokenSource);
81
- const contextLevel = classifyContextLevel(tokenUsagePercent);
64
+ const messageCount = Array.isArray(messages) ? messages.length : Number(stats.messageCount ?? 0);
65
+ const compactions = Number(stats.compactions ?? stats.compactionCount ?? 0);
66
+ const layers = Array.isArray(messages) && messages.length > 0
67
+ ? estimateContextLayers(messages)
68
+ : null;
82
69
  return {
83
70
  sessionId: stats.sessionId || agentLoop.getSessionId?.() || "-",
84
71
  turnCount: Number(stats.turnCount ?? 0),
85
- messageCount: Array.isArray(messages) ? messages.length : Number(stats.messageCount ?? 0),
72
+ messageCount,
86
73
  tokens,
74
+ promptTokens,
75
+ completionTokens,
87
76
  tokenSource,
88
77
  tokenSourceDescription: describeTokenSource(tokenSource),
89
- maxTokens,
90
- tokenUsagePercent,
91
- contextLevel,
92
- recommendation: describeContextRecommendation(contextLevel),
93
- compactions: Number(stats.compactions ?? stats.compactionCount ?? 0),
78
+ recommendation: describeRecommendation({ tokenSource, compactions, messageCount }),
79
+ compactions,
80
+ layers,
94
81
  workspaceDir: context.workspaceDir || agentLoop.getWorkspaceDir?.() || process.cwd(),
95
82
  stateDir,
96
83
  cacheDir,
@@ -102,24 +89,19 @@ export async function buildContextReport(context, options = {}) {
102
89
  export async function buildLocalContextReport(options) {
103
90
  const registry = new SessionRegistry({ stateDir: options.stateDir });
104
91
  const savedSessions = await registry.list();
105
- const maxTokens = typeof options.maxTokens === "number" && options.maxTokens > 0
106
- ? options.maxTokens
107
- : null;
108
- const tokenUsagePercent = maxTokens ? 0 : null;
109
92
  const tokenSource = "unknown";
110
- const contextLevel = classifyContextLevel(tokenUsagePercent);
111
93
  return {
112
94
  sessionId: "-",
113
95
  turnCount: 0,
114
96
  messageCount: 0,
115
97
  tokens: 0,
98
+ promptTokens: 0,
99
+ completionTokens: 0,
116
100
  tokenSource,
117
101
  tokenSourceDescription: describeTokenSource(tokenSource),
118
- maxTokens,
119
- tokenUsagePercent,
120
- contextLevel,
121
- recommendation: describeContextRecommendation(contextLevel),
102
+ recommendation: describeRecommendation({ tokenSource, compactions: 0, messageCount: 0 }),
122
103
  compactions: 0,
104
+ layers: null,
123
105
  workspaceDir: options.workspaceDir,
124
106
  stateDir: options.stateDir,
125
107
  cacheDir: options.cacheDir || join(options.stateDir, "cache"),
@@ -143,15 +125,36 @@ export function formatContextReport(report) {
143
125
  ],
144
126
  },
145
127
  {
146
- heading: "Token 与状态",
128
+ heading: "Token(官方 usage)",
147
129
  rows: [
148
- ["Token", formatTokenUsage(report.tokens, report.maxTokens)],
130
+ ["Token", formatTokenUsage({
131
+ tokens: report.tokens,
132
+ promptTokens: report.promptTokens,
133
+ completionTokens: report.completionTokens,
134
+ source: report.tokenSource,
135
+ })],
136
+ ["输入 tokens", report.promptTokens.toLocaleString()],
137
+ ["输出 tokens", report.completionTokens.toLocaleString()],
149
138
  ["Token 来源", report.tokenSource],
150
139
  ["Token 说明", report.tokenSourceDescription],
151
- ["上下文状态", report.contextLevel],
152
140
  ["建议", report.recommendation],
153
141
  ],
154
142
  },
143
+ {
144
+ heading: "Harness 层(本地字符估计)",
145
+ rows: report.layers
146
+ ? [
147
+ ["对话 history", `${report.layers.historyChars.toLocaleString()} 字符 (${report.layers.historyPct}%)`],
148
+ ["工具输出", `${report.layers.toolOutputChars.toLocaleString()} 字符 (${report.layers.toolOutputPct}%)`],
149
+ ["其他", `${report.layers.otherChars.toLocaleString()} 字符 (${report.layers.otherPct}%)`],
150
+ ["合计字符", report.layers.totalChars.toLocaleString()],
151
+ ["工具消息数", report.layers.toolMessageCount],
152
+ ["说明", "非 provider token;用于观察 harness 膨胀。超长工具结果默认折叠(QLING_TOOL_RESULT_MAX_CHARS)。"],
153
+ ]
154
+ : [
155
+ ["状态", "当前无会话消息快照"],
156
+ ],
157
+ },
155
158
  {
156
159
  heading: "本地路径",
157
160
  rows: [
@@ -168,5 +171,5 @@ export function formatContextReport(report) {
168
171
  });
169
172
  }
170
173
  function normalizeTokenSource(value) {
171
- return value === "provider" || value === "estimate" ? value : "unknown";
174
+ return value === "provider" ? "provider" : "unknown";
172
175
  }
@@ -0,0 +1,36 @@
1
+ export interface ToolOutputSummaryOptions {
2
+ /** 超过此字符数则折叠。0 或负数 = 不截断。 */
3
+ maxChars?: number;
4
+ headChars?: number;
5
+ tailChars?: number;
6
+ }
7
+ export interface ContextLayerEstimate {
8
+ historyChars: number;
9
+ toolOutputChars: number;
10
+ otherChars: number;
11
+ totalChars: number;
12
+ historyPct: number;
13
+ toolOutputPct: number;
14
+ otherPct: number;
15
+ messageCount: number;
16
+ toolMessageCount: number;
17
+ }
18
+ export declare function resolveToolResultMaxChars(env?: NodeJS.ProcessEnv | Record<string, string | undefined>): number;
19
+ /**
20
+ * 折叠超长纯文本工具输出。短文本原样返回。
21
+ */
22
+ export declare function summarizeToolOutputForContext(output: string, options?: ToolOutputSummaryOptions): string;
23
+ /**
24
+ * 将 tool 消息 content(可能是 JSON.stringify(result))做卫生处理。
25
+ * 保持 is_error / tool_call_id 等结构字段。
26
+ */
27
+ export declare function prepareToolResultContent(content: string, options?: ToolOutputSummaryOptions): string;
28
+ /**
29
+ * 本地字符层估计(非 provider token)。用于 /context harness 可见性。
30
+ */
31
+ export declare function estimateContextLayers(messages: Array<{
32
+ role?: string;
33
+ content?: string;
34
+ tool_calls?: unknown;
35
+ }>): ContextLayerEstimate;
36
+ //# sourceMappingURL=context-tool-hygiene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-tool-hygiene.d.ts","sourceRoot":"","sources":["../src/context-tool-hygiene.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,wBAAwB;IACvC,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAMD,wBAAgB,yBAAyB,CACvC,GAAG,GAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACxE,MAAM,CAOR;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAmCR;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAiBR;AAcD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GACzE,oBAAoB,CAiCtB"}
@@ -0,0 +1,125 @@
1
+ // ============================================================
2
+ // Phase 3.0 — 工具结果上下文卫生
3
+ // 默认折叠超长 tool output,保留头尾 + 元数据,避免每轮 payload 膨胀。
4
+ // QLING_TOOL_RESULT_MAX_CHARS: 默认 6000;0 = 不截断
5
+ // ============================================================
6
+ const DEFAULT_MAX = 6000;
7
+ const DEFAULT_HEAD = 2400;
8
+ const DEFAULT_TAIL = 1200;
9
+ export function resolveToolResultMaxChars(env = process.env) {
10
+ const raw = env.QLING_TOOL_RESULT_MAX_CHARS;
11
+ if (raw === undefined || raw === "")
12
+ return DEFAULT_MAX;
13
+ const n = Number(raw);
14
+ if (!Number.isFinite(n))
15
+ return DEFAULT_MAX;
16
+ if (n <= 0)
17
+ return 0;
18
+ return Math.floor(n);
19
+ }
20
+ /**
21
+ * 折叠超长纯文本工具输出。短文本原样返回。
22
+ */
23
+ export function summarizeToolOutputForContext(output, options = {}) {
24
+ const maxChars = options.maxChars ?? DEFAULT_MAX;
25
+ if (maxChars <= 0)
26
+ return output;
27
+ if (output.length <= maxChars)
28
+ return output;
29
+ const lines = output.split("\n").length;
30
+ const requestedHead = Math.max(0, options.headChars ?? DEFAULT_HEAD);
31
+ const requestedTail = Math.max(0, options.tailChars ?? DEFAULT_TAIL);
32
+ const markerFor = (omitted) => `\n…[已截断: 共 ${output.length} 字符 / ${lines} 行,省略约 ${Math.max(0, omitted)} 字符;` +
33
+ `需要全文请用 read/search 定位,或调高 QLING_TOOL_RESULT_MAX_CHARS]…\n`;
34
+ let marker = markerFor(output.length);
35
+ if (marker.length >= maxChars) {
36
+ return `…[已截断 ${output.length} 字符]…`.slice(0, maxChars);
37
+ }
38
+ const requestedTotal = requestedHead + requestedTail;
39
+ const bodyBudget = maxChars - marker.length;
40
+ let headChars = requestedTotal > 0
41
+ ? Math.min(requestedHead, Math.ceil((bodyBudget * requestedHead) / requestedTotal))
42
+ : Math.ceil(bodyBudget / 2);
43
+ let tailChars = Math.min(requestedTail, bodyBudget - headChars);
44
+ if (requestedTotal === 0)
45
+ tailChars = bodyBudget - headChars;
46
+ marker = markerFor(output.length - headChars - tailChars);
47
+ const overflow = headChars + marker.length + tailChars - maxChars;
48
+ if (overflow > 0) {
49
+ const trimTail = Math.min(tailChars, overflow);
50
+ tailChars -= trimTail;
51
+ headChars = Math.max(0, headChars - (overflow - trimTail));
52
+ }
53
+ return output.slice(0, headChars) + marker + output.slice(-tailChars || output.length);
54
+ }
55
+ /**
56
+ * 将 tool 消息 content(可能是 JSON.stringify(result))做卫生处理。
57
+ * 保持 is_error / tool_call_id 等结构字段。
58
+ */
59
+ export function prepareToolResultContent(content, options = {}) {
60
+ const maxChars = options.maxChars ?? DEFAULT_MAX;
61
+ if (maxChars <= 0)
62
+ return content;
63
+ try {
64
+ const parsed = JSON.parse(content);
65
+ if (parsed && typeof parsed === "object" && typeof parsed.output === "string") {
66
+ const next = {
67
+ ...parsed,
68
+ output: summarizeToolOutputForContext(parsed.output, options),
69
+ };
70
+ return JSON.stringify(next);
71
+ }
72
+ }
73
+ catch {
74
+ // plain text tool content
75
+ }
76
+ return summarizeToolOutputForContext(content, options);
77
+ }
78
+ function messageChars(msg) {
79
+ let n = typeof msg.content === "string" ? msg.content.length : 0;
80
+ if (msg.tool_calls) {
81
+ try {
82
+ n += JSON.stringify(msg.tool_calls).length;
83
+ }
84
+ catch {
85
+ // ignore
86
+ }
87
+ }
88
+ return n;
89
+ }
90
+ /**
91
+ * 本地字符层估计(非 provider token)。用于 /context harness 可见性。
92
+ */
93
+ export function estimateContextLayers(messages) {
94
+ let historyChars = 0;
95
+ let toolOutputChars = 0;
96
+ let otherChars = 0;
97
+ let toolMessageCount = 0;
98
+ for (const msg of messages) {
99
+ const c = messageChars(msg);
100
+ const role = msg.role ?? "";
101
+ if (role === "tool") {
102
+ toolOutputChars += c;
103
+ toolMessageCount++;
104
+ }
105
+ else if (role === "user" || role === "assistant") {
106
+ historyChars += c;
107
+ }
108
+ else {
109
+ otherChars += c;
110
+ }
111
+ }
112
+ const totalChars = historyChars + toolOutputChars + otherChars || 1;
113
+ const pct = (n) => Math.round((n / totalChars) * 1000) / 10;
114
+ return {
115
+ historyChars,
116
+ toolOutputChars,
117
+ otherChars,
118
+ totalChars: historyChars + toolOutputChars + otherChars,
119
+ historyPct: pct(historyChars),
120
+ toolOutputPct: pct(toolOutputChars),
121
+ otherPct: pct(otherChars),
122
+ messageCount: messages.length,
123
+ toolMessageCount,
124
+ };
125
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/dashboard/client.ts"],"names":[],"mappings":""}