@prestyj/cli 4.2.15
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 +150 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +585 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +27 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session.d.ts +65 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +349 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/agents.d.ts +32 -0
- package/dist/core/agents.d.ts.map +1 -0
- package/dist/core/agents.js +95 -0
- package/dist/core/agents.js.map +1 -0
- package/dist/core/auth-storage.d.ts +33 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +95 -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 +39 -0
- package/dist/core/compaction/compactor.d.ts.map +1 -0
- package/dist/core/compaction/compactor.js +253 -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 +116 -0
- package/dist/core/compaction/compactor.test.js.map +1 -0
- package/dist/core/compaction/token-estimator.d.ts +5 -0
- package/dist/core/compaction/token-estimator.d.ts.map +1 -0
- package/dist/core/compaction/token-estimator.js +36 -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 +115 -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 +89 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +92 -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/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 +35 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +233 -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 +51 -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 +17 -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 +24 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +124 -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 +125 -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 +475 -0
- package/dist/core/prompt-commands.js.map +1 -0
- package/dist/core/session-manager.d.ts +80 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +220 -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 +31 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +161 -0
- package/dist/core/slash-commands.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 +154 -0
- package/dist/interactive.js.map +1 -0
- package/dist/modes/index.d.ts +2 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +2 -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/session.d.ts +16 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +122 -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 +118 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/tools/bash.d.ts +11 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +115 -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 +10 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +56 -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 +12 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +122 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +26 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +47 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/ls.d.ts +9 -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/path-utils.d.ts +2 -0
- package/dist/tools/path-utils.d.ts.map +1 -0
- package/dist/tools/path-utils.js +9 -0
- package/dist/tools/path-utils.js.map +1 -0
- package/dist/tools/read.d.ts +11 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +112 -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 +171 -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 +50 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/write.d.ts +9 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +31 -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 +131 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +1101 -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/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 +58 -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 +31 -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 +116 -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 +476 -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 +16 -0
- package/dist/ui/components/ServerToolExecution.d.ts.map +1 -0
- package/dist/ui/components/ServerToolExecution.js +25 -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 +17 -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 +56 -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 +83 -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 +259 -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 +40 -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 +169 -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 +456 -0
- package/dist/ui/components/ToolExecution.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 +14 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/index.js +14 -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 +466 -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 +53 -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 +49 -0
- package/dist/ui/hooks/useTerminalTitle.js.map +1 -0
- package/dist/ui/live-item-flush.d.ts +49 -0
- package/dist/ui/live-item-flush.d.ts.map +1 -0
- package/dist/ui/live-item-flush.js +56 -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 +93 -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 +63 -0
- package/dist/ui/render.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 +108 -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 +176 -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,95 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import { getAppPaths } from "../config.js";
|
|
3
|
+
import { refreshAnthropicToken } from "./oauth/anthropic.js";
|
|
4
|
+
import { refreshOpenAIToken } from "./oauth/openai.js";
|
|
5
|
+
export class AuthStorage {
|
|
6
|
+
data = {};
|
|
7
|
+
filePath;
|
|
8
|
+
loaded = false;
|
|
9
|
+
constructor(filePath) {
|
|
10
|
+
this.filePath = filePath ?? getAppPaths().authFile;
|
|
11
|
+
}
|
|
12
|
+
async load() {
|
|
13
|
+
try {
|
|
14
|
+
const content = await fs.readFile(this.filePath, "utf-8");
|
|
15
|
+
this.data = JSON.parse(content);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
this.data = {};
|
|
19
|
+
}
|
|
20
|
+
this.loaded = true;
|
|
21
|
+
}
|
|
22
|
+
async ensureLoaded() {
|
|
23
|
+
if (!this.loaded)
|
|
24
|
+
await this.load();
|
|
25
|
+
}
|
|
26
|
+
async getCredentials(provider) {
|
|
27
|
+
await this.ensureLoaded();
|
|
28
|
+
return this.data[provider];
|
|
29
|
+
}
|
|
30
|
+
async setCredentials(provider, creds) {
|
|
31
|
+
await this.ensureLoaded();
|
|
32
|
+
this.data[provider] = creds;
|
|
33
|
+
await this.save();
|
|
34
|
+
}
|
|
35
|
+
async clearCredentials(provider) {
|
|
36
|
+
await this.ensureLoaded();
|
|
37
|
+
delete this.data[provider];
|
|
38
|
+
await this.save();
|
|
39
|
+
}
|
|
40
|
+
async clearAll() {
|
|
41
|
+
this.data = {};
|
|
42
|
+
await this.save();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Returns valid credentials, auto-refreshing if expired.
|
|
46
|
+
* If `forceRefresh` is true, refreshes even if the token hasn't expired
|
|
47
|
+
* (useful when the provider rejects a token with 401 before its stored expiry).
|
|
48
|
+
* Throws if not logged in.
|
|
49
|
+
*/
|
|
50
|
+
async resolveCredentials(provider, opts) {
|
|
51
|
+
await this.ensureLoaded();
|
|
52
|
+
const creds = this.data[provider];
|
|
53
|
+
if (!creds) {
|
|
54
|
+
throw new NotLoggedInError(provider);
|
|
55
|
+
}
|
|
56
|
+
// GLM and Moonshot use static API keys — no refresh needed
|
|
57
|
+
if (provider === "glm" || provider === "moonshot") {
|
|
58
|
+
return creds;
|
|
59
|
+
}
|
|
60
|
+
// Return if not expired and not force-refreshing
|
|
61
|
+
if (!opts?.forceRefresh && Date.now() < creds.expiresAt) {
|
|
62
|
+
return creds;
|
|
63
|
+
}
|
|
64
|
+
// Refresh (preserve accountId if not returned by refresh)
|
|
65
|
+
const refreshFn = provider === "anthropic" ? refreshAnthropicToken : refreshOpenAIToken;
|
|
66
|
+
const refreshed = await refreshFn(creds.refreshToken);
|
|
67
|
+
if (!refreshed.accountId && creds.accountId) {
|
|
68
|
+
refreshed.accountId = creds.accountId;
|
|
69
|
+
}
|
|
70
|
+
this.data[provider] = refreshed;
|
|
71
|
+
await this.save();
|
|
72
|
+
return refreshed;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Returns a valid access token, auto-refreshing if expired.
|
|
76
|
+
* Throws if not logged in.
|
|
77
|
+
*/
|
|
78
|
+
async resolveToken(provider) {
|
|
79
|
+
const creds = await this.resolveCredentials(provider);
|
|
80
|
+
return creds.accessToken;
|
|
81
|
+
}
|
|
82
|
+
async save() {
|
|
83
|
+
const content = JSON.stringify(this.data, null, 2);
|
|
84
|
+
await fs.writeFile(this.filePath, content, { encoding: "utf-8", mode: 0o600 });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export class NotLoggedInError extends Error {
|
|
88
|
+
provider;
|
|
89
|
+
constructor(provider) {
|
|
90
|
+
super(`Not logged in to ${provider}. Run "ezcoder login" to authenticate.`);
|
|
91
|
+
this.name = "NotLoggedInError";
|
|
92
|
+
this.provider = provider;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=auth-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-storage.js","sourceRoot":"","sources":["../../src/core/auth-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check for updates and silently auto-update if a newer version is available.
|
|
3
|
+
* Called at CLI startup. Non-blocking on failure — the CLI always proceeds.
|
|
4
|
+
*
|
|
5
|
+
* Returns a message to display if an update happened, or null.
|
|
6
|
+
*/
|
|
7
|
+
export declare function checkAndAutoUpdate(currentVersion: string): string | null;
|
|
8
|
+
//# sourceMappingURL=auto-update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../../src/core/auto-update.ts"],"names":[],"mappings":"AAsIA;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8BxE"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { execSync, spawnSync } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
const PACKAGE_NAME = "@prestyj/cli";
|
|
6
|
+
const REGISTRY_URL = "https://registry.npmjs.org/@prestyj/cli/latest";
|
|
7
|
+
const CHECK_INTERVAL_MS = 4 * 60 * 60 * 1000; // 4 hours
|
|
8
|
+
const FETCH_TIMEOUT_MS = 3000;
|
|
9
|
+
var PackageManager;
|
|
10
|
+
(function (PackageManager) {
|
|
11
|
+
PackageManager["NPM"] = "npm";
|
|
12
|
+
PackageManager["PNPM"] = "pnpm";
|
|
13
|
+
PackageManager["YARN"] = "yarn";
|
|
14
|
+
PackageManager["UNKNOWN"] = "unknown";
|
|
15
|
+
})(PackageManager || (PackageManager = {}));
|
|
16
|
+
function getStateFilePath() {
|
|
17
|
+
return path.join(os.homedir(), ".ezcoder", "update-state.json");
|
|
18
|
+
}
|
|
19
|
+
function readState() {
|
|
20
|
+
try {
|
|
21
|
+
const raw = fs.readFileSync(getStateFilePath(), "utf-8");
|
|
22
|
+
return JSON.parse(raw);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function writeState(state) {
|
|
29
|
+
try {
|
|
30
|
+
const dir = path.dirname(getStateFilePath());
|
|
31
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
32
|
+
fs.writeFileSync(getStateFilePath(), JSON.stringify(state));
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Non-fatal
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function shouldCheck() {
|
|
39
|
+
const state = readState();
|
|
40
|
+
if (!state)
|
|
41
|
+
return true;
|
|
42
|
+
return Date.now() - state.lastCheckedAt > CHECK_INTERVAL_MS;
|
|
43
|
+
}
|
|
44
|
+
function compareVersions(a, b) {
|
|
45
|
+
const pa = a.split(".").map(Number);
|
|
46
|
+
const pb = b.split(".").map(Number);
|
|
47
|
+
for (let i = 0; i < 3; i++) {
|
|
48
|
+
const diff = (pa[i] ?? 0) - (pb[i] ?? 0);
|
|
49
|
+
if (diff !== 0)
|
|
50
|
+
return diff;
|
|
51
|
+
}
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
function detectInstallInfo() {
|
|
55
|
+
const scriptPath = (process.argv[1] ?? "").replace(/\\/g, "/");
|
|
56
|
+
// npx — skip (ephemeral)
|
|
57
|
+
if (scriptPath.includes("/_npx/")) {
|
|
58
|
+
return { packageManager: PackageManager.UNKNOWN, updateCommand: null };
|
|
59
|
+
}
|
|
60
|
+
// pnpm global
|
|
61
|
+
if (scriptPath.includes("/.pnpm") || scriptPath.includes("/pnpm/global")) {
|
|
62
|
+
return {
|
|
63
|
+
packageManager: PackageManager.PNPM,
|
|
64
|
+
updateCommand: `pnpm add -g ${PACKAGE_NAME}@latest`,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// yarn global
|
|
68
|
+
if (scriptPath.includes("/.yarn/") || scriptPath.includes("/yarn/global")) {
|
|
69
|
+
return {
|
|
70
|
+
packageManager: PackageManager.YARN,
|
|
71
|
+
updateCommand: `yarn global add ${PACKAGE_NAME}@latest`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// npm global (default)
|
|
75
|
+
return {
|
|
76
|
+
packageManager: PackageManager.NPM,
|
|
77
|
+
updateCommand: `npm install -g ${PACKAGE_NAME}@latest`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function fetchLatestVersionSync() {
|
|
81
|
+
// Use a child process to fetch from npm registry with timeout
|
|
82
|
+
// We use node -e to avoid needing fetch in the parent process synchronously
|
|
83
|
+
try {
|
|
84
|
+
const script = `
|
|
85
|
+
const c = new AbortController();
|
|
86
|
+
const t = setTimeout(() => c.abort(), ${FETCH_TIMEOUT_MS});
|
|
87
|
+
fetch("${REGISTRY_URL}", { signal: c.signal })
|
|
88
|
+
.then(r => r.json())
|
|
89
|
+
.then(d => { clearTimeout(t); process.stdout.write(d.version || ""); })
|
|
90
|
+
.catch(() => { clearTimeout(t); process.exit(1); });
|
|
91
|
+
`;
|
|
92
|
+
const result = spawnSync(process.execPath, ["--input-type=module", "-e", script], {
|
|
93
|
+
encoding: "utf-8",
|
|
94
|
+
timeout: FETCH_TIMEOUT_MS + 1000,
|
|
95
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
96
|
+
});
|
|
97
|
+
const version = result.stdout?.trim();
|
|
98
|
+
return version && /^\d+\.\d+\.\d+/.test(version) ? version : null;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function performUpdate(command) {
|
|
105
|
+
try {
|
|
106
|
+
execSync(command, {
|
|
107
|
+
stdio: "pipe",
|
|
108
|
+
timeout: 60_000,
|
|
109
|
+
env: { ...process.env, npm_config_loglevel: "silent" },
|
|
110
|
+
});
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Check for updates and silently auto-update if a newer version is available.
|
|
119
|
+
* Called at CLI startup. Non-blocking on failure — the CLI always proceeds.
|
|
120
|
+
*
|
|
121
|
+
* Returns a message to display if an update happened, or null.
|
|
122
|
+
*/
|
|
123
|
+
export function checkAndAutoUpdate(currentVersion) {
|
|
124
|
+
try {
|
|
125
|
+
if (!shouldCheck())
|
|
126
|
+
return null;
|
|
127
|
+
const latestVersion = fetchLatestVersionSync();
|
|
128
|
+
// Always record that we checked
|
|
129
|
+
writeState({
|
|
130
|
+
lastCheckedAt: Date.now(),
|
|
131
|
+
lastSeenVersion: latestVersion ?? undefined,
|
|
132
|
+
});
|
|
133
|
+
if (!latestVersion)
|
|
134
|
+
return null;
|
|
135
|
+
if (compareVersions(latestVersion, currentVersion) <= 0)
|
|
136
|
+
return null;
|
|
137
|
+
const info = detectInstallInfo();
|
|
138
|
+
if (!info.updateCommand)
|
|
139
|
+
return null;
|
|
140
|
+
const success = performUpdate(info.updateCommand);
|
|
141
|
+
if (success) {
|
|
142
|
+
return `Updated ${PACKAGE_NAME} ${currentVersion} \u2192 ${latestVersion}`;
|
|
143
|
+
}
|
|
144
|
+
// Update failed — show manual instructions
|
|
145
|
+
return `Update available: ${currentVersion} \u2192 ${latestVersion}\nRun: ${info.updateCommand}`;
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// Never block CLI startup
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=auto-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../../src/core/auto-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type Message, type Provider } from "@prestyj/ai";
|
|
2
|
+
export interface CompactionResult {
|
|
3
|
+
originalCount: number;
|
|
4
|
+
newCount: number;
|
|
5
|
+
tokensBeforeEstimate: number;
|
|
6
|
+
tokensAfterEstimate: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Check if compaction should be triggered.
|
|
10
|
+
*/
|
|
11
|
+
export declare function shouldCompact(messages: Message[], contextWindow: number, threshold?: number): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Find the index where recent messages should start, given a token budget.
|
|
14
|
+
* Walks backward from the end, accumulating token estimates, and returns the
|
|
15
|
+
* first index that fits within the budget. Never cuts at index 0 (system message).
|
|
16
|
+
* Avoids splitting tool_call / tool_result pairs.
|
|
17
|
+
*/
|
|
18
|
+
export declare function findRecentCutPoint(messages: Message[], tokenBudget: number): number;
|
|
19
|
+
/**
|
|
20
|
+
* Compact a conversation by summarizing older messages via LLM.
|
|
21
|
+
*
|
|
22
|
+
* - Keeps the system message (index 0) intact.
|
|
23
|
+
* - Keeps the most recent ~20K tokens of conversation intact.
|
|
24
|
+
* - Summarizes everything in between using an appropriate model
|
|
25
|
+
* (Sonnet for Anthropic, Codex Mini for OpenAI, current model for others).
|
|
26
|
+
* - Tool results are truncated to 2K chars in the summary prompt so the
|
|
27
|
+
* summarization call itself doesn't blow up.
|
|
28
|
+
*/
|
|
29
|
+
export declare function compact(messages: Message[], options: {
|
|
30
|
+
provider: Provider;
|
|
31
|
+
model: string;
|
|
32
|
+
apiKey?: string;
|
|
33
|
+
contextWindow: number;
|
|
34
|
+
signal?: AbortSignal;
|
|
35
|
+
}): Promise<{
|
|
36
|
+
messages: Message[];
|
|
37
|
+
result: CompactionResult;
|
|
38
|
+
}>;
|
|
39
|
+
//# sourceMappingURL=compactor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compactor.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/compactor.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,QAAQ,EAGd,MAAM,aAAa,CAAC;AAQrB,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,OAAO,EAAE,EACnB,aAAa,EAAE,MAAM,EACrB,SAAS,SAAM,GACd,OAAO,CAKT;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA2BnF;AA0FD;;;;;;;;;GASG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE;IACP,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GACA,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC,CA+I5D"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { stream, } from "@prestyj/ai";
|
|
2
|
+
import { estimateConversationTokens, estimateMessageTokens } from "./token-estimator.js";
|
|
3
|
+
import { getSummaryModel } from "../model-registry.js";
|
|
4
|
+
import { log } from "../logger.js";
|
|
5
|
+
/** Max chars per tool result when building the summary prompt. */
|
|
6
|
+
const TOOL_RESULT_SUMMARY_MAX_CHARS = 2000;
|
|
7
|
+
/**
|
|
8
|
+
* Check if compaction should be triggered.
|
|
9
|
+
*/
|
|
10
|
+
export function shouldCompact(messages, contextWindow, threshold = 0.8) {
|
|
11
|
+
const estimated = estimateConversationTokens(messages);
|
|
12
|
+
const limit = contextWindow * threshold;
|
|
13
|
+
log("INFO", "compaction", `Context check: ${estimated} estimated tokens, threshold ${limit}`);
|
|
14
|
+
return estimated > limit;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Find the index where recent messages should start, given a token budget.
|
|
18
|
+
* Walks backward from the end, accumulating token estimates, and returns the
|
|
19
|
+
* first index that fits within the budget. Never cuts at index 0 (system message).
|
|
20
|
+
* Avoids splitting tool_call / tool_result pairs.
|
|
21
|
+
*/
|
|
22
|
+
export function findRecentCutPoint(messages, tokenBudget) {
|
|
23
|
+
if (messages.length <= 1)
|
|
24
|
+
return messages.length;
|
|
25
|
+
let accumulated = 0;
|
|
26
|
+
let cutIndex = messages.length;
|
|
27
|
+
// Walk backwards from the last message
|
|
28
|
+
for (let i = messages.length - 1; i >= 1; i--) {
|
|
29
|
+
const tokens = estimateMessageTokens(messages[i]);
|
|
30
|
+
if (accumulated + tokens > tokenBudget) {
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
accumulated += tokens;
|
|
34
|
+
cutIndex = i;
|
|
35
|
+
}
|
|
36
|
+
// Don't split tool_call and tool_result pairs:
|
|
37
|
+
// If cut lands on a tool result message, back up to include the preceding assistant
|
|
38
|
+
if (cutIndex < messages.length && messages[cutIndex].role === "tool") {
|
|
39
|
+
// Back up to find the assistant message with the tool_call
|
|
40
|
+
if (cutIndex > 1) {
|
|
41
|
+
cutIndex--;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Never cut before index 1 (preserve system message at 0)
|
|
45
|
+
return Math.max(1, cutIndex);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Truncate a string for summary purposes.
|
|
49
|
+
*/
|
|
50
|
+
function truncateForSummary(text, maxChars) {
|
|
51
|
+
if (text.length <= maxChars)
|
|
52
|
+
return text;
|
|
53
|
+
const truncatedChars = text.length - maxChars;
|
|
54
|
+
return `${text.slice(0, maxChars)}\n\n[... ${truncatedChars} more characters truncated]`;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Extract file paths from tool calls in assistant messages for tracking.
|
|
58
|
+
*/
|
|
59
|
+
function extractFileOperations(messages) {
|
|
60
|
+
const read = new Set();
|
|
61
|
+
const modified = new Set();
|
|
62
|
+
for (const msg of messages) {
|
|
63
|
+
if (msg.role !== "assistant")
|
|
64
|
+
continue;
|
|
65
|
+
if (typeof msg.content === "string")
|
|
66
|
+
continue;
|
|
67
|
+
if (!Array.isArray(msg.content))
|
|
68
|
+
continue;
|
|
69
|
+
for (const part of msg.content) {
|
|
70
|
+
if (!("type" in part) || part.type !== "tool_call")
|
|
71
|
+
continue;
|
|
72
|
+
const tc = part;
|
|
73
|
+
const filePath = tc.args.file_path ?? tc.args.path ?? tc.args.file;
|
|
74
|
+
if (typeof filePath !== "string")
|
|
75
|
+
continue;
|
|
76
|
+
if (tc.name === "read" || tc.name === "grep" || tc.name === "find") {
|
|
77
|
+
read.add(filePath);
|
|
78
|
+
}
|
|
79
|
+
else if (tc.name === "write" || tc.name === "edit") {
|
|
80
|
+
modified.add(filePath);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return { read, modified };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Serialize a message for the summary prompt, truncating tool results.
|
|
88
|
+
*/
|
|
89
|
+
function serializeMessageForSummary(msg) {
|
|
90
|
+
const role = msg.role;
|
|
91
|
+
if (typeof msg.content === "string") {
|
|
92
|
+
return `[${role}]: ${truncateForSummary(msg.content, TOOL_RESULT_SUMMARY_MAX_CHARS)}`;
|
|
93
|
+
}
|
|
94
|
+
if (!Array.isArray(msg.content)) {
|
|
95
|
+
return `[${role}]: ${truncateForSummary(JSON.stringify(msg.content), TOOL_RESULT_SUMMARY_MAX_CHARS)}`;
|
|
96
|
+
}
|
|
97
|
+
// Handle tool result messages (role === "tool")
|
|
98
|
+
if (role === "tool") {
|
|
99
|
+
const results = msg.content;
|
|
100
|
+
const parts = results.map((tr) => `[tool_result: ${truncateForSummary(tr.content, TOOL_RESULT_SUMMARY_MAX_CHARS)}]`);
|
|
101
|
+
return `[${role}]: ${parts.join("\n")}`;
|
|
102
|
+
}
|
|
103
|
+
// For ContentPart[] (assistant messages with tool calls, etc.)
|
|
104
|
+
const parts = [];
|
|
105
|
+
for (const part of msg.content) {
|
|
106
|
+
if ("text" in part && typeof part.text === "string") {
|
|
107
|
+
parts.push(truncateForSummary(part.text, TOOL_RESULT_SUMMARY_MAX_CHARS));
|
|
108
|
+
}
|
|
109
|
+
else if ("type" in part && part.type === "tool_call") {
|
|
110
|
+
const tc = part;
|
|
111
|
+
parts.push(`[tool_call: ${tc.name}(${truncateForSummary(JSON.stringify(tc.args), 500)})]`);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
parts.push(truncateForSummary(JSON.stringify(part), 500));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return `[${role}]: ${parts.join("\n")}`;
|
|
118
|
+
}
|
|
119
|
+
/** Budget of recent tokens to keep un-summarized (~20K tokens). */
|
|
120
|
+
const KEEP_RECENT_TOKENS = 20_000;
|
|
121
|
+
/**
|
|
122
|
+
* Compact a conversation by summarizing older messages via LLM.
|
|
123
|
+
*
|
|
124
|
+
* - Keeps the system message (index 0) intact.
|
|
125
|
+
* - Keeps the most recent ~20K tokens of conversation intact.
|
|
126
|
+
* - Summarizes everything in between using an appropriate model
|
|
127
|
+
* (Sonnet for Anthropic, Codex Mini for OpenAI, current model for others).
|
|
128
|
+
* - Tool results are truncated to 2K chars in the summary prompt so the
|
|
129
|
+
* summarization call itself doesn't blow up.
|
|
130
|
+
*/
|
|
131
|
+
export async function compact(messages, options) {
|
|
132
|
+
const originalCount = messages.length;
|
|
133
|
+
const tokensBeforeEstimate = estimateConversationTokens(messages);
|
|
134
|
+
log("INFO", "compaction", `Starting compaction`, {
|
|
135
|
+
messageCount: String(originalCount),
|
|
136
|
+
estimatedTokens: String(tokensBeforeEstimate),
|
|
137
|
+
contextWindow: String(options.contextWindow),
|
|
138
|
+
});
|
|
139
|
+
// Find the cut point — keep ~20K tokens of recent conversation
|
|
140
|
+
const systemMessage = messages[0];
|
|
141
|
+
const recentStart = findRecentCutPoint(messages, KEEP_RECENT_TOKENS);
|
|
142
|
+
const recentMessages = messages.slice(recentStart);
|
|
143
|
+
const middleMessages = messages.slice(1, recentStart);
|
|
144
|
+
// If there's nothing to compact, return as-is
|
|
145
|
+
if (middleMessages.length <= 2) {
|
|
146
|
+
log("INFO", "compaction", `Skipping compaction — too few messages to summarize`, {
|
|
147
|
+
middleMessages: String(middleMessages.length),
|
|
148
|
+
recentStart: String(recentStart),
|
|
149
|
+
totalMessages: String(messages.length),
|
|
150
|
+
});
|
|
151
|
+
return {
|
|
152
|
+
messages: [...messages],
|
|
153
|
+
result: {
|
|
154
|
+
originalCount,
|
|
155
|
+
newCount: messages.length,
|
|
156
|
+
tokensBeforeEstimate,
|
|
157
|
+
tokensAfterEstimate: tokensBeforeEstimate,
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
// Track file operations from the messages being summarized
|
|
162
|
+
const fileOps = extractFileOperations(middleMessages);
|
|
163
|
+
// Build summary request with truncated tool results
|
|
164
|
+
const summaryContent = middleMessages.map((m) => serializeMessageForSummary(m)).join("\n\n");
|
|
165
|
+
// Build file tracking section
|
|
166
|
+
let fileTrackingSection = "";
|
|
167
|
+
if (fileOps.read.size > 0 || fileOps.modified.size > 0) {
|
|
168
|
+
const parts = [];
|
|
169
|
+
if (fileOps.read.size > 0) {
|
|
170
|
+
parts.push(`<read-files>\n${[...fileOps.read].join("\n")}\n</read-files>`);
|
|
171
|
+
}
|
|
172
|
+
if (fileOps.modified.size > 0) {
|
|
173
|
+
parts.push(`<modified-files>\n${[...fileOps.modified].join("\n")}\n</modified-files>`);
|
|
174
|
+
}
|
|
175
|
+
fileTrackingSection = "\n\n" + parts.join("\n");
|
|
176
|
+
}
|
|
177
|
+
// Pick the appropriate model for summarization
|
|
178
|
+
const summaryModel = getSummaryModel(options.provider, options.model);
|
|
179
|
+
log("INFO", "compaction", `Summarizing ${middleMessages.length} messages`, {
|
|
180
|
+
summaryPromptChars: String(summaryContent.length),
|
|
181
|
+
summaryModel: summaryModel.id,
|
|
182
|
+
filesRead: String(fileOps.read.size),
|
|
183
|
+
filesModified: String(fileOps.modified.size),
|
|
184
|
+
recentKept: String(recentMessages.length),
|
|
185
|
+
});
|
|
186
|
+
const summaryPrompt = `Summarize the following conversation segment concisely. ` +
|
|
187
|
+
`Focus on: key decisions made, files read and modified, tool results, and important context needed to continue the conversation. ` +
|
|
188
|
+
`Use this format:\n` +
|
|
189
|
+
`## Goal\n<what the user is trying to accomplish>\n` +
|
|
190
|
+
`## Progress\n<what has been done so far>\n` +
|
|
191
|
+
`## Key Decisions\n<important choices made>\n` +
|
|
192
|
+
`## Files Touched\n<files that were read or modified>\n` +
|
|
193
|
+
`## Next Steps\n<what remains to be done>\n\n` +
|
|
194
|
+
`Be factual and brief.\n\n${summaryContent}`;
|
|
195
|
+
const summaryMessages = [{ role: "user", content: summaryPrompt }];
|
|
196
|
+
const result = stream({
|
|
197
|
+
provider: options.provider,
|
|
198
|
+
model: summaryModel.id,
|
|
199
|
+
messages: summaryMessages,
|
|
200
|
+
maxTokens: 2048,
|
|
201
|
+
apiKey: options.apiKey,
|
|
202
|
+
signal: options.signal,
|
|
203
|
+
});
|
|
204
|
+
const response = await result.response;
|
|
205
|
+
const summaryText = typeof response.message.content === "string"
|
|
206
|
+
? response.message.content
|
|
207
|
+
: response.message.content
|
|
208
|
+
.filter((p) => p.type === "text")
|
|
209
|
+
.map((p) => p.text)
|
|
210
|
+
.join("");
|
|
211
|
+
log("INFO", "compaction", `Summary generated`, {
|
|
212
|
+
summaryChars: String(summaryText.length),
|
|
213
|
+
});
|
|
214
|
+
// Build new messages array
|
|
215
|
+
const summaryMessage = {
|
|
216
|
+
role: "user",
|
|
217
|
+
content: `[Previous conversation summary]\n\n${summaryText}${fileTrackingSection}`,
|
|
218
|
+
};
|
|
219
|
+
const newMessages = [
|
|
220
|
+
systemMessage,
|
|
221
|
+
summaryMessage,
|
|
222
|
+
{
|
|
223
|
+
role: "assistant",
|
|
224
|
+
content: "I understand. I have the context from our previous conversation. How can I help you continue?",
|
|
225
|
+
},
|
|
226
|
+
...recentMessages,
|
|
227
|
+
];
|
|
228
|
+
// Ensure the conversation doesn't end with an assistant message.
|
|
229
|
+
// Some models reject "assistant prefill" — the conversation must end
|
|
230
|
+
// with a user (or tool) message so the LLM can generate a fresh response.
|
|
231
|
+
while (newMessages.length > 1 && newMessages[newMessages.length - 1].role === "assistant") {
|
|
232
|
+
newMessages.pop();
|
|
233
|
+
}
|
|
234
|
+
const tokensAfterEstimate = estimateConversationTokens(newMessages);
|
|
235
|
+
const reduction = Math.round((1 - tokensAfterEstimate / tokensBeforeEstimate) * 100);
|
|
236
|
+
log("INFO", "compaction", `Compaction complete`, {
|
|
237
|
+
originalMessages: String(originalCount),
|
|
238
|
+
newMessages: String(newMessages.length),
|
|
239
|
+
tokensBefore: String(tokensBeforeEstimate),
|
|
240
|
+
tokensAfter: String(tokensAfterEstimate),
|
|
241
|
+
reduction: `${reduction}%`,
|
|
242
|
+
});
|
|
243
|
+
return {
|
|
244
|
+
messages: newMessages,
|
|
245
|
+
result: {
|
|
246
|
+
originalCount,
|
|
247
|
+
newCount: newMessages.length,
|
|
248
|
+
tokensBeforeEstimate,
|
|
249
|
+
tokensAfterEstimate,
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=compactor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compactor.js","sourceRoot":"","sources":["../../../src/core/compaction/compactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compactor.test.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/compactor.test.ts"],"names":[],"mappings":""}
|