@zhushanwen/pi-subagent-workflow 8.5.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.
- package/package.json +13 -16
- package/relay/relay.mjs +1 -1
- package/src/host/__tests__/pi-host.test.ts +214 -0
- package/src/host/pi-host.ts +109 -0
- package/src/index.ts +142 -32
- package/src/injectors/__tests__/engine-awareness.test.ts +292 -0
- package/src/injectors/__tests__/engine-section-stability.test.ts +341 -0
- package/src/injectors/__tests__/subagent-list-injector.test.ts +5 -5
- package/src/injectors/__tests__/workflow-list-injector.test.ts +5 -5
- package/src/injectors/engine-awareness.ts +123 -0
- package/src/injectors/model-list-injector.ts +1 -1
- package/src/injectors/subagent-list-injector.ts +8 -8
- package/src/injectors/workflow-list-injector.ts +8 -8
- package/src/interface/__tests__/detectors.test.ts +3 -3
- package/src/interface/__tests__/subagent-tool-path-guard.test.ts +157 -0
- package/src/interface/__tests__/subagent-tool-prompt.test.ts +12 -0
- package/src/interface/__tests__/tool-workflow-script-generate.test.ts +2 -2
- package/src/interface/__tests__/tool-workflow-throw-paths.test.ts +1 -1
- package/src/interface/bg-notify-render.ts +34 -13
- package/src/interface/commands.ts +3 -3
- package/src/interface/format.ts +2 -2
- package/src/interface/helpers.ts +3 -3
- package/src/interface/list-component.ts +4 -4
- package/src/interface/list-shared.ts +2 -2
- package/src/interface/list-view.ts +2 -2
- package/src/interface/subagent-actions.ts +288 -19
- package/src/interface/subagent-tool-schema.ts +163 -0
- package/src/interface/subagent-tool.ts +65 -129
- package/src/interface/subagents.ts +5 -5
- package/src/interface/tool-render.ts +34 -2
- package/src/interface/tool-workflow-script.ts +4 -4
- package/src/interface/tool-workflow.ts +6 -6
- package/src/interface/views/WorkflowsView.ts +5 -5
- package/src/interface/views/__tests__/WorkflowsView-signature.test.ts +3 -3
- package/src/interface/views/__tests__/detail-content-session-file.test.ts +2 -2
- package/src/interface/views/detail-content.ts +4 -4
- package/src/interface/views/format.ts +4 -4
- package/src/{orchestration/jsonl-run-store.ts → jsonl-run-store.ts} +132 -18
- package/src/execution/__tests__/__fixtures__/notifier-golden-snapshots.json +0 -53
- package/src/execution/__tests__/__fixtures__/truncline.snapshot.json +0 -1
- package/src/execution/__tests__/agent-registry.test.ts +0 -363
- package/src/execution/__tests__/agent-result-mapper.test.ts +0 -150
- package/src/execution/__tests__/alive-store.test.ts +0 -147
- package/src/execution/__tests__/ask-user-transit-e2e.test.ts +0 -490
- package/src/execution/__tests__/before-agent-start-injection.test.ts +0 -132
- package/src/execution/__tests__/bg-notify-render.test.ts +0 -256
- package/src/execution/__tests__/channel-registry-handshake.test.ts +0 -243
- package/src/execution/__tests__/chat-engine-routing.test.ts +0 -597
- package/src/execution/__tests__/chatmode-first-round-closure-service.test.ts +0 -365
- package/src/execution/__tests__/chatmode-first-round-closure-spawn.test.ts +0 -190
- package/src/execution/__tests__/chatmode-round-notify-real-chain.test.ts +0 -215
- package/src/execution/__tests__/concurrency-pool.test.ts +0 -250
- package/src/execution/__tests__/config.test.ts +0 -110
- package/src/execution/__tests__/conversation-wiring.test.ts +0 -198
- package/src/execution/__tests__/crash-recovery.test.ts +0 -320
- package/src/execution/__tests__/delivery-methods.test.ts +0 -385
- package/src/execution/__tests__/dialog-queue.test.ts +0 -299
- package/src/execution/__tests__/epipe-fallback.test.ts +0 -241
- package/src/execution/__tests__/execute-and-await-worktree.test.ts +0 -243
- package/src/execution/__tests__/execute-nesting.test.ts +0 -323
- package/src/execution/__tests__/execute-options-mapper.test.ts +0 -189
- package/src/execution/__tests__/execution-record.test.ts +0 -1284
- package/src/execution/__tests__/finalize-record.test.ts +0 -368
- package/src/execution/__tests__/finalized-marker.test.ts +0 -82
- package/src/execution/__tests__/format-schema-instruction.test.ts +0 -138
- package/src/execution/__tests__/format.test.ts +0 -458
- package/src/execution/__tests__/gc-timer.test.ts +0 -184
- package/src/execution/__tests__/get-record-for-action-restart.test.ts +0 -254
- package/src/execution/__tests__/gui-mode-dispatch.test.ts +0 -59
- package/src/execution/__tests__/helpers/mock-extension-api.ts +0 -30
- package/src/execution/__tests__/helpers/spawn-mock.ts +0 -238
- package/src/execution/__tests__/host-mode.test.ts +0 -87
- package/src/execution/__tests__/index-session-start-identity.test.ts +0 -371
- package/src/execution/__tests__/index-session-start.test.ts +0 -593
- package/src/execution/__tests__/lifecycle-manager-lock.test.ts +0 -211
- package/src/execution/__tests__/lifecycle-manager.test.ts +0 -337
- package/src/execution/__tests__/lifecycle-predicates.test.ts +0 -116
- package/src/execution/__tests__/list-component.test.ts +0 -401
- package/src/execution/__tests__/list-fields.test.ts +0 -109
- package/src/execution/__tests__/manifest-parentid.test.ts +0 -117
- package/src/execution/__tests__/model-resolver.test.ts +0 -413
- package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +0 -287
- package/src/execution/__tests__/nested-visibility.test.ts +0 -325
- package/src/execution/__tests__/notifier-flush.test.ts +0 -574
- package/src/execution/__tests__/notifier-golden-snapshot.test.ts +0 -261
- package/src/execution/__tests__/one-shot-upgrade.test.ts +0 -205
- package/src/execution/__tests__/output-collector.test.ts +0 -61
- package/src/execution/__tests__/parent-child-matrix.test.ts +0 -336
- package/src/execution/__tests__/path-encoding.test.ts +0 -104
- package/src/execution/__tests__/pi-invocation.test.ts +0 -134
- package/src/execution/__tests__/record-store.test.ts +0 -1057
- package/src/execution/__tests__/records-cwd-isolation.test.ts +0 -91
- package/src/execution/__tests__/recursive-visibility-baseline.test.ts +0 -339
- package/src/execution/__tests__/recursive-visibility-env.test.ts +0 -273
- package/src/execution/__tests__/relay-agent.test.ts +0 -448
- package/src/execution/__tests__/relay-env.test.ts +0 -42
- package/src/execution/__tests__/resource-policy.test.ts +0 -109
- package/src/execution/__tests__/rpc-mode.test.ts +0 -89
- package/src/execution/__tests__/run-and-finalize-chatmode.test.ts +0 -267
- package/src/execution/__tests__/run-spawn-chatmode-settled.test.ts +0 -253
- package/src/execution/__tests__/run-spawn-edges.test.ts +0 -644
- package/src/execution/__tests__/run-spawn-integration.test.ts +0 -933
- package/src/execution/__tests__/run-spawn-resume.test.ts +0 -322
- package/src/execution/__tests__/run-spawn-rpc-mode.test.ts +0 -196
- package/src/execution/__tests__/sdk-contract.test.ts +0 -273
- package/src/execution/__tests__/session-context-resolver.test.ts +0 -167
- package/src/execution/__tests__/session-file-gc.test.ts +0 -293
- package/src/execution/__tests__/session-pending.test.ts +0 -197
- package/src/execution/__tests__/session-reconstructor.test.ts +0 -379
- package/src/execution/__tests__/session-runner-epipe.test.ts +0 -178
- package/src/execution/__tests__/session-runner-schema-env.test.ts +0 -311
- package/src/execution/__tests__/session-start-reaper.test.ts +0 -233
- package/src/execution/__tests__/spawn-args.test.ts +0 -434
- package/src/execution/__tests__/spawn-event-adapter-rpc.test.ts +0 -189
- package/src/execution/__tests__/spawn-event-adapter.test.ts +0 -167
- package/src/execution/__tests__/spawn-worktree-guidance.test.ts +0 -207
- package/src/execution/__tests__/spawned-children.test.ts +0 -92
- package/src/execution/__tests__/startup-config-declaration.test.ts +0 -35
- package/src/execution/__tests__/status-refactor.test.ts +0 -345
- package/src/execution/__tests__/stdin-writer.test.ts +0 -463
- package/src/execution/__tests__/stream-sink-retirement.test.ts +0 -261
- package/src/execution/__tests__/subagent-service-abort.test.ts +0 -60
- package/src/execution/__tests__/subagent-service-message-close.test.ts +0 -629
- package/src/execution/__tests__/subagent-service-parent-guard.test.ts +0 -180
- package/src/execution/__tests__/subagent-service.test.ts +0 -788
- package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +0 -310
- package/src/execution/__tests__/subprocess-agent-runner.test.ts +0 -506
- package/src/execution/__tests__/temp-prompt.test.ts +0 -53
- package/src/execution/__tests__/timeout-integration.test.ts +0 -397
- package/src/execution/__tests__/tombstone-store.test.ts +0 -73
- package/src/execution/__tests__/tool-action.test.ts +0 -385
- package/src/execution/__tests__/truncline-snapshot.test.ts +0 -81
- package/src/execution/__tests__/turn-limiter-semantics.test.ts +0 -194
- package/src/execution/__tests__/turn-limiter.test.ts +0 -65
- package/src/execution/__tests__/ui-channels.test.ts +0 -187
- package/src/execution/__tests__/ui-interaction-model.test.ts +0 -67
- package/src/execution/__tests__/ui-request-handler-factory.test.ts +0 -370
- package/src/execution/__tests__/ui-request-handler.test.ts +0 -204
- package/src/execution/__tests__/ui-request-observability.test.ts +0 -114
- package/src/execution/__tests__/ui-request-queue.test.ts +0 -133
- package/src/execution/__tests__/worktree-manager.test.ts +0 -633
- package/src/execution/__tests__/worktree-pid-registration.integration.test.ts +0 -229
- package/src/execution/__tests__/worktree-reconcile.integration.test.ts +0 -181
- package/src/execution/__tests__/worktree-registry.test.ts +0 -199
- package/src/execution/agent-registry.ts +0 -193
- package/src/execution/agent-result-mapper.ts +0 -90
- package/src/execution/alive-store.ts +0 -92
- package/src/execution/argv-mirror.ts +0 -109
- package/src/execution/best-effort.ts +0 -38
- package/src/execution/channel-registry-access.ts +0 -144
- package/src/execution/concurrency-pool.ts +0 -116
- package/src/execution/config.ts +0 -96
- package/src/execution/dialog-queue.ts +0 -330
- package/src/execution/engine/__tests__/common/data-dir.test.ts +0 -53
- package/src/execution/engine/__tests__/common/errors.test.ts +0 -132
- package/src/execution/engine/__tests__/common/event-journal.test.ts +0 -177
- package/src/execution/engine/__tests__/common/kill-chain.test.ts +0 -192
- package/src/execution/engine/__tests__/common/nesting-guard.test.ts +0 -81
- package/src/execution/engine/__tests__/common/persona-router.test.ts +0 -123
- package/src/execution/engine/__tests__/common/pool-manager.test.ts +0 -154
- package/src/execution/engine/__tests__/common/schema-emulation.test.ts +0 -128
- package/src/execution/engine/__tests__/conformance/__fixtures__/pi-golden-events.json +0 -28
- package/src/execution/engine/__tests__/conformance/agent-event-invariants.ts +0 -141
- package/src/execution/engine/__tests__/conformance/contract.abort.test.ts +0 -109
- package/src/execution/engine/__tests__/conformance/contract.agent-events.test.ts +0 -101
- package/src/execution/engine/__tests__/conformance/contract.probe.test.ts +0 -77
- package/src/execution/engine/__tests__/conformance/contract.read-degradation.test.ts +0 -104
- package/src/execution/engine/__tests__/conformance/contract.relay.test.ts +0 -342
- package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +0 -201
- package/src/execution/engine/__tests__/conformance/golden-replay.pi.test.ts +0 -76
- package/src/execution/engine/__tests__/conformance/golden-replay.zcode.test.ts +0 -79
- package/src/execution/engine/__tests__/engine-discovery.test.ts +0 -87
- package/src/execution/engine/__tests__/engines-declaration.test.ts +0 -36
- package/src/execution/engine/__tests__/model-prompt.test.ts +0 -85
- package/src/execution/engine/__tests__/paths.test.ts +0 -39
- package/src/execution/engine/__tests__/registry.test.ts +0 -120
- package/src/execution/engine/__tests__/routing.test.ts +0 -231
- package/src/execution/engine/common/data-dir.ts +0 -62
- package/src/execution/engine/common/errors.ts +0 -183
- package/src/execution/engine/common/event-journal.ts +0 -254
- package/src/execution/engine/common/journal-replay.ts +0 -62
- package/src/execution/engine/common/kill-chain.ts +0 -221
- package/src/execution/engine/common/nesting-guard.ts +0 -50
- package/src/execution/engine/common/persona-router.ts +0 -108
- package/src/execution/engine/common/pool-manager.ts +0 -226
- package/src/execution/engine/common/schema-emulation.ts +0 -189
- package/src/execution/engine/common/session-view-projection.ts +0 -51
- package/src/execution/engine/engine-discovery.ts +0 -65
- package/src/execution/engine/engines/pi/__tests__/pi-engine.test.ts +0 -469
- package/src/execution/engine/engines/pi/__tests__/reader.test.ts +0 -155
- package/src/execution/engine/engines/pi/__tests__/task-spec-mapper.test.ts +0 -164
- package/src/execution/engine/engines/pi/pi-engine.ts +0 -415
- package/src/execution/engine/engines/pi/reader.ts +0 -48
- package/src/execution/engine/engines/pi/registration.ts +0 -35
- package/src/execution/engine/engines/pi/task-spec-mapper.ts +0 -100
- package/src/execution/engine/engines/zcode/__tests__/__fixtures__/zcode-golden-spawn.json +0 -39
- package/src/execution/engine/engines/zcode/__tests__/launcher.test.ts +0 -150
- package/src/execution/engine/engines/zcode/__tests__/parser.test.ts +0 -246
- package/src/execution/engine/engines/zcode/__tests__/preparer.test.ts +0 -228
- package/src/execution/engine/engines/zcode/__tests__/reader.test.ts +0 -210
- package/src/execution/engine/engines/zcode/__tests__/registration.test.ts +0 -64
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine.live.test.ts +0 -127
- package/src/execution/engine/engines/zcode/__tests__/zcode-engine.test.ts +0 -567
- package/src/execution/engine/engines/zcode/constants.ts +0 -43
- package/src/execution/engine/engines/zcode/golden-sample.ts +0 -39
- package/src/execution/engine/engines/zcode/launcher.ts +0 -161
- package/src/execution/engine/engines/zcode/parser.ts +0 -436
- package/src/execution/engine/engines/zcode/preparer.ts +0 -363
- package/src/execution/engine/engines/zcode/reader.ts +0 -381
- package/src/execution/engine/engines/zcode/registration.ts +0 -37
- package/src/execution/engine/engines/zcode/zcode-engine.ts +0 -648
- package/src/execution/engine/host-task-spec.ts +0 -47
- package/src/execution/engine/model-prompt.ts +0 -59
- package/src/execution/engine/paths.ts +0 -42
- package/src/execution/engine/port.ts +0 -153
- package/src/execution/engine/registry.ts +0 -123
- package/src/execution/engine/routing.ts +0 -218
- package/src/execution/engine/types.ts +0 -304
- package/src/execution/execute-options-mapper.ts +0 -111
- package/src/execution/execution-record.ts +0 -906
- package/src/execution/finalize-record.ts +0 -251
- package/src/execution/finalized-marker.ts +0 -51
- package/src/execution/get-state-handshake.ts +0 -104
- package/src/execution/host-mode.ts +0 -56
- package/src/execution/idle-gc.ts +0 -47
- package/src/execution/lifecycle-manager.ts +0 -491
- package/src/execution/lifecycle-predicates.ts +0 -65
- package/src/execution/manifest-store.ts +0 -256
- package/src/execution/model-config-service.ts +0 -204
- package/src/execution/model-resolver.ts +0 -276
- package/src/execution/notifier.ts +0 -260
- package/src/execution/output-collector.ts +0 -88
- package/src/execution/path-encoding.ts +0 -60
- package/src/execution/pi-invocation.ts +0 -120
- package/src/execution/record-entry.ts +0 -132
- package/src/execution/record-store.ts +0 -1234
- package/src/execution/relay-env.ts +0 -37
- package/src/execution/session-context-resolver.ts +0 -64
- package/src/execution/session-file-gc.ts +0 -120
- package/src/execution/session-pending.ts +0 -164
- package/src/execution/session-reconstructor.ts +0 -678
- package/src/execution/session-runner.ts +0 -1548
- package/src/execution/sessions-index.ts +0 -304
- package/src/execution/spawn-event-adapter.ts +0 -363
- package/src/execution/stdin-writer.ts +0 -198
- package/src/execution/stream-sink.ts +0 -126
- package/src/execution/subagent-service.ts +0 -2119
- package/src/execution/subprocess-agent-runner.ts +0 -303
- package/src/execution/temp-prompt.ts +0 -62
- package/src/execution/tombstone-store.ts +0 -72
- package/src/execution/turn-limiter.ts +0 -102
- package/src/execution/types.ts +0 -910
- package/src/execution/ui-channels.ts +0 -216
- package/src/execution/ui-interaction-model.ts +0 -48
- package/src/execution/ui-request-handler-factory.ts +0 -212
- package/src/execution/ui-request-observability.ts +0 -81
- package/src/execution/ui-request-queue.ts +0 -174
- package/src/execution/worktree-manager.ts +0 -688
- package/src/execution/worktree-registry.ts +0 -222
- package/src/orchestration/__tests__/__fixtures__/worker-template.snapshot.txt +0 -336
- package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +0 -208
- package/src/orchestration/__tests__/agent-call-stream.test.ts +0 -157
- package/src/orchestration/__tests__/args-validator.test.ts +0 -143
- package/src/orchestration/__tests__/concurrency-gate.test.ts +0 -125
- package/src/orchestration/__tests__/config-loader.test.ts +0 -503
- package/src/orchestration/__tests__/error-recovery-handlers.test.ts +0 -724
- package/src/orchestration/__tests__/error-recovery-postmessage-defense.test.ts +0 -405
- package/src/orchestration/__tests__/error-recovery-serialize-failed-result.test.ts +0 -56
- package/src/orchestration/__tests__/error-recovery-workflow-call.test.ts +0 -166
- package/src/orchestration/__tests__/execute-agent-call.test.ts +0 -314
- package/src/orchestration/__tests__/jsonl-run-store-loadall-sources.test.ts +0 -171
- package/src/orchestration/__tests__/jsonl-run-store-session-file.test.ts +0 -1030
- package/src/orchestration/__tests__/launcher-nested-workflow.test.ts +0 -277
- package/src/orchestration/__tests__/lifecycle-runid-injection.test.ts +0 -96
- package/src/orchestration/__tests__/lifecycle.test.ts +0 -625
- package/src/orchestration/__tests__/review-fix-loop-e2e.test.ts +0 -1971
- package/src/orchestration/__tests__/script-lint.test.ts +0 -831
- package/src/orchestration/__tests__/skill-discovery.test.ts +0 -157
- package/src/orchestration/__tests__/test-mocks.ts +0 -197
- package/src/orchestration/__tests__/worker-host.test.ts +0 -120
- package/src/orchestration/__tests__/worker-returnmeta-passthrough.test.ts +0 -164
- package/src/orchestration/__tests__/worker-script-builder-runtime.test.ts +0 -520
- package/src/orchestration/__tests__/worker-script-builder.test.ts +0 -309
- package/src/orchestration/__tests__/worker-script-template-snapshot.test.ts +0 -110
- package/src/orchestration/__tests__/workflow-nesting-e2e.test.ts +0 -317
- package/src/orchestration/__tests__/workflow-script-lint-memo.test.ts +0 -110
- package/src/orchestration/__tests__/workflows-e2e.test.ts +0 -537
- package/src/orchestration/agent-opts-resolver.ts +0 -93
- package/src/orchestration/args-validator.ts +0 -127
- package/src/orchestration/concurrency-gate.ts +0 -69
- package/src/orchestration/config-loader.ts +0 -315
- package/src/orchestration/error-recovery.ts +0 -862
- package/src/orchestration/execute-agent-call.ts +0 -217
- package/src/orchestration/launcher.ts +0 -410
- package/src/orchestration/lifecycle.ts +0 -396
- package/src/orchestration/models/__tests__/budget.test.ts +0 -367
- package/src/orchestration/models/__tests__/trace.test.ts +0 -408
- package/src/orchestration/models/agent-call.ts +0 -83
- package/src/orchestration/models/budget.ts +0 -148
- package/src/orchestration/models/ports.ts +0 -164
- package/src/orchestration/models/run-runtime.ts +0 -89
- package/src/orchestration/models/run-spec.ts +0 -83
- package/src/orchestration/models/run-state.ts +0 -44
- package/src/orchestration/models/trace.ts +0 -183
- package/src/orchestration/models/types.ts +0 -292
- package/src/orchestration/models/workflow-run.ts +0 -254
- package/src/orchestration/models/workflow-script-registry.ts +0 -35
- package/src/orchestration/models/workflow-script.ts +0 -117
- package/src/orchestration/script-lint.ts +0 -766
- package/src/orchestration/skill-discovery.ts +0 -92
- package/src/orchestration/worker-handle.ts +0 -115
- package/src/orchestration/worker-host.ts +0 -98
- package/src/orchestration/worker-script-builder.ts +0 -408
- package/src/orchestration/workflow-files.ts +0 -85
- package/src/orchestration/workflow-script-registry-impl.ts +0 -133
- package/src/shared/__tests__/agent-ref.test.ts +0 -34
- package/src/shared/__tests__/meta-parser.test.ts +0 -304
- package/src/shared/__tests__/resource-discovery-manifest-cache.test.ts +0 -280
- package/src/shared/__tests__/resource-discovery.test.ts +0 -736
- package/src/shared/__tests__/resource-meta.test.ts +0 -51
- package/src/shared/__tests__/schema-jsonify.test.ts +0 -81
- package/src/shared/agent-event.ts +0 -13
- package/src/shared/agent-ref.ts +0 -57
- package/src/shared/meta-parser.ts +0 -261
- package/src/shared/resource-discovery.ts +0 -811
- package/src/shared/resource-meta.ts +0 -65
- package/src/shared/schema-jsonify.ts +0 -56
- package/src/shared/xml-injection.ts +0 -35
- package/workflows/README.md +0 -81
- package/workflows/_shared/agent-refs.cjs +0 -40
- package/workflows/chain.js +0 -131
- package/workflows/map-reduce.js +0 -174
- package/workflows/parallel.js +0 -148
- package/workflows/review-fix-loop-utils.cjs +0 -1307
- package/workflows/review-fix-loop.js +0 -1396
- package/workflows/scatter-gather.js +0 -178
|
@@ -40,6 +40,21 @@
|
|
|
40
40
|
* - Budget/Trace/AgentCall 都有公共构造器或 fromArray 工厂,反序列化时重建实例。
|
|
41
41
|
* - Snapshot 形态用 SnapshotVersion 守护(D-5:格式识别)。
|
|
42
42
|
*
|
|
43
|
+
* [S3 查证结论] pi 0.84.1 实装(node_modules/@earendil-works/pi-coding-agent/dist,
|
|
44
|
+
* core/session-manager.js,PS-19)的 session 生命周期管理不含自动 GC:
|
|
45
|
+
* listSessionsFromDir 只做只读扫描(readdir + `.jsonl` 过滤 + header 解析,:548-571,
|
|
46
|
+
* 非递归——`<sessionDir>/workflow-state/` 子目录完全不在 pi 的任何扫描/清理范围内),
|
|
47
|
+
* SessionManager.list / listAll 只是它之上的 cwd 过滤/排序封装(:1281-1287 / :1289),
|
|
48
|
+
* 无按 age/数量的 retention/prune/expire 删除逻辑;唯一删除路径是 TUI SessionSelector
|
|
49
|
+
* 里用户手动删除选中的单个顶层 session 文件(trash CLI → unlink fallback,
|
|
50
|
+
* dist/modes/interactive/components/session-selector.js:539-550),非自动、
|
|
51
|
+
* 不递归子目录。**推论:workflow-state state 文件无限累积,
|
|
52
|
+
* 保留策略由本包自担**——磁盘侧保留现为 opt-in(B1):设 {@link STATE_MAX_RUNS_ENV}
|
|
53
|
+
* 后每次新 run state 文件首写成功即按 mtime 裁剪到上限(默认关,见
|
|
54
|
+
* pruneStateFilesBeyondCap);内存侧由 evictDoneRunsBeyondCap 淘汰。W17 后 state 文件
|
|
55
|
+
* 已降级为纯性能缓存(权威数据在 session JSONL 的 workflow-record entry),随 session
|
|
56
|
+
* 文件被用户删除时一并消失。
|
|
57
|
+
*
|
|
43
58
|
* 参考:domain-models.md §Ports(RunStore 定义)、clarification.md D-5。
|
|
44
59
|
*/
|
|
45
60
|
|
|
@@ -47,17 +62,17 @@ import * as fs from "node:fs";
|
|
|
47
62
|
import * as path from "node:path";
|
|
48
63
|
|
|
49
64
|
import type { CustomEntry, ExtensionAPI, ExtensionContext, SessionEntry } from "@earendil-works/pi-coding-agent";
|
|
50
|
-
import { getLogger } from "@zhushanwen/
|
|
51
|
-
|
|
52
|
-
import { AgentCall } from "
|
|
53
|
-
import { Budget } from "
|
|
54
|
-
import type { RunSpec } from "
|
|
55
|
-
import type { RunState } from "
|
|
56
|
-
import { Trace } from "
|
|
57
|
-
import type { DoneReason, RunStatus, WorkerLogEntry } from "
|
|
58
|
-
import type { AgentCallOpts, AgentResult, ExecutionTraceNode } from "
|
|
59
|
-
import type { WorkflowRunMeta } from "
|
|
60
|
-
import { WorkflowRun } from "
|
|
65
|
+
import { getLogger } from "@zhushanwen/subagent-core/core/logger.ts";
|
|
66
|
+
|
|
67
|
+
import { AgentCall } from "@zhushanwen/subagent-core/orchestration/models/agent-call.ts";
|
|
68
|
+
import { Budget } from "@zhushanwen/subagent-core/orchestration/models/budget.ts";
|
|
69
|
+
import type { RunSpec } from "@zhushanwen/subagent-core/orchestration/models/run-spec.ts";
|
|
70
|
+
import type { RunState } from "@zhushanwen/subagent-core/orchestration/models/run-state.ts";
|
|
71
|
+
import { Trace } from "@zhushanwen/subagent-core/orchestration/models/trace.ts";
|
|
72
|
+
import type { DoneReason, RunStatus, WorkerLogEntry } from "@zhushanwen/subagent-core/orchestration/models/types.ts";
|
|
73
|
+
import type { AgentCallOpts, AgentResult, ExecutionTraceNode } from "@zhushanwen/subagent-core/orchestration/models/types.ts";
|
|
74
|
+
import type { WorkflowRunMeta } from "@zhushanwen/subagent-core/orchestration/models/workflow-run.ts";
|
|
75
|
+
import { WorkflowRun } from "@zhushanwen/subagent-core/orchestration/models/workflow-run.ts";
|
|
61
76
|
|
|
62
77
|
// ── Snapshot format (D-5 version guard) ──────────────────────
|
|
63
78
|
|
|
@@ -256,15 +271,28 @@ function deserializeRun(snapshot: RunSnapshot): WorkflowRun | null {
|
|
|
256
271
|
}
|
|
257
272
|
|
|
258
273
|
/** workflow-record entry → 重建 run 写入 recordRuns(v1 entry guard + D-5 版本不匹配
|
|
259
|
-
* 跳过;同 runId 后写覆盖 = 最后一条 entry 胜出)。返回 entry 是否命中该类型。
|
|
260
|
-
|
|
274
|
+
* 跳过;同 runId 后写覆盖 = 最后一条 entry 胜出)。返回 entry 是否命中该类型。
|
|
275
|
+
*
|
|
276
|
+
* [SO-DATA-2] per-entry 隔离:deserializeRun 在 v guard 之后直接读 snapshot.state.budget
|
|
277
|
+
* 等嵌套字段,残缺 entry(截断/手改/半写)抛 TypeError 会沿 collectEntrySources 穿透
|
|
278
|
+
* loadAll 的 catch → 返回空——单条损坏让全部 run 不可见。现单条 try/catch:损坏
|
|
279
|
+
* entry 跳过 + warn 留证(含 entry 索引与原因),其余 entry 正常重建。
|
|
280
|
+
*/
|
|
281
|
+
function collectRecordRun(entry: CustomEntry, entryIndex: number, recordRuns: Map<string, WorkflowRun>): boolean {
|
|
261
282
|
if (entry.customType !== WORKFLOW_RECORD_CUSTOM_TYPE) return false;
|
|
262
283
|
// v1 entry guard:schema 版本不认识 → 跳过(不猜测解析)
|
|
263
284
|
const data = entry.data as WorkflowRecordEntryData | undefined;
|
|
264
285
|
if (data?.v !== 1 || !data.snapshot) return true;
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
286
|
+
try {
|
|
287
|
+
const run = deserializeRun(data.snapshot);
|
|
288
|
+
// D-5: null = old snapshot format / version mismatch — skip silently
|
|
289
|
+
if (run) recordRuns.set(run.runId, run); // 后写覆盖 = 最后一条 entry 胜出
|
|
290
|
+
} catch (err) {
|
|
291
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
292
|
+
logger.warn(
|
|
293
|
+
`[subagent-workflow] workflow-record entry #${entryIndex} corrupted, skipped run rebuild: ${reason}`,
|
|
294
|
+
);
|
|
295
|
+
}
|
|
268
296
|
return true;
|
|
269
297
|
}
|
|
270
298
|
|
|
@@ -287,9 +315,11 @@ function collectEntrySources(entries: SessionEntry[]): {
|
|
|
287
315
|
} {
|
|
288
316
|
const recordRuns = new Map<string, WorkflowRun>();
|
|
289
317
|
const pointers = new Map<string, { path: string }>();
|
|
290
|
-
|
|
318
|
+
// 索引循环:collectRecordRun 的 warn 留证需要 entry 索引(SO-DATA-2)
|
|
319
|
+
for (let i = 0; i < entries.length; i++) {
|
|
320
|
+
const entry = entries[i]!;
|
|
291
321
|
if (entry.type !== "custom") continue;
|
|
292
|
-
if (collectRecordRun(entry, recordRuns)) continue;
|
|
322
|
+
if (collectRecordRun(entry, i, recordRuns)) continue;
|
|
293
323
|
collectStateLinkPointer(entry, pointers);
|
|
294
324
|
}
|
|
295
325
|
return { recordRuns, pointers };
|
|
@@ -312,6 +342,58 @@ async function loadRunFromStateFile(filePath: string): Promise<WorkflowRun | nul
|
|
|
312
342
|
}
|
|
313
343
|
}
|
|
314
344
|
|
|
345
|
+
// ── State file retention (B1, opt-in) ────────────────────────
|
|
346
|
+
|
|
347
|
+
/** run state 文件名 glob:runId 形如 `wf-<ts>-<rand>`(lifecycle.ts 生成),只删命中者。
|
|
348
|
+
* 同目录可能存在的非 state 文件(及 session JSONL——在父目录,本就不在扫描范围)永不碰。 */
|
|
349
|
+
const STATE_FILE_GLOB = /^wf-.*\.jsonl$/;
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* 把 workflow-state 目录裁剪到 maxRuns 个最新 state 文件(mtime 升序,删最旧)。
|
|
353
|
+
*
|
|
354
|
+
* 只删本目录内命中 {@link STATE_FILE_GLOB} 的文件;任何失败都不抛(清理是旁路
|
|
355
|
+
* 维护,不能拖垮持久化主链路):readdir/stat 失败静默放弃本轮,单个 unlink 失败
|
|
356
|
+
* (非 ENOENT)logger.warn 留证后继续删其余——ENOENT 视为并发删除竞态下的已达成
|
|
357
|
+
* 目标,不告警。
|
|
358
|
+
*/
|
|
359
|
+
async function pruneStateFilesBeyondCap(stateDir: string, maxRuns: number): Promise<void> {
|
|
360
|
+
let names: string[];
|
|
361
|
+
try {
|
|
362
|
+
names = await fs.promises.readdir(stateDir);
|
|
363
|
+
} catch (err) {
|
|
364
|
+
if (!isEnoentError(err)) {
|
|
365
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
366
|
+
logger.warn(`[subagent-workflow] state retention: readdir ${stateDir} failed: ${reason}`);
|
|
367
|
+
}
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
const stateFiles = names.filter((n) => STATE_FILE_GLOB.test(n)).sort();
|
|
371
|
+
if (stateFiles.length <= maxRuns) return;
|
|
372
|
+
|
|
373
|
+
// stat 全集取 mtime;allSettled 部分降级——单文件 stat 失败(并发删除 ENOENT 等)
|
|
374
|
+
// 静默跳过该文件,不阻断本轮裁剪
|
|
375
|
+
const settled = await Promise.allSettled(
|
|
376
|
+
stateFiles.map(async (name) => {
|
|
377
|
+
const full = path.join(stateDir, name);
|
|
378
|
+
return { full, mtimeMs: (await fs.promises.stat(full)).mtimeMs };
|
|
379
|
+
}),
|
|
380
|
+
);
|
|
381
|
+
const byMtimeAsc = settled
|
|
382
|
+
.flatMap((r) => (r.status === "fulfilled" ? [r.value] : []))
|
|
383
|
+
.sort((a, b) => a.mtimeMs - b.mtimeMs);
|
|
384
|
+
const victims = byMtimeAsc.slice(0, byMtimeAsc.length - maxRuns);
|
|
385
|
+
for (const victim of victims) {
|
|
386
|
+
try {
|
|
387
|
+
await fs.promises.unlink(victim.full);
|
|
388
|
+
logger.debug(`[subagent-workflow] state retention: pruned ${victim.full}`);
|
|
389
|
+
} catch (err) {
|
|
390
|
+
if (isEnoentError(err)) continue; // 并发删除已达成目标
|
|
391
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
392
|
+
logger.warn(`[subagent-workflow] state retention: failed to delete ${victim.full}: ${reason}`);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
315
397
|
// ── JsonlRunStore ────────────────────────────────────────────
|
|
316
398
|
|
|
317
399
|
/** Node fs 错误 code 判定(ENOENT = 路径不存在,并发删除场景)。 */
|
|
@@ -334,6 +416,28 @@ const logger = getLogger("subagents");
|
|
|
334
416
|
*/
|
|
335
417
|
export const DEFAULT_SAVE_DEBOUNCE_MS = 200;
|
|
336
418
|
|
|
419
|
+
/**
|
|
420
|
+
* 磁盘保留清理的 opt-in 开关 env(B1):workflow-state 目录内 run state 文件上限。
|
|
421
|
+
*
|
|
422
|
+
* 默认关——未设/空/非有限数/≤0 都不清理(「limits 默认关」裁决;解析对齐
|
|
423
|
+
* session-runner 的 SPAWN_WATCHDOG_ENV watchdog 风格:Number() + Number.isFinite
|
|
424
|
+
* 过滤,非法值回落 undefined = 不启用,而非抛错或取默认上限)。
|
|
425
|
+
*
|
|
426
|
+
* 用 XYZ_ 前缀而非 PI_:本 env 是 pi 进程内读的配置 env,xyz-agent 桌面 spawn 链按
|
|
427
|
+
* ENV_WHITELIST_PREFIXES(只有 XYZ_ 等)过滤,PI_ 前缀在桌面场景被静默丢弃——
|
|
428
|
+
* 同 XYZ_SUBAGENT_IDLE_TIMEOUT_MS 的改名教训(lifecycle-manager.ts)。
|
|
429
|
+
*/
|
|
430
|
+
export const STATE_MAX_RUNS_ENV = "XYZ_SUBAGENT_STATE_MAX_RUNS";
|
|
431
|
+
|
|
432
|
+
/** 解析保留上限;env 未设/非法/≤0 返回 undefined(调用方不清理)。 */
|
|
433
|
+
function getEnvStateMaxRuns(): number | undefined {
|
|
434
|
+
const raw = process.env[STATE_MAX_RUNS_ENV];
|
|
435
|
+
if (!raw) return undefined;
|
|
436
|
+
const parsed = Number(raw);
|
|
437
|
+
if (!Number.isFinite(parsed) || parsed <= 0) return undefined;
|
|
438
|
+
return parsed;
|
|
439
|
+
}
|
|
440
|
+
|
|
337
441
|
/**
|
|
338
442
|
* per-runId 去抖批。窗口内 N 次 save 合并:latestRun 保留最新聚合引用
|
|
339
443
|
* (serialize-at-flush),settlers 收集批内全部 save() 调用方的 settle 回调。
|
|
@@ -551,6 +655,16 @@ export class JsonlRunStore {
|
|
|
551
655
|
WORKFLOW_RECORD_CUSTOM_TYPE,
|
|
552
656
|
toWorkflowRecordEntryData(snapshot),
|
|
553
657
|
);
|
|
658
|
+
// B1 磁盘保留清理(opt-in):新 run state 文件首写成功后触发(rollbackFirstWrite
|
|
659
|
+
// 即 save() 冷路径传入的 isFirstWrite——「本实例首次写该 runId」≈ 新文件落盘时刻,
|
|
660
|
+
// 每个 run 只清一次,热路径 flush 不重复扫描目录)。prune 内部吞错不抛,
|
|
661
|
+
// 在串行链上 await:save 返回即清理已定,测试可同步断言目录终态。
|
|
662
|
+
if (rollbackFirstWrite) {
|
|
663
|
+
const maxRuns = getEnvStateMaxRuns();
|
|
664
|
+
if (maxRuns !== undefined) {
|
|
665
|
+
await pruneStateFilesBeyondCap(this.stateDir, maxRuns);
|
|
666
|
+
}
|
|
667
|
+
}
|
|
554
668
|
for (const s of settlers) s.resolve();
|
|
555
669
|
} catch (err) {
|
|
556
670
|
// ES9 失败回滚(热路径 flush 也会写 entry,回滚的意义收敛为「下次 save 重走
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_meta": "Golden snapshots for BgNotifier.buildLlmContent — captured pre-migration (commit HEAD at time of capture). Used by migration verification to ensure zero behavioral regression.",
|
|
3
|
-
"single_closed_success": {
|
|
4
|
-
"input": { "id": "sa-ptr-7", "status": "closed", "agent": "worker", "result": "done", "startedAt": 1, "endedAt": 2 },
|
|
5
|
-
"output": "Subagent \"worker\" (sa-ptr-7) completed. Result:\ndone"
|
|
6
|
-
},
|
|
7
|
-
"single_closed_with_sessionfile": {
|
|
8
|
-
"input": { "id": "sa-ptr-2", "status": "closed", "agent": "w", "result": "final result", "sessionFile": "/tmp/sessions/child-2.jsonl", "startedAt": 1, "endedAt": 2 },
|
|
9
|
-
"output": "Subagent \"w\" (sa-ptr-2) completed. Result:\nfinal result\n\nFull transcript: /tmp/sessions/child-2.jsonl"
|
|
10
|
-
},
|
|
11
|
-
"single_running_round": {
|
|
12
|
-
"input": { "id": "sa-ptr-4", "status": "running", "agent": "w", "round": 2, "result": "round2 text", "startedAt": 1, "endedAt": 2 },
|
|
13
|
-
"output": "Subagent \"w\" (sa-ptr-4) finished a round. Reply:\nround2 text"
|
|
14
|
-
},
|
|
15
|
-
"single_running_round_with_sessionfile": {
|
|
16
|
-
"input": { "id": "sa-ptr-1", "status": "running", "agent": "w", "round": 1, "result": "round1 text", "sessionFile": "/tmp/sessions/child-1.jsonl", "startedAt": 1, "endedAt": 2 },
|
|
17
|
-
"output": "Subagent \"w\" (sa-ptr-1) finished a round. Reply:\nround1 text\n\nFull transcript: /tmp/sessions/child-1.jsonl"
|
|
18
|
-
},
|
|
19
|
-
"single_cancelled": {
|
|
20
|
-
"input": { "id": "sa-ptr-5", "status": "closed", "closedReason": "cancelled", "agent": "w", "startedAt": 1, "endedAt": 2 },
|
|
21
|
-
"output": "Subagent \"w\" (sa-ptr-5) cancelled."
|
|
22
|
-
},
|
|
23
|
-
"single_gc_failed": {
|
|
24
|
-
"input": { "id": "sa-ptr-6", "status": "closed", "closedReason": "gc", "agent": "w", "error": "spawn EPIPE", "startedAt": 1, "endedAt": 2 },
|
|
25
|
-
"output": "Subagent \"w\" (sa-ptr-6) failed: spawn EPIPE"
|
|
26
|
-
},
|
|
27
|
-
"single_gc_failed_with_patchfile": {
|
|
28
|
-
"input": { "id": "sa-ptr-8", "status": "closed", "closedReason": "gc", "agent": "w", "error": "spawn EPIPE", "patchFile": "/tmp/patches/sa-ptr-8.patch", "startedAt": 1, "endedAt": 2 },
|
|
29
|
-
"output": "Subagent \"w\" (sa-ptr-8) failed: spawn EPIPE"
|
|
30
|
-
},
|
|
31
|
-
"single_closed_with_patchfile_and_sessionfile": {
|
|
32
|
-
"input": { "id": "sa-ptr-3", "status": "closed", "agent": "w", "result": "did work", "patchFile": "/tmp/patches/sa-ptr-3.patch", "sessionFile": "/tmp/sessions/child-3.jsonl", "startedAt": 1, "endedAt": 2 },
|
|
33
|
-
"output_contains": "git apply /tmp/patches/sa-ptr-3.patch",
|
|
34
|
-
"output_ends_with": "\n\nFull transcript: /tmp/sessions/child-3.jsonl"
|
|
35
|
-
},
|
|
36
|
-
"single_closed_totalrounds": {
|
|
37
|
-
"input": { "id": "sa-rounds-1", "status": "closed", "agent": "w", "totalRounds": 3, "result": "", "sessionFile": "/tmp/sessions/child-rounds.jsonl", "startedAt": 1, "endedAt": 2 },
|
|
38
|
-
"output": "Subagent \"w\" (sa-rounds-1) completed after 3 rounds. Result:\n\n\nFull transcript: /tmp/sessions/child-rounds.jsonl"
|
|
39
|
-
},
|
|
40
|
-
"single_closed_no_totalrounds": {
|
|
41
|
-
"input": { "id": "sa-rounds-2", "status": "closed", "agent": "w", "result": "done", "sessionFile": "/tmp/sessions/child-oneshot.jsonl", "startedAt": 1, "endedAt": 2 },
|
|
42
|
-
"output": "Subagent \"w\" (sa-rounds-2) completed. Result:\ndone\n\nFull transcript: /tmp/sessions/child-oneshot.jsonl"
|
|
43
|
-
},
|
|
44
|
-
"batch_two_closed": {
|
|
45
|
-
"description": "Two closed records merged in one message (simulating 60s merge window)",
|
|
46
|
-
"records": [
|
|
47
|
-
{ "id": "batch-1", "status": "closed", "agent": "w1", "result": "result1", "startedAt": 1, "endedAt": 2 },
|
|
48
|
-
{ "id": "batch-2", "status": "closed", "agent": "w2", "result": "result2", "startedAt": 3, "endedAt": 4 }
|
|
49
|
-
],
|
|
50
|
-
"separator": "\n\n---\n\n",
|
|
51
|
-
"details_shape": { "batch": true, "items": "array-of-records" }
|
|
52
|
-
}
|
|
53
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[{"label":"plain-ascii-long","maxWidth":40,"text":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","expected":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa…"},{"label":"cjk-long","maxWidth":33,"text":"你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界","expected":"你好世界你好世界你好世界你好世界…"},{"label":"sgr-mixed-10k","maxWidth":60,"text":"汉字测试 data \u001b[0m\u001b[38;5;9m汉字测试 \u001b[mbeta \u001b[0mγλυφ \u001b[0malpha alpha \u001b[31m\u001b[38;5;9malpha \u001b[mdata \u001b[Kalpha \u001b[0mbeta beta \u001b[K→arrow beta \u001b[1;32m\u001b[38;5;9mdata alpha 汉字测试 alpha \u001b[31m\u001b]0;title\u0007γλυφ alpha →arrow \u001b[38;5;9m\u001b[0malpha γλυφ 汉字测试 汉字测试 beta beta →arrow →arrow 汉字测试 beta \u001b[38;5;9m\u001b[K→arrow \u001b[0malpha beta data \u001b[0m\u001b[38;5;9m\u001b[K\u001b[38;5;9mbeta 汉字测试 \u001b[m\u001b]0;title\u0007\u001b[38;5;9m→arrow beta 汉字测试 \u001b[31mdata \u001b[1;32m\u001b[K\u001b[1;32mγλυφ alpha \u001b[0m\u001b[1;32m汉字测试 汉字测试 \u001b[Kbeta γλυφ γλυφ \u001b[1;32m\u001b[1;32mbeta \u001b[38;5;9m\u001b[K\u001b[1;32m\u001b[0m\u001b[0m\u001b]0;title\u0007→arrow 汉字测试 \u001b[m→arrow 汉字测试 \u001b[38;5;9mbeta \u001b]0;title\u0007→arrow →arrow data \u001b[31m\u001b[0mdata data →arrow γλυφ \u001b[K→arrow 汉字测试 γλυφ \u001b[Kalpha \u001b]0;title\u0007\u001b[31mdata →arrow data \u001b[1;32m\u001b[31m\u001b[0mdata data \u001b[38;5;9m汉字测试 汉字测试 \u001bZ\u001b[K\u001b[K\u001b[0m\u001b[0mγλυφ alpha \u001b[31malpha 汉字测试 alpha alpha \u001b]0;title\u0007\u001b[38;5;9malpha data data data beta \u001b[31m\u001b[1;32mdata →arrow \u001b[1;32m\u001b[K\u001b[mbeta →arrow \u001b[0m→arrow γλυφ beta data data γλυφ →arrow beta data 汉字测试 beta 汉字测试 \u001b[K→arrow →arrow alpha \u001b[mbeta data data \u001b[mγλυφ alpha →arrow 汉字测试 γλυφ γλυφ \u001b[31m\u001b[31m\u001b]0;title\u0007→arrow alpha \u001b[1;32mbeta γλυφ →arrow \u001b[K\u001b[38;5;9m\u001b[0m\u001b[1;32mγλυφ γλυφ \u001b[38;5;9m→arrow \u001b[31m\u001b[1;32m\u001b[1;32mγλυφ 汉字测试 alpha data \u001b]0;title\u0007\u001b[38;5;9malpha \u001b[38;5;9m→arrow 汉字测试 beta \u001b[0mbeta beta \u001b[38;5;9mγλυφ \u001b[mdata \u001b[mbeta \u001b[1;32mdata \u001b[mbeta γλυφ \u001b[m\u001b[31mbeta γλυφ 汉字测试 alpha data \u001b[K\u001b[0m汉字测试 beta alpha 汉字测试 \u001bZ\u001b[0m\u001b[38;5;9m\u001b[mγλυφ alpha γλυφ γλυφ 汉字测试 alpha alpha beta \u001b]0;title\u0007→arrow \u001b[38;5;9m汉字测试 \u001b[0m汉字测试 data \u001b[38;5;9m→arrow 汉字测试 \u001b[m\u001b[0mdata γλυφ γλυφ →arrow data data \u001b[31malpha →arrow data \u001b[K汉字测试 γλυφ \u001b[31m\u001b]0;title\u0007alpha \u001b[1;32m汉字测试 →arrow \u001bZdata \u001b[38;5;9mbeta →arrow 汉字测试 γλυφ \u001b[Kγλυφ beta alpha data γλυφ 汉字测试 beta beta data γλυφ →arrow alpha \u001b[31malpha \u001b[0m\u001b[38;5;9malpha \u001bZ汉字测试 \u001b[38;5;9malpha γλυφ γλυφ \u001bZ汉字测试 beta \u001b[38;5;9mbeta →arrow γλυφ \u001b[K→arrow data \u001b[Kγλυφ beta \u001b[1;32mγλυφ alpha γλυφ beta beta beta 汉字测试 \u001b[1;32mγλυφ \u001b[K汉字测试 beta →arrow γλυφ γλυφ 汉字测试 汉字测试 γλυφ 汉字测试 \u001b[31m汉字测试 \u001b[K\u001b[31mbeta \u001b[0malpha beta \u001b[38;5;9m\u001b[K\u001b[K汉字测试 alpha \u001b[1;32m→arrow 汉字测试 \u001b[38;5;9mdata 汉字测试 \u001b]0;title\u0007\u001b[mbeta \u001b[m\u001b[0mγλυφ γλυφ γλυφ →arrow \u001b[1;32m汉字测试 γλυφ beta \u001b]0;title\u0007\u001b[K→arrow beta 汉字测试 data 汉字测试 beta \u001bZ\u001b[31m\u001b[31m\u001b[Kγλυφ 汉字测试 data 汉字测试 beta beta \u001b[m\u001b]0;title\u0007\u001b[m\u001b[38;5;9malpha →arrow \u001b[m\u001b[m汉字测试 \u001b[1;32m\u001b[1;32m汉字测试 \u001b[mbeta \u001b[31mdata →arrow beta γλυφ beta \u001b[m→arrow \u001b[31m\u001b[mγλυφ \u001b[38;5;9mdata \u001b[m\u001b[0m\u001b]0;title\u0007\u001b[1;32m→arrow beta \u001b[m\u001b[m\u001b[K→arrow alpha \u001b]0;title\u0007\u001b[31mγλυφ γλυφ alpha data 汉字测试 beta \u001bZ\u001b[m\u001b[1;32mγλυφ 汉字测试 \u001bZ\u001b[K\u001bZalpha γλυφ →arrow 汉字测试 alpha γλυφ \u001bZ\u001b[m汉字测试 →arrow \u001b[0mbeta data \u001b[K汉字测试 alpha data beta \u001b[1;32m\u001b[1;32m\u001b[38;5;9m\u001b[1;32m\u001b[38;5;9m\u001b[38;5;9m汉字测试 \u001b[Kγλυφ \u001b[K→arrow γλυφ 汉字测试 →arrow \u001b[0m\u001bZ\u001b[38;5;9m\u001b[K\u001b[38;5;9mγλυφ →arrow γλυφ 汉字测试 beta \u001b[38;5;9m\u001b[31mbeta \u001b[31m\u001b]0;title\u0007汉字测试 →arrow beta 汉字测试 \u001b[31mdata 汉字测试 \u001b[38;5;9mbeta data γλυφ →arrow \u001bZdata \u001b[m→arrow \u001b[31m汉字测试 →arrow \u001bZ\u001b]0;title\u0007alpha \u001b[mγλυφ beta \u001b[m\u001b[1;32mγλυφ \u001b[1;32m\u001b[1;32m→arrow 汉字测试 beta 汉字测试 汉字测试 汉字测试 γλυφ \u001b[38;5;9mγλυφ \u001b[1;32m\u001b[m\u001b[0mbeta \u001b[0m\u001b[38;5;9mbeta γλυφ →arrow beta \u001b[mγλυφ \u001b[1;32m\u001b[malpha \u001b[38;5;9mdata 汉字测试 →arrow →arrow \u001b]0;title\u0007\u001b[31mγλυφ \u001b[mdata beta alpha \u001b[Kγλυφ data data data γλυφ 汉字测试 alpha \u001b]0;title\u0007\u001b[38;5;9m\u001b[38;5;9m\u001b[38;5;9m\u001b[31m\u001b[31m→arrow \u001b[K\u001b[Kdata \u001b[1;32m\u001b[0mdata →arrow data \u001b[1;32m\u001bZ\u001b[m\u001b[0m汉字测试 →arrow beta \u001b[0m汉字测试 alpha \u001b[38;5;9m\u001b]0;title\u0007\u001b[38;5;9mbeta \u001b[31m\u001b[1;32m→arrow \u001b]0;title\u0007beta beta \u001b[38;5;9m汉字测试 γλυφ \u001b[mγλυφ \u001b[31m→arrow \u001b[K\u001b[1;32m汉字测试 \u001b[K汉字测试 \u001b[0malpha \u001b[1;32m\u001b[0m→arrow 汉字测试 beta beta data γλυφ \u001b[Kγλυφ \u001b[0m\u001b[1;32malpha 汉字测试 \u001b[1;32m\u001b[K\u001b[38;5;9m\u001b[0mγλυφ alpha alpha \u001b[m\u001b[0m\u001bZγλυφ data 汉字测试 \u001b[38;5;9m→arrow data beta \u001b[31mdata γλυφ \u001b[38;5;9mbeta \u001bZ→arrow alpha →arrow \u001b[31m\u001b[0m\u001b[mγλυφ \u001b[m\u001b[Kbeta data →arrow \u001b[K\u001b[31mbeta γλυφ →arrow data \u001b[31m\u001b[31malpha \u001b[31m\u001b[0malpha →arrow 汉字测试 \u001b]0;title\u0007\u001b[malpha \u001b[31m\u001b[31mdata \u001b]0;title\u0007\u001b[0malpha \u001b[0m汉字测试 \u001b[31mγλυφ 汉字测试 \u001bZ\u001bZ\u001b[38;5;9mbeta →arrow 汉字测试 \u001b[38;5;9m\u001b[31m→arrow \u001b]0;title\u0007beta 汉字测试 \u001b]0;title\u0007\u001b]0;title\u0007\u001b]0;title\u0007→arrow 汉字测试 \u001b[31m\u001b[malpha data 汉字测试 data beta 汉字测试 →arrow γλυφ \u001b[0m\u001b[mγλυφ beta \u001b[38;5;9malpha \u001b[0m\u001b[mγλυφ \u001b[K汉字测试 \u001b[1;32m\u001b[31malpha alpha \u001b[m\u001bZγλυφ 汉字测试 γλυφ alpha \u001b[31mdata γλυφ \u001b[1;32mdata \u001b[malpha \u001b[Kγλυφ \u001b[31m→arrow beta \u001b[K\u001b[K\u001b[1;32malpha \u001b]0;title\u0007\u001b[31m\u001b[1;32mbeta \u001b[Kbeta γλυφ alpha γλυφ \u001b[38;5;9malpha \u001b[31mdata \u001b]0;title\u0007beta \u001b[K\u001b[m\u001b[K\u001b[K汉字测试 \u001b[K\u001b[38;5;9mdata alpha \u001b[Kdata \u001b[mdata γλυφ beta \u001b[38;5;9m\u001b[mγλυφ \u001b[mbeta \u001b[m\u001bZ\u001b[38;5;9m\u001b]0;title\u0007\u001b[K\u001b[malpha 汉字测试 \u001b[38;5;9mγλυφ beta →arrow beta →arrow γλυφ \u001b[31m→arrow \u001b[38;5;9mγλυφ alpha 汉字测试 beta \u001b[31malpha \u001b[Kalpha alpha \u001b[m\u001b[38;5;9m\u001b[1;32m\u001b[0m→arrow data \u001b]0;title\u0007汉字测试 \u001b[38;5;9mbeta \u001b[mbeta \u001b[0m汉字测试 alpha 汉字测试 \u001b[mdata γλυφ \u001bZ\u001b[1;32mbeta data alpha γλυφ data \u001b[malpha \u001b[38;5;9mbeta beta alpha \u001b[0m\u001b[31m\u001b[m\u001b[31m汉字测试 \u001b[K\u001b[38;5;9mdata \u001b[38;5;9malpha alpha \u001bZ\u001b]0;title\u0007beta \u001b[0m\u001bZ汉字测试 γλυφ γλυφ γλυφ \u001b[malpha \u001b]0;title\u0007汉字测试 汉字测试 \u001b[0m\u001b[Kbeta \u001b[mbeta beta γλυφ 汉字测试 \u001b[1;32m\u001b[Kdata →arrow \u001b[31m→arrow γλυφ γλυφ 汉字测试 \u001b]0;title\u0007\u001b[m\u001b[1;32malpha data \u001bZalpha \u001b]0;title\u0007\u001b[K→arrow \u001b[m\u001b[mγλυφ \u001b[m\u001b[31m\u001b[1;32m→arrow \u001b[31m\u001b[m→arrow 汉字测试 →arrow beta alpha γλυφ \u001b[Kbeta \u001bZ\u001b[38;5;9mdata γλυφ γλυφ alpha \u001b[31m\u001b[K\u001b[1;32m\u001b[m\u001b]0;title\u0007data →arrow alpha →arrow beta beta data beta 汉字测试 alpha \u001b[31malpha beta \u001b[0m\u001b[38;5;9m\u001b[31m\u001b[38;5;9m→arrow \u001b[K\u001b[Kalpha beta \u001b[31m\u001b[1;32mdata \u001b[1;32m\u001b[K\u001b[m\u001b]0;title\u0007\u001b[31m\u001b[38;5;9m\u001b[Kbeta →arrow γλυφ \u001bZalpha γλυφ →arrow →arrow \u001b[m\u001b[K\u001b[1;32m\u001b[malpha 汉字测试 \u001b[mbeta →arrow γλυφ alpha \u001b[0m\u001b[0malpha beta \u001b[m\u001b[1;32m\u001b[1;32malpha →arrow γλυφ \u001b[38;5;9m\u001b[0m\u001b[1;32m\u001bZ→arrow \u001b[38;5;9m\u001b[31malpha alpha 汉字测试 →arrow data beta data \u001b]0;title\u0007γλυφ \u001b[K\u001b[0m→arrow γλυφ alpha \u001b[31m\u001b[m→arrow \u001b]0;title\u0007\u001b[38;5;9m\u001b[0m\u001b[malpha 汉字测试 \u001b[31mγλυφ →arrow \u001b[Kalpha alpha beta \u001b[38;5;9mbeta →arrow data γλυφ beta beta \u001b[38;5;9malpha \u001b[38;5;9m\u001b[m汉字测试 \u001b[m\u001b]0;title\u0007alpha \u001b[K\u001b[38;5;9m\u001b[mγλυφ \u001b[Kγλυφ data 汉字测试 \u001b]0;title\u0007\u001b[0mγλυφ →arrow →arrow →arrow \u001b[1;32mγλυφ 汉字测试 汉字测试 \u001b[0m\u001b[m\u001b[38;5;9mdata 汉字测试 \u001b[1;32m\u001b[0m\u001b[31mγλυφ \u001b]0;title\u0007alpha \u001b[38;5;9m\u001b[31m\u001b[31m\u001b[31malpha 汉字测试 alpha \u001b[0m\u001bZbeta →arrow \u001b[31malpha alpha \u001b[0mdata beta alpha alpha data →arrow beta γλυφ \u001b[31m\u001b[K\u001b[1;32mγλυφ \u001b[1;32m\u001b[1;32m汉字测试 data 汉字测试 beta beta \u001b[m\u001b[Kγλυφ data \u001b[mγλυφ 汉字测试 γλυφ \u001b[m\u001b]0;title\u0007→arrow →arrow \u001b[0m\u001b[mbeta beta 汉字测试 →arrow γλυφ γλυφ \u001b[38;5;9m→arrow \u001b[1;32mγλυφ \u001b]0;title\u0007data \u001b[1;32mbeta \u001b[31m→arrow 汉字测试 alpha data →arrow data \u001b[0m汉字测试 \u001b[m\u001b]0;title\u0007beta alpha \u001b[38;5;9m汉字测试 \u001b[mγλυφ beta \u001b[1;32m\u001b[malpha 汉字测试 \u001b[1;32m\u001b[0m\u001b[31m\u001bZalpha →arrow alpha \u001b[1;32mdata beta data →arrow \u001b]0;title\u0007beta data γλυφ alpha \u001b[38;5;9malpha alpha data \u001bZ\u001b[38;5;9m汉字测试 alpha \u001bZ\u001b[38;5;9mdata alpha →arrow →arrow \u001b[31m\u001b[Kbeta alpha γλυφ beta \u001b[mbeta \u001b[31mγλυφ \u001bZ\u001bZ\u001b[K\u001bZbeta alpha \u001b[1;32m\u001b[31m\u001b]0;title\u0007beta \u001b]0;title\u0007\u001b[1;32malpha beta beta \u001b[0m\u001bZγλυφ alpha \u001b[mdata \u001b[38;5;9m汉字测试 beta \u001b[38;5;9malpha \u001b[Kdata \u001b[0m汉字测试 γλυφ →arrow data \u001b[31mdata γλυφ \u001b[1;32m汉字测试 alpha \u001b]0;title\u0007alpha \u001b[38;5;9m\u001bZalpha 汉字测试 alpha beta γλυφ \u001b[38;5;9m\u001b[Kdata \u001b[1;32malpha data \u001b]0;title\u0007\u001b[m\u001b[1;32m\u001b[K\u001b[38;5;9m\u001b[38;5;9mγλυφ \u001b[m→arrow →arrow \u001b[1;32mγλυφ \u001b[31mdata →arrow \u001b[malpha \u001b]0;title\u0007\u001b[K\u001b[0mbeta 汉字测试 \u001b[31m→arrow \u001b[K\u001b]0;title\u0007alpha beta \u001b]0;title\u0007\u001b[0m汉字测试 beta →arrow beta γλυφ →arrow beta \u001b[m\u001b[K\u001b]0;title\u0007\u001b[m\u001b[0m\u001b[1;32m\u001b[38;5;9mbeta γλυφ data alpha γλυφ \u001b[mγλυφ \u001b[1;32m汉字测试 →arrow 汉字测试 汉字测试 \u001b]0;title\u0007beta alpha \u001b[0mbeta data \u001b[0malpha \u001b[31m\u001b[38;5;9m→arrow data \u001b[31m\u001b]0;title\u0007\u001b[malpha γλυφ \u001b[31m\u001b[38;5;9m\u001bZ\u001b]0;title\u0007alpha \u001b[38;5;9m\u001b[mdata \u001b[31m→arrow alpha \u001b[Kbeta \u001bZ\u001b[0m\u001b[38;5;9m\u001b[m\u001b[1;32mγλυφ alpha data \u001b[31mbeta data \u001b[1;32mbeta →arrow \u001b[mbeta \u001b[31m\u001b[31m\u001b[m\u001b[1;32mdata γλυφ \u001b[38;5;9m→arrow 汉字测试 alpha alpha \u001b[K汉字测试 \u001b[m\u001b[m\u001b[38;5;9m\u001b[31m\u001b[m\u001b[K\u001b[mγλυφ data \u001b[31m\u001b[38;5;9m→arrow 汉字测试 \u001b[38;5;9mdata data alpha \u001b[38;5;9m汉字测试 \u001b[38;5;9m\u001b[31m\u001b[31mbeta \u001b[Kdata data data 汉字测试 γλυφ \u001b]0;title\u0007γλυφ \u001b[m\u001b[38;5;9m汉字测试 data 汉字测试 \u001b[Kγλυφ \u001b]0;title\u0007data \u001b[mdata γλυφ \u001b[1;32m\u001b[31mbeta 汉字测试 \u001b[38;5;9m→arrow \u001b[1;32m汉字测试 beta →arrow γλυφ beta γλυφ alpha \u001b[38;5;9m\u001bZbeta \u001b[38;5;9m\u001b[1;32m\u001b[K→arrow \u001b[38;5;9m\u001b[K\u001b[0mγλυφ alpha beta \u001b[1;32mbeta beta →arrow →arrow 汉字测试 γλυφ alpha \u001b[31mdata \u001b]0;title\u0007→arrow \u001b[38;5;9m\u001b[1;32m\u001b]0;title\u0007\u001b[0m→arrow beta \u001b[Kdata data data beta data data γλυφ γλυφ 汉字测试 \u001b[mγλυφ \u001bZ汉字测试 \u001b]0;title\u0007\u001b]0;title\u0007\u001b[0m\u001bZ\u001b[31mγλυφ data \u001b[38;5;9m\u001b[Kdata γλυφ γλυφ \u001b[0m\u001b[K\u001b[0m→arrow alpha \u001b[K\u001b]0;title\u0007data \u001b[38;5;9mdata →arrow \u001b[m\u001b[38;5;9m汉字测试 \u001bZbeta beta \u001b[Kalpha \u001b[38;5;9m\u001b[0m\u001bZ\u001b[31m\u001b[38;5;9m→arrow \u001b[0m→arrow →arrow →arrow →arrow \u001b[0m汉字测试 data \u001b[1;32m→arrow alpha →arrow \u001b[38;5;9m汉字测试 \u001b[38;5;9m\u001b[38;5;9mdata \u001b]0;title\u0007\u001b]0;title\u0007\u001b]0;title\u0007\u001b[38;5;9mγλυφ \u001b]0;title\u0007\u001b[1;32mγλυφ 汉字测试 \u001b[malpha \u001b[0m汉字测试 beta \u001bZ\u001b[K\u001b[K→arrow \u001b[38;5;9mγλυφ γλυφ \u001b[1;32mγλυφ →arrow \u001bZdata γλυφ \u001bZ\u001b[K\u001bZ\u001bZγλυφ \u001b]0;title\u0007\u001bZ\u001b[38;5;9m\u001b[1;32m\u001b[1;32m\u001b[m\u001b[mdata beta \u001b[K\u001bZ\u001b[38;5;9m\u001bZalpha \u001b[0m\u001b[K→arrow 汉字测试 beta beta alpha \u001b[m汉字测试 beta →arrow \u001b[38;5;9malpha data →arrow 汉字测试 γλυφ \u001b[38;5;9m\u001b[m\u001b]0;title\u0007\u001b]0;title\u0007\u001b[Kbeta beta \u001bZγλυφ \u001b[1;32m\u001b[31m\u001b[31m\u001b[38;5;9mγλυφ \u001bZdata \u001b[0m\u001b[31mγλυφ data \u001b[0m\u001b[31m→arrow \u001b[38;5;9malpha beta \u001bZdata \u001b[Kdata \u001b[1;32mdata 汉字测试 γλυφ \u001b[K\u001b]0;title\u0007→arrow 汉字测试 \u001b[38;5;9m\u001b[K\u001b[38;5;9mbeta \u001b[38;5;9m\u001b[31m→arrow →arrow \u001b[31m\u001b[31m\u001b]0;title\u0007→arrow 汉字测试 \u001b[malpha beta \u001b[38;5;9mγλυφ data γλυφ \u001b]0;title\u0007\u001b[m\u001bZalpha beta \u001b[0m\u001b[0m汉字测试 \u001b[mdata 汉字测试 \u001b[0m→arrow \u001b[0mγλυφ data data \u001b[0m\u001bZ\u001b[m\u001b[0mbeta γλυφ alpha \u001b[K汉字测试 \u001b[0m\u001bZ\u001b[38;5;9mγλυφ beta \u001b[Kalpha γλυφ 汉字测试 \u001b[31mγλυφ γλυφ beta beta \u001b[1;32m→arrow 汉字测试 \u001b[38;5;9m\u001b]0;title\u0007data \u001b[K\u001b[31mdata γλυφ \u001b]0;title\u0007alpha γλυφ \u001b[1;32m\u001b[Kalpha data data \u001b[1;32m\u001b[m→arrow 汉字测试 →arrow beta γλυφ \u001b[38;5;9m\u001bZalpha \u001b[Kalpha \u001bZ\u001b[m\u001b[0m\u001b[38;5;9m→arrow \u001b[m→arrow beta \u001b[Kbeta \u001b[38;5;9m\u001b[Kdata beta 汉字测试 \u001b[Kγλυφ \u001b[38;5;9m\u001b]0;title\u0007γλυφ \u001b[0m汉字测试 汉字测试 \u001b[31mdata \u001b[1;32m\u001b[m\u001b[Kdata \u001b[K\u001b]0;title\u0007\u001b[1;32mbeta \u001b[0mdata \u001b[31m汉字测试 γλυφ →arrow data γλυφ alpha →arrow \u001b[0m\u001b[38;5;9mbeta beta \u001b[malpha 汉字测试 data →arrow γλυφ \u001b[1;32mdata alpha beta \u001b[31m\u001b[Kbeta →arrow data \u001b[31m\u001b[38;5;9mdata \u001b[38;5;9malpha \u001b[Kγλυφ \u001b]0;title\u0007→arrow data \u001b[1;32m\u001b[31m\u001b[0m\u001b[1;32m\u001b[38;5;9m→arrow 汉字测试 beta γλυφ 汉字测试 →arrow \u001b[mdata alpha \u001b[mγλυφ →arrow \u001b[31mγλυφ beta \u001b[1;32mdata \u001b[0m→arrow beta \u001b[31m\u001b[31m\u001b[1;32m汉字测试 data data γλυφ ","expected":"汉字测试 data \u001b[0m\u001b[38;5;9m汉字测试 \u001b[mbeta \u001b[0mγλυφ \u001b[0malpha alpha \u001b[31m\u001b[38;5;9malpha \u001b[mdata \u001b[K…"},{"label":"sgr-mixed-10k-narrow","maxWidth":12,"text":"\u001b[31mdata 汉字测试 beta data \u001b[31mγλυφ \u001b[1;32m\u001b[0m\u001b[m\u001b[m\u001b[31m\u001b[1;32mdata \u001b[mγλυφ →arrow →arrow alpha \u001b[1;32m\u001bZ\u001b[31m汉字测试 \u001bZ→arrow data \u001b[K\u001b[K\u001b[31mbeta \u001b[38;5;9m\u001b[K\u001b[38;5;9mγλυφ γλυφ alpha γλυφ →arrow γλυφ →arrow data \u001b[0m\u001b[Kγλυφ →arrow data \u001bZdata beta \u001b[31m\u001b[mγλυφ \u001b[38;5;9mdata beta γλυφ γλυφ alpha γλυφ alpha \u001b]0;title\u0007\u001b[mdata →arrow data 汉字测试 \u001b[0m→arrow \u001b[0mγλυφ \u001b[1;32m汉字测试 \u001b[31m\u001b[31m\u001b[malpha \u001b[0mdata \u001b]0;title\u0007\u001b]0;title\u0007data γλυφ 汉字测试 beta data \u001b[1;32mdata 汉字测试 \u001b[Kbeta \u001b]0;title\u0007data \u001bZγλυφ 汉字测试 beta γλυφ →arrow 汉字测试 →arrow γλυφ \u001b[38;5;9m\u001b]0;title\u0007→arrow \u001b]0;title\u0007\u001b[31mdata beta \u001b[31m→arrow data beta beta 汉字测试 data data γλυφ \u001b[malpha 汉字测试 γλυφ →arrow \u001b[31m\u001b[0m\u001b]0;title\u0007→arrow →arrow \u001b[0mdata 汉字测试 →arrow alpha \u001b[38;5;9m\u001b[31mbeta beta data \u001b[0malpha \u001b[1;32mdata \u001b[0m\u001b[0mγλυφ \u001b[38;5;9m\u001b[Kdata \u001b[31m→arrow \u001b[mbeta \u001b[31mdata \u001b[0m\u001b[0m\u001bZalpha beta \u001b[1;32malpha \u001b[m汉字测试 data \u001b[0m\u001b[0m→arrow \u001b[0m\u001b]0;title\u0007\u001b[m\u001b[31m\u001b[1;32mdata data →arrow data beta \u001bZbeta \u001b[0mdata \u001bZbeta γλυφ 汉字测试 alpha γλυφ γλυφ \u001b[0mdata data \u001b[Kalpha 汉字测试 \u001b[0m\u001b[mγλυφ alpha beta \u001b[38;5;9mbeta \u001b[0mbeta →arrow \u001b[0mbeta \u001b[38;5;9m\u001b[0mdata data data data γλυφ data data →arrow γλυφ \u001b[1;32mbeta alpha γλυφ beta \u001b[1;32mγλυφ \u001b[K\u001b[1;32malpha \u001b[1;32malpha alpha γλυφ γλυφ \u001b]0;title\u0007beta \u001b]0;title\u0007data data \u001b]0;title\u0007beta \u001b[1;32m\u001b[38;5;9m\u001b[1;32m\u001b[1;32m→arrow data alpha \u001b[1;32m\u001bZalpha 汉字测试 \u001b[31m汉字测试 \u001b[K\u001b[0m→arrow data →arrow \u001b[Kdata →arrow data \u001b[K\u001b[K汉字测试 alpha γλυφ \u001b[0m→arrow \u001b[31m汉字测试 \u001b[31m\u001bZ\u001b[38;5;9mdata data →arrow γλυφ →arrow \u001b[Kdata 汉字测试 \u001b[0mdata \u001b[Kdata data data \u001b[38;5;9mbeta \u001bZdata 汉字测试 →arrow \u001b[38;5;9m\u001b[0mγλυφ \u001bZγλυφ alpha \u001b[m\u001b[m\u001b[K汉字测试 beta \u001b[0malpha alpha γλυφ \u001b[mdata \u001b[31mbeta \u001b[Kbeta \u001b[0m→arrow γλυφ 汉字测试 \u001b[1;32mγλυφ alpha \u001b[31mdata alpha →arrow →arrow 汉字测试 \u001b[1;32malpha \u001b]0;title\u0007data \u001bZdata γλυφ \u001b[31mdata \u001b]0;title\u0007γλυφ alpha \u001b[1;32mdata data beta \u001b]0;title\u0007\u001b[0m\u001b[31m\u001b[Kbeta →arrow alpha →arrow →arrow data data \u001b[K\u001b[0m\u001b[31malpha \u001b[0m\u001b[m汉字测试 beta \u001b[0m→arrow alpha →arrow alpha beta alpha \u001b[m\u001b[31m→arrow →arrow 汉字测试 \u001b[31m→arrow 汉字测试 data 汉字测试 \u001b[38;5;9m\u001b[31mγλυφ \u001b[1;32mγλυφ →arrow 汉字测试 汉字测试 汉字测试 \u001b[m\u001b[31m\u001b[1;32malpha 汉字测试 alpha \u001b[31mbeta \u001b[38;5;9mbeta 汉字测试 \u001b[m\u001b[K汉字测试 →arrow beta γλυφ →arrow γλυφ \u001b]0;title\u0007\u001b[mdata \u001b[0mbeta \u001b[K\u001bZ→arrow data \u001b]0;title\u0007alpha \u001b[38;5;9m\u001b[Kdata \u001b[38;5;9m\u001b[m汉字测试 data \u001b]0;title\u0007汉字测试 \u001b[1;32malpha \u001b[0m汉字测试 \u001b[38;5;9malpha alpha beta 汉字测试 汉字测试 beta γλυφ →arrow \u001b[31m\u001b[K\u001b[31m\u001b]0;title\u0007\u001b[0mγλυφ alpha beta data \u001b[31mdata data \u001bZγλυφ γλυφ γλυφ \u001b[m→arrow \u001b[38;5;9m汉字测试 汉字测试 γλυφ \u001b[K→arrow \u001b[0m\u001b[1;32mγλυφ data data data 汉字测试 \u001b[1;32mγλυφ →arrow beta γλυφ \u001b[0mbeta \u001b[0m\u001b[0malpha \u001b[38;5;9mbeta \u001bZalpha \u001b]0;title\u0007\u001b[38;5;9mγλυφ beta data \u001b[Kγλυφ \u001b[0m→arrow data \u001b[1;32mdata \u001b[31mbeta \u001b[0m\u001b[m\u001b[Kdata data \u001b[0m→arrow \u001b[K\u001b[Kalpha →arrow \u001b[Kbeta beta \u001b[31m\u001b[Kγλυφ beta data beta \u001b[Kdata \u001b[0mγλυφ →arrow →arrow alpha \u001b[mbeta alpha →arrow alpha \u001b[0mγλυφ 汉字测试 γλυφ data γλυφ \u001bZ\u001b[Kγλυφ \u001b[mbeta \u001b]0;title\u0007\u001b[0mbeta 汉字测试 汉字测试 →arrow \u001b[0m\u001b[K\u001b[m\u001b[38;5;9m\u001b[38;5;9m\u001b[m\u001bZ\u001b[1;32mbeta \u001b[31m\u001b[38;5;9m汉字测试 →arrow beta alpha \u001b[0m\u001b[1;32m\u001b[38;5;9m\u001b[38;5;9m\u001b[38;5;9m\u001b[Kγλυφ beta 汉字测试 \u001b[mdata alpha data \u001b[Kdata \u001b[K\u001b[31m→arrow beta γλυφ 汉字测试 \u001b[Kγλυφ data γλυφ \u001b[38;5;9m→arrow data alpha γλυφ data \u001b[31m\u001b[K\u001b[38;5;9mdata 汉字测试 alpha \u001b[31m\u001b[31mbeta \u001b[0mγλυφ \u001b[1;32m\u001b[38;5;9m\u001b[K\u001b[K\u001b[0m\u001bZ→arrow γλυφ 汉字测试 beta \u001bZalpha γλυφ beta \u001b[1;32malpha γλυφ \u001b[31m\u001b[31m\u001b[38;5;9m→arrow \u001b[31malpha 汉字测试 data \u001b[1;32mbeta 汉字测试 γλυφ alpha \u001b[38;5;9m汉字测试 data \u001b[0mbeta alpha →arrow beta beta γλυφ γλυφ \u001b[0m\u001b[K\u001b[0m\u001b[31m→arrow \u001b[38;5;9malpha \u001b[0m\u001b[K→arrow \u001b[0m\u001b]0;title\u0007\u001b[38;5;9m\u001b[0malpha \u001b[0m\u001b]0;title\u0007\u001b[38;5;9mbeta beta \u001b[K\u001b[1;32mbeta →arrow 汉字测试 \u001b[38;5;9m\u001b[K→arrow \u001b[0malpha beta \u001b[0m汉字测试 →arrow alpha 汉字测试 →arrow \u001b[mdata beta \u001b[38;5;9m汉字测试 beta \u001b[31m\u001b[38;5;9m\u001b[Kalpha data \u001b[31m汉字测试 beta →arrow \u001b[38;5;9malpha data alpha \u001b[1;32m\u001b[0m\u001bZγλυφ \u001b[Kγλυφ beta →arrow \u001b[38;5;9m\u001b[m\u001b]0;title\u0007\u001b[1;32mγλυφ alpha \u001b[1;32m→arrow \u001bZγλυφ \u001b[1;32m\u001bZγλυφ 汉字测试 →arrow beta \u001b[malpha →arrow \u001b[1;32malpha alpha \u001b[31malpha alpha \u001b[31m\u001b[Kγλυφ beta \u001b[m\u001b[31mγλυφ \u001b[0m→arrow γλυφ beta alpha \u001b[0mγλυφ alpha alpha \u001b[38;5;9mbeta data γλυφ beta \u001b]0;title\u0007\u001bZγλυφ \u001bZ\u001b[0m\u001b[1;32mγλυφ beta 汉字测试 \u001b[0malpha \u001b[31m\u001b[38;5;9m\u001b[m\u001b[mbeta \u001b[Kalpha →arrow \u001b[38;5;9m\u001bZdata γλυφ \u001b]0;title\u0007γλυφ \u001b[K→arrow \u001bZ\u001b[38;5;9mbeta γλυφ 汉字测试 alpha data γλυφ \u001b[38;5;9m\u001bZγλυφ \u001b]0;title\u0007alpha →arrow 汉字测试 \u001b[31m汉字测试 \u001b[1;32m\u001b[K\u001b[K\u001b[0mbeta 汉字测试 \u001b]0;title\u0007beta data \u001bZ\u001b[m\u001b[m\u001b[0m\u001bZ\u001b[1;32m汉字测试 γλυφ \u001b[38;5;9m\u001b[K→arrow data →arrow \u001b[1;32m\u001b[K\u001b[1;32m汉字测试 汉字测试 beta →arrow data alpha \u001b[m→arrow \u001b[31m\u001bZγλυφ \u001b[1;32mγλυφ \u001b[m\u001bZ\u001b[31m\u001b[0malpha 汉字测试 \u001b[38;5;9m汉字测试 \u001b[38;5;9mγλυφ alpha γλυφ \u001b[1;32m\u001b[38;5;9m\u001b[mdata \u001b[38;5;9mdata \u001b]0;title\u0007\u001b[38;5;9m\u001b[1;32mγλυφ \u001b[38;5;9m\u001b[31m\u001b[1;32mbeta \u001b[31mγλυφ \u001b[38;5;9m→arrow \u001b[31malpha \u001b[38;5;9m汉字测试 \u001b[mbeta beta \u001b[Kγλυφ \u001b[38;5;9m\u001b]0;title\u0007\u001b[0m\u001b[1;32m\u001b[1;32m\u001b[31mbeta \u001b]0;title\u0007data data beta 汉字测试 \u001b]0;title\u0007\u001b[38;5;9m\u001bZdata \u001b[31mγλυφ \u001b[m→arrow \u001b]0;title\u0007beta →arrow 汉字测试 \u001b[mdata \u001b[31malpha γλυφ \u001b[38;5;9m→arrow beta 汉字测试 →arrow γλυφ →arrow \u001b]0;title\u0007\u001b]0;title\u0007汉字测试 alpha \u001b[31m汉字测试 \u001b[1;32m\u001b[38;5;9m\u001b[m\u001b[0m汉字测试 \u001b[m\u001b[38;5;9m→arrow γλυφ \u001b[38;5;9mbeta →arrow \u001b[Kdata alpha 汉字测试 \u001b[1;32m汉字测试 \u001bZ\u001bZalpha \u001b[31m\u001b[mbeta \u001b[m\u001b[K\u001bZ\u001b[1;32mγλυφ \u001b[K→arrow \u001b[m\u001b[1;32mbeta alpha \u001b[0m\u001b[38;5;9m\u001b[1;32mbeta →arrow beta beta 汉字测试 \u001b[0m汉字测试 alpha \u001bZalpha data \u001b[1;32mdata \u001b[malpha alpha \u001b]0;title\u0007\u001b[0m\u001b[0malpha 汉字测试 alpha \u001b[1;32mγλυφ \u001b[0malpha beta \u001b]0;title\u0007\u001bZ\u001b[38;5;9mγλυφ beta γλυφ \u001b[Kalpha \u001b[31m\u001b[0malpha alpha beta \u001b[1;32mγλυφ beta \u001b[0m\u001b[K汉字测试 汉字测试 \u001b[31mbeta \u001b[1;32m汉字测试 alpha \u001b[0m→arrow \u001b[mdata γλυφ alpha alpha beta data \u001b[mγλυφ γλυφ \u001b[0mγλυφ \u001b[0malpha beta \u001b[31mbeta alpha \u001b[malpha data \u001bZ\u001b[1;32m\u001b]0;title\u0007\u001b[38;5;9mγλυφ 汉字测试 γλυφ beta \u001b[38;5;9m\u001b[0m→arrow 汉字测试 →arrow beta beta beta beta →arrow →arrow \u001b[1;32mdata \u001b[0m\u001b[1;32malpha \u001b[m\u001b[38;5;9m汉字测试 \u001b[K\u001bZ汉字测试 \u001b[1;32m→arrow beta alpha \u001b[0mγλυφ →arrow \u001b[mdata →arrow \u001b]0;title\u0007data beta \u001b[Kbeta →arrow alpha 汉字测试 \u001bZ\u001b[K\u001b[0mdata \u001b[31m\u001b[Kγλυφ →arrow γλυφ beta \u001b[38;5;9m→arrow \u001b[38;5;9mdata →arrow 汉字测试 \u001b[38;5;9m\u001b[1;32m汉字测试 \u001b[1;32m\u001b[38;5;9m\u001b[0mγλυφ \u001b[K\u001b[1;32malpha alpha \u001b[K→arrow \u001b[1;32m\u001b[Kalpha \u001b[K汉字测试 \u001b[1;32m\u001b[Kγλυφ \u001b[0m→arrow data →arrow 汉字测试 γλυφ alpha 汉字测试 beta beta data data \u001bZ\u001b[1;32m\u001b]0;title\u0007\u001bZ\u001b]0;title\u0007\u001b[0m\u001b[31mdata data γλυφ \u001b[31m→arrow \u001b[m\u001b[31mdata →arrow data alpha \u001b[38;5;9mdata data \u001b[Kγλυφ \u001b[1;32malpha \u001b[m→arrow data →arrow alpha \u001b[0m\u001b]0;title\u0007alpha alpha \u001b[38;5;9m\u001b[m\u001b[38;5;9mbeta \u001b[m\u001b[31malpha alpha \u001b[m\u001b[K\u001b[m→arrow \u001b[K\u001b[1;32mγλυφ →arrow →arrow alpha \u001b[m\u001b[38;5;9m\u001b[31m\u001b[m汉字测试 γλυφ beta \u001b[0mbeta data \u001b[K\u001b[K\u001b[m→arrow \u001b[1;32m\u001b[31mbeta \u001b[31malpha \u001b[Kalpha γλυφ 汉字测试 \u001b[K\u001b[1;32mbeta →arrow alpha data 汉字测试 \u001b]0;title\u0007beta γλυφ \u001b[K\u001b[0m\u001b[31malpha \u001b[Kbeta \u001b[1;32mbeta \u001b[malpha →arrow 汉字测试 \u001b[1;32m→arrow \u001bZ\u001b[K\u001b[1;32mbeta 汉字测试 \u001b[K汉字测试 γλυφ γλυφ γλυφ \u001b[31m\u001b[Kγλυφ alpha γλυφ \u001b[31mγλυφ \u001bZ\u001b]0;title\u0007\u001b[0malpha →arrow \u001b[1;32m\u001b[m汉字测试 \u001b[38;5;9mbeta \u001b[m\u001b[0m\u001b]0;title\u0007汉字测试 \u001b[38;5;9m→arrow \u001b]0;title\u0007alpha \u001b[m→arrow \u001b[38;5;9m\u001b[0m\u001b[0mbeta \u001b[0m\u001b]0;title\u0007data →arrow γλυφ beta \u001b[38;5;9malpha beta \u001b[mdata γλυφ alpha \u001b[38;5;9m\u001b[38;5;9malpha \u001b[1;32m汉字测试 γλυφ \u001b[1;32mdata →arrow alpha \u001b[K\u001b[malpha \u001b[0mγλυφ \u001bZ\u001bZ汉字测试 γλυφ →arrow \u001b[31m\u001b[1;32mdata \u001b[0mγλυφ beta \u001b]0;title\u0007汉字测试 data \u001b[38;5;9malpha →arrow beta \u001b[38;5;9mγλυφ alpha \u001b[1;32mγλυφ 汉字测试 汉字测试 \u001b[38;5;9m\u001b[1;32m汉字测试 \u001b[0m\u001b[0mγλυφ \u001b[0mbeta data alpha alpha 汉字测试 γλυφ \u001bZ\u001b[38;5;9mbeta γλυφ alpha γλυφ alpha \u001b[m汉字测试 →arrow \u001b[0m汉字测试 γλυφ \u001b]0;title\u0007beta data \u001b[0m\u001b[1;32m\u001b]0;title\u0007\u001b[38;5;9m\u001b]0;title\u0007\u001b[1;32mbeta \u001b[31m汉字测试 γλυφ \u001b[1;32m→arrow 汉字测试 γλυφ 汉字测试 \u001b[m→arrow 汉字测试 beta 汉字测试 →arrow 汉字测试 \u001b[38;5;9m\u001b]0;title\u0007\u001b[38;5;9mdata 汉字测试 \u001b[m\u001b[38;5;9mdata \u001b[Kdata 汉字测试 \u001b[38;5;9mbeta \u001b[0m\u001bZbeta \u001b[1;32malpha 汉字测试 \u001b[1;32mbeta data beta \u001b[1;32m\u001b[38;5;9m→arrow beta \u001b[31mdata beta \u001b[m\u001b[38;5;9mdata \u001b[38;5;9m\u001b[0mdata beta data beta →arrow \u001b[malpha \u001b[31m\u001b[m→arrow \u001b[K→arrow \u001b[31m\u001b[m\u001b]0;title\u0007汉字测试 data beta \u001b[0m汉字测试 data γλυφ alpha \u001b[K\u001b[K→arrow \u001bZ\u001b[0m→arrow →arrow \u001b[m\u001bZγλυφ data \u001b]0;title\u0007beta γλυφ γλυφ \u001b[malpha \u001b[K\u001b[38;5;9m汉字测试 data \u001b[mγλυφ \u001bZ\u001b[0m\u001b[31m\u001b]0;title\u0007data 汉字测试 alpha \u001bZ\u001b]0;title\u0007→arrow beta \u001b[38;5;9mγλυφ \u001b[K\u001b[1;32m\u001b[K\u001b]0;title\u0007beta \u001b[0m汉字测试 data 汉字测试 \u001b]0;title\u0007beta data data →arrow \u001b[mbeta \u001b[K汉字测试 data 汉字测试 汉字测试 beta \u001b[31m\u001bZ→arrow \u001b[1;32m\u001b[mdata \u001bZalpha \u001b[0m\u001bZ\u001b[K\u001b[1;32m→arrow \u001b[1;32m→arrow 汉字测试 \u001b]0;title\u0007\u001b[31mdata \u001b[K\u001bZ→arrow 汉字测试 →arrow 汉字测试 beta \u001b[38;5;9m→arrow \u001b[31mγλυφ →arrow \u001b[31m\u001b[1;32malpha \u001b[38;5;9m\u001b[K\u001b[Kdata \u001b[Kγλυφ γλυφ \u001b[31mγλυφ →arrow \u001b[31mγλυφ γλυφ γλυφ \u001b[1;32m汉字测试 \u001b]0;title\u0007beta \u001b[K\u001b[K\u001b[31m→arrow \u001b]0;title\u0007\u001b[K\u001b[1;32malpha \u001b[31m汉字测试 γλυφ γλυφ →arrow \u001b]0;title\u0007data alpha γλυφ \u001b[0m\u001b[0m\u001b[38;5;9m\u001b[0m\u001bZ\u001b[31m\u001b[31m\u001b[31mdata \u001b[0mdata \u001b[1;32mγλυφ \u001b]0;title\u0007γλυφ →arrow beta data \u001b[1;32malpha beta γλυφ 汉字测试 beta data \u001b[mγλυφ \u001bZbeta \u001b[m\u001b[31mdata \u001b[38;5;9malpha \u001bZ\u001b[31malpha \u001b[0m→arrow \u001b[38;5;9m汉字测试 汉字测试 \u001b[mγλυφ \u001b[31malpha beta data \u001b[Kdata →arrow γλυφ data γλυφ \u001b[m汉字测试 \u001b[31m→arrow data →arrow \u001b[31m\u001b[38;5;9m汉字测试 alpha \u001b[0m\u001b[31mγλυφ \u001b[K→arrow γλυφ 汉字测试 汉字测试 \u001b[m汉字测试 alpha \u001b[0m\u001b[1;32m\u001b[K汉字测试 \u001b[0m\u001b[Kalpha 汉字测试 \u001b[1;32mbeta beta \u001b[0malpha data \u001b[31mγλυφ γλυφ 汉字测试 \u001b]0;title\u0007\u001b[K→arrow 汉字测试 \u001b[31malpha \u001b[31mγλυφ \u001b[K\u001b[malpha \u001b[1;32mbeta 汉字测试 beta →arrow \u001b[m\u001b[m\u001b[mdata alpha 汉字测试 beta \u001b[1;32mdata \u001b[malpha \u001b[0mbeta \u001b[mγλυφ γλυφ →arrow →arrow γλυφ beta data \u001b[31m\u001b[38;5;9m汉字测试 \u001b]0;title\u0007alpha \u001b]0;title\u0007alpha \u001b[0m\u001b[mγλυφ 汉字测试 beta γλυφ γλυφ data beta \u001b[31m\u001b[1;32m\u001b[1;32m汉字测试 γλυφ \u001b[38;5;9m\u001b[m\u001b]0;title\u0007data \u001b[31mγλυφ →arrow alpha \u001b[38;5;9mbeta 汉字测试 \u001b]0;title\u0007\u001b[38;5;9m→arrow \u001b]0;title\u0007\u001b[31m汉字测试 beta \u001b[38;5;9m\u001b[K\u001b[0m\u001b[38;5;9m\u001b[0mbeta beta data γλυφ →arrow \u001b[1;32m\u001b[Kbeta \u001b]0;title\u0007beta 汉字测试 beta alpha →arrow γλυφ \u001b[m\u001bZ\u001b[31malpha \u001b[31mbeta \u001b[m\u001b[0mγλυφ \u001b[0m\u001b[Kdata data \u001b[Kbeta \u001b[K\u001b[0m汉字测试 汉字测试 \u001b]0;title\u0007\u001b[38;5;9m\u001b[1;32m→arrow alpha alpha \u001b[1;32m\u001b[0m→arrow \u001b[K\u001b[1;32malpha alpha \u001b[m\u001b[38;5;9mbeta beta 汉字测试 汉字测试 \u001b[31malpha \u001b[1;32m\u001bZ\u001b[K→arrow \u001b[1;32m汉字测试 →arrow →arrow \u001b[38;5;9m\u001b[Kγλυφ data data alpha γλυφ →arrow data 汉字测试 汉字测试 \u001b[31mγλυφ \u001b[38;5;9malpha →arrow \u001b[mγλυφ \u001b[38;5;9mbeta \u001b[38;5;9m→arrow \u001b[mdata alpha γλυφ \u001b[m汉字测试 \u001b[38;5;9m\u001b[31m汉字测试 \u001b[0m\u001b[38;5;9mγλυφ \u001b[K汉字测试 \u001b[38;5;9mbeta γλυφ γλυφ alpha \u001bZ汉字测试 γλυφ beta 汉字测试 data \u001b[1;32m","expected":"\u001b[31mdata 汉字测\u001b[31m…\u001b[0m"},{"label":"osc-title","maxWidth":30,"text":"\u001b]0;window title\u0007plain text after osc that is long enough to truncate here","expected":"\u001b]0;window title\u0007plain text a…"},{"label":"bare-esc","maxWidth":25,"text":"before \u001bZ after bare esc char continues to exceed the width limit easily","expected":"before \u001bZ after bare esc…"},{"label":"csi-k-mixed-sgr","maxWidth":20,"text":"\u001b[31mred\u001b[K\u001b[32mgreen tail that keeps going past the boundary here ok","expected":"\u001b[31mred\u001b[K\u001b[32mgreen tail th\u001b[31m\u001b[32m…\u001b[0m"},{"label":"osc-inside-truncation","maxWidth":24,"text":"AAAAAAAAAAAAAAAAAAAA\u001b]0;t\u0007BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB","expected":"AAAAAAAAAAAAAAAAAAAA\u001b]0…"},{"label":"esc-at-end","maxWidth":22,"text":"text almost at width limit\u001b","expected":"text almost at width …"},{"label":"sgr-exact-fit","maxWidth":31,"text":"\u001b[31mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\u001b[0m","expected":"\u001b[31mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\u001b[0m"},{"label":"emoji-mix","maxWidth":17,"text":"😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅😀🚀✅\u001b[1mbold\u001b[0myyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy","expected":"😀🚀✅😀🚀✅😀🚀✅😀🚀✅…"}]
|