@bastani/atomic 0.7.17-1 → 0.8.0-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4183 -0
- package/README.md +655 -0
- package/dist/builtin/intercom/CHANGELOG.md +195 -0
- package/dist/builtin/intercom/LICENSE +21 -0
- package/dist/builtin/intercom/README.md +484 -0
- package/dist/builtin/intercom/broker/broker.ts +346 -0
- package/dist/builtin/intercom/broker/client.ts +535 -0
- package/dist/builtin/intercom/broker/framing.ts +57 -0
- package/dist/builtin/intercom/broker/paths.ts +21 -0
- package/dist/builtin/intercom/broker/spawn.ts +308 -0
- package/dist/builtin/intercom/config.ts +109 -0
- package/dist/builtin/intercom/index.ts +1780 -0
- package/dist/builtin/intercom/package.json +59 -0
- package/dist/builtin/intercom/reply-tracker.ts +102 -0
- package/dist/builtin/intercom/skills/intercom/SKILL.md +513 -0
- package/dist/builtin/intercom/types.ts +46 -0
- package/dist/builtin/intercom/ui/compose.ts +139 -0
- package/dist/builtin/intercom/ui/inline-message.ts +76 -0
- package/dist/builtin/intercom/ui/session-list.ts +162 -0
- package/dist/builtin/mcp/CHANGELOG.md +346 -0
- package/dist/builtin/mcp/LICENSE +21 -0
- package/dist/builtin/mcp/OAUTH.md +324 -0
- package/dist/builtin/mcp/README.md +373 -0
- package/dist/builtin/mcp/agent-dir.ts +21 -0
- package/dist/builtin/mcp/app-bridge.bundle.js +67 -0
- package/dist/builtin/mcp/cli.js +186 -0
- package/dist/builtin/mcp/commands.ts +420 -0
- package/dist/builtin/mcp/config.ts +667 -0
- package/dist/builtin/mcp/consent-manager.ts +64 -0
- package/dist/builtin/mcp/direct-tools.ts +427 -0
- package/dist/builtin/mcp/errors.ts +219 -0
- package/dist/builtin/mcp/glimpse-ui.ts +80 -0
- package/dist/builtin/mcp/host-html-template.ts +427 -0
- package/dist/builtin/mcp/index.ts +334 -0
- package/dist/builtin/mcp/init.ts +336 -0
- package/dist/builtin/mcp/lifecycle.ts +93 -0
- package/dist/builtin/mcp/logger.ts +169 -0
- package/dist/builtin/mcp/mcp-auth-flow.ts +362 -0
- package/dist/builtin/mcp/mcp-auth.ts +297 -0
- package/dist/builtin/mcp/mcp-callback-server.ts +284 -0
- package/dist/builtin/mcp/mcp-oauth-provider.ts +302 -0
- package/dist/builtin/mcp/mcp-panel.ts +826 -0
- package/dist/builtin/mcp/mcp-setup-panel.ts +577 -0
- package/dist/builtin/mcp/metadata-cache.ts +201 -0
- package/dist/builtin/mcp/npx-resolver.ts +424 -0
- package/dist/builtin/mcp/oauth-handler.ts +60 -0
- package/dist/builtin/mcp/onboarding-state.ts +68 -0
- package/dist/builtin/mcp/package.json +61 -0
- package/dist/builtin/mcp/proxy-modes.ts +803 -0
- package/dist/builtin/mcp/resource-tools.ts +17 -0
- package/dist/builtin/mcp/sampling-handler.ts +268 -0
- package/dist/builtin/mcp/server-manager.ts +375 -0
- package/dist/builtin/mcp/state.ts +41 -0
- package/dist/builtin/mcp/tool-metadata.ts +152 -0
- package/dist/builtin/mcp/tool-registrar.ts +46 -0
- package/dist/builtin/mcp/tool-result-renderer.ts +65 -0
- package/dist/builtin/mcp/types.ts +441 -0
- package/dist/builtin/mcp/ui-resource-handler.ts +145 -0
- package/dist/builtin/mcp/ui-server.ts +623 -0
- package/dist/builtin/mcp/ui-session.ts +384 -0
- package/dist/builtin/mcp/ui-stream-types.ts +89 -0
- package/dist/builtin/mcp/utils.ts +129 -0
- package/dist/builtin/subagents/CHANGELOG.md +1019 -0
- package/dist/builtin/subagents/README.md +991 -0
- package/dist/builtin/subagents/agents/code-simplifier.md +84 -0
- package/dist/builtin/subagents/agents/codebase-analyzer.md +158 -0
- package/dist/builtin/subagents/agents/codebase-locator.md +113 -0
- package/dist/builtin/subagents/agents/codebase-online-researcher.md +317 -0
- package/dist/builtin/subagents/agents/codebase-pattern-finder.md +236 -0
- package/dist/builtin/subagents/agents/codebase-research-analyzer.md +181 -0
- package/dist/builtin/subagents/agents/codebase-research-locator.md +146 -0
- package/dist/builtin/subagents/agents/debugger.md +92 -0
- package/dist/builtin/subagents/package.json +67 -0
- package/dist/builtin/subagents/prompts/gather-context-and-clarify.md +20 -0
- package/dist/builtin/subagents/prompts/parallel-cleanup.md +60 -0
- package/dist/builtin/subagents/prompts/parallel-context-build.md +55 -0
- package/dist/builtin/subagents/prompts/parallel-handoff-plan.md +77 -0
- package/dist/builtin/subagents/prompts/parallel-research.md +58 -0
- package/dist/builtin/subagents/prompts/parallel-review.md +52 -0
- package/dist/builtin/subagents/prompts/review-loop.md +48 -0
- package/dist/builtin/subagents/skills/subagent/SKILL.md +734 -0
- package/dist/builtin/subagents/src/agents/agent-management.ts +644 -0
- package/dist/builtin/subagents/src/agents/agent-scope.ts +6 -0
- package/dist/builtin/subagents/src/agents/agent-selection.ts +23 -0
- package/dist/builtin/subagents/src/agents/agent-serializer.ts +84 -0
- package/dist/builtin/subagents/src/agents/agents.ts +809 -0
- package/dist/builtin/subagents/src/agents/chain-serializer.ts +137 -0
- package/dist/builtin/subagents/src/agents/frontmatter.ts +29 -0
- package/dist/builtin/subagents/src/agents/identity.ts +30 -0
- package/dist/builtin/subagents/src/agents/skills.ts +630 -0
- package/dist/builtin/subagents/src/extension/control-notices.ts +92 -0
- package/dist/builtin/subagents/src/extension/doctor.ts +199 -0
- package/dist/builtin/subagents/src/extension/index.ts +586 -0
- package/dist/builtin/subagents/src/extension/schemas.ts +168 -0
- package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +378 -0
- package/dist/builtin/subagents/src/intercom/result-intercom.ts +269 -0
- package/dist/builtin/subagents/src/runs/background/async-execution.ts +612 -0
- package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +267 -0
- package/dist/builtin/subagents/src/runs/background/async-resume.ts +332 -0
- package/dist/builtin/subagents/src/runs/background/async-status.ts +295 -0
- package/dist/builtin/subagents/src/runs/background/completion-dedupe.ts +63 -0
- package/dist/builtin/subagents/src/runs/background/notify.ts +108 -0
- package/dist/builtin/subagents/src/runs/background/parallel-groups.ts +45 -0
- package/dist/builtin/subagents/src/runs/background/result-watcher.ts +250 -0
- package/dist/builtin/subagents/src/runs/background/run-status.ts +193 -0
- package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +291 -0
- package/dist/builtin/subagents/src/runs/background/subagent-runner.ts +1760 -0
- package/dist/builtin/subagents/src/runs/background/top-level-async.ts +13 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify.ts +1333 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +932 -0
- package/dist/builtin/subagents/src/runs/foreground/execution.ts +902 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +2231 -0
- package/dist/builtin/subagents/src/runs/shared/completion-guard.ts +125 -0
- package/dist/builtin/subagents/src/runs/shared/long-running-guard.ts +175 -0
- package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +103 -0
- package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +108 -0
- package/dist/builtin/subagents/src/runs/shared/pi-args.ts +163 -0
- package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +115 -0
- package/dist/builtin/subagents/src/runs/shared/run-history.ts +56 -0
- package/dist/builtin/subagents/src/runs/shared/single-output.ts +154 -0
- package/dist/builtin/subagents/src/runs/shared/subagent-control.ts +226 -0
- package/dist/builtin/subagents/src/runs/shared/subagent-prompt-runtime.ts +152 -0
- package/dist/builtin/subagents/src/runs/shared/worktree.ts +577 -0
- package/dist/builtin/subagents/src/shared/artifacts.ts +99 -0
- package/dist/builtin/subagents/src/shared/atomic-json.ts +16 -0
- package/dist/builtin/subagents/src/shared/file-coalescer.ts +40 -0
- package/dist/builtin/subagents/src/shared/fork-context.ts +76 -0
- package/dist/builtin/subagents/src/shared/formatters.ts +133 -0
- package/dist/builtin/subagents/src/shared/jsonl-writer.ts +81 -0
- package/dist/builtin/subagents/src/shared/model-info.ts +78 -0
- package/dist/builtin/subagents/src/shared/post-exit-stdio-guard.ts +85 -0
- package/dist/builtin/subagents/src/shared/session-identity.ts +10 -0
- package/dist/builtin/subagents/src/shared/session-tokens.ts +44 -0
- package/dist/builtin/subagents/src/shared/settings.ts +397 -0
- package/dist/builtin/subagents/src/shared/status-format.ts +49 -0
- package/dist/builtin/subagents/src/shared/types.ts +732 -0
- package/dist/builtin/subagents/src/shared/utils.ts +440 -0
- package/dist/builtin/subagents/src/slash/prompt-template-bridge.ts +397 -0
- package/dist/builtin/subagents/src/slash/slash-bridge.ts +174 -0
- package/dist/builtin/subagents/src/slash/slash-commands.ts +528 -0
- package/dist/builtin/subagents/src/slash/slash-live-state.ts +292 -0
- package/dist/builtin/subagents/src/tui/render-helpers.ts +80 -0
- package/dist/builtin/subagents/src/tui/render.ts +1257 -0
- package/dist/builtin/web-access/CHANGELOG.md +387 -0
- package/dist/builtin/web-access/LICENSE +21 -0
- package/dist/builtin/web-access/README.md +346 -0
- package/dist/builtin/web-access/activity.ts +101 -0
- package/dist/builtin/web-access/chrome-cookies.ts +322 -0
- package/dist/builtin/web-access/code-search.ts +107 -0
- package/dist/builtin/web-access/curator-page.ts +3359 -0
- package/dist/builtin/web-access/curator-server.ts +605 -0
- package/dist/builtin/web-access/exa.ts +521 -0
- package/dist/builtin/web-access/extract.ts +701 -0
- package/dist/builtin/web-access/gemini-api.ts +113 -0
- package/dist/builtin/web-access/gemini-search.ts +362 -0
- package/dist/builtin/web-access/gemini-url-context.ts +126 -0
- package/dist/builtin/web-access/gemini-web-config.ts +54 -0
- package/dist/builtin/web-access/gemini-web.ts +396 -0
- package/dist/builtin/web-access/github-api.ts +196 -0
- package/dist/builtin/web-access/github-extract.ts +635 -0
- package/dist/builtin/web-access/index.ts +2347 -0
- package/dist/builtin/web-access/package.json +54 -0
- package/dist/builtin/web-access/pdf-extract.ts +192 -0
- package/dist/builtin/web-access/perplexity.ts +196 -0
- package/dist/builtin/web-access/rsc-extract.ts +338 -0
- package/dist/builtin/web-access/storage.ts +72 -0
- package/dist/builtin/web-access/summary-review.ts +276 -0
- package/dist/builtin/web-access/utils.ts +44 -0
- package/dist/builtin/web-access/video-extract.ts +379 -0
- package/dist/builtin/web-access/youtube-extract.ts +311 -0
- package/dist/builtin/workflows/CHANGELOG.md +20 -0
- package/dist/builtin/workflows/README.md +323 -0
- package/dist/builtin/workflows/builtin/deep-research-codebase.ts +567 -0
- package/dist/builtin/workflows/builtin/index.ts +10 -0
- package/dist/builtin/workflows/builtin/open-claude-design.ts +985 -0
- package/dist/builtin/workflows/builtin/ralph.ts +613 -0
- package/dist/builtin/workflows/package.json +89 -0
- package/dist/builtin/workflows/skills/create-spec/SKILL.md +247 -0
- package/dist/builtin/workflows/skills/impeccable/SKILL.md +173 -0
- package/dist/builtin/workflows/skills/impeccable/reference/adapt.md +190 -0
- package/dist/builtin/workflows/skills/impeccable/reference/animate.md +175 -0
- package/dist/builtin/workflows/skills/impeccable/reference/audit.md +133 -0
- package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +113 -0
- package/dist/builtin/workflows/skills/impeccable/reference/brand.md +118 -0
- package/dist/builtin/workflows/skills/impeccable/reference/clarify.md +174 -0
- package/dist/builtin/workflows/skills/impeccable/reference/codex.md +105 -0
- package/dist/builtin/workflows/skills/impeccable/reference/cognitive-load.md +106 -0
- package/dist/builtin/workflows/skills/impeccable/reference/color-and-contrast.md +105 -0
- package/dist/builtin/workflows/skills/impeccable/reference/colorize.md +154 -0
- package/dist/builtin/workflows/skills/impeccable/reference/craft.md +123 -0
- package/dist/builtin/workflows/skills/impeccable/reference/critique.md +261 -0
- package/dist/builtin/workflows/skills/impeccable/reference/delight.md +302 -0
- package/dist/builtin/workflows/skills/impeccable/reference/distill.md +111 -0
- package/dist/builtin/workflows/skills/impeccable/reference/document.md +427 -0
- package/dist/builtin/workflows/skills/impeccable/reference/extract.md +69 -0
- package/dist/builtin/workflows/skills/impeccable/reference/harden.md +347 -0
- package/dist/builtin/workflows/skills/impeccable/reference/heuristics-scoring.md +234 -0
- package/dist/builtin/workflows/skills/impeccable/reference/interaction-design.md +195 -0
- package/dist/builtin/workflows/skills/impeccable/reference/layout.md +141 -0
- package/dist/builtin/workflows/skills/impeccable/reference/live.md +622 -0
- package/dist/builtin/workflows/skills/impeccable/reference/motion-design.md +109 -0
- package/dist/builtin/workflows/skills/impeccable/reference/onboard.md +234 -0
- package/dist/builtin/workflows/skills/impeccable/reference/optimize.md +258 -0
- package/dist/builtin/workflows/skills/impeccable/reference/overdrive.md +130 -0
- package/dist/builtin/workflows/skills/impeccable/reference/personas.md +179 -0
- package/dist/builtin/workflows/skills/impeccable/reference/polish.md +242 -0
- package/dist/builtin/workflows/skills/impeccable/reference/product.md +62 -0
- package/dist/builtin/workflows/skills/impeccable/reference/quieter.md +99 -0
- package/dist/builtin/workflows/skills/impeccable/reference/responsive-design.md +114 -0
- package/dist/builtin/workflows/skills/impeccable/reference/shape.md +165 -0
- package/dist/builtin/workflows/skills/impeccable/reference/spatial-design.md +100 -0
- package/dist/builtin/workflows/skills/impeccable/reference/teach.md +156 -0
- package/dist/builtin/workflows/skills/impeccable/reference/typeset.md +124 -0
- package/dist/builtin/workflows/skills/impeccable/reference/typography.md +159 -0
- package/dist/builtin/workflows/skills/impeccable/reference/ux-writing.md +107 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/command-metadata.json +94 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/critique-storage.mjs +226 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/design-parser.mjs +820 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/detect-csp.mjs +198 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/impeccable-paths.mjs +110 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/is-generated.mjs +69 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +646 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-browser-session.js +123 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +4865 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-complete.mjs +75 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-completion.mjs +18 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-inject.mjs +446 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-poll.mjs +200 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-resume.mjs +48 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +847 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-session-store.mjs +254 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-status.mjs +47 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +632 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/live.mjs +247 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/load-context.mjs +141 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/pin.mjs +214 -0
- package/dist/builtin/workflows/skills/playwright-cli/SKILL.md +392 -0
- package/dist/builtin/workflows/skills/playwright-cli/references/element-attributes.md +23 -0
- package/dist/builtin/workflows/skills/playwright-cli/references/playwright-tests.md +39 -0
- package/dist/builtin/workflows/skills/playwright-cli/references/request-mocking.md +87 -0
- package/dist/builtin/workflows/skills/playwright-cli/references/running-code.md +241 -0
- package/dist/builtin/workflows/skills/playwright-cli/references/session-management.md +225 -0
- package/dist/builtin/workflows/skills/playwright-cli/references/spec-driven-testing.md +305 -0
- package/dist/builtin/workflows/skills/playwright-cli/references/storage-state.md +275 -0
- package/dist/builtin/workflows/skills/playwright-cli/references/test-generation.md +134 -0
- package/dist/builtin/workflows/skills/playwright-cli/references/tracing.md +139 -0
- package/dist/builtin/workflows/skills/playwright-cli/references/video-recording.md +143 -0
- package/dist/builtin/workflows/skills/prompt-engineer/SKILL.md +263 -0
- package/dist/builtin/workflows/skills/prompt-engineer/references/advanced_patterns.md +271 -0
- package/dist/builtin/workflows/skills/prompt-engineer/references/core_prompting.md +137 -0
- package/dist/builtin/workflows/skills/prompt-engineer/references/quality_improvement.md +193 -0
- package/dist/builtin/workflows/skills/research-codebase/SKILL.md +226 -0
- package/dist/builtin/workflows/skills/tdd/SKILL.md +109 -0
- package/dist/builtin/workflows/skills/tdd/deep-modules.md +33 -0
- package/dist/builtin/workflows/skills/tdd/interface-design.md +31 -0
- package/dist/builtin/workflows/skills/tdd/mocking.md +59 -0
- package/dist/builtin/workflows/skills/tdd/refactoring.md +10 -0
- package/dist/builtin/workflows/skills/tdd/tests.md +61 -0
- package/dist/builtin/workflows/skills/workflow/SKILL.md +255 -0
- package/dist/builtin/workflows/skills/workflow/references/context-engineering/advanced-evaluation.md +404 -0
- package/dist/builtin/workflows/skills/workflow/references/context-engineering/bdi-mental-states.md +313 -0
- package/dist/builtin/workflows/skills/workflow/references/context-engineering/context-compression.md +274 -0
- package/dist/builtin/workflows/skills/workflow/references/context-engineering/context-degradation.md +208 -0
- package/dist/builtin/workflows/skills/workflow/references/context-engineering/context-fundamentals.md +203 -0
- package/dist/builtin/workflows/skills/workflow/references/context-engineering/context-optimization.md +197 -0
- package/dist/builtin/workflows/skills/workflow/references/context-engineering/evaluation.md +253 -0
- package/dist/builtin/workflows/skills/workflow/references/context-engineering/filesystem-context.md +289 -0
- package/dist/builtin/workflows/skills/workflow/references/context-engineering/hosted-agents.md +262 -0
- package/dist/builtin/workflows/skills/workflow/references/context-engineering/memory-systems.md +221 -0
- package/dist/builtin/workflows/skills/workflow/references/context-engineering/multi-agent-patterns.md +259 -0
- package/dist/builtin/workflows/skills/workflow/references/context-engineering/project-development.md +293 -0
- package/dist/builtin/workflows/skills/workflow/references/context-engineering/tool-design.md +273 -0
- package/dist/builtin/workflows/skills/workflow/references/context-engineering.md +23 -0
- package/dist/builtin/workflows/skills/workflow/references/design-checklist.md +79 -0
- package/dist/builtin/workflows/skills/workflow/references/running-workflows.md +107 -0
- package/dist/builtin/workflows/skills/workflow/references/sdk-authoring.md +140 -0
- package/dist/builtin/workflows/src/extension/background-ui-adapter.ts +168 -0
- package/dist/builtin/workflows/src/extension/companions.ts +210 -0
- package/dist/builtin/workflows/src/extension/config-loader.ts +493 -0
- package/dist/builtin/workflows/src/extension/discovery.ts +501 -0
- package/dist/builtin/workflows/src/extension/dispatcher.ts +173 -0
- package/dist/builtin/workflows/src/extension/index.ts +2143 -0
- package/dist/builtin/workflows/src/extension/mcp.ts +110 -0
- package/dist/builtin/workflows/src/extension/render-call.ts +39 -0
- package/dist/builtin/workflows/src/extension/render-result.ts +214 -0
- package/dist/builtin/workflows/src/extension/renderers.ts +87 -0
- package/dist/builtin/workflows/src/extension/runtime.ts +360 -0
- package/dist/builtin/workflows/src/extension/status-writer.ts +167 -0
- package/dist/builtin/workflows/src/extension/wiring.ts +555 -0
- package/dist/builtin/workflows/src/extension/workflow-schema.ts +102 -0
- package/dist/builtin/workflows/src/index.ts +25 -0
- package/dist/builtin/workflows/src/intercom/intercom-bridge.ts +93 -0
- package/dist/builtin/workflows/src/intercom/intercom-routing.ts +125 -0
- package/dist/builtin/workflows/src/intercom/result-intercom.ts +240 -0
- package/dist/builtin/workflows/src/runs/background/cancellation-registry.ts +113 -0
- package/dist/builtin/workflows/src/runs/background/job-tracker.ts +81 -0
- package/dist/builtin/workflows/src/runs/background/runner.ts +152 -0
- package/dist/builtin/workflows/src/runs/background/status.ts +354 -0
- package/dist/builtin/workflows/src/runs/foreground/executor.ts +1522 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +233 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner.ts +712 -0
- package/dist/builtin/workflows/src/runs/shared/concurrency.ts +76 -0
- package/dist/builtin/workflows/src/runs/shared/graph-inference.ts +69 -0
- package/dist/builtin/workflows/src/runs/shared/model-fallback.ts +293 -0
- package/dist/builtin/workflows/src/runs/shared/validate-inputs.ts +83 -0
- package/dist/builtin/workflows/src/runs/shared/workflow-runner.ts +170 -0
- package/dist/builtin/workflows/src/runs/shared/worktree.ts +577 -0
- package/dist/builtin/workflows/src/shared/persistence-compaction-policy.ts +72 -0
- package/dist/builtin/workflows/src/shared/persistence-restore.ts +257 -0
- package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +145 -0
- package/dist/builtin/workflows/src/shared/render-inputs-schema.ts +196 -0
- package/dist/builtin/workflows/src/shared/store-types.ts +160 -0
- package/dist/builtin/workflows/src/shared/store.ts +579 -0
- package/dist/builtin/workflows/src/shared/types.ts +566 -0
- package/dist/builtin/workflows/src/tui/chat-surface-message.ts +224 -0
- package/dist/builtin/workflows/src/tui/chat-surface.ts +511 -0
- package/dist/builtin/workflows/src/tui/color-utils.ts +64 -0
- package/dist/builtin/workflows/src/tui/connectors.ts +88 -0
- package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +307 -0
- package/dist/builtin/workflows/src/tui/edge.ts +24 -0
- package/dist/builtin/workflows/src/tui/graph-canvas.ts +108 -0
- package/dist/builtin/workflows/src/tui/graph-theme.ts +283 -0
- package/dist/builtin/workflows/src/tui/graph-view.ts +1217 -0
- package/dist/builtin/workflows/src/tui/header.ts +172 -0
- package/dist/builtin/workflows/src/tui/inline-form-card.ts +421 -0
- package/dist/builtin/workflows/src/tui/inline-form-editor.ts +638 -0
- package/dist/builtin/workflows/src/tui/inline-form-overlay.ts +326 -0
- package/dist/builtin/workflows/src/tui/inline-form-store.ts +78 -0
- package/dist/builtin/workflows/src/tui/inputs-overlay.ts +163 -0
- package/dist/builtin/workflows/src/tui/inputs-picker.ts +888 -0
- package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +154 -0
- package/dist/builtin/workflows/src/tui/layout.ts +153 -0
- package/dist/builtin/workflows/src/tui/node-card.ts +274 -0
- package/dist/builtin/workflows/src/tui/overlay-adapter.ts +277 -0
- package/dist/builtin/workflows/src/tui/prompt-card.ts +501 -0
- package/dist/builtin/workflows/src/tui/renderers.ts +15 -0
- package/dist/builtin/workflows/src/tui/run-detail.ts +339 -0
- package/dist/builtin/workflows/src/tui/session-confirm.ts +202 -0
- package/dist/builtin/workflows/src/tui/session-list.ts +32 -0
- package/dist/builtin/workflows/src/tui/session-overlays.ts +239 -0
- package/dist/builtin/workflows/src/tui/session-picker.ts +399 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view.ts +1873 -0
- package/dist/builtin/workflows/src/tui/status-helpers.ts +73 -0
- package/dist/builtin/workflows/src/tui/status-list.ts +361 -0
- package/dist/builtin/workflows/src/tui/store-widget-installer.ts +206 -0
- package/dist/builtin/workflows/src/tui/switcher.ts +121 -0
- package/dist/builtin/workflows/src/tui/text-helpers.ts +31 -0
- package/dist/builtin/workflows/src/tui/toast.ts +106 -0
- package/dist/builtin/workflows/src/tui/widget.ts +348 -0
- package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +285 -0
- package/dist/builtin/workflows/src/tui/workflow-list.ts +224 -0
- package/dist/builtin/workflows/src/workflows/define-workflow.ts +150 -0
- package/dist/builtin/workflows/src/workflows/identity.ts +39 -0
- package/dist/builtin/workflows/src/workflows/registry.ts +113 -0
- package/dist/bun/cli.d.ts +3 -0
- package/dist/bun/cli.d.ts.map +1 -0
- package/dist/bun/cli.js +9 -0
- package/dist/bun/cli.js.map +1 -0
- package/dist/bun/register-bedrock.d.ts +2 -0
- package/dist/bun/register-bedrock.d.ts.map +1 -0
- package/dist/bun/register-bedrock.js +4 -0
- package/dist/bun/register-bedrock.js.map +1 -0
- package/dist/bun/restore-sandbox-env.d.ts +13 -0
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
- package/dist/bun/restore-sandbox-env.js +32 -0
- package/dist/bun/restore-sandbox-env.js.map +1 -0
- package/dist/cli/args.d.ts +53 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +341 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/config-selector.d.ts +14 -0
- package/dist/cli/config-selector.d.ts.map +1 -0
- package/dist/cli/config-selector.js +31 -0
- package/dist/cli/config-selector.js.map +1 -0
- package/dist/cli/file-processor.d.ts +15 -0
- package/dist/cli/file-processor.d.ts.map +1 -0
- package/dist/cli/file-processor.js +83 -0
- package/dist/cli/file-processor.js.map +1 -0
- package/dist/cli/initial-message.d.ts +18 -0
- package/dist/cli/initial-message.d.ts.map +1 -0
- package/dist/cli/initial-message.js +22 -0
- package/dist/cli/initial-message.js.map +1 -0
- package/dist/cli/list-models.d.ts +9 -0
- package/dist/cli/list-models.d.ts.map +1 -0
- package/dist/cli/list-models.js +98 -0
- package/dist/cli/list-models.js.map +1 -0
- package/dist/cli/session-picker.d.ts +9 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +35 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +20 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +102 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +411 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session-runtime.d.ts +117 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -0
- package/dist/core/agent-session-runtime.js +292 -0
- package/dist/core/agent-session-runtime.js.map +1 -0
- package/dist/core/agent-session-services.d.ts +86 -0
- package/dist/core/agent-session-services.d.ts.map +1 -0
- package/dist/core/agent-session-services.js +117 -0
- package/dist/core/agent-session-services.js.map +1 -0
- package/dist/core/agent-session.d.ts +595 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +2518 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/auth-guidance.d.ts +5 -0
- package/dist/core/auth-guidance.d.ts.map +1 -0
- package/dist/core/auth-guidance.js +21 -0
- package/dist/core/auth-guidance.js.map +1 -0
- package/dist/core/auth-storage.d.ts +141 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +437 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/bash-executor.d.ts +32 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +111 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/builtin-packages.d.ts +14 -0
- package/dist/core/builtin-packages.d.ts.map +1 -0
- package/dist/core/builtin-packages.js +113 -0
- package/dist/core/builtin-packages.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +88 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +243 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +121 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +615 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/index.d.ts +7 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +7 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +38 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +153 -0
- package/dist/core/compaction/utils.js.map +1 -0
- package/dist/core/defaults.d.ts +3 -0
- package/dist/core/defaults.d.ts.map +1 -0
- package/dist/core/defaults.js +2 -0
- package/dist/core/defaults.js.map +1 -0
- package/dist/core/diagnostics.d.ts +15 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +2 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/event-bus.d.ts +9 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/exec.d.ts +29 -0
- package/dist/core/exec.d.ts.map +1 -0
- package/dist/core/exec.js +75 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/dist/core/export-html/ansi-to-html.js +249 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/dist/core/export-html/index.d.ts +37 -0
- package/dist/core/export-html/index.d.ts.map +1 -0
- package/dist/core/export-html/index.js +224 -0
- package/dist/core/export-html/index.js.map +1 -0
- package/dist/core/export-html/template.css +1066 -0
- package/dist/core/export-html/template.html +55 -0
- package/dist/core/export-html/template.js +1834 -0
- package/dist/core/export-html/tool-renderer.d.ts +34 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/dist/core/export-html/tool-renderer.js +108 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +6 -0
- package/dist/core/extensions/index.d.ts +12 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/index.js +9 -0
- package/dist/core/extensions/index.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +24 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +501 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +159 -0
- package/dist/core/extensions/runner.d.ts.map +1 -0
- package/dist/core/extensions/runner.js +817 -0
- package/dist/core/extensions/runner.js.map +1 -0
- package/dist/core/extensions/types.d.ts +1173 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +45 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/extensions/wrapper.d.ts +20 -0
- package/dist/core/extensions/wrapper.d.ts.map +1 -0
- package/dist/core/extensions/wrapper.js +22 -0
- package/dist/core/extensions/wrapper.js.map +1 -0
- package/dist/core/footer-data-provider.d.ts +52 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -0
- package/dist/core/footer-data-provider.js +309 -0
- package/dist/core/footer-data-provider.js.map +1 -0
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +12 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/keybindings.d.ts +353 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +294 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/messages.d.ts +77 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +123 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-registry.d.ts +150 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +726 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +110 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +493 -0
- package/dist/core/model-resolver.js.map +1 -0
- package/dist/core/output-guard.d.ts +6 -0
- package/dist/core/output-guard.d.ts.map +1 -0
- package/dist/core/output-guard.js +59 -0
- package/dist/core/output-guard.js.map +1 -0
- package/dist/core/package-manager.d.ts +198 -0
- package/dist/core/package-manager.d.ts.map +1 -0
- package/dist/core/package-manager.js +1970 -0
- package/dist/core/package-manager.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +52 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +250 -0
- package/dist/core/prompt-templates.js.map +1 -0
- package/dist/core/provider-display-names.d.ts +2 -0
- package/dist/core/provider-display-names.d.ts.map +1 -0
- package/dist/core/provider-display-names.js +33 -0
- package/dist/core/provider-display-names.js.map +1 -0
- package/dist/core/resolve-config-value.d.ts +23 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -0
- package/dist/core/resolve-config-value.js +126 -0
- package/dist/core/resolve-config-value.js.map +1 -0
- package/dist/core/resource-loader.d.ts +196 -0
- package/dist/core/resource-loader.d.ts.map +1 -0
- package/dist/core/resource-loader.js +698 -0
- package/dist/core/resource-loader.js.map +1 -0
- package/dist/core/sdk.d.ts +107 -0
- package/dist/core/sdk.d.ts.map +1 -0
- package/dist/core/sdk.js +291 -0
- package/dist/core/sdk.js.map +1 -0
- package/dist/core/session-cwd.d.ts +19 -0
- package/dist/core/session-cwd.d.ts.map +1 -0
- package/dist/core/session-cwd.js +37 -0
- package/dist/core/session-cwd.js.map +1 -0
- package/dist/core/session-manager.d.ts +333 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +1118 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-manager.d.ts +261 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +773 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +60 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +404 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +14 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +25 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/source-info.d.ts +18 -0
- package/dist/core/source-info.d.ts.map +1 -0
- package/dist/core/source-info.js +19 -0
- package/dist/core/source-info.js.map +1 -0
- package/dist/core/system-prompt.d.ts +28 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +120 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/telemetry.d.ts +3 -0
- package/dist/core/telemetry.d.ts.map +1 -0
- package/dist/core/telemetry.js +10 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/core/timings.d.ts +8 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +32 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tools/ask-user-question/ask-user-question.d.ts +10 -0
- package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/ask-user-question.js +82 -0
- package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -0
- package/dist/core/tools/ask-user-question/config.d.ts +11 -0
- package/dist/core/tools/ask-user-question/config.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/config.js +34 -0
- package/dist/core/tools/ask-user-question/config.js.map +1 -0
- package/dist/core/tools/ask-user-question/index.d.ts +19 -0
- package/dist/core/tools/ask-user-question/index.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/index.js +19 -0
- package/dist/core/tools/ask-user-question/index.js.map +1 -0
- package/dist/core/tools/ask-user-question/state/build-questionnaire.d.ts +36 -0
- package/dist/core/tools/ask-user-question/state/build-questionnaire.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/state/build-questionnaire.js +213 -0
- package/dist/core/tools/ask-user-question/state/build-questionnaire.js.map +1 -0
- package/dist/core/tools/ask-user-question/state/key-router.d.ts +53 -0
- package/dist/core/tools/ask-user-question/state/key-router.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/state/key-router.js +240 -0
- package/dist/core/tools/ask-user-question/state/key-router.js.map +1 -0
- package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts +61 -0
- package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/state/questionnaire-session.js +147 -0
- package/dist/core/tools/ask-user-question/state/questionnaire-session.js.map +1 -0
- package/dist/core/tools/ask-user-question/state/row-intent.d.ts +91 -0
- package/dist/core/tools/ask-user-question/state/row-intent.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/state/row-intent.js +91 -0
- package/dist/core/tools/ask-user-question/state/row-intent.js.map +1 -0
- package/dist/core/tools/ask-user-question/state/selectors/contract.d.ts +21 -0
- package/dist/core/tools/ask-user-question/state/selectors/contract.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/state/selectors/contract.js +2 -0
- package/dist/core/tools/ask-user-question/state/selectors/contract.js.map +1 -0
- package/dist/core/tools/ask-user-question/state/selectors/derivations.d.ts +44 -0
- package/dist/core/tools/ask-user-question/state/selectors/derivations.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/state/selectors/derivations.js +76 -0
- package/dist/core/tools/ask-user-question/state/selectors/derivations.js.map +1 -0
- package/dist/core/tools/ask-user-question/state/selectors/focus.d.ts +15 -0
- package/dist/core/tools/ask-user-question/state/selectors/focus.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/state/selectors/focus.js +18 -0
- package/dist/core/tools/ask-user-question/state/selectors/focus.js.map +1 -0
- package/dist/core/tools/ask-user-question/state/selectors/projections.d.ts +16 -0
- package/dist/core/tools/ask-user-question/state/selectors/projections.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/state/selectors/projections.js +71 -0
- package/dist/core/tools/ask-user-question/state/selectors/projections.js.map +1 -0
- package/dist/core/tools/ask-user-question/state/state-reducer.d.ts +44 -0
- package/dist/core/tools/ask-user-question/state/state-reducer.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/state/state-reducer.js +239 -0
- package/dist/core/tools/ask-user-question/state/state-reducer.js.map +1 -0
- package/dist/core/tools/ask-user-question/state/state.d.ts +42 -0
- package/dist/core/tools/ask-user-question/state/state.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/state/state.js +2 -0
- package/dist/core/tools/ask-user-question/state/state.js.map +1 -0
- package/dist/core/tools/ask-user-question/tool/format-answer.d.ts +30 -0
- package/dist/core/tools/ask-user-question/tool/format-answer.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/tool/format-answer.js +39 -0
- package/dist/core/tools/ask-user-question/tool/format-answer.js.map +1 -0
- package/dist/core/tools/ask-user-question/tool/response-envelope.d.ts +29 -0
- package/dist/core/tools/ask-user-question/tool/response-envelope.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/tool/response-envelope.js +46 -0
- package/dist/core/tools/ask-user-question/tool/response-envelope.js.map +1 -0
- package/dist/core/tools/ask-user-question/tool/types.d.ts +113 -0
- package/dist/core/tools/ask-user-question/tool/types.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/tool/types.js +81 -0
- package/dist/core/tools/ask-user-question/tool/types.js.map +1 -0
- package/dist/core/tools/ask-user-question/tool/validate-questionnaire.d.ts +21 -0
- package/dist/core/tools/ask-user-question/tool/validate-questionnaire.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/tool/validate-questionnaire.js +49 -0
- package/dist/core/tools/ask-user-question/tool/validate-questionnaire.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/body-residual-spacer.d.ts +18 -0
- package/dist/core/tools/ask-user-question/view/body-residual-spacer.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/body-residual-spacer.js +21 -0
- package/dist/core/tools/ask-user-question/view/body-residual-spacer.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/component-binding.d.ts +23 -0
- package/dist/core/tools/ask-user-question/view/component-binding.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/component-binding.js +16 -0
- package/dist/core/tools/ask-user-question/view/component-binding.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/chat-row-view.d.ts +40 -0
- package/dist/core/tools/ask-user-question/view/components/chat-row-view.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/chat-row-view.js +31 -0
- package/dist/core/tools/ask-user-question/view/components/chat-row-view.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/multi-select-view.d.ts +35 -0
- package/dist/core/tools/ask-user-question/view/components/multi-select-view.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/multi-select-view.js +91 -0
- package/dist/core/tools/ask-user-question/view/components/multi-select-view.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/option-list-view.d.ts +43 -0
- package/dist/core/tools/ask-user-question/view/components/option-list-view.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/option-list-view.js +37 -0
- package/dist/core/tools/ask-user-question/view/components/option-list-view.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.d.ts +36 -0
- package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.js +66 -0
- package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.d.ts +46 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js +69 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-box-renderer.d.ts +39 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-box-renderer.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-box-renderer.js +76 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-box-renderer.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-layout-decider.d.ts +116 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-layout-decider.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-layout-decider.js +173 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-layout-decider.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-pane.d.ts +66 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-pane.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-pane.js +124 -0
- package/dist/core/tools/ask-user-question/view/components/preview/preview-pane.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/submit-picker.d.ts +37 -0
- package/dist/core/tools/ask-user-question/view/components/submit-picker.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/submit-picker.js +44 -0
- package/dist/core/tools/ask-user-question/view/components/submit-picker.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/tab-bar.d.ts +32 -0
- package/dist/core/tools/ask-user-question/view/components/tab-bar.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/tab-bar.js +33 -0
- package/dist/core/tools/ask-user-question/view/components/tab-bar.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts +122 -0
- package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/components/wrapping-select.js +161 -0
- package/dist/core/tools/ask-user-question/view/components/wrapping-select.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/dialog-builder.d.ts +66 -0
- package/dist/core/tools/ask-user-question/view/dialog-builder.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/dialog-builder.js +85 -0
- package/dist/core/tools/ask-user-question/view/dialog-builder.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/props-adapter.d.ts +58 -0
- package/dist/core/tools/ask-user-question/view/props-adapter.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/props-adapter.js +67 -0
- package/dist/core/tools/ask-user-question/view/props-adapter.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/stateful-view.d.ts +24 -0
- package/dist/core/tools/ask-user-question/view/stateful-view.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/stateful-view.js +2 -0
- package/dist/core/tools/ask-user-question/view/stateful-view.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/tab-components.d.ts +15 -0
- package/dist/core/tools/ask-user-question/view/tab-components.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/tab-components.js +2 -0
- package/dist/core/tools/ask-user-question/view/tab-components.js.map +1 -0
- package/dist/core/tools/ask-user-question/view/tab-content-strategy.d.ts +71 -0
- package/dist/core/tools/ask-user-question/view/tab-content-strategy.d.ts.map +1 -0
- package/dist/core/tools/ask-user-question/view/tab-content-strategy.js +129 -0
- package/dist/core/tools/ask-user-question/view/tab-content-strategy.js.map +1 -0
- package/dist/core/tools/bash.d.ts +68 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +338 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +85 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +338 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +49 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +324 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/core/tools/file-mutation-queue.js +37 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -0
- package/dist/core/tools/find.d.ts +35 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +298 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +37 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +304 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/index.d.ts +42 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +139 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/ls.d.ts +37 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +169 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/output-accumulator.d.ts +50 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -0
- package/dist/core/tools/output-accumulator.js +172 -0
- package/dist/core/tools/output-accumulator.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +8 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +81 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/read.d.ts +35 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +289 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/render-utils.d.ts +21 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -0
- package/dist/core/tools/render-utils.js +49 -0
- package/dist/core/tools/render-utils.js.map +1 -0
- package/dist/core/tools/todos.d.ts +35 -0
- package/dist/core/tools/todos.d.ts.map +1 -0
- package/dist/core/tools/todos.js +906 -0
- package/dist/core/tools/todos.js.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.js +34 -0
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +70 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +205 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/write.d.ts +26 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +212 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +13 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +586 -0
- package/dist/main.js.map +1 -0
- package/dist/migrations.d.ts +33 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +281 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/index.d.ts +9 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +8 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/interactive/assets/clankolas.png +3 -0
- package/dist/modes/interactive/components/armin.d.ts +34 -0
- package/dist/modes/interactive/components/armin.d.ts.map +1 -0
- package/dist/modes/interactive/components/armin.js +329 -0
- package/dist/modes/interactive/components/armin.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +20 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +116 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +170 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.js +51 -0
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +42 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +43 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +71 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector.js +496 -0
- package/dist/modes/interactive/components/config-selector.js.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.js +28 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +29 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +113 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +20 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-message.js +74 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -0
- package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
- package/dist/modes/interactive/components/daxnuts.js +138 -0
- package/dist/modes/interactive/components/daxnuts.js.map +1 -0
- package/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -0
- package/dist/modes/interactive/components/diff.js +151 -0
- package/dist/modes/interactive/components/diff.js.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.js +20 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
- package/dist/modes/interactive/components/earendil-announcement.js +40 -0
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-editor.js +106 -0
- package/dist/modes/interactive/components/extension-editor.js.map +1 -0
- package/dist/modes/interactive/components/extension-input.d.ts +23 -0
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-input.js +55 -0
- package/dist/modes/interactive/components/extension-input.js.map +1 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-selector.js +75 -0
- package/dist/modes/interactive/components/extension-selector.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +27 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +199 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/index.d.ts +32 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -0
- package/dist/modes/interactive/components/index.js +33 -0
- package/dist/modes/interactive/components/index.js.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.js +36 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +46 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
- package/dist/modes/interactive/components/login-dialog.js +158 -0
- package/dist/modes/interactive/components/login-dialog.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +47 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector.js +266 -0
- package/dist/modes/interactive/components/model-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +31 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.js +156 -0
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +286 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.js +155 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +96 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +836 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +67 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +371 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.js +38 -0
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +45 -0
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/theme-selector.js +48 -0
- package/dist/modes/interactive/components/theme-selector.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.js +50 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +63 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +280 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +89 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +1079 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.js +111 -0
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +10 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +28 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.js +33 -0
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +369 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +4709 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -0
- package/dist/modes/interactive/theme/catppuccin-frappe.json +90 -0
- package/dist/modes/interactive/theme/catppuccin-latte.json +90 -0
- package/dist/modes/interactive/theme/catppuccin-macchiato.json +90 -0
- package/dist/modes/interactive/theme/catppuccin-mocha.json +90 -0
- package/dist/modes/interactive/theme/dark.json +85 -0
- package/dist/modes/interactive/theme/light.json +84 -0
- package/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/dist/modes/interactive/theme/theme.d.ts +81 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme.js +970 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -0
- package/dist/modes/interactive/whimsical-messages.d.ts +5 -0
- package/dist/modes/interactive/whimsical-messages.d.ts.map +1 -0
- package/dist/modes/interactive/whimsical-messages.js +464 -0
- package/dist/modes/interactive/whimsical-messages.js.map +1 -0
- package/dist/modes/print-mode.d.ts +28 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +131 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc/jsonl.d.ts +17 -0
- package/dist/modes/rpc/jsonl.d.ts.map +1 -0
- package/dist/modes/rpc/jsonl.js +49 -0
- package/dist/modes/rpc/jsonl.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +224 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +409 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +20 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-mode.js +601 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +419 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-types.js +8 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -0
- package/dist/package-manager-cli.d.ts +4 -0
- package/dist/package-manager-cli.d.ts.map +1 -0
- package/dist/package-manager-cli.js +460 -0
- package/dist/package-manager-cli.js.map +1 -0
- package/dist/utils/ansi.d.ts +2 -0
- package/dist/utils/ansi.d.ts.map +1 -0
- package/dist/utils/ansi.js +52 -0
- package/dist/utils/ansi.js.map +1 -0
- package/dist/utils/changelog.d.ts +21 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +87 -0
- package/dist/utils/changelog.js.map +1 -0
- package/dist/utils/child-process.d.ts +12 -0
- package/dist/utils/child-process.d.ts.map +1 -0
- package/dist/utils/child-process.js +86 -0
- package/dist/utils/child-process.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts +11 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -0
- package/dist/utils/clipboard-image.js +245 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard-native.d.ts +8 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -0
- package/dist/utils/clipboard-native.js +14 -0
- package/dist/utils/clipboard-native.js.map +1 -0
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +117 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/exif-orientation.d.ts +5 -0
- package/dist/utils/exif-orientation.d.ts.map +1 -0
- package/dist/utils/exif-orientation.js +158 -0
- package/dist/utils/exif-orientation.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +8 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +26 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/fs-watch.d.ts +5 -0
- package/dist/utils/fs-watch.d.ts.map +1 -0
- package/dist/utils/fs-watch.js +25 -0
- package/dist/utils/fs-watch.js.map +1 -0
- package/dist/utils/git.d.ts +26 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +163 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/html.d.ts +7 -0
- package/dist/utils/html.d.ts.map +1 -0
- package/dist/utils/html.js +40 -0
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/image-convert.d.ts +9 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +39 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-resize.d.ts +36 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +137 -0
- package/dist/utils/image-resize.js.map +1 -0
- package/dist/utils/mime.d.ts +3 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/mime.js +69 -0
- package/dist/utils/mime.js.map +1 -0
- package/dist/utils/paths.d.ts +16 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +50 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/photon.d.ts +21 -0
- package/dist/utils/photon.d.ts.map +1 -0
- package/dist/utils/photon.js +121 -0
- package/dist/utils/photon.js.map +1 -0
- package/dist/utils/pi-user-agent.d.ts +2 -0
- package/dist/utils/pi-user-agent.d.ts.map +1 -0
- package/dist/utils/pi-user-agent.js +5 -0
- package/dist/utils/pi-user-agent.js.map +1 -0
- package/dist/utils/shell.d.ts +30 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +190 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/sleep.d.ts +5 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +17 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/syntax-highlight.d.ts +12 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -0
- package/dist/utils/syntax-highlight.js +118 -0
- package/dist/utils/syntax-highlight.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +3 -0
- package/dist/utils/tools-manager.d.ts.map +1 -0
- package/dist/utils/tools-manager.js +325 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/dist/utils/version-check.d.ts +14 -0
- package/dist/utils/version-check.d.ts.map +1 -0
- package/dist/utils/version-check.js +76 -0
- package/dist/utils/version-check.js.map +1 -0
- package/docs/compaction.md +394 -0
- package/docs/custom-provider.md +646 -0
- package/docs/development.md +71 -0
- package/docs/docs.json +148 -0
- package/docs/extensions.md +2596 -0
- package/docs/images/doom-extension.png +0 -0
- package/docs/images/exy.png +3 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/index.md +70 -0
- package/docs/json.md +82 -0
- package/docs/keybindings.md +197 -0
- package/docs/models.md +474 -0
- package/docs/packages.md +223 -0
- package/docs/prompt-templates.md +88 -0
- package/docs/providers.md +243 -0
- package/docs/quickstart.md +142 -0
- package/docs/rpc.md +1407 -0
- package/docs/sdk.md +1129 -0
- package/docs/session-format.md +412 -0
- package/docs/sessions.md +137 -0
- package/docs/settings.md +279 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +232 -0
- package/docs/terminal-setup.md +106 -0
- package/docs/termux.md +127 -0
- package/docs/themes.md +299 -0
- package/docs/tmux.md +61 -0
- package/docs/tui.md +918 -0
- package/docs/usage.md +277 -0
- package/docs/windows.md +17 -0
- package/examples/README.md +25 -0
- package/examples/extensions/README.md +208 -0
- package/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/examples/extensions/bash-spawn-hook.ts +30 -0
- package/examples/extensions/bookmark.ts +50 -0
- package/examples/extensions/border-status-editor.ts +150 -0
- package/examples/extensions/built-in-tool-renderer.ts +249 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/commands.ts +72 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +127 -0
- package/examples/extensions/custom-footer.ts +64 -0
- package/examples/extensions/custom-header.ts +73 -0
- package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/examples/extensions/custom-provider-anthropic/package.json +19 -0
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
- package/examples/extensions/dirty-repo-guard.ts +56 -0
- package/examples/extensions/doom-overlay/README.md +46 -0
- package/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/examples/extensions/doom-overlay/doom-component.ts +132 -0
- package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
- package/examples/extensions/doom-overlay/index.ts +74 -0
- package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/examples/extensions/dynamic-resources/SKILL.md +8 -0
- package/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/examples/extensions/dynamic-resources/index.ts +15 -0
- package/examples/extensions/dynamic-tools.ts +74 -0
- package/examples/extensions/event-bus.ts +43 -0
- package/examples/extensions/file-trigger.ts +41 -0
- package/examples/extensions/git-checkpoint.ts +53 -0
- package/examples/extensions/github-issue-autocomplete.ts +185 -0
- package/examples/extensions/handoff.ts +191 -0
- package/examples/extensions/hello.ts +26 -0
- package/examples/extensions/hidden-thinking-label.ts +53 -0
- package/examples/extensions/inline-bash.ts +94 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/interactive-shell.ts +196 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/message-renderer.ts +59 -0
- package/examples/extensions/minimal-mode.ts +426 -0
- package/examples/extensions/modal-editor.ts +85 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +55 -0
- package/examples/extensions/overlay-qa-tests.ts +1348 -0
- package/examples/extensions/overlay-test.ts +150 -0
- package/examples/extensions/permission-gate.ts +34 -0
- package/examples/extensions/pirate.ts +47 -0
- package/examples/extensions/plan-mode/README.md +65 -0
- package/examples/extensions/plan-mode/index.ts +340 -0
- package/examples/extensions/plan-mode/utils.ts +168 -0
- package/examples/extensions/preset.ts +430 -0
- package/examples/extensions/prompt-customizer.ts +97 -0
- package/examples/extensions/protected-paths.ts +30 -0
- package/examples/extensions/provider-payload.ts +18 -0
- package/examples/extensions/qna.ts +122 -0
- package/examples/extensions/question.ts +264 -0
- package/examples/extensions/questionnaire.ts +427 -0
- package/examples/extensions/rainbow-editor.ts +88 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/rpc-demo.ts +118 -0
- package/examples/extensions/sandbox/index.ts +321 -0
- package/examples/extensions/sandbox/package-lock.json +92 -0
- package/examples/extensions/sandbox/package.json +19 -0
- package/examples/extensions/send-user-message.ts +97 -0
- package/examples/extensions/session-name.ts +27 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +343 -0
- package/examples/extensions/space-invaders.ts +560 -0
- package/examples/extensions/ssh.ts +220 -0
- package/examples/extensions/status-line.ts +32 -0
- package/examples/extensions/structured-output.ts +65 -0
- package/examples/extensions/subagent/README.md +172 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +126 -0
- package/examples/extensions/subagent/index.ts +987 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/summarize.ts +206 -0
- package/examples/extensions/system-prompt-header.ts +17 -0
- package/examples/extensions/tic-tac-toe.ts +1008 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/titlebar-spinner.ts +58 -0
- package/examples/extensions/todo.ts +297 -0
- package/examples/extensions/tool-override.ts +144 -0
- package/examples/extensions/tools.ts +141 -0
- package/examples/extensions/trigger-compact.ts +50 -0
- package/examples/extensions/truncated-tool.ts +195 -0
- package/examples/extensions/widget-placement.ts +9 -0
- package/examples/extensions/with-deps/index.ts +32 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/extensions/working-indicator.ts +123 -0
- package/examples/extensions/working-message-test.ts +25 -0
- package/examples/rpc-extension-ui.ts +632 -0
- package/examples/sdk/01-minimal.ts +26 -0
- package/examples/sdk/02-custom-model.ts +53 -0
- package/examples/sdk/03-custom-prompt.ts +75 -0
- package/examples/sdk/04-skills.ts +55 -0
- package/examples/sdk/05-tools.ts +48 -0
- package/examples/sdk/06-extensions.ts +99 -0
- package/examples/sdk/07-context-files.ts +47 -0
- package/examples/sdk/08-prompt-templates.ts +51 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +52 -0
- package/examples/sdk/10-settings.ts +53 -0
- package/examples/sdk/11-sessions.ts +52 -0
- package/examples/sdk/12-full-control.ts +77 -0
- package/examples/sdk/13-session-runtime.ts +67 -0
- package/examples/sdk/README.md +144 -0
- package/package.json +94 -19
- package/bin/atomic +0 -82
- /package/{LICENSE → dist/builtin/workflows/LICENSE} +0 -0
|
@@ -0,0 +1,1217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphView — orchestrator overlay rendered as a pi-tui Component.
|
|
3
|
+
*
|
|
4
|
+
* Visual contract (DESIGN.md):
|
|
5
|
+
* - No manual ASCII frame. `pi.ui.custom({ overlay: true })` provides the
|
|
6
|
+
* popup chrome; this renderer paints content on the canvas (`bg`) with
|
|
7
|
+
* full-width chrome rows for the header (top) and hints (bottom).
|
|
8
|
+
* - Section labels use the `▎ LABEL` pattern: mauve glyph + `textMuted`
|
|
9
|
+
* bold caps.
|
|
10
|
+
* - Hints follow `<key> <label>` separated by ` · ` in `dim`, active key
|
|
11
|
+
* letters in `text`, labels in `textMuted`.
|
|
12
|
+
* - No decorative progress bar. Counts live in the header pills.
|
|
13
|
+
*
|
|
14
|
+
* cross-ref:
|
|
15
|
+
* - github.com/flora131/atomic packages/atomic-sdk/src/components/session-graph-panel.tsx
|
|
16
|
+
* - DESIGN.md §4 (Elevation), §5 (Components)
|
|
17
|
+
*/
|
|
18
|
+
import type { Component } from "@earendil-works/pi-tui";
|
|
19
|
+
import {
|
|
20
|
+
matchesKey,
|
|
21
|
+
truncateToWidth,
|
|
22
|
+
visibleWidth,
|
|
23
|
+
} from "./text-helpers.js";
|
|
24
|
+
import type { Store } from "../shared/store.js";
|
|
25
|
+
import type {
|
|
26
|
+
PendingPrompt,
|
|
27
|
+
StageSnapshot,
|
|
28
|
+
StoreSnapshot,
|
|
29
|
+
RunSnapshot,
|
|
30
|
+
} from "../shared/store-types.js";
|
|
31
|
+
import type { GraphTheme } from "./graph-theme.js";
|
|
32
|
+
import type { SwitcherState } from "./switcher.js";
|
|
33
|
+
import type { LayoutNode } from "./layout.js";
|
|
34
|
+
import { computeLayout, NODE_W, NODE_H } from "./layout.js";
|
|
35
|
+
import { renderHeader, renderOutlinePill } from "./header.js";
|
|
36
|
+
import { renderNodeCard } from "./node-card.js";
|
|
37
|
+
import { renderSwitcher, filterStages } from "./switcher.js";
|
|
38
|
+
import { renderToasts, createToastManager } from "./toast.js";
|
|
39
|
+
import { hexToAnsi, hexBg, RESET, BOLD } from "./color-utils.js";
|
|
40
|
+
import { fmtDuration, statusIcon, statusColor } from "./status-helpers.js";
|
|
41
|
+
import { GraphCanvas } from "./graph-canvas.js";
|
|
42
|
+
import {
|
|
43
|
+
createPromptCardState,
|
|
44
|
+
defaultResponseFor,
|
|
45
|
+
handlePromptCardInput,
|
|
46
|
+
renderPromptCard,
|
|
47
|
+
type PromptCardState,
|
|
48
|
+
} from "./prompt-card.js";
|
|
49
|
+
|
|
50
|
+
export type GraphViewMode = "overlay" | "widget";
|
|
51
|
+
|
|
52
|
+
export interface GraphViewOpts {
|
|
53
|
+
mode: GraphViewMode;
|
|
54
|
+
runId: string | null;
|
|
55
|
+
store: Store;
|
|
56
|
+
graphTheme: GraphTheme;
|
|
57
|
+
onClose?: () => void;
|
|
58
|
+
/**
|
|
59
|
+
* Invoked when the user presses `q` inside the pane on an in-flight
|
|
60
|
+
* run. Fires immediately (no confirm) per the toggle-driven UX:
|
|
61
|
+
* `h` hides without quitting; `q` is reserved for terminating the
|
|
62
|
+
* current run.
|
|
63
|
+
*/
|
|
64
|
+
onKill?: (runId: string) => void;
|
|
65
|
+
/**
|
|
66
|
+
* Invoked when the user presses `h` inside the pane. Hides without
|
|
67
|
+
* unmounting (overlay-adapter calls `setHidden(true)`). Re-open via
|
|
68
|
+
* `F2` or `/workflow connect <id>`.
|
|
69
|
+
*/
|
|
70
|
+
onHide?: () => void;
|
|
71
|
+
/**
|
|
72
|
+
* Invoked when the user submits (or skips) a HIL prompt rendered inside
|
|
73
|
+
* the pane. The callback typically calls `store.resolvePendingPrompt`;
|
|
74
|
+
* GraphView itself stays UI-only.
|
|
75
|
+
*/
|
|
76
|
+
onPromptResolve?: (runId: string, promptId: string, response: unknown) => void;
|
|
77
|
+
/**
|
|
78
|
+
* Invoked when the user presses Enter on a focused graph node — the
|
|
79
|
+
* parent attach shell swaps the popup interior to that stage's chat
|
|
80
|
+
* pane. When unset, Enter is a no-op (preserves graph mode).
|
|
81
|
+
*/
|
|
82
|
+
onStageAttach?: (runId: string, stageId: string) => void;
|
|
83
|
+
/**
|
|
84
|
+
* Invoked when the user presses `Ctrl+D` while in graph mode. Mirrors
|
|
85
|
+
* the in-chat back affordance: detaches the whole popup (host calls
|
|
86
|
+
* `setHidden(true)`). Falls back to `onHide` when unset.
|
|
87
|
+
*/
|
|
88
|
+
onDetach?: () => void;
|
|
89
|
+
/**
|
|
90
|
+
* When provided, GraphView restores focus to this stage on construction
|
|
91
|
+
* — used by the attach shell so returning from the chat lands the
|
|
92
|
+
* cursor on the same node the user just attached to.
|
|
93
|
+
*/
|
|
94
|
+
initialFocusedStageId?: string;
|
|
95
|
+
/**
|
|
96
|
+
* Optional accessor returning the current terminal row count. When
|
|
97
|
+
* present in overlay mode the renderer expands the frame to roughly
|
|
98
|
+
* `viewportRows` lines (clamped to at least the header + statusline
|
|
99
|
+
* budget) so the popup fills the terminal under pi-tui's
|
|
100
|
+
* `width: "100%" / maxHeight: "100%"` geometry. Returning `undefined`
|
|
101
|
+
* falls back to the constant `OVERLAY_LINE_COUNT` rectangle.
|
|
102
|
+
*/
|
|
103
|
+
getViewportRows?: () => number | undefined;
|
|
104
|
+
/**
|
|
105
|
+
* Invoked on each animation tick (~10 FPS) so the host can call
|
|
106
|
+
* `tui.requestRender()`. Only wired in `overlay` mode; supplying it
|
|
107
|
+
* starts the tick loop in the constructor so duration counters and
|
|
108
|
+
* the running-stage border pulse refresh without requiring a key
|
|
109
|
+
* press. The host is responsible for gating the underlying
|
|
110
|
+
* `requestRender` on overlay visibility / focus (see
|
|
111
|
+
* `overlay-adapter.ts`).
|
|
112
|
+
*/
|
|
113
|
+
requestRender?: () => void;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const HINT_KEYS: Array<{ key: string; label: string }> = [
|
|
117
|
+
{ key: "↑↓←→", label: "navigate" },
|
|
118
|
+
{ key: "↵", label: "attach" },
|
|
119
|
+
{ key: "/", label: "stages" },
|
|
120
|
+
{ key: "ctrl+d", label: "detach" },
|
|
121
|
+
{ key: "q", label: "quit" },
|
|
122
|
+
];
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Bottom mode pill. The status bar mirrors the top header band: a
|
|
126
|
+
* three-row chrome strip with an outlined pill flush-left and hints
|
|
127
|
+
* flowing right of it on the centre row.
|
|
128
|
+
*/
|
|
129
|
+
const MODE_PILL_LABEL = "GRAPH";
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Fixed line count emitted by `_renderOverlay`. pi-tui paints the
|
|
133
|
+
* overlay in the same buffer as the chat, so a *variable* line count
|
|
134
|
+
* causes the chat to scroll every time the focused-stage section grows
|
|
135
|
+
* or shrinks — that's exactly the duplicate-rows bug we hit when
|
|
136
|
+
* navigating with j/k. Padding to a constant height keeps the overlay
|
|
137
|
+
* a stable rectangle that pi-tui can diff cell-by-cell.
|
|
138
|
+
*
|
|
139
|
+
* Mirrors the doom-overlay reference extension, which always emits the
|
|
140
|
+
* same number of lines per frame regardless of game state.
|
|
141
|
+
*/
|
|
142
|
+
const OVERLAY_LINE_COUNT = 32;
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Animation tick period. Overlay re-renders fire on this cadence so
|
|
146
|
+
* duration counters (rendered from `Date.now() - stage.startedAt`)
|
|
147
|
+
* tick and the running-stage border lerps between `borderDim` and
|
|
148
|
+
* `warning` without a key press. The host-supplied `requestRender`
|
|
149
|
+
* gate prevents work while the overlay is hidden or unfocused.
|
|
150
|
+
*/
|
|
151
|
+
const ANIMATION_TICK_MS = 100;
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Full lerp period of `pulseT` for running-stage borders, in ms.
|
|
155
|
+
* `pulsePhase ∈ [0, 1)` cycles every `PULSE_PERIOD_MS` so the sine
|
|
156
|
+
* eased lerp inside `pickBorder` traces one full breath per cycle.
|
|
157
|
+
*/
|
|
158
|
+
const PULSE_PERIOD_MS = 2000;
|
|
159
|
+
|
|
160
|
+
export class GraphView implements Component {
|
|
161
|
+
private mode: GraphViewMode;
|
|
162
|
+
private runId: string | null;
|
|
163
|
+
private store: Store;
|
|
164
|
+
private graphTheme: GraphTheme;
|
|
165
|
+
private onClose?: () => void;
|
|
166
|
+
private onKill?: (runId: string) => void;
|
|
167
|
+
private onHide?: () => void;
|
|
168
|
+
private onPromptResolve?: (runId: string, promptId: string, response: unknown) => void;
|
|
169
|
+
private onStageAttach?: (runId: string, stageId: string) => void;
|
|
170
|
+
private onDetach?: () => void;
|
|
171
|
+
private initialFocusedStageId?: string;
|
|
172
|
+
private getViewportRows?: () => number | undefined;
|
|
173
|
+
private requestRender?: () => void;
|
|
174
|
+
|
|
175
|
+
/** Active HIL prompt state, set when `_rebuildLayout` sees a new prompt id. */
|
|
176
|
+
private promptState: PromptCardState | null = null;
|
|
177
|
+
|
|
178
|
+
private focusedIndex = 0;
|
|
179
|
+
private switcherOpen = false;
|
|
180
|
+
private switcherState: SwitcherState = { query: "", selectedIndex: 0 };
|
|
181
|
+
private toastManager = createToastManager();
|
|
182
|
+
private detailsExpanded = true;
|
|
183
|
+
private cachedLayout: LayoutNode[] = [];
|
|
184
|
+
private currentSnapshot: StoreSnapshot | null = null;
|
|
185
|
+
|
|
186
|
+
private _intervalId: ReturnType<typeof setInterval> | null = null;
|
|
187
|
+
private _lastGTime: number | null = null;
|
|
188
|
+
private _unsubscribe: (() => void) | null = null;
|
|
189
|
+
|
|
190
|
+
constructor(opts: GraphViewOpts) {
|
|
191
|
+
this.mode = opts.mode;
|
|
192
|
+
this.runId = opts.runId;
|
|
193
|
+
this.store = opts.store;
|
|
194
|
+
this.graphTheme = opts.graphTheme;
|
|
195
|
+
this.onClose = opts.onClose;
|
|
196
|
+
this.onKill = opts.onKill;
|
|
197
|
+
this.onHide = opts.onHide;
|
|
198
|
+
this.onPromptResolve = opts.onPromptResolve;
|
|
199
|
+
this.onStageAttach = opts.onStageAttach;
|
|
200
|
+
this.onDetach = opts.onDetach;
|
|
201
|
+
this.initialFocusedStageId = opts.initialFocusedStageId;
|
|
202
|
+
this.getViewportRows = opts.getViewportRows;
|
|
203
|
+
this.requestRender = opts.requestRender;
|
|
204
|
+
|
|
205
|
+
this._unsubscribe = this.store.subscribe((snap) => {
|
|
206
|
+
this.currentSnapshot = snap;
|
|
207
|
+
this._rebuildLayout();
|
|
208
|
+
});
|
|
209
|
+
this.currentSnapshot = this.store.snapshot();
|
|
210
|
+
this._rebuildLayout();
|
|
211
|
+
|
|
212
|
+
// Animation tick: while the overlay is mounted, fire a render
|
|
213
|
+
// request every `ANIMATION_TICK_MS` so the duration counter on
|
|
214
|
+
// each running stage advances and the border-pulse lerp animates
|
|
215
|
+
// even when the user isn't pressing keys. Only overlay mode owns
|
|
216
|
+
// visible animations; widget mode renders a single status line
|
|
217
|
+
// that never needs a steady cadence. The host's `requestRender`
|
|
218
|
+
// is responsible for gating on overlay visibility / focus — see
|
|
219
|
+
// `overlay-adapter.ts` and `workflow-attach-pane.ts`. With that
|
|
220
|
+
// gate in place the previous tmux scrollback "ghost overlay"
|
|
221
|
+
// failure mode does not apply: pi-tui owns the screen buffer
|
|
222
|
+
// and diff-blits frames in place.
|
|
223
|
+
if (this.mode === "overlay" && this.requestRender) {
|
|
224
|
+
this._intervalId = setInterval(() => {
|
|
225
|
+
this.requestRender?.();
|
|
226
|
+
}, ANIMATION_TICK_MS);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
private _rebuildLayout(): void {
|
|
231
|
+
const run = this._getCurrentRun();
|
|
232
|
+
if (!run) {
|
|
233
|
+
this.cachedLayout = [];
|
|
234
|
+
this.promptState = null;
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
this.cachedLayout = computeLayout(run.stages, { orientation: "vertical" });
|
|
238
|
+
// One-shot: if the host passed `initialFocusedStageId`, snap the
|
|
239
|
+
// cursor to that stage now that the layout exists. The attach shell
|
|
240
|
+
// uses this when swapping back from chat mode so the focus lands on
|
|
241
|
+
// the same node the user just attached to.
|
|
242
|
+
if (this.initialFocusedStageId !== undefined) {
|
|
243
|
+
const idx = this.cachedLayout.findIndex(
|
|
244
|
+
(n) => n.stage.id === this.initialFocusedStageId,
|
|
245
|
+
);
|
|
246
|
+
if (idx >= 0) this.focusedIndex = idx;
|
|
247
|
+
this.initialFocusedStageId = undefined;
|
|
248
|
+
}
|
|
249
|
+
this._syncPromptState(run.pendingPrompt);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Mirror the run's `pendingPrompt` into a UI working state. A new prompt
|
|
254
|
+
* id resets the state (caret + buffer); a cleared prompt drops the state
|
|
255
|
+
* so the card disappears.
|
|
256
|
+
*/
|
|
257
|
+
private _syncPromptState(prompt: PendingPrompt | undefined): void {
|
|
258
|
+
if (!prompt) {
|
|
259
|
+
this.promptState = null;
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
if (!this.promptState || this.promptState.prompt.id !== prompt.id) {
|
|
263
|
+
this.promptState = createPromptCardState(prompt);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
private _getCurrentRun(): RunSnapshot | null {
|
|
268
|
+
if (!this.currentSnapshot) return null;
|
|
269
|
+
// Pin to the first run we see so a completed run stays visible after
|
|
270
|
+
// `activeRunId()` clears. Caller can still pass an explicit runId.
|
|
271
|
+
if (this.runId == null) {
|
|
272
|
+
const activeId = this.store.activeRunId();
|
|
273
|
+
if (activeId != null) {
|
|
274
|
+
this.runId = activeId;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (this.runId == null) return null;
|
|
278
|
+
return this.currentSnapshot.runs.find((r) => r.id === this.runId) ?? null;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/** Render to string lines. width = terminal columns. */
|
|
282
|
+
render(width: number): string[] {
|
|
283
|
+
if (this.mode === "widget") {
|
|
284
|
+
return this._renderWidget(width);
|
|
285
|
+
}
|
|
286
|
+
return this._renderOverlay(width);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
private _renderWidget(width: number): string[] {
|
|
290
|
+
const run = this._getCurrentRun();
|
|
291
|
+
if (!run) {
|
|
292
|
+
return [`${hexToAnsi(this.graphTheme.dim)}no active workflow${RESET}`];
|
|
293
|
+
}
|
|
294
|
+
const headerLines = renderHeader(run, { width, theme: this.graphTheme });
|
|
295
|
+
const counts = this._counts(run);
|
|
296
|
+
const trailer =
|
|
297
|
+
`${hexToAnsi(this.graphTheme.dim)}` +
|
|
298
|
+
`${counts.completed}/${run.stages.length} done` +
|
|
299
|
+
(counts.running > 0 ? ` · ${counts.running} running` : "") +
|
|
300
|
+
(counts.failed > 0 ? ` · ${counts.failed} failed` : "") +
|
|
301
|
+
(counts.blocked > 0 ? ` · ${counts.blocked} blocked` : "") +
|
|
302
|
+
RESET;
|
|
303
|
+
return [...headerLines, ` ${trailer}`];
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Number of rows the overlay frame must paint. Pi-tui anchors the
|
|
308
|
+
* overlay vertically by counting rendered lines, so to truly fill the
|
|
309
|
+
* terminal under `maxHeight: "100%"` the component must emit
|
|
310
|
+
* approximately `terminal.rows` lines. We clamp to at least
|
|
311
|
+
* `OVERLAY_LINE_COUNT` so a tiny terminal or a host that doesn't
|
|
312
|
+
* surface terminal dimensions keeps the previous stable rectangle.
|
|
313
|
+
*/
|
|
314
|
+
private _overlayLineCount(): number {
|
|
315
|
+
const reported = this.getViewportRows?.();
|
|
316
|
+
if (typeof reported !== "number" || !Number.isFinite(reported)) {
|
|
317
|
+
return OVERLAY_LINE_COUNT;
|
|
318
|
+
}
|
|
319
|
+
// Header (3) + statusline (3) is the absolute minimum; anything
|
|
320
|
+
// smaller would underflow the body band.
|
|
321
|
+
return Math.max(OVERLAY_LINE_COUNT, Math.floor(reported));
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/** Rows available for the graph body (between header and statusline). */
|
|
325
|
+
private _overlayBodyRows(lineCount: number): number {
|
|
326
|
+
return Math.max(1, lineCount - 3 /* header */ - 3 /* statusline */);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
private _renderOverlay(width: number): string[] {
|
|
330
|
+
const frameWidth = Math.max(40, width);
|
|
331
|
+
const lines: string[] = [];
|
|
332
|
+
const run = this._getCurrentRun();
|
|
333
|
+
|
|
334
|
+
if (!run) {
|
|
335
|
+
return this._renderEmptyState(frameWidth);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// 1. Header chrome (3 rows: outline pill + session name + counts).
|
|
339
|
+
lines.push(
|
|
340
|
+
...renderHeader(run, { width: frameWidth, theme: this.graphTheme }),
|
|
341
|
+
);
|
|
342
|
+
|
|
343
|
+
// 2. Graph occupies the full body. No section labels, no focused-
|
|
344
|
+
// stage panel — status colour on each card carries that signal.
|
|
345
|
+
const graphLines = this._renderGraph(frameWidth);
|
|
346
|
+
const bodyTarget = this._overlayBodyRows(this._overlayLineCount());
|
|
347
|
+
// Vertically centre the graph in the body band.
|
|
348
|
+
const topPad = Math.max(
|
|
349
|
+
0,
|
|
350
|
+
Math.floor((bodyTarget - graphLines.length) / 2),
|
|
351
|
+
);
|
|
352
|
+
for (let i = 0; i < topPad; i++) lines.push(this._blankRow(frameWidth));
|
|
353
|
+
for (const line of graphLines) {
|
|
354
|
+
lines.push(this._canvasRow(line, frameWidth));
|
|
355
|
+
}
|
|
356
|
+
while (lines.length < 3 + bodyTarget)
|
|
357
|
+
lines.push(this._blankRow(frameWidth));
|
|
358
|
+
if (lines.length > 3 + bodyTarget) lines.length = 3 + bodyTarget;
|
|
359
|
+
|
|
360
|
+
// 3. Switcher overlay — floats over the body when open.
|
|
361
|
+
if (this.switcherOpen) {
|
|
362
|
+
const switcherWidth = Math.min(56, frameWidth - 4);
|
|
363
|
+
const switcherLines = renderSwitcher(run.stages, this.switcherState, {
|
|
364
|
+
width: switcherWidth,
|
|
365
|
+
theme: this.graphTheme,
|
|
366
|
+
});
|
|
367
|
+
const insertAt = 4; // beneath the header chrome band
|
|
368
|
+
for (let i = 0; i < switcherLines.length; i++) {
|
|
369
|
+
const lineIdx = insertAt + i;
|
|
370
|
+
const padded = this._padCanvas(switcherLines[i]!, frameWidth);
|
|
371
|
+
if (lineIdx < lines.length) lines[lineIdx] = padded;
|
|
372
|
+
else lines.push(padded);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// 4. Pending HIL prompt — floats over the graph body, centred. The
|
|
377
|
+
// chat editor remains free regardless: the overlay is the only
|
|
378
|
+
// surface that interacts with the prompt.
|
|
379
|
+
if (this.promptState) {
|
|
380
|
+
const cardWidth = Math.min(72, Math.max(40, frameWidth - 6));
|
|
381
|
+
const cardLines = renderPromptCard({
|
|
382
|
+
state: this.promptState,
|
|
383
|
+
theme: this.graphTheme,
|
|
384
|
+
width: cardWidth,
|
|
385
|
+
cursorOn: ((Date.now() / 530) | 0) % 2 === 0,
|
|
386
|
+
});
|
|
387
|
+
const bodyStart = 3;
|
|
388
|
+
const bodyEnd = 3 + bodyTarget;
|
|
389
|
+
const slot = Math.max(
|
|
390
|
+
bodyStart,
|
|
391
|
+
bodyStart + Math.floor((bodyTarget - cardLines.length) / 2),
|
|
392
|
+
);
|
|
393
|
+
const leftPad = Math.max(0, Math.floor((frameWidth - cardWidth) / 2));
|
|
394
|
+
for (let i = 0; i < cardLines.length; i++) {
|
|
395
|
+
const lineIdx = slot + i;
|
|
396
|
+
if (lineIdx >= bodyEnd) break;
|
|
397
|
+
const base = lines[lineIdx] ?? this._blankRow(frameWidth);
|
|
398
|
+
lines[lineIdx] = this._overlayCard(base, cardLines[i]!, leftPad, frameWidth);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// 4. Toast overlay — top-right of header band.
|
|
403
|
+
const toastLines = renderToasts(this.toastManager.active(), {
|
|
404
|
+
theme: this.graphTheme,
|
|
405
|
+
});
|
|
406
|
+
if (toastLines.length > 0) {
|
|
407
|
+
for (let i = 0; i < toastLines.length && i < lines.length; i++) {
|
|
408
|
+
const existing = lines[i] ?? "";
|
|
409
|
+
const merged = `${existing} ${toastLines[i]}`;
|
|
410
|
+
lines[i] = truncateToWidth(merged, frameWidth, "", true);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// 5. Three-row statusline pinned to the bottom.
|
|
415
|
+
lines.push(...this._renderStatusline(frameWidth));
|
|
416
|
+
|
|
417
|
+
return lines;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
private _renderEmptyState(width: number): string[] {
|
|
421
|
+
const t = this.graphTheme;
|
|
422
|
+
const muted = hexToAnsi(t.textMuted);
|
|
423
|
+
const dim = hexToAnsi(t.dim);
|
|
424
|
+
const accent = hexToAnsi(t.accent);
|
|
425
|
+
const chromeBg = hexBg(t.backgroundPanel);
|
|
426
|
+
|
|
427
|
+
const {
|
|
428
|
+
top,
|
|
429
|
+
mid,
|
|
430
|
+
bot,
|
|
431
|
+
visibleWidth: pillW,
|
|
432
|
+
} = renderOutlinePill("ORCHESTRATOR", t.accent, chromeBg);
|
|
433
|
+
const idleLabel = ` ${muted}idle${RESET}`;
|
|
434
|
+
const fillerVisible = Math.max(0, width - 1 - pillW - 6 /* " idle" */ - 2);
|
|
435
|
+
const filler = " ".repeat(fillerVisible);
|
|
436
|
+
const lines: string[] = [
|
|
437
|
+
`${chromeBg} ${RESET}${top}${chromeBg}${" ".repeat(6 + fillerVisible)}${" ".repeat(2)}${RESET}`,
|
|
438
|
+
`${chromeBg} ${RESET}${mid}${chromeBg}${idleLabel}${filler}${" ".repeat(2)}${RESET}`,
|
|
439
|
+
`${chromeBg} ${RESET}${bot}${chromeBg}${" ".repeat(6 + fillerVisible)}${" ".repeat(2)}${RESET}`,
|
|
440
|
+
];
|
|
441
|
+
const bodyTarget = this._overlayBodyRows(this._overlayLineCount());
|
|
442
|
+
const body: string[] = [
|
|
443
|
+
this._canvasRow(` ${muted}No active workflow run.${RESET}`, width),
|
|
444
|
+
this._canvasRow(
|
|
445
|
+
` ${dim}Start one with ${accent}/workflow <name>${RESET}${dim} or press ${accent}F2${RESET}${dim} on an active run.${RESET}`,
|
|
446
|
+
width,
|
|
447
|
+
),
|
|
448
|
+
];
|
|
449
|
+
const topPad = Math.max(0, Math.floor((bodyTarget - body.length) / 2));
|
|
450
|
+
for (let i = 0; i < topPad; i++) lines.push(this._blankRow(width));
|
|
451
|
+
for (const l of body) lines.push(l);
|
|
452
|
+
while (lines.length < 3 + bodyTarget) lines.push(this._blankRow(width));
|
|
453
|
+
lines.push(...this._renderStatusline(width));
|
|
454
|
+
return lines;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
private _renderGraph(width: number): string[] {
|
|
458
|
+
const run = this._getCurrentRun();
|
|
459
|
+
if (!run || this.cachedLayout.length === 0) {
|
|
460
|
+
const dim = hexToAnsi(this.graphTheme.dim);
|
|
461
|
+
return [` ${dim}waiting for stage events…${RESET}`];
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
const graphInner = Math.max(1, width - 4);
|
|
465
|
+
const canvasWidth = this.cachedLayout.reduce(
|
|
466
|
+
(max, node) => Math.max(max, node.x + NODE_W),
|
|
467
|
+
0,
|
|
468
|
+
);
|
|
469
|
+
if (canvasWidth > graphInner || this.cachedLayout.length > 12) {
|
|
470
|
+
return this._renderCompactGraph(run.stages, graphInner);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// Centre the whole graph horizontally in the available canvas.
|
|
474
|
+
const leftMargin = Math.max(2, Math.floor((graphInner - canvasWidth) / 2));
|
|
475
|
+
|
|
476
|
+
// Pulse phase ∈ [0, 1) derived from wall-clock time so cards lerp
|
|
477
|
+
// their border colour on the same beat regardless of how often
|
|
478
|
+
// render() fires. The animation tick (`ANIMATION_TICK_MS`) only
|
|
479
|
+
// controls render cadence — it does not advance the phase.
|
|
480
|
+
const pulsePhase = (Date.now() % PULSE_PERIOD_MS) / PULSE_PERIOD_MS;
|
|
481
|
+
|
|
482
|
+
// 1. Plot parent → child edges into a sparse char canvas so they
|
|
483
|
+
// survive crisp through column gaps. Node-card bodies overwrite
|
|
484
|
+
// edge cells per-row when we compose the final output below.
|
|
485
|
+
const edgeCanvas = new GraphCanvas();
|
|
486
|
+
const edgeColor = this.graphTheme.borderDim;
|
|
487
|
+
const nodeByStageId = new Map(
|
|
488
|
+
this.cachedLayout.map((n) => [n.stage.id, n]),
|
|
489
|
+
);
|
|
490
|
+
for (const node of this.cachedLayout) {
|
|
491
|
+
for (const parentId of node.stage.parentIds) {
|
|
492
|
+
const parent = nodeByStageId.get(parentId);
|
|
493
|
+
if (!parent) continue;
|
|
494
|
+
this._plotEdge(
|
|
495
|
+
edgeCanvas,
|
|
496
|
+
parent.x,
|
|
497
|
+
parent.y,
|
|
498
|
+
node.x,
|
|
499
|
+
node.y,
|
|
500
|
+
edgeColor,
|
|
501
|
+
);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
const edgeLines = edgeCanvas.toLines();
|
|
505
|
+
|
|
506
|
+
// 2. Render each node card and record its row span / start column.
|
|
507
|
+
interface Placement {
|
|
508
|
+
startCol: number;
|
|
509
|
+
width: number;
|
|
510
|
+
line: string;
|
|
511
|
+
}
|
|
512
|
+
const placements: Map<number, Placement[]> = new Map();
|
|
513
|
+
for (let ni = 0; ni < this.cachedLayout.length; ni++) {
|
|
514
|
+
const node = this.cachedLayout[ni]!;
|
|
515
|
+
const focused = ni === this.focusedIndex;
|
|
516
|
+
const cardLines = renderNodeCard(node.stage, {
|
|
517
|
+
width: NODE_W,
|
|
518
|
+
height: NODE_H,
|
|
519
|
+
focused,
|
|
520
|
+
pulsePhase,
|
|
521
|
+
theme: this.graphTheme,
|
|
522
|
+
stages: run.stages,
|
|
523
|
+
});
|
|
524
|
+
for (let li = 0; li < cardLines.length; li++) {
|
|
525
|
+
const rowIdx = node.y + li;
|
|
526
|
+
let bucket = placements.get(rowIdx);
|
|
527
|
+
if (!bucket) {
|
|
528
|
+
bucket = [];
|
|
529
|
+
placements.set(rowIdx, bucket);
|
|
530
|
+
}
|
|
531
|
+
bucket.push({ startCol: node.x, width: NODE_W, line: cardLines[li]! });
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
// 3. Compose each output row by interleaving edge segments with the
|
|
536
|
+
// card placements at their assigned columns.
|
|
537
|
+
const totalRows = Math.max(
|
|
538
|
+
edgeLines.length,
|
|
539
|
+
...this.cachedLayout.map((n) => n.y + NODE_H),
|
|
540
|
+
);
|
|
541
|
+
const composed: string[] = [];
|
|
542
|
+
for (let rowIdx = 0; rowIdx < totalRows; rowIdx++) {
|
|
543
|
+
const edgeRowChars = this._edgeRowToCells(edgeLines[rowIdx] ?? "");
|
|
544
|
+
const cards = placements.get(rowIdx) ?? [];
|
|
545
|
+
composed.push(this._composeRow(edgeRowChars, cards, edgeColor));
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
// Pad each row out to the full overlay width with the body bg so
|
|
549
|
+
// nothing leaks through to the terminal default — cards/edges only
|
|
550
|
+
// paint the cells they occupy; everywhere else needs explicit bg.
|
|
551
|
+
const bg = hexBg(this.graphTheme.bg);
|
|
552
|
+
const leftPad = `${bg}${" ".repeat(leftMargin)}${RESET}`;
|
|
553
|
+
return composed.map((line) => {
|
|
554
|
+
const inner = this._padCanvas(line, width - leftMargin);
|
|
555
|
+
return `${leftPad}${inner}`;
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
/**
|
|
560
|
+
* Plot a parent → child edge for the vertical orientation. The edge
|
|
561
|
+
* exits from the parent's bottom-centre, runs through a horizontal
|
|
562
|
+
* spine half-way down the gap, and re-enters from the child's
|
|
563
|
+
* top-centre. Corners at the spine are upgraded to T-junctions when
|
|
564
|
+
* a second edge crosses the same cell so fan-out and fan-in render
|
|
565
|
+
* cleanly as a single rule with stubs.
|
|
566
|
+
*/
|
|
567
|
+
private _plotEdge(
|
|
568
|
+
canvas: GraphCanvas,
|
|
569
|
+
px: number,
|
|
570
|
+
py: number,
|
|
571
|
+
cx: number,
|
|
572
|
+
cy: number,
|
|
573
|
+
color: string,
|
|
574
|
+
): void {
|
|
575
|
+
const parentCol = px + Math.floor(NODE_W / 2);
|
|
576
|
+
const childCol = cx + Math.floor(NODE_W / 2);
|
|
577
|
+
const parentExitRow = py + NODE_H; // first row below parent's bottom border
|
|
578
|
+
const childEntryRow = cy - 1; // last row above child's top border
|
|
579
|
+
if (childEntryRow < parentExitRow) return;
|
|
580
|
+
|
|
581
|
+
if (parentCol === childCol) {
|
|
582
|
+
canvas.vline(parentCol, parentExitRow, childEntryRow, color);
|
|
583
|
+
return;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
const spineRow = Math.max(
|
|
587
|
+
parentExitRow,
|
|
588
|
+
Math.min(childEntryRow, Math.floor((parentExitRow + childEntryRow) / 2)),
|
|
589
|
+
);
|
|
590
|
+
|
|
591
|
+
// Down stub from parent into the spine row — only when there's
|
|
592
|
+
// a non-zero gap, otherwise vline would paint the spineRow corner
|
|
593
|
+
// cell before we get to set it.
|
|
594
|
+
if (spineRow > parentExitRow) {
|
|
595
|
+
canvas.vline(parentCol, parentExitRow, spineRow - 1, color);
|
|
596
|
+
}
|
|
597
|
+
// Corner where the parent stub meets the spine. Upgrade to a
|
|
598
|
+
// T-down (`┬`) when another edge has already crossed this cell.
|
|
599
|
+
this._placeCornerOrTee(
|
|
600
|
+
canvas,
|
|
601
|
+
spineRow,
|
|
602
|
+
parentCol,
|
|
603
|
+
childCol > parentCol ? "╰" : "╯",
|
|
604
|
+
color,
|
|
605
|
+
);
|
|
606
|
+
// Horizontal spine segment.
|
|
607
|
+
const hloCol = Math.min(parentCol, childCol) + 1;
|
|
608
|
+
const hhiCol = Math.max(parentCol, childCol) - 1;
|
|
609
|
+
if (hhiCol >= hloCol) {
|
|
610
|
+
canvas.hline(spineRow, hloCol, hhiCol, color);
|
|
611
|
+
}
|
|
612
|
+
// Corner where the spine drops into the child stub.
|
|
613
|
+
this._placeCornerOrTee(
|
|
614
|
+
canvas,
|
|
615
|
+
spineRow,
|
|
616
|
+
childCol,
|
|
617
|
+
childCol > parentCol ? "╮" : "╭",
|
|
618
|
+
color,
|
|
619
|
+
);
|
|
620
|
+
// Down stub from spine into child — same zero-gap guard.
|
|
621
|
+
if (childEntryRow > spineRow) {
|
|
622
|
+
canvas.vline(childCol, spineRow + 1, childEntryRow, color);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
/**
|
|
627
|
+
* Place a corner glyph at `(row, col)`. When the target cell already
|
|
628
|
+
* holds a glyph from a previous edge, upgrade to the correct
|
|
629
|
+
* box-drawing junction so fan-out / fan-in points read as a single
|
|
630
|
+
* rule rather than two stacked corners.
|
|
631
|
+
*
|
|
632
|
+
* Junction table (existing ⊕ new → result):
|
|
633
|
+
* | ⊕ ╰ → ├ | ⊕ ╮ → ┤ | ⊕ ╯ → ┤ | ⊕ ╭ → ├
|
|
634
|
+
* ─ ⊕ ╭ → ┬ ─ ⊕ ╮ → ┬ ─ ⊕ ╰ → ┴ ─ ⊕ ╯ → ┴
|
|
635
|
+
* ╰ ⊕ ╮ → ┴ ╭ ⊕ ╯ → ┴ ╭ ⊕ ╮ → ┬ etc.
|
|
636
|
+
*
|
|
637
|
+
* The full table is small; we collapse it to: "existing-direction-set
|
|
638
|
+
* ∪ new-direction-set → best matching junction".
|
|
639
|
+
*/
|
|
640
|
+
private _placeCornerOrTee(
|
|
641
|
+
canvas: GraphCanvas,
|
|
642
|
+
row: number,
|
|
643
|
+
col: number,
|
|
644
|
+
corner: string,
|
|
645
|
+
color: string,
|
|
646
|
+
): void {
|
|
647
|
+
const existing = (
|
|
648
|
+
canvas as unknown as { rows: Map<number, Map<number, { ch: string }>> }
|
|
649
|
+
).rows
|
|
650
|
+
.get(row)
|
|
651
|
+
?.get(col)?.ch;
|
|
652
|
+
if (existing == null || existing === corner) {
|
|
653
|
+
canvas.setCell(row, col, corner, color);
|
|
654
|
+
return;
|
|
655
|
+
}
|
|
656
|
+
const dirs = (ch: string): Set<"u" | "d" | "l" | "r"> => {
|
|
657
|
+
switch (ch) {
|
|
658
|
+
case "│":
|
|
659
|
+
return new Set(["u", "d"]);
|
|
660
|
+
case "─":
|
|
661
|
+
return new Set(["l", "r"]);
|
|
662
|
+
case "╭":
|
|
663
|
+
return new Set(["d", "r"]);
|
|
664
|
+
case "╮":
|
|
665
|
+
return new Set(["d", "l"]);
|
|
666
|
+
case "╰":
|
|
667
|
+
return new Set(["u", "r"]);
|
|
668
|
+
case "╯":
|
|
669
|
+
return new Set(["u", "l"]);
|
|
670
|
+
case "├":
|
|
671
|
+
return new Set(["u", "d", "r"]);
|
|
672
|
+
case "┤":
|
|
673
|
+
return new Set(["u", "d", "l"]);
|
|
674
|
+
case "┬":
|
|
675
|
+
return new Set(["d", "l", "r"]);
|
|
676
|
+
case "┴":
|
|
677
|
+
return new Set(["u", "l", "r"]);
|
|
678
|
+
case "┼":
|
|
679
|
+
return new Set(["u", "d", "l", "r"]);
|
|
680
|
+
default:
|
|
681
|
+
return new Set();
|
|
682
|
+
}
|
|
683
|
+
};
|
|
684
|
+
const merged = new Set<"u" | "d" | "l" | "r">([
|
|
685
|
+
...dirs(existing),
|
|
686
|
+
...dirs(corner),
|
|
687
|
+
]);
|
|
688
|
+
const has = (...want: Array<"u" | "d" | "l" | "r">) =>
|
|
689
|
+
want.every((d) => merged.has(d));
|
|
690
|
+
let glyph = corner;
|
|
691
|
+
if (has("u", "d", "l", "r")) glyph = "┼";
|
|
692
|
+
else if (has("u", "d", "r")) glyph = "├";
|
|
693
|
+
else if (has("u", "d", "l")) glyph = "┤";
|
|
694
|
+
else if (has("d", "l", "r")) glyph = "┬";
|
|
695
|
+
else if (has("u", "l", "r")) glyph = "┴";
|
|
696
|
+
canvas.setCell(row, col, glyph, color);
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
/**
|
|
700
|
+
* Split the canvas-rendered edge row at card boundaries into spans of
|
|
701
|
+
* `{ startCol, visibleWidth, content }` so the composer can interleave
|
|
702
|
+
* cards without colliding.
|
|
703
|
+
*/
|
|
704
|
+
private _edgeRowToCells(line: string): string {
|
|
705
|
+
return line;
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
/**
|
|
709
|
+
* Interleave a single edge row with the node cards that cross it.
|
|
710
|
+
* Cards take precedence at their column ranges; edge characters fill
|
|
711
|
+
* the gaps. Returns one composed line padded with spaces.
|
|
712
|
+
*/
|
|
713
|
+
private _composeRow(
|
|
714
|
+
edgeRow: string,
|
|
715
|
+
cards: Array<{ startCol: number; width: number; line: string }>,
|
|
716
|
+
_edgeColor: string,
|
|
717
|
+
): string {
|
|
718
|
+
const bg = hexBg(this.graphTheme.bg);
|
|
719
|
+
const sorted = cards.slice().sort((a, b) => a.startCol - b.startCol);
|
|
720
|
+
const edgeVisible = this._splitVisible(edgeRow);
|
|
721
|
+
let cursor = 0;
|
|
722
|
+
let out = "";
|
|
723
|
+
for (const card of sorted) {
|
|
724
|
+
if (card.startCol > cursor) {
|
|
725
|
+
// Edge segment up to card start — prepend bg so empty cells
|
|
726
|
+
// in this stretch keep the body bg instead of falling back
|
|
727
|
+
// to the terminal default once any prior RESET fired.
|
|
728
|
+
out += `${bg}${this._sliceVisible(edgeVisible, cursor, card.startCol)}`;
|
|
729
|
+
cursor = card.startCol;
|
|
730
|
+
}
|
|
731
|
+
out += card.line;
|
|
732
|
+
cursor += card.width;
|
|
733
|
+
}
|
|
734
|
+
// Trailing edge tail — same bg re-priming.
|
|
735
|
+
out += `${bg}${this._sliceVisible(edgeVisible, cursor, edgeVisible.length)}`;
|
|
736
|
+
return out;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
/**
|
|
740
|
+
* Split a styled ANSI string into per-cell entries, each carrying the
|
|
741
|
+
* style prefix that should apply when rendering that cell. Used by
|
|
742
|
+
* `_sliceVisible` so we can cut the edge line at arbitrary columns
|
|
743
|
+
* without breaking ANSI sequences.
|
|
744
|
+
*/
|
|
745
|
+
private _splitVisible(line: string): Array<{ prefix: string; ch: string }> {
|
|
746
|
+
const cells: Array<{ prefix: string; ch: string }> = [];
|
|
747
|
+
let i = 0;
|
|
748
|
+
let pending = "";
|
|
749
|
+
while (i < line.length) {
|
|
750
|
+
const ch = line[i]!;
|
|
751
|
+
if (ch === "\x1b" && line[i + 1] === "[") {
|
|
752
|
+
const end = line.indexOf("m", i);
|
|
753
|
+
if (end === -1) break;
|
|
754
|
+
pending += line.slice(i, end + 1);
|
|
755
|
+
i = end + 1;
|
|
756
|
+
continue;
|
|
757
|
+
}
|
|
758
|
+
cells.push({ prefix: pending, ch });
|
|
759
|
+
pending = "";
|
|
760
|
+
i += 1;
|
|
761
|
+
}
|
|
762
|
+
return cells;
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
private _sliceVisible(
|
|
766
|
+
cells: Array<{ prefix: string; ch: string }>,
|
|
767
|
+
fromCol: number,
|
|
768
|
+
toCol: number,
|
|
769
|
+
): string {
|
|
770
|
+
if (fromCol >= toCol) return "";
|
|
771
|
+
let out = "";
|
|
772
|
+
let lastPrefix = "";
|
|
773
|
+
for (let c = fromCol; c < toCol; c++) {
|
|
774
|
+
const cell = cells[c];
|
|
775
|
+
if (cell) {
|
|
776
|
+
if (cell.prefix && cell.prefix !== lastPrefix) {
|
|
777
|
+
out += cell.prefix;
|
|
778
|
+
lastPrefix = cell.prefix;
|
|
779
|
+
}
|
|
780
|
+
out += cell.ch;
|
|
781
|
+
} else {
|
|
782
|
+
if (lastPrefix !== "") {
|
|
783
|
+
out += RESET;
|
|
784
|
+
lastPrefix = "";
|
|
785
|
+
}
|
|
786
|
+
out += " ";
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
if (lastPrefix !== "") out += RESET;
|
|
790
|
+
return out;
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
private _renderCompactGraph(
|
|
794
|
+
stages: readonly StageSnapshot[],
|
|
795
|
+
width: number,
|
|
796
|
+
): string[] {
|
|
797
|
+
const t = this.graphTheme;
|
|
798
|
+
const dim = hexToAnsi(t.dim);
|
|
799
|
+
const muted = hexToAnsi(t.textMuted);
|
|
800
|
+
const accent = hexToAnsi(t.accent);
|
|
801
|
+
const byId = new Map(stages.map((stage) => [stage.id, stage]));
|
|
802
|
+
|
|
803
|
+
const lines: string[] = [];
|
|
804
|
+
for (let i = 0; i < this.cachedLayout.length; i++) {
|
|
805
|
+
const node = this.cachedLayout[i]!;
|
|
806
|
+
const stage = node.stage;
|
|
807
|
+
const focused = i === this.focusedIndex;
|
|
808
|
+
const parents = stage.parentIds
|
|
809
|
+
.map((id) => byId.get(id)?.name ?? id)
|
|
810
|
+
.filter((name) => name.length > 0);
|
|
811
|
+
const parentLabel = parents.length > 0 ? ` ← ${parents.join(", ")}` : "";
|
|
812
|
+
const blockedBy = stage.blockedByStageId
|
|
813
|
+
? (byId.get(stage.blockedByStageId)?.name ?? stage.blockedByStageId)
|
|
814
|
+
: "";
|
|
815
|
+
const blockedLabel = blockedBy ? ` · blocked by ${blockedBy}` : "";
|
|
816
|
+
const dur = this._duration(stage);
|
|
817
|
+
const cursor = focused ? `${accent}❯${RESET}` : ` `;
|
|
818
|
+
const sc = hexToAnsi(statusColor(stage.status, t));
|
|
819
|
+
const nameStyled = focused
|
|
820
|
+
? `${accent}${BOLD}${stage.name}${RESET}`
|
|
821
|
+
: `${hexToAnsi(t.text)}${stage.name}${RESET}`;
|
|
822
|
+
const meta = `${dim}${stage.status}${dur ? ` · ${dur}` : ""}${blockedLabel}${parentLabel}${RESET}`;
|
|
823
|
+
const line = ` ${cursor} ${sc}${statusIcon(stage.status)}${RESET} ${nameStyled} ${meta}`;
|
|
824
|
+
lines.push(truncateToWidth(line, width, "…", true));
|
|
825
|
+
}
|
|
826
|
+
if (lines.length === 0) {
|
|
827
|
+
lines.push(` ${muted}(no stages)${RESET}`);
|
|
828
|
+
}
|
|
829
|
+
return lines;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
// -------------------------------------------------------------------------
|
|
833
|
+
// Chrome / canvas / section helpers
|
|
834
|
+
// -------------------------------------------------------------------------
|
|
835
|
+
|
|
836
|
+
/**
|
|
837
|
+
* Three-row statusline pinned to the bottom of the overlay. Mirrors
|
|
838
|
+
* the header band: `backgroundPanel` chrome, outlined accent pill
|
|
839
|
+
* flush-left, hints flowing right on the centre row.
|
|
840
|
+
*/
|
|
841
|
+
private _renderStatusline(width: number): string[] {
|
|
842
|
+
const t = this.graphTheme;
|
|
843
|
+
const chromeBg = hexBg(t.backgroundPanel);
|
|
844
|
+
const text = hexToAnsi(t.text);
|
|
845
|
+
const muted = hexToAnsi(t.textMuted);
|
|
846
|
+
const dim = hexToAnsi(t.dim);
|
|
847
|
+
|
|
848
|
+
const {
|
|
849
|
+
top,
|
|
850
|
+
mid,
|
|
851
|
+
bot,
|
|
852
|
+
visibleWidth: pillW,
|
|
853
|
+
} = renderOutlinePill(MODE_PILL_LABEL, t.accent, chromeBg);
|
|
854
|
+
|
|
855
|
+
// Hints — `<key> <label>` separated by ` · `.
|
|
856
|
+
const sep = `${chromeBg} ${dim}·${RESET}${chromeBg} `;
|
|
857
|
+
const segments = HINT_KEYS.map(
|
|
858
|
+
({ key, label }) =>
|
|
859
|
+
`${text}${BOLD}${key}${RESET}${chromeBg} ${muted}${label}${RESET}${chromeBg}`,
|
|
860
|
+
);
|
|
861
|
+
const hintsStyled = segments.join(sep);
|
|
862
|
+
const hintsVisibleLen =
|
|
863
|
+
HINT_KEYS.reduce((sum, h) => sum + h.key.length + 1 + h.label.length, 0) +
|
|
864
|
+
(HINT_KEYS.length - 1) * 5; // " · "
|
|
865
|
+
|
|
866
|
+
const leftEdgePad = 1;
|
|
867
|
+
const rightEdgePad = 2;
|
|
868
|
+
const fillerVisible = Math.max(
|
|
869
|
+
2,
|
|
870
|
+
width - leftEdgePad - pillW - hintsVisibleLen - rightEdgePad,
|
|
871
|
+
);
|
|
872
|
+
const filler = " ".repeat(fillerVisible);
|
|
873
|
+
const blankAcross = " ".repeat(
|
|
874
|
+
fillerVisible + hintsVisibleLen + rightEdgePad,
|
|
875
|
+
);
|
|
876
|
+
|
|
877
|
+
return [
|
|
878
|
+
`${chromeBg} ${RESET}${top}${chromeBg}${blankAcross}${RESET}`,
|
|
879
|
+
`${chromeBg} ${RESET}${mid}${chromeBg}${filler}${hintsStyled}${chromeBg}${" ".repeat(rightEdgePad)}${RESET}`,
|
|
880
|
+
`${chromeBg} ${RESET}${bot}${chromeBg}${blankAcross}${RESET}`,
|
|
881
|
+
];
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
/** Blank canvas row — single line of `bg`. */
|
|
885
|
+
private _blankRow(width: number): string {
|
|
886
|
+
return `${hexBg(this.graphTheme.bg)}${" ".repeat(width)}${RESET}`;
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
/** Wrap content in a canvas-bg row, padded to `width`. Re-emits the
|
|
890
|
+
* bg ANSI right before the trailing fill so any internal `RESET`
|
|
891
|
+
* from cards/edges doesn't let the terminal default bleed through. */
|
|
892
|
+
private _canvasRow(content: string, width: number): string {
|
|
893
|
+
const bg = hexBg(this.graphTheme.bg);
|
|
894
|
+
const truncated = truncateToWidth(content, width, "…", true);
|
|
895
|
+
const padLen = Math.max(0, width - visibleWidth(truncated));
|
|
896
|
+
return `${bg}${truncated}${bg}${" ".repeat(padLen)}${RESET}`;
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
/** Pad pre-styled content out to canvas width without truncation.
|
|
900
|
+
* Re-emits the body bg ANSI right before the trailing fill so any
|
|
901
|
+
* internal RESET inside `content` doesn't leak the terminal default. */
|
|
902
|
+
private _padCanvas(content: string, width: number): string {
|
|
903
|
+
const bg = hexBg(this.graphTheme.bg);
|
|
904
|
+
const padLen = Math.max(0, width - visibleWidth(content));
|
|
905
|
+
return `${bg}${content}${bg}${" ".repeat(padLen)}${RESET}`;
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
/**
|
|
909
|
+
* Compose a pre-styled card line over a canvas row at `leftPad` columns.
|
|
910
|
+
* The base row keeps its `bg` (so background colour matches canvas);
|
|
911
|
+
* the card slice replaces the cells starting at `leftPad`, and the
|
|
912
|
+
* residual columns to the right are repainted with bg.
|
|
913
|
+
*
|
|
914
|
+
* We don't try to keep the parts of `base` that fall *under* the card
|
|
915
|
+
* — pi-tui paints flat lines, not z-buffered cells, so the card's panel
|
|
916
|
+
* background winning is fine.
|
|
917
|
+
*/
|
|
918
|
+
private _overlayCard(
|
|
919
|
+
_base: string,
|
|
920
|
+
cardLine: string,
|
|
921
|
+
leftPad: number,
|
|
922
|
+
totalWidth: number,
|
|
923
|
+
): string {
|
|
924
|
+
const bg = hexBg(this.graphTheme.bg);
|
|
925
|
+
const cardW = visibleWidth(cardLine);
|
|
926
|
+
const rightPadLen = Math.max(0, totalWidth - leftPad - cardW);
|
|
927
|
+
return `${bg}${" ".repeat(leftPad)}${RESET}${cardLine}${bg}${" ".repeat(rightPadLen)}${RESET}`;
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
private _duration(stage: StageSnapshot): string {
|
|
931
|
+
if (stage.durationMs != null) return fmtDuration(stage.durationMs);
|
|
932
|
+
if (stage.startedAt != null)
|
|
933
|
+
return fmtDuration(Date.now() - stage.startedAt);
|
|
934
|
+
return "";
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
private _counts(run: RunSnapshot): {
|
|
938
|
+
pending: number;
|
|
939
|
+
running: number;
|
|
940
|
+
awaiting_input: number;
|
|
941
|
+
paused: number;
|
|
942
|
+
blocked: number;
|
|
943
|
+
completed: number;
|
|
944
|
+
failed: number;
|
|
945
|
+
} {
|
|
946
|
+
const c = {
|
|
947
|
+
pending: 0,
|
|
948
|
+
running: 0,
|
|
949
|
+
awaiting_input: 0,
|
|
950
|
+
paused: 0,
|
|
951
|
+
blocked: 0,
|
|
952
|
+
completed: 0,
|
|
953
|
+
failed: 0,
|
|
954
|
+
};
|
|
955
|
+
for (const s of run.stages) c[s.status]++;
|
|
956
|
+
return c;
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
// -------------------------------------------------------------------------
|
|
960
|
+
// Input handling
|
|
961
|
+
// -------------------------------------------------------------------------
|
|
962
|
+
|
|
963
|
+
/** Returns true if consumed. */
|
|
964
|
+
handleInput(data: string): boolean {
|
|
965
|
+
// Pending HIL prompt owns input — once a prompt is active, every key
|
|
966
|
+
// routes to it until the user submits or skips. This is what keeps
|
|
967
|
+
// the chat editor free: the workflow author called ctx.ui.editor()
|
|
968
|
+
// long ago in a background promise; only the overlay handles the
|
|
969
|
+
// response. The graph nav resumes after `_resolvePrompt` clears
|
|
970
|
+
// `promptState` (mirrored from the store via `_syncPromptState`).
|
|
971
|
+
if (this.promptState) {
|
|
972
|
+
return this._handlePromptInput(data);
|
|
973
|
+
}
|
|
974
|
+
if (this.switcherOpen) {
|
|
975
|
+
return this._handleSwitcherInput(data);
|
|
976
|
+
}
|
|
977
|
+
return this._handleGraphInput(data);
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
private _handlePromptInput(data: string): boolean {
|
|
981
|
+
const state = this.promptState;
|
|
982
|
+
if (!state) return false;
|
|
983
|
+
const action = handlePromptCardInput(data, state);
|
|
984
|
+
if (action.kind === "noop") return true;
|
|
985
|
+
const runId = this.runId;
|
|
986
|
+
if (!runId) return true;
|
|
987
|
+
const response =
|
|
988
|
+
action.kind === "cancel" ? defaultResponseFor(state.prompt) : action.response;
|
|
989
|
+
this._resolvePrompt(runId, state.prompt.id, response);
|
|
990
|
+
return true;
|
|
991
|
+
}
|
|
992
|
+
|
|
993
|
+
private _resolvePrompt(runId: string, promptId: string, response: unknown): void {
|
|
994
|
+
// Clear local state immediately so the card disappears even if the
|
|
995
|
+
// host doesn't re-emit a store snapshot between resolve and render.
|
|
996
|
+
this.promptState = null;
|
|
997
|
+
if (this.onPromptResolve) {
|
|
998
|
+
this.onPromptResolve(runId, promptId, response);
|
|
999
|
+
return;
|
|
1000
|
+
}
|
|
1001
|
+
// Fallback path used by callers that wire GraphView directly without
|
|
1002
|
+
// injecting onPromptResolve. Best-effort — if the store rejects (stale
|
|
1003
|
+
// id) we already cleared local state, so we don't try to re-arm.
|
|
1004
|
+
this.store.resolvePendingPrompt(runId, promptId, response);
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
private _handleGraphInput(data: string): boolean {
|
|
1008
|
+
const stageCount = this.cachedLayout.length;
|
|
1009
|
+
|
|
1010
|
+
// Vertical-graph navigation: up/down step between depth levels
|
|
1011
|
+
// (col), left/right step between siblings at the same depth (row).
|
|
1012
|
+
// j/k preserved as a flat-order fallback for muscle memory.
|
|
1013
|
+
if (matchesKey(data, "down") || data === "\x1b[B")
|
|
1014
|
+
return this._moveByDepth(+1);
|
|
1015
|
+
if (matchesKey(data, "up") || data === "\x1b[A")
|
|
1016
|
+
return this._moveByDepth(-1);
|
|
1017
|
+
if (matchesKey(data, "right") || data === "\x1b[C")
|
|
1018
|
+
return this._moveBySibling(+1);
|
|
1019
|
+
if (matchesKey(data, "left") || data === "\x1b[D")
|
|
1020
|
+
return this._moveBySibling(-1);
|
|
1021
|
+
if (matchesKey(data, "j")) {
|
|
1022
|
+
this.focusedIndex = Math.min(this.focusedIndex + 1, stageCount - 1);
|
|
1023
|
+
return true;
|
|
1024
|
+
}
|
|
1025
|
+
if (matchesKey(data, "k")) {
|
|
1026
|
+
this.focusedIndex = Math.max(this.focusedIndex - 1, 0);
|
|
1027
|
+
return true;
|
|
1028
|
+
}
|
|
1029
|
+
if (matchesKey(data, "g")) {
|
|
1030
|
+
const now = Date.now();
|
|
1031
|
+
if (this._lastGTime != null && now - this._lastGTime < 500) {
|
|
1032
|
+
this.focusedIndex = 0;
|
|
1033
|
+
this._lastGTime = null;
|
|
1034
|
+
} else {
|
|
1035
|
+
this._lastGTime = now;
|
|
1036
|
+
}
|
|
1037
|
+
return true;
|
|
1038
|
+
}
|
|
1039
|
+
if (data === "/") {
|
|
1040
|
+
this.switcherOpen = true;
|
|
1041
|
+
this.switcherState = { query: "", selectedIndex: 0 };
|
|
1042
|
+
return true;
|
|
1043
|
+
}
|
|
1044
|
+
if (matchesKey(data, "enter") || data === "\r" || data === "\n") {
|
|
1045
|
+
// Enter attaches the popup interior to the focused stage. The
|
|
1046
|
+
// attach shell swaps in the stage-chat view without remounting
|
|
1047
|
+
// the overlay; without a callback, fall back to the legacy
|
|
1048
|
+
// expand/collapse toggle so non-attach hosts still work.
|
|
1049
|
+
if (this.onStageAttach) {
|
|
1050
|
+
const node = this.cachedLayout[this.focusedIndex];
|
|
1051
|
+
const run = this._getCurrentRun();
|
|
1052
|
+
if (node && run) {
|
|
1053
|
+
this.onStageAttach(run.id, node.stage.id);
|
|
1054
|
+
return true;
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
this.detailsExpanded = !this.detailsExpanded;
|
|
1058
|
+
return true;
|
|
1059
|
+
}
|
|
1060
|
+
// `ctrl+d` detaches the whole popup (host hides the overlay). This
|
|
1061
|
+
// is the graph-mode counterpart of the in-chat back affordance.
|
|
1062
|
+
if (data === "\x04") {
|
|
1063
|
+
if (this.onDetach) {
|
|
1064
|
+
this.onDetach();
|
|
1065
|
+
} else if (this.onHide) {
|
|
1066
|
+
this.onHide();
|
|
1067
|
+
}
|
|
1068
|
+
return true;
|
|
1069
|
+
}
|
|
1070
|
+
// `q` kills the active run (no confirm). `h` hides the pane via
|
|
1071
|
+
// the overlay's setHidden() flag (not unmount); Escape closes.
|
|
1072
|
+
if (matchesKey(data, "q")) {
|
|
1073
|
+
const run = this._getCurrentRun();
|
|
1074
|
+
if (run && run.endedAt === undefined && this.onKill) {
|
|
1075
|
+
this.onKill(run.id);
|
|
1076
|
+
}
|
|
1077
|
+
this.onClose?.();
|
|
1078
|
+
return true;
|
|
1079
|
+
}
|
|
1080
|
+
if (matchesKey(data, "h") && this.onHide) {
|
|
1081
|
+
this.onHide();
|
|
1082
|
+
return true;
|
|
1083
|
+
}
|
|
1084
|
+
if (matchesKey(data, "escape") || data === "\x1b") {
|
|
1085
|
+
this.onClose?.();
|
|
1086
|
+
return true;
|
|
1087
|
+
}
|
|
1088
|
+
return false;
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
private _handleSwitcherInput(data: string): boolean {
|
|
1092
|
+
const run = this._getCurrentRun();
|
|
1093
|
+
const stages = run?.stages ?? [];
|
|
1094
|
+
|
|
1095
|
+
if (matchesKey(data, "escape") || data === "\x1b") {
|
|
1096
|
+
this.switcherOpen = false;
|
|
1097
|
+
return true;
|
|
1098
|
+
}
|
|
1099
|
+
if (matchesKey(data, "enter") || data === "\r" || data === "\n") {
|
|
1100
|
+
const filtered = filterStages(stages, this.switcherState.query);
|
|
1101
|
+
const selected = filtered[this.switcherState.selectedIndex];
|
|
1102
|
+
if (selected) {
|
|
1103
|
+
const idx = this.cachedLayout.findIndex(
|
|
1104
|
+
(n) => n.stage.id === selected.id,
|
|
1105
|
+
);
|
|
1106
|
+
if (idx !== -1) this.focusedIndex = idx;
|
|
1107
|
+
}
|
|
1108
|
+
this.switcherOpen = false;
|
|
1109
|
+
return true;
|
|
1110
|
+
}
|
|
1111
|
+
if (matchesKey(data, "down") || data === "\x1b[B") {
|
|
1112
|
+
const filtered = filterStages(stages, this.switcherState.query);
|
|
1113
|
+
this.switcherState = {
|
|
1114
|
+
...this.switcherState,
|
|
1115
|
+
selectedIndex: Math.min(
|
|
1116
|
+
this.switcherState.selectedIndex + 1,
|
|
1117
|
+
filtered.length - 1,
|
|
1118
|
+
),
|
|
1119
|
+
};
|
|
1120
|
+
return true;
|
|
1121
|
+
}
|
|
1122
|
+
if (matchesKey(data, "up") || data === "\x1b[A") {
|
|
1123
|
+
this.switcherState = {
|
|
1124
|
+
...this.switcherState,
|
|
1125
|
+
selectedIndex: Math.max(this.switcherState.selectedIndex - 1, 0),
|
|
1126
|
+
};
|
|
1127
|
+
return true;
|
|
1128
|
+
}
|
|
1129
|
+
if (data === "\x7f" || data === "\b") {
|
|
1130
|
+
this.switcherState = {
|
|
1131
|
+
query: this.switcherState.query.slice(0, -1),
|
|
1132
|
+
selectedIndex: 0,
|
|
1133
|
+
};
|
|
1134
|
+
return true;
|
|
1135
|
+
}
|
|
1136
|
+
if (data.length === 1 && data >= " ") {
|
|
1137
|
+
this.switcherState = {
|
|
1138
|
+
query: this.switcherState.query + data,
|
|
1139
|
+
selectedIndex: 0,
|
|
1140
|
+
};
|
|
1141
|
+
return true;
|
|
1142
|
+
}
|
|
1143
|
+
return false;
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
dispose(): void {
|
|
1147
|
+
if (this._intervalId != null) {
|
|
1148
|
+
clearInterval(this._intervalId);
|
|
1149
|
+
this._intervalId = null;
|
|
1150
|
+
}
|
|
1151
|
+
if (this._unsubscribe) {
|
|
1152
|
+
this._unsubscribe();
|
|
1153
|
+
this._unsubscribe = null;
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
invalidate(): void {
|
|
1158
|
+
this._rebuildLayout();
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
/**
|
|
1162
|
+
* Move focus to the nearest node `step` depth-levels away (↑/↓).
|
|
1163
|
+
* Picks the sibling with the closest `row` to the current node so
|
|
1164
|
+
* navigation feels spatially continuous in the vertical layout.
|
|
1165
|
+
*/
|
|
1166
|
+
private _moveByDepth(step: number): boolean {
|
|
1167
|
+
const cur = this.cachedLayout[this.focusedIndex];
|
|
1168
|
+
if (!cur) return true;
|
|
1169
|
+
const targetCol = cur.col + step;
|
|
1170
|
+
const candidates = this.cachedLayout
|
|
1171
|
+
.map((n, i) => ({ n, i }))
|
|
1172
|
+
.filter(({ n }) => n.col === targetCol);
|
|
1173
|
+
if (candidates.length === 0) return true;
|
|
1174
|
+
let best = candidates[0]!;
|
|
1175
|
+
let bestDist = Math.abs(best.n.row - cur.row);
|
|
1176
|
+
for (const c of candidates) {
|
|
1177
|
+
const d = Math.abs(c.n.row - cur.row);
|
|
1178
|
+
if (d < bestDist) {
|
|
1179
|
+
best = c;
|
|
1180
|
+
bestDist = d;
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
this.focusedIndex = best.i;
|
|
1184
|
+
return true;
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
/**
|
|
1188
|
+
* Move focus to the next sibling at the same depth (←/→). Clamps
|
|
1189
|
+
* at the band edges — no wrap, so the user always knows when they
|
|
1190
|
+
* hit a boundary.
|
|
1191
|
+
*/
|
|
1192
|
+
private _moveBySibling(step: number): boolean {
|
|
1193
|
+
const cur = this.cachedLayout[this.focusedIndex];
|
|
1194
|
+
if (!cur) return true;
|
|
1195
|
+
const siblings = this.cachedLayout
|
|
1196
|
+
.map((n, i) => ({ n, i }))
|
|
1197
|
+
.filter(({ n }) => n.col === cur.col)
|
|
1198
|
+
.sort((a, b) => a.n.row - b.n.row);
|
|
1199
|
+
const pos = siblings.findIndex(({ i }) => i === this.focusedIndex);
|
|
1200
|
+
if (pos === -1) return true;
|
|
1201
|
+
const next = siblings[pos + step];
|
|
1202
|
+
if (!next) return true;
|
|
1203
|
+
this.focusedIndex = next.i;
|
|
1204
|
+
return true;
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1207
|
+
// ---- test seams ----
|
|
1208
|
+
get _focusedIndex(): number {
|
|
1209
|
+
return this.focusedIndex;
|
|
1210
|
+
}
|
|
1211
|
+
get _switcherOpen(): boolean {
|
|
1212
|
+
return this.switcherOpen;
|
|
1213
|
+
}
|
|
1214
|
+
get _switcherState(): SwitcherState {
|
|
1215
|
+
return this.switcherState;
|
|
1216
|
+
}
|
|
1217
|
+
}
|