codingbuddy 4.0.1 → 4.2.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/README.md +3 -3
- package/dist/api/mcp.js +1 -2
- package/dist/api/mcp.js.map +1 -1
- package/dist/src/agent/agent-prompt.builder.js.map +1 -1
- package/dist/src/agent/agent-summary.utils.d.ts +2 -1
- package/dist/src/agent/agent.service.d.ts +2 -1
- package/dist/src/agent/agent.service.js +49 -0
- package/dist/src/agent/agent.service.js.map +1 -1
- package/dist/src/agent/agent.types.d.ts +26 -0
- package/dist/src/agent/agent.types.js +2 -10
- package/dist/src/agent/agent.types.js.map +1 -1
- package/dist/src/analyzer/analyzer.service.js +2 -4
- package/dist/src/analyzer/analyzer.service.js.map +1 -1
- package/dist/src/analyzer/code.sampler.js +4 -9
- package/dist/src/analyzer/code.sampler.js.map +1 -1
- package/dist/src/analyzer/config.analyzer.js +3 -13
- package/dist/src/analyzer/config.analyzer.js.map +1 -1
- package/dist/src/analyzer/conventions.analyzer.js +3 -11
- package/dist/src/analyzer/conventions.analyzer.js.map +1 -1
- package/dist/src/analyzer/conventions.schemas.d.ts +0 -4
- package/dist/src/analyzer/conventions.schemas.js.map +1 -1
- package/dist/src/analyzer/conventions.types.d.ts +5 -7
- package/dist/src/analyzer/conventions.types.js.map +1 -1
- package/dist/src/analyzer/directory.analyzer.d.ts +1 -1
- package/dist/src/analyzer/directory.analyzer.js +5 -23
- package/dist/src/analyzer/directory.analyzer.js.map +1 -1
- package/dist/src/analyzer/package.analyzer.js +1 -3
- package/dist/src/analyzer/package.analyzer.js.map +1 -1
- package/dist/src/app.module.js +2 -0
- package/dist/src/app.module.js.map +1 -1
- package/dist/src/checklist/checklist.schema.d.ts +2 -1
- package/dist/src/checklist/checklist.schema.js.map +1 -1
- package/dist/src/checklist/checklist.service.js.map +1 -1
- package/dist/src/checklist/checklist.types.js +1 -6
- package/dist/src/checklist/checklist.types.js.map +1 -1
- package/dist/src/cli/cli.d.ts +1 -2
- package/dist/src/cli/cli.js +9 -1
- package/dist/src/cli/cli.js.map +1 -1
- package/dist/src/cli/init/claude-settings.utils.d.ts +14 -0
- package/dist/src/cli/init/claude-settings.utils.js +74 -0
- package/dist/src/cli/init/claude-settings.utils.js.map +1 -0
- package/dist/src/cli/init/config.generator.d.ts +0 -2
- package/dist/src/cli/init/config.generator.js +0 -2
- package/dist/src/cli/init/config.generator.js.map +1 -1
- package/dist/src/cli/init/config.writer.d.ts +0 -1
- package/dist/src/cli/init/config.writer.js +0 -1
- package/dist/src/cli/init/config.writer.js.map +1 -1
- package/dist/src/cli/init/index.d.ts +2 -2
- package/dist/src/cli/init/index.js.map +1 -1
- package/dist/src/cli/init/init.command.js +13 -8
- package/dist/src/cli/init/init.command.js.map +1 -1
- package/dist/src/cli/init/init.constants.d.ts +1 -0
- package/dist/src/cli/init/init.constants.js +12 -2
- package/dist/src/cli/init/init.constants.js.map +1 -1
- package/dist/src/cli/init/init.wizard.d.ts +2 -1
- package/dist/src/cli/init/init.wizard.js +3 -8
- package/dist/src/cli/init/init.wizard.js.map +1 -1
- package/dist/src/cli/init/prompt.builder.js.map +1 -1
- package/dist/src/cli/init/prompts/basic-prompt.js.map +1 -1
- package/dist/src/cli/init/prompts/index.d.ts +3 -3
- package/dist/src/cli/init/prompts/index.js.map +1 -1
- package/dist/src/cli/init/prompts/language-prompt.js +1 -3
- package/dist/src/cli/init/prompts/language-prompt.js.map +1 -1
- package/dist/src/cli/init/prompts/model-prompt.js.map +1 -1
- package/dist/src/cli/init/prompts/tech-stack-prompt.js.map +1 -1
- package/dist/src/cli/init/prompts/test-strategy-prompt.js.map +1 -1
- package/dist/src/cli/init/summary/index.d.ts +1 -1
- package/dist/src/cli/init/summary/index.js.map +1 -1
- package/dist/src/cli/init/templates/config-renderer.js.map +1 -1
- package/dist/src/cli/init/templates/index.d.ts +1 -1
- package/dist/src/cli/init/templates/index.js.map +1 -1
- package/dist/src/cli/init/templates/template.renderer.js.map +1 -1
- package/dist/src/cli/init/templates/template.selector.js.map +1 -1
- package/dist/src/cli/run-tui.d.ts +1 -0
- package/dist/src/cli/run-tui.js +67 -0
- package/dist/src/cli/run-tui.js.map +1 -0
- package/dist/src/config/config-diff.service.js +6 -7
- package/dist/src/config/config-diff.service.js.map +1 -1
- package/dist/src/config/config.loader.d.ts +0 -2
- package/dist/src/config/config.loader.js +1 -5
- package/dist/src/config/config.loader.js.map +1 -1
- package/dist/src/config/config.schema.d.ts +0 -16
- package/dist/src/config/config.schema.js +8 -10
- package/dist/src/config/config.schema.js.map +1 -1
- package/dist/src/config/config.service.js +1 -4
- package/dist/src/config/config.service.js.map +1 -1
- package/dist/src/config/context.loader.js.map +1 -1
- package/dist/src/config/ignore.parser.js.map +1 -1
- package/dist/src/config/index.d.ts +2 -2
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/context/context-document.service.js +3 -1
- package/dist/src/context/context-document.service.js.map +1 -1
- package/dist/src/context/context-document.types.d.ts +2 -8
- package/dist/src/context/context-document.types.js +10 -16
- package/dist/src/context/context-document.types.js.map +1 -1
- package/dist/src/context/context-parser.utils.d.ts +1 -9
- package/dist/src/context/context-parser.utils.js +2 -39
- package/dist/src/context/context-parser.utils.js.map +1 -1
- package/dist/src/context/context-serializer.utils.js +1 -2
- package/dist/src/context/context-serializer.utils.js.map +1 -1
- package/dist/src/context/context.service.js +4 -16
- package/dist/src/context/context.service.js.map +1 -1
- package/dist/src/context/context.types.js +3 -17
- package/dist/src/context/context.types.js.map +1 -1
- package/dist/src/custom/custom.service.js.map +1 -1
- package/dist/src/diagnostic/diagnostic-log.service.js +1 -3
- package/dist/src/diagnostic/diagnostic-log.service.js.map +1 -1
- package/dist/src/keyword/activation-message.builder.js +2 -6
- package/dist/src/keyword/activation-message.builder.js.map +1 -1
- package/dist/src/keyword/auto-executor.js +1 -3
- package/dist/src/keyword/auto-executor.js.map +1 -1
- package/dist/src/keyword/auto-executor.types.js.map +1 -1
- package/dist/src/keyword/auto-formatter.js +2 -3
- package/dist/src/keyword/auto-formatter.js.map +1 -1
- package/dist/src/keyword/auto-prompt-builder.js +1 -3
- package/dist/src/keyword/auto-prompt-builder.js.map +1 -1
- package/dist/src/keyword/complexity-classifier.js +3 -7
- package/dist/src/keyword/complexity-classifier.js.map +1 -1
- package/dist/src/keyword/complexity-indicators.js.map +1 -1
- package/dist/src/keyword/keyword.module.js +1 -6
- package/dist/src/keyword/keyword.module.js.map +1 -1
- package/dist/src/keyword/keyword.service.d.ts +1 -0
- package/dist/src/keyword/keyword.service.js +29 -26
- package/dist/src/keyword/keyword.service.js.map +1 -1
- package/dist/src/keyword/keyword.types.d.ts +17 -4
- package/dist/src/keyword/keyword.types.js +2 -10
- package/dist/src/keyword/keyword.types.js.map +1 -1
- package/dist/src/keyword/patterns/devops.patterns.d.ts +2 -0
- package/dist/src/keyword/patterns/devops.patterns.js +56 -0
- package/dist/src/keyword/patterns/devops.patterns.js.map +1 -0
- package/dist/src/keyword/patterns/frontend.patterns.d.ts +2 -0
- package/dist/src/keyword/patterns/frontend.patterns.js +76 -0
- package/dist/src/keyword/patterns/frontend.patterns.js.map +1 -0
- package/dist/src/keyword/patterns/index.d.ts +1 -1
- package/dist/src/keyword/patterns/index.js.map +1 -1
- package/dist/src/keyword/patterns/intent-pattern-checks.js +12 -0
- package/dist/src/keyword/patterns/intent-pattern-checks.js.map +1 -1
- package/dist/src/keyword/primary-agent-resolver.d.ts +1 -1
- package/dist/src/keyword/primary-agent-resolver.js +2 -1
- package/dist/src/keyword/primary-agent-resolver.js.map +1 -1
- package/dist/src/keyword/rule-filter.js.map +1 -1
- package/dist/src/keyword/srp-template.d.ts +0 -2
- package/dist/src/keyword/srp-template.js +0 -2
- package/dist/src/keyword/srp-template.js.map +1 -1
- package/dist/src/keyword/strategies/__tests__/strategy-test.utils.js.map +1 -1
- package/dist/src/keyword/strategies/act-agent.strategy.js +14 -5
- package/dist/src/keyword/strategies/act-agent.strategy.js.map +1 -1
- package/dist/src/keyword/strategies/eval-agent.strategy.js.map +1 -1
- package/dist/src/keyword/strategies/plan-agent.strategy.js.map +1 -1
- package/dist/src/keyword/strategies/resolution-strategy.interface.d.ts +1 -0
- package/dist/src/main.js +174 -1
- package/dist/src/main.js.map +1 -1
- package/dist/src/mcp/handlers/agent.handler.d.ts +1 -0
- package/dist/src/mcp/handlers/agent.handler.js +78 -5
- package/dist/src/mcp/handlers/agent.handler.js.map +1 -1
- package/dist/src/mcp/handlers/config.handler.js.map +1 -1
- package/dist/src/mcp/handlers/context-document.handler.js +13 -20
- package/dist/src/mcp/handlers/context-document.handler.js.map +1 -1
- package/dist/src/mcp/handlers/conventions.handler.js.map +1 -1
- package/dist/src/mcp/handlers/mode.handler.d.ts +4 -1
- package/dist/src/mcp/handlers/mode.handler.js +58 -5
- package/dist/src/mcp/handlers/mode.handler.js.map +1 -1
- package/dist/src/mcp/handlers/skill.handler.js +1 -3
- package/dist/src/mcp/handlers/skill.handler.js.map +1 -1
- package/dist/src/mcp/mcp-serverless.d.ts +1 -13
- package/dist/src/mcp/mcp-serverless.js +24 -206
- package/dist/src/mcp/mcp-serverless.js.map +1 -1
- package/dist/src/mcp/mcp.controller.d.ts +6 -2
- package/dist/src/mcp/mcp.controller.js +38 -9
- package/dist/src/mcp/mcp.controller.js.map +1 -1
- package/dist/src/mcp/mcp.module.js +2 -0
- package/dist/src/mcp/mcp.module.js.map +1 -1
- package/dist/src/mcp/mcp.service.d.ts +7 -1
- package/dist/src/mcp/mcp.service.js +55 -24
- package/dist/src/mcp/mcp.service.js.map +1 -1
- package/dist/src/mcp/sse-auth.guard.d.ts +6 -0
- package/dist/src/mcp/sse-auth.guard.js +53 -0
- package/dist/src/mcp/sse-auth.guard.js.map +1 -0
- package/dist/src/model/model.resolver.js.map +1 -1
- package/dist/src/rules/agent.schema.js.map +1 -1
- package/dist/src/rules/rules-content.utils.js.map +1 -1
- package/dist/src/rules/rules.service.d.ts +1 -3
- package/dist/src/rules/rules.service.js +43 -102
- package/dist/src/rules/rules.service.js.map +1 -1
- package/dist/src/rules/rules.types.d.ts +3 -2
- package/dist/src/rules/skill.schema.d.ts +0 -5
- package/dist/src/rules/skill.schema.js +3 -3
- package/dist/src/rules/skill.schema.js.map +1 -1
- package/dist/src/shared/async.utils.d.ts +3 -2
- package/dist/src/shared/async.utils.js.map +1 -1
- package/dist/src/shared/esm-import.d.ts +1 -0
- package/dist/src/shared/esm-import.js +17 -0
- package/dist/src/shared/esm-import.js.map +1 -0
- package/dist/src/shared/file.utils.d.ts +3 -2
- package/dist/src/shared/file.utils.js +1 -2
- package/dist/src/shared/file.utils.js.map +1 -1
- package/dist/src/shared/filesystem.interface.d.ts +0 -10
- package/dist/src/shared/filesystem.interface.js +1 -10
- package/dist/src/shared/filesystem.interface.js.map +1 -1
- package/dist/src/shared/format.utils.js.map +1 -1
- package/dist/src/shared/keyword-core.d.ts +10 -0
- package/dist/src/shared/keyword-core.js +97 -0
- package/dist/src/shared/keyword-core.js.map +1 -0
- package/dist/src/shared/language.service.js.map +1 -1
- package/dist/src/shared/language.types.d.ts +2 -1
- package/dist/src/shared/lru-cache.d.ts +2 -6
- package/dist/src/shared/path.utils.d.ts +0 -1
- package/dist/src/shared/path.utils.js +1 -3
- package/dist/src/shared/path.utils.js.map +1 -1
- package/dist/src/shared/pattern-matcher.d.ts +2 -1
- package/dist/src/shared/pattern-matcher.js.map +1 -1
- package/dist/src/shared/rules-core.d.ts +28 -0
- package/dist/src/shared/rules-core.js +167 -0
- package/dist/src/shared/rules-core.js.map +1 -0
- package/dist/src/shared/security.utils.d.ts +4 -3
- package/dist/src/shared/security.utils.js +1 -2
- package/dist/src/shared/security.utils.js.map +1 -1
- package/dist/src/shared/slug.utils.js.map +1 -1
- package/dist/src/shared/tui-bundle-path.d.ts +1 -0
- package/dist/src/shared/tui-bundle-path.js +8 -0
- package/dist/src/shared/tui-bundle-path.js.map +1 -0
- package/dist/src/shared/validation.constants.d.ts +3 -3
- package/dist/src/shared/validation.constants.js +9 -6
- package/dist/src/shared/validation.constants.js.map +1 -1
- package/dist/src/shared/verbosity.types.d.ts +2 -1
- package/dist/src/shared/verbosity.types.js +1 -2
- package/dist/src/shared/verbosity.types.js.map +1 -1
- package/dist/src/skill/i18n/keywords.js +44 -318
- package/dist/src/skill/i18n/keywords.js.map +1 -1
- package/dist/src/skill/i18n/keywords.types.js.map +1 -1
- package/dist/src/skill/skill-content.utils.d.ts +0 -1
- package/dist/src/skill/skill-content.utils.js +5 -7
- package/dist/src/skill/skill-content.utils.js.map +1 -1
- package/dist/src/skill/skill-recommendation.service.js.map +1 -1
- package/dist/src/skill/skill-triggers.js.map +1 -1
- package/dist/src/state/state.service.js.map +1 -1
- package/dist/src/tui/__perf__/memory-stability.spec.d.ts +1 -0
- package/dist/src/tui/__perf__/memory-stability.spec.js +105 -0
- package/dist/src/tui/__perf__/memory-stability.spec.js.map +1 -0
- package/dist/src/tui/__perf__/rendering-performance.spec.d.ts +1 -0
- package/dist/src/tui/__perf__/rendering-performance.spec.js +166 -0
- package/dist/src/tui/__perf__/rendering-performance.spec.js.map +1 -0
- package/dist/src/tui/cli-flags.d.ts +1 -0
- package/dist/src/tui/cli-flags.js +7 -0
- package/dist/src/tui/cli-flags.js.map +1 -0
- package/dist/src/tui/components/ActivityVisualizer.d.ts +10 -0
- package/dist/src/tui/components/ActivityVisualizer.js +22 -0
- package/dist/src/tui/components/ActivityVisualizer.js.map +1 -0
- package/dist/src/tui/components/ActivityVisualizer.spec.d.ts +1 -0
- package/dist/src/tui/components/ActivityVisualizer.spec.js +45 -0
- package/dist/src/tui/components/ActivityVisualizer.spec.js.map +1 -0
- package/dist/src/tui/components/ContextSection.d.ts +7 -0
- package/dist/src/tui/components/ContextSection.js +24 -0
- package/dist/src/tui/components/ContextSection.js.map +1 -0
- package/dist/src/tui/components/FlowMap.d.ts +12 -0
- package/dist/src/tui/components/FlowMap.js +55 -0
- package/dist/src/tui/components/FlowMap.js.map +1 -0
- package/dist/src/tui/components/FlowMap.spec.d.ts +1 -0
- package/dist/src/tui/components/FlowMap.spec.js +59 -0
- package/dist/src/tui/components/FlowMap.spec.js.map +1 -0
- package/dist/src/tui/components/FocusedAgentPanel.d.ts +19 -0
- package/dist/src/tui/components/FocusedAgentPanel.js +74 -0
- package/dist/src/tui/components/FocusedAgentPanel.js.map +1 -0
- package/dist/src/tui/components/FocusedAgentPanel.spec.d.ts +1 -0
- package/dist/src/tui/components/FocusedAgentPanel.spec.js +140 -0
- package/dist/src/tui/components/FocusedAgentPanel.spec.js.map +1 -0
- package/dist/src/tui/components/HeaderBar.d.ts +12 -0
- package/dist/src/tui/components/HeaderBar.js +55 -0
- package/dist/src/tui/components/HeaderBar.js.map +1 -0
- package/dist/src/tui/components/HeaderBar.spec.d.ts +1 -0
- package/dist/src/tui/components/HeaderBar.spec.js +78 -0
- package/dist/src/tui/components/HeaderBar.spec.js.map +1 -0
- package/dist/src/tui/components/SessionTabBar.d.ts +9 -0
- package/dist/src/tui/components/SessionTabBar.js +15 -0
- package/dist/src/tui/components/SessionTabBar.js.map +1 -0
- package/dist/src/tui/components/SessionTabBar.spec.d.ts +1 -0
- package/dist/src/tui/components/SessionTabBar.spec.js +59 -0
- package/dist/src/tui/components/SessionTabBar.spec.js.map +1 -0
- package/dist/src/tui/components/StageHealthBar.d.ts +10 -0
- package/dist/src/tui/components/StageHealthBar.js +63 -0
- package/dist/src/tui/components/StageHealthBar.js.map +1 -0
- package/dist/src/tui/components/StageHealthBar.spec.d.ts +1 -0
- package/dist/src/tui/components/StageHealthBar.spec.js +63 -0
- package/dist/src/tui/components/StageHealthBar.spec.js.map +1 -0
- package/dist/src/tui/components/activity-visualizer.pure.d.ts +9 -0
- package/dist/src/tui/components/activity-visualizer.pure.js +70 -0
- package/dist/src/tui/components/activity-visualizer.pure.js.map +1 -0
- package/dist/src/tui/components/context-section.pure.d.ts +3 -0
- package/dist/src/tui/components/context-section.pure.js +38 -0
- package/dist/src/tui/components/context-section.pure.js.map +1 -0
- package/dist/src/tui/components/flow-map.pure.d.ts +26 -0
- package/dist/src/tui/components/flow-map.pure.js +263 -0
- package/dist/src/tui/components/flow-map.pure.js.map +1 -0
- package/dist/src/tui/components/focused-agent.pure.d.ts +23 -0
- package/dist/src/tui/components/focused-agent.pure.js +87 -0
- package/dist/src/tui/components/focused-agent.pure.js.map +1 -0
- package/dist/src/tui/components/grid-layout.pure.d.ts +2 -0
- package/dist/src/tui/components/grid-layout.pure.js +50 -0
- package/dist/src/tui/components/grid-layout.pure.js.map +1 -0
- package/dist/src/tui/components/header-bar.pure.d.ts +1 -0
- package/dist/src/tui/components/header-bar.pure.js +9 -0
- package/dist/src/tui/components/header-bar.pure.js.map +1 -0
- package/dist/src/tui/components/index.d.ts +12 -0
- package/dist/src/tui/components/index.js +38 -0
- package/dist/src/tui/components/index.js.map +1 -0
- package/dist/src/tui/components/session-tab-bar.pure.d.ts +9 -0
- package/dist/src/tui/components/session-tab-bar.pure.js +45 -0
- package/dist/src/tui/components/session-tab-bar.pure.js.map +1 -0
- package/dist/src/tui/components/stage-health.pure.d.ts +4 -0
- package/dist/src/tui/components/stage-health.pure.js +59 -0
- package/dist/src/tui/components/stage-health.pure.js.map +1 -0
- package/dist/src/tui/dashboard-app.d.ts +8 -0
- package/dist/src/tui/dashboard-app.js +43 -0
- package/dist/src/tui/dashboard-app.js.map +1 -0
- package/dist/src/tui/dashboard-app.spec.d.ts +1 -0
- package/dist/src/tui/dashboard-app.spec.js +136 -0
- package/dist/src/tui/dashboard-app.spec.js.map +1 -0
- package/dist/src/tui/dashboard-types.d.ts +88 -0
- package/dist/src/tui/dashboard-types.js +32 -0
- package/dist/src/tui/dashboard-types.js.map +1 -0
- package/dist/src/tui/ensure-tui-ready.d.ts +3 -0
- package/dist/src/tui/ensure-tui-ready.js +39 -0
- package/dist/src/tui/ensure-tui-ready.js.map +1 -0
- package/dist/src/tui/eventbus-ui.integration.spec.d.ts +1 -0
- package/dist/src/tui/eventbus-ui.integration.spec.js +573 -0
- package/dist/src/tui/eventbus-ui.integration.spec.js.map +1 -0
- package/dist/src/tui/events/agent-metadata.service.d.ts +16 -0
- package/dist/src/tui/events/agent-metadata.service.js +80 -0
- package/dist/src/tui/events/agent-metadata.service.js.map +1 -0
- package/dist/src/tui/events/agent-metadata.types.d.ts +11 -0
- package/dist/src/tui/events/agent-metadata.types.js +59 -0
- package/dist/src/tui/events/agent-metadata.types.js.map +1 -0
- package/dist/src/tui/events/event-bus.d.ts +13 -0
- package/dist/src/tui/events/event-bus.js +42 -0
- package/dist/src/tui/events/event-bus.js.map +1 -0
- package/dist/src/tui/events/events.module.d.ts +2 -0
- package/dist/src/tui/events/events.module.js +25 -0
- package/dist/src/tui/events/events.module.js.map +1 -0
- package/dist/src/tui/events/index.d.ts +7 -0
- package/dist/src/tui/events/index.js +19 -0
- package/dist/src/tui/events/index.js.map +1 -0
- package/dist/src/tui/events/parse-agent.d.ts +2 -0
- package/dist/src/tui/events/parse-agent.js +85 -0
- package/dist/src/tui/events/parse-agent.js.map +1 -0
- package/dist/src/tui/events/parse-tool-response.d.ts +1 -0
- package/dist/src/tui/events/parse-tool-response.js +24 -0
- package/dist/src/tui/events/parse-tool-response.js.map +1 -0
- package/dist/src/tui/events/response-event-extractor.d.ts +27 -0
- package/dist/src/tui/events/response-event-extractor.js +224 -0
- package/dist/src/tui/events/response-event-extractor.js.map +1 -0
- package/dist/src/tui/events/tui-interceptor.d.ts +16 -0
- package/dist/src/tui/events/tui-interceptor.js +160 -0
- package/dist/src/tui/events/tui-interceptor.js.map +1 -0
- package/dist/src/tui/events/types.d.ts +95 -0
- package/dist/src/tui/events/types.js +19 -0
- package/dist/src/tui/events/types.js.map +1 -0
- package/dist/src/tui/hooks/index.d.ts +8 -0
- package/dist/src/tui/hooks/index.js +17 -0
- package/dist/src/tui/hooks/index.js.map +1 -0
- package/dist/src/tui/hooks/use-clock.d.ts +1 -0
- package/dist/src/tui/hooks/use-clock.js +16 -0
- package/dist/src/tui/hooks/use-clock.js.map +1 -0
- package/dist/src/tui/hooks/use-clock.spec.d.ts +1 -0
- package/dist/src/tui/hooks/use-clock.spec.js +43 -0
- package/dist/src/tui/hooks/use-clock.spec.js.map +1 -0
- package/dist/src/tui/hooks/use-dashboard-state.d.ts +46 -0
- package/dist/src/tui/hooks/use-dashboard-state.js +249 -0
- package/dist/src/tui/hooks/use-dashboard-state.js.map +1 -0
- package/dist/src/tui/hooks/use-focus-agent.d.ts +2 -0
- package/dist/src/tui/hooks/use-focus-agent.js +26 -0
- package/dist/src/tui/hooks/use-focus-agent.js.map +1 -0
- package/dist/src/tui/hooks/use-multi-session-state.d.ts +16 -0
- package/dist/src/tui/hooks/use-multi-session-state.js +163 -0
- package/dist/src/tui/hooks/use-multi-session-state.js.map +1 -0
- package/dist/src/tui/hooks/use-terminal-size.d.ts +9 -0
- package/dist/src/tui/hooks/use-terminal-size.js +31 -0
- package/dist/src/tui/hooks/use-terminal-size.js.map +1 -0
- package/dist/src/tui/index.d.ts +20 -0
- package/dist/src/tui/index.js +43 -0
- package/dist/src/tui/index.js.map +1 -0
- package/dist/src/tui/ipc/index.d.ts +12 -0
- package/dist/src/tui/ipc/index.js +24 -0
- package/dist/src/tui/ipc/index.js.map +1 -0
- package/dist/src/tui/ipc/instance-registry.d.ts +12 -0
- package/dist/src/tui/ipc/instance-registry.js +81 -0
- package/dist/src/tui/ipc/instance-registry.js.map +1 -0
- package/dist/src/tui/ipc/ipc-bridge.d.ts +11 -0
- package/dist/src/tui/ipc/ipc-bridge.js +33 -0
- package/dist/src/tui/ipc/ipc-bridge.js.map +1 -0
- package/dist/src/tui/ipc/ipc-client.d.ts +21 -0
- package/dist/src/tui/ipc/ipc-client.js +102 -0
- package/dist/src/tui/ipc/ipc-client.js.map +1 -0
- package/dist/src/tui/ipc/ipc-debug.d.ts +1 -0
- package/dist/src/tui/ipc/ipc-debug.js +11 -0
- package/dist/src/tui/ipc/ipc-debug.js.map +1 -0
- package/dist/src/tui/ipc/ipc-server.d.ts +15 -0
- package/dist/src/tui/ipc/ipc-server.js +98 -0
- package/dist/src/tui/ipc/ipc-server.js.map +1 -0
- package/dist/src/tui/ipc/ipc-state-cache.d.ts +17 -0
- package/dist/src/tui/ipc/ipc-state-cache.js +69 -0
- package/dist/src/tui/ipc/ipc-state-cache.js.map +1 -0
- package/dist/src/tui/ipc/ipc.types.d.ts +19 -0
- package/dist/src/tui/ipc/ipc.types.js +45 -0
- package/dist/src/tui/ipc/ipc.types.js.map +1 -0
- package/dist/src/tui/ipc/multi-session-manager.d.ts +39 -0
- package/dist/src/tui/ipc/multi-session-manager.js +143 -0
- package/dist/src/tui/ipc/multi-session-manager.js.map +1 -0
- package/dist/src/tui/ipc/shutdown-manager.d.ts +7 -0
- package/dist/src/tui/ipc/shutdown-manager.js +32 -0
- package/dist/src/tui/ipc/shutdown-manager.js.map +1 -0
- package/dist/src/tui/ipc/test-utils.d.ts +2 -0
- package/dist/src/tui/ipc/test-utils.js +20 -0
- package/dist/src/tui/ipc/test-utils.js.map +1 -0
- package/dist/src/tui/ipc/tui-auto-launcher.d.ts +22 -0
- package/dist/src/tui/ipc/tui-auto-launcher.js +113 -0
- package/dist/src/tui/ipc/tui-auto-launcher.js.map +1 -0
- package/dist/src/tui/multi-session-app.d.ts +6 -0
- package/dist/src/tui/multi-session-app.js +55 -0
- package/dist/src/tui/multi-session-app.js.map +1 -0
- package/dist/src/tui/multi-session-app.spec.d.ts +1 -0
- package/dist/src/tui/multi-session-app.spec.js +95 -0
- package/dist/src/tui/multi-session-app.spec.js.map +1 -0
- package/dist/src/tui/transport-tui.integration.spec.d.ts +1 -0
- package/dist/src/tui/transport-tui.integration.spec.js +189 -0
- package/dist/src/tui/transport-tui.integration.spec.js.map +1 -0
- package/dist/src/tui/tui-config.d.ts +12 -0
- package/dist/src/tui/tui-config.js +32 -0
- package/dist/src/tui/tui-config.js.map +1 -0
- package/dist/src/tui/types.d.ts +22 -0
- package/dist/src/tui/types.js +37 -0
- package/dist/src/tui/types.js.map +1 -0
- package/dist/src/tui/utils/color-buffer.d.ts +31 -0
- package/dist/src/tui/utils/color-buffer.js +86 -0
- package/dist/src/tui/utils/color-buffer.js.map +1 -0
- package/dist/src/tui/utils/colors.d.ts +5 -0
- package/dist/src/tui/utils/colors.js +35 -0
- package/dist/src/tui/utils/colors.js.map +1 -0
- package/dist/src/tui/utils/display-width.d.ts +3 -0
- package/dist/src/tui/utils/display-width.js +45 -0
- package/dist/src/tui/utils/display-width.js.map +1 -0
- package/dist/src/tui/utils/edge-router.d.ts +9 -0
- package/dist/src/tui/utils/edge-router.js +65 -0
- package/dist/src/tui/utils/edge-router.js.map +1 -0
- package/dist/src/tui/utils/icons.d.ts +7 -0
- package/dist/src/tui/utils/icons.js +49 -0
- package/dist/src/tui/utils/icons.js.map +1 -0
- package/dist/src/tui/utils/index.d.ts +6 -0
- package/dist/src/tui/utils/index.js +36 -0
- package/dist/src/tui/utils/index.js.map +1 -0
- package/dist/src/tui/utils/theme.d.ts +50 -0
- package/dist/src/tui/utils/theme.js +128 -0
- package/dist/src/tui/utils/theme.js.map +1 -0
- package/dist/src/tui-bundle.mjs +5755 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +16 -6
- package/dist/src/shared/token-counter.d.ts +0 -13
- package/dist/src/shared/token-counter.js +0 -41
- package/dist/src/shared/token-counter.js.map +0 -1
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const react_1 = require("react");
|
|
4
|
+
const vitest_1 = require("vitest");
|
|
5
|
+
const ink_testing_library_1 = require("ink-testing-library");
|
|
6
|
+
const SessionTabBar_1 = require("./SessionTabBar");
|
|
7
|
+
function makeTab(overrides) {
|
|
8
|
+
return {
|
|
9
|
+
pid: overrides.index * 1000,
|
|
10
|
+
projectName: `project-${overrides.index}`,
|
|
11
|
+
globalState: 'IDLE',
|
|
12
|
+
isActive: false,
|
|
13
|
+
...overrides,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
(0, vitest_1.describe)('tui/components/SessionTabBar', () => {
|
|
17
|
+
(0, vitest_1.it)('should render nothing for a single session', () => {
|
|
18
|
+
const sessions = [makeTab({ index: 1, isActive: true })];
|
|
19
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(SessionTabBar_1.SessionTabBar, { sessions: sessions, width: 120, layoutMode: "wide" }));
|
|
20
|
+
(0, vitest_1.expect)(lastFrame()).toBe('');
|
|
21
|
+
});
|
|
22
|
+
(0, vitest_1.it)('should render tab indicators and project names for multiple sessions', () => {
|
|
23
|
+
const sessions = [
|
|
24
|
+
makeTab({ index: 1, projectName: 'my-app', isActive: true }),
|
|
25
|
+
makeTab({ index: 2, projectName: 'api-server', isActive: false }),
|
|
26
|
+
];
|
|
27
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(SessionTabBar_1.SessionTabBar, { sessions: sessions, width: 120, layoutMode: "wide" }));
|
|
28
|
+
const frame = lastFrame() ?? '';
|
|
29
|
+
(0, vitest_1.expect)(frame).toContain('[1]');
|
|
30
|
+
(0, vitest_1.expect)(frame).toContain('[2]');
|
|
31
|
+
(0, vitest_1.expect)(frame).toContain('my-app');
|
|
32
|
+
(0, vitest_1.expect)(frame).toContain('api-server');
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)('should contain status icons for multiple sessions', () => {
|
|
35
|
+
const sessions = [
|
|
36
|
+
makeTab({ index: 1, globalState: 'RUNNING', isActive: true }),
|
|
37
|
+
makeTab({ index: 2, globalState: 'IDLE', isActive: false }),
|
|
38
|
+
];
|
|
39
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(SessionTabBar_1.SessionTabBar, { sessions: sessions, width: 120, layoutMode: "wide" }));
|
|
40
|
+
const frame = lastFrame() ?? '';
|
|
41
|
+
(0, vitest_1.expect)(frame).toContain('●');
|
|
42
|
+
(0, vitest_1.expect)(frame).toContain('○');
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.it)('should render compact counter in narrow layout', () => {
|
|
45
|
+
const sessions = [
|
|
46
|
+
makeTab({ index: 1, isActive: true }),
|
|
47
|
+
makeTab({ index: 2, isActive: false }),
|
|
48
|
+
makeTab({ index: 3, isActive: false }),
|
|
49
|
+
];
|
|
50
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(SessionTabBar_1.SessionTabBar, { sessions: sessions, width: 60, layoutMode: "narrow" }));
|
|
51
|
+
const frame = lastFrame() ?? '';
|
|
52
|
+
(0, vitest_1.expect)(frame).toContain('(1/3)');
|
|
53
|
+
});
|
|
54
|
+
(0, vitest_1.it)('should render nothing for zero sessions', () => {
|
|
55
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(SessionTabBar_1.SessionTabBar, { sessions: [], width: 120, layoutMode: "wide" }));
|
|
56
|
+
(0, vitest_1.expect)(lastFrame()).toBe('');
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=SessionTabBar.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionTabBar.spec.js","sourceRoot":"","sources":["../../../../src/tui/components/SessionTabBar.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { StageStats } from '../dashboard-types';
|
|
3
|
+
import type { Mode } from '../types';
|
|
4
|
+
export interface StageHealthBarProps {
|
|
5
|
+
stageHealth: Record<Mode, StageStats>;
|
|
6
|
+
bottlenecks: string[];
|
|
7
|
+
toolCount: number;
|
|
8
|
+
width: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function StageHealthBar({ stageHealth, bottlenecks, toolCount, width, }: StageHealthBarProps): React.ReactElement;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StageHealthBar = StageHealthBar;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const ink_1 = require("ink");
|
|
6
|
+
const theme_1 = require("../utils/theme");
|
|
7
|
+
function StageStatDisplay({ mode, stats, }) {
|
|
8
|
+
const color = (0, theme_1.getModeColor)(mode);
|
|
9
|
+
const parts = [];
|
|
10
|
+
if (stats.running > 0)
|
|
11
|
+
parts.push(react_1.default.createElement(ink_1.Text, { key: "r", color: "green" },
|
|
12
|
+
' ',
|
|
13
|
+
"\u25CF ",
|
|
14
|
+
stats.running,
|
|
15
|
+
" running"));
|
|
16
|
+
if (stats.blocked > 0)
|
|
17
|
+
parts.push(react_1.default.createElement(ink_1.Text, { key: "b", color: "yellow" },
|
|
18
|
+
' ',
|
|
19
|
+
"\u23F8 ",
|
|
20
|
+
stats.blocked,
|
|
21
|
+
" blocked"));
|
|
22
|
+
if (stats.waiting > 0)
|
|
23
|
+
parts.push(react_1.default.createElement(ink_1.Text, { key: "w", dimColor: true },
|
|
24
|
+
' ',
|
|
25
|
+
"\u25CB ",
|
|
26
|
+
stats.waiting,
|
|
27
|
+
" waiting"));
|
|
28
|
+
if (stats.done > 0)
|
|
29
|
+
parts.push(react_1.default.createElement(ink_1.Text, { key: "d", color: "green" },
|
|
30
|
+
' ',
|
|
31
|
+
"\u2713 ",
|
|
32
|
+
stats.done));
|
|
33
|
+
if (stats.error > 0)
|
|
34
|
+
parts.push(react_1.default.createElement(ink_1.Text, { key: "e", color: "red", bold: true },
|
|
35
|
+
' ',
|
|
36
|
+
"! ",
|
|
37
|
+
stats.error,
|
|
38
|
+
" err"));
|
|
39
|
+
if (parts.length === 0)
|
|
40
|
+
parts.push(react_1.default.createElement(ink_1.Text, { key: "idle", dimColor: true },
|
|
41
|
+
' ',
|
|
42
|
+
"idle"));
|
|
43
|
+
return (react_1.default.createElement(ink_1.Box, null,
|
|
44
|
+
react_1.default.createElement(ink_1.Text, { color: color, bold: true },
|
|
45
|
+
mode,
|
|
46
|
+
":"),
|
|
47
|
+
parts));
|
|
48
|
+
}
|
|
49
|
+
function StageHealthBar({ stageHealth, bottlenecks, toolCount, width, }) {
|
|
50
|
+
const countStr = toolCount >= 1000 ? `${Math.round(toolCount / 1000)}k` : String(toolCount);
|
|
51
|
+
return (react_1.default.createElement(ink_1.Box, { borderStyle: "double", borderColor: theme_1.BORDER_COLORS.panel, width: width, flexDirection: "column" },
|
|
52
|
+
react_1.default.createElement(ink_1.Box, null,
|
|
53
|
+
react_1.default.createElement(ink_1.Box, { gap: 2 }, ['PLAN', 'ACT', 'EVAL'].map(mode => (react_1.default.createElement(StageStatDisplay, { key: mode, mode: mode, stats: stageHealth[mode] })))),
|
|
54
|
+
react_1.default.createElement(ink_1.Box, { flexGrow: 1 }),
|
|
55
|
+
react_1.default.createElement(ink_1.Box, { gap: 2 },
|
|
56
|
+
bottlenecks.length > 0 && (react_1.default.createElement(ink_1.Text, { color: "red", bold: true },
|
|
57
|
+
"\u26A1 Bottlenecks: ",
|
|
58
|
+
bottlenecks.join(' / '))),
|
|
59
|
+
react_1.default.createElement(ink_1.Text, { dimColor: true },
|
|
60
|
+
"tools: ",
|
|
61
|
+
countStr)))));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=StageHealthBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StageHealthBar.js","sourceRoot":"","sources":["../../../../src/tui/components/StageHealthBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const react_1 = require("react");
|
|
4
|
+
const vitest_1 = require("vitest");
|
|
5
|
+
const ink_testing_library_1 = require("ink-testing-library");
|
|
6
|
+
const StageHealthBar_1 = require("./StageHealthBar");
|
|
7
|
+
const dashboard_types_1 = require("../dashboard-types");
|
|
8
|
+
function makeHealth() {
|
|
9
|
+
return {
|
|
10
|
+
PLAN: { ...(0, dashboard_types_1.createEmptyStageStats)(), running: 1, done: 5 },
|
|
11
|
+
ACT: { ...(0, dashboard_types_1.createEmptyStageStats)(), running: 2, waiting: 1 },
|
|
12
|
+
EVAL: { ...(0, dashboard_types_1.createEmptyStageStats)(), error: 1 },
|
|
13
|
+
AUTO: (0, dashboard_types_1.createEmptyStageStats)(),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
(0, vitest_1.describe)('tui/components/StageHealthBar', () => {
|
|
17
|
+
(0, vitest_1.it)('should render stage names with colors', () => {
|
|
18
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(StageHealthBar_1.StageHealthBar, { stageHealth: makeHealth(), bottlenecks: [], toolCount: 128000, width: 120 }));
|
|
19
|
+
const frame = lastFrame() ?? '';
|
|
20
|
+
(0, vitest_1.expect)(frame).toContain('PLAN:');
|
|
21
|
+
(0, vitest_1.expect)(frame).toContain('ACT:');
|
|
22
|
+
(0, vitest_1.expect)(frame).toContain('EVAL:');
|
|
23
|
+
});
|
|
24
|
+
(0, vitest_1.it)('should render running/done/error stats', () => {
|
|
25
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(StageHealthBar_1.StageHealthBar, { stageHealth: makeHealth(), bottlenecks: [], toolCount: 0, width: 120 }));
|
|
26
|
+
const frame = lastFrame() ?? '';
|
|
27
|
+
(0, vitest_1.expect)(frame).toContain('running');
|
|
28
|
+
(0, vitest_1.expect)(frame).toContain('err');
|
|
29
|
+
});
|
|
30
|
+
(0, vitest_1.it)('should render tool count', () => {
|
|
31
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(StageHealthBar_1.StageHealthBar, { stageHealth: makeHealth(), bottlenecks: [], toolCount: 64000, width: 120 }));
|
|
32
|
+
(0, vitest_1.expect)(lastFrame()).toContain('64k');
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)('should render bottlenecks', () => {
|
|
35
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(StageHealthBar_1.StageHealthBar, { stageHealth: makeHealth(), bottlenecks: ['tests failing(3)', 'lint errors'], toolCount: 0, width: 120 }));
|
|
36
|
+
const frame = lastFrame() ?? '';
|
|
37
|
+
(0, vitest_1.expect)(frame).toContain('tests failing');
|
|
38
|
+
(0, vitest_1.expect)(frame).toContain('Bottlenecks');
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.it)('should render in narrow mode', () => {
|
|
41
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(StageHealthBar_1.StageHealthBar, { stageHealth: makeHealth(), bottlenecks: ['long bottleneck description'], toolCount: 50000, width: 60 }));
|
|
42
|
+
(0, vitest_1.expect)(lastFrame()).toBeTruthy();
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.it)('should render with empty stats', () => {
|
|
45
|
+
const empty = {
|
|
46
|
+
PLAN: (0, dashboard_types_1.createEmptyStageStats)(),
|
|
47
|
+
ACT: (0, dashboard_types_1.createEmptyStageStats)(),
|
|
48
|
+
EVAL: (0, dashboard_types_1.createEmptyStageStats)(),
|
|
49
|
+
AUTO: (0, dashboard_types_1.createEmptyStageStats)(),
|
|
50
|
+
};
|
|
51
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(StageHealthBar_1.StageHealthBar, { stageHealth: empty, bottlenecks: [], toolCount: 0, width: 120 }));
|
|
52
|
+
const frame = lastFrame() ?? '';
|
|
53
|
+
(0, vitest_1.expect)(frame).toContain('PLAN:');
|
|
54
|
+
(0, vitest_1.expect)(frame).toContain('idle');
|
|
55
|
+
});
|
|
56
|
+
(0, vitest_1.it)('should render double border', () => {
|
|
57
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(StageHealthBar_1.StageHealthBar, { stageHealth: makeHealth(), bottlenecks: [], toolCount: 0, width: 120 }));
|
|
58
|
+
const frame = lastFrame() ?? '';
|
|
59
|
+
(0, vitest_1.expect)(frame).toContain('╔');
|
|
60
|
+
(0, vitest_1.expect)(frame).toContain('╝');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=StageHealthBar.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StageHealthBar.spec.js","sourceRoot":"","sources":["../../../../src/tui/components/StageHealthBar.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ToolCallRecord } from '../dashboard-types';
|
|
2
|
+
import type { Mode } from '../types';
|
|
3
|
+
export interface BarChartItem {
|
|
4
|
+
tool: string;
|
|
5
|
+
count: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function aggregateForBarChart(calls: ToolCallRecord[], maxTools?: number): BarChartItem[];
|
|
8
|
+
export declare function renderBarChart(data: BarChartItem[], width: number, height: number): string[];
|
|
9
|
+
export declare function renderLiveContext(calls: ToolCallRecord[], currentMode: Mode | null, width: number, height: number, now?: number): string[];
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.aggregateForBarChart = aggregateForBarChart;
|
|
4
|
+
exports.renderBarChart = renderBarChart;
|
|
5
|
+
exports.renderLiveContext = renderLiveContext;
|
|
6
|
+
const display_width_1 = require("../utils/display-width");
|
|
7
|
+
function aggregateForBarChart(calls, maxTools = 10) {
|
|
8
|
+
if (calls.length === 0)
|
|
9
|
+
return [];
|
|
10
|
+
const toolCounts = new Map();
|
|
11
|
+
for (const call of calls) {
|
|
12
|
+
toolCounts.set(call.toolName, (toolCounts.get(call.toolName) ?? 0) + 1);
|
|
13
|
+
}
|
|
14
|
+
return [...toolCounts.entries()]
|
|
15
|
+
.sort((a, b) => b[1] - a[1])
|
|
16
|
+
.slice(0, maxTools)
|
|
17
|
+
.map(([tool, count]) => ({ tool, count }));
|
|
18
|
+
}
|
|
19
|
+
const TOOL_NAME_WIDTH = 12;
|
|
20
|
+
const BAR_FIXED_OVERHEAD = TOOL_NAME_WIDTH + 2 + 2 + 4;
|
|
21
|
+
function renderBarChart(data, width, height) {
|
|
22
|
+
if (data.length === 0 || height <= 0 || width <= 0)
|
|
23
|
+
return [];
|
|
24
|
+
const lines = [(0, display_width_1.truncateToDisplayWidth)('📊 Activity', width)];
|
|
25
|
+
const barWidth = Math.max(1, width - BAR_FIXED_OVERHEAD);
|
|
26
|
+
const maxCount = data[0]?.count || 1;
|
|
27
|
+
for (const item of data) {
|
|
28
|
+
if (lines.length >= height)
|
|
29
|
+
break;
|
|
30
|
+
const name = (0, display_width_1.padEndDisplayWidth)((0, display_width_1.truncateToDisplayWidth)(item.tool, TOOL_NAME_WIDTH), TOOL_NAME_WIDTH);
|
|
31
|
+
const filled = Math.round((item.count / maxCount) * barWidth);
|
|
32
|
+
const empty = barWidth - filled;
|
|
33
|
+
const bar = '█'.repeat(filled) + '░'.repeat(empty);
|
|
34
|
+
const countStr = String(item.count).padStart(4);
|
|
35
|
+
lines.push((0, display_width_1.truncateToDisplayWidth)(`${name} [${bar}] ${countStr}`, width));
|
|
36
|
+
}
|
|
37
|
+
return lines.slice(0, height);
|
|
38
|
+
}
|
|
39
|
+
const LIVE_AGENT_NAME_WIDTH = 15;
|
|
40
|
+
const LIVE_HOT_WINDOW_MS = 5_000;
|
|
41
|
+
const LIVE_RECENT_WINDOW_MS = 30_000;
|
|
42
|
+
const LIVE_HOT_SEC = LIVE_HOT_WINDOW_MS / 1000;
|
|
43
|
+
const LIVE_RECENT_SEC = LIVE_RECENT_WINDOW_MS / 1000;
|
|
44
|
+
function renderLiveContext(calls, currentMode, width, height, now) {
|
|
45
|
+
const currentTime = now ?? Date.now();
|
|
46
|
+
if (height <= 0 || width <= 0)
|
|
47
|
+
return [];
|
|
48
|
+
const lines = [(0, display_width_1.truncateToDisplayWidth)('💬 Live', width)];
|
|
49
|
+
if (currentMode) {
|
|
50
|
+
lines.push((0, display_width_1.truncateToDisplayWidth)(`⟫ Mode: ${currentMode}`, width));
|
|
51
|
+
}
|
|
52
|
+
const maxItems = height - lines.length;
|
|
53
|
+
const seen = new Set();
|
|
54
|
+
for (let i = calls.length - 1; i >= 0 && seen.size < maxItems; i--) {
|
|
55
|
+
const call = calls[i];
|
|
56
|
+
if (call.status === 'error')
|
|
57
|
+
continue;
|
|
58
|
+
if (seen.has(call.toolName))
|
|
59
|
+
continue;
|
|
60
|
+
seen.add(call.toolName);
|
|
61
|
+
const ageSec = Math.floor((currentTime - call.timestamp) / 1000);
|
|
62
|
+
const ageIndicator = ageSec < LIVE_HOT_SEC ? '◉' : ageSec < LIVE_RECENT_SEC ? '○' : '·';
|
|
63
|
+
const agent = call.agentId !== 'unknown'
|
|
64
|
+
? (0, display_width_1.truncateToDisplayWidth)(call.agentId, LIVE_AGENT_NAME_WIDTH) + ' '
|
|
65
|
+
: '';
|
|
66
|
+
lines.push((0, display_width_1.truncateToDisplayWidth)(`${ageIndicator} ${agent}${call.toolName}`, width));
|
|
67
|
+
}
|
|
68
|
+
return lines.slice(0, height);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=activity-visualizer.pure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-visualizer.pure.js","sourceRoot":"","sources":["../../../../src/tui/components/activity-visualizer.pure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare function formatContextDecisions(decisions: string[], maxItems?: number): string | null;
|
|
2
|
+
export declare function formatContextNotes(notes: string[], maxItems?: number): string | null;
|
|
3
|
+
export declare function formatContextSection(decisions: string[], notes: string[]): string | null;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatContextDecisions = formatContextDecisions;
|
|
4
|
+
exports.formatContextNotes = formatContextNotes;
|
|
5
|
+
exports.formatContextSection = formatContextSection;
|
|
6
|
+
function formatContextDecisions(decisions, maxItems = 5) {
|
|
7
|
+
if (decisions.length === 0)
|
|
8
|
+
return null;
|
|
9
|
+
const visible = decisions.slice(0, maxItems);
|
|
10
|
+
const lines = visible.map((d, i) => ` ${i + 1}. ${d}`);
|
|
11
|
+
if (decisions.length > maxItems) {
|
|
12
|
+
lines.push(` ⋯ (+${decisions.length - maxItems} more)`);
|
|
13
|
+
}
|
|
14
|
+
return lines.join('\n');
|
|
15
|
+
}
|
|
16
|
+
function formatContextNotes(notes, maxItems = 5) {
|
|
17
|
+
if (notes.length === 0)
|
|
18
|
+
return null;
|
|
19
|
+
const visible = notes.slice(0, maxItems);
|
|
20
|
+
const lines = visible.map(n => ` › ${n}`);
|
|
21
|
+
if (notes.length > maxItems) {
|
|
22
|
+
lines.push(` ⋯ (+${notes.length - maxItems} more)`);
|
|
23
|
+
}
|
|
24
|
+
return lines.join('\n');
|
|
25
|
+
}
|
|
26
|
+
function formatContextSection(decisions, notes) {
|
|
27
|
+
const decStr = formatContextDecisions(decisions);
|
|
28
|
+
const noteStr = formatContextNotes(notes);
|
|
29
|
+
if (!decStr && !noteStr)
|
|
30
|
+
return null;
|
|
31
|
+
const parts = [];
|
|
32
|
+
if (decStr)
|
|
33
|
+
parts.push(decStr);
|
|
34
|
+
if (noteStr)
|
|
35
|
+
parts.push(noteStr);
|
|
36
|
+
return parts.join('\n');
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=context-section.pure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-section.pure.js","sourceRoot":"","sources":["../../../../src/tui/components/context-section.pure.ts"],"names":[],"mappings":";;AASA,wDAQC;AAMD,gDAQC;AAMD,oDAQC;AApCD,SAAgB,sBAAsB,CAAC,SAAmB,EAAE,QAAQ,GAAG,CAAC;IACtE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxD,IAAI,SAAS,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,MAAM,GAAG,QAAQ,QAAQ,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAMD,SAAgB,kBAAkB,CAAC,KAAe,EAAE,QAAQ,GAAG,CAAC;IAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,GAAG,QAAQ,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAMD,SAAgB,oBAAoB,CAAC,SAAmB,EAAE,KAAe;IACvE,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ColorBuffer } from '../utils/color-buffer';
|
|
2
|
+
import type { DashboardNode, Edge } from '../dashboard-types';
|
|
3
|
+
import type { Mode } from '../types';
|
|
4
|
+
interface StageColumn {
|
|
5
|
+
startX: number;
|
|
6
|
+
width: number;
|
|
7
|
+
label: Mode;
|
|
8
|
+
}
|
|
9
|
+
interface NodePosition {
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function layoutStageColumns(totalWidth: number, hasAutoAgents?: boolean): Record<Mode, StageColumn>;
|
|
16
|
+
export declare function layoutAgentNodes(agents: Map<string, DashboardNode>, columns: Record<Mode, StageColumn>): Map<string, NodePosition>;
|
|
17
|
+
export declare function buildProgressBar(value: number, barWidth: number): {
|
|
18
|
+
filled: number;
|
|
19
|
+
empty: number;
|
|
20
|
+
label: string;
|
|
21
|
+
};
|
|
22
|
+
export declare function renderPipelineHeader(buf: ColorBuffer, width: number, activeStage: Mode | null, hasAutoAgents?: boolean): void;
|
|
23
|
+
export declare function renderFlowMap(agents: Map<string, DashboardNode>, edges: Edge[], width: number, height: number, activeStage?: Mode | null): ColorBuffer;
|
|
24
|
+
export declare function renderFlowMapSimplified(agents: Map<string, DashboardNode>, width: number, height: number): ColorBuffer;
|
|
25
|
+
export declare function renderFlowMapCompact(agents: Map<string, DashboardNode>): string;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.layoutStageColumns = layoutStageColumns;
|
|
4
|
+
exports.layoutAgentNodes = layoutAgentNodes;
|
|
5
|
+
exports.buildProgressBar = buildProgressBar;
|
|
6
|
+
exports.renderPipelineHeader = renderPipelineHeader;
|
|
7
|
+
exports.renderFlowMap = renderFlowMap;
|
|
8
|
+
exports.renderFlowMapSimplified = renderFlowMapSimplified;
|
|
9
|
+
exports.renderFlowMapCompact = renderFlowMapCompact;
|
|
10
|
+
const color_buffer_1 = require("../utils/color-buffer");
|
|
11
|
+
const edge_router_1 = require("../utils/edge-router");
|
|
12
|
+
const theme_1 = require("../utils/theme");
|
|
13
|
+
const NODE_WIDTH = 17;
|
|
14
|
+
const NODE_HEIGHT = 4;
|
|
15
|
+
const STAGE_ORDER = ['PLAN', 'ACT', 'EVAL', 'AUTO'];
|
|
16
|
+
const STAGE_SLOT_WIDTH = 8;
|
|
17
|
+
const PIPELINE_RIGHT_MARGIN = 10;
|
|
18
|
+
function groupByStage(agents) {
|
|
19
|
+
const byStage = new Map();
|
|
20
|
+
for (const agent of agents.values()) {
|
|
21
|
+
const list = byStage.get(agent.stage) ?? [];
|
|
22
|
+
list.push(agent);
|
|
23
|
+
byStage.set(agent.stage, list);
|
|
24
|
+
}
|
|
25
|
+
return byStage;
|
|
26
|
+
}
|
|
27
|
+
function sortAgents(agents) {
|
|
28
|
+
return [...agents].sort((a, b) => {
|
|
29
|
+
if (a.isPrimary !== b.isPrimary)
|
|
30
|
+
return a.isPrimary ? -1 : 1;
|
|
31
|
+
return a.name.localeCompare(b.name);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function layoutStageColumns(totalWidth, hasAutoAgents = false) {
|
|
35
|
+
if (hasAutoAgents) {
|
|
36
|
+
const colWidth = Math.floor(totalWidth / 4);
|
|
37
|
+
return {
|
|
38
|
+
PLAN: { startX: 0, width: colWidth, label: 'PLAN' },
|
|
39
|
+
ACT: { startX: colWidth, width: colWidth, label: 'ACT' },
|
|
40
|
+
EVAL: { startX: colWidth * 2, width: colWidth, label: 'EVAL' },
|
|
41
|
+
AUTO: { startX: colWidth * 3, width: totalWidth - colWidth * 3, label: 'AUTO' },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const colWidth = Math.floor(totalWidth / 3);
|
|
45
|
+
return {
|
|
46
|
+
PLAN: { startX: 0, width: colWidth, label: 'PLAN' },
|
|
47
|
+
ACT: { startX: colWidth, width: colWidth, label: 'ACT' },
|
|
48
|
+
EVAL: {
|
|
49
|
+
startX: colWidth * 2,
|
|
50
|
+
width: totalWidth - colWidth * 2,
|
|
51
|
+
label: 'EVAL',
|
|
52
|
+
},
|
|
53
|
+
AUTO: { startX: 0, width: totalWidth, label: 'AUTO' },
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function layoutAgentNodes(agents, columns) {
|
|
57
|
+
const positions = new Map();
|
|
58
|
+
const byStage = groupByStage(agents);
|
|
59
|
+
for (const [stage, stageAgents] of byStage) {
|
|
60
|
+
const col = columns[stage];
|
|
61
|
+
if (!col)
|
|
62
|
+
continue;
|
|
63
|
+
const sorted = sortAgents(stageAgents);
|
|
64
|
+
const startY = 3;
|
|
65
|
+
sorted.forEach((agent, idx) => {
|
|
66
|
+
positions.set(agent.id, {
|
|
67
|
+
x: col.startX + Math.floor((col.width - NODE_WIDTH) / 2),
|
|
68
|
+
y: startY + idx * (NODE_HEIGHT + 1),
|
|
69
|
+
width: NODE_WIDTH,
|
|
70
|
+
height: NODE_HEIGHT,
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return positions;
|
|
75
|
+
}
|
|
76
|
+
function getNodeTextStyle(status) {
|
|
77
|
+
if (status === 'running')
|
|
78
|
+
return { fg: 'white', bold: true };
|
|
79
|
+
return { dim: true };
|
|
80
|
+
}
|
|
81
|
+
function drawAgentNode(buf, x, y, boxW, agent) {
|
|
82
|
+
const borderStyle = (0, theme_1.getStatusStyle)(agent.status);
|
|
83
|
+
if (agent.isPrimary) {
|
|
84
|
+
buf.drawDoubleBox(x, y, boxW, NODE_HEIGHT, borderStyle);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
buf.drawRoundBox(x, y, boxW, NODE_HEIGHT, borderStyle);
|
|
88
|
+
}
|
|
89
|
+
const icon = theme_1.STATUS_ICONS[agent.status];
|
|
90
|
+
const maxNameLen = Math.max(1, boxW - 5);
|
|
91
|
+
const nameStr = agent.name.length > maxNameLen ? agent.name.slice(0, maxNameLen - 3) + '...' : agent.name;
|
|
92
|
+
buf.writeText(x + 2, y + 1, nameStr, getNodeTextStyle(agent.status));
|
|
93
|
+
buf.writeText(x + 2 + nameStr.length + 1, y + 1, icon, theme_1.STATUS_STYLES[agent.status]);
|
|
94
|
+
const barWidth = boxW - 4;
|
|
95
|
+
const bar = buildProgressBar(agent.progress, barWidth);
|
|
96
|
+
const filledStr = theme_1.PROGRESS_BAR_CHARS.filled.repeat(bar.filled);
|
|
97
|
+
const emptyStr = theme_1.PROGRESS_BAR_CHARS.empty.repeat(bar.empty);
|
|
98
|
+
buf.writeText(x + 2, y + 2, filledStr, theme_1.PROGRESS_BAR_STYLES.filled);
|
|
99
|
+
if (bar.empty > 0) {
|
|
100
|
+
buf.writeText(x + 2 + bar.filled, y + 2, emptyStr, theme_1.PROGRESS_BAR_STYLES.empty);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function buildProgressBar(value, barWidth) {
|
|
104
|
+
const clamped = Math.max(0, Math.min(100, value));
|
|
105
|
+
const filled = Math.round((clamped / 100) * barWidth);
|
|
106
|
+
const empty = barWidth - filled;
|
|
107
|
+
const label = clamped === 100 ? '100' : clamped.toString().padStart(2, ' ') + '%';
|
|
108
|
+
return { filled, empty, label };
|
|
109
|
+
}
|
|
110
|
+
function drawGlow(buf, x, y, w, h, style) {
|
|
111
|
+
for (let i = x - 1; i <= x + w; i++) {
|
|
112
|
+
buf.setChar(i, y - 1, '░', style);
|
|
113
|
+
}
|
|
114
|
+
for (let i = x - 1; i <= x + w; i++) {
|
|
115
|
+
buf.setChar(i, y + h, '░', style);
|
|
116
|
+
}
|
|
117
|
+
for (let j = y - 1; j <= y + h; j++) {
|
|
118
|
+
buf.setChar(x - 1, j, '░', style);
|
|
119
|
+
buf.setChar(x + w, j, '░', style);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function countByStatus(agents) {
|
|
123
|
+
const counts = {
|
|
124
|
+
running: 0,
|
|
125
|
+
idle: 0,
|
|
126
|
+
blocked: 0,
|
|
127
|
+
error: 0,
|
|
128
|
+
done: 0,
|
|
129
|
+
};
|
|
130
|
+
for (const agent of agents.values()) {
|
|
131
|
+
counts[agent.status]++;
|
|
132
|
+
}
|
|
133
|
+
return counts;
|
|
134
|
+
}
|
|
135
|
+
function renderPipelineHeader(buf, width, activeStage, hasAutoAgents = false) {
|
|
136
|
+
const stages = hasAutoAgents ? STAGE_ORDER : STAGE_ORDER.filter(s => s !== 'AUTO');
|
|
137
|
+
let x = 1;
|
|
138
|
+
for (let i = 0; i < stages.length; i++) {
|
|
139
|
+
const stage = stages[i];
|
|
140
|
+
const isActive = stage === activeStage;
|
|
141
|
+
const stageStyle = isActive
|
|
142
|
+
? theme_1.STAGE_LABEL_STYLES[stage]
|
|
143
|
+
: { fg: theme_1.STAGE_LABEL_STYLES[stage].fg, dim: true };
|
|
144
|
+
buf.setChar(x, 0, '▸', isActive ? theme_1.PIPELINE_STYLES.arrow : theme_1.PIPELINE_STYLES.connector);
|
|
145
|
+
x += 2;
|
|
146
|
+
buf.writeText(x, 0, stage, stageStyle);
|
|
147
|
+
x += stage.length;
|
|
148
|
+
if (i < stages.length - 1) {
|
|
149
|
+
x += 1;
|
|
150
|
+
const connLen = Math.max(3, Math.floor((width - stages.length * STAGE_SLOT_WIDTH) / (stages.length - 1)));
|
|
151
|
+
const safeLen = Math.max(0, Math.min(connLen, width - x - PIPELINE_RIGHT_MARGIN));
|
|
152
|
+
for (let j = 0; j < safeLen; j++) {
|
|
153
|
+
buf.setChar(x + j, 0, '═', theme_1.PIPELINE_STYLES.connector);
|
|
154
|
+
}
|
|
155
|
+
x += safeLen;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
buf.drawHLine(1, 1, width - 2, '┄', { fg: 'gray', dim: true });
|
|
159
|
+
}
|
|
160
|
+
function renderFlowMap(agents, edges, width, height, activeStage = null) {
|
|
161
|
+
let hasAutoAgents = false;
|
|
162
|
+
for (const a of agents.values()) {
|
|
163
|
+
if (a.stage === 'AUTO') {
|
|
164
|
+
hasAutoAgents = true;
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const buf = new color_buffer_1.ColorBuffer(width, height);
|
|
169
|
+
const columns = layoutStageColumns(width, hasAutoAgents);
|
|
170
|
+
const positions = layoutAgentNodes(agents, columns);
|
|
171
|
+
renderPipelineHeader(buf, width, activeStage, hasAutoAgents);
|
|
172
|
+
for (const [id, pos] of positions) {
|
|
173
|
+
const agent = agents.get(id);
|
|
174
|
+
if (!agent)
|
|
175
|
+
continue;
|
|
176
|
+
if (agent.status === 'running' && agent.isPrimary) {
|
|
177
|
+
drawGlow(buf, pos.x, pos.y, pos.width, pos.height, theme_1.GLOW_STYLE);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
for (const [id, pos] of positions) {
|
|
181
|
+
const agent = agents.get(id);
|
|
182
|
+
if (!agent)
|
|
183
|
+
continue;
|
|
184
|
+
drawAgentNode(buf, pos.x, pos.y, pos.width, agent);
|
|
185
|
+
}
|
|
186
|
+
for (const edge of edges) {
|
|
187
|
+
const fromPos = positions.get(edge.from);
|
|
188
|
+
const toPos = positions.get(edge.to);
|
|
189
|
+
if (!fromPos || !toPos)
|
|
190
|
+
continue;
|
|
191
|
+
const fromPoint = {
|
|
192
|
+
x: fromPos.x + fromPos.width,
|
|
193
|
+
y: fromPos.y + Math.floor(fromPos.height / 2),
|
|
194
|
+
};
|
|
195
|
+
const toPoint = {
|
|
196
|
+
x: toPos.x - 1,
|
|
197
|
+
y: toPos.y + Math.floor(toPos.height / 2),
|
|
198
|
+
};
|
|
199
|
+
const path = (0, edge_router_1.computeEdgePath)(fromPoint, toPoint);
|
|
200
|
+
for (const seg of path) {
|
|
201
|
+
const isArrow = seg.char === '▸' || seg.char === '◂' || seg.char === '▾' || seg.char === '▴';
|
|
202
|
+
buf.setChar(seg.x, seg.y, seg.char, isArrow ? theme_1.EDGE_STYLES.arrow : theme_1.EDGE_STYLES.path);
|
|
203
|
+
}
|
|
204
|
+
const labelPos = (0, edge_router_1.computeLabelPosition)(path, edge.label);
|
|
205
|
+
if (labelPos) {
|
|
206
|
+
buf.writeText(labelPos.x, labelPos.y - 1, edge.label, theme_1.EDGE_STYLES.label);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const counts = countByStatus(agents);
|
|
210
|
+
const legendY = height - 1;
|
|
211
|
+
let lx = 1;
|
|
212
|
+
const legendParts = [
|
|
213
|
+
{ text: `● ${counts.running} active`, style: theme_1.STATUS_STYLES.running },
|
|
214
|
+
{ text: ` ○ ${counts.idle} idle`, style: theme_1.STATUS_STYLES.idle },
|
|
215
|
+
{ text: ` ⏸ ${counts.blocked} blocked`, style: theme_1.STATUS_STYLES.blocked },
|
|
216
|
+
{ text: ` ! ${counts.error} error`, style: theme_1.STATUS_STYLES.error },
|
|
217
|
+
{ text: ` ✓ ${counts.done} done`, style: theme_1.STATUS_STYLES.done },
|
|
218
|
+
];
|
|
219
|
+
for (const part of legendParts) {
|
|
220
|
+
buf.writeText(lx, legendY, part.text, part.style);
|
|
221
|
+
lx += part.text.length;
|
|
222
|
+
}
|
|
223
|
+
return buf;
|
|
224
|
+
}
|
|
225
|
+
function renderFlowMapSimplified(agents, width, height) {
|
|
226
|
+
const buf = new color_buffer_1.ColorBuffer(width, height);
|
|
227
|
+
const byStage = groupByStage(agents);
|
|
228
|
+
let y = 0;
|
|
229
|
+
for (const stage of STAGE_ORDER) {
|
|
230
|
+
const stageAgents = byStage.get(stage);
|
|
231
|
+
if (!stageAgents || stageAgents.length === 0)
|
|
232
|
+
continue;
|
|
233
|
+
buf.writeText(1, y, stage, theme_1.STAGE_LABEL_STYLES[stage]);
|
|
234
|
+
y++;
|
|
235
|
+
const sorted = sortAgents(stageAgents);
|
|
236
|
+
for (const agent of sorted) {
|
|
237
|
+
if (y >= height - 1)
|
|
238
|
+
break;
|
|
239
|
+
const boxW = Math.min(width - 2, NODE_WIDTH);
|
|
240
|
+
drawAgentNode(buf, 1, y, boxW, agent);
|
|
241
|
+
y += NODE_HEIGHT + 1;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return buf;
|
|
245
|
+
}
|
|
246
|
+
function renderFlowMapCompact(agents) {
|
|
247
|
+
const lines = [];
|
|
248
|
+
const byStage = groupByStage(agents);
|
|
249
|
+
for (const stage of STAGE_ORDER) {
|
|
250
|
+
const stageAgents = byStage.get(stage);
|
|
251
|
+
if (!stageAgents)
|
|
252
|
+
continue;
|
|
253
|
+
const sorted = sortAgents(stageAgents);
|
|
254
|
+
for (const agent of sorted) {
|
|
255
|
+
const icon = theme_1.STATUS_ICONS[agent.status];
|
|
256
|
+
const star = agent.isPrimary ? '★ ' : '';
|
|
257
|
+
const progress = agent.progress > 0 ? ` ${agent.progress}%` : '';
|
|
258
|
+
lines.push(`${icon} ${star}${agent.name} (${stage})${progress}`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return lines.join('\n');
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=flow-map.pure.js.map
|