@zmzai/agent-framework 0.9.0 → 0.13.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 (126) hide show
  1. package/dist/adapters/openai-provider.d.ts +6 -3
  2. package/dist/adapters/openai-provider.d.ts.map +1 -1
  3. package/dist/adapters/openai-provider.js +1 -1
  4. package/dist/adapters/openai-provider.js.map +1 -1
  5. package/dist/core/events/manifest.d.ts +2 -2
  6. package/dist/core/runtime/active-run-registry.d.ts +34 -0
  7. package/dist/core/runtime/active-run-registry.d.ts.map +1 -0
  8. package/dist/core/runtime/active-run-registry.js +44 -0
  9. package/dist/core/runtime/active-run-registry.js.map +1 -0
  10. package/dist/core/runtime/attempt-executor.d.ts +67 -0
  11. package/dist/core/runtime/attempt-executor.d.ts.map +1 -0
  12. package/dist/core/runtime/attempt-executor.js +683 -0
  13. package/dist/core/runtime/attempt-executor.js.map +1 -0
  14. package/dist/core/runtime/command-service.d.ts +48 -0
  15. package/dist/core/runtime/command-service.d.ts.map +1 -0
  16. package/dist/core/runtime/command-service.js +148 -0
  17. package/dist/core/runtime/command-service.js.map +1 -0
  18. package/dist/core/runtime/compaction.d.ts +30 -6
  19. package/dist/core/runtime/compaction.d.ts.map +1 -1
  20. package/dist/core/runtime/compaction.js +5 -4
  21. package/dist/core/runtime/compaction.js.map +1 -1
  22. package/dist/core/runtime/context-builder.d.ts +66 -0
  23. package/dist/core/runtime/context-builder.d.ts.map +1 -0
  24. package/dist/core/runtime/context-builder.js +187 -0
  25. package/dist/core/runtime/context-builder.js.map +1 -0
  26. package/dist/core/runtime/run-scheduler.d.ts +44 -0
  27. package/dist/core/runtime/run-scheduler.d.ts.map +1 -0
  28. package/dist/core/runtime/run-scheduler.js +136 -0
  29. package/dist/core/runtime/run-scheduler.js.map +1 -0
  30. package/dist/core/runtime/runner.d.ts +25 -178
  31. package/dist/core/runtime/runner.d.ts.map +1 -1
  32. package/dist/core/runtime/runner.js +105 -1457
  33. package/dist/core/runtime/runner.js.map +1 -1
  34. package/dist/core/runtime/task-lifecycle.d.ts +165 -0
  35. package/dist/core/runtime/task-lifecycle.d.ts.map +1 -0
  36. package/dist/core/runtime/task-lifecycle.js +424 -0
  37. package/dist/core/runtime/task-lifecycle.js.map +1 -0
  38. package/dist/core/session/sqlite-store.d.ts.map +1 -1
  39. package/dist/core/session/sqlite-store.js +110 -1
  40. package/dist/core/session/sqlite-store.js.map +1 -1
  41. package/dist/core/session/store.d.ts +9 -1
  42. package/dist/core/session/store.d.ts.map +1 -1
  43. package/dist/core/session/types.d.ts +16 -0
  44. package/dist/core/session/types.d.ts.map +1 -1
  45. package/dist/core/session/workflow.d.ts +49 -2
  46. package/dist/core/session/workflow.d.ts.map +1 -1
  47. package/dist/core/session/workflow.js.map +1 -1
  48. package/dist/core/subagents/coordinator.d.ts +187 -0
  49. package/dist/core/subagents/coordinator.d.ts.map +1 -0
  50. package/dist/core/subagents/coordinator.js +446 -0
  51. package/dist/core/subagents/coordinator.js.map +1 -0
  52. package/dist/core/subagents/parked.d.ts +50 -0
  53. package/dist/core/subagents/parked.d.ts.map +1 -0
  54. package/dist/core/subagents/parked.js +75 -0
  55. package/dist/core/subagents/parked.js.map +1 -0
  56. package/dist/core/subagents/tools.d.ts +29 -0
  57. package/dist/core/subagents/tools.d.ts.map +1 -0
  58. package/dist/core/subagents/tools.js +164 -0
  59. package/dist/core/subagents/tools.js.map +1 -0
  60. package/dist/core/subagents/types.d.ts +107 -0
  61. package/dist/core/subagents/types.d.ts.map +1 -0
  62. package/dist/core/subagents/types.js +44 -0
  63. package/dist/core/subagents/types.js.map +1 -0
  64. package/dist/core/task/completion.d.ts +3 -0
  65. package/dist/core/task/completion.d.ts.map +1 -1
  66. package/dist/core/task/completion.js +4 -0
  67. package/dist/core/task/completion.js.map +1 -1
  68. package/dist/core/task/types.d.ts +5 -0
  69. package/dist/core/task/types.d.ts.map +1 -1
  70. package/dist/core/task/types.js.map +1 -1
  71. package/dist/core/tools/adapter.d.ts.map +1 -1
  72. package/dist/core/tools/adapter.js +87 -61
  73. package/dist/core/tools/adapter.js.map +1 -1
  74. package/dist/core/tools/builtins.d.ts.map +1 -1
  75. package/dist/core/tools/builtins.js +7 -0
  76. package/dist/core/tools/builtins.js.map +1 -1
  77. package/dist/core/tools/context.d.ts +1 -0
  78. package/dist/core/tools/context.d.ts.map +1 -1
  79. package/dist/core/tools/def.d.ts +25 -0
  80. package/dist/core/tools/def.d.ts.map +1 -1
  81. package/dist/core/tools/def.js.map +1 -1
  82. package/dist/core/tools/git.d.ts.map +1 -1
  83. package/dist/core/tools/git.js +4 -0
  84. package/dist/core/tools/git.js.map +1 -1
  85. package/dist/core/tools/patch.d.ts.map +1 -1
  86. package/dist/core/tools/patch.js +1 -0
  87. package/dist/core/tools/patch.js.map +1 -1
  88. package/dist/core/tools/qa-check.d.ts +2 -2
  89. package/dist/core/tools/qa-check.d.ts.map +1 -1
  90. package/dist/core/tools/qa-check.js +1 -0
  91. package/dist/core/tools/qa-check.js.map +1 -1
  92. package/dist/core/tools/repomap.d.ts.map +1 -1
  93. package/dist/core/tools/repomap.js +1 -0
  94. package/dist/core/tools/repomap.js.map +1 -1
  95. package/dist/core/tools/task-block.d.ts.map +1 -1
  96. package/dist/core/tools/task-block.js +1 -0
  97. package/dist/core/tools/task-block.js.map +1 -1
  98. package/dist/core/tools/task-deliver.d.ts +1 -1
  99. package/dist/core/tools/task-deliver.d.ts.map +1 -1
  100. package/dist/core/tools/task-deliver.js +1 -0
  101. package/dist/core/tools/task-deliver.js.map +1 -1
  102. package/dist/core/tools/task.d.ts.map +1 -1
  103. package/dist/core/tools/task.js +3 -0
  104. package/dist/core/tools/task.js.map +1 -1
  105. package/dist/core/tools/terminal.d.ts.map +1 -1
  106. package/dist/core/tools/terminal.js +5 -0
  107. package/dist/core/tools/terminal.js.map +1 -1
  108. package/dist/core/tools/webfetch.d.ts.map +1 -1
  109. package/dist/core/tools/webfetch.js +1 -0
  110. package/dist/core/tools/webfetch.js.map +1 -1
  111. package/dist/core/tools/websearch.d.ts.map +1 -1
  112. package/dist/core/tools/websearch.js +1 -0
  113. package/dist/core/tools/websearch.js.map +1 -1
  114. package/dist/index.d.ts +5 -0
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +3 -0
  117. package/dist/index.js.map +1 -1
  118. package/dist/server/create-agent-runtime.d.ts +3 -1
  119. package/dist/server/create-agent-runtime.d.ts.map +1 -1
  120. package/dist/server/create-agent-runtime.js +8 -1
  121. package/dist/server/create-agent-runtime.js.map +1 -1
  122. package/dist/server/create-server.d.ts +6 -0
  123. package/dist/server/create-server.d.ts.map +1 -1
  124. package/dist/server/create-server.js +9 -0
  125. package/dist/server/create-server.js.map +1 -1
  126. package/package.json +12 -11
@@ -0,0 +1,424 @@
1
+ import { isSessionAwaitingPermission } from "./active-run-registry.js";
2
+ import { LoopGuard } from "./loop-guard.js";
3
+ import { DEFAULT_MAX_ATTEMPTS, durationBudgetBlocker, evaluateTaskCompletion, lifecycleForBlocker, normalizeMaxDurationMs, } from "../task/completion.js";
4
+ import { advanceProgress } from "../task/progress.js";
5
+ import { appendEvidence, applyDelivery, pruneEvidenceRefs, projectTodos } from "../task/plan.js";
6
+ import { fallbackResult, renderResult } from "../task/contract.js";
7
+ import { isTerminalStatus, isWaitingStatus } from "../task/types.js";
8
+ /** 用户明确放行时重置的三个保护计数(新消息恢复、以及 `resumeTask`)。
9
+ *
10
+ * 【为什么必须重置】不重置的话「继续」是个死按钮:因为 no_progress 停下来的任务
11
+ * 计数仍是 3,下一次判定立刻再停;因为轮数预算停下来的任务第 N+1 轮开头就超过
12
+ * 上限,一步都不会跑;时间预算同理——已经烧满一小时的 `activeMs` 会让放行后的
13
+ * 第一轮连起点都过不去。用户点「继续」就是明确授权再做一些,那一刻起保护阈值
14
+ * 应当重新计时——由人来决定要不要继续,正是这类保护的设计前提(规格 §10.1 的
15
+ * 三档策略本来就以「用户可以再来一轮」为前提)。
16
+ *
17
+ * 这不会让任务无限跑:每一次重置都需要一次显式的人工动作,不存在自触发路径。 */
18
+ export const RESET_GUARDS_ON_RESUME = { noProgressCount: 0, attemptCount: 0, activeMs: 0 };
19
+ /** 上游中断类错误(F6):模型流偶发终止/连接断开时自动重试,避免偶发中断
20
+ * 直接结束任务(实测 relay 透传 "terminated"、上游断流
21
+ * "upstream_http2_stream_error" 等)。余额/鉴权等确定性错误不重试。
22
+ * P1 增强:限流/网关类(429/5xx)也按可重试处理——这类错误本质是上游
23
+ * 暂时不可用,与 terminated 同属"等等就好",自动退避重试比直接报错体验好。 */
24
+ export function isRetryableError(message) {
25
+ const normalized = message.toLowerCase();
26
+ return (normalized.includes("terminated") ||
27
+ normalized.includes("econnreset") ||
28
+ normalized.includes("socket hang up") ||
29
+ normalized.includes("etimedout") ||
30
+ normalized.includes("api connection error") ||
31
+ normalized.includes("overloaded") ||
32
+ normalized.includes("timeout") ||
33
+ normalized.includes("upstream") ||
34
+ normalized.includes("stream failed") ||
35
+ // 限流 / 网关类(\b 防止误匹配普通数字,如 "1429 tokens")
36
+ /\b429\b/.test(normalized) ||
37
+ /\b50[234]\b/.test(normalized) ||
38
+ normalized.includes("rate limit") ||
39
+ normalized.includes("too many requests") ||
40
+ normalized.includes("bad gateway") ||
41
+ normalized.includes("service unavailable") ||
42
+ normalized.includes("internal server error"));
43
+ }
44
+ /** 单次任务 Attempt 数的硬上限(规格 §10.1 的要求:宿主调不到「永不拦截」)。
45
+ * 64 轮远超任何正常任务,同时挡住 `maxAttempts: 1e9` 这种把保护关掉的写法。 */
46
+ const MAX_ATTEMPT_CEILING = 64;
47
+ /** 任务生命周期(W7 S5 自 SessionRunner 原样搬移,spec §7 TaskLifecycle):
48
+ * 沿用 TaskRecord、续跑、阻塞、交付条件。语义零变化。 */
49
+ export class TaskLifecycle {
50
+ deps;
51
+ constructor(deps) {
52
+ this.deps = deps;
53
+ }
54
+ async casTask(task, patch) {
55
+ const store = this.deps.store.task;
56
+ let latest = task;
57
+ for (let attempt = 0; attempt < 3; attempt += 1) {
58
+ try {
59
+ return await store.updateTask(latest.id, latest.revision, patch);
60
+ }
61
+ catch (error) {
62
+ if (!(error instanceof Error) || error.message !== "TASK_REVISION_CONFLICT")
63
+ throw error;
64
+ const fresh = await store.getTask(latest.id);
65
+ if (!fresh)
66
+ throw error;
67
+ latest = fresh;
68
+ }
69
+ }
70
+ throw new Error("TASK_REVISION_CONFLICT");
71
+ }
72
+ /** 权限等待的进入 / 退出(规格 3 §11.1 / §11.2)。
73
+ *
74
+ * 进入时把任务置 `waiting_permission` 并挂 permission blocker;退出(授权通过
75
+ * 或被拒)时置回 `running` 并清 blocker。
76
+ *
77
+ * 【为什么退出后不是 blocked/failed】这次 Attempt 根本没被中断——`engine.ask()`
78
+ * 只是在 `beforeToolCall` 里挂住,决定一到就接着跑同一个工具循环。所以既不发
79
+ * `task.attempt.finished`,也不创建用户消息、不新建 workflow run(§11.2 明文)。
80
+ * 唯一例外是被拒:拒绝结果会作为工具错误交回模型去试替代方案(§11.3)。
81
+ *
82
+ * 【为什么挂在引擎回调上,而不是 beforeToolCall 里】规则表已经允许的调用不会
83
+ * 弹卡(`ask()` 在 undecided 为空时直接返回),挂在调用点会为这些「秒过」的
84
+ * 调用也标一次等待再撤回,产生成对的假 blocker 事件。`onAsked` 只在真的抛出
85
+ * 一张授权卡时触发。
86
+ *
87
+ * 【为什么按 taskId 重读而不是接一个快照】`runLoop` 会被子代理嵌套调用
88
+ * (`spawnSubagent`),同一个 runner 实例上同时存在两轮运行。用实例字段记
89
+ * 「当前任务」会被嵌套那轮清掉,父轮的权限等待于是静默丢失。按 id 重读没有
90
+ * 这个共享状态,代价是一次读,而权限询问本来就不是热路径。 */
91
+ async markPermissionWait(taskId, permission, patterns, waiting) {
92
+ const store = this.deps.store.task;
93
+ if (!taskId || !store)
94
+ return;
95
+ const blocker = {
96
+ kind: "permission",
97
+ message: `需要你授权才能执行:${permission}${patterns.length ? `(${patterns.join("、")})` : ""}`,
98
+ requiredAction: "在授权卡片上选择允许或拒绝;任务会带着你的决定接着跑。",
99
+ resumable: true,
100
+ };
101
+ try {
102
+ const task = await store.getTask(taskId);
103
+ if (!task || isTerminalStatus(task.status))
104
+ return;
105
+ const updated = await this.casTask(task, waiting ? { status: "waiting_permission", blocker } : { status: "running", blocker: undefined });
106
+ await this.deps.publish(waiting
107
+ ? { type: "task.blocked", data: { taskId: updated.id, revision: updated.revision, blocker } }
108
+ : // 协议里没有 task.resumed;`task.recovery.started` 是唯一表示「任务离开
109
+ // 等待、重新开始推进」的事件,用它并让 message 说清是哪一种。
110
+ { type: "task.recovery.started", data: { taskId: updated.id, revision: updated.revision, message: "授权已处理,继续执行。", attempt: Math.max(1, updated.attemptCount) } }, updated.sessionId);
111
+ }
112
+ catch {
113
+ // 等待状态的记账失败不该打断一次正在跑的工具调用——权限本身已经问出去了,
114
+ // 用户点了允许就该让工具跑。任务状态退化成「running」,是保守的那一侧。
115
+ }
116
+ }
117
+ /** 完成判定用的运行时事实。全部来自本轮可观测结果,**不接受模型自述**。
118
+ *
119
+ * 权限等待不在此列:`beforeToolCall` 里的 `engine.ask()` 会一直挂到用户回复,
120
+ * 所以一次 Attempt 收尾时不会有悬空请求(`engine.dispose()` 也会兜底)。
121
+ * 这里仍读一次实际值,是为了覆盖 abort / 异常路径。
122
+ *
123
+ * 【`task_block` 是这条规则的例外吗】不是。它确实由模型发起,但**内容是结构化
124
+ * 的声明**,不是自述的结论:模型说的是「我缺 X」「请你在 A 和 B 之间选」
125
+ * 「你需要去登录」,而不是「我已完成」。前者是事实的输入(只有模型知道自己在
126
+ * 等什么),后者才是不能采信的东西——完成与否始终由 Completion Gate 按步骤、
127
+ * 验收条件与证据独立判定,模型无法用 task_block 换来一个 delivered。 */
128
+ completionStateOf(outcome, session) {
129
+ // 只有「重试已经耗尽、且错误不是上游抖动」才算真的没救(规格 §10.2)。
130
+ // runLoop 内部已对可重试错误做过 5 次退避重试,能走到这里说明它没救回来。
131
+ const fatal = outcome.state === "failed" && !!outcome.errorMessage && !isRetryableError(outcome.errorMessage);
132
+ // `choice` 与 `input` 都落在 waiting_input,但文案与界面动作不同(§14.2),
133
+ // 所以在这里分派而不是揉成一个字符串。
134
+ const block = outcome.taskBlock;
135
+ return {
136
+ attemptSettled: outcome.settled,
137
+ fatalError: fatal ? outcome.errorMessage : null,
138
+ lastError: outcome.errorMessage,
139
+ unknownSideEffect: outcome.unknownSideEffect ? (outcome.sideEffectDetail ?? "存在结果不确定的操作") : null,
140
+ pendingPermissions: isSessionAwaitingPermission(session.id) ? 1 : 0,
141
+ unsafeReplay: null,
142
+ subagentPending: null, // M3-S22:无协调器时无子代理门禁
143
+ budgetExhausted: null,
144
+ externalAuthRequired: block?.kind === "external_auth" ? { message: block.message, requiredAction: block.requiredAction } : null,
145
+ inputRequired: block?.kind === "input" ? { message: block.message, requiredAction: block.requiredAction } : null,
146
+ choiceRequired: block?.kind === "choice" ? { message: block.message, requiredAction: block.requiredAction } : null,
147
+ unresolvedToolErrors: outcome.toolErrors,
148
+ finalTextPresent: outcome.finalText.trim().length > 0,
149
+ cancelled: outcome.aborted,
150
+ };
151
+ }
152
+ /** 步骤变化 → 事件。粒度按「状态真的变了」算,重放时不会重复累计。 */
153
+ async publishStepEvents(previous, next, sessionId) {
154
+ const before = new Map(previous.map((step) => [step.id, step.status]));
155
+ const completed = next.steps.filter((step) => step.status === "completed").length;
156
+ for (const step of next.steps) {
157
+ if (before.get(step.id) === step.status)
158
+ continue;
159
+ const type = step.status === "completed" ? "task.step.completed" : step.status === "in_progress" ? "task.step.started" : null;
160
+ if (!type)
161
+ continue;
162
+ await this.deps.publish({ type, data: { taskId: next.id, revision: next.revision, stepId: step.id, message: step.title, completedSteps: completed, totalSteps: next.steps.length } }, sessionId);
163
+ }
164
+ if (before.size !== next.steps.length) {
165
+ await this.deps.publish({
166
+ type: "task.plan.updated",
167
+ data: {
168
+ taskId: next.id,
169
+ revision: next.revision,
170
+ goal: next.goal,
171
+ steps: next.steps.map((step) => ({ id: step.id, title: step.title, status: step.status })),
172
+ completedSteps: completed,
173
+ totalSteps: next.steps.length,
174
+ },
175
+ }, sessionId);
176
+ }
177
+ }
178
+ /** 把本轮的可观测事实投影进任务契约:步骤、证据、隐式验收条件、进度指纹。
179
+ *
180
+ * 顺序不能换:证据先于验收条件(条件要引用 evidence id),而指纹最后算
181
+ * (它是对「投影后的完整状态」取摘要)。 */
182
+ async syncTaskFromAttempt(task, outcome, sessionId) {
183
+ const now = new Date().toISOString();
184
+ // 1) 步骤(来自模型的 todo 拆解)
185
+ const steps = outcome.todos
186
+ ? projectTodos({ taskId: task.id, steps: task.steps, todos: outcome.todos, now })
187
+ : task.steps;
188
+ // 2) 证据(只收成功的写/执行/外部核对)
189
+ let evidence = task.evidence;
190
+ const dropped = [];
191
+ for (const candidate of outcome.evidenceCandidates) {
192
+ const appended = appendEvidence({ evidence, kind: candidate.kind, summary: candidate.summary, ...(candidate.ref ? { ref: candidate.ref } : {}), now });
193
+ evidence = appended.evidence;
194
+ dropped.push(...appended.dropped);
195
+ }
196
+ // 2b) 交付声明必须留下可追溯的证据(规格 §9 条件 3 的口子,§9 末段)。
197
+ //
198
+ // 【这里原来是「本轮只要有最终文本就记一条 model_observation」】那条规则把
199
+ // 「文本非空」直接变成了「有证据」,而证据又是条件 3 的输入——两个弱事实串起来
200
+ // 就凑出了一次交付。删掉它之后,纯解释 / 写作 / 问答类任务(没有工具可跑,
201
+ // 最终内容本身是唯一可验证的东西)靠**交付声明**拿到那一条证据:声明里
202
+ // `verification` 至少一条是 schema 强制的,也就是说模型必须先说清「怎么验证的」,
203
+ // 才拿得到这个口子——从「说过话」变成「说清了验证方式」,这是那条放宽能成立的下限。
204
+ //
205
+ // 【ref 固定为 task_deliver】`appendEvidence` 的去重键是 (kind, ref),固定 ref
206
+ // 让重复交付**更新同一条**而不是不断新增。这不是省空间:进度指纹里
207
+ // `criteria.evidenceIds.length` 参与计算,每次交付都新增一条会让「反复交付」
208
+ // 看起来像在推进,no-progress 保护就失效了。
209
+ //
210
+ // 【只在任务没有任何工具证据时补】有工具证据的任务不该靠模型的自述通过验证,
211
+ // 那会让「有证据」重新退化成「说过话」。
212
+ const hasToolEvidence = evidence.some((item) => item.kind !== "model_observation");
213
+ let declarationEvidenceId;
214
+ if (outcome.delivery && !hasToolEvidence) {
215
+ const appended = appendEvidence({
216
+ evidence,
217
+ kind: "model_observation",
218
+ summary: outcome.delivery.verification.join(";").slice(0, 160),
219
+ ref: "task_deliver",
220
+ now,
221
+ });
222
+ evidence = appended.evidence;
223
+ dropped.push(...appended.dropped);
224
+ declarationEvidenceId = evidence.find((item) => item.kind === "model_observation" && item.ref === "task_deliver")?.id;
225
+ }
226
+ // 3) 引用清理 + 验收条件。淘汰证据后必须同步清引用,否则条件会因为
227
+ // 悬空引用永远不满足(Completion Gate 的条件 3 只认能对上号的证据)。
228
+ const prunedSteps = pruneEvidenceRefs(steps, dropped);
229
+ const prunedCriteria = pruneEvidenceRefs(task.acceptanceCriteria, dropped);
230
+ // 验收条件的结论只有一个来源:模型在 `task_deliver` 里的显式声明。此前这里的
231
+ // `projectImplicitCriterion` 会从「模型这轮有没有输出文本」推导出结论——那次
232
+ // 推导就是「一句话停在冒号上也能交付」的成因(见 `plan.ts`)。
233
+ const projection = outcome.delivery
234
+ ? applyDelivery({
235
+ criteria: prunedCriteria,
236
+ delivery: outcome.delivery,
237
+ evidence,
238
+ ...(declarationEvidenceId ? { declarationEvidenceId } : {}),
239
+ observedChanges: outcome.filesEdited,
240
+ })
241
+ : null;
242
+ const acceptanceCriteria = projection?.criteria ?? prunedCriteria;
243
+ // 4) 进度指纹(含本轮的文件改动)
244
+ const projected = { ...task, steps: prunedSteps, evidence, acceptanceCriteria };
245
+ const progress = advanceProgress(projected, { editedFiles: outcome.filesEdited, toolCalls: outcome.toolCalls });
246
+ const updated = await this.casTask(task, {
247
+ steps: prunedSteps,
248
+ evidence,
249
+ acceptanceCriteria,
250
+ ...(projection ? { result: projection.result } : {}),
251
+ lastFingerprint: progress.fingerprint,
252
+ noProgressCount: progress.noProgressCount,
253
+ // 时间预算的累计口径:这一轮实际跑了多久(见 `TaskRecord.activeMs`)。
254
+ // 放在这里而不是 `settleTask`,是因为**每一轮**都要记账——只在结算时记,
255
+ // 一个连跑 20 轮才停的任务会把整段时间全部漏掉,预算永远不触发。
256
+ activeMs: (task.activeMs ?? 0) + outcome.durationMs,
257
+ });
258
+ await this.publishStepEvents(task.steps, updated, sessionId);
259
+ return updated;
260
+ }
261
+ /** 任务进入终态(或阻塞):落库 + 发事件,返回这次 run 的 workflow 状态。
262
+ *
263
+ * blocked 返回 `"completed"` 而不是 `"failed"`:这次运行本身正常结束了,
264
+ * 任务是在等外部动作。返回 failed 会让 workflow 层把它当成运行崩溃处理
265
+ * (还会触发 recovery 路径),那是错的。 */
266
+ async settleTask(task, verdict, session, stats) {
267
+ const now = new Date().toISOString();
268
+ const taskId = task.id;
269
+ if (verdict.status === "delivered") {
270
+ const result = task.result ?? fallbackResult({ task, filesEdited: stats.filesEdited, toolCalls: stats.toolCalls });
271
+ const updated = await this.casTask(task, { status: "delivered", deliveredAt: now, result });
272
+ await this.deps.publish({
273
+ type: "task.delivered",
274
+ data: {
275
+ taskId,
276
+ revision: updated.revision,
277
+ // `result` 是渲染好的文本(通知、复制、旧客户端都在用它);
278
+ // `delivery` 是同一份信息的结构化形态,给交付卡按四问分别渲染。
279
+ // 【为什么两份都给】把结构化数据塞进一个字符串再让客户端解析,是此前
280
+ // 「剩余项」出现两次的原因(`lib/chat-projector.ts` 把整段文本当成
281
+ // `outcome`,四问里剩下的位置自然全空)。发两份比让客户端做字符串解析稳。
282
+ result: renderResult(result),
283
+ delivery: {
284
+ outcome: result.outcome,
285
+ changes: [...result.changes],
286
+ verification: [...result.verification],
287
+ remaining: [...result.remaining],
288
+ },
289
+ // 交付卡上「验收 x/y · 证据 n 条」两个数字的**权威来源**。此前它们
290
+ // 只能靠客户端从 task.started(那一刻的条件永远全是 pending)和证据
291
+ // 数组(事件流里根本没有)拼出来,于是界面上恒显示「验收 0/1 · 证据
292
+ // 0 条」,与实际相反——而这一行恰恰是规格 §18.4 给用户「不必相信这句
293
+ // 完成」的核对依据,一个恒错的核对依据比没有更糟。
294
+ criteria: updated.acceptanceCriteria.map((criterion) => ({
295
+ id: criterion.id,
296
+ description: criterion.description,
297
+ required: criterion.required,
298
+ status: criterion.status,
299
+ })),
300
+ evidenceCount: updated.evidence.length,
301
+ evidenceIds: updated.evidence.map((item) => item.id),
302
+ filesEdited: stats.filesEdited.length,
303
+ toolCalls: stats.toolCalls,
304
+ durationMs: stats.durationMs,
305
+ },
306
+ }, session.id);
307
+ return "completed";
308
+ }
309
+ if (verdict.status === "failed") {
310
+ const updated = await this.casTask(task, { status: "failed" });
311
+ await this.deps.publish({ type: "task.failed", data: { taskId, revision: updated.revision, reason: verdict.reason } }, session.id);
312
+ return "failed";
313
+ }
314
+ if (verdict.status === "cancelled") {
315
+ const updated = await this.casTask(task, { status: "cancelled" });
316
+ await this.deps.publish({ type: "task.cancelled", data: { taskId, revision: updated.revision, reason: verdict.reason } }, session.id);
317
+ return "cancelled";
318
+ }
319
+ // blocked / waiting_*:阻塞种类决定状态,UI 据此给对应按钮(规格 §14.2)
320
+ const status = lifecycleForBlocker(verdict.blocker.kind);
321
+ const updated = await this.casTask(task, { status, blocker: verdict.blocker });
322
+ await this.deps.publish({ type: "task.blocked", data: { taskId, revision: updated.revision, blocker: verdict.blocker } }, session.id);
323
+ return "completed";
324
+ }
325
+ /** 一个持久任务的执行循环(规格 §8.1 总流程)。
326
+ *
327
+ * 【为什么续跑在同一次调用内循环,而不是每轮新建一个 workflow run】
328
+ * 1. lease 与串行队列:任务执行期间必须持有 session 的执行权。每轮重建 run
329
+ * 意味着每轮都要重新 claim/lease,中间会出现「谁都没持有」的窗口——那
330
+ * 正是两个 runner 并行改同一工作区的入口。
331
+ * 2. 规格 §8.2.5 要求「继续使用 session 级串行队列和 lease」,循环是最直接
332
+ * 的实现。轮次计数落在 `TaskRecord.attemptCount` 上,所以进程重启后恢复
333
+ * 扫描仍能知道跑到第几轮。
334
+ *
335
+ * 出口只有两个:任务进入终态,或需要用户/外部动作。单次模型停止、step 上限、
336
+ * 本轮没有工具调用,**都不是**出口(规格 §8.3 逐条列出)。 */
337
+ async runTask(session, input, acceptedUserId) {
338
+ const taskStore = this.deps.store.task;
339
+ // 没有 TaskStore:退化为一次性运行。工具、权限、事件全部照常,只是没有
340
+ // 「跨运行的目标」这层语义——这不是错误路径,而是宿主未启用该能力的降级。
341
+ if (!taskStore)
342
+ return (await this.deps.attemptRunner(session, input, acceptedUserId)).state;
343
+ let task = input.taskId ? await taskStore.getTask(input.taskId) : await taskStore.getActiveTask(session.id);
344
+ if (!task)
345
+ return (await this.deps.attemptRunner(session, input, acceptedUserId)).state;
346
+ // `waiting_*` / `blocked` 意味着「在等用户做一个具体动作」,唯一有权解除它的
347
+ // 是 `resolveTaskForPrompt`——那条新消息本身就是用户动作。这里再挡一道,是因为
348
+ // **排队中的补充消息可能在阻塞之后才被 drain 到**:用户写下它的时候还没看到
349
+ // 阻塞原因,把它当成「已经看过并响应了」会静默清掉用户根本没读到的提示。
350
+ // (那条消息的正文已经并进了 `constraints`,不会丢,用户真正回应时会被带上。)
351
+ if (isWaitingStatus(task.status))
352
+ return "completed";
353
+ const maxAttempts = Math.min(MAX_ATTEMPT_CEILING, Math.max(1, Math.floor(this.deps.taskPolicy?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS)));
354
+ const maxDurationMs = normalizeMaxDurationMs(this.deps.taskPolicy?.maxDurationMs);
355
+ const noProgressPolicy = this.deps.taskPolicy?.noProgress;
356
+ // 从第二轮起,驱动这台机器的是任务自己(`continuation`),不再是「用户按过
357
+ // 按钮」那件事。把 `resume` 摘掉,否则 driveText 会一路走放行话术,掩盖了
358
+ // 真正发生的事(系统在自动续跑)。
359
+ const { resume: _resume, ...strippedInput } = input;
360
+ let attemptInput = input;
361
+ let advisory;
362
+ let continuation = false;
363
+ // 整个任务共用一个循环防护实例(规格 §16 阶段 D「loop-guard 扩展为跨 Attempt」)
364
+ const loopGuard = new LoopGuard();
365
+ let stats = { filesEdited: [], toolCalls: 0, durationMs: 0 };
366
+ while (true) {
367
+ const attemptNumber = task.attemptCount + 1;
368
+ // 时间预算先于轮数预算:两者的消息都指向「看一眼轨迹、确认目标是否要收窄」,
369
+ // 但先报出的应该是**已经烧掉多少时间**——那是用户此刻最需要知道的事实,
370
+ // 而轮数只在所有轮都很快时才成为瓶颈。
371
+ const overTime = durationBudgetBlocker(task, maxDurationMs);
372
+ if (overTime)
373
+ return await this.settleTask(task, { status: "blocked", blocker: overTime }, session, stats);
374
+ if (attemptNumber > maxAttempts) {
375
+ return await this.settleTask(task, {
376
+ status: "blocked",
377
+ blocker: {
378
+ kind: "budget",
379
+ message: `已达单次任务的最大执行轮数(${maxAttempts} 轮)。`,
380
+ requiredAction: "看一眼执行轨迹,确认目标是否需要收窄;确认后可以继续。",
381
+ resumable: true,
382
+ },
383
+ }, session, stats);
384
+ }
385
+ task = await this.casTask(task, { status: "running", attemptCount: attemptNumber, blocker: undefined });
386
+ // 续跑时明确告诉用户「系统在自己接着做」,而不是又开了一轮对话
387
+ if (continuation) {
388
+ await this.deps.publish({ type: "task.recovery.started", data: { taskId: task.id, revision: task.revision, message: advisory ?? "继续推进任务", attempt: attemptNumber } }, session.id);
389
+ }
390
+ const outcome = await this.deps.attemptRunner(session, attemptInput, acceptedUserId, {
391
+ task,
392
+ loopGuard,
393
+ ...(advisory ? { advisory } : {}),
394
+ ...(continuation ? { continuation: true } : {}),
395
+ });
396
+ stats = { filesEdited: outcome.filesEdited, toolCalls: outcome.toolCalls, durationMs: outcome.durationMs };
397
+ task = await this.syncTaskFromAttempt(task, outcome, session.id);
398
+ // 一次 Attempt 结束——**不是**任务完成(规格 §8.3)。UI 只能拿它画轨迹。
399
+ await this.deps.publish({
400
+ type: "task.attempt.finished",
401
+ data: {
402
+ taskId: task.id,
403
+ revision: task.revision,
404
+ attempt: attemptNumber,
405
+ outcome: outcome.aborted ? "aborted" : outcome.state === "failed" ? "error" : "completed",
406
+ toolCalls: outcome.toolCalls,
407
+ filesEdited: outcome.filesEdited.length,
408
+ durationMs: outcome.durationMs,
409
+ },
410
+ }, session.id);
411
+ const verdict = evaluateTaskCompletion(task, this.completionStateOf(outcome, session), noProgressPolicy);
412
+ if (verdict.status !== "continue")
413
+ return await this.settleTask(task, verdict, session, stats);
414
+ // ---- 内部续跑:不创建用户消息,不新建 workflow run ----
415
+ advisory = verdict.advisory;
416
+ continuation = true;
417
+ attemptInput = { ...strippedInput, continuation: { attempt: attemptNumber + 1, ...(advisory ? { advisory } : {}) } };
418
+ // 上一轮是上游抖动的话,立刻重打一次没有意义——给它一个短退避
419
+ if (outcome.state === "failed")
420
+ await new Promise((resolve) => setTimeout(resolve, 1_000));
421
+ }
422
+ }
423
+ }
424
+ //# sourceMappingURL=task-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-lifecycle.js","sourceRoot":"","sources":["../../../src/core/runtime/task-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../../../src/core/session/sqlite-store.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C;;;;;;;;sDAQsD;AAEtD,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;4DAE4D;AAC5D,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG;IAC9C,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,iBAAiB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;IACtD,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD;;0BAEsB;IACtB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B;wBACoB;IACpB,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAqkBxF"}
1
+ {"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../../../src/core/session/sqlite-store.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C;;;;;;;;sDAQsD;AAEtD,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;4DAE4D;AAC5D,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG;IAC9C,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,iBAAiB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;IACtD,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD;;0BAEsB;IACtB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B;wBACoB;IACpB,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAmqBxF"}
@@ -3,6 +3,7 @@ import path from "node:path";
3
3
  import { DatabaseSync } from "node:sqlite";
4
4
  import { randomUUID } from "node:crypto";
5
5
  import { promptHash } from "./workflow.js";
6
+ import { assertSubagentTransition } from "../subagents/types.js";
6
7
  import { frameworkEventSchemas, toPersistedEvent } from "../events/manifest.js";
7
8
  import { newEventId } from "./ids.js";
8
9
  import { searchablePart, searchSnippet } from "./message-search.js";
@@ -92,7 +93,18 @@ export function createSqliteSessionStore(options) {
92
93
  const columns = db.prepare("PRAGMA table_info(messages)").all();
93
94
  if (!columns.some(column => column.name === "message_seq"))
94
95
  db.exec("ALTER TABLE messages ADD COLUMN message_seq INTEGER");
95
- db.exec(`
96
+ db.exec(`CREATE TABLE IF NOT EXISTS subagents (
97
+ child_id TEXT PRIMARY KEY, parent_session_id TEXT NOT NULL, root_task_id TEXT NOT NULL,
98
+ spawn_request_id TEXT NOT NULL, json TEXT NOT NULL, updated_at TEXT NOT NULL
99
+ );
100
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_subagents_spawn ON subagents(parent_session_id, spawn_request_id);
101
+ CREATE INDEX IF NOT EXISTS idx_subagents_root ON subagents(root_task_id);
102
+ CREATE TABLE IF NOT EXISTS subagent_messages (
103
+ message_id TEXT NOT NULL, child_id TEXT NOT NULL, created_at TEXT NOT NULL,
104
+ direction TEXT NOT NULL, json TEXT NOT NULL,
105
+ PRIMARY KEY (child_id, message_id)
106
+ );`);
107
+ db.exec(`CREATE TABLE IF NOT EXISTS compaction_records (session_id TEXT PRIMARY KEY, json TEXT NOT NULL, updated_at TEXT NOT NULL);
96
108
  CREATE TABLE IF NOT EXISTS session_history (session_id TEXT PRIMARY KEY, last_seq INTEGER NOT NULL DEFAULT 0, revision INTEGER NOT NULL DEFAULT 1);
97
109
  CREATE TABLE IF NOT EXISTS schema_migrations (version INTEGER PRIMARY KEY, applied_at TEXT NOT NULL);
98
110
  INSERT INTO session_history(session_id,last_seq) SELECT session_id,COALESCE(MAX(message_seq),0) FROM messages GROUP BY session_id ON CONFLICT(session_id) DO UPDATE SET last_seq=MAX(last_seq,excluded.last_seq);
@@ -351,6 +363,14 @@ export function createSqliteSessionStore(options) {
351
363
  async workflowRuns(sessionId) {
352
364
  return db.prepare("SELECT payload,receipt,status,revision FROM workflow_runs WHERE session_id=? ORDER BY ordinal").all(sessionId).map(row => ({ input: JSON.parse(row.payload), receipt: JSON.parse(row.receipt), status: row.status, revision: row.revision }));
353
365
  },
366
+ async rebuildSnapshot(sessionId) {
367
+ return transaction(() => {
368
+ const entries = readMessages(sessionId);
369
+ const rows = db.prepare("SELECT receipt,status FROM workflow_runs WHERE session_id=?").all(sessionId);
370
+ const excludedUserIds = new Set(rows.filter((row) => row.status !== "completed" && row.status !== "failed").map((row) => JSON.parse(row.receipt).userMessageId));
371
+ return { entries, excludedUserIds };
372
+ });
373
+ },
354
374
  async findPrompt(sessionId, requestId) {
355
375
  const row = db.prepare("SELECT payload,receipt,status,revision FROM workflow_runs WHERE session_id=? AND request_id=?").get(sessionId, requestId);
356
376
  return row ? { input: JSON.parse(row.payload), receipt: JSON.parse(row.receipt), status: row.status, revision: row.revision } : null;
@@ -360,6 +380,95 @@ export function createSqliteSessionStore(options) {
360
380
  // CAS 用 UPDATE ... WHERE revision=? 而不是读改写:读改写在同一连接内
361
381
  // 也挡不住「另一个进程在我读完之后更新过」——而 lease 过期后的双 runner
362
382
  // 竞争正是这条路径最需要防的场景。
383
+ compaction: {
384
+ async get(sessionId) {
385
+ const row = db.prepare("SELECT json FROM compaction_records WHERE session_id=?").get(sessionId);
386
+ return row ? JSON.parse(row.json) : null;
387
+ },
388
+ async put(sessionId, record) {
389
+ transaction(() => {
390
+ db.prepare("INSERT INTO compaction_records(session_id,json,updated_at) VALUES (?,?,?) ON CONFLICT(session_id) DO UPDATE SET json=excluded.json,updated_at=excluded.updated_at").run(sessionId, JSON.stringify(record), record.updatedAt);
391
+ });
392
+ },
393
+ },
394
+ subagents: {
395
+ async createSubagent(record) {
396
+ return transaction(() => {
397
+ const prior = db.prepare("SELECT json FROM subagents WHERE parent_session_id=? AND spawn_request_id=?").get(record.parentSessionId, record.spawnRequestId);
398
+ if (prior)
399
+ return JSON.parse(prior.json);
400
+ db.prepare("INSERT INTO subagents(child_id,parent_session_id,root_task_id,spawn_request_id,json,updated_at) VALUES (?,?,?,?,?,?)").run(record.childId, record.parentSessionId, record.rootTaskId, record.spawnRequestId, JSON.stringify(record), record.times.spawnedAt);
401
+ return record;
402
+ });
403
+ },
404
+ async getSubagent(childId) {
405
+ const row = db.prepare("SELECT json FROM subagents WHERE child_id=?").get(childId);
406
+ return row ? JSON.parse(row.json) : null;
407
+ },
408
+ async findSubagentBySpawnRequest(parentSessionId, spawnRequestId) {
409
+ const row = db.prepare("SELECT json FROM subagents WHERE parent_session_id=? AND spawn_request_id=?").get(parentSessionId, spawnRequestId);
410
+ return row ? JSON.parse(row.json) : null;
411
+ },
412
+ async updateSubagent(childId, expectedRevision, patch) {
413
+ return transaction(() => {
414
+ const row = db.prepare("SELECT json FROM subagents WHERE child_id=?").get(childId);
415
+ if (!row)
416
+ throw new Error("SUBAGENT_NOT_FOUND");
417
+ const current = JSON.parse(row.json);
418
+ if (current.revision !== expectedRevision)
419
+ throw new Error("SUBAGENT_REVISION_CONFLICT");
420
+ if (patch.status)
421
+ assertSubagentTransition(current.status, patch.status);
422
+ const next = { ...current, ...patch, revision: current.revision + 1 };
423
+ db.prepare("UPDATE subagents SET json=?, updated_at=? WHERE child_id=?").run(JSON.stringify(next), new Date().toISOString(), childId);
424
+ return next;
425
+ });
426
+ },
427
+ async listSubagents(filter) {
428
+ let sql = "SELECT json FROM subagents WHERE 1=1";
429
+ const args = [];
430
+ if (filter.parentSessionId) {
431
+ sql += " AND parent_session_id=?";
432
+ args.push(filter.parentSessionId);
433
+ }
434
+ if (filter.rootTaskId) {
435
+ sql += " AND root_task_id=?";
436
+ args.push(filter.rootTaskId);
437
+ }
438
+ const rows = db.prepare(sql).all(...args);
439
+ let list = rows.map((r) => JSON.parse(r.json));
440
+ if (filter.statuses)
441
+ list = list.filter((r) => filter.statuses.includes(r.status));
442
+ return list.sort((a, b) => a.times.spawnedAt.localeCompare(b.times.spawnedAt));
443
+ },
444
+ async appendMessage(message) {
445
+ transaction(() => {
446
+ db.prepare("INSERT OR IGNORE INTO subagent_messages(message_id,child_id,created_at,direction,json) VALUES (?,?,?,?,?)").run(message.messageId, message.childId, message.createdAt, message.direction, JSON.stringify(message));
447
+ });
448
+ },
449
+ async listMessages(childId, options) {
450
+ let sql = "SELECT json FROM subagent_messages WHERE child_id=?";
451
+ const args = [childId];
452
+ if (options?.sinceCreatedAt) {
453
+ sql += " AND created_at>?";
454
+ args.push(options.sinceCreatedAt);
455
+ }
456
+ const rows = db.prepare(sql + " ORDER BY created_at").all(...args);
457
+ return rows.map((r) => JSON.parse(r.json));
458
+ },
459
+ async markMessagesConsumedByParent(childId, upToCreatedAt) {
460
+ transaction(() => {
461
+ const rows = db.prepare("SELECT json FROM subagent_messages WHERE child_id=? AND created_at<=?").all(childId, upToCreatedAt);
462
+ for (const row of rows) {
463
+ const msg = JSON.parse(row.json);
464
+ if (!msg.consumedByParent) {
465
+ msg.consumedByParent = true;
466
+ db.prepare("UPDATE subagent_messages SET json=? WHERE child_id=? AND message_id=?").run(JSON.stringify(msg), childId, msg.messageId);
467
+ }
468
+ }
469
+ });
470
+ },
471
+ },
363
472
  task: {
364
473
  async createTask(input) {
365
474
  return transaction(() => {