cx-viewer 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +221 -0
- package/cli.js +735 -0
- package/concepts/ar/BodyDiffJSON.md +32 -0
- package/concepts/ar/BodyFields.md +42 -0
- package/concepts/ar/CacheRebuild.md +36 -0
- package/concepts/ar/GlobalSettings.md +232 -0
- package/concepts/ar/KVCacheContent.md +49 -0
- package/concepts/ar/MainAgent.md +23 -0
- package/concepts/ar/ProxySwitch.md +50 -0
- package/concepts/ar/QRCode.md +25 -0
- package/concepts/ar/ResponseFields.md +50 -0
- package/concepts/ar/SubAgent-Search.md +20 -0
- package/concepts/ar/Teammate.md +26 -0
- package/concepts/ar/Tool-Agent.md +125 -0
- package/concepts/ar/Tool-AskUserQuestion.md +75 -0
- package/concepts/ar/Tool-Bash.md +167 -0
- package/concepts/ar/Tool-Edit.md +46 -0
- package/concepts/ar/Tool-EnterPlanMode.md +128 -0
- package/concepts/ar/Tool-EnterWorktree.md +56 -0
- package/concepts/ar/Tool-ExitPlanMode.md +62 -0
- package/concepts/ar/Tool-Glob.md +39 -0
- package/concepts/ar/Tool-Grep.md +57 -0
- package/concepts/ar/Tool-NotebookEdit.md +33 -0
- package/concepts/ar/Tool-Read.md +56 -0
- package/concepts/ar/Tool-SendMessage.md +41 -0
- package/concepts/ar/Tool-Skill.md +56 -0
- package/concepts/ar/Tool-Task.md +51 -0
- package/concepts/ar/Tool-TaskCreate.md +78 -0
- package/concepts/ar/Tool-TaskGet.md +56 -0
- package/concepts/ar/Tool-TaskList.md +56 -0
- package/concepts/ar/Tool-TaskOutput.md +40 -0
- package/concepts/ar/Tool-TaskStop.md +32 -0
- package/concepts/ar/Tool-TaskUpdate.md +123 -0
- package/concepts/ar/Tool-TeamCreate.md +38 -0
- package/concepts/ar/Tool-TeamDelete.md +30 -0
- package/concepts/ar/Tool-WebFetch.md +55 -0
- package/concepts/ar/Tool-WebSearch.md +58 -0
- package/concepts/ar/Tool-Write.md +39 -0
- package/concepts/ar/Tool-executeCode.md +41 -0
- package/concepts/ar/Tool-getDiagnostics.md +32 -0
- package/concepts/ar/Tools.md +67 -0
- package/concepts/ar/ToolsFirst.md +77 -0
- package/concepts/ar/TranslateContextPollution.md +46 -0
- package/concepts/ar/UltraPlan.md +55 -0
- package/concepts/da/BodyDiffJSON.md +32 -0
- package/concepts/da/BodyFields.md +42 -0
- package/concepts/da/CacheRebuild.md +36 -0
- package/concepts/da/GlobalSettings.md +232 -0
- package/concepts/da/KVCacheContent.md +49 -0
- package/concepts/da/MainAgent.md +23 -0
- package/concepts/da/ProxySwitch.md +50 -0
- package/concepts/da/QRCode.md +25 -0
- package/concepts/da/ResponseFields.md +50 -0
- package/concepts/da/SubAgent-Search.md +20 -0
- package/concepts/da/Teammate.md +26 -0
- package/concepts/da/Tool-Agent.md +125 -0
- package/concepts/da/Tool-AskUserQuestion.md +75 -0
- package/concepts/da/Tool-Bash.md +167 -0
- package/concepts/da/Tool-Edit.md +46 -0
- package/concepts/da/Tool-EnterPlanMode.md +128 -0
- package/concepts/da/Tool-EnterWorktree.md +56 -0
- package/concepts/da/Tool-ExitPlanMode.md +62 -0
- package/concepts/da/Tool-Glob.md +39 -0
- package/concepts/da/Tool-Grep.md +57 -0
- package/concepts/da/Tool-NotebookEdit.md +33 -0
- package/concepts/da/Tool-Read.md +56 -0
- package/concepts/da/Tool-SendMessage.md +41 -0
- package/concepts/da/Tool-Skill.md +56 -0
- package/concepts/da/Tool-Task.md +51 -0
- package/concepts/da/Tool-TaskCreate.md +78 -0
- package/concepts/da/Tool-TaskGet.md +56 -0
- package/concepts/da/Tool-TaskList.md +56 -0
- package/concepts/da/Tool-TaskOutput.md +40 -0
- package/concepts/da/Tool-TaskStop.md +32 -0
- package/concepts/da/Tool-TaskUpdate.md +123 -0
- package/concepts/da/Tool-TeamCreate.md +38 -0
- package/concepts/da/Tool-TeamDelete.md +30 -0
- package/concepts/da/Tool-WebFetch.md +55 -0
- package/concepts/da/Tool-WebSearch.md +58 -0
- package/concepts/da/Tool-Write.md +39 -0
- package/concepts/da/Tool-executeCode.md +41 -0
- package/concepts/da/Tool-getDiagnostics.md +32 -0
- package/concepts/da/Tools.md +67 -0
- package/concepts/da/ToolsFirst.md +77 -0
- package/concepts/da/TranslateContextPollution.md +46 -0
- package/concepts/da/UltraPlan.md +55 -0
- package/concepts/de/BodyDiffJSON.md +32 -0
- package/concepts/de/BodyFields.md +42 -0
- package/concepts/de/CacheRebuild.md +36 -0
- package/concepts/de/GlobalSettings.md +232 -0
- package/concepts/de/KVCacheContent.md +49 -0
- package/concepts/de/MainAgent.md +23 -0
- package/concepts/de/ProxySwitch.md +50 -0
- package/concepts/de/QRCode.md +25 -0
- package/concepts/de/ResponseFields.md +50 -0
- package/concepts/de/SubAgent-Search.md +20 -0
- package/concepts/de/Teammate.md +26 -0
- package/concepts/de/Tool-Agent.md +125 -0
- package/concepts/de/Tool-AskUserQuestion.md +75 -0
- package/concepts/de/Tool-Bash.md +167 -0
- package/concepts/de/Tool-Edit.md +46 -0
- package/concepts/de/Tool-EnterPlanMode.md +128 -0
- package/concepts/de/Tool-EnterWorktree.md +56 -0
- package/concepts/de/Tool-ExitPlanMode.md +62 -0
- package/concepts/de/Tool-Glob.md +39 -0
- package/concepts/de/Tool-Grep.md +57 -0
- package/concepts/de/Tool-NotebookEdit.md +33 -0
- package/concepts/de/Tool-Read.md +56 -0
- package/concepts/de/Tool-SendMessage.md +41 -0
- package/concepts/de/Tool-Skill.md +56 -0
- package/concepts/de/Tool-Task.md +51 -0
- package/concepts/de/Tool-TaskCreate.md +78 -0
- package/concepts/de/Tool-TaskGet.md +56 -0
- package/concepts/de/Tool-TaskList.md +56 -0
- package/concepts/de/Tool-TaskOutput.md +40 -0
- package/concepts/de/Tool-TaskStop.md +32 -0
- package/concepts/de/Tool-TaskUpdate.md +123 -0
- package/concepts/de/Tool-TeamCreate.md +38 -0
- package/concepts/de/Tool-TeamDelete.md +30 -0
- package/concepts/de/Tool-WebFetch.md +55 -0
- package/concepts/de/Tool-WebSearch.md +58 -0
- package/concepts/de/Tool-Write.md +39 -0
- package/concepts/de/Tool-executeCode.md +41 -0
- package/concepts/de/Tool-getDiagnostics.md +32 -0
- package/concepts/de/Tools.md +67 -0
- package/concepts/de/ToolsFirst.md +77 -0
- package/concepts/de/TranslateContextPollution.md +46 -0
- package/concepts/de/UltraPlan.md +55 -0
- package/concepts/en/BodyDiffJSON.md +32 -0
- package/concepts/en/BodyFields.md +42 -0
- package/concepts/en/CacheRebuild.md +36 -0
- package/concepts/en/GlobalSettings.md +232 -0
- package/concepts/en/KVCacheContent.md +49 -0
- package/concepts/en/MainAgent.md +23 -0
- package/concepts/en/ProxySwitch.md +50 -0
- package/concepts/en/QRCode.md +29 -0
- package/concepts/en/ResponseFields.md +50 -0
- package/concepts/en/SubAgent-Search.md +20 -0
- package/concepts/en/Teammate.md +26 -0
- package/concepts/en/Tool-Agent.md +125 -0
- package/concepts/en/Tool-AskUserQuestion.md +75 -0
- package/concepts/en/Tool-Bash.md +167 -0
- package/concepts/en/Tool-Edit.md +46 -0
- package/concepts/en/Tool-EnterPlanMode.md +128 -0
- package/concepts/en/Tool-EnterWorktree.md +56 -0
- package/concepts/en/Tool-ExitPlanMode.md +62 -0
- package/concepts/en/Tool-Glob.md +39 -0
- package/concepts/en/Tool-Grep.md +57 -0
- package/concepts/en/Tool-NotebookEdit.md +33 -0
- package/concepts/en/Tool-Read.md +56 -0
- package/concepts/en/Tool-SendMessage.md +41 -0
- package/concepts/en/Tool-Skill.md +56 -0
- package/concepts/en/Tool-Task.md +51 -0
- package/concepts/en/Tool-TaskCreate.md +78 -0
- package/concepts/en/Tool-TaskGet.md +56 -0
- package/concepts/en/Tool-TaskList.md +56 -0
- package/concepts/en/Tool-TaskOutput.md +40 -0
- package/concepts/en/Tool-TaskStop.md +32 -0
- package/concepts/en/Tool-TaskUpdate.md +123 -0
- package/concepts/en/Tool-TeamCreate.md +38 -0
- package/concepts/en/Tool-TeamDelete.md +30 -0
- package/concepts/en/Tool-WebFetch.md +55 -0
- package/concepts/en/Tool-WebSearch.md +58 -0
- package/concepts/en/Tool-Write.md +39 -0
- package/concepts/en/Tool-executeCode.md +41 -0
- package/concepts/en/Tool-getDiagnostics.md +32 -0
- package/concepts/en/Tools.md +67 -0
- package/concepts/en/ToolsFirst.md +77 -0
- package/concepts/en/TranslateContextPollution.md +46 -0
- package/concepts/en/UltraPlan.md +55 -0
- package/concepts/es/BodyDiffJSON.md +32 -0
- package/concepts/es/BodyFields.md +42 -0
- package/concepts/es/CacheRebuild.md +36 -0
- package/concepts/es/GlobalSettings.md +232 -0
- package/concepts/es/KVCacheContent.md +49 -0
- package/concepts/es/MainAgent.md +23 -0
- package/concepts/es/ProxySwitch.md +50 -0
- package/concepts/es/QRCode.md +25 -0
- package/concepts/es/ResponseFields.md +50 -0
- package/concepts/es/SubAgent-Search.md +20 -0
- package/concepts/es/Teammate.md +26 -0
- package/concepts/es/Tool-Agent.md +125 -0
- package/concepts/es/Tool-AskUserQuestion.md +75 -0
- package/concepts/es/Tool-Bash.md +167 -0
- package/concepts/es/Tool-Edit.md +46 -0
- package/concepts/es/Tool-EnterPlanMode.md +128 -0
- package/concepts/es/Tool-EnterWorktree.md +56 -0
- package/concepts/es/Tool-ExitPlanMode.md +62 -0
- package/concepts/es/Tool-Glob.md +39 -0
- package/concepts/es/Tool-Grep.md +57 -0
- package/concepts/es/Tool-NotebookEdit.md +33 -0
- package/concepts/es/Tool-Read.md +56 -0
- package/concepts/es/Tool-SendMessage.md +41 -0
- package/concepts/es/Tool-Skill.md +56 -0
- package/concepts/es/Tool-Task.md +51 -0
- package/concepts/es/Tool-TaskCreate.md +78 -0
- package/concepts/es/Tool-TaskGet.md +56 -0
- package/concepts/es/Tool-TaskList.md +56 -0
- package/concepts/es/Tool-TaskOutput.md +40 -0
- package/concepts/es/Tool-TaskStop.md +32 -0
- package/concepts/es/Tool-TaskUpdate.md +123 -0
- package/concepts/es/Tool-TeamCreate.md +38 -0
- package/concepts/es/Tool-TeamDelete.md +30 -0
- package/concepts/es/Tool-WebFetch.md +55 -0
- package/concepts/es/Tool-WebSearch.md +58 -0
- package/concepts/es/Tool-Write.md +39 -0
- package/concepts/es/Tool-executeCode.md +41 -0
- package/concepts/es/Tool-getDiagnostics.md +32 -0
- package/concepts/es/Tools.md +67 -0
- package/concepts/es/ToolsFirst.md +77 -0
- package/concepts/es/TranslateContextPollution.md +46 -0
- package/concepts/es/UltraPlan.md +55 -0
- package/concepts/fr/BodyDiffJSON.md +32 -0
- package/concepts/fr/BodyFields.md +42 -0
- package/concepts/fr/CacheRebuild.md +36 -0
- package/concepts/fr/GlobalSettings.md +232 -0
- package/concepts/fr/KVCacheContent.md +49 -0
- package/concepts/fr/MainAgent.md +23 -0
- package/concepts/fr/ProxySwitch.md +50 -0
- package/concepts/fr/QRCode.md +25 -0
- package/concepts/fr/ResponseFields.md +50 -0
- package/concepts/fr/SubAgent-Search.md +20 -0
- package/concepts/fr/Teammate.md +26 -0
- package/concepts/fr/Tool-Agent.md +125 -0
- package/concepts/fr/Tool-AskUserQuestion.md +75 -0
- package/concepts/fr/Tool-Bash.md +167 -0
- package/concepts/fr/Tool-Edit.md +46 -0
- package/concepts/fr/Tool-EnterPlanMode.md +128 -0
- package/concepts/fr/Tool-EnterWorktree.md +56 -0
- package/concepts/fr/Tool-ExitPlanMode.md +62 -0
- package/concepts/fr/Tool-Glob.md +39 -0
- package/concepts/fr/Tool-Grep.md +57 -0
- package/concepts/fr/Tool-NotebookEdit.md +33 -0
- package/concepts/fr/Tool-Read.md +56 -0
- package/concepts/fr/Tool-SendMessage.md +41 -0
- package/concepts/fr/Tool-Skill.md +56 -0
- package/concepts/fr/Tool-Task.md +51 -0
- package/concepts/fr/Tool-TaskCreate.md +78 -0
- package/concepts/fr/Tool-TaskGet.md +56 -0
- package/concepts/fr/Tool-TaskList.md +56 -0
- package/concepts/fr/Tool-TaskOutput.md +40 -0
- package/concepts/fr/Tool-TaskStop.md +32 -0
- package/concepts/fr/Tool-TaskUpdate.md +123 -0
- package/concepts/fr/Tool-TeamCreate.md +38 -0
- package/concepts/fr/Tool-TeamDelete.md +30 -0
- package/concepts/fr/Tool-WebFetch.md +55 -0
- package/concepts/fr/Tool-WebSearch.md +58 -0
- package/concepts/fr/Tool-Write.md +39 -0
- package/concepts/fr/Tool-executeCode.md +41 -0
- package/concepts/fr/Tool-getDiagnostics.md +32 -0
- package/concepts/fr/Tools.md +67 -0
- package/concepts/fr/ToolsFirst.md +77 -0
- package/concepts/fr/TranslateContextPollution.md +46 -0
- package/concepts/fr/UltraPlan.md +55 -0
- package/concepts/it/BodyDiffJSON.md +32 -0
- package/concepts/it/BodyFields.md +42 -0
- package/concepts/it/CacheRebuild.md +36 -0
- package/concepts/it/GlobalSettings.md +232 -0
- package/concepts/it/KVCacheContent.md +49 -0
- package/concepts/it/MainAgent.md +23 -0
- package/concepts/it/ProxySwitch.md +50 -0
- package/concepts/it/QRCode.md +25 -0
- package/concepts/it/ResponseFields.md +50 -0
- package/concepts/it/SubAgent-Search.md +20 -0
- package/concepts/it/Teammate.md +26 -0
- package/concepts/it/Tool-Agent.md +125 -0
- package/concepts/it/Tool-AskUserQuestion.md +75 -0
- package/concepts/it/Tool-Bash.md +167 -0
- package/concepts/it/Tool-Edit.md +46 -0
- package/concepts/it/Tool-EnterPlanMode.md +128 -0
- package/concepts/it/Tool-EnterWorktree.md +56 -0
- package/concepts/it/Tool-ExitPlanMode.md +62 -0
- package/concepts/it/Tool-Glob.md +39 -0
- package/concepts/it/Tool-Grep.md +57 -0
- package/concepts/it/Tool-NotebookEdit.md +33 -0
- package/concepts/it/Tool-Read.md +56 -0
- package/concepts/it/Tool-SendMessage.md +41 -0
- package/concepts/it/Tool-Skill.md +56 -0
- package/concepts/it/Tool-Task.md +51 -0
- package/concepts/it/Tool-TaskCreate.md +78 -0
- package/concepts/it/Tool-TaskGet.md +56 -0
- package/concepts/it/Tool-TaskList.md +56 -0
- package/concepts/it/Tool-TaskOutput.md +40 -0
- package/concepts/it/Tool-TaskStop.md +32 -0
- package/concepts/it/Tool-TaskUpdate.md +123 -0
- package/concepts/it/Tool-TeamCreate.md +38 -0
- package/concepts/it/Tool-TeamDelete.md +30 -0
- package/concepts/it/Tool-WebFetch.md +55 -0
- package/concepts/it/Tool-WebSearch.md +58 -0
- package/concepts/it/Tool-Write.md +39 -0
- package/concepts/it/Tool-executeCode.md +41 -0
- package/concepts/it/Tool-getDiagnostics.md +32 -0
- package/concepts/it/Tools.md +67 -0
- package/concepts/it/ToolsFirst.md +77 -0
- package/concepts/it/TranslateContextPollution.md +46 -0
- package/concepts/it/UltraPlan.md +55 -0
- package/concepts/ja/BodyDiffJSON.md +32 -0
- package/concepts/ja/BodyFields.md +42 -0
- package/concepts/ja/CacheRebuild.md +36 -0
- package/concepts/ja/GlobalSettings.md +232 -0
- package/concepts/ja/KVCacheContent.md +49 -0
- package/concepts/ja/MainAgent.md +23 -0
- package/concepts/ja/ProxySwitch.md +50 -0
- package/concepts/ja/QRCode.md +25 -0
- package/concepts/ja/ResponseFields.md +50 -0
- package/concepts/ja/SubAgent-Search.md +20 -0
- package/concepts/ja/Teammate.md +26 -0
- package/concepts/ja/Tool-Agent.md +125 -0
- package/concepts/ja/Tool-AskUserQuestion.md +75 -0
- package/concepts/ja/Tool-Bash.md +167 -0
- package/concepts/ja/Tool-Edit.md +46 -0
- package/concepts/ja/Tool-EnterPlanMode.md +128 -0
- package/concepts/ja/Tool-EnterWorktree.md +56 -0
- package/concepts/ja/Tool-ExitPlanMode.md +62 -0
- package/concepts/ja/Tool-Glob.md +39 -0
- package/concepts/ja/Tool-Grep.md +57 -0
- package/concepts/ja/Tool-NotebookEdit.md +33 -0
- package/concepts/ja/Tool-Read.md +56 -0
- package/concepts/ja/Tool-SendMessage.md +41 -0
- package/concepts/ja/Tool-Skill.md +56 -0
- package/concepts/ja/Tool-Task.md +51 -0
- package/concepts/ja/Tool-TaskCreate.md +78 -0
- package/concepts/ja/Tool-TaskGet.md +56 -0
- package/concepts/ja/Tool-TaskList.md +56 -0
- package/concepts/ja/Tool-TaskOutput.md +40 -0
- package/concepts/ja/Tool-TaskStop.md +32 -0
- package/concepts/ja/Tool-TaskUpdate.md +123 -0
- package/concepts/ja/Tool-TeamCreate.md +38 -0
- package/concepts/ja/Tool-TeamDelete.md +30 -0
- package/concepts/ja/Tool-WebFetch.md +55 -0
- package/concepts/ja/Tool-WebSearch.md +58 -0
- package/concepts/ja/Tool-Write.md +39 -0
- package/concepts/ja/Tool-executeCode.md +41 -0
- package/concepts/ja/Tool-getDiagnostics.md +32 -0
- package/concepts/ja/Tools.md +67 -0
- package/concepts/ja/ToolsFirst.md +77 -0
- package/concepts/ja/TranslateContextPollution.md +46 -0
- package/concepts/ja/UltraPlan.md +55 -0
- package/concepts/ko/BodyDiffJSON.md +32 -0
- package/concepts/ko/BodyFields.md +42 -0
- package/concepts/ko/CacheRebuild.md +36 -0
- package/concepts/ko/GlobalSettings.md +232 -0
- package/concepts/ko/KVCacheContent.md +49 -0
- package/concepts/ko/MainAgent.md +23 -0
- package/concepts/ko/ProxySwitch.md +50 -0
- package/concepts/ko/QRCode.md +25 -0
- package/concepts/ko/ResponseFields.md +50 -0
- package/concepts/ko/SubAgent-Search.md +20 -0
- package/concepts/ko/Teammate.md +26 -0
- package/concepts/ko/Tool-Agent.md +125 -0
- package/concepts/ko/Tool-AskUserQuestion.md +75 -0
- package/concepts/ko/Tool-Bash.md +167 -0
- package/concepts/ko/Tool-Edit.md +46 -0
- package/concepts/ko/Tool-EnterPlanMode.md +128 -0
- package/concepts/ko/Tool-EnterWorktree.md +56 -0
- package/concepts/ko/Tool-ExitPlanMode.md +62 -0
- package/concepts/ko/Tool-Glob.md +39 -0
- package/concepts/ko/Tool-Grep.md +57 -0
- package/concepts/ko/Tool-NotebookEdit.md +33 -0
- package/concepts/ko/Tool-Read.md +56 -0
- package/concepts/ko/Tool-SendMessage.md +41 -0
- package/concepts/ko/Tool-Skill.md +56 -0
- package/concepts/ko/Tool-Task.md +51 -0
- package/concepts/ko/Tool-TaskCreate.md +78 -0
- package/concepts/ko/Tool-TaskGet.md +56 -0
- package/concepts/ko/Tool-TaskList.md +56 -0
- package/concepts/ko/Tool-TaskOutput.md +40 -0
- package/concepts/ko/Tool-TaskStop.md +32 -0
- package/concepts/ko/Tool-TaskUpdate.md +123 -0
- package/concepts/ko/Tool-TeamCreate.md +38 -0
- package/concepts/ko/Tool-TeamDelete.md +30 -0
- package/concepts/ko/Tool-WebFetch.md +55 -0
- package/concepts/ko/Tool-WebSearch.md +58 -0
- package/concepts/ko/Tool-Write.md +39 -0
- package/concepts/ko/Tool-executeCode.md +41 -0
- package/concepts/ko/Tool-getDiagnostics.md +32 -0
- package/concepts/ko/Tools.md +67 -0
- package/concepts/ko/ToolsFirst.md +77 -0
- package/concepts/ko/TranslateContextPollution.md +46 -0
- package/concepts/ko/UltraPlan.md +55 -0
- package/concepts/no/BodyDiffJSON.md +32 -0
- package/concepts/no/BodyFields.md +42 -0
- package/concepts/no/CacheRebuild.md +36 -0
- package/concepts/no/GlobalSettings.md +232 -0
- package/concepts/no/KVCacheContent.md +49 -0
- package/concepts/no/MainAgent.md +23 -0
- package/concepts/no/ProxySwitch.md +50 -0
- package/concepts/no/QRCode.md +25 -0
- package/concepts/no/ResponseFields.md +50 -0
- package/concepts/no/SubAgent-Search.md +20 -0
- package/concepts/no/Teammate.md +26 -0
- package/concepts/no/Tool-Agent.md +125 -0
- package/concepts/no/Tool-AskUserQuestion.md +75 -0
- package/concepts/no/Tool-Bash.md +167 -0
- package/concepts/no/Tool-Edit.md +46 -0
- package/concepts/no/Tool-EnterPlanMode.md +128 -0
- package/concepts/no/Tool-EnterWorktree.md +56 -0
- package/concepts/no/Tool-ExitPlanMode.md +62 -0
- package/concepts/no/Tool-Glob.md +39 -0
- package/concepts/no/Tool-Grep.md +57 -0
- package/concepts/no/Tool-NotebookEdit.md +33 -0
- package/concepts/no/Tool-Read.md +56 -0
- package/concepts/no/Tool-SendMessage.md +41 -0
- package/concepts/no/Tool-Skill.md +56 -0
- package/concepts/no/Tool-Task.md +51 -0
- package/concepts/no/Tool-TaskCreate.md +78 -0
- package/concepts/no/Tool-TaskGet.md +56 -0
- package/concepts/no/Tool-TaskList.md +56 -0
- package/concepts/no/Tool-TaskOutput.md +40 -0
- package/concepts/no/Tool-TaskStop.md +32 -0
- package/concepts/no/Tool-TaskUpdate.md +123 -0
- package/concepts/no/Tool-TeamCreate.md +38 -0
- package/concepts/no/Tool-TeamDelete.md +30 -0
- package/concepts/no/Tool-WebFetch.md +55 -0
- package/concepts/no/Tool-WebSearch.md +58 -0
- package/concepts/no/Tool-Write.md +39 -0
- package/concepts/no/Tool-executeCode.md +41 -0
- package/concepts/no/Tool-getDiagnostics.md +32 -0
- package/concepts/no/Tools.md +67 -0
- package/concepts/no/ToolsFirst.md +77 -0
- package/concepts/no/TranslateContextPollution.md +46 -0
- package/concepts/no/UltraPlan.md +55 -0
- package/concepts/pl/BodyDiffJSON.md +32 -0
- package/concepts/pl/BodyFields.md +42 -0
- package/concepts/pl/CacheRebuild.md +36 -0
- package/concepts/pl/GlobalSettings.md +232 -0
- package/concepts/pl/KVCacheContent.md +49 -0
- package/concepts/pl/MainAgent.md +23 -0
- package/concepts/pl/ProxySwitch.md +50 -0
- package/concepts/pl/QRCode.md +25 -0
- package/concepts/pl/ResponseFields.md +50 -0
- package/concepts/pl/SubAgent-Search.md +20 -0
- package/concepts/pl/Teammate.md +26 -0
- package/concepts/pl/Tool-Agent.md +125 -0
- package/concepts/pl/Tool-AskUserQuestion.md +75 -0
- package/concepts/pl/Tool-Bash.md +167 -0
- package/concepts/pl/Tool-Edit.md +46 -0
- package/concepts/pl/Tool-EnterPlanMode.md +128 -0
- package/concepts/pl/Tool-EnterWorktree.md +56 -0
- package/concepts/pl/Tool-ExitPlanMode.md +62 -0
- package/concepts/pl/Tool-Glob.md +39 -0
- package/concepts/pl/Tool-Grep.md +57 -0
- package/concepts/pl/Tool-NotebookEdit.md +33 -0
- package/concepts/pl/Tool-Read.md +56 -0
- package/concepts/pl/Tool-SendMessage.md +41 -0
- package/concepts/pl/Tool-Skill.md +56 -0
- package/concepts/pl/Tool-Task.md +51 -0
- package/concepts/pl/Tool-TaskCreate.md +78 -0
- package/concepts/pl/Tool-TaskGet.md +56 -0
- package/concepts/pl/Tool-TaskList.md +56 -0
- package/concepts/pl/Tool-TaskOutput.md +40 -0
- package/concepts/pl/Tool-TaskStop.md +32 -0
- package/concepts/pl/Tool-TaskUpdate.md +123 -0
- package/concepts/pl/Tool-TeamCreate.md +38 -0
- package/concepts/pl/Tool-TeamDelete.md +30 -0
- package/concepts/pl/Tool-WebFetch.md +55 -0
- package/concepts/pl/Tool-WebSearch.md +58 -0
- package/concepts/pl/Tool-Write.md +39 -0
- package/concepts/pl/Tool-executeCode.md +41 -0
- package/concepts/pl/Tool-getDiagnostics.md +32 -0
- package/concepts/pl/Tools.md +67 -0
- package/concepts/pl/ToolsFirst.md +77 -0
- package/concepts/pl/TranslateContextPollution.md +46 -0
- package/concepts/pl/UltraPlan.md +55 -0
- package/concepts/pt-BR/BodyDiffJSON.md +32 -0
- package/concepts/pt-BR/BodyFields.md +42 -0
- package/concepts/pt-BR/CacheRebuild.md +36 -0
- package/concepts/pt-BR/GlobalSettings.md +232 -0
- package/concepts/pt-BR/KVCacheContent.md +49 -0
- package/concepts/pt-BR/MainAgent.md +23 -0
- package/concepts/pt-BR/ProxySwitch.md +50 -0
- package/concepts/pt-BR/QRCode.md +25 -0
- package/concepts/pt-BR/ResponseFields.md +50 -0
- package/concepts/pt-BR/SubAgent-Search.md +20 -0
- package/concepts/pt-BR/Teammate.md +26 -0
- package/concepts/pt-BR/Tool-Agent.md +125 -0
- package/concepts/pt-BR/Tool-AskUserQuestion.md +75 -0
- package/concepts/pt-BR/Tool-Bash.md +167 -0
- package/concepts/pt-BR/Tool-Edit.md +46 -0
- package/concepts/pt-BR/Tool-EnterPlanMode.md +128 -0
- package/concepts/pt-BR/Tool-EnterWorktree.md +56 -0
- package/concepts/pt-BR/Tool-ExitPlanMode.md +62 -0
- package/concepts/pt-BR/Tool-Glob.md +39 -0
- package/concepts/pt-BR/Tool-Grep.md +57 -0
- package/concepts/pt-BR/Tool-NotebookEdit.md +33 -0
- package/concepts/pt-BR/Tool-Read.md +56 -0
- package/concepts/pt-BR/Tool-SendMessage.md +41 -0
- package/concepts/pt-BR/Tool-Skill.md +56 -0
- package/concepts/pt-BR/Tool-Task.md +51 -0
- package/concepts/pt-BR/Tool-TaskCreate.md +78 -0
- package/concepts/pt-BR/Tool-TaskGet.md +56 -0
- package/concepts/pt-BR/Tool-TaskList.md +56 -0
- package/concepts/pt-BR/Tool-TaskOutput.md +40 -0
- package/concepts/pt-BR/Tool-TaskStop.md +32 -0
- package/concepts/pt-BR/Tool-TaskUpdate.md +123 -0
- package/concepts/pt-BR/Tool-TeamCreate.md +38 -0
- package/concepts/pt-BR/Tool-TeamDelete.md +30 -0
- package/concepts/pt-BR/Tool-WebFetch.md +55 -0
- package/concepts/pt-BR/Tool-WebSearch.md +58 -0
- package/concepts/pt-BR/Tool-Write.md +39 -0
- package/concepts/pt-BR/Tool-executeCode.md +41 -0
- package/concepts/pt-BR/Tool-getDiagnostics.md +32 -0
- package/concepts/pt-BR/Tools.md +67 -0
- package/concepts/pt-BR/ToolsFirst.md +77 -0
- package/concepts/pt-BR/TranslateContextPollution.md +46 -0
- package/concepts/pt-BR/UltraPlan.md +55 -0
- package/concepts/ru/BodyDiffJSON.md +32 -0
- package/concepts/ru/BodyFields.md +42 -0
- package/concepts/ru/CacheRebuild.md +36 -0
- package/concepts/ru/GlobalSettings.md +232 -0
- package/concepts/ru/KVCacheContent.md +49 -0
- package/concepts/ru/MainAgent.md +23 -0
- package/concepts/ru/ProxySwitch.md +50 -0
- package/concepts/ru/QRCode.md +25 -0
- package/concepts/ru/ResponseFields.md +50 -0
- package/concepts/ru/SubAgent-Search.md +20 -0
- package/concepts/ru/Teammate.md +26 -0
- package/concepts/ru/Tool-Agent.md +125 -0
- package/concepts/ru/Tool-AskUserQuestion.md +75 -0
- package/concepts/ru/Tool-Bash.md +167 -0
- package/concepts/ru/Tool-Edit.md +46 -0
- package/concepts/ru/Tool-EnterPlanMode.md +128 -0
- package/concepts/ru/Tool-EnterWorktree.md +56 -0
- package/concepts/ru/Tool-ExitPlanMode.md +62 -0
- package/concepts/ru/Tool-Glob.md +39 -0
- package/concepts/ru/Tool-Grep.md +57 -0
- package/concepts/ru/Tool-NotebookEdit.md +33 -0
- package/concepts/ru/Tool-Read.md +56 -0
- package/concepts/ru/Tool-SendMessage.md +41 -0
- package/concepts/ru/Tool-Skill.md +56 -0
- package/concepts/ru/Tool-Task.md +51 -0
- package/concepts/ru/Tool-TaskCreate.md +78 -0
- package/concepts/ru/Tool-TaskGet.md +56 -0
- package/concepts/ru/Tool-TaskList.md +56 -0
- package/concepts/ru/Tool-TaskOutput.md +40 -0
- package/concepts/ru/Tool-TaskStop.md +32 -0
- package/concepts/ru/Tool-TaskUpdate.md +123 -0
- package/concepts/ru/Tool-TeamCreate.md +38 -0
- package/concepts/ru/Tool-TeamDelete.md +30 -0
- package/concepts/ru/Tool-WebFetch.md +55 -0
- package/concepts/ru/Tool-WebSearch.md +58 -0
- package/concepts/ru/Tool-Write.md +39 -0
- package/concepts/ru/Tool-executeCode.md +41 -0
- package/concepts/ru/Tool-getDiagnostics.md +32 -0
- package/concepts/ru/Tools.md +67 -0
- package/concepts/ru/ToolsFirst.md +77 -0
- package/concepts/ru/TranslateContextPollution.md +46 -0
- package/concepts/ru/UltraPlan.md +55 -0
- package/concepts/th/BodyDiffJSON.md +32 -0
- package/concepts/th/BodyFields.md +42 -0
- package/concepts/th/CacheRebuild.md +36 -0
- package/concepts/th/GlobalSettings.md +232 -0
- package/concepts/th/KVCacheContent.md +49 -0
- package/concepts/th/MainAgent.md +23 -0
- package/concepts/th/ProxySwitch.md +50 -0
- package/concepts/th/QRCode.md +25 -0
- package/concepts/th/ResponseFields.md +50 -0
- package/concepts/th/SubAgent-Search.md +20 -0
- package/concepts/th/Teammate.md +26 -0
- package/concepts/th/Tool-Agent.md +125 -0
- package/concepts/th/Tool-AskUserQuestion.md +75 -0
- package/concepts/th/Tool-Bash.md +167 -0
- package/concepts/th/Tool-Edit.md +46 -0
- package/concepts/th/Tool-EnterPlanMode.md +128 -0
- package/concepts/th/Tool-EnterWorktree.md +56 -0
- package/concepts/th/Tool-ExitPlanMode.md +62 -0
- package/concepts/th/Tool-Glob.md +39 -0
- package/concepts/th/Tool-Grep.md +57 -0
- package/concepts/th/Tool-NotebookEdit.md +33 -0
- package/concepts/th/Tool-Read.md +56 -0
- package/concepts/th/Tool-SendMessage.md +41 -0
- package/concepts/th/Tool-Skill.md +56 -0
- package/concepts/th/Tool-Task.md +51 -0
- package/concepts/th/Tool-TaskCreate.md +78 -0
- package/concepts/th/Tool-TaskGet.md +56 -0
- package/concepts/th/Tool-TaskList.md +56 -0
- package/concepts/th/Tool-TaskOutput.md +40 -0
- package/concepts/th/Tool-TaskStop.md +32 -0
- package/concepts/th/Tool-TaskUpdate.md +123 -0
- package/concepts/th/Tool-TeamCreate.md +38 -0
- package/concepts/th/Tool-TeamDelete.md +30 -0
- package/concepts/th/Tool-WebFetch.md +55 -0
- package/concepts/th/Tool-WebSearch.md +58 -0
- package/concepts/th/Tool-Write.md +39 -0
- package/concepts/th/Tool-executeCode.md +41 -0
- package/concepts/th/Tool-getDiagnostics.md +32 -0
- package/concepts/th/Tools.md +67 -0
- package/concepts/th/ToolsFirst.md +77 -0
- package/concepts/th/TranslateContextPollution.md +46 -0
- package/concepts/th/UltraPlan.md +55 -0
- package/concepts/tr/BodyDiffJSON.md +32 -0
- package/concepts/tr/BodyFields.md +42 -0
- package/concepts/tr/CacheRebuild.md +36 -0
- package/concepts/tr/GlobalSettings.md +232 -0
- package/concepts/tr/KVCacheContent.md +49 -0
- package/concepts/tr/MainAgent.md +23 -0
- package/concepts/tr/ProxySwitch.md +50 -0
- package/concepts/tr/QRCode.md +25 -0
- package/concepts/tr/ResponseFields.md +50 -0
- package/concepts/tr/SubAgent-Search.md +20 -0
- package/concepts/tr/Teammate.md +26 -0
- package/concepts/tr/Tool-Agent.md +125 -0
- package/concepts/tr/Tool-AskUserQuestion.md +75 -0
- package/concepts/tr/Tool-Bash.md +167 -0
- package/concepts/tr/Tool-Edit.md +46 -0
- package/concepts/tr/Tool-EnterPlanMode.md +128 -0
- package/concepts/tr/Tool-EnterWorktree.md +56 -0
- package/concepts/tr/Tool-ExitPlanMode.md +62 -0
- package/concepts/tr/Tool-Glob.md +39 -0
- package/concepts/tr/Tool-Grep.md +57 -0
- package/concepts/tr/Tool-NotebookEdit.md +33 -0
- package/concepts/tr/Tool-Read.md +56 -0
- package/concepts/tr/Tool-SendMessage.md +41 -0
- package/concepts/tr/Tool-Skill.md +56 -0
- package/concepts/tr/Tool-Task.md +51 -0
- package/concepts/tr/Tool-TaskCreate.md +78 -0
- package/concepts/tr/Tool-TaskGet.md +56 -0
- package/concepts/tr/Tool-TaskList.md +56 -0
- package/concepts/tr/Tool-TaskOutput.md +40 -0
- package/concepts/tr/Tool-TaskStop.md +32 -0
- package/concepts/tr/Tool-TaskUpdate.md +123 -0
- package/concepts/tr/Tool-TeamCreate.md +38 -0
- package/concepts/tr/Tool-TeamDelete.md +30 -0
- package/concepts/tr/Tool-WebFetch.md +55 -0
- package/concepts/tr/Tool-WebSearch.md +58 -0
- package/concepts/tr/Tool-Write.md +39 -0
- package/concepts/tr/Tool-executeCode.md +41 -0
- package/concepts/tr/Tool-getDiagnostics.md +32 -0
- package/concepts/tr/Tools.md +67 -0
- package/concepts/tr/ToolsFirst.md +77 -0
- package/concepts/tr/TranslateContextPollution.md +46 -0
- package/concepts/tr/UltraPlan.md +55 -0
- package/concepts/uk/BodyDiffJSON.md +32 -0
- package/concepts/uk/BodyFields.md +42 -0
- package/concepts/uk/CacheRebuild.md +36 -0
- package/concepts/uk/GlobalSettings.md +232 -0
- package/concepts/uk/KVCacheContent.md +49 -0
- package/concepts/uk/MainAgent.md +23 -0
- package/concepts/uk/ProxySwitch.md +50 -0
- package/concepts/uk/QRCode.md +25 -0
- package/concepts/uk/ResponseFields.md +50 -0
- package/concepts/uk/SubAgent-Search.md +20 -0
- package/concepts/uk/Teammate.md +26 -0
- package/concepts/uk/Tool-Agent.md +125 -0
- package/concepts/uk/Tool-AskUserQuestion.md +75 -0
- package/concepts/uk/Tool-Bash.md +167 -0
- package/concepts/uk/Tool-Edit.md +46 -0
- package/concepts/uk/Tool-EnterPlanMode.md +128 -0
- package/concepts/uk/Tool-EnterWorktree.md +56 -0
- package/concepts/uk/Tool-ExitPlanMode.md +62 -0
- package/concepts/uk/Tool-Glob.md +39 -0
- package/concepts/uk/Tool-Grep.md +57 -0
- package/concepts/uk/Tool-NotebookEdit.md +33 -0
- package/concepts/uk/Tool-Read.md +56 -0
- package/concepts/uk/Tool-SendMessage.md +41 -0
- package/concepts/uk/Tool-Skill.md +56 -0
- package/concepts/uk/Tool-Task.md +51 -0
- package/concepts/uk/Tool-TaskCreate.md +78 -0
- package/concepts/uk/Tool-TaskGet.md +56 -0
- package/concepts/uk/Tool-TaskList.md +56 -0
- package/concepts/uk/Tool-TaskOutput.md +40 -0
- package/concepts/uk/Tool-TaskStop.md +32 -0
- package/concepts/uk/Tool-TaskUpdate.md +123 -0
- package/concepts/uk/Tool-TeamCreate.md +38 -0
- package/concepts/uk/Tool-TeamDelete.md +30 -0
- package/concepts/uk/Tool-WebFetch.md +55 -0
- package/concepts/uk/Tool-WebSearch.md +58 -0
- package/concepts/uk/Tool-Write.md +39 -0
- package/concepts/uk/Tool-executeCode.md +41 -0
- package/concepts/uk/Tool-getDiagnostics.md +32 -0
- package/concepts/uk/Tools.md +67 -0
- package/concepts/uk/ToolsFirst.md +77 -0
- package/concepts/uk/TranslateContextPollution.md +46 -0
- package/concepts/uk/UltraPlan.md +55 -0
- package/concepts/zh/BodyDiffJSON.md +32 -0
- package/concepts/zh/BodyFields.md +42 -0
- package/concepts/zh/CacheRebuild.md +36 -0
- package/concepts/zh/GlobalSettings.md +232 -0
- package/concepts/zh/KVCacheContent.md +49 -0
- package/concepts/zh/MainAgent.md +23 -0
- package/concepts/zh/ProxySwitch.md +50 -0
- package/concepts/zh/QRCode.md +29 -0
- package/concepts/zh/ResponseFields.md +50 -0
- package/concepts/zh/SubAgent-Search.md +20 -0
- package/concepts/zh/Teammate.md +26 -0
- package/concepts/zh/Tool-Agent.md +125 -0
- package/concepts/zh/Tool-AskUserQuestion.md +75 -0
- package/concepts/zh/Tool-Bash.md +167 -0
- package/concepts/zh/Tool-Edit.md +46 -0
- package/concepts/zh/Tool-EnterPlanMode.md +128 -0
- package/concepts/zh/Tool-EnterWorktree.md +56 -0
- package/concepts/zh/Tool-ExitPlanMode.md +62 -0
- package/concepts/zh/Tool-Glob.md +39 -0
- package/concepts/zh/Tool-Grep.md +57 -0
- package/concepts/zh/Tool-NotebookEdit.md +33 -0
- package/concepts/zh/Tool-Read.md +56 -0
- package/concepts/zh/Tool-SendMessage.md +41 -0
- package/concepts/zh/Tool-Skill.md +56 -0
- package/concepts/zh/Tool-Task.md +51 -0
- package/concepts/zh/Tool-TaskCreate.md +78 -0
- package/concepts/zh/Tool-TaskGet.md +56 -0
- package/concepts/zh/Tool-TaskList.md +56 -0
- package/concepts/zh/Tool-TaskOutput.md +40 -0
- package/concepts/zh/Tool-TaskStop.md +32 -0
- package/concepts/zh/Tool-TaskUpdate.md +123 -0
- package/concepts/zh/Tool-TeamCreate.md +38 -0
- package/concepts/zh/Tool-TeamDelete.md +30 -0
- package/concepts/zh/Tool-WebFetch.md +55 -0
- package/concepts/zh/Tool-WebSearch.md +58 -0
- package/concepts/zh/Tool-Write.md +39 -0
- package/concepts/zh/Tool-executeCode.md +41 -0
- package/concepts/zh/Tool-getDiagnostics.md +32 -0
- package/concepts/zh/Tools.md +67 -0
- package/concepts/zh/ToolsFirst.md +77 -0
- package/concepts/zh/TranslateContextPollution.md +46 -0
- package/concepts/zh/UltraPlan.md +55 -0
- package/concepts/zh-TW/BodyDiffJSON.md +32 -0
- package/concepts/zh-TW/BodyFields.md +42 -0
- package/concepts/zh-TW/CacheRebuild.md +36 -0
- package/concepts/zh-TW/GlobalSettings.md +232 -0
- package/concepts/zh-TW/KVCacheContent.md +49 -0
- package/concepts/zh-TW/MainAgent.md +23 -0
- package/concepts/zh-TW/ProxySwitch.md +50 -0
- package/concepts/zh-TW/QRCode.md +25 -0
- package/concepts/zh-TW/ResponseFields.md +50 -0
- package/concepts/zh-TW/SubAgent-Search.md +20 -0
- package/concepts/zh-TW/Teammate.md +26 -0
- package/concepts/zh-TW/Tool-Agent.md +125 -0
- package/concepts/zh-TW/Tool-AskUserQuestion.md +75 -0
- package/concepts/zh-TW/Tool-Bash.md +167 -0
- package/concepts/zh-TW/Tool-Edit.md +46 -0
- package/concepts/zh-TW/Tool-EnterPlanMode.md +128 -0
- package/concepts/zh-TW/Tool-EnterWorktree.md +56 -0
- package/concepts/zh-TW/Tool-ExitPlanMode.md +62 -0
- package/concepts/zh-TW/Tool-Glob.md +39 -0
- package/concepts/zh-TW/Tool-Grep.md +57 -0
- package/concepts/zh-TW/Tool-NotebookEdit.md +33 -0
- package/concepts/zh-TW/Tool-Read.md +56 -0
- package/concepts/zh-TW/Tool-SendMessage.md +41 -0
- package/concepts/zh-TW/Tool-Skill.md +56 -0
- package/concepts/zh-TW/Tool-Task.md +51 -0
- package/concepts/zh-TW/Tool-TaskCreate.md +78 -0
- package/concepts/zh-TW/Tool-TaskGet.md +56 -0
- package/concepts/zh-TW/Tool-TaskList.md +56 -0
- package/concepts/zh-TW/Tool-TaskOutput.md +40 -0
- package/concepts/zh-TW/Tool-TaskStop.md +32 -0
- package/concepts/zh-TW/Tool-TaskUpdate.md +123 -0
- package/concepts/zh-TW/Tool-TeamCreate.md +38 -0
- package/concepts/zh-TW/Tool-TeamDelete.md +30 -0
- package/concepts/zh-TW/Tool-WebFetch.md +55 -0
- package/concepts/zh-TW/Tool-WebSearch.md +58 -0
- package/concepts/zh-TW/Tool-Write.md +39 -0
- package/concepts/zh-TW/Tool-executeCode.md +41 -0
- package/concepts/zh-TW/Tool-getDiagnostics.md +32 -0
- package/concepts/zh-TW/Tools.md +67 -0
- package/concepts/zh-TW/ToolsFirst.md +77 -0
- package/concepts/zh-TW/TranslateContextPollution.md +46 -0
- package/concepts/zh-TW/UltraPlan.md +55 -0
- package/dist/assets/App-BzrN42Qt.js +41 -0
- package/dist/assets/App-fG2r3jFq.css +1 -0
- package/dist/assets/AppHeader-B3hrnZr-.css +41 -0
- package/dist/assets/AppHeader.module-BMU2vyC4.js +1246 -0
- package/dist/assets/Mobile-BnDkLcBv.css +1 -0
- package/dist/assets/Mobile-C9wxQTXV.js +10 -0
- package/dist/assets/_baseUniq-CXWHShmB.js +1 -0
- package/dist/assets/arc-qbol0NJo.js +1 -0
- package/dist/assets/architectureDiagram-Q4EWVU46-COZebb1N.js +36 -0
- package/dist/assets/blockDiagram-DXYQGD6D-COCgzPKy.js +132 -0
- package/dist/assets/c4Diagram-AHTNJAMY-Bs5XvLEo.js +10 -0
- package/dist/assets/channel-DvLUZ3Xf.js +1 -0
- package/dist/assets/chunk-4BX2VUAB-CyGriz9d.js +1 -0
- package/dist/assets/chunk-4TB4RGXK-DlT_q-fl.js +206 -0
- package/dist/assets/chunk-55IACEB6-NHN99ZNC.js +1 -0
- package/dist/assets/chunk-EDXVE4YY-fK4f9Na9.js +1 -0
- package/dist/assets/chunk-FMBD7UC4-DL-dQIq1.js +15 -0
- package/dist/assets/chunk-OYMX7WX6-6uruB4VY.js +231 -0
- package/dist/assets/chunk-QZHKN3VN-CCWIqLO8.js +1 -0
- package/dist/assets/chunk-YZCP3GAM-Cu84DMJo.js +1 -0
- package/dist/assets/classDiagram-6PBFFD2Q-ByKhp2Tk.js +1 -0
- package/dist/assets/classDiagram-v2-HSJHXN6E-ByKhp2Tk.js +1 -0
- package/dist/assets/clone-DZHpE494.js +1 -0
- package/dist/assets/cose-bilkent-S5V4N54A-Dqi4iU3-.js +1 -0
- package/dist/assets/cytoscape.esm-DxGcaOPV.js +331 -0
- package/dist/assets/dagre-KV5264BT-Dl-EJ9rb.js +4 -0
- package/dist/assets/default-avatar-CT9tlZjd.svg +1 -0
- package/dist/assets/default-model-avatar-DlbUPjyv.svg +1 -0
- package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/assets/diagram-5BDNPKRD-BYtyzF0D.js +10 -0
- package/dist/assets/diagram-G4DWMVQ6-BuETHFNU.js +24 -0
- package/dist/assets/diagram-MMDJMWI5-Z02oZp6I.js +43 -0
- package/dist/assets/diagram-TYMM5635-BpGlKv8l.js +24 -0
- package/dist/assets/erDiagram-SMLLAGMA-C4YngeQh.js +85 -0
- package/dist/assets/flowDiagram-DWJPFMVM-BWddFffg.js +162 -0
- package/dist/assets/ganttDiagram-T4ZO3ILL-Bg0jOD4m.js +292 -0
- package/dist/assets/gitGraphDiagram-UUTBAWPF-Bz-3sTXZ.js +106 -0
- package/dist/assets/graph-XiH8DkIu.js +1 -0
- package/dist/assets/html2canvas.esm-QH1iLAAe.js +22 -0
- package/dist/assets/index-BuUsWKGZ.js +41 -0
- package/dist/assets/index-DCtZ2KSX.css +1 -0
- package/dist/assets/infoDiagram-42DDH7IO-DLo-lOCE.js +2 -0
- package/dist/assets/init-Gi6I4Gst.js +1 -0
- package/dist/assets/ishikawaDiagram-UXIWVN3A-BsIzT5eO.js +70 -0
- package/dist/assets/journeyDiagram-VCZTEJTY-C3bOkKqv.js +139 -0
- package/dist/assets/kanban-definition-6JOO6SKY-D-rJRNbp.js +89 -0
- package/dist/assets/katex-DkKDou_j.js +257 -0
- package/dist/assets/layout-Bqp8Hh1c.js +1 -0
- package/dist/assets/linear-BWRSipGb.js +1 -0
- package/dist/assets/loading-pet-12a9GTQC.gif +0 -0
- package/dist/assets/mermaid.core-CJa7klhs.js +308 -0
- package/dist/assets/min-CQ_VyzMd.js +1 -0
- package/dist/assets/mindmap-definition-QFDTVHPH-Bnj7DDSx.js +96 -0
- package/dist/assets/model-deepseek-LDuqTN2N.svg +2 -0
- package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/assets/pieDiagram-DEJITSTG-CC8a7Ylw.js +30 -0
- package/dist/assets/quadrantDiagram-34T5L4WZ-CrmL1WUV.js +7 -0
- package/dist/assets/requirementDiagram-MS252O5E-TfkX4u_6.js +84 -0
- package/dist/assets/sankeyDiagram-XADWPNL6-DMwBbND7.js +10 -0
- package/dist/assets/sequenceDiagram-FGHM5R23-CFghMYsm.js +157 -0
- package/dist/assets/stateDiagram-FHFEXIEX-1H6JIM7l.js +1 -0
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-CtXMaKcb.js +1 -0
- package/dist/assets/timeline-definition-GMOUNBTQ-DnLMBlVa.js +120 -0
- package/dist/assets/vennDiagram-DHZGUBPP-DoIkY_KL.js +34 -0
- package/dist/assets/wardley-RL74JXVD-3n5XmOD5.js +162 -0
- package/dist/assets/wardleyDiagram-NUSXRM2D-UMOq3ofC.js +20 -0
- package/dist/assets/xychartDiagram-5P7HB3ND-CNDuQ5Cg.js +7 -0
- package/dist/favicon.ico +0 -0
- package/dist/index.html +15 -0
- package/findcx.js +204 -0
- package/i18n.js +2413 -0
- package/interceptor.js +698 -0
- package/lib/appserver-bridge.js +584 -0
- package/lib/ask-bridge.js +126 -0
- package/lib/codex-config.js +146 -0
- package/lib/constants.js +26 -0
- package/lib/context-watcher.js +85 -0
- package/lib/cxv-editor.js +73 -0
- package/lib/delta-reconstructor.js +256 -0
- package/lib/ensure-hooks.js +88 -0
- package/lib/extract-plugin-name.mjs +18 -0
- package/lib/file-api.js +128 -0
- package/lib/git-diff.js +89 -0
- package/lib/interceptor-core.js +270 -0
- package/lib/kv-cache-analyzer.js +164 -0
- package/lib/log-management.js +198 -0
- package/lib/log-stream.js +310 -0
- package/lib/log-watcher.js +245 -0
- package/lib/otel-adapter.js +251 -0
- package/lib/otel-receiver.js +198 -0
- package/lib/perm-bridge.js +142 -0
- package/lib/plugin-loader.js +161 -0
- package/lib/plugin-manager.js +118 -0
- package/lib/proxy-env.js +23 -0
- package/lib/proxy-errors.js +18 -0
- package/lib/sdk-adapter.js +77 -0
- package/lib/sdk-manager.js +464 -0
- package/lib/stats-worker.js +384 -0
- package/lib/updater.js +123 -0
- package/lib/user-profile.js +43 -0
- package/package.json +115 -0
- package/proxy.js +369 -0
- package/pty-manager.js +407 -0
- package/server.js +3226 -0
- package/workspace-registry.js +151 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { readFileSync, existsSync, watchFile, unwatchFile, openSync, readSync, closeSync, statSync } from 'node:fs';
|
|
2
|
+
import { isMainAgentEntry, extractCachedContent } from './kv-cache-analyzer.js';
|
|
3
|
+
import { buildContextWindowEvent, getContextSizeForModel } from './context-watcher.js';
|
|
4
|
+
import { reconstructEntries, createIncrementalReconstructor } from './delta-reconstructor.js';
|
|
5
|
+
import { countLogEntries, streamReconstructedEntries } from './log-stream.js';
|
|
6
|
+
|
|
7
|
+
// 跟踪所有被 watch 的日志文件
|
|
8
|
+
const watchedFiles = new Map();
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Read and parse a JSONL log file.
|
|
12
|
+
* @param {string} logFile - absolute path to the log file
|
|
13
|
+
* @returns {Array} parsed and deduplicated entries
|
|
14
|
+
*/
|
|
15
|
+
export function readLogFile(logFile) {
|
|
16
|
+
if (!existsSync(logFile)) {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const content = readFileSync(logFile, 'utf-8');
|
|
22
|
+
const entries = content.split('\n---\n').filter(line => line.trim());
|
|
23
|
+
const parsed = entries.map(entry => {
|
|
24
|
+
try {
|
|
25
|
+
return JSON.parse(entry);
|
|
26
|
+
} catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}).filter(Boolean);
|
|
30
|
+
// 去重:同一 timestamp+url 的条目,后出现的(带 response)覆盖先出现的(在途)
|
|
31
|
+
const map = new Map();
|
|
32
|
+
for (const entry of parsed) {
|
|
33
|
+
const key = `${entry.timestamp}|${entry.url}`;
|
|
34
|
+
map.set(key, entry);
|
|
35
|
+
}
|
|
36
|
+
return reconstructEntries(Array.from(map.values()));
|
|
37
|
+
} catch (err) {
|
|
38
|
+
console.error('Error reading log file:', err);
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Send an SSE entry to all connected clients.
|
|
45
|
+
* @param {Array} clients - SSE client array
|
|
46
|
+
* @param {object} entry - parsed log entry
|
|
47
|
+
*/
|
|
48
|
+
export function sendToClients(clients, entry) {
|
|
49
|
+
clients.forEach(client => {
|
|
50
|
+
try {
|
|
51
|
+
client.write(`data: ${JSON.stringify(entry)}\n\n`);
|
|
52
|
+
} catch (err) {
|
|
53
|
+
// Client disconnected
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Send a named SSE event to all connected clients.
|
|
60
|
+
* @param {Array} clients - SSE client array
|
|
61
|
+
* @param {string} eventName - SSE event name
|
|
62
|
+
* @param {object} data - event payload
|
|
63
|
+
*/
|
|
64
|
+
export function sendEventToClients(clients, eventName, data) {
|
|
65
|
+
clients.forEach(client => {
|
|
66
|
+
try {
|
|
67
|
+
client.write(`event: ${eventName}\ndata: ${JSON.stringify(data)}\n\n`);
|
|
68
|
+
} catch (err) {}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Watch a log file for changes and broadcast new entries.
|
|
74
|
+
* @param {object} opts
|
|
75
|
+
* @param {string} opts.logFile - log file to watch
|
|
76
|
+
* @param {Array} opts.clients - SSE clients array
|
|
77
|
+
* @param {Function} opts.getCodexPid - returns Codex process PID
|
|
78
|
+
* @param {Function} opts.runParallelHook - plugin hook runner
|
|
79
|
+
* @param {Function} opts.notifyStatsWorker - stats worker notifier
|
|
80
|
+
* @param {Function} opts.getLogFile - returns current LOG_FILE value
|
|
81
|
+
*/
|
|
82
|
+
export function watchLogFile(opts) {
|
|
83
|
+
const { logFile, clients, getCodexPid, runParallelHook, notifyStatsWorker, getLogFile } = opts;
|
|
84
|
+
if (watchedFiles.has(logFile)) return;
|
|
85
|
+
|
|
86
|
+
// Track byte offset instead of string length — avoids full-file re-read on every poll
|
|
87
|
+
let lastByteOffset = 0;
|
|
88
|
+
let pendingTail = ''; // incomplete entry carried across polls
|
|
89
|
+
// Delta storage: 增量重建器,用于逐条重建 mainAgent delta 条目
|
|
90
|
+
const _reconstructor = createIncrementalReconstructor();
|
|
91
|
+
try {
|
|
92
|
+
if (existsSync(logFile)) {
|
|
93
|
+
lastByteOffset = statSync(logFile).size;
|
|
94
|
+
}
|
|
95
|
+
} catch {}
|
|
96
|
+
|
|
97
|
+
watchedFiles.set(logFile, true);
|
|
98
|
+
watchFile(logFile, { interval: 500 }, () => {
|
|
99
|
+
try {
|
|
100
|
+
const currentSize = statSync(logFile).size;
|
|
101
|
+
|
|
102
|
+
// File truncated (rotation or clear) — reset offset and check rotation immediately
|
|
103
|
+
if (currentSize < lastByteOffset) {
|
|
104
|
+
lastByteOffset = 0;
|
|
105
|
+
pendingTail = '';
|
|
106
|
+
_reconstructor.reset();
|
|
107
|
+
|
|
108
|
+
// 文件被清空可能是轮转信号,立即检查是否已切换到新文件
|
|
109
|
+
const currentLogFile = getLogFile();
|
|
110
|
+
if (currentLogFile !== logFile && !watchedFiles.has(currentLogFile)) {
|
|
111
|
+
unwatchFile(logFile);
|
|
112
|
+
watchedFiles.delete(logFile);
|
|
113
|
+
|
|
114
|
+
// 流式分段广播,避免全量加载 OOM
|
|
115
|
+
const rotTotal = countLogEntries(currentLogFile);
|
|
116
|
+
clients.forEach(client => {
|
|
117
|
+
try { client.write(`event: load_start\ndata: ${JSON.stringify({ total: rotTotal, incremental: false })}\n\n`); } catch { }
|
|
118
|
+
});
|
|
119
|
+
streamReconstructedEntries(currentLogFile, (segment) => {
|
|
120
|
+
const data = JSON.stringify(segment);
|
|
121
|
+
clients.forEach(client => {
|
|
122
|
+
try { client.write(`event: load_chunk\ndata: ${data}\n\n`); } catch { }
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
clients.forEach(client => {
|
|
126
|
+
try { client.write(`event: load_end\ndata: {}\n\n`); } catch { }
|
|
127
|
+
});
|
|
128
|
+
watchLogFile({ ...opts, logFile: currentLogFile });
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (currentSize <= lastByteOffset) return;
|
|
134
|
+
|
|
135
|
+
// Read only the new bytes
|
|
136
|
+
const bytesToRead = currentSize - lastByteOffset;
|
|
137
|
+
const buf = Buffer.alloc(bytesToRead);
|
|
138
|
+
const fd = openSync(logFile, 'r');
|
|
139
|
+
try {
|
|
140
|
+
readSync(fd, buf, 0, bytesToRead, lastByteOffset);
|
|
141
|
+
} finally {
|
|
142
|
+
closeSync(fd);
|
|
143
|
+
}
|
|
144
|
+
lastByteOffset = currentSize;
|
|
145
|
+
|
|
146
|
+
const raw = pendingTail + buf.toString('utf-8');
|
|
147
|
+
const parts = raw.split('\n---\n');
|
|
148
|
+
|
|
149
|
+
// Last part may be incomplete — keep it for next poll
|
|
150
|
+
pendingTail = parts.pop() || '';
|
|
151
|
+
|
|
152
|
+
// If there's only the tail and no complete entries, check if tail is a complete entry
|
|
153
|
+
// (happens when the file ends without a trailing \n---\n)
|
|
154
|
+
if (parts.length === 0 && pendingTail.trim()) {
|
|
155
|
+
try {
|
|
156
|
+
JSON.parse(pendingTail);
|
|
157
|
+
// Valid JSON — treat as complete entry
|
|
158
|
+
parts.push(pendingTail);
|
|
159
|
+
pendingTail = '';
|
|
160
|
+
} catch {
|
|
161
|
+
// Incomplete — keep in pendingTail for next poll
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const validParts = parts.filter(p => p.trim());
|
|
166
|
+
if (validParts.length > 0) {
|
|
167
|
+
validParts.forEach(entry => {
|
|
168
|
+
try {
|
|
169
|
+
const parsed = JSON.parse(entry);
|
|
170
|
+
if (!parsed.pid) {
|
|
171
|
+
parsed.pid = getCodexPid();
|
|
172
|
+
}
|
|
173
|
+
// Delta storage: reconstruct before push — 确保前端收到完整 messages
|
|
174
|
+
_reconstructor.reconstruct(parsed);
|
|
175
|
+
sendToClients(clients, parsed);
|
|
176
|
+
runParallelHook('onNewEntry', parsed).catch(() => {});
|
|
177
|
+
if (isMainAgentEntry(parsed) && !parsed.inProgress) {
|
|
178
|
+
const cached = extractCachedContent(parsed);
|
|
179
|
+
if (cached) {
|
|
180
|
+
sendEventToClients(clients, 'kv_cache_content', cached);
|
|
181
|
+
}
|
|
182
|
+
const usage = parsed.response?.body?.usage;
|
|
183
|
+
if (usage) {
|
|
184
|
+
const contextSize = getContextSizeForModel(parsed.body?.model);
|
|
185
|
+
const cwData = buildContextWindowEvent(usage, contextSize);
|
|
186
|
+
if (cwData) {
|
|
187
|
+
sendEventToClients(clients, 'context_window', cwData);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
} catch (err) {
|
|
192
|
+
// Skip invalid entries
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
notifyStatsWorker(logFile);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// 检测日志文件是否已轮转到新文件
|
|
199
|
+
const currentLogFile = getLogFile();
|
|
200
|
+
if (currentLogFile !== logFile && !watchedFiles.has(currentLogFile)) {
|
|
201
|
+
// Unwatch old file to prevent watcher leak on rotation
|
|
202
|
+
unwatchFile(logFile);
|
|
203
|
+
watchedFiles.delete(logFile);
|
|
204
|
+
|
|
205
|
+
// 流式分段广播,避免全量加载 OOM
|
|
206
|
+
const endRotTotal = countLogEntries(currentLogFile);
|
|
207
|
+
clients.forEach(client => {
|
|
208
|
+
try { client.write(`event: load_start\ndata: ${JSON.stringify({ total: endRotTotal, incremental: false })}\n\n`); } catch { }
|
|
209
|
+
});
|
|
210
|
+
streamReconstructedEntries(currentLogFile, (segment) => {
|
|
211
|
+
const data = JSON.stringify(segment);
|
|
212
|
+
clients.forEach(client => {
|
|
213
|
+
try { client.write(`event: load_chunk\ndata: ${data}\n\n`); } catch { }
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
clients.forEach(client => {
|
|
217
|
+
try { client.write(`event: load_end\ndata: {}\n\n`); } catch { }
|
|
218
|
+
});
|
|
219
|
+
watchLogFile({ ...opts, logFile: currentLogFile });
|
|
220
|
+
}
|
|
221
|
+
} catch (err) {
|
|
222
|
+
// File not yet created, will retry on next poll
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Start watching the current log file + install statusLine + context window.
|
|
229
|
+
* @param {object} opts
|
|
230
|
+
* @param {string} opts.logFile - current LOG_FILE
|
|
231
|
+
* @param {Array} opts.clients - SSE clients array
|
|
232
|
+
* @param {Function} opts.getCodexPid
|
|
233
|
+
* @param {Function} opts.runParallelHook
|
|
234
|
+
* @param {Function} opts.notifyStatsWorker
|
|
235
|
+
* @param {Function} opts.getLogFile
|
|
236
|
+
*/
|
|
237
|
+
export function startWatching(opts) {
|
|
238
|
+
const { clients, ...watchOpts } = opts;
|
|
239
|
+
watchLogFile({ ...watchOpts, clients });
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** Get the watchedFiles Map (for cleanup in stopViewer). */
|
|
243
|
+
export function getWatchedFiles() {
|
|
244
|
+
return watchedFiles;
|
|
245
|
+
}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenTelemetry Adapter - 网络报文追踪模块
|
|
3
|
+
* 将拦截的 Codex 网络请求转换为 OTel Traces 并通过 OTLP 导出
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { NodeSDK } from '@opentelemetry/sdk-node';
|
|
7
|
+
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
8
|
+
import resourcesPkg from '@opentelemetry/resources';
|
|
9
|
+
import semConvPkg from '@opentelemetry/semantic-conventions';
|
|
10
|
+
import otelApi from '@opentelemetry/api';
|
|
11
|
+
|
|
12
|
+
const { Resource } = resourcesPkg;
|
|
13
|
+
const { SEMRESATTRS_SERVICE_NAME, SEMRESATTRS_SERVICE_VERSION, SEMRESATTRS_SERVICE_INSTANCE_ID } = semConvPkg;
|
|
14
|
+
const { trace, SpanKind, SpanStatusCode } = otelApi;
|
|
15
|
+
|
|
16
|
+
// OTel 配置
|
|
17
|
+
const OTEL_COLLECTOR_URL = process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318/v1/traces';
|
|
18
|
+
const ENABLE_OTEL = process.env.CXV_OTEL_ENABLED !== '0'; // 默认开启
|
|
19
|
+
|
|
20
|
+
// 当前追踪会话ID
|
|
21
|
+
let _traceSessionId = null;
|
|
22
|
+
let _sdk = null;
|
|
23
|
+
let _tracer = null;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 初始化 OTel SDK
|
|
27
|
+
*/
|
|
28
|
+
export function initOtelAdapter(projectName, sessionId) {
|
|
29
|
+
if (!ENABLE_OTEL) return false;
|
|
30
|
+
|
|
31
|
+
_traceSessionId = sessionId || generateSessionId();
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
const resource = new Resource({
|
|
35
|
+
[SEMRESATTRS_SERVICE_NAME]: 'cx-viewer',
|
|
36
|
+
[SEMRESATTRS_SERVICE_VERSION]: process.env.npm_package_version || '2.0.0',
|
|
37
|
+
[SEMRESATTRS_SERVICE_INSTANCE_ID]: _traceSessionId,
|
|
38
|
+
'cx-viewer.project': projectName || 'unknown',
|
|
39
|
+
'cx-viewer.session': _traceSessionId,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const traceExporter = new OTLPTraceExporter({
|
|
43
|
+
url: OTEL_COLLECTOR_URL,
|
|
44
|
+
headers: {},
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
_sdk = new NodeSDK({
|
|
48
|
+
resource,
|
|
49
|
+
traceExporter,
|
|
50
|
+
autoDetectResources: false,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
_sdk.start();
|
|
54
|
+
_tracer = trace.getTracer('cx-viewer-network', '2.0.0');
|
|
55
|
+
|
|
56
|
+
process.on('SIGINT', shutdownOtel);
|
|
57
|
+
process.on('SIGTERM', shutdownOtel);
|
|
58
|
+
|
|
59
|
+
return true;
|
|
60
|
+
} catch (err) {
|
|
61
|
+
console.error('[OTel Adapter] Failed to initialize:', err.message);
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* 生成会话ID
|
|
68
|
+
*/
|
|
69
|
+
function generateSessionId() {
|
|
70
|
+
return `cxv-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* 创建网络请求 Span
|
|
75
|
+
*/
|
|
76
|
+
export function createRequestSpan(requestEntry) {
|
|
77
|
+
if (!_tracer) return null;
|
|
78
|
+
|
|
79
|
+
const {
|
|
80
|
+
url,
|
|
81
|
+
method,
|
|
82
|
+
headers,
|
|
83
|
+
body,
|
|
84
|
+
timestamp,
|
|
85
|
+
project,
|
|
86
|
+
mainAgent,
|
|
87
|
+
teammate,
|
|
88
|
+
teamName,
|
|
89
|
+
isStream,
|
|
90
|
+
isHeartbeat,
|
|
91
|
+
isCountTokens,
|
|
92
|
+
} = requestEntry;
|
|
93
|
+
|
|
94
|
+
if (isHeartbeat && process.env.CXV_OTEL_SKIP_HEARTBEAT === '1') return null;
|
|
95
|
+
|
|
96
|
+
const spanName = `${method} ${getUrlPath(url)}`;
|
|
97
|
+
const startTime = timestamp ? new Date(timestamp).getTime() : Date.now();
|
|
98
|
+
|
|
99
|
+
const span = _tracer.startSpan(spanName, {
|
|
100
|
+
kind: SpanKind.CLIENT,
|
|
101
|
+
startTime,
|
|
102
|
+
attributes: {
|
|
103
|
+
'http.request.method': method,
|
|
104
|
+
'http.request.url': url,
|
|
105
|
+
'http.request.headers': JSON.stringify(sanitizeHeaders(headers)),
|
|
106
|
+
'http.request.body.size': body ? JSON.stringify(body).length : 0,
|
|
107
|
+
|
|
108
|
+
'cx.codex.main_agent': mainAgent || false,
|
|
109
|
+
'cx.codex.is_stream': isStream || false,
|
|
110
|
+
'cx.codex.is_heartbeat': isHeartbeat || false,
|
|
111
|
+
'cx.codex.is_count_tokens': isCountTokens || false,
|
|
112
|
+
'cx.codex.project': project || 'unknown',
|
|
113
|
+
|
|
114
|
+
...(teammate && { 'cx.codex.teammate': teammate }),
|
|
115
|
+
...(teamName && { 'cx.codex.team_name': teamName }),
|
|
116
|
+
|
|
117
|
+
...(body?.model && { 'cx.codex.model': body.model }),
|
|
118
|
+
...(body?.stream !== undefined && { 'cx.codex.stream_param': body.stream }),
|
|
119
|
+
...(body?.messages && { 'cx.codex.message_count': body.messages.length }),
|
|
120
|
+
...(body?.tools && { 'cx.codex.tool_count': body.tools.length }),
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
return span;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 完成 Span 并记录响应
|
|
129
|
+
*/
|
|
130
|
+
export function completeRequestSpan(span, requestEntry) {
|
|
131
|
+
if (!span) return;
|
|
132
|
+
|
|
133
|
+
const { response, duration } = requestEntry;
|
|
134
|
+
const endTime = Date.now();
|
|
135
|
+
|
|
136
|
+
try {
|
|
137
|
+
if (response) {
|
|
138
|
+
span.setAttribute('http.response.status_code', response.status);
|
|
139
|
+
span.setAttribute('http.response.headers', JSON.stringify(response.headers || {}));
|
|
140
|
+
span.setAttribute('http.response.body.size', response.body ? JSON.stringify(response.body).length : 0);
|
|
141
|
+
|
|
142
|
+
if (response.status >= 400) {
|
|
143
|
+
span.setStatus({
|
|
144
|
+
code: SpanStatusCode.ERROR,
|
|
145
|
+
message: response.statusText || `HTTP ${response.status}`,
|
|
146
|
+
});
|
|
147
|
+
} else {
|
|
148
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (response.body) {
|
|
152
|
+
const body = response.body;
|
|
153
|
+
if (body.usage) {
|
|
154
|
+
span.setAttribute('cx.codex.usage.input_tokens', body.usage.input_tokens || 0);
|
|
155
|
+
span.setAttribute('cx.codex.usage.output_tokens', body.usage.output_tokens || 0);
|
|
156
|
+
span.setAttribute('cx.codex.usage.total_tokens', body.usage.total_tokens || 0);
|
|
157
|
+
}
|
|
158
|
+
if (body.stop_reason) {
|
|
159
|
+
span.setAttribute('cx.codex.stop_reason', body.stop_reason);
|
|
160
|
+
}
|
|
161
|
+
if (body.model) {
|
|
162
|
+
span.setAttribute('cx.codex.response_model', body.model);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (duration) {
|
|
168
|
+
span.setAttribute('http.request.duration_ms', duration);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
span.end(endTime);
|
|
172
|
+
} catch (err) {
|
|
173
|
+
span.recordException(err);
|
|
174
|
+
span.end(endTime);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* 记录流式响应事件
|
|
180
|
+
*/
|
|
181
|
+
export function recordStreamEvent(span, event) {
|
|
182
|
+
if (!span) return;
|
|
183
|
+
|
|
184
|
+
const eventType = event.type || 'unknown';
|
|
185
|
+
span.addEvent(`stream.${eventType}`, {
|
|
186
|
+
'cx.codex.event_type': eventType,
|
|
187
|
+
'cx.codex.event_data': JSON.stringify(event).slice(0, 1000),
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* 脱敏 Headers
|
|
193
|
+
*/
|
|
194
|
+
function sanitizeHeaders(headers) {
|
|
195
|
+
if (!headers) return {};
|
|
196
|
+
const safe = { ...headers };
|
|
197
|
+
const sensitive = ['authorization', 'x-api-key', 'cookie', 'x-auth-token'];
|
|
198
|
+
for (const key of Object.keys(safe)) {
|
|
199
|
+
if (sensitive.includes(key.toLowerCase())) {
|
|
200
|
+
const val = safe[key];
|
|
201
|
+
safe[key] = val?.length > 12 ? `${val.slice(0, 8)}****${val.slice(-4)}` : '****';
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return safe;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* 提取 URL path
|
|
209
|
+
*/
|
|
210
|
+
function getUrlPath(url) {
|
|
211
|
+
try {
|
|
212
|
+
return new URL(url).pathname;
|
|
213
|
+
} catch {
|
|
214
|
+
return url;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* 关闭 OTel SDK
|
|
220
|
+
*/
|
|
221
|
+
export function shutdownOtel() {
|
|
222
|
+
if (_sdk) {
|
|
223
|
+
_sdk.shutdown().catch(() => {});
|
|
224
|
+
_sdk = null;
|
|
225
|
+
_tracer = null;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* 获取当前会话ID
|
|
231
|
+
*/
|
|
232
|
+
export function getTraceSessionId() {
|
|
233
|
+
return _traceSessionId;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* 检查 OTel 是否启用
|
|
238
|
+
*/
|
|
239
|
+
export function isOtelEnabled() {
|
|
240
|
+
return ENABLE_OTEL && _tracer !== null;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export default {
|
|
244
|
+
initOtelAdapter,
|
|
245
|
+
createRequestSpan,
|
|
246
|
+
completeRequestSpan,
|
|
247
|
+
recordStreamEvent,
|
|
248
|
+
shutdownOtel,
|
|
249
|
+
getTraceSessionId,
|
|
250
|
+
isOtelEnabled,
|
|
251
|
+
};
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* otel-receiver.js — 轻量级 OTLP HTTP 接收器
|
|
3
|
+
*
|
|
4
|
+
* 接收 Codex CLI 原生发出的 OTel trace 数据(OTLP JSON 格式),
|
|
5
|
+
* 解析 spans 并转换为 cx-viewer 的 entry 格式,写入 JSONL 日志文件。
|
|
6
|
+
*
|
|
7
|
+
* Codex 通过 config.toml [otel] 配置将遥测数据发送到此端点。
|
|
8
|
+
* 支持的数据:API 请求、工具调用、用户提示等。
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { appendFileSync } from 'node:fs';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* 从 OTLP JSON trace 数据中提取 spans 并转换为 cx-viewer entries
|
|
15
|
+
* @param {object} otlpData - OTLP ExportTraceServiceRequest JSON
|
|
16
|
+
* @returns {Array} cx-viewer entry 数组
|
|
17
|
+
*/
|
|
18
|
+
export function parseOtlpTraces(otlpData) {
|
|
19
|
+
const entries = [];
|
|
20
|
+
if (!otlpData?.resourceSpans) return entries;
|
|
21
|
+
|
|
22
|
+
for (const rs of otlpData.resourceSpans) {
|
|
23
|
+
const resourceAttrs = extractAttributes(rs.resource?.attributes);
|
|
24
|
+
|
|
25
|
+
for (const ss of rs.scopeSpans || []) {
|
|
26
|
+
for (const span of ss.spans || []) {
|
|
27
|
+
const entry = spanToEntry(span, resourceAttrs);
|
|
28
|
+
if (entry) entries.push(entry);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return entries;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 将单个 OTel span 转换为 cx-viewer entry 数组
|
|
37
|
+
* 一个 span 可能包含多种事件(api_request + tool.call 等),全部提取
|
|
38
|
+
*/
|
|
39
|
+
function spanToEntry(span, resourceAttrs) {
|
|
40
|
+
const attrs = extractAttributes(span.attributes);
|
|
41
|
+
const events = (span.events || []).map(e => ({
|
|
42
|
+
name: e.name,
|
|
43
|
+
attrs: extractAttributes(e.attributes),
|
|
44
|
+
timeUnixNano: e.timeUnixNano,
|
|
45
|
+
}));
|
|
46
|
+
|
|
47
|
+
if (events.length === 0) return null;
|
|
48
|
+
|
|
49
|
+
const startNano = BigInt(span.startTimeUnixNano || '0');
|
|
50
|
+
const endNano = BigInt(span.endTimeUnixNano || '0');
|
|
51
|
+
const durationMs = Number((endNano - startNano) / 1000000n);
|
|
52
|
+
const timestamp = new Date(Number(startNano / 1000000n)).toISOString();
|
|
53
|
+
const model = attrs['codex.model'] || attrs['model'] || resourceAttrs['model'] || null;
|
|
54
|
+
const project = resourceAttrs['cx-viewer.project'] || resourceAttrs['service.name'] || 'codex';
|
|
55
|
+
|
|
56
|
+
const results = [];
|
|
57
|
+
|
|
58
|
+
// API 请求事件
|
|
59
|
+
for (const evt of events.filter(e => e.name === 'codex.api_request')) {
|
|
60
|
+
const a = evt.attrs;
|
|
61
|
+
results.push({
|
|
62
|
+
timestamp,
|
|
63
|
+
project,
|
|
64
|
+
url: `codex://api/${span.name || 'request'}`,
|
|
65
|
+
method: 'POST',
|
|
66
|
+
headers: {},
|
|
67
|
+
body: { model: model || a['model'], _otelSpanName: span.name },
|
|
68
|
+
response: {
|
|
69
|
+
status: parseInt(a['http.response.status_code']) || 200,
|
|
70
|
+
statusText: a['success'] === 'true' ? 'OK' : (a['error.message'] || 'Error'),
|
|
71
|
+
headers: {},
|
|
72
|
+
body: {
|
|
73
|
+
usage: {
|
|
74
|
+
input_tokens: parseInt(a['input_token_count']) || 0,
|
|
75
|
+
output_tokens: parseInt(a['output_token_count']) || 0,
|
|
76
|
+
cache_read_input_tokens: parseInt(a['cached_token_count']) || 0,
|
|
77
|
+
},
|
|
78
|
+
model: model || a['model'],
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
duration: parseInt(a['duration_ms']) || durationMs,
|
|
82
|
+
isStream: true,
|
|
83
|
+
mainAgent: true,
|
|
84
|
+
_otelSource: true,
|
|
85
|
+
_otelTraceId: span.traceId,
|
|
86
|
+
_otelSpanId: span.spanId,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// 工具调用事件
|
|
91
|
+
const toolResultEvents = events.filter(e => e.name === 'codex.tool_result');
|
|
92
|
+
for (const tc of events.filter(e => e.name === 'codex.tool.call')) {
|
|
93
|
+
const a = tc.attrs;
|
|
94
|
+
const toolName = a['tool_name'] || 'unknown';
|
|
95
|
+
const matchResult = toolResultEvents.find(tr => tr.attrs['call_id'] === a['call_id']);
|
|
96
|
+
results.push({
|
|
97
|
+
timestamp: tc.timeUnixNano
|
|
98
|
+
? new Date(Number(BigInt(tc.timeUnixNano) / 1000000n)).toISOString()
|
|
99
|
+
: timestamp,
|
|
100
|
+
project,
|
|
101
|
+
url: `codex://tool/${toolName}`,
|
|
102
|
+
method: 'TOOL',
|
|
103
|
+
headers: {},
|
|
104
|
+
body: {
|
|
105
|
+
tool_name: toolName,
|
|
106
|
+
tool_input: safeJsonParse(a['arguments']),
|
|
107
|
+
_callId: a['call_id'],
|
|
108
|
+
_source: a['source'],
|
|
109
|
+
},
|
|
110
|
+
response: matchResult ? {
|
|
111
|
+
status: 200, statusText: 'OK', headers: {},
|
|
112
|
+
body: {
|
|
113
|
+
output: safeJsonParse(matchResult.attrs['output']) || matchResult.attrs['output'],
|
|
114
|
+
_outputLength: parseInt(matchResult.attrs['output_length']) || 0,
|
|
115
|
+
},
|
|
116
|
+
} : null,
|
|
117
|
+
duration: parseInt(a['duration_ms'] || matchResult?.attrs['duration_ms']) || 0,
|
|
118
|
+
isStream: false,
|
|
119
|
+
mainAgent: false,
|
|
120
|
+
_otelSource: true,
|
|
121
|
+
_otelTraceId: span.traceId,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// 用户提示事件
|
|
126
|
+
for (const evt of events.filter(e => e.name === 'codex.user_prompt')) {
|
|
127
|
+
const a = evt.attrs;
|
|
128
|
+
results.push({
|
|
129
|
+
timestamp: evt.timeUnixNano
|
|
130
|
+
? new Date(Number(BigInt(evt.timeUnixNano) / 1000000n)).toISOString()
|
|
131
|
+
: timestamp,
|
|
132
|
+
project,
|
|
133
|
+
url: 'codex://user_prompt',
|
|
134
|
+
method: 'POST',
|
|
135
|
+
headers: {},
|
|
136
|
+
body: {
|
|
137
|
+
model,
|
|
138
|
+
messages: [{ role: 'user', content: a['prompt'] || '' }],
|
|
139
|
+
_promptLength: parseInt(a['prompt_length']) || 0,
|
|
140
|
+
},
|
|
141
|
+
response: null,
|
|
142
|
+
duration: 0,
|
|
143
|
+
isStream: false,
|
|
144
|
+
mainAgent: true,
|
|
145
|
+
_otelSource: true,
|
|
146
|
+
_otelTraceId: span.traceId,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return results.length > 0 ? results : null;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* 提取 OTLP attributes 数组为普通对象
|
|
155
|
+
* OTLP 格式: [{ key: 'foo', value: { stringValue: 'bar' } }]
|
|
156
|
+
*/
|
|
157
|
+
function extractAttributes(attrs) {
|
|
158
|
+
if (!Array.isArray(attrs)) return {};
|
|
159
|
+
const result = {};
|
|
160
|
+
for (const attr of attrs) {
|
|
161
|
+
if (!attr?.key) continue;
|
|
162
|
+
const v = attr.value;
|
|
163
|
+
if (!v) continue;
|
|
164
|
+
if (v.stringValue !== undefined) result[attr.key] = v.stringValue;
|
|
165
|
+
else if (v.intValue !== undefined) result[attr.key] = String(v.intValue);
|
|
166
|
+
else if (v.doubleValue !== undefined) result[attr.key] = String(v.doubleValue);
|
|
167
|
+
else if (v.boolValue !== undefined) result[attr.key] = String(v.boolValue);
|
|
168
|
+
else if (v.arrayValue) result[attr.key] = JSON.stringify(v.arrayValue.values);
|
|
169
|
+
else if (v.kvlistValue) result[attr.key] = JSON.stringify(v.kvlistValue.values);
|
|
170
|
+
}
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* 将 OTel entries 写入 JSONL 日志文件
|
|
176
|
+
* @param {string} logFile - 日志文件路径
|
|
177
|
+
* @param {Array} entries - cx-viewer entry 数组
|
|
178
|
+
*/
|
|
179
|
+
export function writeOtelEntries(logFile, entries) {
|
|
180
|
+
if (!logFile || !entries.length) return;
|
|
181
|
+
const lines = entries
|
|
182
|
+
.flat() // spanToEntry 可能返回数组(多个工具调用)
|
|
183
|
+
.filter(Boolean)
|
|
184
|
+
.map(e => JSON.stringify(e) + '\n---\n')
|
|
185
|
+
.join('');
|
|
186
|
+
try {
|
|
187
|
+
appendFileSync(logFile, lines);
|
|
188
|
+
} catch (err) {
|
|
189
|
+
if (process.env.CXV_DEBUG) {
|
|
190
|
+
console.error('[OTel Receiver] Write error:', err.message);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function safeJsonParse(s) {
|
|
196
|
+
if (!s || typeof s !== 'string') return s;
|
|
197
|
+
try { return JSON.parse(s); } catch { return s; }
|
|
198
|
+
}
|