@opengsd/gsd-pi 1.1.1-dev.b2556262 → 1.2.0-dev.4813ead6
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/dist/cli-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/help-text.js +5 -0
- package/dist/project-sessions.js +4 -2
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +78 -23
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +101 -237
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
- package/dist/resources/extensions/github-sync/templates.js +3 -3
- package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
- package/dist/resources/extensions/gsd/auto/contracts.js +8 -1
- package/dist/resources/extensions/gsd/auto/loop.js +74 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +763 -63
- package/dist/resources/extensions/gsd/auto/phases.js +28 -3
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
- package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +191 -9
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -0
- package/dist/resources/extensions/gsd/auto-start.js +12 -23
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +37 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +33 -29
- package/dist/resources/extensions/gsd/auto-verification.js +7 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +45 -36
- package/dist/resources/extensions/gsd/auto.js +73 -471
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +11 -37
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +103 -138
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +63 -4
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
- package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
- package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
- package/dist/resources/extensions/gsd/commands-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
- package/dist/resources/extensions/gsd/db-workspace.js +103 -0
- package/dist/resources/extensions/gsd/debug-logger.js +10 -0
- package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
- package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/error-classifier.js +1 -1
- package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
- package/dist/resources/extensions/gsd/gsd-db.js +12 -0
- package/dist/resources/extensions/gsd/guided-flow.js +36 -470
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +33 -33
- package/dist/resources/extensions/gsd/mcp-filter.js +8 -1
- package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/migrate/safety.js +2 -2
- package/dist/resources/extensions/gsd/migration-auto-check.js +3 -2
- package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
- package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
- package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +45 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences.js +147 -29
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +2 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
- package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
- package/dist/resources/extensions/gsd/question-transport.js +86 -0
- package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
- package/dist/resources/extensions/gsd/schemas/parsers.js +6 -1
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
- package/dist/resources/extensions/gsd/state.js +13 -5
- package/dist/resources/extensions/gsd/templates/plan.md +7 -0
- package/dist/resources/extensions/gsd/templates/project.md +1 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/dist/resources/extensions/gsd/templates/uat.md +5 -1
- package/dist/resources/extensions/gsd/tool-contract.js +52 -8
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +169 -20
- package/dist/resources/extensions/gsd/uat-policy.js +16 -10
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
- package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
- package/dist/resources/extensions/gsd/user-input-boundary.js +65 -4
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
- package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -0
- package/dist/update-cmd.js +20 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
- package/dist/web/standalone/.next/server/chunks/5047.js +2 -0
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
- package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
- package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/package.json +17 -11
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/server.d.ts +10 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +8 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +2 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +30 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.js +30 -0
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +8 -127
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +47 -166
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +11 -3
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +39 -30
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +22 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/scripts/install/deps.js +10 -0
- package/scripts/link-workspace-packages.cjs +7 -40
- package/src/resources/extensions/ask-user-questions.ts +87 -24
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +126 -289
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +242 -2
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
- package/src/resources/extensions/github-sync/templates.ts +3 -3
- package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
- package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +40 -121
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
- package/src/resources/extensions/gsd/auto/loop.ts +83 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +913 -64
- package/src/resources/extensions/gsd/auto/phases.ts +35 -3
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -3
- package/src/resources/extensions/gsd/auto-prompts.ts +220 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +30 -0
- package/src/resources/extensions/gsd/auto-start.ts +17 -20
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +40 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +42 -30
- package/src/resources/extensions/gsd/auto-verification.ts +7 -8
- package/src/resources/extensions/gsd/auto-worktree.ts +57 -42
- package/src/resources/extensions/gsd/auto.ts +96 -508
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -37
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +120 -151
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +107 -3
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
- package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
- package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
- package/src/resources/extensions/gsd/commands-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
- package/src/resources/extensions/gsd/db-workspace.ts +170 -0
- package/src/resources/extensions/gsd/debug-logger.ts +11 -0
- package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
- package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/error-classifier.ts +1 -1
- package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
- package/src/resources/extensions/gsd/gsd-db.ts +12 -0
- package/src/resources/extensions/gsd/guided-flow.ts +49 -560
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +40 -20
- package/src/resources/extensions/gsd/mcp-filter.ts +9 -1
- package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/migrate/safety.ts +2 -2
- package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
- package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
- package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
- package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +48 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +173 -28
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/discuss.md +6 -7
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/research-milestone.md +2 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
- package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
- package/src/resources/extensions/gsd/question-transport.ts +138 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
- package/src/resources/extensions/gsd/schemas/parsers.ts +6 -1
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
- package/src/resources/extensions/gsd/state.ts +15 -5
- package/src/resources/extensions/gsd/templates/plan.md +7 -0
- package/src/resources/extensions/gsd/templates/project.md +1 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/src/resources/extensions/gsd/templates/uat.md +5 -1
- package/src/resources/extensions/gsd/tests/artifact-db-drift-memo.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-dispatch-baseline-harness.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +321 -5
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +709 -845
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +38 -10
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/native-merge-regular.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +75 -2
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +101 -1
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +21 -6
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +79 -0
- package/src/resources/extensions/gsd/tool-contract.ts +86 -8
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +183 -21
- package/src/resources/extensions/gsd/uat-policy.ts +19 -10
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
- package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
- package/src/resources/extensions/gsd/user-input-boundary.ts +55 -5
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -16
- package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
- package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/dist/web/standalone/.next/server/chunks/678.js +0 -2
- package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
- package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
- package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
- package/scripts/ensure-workspace-builds.cjs +0 -129
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-design.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/transcript-design.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,qIAAqI;AAErI,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,KAAK,EAAiC,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAwB,MAAM,gBAAgB,CAAC;AASvE,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACxC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAEjC,MAAM,UAAU,WAAW,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,KAAiB;IACpD,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IACjC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,MAAM,GAAG,sBAAsB;IACxE,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,gBAAgB;IACxB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,WAAmB;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACrC,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACxB,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;IAC5B,OAAO,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;AAC3C,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,SAAqB,EAAE,UAAmB;IAC/E,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE/D,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,MAAM,CAAC;IACrF,MAAM,IAAI,GAAG,gBAAgB,CAAC,UAAU,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;IACzD,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IACnB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YAC9B,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACtC,SAAS;QACV,CAAC;QAED,SAAS,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QAC5C,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACpB,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,IAAI,QAAQ,IAAI,kBAAkB,EAAE,CAAC;YAC3C,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACP,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAClD,CAAC;IACF,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,oBAAoB,CACnC,KAAa,EACb,UAAU,GAAG,sBAAsB,EACnC,YAAwB,cAAc;IAEtC,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;IACrD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,0BAA0B,CACzC,KAAa,EACb,YAAwB,QAAQ;IAEhC,MAAM,MAAM,GAAG,UAAU,CAAC;IAC1B,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,KAAa,EACb,KAAa,EACb,SAAmB,EACnB,OAQI,EAAE;IAEN,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,sBAAsB,CAAC;IACrD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,cAAc,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC3E,MAAM,kBAAkB,GACvB,IAAI,CAAC,UAAU;QACf,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;IAChD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,UAAU,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC;YACrD,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;QACvE,CAAC;aAAM,CAAC;YACP,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;YACrE,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,YAAY,CAAC;QACpE,CAAC;IACF,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACnE,OAAO,MAAM,GAAG,OAAO,CAAC;IACzB,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAe;IAClD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,OAAO,KAAK,GAAG,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,KAAK,EAAE,CAAC;IAChE,OAAO,GAAG,GAAG,KAAK,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,GAAG,EAAE,CAAC;IAChE,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB,CAAC,KAAe;IACjD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;QACvC,IAAI,KAAK,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAClF,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,KAAa;IAC3C,OAAO,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB;IAClC,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,SAAS,CAAC,CAAC,OAAO,aAAa,CAAC;QACrC,KAAK,SAAS,CAAC,CAAC,OAAO,QAAQ,CAAC;QAChC,KAAK,OAAO,CAAC,CAAC,OAAO,WAAW,CAAC;QACjC,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;QACjC,KAAK,OAAO,CAAC;QACb,OAAO,CAAC,CAAC,OAAO,WAAW,CAAC;IAC7B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACvC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,SAAS,CAAC;IACjC,IAAI,KAAK,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,IAAa;IACpC,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,QAAQ,CAAC,CAAC,OAAO,cAAc,CAAC;QACrC,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;QACjC,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;QACjC,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;QAC7B,KAAK,OAAO,CAAC,CAAC,OAAO,aAAa,CAAC;QACnC,KAAK,SAAS,CAAC;QACf,OAAO,CAAC,CAAC,OAAO,QAAQ,CAAC;IAC1B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,OAAgB,SAAS;IAC5D,OAAO,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,KAAa,EAAE,aAAyB,MAAM,EAAE,UAAU,GAAG,EAAE;IACtG,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,YAAY,CAC3B,KAAe,EACf,KAAa,EACb,OAKI,EAAE;IAEN,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,KAAK,GAAG,KAAK,EAAE;SACjB,MAAM,CAAC,SAAS,CAAC;SACjB,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;SAC7E,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,KAAa,EAAE,KAAa;IACpE,OAAO,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAC1B,KAAe,EACf,KAAa,EACb,IAA4E;IAE5E,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,OAAO,GAAG,KAAK,EAAE;SACnB,MAAM,CAAC,MAAM,CAAC;SACd,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;SAC3D,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC9B,YAAsB,EACtB,KAAa,EACb,IAMC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;IACrE,MAAM,UAAU,GAAe,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,cAAc,CAAC;IAClH,MAAM,SAAS,GACd,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,sBAAsB,CAAC;IAEpG,qEAAqE;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,WAAW,GAChB,OAAO,IAAI,CAAC;QACX,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7G,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,MAAM,QAAQ,GACb,IAAI,CAAC,aAAa,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAE9G,MAAM,MAAM,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1F,IAAI,OAAO,GAAG,KAAK,EAAE;SACnB,MAAM,CAAC,MAAM,CAAC;SACd,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;SACjD,KAAK,CAAC,WAAW,CAAC,CAAC;IACrB,IAAI,QAAQ,EAAE,CAAC;QACd,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,KAAe,EACf,KAAa,EACb,OAMI,EAAE;IAEN,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,cAAc,CAAC;IACnD,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC,CAAC;IACvG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,IAAI,EAAE;QAClE,MAAM,EAAE,CAAC;QACT,UAAU;QACV,SAAS;QACT,WAAW,EAAE,CAAC,IAAI,CAAC,eAAe;KAClC,CAAC,CAAC;IACH,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,GAAG,CAAC,GAAG,oBAAoB,CAAC,KAAK,EAAE,sBAAsB,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1B,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAC7B,KAAe,EACf,KAAa,EACb,IAAuE;IAEvE,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC;IAClG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,OAAO,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,IAAI,EAAE;QAC5D,MAAM,EAAE,sBAAsB;QAC9B,UAAU;QACV,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,CAAC,IAAI,CAAC,oBAAoB;KACvC,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,KAAa,EAAE,KAAa,EAAE,KAAa,EAAE,IAAgB,EAAE,KAAK,GAAG,KAAK;IACjG,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7D,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,YAAY,GAAG,cAAc,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/G,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,WAAW,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC;IAC1F,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE1D,OAAO,OAAO,CACb,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC;QAC3B,YAAY;QACZ,cAAc,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC;QACzD,YAAY;QACZ,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,EAC7B,CAAC,CACD,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAe,EAAE,MAAc,EAAE,KAAa;IAC1E,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7G,CAAC;AAED,MAAM,UAAU,oBAAoB,CACnC,KAAe,EACf,KAAa,EACb,IAOC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,sBAAsB,CAAC;IACrD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7E,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,MAAM,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;IACxE,CAAC;IACD,OAAO,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;QACxD,MAAM;QACN,UAAU;QACV,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS;KAClC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CACjC,KAAa,EACb,MAA0B,EAC1B,KAAa,EACb,IAAiH;IAEjH,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,sBAAsB,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,GAAG,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,GAChF,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAC3C,EAAE,CAAC;IACH,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAChG,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACvF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,OAAO,mBAAmB,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAChC,OAAe,EACf,KAAa,EACb,IAA8E;IAE9E,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,sBAAsB,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ;QAC/B,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE;QACnC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,kCAAkC,CAAC;IACpD,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/E,OAAO,mBAAmB,CAAC,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACxH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAAa,EAAE,KAAa,EAAE,OAAmB,SAAS;IACzG,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;IAC9C,OAAO,CACN,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7C,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC,CAClD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,YAAsB,EAAE,KAAa,EAAE,KAAa;IACrF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACjF,MAAM,IAAI,GAAG,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAC1D,OAAO,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Shared recommended transcript rendering primitives for assistant, tool, command, footer, and auto-mode TUI surfaces.\n\nimport { alignRight, padRight, style, truncateToWidth, visibleWidth } from \"@gsd/pi-tui\";\nimport { theme, type ThemeBg, type ThemeColor } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { formatTimestamp, type TimestampFormat } from \"./timestamp.js\";\n\nexport type StatusTone = \"running\" | \"success\" | \"error\" | \"warning\" | \"muted\";\nexport type TuiTone = \"default\" | \"accent\" | \"success\" | \"warning\" | \"error\" | \"muted\";\nexport type TuiBreakpoint = \"compact\" | \"regular\" | \"wide\";\n\n/** Conversation/system surfaces that the chat frame distinguishes by color. */\nexport type FrameTone = \"assistant\" | \"user\" | \"compaction\" | \"skill\";\n\nexport function chatMessageWidth(width: number): number {\n\treturn Math.max(24, Math.min(width, Math.floor(width * 0.72)));\n}\n\n/** Outer indent for user turns and tool/work cards in the connected transcript. */\nexport const TRANSCRIPT_CARD_INDENT = 4;\nconst RUNNING_RAIL_FRAME_MS = 70;\nconst RUNNING_RAIL_TRAIL = 5;\nconst HORIZONTAL_RAIL = \"─\";\nconst HORIZONTAL_RAIL_HEAD = \"━\";\n\nexport function headerLabel(text: string): string {\n\treturn text.toUpperCase();\n}\n\nfunction styledHeader(text: string, color: ThemeColor): string {\n\treturn theme.fg(color, theme.bold(headerLabel(text)));\n}\n\nfunction indentSpaces(cols: number): string {\n\treturn cols > 0 ? \" \".repeat(cols) : \"\";\n}\n\nfunction connectedRuleFill(width: number, indent = TRANSCRIPT_CARD_INDENT): string {\n\treturn \"─\".repeat(Math.max(16, Math.min(40, width - indent - 1)));\n}\n\nfunction runningRailFrame(): number {\n\treturn Math.floor(Date.now() / RUNNING_RAIL_FRAME_MS);\n}\n\nfunction trianglePosition(frame: number, maxPosition: number): number {\n\tconst max = Math.max(0, maxPosition);\n\tif (max === 0) return 0;\n\tconst period = max * 2;\n\tconst step = frame % period;\n\treturn step <= max ? step : period - step;\n}\n\nfunction renderRailText(text: string, railColor: ThemeColor, sweepFrame?: number): string {\n\tif (sweepFrame === undefined) return theme.fg(railColor, text);\n\n\tconst railCells = Array.from(text).filter((char) => char === HORIZONTAL_RAIL).length;\n\tconst head = trianglePosition(sweepFrame, railCells - 1);\n\tlet railIndex = -1;\n\tlet rendered = \"\";\n\n\tfor (const char of text) {\n\t\tif (char !== HORIZONTAL_RAIL) {\n\t\t\trendered += theme.fg(railColor, char);\n\t\t\tcontinue;\n\t\t}\n\n\t\trailIndex++;\n\t\tconst distance = Math.abs(railIndex - head);\n\t\tif (distance === 0) {\n\t\t\trendered += theme.fg(railColor, theme.bold(HORIZONTAL_RAIL_HEAD));\n\t\t} else if (distance <= RUNNING_RAIL_TRAIL) {\n\t\t\trendered += theme.fg(railColor, HORIZONTAL_RAIL_HEAD);\n\t\t} else {\n\t\t\trendered += theme.fg(railColor, HORIZONTAL_RAIL);\n\t\t}\n\t}\n\treturn rendered;\n}\n\nexport function renderChatTurnBridge(\n\twidth: number,\n\tfromIndent = TRANSCRIPT_CARD_INDENT,\n\trailColor: ThemeColor = \"borderAccent\",\n): string[] {\n\tconst bridge = indentSpaces(fromIndent) + \"╰──────╮\";\n\treturn [padLine(theme.fg(railColor, bridge), width)];\n}\n\n/** Bridge from a left-pegged assistant turn down into the next indented user turn. */\nexport function renderChatTurnBridgeToUser(\n\twidth: number,\n\trailColor: ThemeColor = \"border\",\n): string[] {\n\tconst bridge = \"╰──────╮\";\n\treturn [padLine(theme.fg(railColor, bridge), width)];\n}\n\nexport function renderConnectedCard(\n\twidth: number,\n\ttitle: string,\n\tbodyLines: string[],\n\topts: {\n\t\tindent?: number;\n\t\ttitleRight?: string;\n\t\trailColor?: ThemeColor;\n\t\ttitleColor?: ThemeColor;\n\t\tbodyBg?: ThemeBg;\n\t\tcloseBottom?: boolean;\n\t\trailSweep?: boolean;\n\t} = {},\n): string[] {\n\tconst indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;\n\tconst prefix = indentSpaces(indent);\n\tconst railColor = opts.railColor ?? \"borderAccent\";\n\tconst sweepFrame = opts.railSweep ? runningRailFrame() : undefined;\n\tconst rail = (text: string) => renderRailText(text, railColor, sweepFrame);\n\tconst resolvedTitleColor =\n\t\topts.titleColor ??\n\t\t(title.includes(\"✕\") ? \"error\" : title.includes(\"✓\") ? \"success\" : railColor);\n\tconst titleStyled = theme.fg(resolvedTitleColor, theme.bold(headerLabel(title)));\n\tconst lead = prefix + rail(\"╭─ \") + titleStyled;\n\tlet topLine = lead;\n\tif (opts.titleRight) {\n\t\tconst available = width - visibleWidth(lead) - 1;\n\t\tconst rightWidth = visibleWidth(opts.titleRight);\n\t\tif (rightWidth + 5 <= available) {\n\t\t\tconst fill = Math.max(1, available - rightWidth - 2);\n\t\t\ttopLine = lead + rail(\" \" + \"─\".repeat(fill) + \" \") + opts.titleRight;\n\t\t} else {\n\t\t\tconst clippedRight = truncateToWidth(opts.titleRight, Math.max(8, available - 5), \"\");\n\t\t\tconst fill = Math.max(1, available - visibleWidth(clippedRight) - 2);\n\t\t\ttopLine = lead + rail(\" \" + \"─\".repeat(fill) + \" \") + clippedRight;\n\t\t}\n\t}\n\tconst paintBody = (line: string) => {\n\t\tconst innerWidth = Math.max(1, width - indent);\n\t\tconst inner = padRight(truncateToWidth(\" \" + line, innerWidth, \"\"), innerWidth);\n\t\tconst painted = opts.bodyBg ? theme.bg(opts.bodyBg, inner) : inner;\n\t\treturn prefix + painted;\n\t};\n\tconst bodySource = trimOuterBlankLines(bodyLines);\n\tconst out = [padLine(topLine, width)];\n\tfor (const line of bodySource) {\n\t\tout.push(paintBody(line));\n\t}\n\tif (opts.closeBottom !== false) {\n\t\tout.push(padLine(prefix + rail(\"╰\" + connectedRuleFill(width, indent)), width));\n\t}\n\treturn out;\n}\n\nexport function trimOuterBlankLines(lines: string[]): string[] {\n\tlet start = 0;\n\tlet end = lines.length;\n\twhile (start < end && lines[start].trim().length === 0) start++;\n\twhile (end > start && lines[end - 1].trim().length === 0) end--;\n\treturn lines.slice(start, end);\n}\n\n/** Collapse runs of blank lines to a single blank line (tool output only). */\nexport function collapseBlankLines(lines: string[]): string[] {\n\tconst out: string[] = [];\n\tfor (const line of lines) {\n\t\tconst blank = line.trim().length === 0;\n\t\tif (blank && out.length > 0 && out[out.length - 1]!.trim().length === 0) continue;\n\t\tout.push(line);\n\t}\n\treturn trimOuterBlankLines(out);\n}\n\nfunction padLine(line: string, width: number): string {\n\treturn padRight(truncateToWidth(line, width, \"\"), width);\n}\n\nfunction toneColor(tone: StatusTone): ThemeColor {\n\tswitch (tone) {\n\t\tcase \"running\": return \"toolRunning\";\n\t\tcase \"success\": return \"border\";\n\t\tcase \"error\": return \"toolError\";\n\t\tcase \"warning\": return \"warning\";\n\t\tcase \"muted\":\n\t\tdefault: return \"toolMuted\";\n\t}\n}\n\nexport function breakpoint(width: number): TuiBreakpoint {\n\tif (width < 72) return \"compact\";\n\tif (width < 112) return \"regular\";\n\treturn \"wide\";\n}\n\nfunction panelToneColor(tone: TuiTone): ThemeColor {\n\tswitch (tone) {\n\t\tcase \"accent\": return \"borderAccent\";\n\t\tcase \"success\": return \"success\";\n\t\tcase \"warning\": return \"warning\";\n\t\tcase \"error\": return \"error\";\n\t\tcase \"muted\": return \"borderMuted\";\n\t\tcase \"default\":\n\t\tdefault: return \"border\";\n\t}\n}\n\nexport function badge(text: string, tone: TuiTone = \"default\"): string {\n\treturn theme.fg(panelToneColor(tone), text);\n}\n\nexport function keyValue(label: string, value: string, valueColor: ThemeColor = \"text\", labelWidth = 10): string {\n\treturn `${theme.fg(\"dim\", padRight(label, labelWidth))}${theme.fg(valueColor, value)}`;\n}\n\nexport function roundedPanel(\n\tlines: string[],\n\twidth: number,\n\topts: {\n\t\ttone?: TuiTone;\n\t\ttitle?: string;\n\t\trightTitle?: string;\n\t\tpaddingX?: number;\n\t} = {},\n): string[] {\n\tconst outerWidth = Math.max(1, width);\n\tconst body = lines.length > 0 ? lines : [\"\"];\n\tif (outerWidth < 3) {\n\t\treturn body.map((line) => truncateToWidth(line, outerWidth, \"\"));\n\t}\n\n\tlet panel = style()\n\t\t.border(\"rounded\")\n\t\t.borderColor((text) => theme.fg(panelToneColor(opts.tone ?? \"default\"), text))\n\t\t.paddingX(Math.max(0, opts.paddingX ?? 0));\n\tif (opts.title) {\n\t\tpanel = panel.title(theme.fg(\"borderAccent\", opts.title));\n\t}\n\tif (opts.rightTitle) {\n\t\tpanel = panel.titleRight(theme.fg(\"dim\", opts.rightTitle));\n\t}\n\treturn panel.render(body, outerWidth);\n}\n\nexport function rightAlign(left: string, right: string, width: number): string {\n\treturn alignRight(left, right, width);\n}\n\n/**\n * Render a copy-clean content surface (ADR-019): a titled top rule, body\n * lines emitted with no border column or leading glyph, and a closing rule.\n * Selecting a body line in the terminal copies only its content.\n *\n * This is the target surface for transcript messages, tool output, and\n * summaries. Migration steps 3–5 move existing renderers onto it.\n */\nexport function openSurface(\n\tlines: string[],\n\twidth: number,\n\topts: { title: string; right?: string; tone: StatusTone; paddingX?: number },\n): string[] {\n\tconst tc = toneColor(opts.tone);\n\tlet surface = style()\n\t\t.border(\"open\")\n\t\t.title(opts.title, (text) => theme.fg(\"borderAccent\", text))\n\t\t.borderColor((text) => theme.fg(tc, text));\n\tif (opts.right) {\n\t\tsurface = surface.titleRight(opts.right, (text) => theme.fg(tc, text));\n\t}\n\tif (opts.paddingX !== undefined) {\n\t\tsurface = surface.paddingX(opts.paddingX);\n\t}\n\treturn surface.render(lines, Math.max(20, width));\n}\n\n/**\n * Render a framed system/conversation surface (compaction notices, skill\n * invocations) as a copy-clean open surface (ADR-019): a titled top rule\n * and body lines with no border column. Replaces the former chat-frame.ts.\n */\nexport function renderChatFrame(\n\tcontentLines: string[],\n\twidth: number,\n\topts: {\n\t\tlabel: string;\n\t\ttone: FrameTone;\n\t\ttimestamp?: number;\n\t\ttimestampFormat: TimestampFormat;\n\t\tshowTimestamp?: boolean;\n\t},\n): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst isPurple = opts.tone === \"compaction\" || opts.tone === \"skill\";\n\tconst frameColor: ThemeColor = opts.tone === \"user\" ? \"border\" : isPurple ? \"customMessageLabel\" : \"borderAccent\";\n\tconst bodyColor: ThemeColor =\n\t\topts.tone === \"user\" ? \"userMessageText\" : isPurple ? \"customMessageText\" : \"assistantMessageText\";\n\n\t// A label may carry a \" - \" splitting a bold name from a dim detail.\n\tconst dashIdx = opts.label.indexOf(\" - \");\n\tconst titleStyled =\n\t\tdashIdx >= 0\n\t\t\t? theme.fg(frameColor, theme.bold(opts.label.slice(0, dashIdx))) + theme.fg(\"dim\", opts.label.slice(dashIdx))\n\t\t\t: theme.fg(frameColor, theme.bold(opts.label));\n\tconst rightRaw =\n\t\topts.showTimestamp === false || !opts.timestamp ? \"\" : formatTimestamp(opts.timestamp, opts.timestampFormat);\n\n\tconst source = trimOuterBlankLines(contentLines);\n\tconst body = (source.length > 0 ? source : [\"\"]).map((line) => theme.fg(bodyColor, line));\n\n\tlet surface = style()\n\t\t.border(\"open\")\n\t\t.borderColor((text) => theme.fg(frameColor, text))\n\t\t.title(titleStyled);\n\tif (rightRaw) {\n\t\tsurface = surface.titleRight(theme.fg(\"dim\", rightRaw));\n\t}\n\treturn surface.render(body, outerWidth);\n}\n\nexport function renderAssistantRail(\n\tlines: string[],\n\twidth: number,\n\topts: {\n\t\tlabel?: string;\n\t\tmeta?: string;\n\t\trailColor?: ThemeColor;\n\t\tconnected?: boolean;\n\t\tcontinuesToUser?: boolean;\n\t} = {},\n): string[] {\n\tconst railColor = opts.railColor ?? \"borderAccent\";\n\tconst source = trimOuterBlankLines(lines);\n\tconst body = (source.length > 0 ? source : [\"\"]).map((line) => theme.fg(\"assistantMessageText\", line));\n\tconst titleRight = opts.meta ? theme.fg(\"dim\", opts.meta) : undefined;\n\tconst card = renderConnectedCard(width, opts.label ?? \"GSD\", body, {\n\t\tindent: 0,\n\t\ttitleRight,\n\t\trailColor,\n\t\tcloseBottom: !opts.continuesToUser,\n\t});\n\tlet result = card;\n\tif (opts.connected) {\n\t\tresult = [...renderChatTurnBridge(width, TRANSCRIPT_CARD_INDENT), ...result];\n\t}\n\tif (opts.continuesToUser) {\n\t\tresult = [...result, ...renderChatTurnBridgeToUser(width)];\n\t}\n\treturn result;\n}\n\nexport function renderUserRail(\n\tlines: string[],\n\twidth: number,\n\topts: { label?: string; meta?: string; continuesToAssistant?: boolean },\n): string[] {\n\tconst source = trimOuterBlankLines(lines);\n\tconst body = (source.length > 0 ? source : [\"\"]).map((line) => theme.fg(\"userMessageText\", line));\n\tconst titleRight = opts.meta ? theme.fg(\"dim\", opts.meta) : undefined;\n\treturn renderConnectedCard(width, opts.label ?? \"You\", body, {\n\t\tindent: TRANSCRIPT_CARD_INDENT,\n\t\ttitleRight,\n\t\trailColor: \"border\",\n\t\ttitleColor: \"border\",\n\t\tcloseBottom: !opts.continuesToAssistant,\n\t});\n}\n\n/**\n * Render a single titled rule line — the collapsed form of a tool/command\n * card on the \"open\" surface. `title` and `right` must be pre-styled.\n */\nfunction openRuleLine(title: string, right: string, width: number, tone: ThemeColor, sweep = false): string {\n\tconst w = Math.max(20, width);\n\tif (!right) {\n\t\tconst clippedTitle = truncateToWidth(title, Math.max(0, w - 6), \"\");\n\t\tconst fill = Math.max(1, w - 5 - visibleWidth(clippedTitle));\n\t\treturn padLine(renderRailText(\"─── \", tone) + clippedTitle + renderRailText(` ${\"─\".repeat(fill)}`, tone), w);\n\t}\n\n\tconst titleBudget = Math.max(0, w - 11);\n\tconst rightReserve = titleBudget > 1 && visibleWidth(right) > 0 ? 1 : 0;\n\tconst leftBudget = Math.min(visibleWidth(title), Math.max(0, titleBudget - rightReserve));\n\tconst rightBudget = Math.max(0, titleBudget - leftBudget);\n\tconst clippedTitle = truncateToWidth(title, leftBudget, \"\");\n\tconst clippedRight = truncateToWidth(right, rightBudget, \"\");\n\tconst fixed = 4 + visibleWidth(clippedTitle) + 2 + visibleWidth(clippedRight) + 4;\n\tconst fill = Math.max(1, w - fixed);\n\tconst sweepFrame = sweep ? runningRailFrame() : undefined;\n\n\treturn padLine(\n\t\trenderRailText(\"─── \", tone) +\n\t\t\tclippedTitle +\n\t\t\trenderRailText(` ${\"─\".repeat(fill)} `, tone, sweepFrame) +\n\t\t\tclippedRight +\n\t\t\trenderRailText(\" ───\", tone),\n\t\tw,\n\t);\n}\n\nfunction indentRenderedLines(lines: string[], indent: number, width: number): string[] {\n\tif (indent <= 0) return lines;\n\tconst prefix = indentSpaces(indent);\n\treturn lines.map((line) => padLine(prefix + truncateToWidth(line, Math.max(1, width - indent), \"\"), width));\n}\n\nexport function renderTranscriptCard(\n\tlines: string[],\n\twidth: number,\n\topts: {\n\t\ttitle: string;\n\t\tright?: string;\n\t\ttone: StatusTone;\n\t\tfooterLeft?: string;\n\t\tfooterRight?: string;\n\t\tindent?: number;\n\t},\n): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;\n\tconst tone = toneColor(opts.tone);\n\tconst body = trimOuterBlankLines(lines);\n\tlet titleRight = opts.right ? theme.fg(tone, opts.right) : undefined;\n\tif (opts.footerLeft || opts.footerRight) {\n\t\tconst hint = [opts.footerLeft, opts.footerRight].filter(Boolean).join(\" · \");\n\t\tconst hintStyled = theme.fg(\"dim\", hint);\n\t\ttitleRight = titleRight ? `${titleRight} · ${hintStyled}` : hintStyled;\n\t}\n\treturn renderConnectedCard(outerWidth, opts.title, body, {\n\t\tindent,\n\t\ttitleRight,\n\t\trailColor: tone,\n\t\trailSweep: opts.tone === \"running\",\n\t});\n}\n\nexport function renderToolLineCard(\n\ttitle: string,\n\ttarget: string | undefined,\n\twidth: number,\n\topts: { status: string; tone: StatusTone; hidden?: boolean; titlePrefix?: string; bg?: ThemeBg; indent?: number },\n): string[] {\n\tconst tone = toneColor(opts.tone);\n\tconst indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;\n\tconst innerWidth = Math.max(20, width - indent);\n\tconst titleText = `${opts.titlePrefix ?? \"\"}${styledHeader(title, \"borderAccent\")}${\n\t\ttarget ? ` ${theme.fg(\"text\", target)}` : \"\"\n\t}`;\n\tconst statusText = opts.hidden ? `${opts.status} · output hidden · ctrl+o expand` : opts.status;\n\tconst right = theme.fg(opts.tone === \"success\" ? \"success\" : tone, statusText);\n\tconst rule = openRuleLine(titleText, right, innerWidth, tone, opts.tone === \"running\");\n\tconst line = opts.bg ? theme.bg(opts.bg, rule) : rule;\n\treturn indentRenderedLines([line], indent, width);\n}\n\nexport function renderCommandCard(\n\tcommand: string,\n\twidth: number,\n\topts: { status: string; tone: StatusTone; progress?: string; indent?: number },\n): string[] {\n\tconst tone = toneColor(opts.tone);\n\tconst indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;\n\tconst innerWidth = Math.max(20, width - indent);\n\tconst titleText = `${theme.fg(\"accent\", \"$\")} ${theme.fg(\"text\", command)}`;\n\tconst statusText = opts.progress\n\t\t? `${opts.progress} ${opts.status}`\n\t\t: `${opts.status} · output hidden · ctrl+o expand`;\n\tconst right = theme.fg(opts.tone === \"success\" ? \"success\" : tone, statusText);\n\treturn indentRenderedLines([openRuleLine(titleText, right, innerWidth, tone, opts.tone === \"running\")], indent, width);\n}\n\nexport function renderProgressBar(done: number, total: number, width: number, tone: StatusTone = \"success\"): string {\n\tconst clampedWidth = Math.max(0, width);\n\tconst pct = total > 0 ? Math.max(0, Math.min(1, done / total)) : 0;\n\tconst filled = Math.round(pct * clampedWidth);\n\treturn (\n\t\ttheme.fg(toneColor(tone), \"█\".repeat(filled)) +\n\t\ttheme.fg(\"dim\", \"░\".repeat(clampedWidth - filled))\n\t);\n}\n\nexport function renderFooterStrip(leftSegments: string[], right: string, width: number): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst innerWidth = Math.max(1, outerWidth - 2);\n\tconst sep = theme.fg(\"dim\", \" │ \");\n\tconst rightStyled = theme.fg(\"dim\", right);\n\tconst rightWidth = visibleWidth(rightStyled);\n\tconst leftBudget = right ? Math.max(1, innerWidth - rightWidth - 3) : innerWidth;\n\tconst left = truncateToWidth(leftSegments.filter(Boolean).join(sep), leftBudget, \"\");\n\tconst content = rightAlign(left, rightStyled, innerWidth);\n\treturn roundedPanel([content], outerWidth);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transcript-design.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/transcript-design.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,qIAAqI;AAErI,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,KAAK,EAAiC,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAwB,MAAM,gBAAgB,CAAC;AASvE,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACxC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAEjC,MAAM,UAAU,WAAW,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,KAAiB;IACpD,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IACjC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,MAAM,GAAG,sBAAsB;IACxE,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,gBAAgB;IACxB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,WAAmB;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACrC,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACxB,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;IAC5B,OAAO,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;AAC3C,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,SAAqB,EAAE,UAAmB;IAC/E,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE/D,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,MAAM,CAAC;IACrF,MAAM,IAAI,GAAG,gBAAgB,CAAC,UAAU,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;IACzD,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IACnB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YAC9B,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACtC,SAAS;QACV,CAAC;QAED,SAAS,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QAC5C,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACpB,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,IAAI,QAAQ,IAAI,kBAAkB,EAAE,CAAC;YAC3C,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACP,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAClD,CAAC;IACF,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,oBAAoB,CACnC,KAAa,EACb,UAAU,GAAG,sBAAsB,EACnC,YAAwB,cAAc;IAEtC,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;IACrD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,0BAA0B,CACzC,KAAa,EACb,YAAwB,QAAQ;IAEhC,MAAM,MAAM,GAAG,UAAU,CAAC;IAC1B,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,KAAa,EACb,KAAa,EACb,SAAmB,EACnB,OAQI,EAAE;IAEN,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,sBAAsB,CAAC;IACrD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,cAAc,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC3E,MAAM,kBAAkB,GACvB,IAAI,CAAC,UAAU;QACf,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;IAChD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,UAAU,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC;YACrD,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;QACvE,CAAC;aAAM,CAAC;YACP,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;YACrE,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,YAAY,CAAC;QACpE,CAAC;IACF,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACnE,OAAO,MAAM,GAAG,OAAO,CAAC;IACzB,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAe;IAClD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,OAAO,KAAK,GAAG,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,KAAK,EAAE,CAAC;IAChE,OAAO,GAAG,GAAG,KAAK,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,GAAG,EAAE,CAAC;IAChE,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB,CAAC,KAAe;IACjD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;QACvC,IAAI,KAAK,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAClF,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,KAAa;IAC3C,OAAO,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB;IAClC,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,SAAS,CAAC,CAAC,OAAO,aAAa,CAAC;QACrC,KAAK,SAAS,CAAC,CAAC,OAAO,QAAQ,CAAC;QAChC,KAAK,OAAO,CAAC,CAAC,OAAO,WAAW,CAAC;QACjC,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;QACjC,KAAK,OAAO,CAAC;QACb,OAAO,CAAC,CAAC,OAAO,WAAW,CAAC;IAC7B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACvC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,SAAS,CAAC;IACjC,IAAI,KAAK,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,IAAa;IACpC,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,QAAQ,CAAC,CAAC,OAAO,cAAc,CAAC;QACrC,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;QACjC,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;QACjC,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;QAC7B,KAAK,OAAO,CAAC,CAAC,OAAO,aAAa,CAAC;QACnC,KAAK,SAAS,CAAC;QACf,OAAO,CAAC,CAAC,OAAO,QAAQ,CAAC;IAC1B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,OAAgB,SAAS;IAC5D,OAAO,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,KAAa,EAAE,aAAyB,MAAM,EAAE,UAAU,GAAG,EAAE;IACtG,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,YAAY,CAC3B,KAAe,EACf,KAAa,EACb,OAKI,EAAE;IAEN,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,KAAK,GAAG,KAAK,EAAE;SACjB,MAAM,CAAC,SAAS,CAAC;SACjB,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;SAC7E,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,KAAa,EAAE,KAAa;IACpE,OAAO,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAC1B,KAAe,EACf,KAAa,EACb,IAA4E;IAE5E,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,OAAO,GAAG,KAAK,EAAE;SACnB,MAAM,CAAC,MAAM,CAAC;SACd,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;SAC3D,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC9B,YAAsB,EACtB,KAAa,EACb,IAMC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;IACrE,MAAM,UAAU,GAAe,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,cAAc,CAAC;IAClH,MAAM,SAAS,GACd,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,sBAAsB,CAAC;IAEpG,qEAAqE;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,WAAW,GAChB,OAAO,IAAI,CAAC;QACX,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7G,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,MAAM,QAAQ,GACb,IAAI,CAAC,aAAa,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAE9G,MAAM,MAAM,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1F,IAAI,OAAO,GAAG,KAAK,EAAE;SACnB,MAAM,CAAC,MAAM,CAAC;SACd,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;SACjD,KAAK,CAAC,WAAW,CAAC,CAAC;IACrB,IAAI,QAAQ,EAAE,CAAC;QACd,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,KAAe,EACf,KAAa,EACb,OAMI,EAAE;IAEN,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,cAAc,CAAC;IACnD,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC,CAAC;IACvG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,IAAI,EAAE;QAClE,MAAM,EAAE,CAAC;QACT,UAAU;QACV,SAAS;QACT,WAAW,EAAE,CAAC,IAAI,CAAC,eAAe;KAClC,CAAC,CAAC;IACH,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,GAAG,CAAC,GAAG,oBAAoB,CAAC,KAAK,EAAE,sBAAsB,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1B,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAC7B,KAAe,EACf,KAAa,EACb,IAAuE;IAEvE,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC;IAClG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,OAAO,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,IAAI,EAAE;QAC5D,MAAM,EAAE,sBAAsB;QAC9B,UAAU;QACV,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,CAAC,IAAI,CAAC,oBAAoB;KACvC,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,KAAa,EAAE,KAAa,EAAE,KAAa,EAAE,IAAgB,EAAE,KAAK,GAAG,KAAK;IACjG,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7D,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,YAAY,GAAG,cAAc,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/G,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,WAAW,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC;IAC1F,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE1D,OAAO,OAAO,CACb,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC;QAC3B,YAAY;QACZ,cAAc,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC;QACzD,YAAY;QACZ,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,EAC7B,CAAC,CACD,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAe,EAAE,MAAc,EAAE,KAAa;IAC1E,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7G,CAAC;AAED,MAAM,UAAU,oBAAoB,CACnC,KAAe,EACf,KAAa,EACb,IAOC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,sBAAsB,CAAC;IACrD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7E,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,MAAM,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;IACxE,CAAC;IACD,OAAO,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;QACxD,MAAM;QACN,UAAU;QACV,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS;KAClC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CACjC,KAAa,EACb,MAA0B,EAC1B,KAAa,EACb,IAAiH;IAEjH,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,sBAAsB,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,GAAG,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,GAChF,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAC3C,EAAE,CAAC;IACH,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAChG,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACvF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,OAAO,mBAAmB,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAChC,OAAe,EACf,KAAa,EACb,IAA8E;IAE9E,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,sBAAsB,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ;QAC/B,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE;QACnC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,kCAAkC,CAAC;IACpD,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/E,OAAO,mBAAmB,CAAC,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACxH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAAa,EAAE,KAAa,EAAE,OAAmB,SAAS;IACzG,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;IAC9C,OAAO,CACN,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7C,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC,CAClD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,YAAsB,EAAE,KAAa,EAAE,KAAa;IACrF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACjF,MAAM,IAAI,GAAG,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAC1D,OAAO,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Shared recommended transcript rendering primitives for assistant, tool, command, footer, and auto-mode TUI surfaces.\n\nimport { alignRight, padRight, style, truncateToWidth, visibleWidth } from \"@gsd/pi-tui\";\nimport { theme, type ThemeBg, type ThemeColor } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { formatTimestamp, type TimestampFormat } from \"./timestamp.js\";\n\nexport type StatusTone = \"running\" | \"success\" | \"error\" | \"warning\" | \"muted\";\nexport type TuiTone = \"default\" | \"accent\" | \"success\" | \"warning\" | \"error\" | \"muted\";\nexport type TuiBreakpoint = \"compact\" | \"regular\" | \"wide\";\n\n/** Conversation/system surfaces that the chat frame distinguishes by color. */\nexport type FrameTone = \"assistant\" | \"user\" | \"compaction\" | \"skill\";\n\nexport function chatMessageWidth(width: number): number {\n\treturn Math.max(24, Math.min(width, Math.floor(width * 0.72)));\n}\n\n/** Outer indent for user turns and tool/work cards in the connected transcript. */\nexport const TRANSCRIPT_CARD_INDENT = 4;\nconst RUNNING_RAIL_FRAME_MS = 70;\nconst RUNNING_RAIL_TRAIL = 5;\nconst HORIZONTAL_RAIL = \"─\";\nconst HORIZONTAL_RAIL_HEAD = \"━\";\n\nexport function headerLabel(text: string): string {\n\treturn text.toUpperCase();\n}\n\nfunction styledHeader(text: string, color: ThemeColor): string {\n\treturn theme.fg(color, theme.bold(headerLabel(text)));\n}\n\nfunction indentSpaces(cols: number): string {\n\treturn cols > 0 ? \" \".repeat(cols) : \"\";\n}\n\nfunction connectedRuleFill(width: number, indent = TRANSCRIPT_CARD_INDENT): string {\n\treturn \"─\".repeat(Math.max(16, Math.min(40, width - indent - 1)));\n}\n\nfunction runningRailFrame(): number {\n\treturn Math.floor(Date.now() / RUNNING_RAIL_FRAME_MS);\n}\n\nfunction trianglePosition(frame: number, maxPosition: number): number {\n\tconst max = Math.max(0, maxPosition);\n\tif (max === 0) return 0;\n\tconst period = max * 2;\n\tconst step = frame % period;\n\treturn step <= max ? step : period - step;\n}\n\nfunction renderRailText(text: string, railColor: ThemeColor, sweepFrame?: number): string {\n\tif (sweepFrame === undefined) return theme.fg(railColor, text);\n\n\tconst railCells = Array.from(text).filter((char) => char === HORIZONTAL_RAIL).length;\n\tconst head = trianglePosition(sweepFrame, railCells - 1);\n\tlet railIndex = -1;\n\tlet rendered = \"\";\n\n\tfor (const char of text) {\n\t\tif (char !== HORIZONTAL_RAIL) {\n\t\t\trendered += theme.fg(railColor, char);\n\t\t\tcontinue;\n\t\t}\n\n\t\trailIndex++;\n\t\tconst distance = Math.abs(railIndex - head);\n\t\tif (distance === 0) {\n\t\t\trendered += theme.fg(railColor, theme.bold(HORIZONTAL_RAIL_HEAD));\n\t\t} else if (distance <= RUNNING_RAIL_TRAIL) {\n\t\t\trendered += theme.fg(railColor, HORIZONTAL_RAIL_HEAD);\n\t\t} else {\n\t\t\trendered += theme.fg(railColor, HORIZONTAL_RAIL);\n\t\t}\n\t}\n\treturn rendered;\n}\n\nexport function renderChatTurnBridge(\n\twidth: number,\n\tfromIndent = TRANSCRIPT_CARD_INDENT,\n\trailColor: ThemeColor = \"borderAccent\",\n): string[] {\n\tconst bridge = indentSpaces(fromIndent) + \"╰──────╮\";\n\treturn [padLine(theme.fg(railColor, bridge), width)];\n}\n\n/** Bridge from a left-pegged assistant turn down into the next indented user turn. */\nexport function renderChatTurnBridgeToUser(\n\twidth: number,\n\trailColor: ThemeColor = \"border\",\n): string[] {\n\tconst bridge = \"╰──────╮\";\n\treturn [padLine(theme.fg(railColor, bridge), width)];\n}\n\nexport function renderConnectedCard(\n\twidth: number,\n\ttitle: string,\n\tbodyLines: string[],\n\topts: {\n\t\tindent?: number;\n\t\ttitleRight?: string;\n\t\trailColor?: ThemeColor;\n\t\ttitleColor?: ThemeColor;\n\t\tbodyBg?: ThemeBg;\n\t\tcloseBottom?: boolean;\n\t\trailSweep?: boolean;\n\t} = {},\n): string[] {\n\tconst indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;\n\tconst prefix = indentSpaces(indent);\n\tconst railColor = opts.railColor ?? \"borderAccent\";\n\tconst sweepFrame = opts.railSweep ? runningRailFrame() : undefined;\n\tconst rail = (text: string) => renderRailText(text, railColor, sweepFrame);\n\tconst resolvedTitleColor =\n\t\topts.titleColor ??\n\t\t(title.includes(\"✕\") ? \"error\" : title.includes(\"✓\") ? \"success\" : railColor);\n\tconst titleStyled = theme.fg(resolvedTitleColor, theme.bold(headerLabel(title)));\n\tconst lead = prefix + rail(\"╭─ \") + titleStyled;\n\tlet topLine = lead;\n\tif (opts.titleRight) {\n\t\tconst available = width - visibleWidth(lead) - 1;\n\t\tconst rightWidth = visibleWidth(opts.titleRight);\n\t\tif (rightWidth + 5 <= available) {\n\t\t\tconst fill = Math.max(1, available - rightWidth - 2);\n\t\t\ttopLine = lead + rail(\" \" + \"─\".repeat(fill) + \" \") + opts.titleRight;\n\t\t} else {\n\t\t\tconst clippedRight = truncateToWidth(opts.titleRight, Math.max(8, available - 5), \"\");\n\t\t\tconst fill = Math.max(1, available - visibleWidth(clippedRight) - 2);\n\t\t\ttopLine = lead + rail(\" \" + \"─\".repeat(fill) + \" \") + clippedRight;\n\t\t}\n\t}\n\tconst paintBody = (line: string) => {\n\t\tconst innerWidth = Math.max(1, width - indent);\n\t\tconst inner = padRight(\" \" + line, innerWidth);\n\t\tconst painted = opts.bodyBg ? theme.bg(opts.bodyBg, inner) : inner;\n\t\treturn prefix + painted;\n\t};\n\tconst bodySource = trimOuterBlankLines(bodyLines);\n\tconst out = [padLine(topLine, width)];\n\tfor (const line of bodySource) {\n\t\tout.push(paintBody(line));\n\t}\n\tif (opts.closeBottom !== false) {\n\t\tout.push(padLine(prefix + rail(\"╰\" + connectedRuleFill(width, indent)), width));\n\t}\n\treturn out;\n}\n\nexport function trimOuterBlankLines(lines: string[]): string[] {\n\tlet start = 0;\n\tlet end = lines.length;\n\twhile (start < end && lines[start].trim().length === 0) start++;\n\twhile (end > start && lines[end - 1].trim().length === 0) end--;\n\treturn lines.slice(start, end);\n}\n\n/** Collapse runs of blank lines to a single blank line (tool output only). */\nexport function collapseBlankLines(lines: string[]): string[] {\n\tconst out: string[] = [];\n\tfor (const line of lines) {\n\t\tconst blank = line.trim().length === 0;\n\t\tif (blank && out.length > 0 && out[out.length - 1]!.trim().length === 0) continue;\n\t\tout.push(line);\n\t}\n\treturn trimOuterBlankLines(out);\n}\n\nfunction padLine(line: string, width: number): string {\n\treturn padRight(truncateToWidth(line, width, \"\"), width);\n}\n\nfunction toneColor(tone: StatusTone): ThemeColor {\n\tswitch (tone) {\n\t\tcase \"running\": return \"toolRunning\";\n\t\tcase \"success\": return \"border\";\n\t\tcase \"error\": return \"toolError\";\n\t\tcase \"warning\": return \"warning\";\n\t\tcase \"muted\":\n\t\tdefault: return \"toolMuted\";\n\t}\n}\n\nexport function breakpoint(width: number): TuiBreakpoint {\n\tif (width < 72) return \"compact\";\n\tif (width < 112) return \"regular\";\n\treturn \"wide\";\n}\n\nfunction panelToneColor(tone: TuiTone): ThemeColor {\n\tswitch (tone) {\n\t\tcase \"accent\": return \"borderAccent\";\n\t\tcase \"success\": return \"success\";\n\t\tcase \"warning\": return \"warning\";\n\t\tcase \"error\": return \"error\";\n\t\tcase \"muted\": return \"borderMuted\";\n\t\tcase \"default\":\n\t\tdefault: return \"border\";\n\t}\n}\n\nexport function badge(text: string, tone: TuiTone = \"default\"): string {\n\treturn theme.fg(panelToneColor(tone), text);\n}\n\nexport function keyValue(label: string, value: string, valueColor: ThemeColor = \"text\", labelWidth = 10): string {\n\treturn `${theme.fg(\"dim\", padRight(label, labelWidth))}${theme.fg(valueColor, value)}`;\n}\n\nexport function roundedPanel(\n\tlines: string[],\n\twidth: number,\n\topts: {\n\t\ttone?: TuiTone;\n\t\ttitle?: string;\n\t\trightTitle?: string;\n\t\tpaddingX?: number;\n\t} = {},\n): string[] {\n\tconst outerWidth = Math.max(1, width);\n\tconst body = lines.length > 0 ? lines : [\"\"];\n\tif (outerWidth < 3) {\n\t\treturn body.map((line) => truncateToWidth(line, outerWidth, \"\"));\n\t}\n\n\tlet panel = style()\n\t\t.border(\"rounded\")\n\t\t.borderColor((text) => theme.fg(panelToneColor(opts.tone ?? \"default\"), text))\n\t\t.paddingX(Math.max(0, opts.paddingX ?? 0));\n\tif (opts.title) {\n\t\tpanel = panel.title(theme.fg(\"borderAccent\", opts.title));\n\t}\n\tif (opts.rightTitle) {\n\t\tpanel = panel.titleRight(theme.fg(\"dim\", opts.rightTitle));\n\t}\n\treturn panel.render(body, outerWidth);\n}\n\nexport function rightAlign(left: string, right: string, width: number): string {\n\treturn alignRight(left, right, width);\n}\n\n/**\n * Render a copy-clean content surface (ADR-019): a titled top rule, body\n * lines emitted with no border column or leading glyph, and a closing rule.\n * Selecting a body line in the terminal copies only its content.\n *\n * This is the target surface for transcript messages, tool output, and\n * summaries. Migration steps 3–5 move existing renderers onto it.\n */\nexport function openSurface(\n\tlines: string[],\n\twidth: number,\n\topts: { title: string; right?: string; tone: StatusTone; paddingX?: number },\n): string[] {\n\tconst tc = toneColor(opts.tone);\n\tlet surface = style()\n\t\t.border(\"open\")\n\t\t.title(opts.title, (text) => theme.fg(\"borderAccent\", text))\n\t\t.borderColor((text) => theme.fg(tc, text));\n\tif (opts.right) {\n\t\tsurface = surface.titleRight(opts.right, (text) => theme.fg(tc, text));\n\t}\n\tif (opts.paddingX !== undefined) {\n\t\tsurface = surface.paddingX(opts.paddingX);\n\t}\n\treturn surface.render(lines, Math.max(20, width));\n}\n\n/**\n * Render a framed system/conversation surface (compaction notices, skill\n * invocations) as a copy-clean open surface (ADR-019): a titled top rule\n * and body lines with no border column. Replaces the former chat-frame.ts.\n */\nexport function renderChatFrame(\n\tcontentLines: string[],\n\twidth: number,\n\topts: {\n\t\tlabel: string;\n\t\ttone: FrameTone;\n\t\ttimestamp?: number;\n\t\ttimestampFormat: TimestampFormat;\n\t\tshowTimestamp?: boolean;\n\t},\n): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst isPurple = opts.tone === \"compaction\" || opts.tone === \"skill\";\n\tconst frameColor: ThemeColor = opts.tone === \"user\" ? \"border\" : isPurple ? \"customMessageLabel\" : \"borderAccent\";\n\tconst bodyColor: ThemeColor =\n\t\topts.tone === \"user\" ? \"userMessageText\" : isPurple ? \"customMessageText\" : \"assistantMessageText\";\n\n\t// A label may carry a \" - \" splitting a bold name from a dim detail.\n\tconst dashIdx = opts.label.indexOf(\" - \");\n\tconst titleStyled =\n\t\tdashIdx >= 0\n\t\t\t? theme.fg(frameColor, theme.bold(opts.label.slice(0, dashIdx))) + theme.fg(\"dim\", opts.label.slice(dashIdx))\n\t\t\t: theme.fg(frameColor, theme.bold(opts.label));\n\tconst rightRaw =\n\t\topts.showTimestamp === false || !opts.timestamp ? \"\" : formatTimestamp(opts.timestamp, opts.timestampFormat);\n\n\tconst source = trimOuterBlankLines(contentLines);\n\tconst body = (source.length > 0 ? source : [\"\"]).map((line) => theme.fg(bodyColor, line));\n\n\tlet surface = style()\n\t\t.border(\"open\")\n\t\t.borderColor((text) => theme.fg(frameColor, text))\n\t\t.title(titleStyled);\n\tif (rightRaw) {\n\t\tsurface = surface.titleRight(theme.fg(\"dim\", rightRaw));\n\t}\n\treturn surface.render(body, outerWidth);\n}\n\nexport function renderAssistantRail(\n\tlines: string[],\n\twidth: number,\n\topts: {\n\t\tlabel?: string;\n\t\tmeta?: string;\n\t\trailColor?: ThemeColor;\n\t\tconnected?: boolean;\n\t\tcontinuesToUser?: boolean;\n\t} = {},\n): string[] {\n\tconst railColor = opts.railColor ?? \"borderAccent\";\n\tconst source = trimOuterBlankLines(lines);\n\tconst body = (source.length > 0 ? source : [\"\"]).map((line) => theme.fg(\"assistantMessageText\", line));\n\tconst titleRight = opts.meta ? theme.fg(\"dim\", opts.meta) : undefined;\n\tconst card = renderConnectedCard(width, opts.label ?? \"GSD\", body, {\n\t\tindent: 0,\n\t\ttitleRight,\n\t\trailColor,\n\t\tcloseBottom: !opts.continuesToUser,\n\t});\n\tlet result = card;\n\tif (opts.connected) {\n\t\tresult = [...renderChatTurnBridge(width, TRANSCRIPT_CARD_INDENT), ...result];\n\t}\n\tif (opts.continuesToUser) {\n\t\tresult = [...result, ...renderChatTurnBridgeToUser(width)];\n\t}\n\treturn result;\n}\n\nexport function renderUserRail(\n\tlines: string[],\n\twidth: number,\n\topts: { label?: string; meta?: string; continuesToAssistant?: boolean },\n): string[] {\n\tconst source = trimOuterBlankLines(lines);\n\tconst body = (source.length > 0 ? source : [\"\"]).map((line) => theme.fg(\"userMessageText\", line));\n\tconst titleRight = opts.meta ? theme.fg(\"dim\", opts.meta) : undefined;\n\treturn renderConnectedCard(width, opts.label ?? \"You\", body, {\n\t\tindent: TRANSCRIPT_CARD_INDENT,\n\t\ttitleRight,\n\t\trailColor: \"border\",\n\t\ttitleColor: \"border\",\n\t\tcloseBottom: !opts.continuesToAssistant,\n\t});\n}\n\n/**\n * Render a single titled rule line — the collapsed form of a tool/command\n * card on the \"open\" surface. `title` and `right` must be pre-styled.\n */\nfunction openRuleLine(title: string, right: string, width: number, tone: ThemeColor, sweep = false): string {\n\tconst w = Math.max(20, width);\n\tif (!right) {\n\t\tconst clippedTitle = truncateToWidth(title, Math.max(0, w - 6), \"\");\n\t\tconst fill = Math.max(1, w - 5 - visibleWidth(clippedTitle));\n\t\treturn padLine(renderRailText(\"─── \", tone) + clippedTitle + renderRailText(` ${\"─\".repeat(fill)}`, tone), w);\n\t}\n\n\tconst titleBudget = Math.max(0, w - 11);\n\tconst rightReserve = titleBudget > 1 && visibleWidth(right) > 0 ? 1 : 0;\n\tconst leftBudget = Math.min(visibleWidth(title), Math.max(0, titleBudget - rightReserve));\n\tconst rightBudget = Math.max(0, titleBudget - leftBudget);\n\tconst clippedTitle = truncateToWidth(title, leftBudget, \"\");\n\tconst clippedRight = truncateToWidth(right, rightBudget, \"\");\n\tconst fixed = 4 + visibleWidth(clippedTitle) + 2 + visibleWidth(clippedRight) + 4;\n\tconst fill = Math.max(1, w - fixed);\n\tconst sweepFrame = sweep ? runningRailFrame() : undefined;\n\n\treturn padLine(\n\t\trenderRailText(\"─── \", tone) +\n\t\t\tclippedTitle +\n\t\t\trenderRailText(` ${\"─\".repeat(fill)} `, tone, sweepFrame) +\n\t\t\tclippedRight +\n\t\t\trenderRailText(\" ───\", tone),\n\t\tw,\n\t);\n}\n\nfunction indentRenderedLines(lines: string[], indent: number, width: number): string[] {\n\tif (indent <= 0) return lines;\n\tconst prefix = indentSpaces(indent);\n\treturn lines.map((line) => padLine(prefix + truncateToWidth(line, Math.max(1, width - indent), \"\"), width));\n}\n\nexport function renderTranscriptCard(\n\tlines: string[],\n\twidth: number,\n\topts: {\n\t\ttitle: string;\n\t\tright?: string;\n\t\ttone: StatusTone;\n\t\tfooterLeft?: string;\n\t\tfooterRight?: string;\n\t\tindent?: number;\n\t},\n): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;\n\tconst tone = toneColor(opts.tone);\n\tconst body = trimOuterBlankLines(lines);\n\tlet titleRight = opts.right ? theme.fg(tone, opts.right) : undefined;\n\tif (opts.footerLeft || opts.footerRight) {\n\t\tconst hint = [opts.footerLeft, opts.footerRight].filter(Boolean).join(\" · \");\n\t\tconst hintStyled = theme.fg(\"dim\", hint);\n\t\ttitleRight = titleRight ? `${titleRight} · ${hintStyled}` : hintStyled;\n\t}\n\treturn renderConnectedCard(outerWidth, opts.title, body, {\n\t\tindent,\n\t\ttitleRight,\n\t\trailColor: tone,\n\t\trailSweep: opts.tone === \"running\",\n\t});\n}\n\nexport function renderToolLineCard(\n\ttitle: string,\n\ttarget: string | undefined,\n\twidth: number,\n\topts: { status: string; tone: StatusTone; hidden?: boolean; titlePrefix?: string; bg?: ThemeBg; indent?: number },\n): string[] {\n\tconst tone = toneColor(opts.tone);\n\tconst indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;\n\tconst innerWidth = Math.max(20, width - indent);\n\tconst titleText = `${opts.titlePrefix ?? \"\"}${styledHeader(title, \"borderAccent\")}${\n\t\ttarget ? ` ${theme.fg(\"text\", target)}` : \"\"\n\t}`;\n\tconst statusText = opts.hidden ? `${opts.status} · output hidden · ctrl+o expand` : opts.status;\n\tconst right = theme.fg(opts.tone === \"success\" ? \"success\" : tone, statusText);\n\tconst rule = openRuleLine(titleText, right, innerWidth, tone, opts.tone === \"running\");\n\tconst line = opts.bg ? theme.bg(opts.bg, rule) : rule;\n\treturn indentRenderedLines([line], indent, width);\n}\n\nexport function renderCommandCard(\n\tcommand: string,\n\twidth: number,\n\topts: { status: string; tone: StatusTone; progress?: string; indent?: number },\n): string[] {\n\tconst tone = toneColor(opts.tone);\n\tconst indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;\n\tconst innerWidth = Math.max(20, width - indent);\n\tconst titleText = `${theme.fg(\"accent\", \"$\")} ${theme.fg(\"text\", command)}`;\n\tconst statusText = opts.progress\n\t\t? `${opts.progress} ${opts.status}`\n\t\t: `${opts.status} · output hidden · ctrl+o expand`;\n\tconst right = theme.fg(opts.tone === \"success\" ? \"success\" : tone, statusText);\n\treturn indentRenderedLines([openRuleLine(titleText, right, innerWidth, tone, opts.tone === \"running\")], indent, width);\n}\n\nexport function renderProgressBar(done: number, total: number, width: number, tone: StatusTone = \"success\"): string {\n\tconst clampedWidth = Math.max(0, width);\n\tconst pct = total > 0 ? Math.max(0, Math.min(1, done / total)) : 0;\n\tconst filled = Math.round(pct * clampedWidth);\n\treturn (\n\t\ttheme.fg(toneColor(tone), \"█\".repeat(filled)) +\n\t\ttheme.fg(\"dim\", \"░\".repeat(clampedWidth - filled))\n\t);\n}\n\nexport function renderFooterStrip(leftSegments: string[], right: string, width: number): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst innerWidth = Math.max(1, outerWidth - 2);\n\tconst sep = theme.fg(\"dim\", \" │ \");\n\tconst rightStyled = theme.fg(\"dim\", right);\n\tconst rightWidth = visibleWidth(rightStyled);\n\tconst leftBudget = right ? Math.max(1, innerWidth - rightWidth - 3) : innerWidth;\n\tconst left = truncateToWidth(leftSegments.filter(Boolean).join(sep), leftBudget, \"\");\n\tconst content = rightAlign(left, rightStyled, innerWidth);\n\treturn roundedPanel([content], outerWidth);\n}\n"]}
|
package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-controller.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/controllers/chat-controller.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAuJnG,0FAA0F;AAC1F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1D;
|
|
1
|
+
{"version":3,"file":"chat-controller.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/controllers/chat-controller.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAuJnG,0FAA0F;AAC1F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1D;AA2CD;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAYzF;AAiFD;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC5C,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACrD,IAAI,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAE,GACpC,MAAM,GAAG,SAAS,CAkBpB;AA0HD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ/D;AA6CD,wBAAgB,4BAA4B,CAC3C,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,GACvB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB/C;AAED,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAExE;AAgJD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,wBAAwB,GAAG;IACvE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,4BAA4B,EAAE,MAAM,GAAG,CAAC;IACxC,gBAAgB,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACxD,qBAAqB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;IACpD,2BAA2B,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,CAAC;IACvD,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,oBAAoB,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,4BAA4B,EAAE,MAAM,IAAI,CAAC;IACzC,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,wBAAwB,EAAE;QAAE,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;CAChD,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkzB7C"}
|
|
@@ -98,6 +98,39 @@ export function textInvitesUserReply(text) {
|
|
|
98
98
|
return /\b(?:what do you want|what's on your mind|let me know|tell me what|help me understand)\b/i.test(trimmed);
|
|
99
99
|
}
|
|
100
100
|
const DISCUSS_RESTATE_RE = /\b(?:what do you want|what should we|before i can write|context file|placeholder name|need to understand what|what(?:'s| is) (?:on your mind|the next)|help me understand what you want)\b/i;
|
|
101
|
+
/** Second sub-turn that only says it is waiting after questions were already asked. */
|
|
102
|
+
const HANDOFF_WAIT_RESTATE_RE = /\b(?:holding\s+(?:here|for)|waiting\s+(?:here|for)|no\s+need\s+for\s+anything\s+else|until\s+you\s+(?:point|tell|let\s+me\s+know|answer|reply)|i(?:'ve| have)\s+asked)\b/i;
|
|
103
|
+
function isWaitOnlyQuestionFragment(fragment) {
|
|
104
|
+
return /^(?:i(?:'ve| have)\s+asked\b|(?:i'?m|i am)\s+(?:holding|waiting)\b|no\s+need\s+for\s+anything\s+else\b)/i.test(fragment)
|
|
105
|
+
&& !/\b(?:should|do you|would you|can we|could we|what|which|how|where|when|who|also|add|include)\b/i.test(fragment);
|
|
106
|
+
}
|
|
107
|
+
/** True when text adds a question beyond wait/hold boilerplate. */
|
|
108
|
+
function containsNewSubstantiveQuestion(text) {
|
|
109
|
+
for (let i = 0; i < text.length; i++) {
|
|
110
|
+
if (text[i] !== "?")
|
|
111
|
+
continue;
|
|
112
|
+
const previousBreak = Math.max(text.lastIndexOf("\n", i), text.lastIndexOf(".", i), text.lastIndexOf("!", i), text.lastIndexOf("?", i - 1), -1);
|
|
113
|
+
const fragment = text.slice(previousBreak + 1, i + 1).trim();
|
|
114
|
+
if (fragment.length < 8)
|
|
115
|
+
continue;
|
|
116
|
+
if (isWaitOnlyQuestionFragment(fragment))
|
|
117
|
+
continue;
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
function isHandoffWaitRestatement(next) {
|
|
123
|
+
if (!HANDOFF_WAIT_RESTATE_RE.test(next))
|
|
124
|
+
return false;
|
|
125
|
+
// Keep follow-ups that add a real question even when they also say holding/waiting.
|
|
126
|
+
if (containsNewSubstantiveQuestion(next))
|
|
127
|
+
return false;
|
|
128
|
+
// Only classify as a pure wait ack when the text is short; long text likely
|
|
129
|
+
// contains substantive content alongside incidental wait language.
|
|
130
|
+
if (next.length > 400)
|
|
131
|
+
return false;
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
101
134
|
/**
|
|
102
135
|
* Claude Code can emit a second text sub-turn that restates the same milestone
|
|
103
136
|
* discuss ask. Drop it when the prior sub-turn already invited a user reply.
|
|
@@ -109,12 +142,33 @@ export function isRedundantDiscussRestatement(priorText, newText) {
|
|
|
109
142
|
return false;
|
|
110
143
|
if (!textInvitesUserReply(prior))
|
|
111
144
|
return false;
|
|
112
|
-
|
|
145
|
+
const isDiscussRestate = DISCUSS_RESTATE_RE.test(next);
|
|
146
|
+
const isWaitRestate = isHandoffWaitRestatement(next);
|
|
147
|
+
if (!isDiscussRestate && !isWaitRestate)
|
|
113
148
|
return false;
|
|
149
|
+
// Wait acks are gated on length and no-? inside isHandoffWaitRestatement.
|
|
150
|
+
if (isWaitRestate)
|
|
151
|
+
return true;
|
|
114
152
|
if (next.length > prior.length * 1.1)
|
|
115
153
|
return false;
|
|
116
154
|
return next.length <= prior.length || next.length < 900;
|
|
117
155
|
}
|
|
156
|
+
function isSubTurnTextReplacement(blocks, rendered) {
|
|
157
|
+
for (const seg of rendered) {
|
|
158
|
+
if (seg.kind !== "text-run")
|
|
159
|
+
continue;
|
|
160
|
+
const oldText = (seg.cachedText ?? "").trim();
|
|
161
|
+
if (!oldText)
|
|
162
|
+
continue;
|
|
163
|
+
const newText = getTextFromContentBlocks(blocks, seg.startIndex, seg.endIndex).trim();
|
|
164
|
+
if (!newText || newText === oldText)
|
|
165
|
+
continue;
|
|
166
|
+
// Streaming growth extends prior text; a new sub-turn replaces it wholesale.
|
|
167
|
+
if (!newText.startsWith(oldText) && !oldText.startsWith(newText))
|
|
168
|
+
return seg.startIndex;
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
118
172
|
function getTextFromContentBlocks(blocks, startIndex, endIndex) {
|
|
119
173
|
const parts = [];
|
|
120
174
|
for (let i = startIndex; i <= endIndex && i < blocks.length; i++) {
|
|
@@ -193,6 +247,12 @@ export function priorAssistantTextFromSession(messages, opts) {
|
|
|
193
247
|
}
|
|
194
248
|
return undefined;
|
|
195
249
|
}
|
|
250
|
+
function shouldSuppressEntireAssistantMessage(message, sessionMessages, orphaned) {
|
|
251
|
+
const textBlocks = (message.content ?? []).filter((block) => block?.type === "text" && typeof block.text === "string" && block.text.trim());
|
|
252
|
+
if (textBlocks.length !== 1)
|
|
253
|
+
return false;
|
|
254
|
+
return shouldSuppressRedundantHandoffText(sessionMessages, textBlocks[0].text, orphaned, []);
|
|
255
|
+
}
|
|
196
256
|
function shouldSuppressRedundantHandoffText(sessionMessages, currentText, orphaned, rendered) {
|
|
197
257
|
const next = currentText.trim();
|
|
198
258
|
if (!next)
|
|
@@ -374,6 +434,22 @@ let hasToolsInTurn = false;
|
|
|
374
434
|
let pinnedBorder;
|
|
375
435
|
// Reference to the pinned markdown component below the border
|
|
376
436
|
let pinnedTextComponent;
|
|
437
|
+
// Set when the pinned zone was shown this turn; used to realign viewport after teardown.
|
|
438
|
+
let pinnedZoneNeedsViewportRealign = false;
|
|
439
|
+
function tearDownPinnedZone(host, options) {
|
|
440
|
+
const needsRealign = pinnedZoneNeedsViewportRealign;
|
|
441
|
+
if (pinnedBorder)
|
|
442
|
+
pinnedBorder.stopSpinner();
|
|
443
|
+
pinnedBorder = undefined;
|
|
444
|
+
pinnedTextComponent = undefined;
|
|
445
|
+
host.pinnedMessageContainer.clear();
|
|
446
|
+
lastPinnedText = "";
|
|
447
|
+
hasToolsInTurn = false;
|
|
448
|
+
pinnedZoneNeedsViewportRealign = false;
|
|
449
|
+
if (options?.realignViewport && needsRealign) {
|
|
450
|
+
host.ui.requestRender(true);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
377
453
|
function mergeToolPhases(phases) {
|
|
378
454
|
const merged = [];
|
|
379
455
|
for (const phase of phases) {
|
|
@@ -462,15 +538,9 @@ export async function handleAgentEvent(host, event) {
|
|
|
462
538
|
if (event.type === "message_start" && event.message.role === "assistant") {
|
|
463
539
|
lastProcessedContentIndex = 0;
|
|
464
540
|
lastContentLength = 0;
|
|
465
|
-
lastPinnedText = "";
|
|
466
|
-
hasToolsInTurn = false;
|
|
467
541
|
renderedSegments = [];
|
|
468
542
|
orphanedSegments = [];
|
|
469
|
-
|
|
470
|
-
pinnedBorder.stopSpinner();
|
|
471
|
-
pinnedBorder = undefined;
|
|
472
|
-
pinnedTextComponent = undefined;
|
|
473
|
-
host.pinnedMessageContainer.clear();
|
|
543
|
+
tearDownPinnedZone(host);
|
|
474
544
|
}
|
|
475
545
|
switch (event.type) {
|
|
476
546
|
case "session_state_changed":
|
|
@@ -482,16 +552,10 @@ export async function handleAgentEvent(host, event) {
|
|
|
482
552
|
host.streamingMessage = undefined;
|
|
483
553
|
host.pendingTools.clear();
|
|
484
554
|
host.pendingMessagesContainer.clear();
|
|
485
|
-
host
|
|
486
|
-
lastPinnedText = "";
|
|
487
|
-
hasToolsInTurn = false;
|
|
555
|
+
tearDownPinnedZone(host);
|
|
488
556
|
renderedSegments = [];
|
|
489
557
|
orphanedSegments = [];
|
|
490
558
|
lastContentLength = 0;
|
|
491
|
-
if (pinnedBorder)
|
|
492
|
-
pinnedBorder.stopSpinner();
|
|
493
|
-
pinnedBorder = undefined;
|
|
494
|
-
pinnedTextComponent = undefined;
|
|
495
559
|
host.compactionQueuedMessages = [];
|
|
496
560
|
host.rebuildChatFromMessages();
|
|
497
561
|
host.updatePendingMessagesDisplay();
|
|
@@ -564,7 +628,10 @@ export async function handleAgentEvent(host, event) {
|
|
|
564
628
|
externalToolResult = {
|
|
565
629
|
toolCallId: tc.id,
|
|
566
630
|
content: ext.content ?? [{ type: "text", text: "" }],
|
|
567
|
-
|
|
631
|
+
// Preserve undefined when MCP omits structuredContent — an empty
|
|
632
|
+
// object is truthy and makes ask_user_questions renderResult show
|
|
633
|
+
// "Cancelled" despite a successful text payload (#cc-elicitation).
|
|
634
|
+
details: ext.details,
|
|
568
635
|
isError: ext.isError ?? false,
|
|
569
636
|
};
|
|
570
637
|
}
|
|
@@ -577,7 +644,7 @@ export async function handleAgentEvent(host, event) {
|
|
|
577
644
|
externalToolResult = {
|
|
578
645
|
toolCallId: block.id,
|
|
579
646
|
content: ext.content ?? [{ type: "text", text: "" }],
|
|
580
|
-
details: ext.details
|
|
647
|
+
details: ext.details,
|
|
581
648
|
isError: ext.isError ?? false,
|
|
582
649
|
};
|
|
583
650
|
}
|
|
@@ -591,6 +658,9 @@ export async function handleAgentEvent(host, event) {
|
|
|
591
658
|
// components don't get overwritten in place with new sub-turn
|
|
592
659
|
// content (#4144 regression). Prior sub-turn children stay in
|
|
593
660
|
// chatContainer as frozen history; new segments append after them.
|
|
661
|
+
const replacedAt = contentBlocks.length <= lastContentLength
|
|
662
|
+
? isSubTurnTextReplacement(contentBlocks, renderedSegments)
|
|
663
|
+
: null;
|
|
594
664
|
if (contentBlocks.length < lastContentLength) {
|
|
595
665
|
// Accumulate across successive shrinks — overwriting would drop
|
|
596
666
|
// segments displaced by an earlier shrink, leaving them stranded
|
|
@@ -600,6 +670,19 @@ export async function handleAgentEvent(host, event) {
|
|
|
600
670
|
lastPinnedText = "";
|
|
601
671
|
lastProcessedContentIndex = 0;
|
|
602
672
|
}
|
|
673
|
+
else if (replacedAt !== null) {
|
|
674
|
+
// Same-index wholesale replacement: orphan only the replaced
|
|
675
|
+
// text-run and any text-runs after it. Earlier unchanged text
|
|
676
|
+
// and tool segments stay in renderedSegments so they are not
|
|
677
|
+
// re-rendered and duplicated in chatContainer.
|
|
678
|
+
orphanedSegments = [
|
|
679
|
+
...orphanedSegments,
|
|
680
|
+
...renderedSegments.filter((seg) => seg.kind === "text-run" && seg.startIndex >= replacedAt),
|
|
681
|
+
];
|
|
682
|
+
renderedSegments = renderedSegments.filter((seg) => !(seg.kind === "text-run" && seg.startIndex >= replacedAt));
|
|
683
|
+
lastPinnedText = "";
|
|
684
|
+
lastProcessedContentIndex = replacedAt;
|
|
685
|
+
}
|
|
603
686
|
else if (lastProcessedContentIndex >= contentBlocks.length) {
|
|
604
687
|
lastProcessedContentIndex = 0;
|
|
605
688
|
}
|
|
@@ -807,6 +890,7 @@ export async function handleAgentEvent(host, event) {
|
|
|
807
890
|
// doesn't exceed the viewport and cause render flashing.
|
|
808
891
|
pinnedTextComponent.maxLines = pinnedMax;
|
|
809
892
|
host.pinnedMessageContainer.addChild(pinnedTextComponent);
|
|
893
|
+
pinnedZoneNeedsViewportRealign = true;
|
|
810
894
|
// Hide the separate status loader — the pinned zone replaces it
|
|
811
895
|
if (host.loadingAnimation) {
|
|
812
896
|
host.loadingAnimation.stop();
|
|
@@ -827,11 +911,7 @@ export async function handleAgentEvent(host, event) {
|
|
|
827
911
|
else if (pinnedBorder) {
|
|
828
912
|
// Every candidate is still visible in the chat scrollback —
|
|
829
913
|
// tear down the pinned zone so we don't duplicate on-screen text.
|
|
830
|
-
|
|
831
|
-
pinnedBorder = undefined;
|
|
832
|
-
pinnedTextComponent = undefined;
|
|
833
|
-
host.pinnedMessageContainer.clear();
|
|
834
|
-
lastPinnedText = "";
|
|
914
|
+
tearDownPinnedZone(host);
|
|
835
915
|
if (!host.loadingAnimation) {
|
|
836
916
|
host.statusContainer.clear();
|
|
837
917
|
startLoadingAnimation(host);
|
|
@@ -857,7 +937,7 @@ export async function handleAgentEvent(host, event) {
|
|
|
857
937
|
const shouldRenderAssistant = hasVisibleAssistantContent(host.streamingMessage, host.hideThinkingBlock) ||
|
|
858
938
|
((host.streamingMessage.stopReason === "aborted" || host.streamingMessage.stopReason === "error") &&
|
|
859
939
|
!hasAssistantToolBlocks(host.streamingMessage));
|
|
860
|
-
const suppressRedundantHandoff =
|
|
940
|
+
const suppressRedundantHandoff = shouldSuppressEntireAssistantMessage(host.streamingMessage, host.session.messages, orphanedSegments);
|
|
861
941
|
// The final message_end payload can contain additional text/thinking
|
|
862
942
|
// blocks that never arrived via message_update (e.g. SDK result
|
|
863
943
|
// aggregation). Rebuild this in-flight turn from final content so
|
|
@@ -913,8 +993,7 @@ export async function handleAgentEvent(host, event) {
|
|
|
913
993
|
const comp = new AssistantMessageComponent(undefined, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(), timestampFormat, { startIndex: seg.startIndex, endIndex: seg.endIndex }, connectedToUser);
|
|
914
994
|
comp.updateContent(host.streamingMessage);
|
|
915
995
|
const segmentText = getTextFromContentBlocks(finalBlocks, seg.startIndex, seg.endIndex);
|
|
916
|
-
if (
|
|
917
|
-
shouldSuppressRedundantHandoffText(host.session.messages, segmentText, orphanedSegments, renderedSegments)) {
|
|
996
|
+
if (shouldSuppressRedundantHandoffText(host.session.messages, segmentText, orphanedSegments, renderedSegments)) {
|
|
918
997
|
continue;
|
|
919
998
|
}
|
|
920
999
|
host.chatContainer.addChild(comp);
|
|
@@ -973,13 +1052,7 @@ export async function handleAgentEvent(host, event) {
|
|
|
973
1052
|
// Clear pinned output once the message is finalized in the chat
|
|
974
1053
|
// container — prevents duplicate display when the agent continues
|
|
975
1054
|
// (e.g. form elicitation) after the assistant message ends.
|
|
976
|
-
|
|
977
|
-
pinnedBorder.stopSpinner();
|
|
978
|
-
host.pinnedMessageContainer.clear();
|
|
979
|
-
lastPinnedText = "";
|
|
980
|
-
hasToolsInTurn = false;
|
|
981
|
-
pinnedBorder = undefined;
|
|
982
|
-
pinnedTextComponent = undefined;
|
|
1055
|
+
tearDownPinnedZone(host, { realignViewport: true });
|
|
983
1056
|
host.footer.invalidate();
|
|
984
1057
|
}
|
|
985
1058
|
host.ui.requestRender();
|
|
@@ -1031,14 +1104,7 @@ export async function handleAgentEvent(host, event) {
|
|
|
1031
1104
|
host.pendingTools.clear();
|
|
1032
1105
|
// Pinned output is only useful while work is actively streaming.
|
|
1033
1106
|
// Keep chat history as the single source after completion.
|
|
1034
|
-
|
|
1035
|
-
pinnedBorder.stopSpinner();
|
|
1036
|
-
}
|
|
1037
|
-
host.pinnedMessageContainer.clear();
|
|
1038
|
-
lastPinnedText = "";
|
|
1039
|
-
hasToolsInTurn = false;
|
|
1040
|
-
pinnedBorder = undefined;
|
|
1041
|
-
pinnedTextComponent = undefined;
|
|
1107
|
+
tearDownPinnedZone(host, { realignViewport: true });
|
|
1042
1108
|
await host.checkShutdownRequested();
|
|
1043
1109
|
host.ui.requestRender();
|
|
1044
1110
|
break;
|