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
|
@@ -5,9 +5,16 @@
|
|
|
5
5
|
// array. Conditionally renders the schedule-body field based on
|
|
6
6
|
// `schedule.kind` to avoid stale `cron` strings hanging around when
|
|
7
7
|
// the user toggles to `every`, and vice versa.
|
|
8
|
+
//
|
|
9
|
+
// Layout follows the shared row language used by MCP servers and memory
|
|
10
|
+
// entries: a `settings-card-actions` header (name + enabled/kind badges +
|
|
11
|
+
// Remove) then the standard `.settings-field` rows. The component returns a
|
|
12
|
+
// fragment so the header lands as a direct child of
|
|
13
|
+
// `.settings-section-body` and picks up the standard item divider.
|
|
8
14
|
|
|
9
15
|
import { useId } from 'react';
|
|
10
16
|
import { TextField, ToggleField, SelectField } from '../../fields';
|
|
17
|
+
import { StatusBadge } from '../page-shell';
|
|
11
18
|
|
|
12
19
|
export type HbScheduleEvery = {
|
|
13
20
|
kind: 'every';
|
|
@@ -56,15 +63,37 @@ export function HeartbeatJobRow({
|
|
|
56
63
|
const idBase = useId();
|
|
57
64
|
const kind = job.schedule.kind;
|
|
58
65
|
const tz = job.schedule.timeZone ?? '';
|
|
66
|
+
const title = job.name || `Job ${index + 1}`;
|
|
59
67
|
|
|
60
68
|
return (
|
|
61
|
-
<
|
|
62
|
-
className="settings-
|
|
69
|
+
<div
|
|
70
|
+
className="settings-card-group"
|
|
71
|
+
role="group"
|
|
63
72
|
aria-label={`Heartbeat job ${index + 1}${job.name ? ` (${job.name})` : ''}`}
|
|
64
73
|
>
|
|
65
|
-
<
|
|
66
|
-
|
|
67
|
-
|
|
74
|
+
<div className="settings-card-actions">
|
|
75
|
+
<div className="settings-card-actions-status">
|
|
76
|
+
<strong>{title}</strong>{' '}
|
|
77
|
+
{job.enabled ? (
|
|
78
|
+
<StatusBadge tone="ok">Enabled</StatusBadge>
|
|
79
|
+
) : (
|
|
80
|
+
<StatusBadge tone="neutral">Disabled</StatusBadge>
|
|
81
|
+
)}{' '}
|
|
82
|
+
<StatusBadge tone="neutral">
|
|
83
|
+
{kind === 'every' ? 'interval' : 'cron'}
|
|
84
|
+
</StatusBadge>
|
|
85
|
+
</div>
|
|
86
|
+
<div className="settings-card-actions-buttons">
|
|
87
|
+
<button
|
|
88
|
+
type="button"
|
|
89
|
+
className="settings-action settings-action-danger"
|
|
90
|
+
onClick={onRemove}
|
|
91
|
+
aria-label={`Remove heartbeat job ${title}`}
|
|
92
|
+
>
|
|
93
|
+
Remove job
|
|
94
|
+
</button>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
68
97
|
|
|
69
98
|
<ToggleField
|
|
70
99
|
id={`${idBase}-enabled`}
|
|
@@ -184,16 +213,6 @@ export function HeartbeatJobRow({
|
|
|
184
213
|
onChange={(event) => onChange({ prompt: event.target.value })}
|
|
185
214
|
/>
|
|
186
215
|
</label>
|
|
187
|
-
|
|
188
|
-
<div className="settings-heartbeat-job-footer">
|
|
189
|
-
<button
|
|
190
|
-
type="button"
|
|
191
|
-
className="settings-action settings-action-discard"
|
|
192
|
-
onClick={onRemove}
|
|
193
|
-
>
|
|
194
|
-
Remove job
|
|
195
|
-
</button>
|
|
196
|
-
</div>
|
|
197
|
-
</fieldset>
|
|
216
|
+
</div>
|
|
198
217
|
);
|
|
199
218
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
import { useCallback, useEffect, useState } from 'react';
|
|
10
10
|
import type { DirtyStore, SettingsClient } from '../../types';
|
|
11
|
-
import { PageError, PageOffline } from '../page-shell';
|
|
11
|
+
import { PageError, PageOffline, SettingsActions, SettingsNote } from '../page-shell';
|
|
12
12
|
import { HeartbeatJobRow, type HbJob } from './HeartbeatJobRow';
|
|
13
13
|
import {
|
|
14
14
|
jobScheduleBodyError,
|
|
@@ -77,7 +77,7 @@ export function HeartbeatJobsSection({ port, client, dirty, snapshot }: Props) {
|
|
|
77
77
|
}, [client, dirty, jobs]);
|
|
78
78
|
|
|
79
79
|
if (snapshot.kind === 'loading') {
|
|
80
|
-
return <
|
|
80
|
+
return <SettingsNote>Loading jobs…</SettingsNote>;
|
|
81
81
|
}
|
|
82
82
|
if (snapshot.kind === 'offline') return <PageOffline port={port} />;
|
|
83
83
|
if (snapshot.kind === 'error') return <PageError message={snapshot.message} />;
|
|
@@ -98,11 +98,11 @@ export function HeartbeatJobsSection({ port, client, dirty, snapshot }: Props) {
|
|
|
98
98
|
return (
|
|
99
99
|
<>
|
|
100
100
|
{jobs.length === 0 ? (
|
|
101
|
-
<
|
|
101
|
+
<SettingsNote>
|
|
102
102
|
No jobs configured. Add one below.
|
|
103
|
-
</
|
|
103
|
+
</SettingsNote>
|
|
104
104
|
) : (
|
|
105
|
-
|
|
105
|
+
<>
|
|
106
106
|
{jobs.map((job, idx) => (
|
|
107
107
|
<HeartbeatJobRow
|
|
108
108
|
key={job.id}
|
|
@@ -113,12 +113,12 @@ export function HeartbeatJobsSection({ port, client, dirty, snapshot }: Props) {
|
|
|
113
113
|
onRemove={() => removeJob(idx)}
|
|
114
114
|
/>
|
|
115
115
|
))}
|
|
116
|
-
|
|
116
|
+
</>
|
|
117
117
|
)}
|
|
118
|
-
<
|
|
118
|
+
<SettingsActions>
|
|
119
119
|
<button
|
|
120
120
|
type="button"
|
|
121
|
-
className="settings-action
|
|
121
|
+
className="settings-action"
|
|
122
122
|
onClick={addJob}
|
|
123
123
|
>
|
|
124
124
|
+ Add job
|
|
@@ -131,11 +131,11 @@ export function HeartbeatJobsSection({ port, client, dirty, snapshot }: Props) {
|
|
|
131
131
|
>
|
|
132
132
|
{saving ? 'Saving…' : 'Apply jobs'}
|
|
133
133
|
</button>
|
|
134
|
-
</
|
|
134
|
+
</SettingsActions>
|
|
135
135
|
{error ? (
|
|
136
|
-
<
|
|
136
|
+
<SettingsNote tone="error" role="alert">
|
|
137
137
|
{error}
|
|
138
|
-
</
|
|
138
|
+
</SettingsNote>
|
|
139
139
|
) : null}
|
|
140
140
|
</>
|
|
141
141
|
);
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import { useCallback, useEffect, useState } from 'react';
|
|
8
8
|
import type { DirtyStore, SettingsClient } from '../../types';
|
|
9
|
-
import { PageError, PageOffline } from '../page-shell';
|
|
9
|
+
import { PageError, PageOffline, SettingsActions, SettingsNote } from '../page-shell';
|
|
10
10
|
import type { SnapshotState } from '../page-shell';
|
|
11
11
|
|
|
12
12
|
type Props = {
|
|
@@ -54,7 +54,7 @@ export function HeartbeatMarkdownSection({ port, client, dirty, snapshot }: Prop
|
|
|
54
54
|
}, [client, dirty, content]);
|
|
55
55
|
|
|
56
56
|
if (snapshot.kind === 'loading') {
|
|
57
|
-
return <
|
|
57
|
+
return <SettingsNote>Loading template…</SettingsNote>;
|
|
58
58
|
}
|
|
59
59
|
if (snapshot.kind === 'offline') return <PageOffline port={port} />;
|
|
60
60
|
if (snapshot.kind === 'error') return <PageError message={snapshot.message} />;
|
|
@@ -71,10 +71,10 @@ export function HeartbeatMarkdownSection({ port, client, dirty, snapshot }: Prop
|
|
|
71
71
|
spellCheck={false}
|
|
72
72
|
value={content}
|
|
73
73
|
onChange={(event) => setContent(event.target.value)}
|
|
74
|
-
style={{ fontFamily: 'ui-monospace, monospace' }}
|
|
74
|
+
style={{ fontFamily: 'var(--font-mono, ui-monospace, monospace)' }}
|
|
75
75
|
/>
|
|
76
76
|
</label>
|
|
77
|
-
<
|
|
77
|
+
<SettingsActions>
|
|
78
78
|
<button
|
|
79
79
|
type="button"
|
|
80
80
|
className="settings-action settings-action-save"
|
|
@@ -83,11 +83,11 @@ export function HeartbeatMarkdownSection({ port, client, dirty, snapshot }: Prop
|
|
|
83
83
|
>
|
|
84
84
|
{saving ? 'Saving…' : 'Save template'}
|
|
85
85
|
</button>
|
|
86
|
-
</
|
|
86
|
+
</SettingsActions>
|
|
87
87
|
{error ? (
|
|
88
|
-
<
|
|
88
|
+
<SettingsNote tone="error" role="alert">
|
|
89
89
|
{error}
|
|
90
|
-
</
|
|
90
|
+
</SettingsNote>
|
|
91
91
|
) : null}
|
|
92
92
|
</>
|
|
93
93
|
);
|
|
@@ -10,16 +10,11 @@ type Props = {
|
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
export function InlineWarn({ children, tone = 'warn', role = 'note' }: Props) {
|
|
13
|
-
const className =
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
<p className={className} role="alert">
|
|
17
|
-
{children}
|
|
18
|
-
</p>
|
|
19
|
-
);
|
|
20
|
-
}
|
|
13
|
+
const className = tone === 'warn'
|
|
14
|
+
? 'settings-card-note settings-card-note-warn'
|
|
15
|
+
: 'settings-card-note settings-card-note-muted';
|
|
21
16
|
return (
|
|
22
|
-
<p className={className} role=
|
|
17
|
+
<p className={className} role={role}>
|
|
23
18
|
{children}
|
|
24
19
|
</p>
|
|
25
20
|
);
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
// Single MCP server editor. Renders as shared card-body rows — a
|
|
2
|
+
// `settings-card-actions` header (name + transport badge + remove) followed
|
|
3
|
+
// by the standard `.settings-field` divided rows — so server entries read
|
|
4
|
+
// like every other settings row instead of a bespoke card.
|
|
5
|
+
|
|
1
6
|
import type { McpServer } from '../mcp-helpers';
|
|
2
7
|
import {
|
|
3
8
|
formatArgsText,
|
|
@@ -6,6 +11,7 @@ import {
|
|
|
6
11
|
parseEnvText,
|
|
7
12
|
getServerTag,
|
|
8
13
|
} from '../mcp-helpers';
|
|
14
|
+
import { StatusBadge } from '../page-shell';
|
|
9
15
|
|
|
10
16
|
type Props = {
|
|
11
17
|
name: string;
|
|
@@ -32,39 +38,45 @@ export function McpServerCard({
|
|
|
32
38
|
const isRemote = tag === 'remote';
|
|
33
39
|
|
|
34
40
|
return (
|
|
35
|
-
|
|
36
|
-
<
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
onChange={(event) => onRename(event.target.value)}
|
|
47
|
-
/>
|
|
48
|
-
{nameError ? (
|
|
49
|
-
<span className="settings-field-error" role="alert">
|
|
50
|
-
{nameError}
|
|
51
|
-
</span>
|
|
52
|
-
) : null}
|
|
53
|
-
</label>
|
|
54
|
-
<div className="mcp-server-card-actions">
|
|
55
|
-
{tag ? (
|
|
56
|
-
<span className="mcp-server-tag" data-tag={tag}>[{tag}]</span>
|
|
57
|
-
) : null}
|
|
41
|
+
<>
|
|
42
|
+
<div
|
|
43
|
+
className="settings-card-actions"
|
|
44
|
+
role="group"
|
|
45
|
+
aria-label={`MCP server ${name || '(unnamed)'}`}
|
|
46
|
+
>
|
|
47
|
+
<div className="settings-card-actions-status">
|
|
48
|
+
<strong>{name || '(unnamed)'}</strong>
|
|
49
|
+
{tag ? <StatusBadge tone="neutral">{tag}</StatusBadge> : null}
|
|
50
|
+
</div>
|
|
51
|
+
<div className="settings-card-actions-buttons">
|
|
58
52
|
<button
|
|
59
53
|
type="button"
|
|
60
|
-
className="settings-action settings-action-
|
|
54
|
+
className="settings-action settings-action-danger"
|
|
61
55
|
onClick={onRemove}
|
|
62
56
|
aria-label={`Remove ${name || 'server'}`}
|
|
63
57
|
>
|
|
64
58
|
Remove
|
|
65
59
|
</button>
|
|
66
60
|
</div>
|
|
67
|
-
</
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
<label className="settings-field settings-field-text" htmlFor={`${id}-name`}>
|
|
64
|
+
<span className="settings-field-label">Server name</span>
|
|
65
|
+
<input
|
|
66
|
+
id={`${id}-name`}
|
|
67
|
+
type="text"
|
|
68
|
+
value={name}
|
|
69
|
+
spellCheck={false}
|
|
70
|
+
placeholder="my-server"
|
|
71
|
+
aria-invalid={Boolean(nameError)}
|
|
72
|
+
onChange={(event) => onRename(event.target.value)}
|
|
73
|
+
/>
|
|
74
|
+
{nameError ? (
|
|
75
|
+
<span className="settings-field-error" role="alert">
|
|
76
|
+
{nameError}
|
|
77
|
+
</span>
|
|
78
|
+
) : null}
|
|
79
|
+
</label>
|
|
68
80
|
|
|
69
81
|
{isRemote ? (
|
|
70
82
|
<>
|
|
@@ -142,6 +154,7 @@ export function McpServerCard({
|
|
|
142
154
|
)}
|
|
143
155
|
|
|
144
156
|
<label className="settings-field settings-field-toggle" htmlFor={`${id}-autostart`}>
|
|
157
|
+
<span className="settings-field-label">Autostart</span>
|
|
145
158
|
<input
|
|
146
159
|
id={`${id}-autostart`}
|
|
147
160
|
type="checkbox"
|
|
@@ -150,8 +163,7 @@ export function McpServerCard({
|
|
|
150
163
|
onChange({ ...server, autostart: event.target.checked })
|
|
151
164
|
}
|
|
152
165
|
/>
|
|
153
|
-
<span className="settings-field-label">Autostart</span>
|
|
154
166
|
</label>
|
|
155
|
-
|
|
167
|
+
</>
|
|
156
168
|
);
|
|
157
169
|
}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
// Phase 6 — single row in the Memory browse
|
|
1
|
+
// Phase 6 — single row in the Memory browse list.
|
|
2
2
|
//
|
|
3
|
-
// Pure presentational
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
3
|
+
// Pure presentational, rendered on the shared `settings-card-actions` row so
|
|
4
|
+
// memory entries read like the other entity rows (MCP servers, heartbeat
|
|
5
|
+
// jobs): key + source badge + length + preview on the left, Open on the
|
|
6
|
+
// right. Clicking opens a read-only modal with the full value — the modal is
|
|
7
|
+
// owned by the parent Memory page so only one is mounted at a time and
|
|
8
|
+
// Esc/backdrop dismissal lives in one place.
|
|
7
9
|
|
|
8
10
|
import type { MemoryEntry } from './memory-helpers';
|
|
9
11
|
import { previewValue } from './memory-helpers';
|
|
12
|
+
import { StatusBadge } from '../page-shell';
|
|
10
13
|
|
|
11
14
|
type Props = {
|
|
12
15
|
row: MemoryEntry;
|
|
@@ -15,22 +18,24 @@ type Props = {
|
|
|
15
18
|
|
|
16
19
|
export function MemoryRow({ row, onOpen }: Props) {
|
|
17
20
|
return (
|
|
18
|
-
<
|
|
19
|
-
<
|
|
21
|
+
<div className="settings-card-actions">
|
|
22
|
+
<div className="settings-card-actions-status">
|
|
23
|
+
<strong><code>{row.key}</code></strong>{' '}
|
|
24
|
+
<StatusBadge tone="neutral">{row.source}</StatusBadge>{' '}
|
|
25
|
+
<span className="settings-field-hint">
|
|
26
|
+
{row.value.length} chars · {previewValue(row.value)}
|
|
27
|
+
</span>
|
|
28
|
+
</div>
|
|
29
|
+
<div className="settings-card-actions-buttons">
|
|
20
30
|
<button
|
|
21
31
|
type="button"
|
|
22
|
-
className="settings-
|
|
32
|
+
className="settings-action"
|
|
23
33
|
onClick={() => onOpen(row)}
|
|
24
34
|
aria-label={`Open memory entry ${row.key}`}
|
|
25
35
|
>
|
|
26
|
-
|
|
36
|
+
Open
|
|
27
37
|
</button>
|
|
28
|
-
</
|
|
29
|
-
|
|
30
|
-
<td className="settings-memory-length">{row.value.length}</td>
|
|
31
|
-
<td className="settings-memory-preview" title={row.value}>
|
|
32
|
-
{previewValue(row.value)}
|
|
33
|
-
</td>
|
|
34
|
-
</tr>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
35
40
|
);
|
|
36
41
|
}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { useLayoutEffect, useRef, useState } from 'react';
|
|
4
4
|
import type { ComponentProps } from 'react';
|
|
5
5
|
import { TextField, SelectField, ToggleField } from '../../fields';
|
|
6
|
+
import { SettingsToolbar } from '../page-shell';
|
|
6
7
|
import type { SettingsClient } from '../../types';
|
|
7
8
|
import type { DirtyEntry, DirtyStore } from '../../types';
|
|
8
9
|
import { coerceEffortForModel, effortChoicesForModel } from './agent/agent-meta';
|
|
@@ -57,137 +58,137 @@ export function PerCliRow({ cli, meta, original, value, setValue, setEntry, dirt
|
|
|
57
58
|
|
|
58
59
|
return (
|
|
59
60
|
<div className="settings-percli-row" data-cli={cli}>
|
|
60
|
-
<
|
|
61
|
+
<SettingsToolbar>
|
|
62
|
+
<strong className="settings-percli-title">{meta.label}</strong>
|
|
63
|
+
</SettingsToolbar>
|
|
61
64
|
<div className={`settings-percli-grid${isPi ? ' settings-percli-grid--pi' : ''}`}>
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
65
|
+
{isPi && piProfileOptions(pi, provider).length ? (
|
|
66
|
+
<SelectField
|
|
67
|
+
id={`percli-${cli}-provider`}
|
|
68
|
+
label="Provider"
|
|
69
|
+
disabled={disabled}
|
|
70
|
+
value={provider}
|
|
71
|
+
options={piProfileOptions(pi, provider).map((p) => ({ value: p, label: p }))}
|
|
72
|
+
onChange={(next) => {
|
|
73
|
+
if (blocked.current) return;
|
|
74
|
+
const nextModels = piModelOptions(pi, next);
|
|
75
|
+
const nextModel = nextModels.includes(value.model || '') ? (value.model || '') : (nextModels[0] || '');
|
|
76
|
+
setValue({ ...value, provider: next, model: nextModel });
|
|
77
|
+
setEntry(`perCli.${cli}.provider`, entryFor(next, original.provider ?? 'progrok'));
|
|
78
|
+
setEntry(`perCli.${cli}.model`, entryFor(nextModel, original.model ?? ''));
|
|
79
|
+
}}
|
|
80
|
+
/>
|
|
81
|
+
) : hasProviders ? (
|
|
82
|
+
<SelectField
|
|
83
|
+
id={`percli-${cli}-provider`}
|
|
84
|
+
label="Provider"
|
|
85
|
+
disabled={disabled}
|
|
86
|
+
value={provider}
|
|
87
|
+
options={(meta.providers ?? []).map((p) => ({ value: p, label: p }))}
|
|
88
|
+
onChange={(next) => {
|
|
89
|
+
if (blocked.current) return;
|
|
90
|
+
const nextModels = meta.modelsByProvider?.[next] ?? [];
|
|
91
|
+
const nextEfforts = meta.effortsByProvider?.[next] ?? [];
|
|
92
|
+
const nextModel = nextModels.includes(value.model || '') ? (value.model || '') : (nextModels[0] || '');
|
|
93
|
+
// Resolve against the NEW provider+model pair: the same
|
|
94
|
+
// model id can allow different efforts per provider.
|
|
95
|
+
const nextEffort = coerceEffortForModel(meta, nextModel, value.effort ?? '', nextEfforts, next);
|
|
96
|
+
setValue({ ...value, provider: next, model: nextModel, effort: nextEffort });
|
|
97
|
+
setEntry(`perCli.${cli}.provider`, entryFor(next, original.provider ?? meta.defaultProvider ?? 'claude'));
|
|
98
|
+
setEntry(`perCli.${cli}.model`, entryFor(nextModel, original.model ?? ''));
|
|
99
|
+
setEntry(`perCli.${cli}.effort`, entryFor(nextEffort, original.effort ?? ''));
|
|
100
|
+
}}
|
|
101
|
+
/>
|
|
102
|
+
) : null}
|
|
103
|
+
{isPi && modelOptions.length > 0 ? (
|
|
104
|
+
<SelectField
|
|
105
|
+
id={`percli-${cli}-model`}
|
|
106
|
+
label="Model"
|
|
107
|
+
disabled={disabled}
|
|
108
|
+
value={value.model ?? modelOptions[0] ?? ''}
|
|
109
|
+
options={modelOptions.map((m) => ({ value: m, label: m }))}
|
|
110
|
+
onChange={(next) => {
|
|
111
|
+
if (blocked.current) return;
|
|
112
|
+
const nextEffort = coerceEffortForModel(meta, next, value.effort ?? '', providerEfforts, hasProviders ? provider : undefined);
|
|
113
|
+
setValue({ ...value, model: next, effort: nextEffort });
|
|
114
|
+
setEntry(`perCli.${cli}.model`, entryFor(next, original.model ?? ''));
|
|
115
|
+
if (nextEffort !== (value.effort ?? '')) {
|
|
116
|
+
setEntry(`perCli.${cli}.effort`, entryFor(nextEffort, original.effort ?? ''));
|
|
117
|
+
}
|
|
118
|
+
}}
|
|
119
|
+
/>
|
|
120
|
+
) : (
|
|
121
|
+
<TextField
|
|
122
|
+
id={`percli-${cli}-model`}
|
|
123
|
+
label="Model"
|
|
124
|
+
disabled={disabled}
|
|
125
|
+
value={value.model ?? ''}
|
|
126
|
+
onChange={(next) => {
|
|
127
|
+
if (blocked.current) return;
|
|
128
|
+
setValue({ ...value, model: next });
|
|
129
|
+
setEntry(`perCli.${cli}.model`, entryFor(next, original.model ?? ''));
|
|
130
|
+
}}
|
|
131
|
+
placeholder={modelOptions[0] ?? 'model id'}
|
|
132
|
+
/>
|
|
133
|
+
)}
|
|
134
|
+
{meta.modelNote ? (
|
|
135
|
+
<p className="settings-percli-note">{meta.modelNote}</p>
|
|
136
|
+
) : null}
|
|
137
|
+
{modelOptions.length > 0 ? (
|
|
138
|
+
<datalist id={modelDatalistId}>
|
|
139
|
+
{modelOptions.map((m) => (
|
|
140
|
+
<option key={m} value={m} />
|
|
141
|
+
))}
|
|
142
|
+
</datalist>
|
|
143
|
+
) : null}
|
|
144
|
+
{effortOptions.length > 0 ? (
|
|
145
|
+
<div className="settings-percli-effort">
|
|
79
146
|
<SelectField
|
|
80
|
-
id={`percli-${cli}-
|
|
81
|
-
label="
|
|
147
|
+
id={`percli-${cli}-effort`}
|
|
148
|
+
label="Effort"
|
|
82
149
|
disabled={disabled}
|
|
83
|
-
value={
|
|
84
|
-
options={
|
|
150
|
+
value={value.effort ?? ''}
|
|
151
|
+
options={[
|
|
152
|
+
{ value: '', label: '(default)' },
|
|
153
|
+
...effortOptions.map((e) => ({ value: e, label: e })),
|
|
154
|
+
]}
|
|
85
155
|
onChange={(next) => {
|
|
86
156
|
if (blocked.current) return;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const nextModel = nextModels.includes(value.model || '') ? (value.model || '') : (nextModels[0] || '');
|
|
90
|
-
// Resolve against the NEW provider+model pair: the same
|
|
91
|
-
// model id can allow different efforts per provider.
|
|
92
|
-
const nextEffort = coerceEffortForModel(meta, nextModel, value.effort ?? '', nextEfforts, next);
|
|
93
|
-
setValue({ ...value, provider: next, model: nextModel, effort: nextEffort });
|
|
94
|
-
setEntry(`perCli.${cli}.provider`, entryFor(next, original.provider ?? meta.defaultProvider ?? 'claude'));
|
|
95
|
-
setEntry(`perCli.${cli}.model`, entryFor(nextModel, original.model ?? ''));
|
|
96
|
-
setEntry(`perCli.${cli}.effort`, entryFor(nextEffort, original.effort ?? ''));
|
|
157
|
+
setValue({ ...value, effort: next });
|
|
158
|
+
setEntry(`perCli.${cli}.effort`, entryFor(next, original.effort ?? ''));
|
|
97
159
|
}}
|
|
98
160
|
/>
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
{isPi && modelOptions.length > 0 ? (
|
|
102
|
-
<SelectField
|
|
103
|
-
id={`percli-${cli}-model`}
|
|
104
|
-
label="Model"
|
|
105
|
-
disabled={disabled}
|
|
106
|
-
value={value.model ?? modelOptions[0] ?? ''}
|
|
107
|
-
options={modelOptions.map((m) => ({ value: m, label: m }))}
|
|
108
|
-
onChange={(next) => {
|
|
109
|
-
if (blocked.current) return;
|
|
110
|
-
const nextEffort = coerceEffortForModel(meta, next, value.effort ?? '', providerEfforts, hasProviders ? provider : undefined);
|
|
111
|
-
setValue({ ...value, model: next, effort: nextEffort });
|
|
112
|
-
setEntry(`perCli.${cli}.model`, entryFor(next, original.model ?? ''));
|
|
113
|
-
if (nextEffort !== (value.effort ?? '')) {
|
|
114
|
-
setEntry(`perCli.${cli}.effort`, entryFor(nextEffort, original.effort ?? ''));
|
|
115
|
-
}
|
|
116
|
-
}}
|
|
117
|
-
/>
|
|
118
|
-
) : (
|
|
119
|
-
<TextField
|
|
120
|
-
id={`percli-${cli}-model`}
|
|
121
|
-
label="Model"
|
|
122
|
-
disabled={disabled}
|
|
123
|
-
value={value.model ?? ''}
|
|
124
|
-
onChange={(next) => {
|
|
125
|
-
if (blocked.current) return;
|
|
126
|
-
setValue({ ...value, model: next });
|
|
127
|
-
setEntry(`perCli.${cli}.model`, entryFor(next, original.model ?? ''));
|
|
128
|
-
}}
|
|
129
|
-
placeholder={modelOptions[0] ?? 'model id'}
|
|
130
|
-
/>
|
|
131
|
-
)}
|
|
132
|
-
{meta.modelNote ? (
|
|
133
|
-
<p className="settings-percli-note">{meta.modelNote}</p>
|
|
134
|
-
) : null}
|
|
135
|
-
{modelOptions.length > 0 ? (
|
|
136
|
-
<datalist id={modelDatalistId}>
|
|
137
|
-
{modelOptions.map((m) => (
|
|
138
|
-
<option key={m} value={m} />
|
|
139
|
-
))}
|
|
140
|
-
</datalist>
|
|
161
|
+
{meta.effortNote ? (
|
|
162
|
+
<p className="settings-percli-note">{meta.effortNote}</p>
|
|
141
163
|
) : null}
|
|
142
164
|
</div>
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
) : meta.effortNote ? (
|
|
165
|
-
<p className="settings-percli-note settings-percli-note--effort">{meta.effortNote}</p>
|
|
166
|
-
) : null}
|
|
167
|
-
{hasRuntimeTransportChoice(cli) ? (
|
|
168
|
-
<RuntimeTransportField cli={cli} original={original.transport} dirty={dirty} disabled={disabled} setEntry={setEntry} />
|
|
169
|
-
) : null}
|
|
170
|
-
<ToggleField
|
|
171
|
-
id={`percli-${cli}-fastmode`}
|
|
172
|
-
label="Fast mode"
|
|
165
|
+
) : meta.effortNote ? (
|
|
166
|
+
<p className="settings-percli-note settings-percli-note--effort">{meta.effortNote}</p>
|
|
167
|
+
) : null}
|
|
168
|
+
{hasRuntimeTransportChoice(cli) ? (
|
|
169
|
+
<RuntimeTransportField cli={cli} original={original.transport} dirty={dirty} disabled={disabled} setEntry={setEntry} />
|
|
170
|
+
) : null}
|
|
171
|
+
<ToggleField
|
|
172
|
+
id={`percli-${cli}-fastmode`}
|
|
173
|
+
label="Fast mode"
|
|
174
|
+
disabled={disabled}
|
|
175
|
+
value={Boolean(value.fastMode)}
|
|
176
|
+
onChange={(next) => {
|
|
177
|
+
if (blocked.current) return;
|
|
178
|
+
setValue({ ...value, fastMode: next });
|
|
179
|
+
setEntry(`perCli.${cli}.fastMode`, entryFor(next, Boolean(original.fastMode)));
|
|
180
|
+
}}
|
|
181
|
+
/>
|
|
182
|
+
{isPi && client ? (
|
|
183
|
+
<button
|
|
184
|
+
type="button"
|
|
185
|
+
className="settings-action settings-percli-settings"
|
|
173
186
|
disabled={disabled}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
}}
|
|
180
|
-
/>
|
|
181
|
-
{isPi && client ? (
|
|
182
|
-
<button
|
|
183
|
-
type="button"
|
|
184
|
-
className="settings-action"
|
|
185
|
-
disabled={disabled}
|
|
186
|
-
onClick={() => { if (!blocked.current) setPiDialogOpen(true); }}
|
|
187
|
-
>
|
|
188
|
-
Settings
|
|
189
|
-
</button>
|
|
190
|
-
) : null}
|
|
187
|
+
onClick={() => { if (!blocked.current) setPiDialogOpen(true); }}
|
|
188
|
+
>
|
|
189
|
+
Settings
|
|
190
|
+
</button>
|
|
191
|
+
) : null}
|
|
191
192
|
</div>
|
|
192
193
|
{isPi && client && piDialogOpen ? (
|
|
193
194
|
<div inert={disabled} aria-busy={disabled}>
|