@zhushanwen/subagent-core 0.8.0 → 0.9.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 (167) hide show
  1. package/dist/{chunk-OL5BK4VN.js → chunk-LZJOEDGQ.js} +455 -203
  2. package/dist/engine-discovery-scan-Da4Dkzsi.d.cts +818 -0
  3. package/dist/engine-discovery-scan-Da4Dkzsi.d.ts +818 -0
  4. package/dist/execution/engine/engine-discovery-scan.cjs +216 -155
  5. package/dist/execution/engine/engine-discovery-scan.d.cts +1 -2
  6. package/dist/execution/engine/engine-discovery-scan.d.ts +1 -2
  7. package/dist/execution/engine/engine-discovery-scan.js +1 -1
  8. package/dist/execution/relay-env.js +5 -4
  9. package/dist/index.cjs +7686 -5894
  10. package/dist/index.d.cts +1876 -1360
  11. package/dist/index.d.ts +1876 -1360
  12. package/dist/index.js +7048 -5493
  13. package/dist.bundle/index.cjs +7747 -5957
  14. package/package.json +4 -4
  15. package/src/__tests__/manifest-store.test.ts +16 -15
  16. package/src/__tests__/robustness-medium-batch1.test.ts +10 -14
  17. package/src/__tests__/robustness-medium-batch2.test.ts +7 -2
  18. package/src/execution/__tests__/alive-store.test.ts +117 -1
  19. package/src/execution/__tests__/batch-finalized.test.ts +206 -0
  20. package/src/execution/__tests__/chat-engine-routing.test.ts +117 -1
  21. package/src/execution/__tests__/{cold-resurrect.test.ts → cold-lookup.test.ts} +133 -33
  22. package/src/execution/__tests__/collect-coordinator-service.test.ts +7 -5
  23. package/src/execution/__tests__/conversation-continuation.test.ts +1452 -0
  24. package/src/execution/__tests__/delivery-methods.test.ts +90 -176
  25. package/src/execution/__tests__/dialog-queue.test.ts +70 -3
  26. package/src/execution/__tests__/dispose-manifest-recovery.test.ts +475 -0
  27. package/src/execution/__tests__/execute-and-await-worktree.test.ts +3 -3
  28. package/src/execution/__tests__/execute-nesting.test.ts +8 -5
  29. package/src/execution/__tests__/execution-record.test.ts +8 -148
  30. package/src/execution/__tests__/finalize-record.test.ts +295 -129
  31. package/src/execution/__tests__/get-record-for-action-restart.test.ts +21 -29
  32. package/src/execution/__tests__/helpers/fake-engine-port.ts +13 -68
  33. package/src/execution/__tests__/helpers/legacy-sidecar.ts +33 -0
  34. package/src/execution/__tests__/helpers/subagent-service-mocks.ts +9 -5
  35. package/src/execution/__tests__/idle-gc.test.ts +60 -0
  36. package/src/execution/__tests__/lifecycle-manager.test.ts +3 -254
  37. package/src/execution/__tests__/manifest-store-tmp-recovery.test.ts +43 -22
  38. package/src/execution/__tests__/model-config-service.test.ts +111 -0
  39. package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +10 -6
  40. package/src/execution/__tests__/notify-ledger.test.ts +42 -1
  41. package/src/execution/__tests__/rebuild-indexes.test.ts +329 -0
  42. package/src/execution/__tests__/record-binding.test.ts +613 -0
  43. package/src/execution/__tests__/record-origin.test.ts +318 -0
  44. package/src/execution/__tests__/record-store-intent-api.test.ts +600 -0
  45. package/src/execution/__tests__/record-store-orphan-revive.test.ts +71 -3
  46. package/src/execution/__tests__/record-store.test.ts +72 -54
  47. package/src/execution/__tests__/recursive-visibility-baseline.test.ts +8 -5
  48. package/src/execution/__tests__/round-supervisor-workflow-origin.test.ts +205 -0
  49. package/src/execution/__tests__/run-orchestration-write-lease.test.ts +293 -0
  50. package/src/execution/__tests__/run-orchestration.test.ts +199 -0
  51. package/src/execution/__tests__/session-file-gc.test.ts +35 -4
  52. package/src/execution/__tests__/session-reconstructor.test.ts +78 -0
  53. package/src/execution/__tests__/state-marker.test.ts +288 -0
  54. package/src/execution/__tests__/stream-sink-retirement.test.ts +8 -5
  55. package/src/execution/__tests__/subagent-actions-core.test.ts +67 -16
  56. package/src/execution/__tests__/subagent-service-multiproc-guard.test.ts +0 -1
  57. package/src/execution/__tests__/subagent-service-notify-gate.test.ts +27 -11
  58. package/src/execution/__tests__/subagent-service-parent-guard.test.ts +17 -11
  59. package/src/execution/__tests__/subagent-service-recovery-bounds.test.ts +130 -53
  60. package/src/execution/__tests__/subagent-service.test.ts +17 -215
  61. package/src/execution/__tests__/subprocess-agent-runner-no-progress-killall.test.ts +138 -0
  62. package/src/execution/__tests__/subprocess-agent-runner.test.ts +105 -660
  63. package/src/execution/__tests__/sync-collect-recovery.test.ts +23 -16
  64. package/src/execution/__tests__/terminal-write-latency.test.ts +79 -0
  65. package/src/execution/__tests__/workflow-agent-dispatch.test.ts +782 -0
  66. package/src/execution/alive-store.ts +37 -28
  67. package/src/execution/{cold-resurrect.ts → cold-lookup.ts} +48 -45
  68. package/src/execution/config.ts +1 -1
  69. package/src/execution/conversation-continuation.ts +541 -0
  70. package/src/execution/dialog-queue.ts +60 -12
  71. package/src/execution/engine/__tests__/common/capability-gate.test.ts +1 -1
  72. package/src/execution/engine/__tests__/common/journal-wiring.test.ts +16 -1
  73. package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/fake-engine-protocol.mjs +17 -51
  74. package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/smoke-run.fixture.json +0 -5
  75. package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +1 -1
  76. package/src/execution/engine/__tests__/conformance/protocol-blackbox.test.ts +5 -9
  77. package/src/execution/engine/__tests__/engine-discovery-scan.test.ts +0 -3
  78. package/src/execution/engine/__tests__/engine-discovery.test.ts +0 -3
  79. package/src/execution/engine/__tests__/model-prompt.test.ts +0 -3
  80. package/src/execution/engine/__tests__/registry.test.ts +0 -1
  81. package/src/execution/engine/__tests__/routing.test.ts +0 -1
  82. package/src/execution/engine/__tests__/run-failure-worktree-cleanup.test.ts +0 -3
  83. package/src/execution/engine/client/__tests__/__fixtures__/fake-engine.mjs +0 -3
  84. package/src/execution/engine/client/__tests__/engine-client-reap.test.ts +212 -0
  85. package/src/execution/engine/client/__tests__/mirror.test.ts +73 -1
  86. package/src/execution/engine/client/__tests__/protocol-closure.test.ts +2 -9
  87. package/src/execution/engine/client/__tests__/remote-engine.test.ts +46 -12
  88. package/src/execution/engine/client/engine-client.ts +81 -25
  89. package/src/execution/engine/client/mirror.ts +9 -0
  90. package/src/execution/engine/client/remote-engine.ts +52 -34
  91. package/src/execution/engine/client/reverse-router.ts +6 -27
  92. package/src/execution/engine/common/__tests__/run-signals.test.ts +79 -0
  93. package/src/execution/engine/common/capability-gate.ts +27 -0
  94. package/src/execution/engine/common/data-dir.ts +3 -2
  95. package/src/execution/engine/common/errors.ts +1 -1
  96. package/src/execution/engine/common/journal-wiring.ts +18 -9
  97. package/src/execution/engine/common/run-signals.ts +83 -0
  98. package/src/execution/engine/d8-compat.ts +1 -1
  99. package/src/execution/engine/host/__tests__/host-bridge.test.ts +3 -18
  100. package/src/execution/engine/host/host-bridge.ts +19 -41
  101. package/src/execution/engine/host/pi-host-binding.ts +5 -5
  102. package/src/execution/engine/port.ts +34 -54
  103. package/src/execution/engine/types.ts +11 -14
  104. package/src/execution/execution-record.ts +15 -47
  105. package/src/execution/finalize-record.ts +94 -197
  106. package/src/execution/idle-gc.ts +9 -3
  107. package/src/execution/lifecycle-manager.ts +25 -361
  108. package/src/execution/lifecycle-predicates.ts +22 -19
  109. package/src/execution/manifest-store.ts +40 -42
  110. package/src/execution/model-config-service.ts +1 -1
  111. package/src/execution/notifier.ts +39 -1
  112. package/src/execution/notify-host.ts +13 -4
  113. package/src/execution/record-entry.ts +20 -2
  114. package/src/execution/record-store.ts +925 -160
  115. package/src/execution/relay-env.ts +8 -3
  116. package/src/execution/round-supervisor/domain.ts +17 -5
  117. package/src/execution/round-supervisor/service-binding.test.ts +89 -53
  118. package/src/execution/round-supervisor/service-binding.ts +71 -21
  119. package/src/execution/round-supervisor/supervisor.ts +23 -9
  120. package/src/execution/service/record-access.ts +547 -0
  121. package/src/execution/service/record-lifecycle.ts +542 -0
  122. package/src/execution/service/run-orchestration.ts +1647 -0
  123. package/src/execution/service/service-bootstrap.ts +111 -0
  124. package/src/execution/service/service-constants.ts +27 -0
  125. package/src/execution/service/session-baselines.ts +401 -0
  126. package/src/execution/service/sync-collect-domain.ts +442 -0
  127. package/src/execution/service/workflow-dispatch.ts +567 -0
  128. package/src/execution/session-file-gc.ts +11 -8
  129. package/src/execution/session-reconstructor.ts +44 -1
  130. package/src/execution/sessions-index.ts +20 -3
  131. package/src/execution/settled-watchdog.ts +86 -43
  132. package/src/execution/state-marker.ts +516 -0
  133. package/src/execution/stream-sink.ts +1 -1
  134. package/src/execution/subagent-actions-core.ts +53 -31
  135. package/src/execution/subagent-service.ts +643 -2980
  136. package/src/execution/subprocess-agent-runner.ts +46 -323
  137. package/src/execution/types.ts +60 -43
  138. package/src/execution/ui-request-handler-factory.ts +5 -0
  139. package/src/execution/worktree-manager.ts +1 -1
  140. package/src/execution/worktree-registry.ts +1 -1
  141. package/src/index.ts +6 -5
  142. package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +2 -3
  143. package/src/orchestration/__tests__/agent-call-stream.test.ts +24 -49
  144. package/src/orchestration/__tests__/error-recovery-terminal-hardening.test.ts +4 -4
  145. package/src/orchestration/__tests__/file-run-store.test.ts +5 -7
  146. package/src/orchestration/__tests__/lifecycle-abort-broadcast-signal.test.ts +2 -3
  147. package/src/orchestration/__tests__/run-snapshot.test.ts +27 -43
  148. package/src/orchestration/__tests__/worker-message-pump-workflow-dispatch.test.ts +274 -0
  149. package/src/orchestration/execute-agent-call.ts +1 -1
  150. package/src/orchestration/file-run-store.ts +1 -1
  151. package/src/orchestration/models/ports.ts +20 -13
  152. package/src/orchestration/models/types.ts +11 -13
  153. package/src/orchestration/run-snapshot.ts +18 -22
  154. package/src/orchestration/worker-message-pump.ts +33 -57
  155. package/src/shared/atomic-write.ts +10 -8
  156. package/dist/chunk-T2SYBW3I.js +0 -24
  157. package/dist/engine-discovery-scan-BXLA8y-z.d.cts +0 -1624
  158. package/dist/engine-discovery-scan-BXLA8y-z.d.ts +0 -1624
  159. package/src/execution/__tests__/chat-round-first-round-watchdog.test.ts +0 -255
  160. package/src/execution/__tests__/finalized-marker.test.ts +0 -104
  161. package/src/execution/__tests__/lifecycle-manager-lock.test.ts +0 -211
  162. package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +0 -488
  163. package/src/execution/__tests__/subprocess-agent-runner-timeout.test.ts +0 -75
  164. package/src/execution/__tests__/tombstone-store.test.ts +0 -73
  165. package/src/execution/engine/__tests__/conformance/chat-round-protocol.test.ts +0 -230
  166. package/src/execution/finalized-marker.ts +0 -70
  167. package/src/execution/tombstone-store.ts +0 -72
@@ -10,12 +10,10 @@ import {
10
10
  getCurrentActivity,
11
11
  getEventLog,
12
12
  getFullText,
13
- getFullTextFrom,
14
13
  getTotalUsage,
15
14
  jsonlToAgentEvent,
16
15
  markReconstructedStatus,
17
16
  resurrectClosed,
18
- nextRoundBaseTurnIndex,
19
17
  deriveOutcome,
20
18
  projectOutcome,
21
19
  project,
@@ -589,150 +587,9 @@ describe("getFullText", () => {
589
587
  });
590
588
 
591
589
  // ============================================================
592
- // getFullTextFrom 增量文本派生(round-base-increment wave1)
593
- // ============================================================
594
- describe("getFullTextFrom", () => {
595
- it("C1TC2: from=0 与 getFullText 逐字节等价(fresh / 单 turn / 多 turn 混空 turn 三形态)", () => {
596
- // 形态 1:fresh record(turns=[emptyTurn()])
597
- const fresh = makeRecord();
598
- expect(getFullTextFrom(fresh, 0)).toBe(getFullText(fresh));
599
- expect(getFullTextFrom(fresh, 0)).toBe("");
600
-
601
- // 形态 2:单 turn 有文本
602
- const single = makeRecord();
603
- updateFromEvent(single, { type: "text_delta", delta: "Hello world" });
604
- expect(getFullTextFrom(single, 0)).toBe(getFullText(single));
605
- expect(getFullTextFrom(single, 0)).toBe("Hello world");
606
-
607
- // 形态 3:多 turn 混空 turn(closed 空 turn + 空白串 turn + 未闭合尾 turn)
608
- const mixed = makeRecord();
609
- updateFromEvent(mixed, { type: "text_delta", delta: "Turn 1" });
610
- updateFromEvent(mixed, { type: "turn_end" });
611
- updateFromEvent(mixed, { type: "turn_end" }); // 空 turn 2(closed)
612
- updateFromEvent(mixed, { type: "text_delta", delta: " " }); // 空白串 turn 3
613
- updateFromEvent(mixed, { type: "turn_end" });
614
- updateFromEvent(mixed, { type: "text_delta", delta: "Turn 4" }); // 未闭合尾 turn
615
- expect(getFullTextFrom(mixed, 0)).toBe(getFullText(mixed));
616
- expect(getFullTextFrom(mixed, 0)).toBe("Turn 1\n\n \n\nTurn 4");
617
- });
618
-
619
- it("C1TC3: 多 turn 单轮增量——from=1 只含 Turn 2,对照全量含 Turn 1\\n\\nTurn 2", () => {
620
- const r = makeRecord();
621
- updateFromEvent(r, { type: "text_delta", delta: "Turn 1" });
622
- updateFromEvent(r, { type: "turn_end" });
623
- updateFromEvent(r, { type: "text_delta", delta: "Turn 2" });
624
- expect(getFullTextFrom(r, 1)).toBe("Turn 2");
625
- // 对照:全量 vs 增量差异锁定
626
- expect(getFullText(r)).toBe("Turn 1\n\nTurn 2");
627
- });
628
-
629
- it("C1TC4: 空文本轮过滤(join 不多出空段)+ 空白串按非空计入增量", () => {
630
- // turns: ["A"(closed), ""(closed), " "(closed), "B"(open)]
631
- const r = makeRecord();
632
- updateFromEvent(r, { type: "text_delta", delta: "A" });
633
- updateFromEvent(r, { type: "turn_end" });
634
- updateFromEvent(r, { type: "turn_end" }); // 空 turn(closed)
635
- updateFromEvent(r, { type: "text_delta", delta: " " });
636
- updateFromEvent(r, { type: "turn_end" });
637
- updateFromEvent(r, { type: "text_delta", delta: "B" });
638
- // from=2 起:空 turn 在 from 之前不参与;" " 按非空处理计入增量(filter 判据与 getFullText 逐字对齐)
639
- expect(getFullTextFrom(r, 2)).toBe(" \n\nB");
640
- // 空 turn 过滤:from=0 时不产出空段(join 不多出 \n\n 空段)
641
- expect(getFullTextFrom(r, 0)).toBe("A\n\n \n\nB");
642
- });
643
-
644
- it("C1TC5: from >= turns.length 越界返回空串(不抛错、不回绕)", () => {
645
- const r = makeRecord();
646
- updateFromEvent(r, { type: "text_delta", delta: "Turn 1" });
647
- updateFromEvent(r, { type: "turn_end" });
648
- updateFromEvent(r, { type: "text_delta", delta: "Turn 2" });
649
- expect(getFullTextFrom(r, r.turns.length)).toBe("");
650
- expect(getFullTextFrom(r, r.turns.length + 5)).toBe("");
651
- });
652
-
653
- it("C1TC6: from 为负规范化为 0(与 from=0 / getFullText 等价,无 slice 负偏移语义)", () => {
654
- const r = makeRecord();
655
- updateFromEvent(r, { type: "text_delta", delta: "Turn 1" });
656
- updateFromEvent(r, { type: "turn_end" });
657
- updateFromEvent(r, { type: "text_delta", delta: "Turn 2" });
658
- expect(getFullTextFrom(r, -1)).toBe(getFullTextFrom(r, 0));
659
- expect(getFullTextFrom(r, -100)).toBe(getFullText(r));
660
- expect(getFullTextFrom(r, -100)).toBe("Turn 1\n\nTurn 2");
661
- });
662
- });
663
-
664
- // ============================================================
665
- // nextRoundBaseTurnIndex — 轮次边界推进公式(round-base-increment wave1)
666
- // ============================================================
667
- describe("nextRoundBaseTurnIndex", () => {
668
- it("C1TC7: 全闭合推进 length / fresh record([emptyTurn()] 单未闭合空 turn)返回 0", () => {
669
- // 全闭合:2 个 closed turn → length
670
- const r = makeRecord();
671
- updateFromEvent(r, { type: "text_delta", delta: "Turn 1" });
672
- updateFromEvent(r, { type: "turn_end" });
673
- updateFromEvent(r, { type: "text_delta", delta: "Turn 2" });
674
- updateFromEvent(r, { type: "turn_end" });
675
- expect(r.turns.length).toBe(2);
676
- expect(nextRoundBaseTurnIndex(r)).toBe(2);
677
-
678
- // fresh 形态(createRecord:turns=[emptyTurn()] 单个未闭合空 turn)→ 0(ES6 重建回退语义)
679
- const fresh = createRecord("fresh-1", {
680
- agent: "worker",
681
- model: "test-model",
682
- thinkingLevel: undefined,
683
- mode: "background",
684
- task: "t",
685
- slug: "t",
686
- startedAt: 1000,
687
- rootSessionId: "sess-main",
688
- parentRecordId: undefined,
689
- depth: 0,
690
- });
691
- expect(fresh.turns).toHaveLength(1);
692
- expect(nextRoundBaseTurnIndex(fresh)).toBe(0);
693
- });
694
-
695
- it("C1TC8 ⛔ ES1 探针: 滞后空 turn(防御分支)边界不丢下轮首段文本", () => {
696
- // 防御分支构造(pi 现事件序下不可达——带 usage 的 message_end 恒先于 turn_end;探针
697
- // 按防御分支构造仍有效,锁住公式在滞后交错下的正确性,防 pi 未来事件序变化)。
698
- // 两层 usage 守卫:session-runner.ts 转发层 if (msg?.usage)(bare message_end 不转发)
699
- // + execution-record.ts 累积层 if (event.usage)(bare message_end 不开 turn)——
700
- // 故本探针的 message_end 必须携带 usage(如 { input: 10, output: 5, cacheRead: 0, cacheWrite: 0 })才能开出空 turn。
701
- const r = makeRecord();
702
- updateFromEvent(r, { type: "text_delta", delta: "R1" });
703
- updateFromEvent(r, { type: "turn_end" }); // 闭合本轮
704
- updateFromEvent(r, {
705
- type: "message_end",
706
- usage: { input: 10, output: 5, cacheRead: 0, cacheWrite: 0 },
707
- }); // 滞后 message_end 开新空 turn
708
- expect(r.turns.length).toBe(2);
709
- expect(r.turns[1]!.closed).toBe(false);
710
- expect(r.turns[1]!.text).toBe("");
711
-
712
- // 推进:滞后空 turn 不计入边界(turns.length - 1,留在下一轮增量内)
713
- const base = nextRoundBaseTurnIndex(r);
714
- expect(base).toBe(1);
715
-
716
- // 新轮 text_delta 复用该空 turn → 文本落在增量范围内,不丢
717
- updateFromEvent(r, { type: "text_delta", delta: "R2" });
718
- expect(r.turns.length).toBe(2); // 复用,未新开
719
- expect(getFullTextFrom(r, base)).toBe("R2");
720
-
721
- // 对照组:若直用 turns.length 推进,R2 被挤出 slice——被防住的丢文本负面行为锁定
722
- expect(getFullTextFrom(r, r.turns.length)).toBe("");
723
- });
724
-
725
- it("C1TC9: 末 turn 未闭合且非空计入本轮(防御形态公式锁定,R1 观测哨触发条件)", () => {
726
- // pi 现序不可达(agent_settled 在 agent_end 之后,error/aborted 也先 emit turn_end);
727
- // 构造该防御形态锁死公式行为:非空文本计入本轮增量、不 defer 到下轮。
728
- const r = makeRecord();
729
- updateFromEvent(r, { type: "text_delta", delta: "Turn 1" });
730
- updateFromEvent(r, { type: "turn_end" });
731
- updateFromEvent(r, { type: "text_delta", delta: "Unclosed tail" }); // 未闭合非空尾 turn
732
- expect(nextRoundBaseTurnIndex(r)).toBe(r.turns.length);
733
- expect(nextRoundBaseTurnIndex(r)).toBe(2);
734
- });
735
- });
590
+ // [H1 U6 / D7 ③] getFullTextFrom / nextRoundBaseTurnIndex 用例族随 base 死记账退役删除
591
+ //(生产消费面 onRoundSettled / settleChatRoundFromResponse 已删除,字段 roundBaseTurnIndex
592
+ // 一并清理——退役不迁移,防丢文本语义由 record.result 恒写承接)。
736
593
 
737
594
  // ============================================================
738
595
  // getAllToolCalls / getTotalUsage — 聚合派生
@@ -1346,11 +1203,14 @@ describe("createRecord 引擎留痕字段(P4)", () => {
1346
1203
  // jsonlToAgentEvent — subprocess JSONL → AgentEvent 翻译
1347
1204
  // ============================================================
1348
1205
  describe("jsonlToAgentEvent(JSONL → AgentEvent 翻译)", () => {
1349
- it("不映射类型(session/message_start/turn_start/tool_execution_update)→ 空数组", () => {
1206
+ it("不映射类型(session/message_start/turn_start)→ 空数组", () => {
1350
1207
  expect(jsonlToAgentEvent({ type: "session" })).toEqual([]);
1351
1208
  expect(jsonlToAgentEvent({ type: "message_start" })).toEqual([]);
1352
1209
  expect(jsonlToAgentEvent({ type: "turn_start" })).toEqual([]);
1353
- expect(jsonlToAgentEvent({ type: "tool_execution_update" })).toEqual([]);
1210
+ });
1211
+
1212
+ it("tool_execution_update → activity(纯活性信号,与 pi 侧 TOOL_ACTIVITY_EVENT 同语义)", () => {
1213
+ expect(jsonlToAgentEvent({ type: "tool_execution_update" })).toEqual([{ type: "activity" }]);
1354
1214
  });
1355
1215
 
1356
1216
  it("未知类型 → 空数组(落空语义)", () => {