@mragentix/cli 4.2.37
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/LICENSE +21 -0
- package/README.md +149 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +772 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +29 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session.d.ts +87 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +498 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/agents.d.ts +30 -0
- package/dist/core/agents.d.ts.map +1 -0
- package/dist/core/agents.js +91 -0
- package/dist/core/agents.js.map +1 -0
- package/dist/core/auth-storage.d.ts +35 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +144 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/auto-update.d.ts +8 -0
- package/dist/core/auto-update.d.ts.map +1 -0
- package/dist/core/auto-update.js +152 -0
- package/dist/core/auto-update.js.map +1 -0
- package/dist/core/compaction/compactor.d.ts +69 -0
- package/dist/core/compaction/compactor.d.ts.map +1 -0
- package/dist/core/compaction/compactor.js +405 -0
- package/dist/core/compaction/compactor.js.map +1 -0
- package/dist/core/compaction/compactor.test.d.ts +2 -0
- package/dist/core/compaction/compactor.test.d.ts.map +1 -0
- package/dist/core/compaction/compactor.test.js +461 -0
- package/dist/core/compaction/compactor.test.js.map +1 -0
- package/dist/core/compaction/token-estimator.d.ts +10 -0
- package/dist/core/compaction/token-estimator.d.ts.map +1 -0
- package/dist/core/compaction/token-estimator.js +75 -0
- package/dist/core/compaction/token-estimator.js.map +1 -0
- package/dist/core/compaction/token-estimator.test.d.ts +2 -0
- package/dist/core/compaction/token-estimator.test.d.ts.map +1 -0
- package/dist/core/compaction/token-estimator.test.js +137 -0
- package/dist/core/compaction/token-estimator.test.js.map +1 -0
- package/dist/core/custom-commands.d.ts +13 -0
- package/dist/core/custom-commands.d.ts.map +1 -0
- package/dist/core/custom-commands.js +40 -0
- package/dist/core/custom-commands.js.map +1 -0
- package/dist/core/event-bus.d.ts +95 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +99 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +8 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +48 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/types.d.ts +19 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +2 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/file-lock.d.ts +6 -0
- package/dist/core/file-lock.d.ts.map +1 -0
- package/dist/core/file-lock.js +76 -0
- package/dist/core/file-lock.js.map +1 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +26 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +132 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/mcp/client.d.ts +9 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +126 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/defaults.d.ts +9 -0
- package/dist/core/mcp/defaults.d.ts.map +1 -0
- package/dist/core/mcp/defaults.js +47 -0
- package/dist/core/mcp/defaults.js.map +1 -0
- package/dist/core/mcp/index.d.ts +4 -0
- package/dist/core/mcp/index.d.ts.map +1 -0
- package/dist/core/mcp/index.js +3 -0
- package/dist/core/mcp/index.js.map +1 -0
- package/dist/core/mcp/types.d.ts +15 -0
- package/dist/core/mcp/types.d.ts.map +1 -0
- package/dist/core/mcp/types.js +2 -0
- package/dist/core/mcp/types.js.map +1 -0
- package/dist/core/model-registry.d.ts +25 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +135 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/oauth/anthropic.d.ts +4 -0
- package/dist/core/oauth/anthropic.d.ts.map +1 -0
- package/dist/core/oauth/anthropic.js +75 -0
- package/dist/core/oauth/anthropic.js.map +1 -0
- package/dist/core/oauth/openai.d.ts +4 -0
- package/dist/core/oauth/openai.d.ts.map +1 -0
- package/dist/core/oauth/openai.js +186 -0
- package/dist/core/oauth/openai.js.map +1 -0
- package/dist/core/oauth/pkce.d.ts +5 -0
- package/dist/core/oauth/pkce.d.ts.map +1 -0
- package/dist/core/oauth/pkce.js +17 -0
- package/dist/core/oauth/pkce.js.map +1 -0
- package/dist/core/oauth/types.d.ts +12 -0
- package/dist/core/oauth/types.d.ts.map +1 -0
- package/dist/core/oauth/types.js +2 -0
- package/dist/core/oauth/types.js.map +1 -0
- package/dist/core/process-manager.d.ts +30 -0
- package/dist/core/process-manager.d.ts.map +1 -0
- package/dist/core/process-manager.js +130 -0
- package/dist/core/process-manager.js.map +1 -0
- package/dist/core/prompt-commands.d.ts +14 -0
- package/dist/core/prompt-commands.d.ts.map +1 -0
- package/dist/core/prompt-commands.js +496 -0
- package/dist/core/prompt-commands.js.map +1 -0
- package/dist/core/session-manager.d.ts +112 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +326 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-manager.d.ts +43 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +64 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +23 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +89 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +35 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +183 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/telegram.d.ts +94 -0
- package/dist/core/telegram.d.ts.map +1 -0
- package/dist/core/telegram.js +227 -0
- package/dist/core/telegram.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive.d.ts +3 -0
- package/dist/interactive.d.ts.map +1 -0
- package/dist/interactive.js +173 -0
- package/dist/interactive.js.map +1 -0
- package/dist/modes/index.d.ts +3 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +3 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/json-mode.d.ts +13 -0
- package/dist/modes/json-mode.d.ts.map +1 -0
- package/dist/modes/json-mode.js +74 -0
- package/dist/modes/json-mode.js.map +1 -0
- package/dist/modes/print-mode.d.ts +12 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +49 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc-mode.d.ts +28 -0
- package/dist/modes/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc-mode.js +145 -0
- package/dist/modes/rpc-mode.js.map +1 -0
- package/dist/modes/serve-mode.d.ts +21 -0
- package/dist/modes/serve-mode.d.ts.map +1 -0
- package/dist/modes/serve-mode.js +649 -0
- package/dist/modes/serve-mode.js.map +1 -0
- package/dist/session.d.ts +16 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +129 -0
- package/dist/session.js.map +1 -0
- package/dist/system-prompt.d.ts +6 -0
- package/dist/system-prompt.d.ts.map +1 -0
- package/dist/system-prompt.js +115 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/tools/bash.d.ts +13 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +165 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit-diff.d.ts +18 -0
- package/dist/tools/edit-diff.d.ts.map +1 -0
- package/dist/tools/edit-diff.js +92 -0
- package/dist/tools/edit-diff.js.map +1 -0
- package/dist/tools/edit.d.ts +11 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +57 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/find.d.ts +9 -0
- package/dist/tools/find.d.ts.map +1 -0
- package/dist/tools/find.js +59 -0
- package/dist/tools/find.js.map +1 -0
- package/dist/tools/grep.d.ts +13 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +121 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +30 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +50 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/ls.d.ts +10 -0
- package/dist/tools/ls.d.ts.map +1 -0
- package/dist/tools/ls.js +56 -0
- package/dist/tools/ls.js.map +1 -0
- package/dist/tools/operations.d.ts +39 -0
- package/dist/tools/operations.d.ts.map +1 -0
- package/dist/tools/operations.js +27 -0
- package/dist/tools/operations.js.map +1 -0
- package/dist/tools/path-utils.d.ts +7 -0
- package/dist/tools/path-utils.d.ts.map +1 -0
- package/dist/tools/path-utils.js +27 -0
- package/dist/tools/path-utils.js.map +1 -0
- package/dist/tools/read.d.ts +12 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +113 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/subagent.d.ts +26 -0
- package/dist/tools/subagent.d.ts.map +1 -0
- package/dist/tools/subagent.js +210 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/task-output.d.ts +10 -0
- package/dist/tools/task-output.d.ts.map +1 -0
- package/dist/tools/task-output.js +33 -0
- package/dist/tools/task-output.js.map +1 -0
- package/dist/tools/task-stop.d.ts +9 -0
- package/dist/tools/task-stop.d.ts.map +1 -0
- package/dist/tools/task-stop.js +15 -0
- package/dist/tools/task-stop.js.map +1 -0
- package/dist/tools/tasks.d.ts +16 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +132 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/truncate.d.ts +19 -0
- package/dist/tools/truncate.d.ts.map +1 -0
- package/dist/tools/truncate.js +59 -0
- package/dist/tools/truncate.js.map +1 -0
- package/dist/tools/truncate.test.d.ts +2 -0
- package/dist/tools/truncate.test.d.ts.map +1 -0
- package/dist/tools/truncate.test.js +100 -0
- package/dist/tools/truncate.test.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +9 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +97 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/write.d.ts +10 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +30 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/tools/write.test.d.ts +2 -0
- package/dist/tools/write.test.d.ts.map +1 -0
- package/dist/tools/write.test.js +84 -0
- package/dist/tools/write.test.js.map +1 -0
- package/dist/types.d.ts +36 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/App.d.ts +148 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +1191 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/components/ActivityIndicator.d.ts +13 -0
- package/dist/ui/components/ActivityIndicator.d.ts.map +1 -0
- package/dist/ui/components/ActivityIndicator.js +313 -0
- package/dist/ui/components/ActivityIndicator.js.map +1 -0
- package/dist/ui/components/AnimationContext.d.ts +22 -0
- package/dist/ui/components/AnimationContext.d.ts.map +1 -0
- package/dist/ui/components/AnimationContext.js +35 -0
- package/dist/ui/components/AnimationContext.js.map +1 -0
- package/dist/ui/components/AssistantMessage.d.ts +9 -0
- package/dist/ui/components/AssistantMessage.d.ts.map +1 -0
- package/dist/ui/components/AssistantMessage.js +11 -0
- package/dist/ui/components/AssistantMessage.js.map +1 -0
- package/dist/ui/components/BackgroundTasksBar.d.ts +15 -0
- package/dist/ui/components/BackgroundTasksBar.d.ts.map +1 -0
- package/dist/ui/components/BackgroundTasksBar.js +74 -0
- package/dist/ui/components/BackgroundTasksBar.js.map +1 -0
- package/dist/ui/components/Banner.d.ts +11 -0
- package/dist/ui/components/Banner.d.ts.map +1 -0
- package/dist/ui/components/Banner.js +55 -0
- package/dist/ui/components/Banner.js.map +1 -0
- package/dist/ui/components/CompactionNotice.d.ts +10 -0
- package/dist/ui/components/CompactionNotice.d.ts.map +1 -0
- package/dist/ui/components/CompactionNotice.js +27 -0
- package/dist/ui/components/CompactionNotice.js.map +1 -0
- package/dist/ui/components/DiffView.d.ts +4 -0
- package/dist/ui/components/DiffView.d.ts.map +1 -0
- package/dist/ui/components/DiffView.js +20 -0
- package/dist/ui/components/DiffView.js.map +1 -0
- package/dist/ui/components/Footer.d.ts +10 -0
- package/dist/ui/components/Footer.d.ts.map +1 -0
- package/dist/ui/components/Footer.js +105 -0
- package/dist/ui/components/Footer.js.map +1 -0
- package/dist/ui/components/InputArea.d.ts +21 -0
- package/dist/ui/components/InputArea.d.ts.map +1 -0
- package/dist/ui/components/InputArea.js +465 -0
- package/dist/ui/components/InputArea.js.map +1 -0
- package/dist/ui/components/Markdown.d.ts +9 -0
- package/dist/ui/components/Markdown.d.ts.map +1 -0
- package/dist/ui/components/Markdown.js +246 -0
- package/dist/ui/components/Markdown.js.map +1 -0
- package/dist/ui/components/ModelSelector.d.ts +11 -0
- package/dist/ui/components/ModelSelector.d.ts.map +1 -0
- package/dist/ui/components/ModelSelector.js +20 -0
- package/dist/ui/components/ModelSelector.js.map +1 -0
- package/dist/ui/components/Overlay.d.ts +8 -0
- package/dist/ui/components/Overlay.d.ts.map +1 -0
- package/dist/ui/components/Overlay.js +9 -0
- package/dist/ui/components/Overlay.js.map +1 -0
- package/dist/ui/components/SelectList.d.ts +14 -0
- package/dist/ui/components/SelectList.d.ts.map +1 -0
- package/dist/ui/components/SelectList.js +46 -0
- package/dist/ui/components/SelectList.js.map +1 -0
- package/dist/ui/components/ServerToolExecution.d.ts +17 -0
- package/dist/ui/components/ServerToolExecution.d.ts.map +1 -0
- package/dist/ui/components/ServerToolExecution.js +26 -0
- package/dist/ui/components/ServerToolExecution.js.map +1 -0
- package/dist/ui/components/SessionSelector.d.ts +9 -0
- package/dist/ui/components/SessionSelector.d.ts.map +1 -0
- package/dist/ui/components/SessionSelector.js +13 -0
- package/dist/ui/components/SessionSelector.js.map +1 -0
- package/dist/ui/components/SettingsSelector.d.ts +9 -0
- package/dist/ui/components/SettingsSelector.d.ts.map +1 -0
- package/dist/ui/components/SettingsSelector.js +13 -0
- package/dist/ui/components/SettingsSelector.js.map +1 -0
- package/dist/ui/components/SlashCommandMenu.d.ts +15 -0
- package/dist/ui/components/SlashCommandMenu.d.ts.map +1 -0
- package/dist/ui/components/SlashCommandMenu.js +32 -0
- package/dist/ui/components/SlashCommandMenu.js.map +1 -0
- package/dist/ui/components/Spinner.d.ts +4 -0
- package/dist/ui/components/Spinner.d.ts.map +1 -0
- package/dist/ui/components/Spinner.js +13 -0
- package/dist/ui/components/Spinner.js.map +1 -0
- package/dist/ui/components/StreamingArea.d.ts +10 -0
- package/dist/ui/components/StreamingArea.d.ts.map +1 -0
- package/dist/ui/components/StreamingArea.js +58 -0
- package/dist/ui/components/StreamingArea.js.map +1 -0
- package/dist/ui/components/SubAgentPanel.d.ts +21 -0
- package/dist/ui/components/SubAgentPanel.d.ts.map +1 -0
- package/dist/ui/components/SubAgentPanel.js +71 -0
- package/dist/ui/components/SubAgentPanel.js.map +1 -0
- package/dist/ui/components/TaskOverlay.d.ts +10 -0
- package/dist/ui/components/TaskOverlay.d.ts.map +1 -0
- package/dist/ui/components/TaskOverlay.js +263 -0
- package/dist/ui/components/TaskOverlay.js.map +1 -0
- package/dist/ui/components/ThinkingBlock.d.ts +11 -0
- package/dist/ui/components/ThinkingBlock.d.ts.map +1 -0
- package/dist/ui/components/ThinkingBlock.js +43 -0
- package/dist/ui/components/ThinkingBlock.js.map +1 -0
- package/dist/ui/components/ThinkingIndicator.d.ts +6 -0
- package/dist/ui/components/ThinkingIndicator.d.ts.map +1 -0
- package/dist/ui/components/ThinkingIndicator.js +144 -0
- package/dist/ui/components/ThinkingIndicator.js.map +1 -0
- package/dist/ui/components/ToolExecution.d.ts +16 -0
- package/dist/ui/components/ToolExecution.d.ts.map +1 -0
- package/dist/ui/components/ToolExecution.js +490 -0
- package/dist/ui/components/ToolExecution.js.map +1 -0
- package/dist/ui/components/ToolGroupExecution.d.ts +7 -0
- package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -0
- package/dist/ui/components/ToolGroupExecution.js +115 -0
- package/dist/ui/components/ToolGroupExecution.js.map +1 -0
- package/dist/ui/components/UserMessage.d.ts +7 -0
- package/dist/ui/components/UserMessage.d.ts.map +1 -0
- package/dist/ui/components/UserMessage.js +16 -0
- package/dist/ui/components/UserMessage.js.map +1 -0
- package/dist/ui/components/index.d.ts +15 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/index.js +15 -0
- package/dist/ui/components/index.js.map +1 -0
- package/dist/ui/hooks/useAgentLoop.d.ts +69 -0
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -0
- package/dist/ui/hooks/useAgentLoop.js +483 -0
- package/dist/ui/hooks/useAgentLoop.js.map +1 -0
- package/dist/ui/hooks/useSessionManager.d.ts +13 -0
- package/dist/ui/hooks/useSessionManager.d.ts.map +1 -0
- package/dist/ui/hooks/useSessionManager.js +43 -0
- package/dist/ui/hooks/useSessionManager.js.map +1 -0
- package/dist/ui/hooks/useSlashCommands.d.ts +7 -0
- package/dist/ui/hooks/useSlashCommands.d.ts.map +1 -0
- package/dist/ui/hooks/useSlashCommands.js +11 -0
- package/dist/ui/hooks/useSlashCommands.js.map +1 -0
- package/dist/ui/hooks/useTerminalSize.d.ts +20 -0
- package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -0
- package/dist/ui/hooks/useTerminalSize.js +55 -0
- package/dist/ui/hooks/useTerminalSize.js.map +1 -0
- package/dist/ui/hooks/useTerminalTitle.d.ts +3 -0
- package/dist/ui/hooks/useTerminalTitle.d.ts.map +1 -0
- package/dist/ui/hooks/useTerminalTitle.js +41 -0
- package/dist/ui/hooks/useTerminalTitle.js.map +1 -0
- package/dist/ui/live-item-flush.d.ts +59 -0
- package/dist/ui/live-item-flush.d.ts.map +1 -0
- package/dist/ui/live-item-flush.js +135 -0
- package/dist/ui/live-item-flush.js.map +1 -0
- package/dist/ui/live-item-flush.test.d.ts +2 -0
- package/dist/ui/live-item-flush.test.d.ts.map +1 -0
- package/dist/ui/live-item-flush.test.js +307 -0
- package/dist/ui/live-item-flush.test.js.map +1 -0
- package/dist/ui/login.d.ts +3 -0
- package/dist/ui/login.d.ts.map +1 -0
- package/dist/ui/login.js +117 -0
- package/dist/ui/login.js.map +1 -0
- package/dist/ui/render.d.ts +38 -0
- package/dist/ui/render.d.ts.map +1 -0
- package/dist/ui/render.js +72 -0
- package/dist/ui/render.js.map +1 -0
- package/dist/ui/sessions.d.ts +2 -0
- package/dist/ui/sessions.d.ts.map +1 -0
- package/dist/ui/sessions.js +208 -0
- package/dist/ui/sessions.js.map +1 -0
- package/dist/ui/spinner-frames.d.ts +3 -0
- package/dist/ui/spinner-frames.d.ts.map +1 -0
- package/dist/ui/spinner-frames.js +7 -0
- package/dist/ui/spinner-frames.js.map +1 -0
- package/dist/ui/theme/dark.json +24 -0
- package/dist/ui/theme/detect-theme.d.ts +12 -0
- package/dist/ui/theme/detect-theme.d.ts.map +1 -0
- package/dist/ui/theme/detect-theme.js +152 -0
- package/dist/ui/theme/detect-theme.js.map +1 -0
- package/dist/ui/theme/light.json +24 -0
- package/dist/ui/theme/theme.d.ts +29 -0
- package/dist/ui/theme/theme.d.ts.map +1 -0
- package/dist/ui/theme/theme.js +11 -0
- package/dist/ui/theme/theme.js.map +1 -0
- package/dist/ui/utils/highlight.d.ts +8 -0
- package/dist/ui/utils/highlight.d.ts.map +1 -0
- package/dist/ui/utils/highlight.js +49 -0
- package/dist/ui/utils/highlight.js.map +1 -0
- package/dist/ui/utils/table-text.d.ts +25 -0
- package/dist/ui/utils/table-text.d.ts.map +1 -0
- package/dist/ui/utils/table-text.js +78 -0
- package/dist/ui/utils/table-text.js.map +1 -0
- package/dist/ui/utils/table-text.test.d.ts +2 -0
- package/dist/ui/utils/table-text.test.d.ts.map +1 -0
- package/dist/ui/utils/table-text.test.js +202 -0
- package/dist/ui/utils/table-text.test.js.map +1 -0
- package/dist/utils/error-handler.d.ts +5 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +120 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/format.d.ts +21 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +120 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/git.d.ts +2 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +13 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/image.d.ts +30 -0
- package/dist/utils/image.d.ts.map +1 -0
- package/dist/utils/image.js +231 -0
- package/dist/utils/image.js.map +1 -0
- package/dist/utils/markdown.d.ts +6 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +25 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/process.d.ts +6 -0
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +19 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/utils/shell.d.ts +3 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +8 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/sound.d.ts +2 -0
- package/dist/utils/sound.d.ts.map +1 -0
- package/dist/utils/sound.js +11 -0
- package/dist/utils/sound.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Detect whether the terminal uses a dark or light background.
|
|
4
|
+
*
|
|
5
|
+
* Detection chain (first match wins):
|
|
6
|
+
* 1. VSCODE_THEME_KIND env var (VS Code integrated terminal)
|
|
7
|
+
* 2. OSC 11 escape sequence query (most modern terminals)
|
|
8
|
+
* 3. COLORFGBG env var (rxvt, some other terminals)
|
|
9
|
+
* 4. macOS system dark mode (defaults read -g AppleInterfaceStyle)
|
|
10
|
+
* 5. Default to "dark"
|
|
11
|
+
*/
|
|
12
|
+
export async function detectTheme() {
|
|
13
|
+
// 1. VS Code sets this reliably
|
|
14
|
+
const vscodeTheme = process.env["VSCODE_THEME_KIND"];
|
|
15
|
+
if (vscodeTheme) {
|
|
16
|
+
return vscodeTheme.includes("light") ? "light" : "dark";
|
|
17
|
+
}
|
|
18
|
+
// 2. OSC 11 — query actual terminal background color
|
|
19
|
+
const osc = await queryOSC11();
|
|
20
|
+
if (osc !== null)
|
|
21
|
+
return osc;
|
|
22
|
+
// 3. COLORFGBG — "fg;bg" ANSI color indices
|
|
23
|
+
const colorfgbg = process.env["COLORFGBG"];
|
|
24
|
+
if (colorfgbg) {
|
|
25
|
+
const parts = colorfgbg.split(";");
|
|
26
|
+
const bg = parseInt(parts[parts.length - 1], 10);
|
|
27
|
+
if (!isNaN(bg)) {
|
|
28
|
+
// ANSI colors: 0-6 and 8 are dark, 7 and 9-15 are light
|
|
29
|
+
return bg === 7 || (bg >= 9 && bg <= 15) ? "light" : "dark";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// 4. macOS system dark mode
|
|
33
|
+
if (process.platform === "darwin") {
|
|
34
|
+
try {
|
|
35
|
+
const result = execFileSync("defaults", ["read", "-g", "AppleInterfaceStyle"], {
|
|
36
|
+
encoding: "utf-8",
|
|
37
|
+
timeout: 500,
|
|
38
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
39
|
+
});
|
|
40
|
+
return result.trim().toLowerCase() === "dark" ? "dark" : "light";
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Command fails when in light mode (key doesn't exist) — that means light
|
|
44
|
+
return "light";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// 5. Default
|
|
48
|
+
return "dark";
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Send OSC 11 query to the terminal and parse the background color response.
|
|
52
|
+
* Returns "dark" | "light" based on luminance, or null if unsupported.
|
|
53
|
+
*/
|
|
54
|
+
// ESC character built without a literal escape so ESLint's no-control-regex is satisfied
|
|
55
|
+
const ESC = String.fromCharCode(27);
|
|
56
|
+
const oscResponsePattern = new RegExp(ESC + "\\]11;rgb:([0-9a-fA-F]+)/([0-9a-fA-F]+)/([0-9a-fA-F]+)");
|
|
57
|
+
const cursorPositionPattern = new RegExp(ESC + "\\[\\d+;\\d+R");
|
|
58
|
+
function queryOSC11() {
|
|
59
|
+
return new Promise((resolve) => {
|
|
60
|
+
// Skip for multiplexers — they don't forward OSC queries
|
|
61
|
+
const term = process.env["TERM"] ?? "";
|
|
62
|
+
if (term.startsWith("screen") || term.startsWith("tmux")) {
|
|
63
|
+
resolve(null);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Need a real TTY
|
|
67
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
68
|
+
resolve(null);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const wasRaw = process.stdin.isRaw;
|
|
72
|
+
let settled = false;
|
|
73
|
+
let buffer = "";
|
|
74
|
+
const cleanup = () => {
|
|
75
|
+
if (settled)
|
|
76
|
+
return;
|
|
77
|
+
settled = true;
|
|
78
|
+
process.stdin.removeListener("data", onData);
|
|
79
|
+
try {
|
|
80
|
+
process.stdin.setRawMode(wasRaw);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// ignore
|
|
84
|
+
}
|
|
85
|
+
// When we pause stdin after raw mode, Node's readline may lose
|
|
86
|
+
// the stream. Only pause if we turned raw mode on ourselves.
|
|
87
|
+
if (!wasRaw) {
|
|
88
|
+
try {
|
|
89
|
+
process.stdin.pause();
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// ignore
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
const timeout = setTimeout(() => {
|
|
97
|
+
cleanup();
|
|
98
|
+
resolve(null);
|
|
99
|
+
}, 200);
|
|
100
|
+
const onData = (data) => {
|
|
101
|
+
buffer += data.toString();
|
|
102
|
+
// Look for OSC 11 response: ESC]11;rgb:RRRR/GGGG/BBBB followed by BEL or ST
|
|
103
|
+
const match = buffer.match(oscResponsePattern);
|
|
104
|
+
if (match) {
|
|
105
|
+
clearTimeout(timeout);
|
|
106
|
+
cleanup();
|
|
107
|
+
// Parse RGB values (can be 1, 2, or 4 hex digits per channel)
|
|
108
|
+
const r = normalizeChannel(match[1]);
|
|
109
|
+
const g = normalizeChannel(match[2]);
|
|
110
|
+
const b = normalizeChannel(match[3]);
|
|
111
|
+
// Relative luminance (ITU-R BT.709)
|
|
112
|
+
const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
113
|
+
resolve(luminance < 0.5 ? "dark" : "light");
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// If we get a cursor position response (ESC[row;colR) without
|
|
117
|
+
// an OSC response, the terminal doesn't support OSC 11
|
|
118
|
+
if (buffer.match(cursorPositionPattern)) {
|
|
119
|
+
clearTimeout(timeout);
|
|
120
|
+
cleanup();
|
|
121
|
+
resolve(null);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
try {
|
|
125
|
+
process.stdin.setRawMode(true);
|
|
126
|
+
process.stdin.resume();
|
|
127
|
+
process.stdin.on("data", onData);
|
|
128
|
+
// Send OSC 11 query + cursor position query as sentinel
|
|
129
|
+
process.stdout.write("\x1b]11;?\x1b\\\x1b[6n");
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
clearTimeout(timeout);
|
|
133
|
+
cleanup();
|
|
134
|
+
resolve(null);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/** Normalize a hex color channel (1-4 hex digits) to 0.0–1.0 range. */
|
|
139
|
+
function normalizeChannel(hex) {
|
|
140
|
+
const value = parseInt(hex, 16);
|
|
141
|
+
switch (hex.length) {
|
|
142
|
+
case 1:
|
|
143
|
+
return value / 0xf;
|
|
144
|
+
case 2:
|
|
145
|
+
return value / 0xff;
|
|
146
|
+
case 4:
|
|
147
|
+
return value / 0xffff;
|
|
148
|
+
default:
|
|
149
|
+
return value / (Math.pow(16, hex.length) - 1);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=detect-theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-theme.js","sourceRoot":"","sources":["../../../src/ui/theme/detect-theme.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "light",
|
|
3
|
+
"primary": "#2563eb",
|
|
4
|
+
"secondary": "#7c3aed",
|
|
5
|
+
"success": "#16a34a",
|
|
6
|
+
"error": "#dc2626",
|
|
7
|
+
"warning": "#d97706",
|
|
8
|
+
"text": "#1f2937",
|
|
9
|
+
"textDim": "#9ca3af",
|
|
10
|
+
"textMuted": "#6b7280",
|
|
11
|
+
"border": "#d1d5db",
|
|
12
|
+
"background": "",
|
|
13
|
+
"accent": "#4f46e5",
|
|
14
|
+
"toolName": "#2563eb",
|
|
15
|
+
"toolSuccess": "#16a34a",
|
|
16
|
+
"toolError": "#dc2626",
|
|
17
|
+
"diffAdded": "#16a34a",
|
|
18
|
+
"diffRemoved": "#dc2626",
|
|
19
|
+
"diffContext": "#9ca3af",
|
|
20
|
+
"spinnerColor": "#2563eb",
|
|
21
|
+
"inputPrompt": "#2563eb",
|
|
22
|
+
"footerText": "#9ca3af",
|
|
23
|
+
"commandColor": "#4f46e5"
|
|
24
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import darkTheme from "./dark.json";
|
|
2
|
+
export type Theme = typeof darkTheme;
|
|
3
|
+
export declare function loadTheme(name: "dark" | "light"): Theme;
|
|
4
|
+
export declare const ThemeContext: import("react").Context<{
|
|
5
|
+
name: string;
|
|
6
|
+
primary: string;
|
|
7
|
+
secondary: string;
|
|
8
|
+
success: string;
|
|
9
|
+
error: string;
|
|
10
|
+
warning: string;
|
|
11
|
+
text: string;
|
|
12
|
+
textDim: string;
|
|
13
|
+
textMuted: string;
|
|
14
|
+
border: string;
|
|
15
|
+
background: string;
|
|
16
|
+
accent: string;
|
|
17
|
+
toolName: string;
|
|
18
|
+
toolSuccess: string;
|
|
19
|
+
toolError: string;
|
|
20
|
+
diffAdded: string;
|
|
21
|
+
diffRemoved: string;
|
|
22
|
+
diffContext: string;
|
|
23
|
+
spinnerColor: string;
|
|
24
|
+
inputPrompt: string;
|
|
25
|
+
footerText: string;
|
|
26
|
+
commandColor: string;
|
|
27
|
+
}>;
|
|
28
|
+
export declare function useTheme(): Theme;
|
|
29
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../src/ui/theme/theme.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,aAAa,CAAuB;AAG1D,MAAM,MAAM,KAAK,GAAG,OAAO,SAAS,CAAC;AAErC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAEvD;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;EAAkC,CAAC;AAE5D,wBAAgB,QAAQ,IAAI,KAAK,CAEhC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createContext, useContext } from "react";
|
|
2
|
+
import darkTheme from "./dark.json" with { type: "json" };
|
|
3
|
+
import lightTheme from "./light.json" with { type: "json" };
|
|
4
|
+
export function loadTheme(name) {
|
|
5
|
+
return name === "light" ? lightTheme : darkTheme;
|
|
6
|
+
}
|
|
7
|
+
export const ThemeContext = createContext(darkTheme);
|
|
8
|
+
export function useTheme() {
|
|
9
|
+
return useContext(ThemeContext);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../src/ui/theme/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,SAAS,MAAM,aAAa,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1D,OAAO,UAAU,MAAM,cAAc,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAI5D,MAAM,UAAU,SAAS,CAAC,IAAsB;IAC9C,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAQ,SAAS,CAAC,CAAC;AAE5D,MAAM,UAAU,QAAQ;IACtB,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Get language from a file path's extension */
|
|
2
|
+
export declare function langFromPath(filePath: string): string | undefined;
|
|
3
|
+
/**
|
|
4
|
+
* Syntax-highlight code. Returns ANSI string.
|
|
5
|
+
* Falls back to raw code if language unknown.
|
|
6
|
+
*/
|
|
7
|
+
export declare function highlightCode(code: string, language?: string): string;
|
|
8
|
+
//# sourceMappingURL=highlight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/highlight.ts"],"names":[],"mappings":"AA+BA,gDAAgD;AAChD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGjE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAOrE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { highlight, supportsLanguage } from "cli-highlight";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/** Map file extension to cli-highlight language name */
|
|
4
|
+
const EXT_TO_LANG = {
|
|
5
|
+
ts: "typescript",
|
|
6
|
+
tsx: "typescript",
|
|
7
|
+
js: "javascript",
|
|
8
|
+
jsx: "javascript",
|
|
9
|
+
py: "python",
|
|
10
|
+
rb: "ruby",
|
|
11
|
+
rs: "rust",
|
|
12
|
+
go: "go",
|
|
13
|
+
java: "java",
|
|
14
|
+
kt: "kotlin",
|
|
15
|
+
sh: "bash",
|
|
16
|
+
zsh: "bash",
|
|
17
|
+
bash: "bash",
|
|
18
|
+
json: "json",
|
|
19
|
+
yaml: "yaml",
|
|
20
|
+
yml: "yaml",
|
|
21
|
+
md: "markdown",
|
|
22
|
+
html: "xml",
|
|
23
|
+
xml: "xml",
|
|
24
|
+
css: "css",
|
|
25
|
+
scss: "scss",
|
|
26
|
+
sql: "sql",
|
|
27
|
+
toml: "ini",
|
|
28
|
+
dockerfile: "dockerfile",
|
|
29
|
+
};
|
|
30
|
+
/** Get language from a file path's extension */
|
|
31
|
+
export function langFromPath(filePath) {
|
|
32
|
+
const ext = path.extname(filePath).replace(/^\./, "").toLowerCase();
|
|
33
|
+
return EXT_TO_LANG[ext];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Syntax-highlight code. Returns ANSI string.
|
|
37
|
+
* Falls back to raw code if language unknown.
|
|
38
|
+
*/
|
|
39
|
+
export function highlightCode(code, language) {
|
|
40
|
+
if (!language || !supportsLanguage(language))
|
|
41
|
+
return code;
|
|
42
|
+
try {
|
|
43
|
+
return highlight(code, { language, ignoreIllegals: true });
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return code;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=highlight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highlight.js","sourceRoot":"","sources":["../../../src/ui/utils/highlight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,wDAAwD;AACxD,MAAM,WAAW,GAA2B;IAC1C,EAAE,EAAE,YAAY;IAChB,GAAG,EAAE,YAAY;IACjB,EAAE,EAAE,YAAY;IAChB,GAAG,EAAE,YAAY;IACjB,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,IAAI;IACR,IAAI,EAAE,MAAM;IACZ,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,MAAM;IACV,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,KAAK;IACX,UAAU,EAAE,YAAY;CACzB,CAAC;AAEF,gDAAgD;AAChD,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACpE,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAAiB;IAC3D,IAAI,CAAC,QAAQ,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Token } from "marked";
|
|
2
|
+
/** Extract all plain text from a token tree. */
|
|
3
|
+
export declare function extractPlainText(tokens: Token[]): string;
|
|
4
|
+
/** Measure the visual display width of a string (handles CJK, emoji, etc). */
|
|
5
|
+
export declare function visualWidth(str: string): number;
|
|
6
|
+
/**
|
|
7
|
+
* Force a string to exactly `width` visual columns.
|
|
8
|
+
* Truncates if too wide (char-by-char to avoid splitting wide chars),
|
|
9
|
+
* pads with spaces if too narrow.
|
|
10
|
+
*/
|
|
11
|
+
export declare function fitToWidth(str: string, width: number): string;
|
|
12
|
+
/**
|
|
13
|
+
* Word-wrap plain text extracted from tokens into lines of at most `width`
|
|
14
|
+
* visual columns. Uses `wrap-ansi` for wrapping, then force-clamps each line
|
|
15
|
+
* to exactly `width` with `fitToWidth` to eliminate measurement mismatches.
|
|
16
|
+
*/
|
|
17
|
+
export declare function wrapPlainTextLines(tokens: Token[], width: number): string[];
|
|
18
|
+
/**
|
|
19
|
+
* Center a string within `width` visual columns.
|
|
20
|
+
* Truncates if too wide, pads with spaces on both sides if too narrow.
|
|
21
|
+
*/
|
|
22
|
+
export declare function centerToWidth(str: string, width: number): string;
|
|
23
|
+
/** Measure the visual display width of plain text in a token tree. */
|
|
24
|
+
export declare function plainTextLength(tokens: Token[]): number;
|
|
25
|
+
//# sourceMappingURL=table-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-text.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/table-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAIpC,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAaxD;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAiB7D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ3E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAEvD"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import stringWidth from "string-width";
|
|
2
|
+
import wrapAnsi from "wrap-ansi";
|
|
3
|
+
/** Extract all plain text from a token tree. */
|
|
4
|
+
export function extractPlainText(tokens) {
|
|
5
|
+
let text = "";
|
|
6
|
+
for (const t of tokens) {
|
|
7
|
+
const tok = t;
|
|
8
|
+
if (tok.tokens && Array.isArray(tok.tokens)) {
|
|
9
|
+
text += extractPlainText(tok.tokens);
|
|
10
|
+
}
|
|
11
|
+
else if (typeof tok.text === "string") {
|
|
12
|
+
text += tok.text;
|
|
13
|
+
}
|
|
14
|
+
else if ("raw" in t && typeof t.raw === "string") {
|
|
15
|
+
text += t.raw;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return text;
|
|
19
|
+
}
|
|
20
|
+
/** Measure the visual display width of a string (handles CJK, emoji, etc). */
|
|
21
|
+
export function visualWidth(str) {
|
|
22
|
+
return stringWidth(str);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Force a string to exactly `width` visual columns.
|
|
26
|
+
* Truncates if too wide (char-by-char to avoid splitting wide chars),
|
|
27
|
+
* pads with spaces if too narrow.
|
|
28
|
+
*/
|
|
29
|
+
export function fitToWidth(str, width) {
|
|
30
|
+
const w = visualWidth(str);
|
|
31
|
+
if (w === width)
|
|
32
|
+
return str;
|
|
33
|
+
if (w > width) {
|
|
34
|
+
// Truncate character by character to avoid splitting wide chars
|
|
35
|
+
let result = "";
|
|
36
|
+
let resultWidth = 0;
|
|
37
|
+
for (const ch of str) {
|
|
38
|
+
const chW = visualWidth(ch);
|
|
39
|
+
if (resultWidth + chW > width)
|
|
40
|
+
break;
|
|
41
|
+
result += ch;
|
|
42
|
+
resultWidth += chW;
|
|
43
|
+
}
|
|
44
|
+
// Fill any remaining gap (e.g. wide char didn't fit, left 1 col)
|
|
45
|
+
return result + " ".repeat(width - resultWidth);
|
|
46
|
+
}
|
|
47
|
+
return str + " ".repeat(width - w);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Word-wrap plain text extracted from tokens into lines of at most `width`
|
|
51
|
+
* visual columns. Uses `wrap-ansi` for wrapping, then force-clamps each line
|
|
52
|
+
* to exactly `width` with `fitToWidth` to eliminate measurement mismatches.
|
|
53
|
+
*/
|
|
54
|
+
export function wrapPlainTextLines(tokens, width) {
|
|
55
|
+
// Collapse newlines/tabs to spaces — cell text should be a continuous paragraph
|
|
56
|
+
const full = extractPlainText(tokens).replace(/[\n\r\t]+/g, " ");
|
|
57
|
+
if (visualWidth(full) <= width)
|
|
58
|
+
return [full];
|
|
59
|
+
const wrapped = wrapAnsi(full, width, { hard: true, trim: true, wordWrap: true });
|
|
60
|
+
const lines = wrapped.split("\n").filter((l) => l.length > 0);
|
|
61
|
+
return lines.length > 0 ? lines : [""];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Center a string within `width` visual columns.
|
|
65
|
+
* Truncates if too wide, pads with spaces on both sides if too narrow.
|
|
66
|
+
*/
|
|
67
|
+
export function centerToWidth(str, width) {
|
|
68
|
+
const w = visualWidth(str);
|
|
69
|
+
if (w >= width)
|
|
70
|
+
return fitToWidth(str, width);
|
|
71
|
+
const leftPad = Math.floor((width - w) / 2);
|
|
72
|
+
return fitToWidth(" ".repeat(leftPad) + str, width);
|
|
73
|
+
}
|
|
74
|
+
/** Measure the visual display width of plain text in a token tree. */
|
|
75
|
+
export function plainTextLength(tokens) {
|
|
76
|
+
return visualWidth(extractPlainText(tokens));
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=table-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-text.js","sourceRoot":"","sources":["../../../src/ui/utils/table-text.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,gDAAgD;AAChD,MAAM,UAAU,gBAAgB,CAAC,MAAe;IAC9C,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,CAAgD,CAAC;QAC7D,IAAI,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,IAAI,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC;QACnB,CAAC;aAAM,IAAI,KAAK,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnD,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,KAAa;IACnD,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK,KAAK;QAAE,OAAO,GAAG,CAAC;IAC5B,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;QACd,gEAAgE;QAChE,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;YAC5B,IAAI,WAAW,GAAG,GAAG,GAAG,KAAK;gBAAE,MAAM;YACrC,MAAM,IAAI,EAAE,CAAC;YACb,WAAW,IAAI,GAAG,CAAC;QACrB,CAAC;QACD,iEAAiE;QACjE,OAAO,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAe,EAAE,KAAa;IAC/D,gFAAgF;IAChF,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IACjE,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,KAAK;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,KAAa;IACtD,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI,KAAK;QAAE,OAAO,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,OAAO,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,eAAe,CAAC,MAAe;IAC7C,OAAO,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-text.test.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/table-text.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { marked } from "marked";
|
|
3
|
+
import { centerToWidth, extractPlainText, fitToWidth, plainTextLength, visualWidth, wrapPlainTextLines, } from "./table-text.js";
|
|
4
|
+
/** Helper: lex inline markdown and return the inner tokens of the first paragraph. */
|
|
5
|
+
function inlineTokens(md) {
|
|
6
|
+
const tokens = marked.lexer(md);
|
|
7
|
+
const first = tokens[0];
|
|
8
|
+
if (first && "tokens" in first && Array.isArray(first.tokens)) {
|
|
9
|
+
return first.tokens;
|
|
10
|
+
}
|
|
11
|
+
return tokens;
|
|
12
|
+
}
|
|
13
|
+
// ── extractPlainText ──────────────────────────────────────
|
|
14
|
+
describe("extractPlainText", () => {
|
|
15
|
+
it("extracts plain text from simple text tokens", () => {
|
|
16
|
+
const tokens = inlineTokens("hello world");
|
|
17
|
+
expect(extractPlainText(tokens)).toBe("hello world");
|
|
18
|
+
});
|
|
19
|
+
it("extracts text from bold/italic tokens", () => {
|
|
20
|
+
const tokens = inlineTokens("hello **bold** and *italic*");
|
|
21
|
+
expect(extractPlainText(tokens)).toBe("hello bold and italic");
|
|
22
|
+
});
|
|
23
|
+
it("extracts text from inline code", () => {
|
|
24
|
+
const tokens = inlineTokens("use `npm install` here");
|
|
25
|
+
expect(extractPlainText(tokens)).toBe("use npm install here");
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
// ── visualWidth ───────────────────────────────────────────
|
|
29
|
+
describe("visualWidth", () => {
|
|
30
|
+
it("returns correct width for ASCII text", () => {
|
|
31
|
+
expect(visualWidth("hello")).toBe(5);
|
|
32
|
+
});
|
|
33
|
+
it("counts CJK characters as width 2", () => {
|
|
34
|
+
expect(visualWidth("あ")).toBe(2);
|
|
35
|
+
expect(visualWidth("漢字")).toBe(4);
|
|
36
|
+
});
|
|
37
|
+
it("handles mixed ASCII and CJK", () => {
|
|
38
|
+
expect(visualWidth("hi漢字")).toBe(6); // 2 + 4
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
// ── fitToWidth ────────────────────────────────────────────
|
|
42
|
+
describe("fitToWidth", () => {
|
|
43
|
+
it("pads short strings with spaces", () => {
|
|
44
|
+
const result = fitToWidth("hi", 5);
|
|
45
|
+
expect(visualWidth(result)).toBe(5);
|
|
46
|
+
expect(result).toBe("hi ");
|
|
47
|
+
});
|
|
48
|
+
it("returns string unchanged when already exact width", () => {
|
|
49
|
+
const result = fitToWidth("hello", 5);
|
|
50
|
+
expect(result).toBe("hello");
|
|
51
|
+
});
|
|
52
|
+
it("truncates strings that are too wide", () => {
|
|
53
|
+
const result = fitToWidth("hello world", 5);
|
|
54
|
+
expect(visualWidth(result)).toBe(5);
|
|
55
|
+
expect(result).toBe("hello");
|
|
56
|
+
});
|
|
57
|
+
it("handles CJK truncation without splitting wide chars", () => {
|
|
58
|
+
// "漢字漢" is 6 visual cols; fitting to 5 should take "漢字" (4) + 1 space
|
|
59
|
+
const result = fitToWidth("漢字漢", 5);
|
|
60
|
+
expect(visualWidth(result)).toBe(5);
|
|
61
|
+
expect(result).toBe("漢字 ");
|
|
62
|
+
});
|
|
63
|
+
it("pads CJK strings correctly", () => {
|
|
64
|
+
const result = fitToWidth("漢字", 6);
|
|
65
|
+
expect(visualWidth(result)).toBe(6);
|
|
66
|
+
expect(result).toBe("漢字 ");
|
|
67
|
+
});
|
|
68
|
+
it("handles empty string", () => {
|
|
69
|
+
const result = fitToWidth("", 5);
|
|
70
|
+
expect(visualWidth(result)).toBe(5);
|
|
71
|
+
expect(result).toBe(" ");
|
|
72
|
+
});
|
|
73
|
+
it("handles emoji", () => {
|
|
74
|
+
const result = fitToWidth("✅ Active", 12);
|
|
75
|
+
expect(visualWidth(result)).toBe(12);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
// ── centerToWidth ─────────────────────────────────────────
|
|
79
|
+
describe("centerToWidth", () => {
|
|
80
|
+
it("centers text with space padding", () => {
|
|
81
|
+
const result = centerToWidth("hi", 6);
|
|
82
|
+
expect(visualWidth(result)).toBe(6);
|
|
83
|
+
expect(result).toBe(" hi ");
|
|
84
|
+
});
|
|
85
|
+
it("centers odd-width text with extra space on right", () => {
|
|
86
|
+
const result = centerToWidth("hi", 7);
|
|
87
|
+
expect(visualWidth(result)).toBe(7);
|
|
88
|
+
expect(result).toBe(" hi ");
|
|
89
|
+
});
|
|
90
|
+
it("truncates text wider than width", () => {
|
|
91
|
+
const result = centerToWidth("hello world", 5);
|
|
92
|
+
expect(visualWidth(result)).toBe(5);
|
|
93
|
+
});
|
|
94
|
+
it("handles exact width", () => {
|
|
95
|
+
const result = centerToWidth("hello", 5);
|
|
96
|
+
expect(visualWidth(result)).toBe(5);
|
|
97
|
+
expect(result).toBe("hello");
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
// ── plainTextLength ───────────────────────────────────────
|
|
101
|
+
describe("plainTextLength", () => {
|
|
102
|
+
it("returns correct length for plain text", () => {
|
|
103
|
+
const tokens = inlineTokens("abc");
|
|
104
|
+
expect(plainTextLength(tokens)).toBe(3);
|
|
105
|
+
});
|
|
106
|
+
it("returns length excluding markdown formatting", () => {
|
|
107
|
+
const tokens = inlineTokens("**bold**");
|
|
108
|
+
expect(plainTextLength(tokens)).toBe(4); // "bold"
|
|
109
|
+
});
|
|
110
|
+
it("returns visual width for CJK text", () => {
|
|
111
|
+
const tokens = inlineTokens("漢字");
|
|
112
|
+
expect(plainTextLength(tokens)).toBe(4); // 2 chars, each width 2
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
// ── wrapPlainTextLines ────────────────────────────────────
|
|
116
|
+
describe("wrapPlainTextLines", () => {
|
|
117
|
+
it("returns single line when text fits within width", () => {
|
|
118
|
+
const tokens = inlineTokens("short text");
|
|
119
|
+
expect(wrapPlainTextLines(tokens, 20)).toEqual(["short text"]);
|
|
120
|
+
});
|
|
121
|
+
it("wraps long text at word boundaries", () => {
|
|
122
|
+
const tokens = inlineTokens("the quick brown fox jumps over the lazy dog");
|
|
123
|
+
const lines = wrapPlainTextLines(tokens, 20);
|
|
124
|
+
for (const line of lines) {
|
|
125
|
+
expect(visualWidth(line)).toBeLessThanOrEqual(20);
|
|
126
|
+
}
|
|
127
|
+
expect(lines.join(" ")).toContain("quick");
|
|
128
|
+
expect(lines.join(" ")).toContain("lazy");
|
|
129
|
+
expect(lines.length).toBeGreaterThan(1);
|
|
130
|
+
});
|
|
131
|
+
it("force-breaks words longer than width", () => {
|
|
132
|
+
const tokens = inlineTokens("abcdefghijklmnopqrstuvwxyz");
|
|
133
|
+
const lines = wrapPlainTextLines(tokens, 10);
|
|
134
|
+
expect(lines[0]).toBe("abcdefghij");
|
|
135
|
+
expect(lines[1]).toBe("klmnopqrst");
|
|
136
|
+
expect(lines[2]).toBe("uvwxyz");
|
|
137
|
+
});
|
|
138
|
+
it("handles narrow width correctly", () => {
|
|
139
|
+
const tokens = inlineTokens("hello world");
|
|
140
|
+
const lines = wrapPlainTextLines(tokens, 5);
|
|
141
|
+
for (const line of lines) {
|
|
142
|
+
expect(visualWidth(line)).toBeLessThanOrEqual(5);
|
|
143
|
+
}
|
|
144
|
+
expect(lines.join("")).toContain("hello");
|
|
145
|
+
expect(lines.join("")).toContain("world");
|
|
146
|
+
});
|
|
147
|
+
it("handles text with bold/italic formatting", () => {
|
|
148
|
+
const tokens = inlineTokens("this is **very important** information that wraps");
|
|
149
|
+
const lines = wrapPlainTextLines(tokens, 15);
|
|
150
|
+
for (const line of lines) {
|
|
151
|
+
expect(visualWidth(line)).toBeLessThanOrEqual(15);
|
|
152
|
+
}
|
|
153
|
+
const joined = lines.join(" ");
|
|
154
|
+
expect(joined).toContain("important");
|
|
155
|
+
expect(joined).toContain("wraps");
|
|
156
|
+
});
|
|
157
|
+
it("returns single empty-ish line for empty input", () => {
|
|
158
|
+
const tokens = inlineTokens("");
|
|
159
|
+
const lines = wrapPlainTextLines(tokens, 10);
|
|
160
|
+
expect(lines.length).toBeGreaterThanOrEqual(1);
|
|
161
|
+
});
|
|
162
|
+
it("respects visual width for CJK characters when wrapping", () => {
|
|
163
|
+
const tokens = inlineTokens("漢字 ab");
|
|
164
|
+
const lines = wrapPlainTextLines(tokens, 5);
|
|
165
|
+
for (const line of lines) {
|
|
166
|
+
expect(visualWidth(line)).toBeLessThanOrEqual(5);
|
|
167
|
+
}
|
|
168
|
+
const joined = lines.join("");
|
|
169
|
+
expect(joined).toContain("漢字");
|
|
170
|
+
expect(joined).toContain("ab");
|
|
171
|
+
});
|
|
172
|
+
it("force-breaks CJK text that exceeds width", () => {
|
|
173
|
+
const tokens = inlineTokens("漢字漢字漢字");
|
|
174
|
+
const lines = wrapPlainTextLines(tokens, 5);
|
|
175
|
+
for (const line of lines) {
|
|
176
|
+
expect(visualWidth(line)).toBeLessThanOrEqual(5);
|
|
177
|
+
}
|
|
178
|
+
expect(lines.join("")).toBe("漢字漢字漢字");
|
|
179
|
+
});
|
|
180
|
+
it("preserves all content when wrapping a table cell description", () => {
|
|
181
|
+
const longDescription = "This is a very long description that would normally cause a table to overflow beyond the terminal width and deform the layout";
|
|
182
|
+
const tokens = inlineTokens(longDescription);
|
|
183
|
+
const lines = wrapPlainTextLines(tokens, 30);
|
|
184
|
+
for (const line of lines) {
|
|
185
|
+
expect(visualWidth(line)).toBeLessThanOrEqual(30);
|
|
186
|
+
}
|
|
187
|
+
const reconstructed = lines.join(" ");
|
|
188
|
+
for (const word of longDescription.split(" ")) {
|
|
189
|
+
expect(reconstructed).toContain(word);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
it("every wrapped line fits after fitToWidth clamping", () => {
|
|
193
|
+
const tokens = inlineTokens("Provides a centralized Next.js dashboard with live-updating cards showing account statuses, recent automation activity, error logs, and per-platform engagement metrics at a glance.");
|
|
194
|
+
const width = 40;
|
|
195
|
+
const lines = wrapPlainTextLines(tokens, width);
|
|
196
|
+
for (const line of lines) {
|
|
197
|
+
const fitted = fitToWidth(line, width);
|
|
198
|
+
expect(visualWidth(fitted)).toBe(width);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
//# sourceMappingURL=table-text.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-text.test.js","sourceRoot":"","sources":["../../../src/ui/utils/table-text.test.ts"],"names":[],"mappings":"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"}
|