codingbuddy 4.1.0 → 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/dist/src/agent/agent-summary.utils.d.ts +2 -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/checklist/checklist.schema.d.ts +2 -1
- package/dist/src/cli/cli.d.ts +0 -1
- package/dist/src/cli/cli.js +0 -1
- package/dist/src/cli/cli.js.map +1 -1
- package/dist/src/cli/init/claude-settings.utils.d.ts +2 -1
- 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/init.constants.js +1 -0
- 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/run-tui.d.ts +0 -2
- package/dist/src/cli/run-tui.js +19 -57
- package/dist/src/cli/run-tui.js.map +1 -1
- package/dist/src/config/config.loader.d.ts +0 -2
- package/dist/src/config/config.loader.js +0 -2
- 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 +7 -7
- package/dist/src/config/config.schema.js.map +1 -1
- package/dist/src/context/context-document.types.d.ts +0 -8
- package/dist/src/context/context-document.types.js +9 -9
- 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 +0 -36
- package/dist/src/context/context-parser.utils.js.map +1 -1
- package/dist/src/keyword/keyword.service.js +5 -1
- package/dist/src/keyword/keyword.service.js.map +1 -1
- package/dist/src/keyword/keyword.types.d.ts +0 -4
- package/dist/src/keyword/keyword.types.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/main.js +30 -9
- package/dist/src/main.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/file.utils.d.ts +3 -2
- 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/keyword-core.d.ts +2 -1
- package/dist/src/shared/keyword-core.js +3 -1
- package/dist/src/shared/keyword-core.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 +0 -1
- package/dist/src/shared/path.utils.js.map +1 -1
- package/dist/src/shared/pattern-matcher.d.ts +2 -1
- package/dist/src/shared/rules-core.d.ts +3 -2
- package/dist/src/shared/security.utils.d.ts +4 -3
- package/dist/src/shared/validation.constants.d.ts +2 -3
- package/dist/src/shared/validation.constants.js +3 -3
- package/dist/src/shared/validation.constants.js.map +1 -1
- package/dist/src/shared/verbosity.types.d.ts +2 -1
- package/dist/src/skill/skill-content.utils.d.ts +0 -1
- package/dist/src/skill/skill-content.utils.js +4 -4
- package/dist/src/skill/skill-content.utils.js.map +1 -1
- package/dist/src/tui/__perf__/memory-stability.spec.js +8 -8
- package/dist/src/tui/__perf__/memory-stability.spec.js.map +1 -1
- package/dist/src/tui/__perf__/rendering-performance.spec.js +9 -9
- package/dist/src/tui/__perf__/rendering-performance.spec.js.map +1 -1
- 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.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.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.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.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.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.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.pure.js → header-bar.pure.js} +1 -7
- package/dist/src/tui/components/header-bar.pure.js.map +1 -0
- package/dist/src/tui/components/index.d.ts +12 -15
- package/dist/src/tui/components/index.js +35 -49
- package/dist/src/tui/components/index.js.map +1 -1
- 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.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/eventbus-ui.integration.spec.js +132 -167
- package/dist/src/tui/eventbus-ui.integration.spec.js.map +1 -1
- package/dist/src/tui/events/event-bus.js +1 -1
- package/dist/src/tui/events/event-bus.js.map +1 -1
- package/dist/src/tui/events/index.d.ts +1 -1
- package/dist/src/tui/events/index.js.map +1 -1
- package/dist/src/tui/events/parse-agent.js +2 -1
- package/dist/src/tui/events/parse-agent.js.map +1 -1
- package/dist/src/tui/events/response-event-extractor.d.ts +16 -1
- package/dist/src/tui/events/response-event-extractor.js +154 -1
- package/dist/src/tui/events/response-event-extractor.js.map +1 -1
- package/dist/src/tui/events/tui-interceptor.d.ts +3 -0
- package/dist/src/tui/events/tui-interceptor.js +67 -7
- package/dist/src/tui/events/tui-interceptor.js.map +1 -1
- package/dist/src/tui/events/types.d.ts +46 -2
- package/dist/src/tui/events/types.js +6 -0
- package/dist/src/tui/events/types.js.map +1 -1
- package/dist/src/tui/hooks/index.d.ts +7 -4
- package/dist/src/tui/hooks/index.js +12 -7
- package/dist/src/tui/hooks/index.js.map +1 -1
- package/dist/src/tui/hooks/use-clock.js +3 -3
- package/dist/src/tui/hooks/use-clock.js.map +1 -1
- 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 +12 -4
- package/dist/src/tui/index.js +18 -7
- package/dist/src/tui/index.js.map +1 -1
- package/dist/src/tui/ipc/index.d.ts +5 -2
- package/dist/src/tui/ipc/index.js +5 -5
- package/dist/src/tui/ipc/index.js.map +1 -1
- package/dist/src/tui/ipc/ipc-state-cache.d.ts +1 -0
- package/dist/src/tui/ipc/ipc-state-cache.js +7 -0
- package/dist/src/tui/ipc/ipc-state-cache.js.map +1 -1
- 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/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.js +95 -0
- package/dist/src/tui/multi-session-app.spec.js.map +1 -0
- package/dist/src/tui/transport-tui.integration.spec.js +15 -15
- package/dist/src/tui/transport-tui.integration.spec.js.map +1 -1
- package/dist/src/tui/tui-config.d.ts +3 -2
- package/dist/src/tui/types.d.ts +1 -1
- package/dist/src/tui/types.js +3 -0
- package/dist/src/tui/types.js.map +1 -1
- 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.js.map +1 -1
- 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/index.d.ts +3 -1
- package/dist/src/tui/utils/index.js +21 -4
- package/dist/src/tui/utils/index.js.map +1 -1
- 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 +9 -9
- 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
- package/dist/src/tui/app.d.ts +0 -6
- package/dist/src/tui/app.js +0 -20
- package/dist/src/tui/app.js.map +0 -1
- package/dist/src/tui/app.spec.js +0 -226
- package/dist/src/tui/app.spec.js.map +0 -1
- package/dist/src/tui/components/AgentCard.d.ts +0 -6
- package/dist/src/tui/components/AgentCard.js +0 -18
- package/dist/src/tui/components/AgentCard.js.map +0 -1
- package/dist/src/tui/components/AgentCard.spec.js +0 -118
- package/dist/src/tui/components/AgentCard.spec.js.map +0 -1
- package/dist/src/tui/components/AgentGrid.d.ts +0 -7
- package/dist/src/tui/components/AgentGrid.js +0 -20
- package/dist/src/tui/components/AgentGrid.js.map +0 -1
- package/dist/src/tui/components/AgentGrid.spec.js +0 -52
- package/dist/src/tui/components/AgentGrid.spec.js.map +0 -1
- package/dist/src/tui/components/AgentTree.d.ts +0 -7
- package/dist/src/tui/components/AgentTree.js +0 -24
- package/dist/src/tui/components/AgentTree.js.map +0 -1
- package/dist/src/tui/components/AgentTree.spec.js +0 -146
- package/dist/src/tui/components/AgentTree.spec.js.map +0 -1
- package/dist/src/tui/components/CategoryRow.d.ts +0 -9
- package/dist/src/tui/components/CategoryRow.js +0 -15
- package/dist/src/tui/components/CategoryRow.js.map +0 -1
- package/dist/src/tui/components/CategoryRow.spec.js +0 -58
- package/dist/src/tui/components/CategoryRow.spec.js.map +0 -1
- package/dist/src/tui/components/Header.d.ts +0 -6
- package/dist/src/tui/components/Header.js +0 -18
- package/dist/src/tui/components/Header.js.map +0 -1
- package/dist/src/tui/components/Header.spec.js +0 -38
- package/dist/src/tui/components/Header.spec.js.map +0 -1
- package/dist/src/tui/components/ProgressBar.d.ts +0 -7
- package/dist/src/tui/components/ProgressBar.js +0 -12
- package/dist/src/tui/components/ProgressBar.js.map +0 -1
- package/dist/src/tui/components/ProgressBar.spec.js +0 -37
- package/dist/src/tui/components/ProgressBar.spec.js.map +0 -1
- package/dist/src/tui/components/StatusBar.d.ts +0 -8
- package/dist/src/tui/components/StatusBar.js +0 -29
- package/dist/src/tui/components/StatusBar.js.map +0 -1
- package/dist/src/tui/components/StatusBar.spec.js +0 -93
- package/dist/src/tui/components/StatusBar.spec.js.map +0 -1
- package/dist/src/tui/components/agent-card.pure.d.ts +0 -7
- package/dist/src/tui/components/agent-card.pure.js +0 -65
- package/dist/src/tui/components/agent-card.pure.js.map +0 -1
- package/dist/src/tui/components/agent-grid.pure.d.ts +0 -3
- package/dist/src/tui/components/agent-grid.pure.js +0 -35
- package/dist/src/tui/components/agent-grid.pure.js.map +0 -1
- package/dist/src/tui/components/agent-mini-card.pure.d.ts +0 -2
- package/dist/src/tui/components/agent-mini-card.pure.js +0 -17
- package/dist/src/tui/components/agent-mini-card.pure.js.map +0 -1
- package/dist/src/tui/components/agent-tree.pure.d.ts +0 -18
- package/dist/src/tui/components/agent-tree.pure.js +0 -41
- package/dist/src/tui/components/agent-tree.pure.js.map +0 -1
- package/dist/src/tui/components/category-row.pure.d.ts +0 -3
- package/dist/src/tui/components/category-row.pure.js +0 -26
- package/dist/src/tui/components/category-row.pure.js.map +0 -1
- package/dist/src/tui/components/header.pure.d.ts +0 -4
- package/dist/src/tui/components/header.pure.js.map +0 -1
- package/dist/src/tui/components/progress-bar.pure.d.ts +0 -2
- package/dist/src/tui/components/progress-bar.pure.js +0 -21
- package/dist/src/tui/components/progress-bar.pure.js.map +0 -1
- package/dist/src/tui/components/status-bar.pure.d.ts +0 -15
- package/dist/src/tui/components/status-bar.pure.js +0 -83
- package/dist/src/tui/components/status-bar.pure.js.map +0 -1
- package/dist/src/tui/hooks/use-agent-state.d.ts +0 -7
- package/dist/src/tui/hooks/use-agent-state.js +0 -13
- package/dist/src/tui/hooks/use-agent-state.js.map +0 -1
- package/dist/src/tui/hooks/use-agent-state.spec.d.ts +0 -1
- package/dist/src/tui/hooks/use-agent-state.spec.js +0 -167
- package/dist/src/tui/hooks/use-agent-state.spec.js.map +0 -1
- package/dist/src/tui/hooks/use-event-bus.d.ts +0 -34
- package/dist/src/tui/hooks/use-event-bus.js +0 -91
- package/dist/src/tui/hooks/use-event-bus.js.map +0 -1
- package/dist/src/tui/hooks/use-event-bus.spec.d.ts +0 -1
- package/dist/src/tui/hooks/use-event-bus.spec.js +0 -362
- package/dist/src/tui/hooks/use-event-bus.spec.js.map +0 -1
- package/dist/src/tui/utils/constants.d.ts +0 -3
- package/dist/src/tui/utils/constants.js +0 -15
- package/dist/src/tui/utils/constants.js.map +0 -1
- /package/dist/src/tui/{app.spec.d.ts → components/ActivityVisualizer.spec.d.ts} +0 -0
- /package/dist/src/tui/components/{AgentCard.spec.d.ts → FlowMap.spec.d.ts} +0 -0
- /package/dist/src/tui/components/{AgentGrid.spec.d.ts → FocusedAgentPanel.spec.d.ts} +0 -0
- /package/dist/src/tui/components/{AgentTree.spec.d.ts → HeaderBar.spec.d.ts} +0 -0
- /package/dist/src/tui/components/{CategoryRow.spec.d.ts → SessionTabBar.spec.d.ts} +0 -0
- /package/dist/src/tui/components/{Header.spec.d.ts → StageHealthBar.spec.d.ts} +0 -0
- /package/dist/src/tui/{components/ProgressBar.spec.d.ts → dashboard-app.spec.d.ts} +0 -0
- /package/dist/src/tui/{components/StatusBar.spec.d.ts → multi-session-app.spec.d.ts} +0 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TuiAutoLauncher = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const LINUX_TERMINAL_CANDIDATES = ['kitty', 'alacritty', 'gnome-terminal', 'xterm'];
|
|
6
|
+
const SAFE_PATH_PATTERN = /^[a-zA-Z0-9._\-/]+$/;
|
|
7
|
+
function escapeAppleScript(s) {
|
|
8
|
+
return s
|
|
9
|
+
.replace(/\\/g, '\\\\')
|
|
10
|
+
.replace(/"/g, '\\"')
|
|
11
|
+
.replace(/\r/g, '\\r')
|
|
12
|
+
.replace(/\n/g, '\\n')
|
|
13
|
+
.replace(/\t/g, '\\t');
|
|
14
|
+
}
|
|
15
|
+
class TuiAutoLauncher {
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.enabled = options.enabled;
|
|
18
|
+
this.delayMs = options.delayMs ?? 2000;
|
|
19
|
+
this.codingbuddyBin = options.codingbuddyBin ?? 'codingbuddy';
|
|
20
|
+
}
|
|
21
|
+
async launch(ipcServer) {
|
|
22
|
+
if (!this.enabled) {
|
|
23
|
+
return { launched: false, reason: 'disabled' };
|
|
24
|
+
}
|
|
25
|
+
if (this.delayMs > 0) {
|
|
26
|
+
await new Promise(resolve => setTimeout(resolve, this.delayMs));
|
|
27
|
+
}
|
|
28
|
+
if (ipcServer.clientCount() >= 1) {
|
|
29
|
+
return { launched: false, reason: 'client-already-connected' };
|
|
30
|
+
}
|
|
31
|
+
const spawnArgs = this.buildSpawnArgs();
|
|
32
|
+
if (!spawnArgs) {
|
|
33
|
+
return { launched: false, reason: 'no-terminal' };
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const child = (0, child_process_1.spawn)(spawnArgs.command, spawnArgs.args, {
|
|
37
|
+
detached: true,
|
|
38
|
+
stdio: 'ignore',
|
|
39
|
+
});
|
|
40
|
+
child.unref();
|
|
41
|
+
return { launched: true, reason: 'spawned', pid: child.pid };
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return { launched: false, reason: 'spawn-failed' };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
buildSpawnArgs() {
|
|
48
|
+
const platform = process.platform;
|
|
49
|
+
const bin = this.codingbuddyBin;
|
|
50
|
+
if (!SAFE_PATH_PATTERN.test(bin)) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
if (platform === 'darwin') {
|
|
54
|
+
return this.buildDarwinSpawnArgs(bin);
|
|
55
|
+
}
|
|
56
|
+
if (platform === 'linux') {
|
|
57
|
+
return this.buildLinuxSpawnArgs(bin);
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
buildDarwinSpawnArgs(bin) {
|
|
62
|
+
const termProgram = process.env.TERM_PROGRAM;
|
|
63
|
+
if (termProgram === 'iTerm.app') {
|
|
64
|
+
return {
|
|
65
|
+
command: 'osascript',
|
|
66
|
+
args: [
|
|
67
|
+
'-e',
|
|
68
|
+
`tell application "iTerm2" to create window with default profile command "${escapeAppleScript(bin)} tui"`,
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
if (termProgram === 'WezTerm') {
|
|
73
|
+
return {
|
|
74
|
+
command: 'wezterm',
|
|
75
|
+
args: ['cli', 'spawn', '--', bin, 'tui'],
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
command: 'osascript',
|
|
80
|
+
args: ['-e', `tell application "Terminal" to do script "${escapeAppleScript(bin)} tui"`],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
buildLinuxSpawnArgs(bin) {
|
|
84
|
+
const envTerminal = process.env.TERMINAL;
|
|
85
|
+
if (envTerminal && SAFE_PATH_PATTERN.test(envTerminal)) {
|
|
86
|
+
return {
|
|
87
|
+
command: envTerminal,
|
|
88
|
+
args: ['-e', bin, 'tui'],
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const detected = this.detectLinuxTerminal();
|
|
92
|
+
if (!detected) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
command: detected,
|
|
97
|
+
args: ['-e', bin, 'tui'],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
detectLinuxTerminal() {
|
|
101
|
+
for (const candidate of LINUX_TERMINAL_CANDIDATES) {
|
|
102
|
+
try {
|
|
103
|
+
(0, child_process_1.execSync)(`which ${candidate}`, { stdio: 'pipe' });
|
|
104
|
+
return candidate;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.TuiAutoLauncher = TuiAutoLauncher;
|
|
113
|
+
//# sourceMappingURL=tui-auto-launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-auto-launcher.js","sourceRoot":"","sources":["../../../../src/tui/ipc/tui-auto-launcher.ts"],"names":[],"mappings":";;;AAAA,iDAAgD;AAoBhD,MAAM,yBAAyB,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;AAGpF,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AAGhD,SAAS,iBAAiB,CAAC,CAAS;IAClC,OAAO,CAAC;SACL,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC;AAMD,MAAa,eAAe;IAK1B,YAAY,OAA0B;QACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;QACvC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,aAAa,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAA4C;QACvD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACjD,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;QACjE,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QACpD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE;gBACrD,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YACH,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QACrD,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;QAEhC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,oBAAoB,CAAC,GAAW;QACtC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAE7C,IAAI,WAAW,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO;gBACL,OAAO,EAAE,WAAW;gBACpB,IAAI,EAAE;oBACJ,IAAI;oBACJ,4EAA4E,iBAAiB,CAAC,GAAG,CAAC,OAAO;iBAC1G;aACF,CAAC;QACJ,CAAC;QAED,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO;gBACL,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC;aACzC,CAAC;QACJ,CAAC;QAGD,OAAO;YACL,OAAO,EAAE,WAAW;YACpB,IAAI,EAAE,CAAC,IAAI,EAAE,6CAA6C,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC;SACzF,CAAC;IACJ,CAAC;IAEO,mBAAmB,CAAC,GAAW;QACrC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzC,IAAI,WAAW,IAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACvD,OAAO;gBACL,OAAO,EAAE,WAAW;gBACpB,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC;aACzB,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC;SACzB,CAAC;IACJ,CAAC;IAEO,mBAAmB;QACzB,KAAK,MAAM,SAAS,IAAI,yBAAyB,EAAE,CAAC;YAClD,IAAI,CAAC;gBACH,IAAA,wBAAQ,EAAC,SAAS,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBAClD,OAAO,SAAS,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;YAET,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAtHD,0CAsHC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { MultiSessionManager } from './ipc/multi-session-manager';
|
|
3
|
+
export interface MultiSessionAppProps {
|
|
4
|
+
manager: MultiSessionManager;
|
|
5
|
+
}
|
|
6
|
+
export declare function MultiSessionApp({ manager }: MultiSessionAppProps): React.ReactElement;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MultiSessionApp = MultiSessionApp;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const ink_1 = require("ink");
|
|
6
|
+
const path = require("path");
|
|
7
|
+
const use_terminal_size_1 = require("./hooks/use-terminal-size");
|
|
8
|
+
const use_multi_session_state_1 = require("./hooks/use-multi-session-state");
|
|
9
|
+
const SessionTabBar_1 = require("./components/SessionTabBar");
|
|
10
|
+
const dashboard_app_1 = require("./dashboard-app");
|
|
11
|
+
function MultiSessionApp({ manager }) {
|
|
12
|
+
const { columns, layoutMode } = (0, use_terminal_size_1.useTerminalSize)();
|
|
13
|
+
const { sessions, activeSessionPid, switchNext, switchPrev, switchByIndex } = (0, use_multi_session_state_1.useMultiSessionState)(manager);
|
|
14
|
+
const tabs = (0, react_1.useMemo)(() => {
|
|
15
|
+
let index = 0;
|
|
16
|
+
const result = [];
|
|
17
|
+
for (const [pid, sessionState] of sessions) {
|
|
18
|
+
index += 1;
|
|
19
|
+
result.push({
|
|
20
|
+
pid,
|
|
21
|
+
index,
|
|
22
|
+
projectName: path.basename(sessionState.projectRoot),
|
|
23
|
+
globalState: sessionState.dashboardState.globalState,
|
|
24
|
+
isActive: pid === activeSessionPid,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}, [sessions, activeSessionPid]);
|
|
29
|
+
const activeEventBus = (0, react_1.useMemo)(() => {
|
|
30
|
+
if (activeSessionPid === null)
|
|
31
|
+
return undefined;
|
|
32
|
+
const managedSessions = manager.getSessions();
|
|
33
|
+
const found = managedSessions.find(s => s.instance.pid === activeSessionPid);
|
|
34
|
+
return found?.eventBus;
|
|
35
|
+
}, [manager, activeSessionPid]);
|
|
36
|
+
const handleInput = (0, react_1.useCallback)((input, key) => {
|
|
37
|
+
if (key.rightArrow) {
|
|
38
|
+
switchNext();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (key.leftArrow) {
|
|
42
|
+
switchPrev();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const num = parseInt(input, 10);
|
|
46
|
+
if (num >= 1 && num <= 9) {
|
|
47
|
+
switchByIndex(num);
|
|
48
|
+
}
|
|
49
|
+
}, [switchNext, switchPrev, switchByIndex]);
|
|
50
|
+
(0, ink_1.useInput)(handleInput);
|
|
51
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
|
|
52
|
+
react_1.default.createElement(SessionTabBar_1.SessionTabBar, { sessions: tabs, width: columns, layoutMode: layoutMode }),
|
|
53
|
+
react_1.default.createElement(dashboard_app_1.DashboardApp, { key: activeSessionPid ?? 'none', eventBus: activeEventBus })));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=multi-session-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-session-app.js","sourceRoot":"","sources":["../../../src/tui/multi-session-app.tsx"],"names":[],"mappings":";;AAeA,0CA0DC;AAzED,iCAAoD;AACpD,6BAAoC;AAEpC,6BAA6B;AAE7B,iEAA4D;AAC5D,6EAAuE;AACvE,8DAA2D;AAC3D,mDAA+C;AAO/C,SAAgB,eAAe,CAAC,EAAE,OAAO,EAAwB;IAC/D,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAA,mCAAe,GAAE,CAAC;IAClD,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,GACzE,IAAA,8CAAoB,EAAC,OAAO,CAAC,CAAC;IAEhC,MAAM,IAAI,GAAiB,IAAA,eAAO,EAAC,GAAG,EAAE;QACtC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,KAAK,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC3C,KAAK,IAAI,CAAC,CAAC;YACX,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG;gBACH,KAAK;gBACL,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC;gBACpD,WAAW,EAAE,YAAY,CAAC,cAAc,CAAC,WAAW;gBACpD,QAAQ,EAAE,GAAG,KAAK,gBAAgB;aACnC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEjC,MAAM,cAAc,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QAClC,IAAI,gBAAgB,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QAChD,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,KAAK,gBAAgB,CAAC,CAAC;QAC7E,OAAO,KAAK,EAAE,QAAQ,CAAC;IACzB,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEhC,MAAM,WAAW,GAAG,IAAA,mBAAW,EAC7B,CAAC,KAAa,EAAE,GAAa,EAAE,EAAE;QAC/B,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YACnB,UAAU,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,UAAU,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACzB,aAAa,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,EACD,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,CAAC,CACxC,CAAC;IAEF,IAAA,cAAQ,EAAC,WAAW,CAAC,CAAC;IAEtB,OAAO,CACL,8BAAC,SAAG,IAAC,aAAa,EAAC,QAAQ;QACzB,8BAAC,6BAAa,IAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,GAAI;QAIzE,8BAAC,4BAAY,IAAC,GAAG,EAAE,gBAAgB,IAAI,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAI,CACvE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
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 multi_session_app_1 = require("./multi-session-app");
|
|
7
|
+
vitest_1.vi.mock('./dashboard-app', () => ({
|
|
8
|
+
DashboardApp: () => react_1.default.createElement('ink-text', null, 'DashboardApp'),
|
|
9
|
+
}));
|
|
10
|
+
vitest_1.vi.mock('./hooks/use-terminal-size', () => ({
|
|
11
|
+
useTerminalSize: () => ({ columns: 80, rows: 24, layoutMode: 'wide' }),
|
|
12
|
+
}));
|
|
13
|
+
vitest_1.vi.mock('./utils/icons', async (importOriginal) => {
|
|
14
|
+
const actual = await importOriginal();
|
|
15
|
+
return { ...actual, isNerdFontEnabled: () => false };
|
|
16
|
+
});
|
|
17
|
+
function makeManagedSession(pid, projectRoot = `/project/session-${pid}`) {
|
|
18
|
+
return {
|
|
19
|
+
instance: {
|
|
20
|
+
pid,
|
|
21
|
+
projectRoot,
|
|
22
|
+
socketPath: `/tmp/cb-tui-${pid}.sock`,
|
|
23
|
+
startedAt: new Date().toISOString(),
|
|
24
|
+
},
|
|
25
|
+
client: {},
|
|
26
|
+
eventBus: { emit: vitest_1.vi.fn(), on: vitest_1.vi.fn(), off: vitest_1.vi.fn() },
|
|
27
|
+
connected: true,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function createMockManager(sessions = []) {
|
|
31
|
+
return {
|
|
32
|
+
getSessions: vitest_1.vi.fn(() => sessions),
|
|
33
|
+
getSession: vitest_1.vi.fn((pid) => sessions.find(s => s.instance.pid === pid)),
|
|
34
|
+
onSessionAdded: vitest_1.vi.fn(),
|
|
35
|
+
offSessionAdded: vitest_1.vi.fn(),
|
|
36
|
+
onSessionRemoved: vitest_1.vi.fn(),
|
|
37
|
+
offSessionRemoved: vitest_1.vi.fn(),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
(0, vitest_1.describe)('MultiSessionApp', () => {
|
|
41
|
+
(0, vitest_1.it)('renders without errors for empty manager', () => {
|
|
42
|
+
const mgr = createMockManager([]);
|
|
43
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(multi_session_app_1.MultiSessionApp, { manager: mgr }));
|
|
44
|
+
const frame = lastFrame() ?? '';
|
|
45
|
+
(0, vitest_1.expect)(frame).toContain('DashboardApp');
|
|
46
|
+
});
|
|
47
|
+
(0, vitest_1.it)('single session: no tab bar visible, DashboardApp renders', () => {
|
|
48
|
+
const s1 = makeManagedSession(100);
|
|
49
|
+
const mgr = createMockManager([s1]);
|
|
50
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(multi_session_app_1.MultiSessionApp, { manager: mgr }));
|
|
51
|
+
const frame = lastFrame() ?? '';
|
|
52
|
+
(0, vitest_1.expect)(frame).not.toContain('[1]');
|
|
53
|
+
(0, vitest_1.expect)(frame).toContain('DashboardApp');
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.it)('multiple sessions: tab bar visible with indicators', () => {
|
|
56
|
+
const s1 = makeManagedSession(100, '/project/frontend');
|
|
57
|
+
const s2 = makeManagedSession(200, '/project/backend');
|
|
58
|
+
const mgr = createMockManager([s1, s2]);
|
|
59
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(multi_session_app_1.MultiSessionApp, { manager: mgr }));
|
|
60
|
+
const frame = lastFrame() ?? '';
|
|
61
|
+
(0, vitest_1.expect)(frame).toContain('[1]');
|
|
62
|
+
(0, vitest_1.expect)(frame).toContain('[2]');
|
|
63
|
+
(0, vitest_1.expect)(frame).toContain('frontend');
|
|
64
|
+
(0, vitest_1.expect)(frame).toContain('backend');
|
|
65
|
+
(0, vitest_1.expect)(frame).toContain('DashboardApp');
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.it)('keyboard right arrow does not crash', () => {
|
|
68
|
+
const s1 = makeManagedSession(100);
|
|
69
|
+
const s2 = makeManagedSession(200);
|
|
70
|
+
const mgr = createMockManager([s1, s2]);
|
|
71
|
+
const { lastFrame, stdin } = (0, ink_testing_library_1.render)(react_1.default.createElement(multi_session_app_1.MultiSessionApp, { manager: mgr }));
|
|
72
|
+
stdin.write('\x1B[C');
|
|
73
|
+
const frame = lastFrame() ?? '';
|
|
74
|
+
(0, vitest_1.expect)(frame).toContain('DashboardApp');
|
|
75
|
+
});
|
|
76
|
+
(0, vitest_1.it)('keyboard left arrow does not crash', () => {
|
|
77
|
+
const s1 = makeManagedSession(100);
|
|
78
|
+
const s2 = makeManagedSession(200);
|
|
79
|
+
const mgr = createMockManager([s1, s2]);
|
|
80
|
+
const { lastFrame, stdin } = (0, ink_testing_library_1.render)(react_1.default.createElement(multi_session_app_1.MultiSessionApp, { manager: mgr }));
|
|
81
|
+
stdin.write('\x1B[D');
|
|
82
|
+
const frame = lastFrame() ?? '';
|
|
83
|
+
(0, vitest_1.expect)(frame).toContain('DashboardApp');
|
|
84
|
+
});
|
|
85
|
+
(0, vitest_1.it)('renders active session indicator for first session by default', () => {
|
|
86
|
+
const s1 = makeManagedSession(100, '/project/alpha');
|
|
87
|
+
const s2 = makeManagedSession(200, '/project/beta');
|
|
88
|
+
const mgr = createMockManager([s1, s2]);
|
|
89
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(multi_session_app_1.MultiSessionApp, { manager: mgr }));
|
|
90
|
+
const frame = lastFrame() ?? '';
|
|
91
|
+
(0, vitest_1.expect)(frame).toContain('alpha');
|
|
92
|
+
(0, vitest_1.expect)(frame).toContain('beta');
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=multi-session-app.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-session-app.spec.js","sourceRoot":"","sources":["../../../src/tui/multi-session-app.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ const react_1 = require("react");
|
|
|
4
4
|
const vitest_1 = require("vitest");
|
|
5
5
|
const stream_1 = require("stream");
|
|
6
6
|
const ink_testing_library_1 = require("ink-testing-library");
|
|
7
|
-
const
|
|
7
|
+
const dashboard_app_1 = require("./dashboard-app");
|
|
8
8
|
const events_1 = require("./events");
|
|
9
9
|
const tui_config_1 = require("./tui-config");
|
|
10
10
|
vitest_1.vi.mock('./utils/icons', async (importOriginal) => {
|
|
@@ -28,7 +28,7 @@ const tick = () => new Promise(resolve => setTimeout(resolve, 0));
|
|
|
28
28
|
const mockStdout = new stream_1.PassThrough();
|
|
29
29
|
mockStdout.on('data', chunk => stdoutCapture.push(chunk.toString()));
|
|
30
30
|
const eventBus = new events_1.TuiEventBus();
|
|
31
|
-
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(
|
|
31
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(dashboard_app_1.DashboardApp, { eventBus: eventBus }));
|
|
32
32
|
eventBus.emit(events_1.TUI_EVENTS.AGENT_ACTIVATED, {
|
|
33
33
|
agentId: 'test-agent',
|
|
34
34
|
name: 'test-agent',
|
|
@@ -50,7 +50,7 @@ const tick = () => new Promise(resolve => setTimeout(resolve, 0));
|
|
|
50
50
|
});
|
|
51
51
|
mockStdout.write(jsonRpcMessage + '\n');
|
|
52
52
|
const eventBus = new events_1.TuiEventBus();
|
|
53
|
-
(0, ink_testing_library_1.render)(react_1.default.createElement(
|
|
53
|
+
(0, ink_testing_library_1.render)(react_1.default.createElement(dashboard_app_1.DashboardApp, { eventBus: eventBus }));
|
|
54
54
|
await tick();
|
|
55
55
|
(0, vitest_1.expect)(stdoutCapture.join('')).toContain('"jsonrpc":"2.0"');
|
|
56
56
|
(0, vitest_1.expect)(stdoutCapture.join('')).not.toContain('CODINGBUDDY');
|
|
@@ -68,7 +68,7 @@ const tick = () => new Promise(resolve => setTimeout(resolve, 0));
|
|
|
68
68
|
(0, vitest_1.describe)('stdio 모드: MCP + TUI 동시 동작', () => {
|
|
69
69
|
(0, vitest_1.it)('should handle concurrent MCP events and TUI rendering', async () => {
|
|
70
70
|
const eventBus = new events_1.TuiEventBus();
|
|
71
|
-
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(
|
|
71
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(dashboard_app_1.DashboardApp, { eventBus: eventBus }));
|
|
72
72
|
const agentIds = ['arch-1', 'sec-1', 'perf-1'];
|
|
73
73
|
for (const id of agentIds) {
|
|
74
74
|
eventBus.emit(events_1.TUI_EVENTS.AGENT_ACTIVATED, {
|
|
@@ -80,7 +80,7 @@ const tick = () => new Promise(resolve => setTimeout(resolve, 0));
|
|
|
80
80
|
}
|
|
81
81
|
await tick();
|
|
82
82
|
const frame = lastFrame() ?? '';
|
|
83
|
-
(0, vitest_1.expect)(frame).toContain('
|
|
83
|
+
(0, vitest_1.expect)(frame).toContain('RUNNING');
|
|
84
84
|
});
|
|
85
85
|
});
|
|
86
86
|
(0, vitest_1.describe)('SSE 모드: HTTP 서버 + TUI 동시 실행', () => {
|
|
@@ -95,18 +95,18 @@ const tick = () => new Promise(resolve => setTimeout(resolve, 0));
|
|
|
95
95
|
});
|
|
96
96
|
(0, vitest_1.it)('should render TUI to stdout stream in SSE mode', async () => {
|
|
97
97
|
const eventBus = new events_1.TuiEventBus();
|
|
98
|
-
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(
|
|
98
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(dashboard_app_1.DashboardApp, { eventBus: eventBus }));
|
|
99
99
|
eventBus.emit(events_1.TUI_EVENTS.MODE_CHANGED, {
|
|
100
100
|
from: null,
|
|
101
101
|
to: 'PLAN',
|
|
102
102
|
});
|
|
103
103
|
await tick();
|
|
104
104
|
const frame = lastFrame() ?? '';
|
|
105
|
-
(0, vitest_1.expect)(frame).
|
|
105
|
+
(0, vitest_1.expect)(frame).toBeTruthy();
|
|
106
106
|
});
|
|
107
107
|
(0, vitest_1.it)('should handle SSE events and TUI simultaneously', async () => {
|
|
108
108
|
const eventBus = new events_1.TuiEventBus();
|
|
109
|
-
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(
|
|
109
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(dashboard_app_1.DashboardApp, { eventBus: eventBus }));
|
|
110
110
|
eventBus.emit(events_1.TUI_EVENTS.MODE_CHANGED, {
|
|
111
111
|
from: 'PLAN',
|
|
112
112
|
to: 'ACT',
|
|
@@ -119,8 +119,8 @@ const tick = () => new Promise(resolve => setTimeout(resolve, 0));
|
|
|
119
119
|
});
|
|
120
120
|
await tick();
|
|
121
121
|
const frame = lastFrame() ?? '';
|
|
122
|
-
(0, vitest_1.expect)(frame).toContain('
|
|
123
|
-
(0, vitest_1.expect)(frame).toContain('
|
|
122
|
+
(0, vitest_1.expect)(frame).toContain('RUNNING');
|
|
123
|
+
(0, vitest_1.expect)(frame).toContain('frontend-dev');
|
|
124
124
|
});
|
|
125
125
|
(0, vitest_1.it)('should NOT conflict with SSE event stream protocol', () => {
|
|
126
126
|
const config = (0, tui_config_1.resolveTuiConfig)({
|
|
@@ -154,7 +154,7 @@ const tick = () => new Promise(resolve => setTimeout(resolve, 0));
|
|
|
154
154
|
(0, vitest_1.describe)('공통: 터미널 리사이즈 대응', () => {
|
|
155
155
|
(0, vitest_1.it)('should render TUI components and produce visible output', async () => {
|
|
156
156
|
const eventBus = new events_1.TuiEventBus();
|
|
157
|
-
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(
|
|
157
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(dashboard_app_1.DashboardApp, { eventBus: eventBus }));
|
|
158
158
|
eventBus.emit(events_1.TUI_EVENTS.AGENT_ACTIVATED, {
|
|
159
159
|
agentId: 'test-1',
|
|
160
160
|
name: 'test-agent',
|
|
@@ -164,11 +164,11 @@ const tick = () => new Promise(resolve => setTimeout(resolve, 0));
|
|
|
164
164
|
await tick();
|
|
165
165
|
const frame = lastFrame() ?? '';
|
|
166
166
|
(0, vitest_1.expect)(frame).toBeTruthy();
|
|
167
|
-
(0, vitest_1.expect)(frame).toContain('
|
|
167
|
+
(0, vitest_1.expect)(frame).toContain('RUNNING');
|
|
168
168
|
});
|
|
169
169
|
(0, vitest_1.it)('should maintain state across event-driven re-renders', async () => {
|
|
170
170
|
const eventBus = new events_1.TuiEventBus();
|
|
171
|
-
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(
|
|
171
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(dashboard_app_1.DashboardApp, { eventBus: eventBus }));
|
|
172
172
|
eventBus.emit(events_1.TUI_EVENTS.MODE_CHANGED, {
|
|
173
173
|
from: 'ACT',
|
|
174
174
|
to: 'EVAL',
|
|
@@ -181,8 +181,8 @@ const tick = () => new Promise(resolve => setTimeout(resolve, 0));
|
|
|
181
181
|
});
|
|
182
182
|
await tick();
|
|
183
183
|
const frame = lastFrame() ?? '';
|
|
184
|
-
(0, vitest_1.expect)(frame).toContain('
|
|
185
|
-
(0, vitest_1.expect)(frame).toContain('
|
|
184
|
+
(0, vitest_1.expect)(frame).toContain('RUNNING');
|
|
185
|
+
(0, vitest_1.expect)(frame).toContain('evaluator');
|
|
186
186
|
});
|
|
187
187
|
});
|
|
188
188
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport-tui.integration.spec.js","sourceRoot":"","sources":["../../../src/tui/transport-tui.integration.spec.tsx"],"names":[],"mappings":";;AAAA,iCAA0B;AAC1B,mCAAkD;AAClD,mCAAqC;AACrC,6DAA6C;AAC7C
|
|
1
|
+
{"version":3,"file":"transport-tui.integration.spec.js","sourceRoot":"","sources":["../../../src/tui/transport-tui.integration.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
interface TuiConfigInput {
|
|
2
2
|
readonly transportMode: 'stdio' | 'sse';
|
|
3
3
|
readonly tuiEnabled: boolean;
|
|
4
4
|
readonly stderrIsTTY: boolean;
|
|
5
5
|
}
|
|
6
|
-
|
|
6
|
+
interface TuiConfig {
|
|
7
7
|
readonly shouldRender: boolean;
|
|
8
8
|
readonly target: 'stdout' | 'stderr' | null;
|
|
9
9
|
readonly reason: string;
|
|
10
10
|
}
|
|
11
11
|
export declare function resolveTuiConfig(input: TuiConfigInput): TuiConfig;
|
|
12
|
+
export {};
|
package/dist/src/tui/types.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export interface AgentState {
|
|
|
10
10
|
isPrimary: boolean;
|
|
11
11
|
childAgents?: string[];
|
|
12
12
|
}
|
|
13
|
-
export declare const TUI_EVENT_TYPES: readonly ["agent:start", "agent:progress", "agent:complete", "agent:fail", "mode:change", "agent:activated", "agent:deactivated", "mode:changed", "skill:recommended", "parallel:started", "parallel:completed"];
|
|
13
|
+
export declare const TUI_EVENT_TYPES: readonly ["agent:start", "agent:progress", "agent:complete", "agent:fail", "mode:change", "agent:activated", "agent:deactivated", "mode:changed", "skill:recommended", "parallel:started", "parallel:completed", "agent:relationship", "task:synced", "tool:invoked"];
|
|
14
14
|
export type TuiEventType = (typeof TUI_EVENT_TYPES)[number];
|
|
15
15
|
export interface TuiEvent<T = unknown> {
|
|
16
16
|
type: TuiEventType;
|
package/dist/src/tui/types.js
CHANGED
|
@@ -15,6 +15,9 @@ exports.TUI_EVENT_TYPES = Object.freeze([
|
|
|
15
15
|
'skill:recommended',
|
|
16
16
|
'parallel:started',
|
|
17
17
|
'parallel:completed',
|
|
18
|
+
'agent:relationship',
|
|
19
|
+
'task:synced',
|
|
20
|
+
'tool:invoked',
|
|
18
21
|
]);
|
|
19
22
|
function createDefaultAgentState(params) {
|
|
20
23
|
const { id, name, role, status = 'idle', progress = 0, isPrimary = false, childAgents } = params;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tui/types.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tui/types.ts"],"names":[],"mappings":";;;AAsEA,0DAmBC;AA7EY,QAAA,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAU,CAAC,CAAC;AAoBpF,QAAA,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3C,aAAa;IACb,gBAAgB;IAChB,gBAAgB;IAChB,YAAY;IACZ,aAAa;IAEb,iBAAiB;IACjB,mBAAmB;IACnB,cAAc;IACd,mBAAmB;IACnB,kBAAkB;IAClB,oBAAoB;IACpB,oBAAoB;IACpB,aAAa;IACb,cAAc;CACN,CAAC,CAAC;AAsBZ,SAAgB,uBAAuB,CACrC,MAA+C;IAE/C,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAEjG,MAAM,KAAK,GAAe;QACxB,EAAE;QACF,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,QAAQ;QACR,SAAS;KACV,CAAC;IAEF,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAClC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface CellStyle {
|
|
2
|
+
fg?: 'cyan' | 'magenta' | 'green' | 'yellow' | 'red' | 'white' | 'gray';
|
|
3
|
+
bold?: boolean;
|
|
4
|
+
dim?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface ColorCell {
|
|
7
|
+
char: string;
|
|
8
|
+
style: CellStyle;
|
|
9
|
+
}
|
|
10
|
+
export interface StyledSegment {
|
|
11
|
+
text: string;
|
|
12
|
+
style: CellStyle;
|
|
13
|
+
}
|
|
14
|
+
export declare function groupByStyle(cells: ReadonlyArray<ColorCell>): StyledSegment[];
|
|
15
|
+
export declare class ColorBuffer {
|
|
16
|
+
readonly width: number;
|
|
17
|
+
readonly height: number;
|
|
18
|
+
private readonly grid;
|
|
19
|
+
constructor(width: number, height: number);
|
|
20
|
+
setChar(x: number, y: number, ch: string, style?: CellStyle): void;
|
|
21
|
+
getCell(x: number, y: number): ColorCell;
|
|
22
|
+
writeText(x: number, y: number, text: string, style?: CellStyle): void;
|
|
23
|
+
drawHLine(x: number, y: number, length: number, ch?: string, style?: CellStyle): void;
|
|
24
|
+
drawVLine(x: number, y: number, length: number, ch?: string, style?: CellStyle): void;
|
|
25
|
+
private drawBoxWithChars;
|
|
26
|
+
drawBox(x: number, y: number, w: number, h: number, style?: CellStyle): void;
|
|
27
|
+
drawRoundBox(x: number, y: number, w: number, h: number, style?: CellStyle): void;
|
|
28
|
+
drawDoubleBox(x: number, y: number, w: number, h: number, style?: CellStyle): void;
|
|
29
|
+
toLines(): ColorCell[][];
|
|
30
|
+
toLinesDirect(): ReadonlyArray<ReadonlyArray<ColorCell>>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ColorBuffer = void 0;
|
|
4
|
+
exports.groupByStyle = groupByStyle;
|
|
5
|
+
const DEFAULT_CELL = Object.freeze({ char: ' ', style: Object.freeze({}) });
|
|
6
|
+
function stylesEqual(a, b) {
|
|
7
|
+
return a.fg === b.fg && a.bold === b.bold && a.dim === b.dim;
|
|
8
|
+
}
|
|
9
|
+
function groupByStyle(cells) {
|
|
10
|
+
if (cells.length === 0)
|
|
11
|
+
return [];
|
|
12
|
+
const segments = [];
|
|
13
|
+
let current = { text: cells[0].char, style: cells[0].style };
|
|
14
|
+
for (let i = 1; i < cells.length; i++) {
|
|
15
|
+
const cell = cells[i];
|
|
16
|
+
if (stylesEqual(current.style, cell.style)) {
|
|
17
|
+
current.text += cell.char;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
segments.push(current);
|
|
21
|
+
current = { text: cell.char, style: cell.style };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
segments.push(current);
|
|
25
|
+
return segments;
|
|
26
|
+
}
|
|
27
|
+
class ColorBuffer {
|
|
28
|
+
constructor(width, height) {
|
|
29
|
+
this.width = width;
|
|
30
|
+
this.height = height;
|
|
31
|
+
this.grid = Array.from({ length: height }, () => Array.from({ length: width }, () => ({ char: ' ', style: DEFAULT_CELL.style })));
|
|
32
|
+
}
|
|
33
|
+
setChar(x, y, ch, style = {}) {
|
|
34
|
+
if (x < 0 || x >= this.width || y < 0 || y >= this.height)
|
|
35
|
+
return;
|
|
36
|
+
this.grid[y][x] = { char: ch, style };
|
|
37
|
+
}
|
|
38
|
+
getCell(x, y) {
|
|
39
|
+
if (x < 0 || x >= this.width || y < 0 || y >= this.height) {
|
|
40
|
+
return DEFAULT_CELL;
|
|
41
|
+
}
|
|
42
|
+
return this.grid[y][x];
|
|
43
|
+
}
|
|
44
|
+
writeText(x, y, text, style = {}) {
|
|
45
|
+
for (let i = 0; i < text.length; i++) {
|
|
46
|
+
this.setChar(x + i, y, text[i], style);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
drawHLine(x, y, length, ch = '─', style = {}) {
|
|
50
|
+
for (let i = 0; i < length; i++) {
|
|
51
|
+
this.setChar(x + i, y, ch, style);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
drawVLine(x, y, length, ch = '│', style = {}) {
|
|
55
|
+
for (let i = 0; i < length; i++) {
|
|
56
|
+
this.setChar(x, y + i, ch, style);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
drawBoxWithChars(x, y, w, h, style, tl, tr, bl, br, hz, vt) {
|
|
60
|
+
this.setChar(x, y, tl, style);
|
|
61
|
+
this.setChar(x + w - 1, y, tr, style);
|
|
62
|
+
this.setChar(x, y + h - 1, bl, style);
|
|
63
|
+
this.setChar(x + w - 1, y + h - 1, br, style);
|
|
64
|
+
this.drawHLine(x + 1, y, w - 2, hz, style);
|
|
65
|
+
this.drawHLine(x + 1, y + h - 1, w - 2, hz, style);
|
|
66
|
+
this.drawVLine(x, y + 1, h - 2, vt, style);
|
|
67
|
+
this.drawVLine(x + w - 1, y + 1, h - 2, vt, style);
|
|
68
|
+
}
|
|
69
|
+
drawBox(x, y, w, h, style = {}) {
|
|
70
|
+
this.drawBoxWithChars(x, y, w, h, style, '┌', '┐', '└', '┘', '─', '│');
|
|
71
|
+
}
|
|
72
|
+
drawRoundBox(x, y, w, h, style = {}) {
|
|
73
|
+
this.drawBoxWithChars(x, y, w, h, style, '╭', '╮', '╰', '╯', '─', '│');
|
|
74
|
+
}
|
|
75
|
+
drawDoubleBox(x, y, w, h, style = {}) {
|
|
76
|
+
this.drawBoxWithChars(x, y, w, h, style, '╔', '╗', '╚', '╝', '═', '║');
|
|
77
|
+
}
|
|
78
|
+
toLines() {
|
|
79
|
+
return this.grid.map(row => row.map(cell => ({ char: cell.char, style: { ...cell.style } })));
|
|
80
|
+
}
|
|
81
|
+
toLinesDirect() {
|
|
82
|
+
return this.grid;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.ColorBuffer = ColorBuffer;
|
|
86
|
+
//# sourceMappingURL=color-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-buffer.js","sourceRoot":"","sources":["../../../../src/tui/utils/color-buffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../../../src/tui/utils/colors.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../../../src/tui/utils/colors.ts"],"names":[],"mappings":";;;AAsBA,wCAEC;AAED,sCAkBC;AA5CD,iCAA0B;AAUb,QAAA,aAAa,GAA0C,MAAM,CAAC,MAAM,CAAC;IAChF,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;IACf,SAAS,EAAE,OAAO;IAClB,MAAM,EAAE,KAAK;CACd,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,MAAM,CAAC;AAK7B,SAAgB,cAAc,CAAC,MAAmB;IAChD,OAAO,qBAAa,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC;AAChD,CAAC;AAED,SAAgB,aAAa;IAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,eAAK,CAAC,KAAK,CAAC;IAC1B,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,CAAC;YACJ,OAAO,MAAM,CAAC;QAChB,KAAK,CAAC;YACJ,OAAO,OAAO,CAAC;QACjB,KAAK,CAAC;YACJ,OAAO,KAAK,CAAC;QACf,KAAK,CAAC;YACJ,OAAO,WAAW,CAAC;QACrB;YACE,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface Point {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
}
|
|
5
|
+
export interface PathSegment extends Point {
|
|
6
|
+
char: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function computeEdgePath(from: Point, to: Point): PathSegment[];
|
|
9
|
+
export declare function computeLabelPosition(path: PathSegment[], label: string): Point | null;
|