praxis-agent 0.7.0 → 0.8.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 +8 -0
- package/dist/application/background-agent-manager.d.ts +5 -0
- package/dist/application/background-agent-manager.js +21 -0
- package/dist/application/background-bash-manager.d.ts +14 -0
- package/dist/application/background-bash-manager.js +42 -4
- package/dist/application/background-task-runtime.d.ts +34 -0
- package/dist/application/background-task-runtime.js +59 -0
- package/dist/application/session-service.d.ts +21 -1
- package/dist/application/session-service.js +188 -17
- package/dist/application/session-worktree.d.ts +1 -0
- package/dist/application/session-worktree.js +13 -2
- package/dist/application/subagent-service.d.ts +3 -0
- package/dist/application/subagent-service.js +6 -0
- package/dist/application/workflow-manager.d.ts +70 -2
- package/dist/application/workflow-manager.js +21 -4
- package/dist/cli/agents-dashboard.d.ts +9 -0
- package/dist/cli/agents-dashboard.js +16 -5
- package/dist/cli/interactive.d.ts +41 -3
- package/dist/cli/interactive.js +1281 -183
- package/dist/cli/tui/claude-style.d.ts +31 -3
- package/dist/cli/tui/claude-style.js +165 -54
- package/dist/cli/tui/config-dashboard.d.ts +63 -0
- package/dist/cli/tui/config-dashboard.js +150 -0
- package/dist/cli/tui/config-settings.d.ts +32 -0
- package/dist/cli/tui/config-settings.js +276 -0
- package/dist/cli/tui/custom-themes.d.ts +21 -0
- package/dist/cli/tui/custom-themes.js +284 -0
- package/dist/cli/tui/file-picker.d.ts +3 -1
- package/dist/cli/tui/file-picker.js +8 -2
- package/dist/cli/tui/keybindings.js +0 -1
- package/dist/cli/tui/mcp-panel-controller.d.ts +32 -0
- package/dist/cli/tui/mcp-panel-controller.js +80 -0
- package/dist/cli/tui/mcp-panel-projector.d.ts +79 -0
- package/dist/cli/tui/mcp-panel-projector.js +181 -0
- package/dist/cli/tui/mcp-panel.d.ts +8 -0
- package/dist/cli/tui/mcp-panel.js +99 -0
- package/dist/cli/tui/recently-denied.d.ts +15 -0
- package/dist/cli/tui/recently-denied.js +19 -0
- package/dist/cli/tui/runtime-interactions.d.ts +17 -0
- package/dist/cli/tui/runtime-interactions.js +100 -0
- package/dist/cli/tui/runtime-settings.d.ts +40 -0
- package/dist/cli/tui/runtime-settings.js +84 -0
- package/dist/cli/tui/slash-commands.js +10 -0
- package/dist/cli/tui/task-panel.d.ts +53 -0
- package/dist/cli/tui/task-panel.js +204 -0
- package/dist/cli/tui/terminal-notifications.d.ts +10 -0
- package/dist/cli/tui/terminal-notifications.js +48 -0
- package/dist/cli/tui/terminal-setup.d.ts +24 -0
- package/dist/cli/tui/terminal-setup.js +618 -0
- package/dist/cli/tui/theme-settings.d.ts +8 -0
- package/dist/cli/tui/theme-settings.js +132 -0
- package/dist/cli/tui/theme.d.ts +53 -0
- package/dist/cli/tui/theme.js +265 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.js +97 -17
- package/dist/compatibility/claude/schema.js +2 -0
- package/dist/core/runtime.d.ts +12 -0
- package/dist/core/runtime.js +24 -0
- package/dist/maintenance/self-update.js +1 -1
- package/dist/mcp/claude-mcp-management.d.ts +6 -1
- package/dist/mcp/claude-mcp-management.js +191 -44
- package/dist/mcp/claude-mcp-oauth.js +2 -0
- package/dist/mcp/claude-mcp-tools.d.ts +31 -3
- package/dist/mcp/claude-mcp-tools.js +116 -34
- package/dist/permissions/claude-permission-resolver.d.ts +3 -0
- package/dist/permissions/claude-permission-resolver.js +42 -20
- package/dist/platform/claude-version.js +2 -1
- package/dist/plugins/claude-plugin-runtime.js +11 -3
- package/dist/tools/claude-interactive-tools.d.ts +7 -0
- package/dist/tools/claude-interactive-tools.js +21 -8
- package/dist/tools/claude-task-tools.d.ts +4 -0
- package/dist/tools/claude-task-tools.js +7 -0
- package/package.json +2 -1
- package/dist/application/background-agent-manager.d.ts.map +0 -1
- package/dist/application/background-agent-manager.js.map +0 -1
- package/dist/application/background-bash-manager.d.ts.map +0 -1
- package/dist/application/background-bash-manager.js.map +0 -1
- package/dist/application/background-task-id.d.ts.map +0 -1
- package/dist/application/background-task-id.js.map +0 -1
- package/dist/application/claude-project-purge.d.ts.map +0 -1
- package/dist/application/claude-project-purge.js.map +0 -1
- package/dist/application/managed-worktree.d.ts.map +0 -1
- package/dist/application/managed-worktree.js.map +0 -1
- package/dist/application/model-compactor.d.ts.map +0 -1
- package/dist/application/model-compactor.js.map +0 -1
- package/dist/application/scheduled-prompt-manager.d.ts.map +0 -1
- package/dist/application/scheduled-prompt-manager.js.map +0 -1
- package/dist/application/session-service.d.ts.map +0 -1
- package/dist/application/session-service.js.map +0 -1
- package/dist/application/session-worktree.d.ts.map +0 -1
- package/dist/application/session-worktree.js.map +0 -1
- package/dist/application/subagent-service.d.ts.map +0 -1
- package/dist/application/subagent-service.js.map +0 -1
- package/dist/application/tool-use-summary.d.ts.map +0 -1
- package/dist/application/tool-use-summary.js.map +0 -1
- package/dist/application/top-level-agent-manager.d.ts.map +0 -1
- package/dist/application/top-level-agent-manager.js.map +0 -1
- package/dist/application/workflow-manager.d.ts.map +0 -1
- package/dist/application/workflow-manager.js.map +0 -1
- package/dist/application/workflow-meta.d.ts.map +0 -1
- package/dist/application/workflow-meta.js.map +0 -1
- package/dist/application/workflow-runtime.d.ts.map +0 -1
- package/dist/application/workflow-runtime.js.map +0 -1
- package/dist/application/workflow-worktree.d.ts.map +0 -1
- package/dist/application/workflow-worktree.js.map +0 -1
- package/dist/cli/agents-dashboard.d.ts.map +0 -1
- package/dist/cli/agents-dashboard.js.map +0 -1
- package/dist/cli/controls.d.ts.map +0 -1
- package/dist/cli/controls.js.map +0 -1
- package/dist/cli/debug.d.ts.map +0 -1
- package/dist/cli/debug.js.map +0 -1
- package/dist/cli/interactive.d.ts.map +0 -1
- package/dist/cli/interactive.js.map +0 -1
- package/dist/cli/protocol.d.ts.map +0 -1
- package/dist/cli/protocol.js.map +0 -1
- package/dist/cli/tui/claude-style.d.ts.map +0 -1
- package/dist/cli/tui/claude-style.js.map +0 -1
- package/dist/cli/tui/clipboard.d.ts.map +0 -1
- package/dist/cli/tui/clipboard.js.map +0 -1
- package/dist/cli/tui/composer-editor.d.ts.map +0 -1
- package/dist/cli/tui/composer-editor.js.map +0 -1
- package/dist/cli/tui/composer-images.d.ts.map +0 -1
- package/dist/cli/tui/composer-images.js.map +0 -1
- package/dist/cli/tui/conversation-export.d.ts.map +0 -1
- package/dist/cli/tui/conversation-export.js.map +0 -1
- package/dist/cli/tui/external-editor.d.ts.map +0 -1
- package/dist/cli/tui/external-editor.js.map +0 -1
- package/dist/cli/tui/file-picker.d.ts.map +0 -1
- package/dist/cli/tui/file-picker.js.map +0 -1
- package/dist/cli/tui/git-diff.d.ts.map +0 -1
- package/dist/cli/tui/git-diff.js.map +0 -1
- package/dist/cli/tui/hook-settings.d.ts.map +0 -1
- package/dist/cli/tui/hook-settings.js.map +0 -1
- package/dist/cli/tui/keybindings.d.ts.map +0 -1
- package/dist/cli/tui/keybindings.js.map +0 -1
- package/dist/cli/tui/memory-files.d.ts.map +0 -1
- package/dist/cli/tui/memory-files.js.map +0 -1
- package/dist/cli/tui/permission-settings.d.ts.map +0 -1
- package/dist/cli/tui/permission-settings.js.map +0 -1
- package/dist/cli/tui/slash-commands.d.ts.map +0 -1
- package/dist/cli/tui/slash-commands.js.map +0 -1
- package/dist/cli/tui/terminal-suspend.d.ts.map +0 -1
- package/dist/cli/tui/terminal-suspend.js.map +0 -1
- package/dist/cli/tui/workspace-directories.d.ts.map +0 -1
- package/dist/cli/tui/workspace-directories.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/compatibility/claude/compaction.d.ts.map +0 -1
- package/dist/compatibility/claude/compaction.js.map +0 -1
- package/dist/compatibility/claude/context.d.ts.map +0 -1
- package/dist/compatibility/claude/context.js.map +0 -1
- package/dist/compatibility/claude/dynamic-context.d.ts.map +0 -1
- package/dist/compatibility/claude/dynamic-context.js.map +0 -1
- package/dist/compatibility/claude/file-history.d.ts.map +0 -1
- package/dist/compatibility/claude/file-history.js.map +0 -1
- package/dist/compatibility/claude/file-resources.d.ts.map +0 -1
- package/dist/compatibility/claude/file-resources.js.map +0 -1
- package/dist/compatibility/claude/fork.d.ts.map +0 -1
- package/dist/compatibility/claude/fork.js.map +0 -1
- package/dist/compatibility/claude/history.d.ts.map +0 -1
- package/dist/compatibility/claude/history.js.map +0 -1
- package/dist/compatibility/claude/ownership.d.ts.map +0 -1
- package/dist/compatibility/claude/ownership.js.map +0 -1
- package/dist/compatibility/claude/paths.d.ts.map +0 -1
- package/dist/compatibility/claude/paths.js.map +0 -1
- package/dist/compatibility/claude/pr-links.d.ts.map +0 -1
- package/dist/compatibility/claude/pr-links.js.map +0 -1
- package/dist/compatibility/claude/projection.d.ts.map +0 -1
- package/dist/compatibility/claude/projection.js.map +0 -1
- package/dist/compatibility/claude/schema.d.ts.map +0 -1
- package/dist/compatibility/claude/schema.js.map +0 -1
- package/dist/compatibility/claude/shared-resources.d.ts.map +0 -1
- package/dist/compatibility/claude/shared-resources.js.map +0 -1
- package/dist/compatibility/claude/sidechain.d.ts.map +0 -1
- package/dist/compatibility/claude/sidechain.js.map +0 -1
- package/dist/compatibility/claude/tool-links.d.ts.map +0 -1
- package/dist/compatibility/claude/tool-links.js.map +0 -1
- package/dist/compatibility/claude/translation.d.ts.map +0 -1
- package/dist/compatibility/claude/translation.js.map +0 -1
- package/dist/compatibility/claude/workflow-replay.d.ts.map +0 -1
- package/dist/compatibility/claude/workflow-replay.js.map +0 -1
- package/dist/compatibility/claude/workflow.d.ts.map +0 -1
- package/dist/compatibility/claude/workflow.js.map +0 -1
- package/dist/core/compaction.d.ts.map +0 -1
- package/dist/core/compaction.js.map +0 -1
- package/dist/core/context-budget.d.ts.map +0 -1
- package/dist/core/context-budget.js.map +0 -1
- package/dist/core/context.d.ts.map +0 -1
- package/dist/core/context.js.map +0 -1
- package/dist/core/runtime.d.ts.map +0 -1
- package/dist/core/runtime.js.map +0 -1
- package/dist/core/usage.d.ts.map +0 -1
- package/dist/core/usage.js.map +0 -1
- package/dist/extensions/claude-extension-tools.d.ts.map +0 -1
- package/dist/extensions/claude-extension-tools.js.map +0 -1
- package/dist/extensions/claude-extensions.d.ts.map +0 -1
- package/dist/extensions/claude-extensions.js.map +0 -1
- package/dist/hooks/claude-hook-tools.d.ts.map +0 -1
- package/dist/hooks/claude-hook-tools.js.map +0 -1
- package/dist/hooks/claude-hooks.d.ts.map +0 -1
- package/dist/hooks/claude-hooks.js.map +0 -1
- package/dist/maintenance/doctor.d.ts.map +0 -1
- package/dist/maintenance/doctor.js.map +0 -1
- package/dist/maintenance/self-update.d.ts.map +0 -1
- package/dist/maintenance/self-update.js.map +0 -1
- package/dist/mcp/claude-mcp-management.d.ts.map +0 -1
- package/dist/mcp/claude-mcp-management.js.map +0 -1
- package/dist/mcp/claude-mcp-oauth.d.ts.map +0 -1
- package/dist/mcp/claude-mcp-oauth.js.map +0 -1
- package/dist/mcp/claude-mcp-tools.d.ts.map +0 -1
- package/dist/mcp/claude-mcp-tools.js.map +0 -1
- package/dist/mcp/praxis-mcp-server.d.ts.map +0 -1
- package/dist/mcp/praxis-mcp-server.js.map +0 -1
- package/dist/permissions/claude-auto-classifier.d.ts.map +0 -1
- package/dist/permissions/claude-auto-classifier.js.map +0 -1
- package/dist/permissions/claude-permission-resolver.d.ts.map +0 -1
- package/dist/permissions/claude-permission-resolver.js.map +0 -1
- package/dist/persistence/claude-job-store.d.ts.map +0 -1
- package/dist/persistence/claude-job-store.js.map +0 -1
- package/dist/persistence/claude-scheduled-task-store.d.ts.map +0 -1
- package/dist/persistence/claude-scheduled-task-store.js.map +0 -1
- package/dist/persistence/claude-sidechain-store.d.ts.map +0 -1
- package/dist/persistence/claude-sidechain-store.js.map +0 -1
- package/dist/persistence/claude-task-store.d.ts.map +0 -1
- package/dist/persistence/claude-task-store.js.map +0 -1
- package/dist/persistence/claude-transcript-store.d.ts.map +0 -1
- package/dist/persistence/claude-transcript-store.js.map +0 -1
- package/dist/persistence/claude-workflow-store.d.ts.map +0 -1
- package/dist/persistence/claude-workflow-store.js.map +0 -1
- package/dist/persistence/in-memory-sidechain-store.d.ts.map +0 -1
- package/dist/persistence/in-memory-sidechain-store.js.map +0 -1
- package/dist/persistence/in-memory-transcript-store.d.ts.map +0 -1
- package/dist/persistence/in-memory-transcript-store.js.map +0 -1
- package/dist/platform/atomic-write.d.ts.map +0 -1
- package/dist/platform/atomic-write.js.map +0 -1
- package/dist/platform/bounded-process-runner.d.ts.map +0 -1
- package/dist/platform/bounded-process-runner.js.map +0 -1
- package/dist/platform/claude-version.d.ts.map +0 -1
- package/dist/platform/claude-version.js.map +0 -1
- package/dist/platform/command-shell.d.ts.map +0 -1
- package/dist/platform/command-shell.js.map +0 -1
- package/dist/platform/exclusive-file-lease.d.ts.map +0 -1
- package/dist/platform/exclusive-file-lease.js.map +0 -1
- package/dist/platform/sensitive-data.d.ts.map +0 -1
- package/dist/platform/sensitive-data.js.map +0 -1
- package/dist/platform/tmux-worktree.d.ts.map +0 -1
- package/dist/platform/tmux-worktree.js.map +0 -1
- package/dist/plugins/claude-plugin-eval-discovery.d.ts.map +0 -1
- package/dist/plugins/claude-plugin-eval-discovery.js.map +0 -1
- package/dist/plugins/claude-plugin-eval-graders.d.ts.map +0 -1
- package/dist/plugins/claude-plugin-eval-graders.js.map +0 -1
- package/dist/plugins/claude-plugin-eval-runner.d.ts.map +0 -1
- package/dist/plugins/claude-plugin-eval-runner.js.map +0 -1
- package/dist/plugins/claude-plugin-eval-schema.d.ts.map +0 -1
- package/dist/plugins/claude-plugin-eval-schema.js.map +0 -1
- package/dist/plugins/claude-plugin-eval.d.ts.map +0 -1
- package/dist/plugins/claude-plugin-eval.js.map +0 -1
- package/dist/plugins/claude-plugin-maintenance.d.ts.map +0 -1
- package/dist/plugins/claude-plugin-maintenance.js.map +0 -1
- package/dist/plugins/claude-plugin-marketplace.d.ts.map +0 -1
- package/dist/plugins/claude-plugin-marketplace.js.map +0 -1
- package/dist/plugins/claude-plugin-mcpb.d.ts.map +0 -1
- package/dist/plugins/claude-plugin-mcpb.js.map +0 -1
- package/dist/plugins/claude-plugin-runtime.d.ts.map +0 -1
- package/dist/plugins/claude-plugin-runtime.js.map +0 -1
- package/dist/providers/anthropic-compatible.d.ts.map +0 -1
- package/dist/providers/anthropic-compatible.js.map +0 -1
- package/dist/providers/environment.d.ts.map +0 -1
- package/dist/providers/environment.js.map +0 -1
- package/dist/providers/fallback-provider.d.ts.map +0 -1
- package/dist/providers/fallback-provider.js.map +0 -1
- package/dist/providers/openai-compatible.d.ts.map +0 -1
- package/dist/providers/openai-compatible.js.map +0 -1
- package/dist/tools/claude-interactive-tools.d.ts.map +0 -1
- package/dist/tools/claude-interactive-tools.js.map +0 -1
- package/dist/tools/claude-lsp-formatters.d.ts.map +0 -1
- package/dist/tools/claude-lsp-formatters.js.map +0 -1
- package/dist/tools/claude-lsp-tool.d.ts.map +0 -1
- package/dist/tools/claude-lsp-tool.js.map +0 -1
- package/dist/tools/claude-scheduled-tools.d.ts.map +0 -1
- package/dist/tools/claude-scheduled-tools.js.map +0 -1
- package/dist/tools/claude-task-tools.d.ts.map +0 -1
- package/dist/tools/claude-task-tools.js.map +0 -1
- package/dist/tools/claude-user-message.d.ts.map +0 -1
- package/dist/tools/claude-user-message.js.map +0 -1
- package/dist/tools/claude-workflow-tools.d.ts.map +0 -1
- package/dist/tools/claude-workflow-tools.js.map +0 -1
- package/dist/tools/claude-worktree-tools.d.ts.map +0 -1
- package/dist/tools/claude-worktree-tools.js.map +0 -1
- package/dist/tools/filtered-tool-registry.d.ts.map +0 -1
- package/dist/tools/filtered-tool-registry.js.map +0 -1
- package/dist/tools/glob.d.ts.map +0 -1
- package/dist/tools/glob.js.map +0 -1
- package/dist/tools/local-tools.d.ts.map +0 -1
- package/dist/tools/local-tools.js.map +0 -1
- package/dist/tools/notebook.d.ts.map +0 -1
- package/dist/tools/notebook.js.map +0 -1
- package/dist/tools/pdf.d.ts.map +0 -1
- package/dist/tools/pdf.js.map +0 -1
- package/dist/tools/web.d.ts.map +0 -1
- package/dist/tools/web.js.map +0 -1
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { constants } from 'node:fs';
|
|
2
|
+
import { mkdir, open, readdir, readFile, rm } from 'node:fs/promises';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { setTimeout } from 'node:timers/promises';
|
|
6
|
+
import { writeFileAtomically } from '../../platform/atomic-write.js';
|
|
7
|
+
import { ExclusiveFileLease, } from '../../platform/exclusive-file-lease.js';
|
|
8
|
+
import { TUI_THEMES } from './theme.js';
|
|
9
|
+
export const CUSTOM_THEME_TOKENS = [
|
|
10
|
+
'autoAccept',
|
|
11
|
+
'autoAcceptShimmer',
|
|
12
|
+
'background',
|
|
13
|
+
'bashBorder',
|
|
14
|
+
'bashMessageBackgroundColor',
|
|
15
|
+
'blue_FOR_SUBAGENTS_ONLY',
|
|
16
|
+
'briefLabelClaude',
|
|
17
|
+
'briefLabelYou',
|
|
18
|
+
'chromeYellow',
|
|
19
|
+
'claude',
|
|
20
|
+
'claudeBlueShimmer_FOR_SYSTEM_SPINNER',
|
|
21
|
+
'claudeBlue_FOR_SYSTEM_SPINNER',
|
|
22
|
+
'claudeShimmer',
|
|
23
|
+
'clawd_background',
|
|
24
|
+
'clawd_body',
|
|
25
|
+
'cyan_FOR_SUBAGENTS_ONLY',
|
|
26
|
+
'diffAdded',
|
|
27
|
+
'diffAddedDimmed',
|
|
28
|
+
'diffAddedWord',
|
|
29
|
+
'diffRemoved',
|
|
30
|
+
'diffRemovedDimmed',
|
|
31
|
+
'diffRemovedWord',
|
|
32
|
+
'error',
|
|
33
|
+
'fastMode',
|
|
34
|
+
'fastModeShimmer',
|
|
35
|
+
'green_FOR_SUBAGENTS_ONLY',
|
|
36
|
+
'ide',
|
|
37
|
+
'inactive',
|
|
38
|
+
'inactiveShimmer',
|
|
39
|
+
'inverseText',
|
|
40
|
+
'memoryBackgroundColor',
|
|
41
|
+
'merged',
|
|
42
|
+
'messageActionsBackground',
|
|
43
|
+
'orange_FOR_SUBAGENTS_ONLY',
|
|
44
|
+
'pink_FOR_SUBAGENTS_ONLY',
|
|
45
|
+
'planMode',
|
|
46
|
+
'professionalBlue',
|
|
47
|
+
'promptBorder',
|
|
48
|
+
'promptBorderShimmer',
|
|
49
|
+
'purple_FOR_SUBAGENTS_ONLY',
|
|
50
|
+
'rainbow_blue',
|
|
51
|
+
'rainbow_blue_shimmer',
|
|
52
|
+
'rainbow_green',
|
|
53
|
+
'rainbow_green_shimmer',
|
|
54
|
+
'rainbow_indigo',
|
|
55
|
+
'rainbow_indigo_shimmer',
|
|
56
|
+
'rainbow_orange',
|
|
57
|
+
'rainbow_orange_shimmer',
|
|
58
|
+
'rainbow_red',
|
|
59
|
+
'rainbow_red_shimmer',
|
|
60
|
+
'rainbow_violet',
|
|
61
|
+
'rainbow_violet_shimmer',
|
|
62
|
+
'rainbow_yellow',
|
|
63
|
+
'rainbow_yellow_shimmer',
|
|
64
|
+
'rate_limit_empty',
|
|
65
|
+
'rate_limit_fill',
|
|
66
|
+
'red_FOR_SUBAGENTS_ONLY',
|
|
67
|
+
'remember',
|
|
68
|
+
'selectionBg',
|
|
69
|
+
'success',
|
|
70
|
+
'subtle',
|
|
71
|
+
'suggestion',
|
|
72
|
+
'text',
|
|
73
|
+
'userMessageBackground',
|
|
74
|
+
'userMessageBackgroundHover',
|
|
75
|
+
'warning',
|
|
76
|
+
'warningShimmer',
|
|
77
|
+
'yellow_FOR_SUBAGENTS_ONLY',
|
|
78
|
+
];
|
|
79
|
+
const MAX_THEME_FILE_BYTES = 256 * 1024;
|
|
80
|
+
const CUSTOM_NAME = /^[A-Za-z][A-Za-z0-9 _-]{0,63}$/u;
|
|
81
|
+
const CUSTOM_SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u;
|
|
82
|
+
const HEX = /^#[0-9a-f]{6}$/iu;
|
|
83
|
+
const RGB = /^rgb\(\s*(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\s*,\s*(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\s*,\s*(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\s*\)$/iu;
|
|
84
|
+
const ANSI256 = /^ansi256\((?:[0-9]|[1-9]\d|1\d\d|2[0-4]\d)\)$/u;
|
|
85
|
+
const ANSI = /^ansi:[A-Za-z][A-Za-z0-9]*$/u;
|
|
86
|
+
function configRootPath() {
|
|
87
|
+
return process.env.CLAUDE_CONFIG_DIR ?? join(homedir(), '.claude');
|
|
88
|
+
}
|
|
89
|
+
export function customThemeDirectory(configRoot = configRootPath()) {
|
|
90
|
+
return join(configRoot, 'themes');
|
|
91
|
+
}
|
|
92
|
+
function slugify(name) {
|
|
93
|
+
return name
|
|
94
|
+
.trim()
|
|
95
|
+
.toLowerCase()
|
|
96
|
+
.replace(/[^a-z0-9]+/gu, '-')
|
|
97
|
+
.replace(/^-+|-+$/gu, '');
|
|
98
|
+
}
|
|
99
|
+
export function validateCustomThemeName(name) {
|
|
100
|
+
const normalized = name.trim();
|
|
101
|
+
if (!CUSTOM_NAME.test(normalized)) {
|
|
102
|
+
throw new Error('Theme name must start with a letter and contain only letters, numbers, spaces, hyphens, or underscores (1–64 characters).');
|
|
103
|
+
}
|
|
104
|
+
const slug = slugify(normalized);
|
|
105
|
+
if (!CUSTOM_SLUG.test(slug))
|
|
106
|
+
throw new Error('Theme name must contain at least one ASCII letter or number.');
|
|
107
|
+
return slug;
|
|
108
|
+
}
|
|
109
|
+
function validateColor(value) {
|
|
110
|
+
const normalized = value.trim();
|
|
111
|
+
if (!HEX.test(normalized) &&
|
|
112
|
+
!RGB.test(normalized) &&
|
|
113
|
+
!ANSI256.test(normalized) &&
|
|
114
|
+
!ANSI.test(normalized)) {
|
|
115
|
+
throw new Error(`Invalid theme color ${JSON.stringify(value)}. Use rgb(r,g,b), #rrggbb, ansi256(n), or ansi:name.`);
|
|
116
|
+
}
|
|
117
|
+
return normalized;
|
|
118
|
+
}
|
|
119
|
+
function parseTheme(value, slug) {
|
|
120
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
121
|
+
throw new Error(`Invalid custom theme file: ${slug}.json`);
|
|
122
|
+
const record = value;
|
|
123
|
+
if (typeof record.name !== 'string' || !CUSTOM_NAME.test(record.name))
|
|
124
|
+
throw new Error(`Invalid custom theme name: ${slug}.json`);
|
|
125
|
+
if (!TUI_THEMES.includes(record.base) ||
|
|
126
|
+
record.base === 'auto')
|
|
127
|
+
throw new Error(`Invalid custom theme base: ${slug}.json`);
|
|
128
|
+
if (typeof record.overrides !== 'object' ||
|
|
129
|
+
record.overrides === null ||
|
|
130
|
+
Array.isArray(record.overrides))
|
|
131
|
+
throw new Error(`Invalid custom theme overrides: ${slug}.json`);
|
|
132
|
+
const overrides = {};
|
|
133
|
+
for (const [token, color] of Object.entries(record.overrides)) {
|
|
134
|
+
if (!CUSTOM_THEME_TOKENS.includes(token))
|
|
135
|
+
throw new Error(`Unknown custom theme token ${JSON.stringify(token)}.`);
|
|
136
|
+
if (typeof color !== 'string')
|
|
137
|
+
throw new Error(`Theme token ${token} must be a color string.`);
|
|
138
|
+
overrides[token] = validateColor(color);
|
|
139
|
+
}
|
|
140
|
+
const expectedSlug = slugify(record.name);
|
|
141
|
+
if (expectedSlug !== slug)
|
|
142
|
+
throw new Error(`Custom theme filename must match its name: ${slug}.json`);
|
|
143
|
+
return {
|
|
144
|
+
name: record.name,
|
|
145
|
+
slug,
|
|
146
|
+
base: record.base,
|
|
147
|
+
overrides,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
async function readThemeFile(path, slug) {
|
|
151
|
+
const handle = await open(path, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
|
|
152
|
+
try {
|
|
153
|
+
const info = await handle.stat();
|
|
154
|
+
if (info.size > MAX_THEME_FILE_BYTES)
|
|
155
|
+
throw new Error(`Custom theme exceeds ${MAX_THEME_FILE_BYTES} bytes: ${path}`);
|
|
156
|
+
return parseTheme(JSON.parse(await handle.readFile('utf8')), slug);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
if (error instanceof SyntaxError)
|
|
160
|
+
throw new Error(`Invalid JSON: ${path}`, { cause: error });
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
163
|
+
finally {
|
|
164
|
+
await handle.close();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async function acquireThemeLease(directory) {
|
|
168
|
+
const lease = new ExclusiveFileLease(join(directory, '.praxis-themes.lock'));
|
|
169
|
+
for (let attempt = 0; attempt < 400; attempt += 1) {
|
|
170
|
+
const handle = await lease.tryAcquire();
|
|
171
|
+
if (handle)
|
|
172
|
+
return handle;
|
|
173
|
+
await setTimeout(5);
|
|
174
|
+
}
|
|
175
|
+
throw new Error(`Custom theme write lock timed out: ${directory}`);
|
|
176
|
+
}
|
|
177
|
+
export async function loadTuiCustomThemes(configRoot = configRootPath()) {
|
|
178
|
+
const directory = customThemeDirectory(configRoot);
|
|
179
|
+
let entries;
|
|
180
|
+
try {
|
|
181
|
+
entries = await readdir(directory, { withFileTypes: true });
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
if (error.code === 'ENOENT')
|
|
185
|
+
return [];
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
188
|
+
const themes = [];
|
|
189
|
+
for (const entry of entries) {
|
|
190
|
+
if (!entry.isFile() || !entry.name.endsWith('.json'))
|
|
191
|
+
continue;
|
|
192
|
+
const slug = entry.name.slice(0, -'.json'.length);
|
|
193
|
+
if (!CUSTOM_SLUG.test(slug))
|
|
194
|
+
throw new Error(`Invalid custom theme filename: ${entry.name}`);
|
|
195
|
+
themes.push(await readThemeFile(join(directory, entry.name), slug));
|
|
196
|
+
}
|
|
197
|
+
return themes.sort((left, right) => left.name.localeCompare(right.name));
|
|
198
|
+
}
|
|
199
|
+
function serializedTheme(theme) {
|
|
200
|
+
return `${JSON.stringify({ name: theme.name, base: theme.base, overrides: theme.overrides }, null, 2)}\n`;
|
|
201
|
+
}
|
|
202
|
+
export async function createTuiCustomTheme({ name, base, configRoot = configRootPath(), }) {
|
|
203
|
+
const slug = validateCustomThemeName(name);
|
|
204
|
+
if (!TUI_THEMES.includes(base) ||
|
|
205
|
+
base === 'auto')
|
|
206
|
+
throw new Error(`Invalid custom theme base: ${base}`);
|
|
207
|
+
const directory = customThemeDirectory(configRoot);
|
|
208
|
+
await mkdir(directory, { recursive: true });
|
|
209
|
+
const handle = await acquireThemeLease(directory);
|
|
210
|
+
try {
|
|
211
|
+
const path = join(directory, `${slug}.json`);
|
|
212
|
+
try {
|
|
213
|
+
await readFile(path, 'utf8');
|
|
214
|
+
throw new Error(`A custom theme named ${JSON.stringify(name.trim())} already exists.`);
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
if (error.code !== 'ENOENT')
|
|
218
|
+
throw error;
|
|
219
|
+
}
|
|
220
|
+
const theme = {
|
|
221
|
+
name: name.trim(),
|
|
222
|
+
slug,
|
|
223
|
+
base,
|
|
224
|
+
overrides: {},
|
|
225
|
+
};
|
|
226
|
+
const committed = await writeFileAtomically(path, serializedTheme(theme), {
|
|
227
|
+
mode: 0o600,
|
|
228
|
+
beforeCommit: async () => {
|
|
229
|
+
try {
|
|
230
|
+
await readFile(path, 'utf8');
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
if (error.code === 'ENOENT')
|
|
235
|
+
return true;
|
|
236
|
+
throw error;
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
if (!committed)
|
|
241
|
+
throw new Error(`A custom theme named ${JSON.stringify(name.trim())} already exists.`);
|
|
242
|
+
return theme;
|
|
243
|
+
}
|
|
244
|
+
finally {
|
|
245
|
+
await handle.release();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
export async function updateTuiCustomTheme(theme, token, value, configRoot = configRootPath()) {
|
|
249
|
+
const color = value === undefined ? undefined : validateColor(value);
|
|
250
|
+
const directory = customThemeDirectory(configRoot);
|
|
251
|
+
await mkdir(directory, { recursive: true });
|
|
252
|
+
const handle = await acquireThemeLease(directory);
|
|
253
|
+
try {
|
|
254
|
+
const path = join(directory, `${theme.slug}.json`);
|
|
255
|
+
const current = await readThemeFile(path, theme.slug);
|
|
256
|
+
const overrides = { ...current.overrides };
|
|
257
|
+
if (color === undefined)
|
|
258
|
+
delete overrides[token];
|
|
259
|
+
else
|
|
260
|
+
overrides[token] = color;
|
|
261
|
+
const next = { ...current, overrides };
|
|
262
|
+
if (!(await writeFileAtomically(path, serializedTheme(next))))
|
|
263
|
+
throw new Error(`Unable to update custom theme: ${path}`);
|
|
264
|
+
return next;
|
|
265
|
+
}
|
|
266
|
+
finally {
|
|
267
|
+
await handle.release();
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
export async function deleteTuiCustomTheme(theme, configRoot = configRootPath()) {
|
|
271
|
+
const directory = customThemeDirectory(configRoot);
|
|
272
|
+
const handle = await acquireThemeLease(directory);
|
|
273
|
+
try {
|
|
274
|
+
await rm(join(directory, `${theme.slug}.json`), { force: false });
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
if (error.code !== 'ENOENT')
|
|
278
|
+
throw error;
|
|
279
|
+
}
|
|
280
|
+
finally {
|
|
281
|
+
await handle.release();
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=custom-themes.js.map
|
|
@@ -11,7 +11,9 @@ export type TuiMentionEntry = ({
|
|
|
11
11
|
} & TuiFileEntry) | ({
|
|
12
12
|
kind: 'agent';
|
|
13
13
|
} & TuiAgentEntry);
|
|
14
|
-
export declare function loadTuiFileEntries(cwd: string
|
|
14
|
+
export declare function loadTuiFileEntries(cwd: string, options?: {
|
|
15
|
+
respectGitignore?: boolean;
|
|
16
|
+
}): Promise<readonly TuiFileEntry[]>;
|
|
15
17
|
export declare function filterTuiFileEntries(entries: readonly TuiFileEntry[], query: string): readonly TuiFileEntry[];
|
|
16
18
|
export declare function filterTuiMentionEntries(files: readonly TuiFileEntry[], agents: readonly TuiAgentEntry[], query: string): readonly TuiMentionEntry[];
|
|
17
19
|
export declare function fileReferenceAtCursor(input: string, cursor: number): {
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { execFile } from 'node:child_process';
|
|
2
2
|
import { promisify } from 'node:util';
|
|
3
3
|
const execFileAsync = promisify(execFile);
|
|
4
|
-
export async function loadTuiFileEntries(cwd) {
|
|
4
|
+
export async function loadTuiFileEntries(cwd, options = {}) {
|
|
5
5
|
let stdout;
|
|
6
6
|
try {
|
|
7
|
-
const result = await execFileAsync('rg', [
|
|
7
|
+
const result = await execFileAsync('rg', [
|
|
8
|
+
'--files',
|
|
9
|
+
'--hidden',
|
|
10
|
+
...(options.respectGitignore === false ? ['--no-ignore'] : []),
|
|
11
|
+
'--glob',
|
|
12
|
+
'!.git/**',
|
|
13
|
+
], {
|
|
8
14
|
cwd,
|
|
9
15
|
encoding: 'utf8',
|
|
10
16
|
maxBuffer: 4 * 1024 * 1024,
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ClaudeMcpManagement } from '../../mcp/claude-mcp-management.js';
|
|
2
|
+
import type { ClaudeMcpRuntime } from '../../mcp/claude-mcp-tools.js';
|
|
3
|
+
import { type TuiMcpPanelInput, type TuiMcpPanelCommand, type TuiMcpPanelModel, type TuiMcpPanelState } from './mcp-panel-projector.js';
|
|
4
|
+
export type TuiMcpRuntimeController = ClaudeMcpRuntime;
|
|
5
|
+
export interface TuiMcpSessionCommands {
|
|
6
|
+
mcpInspect(): ReturnType<ClaudeMcpRuntime['inspect']>;
|
|
7
|
+
mcpReconnect(name: string): ReturnType<ClaudeMcpRuntime['reconnect']>;
|
|
8
|
+
mcpAuthenticate(name: string): ReturnType<ClaudeMcpRuntime['authenticate']>;
|
|
9
|
+
mcpReload(): ReturnType<ClaudeMcpRuntime['reload']>;
|
|
10
|
+
mcpTools(name: string): ReturnType<ClaudeMcpRuntime['tools']>;
|
|
11
|
+
}
|
|
12
|
+
export declare function mcpRuntimeFromSession(commands: TuiMcpSessionCommands): TuiMcpRuntimeController;
|
|
13
|
+
export interface TuiMcpPanelDispatchResult {
|
|
14
|
+
model: TuiMcpPanelModel;
|
|
15
|
+
state: TuiMcpPanelState;
|
|
16
|
+
closed: boolean;
|
|
17
|
+
error?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class McpPanelController {
|
|
20
|
+
private readonly cwd;
|
|
21
|
+
private readonly management;
|
|
22
|
+
private readonly runtime;
|
|
23
|
+
constructor(options: {
|
|
24
|
+
cwd: string;
|
|
25
|
+
management: Pick<ClaudeMcpManagement, 'list' | 'disabled' | 'setEnabled'>;
|
|
26
|
+
runtime: ClaudeMcpRuntime;
|
|
27
|
+
});
|
|
28
|
+
open(): Promise<TuiMcpPanelModel>;
|
|
29
|
+
execute(command: TuiMcpPanelCommand): Promise<TuiMcpPanelModel | null>;
|
|
30
|
+
dispatch(model: TuiMcpPanelModel, state: TuiMcpPanelState, input: TuiMcpPanelInput, onOperation?: (command: TuiMcpPanelCommand) => void): Promise<TuiMcpPanelDispatchResult>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=mcp-panel-controller.d.ts.map
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { projectTuiMcpPanel, reduceTuiMcpPanelState, } from './mcp-panel-projector.js';
|
|
2
|
+
export function mcpRuntimeFromSession(commands) {
|
|
3
|
+
return {
|
|
4
|
+
inspect: () => commands.mcpInspect(),
|
|
5
|
+
reconnect: (name) => commands.mcpReconnect(name),
|
|
6
|
+
authenticate: (name) => commands.mcpAuthenticate(name),
|
|
7
|
+
reload: () => commands.mcpReload(),
|
|
8
|
+
tools: (name) => commands.mcpTools(name),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export class McpPanelController {
|
|
12
|
+
cwd;
|
|
13
|
+
management;
|
|
14
|
+
runtime;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.cwd = options.cwd;
|
|
17
|
+
this.management = options.management;
|
|
18
|
+
this.runtime = options.runtime;
|
|
19
|
+
}
|
|
20
|
+
async open() {
|
|
21
|
+
const [records, disabledNames, runtime] = await Promise.all([
|
|
22
|
+
this.management.list(),
|
|
23
|
+
this.management.disabled(),
|
|
24
|
+
this.runtime.inspect(),
|
|
25
|
+
]);
|
|
26
|
+
return projectTuiMcpPanel({
|
|
27
|
+
cwd: this.cwd,
|
|
28
|
+
records,
|
|
29
|
+
disabledNames,
|
|
30
|
+
runtime,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async execute(command) {
|
|
34
|
+
if (command.type === 'close')
|
|
35
|
+
return null;
|
|
36
|
+
if (command.type === 'reconnect') {
|
|
37
|
+
await this.runtime.reconnect(command.name);
|
|
38
|
+
return this.open();
|
|
39
|
+
}
|
|
40
|
+
if (command.type === 'authenticate') {
|
|
41
|
+
await this.runtime.authenticate(command.name);
|
|
42
|
+
return this.open();
|
|
43
|
+
}
|
|
44
|
+
if (command.type === 'set-enabled') {
|
|
45
|
+
await this.management.setEnabled(command.name, command.scope, command.enabled);
|
|
46
|
+
await this.runtime.reload();
|
|
47
|
+
return this.open();
|
|
48
|
+
}
|
|
49
|
+
const tools = await this.runtime.tools(command.name);
|
|
50
|
+
const model = await this.open();
|
|
51
|
+
return {
|
|
52
|
+
...model,
|
|
53
|
+
servers: model.servers.map((server) => server.name === command.name ? { ...server, tools } : server),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async dispatch(model, state, input, onOperation) {
|
|
57
|
+
const transition = reduceTuiMcpPanelState(model, state, input);
|
|
58
|
+
if (!transition.command) {
|
|
59
|
+
return { model, state: transition.state, closed: false };
|
|
60
|
+
}
|
|
61
|
+
onOperation?.(transition.command);
|
|
62
|
+
try {
|
|
63
|
+
const next = await this.execute(transition.command);
|
|
64
|
+
return {
|
|
65
|
+
model: next ?? model,
|
|
66
|
+
state: transition.state,
|
|
67
|
+
closed: next === null,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
return {
|
|
72
|
+
model,
|
|
73
|
+
state,
|
|
74
|
+
closed: false,
|
|
75
|
+
error: error instanceof Error ? error.message : String(error),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=mcp-panel-controller.js.map
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { McpScope, McpServerRecord } from '../../mcp/claude-mcp-management.js';
|
|
2
|
+
export type TuiMcpCapability = 'tools' | 'resources' | 'prompts';
|
|
3
|
+
export type TuiMcpServerStatus = 'connected' | 'failed' | 'disabled' | 'needs-authentication';
|
|
4
|
+
export interface TuiMcpTool {
|
|
5
|
+
name: string;
|
|
6
|
+
fullName: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface TuiMcpRuntimeServer {
|
|
10
|
+
name: string;
|
|
11
|
+
status: Exclude<TuiMcpServerStatus, 'disabled'>;
|
|
12
|
+
statusDetail?: string;
|
|
13
|
+
authDetail?: string;
|
|
14
|
+
capabilities?: readonly TuiMcpCapability[];
|
|
15
|
+
toolCount?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface TuiMcpServer {
|
|
18
|
+
name: string;
|
|
19
|
+
scope: McpScope;
|
|
20
|
+
path: string;
|
|
21
|
+
location: string;
|
|
22
|
+
status: TuiMcpServerStatus;
|
|
23
|
+
statusDetail: string;
|
|
24
|
+
authDetail?: string;
|
|
25
|
+
transport: 'stdio' | 'http' | 'sse';
|
|
26
|
+
command?: string;
|
|
27
|
+
args: readonly string[];
|
|
28
|
+
url?: string;
|
|
29
|
+
capabilities: readonly TuiMcpCapability[];
|
|
30
|
+
toolCount: number;
|
|
31
|
+
tools?: readonly TuiMcpTool[];
|
|
32
|
+
}
|
|
33
|
+
export interface TuiMcpPanelModel {
|
|
34
|
+
cwd: string;
|
|
35
|
+
servers: readonly TuiMcpServer[];
|
|
36
|
+
}
|
|
37
|
+
export type TuiMcpPanelDepth = 'list' | 'detail' | 'tools' | 'tool';
|
|
38
|
+
export interface TuiMcpPanelState {
|
|
39
|
+
depth: TuiMcpPanelDepth;
|
|
40
|
+
serverIndex: number;
|
|
41
|
+
selectedIndex: number;
|
|
42
|
+
}
|
|
43
|
+
export type TuiMcpPanelInput = {
|
|
44
|
+
type: 'up' | 'down' | 'confirm' | 'back';
|
|
45
|
+
} | {
|
|
46
|
+
type: 'select';
|
|
47
|
+
index: number;
|
|
48
|
+
};
|
|
49
|
+
export type TuiMcpPanelCommand = {
|
|
50
|
+
type: 'close';
|
|
51
|
+
} | {
|
|
52
|
+
type: 'view-tools';
|
|
53
|
+
name: string;
|
|
54
|
+
} | {
|
|
55
|
+
type: 'reconnect';
|
|
56
|
+
name: string;
|
|
57
|
+
} | {
|
|
58
|
+
type: 'authenticate';
|
|
59
|
+
name: string;
|
|
60
|
+
} | {
|
|
61
|
+
type: 'set-enabled';
|
|
62
|
+
name: string;
|
|
63
|
+
scope: McpScope;
|
|
64
|
+
enabled: boolean;
|
|
65
|
+
};
|
|
66
|
+
export interface TuiMcpPanelTransition {
|
|
67
|
+
state: TuiMcpPanelState;
|
|
68
|
+
command?: TuiMcpPanelCommand;
|
|
69
|
+
}
|
|
70
|
+
export declare function projectTuiMcpPanel({ cwd, records, disabledNames, runtime, }: {
|
|
71
|
+
cwd: string;
|
|
72
|
+
records: readonly McpServerRecord[];
|
|
73
|
+
disabledNames: readonly string[];
|
|
74
|
+
runtime: readonly TuiMcpRuntimeServer[];
|
|
75
|
+
}): TuiMcpPanelModel;
|
|
76
|
+
export declare function initialTuiMcpPanelState(model: TuiMcpPanelModel): TuiMcpPanelState;
|
|
77
|
+
export declare function tuiMcpServerActions(server: TuiMcpServer): readonly TuiMcpPanelCommand[];
|
|
78
|
+
export declare function reduceTuiMcpPanelState(model: TuiMcpPanelModel, state: TuiMcpPanelState, input: TuiMcpPanelInput): TuiMcpPanelTransition;
|
|
79
|
+
//# sourceMappingURL=mcp-panel-projector.d.ts.map
|