orquesta-cli 0.1.13 → 0.1.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/README.md +30 -4
- package/dist/cli.js +65 -4
- package/dist/core/config/config-manager.d.ts +13 -1
- package/dist/core/config/config-manager.js +83 -0
- package/dist/core/slash-command-handler.d.ts +1 -0
- package/dist/core/slash-command-handler.js +129 -0
- package/dist/orquesta/config-sync.d.ts +73 -0
- package/dist/orquesta/config-sync.js +230 -0
- package/dist/orquesta/prompt-reporter.d.ts +16 -0
- package/dist/orquesta/prompt-reporter.js +85 -0
- package/dist/setup/first-run-setup.d.ts +15 -0
- package/dist/setup/first-run-setup.js +238 -0
- package/dist/types/index.d.ts +11 -2
- package/dist/ui/TodoPanel.d.ts +1 -0
- package/dist/ui/TodoPanel.js +6 -1
- package/dist/ui/components/LLMSetupWizard.js +381 -7
- package/dist/ui/components/Logo.d.ts +2 -0
- package/dist/ui/components/Logo.js +10 -3
- package/dist/ui/components/OpenRouterModelBrowser.d.ts +13 -0
- package/dist/ui/components/OpenRouterModelBrowser.js +221 -0
- package/dist/ui/components/PlanExecuteApp.js +30 -4
- package/dist/ui/components/ProjectSelector.d.ts +8 -0
- package/dist/ui/components/ProjectSelector.js +119 -0
- package/dist/ui/components/StatusBar.d.ts +2 -0
- package/dist/ui/components/StatusBar.js +6 -1
- package/dist/ui/hooks/slashCommandProcessor.js +8 -4
- package/package.json +11 -5
- package/.eslintrc.json +0 -26
- package/.prettierrc.json +0 -10
- package/CLAUDE.md +0 -199
- package/SECURITY.md +0 -290
- package/TEST_LOCAL.md +0 -245
- package/dist/agents/base/base-agent.d.ts.map +0 -1
- package/dist/agents/base/base-agent.js.map +0 -1
- package/dist/agents/docs-search/index.d.ts.map +0 -1
- package/dist/agents/docs-search/index.js.map +0 -1
- package/dist/agents/index.d.ts.map +0 -1
- package/dist/agents/index.js.map +0 -1
- package/dist/agents/planner/index.d.ts.map +0 -1
- package/dist/agents/planner/index.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js.map +0 -1
- package/dist/core/compact/compact-manager.d.ts.map +0 -1
- package/dist/core/compact/compact-manager.js.map +0 -1
- package/dist/core/compact/compact-prompts.d.ts.map +0 -1
- package/dist/core/compact/compact-prompts.js.map +0 -1
- package/dist/core/compact/context-tracker.d.ts.map +0 -1
- package/dist/core/compact/context-tracker.js.map +0 -1
- package/dist/core/compact/index.d.ts.map +0 -1
- package/dist/core/compact/index.js.map +0 -1
- package/dist/core/config/config-manager.d.ts.map +0 -1
- package/dist/core/config/config-manager.js.map +0 -1
- package/dist/core/config/index.d.ts.map +0 -1
- package/dist/core/config/index.js.map +0 -1
- package/dist/core/docs-manager.d.ts.map +0 -1
- package/dist/core/docs-manager.js.map +0 -1
- package/dist/core/git-auto-updater.d.ts +0 -58
- package/dist/core/git-auto-updater.d.ts.map +0 -1
- package/dist/core/git-auto-updater.js +0 -374
- package/dist/core/git-auto-updater.js.map +0 -1
- package/dist/core/llm/index.d.ts.map +0 -1
- package/dist/core/llm/index.js.map +0 -1
- package/dist/core/llm/llm-client.d.ts.map +0 -1
- package/dist/core/llm/llm-client.js.map +0 -1
- package/dist/core/session/index.d.ts.map +0 -1
- package/dist/core/session/index.js.map +0 -1
- package/dist/core/session/session-manager.d.ts.map +0 -1
- package/dist/core/session/session-manager.js.map +0 -1
- package/dist/core/slash-command-handler.d.ts.map +0 -1
- package/dist/core/slash-command-handler.js.map +0 -1
- package/dist/core/usage-tracker.d.ts.map +0 -1
- package/dist/core/usage-tracker.js.map +0 -1
- package/dist/errors/base.d.ts.map +0 -1
- package/dist/errors/base.js.map +0 -1
- package/dist/errors/file.d.ts.map +0 -1
- package/dist/errors/file.js.map +0 -1
- package/dist/errors/index.d.ts.map +0 -1
- package/dist/errors/index.js.map +0 -1
- package/dist/errors/llm.d.ts.map +0 -1
- package/dist/errors/llm.js.map +0 -1
- package/dist/errors/network.d.ts.map +0 -1
- package/dist/errors/network.js.map +0 -1
- package/dist/errors/validation.d.ts.map +0 -1
- package/dist/errors/validation.js.map +0 -1
- package/dist/eval/eval-runner.d.ts.map +0 -1
- package/dist/eval/eval-runner.js.map +0 -1
- package/dist/eval/index.d.ts.map +0 -1
- package/dist/eval/index.js.map +0 -1
- package/dist/eval/types.d.ts.map +0 -1
- package/dist/eval/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/orchestration/index.d.ts.map +0 -1
- package/dist/orchestration/index.js.map +0 -1
- package/dist/orchestration/plan-executor.d.ts.map +0 -1
- package/dist/orchestration/plan-executor.js.map +0 -1
- package/dist/orchestration/types.d.ts.map +0 -1
- package/dist/orchestration/types.js.map +0 -1
- package/dist/orchestration/utils.d.ts.map +0 -1
- package/dist/orchestration/utils.js.map +0 -1
- package/dist/orquesta/connection.d.ts.map +0 -1
- package/dist/orquesta/connection.js.map +0 -1
- package/dist/prompts/agents/docs-search-decision.d.ts.map +0 -1
- package/dist/prompts/agents/docs-search-decision.js.map +0 -1
- package/dist/prompts/agents/docs-search.d.ts.map +0 -1
- package/dist/prompts/agents/docs-search.js.map +0 -1
- package/dist/prompts/agents/planning.d.ts.map +0 -1
- package/dist/prompts/agents/planning.js.map +0 -1
- package/dist/prompts/index.d.ts.map +0 -1
- package/dist/prompts/index.js.map +0 -1
- package/dist/prompts/shared/codebase-rules.d.ts.map +0 -1
- package/dist/prompts/shared/codebase-rules.js.map +0 -1
- package/dist/prompts/shared/git-rules.d.ts.map +0 -1
- package/dist/prompts/shared/git-rules.js.map +0 -1
- package/dist/prompts/shared/language-rules.d.ts.map +0 -1
- package/dist/prompts/shared/language-rules.js.map +0 -1
- package/dist/prompts/shared/tool-usage.d.ts.map +0 -1
- package/dist/prompts/shared/tool-usage.js.map +0 -1
- package/dist/prompts/system/compact.d.ts.map +0 -1
- package/dist/prompts/system/compact.js.map +0 -1
- package/dist/prompts/system/plan-execute.d.ts.map +0 -1
- package/dist/prompts/system/plan-execute.js.map +0 -1
- package/dist/tools/browser/browser-client.d.ts.map +0 -1
- package/dist/tools/browser/browser-client.js.map +0 -1
- package/dist/tools/browser/browser-tools.d.ts.map +0 -1
- package/dist/tools/browser/browser-tools.js.map +0 -1
- package/dist/tools/browser/index.d.ts.map +0 -1
- package/dist/tools/browser/index.js.map +0 -1
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/llm/agents/docs-search-tools.d.ts.map +0 -1
- package/dist/tools/llm/agents/docs-search-tools.js.map +0 -1
- package/dist/tools/llm/agents/index.d.ts.map +0 -1
- package/dist/tools/llm/agents/index.js.map +0 -1
- package/dist/tools/llm/index.d.ts.map +0 -1
- package/dist/tools/llm/index.js.map +0 -1
- package/dist/tools/llm/simple/ask-user-tool.d.ts.map +0 -1
- package/dist/tools/llm/simple/ask-user-tool.js.map +0 -1
- package/dist/tools/llm/simple/background-bash-tool.d.ts.map +0 -1
- package/dist/tools/llm/simple/background-bash-tool.js.map +0 -1
- package/dist/tools/llm/simple/background-powershell-tool.d.ts.map +0 -1
- package/dist/tools/llm/simple/background-powershell-tool.js.map +0 -1
- package/dist/tools/llm/simple/bash-tool.d.ts.map +0 -1
- package/dist/tools/llm/simple/bash-tool.js.map +0 -1
- package/dist/tools/llm/simple/docs-search-agent-tool.d.ts.map +0 -1
- package/dist/tools/llm/simple/docs-search-agent-tool.js.map +0 -1
- package/dist/tools/llm/simple/file-tools.d.ts.map +0 -1
- package/dist/tools/llm/simple/file-tools.js.map +0 -1
- package/dist/tools/llm/simple/final-response-tool.d.ts.map +0 -1
- package/dist/tools/llm/simple/final-response-tool.js.map +0 -1
- package/dist/tools/llm/simple/index.d.ts.map +0 -1
- package/dist/tools/llm/simple/index.js.map +0 -1
- package/dist/tools/llm/simple/planning-tools.d.ts.map +0 -1
- package/dist/tools/llm/simple/planning-tools.js.map +0 -1
- package/dist/tools/llm/simple/powershell-tool.d.ts.map +0 -1
- package/dist/tools/llm/simple/powershell-tool.js.map +0 -1
- package/dist/tools/llm/simple/simple-tool-executor.d.ts.map +0 -1
- package/dist/tools/llm/simple/simple-tool-executor.js.map +0 -1
- package/dist/tools/llm/simple/todo-tools.d.ts.map +0 -1
- package/dist/tools/llm/simple/todo-tools.js.map +0 -1
- package/dist/tools/llm/simple/user-interaction-tools.d.ts.map +0 -1
- package/dist/tools/llm/simple/user-interaction-tools.js.map +0 -1
- package/dist/tools/office/common/constants.d.ts.map +0 -1
- package/dist/tools/office/common/constants.js.map +0 -1
- package/dist/tools/office/common/index.d.ts.map +0 -1
- package/dist/tools/office/common/index.js.map +0 -1
- package/dist/tools/office/common/types.d.ts.map +0 -1
- package/dist/tools/office/common/types.js.map +0 -1
- package/dist/tools/office/common/utils.d.ts.map +0 -1
- package/dist/tools/office/common/utils.js.map +0 -1
- package/dist/tools/office/excel-client.d.ts.map +0 -1
- package/dist/tools/office/excel-client.js.map +0 -1
- package/dist/tools/office/excel-tools/cells.d.ts.map +0 -1
- package/dist/tools/office/excel-tools/cells.js.map +0 -1
- package/dist/tools/office/excel-tools/charts.d.ts.map +0 -1
- package/dist/tools/office/excel-tools/charts.js.map +0 -1
- package/dist/tools/office/excel-tools/comments.d.ts.map +0 -1
- package/dist/tools/office/excel-tools/comments.js.map +0 -1
- package/dist/tools/office/excel-tools/data-ops.d.ts.map +0 -1
- package/dist/tools/office/excel-tools/data-ops.js.map +0 -1
- package/dist/tools/office/excel-tools/export.d.ts.map +0 -1
- package/dist/tools/office/excel-tools/export.js.map +0 -1
- package/dist/tools/office/excel-tools/formatting.d.ts.map +0 -1
- package/dist/tools/office/excel-tools/formatting.js.map +0 -1
- package/dist/tools/office/excel-tools/index.d.ts.map +0 -1
- package/dist/tools/office/excel-tools/index.js.map +0 -1
- package/dist/tools/office/excel-tools/launch.d.ts.map +0 -1
- package/dist/tools/office/excel-tools/launch.js.map +0 -1
- package/dist/tools/office/excel-tools/media.d.ts.map +0 -1
- package/dist/tools/office/excel-tools/media.js.map +0 -1
- package/dist/tools/office/excel-tools/named-ranges.d.ts.map +0 -1
- package/dist/tools/office/excel-tools/named-ranges.js.map +0 -1
- package/dist/tools/office/excel-tools/protection.d.ts.map +0 -1
- package/dist/tools/office/excel-tools/protection.js.map +0 -1
- package/dist/tools/office/excel-tools/rows-columns.d.ts.map +0 -1
- package/dist/tools/office/excel-tools/rows-columns.js.map +0 -1
- package/dist/tools/office/excel-tools/sheets.d.ts.map +0 -1
- package/dist/tools/office/excel-tools/sheets.js.map +0 -1
- package/dist/tools/office/excel-tools/validation.d.ts.map +0 -1
- package/dist/tools/office/excel-tools/validation.js.map +0 -1
- package/dist/tools/office/excel-tools.d.ts.map +0 -1
- package/dist/tools/office/excel-tools.js.map +0 -1
- package/dist/tools/office/index.d.ts.map +0 -1
- package/dist/tools/office/index.js.map +0 -1
- package/dist/tools/office/office-client-base.d.ts.map +0 -1
- package/dist/tools/office/office-client-base.js.map +0 -1
- package/dist/tools/office/office-client.d.ts.map +0 -1
- package/dist/tools/office/office-client.js.map +0 -1
- package/dist/tools/office/powerpoint-client.d.ts.map +0 -1
- package/dist/tools/office/powerpoint-client.js.map +0 -1
- package/dist/tools/office/powerpoint-tools/effects.d.ts.map +0 -1
- package/dist/tools/office/powerpoint-tools/effects.js.map +0 -1
- package/dist/tools/office/powerpoint-tools/export.d.ts.map +0 -1
- package/dist/tools/office/powerpoint-tools/export.js.map +0 -1
- package/dist/tools/office/powerpoint-tools/index.d.ts.map +0 -1
- package/dist/tools/office/powerpoint-tools/index.js.map +0 -1
- package/dist/tools/office/powerpoint-tools/launch.d.ts.map +0 -1
- package/dist/tools/office/powerpoint-tools/launch.js.map +0 -1
- package/dist/tools/office/powerpoint-tools/media.d.ts.map +0 -1
- package/dist/tools/office/powerpoint-tools/media.js.map +0 -1
- package/dist/tools/office/powerpoint-tools/notes.d.ts.map +0 -1
- package/dist/tools/office/powerpoint-tools/notes.js.map +0 -1
- package/dist/tools/office/powerpoint-tools/sections.d.ts.map +0 -1
- package/dist/tools/office/powerpoint-tools/sections.js.map +0 -1
- package/dist/tools/office/powerpoint-tools/shapes.d.ts.map +0 -1
- package/dist/tools/office/powerpoint-tools/shapes.js.map +0 -1
- package/dist/tools/office/powerpoint-tools/slides.d.ts.map +0 -1
- package/dist/tools/office/powerpoint-tools/slides.js.map +0 -1
- package/dist/tools/office/powerpoint-tools/tables.d.ts.map +0 -1
- package/dist/tools/office/powerpoint-tools/tables.js.map +0 -1
- package/dist/tools/office/powerpoint-tools/text.d.ts.map +0 -1
- package/dist/tools/office/powerpoint-tools/text.js.map +0 -1
- package/dist/tools/office/powerpoint-tools.d.ts.map +0 -1
- package/dist/tools/office/powerpoint-tools.js.map +0 -1
- package/dist/tools/office/word-client.d.ts.map +0 -1
- package/dist/tools/office/word-client.js.map +0 -1
- package/dist/tools/office/word-tools/bookmarks.d.ts.map +0 -1
- package/dist/tools/office/word-tools/bookmarks.js.map +0 -1
- package/dist/tools/office/word-tools/comments.d.ts.map +0 -1
- package/dist/tools/office/word-tools/comments.js.map +0 -1
- package/dist/tools/office/word-tools/content.d.ts.map +0 -1
- package/dist/tools/office/word-tools/content.js.map +0 -1
- package/dist/tools/office/word-tools/export.d.ts.map +0 -1
- package/dist/tools/office/word-tools/export.js.map +0 -1
- package/dist/tools/office/word-tools/formatting.d.ts.map +0 -1
- package/dist/tools/office/word-tools/formatting.js.map +0 -1
- package/dist/tools/office/word-tools/headers-footers.d.ts.map +0 -1
- package/dist/tools/office/word-tools/headers-footers.js.map +0 -1
- package/dist/tools/office/word-tools/index.d.ts.map +0 -1
- package/dist/tools/office/word-tools/index.js.map +0 -1
- package/dist/tools/office/word-tools/launch.d.ts.map +0 -1
- package/dist/tools/office/word-tools/launch.js.map +0 -1
- package/dist/tools/office/word-tools/lists.d.ts.map +0 -1
- package/dist/tools/office/word-tools/lists.js.map +0 -1
- package/dist/tools/office/word-tools/navigation.d.ts.map +0 -1
- package/dist/tools/office/word-tools/navigation.js.map +0 -1
- package/dist/tools/office/word-tools/page-setup.d.ts.map +0 -1
- package/dist/tools/office/word-tools/page-setup.js.map +0 -1
- package/dist/tools/office/word-tools/tables.d.ts.map +0 -1
- package/dist/tools/office/word-tools/tables.js.map +0 -1
- package/dist/tools/office/word-tools/text.d.ts.map +0 -1
- package/dist/tools/office/word-tools/text.js.map +0 -1
- package/dist/tools/office/word-tools/undo-redo.d.ts.map +0 -1
- package/dist/tools/office/word-tools/undo-redo.js.map +0 -1
- package/dist/tools/office/word-tools/watermarks.d.ts.map +0 -1
- package/dist/tools/office/word-tools/watermarks.js.map +0 -1
- package/dist/tools/office/word-tools.d.ts.map +0 -1
- package/dist/tools/office/word-tools.js.map +0 -1
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/types.js.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/ui/PlanExecuteView.d.ts.map +0 -1
- package/dist/ui/PlanExecuteView.js.map +0 -1
- package/dist/ui/TodoPanel.d.ts.map +0 -1
- package/dist/ui/TodoPanel.js.map +0 -1
- package/dist/ui/UpdateNotification.d.ts.map +0 -1
- package/dist/ui/UpdateNotification.js.map +0 -1
- package/dist/ui/components/ActivityIndicator.d.ts.map +0 -1
- package/dist/ui/components/ActivityIndicator.js.map +0 -1
- package/dist/ui/components/CommandBrowser.d.ts.map +0 -1
- package/dist/ui/components/CommandBrowser.js.map +0 -1
- package/dist/ui/components/CustomTextInput.d.ts.map +0 -1
- package/dist/ui/components/CustomTextInput.js.map +0 -1
- package/dist/ui/components/DocsSearchProgress.d.ts.map +0 -1
- package/dist/ui/components/DocsSearchProgress.js.map +0 -1
- package/dist/ui/components/FileBrowser.d.ts.map +0 -1
- package/dist/ui/components/FileBrowser.js.map +0 -1
- package/dist/ui/components/LLMSetupWizard.d.ts.map +0 -1
- package/dist/ui/components/LLMSetupWizard.js.map +0 -1
- package/dist/ui/components/Logo.d.ts.map +0 -1
- package/dist/ui/components/Logo.js.map +0 -1
- package/dist/ui/components/MarkdownRenderer.d.ts.map +0 -1
- package/dist/ui/components/MarkdownRenderer.js.map +0 -1
- package/dist/ui/components/ModelSelector.d.ts.map +0 -1
- package/dist/ui/components/ModelSelector.js.map +0 -1
- package/dist/ui/components/PlanExecuteApp.d.ts.map +0 -1
- package/dist/ui/components/PlanExecuteApp.js.map +0 -1
- package/dist/ui/components/ProgressBar.d.ts.map +0 -1
- package/dist/ui/components/ProgressBar.js.map +0 -1
- package/dist/ui/components/StatusBar.d.ts.map +0 -1
- package/dist/ui/components/StatusBar.js.map +0 -1
- package/dist/ui/components/ThinkingIndicator.d.ts.map +0 -1
- package/dist/ui/components/ThinkingIndicator.js.map +0 -1
- package/dist/ui/components/TodoListView.d.ts.map +0 -1
- package/dist/ui/components/TodoListView.js.map +0 -1
- package/dist/ui/components/ToolSelector.d.ts.map +0 -1
- package/dist/ui/components/ToolSelector.js.map +0 -1
- package/dist/ui/components/dialogs/ApprovalDialog.d.ts.map +0 -1
- package/dist/ui/components/dialogs/ApprovalDialog.js.map +0 -1
- package/dist/ui/components/dialogs/AskUserDialog.d.ts.map +0 -1
- package/dist/ui/components/dialogs/AskUserDialog.js.map +0 -1
- package/dist/ui/components/dialogs/DocsBrowser.d.ts.map +0 -1
- package/dist/ui/components/dialogs/DocsBrowser.js.map +0 -1
- package/dist/ui/components/dialogs/SettingsDialog.d.ts.map +0 -1
- package/dist/ui/components/dialogs/SettingsDialog.js.map +0 -1
- package/dist/ui/components/dialogs/index.d.ts.map +0 -1
- package/dist/ui/components/dialogs/index.js.map +0 -1
- package/dist/ui/components/index.d.ts.map +0 -1
- package/dist/ui/components/index.js.map +0 -1
- package/dist/ui/components/panels/LogPanel.d.ts.map +0 -1
- package/dist/ui/components/panels/LogPanel.js.map +0 -1
- package/dist/ui/components/panels/SessionPanel.d.ts.map +0 -1
- package/dist/ui/components/panels/SessionPanel.js.map +0 -1
- package/dist/ui/components/panels/index.d.ts.map +0 -1
- package/dist/ui/components/panels/index.js.map +0 -1
- package/dist/ui/components/views/ChatView.d.ts.map +0 -1
- package/dist/ui/components/views/ChatView.js.map +0 -1
- package/dist/ui/components/views/index.d.ts.map +0 -1
- package/dist/ui/components/views/index.js.map +0 -1
- package/dist/ui/contexts/TokenContext.d.ts.map +0 -1
- package/dist/ui/contexts/TokenContext.js.map +0 -1
- package/dist/ui/hooks/atFileProcessor.d.ts.map +0 -1
- package/dist/ui/hooks/atFileProcessor.js.map +0 -1
- package/dist/ui/hooks/index.d.ts.map +0 -1
- package/dist/ui/hooks/index.js.map +0 -1
- package/dist/ui/hooks/slashCommandProcessor.d.ts.map +0 -1
- package/dist/ui/hooks/slashCommandProcessor.js.map +0 -1
- package/dist/ui/hooks/useCommandBrowserState.d.ts.map +0 -1
- package/dist/ui/hooks/useCommandBrowserState.js.map +0 -1
- package/dist/ui/hooks/useFileBrowserState.d.ts.map +0 -1
- package/dist/ui/hooks/useFileBrowserState.js.map +0 -1
- package/dist/ui/hooks/useFileList.d.ts.map +0 -1
- package/dist/ui/hooks/useFileList.js.map +0 -1
- package/dist/ui/hooks/useInputHistory.d.ts.map +0 -1
- package/dist/ui/hooks/useInputHistory.js.map +0 -1
- package/dist/ui/hooks/usePlanExecution.d.ts.map +0 -1
- package/dist/ui/hooks/usePlanExecution.js.map +0 -1
- package/dist/ui/index.d.ts.map +0 -1
- package/dist/ui/index.js.map +0 -1
- package/dist/ui/ink-entry.d.ts.map +0 -1
- package/dist/ui/ink-entry.js.map +0 -1
- package/dist/utils/env-filter.d.ts.map +0 -1
- package/dist/utils/env-filter.js.map +0 -1
- package/dist/utils/file-system.d.ts.map +0 -1
- package/dist/utils/file-system.js.map +0 -1
- package/dist/utils/git-utils.d.ts.map +0 -1
- package/dist/utils/git-utils.js.map +0 -1
- package/dist/utils/json-stream-logger.d.ts.map +0 -1
- package/dist/utils/json-stream-logger.js.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/platform-utils.d.ts.map +0 -1
- package/dist/utils/platform-utils.js.map +0 -1
- package/dist/utils/wsl-utils.d.ts.map +0 -1
- package/dist/utils/wsl-utils.js.map +0 -1
- package/electron.vite.config.ts +0 -63
- package/google374b9eba0c52b043.html +0 -1
- package/src/agents/base/base-agent.ts +0 -159
- package/src/agents/docs-search/index.ts +0 -365
- package/src/agents/index.ts +0 -34
- package/src/agents/planner/index.ts +0 -544
- package/src/cli.ts +0 -201
- package/src/constants.ts +0 -47
- package/src/core/compact/compact-manager.ts +0 -160
- package/src/core/compact/compact-prompts.ts +0 -150
- package/src/core/compact/context-tracker.ts +0 -164
- package/src/core/compact/index.ts +0 -25
- package/src/core/config/config-manager.ts +0 -460
- package/src/core/config/index.ts +0 -5
- package/src/core/docs-manager.ts +0 -678
- package/src/core/llm/index.ts +0 -7
- package/src/core/llm/llm-client.ts +0 -1550
- package/src/core/session/index.ts +0 -5
- package/src/core/session/session-manager.ts +0 -464
- package/src/core/slash-command-handler.ts +0 -410
- package/src/core/usage-tracker.ts +0 -438
- package/src/errors/base.ts +0 -81
- package/src/errors/file.ts +0 -183
- package/src/errors/index.ts +0 -95
- package/src/errors/llm.ts +0 -151
- package/src/errors/network.ts +0 -124
- package/src/errors/validation.ts +0 -111
- package/src/eval/eval-runner.ts +0 -456
- package/src/eval/index.ts +0 -8
- package/src/eval/types.ts +0 -139
- package/src/index.ts +0 -22
- package/src/orchestration/index.ts +0 -30
- package/src/orchestration/plan-executor.ts +0 -652
- package/src/orchestration/types.ts +0 -127
- package/src/orchestration/utils.ts +0 -119
- package/src/orquesta/connection.ts +0 -291
- package/src/prompts/agents/docs-search-decision.ts +0 -74
- package/src/prompts/agents/docs-search.ts +0 -84
- package/src/prompts/agents/planning.ts +0 -143
- package/src/prompts/index.ts +0 -31
- package/src/prompts/shared/codebase-rules.ts +0 -29
- package/src/prompts/shared/git-rules.ts +0 -94
- package/src/prompts/shared/language-rules.ts +0 -36
- package/src/prompts/shared/tool-usage.ts +0 -72
- package/src/prompts/system/compact.ts +0 -80
- package/src/prompts/system/plan-execute.ts +0 -89
- package/src/tools/browser/browser-client.ts +0 -1363
- package/src/tools/browser/browser-tools.ts +0 -1139
- package/src/tools/browser/index.ts +0 -65
- package/src/tools/index.ts +0 -23
- package/src/tools/llm/agents/docs-search-tools.ts +0 -368
- package/src/tools/llm/agents/index.ts +0 -22
- package/src/tools/llm/index.ts +0 -11
- package/src/tools/llm/simple/ask-user-tool.ts +0 -25
- package/src/tools/llm/simple/background-bash-tool.ts +0 -443
- package/src/tools/llm/simple/background-powershell-tool.ts +0 -421
- package/src/tools/llm/simple/bash-tool.ts +0 -238
- package/src/tools/llm/simple/docs-search-agent-tool.ts +0 -146
- package/src/tools/llm/simple/file-tools.ts +0 -1051
- package/src/tools/llm/simple/final-response-tool.ts +0 -180
- package/src/tools/llm/simple/index.ts +0 -42
- package/src/tools/llm/simple/planning-tools.ts +0 -143
- package/src/tools/llm/simple/powershell-tool.ts +0 -241
- package/src/tools/llm/simple/simple-tool-executor.ts +0 -279
- package/src/tools/llm/simple/todo-tools.ts +0 -207
- package/src/tools/llm/simple/user-interaction-tools.ts +0 -277
- package/src/tools/office/common/constants.ts +0 -335
- package/src/tools/office/common/index.ts +0 -133
- package/src/tools/office/common/types.ts +0 -286
- package/src/tools/office/common/utils.ts +0 -116
- package/src/tools/office/excel-client.ts +0 -1336
- package/src/tools/office/excel-tools/cells.ts +0 -359
- package/src/tools/office/excel-tools/charts.ts +0 -166
- package/src/tools/office/excel-tools/comments.ts +0 -155
- package/src/tools/office/excel-tools/data-ops.ts +0 -349
- package/src/tools/office/excel-tools/export.ts +0 -105
- package/src/tools/office/excel-tools/formatting.ts +0 -357
- package/src/tools/office/excel-tools/index.ts +0 -55
- package/src/tools/office/excel-tools/launch.ts +0 -303
- package/src/tools/office/excel-tools/media.ts +0 -117
- package/src/tools/office/excel-tools/named-ranges.ts +0 -148
- package/src/tools/office/excel-tools/protection.ts +0 -105
- package/src/tools/office/excel-tools/rows-columns.ts +0 -386
- package/src/tools/office/excel-tools/sheets.ts +0 -228
- package/src/tools/office/excel-tools/validation.ts +0 -226
- package/src/tools/office/excel-tools.ts +0 -9
- package/src/tools/office/index.ts +0 -259
- package/src/tools/office/office-client-base.ts +0 -242
- package/src/tools/office/office-client.ts +0 -377
- package/src/tools/office/powerpoint-client.ts +0 -1498
- package/src/tools/office/powerpoint-tools/effects.ts +0 -315
- package/src/tools/office/powerpoint-tools/export.ts +0 -138
- package/src/tools/office/powerpoint-tools/index.ts +0 -45
- package/src/tools/office/powerpoint-tools/launch.ts +0 -263
- package/src/tools/office/powerpoint-tools/media.ts +0 -291
- package/src/tools/office/powerpoint-tools/notes.ts +0 -220
- package/src/tools/office/powerpoint-tools/sections.ts +0 -140
- package/src/tools/office/powerpoint-tools/shapes.ts +0 -870
- package/src/tools/office/powerpoint-tools/slides.ts +0 -350
- package/src/tools/office/powerpoint-tools/tables.ts +0 -182
- package/src/tools/office/powerpoint-tools/text.ts +0 -473
- package/src/tools/office/powerpoint-tools.ts +0 -9
- package/src/tools/office/word-client.ts +0 -1697
- package/src/tools/office/word-tools/bookmarks.ts +0 -186
- package/src/tools/office/word-tools/comments.ts +0 -185
- package/src/tools/office/word-tools/content.ts +0 -229
- package/src/tools/office/word-tools/export.ts +0 -97
- package/src/tools/office/word-tools/formatting.ts +0 -161
- package/src/tools/office/word-tools/headers-footers.ts +0 -155
- package/src/tools/office/word-tools/index.ts +0 -57
- package/src/tools/office/word-tools/launch.ts +0 -312
- package/src/tools/office/word-tools/lists.ts +0 -97
- package/src/tools/office/word-tools/navigation.ts +0 -114
- package/src/tools/office/word-tools/page-setup.ts +0 -195
- package/src/tools/office/word-tools/tables.ts +0 -262
- package/src/tools/office/word-tools/text.ts +0 -294
- package/src/tools/office/word-tools/undo-redo.ts +0 -97
- package/src/tools/office/word-tools/watermarks.ts +0 -105
- package/src/tools/office/word-tools.ts +0 -9
- package/src/tools/registry.ts +0 -527
- package/src/tools/types.ts +0 -231
- package/src/types/index.ts +0 -181
- package/src/ui/PlanExecuteView.tsx +0 -119
- package/src/ui/TodoPanel.tsx +0 -240
- package/src/ui/UpdateNotification.tsx +0 -105
- package/src/ui/components/ActivityIndicator.tsx +0 -234
- package/src/ui/components/CommandBrowser.tsx +0 -114
- package/src/ui/components/CustomTextInput.tsx +0 -389
- package/src/ui/components/DocsSearchProgress.tsx +0 -85
- package/src/ui/components/FileBrowser.tsx +0 -93
- package/src/ui/components/LLMSetupWizard.tsx +0 -333
- package/src/ui/components/Logo.tsx +0 -125
- package/src/ui/components/MarkdownRenderer.tsx +0 -358
- package/src/ui/components/ModelSelector.tsx +0 -203
- package/src/ui/components/PlanExecuteApp.tsx +0 -2007
- package/src/ui/components/ProgressBar.tsx +0 -51
- package/src/ui/components/StatusBar.tsx +0 -302
- package/src/ui/components/ThinkingIndicator.tsx +0 -120
- package/src/ui/components/TodoListView.tsx +0 -140
- package/src/ui/components/ToolSelector.tsx +0 -215
- package/src/ui/components/dialogs/ApprovalDialog.tsx +0 -259
- package/src/ui/components/dialogs/AskUserDialog.tsx +0 -159
- package/src/ui/components/dialogs/DocsBrowser.tsx +0 -222
- package/src/ui/components/dialogs/SettingsDialog.tsx +0 -939
- package/src/ui/components/dialogs/index.ts +0 -13
- package/src/ui/components/index.ts +0 -27
- package/src/ui/components/panels/LogPanel.tsx +0 -385
- package/src/ui/components/panels/SessionPanel.tsx +0 -146
- package/src/ui/components/panels/index.ts +0 -13
- package/src/ui/components/views/ChatView.tsx +0 -447
- package/src/ui/components/views/index.ts +0 -5
- package/src/ui/contexts/TokenContext.tsx +0 -139
- package/src/ui/hooks/atFileProcessor.ts +0 -167
- package/src/ui/hooks/index.ts +0 -11
- package/src/ui/hooks/slashCommandProcessor.ts +0 -174
- package/src/ui/hooks/useCommandBrowserState.ts +0 -97
- package/src/ui/hooks/useFileBrowserState.ts +0 -116
- package/src/ui/hooks/useFileList.ts +0 -132
- package/src/ui/hooks/useInputHistory.ts +0 -89
- package/src/ui/hooks/usePlanExecution.ts +0 -339
- package/src/ui/index.ts +0 -10
- package/src/ui/ink-entry.tsx +0 -36
- package/src/utils/env-filter.ts +0 -164
- package/src/utils/file-system.ts +0 -133
- package/src/utils/git-utils.ts +0 -30
- package/src/utils/json-stream-logger.ts +0 -1259
- package/src/utils/logger.ts +0 -2767
- package/src/utils/platform-utils.ts +0 -256
- package/src/utils/wsl-utils.ts +0 -113
- package/tsconfig.electron.json +0 -39
- package/tsconfig.json +0 -64
|
@@ -1,1259 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* JSON Stream Logger
|
|
3
|
-
*
|
|
4
|
-
* Logs all terminal interactions and events to a JSON file for analysis
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { createWriteStream, WriteStream } from 'fs';
|
|
8
|
-
import { mkdir, access, readFile, writeFile } from 'fs/promises';
|
|
9
|
-
import { dirname, join } from 'path';
|
|
10
|
-
import chalk from 'chalk';
|
|
11
|
-
import { PROJECTS_DIR } from '../constants.js';
|
|
12
|
-
|
|
13
|
-
// Flush interval for periodic buffer writes (in milliseconds)
|
|
14
|
-
const FLUSH_INTERVAL_MS = 1000;
|
|
15
|
-
|
|
16
|
-
// Log category type
|
|
17
|
-
export type LogCategory = 'all' | 'chat' | 'tool' | 'http' | 'llm' | 'ui' | 'system' | 'debug';
|
|
18
|
-
|
|
19
|
-
export interface StreamLogEntry {
|
|
20
|
-
timestamp: string;
|
|
21
|
-
type:
|
|
22
|
-
| 'user_input'
|
|
23
|
-
| 'assistant_response'
|
|
24
|
-
| 'system_message'
|
|
25
|
-
| 'error'
|
|
26
|
-
| 'tool_call'
|
|
27
|
-
| 'tool_start' // Tool execution start
|
|
28
|
-
| 'tool_end' // Tool execution complete
|
|
29
|
-
| 'todo_update'
|
|
30
|
-
| 'planning_start' // Planning start
|
|
31
|
-
| 'planning_end' // Planning complete
|
|
32
|
-
| 'server_request' // Windows server request
|
|
33
|
-
| 'server_response' // Windows server response
|
|
34
|
-
| 'debug'
|
|
35
|
-
| 'info'
|
|
36
|
-
// New log types for comprehensive logging
|
|
37
|
-
| 'ui_interaction' // UI interaction (click, keyboard, scroll, etc.)
|
|
38
|
-
| 'component_lifecycle' // Component lifecycle (mount, unmount, render)
|
|
39
|
-
| 'screen_change' // Screen/tab/route transition
|
|
40
|
-
| 'form_event' // Form event (submit, validation, etc.)
|
|
41
|
-
| 'modal_event' // Modal/dialog/toast event
|
|
42
|
-
| 'loading_event' // Loading/skeleton/progress event
|
|
43
|
-
| 'animation_event' // Animation/transition event
|
|
44
|
-
| 'layout_event' // Layout event (resize, breakpoint, etc.)
|
|
45
|
-
| 'ipc_event' // IPC communication event (Electron)
|
|
46
|
-
| 'window_event' // Window event (Electron)
|
|
47
|
-
| 'system_event' // System event (app ready, quit, etc.)
|
|
48
|
-
| 'update_event' // Auto-update event
|
|
49
|
-
| 'session_event' // Session event (start, end, milestone)
|
|
50
|
-
| 'http_event'; // HTTP event (stream start/end, etc.)
|
|
51
|
-
content: string;
|
|
52
|
-
category?: LogCategory; // Log category (for file splitting)
|
|
53
|
-
metadata?: Record<string, unknown>;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Determine category from log type
|
|
58
|
-
*/
|
|
59
|
-
function getLogCategory(type: StreamLogEntry['type']): LogCategory {
|
|
60
|
-
switch (type) {
|
|
61
|
-
// Chat category
|
|
62
|
-
case 'user_input':
|
|
63
|
-
case 'assistant_response':
|
|
64
|
-
return 'chat';
|
|
65
|
-
|
|
66
|
-
// Tool category
|
|
67
|
-
case 'tool_call':
|
|
68
|
-
case 'tool_start':
|
|
69
|
-
case 'tool_end':
|
|
70
|
-
case 'todo_update':
|
|
71
|
-
case 'planning_start':
|
|
72
|
-
case 'planning_end':
|
|
73
|
-
return 'tool';
|
|
74
|
-
|
|
75
|
-
// HTTP category
|
|
76
|
-
case 'server_request':
|
|
77
|
-
case 'server_response':
|
|
78
|
-
case 'http_event':
|
|
79
|
-
return 'http';
|
|
80
|
-
|
|
81
|
-
// UI category
|
|
82
|
-
case 'ui_interaction':
|
|
83
|
-
case 'component_lifecycle':
|
|
84
|
-
case 'screen_change':
|
|
85
|
-
case 'form_event':
|
|
86
|
-
case 'modal_event':
|
|
87
|
-
case 'loading_event':
|
|
88
|
-
case 'animation_event':
|
|
89
|
-
case 'layout_event':
|
|
90
|
-
return 'ui';
|
|
91
|
-
|
|
92
|
-
// System category
|
|
93
|
-
case 'system_message':
|
|
94
|
-
case 'ipc_event':
|
|
95
|
-
case 'window_event':
|
|
96
|
-
case 'system_event':
|
|
97
|
-
case 'update_event':
|
|
98
|
-
case 'session_event':
|
|
99
|
-
case 'error':
|
|
100
|
-
return 'system';
|
|
101
|
-
|
|
102
|
-
// Debug category
|
|
103
|
-
case 'debug':
|
|
104
|
-
case 'info':
|
|
105
|
-
return 'debug';
|
|
106
|
-
|
|
107
|
-
default:
|
|
108
|
-
return 'system';
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Re-determine category from message content
|
|
114
|
-
* Analyze message prefix for more accurate category determination
|
|
115
|
-
*/
|
|
116
|
-
function refineCategoryFromContent(category: LogCategory, content: string): LogCategory {
|
|
117
|
-
const msg = content.toLowerCase();
|
|
118
|
-
|
|
119
|
-
// LLM-related messages go to llm category
|
|
120
|
-
if (msg.includes('[llm]') || msg.includes('llm request') || msg.includes('llm response') ||
|
|
121
|
-
msg.includes('llm tool') || msg.includes('completion') || msg.includes('tokens')) {
|
|
122
|
-
return 'llm';
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// HTTP-related messages
|
|
126
|
-
if (msg.includes('[http]') || msg.includes('stream start') || msg.includes('stream end') ||
|
|
127
|
-
msg.includes('stream chunk') || msg.includes('http request') || msg.includes('http response')) {
|
|
128
|
-
return 'http';
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Tool-related messages
|
|
132
|
-
if (msg.includes('[tool]') || msg.includes('[bash]') || msg.includes('[read]') ||
|
|
133
|
-
msg.includes('[write]') || msg.includes('[edit]') || msg.includes('tool execution') ||
|
|
134
|
-
msg.includes('tool result')) {
|
|
135
|
-
return 'tool';
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// UI-related messages
|
|
139
|
-
if (msg.includes('[ui]') || msg.includes('[component]') || msg.includes('[render]') ||
|
|
140
|
-
msg.includes('[modal]') || msg.includes('[form]') || msg.includes('[loading]')) {
|
|
141
|
-
return 'ui';
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// System-related messages
|
|
145
|
-
if (msg.includes('[system]') || msg.includes('[session]') || msg.includes('[config]') ||
|
|
146
|
-
msg.includes('[update]') || msg.includes('[window]') || msg.includes('[ipc]')) {
|
|
147
|
-
return 'system';
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// Keep existing category
|
|
151
|
-
return category;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// Category stream information
|
|
155
|
-
interface CategoryStreamInfo {
|
|
156
|
-
stream: WriteStream;
|
|
157
|
-
buffer: StreamLogEntry[];
|
|
158
|
-
isFirstEntry: boolean;
|
|
159
|
-
filePath: string;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
export class JsonStreamLogger {
|
|
163
|
-
private writeStream: WriteStream | null = null;
|
|
164
|
-
private errorWriteStream: WriteStream | null = null;
|
|
165
|
-
private filePath: string;
|
|
166
|
-
private errorFilePath: string;
|
|
167
|
-
private isFirstEntry = true;
|
|
168
|
-
private isFirstErrorEntry = true;
|
|
169
|
-
private buffer: StreamLogEntry[] = [];
|
|
170
|
-
private errorBuffer: StreamLogEntry[] = [];
|
|
171
|
-
private flushInterval: NodeJS.Timeout | null = null;
|
|
172
|
-
private isEnabled = false;
|
|
173
|
-
private errorStreamInitialized = false;
|
|
174
|
-
private appendMode = false;
|
|
175
|
-
private verbose = false;
|
|
176
|
-
|
|
177
|
-
// Category-based stream management (for file splitting)
|
|
178
|
-
private categoryStreams: Map<LogCategory, CategoryStreamInfo> = new Map();
|
|
179
|
-
private enableCategorySplit = true; // Enable category-based file splitting
|
|
180
|
-
private pendingStreamInits: Set<Promise<void>> = new Set(); // Track pending stream initialization promises
|
|
181
|
-
|
|
182
|
-
constructor(filePath: string, errorFilePath: string) {
|
|
183
|
-
this.filePath = filePath;
|
|
184
|
-
this.errorFilePath = errorFilePath;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Initialize the JSON stream logger
|
|
189
|
-
* @param append - Whether to append to existing file
|
|
190
|
-
* @param verbose - Whether to show initialization messages
|
|
191
|
-
*/
|
|
192
|
-
async initialize(append = false, verbose = false): Promise<void> {
|
|
193
|
-
this.verbose = verbose;
|
|
194
|
-
try {
|
|
195
|
-
// Store append mode for error stream initialization
|
|
196
|
-
this.appendMode = append;
|
|
197
|
-
|
|
198
|
-
// Create directory if it doesn't exist
|
|
199
|
-
await mkdir(dirname(this.filePath), { recursive: true });
|
|
200
|
-
|
|
201
|
-
// Check if file exists and we're in append mode
|
|
202
|
-
let fileExists = false;
|
|
203
|
-
try {
|
|
204
|
-
await access(this.filePath);
|
|
205
|
-
fileExists = true;
|
|
206
|
-
} catch {
|
|
207
|
-
fileExists = false;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
if (append && fileExists) {
|
|
211
|
-
// Append mode: remove closing bracket and continue
|
|
212
|
-
await this.prepareFileForAppend(this.filePath);
|
|
213
|
-
this.writeStream = createWriteStream(this.filePath, { flags: 'a' });
|
|
214
|
-
this.isFirstEntry = false; // Not first entry since file has content
|
|
215
|
-
if (this.verbose) {
|
|
216
|
-
console.log(chalk.dim(`📝 JSON stream logging resumed (append mode)`));
|
|
217
|
-
}
|
|
218
|
-
} else {
|
|
219
|
-
// New file mode: create fresh file
|
|
220
|
-
this.writeStream = createWriteStream(this.filePath, { flags: 'w' });
|
|
221
|
-
this.writeStream.write('[\n');
|
|
222
|
-
this.isFirstEntry = true;
|
|
223
|
-
if (this.verbose) {
|
|
224
|
-
console.log(chalk.dim(`📝 JSON stream logging enabled`));
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
this.isEnabled = true;
|
|
229
|
-
|
|
230
|
-
// Set up periodic flush
|
|
231
|
-
this.flushInterval = setInterval(() => {
|
|
232
|
-
this.flush();
|
|
233
|
-
this.flushErrors();
|
|
234
|
-
this.flushCategories();
|
|
235
|
-
}, FLUSH_INTERVAL_MS);
|
|
236
|
-
|
|
237
|
-
if (this.verbose) {
|
|
238
|
-
console.log(chalk.dim(` Log: ${this.filePath}`));
|
|
239
|
-
}
|
|
240
|
-
} catch (error) {
|
|
241
|
-
console.error(chalk.red('Failed to initialize JSON stream logger:'), error);
|
|
242
|
-
this.isEnabled = false;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/**
|
|
247
|
-
* Prepare file for append by removing closing bracket
|
|
248
|
-
*/
|
|
249
|
-
private async prepareFileForAppend(filePath: string): Promise<void> {
|
|
250
|
-
try {
|
|
251
|
-
const content = await readFile(filePath, 'utf-8');
|
|
252
|
-
// Remove the closing bracket and trailing whitespace
|
|
253
|
-
const trimmed = content.trimEnd();
|
|
254
|
-
if (trimmed.endsWith(']')) {
|
|
255
|
-
const withoutClosing = trimmed.slice(0, -1);
|
|
256
|
-
await writeFile(filePath, withoutClosing, 'utf-8');
|
|
257
|
-
}
|
|
258
|
-
} catch (error) {
|
|
259
|
-
console.error(chalk.yellow('Warning: Could not prepare file for append:'), error);
|
|
260
|
-
// Continue anyway - will create new file
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Initialize category stream (lazy initialization)
|
|
266
|
-
* This method can be called even after being pre-registered in the Map by log()
|
|
267
|
-
* If stream is null, create stream and update existing info
|
|
268
|
-
*/
|
|
269
|
-
private async initializeCategoryStream(category: LogCategory): Promise<void> {
|
|
270
|
-
if (!this.enableCategorySplit) {
|
|
271
|
-
return;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
// Check existing info (may have been pre-registered by log())
|
|
275
|
-
const existingInfo = this.categoryStreams.get(category);
|
|
276
|
-
|
|
277
|
-
// Return if valid stream already exists
|
|
278
|
-
if (existingInfo && existingInfo.stream && !existingInfo.stream.destroyed) {
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
try {
|
|
283
|
-
// Generate category file path: {sessionId}_log.json → {sessionId}_{category}.json
|
|
284
|
-
const categoryFilePath = existingInfo?.filePath || this.filePath.replace('_log.json', `_${category}.json`);
|
|
285
|
-
|
|
286
|
-
// Create directory if it doesn't exist
|
|
287
|
-
await mkdir(dirname(categoryFilePath), { recursive: true });
|
|
288
|
-
|
|
289
|
-
// Check if file exists and we're in append mode
|
|
290
|
-
let fileExists = false;
|
|
291
|
-
try {
|
|
292
|
-
await access(categoryFilePath);
|
|
293
|
-
fileExists = true;
|
|
294
|
-
} catch {
|
|
295
|
-
fileExists = false;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
let stream: WriteStream;
|
|
299
|
-
let isFirstEntry = true;
|
|
300
|
-
|
|
301
|
-
if (this.appendMode && fileExists) {
|
|
302
|
-
// Append mode: remove closing bracket and continue
|
|
303
|
-
await this.prepareFileForAppend(categoryFilePath);
|
|
304
|
-
stream = createWriteStream(categoryFilePath, { flags: 'a' });
|
|
305
|
-
isFirstEntry = false;
|
|
306
|
-
} else {
|
|
307
|
-
// New file mode: create fresh file
|
|
308
|
-
stream = createWriteStream(categoryFilePath, { flags: 'w' });
|
|
309
|
-
stream.write('[\n');
|
|
310
|
-
isFirstEntry = true;
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
// Update stream only if existing info exists, otherwise create new
|
|
314
|
-
if (existingInfo) {
|
|
315
|
-
existingInfo.stream = stream;
|
|
316
|
-
existingInfo.isFirstEntry = isFirstEntry;
|
|
317
|
-
// filePath is already set
|
|
318
|
-
} else {
|
|
319
|
-
this.categoryStreams.set(category, {
|
|
320
|
-
stream,
|
|
321
|
-
buffer: [],
|
|
322
|
-
isFirstEntry,
|
|
323
|
-
filePath: categoryFilePath,
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
if (this.verbose) {
|
|
328
|
-
console.log(chalk.dim(` Category log: ${categoryFilePath}`));
|
|
329
|
-
}
|
|
330
|
-
} catch (error) {
|
|
331
|
-
console.error(chalk.red(`Failed to initialize category stream (${category}):`), error);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
/**
|
|
336
|
-
* Log an entry to the JSON stream
|
|
337
|
-
*/
|
|
338
|
-
log(entry: StreamLogEntry): void {
|
|
339
|
-
if (!this.isEnabled || !this.writeStream) {
|
|
340
|
-
return;
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
// Determine category if not set
|
|
344
|
-
if (!entry.category) {
|
|
345
|
-
const baseCategory = getLogCategory(entry.type);
|
|
346
|
-
// Refine category based on message content (for more accurate categorization)
|
|
347
|
-
entry.category = refineCategoryFromContent(baseCategory, entry.content);
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
// Add to main buffer
|
|
351
|
-
this.buffer.push(entry);
|
|
352
|
-
|
|
353
|
-
// Add to error buffer if error
|
|
354
|
-
if (entry.type === 'error') {
|
|
355
|
-
// Initialize error stream on first error (lazy initialization)
|
|
356
|
-
if (!this.errorStreamInitialized) {
|
|
357
|
-
this.initializeErrorStream().catch(err => {
|
|
358
|
-
console.error(chalk.red('Failed to initialize error stream:'), err);
|
|
359
|
-
});
|
|
360
|
-
}
|
|
361
|
-
this.errorBuffer.push(entry);
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
// Add to category buffer (for file splitting)
|
|
365
|
-
if (this.enableCategorySplit && entry.category && entry.category !== 'all') {
|
|
366
|
-
const category = entry.category;
|
|
367
|
-
|
|
368
|
-
// If no stream, register temporary object with buffer only (stream initialized later)
|
|
369
|
-
if (!this.categoryStreams.has(category)) {
|
|
370
|
-
// Generate file path
|
|
371
|
-
const categoryFilePath = this.filePath.replace('_log.json', `_${category}.json`);
|
|
372
|
-
|
|
373
|
-
// First register in Map (stream is null, buffer only prepared)
|
|
374
|
-
this.categoryStreams.set(category, {
|
|
375
|
-
stream: null as unknown as WriteStream,
|
|
376
|
-
buffer: [],
|
|
377
|
-
isFirstEntry: true,
|
|
378
|
-
filePath: categoryFilePath,
|
|
379
|
-
});
|
|
380
|
-
|
|
381
|
-
// Initialize stream asynchronously (track promise)
|
|
382
|
-
const initPromise = this.initializeCategoryStream(category).catch(err => {
|
|
383
|
-
console.error(chalk.red(`Failed to initialize category stream (${category}):`), err);
|
|
384
|
-
});
|
|
385
|
-
this.pendingStreamInits.add(initPromise);
|
|
386
|
-
initPromise.finally(() => this.pendingStreamInits.delete(initPromise));
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
// streamInfo now always exists
|
|
390
|
-
const streamInfo = this.categoryStreams.get(category);
|
|
391
|
-
if (streamInfo) {
|
|
392
|
-
streamInfo.buffer.push(entry);
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
/**
|
|
398
|
-
* Flush buffered entries to file
|
|
399
|
-
*/
|
|
400
|
-
private flush(): void {
|
|
401
|
-
if (!this.writeStream || this.buffer.length === 0) {
|
|
402
|
-
return;
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
try {
|
|
406
|
-
for (const entry of this.buffer) {
|
|
407
|
-
// Add comma if not first entry
|
|
408
|
-
if (!this.isFirstEntry) {
|
|
409
|
-
this.writeStream.write(',\n');
|
|
410
|
-
}
|
|
411
|
-
this.isFirstEntry = false;
|
|
412
|
-
|
|
413
|
-
// Write the entry as formatted JSON
|
|
414
|
-
const json = JSON.stringify(entry, null, 2);
|
|
415
|
-
// Indent each line by 2 spaces for array formatting
|
|
416
|
-
const indentedJson = json.split('\n').map(line => ' ' + line).join('\n');
|
|
417
|
-
this.writeStream.write(indentedJson);
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
// Clear buffer
|
|
421
|
-
this.buffer = [];
|
|
422
|
-
} catch (error) {
|
|
423
|
-
console.error(chalk.red('Failed to write to JSON stream:'), error);
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
/**
|
|
428
|
-
* Initialize error stream (lazy initialization)
|
|
429
|
-
*/
|
|
430
|
-
private async initializeErrorStream(): Promise<void> {
|
|
431
|
-
if (this.errorStreamInitialized) {
|
|
432
|
-
return;
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
try {
|
|
436
|
-
// Create directory if it doesn't exist
|
|
437
|
-
await mkdir(dirname(this.errorFilePath), { recursive: true });
|
|
438
|
-
|
|
439
|
-
// Check if file exists and we're in append mode
|
|
440
|
-
let fileExists = false;
|
|
441
|
-
try {
|
|
442
|
-
await access(this.errorFilePath);
|
|
443
|
-
fileExists = true;
|
|
444
|
-
} catch {
|
|
445
|
-
fileExists = false;
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
if (this.appendMode && fileExists) {
|
|
449
|
-
// Append mode: remove closing bracket and continue
|
|
450
|
-
await this.prepareFileForAppend(this.errorFilePath);
|
|
451
|
-
this.errorWriteStream = createWriteStream(this.errorFilePath, { flags: 'a' });
|
|
452
|
-
this.isFirstErrorEntry = false;
|
|
453
|
-
} else {
|
|
454
|
-
// New file mode: create fresh file
|
|
455
|
-
this.errorWriteStream = createWriteStream(this.errorFilePath, { flags: 'w' });
|
|
456
|
-
this.errorWriteStream.write('[\n');
|
|
457
|
-
this.isFirstErrorEntry = true;
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
this.errorStreamInitialized = true;
|
|
461
|
-
console.log(chalk.dim(` Error log: ${this.errorFilePath}`));
|
|
462
|
-
} catch (error) {
|
|
463
|
-
console.error(chalk.red('Failed to initialize error stream:'), error);
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
/**
|
|
468
|
-
* Flush buffered error entries to error file
|
|
469
|
-
*/
|
|
470
|
-
private flushErrors(): void {
|
|
471
|
-
if (!this.errorWriteStream || this.errorBuffer.length === 0) {
|
|
472
|
-
return;
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
try {
|
|
476
|
-
for (const entry of this.errorBuffer) {
|
|
477
|
-
// Add comma if not first entry
|
|
478
|
-
if (!this.isFirstErrorEntry) {
|
|
479
|
-
this.errorWriteStream.write(',\n');
|
|
480
|
-
}
|
|
481
|
-
this.isFirstErrorEntry = false;
|
|
482
|
-
|
|
483
|
-
// Write the entry as formatted JSON
|
|
484
|
-
const json = JSON.stringify(entry, null, 2);
|
|
485
|
-
// Indent each line by 2 spaces for array formatting
|
|
486
|
-
const indentedJson = json.split('\n').map(line => ' ' + line).join('\n');
|
|
487
|
-
this.errorWriteStream.write(indentedJson);
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
// Clear error buffer
|
|
491
|
-
this.errorBuffer = [];
|
|
492
|
-
} catch (error) {
|
|
493
|
-
console.error(chalk.red('Failed to write to error JSON stream:'), error);
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
/**
|
|
498
|
-
* Flush buffered entries to category files
|
|
499
|
-
*/
|
|
500
|
-
private flushCategories(): void {
|
|
501
|
-
for (const [_category, streamInfo] of this.categoryStreams) {
|
|
502
|
-
// Skip if stream is missing, not writable, or buffer is empty
|
|
503
|
-
// If stream not yet initialized, buffer is maintained and retry on next flush
|
|
504
|
-
if (!streamInfo.stream || !streamInfo.stream.writable || streamInfo.buffer.length === 0) {
|
|
505
|
-
continue;
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
try {
|
|
509
|
-
for (const entry of streamInfo.buffer) {
|
|
510
|
-
// Add comma if not first entry
|
|
511
|
-
if (!streamInfo.isFirstEntry) {
|
|
512
|
-
streamInfo.stream.write(',\n');
|
|
513
|
-
}
|
|
514
|
-
streamInfo.isFirstEntry = false;
|
|
515
|
-
|
|
516
|
-
// Write the entry as formatted JSON
|
|
517
|
-
const json = JSON.stringify(entry, null, 2);
|
|
518
|
-
// Indent each line by 2 spaces for array formatting
|
|
519
|
-
const indentedJson = json.split('\n').map(line => ' ' + line).join('\n');
|
|
520
|
-
streamInfo.stream.write(indentedJson);
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
// Clear category buffer
|
|
524
|
-
streamInfo.buffer = [];
|
|
525
|
-
} catch (error) {
|
|
526
|
-
console.error(chalk.red(`Failed to write to category stream:`), error);
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
/**
|
|
532
|
-
* Log user input
|
|
533
|
-
*/
|
|
534
|
-
logUserInput(input: string): void {
|
|
535
|
-
this.log({
|
|
536
|
-
timestamp: new Date().toISOString(),
|
|
537
|
-
type: 'user_input',
|
|
538
|
-
content: input,
|
|
539
|
-
metadata: {
|
|
540
|
-
length: input.length,
|
|
541
|
-
},
|
|
542
|
-
});
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
/**
|
|
546
|
-
* Log assistant response
|
|
547
|
-
*/
|
|
548
|
-
logAssistantResponse(response: string, streaming = false): void {
|
|
549
|
-
this.log({
|
|
550
|
-
timestamp: new Date().toISOString(),
|
|
551
|
-
type: 'assistant_response',
|
|
552
|
-
content: response,
|
|
553
|
-
metadata: {
|
|
554
|
-
length: response.length,
|
|
555
|
-
streaming,
|
|
556
|
-
},
|
|
557
|
-
});
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
/**
|
|
561
|
-
* Log system message
|
|
562
|
-
*/
|
|
563
|
-
logSystemMessage(message: string): void {
|
|
564
|
-
this.log({
|
|
565
|
-
timestamp: new Date().toISOString(),
|
|
566
|
-
type: 'system_message',
|
|
567
|
-
content: message,
|
|
568
|
-
});
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
/**
|
|
572
|
-
* Log error
|
|
573
|
-
*/
|
|
574
|
-
logError(error: Error | unknown, context?: string): void {
|
|
575
|
-
let errorMessage: string;
|
|
576
|
-
let errorStack: string | undefined;
|
|
577
|
-
let errorDetails: Record<string, unknown> | undefined;
|
|
578
|
-
|
|
579
|
-
if (error instanceof Error) {
|
|
580
|
-
errorMessage = error.message;
|
|
581
|
-
errorStack = error.stack;
|
|
582
|
-
// Include custom error details if available
|
|
583
|
-
if ((error as any).details) {
|
|
584
|
-
errorDetails = (error as any).details;
|
|
585
|
-
}
|
|
586
|
-
} else if (typeof error === 'object' && error !== null) {
|
|
587
|
-
// For plain objects, serialize them properly
|
|
588
|
-
try {
|
|
589
|
-
errorMessage = JSON.stringify(error, null, 2);
|
|
590
|
-
errorDetails = error as Record<string, unknown>;
|
|
591
|
-
} catch {
|
|
592
|
-
errorMessage = String(error);
|
|
593
|
-
}
|
|
594
|
-
} else {
|
|
595
|
-
errorMessage = String(error);
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
this.log({
|
|
599
|
-
timestamp: new Date().toISOString(),
|
|
600
|
-
type: 'error',
|
|
601
|
-
content: errorMessage,
|
|
602
|
-
metadata: {
|
|
603
|
-
context,
|
|
604
|
-
stack: errorStack,
|
|
605
|
-
name: error instanceof Error ? error.constructor.name : 'Unknown',
|
|
606
|
-
...(errorDetails && { details: errorDetails }),
|
|
607
|
-
},
|
|
608
|
-
});
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
/**
|
|
612
|
-
* Log tool call
|
|
613
|
-
*/
|
|
614
|
-
logToolCall(toolName: string, args: unknown, result?: unknown, error?: Error): void {
|
|
615
|
-
this.log({
|
|
616
|
-
timestamp: new Date().toISOString(),
|
|
617
|
-
type: 'tool_call',
|
|
618
|
-
content: `Tool: ${toolName}`,
|
|
619
|
-
metadata: {
|
|
620
|
-
toolName,
|
|
621
|
-
args,
|
|
622
|
-
result: result ? (typeof result === 'string' ? result.substring(0, 500) : result) : undefined,
|
|
623
|
-
error: error ? error.message : undefined,
|
|
624
|
-
success: !error,
|
|
625
|
-
},
|
|
626
|
-
});
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
/**
|
|
630
|
-
* Log TODO update
|
|
631
|
-
*/
|
|
632
|
-
logTodoUpdate(todos: unknown[]): void {
|
|
633
|
-
this.log({
|
|
634
|
-
timestamp: new Date().toISOString(),
|
|
635
|
-
type: 'todo_update',
|
|
636
|
-
content: `TODO list updated (${todos.length} items)`,
|
|
637
|
-
metadata: {
|
|
638
|
-
todos,
|
|
639
|
-
count: todos.length,
|
|
640
|
-
},
|
|
641
|
-
});
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
/**
|
|
645
|
-
* Log debug information
|
|
646
|
-
*/
|
|
647
|
-
logDebug(message: string, data?: unknown): void {
|
|
648
|
-
this.log({
|
|
649
|
-
timestamp: new Date().toISOString(),
|
|
650
|
-
type: 'debug',
|
|
651
|
-
content: message,
|
|
652
|
-
metadata: data ? { data } : undefined,
|
|
653
|
-
});
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
/**
|
|
657
|
-
* Log info message
|
|
658
|
-
*/
|
|
659
|
-
logInfo(message: string, data?: unknown): void {
|
|
660
|
-
this.log({
|
|
661
|
-
timestamp: new Date().toISOString(),
|
|
662
|
-
type: 'info',
|
|
663
|
-
content: message,
|
|
664
|
-
metadata: data ? { data } : undefined,
|
|
665
|
-
});
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
/**
|
|
669
|
-
* Log tool execution start
|
|
670
|
-
*/
|
|
671
|
-
logToolStart(toolName: string, args: unknown, reason?: string): void {
|
|
672
|
-
this.log({
|
|
673
|
-
timestamp: new Date().toISOString(),
|
|
674
|
-
type: 'tool_start',
|
|
675
|
-
content: `Tool Start: ${toolName}`,
|
|
676
|
-
metadata: {
|
|
677
|
-
toolName,
|
|
678
|
-
args,
|
|
679
|
-
reason,
|
|
680
|
-
},
|
|
681
|
-
});
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
/**
|
|
685
|
-
* Log tool execution end
|
|
686
|
-
*/
|
|
687
|
-
logToolEnd(toolName: string, success: boolean, result?: unknown, error?: string, durationMs?: number): void {
|
|
688
|
-
this.log({
|
|
689
|
-
timestamp: new Date().toISOString(),
|
|
690
|
-
type: 'tool_end',
|
|
691
|
-
content: `Tool End: ${toolName} (${success ? 'success' : 'failed'})`,
|
|
692
|
-
metadata: {
|
|
693
|
-
toolName,
|
|
694
|
-
success,
|
|
695
|
-
result: result ? (typeof result === 'string' ? result.substring(0, 1000) : result) : undefined,
|
|
696
|
-
error,
|
|
697
|
-
durationMs,
|
|
698
|
-
},
|
|
699
|
-
});
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
/**
|
|
703
|
-
* Log planning phase start
|
|
704
|
-
*/
|
|
705
|
-
logPlanningStart(userMessage: string, context?: Record<string, unknown>): void {
|
|
706
|
-
this.log({
|
|
707
|
-
timestamp: new Date().toISOString(),
|
|
708
|
-
type: 'planning_start',
|
|
709
|
-
content: `Planning Start: ${userMessage.substring(0, 100)}...`,
|
|
710
|
-
metadata: {
|
|
711
|
-
userMessage,
|
|
712
|
-
messageLength: userMessage.length,
|
|
713
|
-
...context,
|
|
714
|
-
},
|
|
715
|
-
});
|
|
716
|
-
}
|
|
717
|
-
|
|
718
|
-
/**
|
|
719
|
-
* Log planning phase end
|
|
720
|
-
*/
|
|
721
|
-
logPlanningEnd(todoCount: number, todos?: unknown[], directResponse?: boolean, durationMs?: number): void {
|
|
722
|
-
this.log({
|
|
723
|
-
timestamp: new Date().toISOString(),
|
|
724
|
-
type: 'planning_end',
|
|
725
|
-
content: directResponse ? 'Planning End: Direct response' : `Planning End: ${todoCount} TODOs created`,
|
|
726
|
-
metadata: {
|
|
727
|
-
todoCount,
|
|
728
|
-
todos,
|
|
729
|
-
directResponse,
|
|
730
|
-
durationMs,
|
|
731
|
-
},
|
|
732
|
-
});
|
|
733
|
-
}
|
|
734
|
-
|
|
735
|
-
/**
|
|
736
|
-
* Log server request (legacy Windows servers)
|
|
737
|
-
*/
|
|
738
|
-
logServerRequest(serverType: 'browser' | 'office', method: string, endpoint: string, body?: unknown): void {
|
|
739
|
-
this.log({
|
|
740
|
-
timestamp: new Date().toISOString(),
|
|
741
|
-
type: 'server_request',
|
|
742
|
-
content: `${serverType.toUpperCase()} Server: ${method} ${endpoint}`,
|
|
743
|
-
metadata: {
|
|
744
|
-
serverType,
|
|
745
|
-
method,
|
|
746
|
-
endpoint,
|
|
747
|
-
body,
|
|
748
|
-
},
|
|
749
|
-
});
|
|
750
|
-
}
|
|
751
|
-
|
|
752
|
-
/**
|
|
753
|
-
* Log server response (for Windows servers)
|
|
754
|
-
*/
|
|
755
|
-
logServerResponse(
|
|
756
|
-
serverType: 'browser' | 'office',
|
|
757
|
-
endpoint: string,
|
|
758
|
-
success: boolean,
|
|
759
|
-
response?: unknown,
|
|
760
|
-
error?: string,
|
|
761
|
-
durationMs?: number
|
|
762
|
-
): void {
|
|
763
|
-
this.log({
|
|
764
|
-
timestamp: new Date().toISOString(),
|
|
765
|
-
type: 'server_response',
|
|
766
|
-
content: `${serverType.toUpperCase()} Server Response: ${endpoint} (${success ? 'success' : 'failed'})`,
|
|
767
|
-
metadata: {
|
|
768
|
-
serverType,
|
|
769
|
-
endpoint,
|
|
770
|
-
success,
|
|
771
|
-
response: response ? (typeof response === 'string' ? response.substring(0, 500) : response) : undefined,
|
|
772
|
-
error,
|
|
773
|
-
durationMs,
|
|
774
|
-
},
|
|
775
|
-
});
|
|
776
|
-
}
|
|
777
|
-
|
|
778
|
-
// ============================================================================
|
|
779
|
-
// New Log Methods for Comprehensive Logging
|
|
780
|
-
// ============================================================================
|
|
781
|
-
|
|
782
|
-
/**
|
|
783
|
-
* Log UI interaction (click, keyboard, scroll, drag)
|
|
784
|
-
*/
|
|
785
|
-
logUIInteraction(action: string, element?: string, context?: Record<string, unknown>): void {
|
|
786
|
-
this.log({
|
|
787
|
-
timestamp: new Date().toISOString(),
|
|
788
|
-
type: 'ui_interaction',
|
|
789
|
-
content: `UI: ${action}${element ? ` - ${element}` : ''}`,
|
|
790
|
-
metadata: {
|
|
791
|
-
action,
|
|
792
|
-
element,
|
|
793
|
-
...context,
|
|
794
|
-
},
|
|
795
|
-
});
|
|
796
|
-
}
|
|
797
|
-
|
|
798
|
-
/**
|
|
799
|
-
* Log component lifecycle (mount, unmount, render, stateChange)
|
|
800
|
-
*/
|
|
801
|
-
logComponentLifecycle(
|
|
802
|
-
event: 'mount' | 'unmount' | 'render' | 'renderComplete' | 'stateChange',
|
|
803
|
-
componentName: string,
|
|
804
|
-
context?: Record<string, unknown>
|
|
805
|
-
): void {
|
|
806
|
-
this.log({
|
|
807
|
-
timestamp: new Date().toISOString(),
|
|
808
|
-
type: 'component_lifecycle',
|
|
809
|
-
content: `Component ${event}: ${componentName}`,
|
|
810
|
-
metadata: {
|
|
811
|
-
event,
|
|
812
|
-
componentName,
|
|
813
|
-
...context,
|
|
814
|
-
},
|
|
815
|
-
});
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
/**
|
|
819
|
-
* Log screen/navigation changes
|
|
820
|
-
*/
|
|
821
|
-
logScreenChange(
|
|
822
|
-
changeType: 'screen' | 'tab' | 'route',
|
|
823
|
-
target: string,
|
|
824
|
-
context?: Record<string, unknown>
|
|
825
|
-
): void {
|
|
826
|
-
this.log({
|
|
827
|
-
timestamp: new Date().toISOString(),
|
|
828
|
-
type: 'screen_change',
|
|
829
|
-
content: `${changeType.charAt(0).toUpperCase() + changeType.slice(1)} change: ${target}`,
|
|
830
|
-
metadata: {
|
|
831
|
-
changeType,
|
|
832
|
-
target,
|
|
833
|
-
...context,
|
|
834
|
-
},
|
|
835
|
-
});
|
|
836
|
-
}
|
|
837
|
-
|
|
838
|
-
/**
|
|
839
|
-
* Log form events
|
|
840
|
-
*/
|
|
841
|
-
logFormEvent(
|
|
842
|
-
event: 'start' | 'submit' | 'result' | 'error' | 'fieldChange' | 'validation',
|
|
843
|
-
formId: string,
|
|
844
|
-
context?: Record<string, unknown>
|
|
845
|
-
): void {
|
|
846
|
-
this.log({
|
|
847
|
-
timestamp: new Date().toISOString(),
|
|
848
|
-
type: 'form_event',
|
|
849
|
-
content: `Form ${event}: ${formId}`,
|
|
850
|
-
metadata: {
|
|
851
|
-
event,
|
|
852
|
-
formId,
|
|
853
|
-
...context,
|
|
854
|
-
},
|
|
855
|
-
});
|
|
856
|
-
}
|
|
857
|
-
|
|
858
|
-
/**
|
|
859
|
-
* Log modal/dialog/toast events
|
|
860
|
-
*/
|
|
861
|
-
logModalEvent(
|
|
862
|
-
event: 'modalOpen' | 'modalClose' | 'dialogShow' | 'dialogResult' | 'toastShow' | 'toastDismiss',
|
|
863
|
-
id: string,
|
|
864
|
-
context?: Record<string, unknown>
|
|
865
|
-
): void {
|
|
866
|
-
this.log({
|
|
867
|
-
timestamp: new Date().toISOString(),
|
|
868
|
-
type: 'modal_event',
|
|
869
|
-
content: `${event}: ${id}`,
|
|
870
|
-
metadata: {
|
|
871
|
-
event,
|
|
872
|
-
id,
|
|
873
|
-
...context,
|
|
874
|
-
},
|
|
875
|
-
});
|
|
876
|
-
}
|
|
877
|
-
|
|
878
|
-
/**
|
|
879
|
-
* Log loading/skeleton/progress events
|
|
880
|
-
*/
|
|
881
|
-
logLoadingEvent(
|
|
882
|
-
event: 'loadingStart' | 'loadingEnd' | 'loadingError' | 'skeletonShow' | 'skeletonHide' |
|
|
883
|
-
'progressStart' | 'progressUpdate' | 'progressComplete' | 'progressError',
|
|
884
|
-
id: string,
|
|
885
|
-
context?: Record<string, unknown>
|
|
886
|
-
): void {
|
|
887
|
-
this.log({
|
|
888
|
-
timestamp: new Date().toISOString(),
|
|
889
|
-
type: 'loading_event',
|
|
890
|
-
content: `${event}: ${id}`,
|
|
891
|
-
metadata: {
|
|
892
|
-
event,
|
|
893
|
-
id,
|
|
894
|
-
...context,
|
|
895
|
-
},
|
|
896
|
-
});
|
|
897
|
-
}
|
|
898
|
-
|
|
899
|
-
/**
|
|
900
|
-
* Log animation/transition events
|
|
901
|
-
*/
|
|
902
|
-
logAnimationEvent(
|
|
903
|
-
event: 'animationStart' | 'animationEnd' | 'transitionStart' | 'transitionEnd' | 'hoverEnter' | 'hoverLeave',
|
|
904
|
-
name: string,
|
|
905
|
-
context?: Record<string, unknown>
|
|
906
|
-
): void {
|
|
907
|
-
this.log({
|
|
908
|
-
timestamp: new Date().toISOString(),
|
|
909
|
-
type: 'animation_event',
|
|
910
|
-
content: `${event}: ${name}`,
|
|
911
|
-
metadata: {
|
|
912
|
-
event,
|
|
913
|
-
name,
|
|
914
|
-
...context,
|
|
915
|
-
},
|
|
916
|
-
});
|
|
917
|
-
}
|
|
918
|
-
|
|
919
|
-
/**
|
|
920
|
-
* Log layout events (viewport, breakpoint, shift)
|
|
921
|
-
*/
|
|
922
|
-
logLayoutEvent(
|
|
923
|
-
event: 'viewportResize' | 'breakpointChange' | 'layoutShift' | 'scrollPosition',
|
|
924
|
-
context?: Record<string, unknown>
|
|
925
|
-
): void {
|
|
926
|
-
this.log({
|
|
927
|
-
timestamp: new Date().toISOString(),
|
|
928
|
-
type: 'layout_event',
|
|
929
|
-
content: `Layout: ${event}`,
|
|
930
|
-
metadata: {
|
|
931
|
-
event,
|
|
932
|
-
...context,
|
|
933
|
-
},
|
|
934
|
-
});
|
|
935
|
-
}
|
|
936
|
-
|
|
937
|
-
/**
|
|
938
|
-
* Log IPC events (Electron)
|
|
939
|
-
*/
|
|
940
|
-
logIPCEvent(
|
|
941
|
-
event: 'send' | 'receive' | 'invoke' | 'handle' | 'error',
|
|
942
|
-
channel: string,
|
|
943
|
-
context?: Record<string, unknown>
|
|
944
|
-
): void {
|
|
945
|
-
this.log({
|
|
946
|
-
timestamp: new Date().toISOString(),
|
|
947
|
-
type: 'ipc_event',
|
|
948
|
-
content: `IPC ${event}: ${channel}`,
|
|
949
|
-
metadata: {
|
|
950
|
-
event,
|
|
951
|
-
channel,
|
|
952
|
-
...context,
|
|
953
|
-
},
|
|
954
|
-
});
|
|
955
|
-
}
|
|
956
|
-
|
|
957
|
-
/**
|
|
958
|
-
* Log window events (Electron)
|
|
959
|
-
*/
|
|
960
|
-
logWindowEvent(
|
|
961
|
-
event: 'create' | 'close' | 'stateChange' | 'focus' | 'blur',
|
|
962
|
-
context?: Record<string, unknown>
|
|
963
|
-
): void {
|
|
964
|
-
this.log({
|
|
965
|
-
timestamp: new Date().toISOString(),
|
|
966
|
-
type: 'window_event',
|
|
967
|
-
content: `Window: ${event}`,
|
|
968
|
-
metadata: {
|
|
969
|
-
event,
|
|
970
|
-
...context,
|
|
971
|
-
},
|
|
972
|
-
});
|
|
973
|
-
}
|
|
974
|
-
|
|
975
|
-
/**
|
|
976
|
-
* Log system events (app lifecycle)
|
|
977
|
-
*/
|
|
978
|
-
logSystemEvent(
|
|
979
|
-
event: 'appReady' | 'appActivate' | 'appBeforeQuit' | 'appQuit' | 'systemSuspend' | 'systemResume' |
|
|
980
|
-
'networkChange' | 'themeChange',
|
|
981
|
-
context?: Record<string, unknown>
|
|
982
|
-
): void {
|
|
983
|
-
this.log({
|
|
984
|
-
timestamp: new Date().toISOString(),
|
|
985
|
-
type: 'system_event',
|
|
986
|
-
content: `System: ${event}`,
|
|
987
|
-
metadata: {
|
|
988
|
-
event,
|
|
989
|
-
...context,
|
|
990
|
-
},
|
|
991
|
-
});
|
|
992
|
-
}
|
|
993
|
-
|
|
994
|
-
/**
|
|
995
|
-
* Log auto-update events
|
|
996
|
-
*/
|
|
997
|
-
logUpdateEvent(
|
|
998
|
-
event: 'checkStart' | 'available' | 'downloadStart' | 'downloadProgress' | 'downloadComplete' |
|
|
999
|
-
'installing' | 'installed' | 'error',
|
|
1000
|
-
context?: Record<string, unknown>
|
|
1001
|
-
): void {
|
|
1002
|
-
this.log({
|
|
1003
|
-
timestamp: new Date().toISOString(),
|
|
1004
|
-
type: 'update_event',
|
|
1005
|
-
content: `Update: ${event}`,
|
|
1006
|
-
metadata: {
|
|
1007
|
-
event,
|
|
1008
|
-
...context,
|
|
1009
|
-
},
|
|
1010
|
-
});
|
|
1011
|
-
}
|
|
1012
|
-
|
|
1013
|
-
/**
|
|
1014
|
-
* Log session events
|
|
1015
|
-
*/
|
|
1016
|
-
logSessionEvent(
|
|
1017
|
-
event: 'start' | 'end' | 'milestone' | 'featureUsage',
|
|
1018
|
-
context?: Record<string, unknown>
|
|
1019
|
-
): void {
|
|
1020
|
-
this.log({
|
|
1021
|
-
timestamp: new Date().toISOString(),
|
|
1022
|
-
type: 'session_event',
|
|
1023
|
-
content: `Session: ${event}`,
|
|
1024
|
-
metadata: {
|
|
1025
|
-
event,
|
|
1026
|
-
...context,
|
|
1027
|
-
},
|
|
1028
|
-
});
|
|
1029
|
-
}
|
|
1030
|
-
|
|
1031
|
-
/**
|
|
1032
|
-
* Log HTTP stream events
|
|
1033
|
-
*/
|
|
1034
|
-
logHTTPEvent(
|
|
1035
|
-
event: 'streamStart' | 'streamChunk' | 'streamEnd' | 'error',
|
|
1036
|
-
context?: Record<string, unknown>
|
|
1037
|
-
): void {
|
|
1038
|
-
this.log({
|
|
1039
|
-
timestamp: new Date().toISOString(),
|
|
1040
|
-
type: 'http_event',
|
|
1041
|
-
content: `HTTP: ${event}`,
|
|
1042
|
-
metadata: {
|
|
1043
|
-
event,
|
|
1044
|
-
...context,
|
|
1045
|
-
},
|
|
1046
|
-
});
|
|
1047
|
-
}
|
|
1048
|
-
|
|
1049
|
-
/**
|
|
1050
|
-
* Log error boundary/unhandled errors
|
|
1051
|
-
*/
|
|
1052
|
-
logErrorEvent(
|
|
1053
|
-
event: 'errorBoundary' | 'unhandledRejection' | 'globalError',
|
|
1054
|
-
context?: Record<string, unknown>
|
|
1055
|
-
): void {
|
|
1056
|
-
this.log({
|
|
1057
|
-
timestamp: new Date().toISOString(),
|
|
1058
|
-
type: 'error',
|
|
1059
|
-
content: `Error: ${event}`,
|
|
1060
|
-
metadata: {
|
|
1061
|
-
event,
|
|
1062
|
-
...context,
|
|
1063
|
-
},
|
|
1064
|
-
});
|
|
1065
|
-
}
|
|
1066
|
-
|
|
1067
|
-
/**
|
|
1068
|
-
* Get the log directory path (for server log files)
|
|
1069
|
-
*/
|
|
1070
|
-
getLogDirectory(): string {
|
|
1071
|
-
return dirname(this.filePath);
|
|
1072
|
-
}
|
|
1073
|
-
|
|
1074
|
-
/**
|
|
1075
|
-
* Get the log file path
|
|
1076
|
-
*/
|
|
1077
|
-
getLogFilePath(): string {
|
|
1078
|
-
return this.filePath;
|
|
1079
|
-
}
|
|
1080
|
-
|
|
1081
|
-
/**
|
|
1082
|
-
* Close the JSON stream logger
|
|
1083
|
-
*/
|
|
1084
|
-
async close(): Promise<void> {
|
|
1085
|
-
// Already closed, skip
|
|
1086
|
-
if (!this.isEnabled || !this.writeStream) {
|
|
1087
|
-
return;
|
|
1088
|
-
}
|
|
1089
|
-
|
|
1090
|
-
// Mark as disabled immediately to prevent duplicate close attempts
|
|
1091
|
-
this.isEnabled = false;
|
|
1092
|
-
|
|
1093
|
-
// Clear flush interval
|
|
1094
|
-
if (this.flushInterval) {
|
|
1095
|
-
clearInterval(this.flushInterval);
|
|
1096
|
-
this.flushInterval = null;
|
|
1097
|
-
}
|
|
1098
|
-
|
|
1099
|
-
// Wait for all pending category stream initializations to complete
|
|
1100
|
-
if (this.pendingStreamInits.size > 0) {
|
|
1101
|
-
await Promise.all(this.pendingStreamInits);
|
|
1102
|
-
}
|
|
1103
|
-
|
|
1104
|
-
// Flush any remaining buffers
|
|
1105
|
-
this.flush();
|
|
1106
|
-
|
|
1107
|
-
// Only flush errors if error stream was initialized
|
|
1108
|
-
if (this.errorStreamInitialized) {
|
|
1109
|
-
this.flushErrors();
|
|
1110
|
-
}
|
|
1111
|
-
|
|
1112
|
-
// Flush category buffers
|
|
1113
|
-
this.flushCategories();
|
|
1114
|
-
|
|
1115
|
-
// Close all streams
|
|
1116
|
-
const promises: Promise<void>[] = [];
|
|
1117
|
-
|
|
1118
|
-
// Close main stream if not already destroyed
|
|
1119
|
-
if (!this.writeStream.destroyed) {
|
|
1120
|
-
// Write closing bracket for JSON array
|
|
1121
|
-
if (this.writeStream.writable) {
|
|
1122
|
-
this.writeStream.write('\n]\n');
|
|
1123
|
-
}
|
|
1124
|
-
|
|
1125
|
-
promises.push(new Promise<void>((resolve, reject) => {
|
|
1126
|
-
this.writeStream!.end((error?: Error) => {
|
|
1127
|
-
if (error) {
|
|
1128
|
-
console.error(chalk.red('Failed to close JSON stream:'), error);
|
|
1129
|
-
reject(error);
|
|
1130
|
-
} else {
|
|
1131
|
-
if (this.verbose) {
|
|
1132
|
-
console.log(chalk.dim(`✅ Log saved: ${this.filePath}`));
|
|
1133
|
-
}
|
|
1134
|
-
resolve();
|
|
1135
|
-
}
|
|
1136
|
-
});
|
|
1137
|
-
}));
|
|
1138
|
-
} else if (this.verbose) {
|
|
1139
|
-
console.log(chalk.dim(`⚠️ Log stream already closed: ${this.filePath}`));
|
|
1140
|
-
}
|
|
1141
|
-
|
|
1142
|
-
// Only close error stream if it was initialized and not destroyed
|
|
1143
|
-
if (this.errorStreamInitialized && this.errorWriteStream && !this.errorWriteStream.destroyed) {
|
|
1144
|
-
if (this.errorWriteStream.writable) {
|
|
1145
|
-
this.errorWriteStream.write('\n]\n');
|
|
1146
|
-
}
|
|
1147
|
-
|
|
1148
|
-
promises.push(new Promise<void>((resolve, reject) => {
|
|
1149
|
-
this.errorWriteStream!.end((error?: Error) => {
|
|
1150
|
-
if (error) {
|
|
1151
|
-
console.error(chalk.red('Failed to close error JSON stream:'), error);
|
|
1152
|
-
reject(error);
|
|
1153
|
-
} else {
|
|
1154
|
-
console.log(chalk.dim(`✅ Error log saved: ${this.errorFilePath}`));
|
|
1155
|
-
resolve();
|
|
1156
|
-
}
|
|
1157
|
-
});
|
|
1158
|
-
}));
|
|
1159
|
-
}
|
|
1160
|
-
|
|
1161
|
-
// Close category streams
|
|
1162
|
-
for (const [category, streamInfo] of this.categoryStreams) {
|
|
1163
|
-
if (streamInfo.stream && !streamInfo.stream.destroyed) {
|
|
1164
|
-
if (streamInfo.stream.writable) {
|
|
1165
|
-
streamInfo.stream.write('\n]\n');
|
|
1166
|
-
}
|
|
1167
|
-
|
|
1168
|
-
promises.push(new Promise<void>((resolve, reject) => {
|
|
1169
|
-
streamInfo.stream.end((error?: Error) => {
|
|
1170
|
-
if (error) {
|
|
1171
|
-
console.error(chalk.red(`Failed to close category stream (${category}):`), error);
|
|
1172
|
-
reject(error);
|
|
1173
|
-
} else {
|
|
1174
|
-
if (this.verbose) {
|
|
1175
|
-
console.log(chalk.dim(`✅ Category log saved: ${streamInfo.filePath}`));
|
|
1176
|
-
}
|
|
1177
|
-
resolve();
|
|
1178
|
-
}
|
|
1179
|
-
});
|
|
1180
|
-
}));
|
|
1181
|
-
}
|
|
1182
|
-
}
|
|
1183
|
-
|
|
1184
|
-
await Promise.all(promises);
|
|
1185
|
-
|
|
1186
|
-
// Clear references
|
|
1187
|
-
this.writeStream = null;
|
|
1188
|
-
this.errorWriteStream = null;
|
|
1189
|
-
this.categoryStreams.clear();
|
|
1190
|
-
}
|
|
1191
|
-
|
|
1192
|
-
/**
|
|
1193
|
-
* Check if logging is enabled
|
|
1194
|
-
*/
|
|
1195
|
-
isActive(): boolean {
|
|
1196
|
-
return this.isEnabled;
|
|
1197
|
-
}
|
|
1198
|
-
|
|
1199
|
-
/**
|
|
1200
|
-
* Get the log file path
|
|
1201
|
-
*/
|
|
1202
|
-
getFilePath(): string {
|
|
1203
|
-
return this.filePath;
|
|
1204
|
-
}
|
|
1205
|
-
}
|
|
1206
|
-
|
|
1207
|
-
// Global JSON stream logger instance (null if not enabled)
|
|
1208
|
-
let globalJsonStreamLogger: JsonStreamLogger | null = null;
|
|
1209
|
-
|
|
1210
|
-
/**
|
|
1211
|
-
* Initialize global JSON stream logger
|
|
1212
|
-
* Automatically generates log paths based on current working directory and session ID
|
|
1213
|
-
* @param sessionId - Session ID for the log file
|
|
1214
|
-
* @param append - Whether to append to existing file
|
|
1215
|
-
* @param verbose - Whether to show initialization messages
|
|
1216
|
-
*/
|
|
1217
|
-
export async function initializeJsonStreamLogger(sessionId: string, append = false, verbose = false): Promise<JsonStreamLogger> {
|
|
1218
|
-
if (globalJsonStreamLogger) {
|
|
1219
|
-
await globalJsonStreamLogger.close();
|
|
1220
|
-
}
|
|
1221
|
-
|
|
1222
|
-
// Get current working directory and sanitize it for use in path
|
|
1223
|
-
// Replace '/' with '-' and remove leading '-' if present (for absolute paths)
|
|
1224
|
-
const cwd = process.cwd().replace(/\//g, '-').replace(/^-/, '');
|
|
1225
|
-
|
|
1226
|
-
// Create log directory path
|
|
1227
|
-
const projectLogDir = join(PROJECTS_DIR, cwd);
|
|
1228
|
-
|
|
1229
|
-
// Create log file paths
|
|
1230
|
-
const logFile = join(projectLogDir, `${sessionId}_log.json`);
|
|
1231
|
-
const errorLogFile = join(projectLogDir, `${sessionId}_error.json`);
|
|
1232
|
-
|
|
1233
|
-
globalJsonStreamLogger = new JsonStreamLogger(logFile, errorLogFile);
|
|
1234
|
-
await globalJsonStreamLogger.initialize(append, verbose);
|
|
1235
|
-
|
|
1236
|
-
return globalJsonStreamLogger;
|
|
1237
|
-
}
|
|
1238
|
-
|
|
1239
|
-
/**
|
|
1240
|
-
* Get global JSON stream logger instance
|
|
1241
|
-
*/
|
|
1242
|
-
export function getJsonStreamLogger(): JsonStreamLogger | null {
|
|
1243
|
-
return globalJsonStreamLogger;
|
|
1244
|
-
}
|
|
1245
|
-
|
|
1246
|
-
/**
|
|
1247
|
-
* Alias for getJsonStreamLogger (shorter name)
|
|
1248
|
-
*/
|
|
1249
|
-
export const getStreamLogger = getJsonStreamLogger;
|
|
1250
|
-
|
|
1251
|
-
/**
|
|
1252
|
-
* Close global JSON stream logger
|
|
1253
|
-
*/
|
|
1254
|
-
export async function closeJsonStreamLogger(): Promise<void> {
|
|
1255
|
-
if (globalJsonStreamLogger && globalJsonStreamLogger.isActive()) {
|
|
1256
|
-
await globalJsonStreamLogger.close();
|
|
1257
|
-
globalJsonStreamLogger = null;
|
|
1258
|
-
}
|
|
1259
|
-
}
|