cli-jaw 2.17.62 → 2.17.63
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.ja.md +17 -17
- package/README.ko.md +17 -17
- package/README.md +17 -17
- package/README.zh-CN.md +17 -17
- package/dist/bin/commands/tui/input-handler.js +19 -0
- package/dist/bin/commands/tui/input-handler.js.map +1 -1
- package/dist/bin/commands/tui/overlays.js +8 -4
- package/dist/bin/commands/tui/overlays.js.map +1 -1
- package/dist/bin/star-prompt.js +1 -1
- package/dist/bin/star-prompt.js.map +1 -1
- package/dist/server.js +14 -1
- package/dist/server.js.map +1 -1
- package/dist/src/agent/claude-runtime-pool.js +2 -1
- package/dist/src/agent/claude-runtime-pool.js.map +1 -1
- package/dist/src/agent/claude-runtime-run.js +28 -7
- package/dist/src/agent/claude-runtime-run.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +34 -6
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/runtime/claude-sdk-events.js +136 -9
- package/dist/src/agent/runtime/claude-sdk-events.js.map +1 -1
- package/dist/src/agent/runtime/claude-sdk-history-loader.js +24 -0
- package/dist/src/agent/runtime/claude-sdk-history-loader.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-hooks.js +10 -4
- package/dist/src/agent/runtime/claude-sdk-hooks.js.map +1 -1
- package/dist/src/agent/runtime/claude-sdk-messages.js +25 -2
- package/dist/src/agent/runtime/claude-sdk-messages.js.map +1 -1
- package/dist/src/agent/runtime/claude-sdk-options.js +36 -3
- package/dist/src/agent/runtime/claude-sdk-options.js.map +1 -1
- package/dist/src/agent/runtime/claude-sdk-permissions.js +32 -9
- package/dist/src/agent/runtime/claude-sdk-permissions.js.map +1 -1
- package/dist/src/agent/runtime/claude-sdk-session.js +165 -17
- package/dist/src/agent/runtime/claude-sdk-session.js.map +1 -1
- package/dist/src/agent/runtime/claude-sdk-version.js +8 -0
- package/dist/src/agent/runtime/claude-sdk-version.js.map +1 -0
- package/dist/src/agent/spawn/backend-codex-app.js +619 -0
- package/dist/src/agent/spawn/backend-codex-app.js.map +1 -0
- package/dist/src/agent/spawn/backend-context.js +2 -0
- package/dist/src/agent/spawn/backend-context.js.map +1 -0
- package/dist/src/agent/spawn/backend-copilot.js +385 -0
- package/dist/src/agent/spawn/backend-copilot.js.map +1 -0
- package/dist/src/agent/spawn/backend-native-acp.js +379 -0
- package/dist/src/agent/spawn/backend-native-acp.js.map +1 -0
- package/dist/src/agent/spawn/backend-pi.js +565 -0
- package/dist/src/agent/spawn/backend-pi.js.map +1 -0
- package/dist/src/agent/spawn/types.js +2 -0
- package/dist/src/agent/spawn/types.js.map +1 -0
- package/dist/src/agent/spawn.js +44 -1858
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/cli/claude-default-model-boot.js +36 -0
- package/dist/src/cli/claude-default-model-boot.js.map +1 -0
- package/dist/src/cli/claude-model-discovery.js +13 -1
- package/dist/src/cli/claude-model-discovery.js.map +1 -1
- package/dist/src/cli/claude-models.js +7 -1
- package/dist/src/cli/claude-models.js.map +1 -1
- package/dist/src/cli/commands.js +5 -15
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/tui/composer.js +3 -3
- package/dist/src/cli/tui/composer.js.map +1 -1
- package/dist/src/cli/tui/skill-mention.js +15 -0
- package/dist/src/cli/tui/skill-mention.js.map +1 -0
- package/dist/src/code-mode/manager.js +174 -9
- package/dist/src/code-mode/manager.js.map +1 -1
- package/dist/src/code-mode/providers/catalog.js +5 -3
- package/dist/src/code-mode/providers/catalog.js.map +1 -1
- package/dist/src/code-mode/providers/claude-history.js +132 -0
- package/dist/src/code-mode/providers/claude-history.js.map +1 -0
- package/dist/src/code-mode/providers/claude.js +74 -7
- package/dist/src/code-mode/providers/claude.js.map +1 -1
- package/dist/src/code-mode/providers/codex-app.js +7 -1
- package/dist/src/code-mode/providers/codex-app.js.map +1 -1
- package/dist/src/code-mode/session.js +158 -11
- package/dist/src/code-mode/session.js.map +1 -1
- package/dist/src/code-mode/store.js +416 -28
- package/dist/src/code-mode/store.js.map +1 -1
- package/dist/src/command-contract/catalog.js +3 -22
- package/dist/src/command-contract/catalog.js.map +1 -1
- package/dist/src/core/codex-config.js +3 -62
- package/dist/src/core/codex-config.js.map +1 -1
- package/dist/src/core/config.js +116 -14
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/runtime-settings.js +20 -10
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/core/settings-watch.js +1 -0
- package/dist/src/core/settings-watch.js.map +1 -1
- package/dist/src/core/skill-mentions.js +83 -0
- package/dist/src/core/skill-mentions.js.map +1 -0
- package/dist/src/manager/registry.js +5 -1
- package/dist/src/manager/registry.js.map +1 -1
- package/dist/src/manager/routes/desktop-status.js +1 -1
- package/dist/src/manager/routes/desktop-status.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +11 -1
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/prompt/builder.js +10 -4
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/templates/a1-system.md +1 -1
- package/dist/src/routes/code-native.js +51 -3
- package/dist/src/routes/code-native.js.map +1 -1
- package/dist/src/routes/settings.js +1 -4
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/skills.js +7 -0
- package/dist/src/routes/skills.js.map +1 -1
- package/dist/src/shared/skill-mention.js +61 -0
- package/dist/src/shared/skill-mention.js.map +1 -0
- package/dist/src/shared/tool-input.js +137 -0
- package/dist/src/shared/tool-input.js.map +1 -0
- package/package.json +7 -5
- package/public/css/activity.css +83 -20
- package/public/css/layout.css +2 -2
- package/public/css/sidebar.css +18 -0
- package/public/css/variables.css +23 -2
- package/public/dist/.vite/manifest.json +302 -334
- package/public/dist/assets/Activity-DPLlOJ46.js +1 -0
- package/public/dist/assets/AdvancedExport-BgOgGvc5.js +1 -0
- package/public/dist/assets/Agent-O_U8ny90.js +1 -0
- package/public/dist/assets/Browser-m6VynQXV.js +1 -0
- package/public/dist/assets/BrowserPanel-Bb-Bge6B.js +3 -0
- package/public/dist/assets/ChannelEnablementControl-BSuKQhTW.js +85 -0
- package/public/dist/assets/ChannelSetupEntry-DHLoZEzJ.js +1 -0
- package/public/dist/assets/ChannelsDiscord-B-G8vsYy.js +1 -0
- package/public/dist/assets/ChannelsSlack-oPuh922z.js +1 -0
- package/public/dist/assets/ChannelsTelegram-PmTv43KQ.js +1 -0
- package/public/dist/assets/CodeCanvas-CVbdp0S-.js +3 -0
- package/public/dist/assets/DashboardMeta-BqEiJrvr.js +1 -0
- package/public/dist/assets/DesignPanel-BOb-HMbl.js +2 -0
- package/public/dist/assets/{Developer-BdKPcw8Z.js → Developer-CbySB7_Z.js} +1 -1
- package/public/dist/assets/{DiffPanel-DtJuvU5y.js → DiffPanel-D9Cch5FG.js} +1 -1
- package/public/dist/assets/Display-C0Zdamcb.js +1 -0
- package/public/dist/assets/Display-DU4_76cS.js +1 -0
- package/public/dist/assets/DocPanel-DvtFw8AP.js +1 -0
- package/public/dist/assets/{Embedding-DvdTj1BF.js → Embedding-CCFMOB_2.js} +1 -1
- package/public/dist/assets/Employees-BanvF58d.js +1 -0
- package/public/dist/assets/FolderPanel-CJvwRwIV.js +3 -0
- package/public/dist/assets/Heartbeat-uyi_MpUd.js +1 -0
- package/public/dist/assets/InlineWarn-Cq4z28F3.js +1 -0
- package/public/dist/assets/MarkdownRenderer-Cc3DeHvm.js +1 -0
- package/public/dist/assets/{MarkdownRenderer-DhonsAPC.js → MarkdownRenderer-DzN66XVb.js} +1 -1
- package/public/dist/assets/Mcp-rjPoL_Zo.js +4 -0
- package/public/dist/assets/Memory-C9I33pIi.js +1 -0
- package/public/dist/assets/{MilkdownWysiwygEditor-D6JaLDE4.js → MilkdownWysiwygEditor-xObhviw7.js} +1 -1
- package/public/dist/assets/ModelProvider-fiUktMaO.js +1 -0
- package/public/dist/assets/Network-CuqFrOvR.js +1 -0
- package/public/dist/assets/NotesGraphWorkspace-DO9LtVGF.js +1 -0
- package/public/dist/assets/PanelLayoutProvider-DRZ4QkBC.js +1 -0
- package/public/dist/assets/Permissions-BltXiZnz.js +1 -0
- package/public/dist/assets/{Permissions-BwiMEoTV.js → Permissions-DcCbFMIq.js} +1 -1
- package/public/dist/assets/Profile-DUL7-RE_.js +1 -0
- package/public/dist/assets/Prompts-C9vY8ivQ.js +1 -0
- package/public/dist/assets/SpeechKeys-BJ8V7U5E.js +1 -0
- package/public/dist/assets/TelegramHub-DtyjLGFR.js +1 -0
- package/public/dist/assets/{TerminalPanel-Bu9i-P2f.js → TerminalPanel-c1xhiy53.js} +1 -1
- package/public/dist/assets/app-BjKzqXCv.css +1 -0
- package/public/dist/assets/app-CZwx0V6K.js +59 -0
- package/public/dist/assets/bgtask-badge-CnVkcp3c.js +1 -0
- package/public/dist/assets/{bgtask-badge-DfiHuzxT.js → bgtask-badge-Cp26S8Uq.js} +1 -1
- package/public/dist/assets/client-platform-WO8m6kPQ.js +1 -0
- package/public/dist/assets/{employees-BQaJNp-u.js → employees-CsvI0_5V.js} +1 -1
- package/public/dist/assets/error-normalize-clOi-AAA.js +1 -0
- package/public/dist/assets/fields-CicOWY-X.js +1 -0
- package/public/dist/assets/iframe-renderer-DWx9v2Iz.js +1 -0
- package/public/dist/assets/iframe-renderer-DmHYOI1A.js +142 -0
- package/public/dist/assets/{react-C_pPTFsM.js → jsx-runtime-CkEUZM6i.js} +1 -1
- package/public/dist/assets/manager-CCXm5Yfe.js +5 -0
- package/public/dist/assets/manager-D9rhKFKc.css +1 -0
- package/public/dist/assets/manager-shortcuts-Cqmr0mEq.js +1 -0
- package/public/dist/assets/{memory-EG1B51up.js → memory-C6qtAMdJ.js} +1 -1
- package/public/dist/assets/memory-PPofQPeB.js +1 -0
- package/public/dist/assets/message-history-DcjBuubA.js +4 -0
- package/public/dist/assets/message-history-bw4qF01Z.js +1 -0
- package/public/dist/assets/page-shell-DfinU3mb.js +1 -0
- package/public/dist/assets/react-dom-URBLzV3w.js +1 -0
- package/public/dist/assets/{render-Dp07lZAJ.js → render-DfYro-fG.js} +1 -1
- package/public/dist/assets/{settings-jlI4X-zt.js → settings-CvsLWlJn.js} +38 -30
- package/public/dist/assets/settings-DMiQe469.js +1 -0
- package/public/dist/assets/settings-DgAlohx9.js +1 -0
- package/public/dist/assets/settings-core-BH7J_Rbm.js +1 -0
- package/public/dist/assets/{settings-core-B5Uf_lWY.js → settings-core-pnpw-eZv.js} +1 -1
- package/public/dist/assets/{settings-embedding-BfWzWKMM.js → settings-embedding-BRW0WZvh.js} +3 -3
- package/public/dist/assets/{settings-embedding-DhEdT86W.css → settings-embedding-CUQ8Is3y.css} +1 -1
- package/public/dist/assets/settings-types-CYKy0xz4.js +1 -0
- package/public/dist/assets/shared-D1begqvi.js +1 -0
- package/public/dist/assets/{sidebar-BUemG2ZN.js → sidebar-C_80w4iY.js} +3 -3
- package/public/dist/assets/{skills-CKUcEN9m.js → skills-D_2adqge.js} +1 -1
- package/public/dist/assets/skills-DeNVAVgt.js +1 -0
- package/public/dist/assets/{slash-commands-D34GgHFX.js → slash-commands-B_Hq5RkC.js} +2 -2
- package/public/dist/assets/slash-commands-Cj5qoRWc.js +1 -0
- package/public/dist/assets/tool-input-DI7uu8Ah.js +2 -0
- package/public/dist/assets/{trace-drawer-DBmK-5F_.js → trace-drawer-B6XuPodh.js} +1 -1
- package/public/dist/assets/ui-BbR_fFiK.js +1 -0
- package/public/dist/assets/{ui-vm2iuLcS.js → ui-D8xzm7DN.js} +1 -1
- package/public/dist/index.html +11 -3
- package/public/dist/manager/index.html +3 -3
- package/public/dist/settings/index.html +2 -2
- package/public/index.html +9 -1
- package/public/js/features/activity-history.ts +50 -21
- package/public/js/features/activity-rows.ts +158 -10
- package/public/js/features/activity-view.ts +5 -5
- package/public/js/features/chat.ts +2 -0
- package/public/js/features/employees.ts +1 -0
- package/public/js/features/resize-guard.ts +39 -0
- package/public/js/features/settings-cli-status.ts +49 -17
- package/public/js/features/settings-types.ts +39 -1
- package/public/js/features/skill-mentions.ts +143 -0
- package/public/js/main.ts +15 -0
- package/public/js/virtual-scroll.ts +67 -1
- package/public/locales/en.json +2 -0
- package/public/locales/ja.json +2 -0
- package/public/locales/ko.json +2 -0
- package/public/locales/zh.json +2 -0
- package/public/manager/src/AppChrome.tsx +2 -0
- package/public/manager/src/InstancePreview.tsx +1 -1
- package/public/manager/src/SidebarRailRouter.tsx +3 -1
- package/public/manager/src/browser-panel/BrowserPanel.tsx +47 -12
- package/public/manager/src/browser-panel/browser-address-state.ts +11 -0
- package/public/manager/src/client-platform.ts +18 -0
- package/public/manager/src/code/CodeCanvas.tsx +4 -2
- package/public/manager/src/code/CodeComposer.tsx +22 -10
- package/public/manager/src/code/CodeDraftEmptyState.tsx +64 -0
- package/public/manager/src/code/CodeSessionList.tsx +154 -40
- package/public/manager/src/code/CodeTranscript.tsx +104 -16
- package/public/manager/src/code/CodeWorkbench.tsx +21 -11
- package/public/manager/src/code/CodeWorkspaceHeader.tsx +5 -10
- package/public/manager/src/code/ComposerFooter.tsx +9 -1
- package/public/manager/src/code/code-composer.css +1 -1
- package/public/manager/src/code/code-controller-draft-storage.ts +16 -8
- package/public/manager/src/code/code-controller-drafts.ts +33 -6
- package/public/manager/src/code/code-controller-runtime.ts +189 -17
- package/public/manager/src/code/code-controller-types.ts +19 -1
- package/public/manager/src/code/code-recent-workspaces.ts +25 -0
- package/public/manager/src/code/code-session-client.ts +19 -1
- package/public/manager/src/code/code-session-sidebar.css +38 -0
- package/public/manager/src/code/code-session-state.ts +2 -0
- package/public/manager/src/code/code-types.ts +47 -0
- package/public/manager/src/code/code-workbench.css +36 -1
- package/public/manager/src/code/code.css +171 -7
- package/public/manager/src/code/session-order.ts +80 -0
- package/public/manager/src/code/tool-summary.ts +45 -11
- package/public/manager/src/folder-panel/folder-shortcuts.ts +5 -9
- package/public/manager/src/hooks/useCommandPalette.ts +3 -7
- package/public/manager/src/main.tsx +1 -0
- package/public/manager/src/manager-components.css +25 -23
- package/public/manager/src/manager-dashboard-reminders.css +2 -2
- package/public/manager/src/manager-layout.css +1 -1
- package/public/manager/src/manager-shortcut-runner.ts +9 -2
- package/public/manager/src/manager-shortcuts.ts +83 -21
- package/public/manager/src/panels/desktop-bridge.ts +4 -1
- package/public/manager/src/panels/panels.css +9 -0
- package/public/manager/src/preview.ts +19 -4
- package/public/manager/src/settings/pages/AdvancedExport.tsx +28 -30
- package/public/manager/src/settings/pages/Browser.tsx +45 -47
- package/public/manager/src/settings/pages/ChannelsDiscord.tsx +51 -26
- package/public/manager/src/settings/pages/ChannelsSlack.tsx +59 -17
- package/public/manager/src/settings/pages/ChannelsTelegram.tsx +51 -26
- package/public/manager/src/settings/pages/Display.tsx +2 -1
- package/public/manager/src/settings/pages/Employees.tsx +3 -3
- package/public/manager/src/settings/pages/Mcp.tsx +220 -200
- package/public/manager/src/settings/pages/Memory.tsx +35 -41
- package/public/manager/src/settings/pages/ModelProvider.tsx +23 -98
- package/public/manager/src/settings/pages/Network.tsx +5 -4
- package/public/manager/src/settings/pages/Permissions.tsx +38 -16
- package/public/manager/src/settings/pages/Prompts.tsx +12 -9
- package/public/manager/src/settings/pages/SpeechKeys.tsx +132 -139
- package/public/manager/src/settings/pages/TelegramHub.tsx +67 -20
- package/public/manager/src/settings/pages/components/AvatarCard.tsx +9 -8
- package/public/manager/src/settings/pages/components/ChannelSetupEntry.tsx +2 -2
- package/public/manager/src/settings/pages/components/EmployeeRow.tsx +6 -12
- package/public/manager/src/settings/pages/components/HealthBadge.tsx +11 -6
- package/public/manager/src/settings/pages/components/HeartbeatJobRow.tsx +35 -16
- package/public/manager/src/settings/pages/components/HeartbeatJobsSection.tsx +11 -11
- package/public/manager/src/settings/pages/components/HeartbeatMarkdownSection.tsx +7 -7
- package/public/manager/src/settings/pages/components/InlineWarn.tsx +4 -9
- package/public/manager/src/settings/pages/components/McpServerCard.tsx +39 -27
- package/public/manager/src/settings/pages/components/MemoryRow.tsx +21 -16
- package/public/manager/src/settings/pages/components/PerCliRow.tsx +122 -121
- package/public/manager/src/settings/pages/components/PiProfileDialog.tsx +9 -6
- package/public/manager/src/settings/pages/components/SlackSetup.tsx +8 -8
- package/public/manager/src/settings/pages/components/TransportStatusChips.tsx +14 -10
- package/public/manager/src/settings/pages/components/agent/AgentEmployeesSection.tsx +26 -26
- package/public/manager/src/settings/pages/components/agent/PermissionQuickSection.tsx +5 -5
- package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +14 -11
- package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +1 -3
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +0 -2
- package/public/manager/src/settings/pages/components/runtime-transport-field.tsx +2 -2
- package/public/manager/src/settings/pages/manager/Activity.tsx +6 -2
- package/public/manager/src/settings/pages/manager/Display.tsx +3 -8
- package/public/manager/src/settings/pages/manager/shared.tsx +44 -33
- package/public/manager/src/settings/pages/page-shell.tsx +66 -0
- package/public/manager/src/settings-agent.css +185 -36
- package/public/manager/src/settings-standalone.tsx +1 -0
- package/public/manager/src/settings-surface.css +96 -0
- package/public/manager/src/types.ts +1 -0
- package/scripts/ci/install-ripgrep.sh +35 -0
- package/scripts/collect-fresh-install-evidence.sh +2 -2
- package/scripts/install-risk-gate.mjs +2 -3
- package/scripts/install-wsl.sh +1 -1
- package/scripts/install.ps1 +1 -1
- package/scripts/install.sh +1 -1
- package/scripts/release-1.6.0.sh +1 -1
- package/scripts/release-gates.mjs +48 -13
- package/scripts/release-preview.sh +2 -2
- package/scripts/restack-pr.sh +88 -0
- package/scripts/verify-electron-update-metadata.mjs +1 -1
- package/scripts/windows-support-contract.json +1 -1
- package/public/dist/assets/Activity-BUrp73Re.js +0 -1
- package/public/dist/assets/AdvancedExport-B7h_ZvBu.js +0 -1
- package/public/dist/assets/Agent-DnbZJP7b.js +0 -1
- package/public/dist/assets/Browser-CiBoK5Qx.js +0 -1
- package/public/dist/assets/BrowserPanel-SZAUc9T2.js +0 -3
- package/public/dist/assets/ChannelEnablementControl-Dl0uYx38.js +0 -85
- package/public/dist/assets/ChannelSetupEntry-DxtOrN01.js +0 -1
- package/public/dist/assets/ChannelsDiscord-BEGGwd_3.js +0 -1
- package/public/dist/assets/ChannelsSlack-BryC2Ahr.js +0 -1
- package/public/dist/assets/ChannelsTelegram-CGSpaImJ.js +0 -1
- package/public/dist/assets/CodeCanvas-DpkFi5Au.js +0 -2
- package/public/dist/assets/DashboardMeta-Dh-tasbY.js +0 -1
- package/public/dist/assets/DesignPanel-NLNK9wCo.js +0 -2
- package/public/dist/assets/Display-BHGFX3O0.js +0 -1
- package/public/dist/assets/Display-BW-_pKRf.js +0 -1
- package/public/dist/assets/DocPanel-BM41cYpS.js +0 -1
- package/public/dist/assets/Employees-BuFw6-fT.js +0 -1
- package/public/dist/assets/FolderPanel-C-eQT3Yq.js +0 -3
- package/public/dist/assets/Heartbeat-CIVtKWNc.js +0 -1
- package/public/dist/assets/InlineWarn-DIMbcbzk.js +0 -1
- package/public/dist/assets/MarkdownRenderer-DyVx6DxM.js +0 -1
- package/public/dist/assets/Mcp-uKjor7vh.js +0 -4
- package/public/dist/assets/Memory-BSDIXT0B.js +0 -1
- package/public/dist/assets/ModelProvider-DMh2tXUx.js +0 -1
- package/public/dist/assets/Network-4Pa6JkhK.js +0 -1
- package/public/dist/assets/NotesGraphWorkspace-CgdC-fM6.js +0 -1
- package/public/dist/assets/PanelLayoutProvider-mn8sI0h-.js +0 -1
- package/public/dist/assets/Permissions-CodIW-Yd.js +0 -1
- package/public/dist/assets/Profile-DPqrYA44.js +0 -1
- package/public/dist/assets/Prompts-CvAx7QqR.js +0 -1
- package/public/dist/assets/SpeechKeys-CVBCqoBn.js +0 -1
- package/public/dist/assets/TelegramHub-4zKwpk0P.js +0 -1
- package/public/dist/assets/app-ByMfeXp-.js +0 -55
- package/public/dist/assets/app-DAJWqs33.css +0 -1
- package/public/dist/assets/bgtask-badge-Ch88fnhf.js +0 -1
- package/public/dist/assets/error-normalize-CL69Bl7z.js +0 -1
- package/public/dist/assets/fields-mlGpofqQ.js +0 -1
- package/public/dist/assets/iframe-renderer-Bj1JolO8.js +0 -142
- package/public/dist/assets/iframe-renderer-DWnvUSrx.js +0 -1
- package/public/dist/assets/jsx-runtime-NZYk81nU.js +0 -1
- package/public/dist/assets/manager-Bi_xw7TW.js +0 -5
- package/public/dist/assets/manager-BnQHAKk6.css +0 -1
- package/public/dist/assets/manager-shortcuts-BDOzd8zm.js +0 -1
- package/public/dist/assets/memory-Bk_cb3sw.js +0 -1
- package/public/dist/assets/message-history-D2vniu04.js +0 -4
- package/public/dist/assets/message-history-GAtF_wbZ.js +0 -1
- package/public/dist/assets/page-shell-BeGD0rRQ.js +0 -1
- package/public/dist/assets/react-dom-DyUOYpVL.js +0 -1
- package/public/dist/assets/settings-W4KG9ivu.js +0 -1
- package/public/dist/assets/settings-WVGhtneN.js +0 -1
- package/public/dist/assets/settings-client-CmwRsVd1.js +0 -1
- package/public/dist/assets/settings-core-CgKGnMA5.js +0 -1
- package/public/dist/assets/settings-types-D3cd6SWy.js +0 -1
- package/public/dist/assets/shared-CiNP20HB.js +0 -1
- package/public/dist/assets/skills-Co7Mr-qP.js +0 -1
- package/public/dist/assets/slash-commands-BEr-vmIr.js +0 -1
- package/public/dist/assets/ui-TUyJsMUf.js +0 -1
- package/public/manager/src/settings/pages/components/EngineSubsection.tsx +0 -25
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e={command:[`command`,`cmd`],path:[`file_path`,`path`,`file`],url:[`url`],query:[`pattern`,`query`]},t=[`description`],n=Object.values(e).flat(),r={};for(let[t,n]of Object.entries(e))for(let e of n)r[e]=t;function i(e){let t=e?.trim();if(!t||!t.startsWith(`{`))return null;try{let e=JSON.parse(t);return typeof e==`object`&&e&&!Array.isArray(e)?e:null}catch{return null}}function a(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t}return null}function o(e){let o=i(e);if(o){let e=a(o,t);for(let t of n){let n=a(o,[t]);if(n!==null)return{object:o,value:n,key:t,field:r[t],description:e}}return{object:o,value:null,key:null,field:null,description:e}}let s=e?.trim()??``;if(s.startsWith(`{`)){let e=c(s,n),i=c(s,t)?.value??null;if(e)return{object:null,value:e.value,key:e.key,field:r[e.key],description:i};if(i)return{object:null,value:null,key:null,field:null,description:i}}return{object:null,value:null,key:null,field:null,description:null}}function s(e){let t={n:`
|
|
2
|
+
`,t:` `,r:`\r`,'"':`"`,"\\":`\\`,"/":`/`,b:`\b`,f:`\f`},n=``;for(let r=0;r<e.length;r++){let i=e[r];if(i!==`\\`){n+=i;continue}let a=e[r+1];if(a===void 0)break;if(t[a]!==void 0){n+=t[a],r++;continue}if(a===`u`){let t=e.slice(r+2,r+6);if(!/^[0-9a-fA-F]{4}$/.test(t))break;n+=String.fromCharCode(Number.parseInt(t,16)),r+=5;continue}n+=a,r++}return n}function c(e,t){for(let n of t){let t=RegExp(`"${n}"\\s*:\\s*"`).exec(e);if(!t)continue;let r=``;for(let n=t.index+t[0].length;n<e.length;n++){let t=e[n];if(t===`\\`&&n+1<e.length){r+=t+e[++n];continue}if(t===`"`)break;r+=t}let i=s(r).trim();if(i)return{key:n,value:i}}return null}function l(e){return(e.split(/\r?\n/).find(e=>e.trim())??``).replace(/\s+/g,` `).trim()}function u(e){let t=i(e);return t?JSON.stringify(t,null,2):e}export{a,u as c,l as i,e as n,i as o,n as r,o as s,t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./bounded-api-DdpT93LB.js";import{O as t}from"./render-
|
|
1
|
+
import{n as e}from"./bounded-api-DdpT93LB.js";import{O as t}from"./render-DfYro-fG.js";import{r as n}from"./provider-icons-Bge6teOj.js";var r=80,i=16777216,a=``,o=0,s=0,c=!1,l=null,u=0,d=!1,f=0,p=null,m=null,h=null,g=null,_=null;function v(e){return e.eventType||e.event_type||`event`}function y(e,t=a){return e===f&&t===a}function b(e){return m?e+(e.includes(`?`)?`&`:`?`)+new URLSearchParams({session:m}):e}async function x(t,n){let r=await e(t,{method:`GET`},n,i);if(r&&typeof r==`object`&&`ok`in r){if(r.ok!==!0||!(`data`in r))throw Error(`trace_unavailable`);return r.data}if(!r||typeof r!=`object`)throw Error(`trace_unavailable`);return r}function S(){let e=document.getElementById(`traceDrawerOverlay`);return e||(e=document.createElement(`div`),e.id=`traceDrawerOverlay`,e.className=`trace-drawer-overlay`,e.innerHTML=`<aside class="trace-drawer" role="dialog" aria-modal="true" aria-labelledby="traceDrawerTitle">
|
|
2
2
|
<header class="trace-drawer-header">
|
|
3
3
|
<div><p class="trace-drawer-kicker">Raw trace</p><h2 id="traceDrawerTitle">Trace</h2></div>
|
|
4
4
|
<button class="trace-drawer-close" type="button" aria-label="Close trace drawer">×</button>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{p as e}from"./iframe-renderer-DmHYOI1A.js";import{I as t,s as n}from"./message-history-DcjBuubA.js";import{r}from"./ui-D8xzm7DN.js";export{r as cleanupToolActivity,n as loadMessages,e as reconcileChatBottomAfterRestore,t as updateQueueBadge};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-render-DSSkXCir.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{t as e}from"./state-Dl-xxPoS.js";import{t}from"./preload-helper-CfbQpVni.js";import{E as n,T as r,k as i,t as a}from"./render-Dp07lZAJ.js";import{a as o,n as s}from"./icons-CVkqyECl.js";import{A as c,C as l,D as u,N as d,O as f,S as p,_ as ee,b as m,k as h,m as g,t as _,v,w as y,x as b}from"./iframe-renderer-Bj1JolO8.js";import{B as x,F as S,G as C,H as w,J as T,K as E,L as te,P as ne,Q as D,R as re,U as ie,V as O,W as k,Y as A,Z as j,a as ae,l as oe,q as M,z as N}from"./message-history-D2vniu04.js";import{c as se}from"./idb-cache-BRpjf_a8.js";var P=2e3,F=80,ce=400;function le(e){if(e<=P)return F;let t=e/P*F;return Math.min(ce,Math.round(t))}function I(e){return{chunks:[],fullText:``,textDirty:!1,element:e,pendingRAF:null,isFinalized:!1,lastRenderTime:0}}function ue(e,t=``){let n=I(e);return t?(n.chunks=[t],n.fullText=t,n.textDirty=!1,n.element.innerHTML=a(t,!0)+`<span class="stream-cursor" aria-hidden="true"></span>`):n.element.innerHTML=`<span class="stream-cursor" aria-hidden="true"></span>`,n}function L(e){return e.textDirty&&=(e.fullText=e.chunks.join(``),!1),e.fullText}function R(e,t){e.chunks.push(t),e.textDirty=!0,!e.pendingRAF&&!e.isFinalized&&(e.pendingRAF=requestAnimationFrame(()=>{if(e.pendingRAF=null,e.isFinalized)return;let t=performance.now(),n=L(e);n.length<P||t-e.lastRenderTime>le(n.length)?(e.element.innerHTML=a(n,!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=t):e.pendingRAF=requestAnimationFrame(()=>{e.pendingRAF=null,!e.isFinalized&&(e.element.innerHTML=a(L(e),!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=performance.now())})}))}function z(e,t=!1){e.isFinalized=!0,e.pendingRAF&&=(cancelAnimationFrame(e.pendingRAF),null);let n=L(e);return t||(e.element.innerHTML=a(n)),n}function B(e){return typeof e.traceSeq==`number`&&Number.isFinite(e.traceSeq)&&e.traceSeq>0}function V(e,t){return!!t.traceRunId&&!!e.traceRunId&&t.traceRunId===e.traceRunId&&B(t)&&B(e)&&t.traceSeq===e.traceSeq&&t.type===e.type&&t.label===e.label&&!!t.isEmployee==!!e.isEmployee}function H(e,t){return t.stepRef&&e.stepRef===t.stepRef?!0:V(e,t)}function U(e,t,n={}){return[...e].reverse().filter(e=>n.includeDone||e.status===`running`).find(e=>H(e,t))??null}function de(e,t){let n=e.filter(e=>e.status===`running`&&!e.stepRef&&e.label===t.label&&e.type===t.type&&!!e.isEmployee==!!t.isEmployee);return n.length===1?n[0]:null}function fe(e,t){let n=[...e].reverse().filter(e=>e.status===`running`);return U(n,t)||de(n,t)}function pe(){e.currentProcessBlock&&u(e.currentProcessBlock),e.currentAgentDiv instanceof HTMLElement&&u(e.currentAgentDiv),D(),c(),e.currentAgentDiv=null,e.currentProcessBlock=null,q=null}var W=0;function me(){W=Date.now()}function he(){W=0}function ge(){return Date.now()-W<8e3}function G(e){for(let t of document.querySelectorAll(`.msg-user`))if(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING)return!0;return!1}function K(){let t=e.currentAgentDiv&&e.currentAgentDiv.isConnected?e.currentAgentDiv:null;return t?G(t)?(e.currentAgentDiv=null,e.currentProcessBlock=null,q=null,null):t:null}function _e(){let e=Array.from(document.querySelectorAll(`.msg-agent`)).at(-1)??null;return!e||G(e)?null:e}function ve(t,n){k();let r=K();if(r||(r=w(`agent`,``),e.currentAgentDiv=r,e.currentProcessBlock=null),M(r),!e.currentProcessBlock){let t=r.querySelector(`.agent-body`);t&&(e.currentProcessBlock=C(r)),!e.currentProcessBlock&&t&&(T(r),e.currentProcessBlock=p(t))}if(n&&e.currentProcessBlock&&!e.currentProcessBlock.startedAt&&(e.currentProcessBlock.startedAt=n),e.currentProcessBlock){let n=t.rawIcon||t.icon,r=t.status||s(t.icon)||`running`;if(r===`done`||r===`error`){let i=fe(e.currentProcessBlock.steps,t);if(i){t.icon=o(t.icon);let a=t.type===`thinking`?h(i.id,t.detail):y(i.id,t.detail);f(e.currentProcessBlock,i.id,{...i,...t,id:i.id,rawIcon:n,detail:a,detailPreview:a,label:t.label||i.label,status:r,startTime:i.startTime}),g();return}if(t.stepRef&&(r===`done`||r===`error`)){let i=[...e.currentProcessBlock.steps].reverse().find(e=>e.stepRef===t.stepRef&&(e.status===`done`||e.status===`error`));if(i){t.icon=o(t.icon);let a=t.type===`thinking`?h(i.id,t.detail):y(i.id,t.detail);f(e.currentProcessBlock,i.id,{...i,...t,id:i.id,rawIcon:n,status:r,detail:a,detailPreview:a,startTime:i.startTime}),g();return}}}if(t.stepRef&&r===`running`){let r=[...e.currentProcessBlock.steps].reverse().find(e=>e.stepRef===t.stepRef&&e.status===`running`);if(r){t.rawIcon=n,t.icon=o(t.icon);let i=h(r.id,t.detail);f(e.currentProcessBlock,r.id,{...r,...t,id:r.id,rawIcon:n,status:`running`,detail:i,detailPreview:i,label:t.label||r.label,startTime:r.startTime}),g();return}}let i=U(e.currentProcessBlock.steps,t,{includeDone:!0});if(i){t.rawIcon=n,t.icon=o(t.icon);let a=t.detail||``,s=l(i.id)||i.detail||i.detailPreview||``,c=a.length>=s.length?a:s,u=h(i.id,c),d=(i.status===`done`||i.status===`error`)&&r===`running`?i.status:r;f(e.currentProcessBlock,i.id,{...i,...t,id:i.id,rawIcon:n,status:d,detail:u,detailPreview:u,label:t.label||i.label,startTime:i.startTime}),g();return}if(t.detail){let n=[...e.currentProcessBlock.steps].reverse().find(e=>e.status===`running`&&e.label===t.label&&e.type===t.type&&!!e.isEmployee==!!t.isEmployee&&!e.detail);if(n){f(e.currentProcessBlock,n.id,t),g();return}}t.rawIcon=n,t.icon=o(t.icon),v(e.currentProcessBlock,t)}g()}var q=null,J=`data-active-run-hydrated`;function Y(e){document.querySelectorAll(`[${J}="true"]`).forEach(t=>{e&&t===e||t.remove()})}function ye(e){let t=K()??_e();Y(t);let n=t||w(`agent`,``,e||null);return n.setAttribute(J,`true`),n}function be(e,t){let n=l(e.id)||e.detail||e.detailPreview||``,r=t.detail||t.detailPreview||``;return r.length>=n.length?r:n}function X(e){return e.stepRef?!0:!!e.traceRunId&&typeof e.traceSeq==`number`&&Number.isFinite(e.traceSeq)&&e.traceSeq>0}function xe(e,t){let n=e.steps.filter(e=>!X(e)),r=0,i=!0;for(let a of t){let t=e.steps.find(e=>H(e,a))??null;if(!t&&!X(a)&&i){let e=n[r]??null;e?e.type===a.type&&!!e.isEmployee==!!a.isEmployee?(t=e,r++):i=!1:r++}if(!t){let n=e.steps.filter(e=>e.label===a.label&&e.type===a.type&&!!e.isEmployee==!!a.isEmployee);t=n.length===1?n[0]:null}if(!t){if(v(e,a),!X(a)&&i){let t=e.steps[e.steps.length-1];t&&n.push(t)}continue}let o=h(t.id,be(t,a));f(e,t.id,{...t,...a,id:t.id,detail:o,detailPreview:o,label:a.label||t.label})}}function Se(e=[]){document.querySelectorAll(`[data-queued-overlay="true"]`).forEach(e=>e.remove())}var Z=``;function Ce(e){let t=Array.isArray(e.toolLog)?e.toolLog:[],n=t.map(e=>`${e.stepRef||``}~${e.traceRunId||``}~${e.traceSeq??``}~${e.status||``}~${e.label||``}~${(e.detail||``).length}`).join(`|`);return`${e.traceRunId||``}:${e.cli||``}:${(e.text||``).length}:${t.length}:${n}`}function we(t){if(!t?.running){Z=``,Y();return}let n=Ce(t);if(n===Z&&K())return;D(),k(),e.currentAgentDiv=ye(t.cli||null);let r=e.currentAgentDiv.querySelector(`.agent-body`),i=N(t.toolLog||[]);M(e.currentAgentDiv),e.currentProcessBlock=C(e.currentAgentDiv),r&&i.length?(e.currentProcessBlock||(T(e.currentAgentDiv),e.currentProcessBlock=p(r)),t.startedAt&&(e.currentProcessBlock.startedAt=t.startedAt),xe(e.currentProcessBlock,O(i,t.startedAt))):e.currentProcessBlock=C(e.currentAgentDiv);let a=e.currentAgentDiv.querySelector(`.msg-content`);a&&(q=ue(a,t.text||``)),Z=n}function Q(t){if(!t)return;k(),K()||(e.currentAgentDiv=w(`agent`,``),q=null);let n=e.currentAgentDiv?.querySelector(`.msg-content`);n&&(q||=I(n),R(q,t)),g()}var $=0;function Te(e){e.querySelectorAll(`.mermaid-pending`).forEach(e=>{delete e.dataset.mermaidQueued,delete e.dataset.mermaidQueuedAt})}function Ee(e,t){let o=e.querySelector(`.msg-content`);if(!o)return;let s=i(t);(o.getAttribute(`data-raw`)!==s||!s&&o.childNodes.length!==0)&&(r(o),o.innerHTML=s?a(t):``,o.setAttribute(`data-raw`,s),o.classList.remove(`lazy-pending`),_(o),n(o,{immediate:!0}))}function De(t,r,o,s,c,l){let f=o===`present`||o===`absent`,p=Date.now();if(!e.currentAgentDiv&&p-$<500)return;Z=``,D(),k(),e.currentAgentDiv&&M(e.currentAgentDiv);let h=A(e.currentProcessBlock??e.currentAgentDiv,!0),g=N(re(Array.isArray(r)?r:[],h)),v=x(g),y=!!e.currentProcessBlock||!!(e.currentAgentDiv&&E(e.currentAgentDiv));e.currentProcessBlock&&(b(e.currentProcessBlock),e.currentProcessBlock=null);let C=g.length>0;if(t||C||f){(!e.currentAgentDiv||!e.currentAgentDiv.isConnected)&&(e.currentAgentDiv=w(`agent`,``));let r=!!(e.currentAgentDiv.dataset.activityKey||e.currentAgentDiv.dataset.activityAnswerPending||s&&l&&e.currentAgentDiv.dataset.traceRunId===s&&e.currentAgentDiv.dataset.messageSessionId===l);s&&(e.currentAgentDiv.dataset.traceRunId=s),delete e.currentAgentDiv.dataset.activityRecovering,e.currentAgentDiv.removeAttribute(J);let o=e.currentAgentDiv?.querySelector(`.msg-content`),p=q?z(q,!0):``,h=f?t??``:t||p;if(q=null,o&&(o.innerHTML=f&&!h?``:a(h)),C&&e.currentAgentDiv&&!y&&!E(e.currentAgentDiv)){let t=e.currentAgentDiv.querySelector(`.msg-content`);t&&t.insertAdjacentHTML(`beforebegin`,m(O(g),!0))}e.currentAgentDiv&&M(e.currentAgentDiv),o&&o.setAttribute(`data-raw`,i(h)),o&&_(o);let b=ee(),x=!!(b.active&&e.currentAgentDiv&&e.currentAgentDiv.isConnected);if(o&&!x&&n(o,{immediate:!0}),x){let t=e.currentAgentDiv;Te(t),t.querySelectorAll(`.diagram-widget`).forEach(e=>{let t=e,n=t.dataset.widgetHtml,r=t.dataset.widgetId;if(!n&&!r)return;let i=document.createElement(`div`);i.className=`diagram-widget-pending`,r?i.dataset.widgetId=r:n&&(i.dataset.diagramHtml=n),e.replaceWith(i)}),v&&!r?(b.onLazyRender||oe(b),b.appendItem(te({role:`assistant`,content:h,cli:null,tool_log:v,trace_run_id:t.dataset.traceRunId??null},b.count)),u(t),b.scrollToBottom()):(t.dataset.turnIndex=String(b.count),t.dataset.messageId||(t.dataset.messageId=d()),r&&ae(b),b.appendLiveItem(t)),t.remove()}(h||s&&r)&&se({role:`assistant`,content:h,tool_log:v,trace_run_id:e.currentAgentDiv?.dataset.traceRunId??null,timestamp:Date.now(),...c===void 0?{}:{scope:c},...l===void 0?{}:{session_id:l}}).catch(()=>{})}q=null,e.currentAgentDiv=null,$=Date.now(),S(`idle`),ne()}function Oe(e,n){document.querySelectorAll(`.tab-btn`).forEach(e=>{e.classList.remove(`active`),e.setAttribute(`aria-selected`,`false`)}),document.querySelectorAll(`.tab-content`).forEach(e=>e.classList.remove(`active`)),document.getElementById({agents:`tabAgents`,settings:`tabSettings`,skills:`tabSkills`}[e])?.classList.add(`active`),n&&(n.classList.add(`active`),n.setAttribute(`aria-selected`,`true`)),e===`agents`&&t(()=>import(`./employees-BQaJNp-u.js`).then(e=>e.loadEmployees()),__vite__mapDeps([0])),e===`skills`&&t(()=>import(`./skills-Co7Mr-qP.js`).then(e=>e.loadSkills()),__vite__mapDeps([0]))}function ke(){document.getElementById(`tabSettings`)?.classList.contains(`active`)||t(()=>import(`./settings-WVGhtneN.js`).then(e=>e.updateSettings()),__vite__mapDeps([0]))}function Ae(){j({onStatus:ie})}export{De as a,Ae as c,Ee as d,ve as f,he as i,ge as l,Se as n,ke as o,Oe as p,pe as r,we as s,Q as t,me as u};
|
|
2
|
+
import{t as e}from"./state-Dl-xxPoS.js";import{t}from"./preload-helper-CfbQpVni.js";import{E as n,T as r,k as i,t as a}from"./render-DfYro-fG.js";import{a as o,n as s}from"./icons-CVkqyECl.js";import{A as c,C as l,D as u,N as d,O as f,S as p,_ as ee,b as m,k as h,m as g,t as _,v,w as y,x as b}from"./iframe-renderer-DmHYOI1A.js";import{B as x,F as S,G as C,H as w,J as T,K as E,L as te,P as ne,Q as D,R as re,U as ie,V as O,W as k,Y as A,Z as j,a as ae,l as oe,q as M,z as N}from"./message-history-DcjBuubA.js";import{c as se}from"./idb-cache-BRpjf_a8.js";var P=2e3,F=80,ce=400;function le(e){if(e<=P)return F;let t=e/P*F;return Math.min(ce,Math.round(t))}function I(e){return{chunks:[],fullText:``,textDirty:!1,element:e,pendingRAF:null,isFinalized:!1,lastRenderTime:0}}function ue(e,t=``){let n=I(e);return t?(n.chunks=[t],n.fullText=t,n.textDirty=!1,n.element.innerHTML=a(t,!0)+`<span class="stream-cursor" aria-hidden="true"></span>`):n.element.innerHTML=`<span class="stream-cursor" aria-hidden="true"></span>`,n}function L(e){return e.textDirty&&=(e.fullText=e.chunks.join(``),!1),e.fullText}function R(e,t){e.chunks.push(t),e.textDirty=!0,!e.pendingRAF&&!e.isFinalized&&(e.pendingRAF=requestAnimationFrame(()=>{if(e.pendingRAF=null,e.isFinalized)return;let t=performance.now(),n=L(e);n.length<P||t-e.lastRenderTime>le(n.length)?(e.element.innerHTML=a(n,!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=t):e.pendingRAF=requestAnimationFrame(()=>{e.pendingRAF=null,!e.isFinalized&&(e.element.innerHTML=a(L(e),!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=performance.now())})}))}function z(e,t=!1){e.isFinalized=!0,e.pendingRAF&&=(cancelAnimationFrame(e.pendingRAF),null);let n=L(e);return t||(e.element.innerHTML=a(n)),n}function B(e){return typeof e.traceSeq==`number`&&Number.isFinite(e.traceSeq)&&e.traceSeq>0}function V(e,t){return!!t.traceRunId&&!!e.traceRunId&&t.traceRunId===e.traceRunId&&B(t)&&B(e)&&t.traceSeq===e.traceSeq&&t.type===e.type&&t.label===e.label&&!!t.isEmployee==!!e.isEmployee}function H(e,t){return t.stepRef&&e.stepRef===t.stepRef?!0:V(e,t)}function U(e,t,n={}){return[...e].reverse().filter(e=>n.includeDone||e.status===`running`).find(e=>H(e,t))??null}function de(e,t){let n=e.filter(e=>e.status===`running`&&!e.stepRef&&e.label===t.label&&e.type===t.type&&!!e.isEmployee==!!t.isEmployee);return n.length===1?n[0]:null}function fe(e,t){let n=[...e].reverse().filter(e=>e.status===`running`);return U(n,t)||de(n,t)}function pe(){e.currentProcessBlock&&u(e.currentProcessBlock),e.currentAgentDiv instanceof HTMLElement&&u(e.currentAgentDiv),D(),c(),e.currentAgentDiv=null,e.currentProcessBlock=null,q=null}var W=0;function me(){W=Date.now()}function he(){W=0}function ge(){return Date.now()-W<8e3}function G(e){for(let t of document.querySelectorAll(`.msg-user`))if(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING)return!0;return!1}function K(){let t=e.currentAgentDiv&&e.currentAgentDiv.isConnected?e.currentAgentDiv:null;return t?G(t)?(e.currentAgentDiv=null,e.currentProcessBlock=null,q=null,null):t:null}function _e(){let e=Array.from(document.querySelectorAll(`.msg-agent`)).at(-1)??null;return!e||G(e)?null:e}function ve(t,n){k();let r=K();if(r||(r=w(`agent`,``),e.currentAgentDiv=r,e.currentProcessBlock=null),M(r),!e.currentProcessBlock){let t=r.querySelector(`.agent-body`);t&&(e.currentProcessBlock=C(r)),!e.currentProcessBlock&&t&&(T(r),e.currentProcessBlock=p(t))}if(n&&e.currentProcessBlock&&!e.currentProcessBlock.startedAt&&(e.currentProcessBlock.startedAt=n),e.currentProcessBlock){let n=t.rawIcon||t.icon,r=t.status||s(t.icon)||`running`;if(r===`done`||r===`error`){let i=fe(e.currentProcessBlock.steps,t);if(i){t.icon=o(t.icon);let a=t.type===`thinking`?h(i.id,t.detail):y(i.id,t.detail);f(e.currentProcessBlock,i.id,{...i,...t,id:i.id,rawIcon:n,detail:a,detailPreview:a,label:t.label||i.label,status:r,startTime:i.startTime}),g();return}if(t.stepRef&&(r===`done`||r===`error`)){let i=[...e.currentProcessBlock.steps].reverse().find(e=>e.stepRef===t.stepRef&&(e.status===`done`||e.status===`error`));if(i){t.icon=o(t.icon);let a=t.type===`thinking`?h(i.id,t.detail):y(i.id,t.detail);f(e.currentProcessBlock,i.id,{...i,...t,id:i.id,rawIcon:n,status:r,detail:a,detailPreview:a,startTime:i.startTime}),g();return}}}if(t.stepRef&&r===`running`){let r=[...e.currentProcessBlock.steps].reverse().find(e=>e.stepRef===t.stepRef&&e.status===`running`);if(r){t.rawIcon=n,t.icon=o(t.icon);let i=h(r.id,t.detail);f(e.currentProcessBlock,r.id,{...r,...t,id:r.id,rawIcon:n,status:`running`,detail:i,detailPreview:i,label:t.label||r.label,startTime:r.startTime}),g();return}}let i=U(e.currentProcessBlock.steps,t,{includeDone:!0});if(i){t.rawIcon=n,t.icon=o(t.icon);let a=t.detail||``,s=l(i.id)||i.detail||i.detailPreview||``,c=a.length>=s.length?a:s,u=h(i.id,c),d=(i.status===`done`||i.status===`error`)&&r===`running`?i.status:r;f(e.currentProcessBlock,i.id,{...i,...t,id:i.id,rawIcon:n,status:d,detail:u,detailPreview:u,label:t.label||i.label,startTime:i.startTime}),g();return}if(t.detail){let n=[...e.currentProcessBlock.steps].reverse().find(e=>e.status===`running`&&e.label===t.label&&e.type===t.type&&!!e.isEmployee==!!t.isEmployee&&!e.detail);if(n){f(e.currentProcessBlock,n.id,t),g();return}}t.rawIcon=n,t.icon=o(t.icon),v(e.currentProcessBlock,t)}g()}var q=null,J=`data-active-run-hydrated`;function Y(e){document.querySelectorAll(`[${J}="true"]`).forEach(t=>{e&&t===e||t.remove()})}function ye(e){let t=K()??_e();Y(t);let n=t||w(`agent`,``,e||null);return n.setAttribute(J,`true`),n}function be(e,t){let n=l(e.id)||e.detail||e.detailPreview||``,r=t.detail||t.detailPreview||``;return r.length>=n.length?r:n}function X(e){return e.stepRef?!0:!!e.traceRunId&&typeof e.traceSeq==`number`&&Number.isFinite(e.traceSeq)&&e.traceSeq>0}function xe(e,t){let n=e.steps.filter(e=>!X(e)),r=0,i=!0;for(let a of t){let t=e.steps.find(e=>H(e,a))??null;if(!t&&!X(a)&&i){let e=n[r]??null;e?e.type===a.type&&!!e.isEmployee==!!a.isEmployee?(t=e,r++):i=!1:r++}if(!t){let n=e.steps.filter(e=>e.label===a.label&&e.type===a.type&&!!e.isEmployee==!!a.isEmployee);t=n.length===1?n[0]:null}if(!t){if(v(e,a),!X(a)&&i){let t=e.steps[e.steps.length-1];t&&n.push(t)}continue}let o=h(t.id,be(t,a));f(e,t.id,{...t,...a,id:t.id,detail:o,detailPreview:o,label:a.label||t.label})}}function Se(e=[]){document.querySelectorAll(`[data-queued-overlay="true"]`).forEach(e=>e.remove())}var Z=``;function Ce(e){let t=Array.isArray(e.toolLog)?e.toolLog:[],n=t.map(e=>`${e.stepRef||``}~${e.traceRunId||``}~${e.traceSeq??``}~${e.status||``}~${e.label||``}~${(e.detail||``).length}`).join(`|`);return`${e.traceRunId||``}:${e.cli||``}:${(e.text||``).length}:${t.length}:${n}`}function we(t){if(!t?.running){Z=``,Y();return}let n=Ce(t);if(n===Z&&K())return;D(),k(),e.currentAgentDiv=ye(t.cli||null);let r=e.currentAgentDiv.querySelector(`.agent-body`),i=N(t.toolLog||[]);M(e.currentAgentDiv),e.currentProcessBlock=C(e.currentAgentDiv),r&&i.length?(e.currentProcessBlock||(T(e.currentAgentDiv),e.currentProcessBlock=p(r)),t.startedAt&&(e.currentProcessBlock.startedAt=t.startedAt),xe(e.currentProcessBlock,O(i,t.startedAt))):e.currentProcessBlock=C(e.currentAgentDiv);let a=e.currentAgentDiv.querySelector(`.msg-content`);a&&(q=ue(a,t.text||``)),Z=n}function Q(t){if(!t)return;k(),K()||(e.currentAgentDiv=w(`agent`,``),q=null);let n=e.currentAgentDiv?.querySelector(`.msg-content`);n&&(q||=I(n),R(q,t)),g()}var $=0;function Te(e){e.querySelectorAll(`.mermaid-pending`).forEach(e=>{delete e.dataset.mermaidQueued,delete e.dataset.mermaidQueuedAt})}function Ee(e,t){let o=e.querySelector(`.msg-content`);if(!o)return;let s=i(t);(o.getAttribute(`data-raw`)!==s||!s&&o.childNodes.length!==0)&&(r(o),o.innerHTML=s?a(t):``,o.setAttribute(`data-raw`,s),o.classList.remove(`lazy-pending`),_(o),n(o,{immediate:!0}))}function De(t,r,o,s,c,l){let f=o===`present`||o===`absent`,p=Date.now();if(!e.currentAgentDiv&&p-$<500)return;Z=``,D(),k(),e.currentAgentDiv&&M(e.currentAgentDiv);let h=A(e.currentProcessBlock??e.currentAgentDiv,!0),g=N(re(Array.isArray(r)?r:[],h)),v=x(g),y=!!e.currentProcessBlock||!!(e.currentAgentDiv&&E(e.currentAgentDiv));e.currentProcessBlock&&(b(e.currentProcessBlock),e.currentProcessBlock=null);let C=g.length>0;if(t||C||f){(!e.currentAgentDiv||!e.currentAgentDiv.isConnected)&&(e.currentAgentDiv=w(`agent`,``));let r=!!(e.currentAgentDiv.dataset.activityKey||e.currentAgentDiv.dataset.activityAnswerPending||s&&l&&e.currentAgentDiv.dataset.traceRunId===s&&e.currentAgentDiv.dataset.messageSessionId===l);s&&(e.currentAgentDiv.dataset.traceRunId=s),delete e.currentAgentDiv.dataset.activityRecovering,e.currentAgentDiv.removeAttribute(J);let o=e.currentAgentDiv?.querySelector(`.msg-content`),p=q?z(q,!0):``,h=f?t??``:t||p;if(q=null,o&&(o.innerHTML=f&&!h?``:a(h)),C&&e.currentAgentDiv&&!y&&!E(e.currentAgentDiv)){let t=e.currentAgentDiv.querySelector(`.msg-content`);t&&t.insertAdjacentHTML(`beforebegin`,m(O(g),!0))}e.currentAgentDiv&&M(e.currentAgentDiv),o&&o.setAttribute(`data-raw`,i(h)),o&&_(o);let b=ee(),x=!!(b.active&&e.currentAgentDiv&&e.currentAgentDiv.isConnected);if(o&&!x&&n(o,{immediate:!0}),x){let t=e.currentAgentDiv;Te(t),t.querySelectorAll(`.diagram-widget`).forEach(e=>{let t=e,n=t.dataset.widgetHtml,r=t.dataset.widgetId;if(!n&&!r)return;let i=document.createElement(`div`);i.className=`diagram-widget-pending`,r?i.dataset.widgetId=r:n&&(i.dataset.diagramHtml=n),e.replaceWith(i)}),v&&!r?(b.onLazyRender||oe(b),b.appendItem(te({role:`assistant`,content:h,cli:null,tool_log:v,trace_run_id:t.dataset.traceRunId??null},b.count)),u(t),b.scrollToBottom()):(t.dataset.turnIndex=String(b.count),t.dataset.messageId||(t.dataset.messageId=d()),r&&ae(b),b.appendLiveItem(t)),t.remove()}(h||s&&r)&&se({role:`assistant`,content:h,tool_log:v,trace_run_id:e.currentAgentDiv?.dataset.traceRunId??null,timestamp:Date.now(),...c===void 0?{}:{scope:c},...l===void 0?{}:{session_id:l}}).catch(()=>{})}q=null,e.currentAgentDiv=null,$=Date.now(),S(`idle`),ne()}function Oe(e,n){document.querySelectorAll(`.tab-btn`).forEach(e=>{e.classList.remove(`active`),e.setAttribute(`aria-selected`,`false`)}),document.querySelectorAll(`.tab-content`).forEach(e=>e.classList.remove(`active`)),document.getElementById({agents:`tabAgents`,settings:`tabSettings`,skills:`tabSkills`}[e])?.classList.add(`active`),n&&(n.classList.add(`active`),n.setAttribute(`aria-selected`,`true`)),e===`agents`&&t(()=>import(`./employees-CsvI0_5V.js`).then(e=>e.loadEmployees()),__vite__mapDeps([0])),e===`skills`&&t(()=>import(`./skills-DeNVAVgt.js`).then(e=>e.loadSkills()),__vite__mapDeps([0]))}function ke(){document.getElementById(`tabSettings`)?.classList.contains(`active`)||t(()=>import(`./settings-DgAlohx9.js`).then(e=>e.updateSettings()),__vite__mapDeps([0]))}function Ae(){j({onStatus:ie})}export{De as a,Ae as c,Ee as d,ve as f,he as i,ge as l,Se as n,ke as o,Oe as p,pe as r,we as s,Q as t,me as u};
|
package/public/dist/index.html
CHANGED
|
@@ -10,11 +10,17 @@
|
|
|
10
10
|
localStorage.setItem('jaw.uiTheme', localStorage.getItem('theme'));
|
|
11
11
|
localStorage.removeItem('theme');
|
|
12
12
|
}
|
|
13
|
-
var
|
|
13
|
+
var params = new URLSearchParams(location.search);
|
|
14
|
+
var q = params.get('jawTheme');
|
|
14
15
|
var raw = (q === 'dark' || q === 'light') ? q : localStorage.getItem('jaw.uiTheme');
|
|
15
16
|
var t = (raw === 'dark' || raw === 'light') ? raw :
|
|
16
17
|
(matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');
|
|
17
18
|
document.documentElement.setAttribute('data-theme', t);
|
|
19
|
+
// The desktop shell's preload can't mark this document when it loads in
|
|
20
|
+
// a cross-origin iframe, so the manager passes the flag on the URL.
|
|
21
|
+
if (params.get('jawDesktop') === '1') {
|
|
22
|
+
document.documentElement.setAttribute('data-cli-jaw-desktop', 'true');
|
|
23
|
+
}
|
|
18
24
|
})();
|
|
19
25
|
</script>
|
|
20
26
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
|
|
@@ -31,9 +37,9 @@
|
|
|
31
37
|
href="https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@400;500;600;700&family=Outfit:wght@400;500;600;700&display=swap"
|
|
32
38
|
rel="stylesheet">
|
|
33
39
|
<!-- Vite handles module bundling in dev (HMR) and production (build) -->
|
|
34
|
-
<script type="module" crossorigin src="/dist/assets/app-
|
|
40
|
+
<script type="module" crossorigin src="/dist/assets/app-CZwx0V6K.js"></script>
|
|
35
41
|
<link rel="stylesheet" crossorigin href="/dist/assets/vendor-render-DSSkXCir.css">
|
|
36
|
-
<link rel="stylesheet" crossorigin href="/dist/assets/app-
|
|
42
|
+
<link rel="stylesheet" crossorigin href="/dist/assets/app-BjKzqXCv.css">
|
|
37
43
|
</head>
|
|
38
44
|
|
|
39
45
|
<body>
|
|
@@ -246,6 +252,8 @@
|
|
|
246
252
|
<div class="chat-input-area">
|
|
247
253
|
<div id="cmdDropdown" class="cmd-dropdown" role="listbox" data-i18n-aria="aria.cmdList" aria-label="커맨드 목록"
|
|
248
254
|
style="display:none"></div>
|
|
255
|
+
<div id="skillMentionDropdown" class="cmd-dropdown" role="listbox" data-i18n-aria="aria.skillMentionList"
|
|
256
|
+
aria-label="스킬 목록" style="display:none"></div>
|
|
249
257
|
<button class="btn-attach" data-i18n-title="btn.attach" title="파일 첨부"><span data-icon="paperclip"></span></button>
|
|
250
258
|
<input type="file" id="fileInput" hidden multiple>
|
|
251
259
|
<button class="btn-voice" id="btnVoice" aria-describedby="voiceShortcutHint" data-i18n-title="voice.start" title="음성 녹음"><span data-icon="mic"></span></button>
|
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
<link rel="icon" type="image/png" href="/dist/assets/icon-192-CADbZUeU.png">
|
|
7
7
|
<title>Jaw Manager</title>
|
|
8
8
|
<script src="/manager/theme-boot.js"></script>
|
|
9
|
-
<script type="module" crossorigin src="/dist/assets/manager-
|
|
9
|
+
<script type="module" crossorigin src="/dist/assets/manager-CCXm5Yfe.js"></script>
|
|
10
10
|
<link rel="stylesheet" crossorigin href="/dist/assets/vendor-render-DSSkXCir.css">
|
|
11
|
-
<link rel="stylesheet" crossorigin href="/dist/assets/settings-embedding-
|
|
12
|
-
<link rel="stylesheet" crossorigin href="/dist/assets/manager-
|
|
11
|
+
<link rel="stylesheet" crossorigin href="/dist/assets/settings-embedding-CUQ8Is3y.css">
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/dist/assets/manager-D9rhKFKc.css">
|
|
13
13
|
</head>
|
|
14
14
|
<body>
|
|
15
15
|
<div id="manager-root"></div>
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>Settings</title>
|
|
7
7
|
<script src="/manager/theme-boot.js"></script>
|
|
8
|
-
<script type="module" crossorigin src="/dist/assets/settings-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/dist/assets/settings-embedding-
|
|
8
|
+
<script type="module" crossorigin src="/dist/assets/settings-DMiQe469.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/dist/assets/settings-embedding-CUQ8Is3y.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="settings-root"></div>
|
package/public/index.html
CHANGED
|
@@ -10,11 +10,17 @@
|
|
|
10
10
|
localStorage.setItem('jaw.uiTheme', localStorage.getItem('theme'));
|
|
11
11
|
localStorage.removeItem('theme');
|
|
12
12
|
}
|
|
13
|
-
var
|
|
13
|
+
var params = new URLSearchParams(location.search);
|
|
14
|
+
var q = params.get('jawTheme');
|
|
14
15
|
var raw = (q === 'dark' || q === 'light') ? q : localStorage.getItem('jaw.uiTheme');
|
|
15
16
|
var t = (raw === 'dark' || raw === 'light') ? raw :
|
|
16
17
|
(matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');
|
|
17
18
|
document.documentElement.setAttribute('data-theme', t);
|
|
19
|
+
// The desktop shell's preload can't mark this document when it loads in
|
|
20
|
+
// a cross-origin iframe, so the manager passes the flag on the URL.
|
|
21
|
+
if (params.get('jawDesktop') === '1') {
|
|
22
|
+
document.documentElement.setAttribute('data-cli-jaw-desktop', 'true');
|
|
23
|
+
}
|
|
18
24
|
})();
|
|
19
25
|
</script>
|
|
20
26
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
|
|
@@ -258,6 +264,8 @@
|
|
|
258
264
|
<div class="chat-input-area">
|
|
259
265
|
<div id="cmdDropdown" class="cmd-dropdown" role="listbox" data-i18n-aria="aria.cmdList" aria-label="커맨드 목록"
|
|
260
266
|
style="display:none"></div>
|
|
267
|
+
<div id="skillMentionDropdown" class="cmd-dropdown" role="listbox" data-i18n-aria="aria.skillMentionList"
|
|
268
|
+
aria-label="스킬 목록" style="display:none"></div>
|
|
261
269
|
<button class="btn-attach" data-i18n-title="btn.attach" title="파일 첨부"><span data-icon="paperclip"></span></button>
|
|
262
270
|
<input type="file" id="fileInput" hidden multiple>
|
|
263
271
|
<button class="btn-voice" id="btnVoice" aria-describedby="voiceShortcutHint" data-i18n-title="voice.start" title="음성 녹음"><span data-icon="mic"></span></button>
|
|
@@ -19,7 +19,7 @@ interface Callbacks {
|
|
|
19
19
|
}
|
|
20
20
|
type Host = {
|
|
21
21
|
message: HTMLElement; runId: string; cacheScope: string; controller: AbortController;
|
|
22
|
-
box: HTMLElement; status: HTMLElement; retry: HTMLButtonElement;
|
|
22
|
+
box: HTMLElement; status: HTMLElement; live: HTMLElement; retry: HTMLButtonElement;
|
|
23
23
|
pending: boolean; loaded: boolean; promise: Promise<void> | null; resolve: (() => void) | null;
|
|
24
24
|
};
|
|
25
25
|
const SELECTOR = '.msg-agent[data-trace-run-id]';
|
|
@@ -65,15 +65,31 @@ function finishPromise(host: Host): void {
|
|
|
65
65
|
host.retry.disabled = false;
|
|
66
66
|
host.pending = false; host.resolve?.(); host.resolve = null; host.promise = null;
|
|
67
67
|
}
|
|
68
|
+
/** Status and retry never stand alone in the message flow: they live inside the
|
|
69
|
+
mounted Activity disclosure when one exists, otherwise inside this host's own
|
|
70
|
+
collapsed details so the text only appears once expanded. */
|
|
71
|
+
function present(host: Host): void {
|
|
72
|
+
const disclosure = host.message.querySelector<HTMLElement>('.activity-disclosure');
|
|
73
|
+
if (disclosure) {
|
|
74
|
+
if (host.status.parentElement !== disclosure) {
|
|
75
|
+
const footer = disclosure.querySelector('.activity-footer');
|
|
76
|
+
if (footer) footer.before(host.status, host.retry); else disclosure.append(host.status, host.retry);
|
|
77
|
+
}
|
|
78
|
+
} else if (host.status.parentElement !== host.box) host.box.append(host.status, host.retry);
|
|
79
|
+
host.status.hidden = !host.status.textContent;
|
|
80
|
+
if (host.live.textContent !== host.status.textContent) host.live.textContent = host.status.textContent;
|
|
81
|
+
host.box.hidden = !!disclosure || (!host.status.textContent && host.retry.hidden);
|
|
82
|
+
}
|
|
68
83
|
function cancel(host: Host, remove: boolean): void {
|
|
69
84
|
host.controller.abort();
|
|
70
85
|
if (remove) observer?.unobserve(host.message);
|
|
71
86
|
else {
|
|
72
87
|
host.status.textContent = 'Activity read cancelled. Retry to inspect.';
|
|
73
|
-
host.retry.textContent = 'Retry activity'; host.retry.hidden = false;
|
|
88
|
+
host.retry.textContent = 'Retry activity'; host.retry.hidden = false;
|
|
89
|
+
present(host);
|
|
74
90
|
}
|
|
75
91
|
if (queued.delete(host.message)) finishPromise(host);
|
|
76
|
-
if (remove) { hosts.delete(host.message); host.box.remove(); }
|
|
92
|
+
if (remove) { hosts.delete(host.message); host.status.remove(); host.retry.remove(); host.live.remove(); host.box.remove(); }
|
|
77
93
|
}
|
|
78
94
|
function prune(): void {
|
|
79
95
|
for (const host of hosts.values()) if (!host.message.isConnected) cancel(host, true);
|
|
@@ -82,7 +98,7 @@ function prune(): void {
|
|
|
82
98
|
|
|
83
99
|
function entry(message: HTMLElement, runId: string): Host | null {
|
|
84
100
|
const previous = hosts.get(message);
|
|
85
|
-
if (previous?.runId === runId) return previous;
|
|
101
|
+
if (previous?.runId === runId) { present(previous); return previous; }
|
|
86
102
|
if (previous) cancel(previous, true);
|
|
87
103
|
prune();
|
|
88
104
|
if (hosts.size >= MAX_HOSTS) {
|
|
@@ -94,13 +110,20 @@ function entry(message: HTMLElement, runId: string): Host | null {
|
|
|
94
110
|
}
|
|
95
111
|
return null;
|
|
96
112
|
}
|
|
97
|
-
message.
|
|
98
|
-
|
|
99
|
-
const
|
|
100
|
-
const
|
|
101
|
-
|
|
113
|
+
message.querySelectorAll('.activity-read-control, .activity-read-status, .activity-read-live, .activity-read-retry')
|
|
114
|
+
.forEach(node => node.remove());
|
|
115
|
+
const box = document.createElement('details'); box.className = 'activity-read-control';
|
|
116
|
+
const summary = document.createElement('summary'); summary.className = 'activity-read-summary';
|
|
117
|
+
summary.textContent = 'Activity status';
|
|
118
|
+
const status = document.createElement('p'); status.className = 'activity-read-status';
|
|
119
|
+
status.hidden = true;
|
|
120
|
+
const live = document.createElement('p'); live.className = 'activity-read-live';
|
|
121
|
+
live.setAttribute('role', 'status');
|
|
122
|
+
const retry = document.createElement('button'); retry.className = 'activity-read-retry';
|
|
123
|
+
retry.type = 'button'; retry.textContent = 'Load activity';
|
|
124
|
+
box.append(summary, status, retry); message.querySelector('.agent-body')?.prepend(live, box);
|
|
102
125
|
const host: Host = { message, runId, cacheScope: getMessageScope(), controller: new AbortController(),
|
|
103
|
-
box, status, retry, pending: false, loaded: false, promise: null, resolve: null };
|
|
126
|
+
box, status, live, retry, pending: false, loaded: false, promise: null, resolve: null };
|
|
104
127
|
retry.onclick = () => { void hydrateActivityHost(message, runId, true); };
|
|
105
128
|
hosts.set(message, host); if (mode()) traceAllowed(message, false);
|
|
106
129
|
return host;
|
|
@@ -110,8 +133,9 @@ function entry(message: HTMLElement, runId: string): Host | null {
|
|
|
110
133
|
export function markActivityHistoryUnavailable(message: HTMLElement): void {
|
|
111
134
|
if (!identity || !owns(message, message.dataset['traceRunId'] ?? '', identity.sessionId)) return;
|
|
112
135
|
const host = entry(message, message.dataset['traceRunId']!); if (!host) return;
|
|
113
|
-
host.loaded = false; host.
|
|
136
|
+
host.loaded = false; host.retry.hidden = false;
|
|
114
137
|
host.status.textContent = 'Activity preview is no longer retained in memory. Load it again to inspect.';
|
|
138
|
+
present(host);
|
|
115
139
|
}
|
|
116
140
|
|
|
117
141
|
function combine(seed: ActivityRunReadResult, tail: ActivityRunReadResult): RuntimeEvent[] {
|
|
@@ -193,14 +217,17 @@ async function execute(host: Host): Promise<void> {
|
|
|
193
217
|
: '';
|
|
194
218
|
host.retry.textContent = 'Refresh activity';
|
|
195
219
|
host.retry.hidden = !incomplete && !noActivity && !answerError && status !== 'running' && answer.kind === 'saved';
|
|
196
|
-
host
|
|
197
|
-
if (hadFocus && host.
|
|
220
|
+
present(host);
|
|
221
|
+
if (hadFocus && ((!host.status.textContent && host.retry.hidden)
|
|
222
|
+
|| !!host.retry.closest('details:not([open])'))) {
|
|
223
|
+
host.message.querySelector<HTMLElement>('.activity-summary')?.focus({ preventScroll: true });
|
|
224
|
+
}
|
|
198
225
|
} catch (error) {
|
|
199
226
|
if (hosts.get(host.message) !== host || generation !== epoch || path !== locationKey()) return;
|
|
200
227
|
if (host.controller.signal.aborted && host.controller.signal.reason?.name !== 'TimeoutError') return;
|
|
201
228
|
host.status.textContent = error instanceof ActivityReadError ? error.message
|
|
202
229
|
: 'Activity could not be restored. The transcript is unchanged; retry to inspect it.';
|
|
203
|
-
host.retry.hidden = false; host.
|
|
230
|
+
host.retry.hidden = false; host.retry.textContent = 'Retry activity'; present(host);
|
|
204
231
|
if (error instanceof ActivityReadError && error.status === 404) {
|
|
205
232
|
try {
|
|
206
233
|
await readActivityHttp(`/api/traces/${encodeURIComponent(host.runId)}?${new URLSearchParams({ session: captured.sessionId })}`,
|
|
@@ -208,7 +235,7 @@ async function execute(host: Host): Promise<void> {
|
|
|
208
235
|
if (current(host, captured, epoch, path)) {
|
|
209
236
|
traceAllowed(host.message, true);
|
|
210
237
|
host.status.textContent = 'Detailed Activity was not recorded for this turn. The saved transcript is shown.';
|
|
211
|
-
host.retry.hidden = true;
|
|
238
|
+
host.retry.hidden = true; present(host);
|
|
212
239
|
}
|
|
213
240
|
} catch { /* A copied/foreign/expired pointer does not gain raw authority. */ }
|
|
214
241
|
}
|
|
@@ -228,7 +255,7 @@ function pump(): void {
|
|
|
228
255
|
if (!host.message.isConnected || host.controller.signal.aborted || hosts.get(host.message) !== host) {
|
|
229
256
|
finishPromise(host); queueMicrotask(pump); return;
|
|
230
257
|
}
|
|
231
|
-
active = host; host.status.textContent = 'Loading recorded activity.';
|
|
258
|
+
active = host; host.status.textContent = 'Loading recorded activity.'; present(host);
|
|
232
259
|
void execute(host).catch(error => console.warn('[activity] history read failed', error)).finally(() => {
|
|
233
260
|
finishPromise(host); if (active === host) active = null; pump();
|
|
234
261
|
});
|
|
@@ -242,14 +269,15 @@ export function hydrateActivityHost(message: HTMLElement, runId: string, manual
|
|
|
242
269
|
const turn = findLiveActivity(runId);
|
|
243
270
|
if (!manual && host.loaded) return Promise.resolve();
|
|
244
271
|
if (!manual && turn?.message === message && !turn.degraded && !message.dataset['activityRecovering']) {
|
|
245
|
-
host.
|
|
272
|
+
host.status.textContent = ''; host.retry.hidden = true; present(host);
|
|
273
|
+
traceAllowed(message, true); return Promise.resolve();
|
|
246
274
|
}
|
|
247
275
|
if (queued.size >= MAX_QUEUED) {
|
|
248
276
|
host.status.textContent = 'Activity reads are at their limit. Use Load activity to retry.';
|
|
249
|
-
host.
|
|
277
|
+
host.retry.hidden = false; present(host); return Promise.resolve();
|
|
250
278
|
}
|
|
251
|
-
host.controller = new AbortController(); host.pending = true;
|
|
252
|
-
host.status.textContent = 'Activity read queued.'; host.retry.disabled = true;
|
|
279
|
+
host.controller = new AbortController(); host.pending = true;
|
|
280
|
+
host.status.textContent = 'Activity read queued.'; host.retry.disabled = true; present(host);
|
|
253
281
|
host.promise = new Promise(resolve => { host.resolve = resolve; });
|
|
254
282
|
const promise = host.promise; queued.set(message, host); pump(); return promise;
|
|
255
283
|
}
|
|
@@ -276,7 +304,8 @@ export function observeActivityHistory(root: ParentNode): void {
|
|
|
276
304
|
const runId = message.dataset['traceRunId']!;
|
|
277
305
|
if (!owns(message, runId, identity.sessionId)) continue;
|
|
278
306
|
const host = entry(message, runId); if (!host) continue;
|
|
279
|
-
if (!mode()) { host.
|
|
307
|
+
if (!mode()) { host.status.textContent = ''; host.retry.hidden = true; present(host);
|
|
308
|
+
traceAllowed(message, true); continue; }
|
|
280
309
|
if (message.closest('details:not([open])')) continue;
|
|
281
310
|
if (observer) observer.observe(message); else void hydrateActivityHost(message, runId);
|
|
282
311
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { activityEntryLabel,
|
|
1
|
+
import { activityEntryLabel, type ActivityEntry } from '../../../src/shared/activity-state.js';
|
|
2
2
|
import { classifyActivityTool, isActivityFileEdit, type ActivityRenderGroup, type ActivityToolKind } from '../../../src/shared/activity-kind.js';
|
|
3
|
+
import { firstInputLine, parseToolInput, prettyToolInput, TOOL_DESCRIPTION_KEYS, TOOL_INPUT_KEYS } from '../../../src/shared/tool-input.js';
|
|
4
|
+
import { copyText } from './copy-text.js';
|
|
3
5
|
import { hydrateIcons, type IconName } from '../icons.js';
|
|
4
6
|
const glyphs: Record<ActivityToolKind, IconName> = { command: 'terminal', file: 'file', search: 'search', mcp: 'plug', other: 'tool' };
|
|
5
7
|
function el<K extends keyof HTMLElementTagNameMap>(doc: Document, tag: K, cls: string) {
|
|
@@ -9,34 +11,180 @@ function glyph(node: HTMLElement, name: IconName) {
|
|
|
9
11
|
if (node.dataset['icon'] === name) return;
|
|
10
12
|
node.dataset['icon'] = name; node.setAttribute('aria-hidden', 'true');
|
|
11
13
|
hydrateIcons(node.parentElement!); }
|
|
14
|
+
|
|
15
|
+
// Past ~15 wrapped lines the capped scroll height already engages; only then is
|
|
16
|
+
// a Show-all toggle worth showing (jsdom cannot measure overflow, so estimate).
|
|
17
|
+
function isTallContent(value: string): boolean {
|
|
18
|
+
return value.length > 1400 || value.split('\n').length > 14;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** One flash per copy button: a second click restarts it instead of being cut short. */
|
|
22
|
+
const copyFlash = new WeakMap<HTMLButtonElement, number>();
|
|
23
|
+
|
|
24
|
+
function flashCopied(btn: HTMLButtonElement, doc: Document): void {
|
|
25
|
+
const icon = btn.querySelector<HTMLElement>('[data-icon]');
|
|
26
|
+
if (!icon) return;
|
|
27
|
+
const pending = copyFlash.get(btn);
|
|
28
|
+
if (pending !== undefined) doc.defaultView?.clearTimeout(pending);
|
|
29
|
+
icon.dataset['icon'] = 'checkSimple'; hydrateIcons(btn); btn.classList.add('copied');
|
|
30
|
+
const timer = doc.defaultView?.setTimeout(() => { icon.dataset['icon'] = 'copy'; hydrateIcons(btn); btn.classList.remove('copied'); }, 800);
|
|
31
|
+
if (timer !== undefined) copyFlash.set(btn, timer);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
interface Block { key: string; label: string; content: string; copy: boolean }
|
|
35
|
+
|
|
36
|
+
/** Rebuild when the block set or a label changes; text stays live between rebuilds. */
|
|
37
|
+
function syncBody(body: HTMLElement, blocks: readonly Block[], waiting: boolean): void {
|
|
38
|
+
// Labels follow the entry (the detail block becomes `Error` on failure), so they
|
|
39
|
+
// belong in the signature: a key-only signature left `Detail` on a failed row.
|
|
40
|
+
const signature = `${waiting ? 'wait|' : ''}${blocks.map(block => `${block.key}:${block.label}`).join('|')}`;
|
|
41
|
+
if (body.dataset['sig'] !== signature) {
|
|
42
|
+
body.dataset['sig'] = signature;
|
|
43
|
+
for (const child of [...body.children]) child.remove();
|
|
44
|
+
const doc = body.ownerDocument;
|
|
45
|
+
for (const block of blocks) {
|
|
46
|
+
const section = el(doc, 'section', 'activity-block');
|
|
47
|
+
section.dataset['block'] = block.key;
|
|
48
|
+
const head = el(doc, 'div', 'activity-block-head');
|
|
49
|
+
const label = el(doc, 'span', 'activity-block-label');
|
|
50
|
+
text(label, block.label);
|
|
51
|
+
head.append(label);
|
|
52
|
+
if (block.copy) {
|
|
53
|
+
const copy = el(doc, 'button', 'activity-block-copy');
|
|
54
|
+
copy.type = 'button';
|
|
55
|
+
copy.setAttribute('aria-label', `Copy ${block.label.toLowerCase()}`);
|
|
56
|
+
const icon = el(doc, 'span', 'activity-block-copy-icon');
|
|
57
|
+
icon.dataset['icon'] = 'copy'; icon.setAttribute('aria-hidden', 'true');
|
|
58
|
+
copy.append(icon);
|
|
59
|
+
copy.onclick = () => {
|
|
60
|
+
const value = section.querySelector('pre')?.textContent;
|
|
61
|
+
if (value) void copyText(value).then(result => { if (result.ok) flashCopied(copy, doc); });
|
|
62
|
+
};
|
|
63
|
+
head.append(copy);
|
|
64
|
+
}
|
|
65
|
+
const pre = el(doc, 'pre', 'activity-item-text activity-block-text');
|
|
66
|
+
pre.setAttribute('aria-label', block.label);
|
|
67
|
+
section.append(head, pre);
|
|
68
|
+
body.append(section);
|
|
69
|
+
}
|
|
70
|
+
if (waiting) {
|
|
71
|
+
const line = el(doc, 'p', 'activity-waiting');
|
|
72
|
+
text(line, 'Waiting for output…');
|
|
73
|
+
body.append(line);
|
|
74
|
+
}
|
|
75
|
+
const toggle = el(doc, 'button', 'activity-block-toggle');
|
|
76
|
+
toggle.type = 'button';
|
|
77
|
+
toggle.onclick = () => {
|
|
78
|
+
const next = body.dataset['expanded'] !== 'true';
|
|
79
|
+
body.dataset['expanded'] = String(next);
|
|
80
|
+
toggle.textContent = next ? 'Show less' : 'Show all';
|
|
81
|
+
toggle.setAttribute('aria-expanded', String(next));
|
|
82
|
+
};
|
|
83
|
+
body.append(toggle);
|
|
84
|
+
hydrateIcons(body);
|
|
85
|
+
}
|
|
86
|
+
const sections = body.querySelectorAll<HTMLElement>('.activity-block');
|
|
87
|
+
const pres = blocks.map((_, index) => sections[index]!.querySelector('pre')!);
|
|
88
|
+
blocks.forEach((block, index) => text(pres[index]!, block.content));
|
|
89
|
+
// Measure real overflow when layout exists (browser); jsdom reports 0
|
|
90
|
+
// everywhere and falls back to the character estimate.
|
|
91
|
+
const unmeasured = pres.every(pre => pre.scrollHeight === 0);
|
|
92
|
+
const overflowing = pres.map((pre, index) => unmeasured
|
|
93
|
+
? isTallContent(blocks[index]!.content)
|
|
94
|
+
: pre.scrollHeight > pre.clientHeight + 2);
|
|
95
|
+
// Only a block that actually scrolls belongs in the tab order.
|
|
96
|
+
pres.forEach((pre, index) => {
|
|
97
|
+
if (overflowing[index]) pre.tabIndex = 0;
|
|
98
|
+
else pre.removeAttribute('tabindex');
|
|
99
|
+
});
|
|
100
|
+
// The reader's choice outranks the measurement: an expanded body has the cap
|
|
101
|
+
// lifted, so it measures as short and would otherwise collapse itself on the
|
|
102
|
+
// next render, taking the toggle away with it.
|
|
103
|
+
const expanded = body.dataset['expanded'] === 'true';
|
|
104
|
+
const tall = expanded || overflowing.some(Boolean);
|
|
105
|
+
const toggle = body.querySelector<HTMLElement>('.activity-block-toggle')!;
|
|
106
|
+
toggle.hidden = !tall;
|
|
107
|
+
text(toggle, expanded ? 'Show less' : 'Show all');
|
|
108
|
+
toggle.setAttribute('aria-expanded', String(expanded));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function toolBlocks(entry: Extract<ActivityEntry, { kind: 'tool' }>, kind: ActivityToolKind): Block[] {
|
|
112
|
+
const blocks: Block[] = [];
|
|
113
|
+
const parsed = parseToolInput(entry.input);
|
|
114
|
+
if (parsed.value !== null || parsed.object || entry.input) {
|
|
115
|
+
const command = parsed.field === 'command' || (!parsed.object && kind === 'command');
|
|
116
|
+
blocks.push({
|
|
117
|
+
key: 'input',
|
|
118
|
+
label: command ? 'Command' : 'Input',
|
|
119
|
+
content: parsed.field === 'command' && parsed.value !== null ? parsed.value
|
|
120
|
+
: parsed.object ? prettyToolInput(entry.input ?? '') : parsed.value ?? entry.input ?? '',
|
|
121
|
+
copy: true,
|
|
122
|
+
});
|
|
123
|
+
// A command envelope can carry more than the command (timeout, cwd…):
|
|
124
|
+
// surface the remaining fields so nothing the call sent is hidden.
|
|
125
|
+
if (parsed.object && parsed.field === 'command') {
|
|
126
|
+
const hidden = new Set([...TOOL_INPUT_KEYS.command, ...TOOL_DESCRIPTION_KEYS]);
|
|
127
|
+
const rest = Object.fromEntries(Object.entries(parsed.object).filter(([key]) => !hidden.has(key)));
|
|
128
|
+
if (Object.keys(rest).length)
|
|
129
|
+
blocks.push({ key: 'params', label: 'Parameters', content: JSON.stringify(rest, null, 2), copy: false });
|
|
130
|
+
}
|
|
131
|
+
if (parsed.description)
|
|
132
|
+
blocks.push({ key: 'description', label: 'Description', content: parsed.description, copy: false });
|
|
133
|
+
}
|
|
134
|
+
if (entry.output) blocks.push({ key: 'output', label: 'Output', content: entry.output, copy: false });
|
|
135
|
+
if (entry.detail) blocks.push({ key: 'detail', label: entry.status === 'error' ? 'Error' : 'Detail', content: entry.detail, copy: false });
|
|
136
|
+
return blocks;
|
|
137
|
+
}
|
|
138
|
+
|
|
12
139
|
export function createActivityRow(doc: Document, id: string): HTMLDetailsElement {
|
|
13
140
|
const row = el(doc, 'details', 'activity-item activity-row'); row.dataset['activityItemId'] = id;
|
|
14
141
|
const head = el(doc, 'summary', 'activity-item-summary');
|
|
15
|
-
|
|
142
|
+
const labelWrap = el(doc, 'span', 'activity-row-text');
|
|
143
|
+
const desc = el(doc, 'span', 'activity-row-desc'); desc.hidden = true;
|
|
144
|
+
labelWrap.append(el(doc, 'span', 'activity-row-label'), desc);
|
|
145
|
+
head.append(el(doc, 'span', 'activity-row-icon'), labelWrap,
|
|
16
146
|
el(doc, 'span', 'activity-row-status'), el(doc, 'span', 'activity-chevron-sm'));
|
|
17
|
-
const body = el(doc, '
|
|
147
|
+
const body = el(doc, 'div', 'activity-item-body');
|
|
18
148
|
row.append(head, body); glyph(head.lastElementChild as HTMLElement, 'chevronDown'); return row; }
|
|
19
|
-
export function updateActivityRow(row: HTMLDetailsElement, entry: ActivityEntry
|
|
149
|
+
export function updateActivityRow(row: HTMLDetailsElement, entry: ActivityEntry): void {
|
|
20
150
|
const kind = entry.kind === 'tool' ? classifyActivityTool(entry.name) : entry.kind;
|
|
21
151
|
row.className = `activity-item activity-row${entry.kind === 'tool' ? '' : ` activity-row-${entry.kind}`}`;
|
|
22
152
|
row.dataset['kind'] = kind; row.dataset['status'] = entry.kind === 'tool' ? entry.status : '';
|
|
23
|
-
const head = row.querySelector('summary')!;
|
|
153
|
+
const head = row.querySelector('summary')!;
|
|
24
154
|
glyph(head.querySelector<HTMLElement>('.activity-row-icon')!, entry.kind === 'tool' ? glyphs[classifyActivityTool(entry.name)]
|
|
25
155
|
: entry.kind === 'reasoning' ? 'brain' : 'thinking');
|
|
26
|
-
|
|
156
|
+
const desc = head.querySelector<HTMLElement>('.activity-row-desc')!;
|
|
157
|
+
let label = activityEntryLabel(entry), status = '', description = '';
|
|
27
158
|
if (entry.kind === 'tool') {
|
|
28
159
|
const edit = kind === 'file' && isActivityFileEdit(entry.name);
|
|
29
160
|
const past = kind === 'command' ? 'Ran' : kind === 'file' ? edit ? 'Edited' : 'Read' : kind === 'search' ? 'Searched' : 'Called';
|
|
30
161
|
const active = kind === 'command' ? 'Running' : kind === 'file' ? edit ? 'Editing' : 'Reading' : kind === 'search' ? 'Searching' : 'Calling';
|
|
31
162
|
const verb = entry.status === 'done' ? past : entry.status === 'running' ? active : entry.status === 'error' ? 'Failed' : 'Stopped';
|
|
32
|
-
const
|
|
33
|
-
|
|
163
|
+
const parsed = parseToolInput(entry.input);
|
|
164
|
+
// Never label a row with a raw {"command": ...} object: decode the
|
|
165
|
+
// recognised argument, else fall back to the tool's own name. Retention can
|
|
166
|
+
// cut the input before any recognised field, and that prefix is still an
|
|
167
|
+
// envelope, so the tool name is the honest label there too.
|
|
168
|
+
const raw = entry.input?.trim() ?? '';
|
|
169
|
+
const target = parsed.value !== null ? firstInputLine(parsed.value)
|
|
170
|
+
: (parsed.object || raw.startsWith('{')) ? entry.name
|
|
171
|
+
: firstInputLine(raw) || entry.name;
|
|
172
|
+
description = parsed.description ? firstInputLine(parsed.description) : '';
|
|
173
|
+
label = `${verb} ${target}`;
|
|
174
|
+
status = entry.status === 'error' ? 'failed' : entry.status === 'done' ? '' : entry.status;
|
|
34
175
|
}
|
|
35
176
|
text(head.querySelector('.activity-row-label')!, label);
|
|
177
|
+
text(desc, description); desc.hidden = !description;
|
|
178
|
+
head.setAttribute('aria-label', description ? `${label} — ${description}` : label);
|
|
36
179
|
const state = head.querySelector<HTMLElement>('.activity-row-status')!;
|
|
37
180
|
text(state, status); state.setAttribute('aria-label', status === 'failed' ? 'Tool call failed' : status);
|
|
38
|
-
const
|
|
39
|
-
|
|
181
|
+
const body = row.querySelector<HTMLElement>('.activity-item-body')!;
|
|
182
|
+
if (entry.kind === 'tool') {
|
|
183
|
+
syncBody(body, toolBlocks(entry, kind as ActivityToolKind),
|
|
184
|
+
entry.status === 'running' && !entry.output && !entry.detail);
|
|
185
|
+
} else {
|
|
186
|
+
syncBody(body, entry.text ? [{ key: 'text', label: 'Activity preview', content: entry.text, copy: false }] : [], false);
|
|
187
|
+
}
|
|
40
188
|
}
|
|
41
189
|
export function createActivityRows(doc: Document, list: HTMLElement) {
|
|
42
190
|
const groups = new Map<string, { root: HTMLDivElement; head: HTMLButtonElement; body: HTMLDivElement }>();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { activityStatus, type ActivityState } from '../../../src/shared/activity-state.js';
|
|
2
2
|
import { groupActivityEntries } from '../../../src/shared/activity-kind.js';
|
|
3
3
|
import { createActivityRow, updateActivityRow, createActivityRows } from './activity-rows.js';
|
|
4
4
|
import type { RuntimeItemStatus } from '../../../src/shared/runtime-contract.js';
|
|
@@ -12,7 +12,6 @@ export interface ActivityChoices {
|
|
|
12
12
|
|
|
13
13
|
const MAX_CHOICES = 128;
|
|
14
14
|
const PAGE_SIZE = 40;
|
|
15
|
-
const PREVIEW_CHARS = 3000;
|
|
16
15
|
|
|
17
16
|
export const createActivityChoices = (): ActivityChoices => ({ open: false, items: new Map(), page: null });
|
|
18
17
|
|
|
@@ -178,8 +177,9 @@ export function createActivityView(
|
|
|
178
177
|
connection.hidden = !display.connectionUnavailable;
|
|
179
178
|
const loss = model.omitted;
|
|
180
179
|
const entries = [...model.entries.values()];
|
|
181
|
-
|
|
182
|
-
|
|
180
|
+
// Rows render everything retention kept, so the notice fires only when
|
|
181
|
+
// retention itself dropped something — never for display clipping.
|
|
182
|
+
const limited = !!(loss.entries || loss.textChars || loss.requests || loss.finalChars);
|
|
183
183
|
text(omitted, limited
|
|
184
184
|
? 'Preview is limited. Some activity, text or request notices are omitted.' : '');
|
|
185
185
|
omitted.hidden = !limited;
|
|
@@ -210,7 +210,7 @@ export function createActivityView(
|
|
|
210
210
|
node.ontoggle = () => saveItem(entry.itemId, itemNode);
|
|
211
211
|
nodes.set(entry.itemId, node);
|
|
212
212
|
}
|
|
213
|
-
updateActivityRow(node, entry
|
|
213
|
+
updateActivityRow(node, entry);
|
|
214
214
|
const open = choices.items.get(entry.itemId) ?? (entry.kind === 'tool' && entry.status === 'running');
|
|
215
215
|
renderedOpen.set(node, open);
|
|
216
216
|
if (node.open !== open) node.open = open;
|
|
@@ -4,6 +4,7 @@ import { addMessage, addSystemMsg } from '../ui.js';
|
|
|
4
4
|
import { getPreferredLocale } from '../locale.js';
|
|
5
5
|
import { t } from './i18n.js';
|
|
6
6
|
import * as slashCmd from './slash-commands.js';
|
|
7
|
+
import * as skillMention from './skill-mentions.js';
|
|
7
8
|
import { api, apiJson, apiFire, getAuthToken, API_BASE } from '../api.js';
|
|
8
9
|
import { escapeHtml, cancelPostRender } from '../render.js';
|
|
9
10
|
import { getVirtualScroll } from '../virtual-scroll.js';
|
|
@@ -282,6 +283,7 @@ export async function sendMessage(source: SendSource = 'enter'): Promise<void> {
|
|
|
282
283
|
|
|
283
284
|
// Double-submit guard: if a previous send is still in flight, drop this call.
|
|
284
285
|
if (__chatSending) return;
|
|
286
|
+
skillMention.close();
|
|
285
287
|
|
|
286
288
|
if (!text && !state.attachedFiles.length) return;
|
|
287
289
|
clearUnreadResponses();
|
|
@@ -54,6 +54,7 @@ function normalizeEmployeeModel(_cli: string, model?: string): string {
|
|
|
54
54
|
|
|
55
55
|
function getDefaultEmployeeModel(cli: string, models: string[]): string {
|
|
56
56
|
if (cli === 'claude') {
|
|
57
|
+
if (models.includes('claude-opus-5-5')) return 'claude-opus-5-5';
|
|
57
58
|
if (models.includes('claude-opus-4-8')) return 'claude-opus-4-8';
|
|
58
59
|
if (models.includes('opus')) return 'opus';
|
|
59
60
|
}
|