@qlingzzy/qling 1.0.0 → 1.1.1

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 +158 -0
  2. package/README.en.md +83 -18
  3. package/README.md +19 -9
  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 +46 -12
  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 +57 -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
@@ -1,5 +1,5 @@
1
1
  // ============================================================
2
- // 轻灵 - Subtask 工具定义
2
+ // 轻灵 - Subtask 工具定义(Phase 3.2 角色化 + 并行 explore)
3
3
  // ============================================================
4
4
  import { SubtaskRunner } from "../agent/subtask.js";
5
5
  import { toolError, toolSuccess } from "./error-utils.js";
@@ -11,44 +11,120 @@ import { skillTool } from "./skill.js";
11
11
  import { searchTool } from "./search.js";
12
12
  import { plannerTool } from "./planner.js";
13
13
  import { urlFetchTool } from "./url-fetch.js";
14
+ import { patchTool } from "./patch.js";
15
+ import { codeSymbolsTool } from "./code-symbols.js";
16
+ import { lspTool } from "./lsp.js";
14
17
  import { getRuntimeRootsFromEnv } from "../runtime-paths.js";
18
+ import { filterToolsForRole, isKnownSubAgentRole, normalizeSubAgentRole, } from "../agents/roles.js";
19
+ import { formatParallelExploreReport, gateParallelExplore, isSubtaskParallelEnabled, parseParallelTasks, } from "../agent/subtask-parallel.js";
20
+ const SUBTASK_TOOL_POOL = [
21
+ bashTool,
22
+ readTool,
23
+ writeTool,
24
+ patchTool,
25
+ todoTool,
26
+ skillTool,
27
+ searchTool,
28
+ codeSymbolsTool,
29
+ lspTool,
30
+ plannerTool,
31
+ urlFetchTool,
32
+ ];
15
33
  export const subtaskTool = {
16
34
  name: "subtask",
17
- description: "Spawn an isolated sub-agent for an independent subtask. The sub-agent has its own context but shares memory with the parent.",
35
+ description: "Spawn isolated sub-agent(s). role=explore|implement|review. Optional tasks[] runs parallel read-only explores when QLING_SUBTASK_PARALLEL=1.",
36
+ longDescription: `派生子代理执行独立子任务。
37
+
38
+ **角色 role**:
39
+ - explore — 只读探索
40
+ - implement — 实现(可写)
41
+ - review — 只读审查
42
+
43
+ **并行**(默认关):
44
+ - 设 QLING_SUBTASK_PARALLEL=1
45
+ - 传 tasks=["任务A","任务B"](2–3 个,仅 explore/review)
46
+ - 写操作禁止并行
47
+
48
+ **回传**: 【子代理回传契约】;并行时为【并行探索回传】汇总。
49
+ **禁止嵌套**: 子代理不可再 subtask。`,
18
50
  parameters: {
19
51
  type: "object",
20
52
  properties: {
21
53
  task: {
22
54
  type: "string",
23
- description: "The subtask description",
55
+ description: "Single subtask (required unless tasks[] is set)",
56
+ },
57
+ tasks: {
58
+ type: "array",
59
+ description: "Parallel explore/review task list (requires QLING_SUBTASK_PARALLEL=1). Max 3 by default.",
60
+ items: { type: "string" },
24
61
  },
25
62
  context: {
26
63
  type: "string",
27
64
  description: "Additional context to pass to the sub-agent",
28
65
  },
66
+ role: {
67
+ type: "string",
68
+ description: "explore | implement | review (default implement; parallel defaults explore)",
69
+ },
29
70
  max_iterations: {
30
71
  type: "number",
31
72
  description: "Max iterations (default 10)",
32
73
  },
33
74
  },
34
- required: ["task"],
75
+ required: [],
35
76
  },
36
77
  readOnly: false,
37
78
  destructive: false,
38
79
  scenes: ["planning"],
39
80
  effortHint: "high",
40
81
  };
41
- export async function runSubtask(args) {
42
- const task = String(args.task ?? "").trim();
43
- if (!task) {
44
- return toolError("SUBTASK_MISSING_TASK", "task is required");
45
- }
82
+ function buildRunnerConfig(role, maxIterations, timeoutMs) {
83
+ const roots = getRuntimeRootsFromEnv();
84
+ const tools = filterToolsForRole(SUBTASK_TOOL_POOL, role);
46
85
  const apiKey = process.env.QLING_LLM_API_KEY ??
47
86
  process.env.DEEPSEEK_API_KEY ??
48
87
  process.env.OPENAI_API_KEY ??
49
88
  "";
50
- if (!apiKey) {
51
- return toolError("SUBTASK_MISSING_API_KEY", "missing API key for subtask agent");
89
+ return {
90
+ apiKey,
91
+ tools,
92
+ parent: {
93
+ apiKey,
94
+ provider: process.env.QLING_LLM_PROVIDER ?? "deepseek",
95
+ endpoint: process.env.QLING_LLM_ENDPOINT ??
96
+ process.env.OPENAI_BASE_URL ??
97
+ process.env.DEEPSEEK_BASE_URL ??
98
+ "https://api.deepseek.com",
99
+ model: process.env.QLING_LLM_MODEL ?? "deepseek-chat",
100
+ tools,
101
+ runtime: {
102
+ workspaceDir: roots.workspaceDir,
103
+ fileCacheDir: roots.fileCacheDir,
104
+ fileStateDir: roots.fileStateDir,
105
+ maxSteps: maxIterations,
106
+ parseRetries: 2,
107
+ toolRepeatLimit: 6,
108
+ timeoutMs,
109
+ },
110
+ logging: {
111
+ level: "info",
112
+ format: "text",
113
+ inspectPrompt: false,
114
+ inspectRequest: false,
115
+ inspectDumpDir: roots.fileStateDir,
116
+ },
117
+ },
118
+ };
119
+ }
120
+ export async function runSubtask(args) {
121
+ const parallelTasks = parseParallelTasks(args.tasks);
122
+ const singleTask = String(args.task ?? "").trim();
123
+ if (parallelTasks.length === 0 && !singleTask) {
124
+ return toolError("SUBTASK_MISSING_TASK", "task is required (or tasks[] for parallel explore)");
125
+ }
126
+ if (args.role !== undefined && args.role !== "" && !isKnownSubAgentRole(args.role)) {
127
+ return toolError("SUBTASK_INVALID_ROLE", `unknown role "${args.role}"; use explore | implement | review`);
52
128
  }
53
129
  const maxIterationsRaw = Number(args.max_iterations ?? 10);
54
130
  const maxIterations = Number.isFinite(maxIterationsRaw) && maxIterationsRaw > 0
@@ -56,60 +132,79 @@ export async function runSubtask(args) {
56
132
  : 10;
57
133
  const timeoutRaw = Number(args.timeout_ms ?? 120_000);
58
134
  const timeoutMs = Number.isFinite(timeoutRaw) && timeoutRaw > 0 ? Math.min(600_000, timeoutRaw) : 120_000;
59
- const roots = getRuntimeRootsFromEnv();
60
- const runner = new SubtaskRunner({
61
- apiKey,
62
- provider: process.env.QLING_LLM_PROVIDER ?? "deepseek",
63
- endpoint: process.env.QLING_LLM_ENDPOINT ??
64
- process.env.OPENAI_BASE_URL ??
65
- process.env.DEEPSEEK_BASE_URL ??
66
- "https://api.deepseek.com",
67
- model: process.env.QLING_LLM_MODEL ?? "deepseek-chat",
68
- tools: [
69
- bashTool,
70
- readTool,
71
- writeTool,
72
- todoTool,
73
- skillTool,
74
- searchTool,
75
- plannerTool,
76
- urlFetchTool,
77
- ],
78
- runtime: {
79
- workspaceDir: roots.workspaceDir,
80
- fileCacheDir: roots.fileCacheDir,
81
- fileStateDir: roots.fileStateDir,
82
- maxSteps: maxIterations,
83
- parseRetries: 2,
84
- maxTokenBudget: 120_000,
85
- toolRepeatLimit: 6,
86
- timeoutMs,
87
- },
88
- logging: {
89
- level: "info",
90
- format: "text",
91
- inspectPrompt: false,
92
- inspectRequest: false,
93
- inspectDumpDir: roots.fileStateDir,
94
- },
95
- });
135
+ // --- 并行路径 ---
136
+ if (parallelTasks.length > 0) {
137
+ // 若同时给了 task,并入列表
138
+ const tasks = singleTask && !parallelTasks.includes(singleTask)
139
+ ? [singleTask, ...parallelTasks]
140
+ : parallelTasks.length > 0
141
+ ? parallelTasks
142
+ : [singleTask];
143
+ const roleHint = args.role !== undefined && args.role !== "" ? args.role : "explore";
144
+ const gate = gateParallelExplore({
145
+ tasks,
146
+ role: roleHint,
147
+ enabled: isSubtaskParallelEnabled(),
148
+ });
149
+ if (!gate.ok) {
150
+ return toolError(gate.errorCode ?? "SUBTASK_PARALLEL_DENIED", gate.errorMessage ?? "denied");
151
+ }
152
+ const { apiKey, tools, parent } = buildRunnerConfig(gate.role, maxIterations, timeoutMs);
153
+ if (!apiKey) {
154
+ return toolError("SUBTASK_MISSING_API_KEY", "missing API key for subtask agent");
155
+ }
156
+ try {
157
+ const settled = await Promise.all(gate.tasks.map(async (task) => {
158
+ const runner = new SubtaskRunner(parent);
159
+ const result = await runner.run({
160
+ task,
161
+ parentContext: args.context,
162
+ maxIterations,
163
+ depth: 1,
164
+ timeoutMs,
165
+ role: gate.role,
166
+ tools,
167
+ });
168
+ return { task, result };
169
+ }));
170
+ const report = formatParallelExploreReport(settled);
171
+ const anyFail = settled.some((s) => !s.result.success);
172
+ if (anyFail) {
173
+ return toolError("SUBTASK_PARALLEL_PARTIAL", report, {
174
+ retriable: false,
175
+ category: "runtime",
176
+ });
177
+ }
178
+ return toolSuccess(report);
179
+ }
180
+ catch (err) {
181
+ return toolError("SUBTASK_PARALLEL_FAILED", err instanceof Error ? err.message : String(err), { retriable: false, category: "runtime" });
182
+ }
183
+ }
184
+ // --- 单任务路径 ---
185
+ const role = normalizeSubAgentRole(args.role);
186
+ const { apiKey, tools, parent } = buildRunnerConfig(role, maxIterations, timeoutMs);
187
+ if (!apiKey) {
188
+ return toolError("SUBTASK_MISSING_API_KEY", "missing API key for subtask agent");
189
+ }
190
+ const runner = new SubtaskRunner(parent);
96
191
  try {
97
192
  const result = await runner.run({
98
- task,
193
+ task: singleTask,
99
194
  parentContext: args.context,
100
195
  maxIterations,
101
196
  depth: 1,
102
197
  timeoutMs,
198
+ role,
199
+ tools,
103
200
  });
104
201
  if (!result.success) {
105
- return toolError("SUBTASK_FAILED", result.output, { retriable: false, category: "runtime" });
202
+ return toolError("SUBTASK_FAILED", result.contractText || result.output, {
203
+ retriable: false,
204
+ category: "runtime",
205
+ });
106
206
  }
107
- return toolSuccess([
108
- `subtask completed in ${result.durationMs}ms`,
109
- `iterations=${result.iterations}`,
110
- "",
111
- result.output,
112
- ].join("\n"));
207
+ return toolSuccess(result.contractText || result.output);
113
208
  }
114
209
  catch (err) {
115
210
  return toolError("SUBTASK_RUN_FAILED", err instanceof Error ? err.message : String(err), {
@@ -34,6 +34,18 @@ export declare function formatToolTimelineRow(event: ToolTimelineEvent): string;
34
34
  export declare function formatResultBox(lines: string[], width: number, options?: {
35
35
  compactLong?: boolean;
36
36
  }): string[];
37
+ export interface ResultHighlightOptions {
38
+ /** 框标题,默认「结果」 */
39
+ header?: string;
40
+ /** 正文行(可含 ANSI);超宽时截断以保证右侧边框对齐 */
41
+ lines: string[];
42
+ width?: number;
43
+ }
44
+ /**
45
+ * 任务最终结果高亮框(纯函数,便于单测)。
46
+ * 顶/底/左右边框完整闭合,各行可见宽度一致。
47
+ */
48
+ export declare function formatResultHighlight(options: ResultHighlightOptions): string[];
37
49
  export declare function formatInputFrame(options: InputFrameOptions): string[];
38
50
  export declare function formatBottomHints(): string;
39
51
  export interface ToolOutputCardOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/tui/shell.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/tui/shell.ts"],"names":[],"mappings":"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"}
package/dist/tui/shell.js CHANGED
@@ -184,6 +184,39 @@ export function formatResultBox(lines, width, options) {
184
184
  const bottom = "└" + "─".repeat(contentWidth + 2) + "┘";
185
185
  return [top, ...body, bottom];
186
186
  }
187
+ /**
188
+ * 将可见宽度限制在 maxWidth 内。
189
+ * 含 ANSI 且超宽时去掉颜色再截断,保证右框能稳定闭合对齐。
190
+ */
191
+ function fitVisible(value, maxWidth) {
192
+ if (maxWidth <= 0)
193
+ return "";
194
+ if (visibleWidth(value) <= maxWidth)
195
+ return value;
196
+ return truncateVisible(stripAnsi(value), maxWidth);
197
+ }
198
+ /**
199
+ * 任务最终结果高亮框(纯函数,便于单测)。
200
+ * 顶/底/左右边框完整闭合,各行可见宽度一致。
201
+ */
202
+ export function formatResultHighlight(options) {
203
+ const safeWidth = normalizeWidth(options.width);
204
+ const contentWidth = Math.max(20, safeWidth - 4);
205
+ const frameInner = contentWidth + 2; // 左右各 1 空格 + 正文区
206
+ const header = normalizeLabel(options.header, "结果");
207
+ const title = ` ${header} `;
208
+ const titleW = visibleWidth(title);
209
+ // ┌─ + title + dashes + ┐ 总可见宽 = contentWidth + 4
210
+ const dashAfter = Math.max(1, frameInner - 1 - titleW);
211
+ const top = `┌─${title}${"─".repeat(dashAfter)}┐`;
212
+ const bodyLines = options.lines.length > 0 ? options.lines : [""];
213
+ const body = bodyLines.map((line) => {
214
+ const text = fitVisible(line, contentWidth);
215
+ return `│ ${padVisible(text, contentWidth)} │`;
216
+ });
217
+ const bottom = "└" + "─".repeat(frameInner) + "┘";
218
+ return [top, ...body, bottom];
219
+ }
187
220
  export function formatInputFrame(options) {
188
221
  const t = getLocalizedText();
189
222
  const safeWidth = normalizeWidth(options.width);
@@ -201,7 +234,7 @@ export function formatInputFrame(options) {
201
234
  export function formatBottomHints() {
202
235
  const t = getLocalizedText();
203
236
  return (t.tui?.hints?.bottom ||
204
- "Enter 发送 · / 命令 · Ctrl+N 换行 · Ctrl+O 展开工具输出 · Ctrl+C 清空/中断 · /statusline · /expand");
237
+ "Enter 发送 · / 命令 · Ctrl+N 换行 · Ctrl+O 展开/收起工具输出 · Shift+Tab 模式 · Ctrl+C 清空/中断 · /mode · /expand");
205
238
  }
206
239
  /**
207
240
  * 工具输出折叠卡片(纯函数,便于单测)。
@@ -221,7 +254,7 @@ export function formatToolOutputCard(output, options = {}) {
221
254
  hidden: 0,
222
255
  collapsed: false,
223
256
  footer: expand && totalLines > longThreshold
224
- ? `... ${totalLines} lines total (Ctrl+O to collapse)`
257
+ ? `... ${totalLines} lines total (Ctrl+O 收起 / collapse)`
225
258
  : null,
226
259
  };
227
260
  }
@@ -247,7 +280,7 @@ export function formatToolOutputCard(output, options = {}) {
247
280
  totalLines,
248
281
  hidden,
249
282
  collapsed: true,
250
- footer: `... ${totalLines} lines total (Ctrl+O to expand)`,
283
+ footer: `... ${totalLines} lines total (Ctrl+O 展开 / expand)`,
251
284
  };
252
285
  }
253
286
  export function formatWelcomeGuide(width = 80, snapshot) {
@@ -12,6 +12,7 @@ export declare class StreamingREPL {
12
12
  private readonly inputQueue;
13
13
  private closed;
14
14
  private onClose;
15
+ private lastExecutionStatus;
15
16
  constructor(agent?: AgentLoop, options?: {
16
17
  resumeSession?: string;
17
18
  continueSession?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"streaming-repl.d.ts","sourceRoot":"","sources":["../../src/tui/streaming-repl.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAa7C,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAC9C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAA6B;gBAG1C,KAAK,CAAC,EAAE,SAAS,EACjB,OAAO,GAAE;QACP,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,eAAe,CAAC,EAAE,OAAO,CAAC;KACtB;IAyBF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAIb,KAAK;IAkBnB,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;YAmDZ,gBAAgB;YAKhB,iBAAiB;YAoBjB,qBAAqB;YAQrB,uBAAuB;YAQvB,aAAa;YAiEb,eAAe;YASf,2BAA2B;IA4BzC,OAAO,CAAC,0BAA0B;YAkCpB,qBAAqB;IAoCnC,OAAO,CAAC,kBAAkB;YAWZ,6BAA6B;YAU7B,yBAAyB;YA2BzB,aAAa;CAsB5B"}
1
+ {"version":3,"file":"streaming-repl.d.ts","sourceRoot":"","sources":["../../src/tui/streaming-repl.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAa7C,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAC9C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,mBAAmB,CAAM;gBAG/B,KAAK,CAAC,EAAE,SAAS,EACjB,OAAO,GAAE;QACP,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,eAAe,CAAC,EAAE,OAAO,CAAC;KACtB;IAyBF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAIb,KAAK;IAkBnB,OAAO,CAAC,eAAe;IA8DvB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;YAqDZ,gBAAgB;YAKhB,iBAAiB;YAoBjB,qBAAqB;YAQrB,uBAAuB;YAQvB,aAAa;YAsEb,eAAe;YASf,2BAA2B;IA4BzC,OAAO,CAAC,0BAA0B;YAkCpB,qBAAqB;IAgCnC,OAAO,CAAC,kBAAkB;YAWZ,6BAA6B;YAU7B,yBAAyB;YA2BzB,aAAa;CAsB5B"}
@@ -31,6 +31,7 @@ export class StreamingREPL {
31
31
  inputQueue;
32
32
  closed = false;
33
33
  onClose = null;
34
+ lastExecutionStatus = "";
34
35
  constructor(agent, options = {}) {
35
36
  this.agent = agent ?? new AgentLoop();
36
37
  const model = this.agent.getModel();
@@ -94,6 +95,19 @@ export class StreamingREPL {
94
95
  }
95
96
  // ── 事件连接 ────────────────────────────────────────
96
97
  wireAgentEvents() {
98
+ const subscribe = this.agent.subscribeExecutionEvents;
99
+ if (typeof subscribe === "function") {
100
+ subscribe.call(this.agent, (event) => {
101
+ const strategy = event.recoveryAction ? ` · ${event.recoveryAction}` : "";
102
+ const status = `${event.stage ?? "run"}:${event.status ?? event.type}${strategy}`;
103
+ if (status === this.lastExecutionStatus)
104
+ return;
105
+ this.lastExecutionStatus = status;
106
+ const tool = event.tool ? ` · ${event.tool}` : "";
107
+ const category = event.category ? ` · ${event.category}` : "";
108
+ this.ui.appendValidation(event.status === "failed" || event.status === "paused" ? "warn" : "pass", `执行阶段: ${event.stage ?? "run"} · ${event.status ?? event.type}${tool}${category}${strategy}`);
109
+ });
110
+ }
97
111
  this.agent.on("tool_start", (name, args) => {
98
112
  const cmd = this.argsToCommand(name, args);
99
113
  this.ui.appendToolStart(name, cmd);
@@ -126,6 +140,13 @@ export class StreamingREPL {
126
140
  const status = verdict === "PASS" ? "pass" : verdict === "FAIL" ? "fail" : "warn";
127
141
  this.ui.appendValidation(status, details);
128
142
  });
143
+ this.agent.on("repair", (reason, action, retryCount) => {
144
+ this.ui.appendRepair(reason, action, retryCount);
145
+ });
146
+ this.agent.on("recovery_paused", (state) => {
147
+ this.ui.stopProgress();
148
+ this.ui.setRecoveryState(state);
149
+ });
129
150
  }
130
151
  // 将工具参数转换为可读命令字符串
131
152
  argsToCommand(tool, args) {
@@ -199,6 +220,8 @@ export class StreamingREPL {
199
220
  setImmediatePrompt: (prompt) => {
200
221
  this.immediatePrompt = prompt;
201
222
  },
223
+ setInputDraft: (draft) => this.ui.setInputDraft(draft),
224
+ onRecoveryStateChanged: (state) => this.ui.setRecoveryState(state),
202
225
  onModelChanged: async (model) => {
203
226
  this.ui.setModel?.(model);
204
227
  await this.refreshStatusLine();
@@ -268,6 +291,10 @@ export class StreamingREPL {
268
291
  await this.agent.checkpointSession();
269
292
  const totalMs = Date.now() - startTime;
270
293
  this.ui.appendDone(totalMs);
294
+ if (this.agent.getRecoveryState()?.status === "paused") {
295
+ currentPrompt = null;
296
+ break;
297
+ }
271
298
  }
272
299
  catch (err) {
273
300
  this.ui.stopProgress();
@@ -386,10 +413,6 @@ export class StreamingREPL {
386
413
  }
387
414
  else {
388
415
  await this.scheduler.runDueTasksOnce();
389
- // 真实 TUI 有 showPrompt;单测 mock 可能没有
390
- if (typeof this.ui.showPrompt === "function") {
391
- this.ui.showPrompt();
392
- }
393
416
  }
394
417
  return;
395
418
  }
@@ -1,3 +1,4 @@
1
+ import type { RecoveryState } from "../execution/types.js";
1
2
  export type AgentEvent = {
2
3
  type: "tool_start";
3
4
  tool: string;
@@ -69,6 +70,7 @@ export declare class StreamUI {
69
70
  private slashCompletionSelectedIndex;
70
71
  private inputCursorAnchor;
71
72
  private inputStartRow;
73
+ private recoveryState;
72
74
  private readonly now;
73
75
  private readonly doubleCtrlCExitWindowMs;
74
76
  constructor(model?: string, tools?: number, options?: {
@@ -89,6 +91,9 @@ export declare class StreamUI {
89
91
  memoryStatus?: string;
90
92
  }): void;
91
93
  setModel(model: string): void;
94
+ setRecoveryState(state: RecoveryState | null): void;
95
+ setInputDraft(draft: string): void;
96
+ private appendRecoveryCard;
92
97
  isExpandLongToolOutput(): boolean;
93
98
  setExpandLongToolOutput(expanded: boolean): void;
94
99
  toggleExpandLongToolOutput(): boolean;
@@ -96,6 +101,10 @@ export declare class StreamUI {
96
101
  startProgress(label?: string, intervalMs?: number): void;
97
102
  stopProgress(): void;
98
103
  private printHeader;
104
+ /**
105
+ * 输入框上方不再堆叠 statusline / 快捷键黑灰提示(去噪)。
106
+ * 详情仍可通过 /statusline、/shortcuts 与顶栏查看。
107
+ */
99
108
  private printPromptHint;
100
109
  private printInputBar;
101
110
  private backToPrompt;
@@ -129,6 +138,7 @@ export declare class StreamUI {
129
138
  private setupInput;
130
139
  private handleEnter;
131
140
  private handleTab;
141
+ private handleShiftTab;
132
142
  private handleCtrlC;
133
143
  private handleCtrlZ;
134
144
  private handleBackspace;
@@ -1 +1 @@
1
- {"version":3,"file":"streaming-tui.d.ts","sourceRoot":"","sources":["../../src/tui/streaming-tui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streaming-tui.d.ts","sourceRoot":"","sources":["../../src/tui/streaming-tui.ts"],"names":[],"mappings":"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"}