@zhushanwen/pi-subagent-workflow 8.6.0 → 8.7.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 (347) hide show
  1. package/package.json +9 -13
  2. package/relay/relay.mjs +1 -1
  3. package/src/host/__tests__/pi-host.test.ts +214 -0
  4. package/src/host/pi-host.ts +109 -0
  5. package/src/index.ts +89 -32
  6. package/src/injectors/__tests__/engine-awareness.test.ts +292 -0
  7. package/src/injectors/__tests__/engine-section-stability.test.ts +341 -0
  8. package/src/injectors/__tests__/subagent-list-injector.test.ts +5 -5
  9. package/src/injectors/__tests__/workflow-list-injector.test.ts +5 -5
  10. package/src/injectors/engine-awareness.ts +123 -0
  11. package/src/injectors/model-list-injector.ts +1 -1
  12. package/src/injectors/subagent-list-injector.ts +8 -8
  13. package/src/injectors/workflow-list-injector.ts +8 -8
  14. package/src/interface/__tests__/detectors.test.ts +3 -3
  15. package/src/interface/__tests__/subagent-tool-path-guard.test.ts +2 -2
  16. package/src/interface/__tests__/tool-workflow-script-generate.test.ts +2 -2
  17. package/src/interface/__tests__/tool-workflow-throw-paths.test.ts +1 -1
  18. package/src/interface/bg-notify-render.ts +4 -4
  19. package/src/interface/commands.ts +3 -3
  20. package/src/interface/format.ts +2 -2
  21. package/src/interface/helpers.ts +1 -1
  22. package/src/interface/list-component.ts +4 -4
  23. package/src/interface/list-shared.ts +2 -2
  24. package/src/interface/list-view.ts +2 -2
  25. package/src/interface/subagent-actions.ts +263 -11
  26. package/src/interface/subagent-tool-schema.ts +20 -13
  27. package/src/interface/subagent-tool.ts +11 -6
  28. package/src/interface/subagents.ts +3 -3
  29. package/src/interface/tool-render.ts +34 -2
  30. package/src/interface/tool-workflow-script.ts +4 -4
  31. package/src/interface/tool-workflow.ts +6 -6
  32. package/src/interface/views/WorkflowsView.ts +5 -5
  33. package/src/interface/views/__tests__/WorkflowsView-signature.test.ts +3 -3
  34. package/src/interface/views/__tests__/detail-content-session-file.test.ts +2 -2
  35. package/src/interface/views/detail-content.ts +4 -4
  36. package/src/interface/views/format.ts +4 -4
  37. package/src/{orchestration/jsonl-run-store.ts → jsonl-run-store.ts} +11 -11
  38. package/src/execution/__tests__/__fixtures__/notifier-golden-snapshots.json +0 -53
  39. package/src/execution/__tests__/__fixtures__/truncline.snapshot.json +0 -1
  40. package/src/execution/__tests__/agent-registry.test.ts +0 -363
  41. package/src/execution/__tests__/agent-result-mapper.test.ts +0 -150
  42. package/src/execution/__tests__/alive-store.test.ts +0 -147
  43. package/src/execution/__tests__/ask-user-transit-e2e.test.ts +0 -490
  44. package/src/execution/__tests__/before-agent-start-injection.test.ts +0 -132
  45. package/src/execution/__tests__/bg-notify-render.test.ts +0 -329
  46. package/src/execution/__tests__/channel-registry-handshake.test.ts +0 -243
  47. package/src/execution/__tests__/chat-engine-routing.test.ts +0 -601
  48. package/src/execution/__tests__/chatmode-first-round-closure-service.test.ts +0 -365
  49. package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +0 -190
  50. package/src/execution/__tests__/chatmode-round-notify-real-chain.test.ts +0 -215
  51. package/src/execution/__tests__/concurrency-pool.test.ts +0 -250
  52. package/src/execution/__tests__/config.test.ts +0 -110
  53. package/src/execution/__tests__/conversation-wiring.test.ts +0 -198
  54. package/src/execution/__tests__/crash-recovery.test.ts +0 -320
  55. package/src/execution/__tests__/delivery-methods.test.ts +0 -422
  56. package/src/execution/__tests__/dialog-queue.test.ts +0 -299
  57. package/src/execution/__tests__/epipe-fallback.test.ts +0 -241
  58. package/src/execution/__tests__/execute-and-await-worktree.test.ts +0 -243
  59. package/src/execution/__tests__/execute-nesting.test.ts +0 -323
  60. package/src/execution/__tests__/execute-options-mapper.test.ts +0 -200
  61. package/src/execution/__tests__/execution-record.test.ts +0 -1394
  62. package/src/execution/__tests__/explicit-agent-ref-guard.test.ts +0 -171
  63. package/src/execution/__tests__/finalize-record.test.ts +0 -368
  64. package/src/execution/__tests__/finalized-marker.test.ts +0 -82
  65. package/src/execution/__tests__/format-schema-instruction.test.ts +0 -169
  66. package/src/execution/__tests__/format.test.ts +0 -458
  67. package/src/execution/__tests__/gc-timer.test.ts +0 -184
  68. package/src/execution/__tests__/get-record-for-action-restart.test.ts +0 -254
  69. package/src/execution/__tests__/gui-mode-dispatch.test.ts +0 -59
  70. package/src/execution/__tests__/helpers/mock-extension-api.ts +0 -30
  71. package/src/execution/__tests__/helpers/spawn-mock.ts +0 -242
  72. package/src/execution/__tests__/host-mode.test.ts +0 -87
  73. package/src/execution/__tests__/index-session-start-identity.test.ts +0 -371
  74. package/src/execution/__tests__/index-session-start.test.ts +0 -672
  75. package/src/execution/__tests__/lifecycle-manager-lock.test.ts +0 -211
  76. package/src/execution/__tests__/lifecycle-manager.test.ts +0 -383
  77. package/src/execution/__tests__/lifecycle-predicates.test.ts +0 -116
  78. package/src/execution/__tests__/list-component.test.ts +0 -401
  79. package/src/execution/__tests__/list-fields.test.ts +0 -140
  80. package/src/execution/__tests__/manifest-parentid.test.ts +0 -117
  81. package/src/execution/__tests__/model-resolver.test.ts +0 -465
  82. package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +0 -287
  83. package/src/execution/__tests__/nested-visibility.test.ts +0 -325
  84. package/src/execution/__tests__/notifier-flush.test.ts +0 -612
  85. package/src/execution/__tests__/notifier-golden-snapshot.test.ts +0 -261
  86. package/src/execution/__tests__/notify-ledger.test.ts +0 -826
  87. package/src/execution/__tests__/one-shot-upgrade.test.ts +0 -205
  88. package/src/execution/__tests__/output-collector.test.ts +0 -358
  89. package/src/execution/__tests__/parent-child-matrix.test.ts +0 -336
  90. package/src/execution/__tests__/path-encoding.test.ts +0 -104
  91. package/src/execution/__tests__/pi-invocation.test.ts +0 -134
  92. package/src/execution/__tests__/record-store.test.ts +0 -1057
  93. package/src/execution/__tests__/records-cwd-isolation.test.ts +0 -91
  94. package/src/execution/__tests__/recursive-visibility-baseline.test.ts +0 -339
  95. package/src/execution/__tests__/recursive-visibility-env.test.ts +0 -273
  96. package/src/execution/__tests__/relay-agent.test.ts +0 -448
  97. package/src/execution/__tests__/relay-env.test.ts +0 -42
  98. package/src/execution/__tests__/resource-policy.test.ts +0 -109
  99. package/src/execution/__tests__/rpc-mode.test.ts +0 -89
  100. package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +0 -267
  101. package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +0 -253
  102. package/src/execution/__tests__/run-spawn-edges.test.ts +0 -687
  103. package/src/execution/__tests__/run-spawn-integration.test.ts +0 -933
  104. package/src/execution/__tests__/run-spawn-resume.test.ts +0 -322
  105. package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +0 -196
  106. package/src/execution/__tests__/run-spawn-stdout-callback-throw.test.ts +0 -199
  107. package/src/execution/__tests__/sdk-contract.test.ts +0 -273
  108. package/src/execution/__tests__/session-context-resolver.test.ts +0 -167
  109. package/src/execution/__tests__/session-file-gc.test.ts +0 -293
  110. package/src/execution/__tests__/session-pending.test.ts +0 -197
  111. package/src/execution/__tests__/session-reconstructor.test.ts +0 -379
  112. package/src/execution/__tests__/session-runner-epipe.test.ts +0 -178
  113. package/src/execution/__tests__/session-runner-schema-env.test.ts +0 -350
  114. package/src/execution/__tests__/session-start-reaper.test.ts +0 -233
  115. package/src/execution/__tests__/spawn-args.test.ts +0 -445
  116. package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +0 -189
  117. package/src/execution/__tests__/spawn-event-adapter.test.ts +0 -167
  118. package/src/execution/__tests__/spawn-worktree-guidance.test.ts +0 -207
  119. package/src/execution/__tests__/spawned-children.test.ts +0 -92
  120. package/src/execution/__tests__/start-sync-model-guard.test.ts +0 -150
  121. package/src/execution/__tests__/startup-config-declaration.test.ts +0 -35
  122. package/src/execution/__tests__/status-refactor.test.ts +0 -345
  123. package/src/execution/__tests__/stdin-writer.test.ts +0 -463
  124. package/src/execution/__tests__/stream-sink-retirement.test.ts +0 -261
  125. package/src/execution/__tests__/subagent-service-abort.test.ts +0 -60
  126. package/src/execution/__tests__/subagent-service-message-close.test.ts +0 -629
  127. package/src/execution/__tests__/subagent-service-parent-guard.test.ts +0 -180
  128. package/src/execution/__tests__/subagent-service.test.ts +0 -788
  129. package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +0 -310
  130. package/src/execution/__tests__/subprocess-agent-runner.test.ts +0 -599
  131. package/src/execution/__tests__/temp-prompt.test.ts +0 -53
  132. package/src/execution/__tests__/timeout-integration.test.ts +0 -615
  133. package/src/execution/__tests__/tombstone-store.test.ts +0 -73
  134. package/src/execution/__tests__/tool-action.test.ts +0 -476
  135. package/src/execution/__tests__/truncline-snapshot.test.ts +0 -81
  136. package/src/execution/__tests__/turn-limiter-semantics.test.ts +0 -194
  137. package/src/execution/__tests__/turn-limiter.test.ts +0 -65
  138. package/src/execution/__tests__/ui-channels.test.ts +0 -187
  139. package/src/execution/__tests__/ui-interaction-model.test.ts +0 -67
  140. package/src/execution/__tests__/ui-request-handler-factory.test.ts +0 -370
  141. package/src/execution/__tests__/ui-request-handler.test.ts +0 -204
  142. package/src/execution/__tests__/ui-request-observability.test.ts +0 -114
  143. package/src/execution/__tests__/ui-request-queue.test.ts +0 -133
  144. package/src/execution/__tests__/worktree-manager.test.ts +0 -633
  145. package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +0 -229
  146. package/src/execution/__tests__/worktree-reconcile.integration.test.ts +0 -181
  147. package/src/execution/__tests__/worktree-registry.test.ts +0 -199
  148. package/src/execution/agent-registry.ts +0 -199
  149. package/src/execution/agent-result-mapper.ts +0 -90
  150. package/src/execution/alive-store.ts +0 -92
  151. package/src/execution/argv-mirror.ts +0 -113
  152. package/src/execution/best-effort.ts +0 -38
  153. package/src/execution/channel-registry-access.ts +0 -144
  154. package/src/execution/concurrency-pool.ts +0 -116
  155. package/src/execution/config.ts +0 -96
  156. package/src/execution/dialog-queue.ts +0 -330
  157. package/src/execution/engine/__tests__/common/data-dir.test.ts +0 -53
  158. package/src/execution/engine/__tests__/common/errors.test.ts +0 -132
  159. package/src/execution/engine/__tests__/common/event-journal.test.ts +0 -177
  160. package/src/execution/engine/__tests__/common/kill-chain.test.ts +0 -192
  161. package/src/execution/engine/__tests__/common/nesting-guard.test.ts +0 -81
  162. package/src/execution/engine/__tests__/common/persona-router.test.ts +0 -123
  163. package/src/execution/engine/__tests__/common/pool-manager.test.ts +0 -154
  164. package/src/execution/engine/__tests__/common/schema-emulation.test.ts +0 -128
  165. package/src/execution/engine/__tests__/conformance/__fixtures__/pi-golden-events.json +0 -28
  166. package/src/execution/engine/__tests__/conformance/agent-event-invariants.ts +0 -141
  167. package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +0 -109
  168. package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +0 -101
  169. package/src/execution/engine/__tests__/conformance/contract.probe.test.ts +0 -77
  170. package/src/execution/engine/__tests__/conformance/contract.read-degradation.test.ts +0 -104
  171. package/src/execution/engine/__tests__/conformance/contract.relay.test.ts +0 -342
  172. package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +0 -201
  173. package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +0 -76
  174. package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +0 -79
  175. package/src/execution/engine/__tests__/engine-discovery.test.ts +0 -87
  176. package/src/execution/engine/__tests__/engines-declaration.test.ts +0 -36
  177. package/src/execution/engine/__tests__/model-prompt.test.ts +0 -85
  178. package/src/execution/engine/__tests__/paths.test.ts +0 -39
  179. package/src/execution/engine/__tests__/registry.test.ts +0 -120
  180. package/src/execution/engine/__tests__/routing.test.ts +0 -231
  181. package/src/execution/engine/common/data-dir.ts +0 -62
  182. package/src/execution/engine/common/errors.ts +0 -183
  183. package/src/execution/engine/common/event-journal.ts +0 -254
  184. package/src/execution/engine/common/journal-replay.ts +0 -62
  185. package/src/execution/engine/common/kill-chain.ts +0 -221
  186. package/src/execution/engine/common/nesting-guard.ts +0 -50
  187. package/src/execution/engine/common/persona-router.ts +0 -108
  188. package/src/execution/engine/common/pool-manager.ts +0 -226
  189. package/src/execution/engine/common/schema-emulation.ts +0 -189
  190. package/src/execution/engine/common/session-view-projection.ts +0 -51
  191. package/src/execution/engine/engine-discovery.ts +0 -65
  192. package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +0 -469
  193. package/src/execution/engine/engines/pi/__tests__/reader.test.ts +0 -155
  194. package/src/execution/engine/engines/pi/__tests__/task-spec-mapper.test.ts +0 -164
  195. package/src/execution/engine/engines/pi/pi-engine.ts +0 -415
  196. package/src/execution/engine/engines/pi/reader.ts +0 -48
  197. package/src/execution/engine/engines/pi/registration.ts +0 -35
  198. package/src/execution/engine/engines/pi/task-spec-mapper.ts +0 -100
  199. package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-spawn.json +0 -39
  200. package/src/execution/engine/engines/zcode/__tests__/launcher.test.ts +0 -150
  201. package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +0 -246
  202. package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +0 -228
  203. package/src/execution/engine/engines/zcode/__tests__/reader.test.ts +0 -210
  204. package/src/execution/engine/engines/zcode/__tests__/registration.test.ts +0 -64
  205. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +0 -127
  206. package/src/execution/engine/engines/zcode/__tests__/zcode-engine.test.ts +0 -580
  207. package/src/execution/engine/engines/zcode/constants.ts +0 -43
  208. package/src/execution/engine/engines/zcode/golden-sample.ts +0 -39
  209. package/src/execution/engine/engines/zcode/launcher.ts +0 -161
  210. package/src/execution/engine/engines/zcode/parser.ts +0 -436
  211. package/src/execution/engine/engines/zcode/preparer.ts +0 -363
  212. package/src/execution/engine/engines/zcode/reader.ts +0 -381
  213. package/src/execution/engine/engines/zcode/registration.ts +0 -37
  214. package/src/execution/engine/engines/zcode/zcode-engine.ts +0 -658
  215. package/src/execution/engine/host-task-spec.ts +0 -47
  216. package/src/execution/engine/model-prompt.ts +0 -59
  217. package/src/execution/engine/paths.ts +0 -42
  218. package/src/execution/engine/port.ts +0 -153
  219. package/src/execution/engine/registry.ts +0 -123
  220. package/src/execution/engine/routing.ts +0 -218
  221. package/src/execution/engine/types.ts +0 -309
  222. package/src/execution/execute-options-mapper.ts +0 -112
  223. package/src/execution/execution-record.ts +0 -965
  224. package/src/execution/finalize-record.ts +0 -251
  225. package/src/execution/finalized-marker.ts +0 -51
  226. package/src/execution/get-state-handshake.ts +0 -104
  227. package/src/execution/host-mode.ts +0 -56
  228. package/src/execution/idle-gc.ts +0 -47
  229. package/src/execution/lifecycle-manager.ts +0 -513
  230. package/src/execution/lifecycle-predicates.ts +0 -65
  231. package/src/execution/manifest-store.ts +0 -256
  232. package/src/execution/model-config-service.ts +0 -219
  233. package/src/execution/model-resolver.ts +0 -248
  234. package/src/execution/notifier.ts +0 -330
  235. package/src/execution/notify-ledger.ts +0 -580
  236. package/src/execution/output-collector.ts +0 -228
  237. package/src/execution/path-encoding.ts +0 -60
  238. package/src/execution/pi-invocation.ts +0 -120
  239. package/src/execution/record-entry.ts +0 -132
  240. package/src/execution/record-store.ts +0 -1234
  241. package/src/execution/relay-env.ts +0 -37
  242. package/src/execution/session-context-resolver.ts +0 -64
  243. package/src/execution/session-file-gc.ts +0 -120
  244. package/src/execution/session-pending.ts +0 -164
  245. package/src/execution/session-reconstructor.ts +0 -678
  246. package/src/execution/session-runner.ts +0 -1781
  247. package/src/execution/sessions-index.ts +0 -304
  248. package/src/execution/spawn-event-adapter.ts +0 -363
  249. package/src/execution/stdin-writer.ts +0 -198
  250. package/src/execution/stream-sink.ts +0 -126
  251. package/src/execution/subagent-service.ts +0 -2141
  252. package/src/execution/subprocess-agent-runner.ts +0 -317
  253. package/src/execution/temp-prompt.ts +0 -62
  254. package/src/execution/tombstone-store.ts +0 -72
  255. package/src/execution/turn-limiter.ts +0 -102
  256. package/src/execution/types.ts +0 -973
  257. package/src/execution/ui-channels.ts +0 -216
  258. package/src/execution/ui-interaction-model.ts +0 -48
  259. package/src/execution/ui-request-handler-factory.ts +0 -212
  260. package/src/execution/ui-request-observability.ts +0 -81
  261. package/src/execution/ui-request-queue.ts +0 -184
  262. package/src/execution/worktree-manager.ts +0 -688
  263. package/src/execution/worktree-registry.ts +0 -222
  264. package/src/orchestration/__tests__/__fixtures__/worker-template.snapshot.txt +0 -349
  265. package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +0 -202
  266. package/src/orchestration/__tests__/agent-call-stream.test.ts +0 -152
  267. package/src/orchestration/__tests__/args-validator.test.ts +0 -143
  268. package/src/orchestration/__tests__/config-loader.test.ts +0 -503
  269. package/src/orchestration/__tests__/error-recovery-handlers.test.ts +0 -809
  270. package/src/orchestration/__tests__/error-recovery-postmessage-defense.test.ts +0 -405
  271. package/src/orchestration/__tests__/error-recovery-serialize-failed-result.test.ts +0 -56
  272. package/src/orchestration/__tests__/error-recovery-workflow-call.test.ts +0 -166
  273. package/src/orchestration/__tests__/execute-agent-call.test.ts +0 -451
  274. package/src/orchestration/__tests__/jsonl-run-store-corrupt-entry.test.ts +0 -150
  275. package/src/orchestration/__tests__/jsonl-run-store-loadall-sources.test.ts +0 -171
  276. package/src/orchestration/__tests__/jsonl-run-store-retention.test.ts +0 -202
  277. package/src/orchestration/__tests__/jsonl-run-store-session-file.test.ts +0 -1030
  278. package/src/orchestration/__tests__/launcher-nested-workflow.test.ts +0 -600
  279. package/src/orchestration/__tests__/lifecycle-runid-injection.test.ts +0 -96
  280. package/src/orchestration/__tests__/lifecycle.test.ts +0 -659
  281. package/src/orchestration/__tests__/non-cloneable-return-e2e.test.ts +0 -95
  282. package/src/orchestration/__tests__/review-fix-loop-e2e.test.ts +0 -2025
  283. package/src/orchestration/__tests__/script-lint.test.ts +0 -831
  284. package/src/orchestration/__tests__/skill-discovery.test.ts +0 -201
  285. package/src/orchestration/__tests__/test-mocks.ts +0 -197
  286. package/src/orchestration/__tests__/worker-exit-without-result.test.ts +0 -368
  287. package/src/orchestration/__tests__/worker-host.test.ts +0 -120
  288. package/src/orchestration/__tests__/worker-returnmeta-passthrough.test.ts +0 -164
  289. package/src/orchestration/__tests__/worker-script-builder-runtime.test.ts +0 -563
  290. package/src/orchestration/__tests__/worker-script-builder.test.ts +0 -309
  291. package/src/orchestration/__tests__/worker-script-template-snapshot.test.ts +0 -129
  292. package/src/orchestration/__tests__/workflow-nesting-e2e.test.ts +0 -317
  293. package/src/orchestration/__tests__/workflow-script-lint-memo.test.ts +0 -110
  294. package/src/orchestration/__tests__/workflows-e2e.test.ts +0 -537
  295. package/src/orchestration/agent-opts-resolver.ts +0 -174
  296. package/src/orchestration/args-validator.ts +0 -127
  297. package/src/orchestration/config-loader.ts +0 -315
  298. package/src/orchestration/error-recovery.ts +0 -1018
  299. package/src/orchestration/execute-agent-call.ts +0 -256
  300. package/src/orchestration/launcher.ts +0 -455
  301. package/src/orchestration/lifecycle.ts +0 -399
  302. package/src/orchestration/models/__tests__/budget.test.ts +0 -307
  303. package/src/orchestration/models/__tests__/trace.test.ts +0 -408
  304. package/src/orchestration/models/agent-call.ts +0 -83
  305. package/src/orchestration/models/budget.ts +0 -118
  306. package/src/orchestration/models/ports.ts +0 -164
  307. package/src/orchestration/models/run-runtime.ts +0 -104
  308. package/src/orchestration/models/run-spec.ts +0 -83
  309. package/src/orchestration/models/run-state.ts +0 -44
  310. package/src/orchestration/models/trace.ts +0 -183
  311. package/src/orchestration/models/types.ts +0 -301
  312. package/src/orchestration/models/workflow-run.ts +0 -254
  313. package/src/orchestration/models/workflow-script-registry.ts +0 -35
  314. package/src/orchestration/models/workflow-script.ts +0 -117
  315. package/src/orchestration/script-lint.ts +0 -766
  316. package/src/orchestration/skill-discovery.ts +0 -115
  317. package/src/orchestration/worker-handle.ts +0 -115
  318. package/src/orchestration/worker-host.ts +0 -98
  319. package/src/orchestration/worker-script-builder.ts +0 -421
  320. package/src/orchestration/workflow-files.ts +0 -85
  321. package/src/orchestration/workflow-script-registry-impl.ts +0 -133
  322. package/src/shared/__tests__/agent-ref.test.ts +0 -34
  323. package/src/shared/__tests__/meta-parser.test.ts +0 -304
  324. package/src/shared/__tests__/model-ref.test.ts +0 -306
  325. package/src/shared/__tests__/resource-discovery-manifest-cache.test.ts +0 -280
  326. package/src/shared/__tests__/resource-discovery.test.ts +0 -736
  327. package/src/shared/__tests__/resource-meta.test.ts +0 -51
  328. package/src/shared/__tests__/schema-jsonify.test.ts +0 -81
  329. package/src/shared/__tests__/timer-delay.test.ts +0 -61
  330. package/src/shared/agent-event.ts +0 -13
  331. package/src/shared/agent-ref.ts +0 -57
  332. package/src/shared/meta-parser.ts +0 -261
  333. package/src/shared/model-ref.ts +0 -286
  334. package/src/shared/resource-discovery.ts +0 -811
  335. package/src/shared/resource-meta.ts +0 -65
  336. package/src/shared/schema-env.ts +0 -44
  337. package/src/shared/schema-jsonify.ts +0 -58
  338. package/src/shared/timer-delay.ts +0 -54
  339. package/src/shared/xml-injection.ts +0 -35
  340. package/workflows/README.md +0 -81
  341. package/workflows/_shared/agent-refs.cjs +0 -40
  342. package/workflows/chain.js +0 -131
  343. package/workflows/map-reduce.js +0 -174
  344. package/workflows/parallel.js +0 -148
  345. package/workflows/review-fix-loop-utils.cjs +0 -1309
  346. package/workflows/review-fix-loop.js +0 -1404
  347. package/workflows/scatter-gather.js +0 -178
@@ -1,194 +0,0 @@
1
- // src/execution/__tests__/turn-limiter-semantics.test.ts
2
- //
3
- // SP-9: turn-limiter chatMode 语义——chatMode 下 maxTurns 每轮 reset(不跨轮累计)。
4
- // 设计 D9 决策:续聊本质是无限轮,累计上限违背 G1。
5
-
6
- import { describe, expect, it, vi } from "vitest";
7
-
8
- import { createTurnLimiter } from "../turn-limiter.ts";
9
-
10
- describe("SP-9: turn-limiter chatMode semantics (maxTurns reset per round)", () => {
11
- describe("TC-1: chatMode 多轮后 maxTurns 每轮 reset(不累计)", () => {
12
- it("reset 后 maxTurns 不累计——第二轮从 0 开始,不触发 steer/abort", () => {
13
- const steer = vi.fn();
14
- const abort = vi.fn();
15
- const limiter = createTurnLimiter({ maxTurns: 3, graceTurns: 2, steer, abort });
16
-
17
- // 第一轮:3 turns → steer(达到 maxTurns=3)
18
- limiter.onTurnEnd(1);
19
- limiter.onTurnEnd(2);
20
- limiter.onTurnEnd(3);
21
- expect(steer).toHaveBeenCalledTimes(1);
22
- expect(abort).not.toHaveBeenCalled();
23
-
24
- // agent_settled → reset(模拟 chatMode 每轮 reset)
25
- limiter.reset();
26
-
27
- // 第二轮从 turnCount=0 开始(record.turnCount 由 session-runner 归零):
28
- // 2 turns 不触发 steer(距离 maxTurns=3 还差 1)
29
- limiter.onTurnEnd(1);
30
- limiter.onTurnEnd(2);
31
- // steer 仍然是 1 次(第一轮那次),第二轮未触发
32
- expect(steer).toHaveBeenCalledTimes(1);
33
- expect(abort).not.toHaveBeenCalled();
34
- });
35
-
36
- it("reset 后第二轮同样达到 maxTurns 时仍触发 steer", () => {
37
- const steer = vi.fn();
38
- const abort = vi.fn();
39
- const limiter = createTurnLimiter({ maxTurns: 2, graceTurns: 1, steer, abort });
40
-
41
- // 第一轮:steer + grace + abort
42
- limiter.onTurnEnd(1);
43
- limiter.onTurnEnd(2); // steer
44
- limiter.onTurnEnd(3); // abort
45
- expect(steer).toHaveBeenCalledTimes(1);
46
- expect(abort).toHaveBeenCalledTimes(1);
47
-
48
- // reset(chatMode 新轮)
49
- limiter.reset();
50
- expect(limiter.didSteer).toBe(false);
51
- expect(limiter.didAbort).toBe(false);
52
-
53
- // 第二轮:同样走完 steer + grace 路径
54
- limiter.onTurnEnd(1);
55
- limiter.onTurnEnd(2); // steer again
56
- expect(steer).toHaveBeenCalledTimes(2);
57
- expect(abort).toHaveBeenCalledTimes(1); // 还没到 abort
58
-
59
- limiter.onTurnEnd(3); // abort again
60
- expect(abort).toHaveBeenCalledTimes(2);
61
- });
62
-
63
- it("多轮连续 reset 后 limiter 始终可用", () => {
64
- const steer = vi.fn();
65
- const abort = vi.fn();
66
- const limiter = createTurnLimiter({ maxTurns: 2, graceTurns: 0, steer, abort });
67
-
68
- for (let round = 1; round <= 5; round++) {
69
- limiter.onTurnEnd(1);
70
- limiter.onTurnEnd(2); // steer + abort (graceTurns=0)
71
- expect(steer).toHaveBeenCalledTimes(round);
72
- expect(abort).toHaveBeenCalledTimes(round);
73
- limiter.reset();
74
- }
75
- });
76
- });
77
-
78
- describe("TC-2: graceTurns 每轮 reset", () => {
79
- it("reset 后 graceTurns 从 0 重新计数", () => {
80
- const steer = vi.fn();
81
- const abort = vi.fn();
82
- const limiter = createTurnLimiter({ maxTurns: 2, graceTurns: 3, steer, abort });
83
-
84
- // 第一轮:steer at turn 2,用掉 1 个 grace turn
85
- limiter.onTurnEnd(1);
86
- limiter.onTurnEnd(2); // steer
87
- limiter.onTurnEnd(3); // grace turn 1
88
- expect(abort).not.toHaveBeenCalled();
89
-
90
- // reset(模拟 chatMode agent_settled)
91
- limiter.reset();
92
-
93
- // 第二轮:从 turn 1 开始,graceTurns 重新从 0 计数
94
- limiter.onTurnEnd(1);
95
- limiter.onTurnEnd(2); // steer again
96
- limiter.onTurnEnd(3); // grace turn 1(重计)
97
- limiter.onTurnEnd(4); // grace turn 2
98
- limiter.onTurnEnd(5); // grace turn 3 → abort
99
- expect(abort).toHaveBeenCalledTimes(1);
100
- });
101
-
102
- it("reset 前未 steer 时 reset 后仍正常工作", () => {
103
- const steer = vi.fn();
104
- const abort = vi.fn();
105
- const limiter = createTurnLimiter({ maxTurns: 5, graceTurns: 2, steer, abort });
106
-
107
- // 第一轮:只走了 2 turns(未达 maxTurns)
108
- limiter.onTurnEnd(1);
109
- limiter.onTurnEnd(2);
110
- expect(steer).not.toHaveBeenCalled();
111
-
112
- limiter.reset();
113
-
114
- // 第二轮:从 turn 1 开始,到 maxTurns=5 触发 steer
115
- limiter.onTurnEnd(1);
116
- limiter.onTurnEnd(2);
117
- limiter.onTurnEnd(3);
118
- limiter.onTurnEnd(4);
119
- limiter.onTurnEnd(5); // steer
120
- expect(steer).toHaveBeenCalledTimes(1);
121
- limiter.onTurnEnd(6);
122
- limiter.onTurnEnd(7); // abort (5+2)
123
- expect(abort).toHaveBeenCalledTimes(1);
124
- });
125
- });
126
-
127
- describe("TC-3: 非 chatMode 行为不变(全程累计)", () => {
128
- it("不调用 reset 时 turn-limiter 行为与原来完全一致", () => {
129
- const steer = vi.fn();
130
- const abort = vi.fn();
131
- const limiter = createTurnLimiter({ maxTurns: 3, graceTurns: 2, steer, abort });
132
-
133
- // 全程累计(非 chatMode,不 reset):3→steer,5→abort
134
- limiter.onTurnEnd(1);
135
- limiter.onTurnEnd(2);
136
- limiter.onTurnEnd(3); // steer
137
- expect(steer).toHaveBeenCalledTimes(1);
138
- limiter.onTurnEnd(4); // grace 1
139
- limiter.onTurnEnd(5); // grace 2 → abort
140
- expect(abort).toHaveBeenCalledTimes(1);
141
- expect(limiter.didSteer).toBe(true);
142
- expect(limiter.didAbort).toBe(true);
143
- });
144
-
145
- it("maxTurns=0(禁用)不因 reset 而误启用", () => {
146
- const steer = vi.fn();
147
- const abort = vi.fn();
148
- const limiter = createTurnLimiter({ maxTurns: 0, graceTurns: 2, steer, abort });
149
-
150
- limiter.onTurnEnd(100);
151
- expect(steer).not.toHaveBeenCalled();
152
-
153
- limiter.reset();
154
- limiter.onTurnEnd(100);
155
- // maxTurns=0(禁用),即使 reset 也不触发
156
- expect(steer).not.toHaveBeenCalled();
157
- expect(abort).not.toHaveBeenCalled();
158
- });
159
-
160
- it("全程累计(不 reset)达到 maxTurns+graceTurns 后不再触发", () => {
161
- const steer = vi.fn();
162
- const abort = vi.fn();
163
- const limiter = createTurnLimiter({ maxTurns: 2, graceTurns: 1, steer, abort });
164
-
165
- limiter.onTurnEnd(1);
166
- limiter.onTurnEnd(2); // steer
167
- limiter.onTurnEnd(3); // abort
168
- expect(steer).toHaveBeenCalledTimes(1);
169
- expect(abort).toHaveBeenCalledTimes(1);
170
-
171
- // 已 abort 后继续调用 onTurnEnd(不应再次触发)
172
- limiter.onTurnEnd(4);
173
- limiter.onTurnEnd(5);
174
- expect(steer).toHaveBeenCalledTimes(1);
175
- expect(abort).toHaveBeenCalledTimes(1);
176
- });
177
- });
178
-
179
- describe("TC-4: reset 诊断属性", () => {
180
- it("reset 清除 didSteer 和 didAbort 诊断标志", () => {
181
- const steer = vi.fn();
182
- const abort = vi.fn();
183
- const limiter = createTurnLimiter({ maxTurns: 1, graceTurns: 0, steer, abort });
184
-
185
- limiter.onTurnEnd(1); // steer + abort (graceTurns=0)
186
- expect(limiter.didSteer).toBe(true);
187
- expect(limiter.didAbort).toBe(true);
188
-
189
- limiter.reset();
190
- expect(limiter.didSteer).toBe(false);
191
- expect(limiter.didAbort).toBe(false);
192
- });
193
- });
194
- });
@@ -1,65 +0,0 @@
1
- // src/__tests__/turn-limiter.test.ts
2
- import { describe, expect, it, vi } from "vitest";
3
-
4
- import { createTurnLimiter } from "../turn-limiter.ts";
5
-
6
- describe("createTurnLimiter", () => {
7
- it("does nothing before maxTurns", () => {
8
- const steer = vi.fn();
9
- const abort = vi.fn();
10
- const limiter = createTurnLimiter({ maxTurns: 3, graceTurns: 2, steer, abort });
11
- limiter.onTurnEnd(1);
12
- limiter.onTurnEnd(2);
13
- expect(steer).not.toHaveBeenCalled();
14
- expect(abort).not.toHaveBeenCalled();
15
- expect(limiter.didSteer).toBe(false);
16
- expect(limiter.didAbort).toBe(false);
17
- });
18
-
19
- it("steers on maxTurns and aborts after graceTurns", () => {
20
- const steer = vi.fn();
21
- const abort = vi.fn();
22
- const limiter = createTurnLimiter({ maxTurns: 3, graceTurns: 2, steer, abort });
23
- limiter.onTurnEnd(3); // 达到 maxTurns → steer
24
- expect(steer).toHaveBeenCalledWith(expect.stringContaining("You have reached your turn limit"));
25
- expect(abort).not.toHaveBeenCalled();
26
- expect(limiter.didSteer).toBe(true);
27
- limiter.onTurnEnd(4); // grace turn 1
28
- expect(abort).not.toHaveBeenCalled();
29
- limiter.onTurnEnd(5); // grace turn 2 → abort
30
- expect(abort).toHaveBeenCalledTimes(1);
31
- expect(limiter.didAbort).toBe(true);
32
- });
33
-
34
- it("disables when maxTurns is 0", () => {
35
- const steer = vi.fn();
36
- const abort = vi.fn();
37
- const limiter = createTurnLimiter({ maxTurns: 0, graceTurns: 2, steer, abort });
38
- limiter.onTurnEnd(100);
39
- expect(steer).not.toHaveBeenCalled();
40
- expect(abort).not.toHaveBeenCalled();
41
- expect(limiter.didSteer).toBe(false);
42
- });
43
-
44
- it("steers only once", () => {
45
- const steer = vi.fn();
46
- const abort = vi.fn();
47
- const limiter = createTurnLimiter({ maxTurns: 2, graceTurns: 3, steer, abort });
48
- limiter.onTurnEnd(2);
49
- limiter.onTurnEnd(3);
50
- expect(steer).toHaveBeenCalledTimes(1);
51
- expect(limiter.didSteer).toBe(true);
52
- });
53
-
54
- it("aborts on the same turn as steer when graceTurns is 0", () => {
55
- const steer = vi.fn();
56
- const abort = vi.fn();
57
- const limiter = createTurnLimiter({ maxTurns: 2, graceTurns: 0, steer, abort });
58
- // grace=0 → limit+grace == limit,steer 后同一 turn 即满足 abort 条件
59
- limiter.onTurnEnd(2); // maxTurns → steer + abort(同 turn)
60
- expect(steer).toHaveBeenCalledTimes(1);
61
- expect(abort).toHaveBeenCalledTimes(1);
62
- expect(limiter.didSteer).toBe(true);
63
- expect(limiter.didAbort).toBe(true);
64
- });
65
- });
@@ -1,187 +0,0 @@
1
- // src/__tests__/ui-channels.test.ts
2
- //
3
- // W1 红灯测试:ui-channels.ts — channel 提取(marker 解析)+ channel 注册表。
4
- //
5
- // 测试对象:extensions/universal/subagent-workflow/src/execution/ui-channels.ts(新建)
6
- // 契约来源:.fix-plans/00-master-summary.md §一 冲突 2「维度 2:channel 注册表」
7
- //
8
- // parseChannel(req): ExtensionUiRequest → { channel?, channelPayload? }
9
- // - select → 从 title 解析 NUL 前缀(parseFromMarkerString)
10
- // - setWidget → 从 widgetLines[0] 解析 NUL 前缀(parseFromMarkerArray)
11
- // - 其他 method → {}(无 channel)
12
- //
13
- // marker 格式:\0<UPPER_CASE_ID>[:]<JSON-payload?>
14
- // - ASK_USER_MARKER = "\0XYZ_ASK_USER",payload 在 options[0]
15
- // - GUI_WIDGET_MARKER = "\0XYZ_GUI_WIDGET:" + JSON,payload 在同行
16
- // channel 名规范化:去 "XYZ_" 前缀,小写化(XYZ_ASK_USER → ask_user)
17
- //
18
- // UiChannelRegistry:
19
- // - register(channel, handler) / resolve(channel) / list()
20
- //
21
- // 边界:无 NUL 前缀 → {};JSON parse 失败 → {}(不抛);字段缺失 → {}
22
- //
23
- // 红灯原因:ui-channels.ts 尚未创建,import 失败。
24
-
25
- import { describe, expect, it, vi } from "vitest";
26
-
27
- import {
28
- createUiChannelRegistry,
29
- type ExtensionUiRequestLike,
30
- parseChannel,
31
- } from "../ui-channels.ts";
32
-
33
- // ── 测试 fixture 构造助手 ────────────────────────────────────
34
- // ExtensionUiRequestLike 是 parseChannel 入参的最小形状(method + 对应字段)。
35
-
36
- function selectReq(title: string, options?: string[]): ExtensionUiRequestLike {
37
- return { method: "select", title, options };
38
- }
39
-
40
- function setWidgetReq(widgetKey: string, widgetLines: string[] | undefined): ExtensionUiRequestLike {
41
- return { method: "setWidget", widgetKey, widgetLines };
42
- }
43
-
44
- // ── ASK_USER_MARKER 样本(真实 Pi 协议格式) ─────────────────
45
- // title = "\0XYZ_ASK_USER",options[0] = JSON.stringify({questions, allowCancel})
46
- const ASK_USER_MARKER = "\0XYZ_ASK_USER";
47
- const askUserPayload = {
48
- questions: [{ question: "Pick one", options: [{ label: "A" }, { label: "B" }] }],
49
- allowCancel: true,
50
- };
51
-
52
- // ── GUI_WIDGET_MARKER 样本(真实 Pi 协议格式) ───────────────
53
- // widgetLines[0] = "\0XYZ_GUI_WIDGET:" + JSON.stringify({component:{...}})
54
- const GUI_WIDGET_MARKER_PREFIX = "\0XYZ_GUI_WIDGET:";
55
- const guiWidgetPayload = { component: { name: "StatusCard", props: { ok: true } } };
56
-
57
- describe("parseChannel — select method(从 title 解析 NUL 前缀)", () => {
58
- it("title 含 ASK_USER_MARKER → channel='ask_user' + payload 从 options[0] 解析", () => {
59
- const req = selectReq(ASK_USER_MARKER, [JSON.stringify(askUserPayload)]);
60
- const result = parseChannel(req);
61
- expect(result.channel).toBe("ask_user");
62
- expect(result.channelPayload).toEqual(askUserPayload);
63
- });
64
-
65
- it("title 无 NUL 前缀 → {}(普通 select,无 channel)", () => {
66
- const req = selectReq("Choose a plan", ["basic", "pro"]);
67
- const result = parseChannel(req);
68
- expect(result.channel).toBeUndefined();
69
- expect(result.channelPayload).toBeUndefined();
70
- });
71
-
72
- it("title 含 marker 但 options 缺失 → channel 解析但 payload undefined", () => {
73
- // marker 在 title,但 options 为空 → channel 名仍可提取,payload 无来源
74
- const req = selectReq(ASK_USER_MARKER);
75
- const result = parseChannel(req);
76
- expect(result.channel).toBe("ask_user");
77
- });
78
- });
79
-
80
- describe("parseChannel — setWidget method(从 widgetLines[0] 解析 NUL 前缀)", () => {
81
- it("widgetLines[0] 含 GUI_WIDGET_MARKER → channel='gui_widget' + payload", () => {
82
- const req = setWidgetReq("w1", [GUI_WIDGET_MARKER_PREFIX + JSON.stringify(guiWidgetPayload)]);
83
- const result = parseChannel(req);
84
- expect(result.channel).toBe("gui_widget");
85
- expect(result.channelPayload).toEqual(guiWidgetPayload);
86
- });
87
-
88
- it("widgetLines 无 NUL 前缀 → {}(普通 setWidget)", () => {
89
- const req = setWidgetReq("w1", ["plain content line"]);
90
- const result = parseChannel(req);
91
- expect(result.channel).toBeUndefined();
92
- });
93
-
94
- it("widgetLines 为 undefined → {}", () => {
95
- const req = setWidgetReq("w1", undefined);
96
- const result = parseChannel(req);
97
- expect(result.channel).toBeUndefined();
98
- });
99
-
100
- it("widgetLines 为空数组 → {}", () => {
101
- const req = setWidgetReq("w1", []);
102
- const result = parseChannel(req);
103
- expect(result.channel).toBeUndefined();
104
- });
105
- });
106
-
107
- describe("parseChannel — 其他 method(无 channel 提取位置)", () => {
108
- it("confirm → {}", () => {
109
- const result = parseChannel({ method: "confirm", title: "t", message: "m" });
110
- expect(result.channel).toBeUndefined();
111
- });
112
-
113
- it("input → {}", () => {
114
- const result = parseChannel({ method: "input", title: "t" });
115
- expect(result.channel).toBeUndefined();
116
- });
117
-
118
- it("notify → {}", () => {
119
- const result = parseChannel({ method: "notify", message: "hi" });
120
- expect(result.channel).toBeUndefined();
121
- });
122
- });
123
-
124
- describe("parseChannel — channel 名规范化规则", () => {
125
- it("去 XYZ_ 命名空间前缀 + 小写化(XYZ_ASK_USER → ask_user)", () => {
126
- const req = selectReq("\0XYZ_ASK_USER", [JSON.stringify({ x: 1 })]);
127
- expect(parseChannel(req).channel).toBe("ask_user");
128
- });
129
-
130
- it("XYZ_GUI_WIDGET: 带冒号后缀 → gui_widget(去前缀 + 去冒号 + 小写)", () => {
131
- const req = setWidgetReq("k", ["\0XYZ_GUI_WIDGET:" + JSON.stringify({ y: 2 })]);
132
- expect(parseChannel(req).channel).toBe("gui_widget");
133
- });
134
- });
135
-
136
- describe("parseChannel — 边界(不抛错)", () => {
137
- it("marker 后 payload 非法 JSON → 不抛错,channel 仍解析(payload undefined)", () => {
138
- const req = selectReq(ASK_USER_MARKER, ["not-valid-json{"]);
139
- expect(() => parseChannel(req)).not.toThrow();
140
- const result = parseChannel(req);
141
- expect(result.channel).toBe("ask_user");
142
- });
143
-
144
- it("GUI_WIDGET_MARKER 后非法 JSON → 不抛错", () => {
145
- const req = setWidgetReq("k", [GUI_WIDGET_MARKER_PREFIX + "broken{json"]);
146
- expect(() => parseChannel(req)).not.toThrow();
147
- });
148
- });
149
-
150
- // ── UiChannelRegistry ────────────────────────────────────────
151
-
152
- describe("UiChannelRegistry — 注册 + 解析 + 列举", () => {
153
- it("register 后 resolve 返回注册的 handler", () => {
154
- const registry = createUiChannelRegistry();
155
- const handler = vi.fn();
156
- registry.register("ask_user", handler);
157
- expect(registry.resolve("ask_user")).toBe(handler);
158
- });
159
-
160
- it("未注册的 channel resolve 返回 undefined", () => {
161
- const registry = createUiChannelRegistry();
162
- expect(registry.resolve("unknown")).toBeUndefined();
163
- });
164
-
165
- it("list 返回所有已注册 channel 名", () => {
166
- const registry = createUiChannelRegistry();
167
- registry.register("ask_user", vi.fn());
168
- registry.register("gui_widget", vi.fn());
169
- const names = registry.list().sort();
170
- expect(names).toEqual(["ask_user", "gui_widget"]);
171
- });
172
-
173
- it("list 空注册表返回 []", () => {
174
- const registry = createUiChannelRegistry();
175
- expect(registry.list()).toEqual([]);
176
- });
177
-
178
- it("重复 register 同名 channel 覆盖旧 handler", () => {
179
- const registry = createUiChannelRegistry();
180
- const old = vi.fn();
181
- const fresh = vi.fn();
182
- registry.register("ask_user", old);
183
- registry.register("ask_user", fresh);
184
- expect(registry.resolve("ask_user")).toBe(fresh);
185
- expect(registry.list()).toEqual(["ask_user"]);
186
- });
187
- });
@@ -1,67 +0,0 @@
1
- // src/__tests__/ui-interaction-model.test.ts
2
- //
3
- // W1 红灯测试:ui-interaction-model.ts — method 交互模型分类。
4
- //
5
- // 测试对象:extensions/universal/subagent-workflow/src/execution/ui-interaction-model.ts(新建)
6
- // 契约来源:.fix-plans/00-master-summary.md §一 冲突 2「维度 1:透传判定规则」
7
- //
8
- // isDialogMethod(method):
9
- // - dialog(占输入焦点,等响应,需透传+排队):select / confirm / input / editor → true
10
- // - fire-and-forget(纯展示/写入,不等响应):notify / setStatus / setWidget /
11
- // setTitle / set_editor_text / 未知 method → false
12
- //
13
- // 红灯原因:ui-interaction-model.ts 尚未创建,import 失败。
14
-
15
- import { describe, expect, it } from "vitest";
16
-
17
- import { isDialogMethod } from "../ui-interaction-model.ts";
18
-
19
- describe("isDialogMethod — dialog 类 method(占输入焦点)", () => {
20
- it("select → true(含 ask_user channel 借道 select)", () => {
21
- expect(isDialogMethod("select")).toBe(true);
22
- });
23
-
24
- it("confirm → true", () => {
25
- expect(isDialogMethod("confirm")).toBe(true);
26
- });
27
-
28
- it("input → true", () => {
29
- expect(isDialogMethod("input")).toBe(true);
30
- });
31
-
32
- it("editor → true", () => {
33
- expect(isDialogMethod("editor")).toBe(true);
34
- });
35
- });
36
-
37
- describe("isDialogMethod — fire-and-forget 类 method(纯展示/写入)", () => {
38
- it("notify → false", () => {
39
- expect(isDialogMethod("notify")).toBe(false);
40
- });
41
-
42
- it("setStatus → false", () => {
43
- expect(isDialogMethod("setStatus")).toBe(false);
44
- });
45
-
46
- it("setWidget → false(含 gui_widget channel 借道 setWidget)", () => {
47
- expect(isDialogMethod("setWidget")).toBe(false);
48
- });
49
-
50
- it("setTitle → false", () => {
51
- expect(isDialogMethod("setTitle")).toBe(false);
52
- });
53
-
54
- it("set_editor_text → false", () => {
55
- expect(isDialogMethod("set_editor_text")).toBe(false);
56
- });
57
- });
58
-
59
- describe("isDialogMethod — 未知 method 默认 fire-and-forget", () => {
60
- it("未知 method 名 → false(未来 Pi 新增 method 不误判为 dialog)", () => {
61
- expect(isDialogMethod("some_future_method")).toBe(false);
62
- });
63
-
64
- it("空字符串 → false", () => {
65
- expect(isDialogMethod("")).toBe(false);
66
- });
67
- });