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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{r as t,t as n}from"./cli-engine-NdU0lzs_.js";import{t as r}from"./react-C_pPTFsM.js";import{t as i}from"./jsx-runtime-NZYk81nU.js";import{a,i as o,n as s,r as c,t as l}from"./page-shell-BeGD0rRQ.js";import{a as u,i as d,r as f}from"./fields-mlGpofqQ.js";import{a as p,d as m}from"./agent-meta-94LMwZZK.js";import{t as h}from"./path-utils-B6vBr0DD.js";var g=e(r(),1),_=[`memory.enabled`,`memory.flushEvery`,`memory.cli`,`memory.retentionDays`,`memory.autoReflectAfterFlush`,`memory.flushLanguage`],v=[{value:`en`,label:`English (en)`},{value:`ko`,label:`한국어 (ko)`},{value:`ja`,label:`日本語 (ja)`},{value:`zh`,label:`中文 (zh)`}],y=50;function b(e){return _.includes(e)}function x(e){let t=S(e);if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=C(e);t&&n.push(t)}return n}function S(e){if(!e||typeof e!=`object`)return e;let t=e;return Array.isArray(t)?t:`data`in t?t.data:e}function C(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.key==`string`?t.key:null;return n?{key:n,value:typeof t.value==`string`?t.value:``,source:typeof t.source==`string`?t.source:`manual`}:null}function w(e,t){return!Number.isFinite(e)||!Number.isInteger(e)||e<=0?`${t} must be a positive integer`:null}function T(e,t,n=50){let r=Math.max(0,Math.floor(t))*n,i=e.slice(r,r+n),a=Math.max(1,Math.ceil(e.length/n));return{slice:i,hasMore:r+n<e.length,pageCount:a}}function E(e,t=80){return e.length<=t?e:`${e.slice(0,t)}…`}var D=i();function ee({row:e,onOpen:t}){return(0,D.jsxs)(`tr`,{className:`settings-memory-row`,children:[(0,D.jsx)(`td`,{className:`settings-memory-key`,children:(0,D.jsx)(`button`,{type:`button`,className:`settings-memory-link`,onClick:()=>t(e),"aria-label":`Open memory entry ${e.key}`,children:e.key})}),(0,D.jsx)(`td`,{className:`settings-memory-source`,children:e.source}),(0,D.jsx)(`td`,{className:`settings-memory-length`,children:e.value.length}),(0,D.jsx)(`td`,{className:`settings-memory-preview`,title:e.value,children:E(e.value)})]})}var O={busy:null,notice:null,error:null};function k({port:e,client:r,dirty:i,registerSave:y}){let S=a(r,`/api/settings`),C=a(r,`/api/memory`),[E,k]=(0,g.useState)(!0),[A,j]=(0,g.useState)(10),[M,N]=(0,g.useState)(``),[P,F]=(0,g.useState)(30),[I,L]=(0,g.useState)(!1),[R,z]=(0,g.useState)(`en`),[B,V]=(0,g.useState)(0),[H,U]=(0,g.useState)(null),[W,G]=(0,g.useState)(O);(0,g.useEffect)(()=>{if(S.state.kind!==`ready`)return;let e=S.state.data.memory||{};k(e.enabled!==!1),j(typeof e.flushEvery==`number`?e.flushEvery:10),N(typeof e.cli==`string`?e.cli:``),F(typeof e.retentionDays==`number`?e.retentionDays:30),L(!!e.autoReflectAfterFlush),z(typeof e.flushLanguage==`string`&&e.flushLanguage?e.flushLanguage:`en`)},[S.state]),(0,g.useEffect)(()=>()=>{for(let e of _)i.remove(e)},[i]),(0,g.useEffect)(()=>{if(!H)return;let e=e=>{e.key===`Escape`&&U(null)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[H]);let K=(0,g.useCallback)((e,t)=>i.set(e,t),[i]),q=(0,g.useMemo)(()=>S.state.kind===`ready`&&S.state.data.memory||{},[S.state]),J=(0,g.useCallback)(async()=>{let e=i.saveBundle(),t={};for(let[n,r]of Object.entries(e))b(n)&&(t[n]=r);if(Object.keys(t).length===0)return;let n=h(t),a=await r.put(`/api/settings`,n),o=a&&typeof a==`object`&&`data`in a?a.data:a;for(let e of _)i.remove(e);S.setData(o);let s=o.memory||{};k(s.enabled!==!1),j(typeof s.flushEvery==`number`?s.flushEvery:10),N(typeof s.cli==`string`?s.cli:``),F(typeof s.retentionDays==`number`?s.retentionDays:30),L(!!s.autoReflectAfterFlush),z(typeof s.flushLanguage==`string`&&s.flushLanguage?s.flushLanguage:`en`),await S.refresh()},[r,i,S]);(0,g.useEffect)(()=>{if(y)return y(J),()=>y(null)},[y,J]);let Y=(0,g.useCallback)(async()=>{G({busy:`flush`,notice:null,error:null});try{await r.post(`/api/jaw-memory/flush`,{}),G({busy:null,notice:`Memory flush queued. Browse refreshes when it completes.`,error:null}),await C.refresh()}catch(e){G({busy:null,notice:null,error:e instanceof Error?e.message:String(e)})}},[r,C]),X=(0,g.useCallback)(async()=>{G({busy:`reflect`,notice:null,error:null});try{await r.post(`/api/jaw-memory/reflect`,{}),G({busy:null,notice:`Reflect complete.`,error:null}),await C.refresh()}catch(e){G({busy:null,notice:null,error:e instanceof Error?e.message:String(e)})}},[r,C]),Z=(0,g.useCallback)(()=>{if(C.state.kind!==`ready`)return;let t=x(C.state.data),n=new Blob([JSON.stringify(t,null,2)],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=`jaw-memory-${e}-${Date.now()}.json`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r)},[C.state,e]);if(S.state.kind===`loading`)return(0,D.jsx)(s,{});if(S.state.kind===`offline`)return(0,D.jsx)(c,{port:e});if(S.state.kind===`error`)return(0,D.jsx)(l,{message:S.state.message});let te=w(A,`Flush every`),ne=w(P,`Retention days`),re=S.state.data.perCli||{},Q=[{value:``,label:`(profile default)`},...m(Object.keys(re)).map(e=>({value:e,label:p(e).label||e}))];M&&!n(M)&&!Q.some(e=>e.value===M)&&Q.push({value:M,label:`${p(M).label||M} (legacy)`});let $=C.state.kind===`ready`?x(C.state.data):[],{slice:ie,hasMore:ae,pageCount:oe}=T($,Math.min(B,Math.max(0,Math.ceil($.length/50)-1)));return(0,D.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),J()},children:[(0,D.jsxs)(o,{title:`Memory engine`,hint:`Background memory flush and reflection cadence.`,children:[(0,D.jsx)(u,{id:`memory-enabled`,label:`Memory enabled`,value:E,onChange:e=>{k(e),K(`memory.enabled`,{value:e,original:q.enabled!==!1,valid:!0})}}),(0,D.jsx)(f,{id:`memory-flush-every`,label:`Flush every (sessions)`,value:A,min:1,error:te,onChange:e=>{j(e),K(`memory.flushEvery`,{value:e,original:typeof q.flushEvery==`number`?q.flushEvery:10,valid:w(e,`Flush every`)===null})}}),(0,D.jsx)(d,{id:`memory-cli`,label:`Flush CLI`,value:M,missingValueLabel:n(M)?t(M):void 0,error:n(M)?`The saved runtime is retired. Choose an available runtime.`:null,options:Q,onChange:e=>{N(e),K(`memory.cli`,{value:e,original:q.cli??``,valid:!0})}}),(0,D.jsx)(f,{id:`memory-retention`,label:`Retention days`,value:P,min:1,error:ne,onChange:e=>{F(e),K(`memory.retentionDays`,{value:e,original:typeof q.retentionDays==`number`?q.retentionDays:30,valid:w(e,`Retention days`)===null})}}),(0,D.jsx)(u,{id:`memory-auto-reflect`,label:`Auto-reflect after flush`,value:I,onChange:e=>{L(e),K(`memory.autoReflectAfterFlush`,{value:e,original:!!q.autoReflectAfterFlush,valid:!0})}}),(0,D.jsx)(d,{id:`memory-flush-language`,label:`Flush language`,value:R,options:[...v],onChange:e=>{z(e),K(`memory.flushLanguage`,{value:e,original:q.flushLanguage??`en`,valid:!0})}})]}),(0,D.jsx)(o,{title:`Stored entries`,hint:`Read-only browse of the key/value memory table (50/page).`,children:C.state.kind===`loading`?(0,D.jsx)(`p`,{className:`settings-section-hint`,children:`Loading entries…`}):C.state.kind===`offline`?(0,D.jsx)(c,{port:e}):C.state.kind===`error`?(0,D.jsx)(l,{message:C.state.message}):$.length===0?(0,D.jsx)(`p`,{className:`settings-section-hint`,children:`No memory entries yet.`}):(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(`table`,{className:`settings-memory-table`,children:[(0,D.jsx)(`thead`,{children:(0,D.jsxs)(`tr`,{children:[(0,D.jsx)(`th`,{scope:`col`,children:`Key`}),(0,D.jsx)(`th`,{scope:`col`,children:`Source`}),(0,D.jsx)(`th`,{scope:`col`,children:`Length`}),(0,D.jsx)(`th`,{scope:`col`,children:`Preview`})]})}),(0,D.jsx)(`tbody`,{children:ie.map(e=>(0,D.jsx)(ee,{row:e,onOpen:U},e.key))})]}),(0,D.jsxs)(`div`,{className:`settings-memory-pagination`,children:[(0,D.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:B===0,onClick:()=>V(e=>Math.max(0,e-1)),children:`Prev`}),(0,D.jsxs)(`span`,{className:`settings-memory-pageinfo`,children:[`Page `,B+1,` / `,oe]}),(0,D.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:!ae,onClick:()=>V(e=>e+1),children:`Next`})]})]})}),(0,D.jsxs)(o,{title:`Actions`,hint:`Flush runs async — the browse list refreshes when it finishes.`,children:[(0,D.jsxs)(`div`,{className:`settings-memory-actions`,children:[(0,D.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:W.busy!==null,onClick:()=>void Y(),children:W.busy===`flush`?`Queuing…`:`Flush now`}),(0,D.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:W.busy!==null,onClick:()=>void X(),children:W.busy===`reflect`?`Reflecting…`:`Reflect soul`}),(0,D.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:C.state.kind!==`ready`,onClick:Z,children:`Export memory`})]}),W.notice?(0,D.jsx)(`p`,{className:`settings-section-hint`,role:`status`,children:W.notice}):null,W.error?(0,D.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:W.error}):null]}),H?(0,D.jsx)(`div`,{className:`settings-memory-modal`,role:`dialog`,"aria-modal":`true`,"aria-label":`Memory entry ${H.key}`,onClick:e=>{e.target===e.currentTarget&&U(null)},children:(0,D.jsxs)(`div`,{className:`settings-memory-modal-card`,children:[(0,D.jsxs)(`header`,{className:`settings-memory-modal-header`,children:[(0,D.jsx)(`h3`,{children:H.key}),(0,D.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>U(null),"aria-label":`Close memory entry`,children:`Close`})]}),(0,D.jsx)(`pre`,{className:`settings-memory-modal-body`,children:H.value})]})}):null]})}export{v as FLUSH_LANGUAGE_OPTIONS,y as MEMORY_PAGE_SIZE,_ as MEMORY_SECTION_A_KEYS,k as default,b as isMemorySettingsKey,x as normalizeMemoryRows,T as paginate,E as previewValue,w as validatePositiveInt};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{r as t,t as n}from"./cli-engine-NdU0lzs_.js";import{t as r}from"./react-C_pPTFsM.js";import{t as i}from"./jsx-runtime-NZYk81nU.js";import{t as a}from"./error-normalize-CL69Bl7z.js";import{a as o,i as s,n as c,r as l,t as u}from"./page-shell-BeGD0rRQ.js";import{a as d,i as f,n as p,r as m,s as h}from"./fields-mlGpofqQ.js";import{a as g,d as _,i as v,o as y,r as b}from"./agent-meta-94LMwZZK.js";import{t as x}from"./path-utils-B6vBr0DD.js";var S=e(r(),1),C=i(),w=[`basic`,`openai`,`anthropic`,`vertex`],T=`[hidden], [inert], [aria-disabled="true"], fieldset[disabled]`;function E(e){return Array.from(e.querySelectorAll(`button, input, select, textarea, a[href], [tabindex]`)).filter(e=>{if(e.tabIndex<0||e.matches(`:disabled`)||e.closest(T))return!1;for(let t=e;t;t=t.parentElement){let e=t.ownerDocument.defaultView?.getComputedStyle(t);if(e?.display===`none`||e?.visibility===`hidden`||e?.visibility===`collapse`)return!1}return!0})}function D(e){return e===`anthropic`?`https://api.anthropic.com/v1/messages`:e===`vertex`?`https://LOCATION-aiplatform.googleapis.com/v1`:`http://127.0.0.1:18645/v1`}function O({client:e,pi:t,provider:n,model:r,onClose:i,onRegistered:a}){let o=(0,S.useRef)(null),s=(0,S.useMemo)(()=>t?.profiles?.find(e=>e.id===n)||t?.profiles?.[0],[t,n]),[c,l]=(0,S.useState)(s?.mode||`basic`),[u,d]=(0,S.useState)(s?.id||n||`progrok`),[p,m]=(0,S.useState)(s?.endpoint||D(c)),[g,_]=(0,S.useState)(r||s?.model||`grok-composer-2.5-fast`),[v,y]=(0,S.useState)(``),[b,x]=(0,S.useState)(!1),[O,k]=(0,S.useState)(null);(0,S.useEffect)(()=>{let e=o.current;if(!e||e.closest(T))return;let t=e.ownerDocument.activeElement,n=E(e);return(n.find(e=>e.id===`pi-profile-id`)??n[0])?.focus(),()=>{t instanceof HTMLElement&&t.isConnected&&!t.matches(`:disabled`)&&!t.closest(T)&&t.focus({preventScroll:!0})}},[]),(0,S.useEffect)(()=>{m(e=>e||D(c))},[c]);let A=e=>{let t=o.current;if(!(!t||t.closest(T)||e.defaultPrevented)){if(e.key===`Escape`)e.preventDefault(),e.stopPropagation(),i();else if(e.key===`Tab`){let n=E(t),r=n[0],i=n.at(-1),a=t.ownerDocument.activeElement;(!r||!n.some(e=>e===a)||(e.shiftKey?a===r:a===i))&&(e.preventDefault(),(e.shiftKey?i??t:r??t).focus())}}},j=async()=>{let t=o.current,n=t?.querySelector(`.settings-action-save`);t&&n&&t.ownerDocument.activeElement===n&&!t.closest(T)&&E(t).find(e=>e!==n)?.focus(),x(!0),k(null);try{let t=(await e.post(`/api/pi/profiles/register`,{id:u,label:u,mode:c,endpoint:p,model:g,apiKey:v})).data;a({provider:u,model:g,models:t.models||[],pi:t.settings?.pi}),i()}catch(e){k(e instanceof Error?e.message:String(e))}finally{x(!1)}};return(0,C.jsx)(`div`,{className:`settings-memory-modal settings-pi-modal`,ref:o,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`pi-profile-title`,tabIndex:-1,onKeyDown:A,children:(0,C.jsxs)(`div`,{className:`settings-memory-modal-card`,children:[(0,C.jsxs)(`header`,{className:`settings-memory-modal-header`,children:[(0,C.jsx)(`h3`,{id:`pi-profile-title`,children:`Pi Settings`}),(0,C.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:i,children:`Close`})]}),(0,C.jsxs)(`div`,{className:`settings-page-form`,children:[(0,C.jsx)(f,{id:`pi-profile-mode`,label:`Mode`,value:c,options:w.map(e=>({value:e,label:e})),onChange:e=>l(e)}),(0,C.jsx)(h,{id:`pi-profile-id`,label:`Provider`,value:u,onChange:d,placeholder:`progrok`}),(0,C.jsx)(h,{id:`pi-profile-endpoint`,label:`Endpoint`,value:p,onChange:m,placeholder:D(c)}),(0,C.jsx)(h,{id:`pi-profile-model`,label:`Model`,value:g,onChange:_,placeholder:`grok-composer-2.5-fast`}),(0,C.jsx)(h,{id:`pi-profile-key`,label:`API Key`,value:v,onChange:y,placeholder:s?.apiKeySet?`set (${s.apiKeyLast4||`****`})`:`empty for local proxy`}),(0,C.jsx)(`p`,{className:`settings-empty`,children:`Default: grok-composer-2.5-fast. Bare grok-composer-2.5 currently has no verified team access.`}),O?(0,C.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:O}):null,(0,C.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,disabled:b,onClick:()=>void j(),children:b?`Registering...`:`Register`})]})]})})}function k(e,t,n=``){let r=new Set;n&&r.add(n);for(let n of e?.discoveredModels?.[t]||[])r.add(n);let i=e?.profiles?.find(e=>e.id===t);return i?.model&&r.add(i.model),[...r]}function A(e,t=``){let n=new Set;t&&n.add(t);for(let t of e?.profiles||[])n.add(t.id);return[...n]}function j(e){return e===`cursor`||e===`grok`||e===`claude`}function M(e){return e===`native`||e===`print`}var N=`unrecognized`,P=[{value:`native`,label:`Native session (opt-in)`},{value:`print`,label:`Print compatibility`}];function F({cli:e,original:t,dirty:n,disabled:r=!1,setEntry:i}){let a=j(e)?`perCli.${e}.transport`:null,o=(0,S.useSyncExternalStore)(n.subscribe,()=>a===null?void 0:n.pending.get(a)),s=(0,S.useRef)(r);(0,S.useLayoutEffect)(()=>(s.current=r,()=>{s.current=!0}),[r]);let c=t===void 0?`print`:t,l=o?o.value:c,u=M(l);return a===null?null:(0,C.jsxs)(`div`,{children:[(0,C.jsx)(f,{id:`percli-${e}-transport`,label:`Runtime transport`,value:u?l:N,options:u?P:[...P,{value:N,label:`Unrecognized transport`}],disabled:r,error:u?null:`Choose a supported runtime transport.`,onChange:e=>{!s.current&&M(e)&&i(a,{value:e,original:c,valid:!0})}}),u?null:(0,C.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:`Stored runtime transport is unrecognized.`}),(0,C.jsx)(`p`,{className:`settings-percli-note`,children:`Applies to the next run. Independent of Activity / Legacy presentation.`}),l===`native`?(0,C.jsx)(`p`,{className:`settings-percli-note`,children:e===`claude`?`Claude native supports Auto (YOLO) / Safe permissions.`:`Native requires Auto (YOLO) permissions; no native worker assignments.`}):null]})}function I(e,t,n=!0){return{value:e,original:t,valid:n}}function ee({cli:e,meta:t,original:n,value:r,setValue:i,setEntry:a,dirty:o,disabled:s=!1,client:c,pi:l,setPi:u,onPiRegistered:p}){let m=`percli-${e}-models`,g=e===`pi`,[_,y]=(0,S.useState)(!1),x=(0,S.useRef)(s);(0,S.useLayoutEffect)(()=>(x.current=s,()=>{x.current=!0}),[s]);let w=r.provider||t.defaultProvider||t.providers?.[0]||`claude`,T=g?k(l,w,r.model||``):[],E=!g&&(t.providers?.length??0)>0,D=g?T:E?t.modelsByProvider?.[w]??t.models:t.models,M=E?t.effortsByProvider?.[w]??t.efforts:void 0,N=v(t,r.model||``,M,E?w:void 0);return(0,C.jsxs)(`div`,{className:`settings-percli-row`,"data-cli":e,children:[(0,C.jsx)(`h3`,{className:`settings-percli-title`,children:t.label}),(0,C.jsxs)(`div`,{className:`settings-percli-grid${g?` settings-percli-grid--pi`:``}`,children:[g&&A(l,w).length?(0,C.jsx)(f,{id:`percli-${e}-provider`,label:`Provider`,disabled:s,value:w,options:A(l,w).map(e=>({value:e,label:e})),onChange:t=>{if(x.current)return;let o=k(l,t),s=o.includes(r.model||``)?r.model||``:o[0]||``;i({...r,provider:t,model:s}),a(`perCli.${e}.provider`,I(t,n.provider??`progrok`)),a(`perCli.${e}.model`,I(s,n.model??``))}}):E?(0,C.jsx)(f,{id:`percli-${e}-provider`,label:`Provider`,disabled:s,value:w,options:(t.providers??[]).map(e=>({value:e,label:e})),onChange:o=>{if(x.current)return;let s=t.modelsByProvider?.[o]??[],c=t.effortsByProvider?.[o]??[],l=s.includes(r.model||``)?r.model||``:s[0]||``,u=b(t,l,r.effort??``,c,o);i({...r,provider:o,model:l,effort:u}),a(`perCli.${e}.provider`,I(o,n.provider??t.defaultProvider??`claude`)),a(`perCli.${e}.model`,I(l,n.model??``)),a(`perCli.${e}.effort`,I(u,n.effort??``))}}):null,(0,C.jsxs)(`div`,{className:`settings-percli-model`,children:[g&&D.length>0?(0,C.jsx)(f,{id:`percli-${e}-model`,label:`Model`,disabled:s,value:r.model??D[0]??``,options:D.map(e=>({value:e,label:e})),onChange:o=>{if(x.current)return;let s=b(t,o,r.effort??``,M,E?w:void 0);i({...r,model:o,effort:s}),a(`perCli.${e}.model`,I(o,n.model??``)),s!==(r.effort??``)&&a(`perCli.${e}.effort`,I(s,n.effort??``))}}):(0,C.jsx)(h,{id:`percli-${e}-model`,label:`Model`,disabled:s,value:r.model??``,onChange:t=>{x.current||(i({...r,model:t}),a(`perCli.${e}.model`,I(t,n.model??``)))},placeholder:D[0]??`model id`}),t.modelNote?(0,C.jsx)(`p`,{className:`settings-percli-note`,children:t.modelNote}):null,D.length>0?(0,C.jsx)(`datalist`,{id:m,children:D.map(e=>(0,C.jsx)(`option`,{value:e},e))}):null]}),N.length>0?(0,C.jsxs)(`div`,{className:`settings-percli-effort`,children:[(0,C.jsx)(f,{id:`percli-${e}-effort`,label:`Effort`,disabled:s,value:r.effort??``,options:[{value:``,label:`(default)`},...N.map(e=>({value:e,label:e}))],onChange:t=>{x.current||(i({...r,effort:t}),a(`perCli.${e}.effort`,I(t,n.effort??``)))}}),t.effortNote?(0,C.jsx)(`p`,{className:`settings-percli-note`,children:t.effortNote}):null]}):t.effortNote?(0,C.jsx)(`p`,{className:`settings-percli-note settings-percli-note--effort`,children:t.effortNote}):null,j(e)?(0,C.jsx)(F,{cli:e,original:n.transport,dirty:o,disabled:s,setEntry:a}):null,(0,C.jsx)(d,{id:`percli-${e}-fastmode`,label:`Fast mode`,disabled:s,value:!!r.fastMode,onChange:t=>{x.current||(i({...r,fastMode:t}),a(`perCli.${e}.fastMode`,I(t,!!n.fastMode)))}}),g&&c?(0,C.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:s,onClick:()=>{x.current||y(!0)},children:`Settings`}):null]}),g&&c&&_?(0,C.jsx)(`div`,{inert:s,"aria-busy":s,children:(0,C.jsx)(O,{client:c,pi:l,provider:w,model:r.model||`grok-composer-2.5-fast`,onClose:()=>y(!1),onRegistered:t=>{if(p){p(t);return}if(x.current)return;let{provider:o,model:s,pi:c}=t;c&&u&&u(c),i({...r,provider:o,model:s}),a(`perCli.${e}.provider`,I(o,n.provider??`progrok`)),a(`perCli.${e}.model`,I(s,n.model??``))}})}):null]})}var L=e=>e===`fallbackOrder`||e.startsWith(`perCli.`);function R(e){let t=e&&typeof e==`object`&&`data`in e?e.data:e;if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`Invalid settings response. Refresh before retrying.`);return t}function te(e){return _(e).sort((e,t)=>e===`pi`?-1:+(t===`pi`))}function ne(e){let t=new Set;for(let n of Object.keys(e.activeOverrides||{}))t.add(n);for(let n of Object.keys(e.perCli||{}))t.add(n);let n={};for(let e of t)n[e]={model:``,effort:``};return{activeOverrides:n}}function z({port:e,client:r,dirty:i,registerSave:d}){let f=(0,S.useMemo)(()=>({client:r,port:e,dirty:i}),[r,e,i]),h=(0,S.useRef)(null),_=(0,S.useRef)(null),v=(0,S.useRef)(0),b=(0,S.useMemo)(()=>({...r,get:async(e,t)=>({instance:f,value:await r.get(e,t)})}),[r,f]),{state:w,refresh:T,setData:E}=o(b,`/api/settings`,[e]),D=(0,S.useMemo)(()=>w.kind===`ready`?w.data.instance===f?{kind:`ready`,data:w.data.value}:{kind:`loading`}:w,[w,f]),O=(0,S.useCallback)(e=>E({instance:f,value:e}),[f,E]),[k,A]=(0,S.useState)({}),[j,M]=(0,S.useState)(void 0),[N,P]=(0,S.useState)([]),[F,I]=(0,S.useState)({}),[z,B]=(0,S.useState)(!1),[re,V]=(0,S.useState)(null),[ie,H]=(0,S.useState)(null),[U,W]=(0,S.useState)(!1),[ae,G]=(0,S.useState)(null);(0,S.useLayoutEffect)(()=>(h.current=f,_.current=null,++v.current,W(!1),B(!1),H(null),V(null),G(null),()=>{h.current=null,_.current=null,++v.current}),[f]);let K=(0,S.useCallback)(()=>h.current===f&&!_.current,[f]),q=(0,S.useCallback)(async()=>{if(h.current!==f)return;let e=++v.current;try{let t=await r.get(`/api/cli-registry`);if(h.current!==f||e!==v.current)return;let n=t&&typeof t==`object`&&`data`in t?t.data:t;G(y(n))}catch{h.current===f&&e===v.current&&G(null)}},[r,f]);(0,S.useEffect)(()=>{q()},[q]),(0,S.useEffect)(()=>{if(D.kind!==`ready`)return;let e={...D.data.perCli||{}},t=Object.fromEntries(Object.entries(i.saveBundle()).filter(([e])=>L(e))),n=x(t).perCli;if(n&&typeof n==`object`&&!Array.isArray(n))for(let[t,r]of Object.entries(n))r&&typeof r==`object`&&!Array.isArray(r)&&(e[t]={...e[t],...r});A(e),M(D.data.pi),P([...D.data.fallbackOrder||[]]);let r=e.codex||{},a={};typeof r.contextWindowSize==`number`&&(a.contextWindowSize=r.contextWindowSize),typeof r.contextWindowCompactLimit==`number`&&(a.contextWindowCompactLimit=r.contextWindowCompactLimit),I(a)},[D,i]);let oe=(0,S.useCallback)(e=>{if(h.current!==f)return;let t=D.kind===`ready`?D.data.perCli?.pi:void 0;e.pi&&M(e.pi),A(t=>({...t,pi:{...t.pi,provider:e.provider,model:e.model}})),i.set(`perCli.pi.provider`,{value:e.provider,original:t?.provider??`progrok`,valid:!0}),i.set(`perCli.pi.model`,{value:e.model,original:t?.model??``,valid:!0})},[i,f,D]);(0,S.useEffect)(()=>()=>{for(let e of Array.from(i.pending.keys()))L(e)&&i.remove(e)},[i,f]);let J=(0,S.useCallback)((e,t)=>{K()&&L(e)&&i.set(e,t)},[i,K]),Y=(0,S.useCallback)(()=>{if(h.current!==f)return Promise.resolve();let e=_.current;if(e)return e.kind===`save`?e.promise:Promise.reject(Error(`Wait for the active override reset before saving.`));let t=Object.fromEntries(Object.entries(i.saveBundle()).filter(([e])=>L(e)));if(Object.keys(t).length===0)return Promise.resolve();let n=x(t),a=new Map([...i.pending].filter(([e])=>Object.hasOwn(t,e)));W(!0),H(null);let o={instance:f,kind:`save`,promise:Promise.resolve()};return o.promise=Promise.resolve().then(async()=>{if(h.current!==f)return;let e=await r.put(`/api/settings`,n);if(h.current!==f)return;let t=R(e);for(let[e,t]of a)i.pending.get(e)===t&&i.remove(e);O(t),await T(),await q()}).catch(e=>{if(h.current===f)throw e}).finally(()=>{_.current===o&&(_.current=null),h.current===f&&W(!1)}),_.current=o,o.promise},[r,i,f,q,T,O]);(0,S.useEffect)(()=>{if(d)return d(Y),()=>d(null)},[d,Y]);let se=(0,S.useCallback)(()=>{if(!K()||D.kind!==`ready`||!window.confirm(`Reset all active overrides?`))return;B(!0),V(null);let e=ne(D.data),t={instance:f,kind:`reset`,promise:Promise.resolve()};return t.promise=Promise.resolve().then(async()=>{if(h.current!==f)return;let t=await r.put(`/api/settings`,e);if(h.current!==f)return;let n=R(t);O(n),await T()}).catch(e=>{h.current===f&&V(a(e))}).finally(()=>{_.current===t&&(_.current=null),h.current===f&&B(!1)}),_.current=t,t.promise},[K,r,f,T,O,D]);if(D.kind===`loading`)return(0,C.jsx)(c,{});if(D.kind===`offline`)return(0,C.jsx)(l,{port:e});if(D.kind===`error`)return(0,C.jsx)(u,{message:D.message});let X=D.data,Z=X.perCli||{},ce=te(Object.keys(Z)),Q=Z.codex||{},le=X.activeOverrides||{},$=Object.entries(le);return(0,C.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),Y().catch(e=>{h.current===f&&H(a(e))})},children:[ie?(0,C.jsx)(u,{message:ie}):null,(0,C.jsx)(s,{title:`Model defaults`,hint:`Per-CLI model and runtime defaults. Runtime transport applies to the next run; display and permissions stay separate.`,children:ce.length===0?(0,C.jsx)(`p`,{className:`settings-empty`,children:`No CLIs registered for this instance.`}):ce.map(e=>(0,C.jsx)(ee,{cli:e,meta:g(e,ae),original:Z[e]||{},value:k[e]||Z[e]||{},dirty:i,disabled:U||z,setValue:t=>{K()&&A({...k,[e]:t})},setEntry:J,client:r,pi:j,setPi:e=>{K()&&M(e)},onPiRegistered:oe},e))}),Z.codex?(0,C.jsxs)(s,{title:`Codex context window`,hint:`Codex-only sliders. Other CLIs ignore these values.`,children:[(0,C.jsx)(m,{id:`model-codex-ctx`,label:`Context window size`,disabled:U||z,value:F.contextWindowSize??(typeof Q.contextWindowSize==`number`?Q.contextWindowSize:1e6),min:0,step:1e4,onChange:e=>{K()&&(I({...F,contextWindowSize:e}),J(`perCli.codex.contextWindowSize`,{value:e,original:Q.contextWindowSize??1e6,valid:Number.isFinite(e)&&e>=0}))}}),(0,C.jsx)(m,{id:`model-codex-compact`,label:`Compact limit`,disabled:U||z,value:F.contextWindowCompactLimit??(typeof Q.contextWindowCompactLimit==`number`?Q.contextWindowCompactLimit:9e5),min:0,step:1e4,onChange:e=>{K()&&(I({...F,contextWindowCompactLimit:e}),J(`perCli.codex.contextWindowCompactLimit`,{value:e,original:Q.contextWindowCompactLimit??9e5,valid:Number.isFinite(e)&&e>=0}))}})]}):null,(0,C.jsx)(s,{title:`Fallback order`,hint:`Order of CLIs used when the active CLI fails. Press Enter to add a chip; Backspace to remove the last.`,children:(0,C.jsx)(p,{id:`model-fallbackOrder`,label:`Fallback order`,error:(()=>{let e=N.find(n);return e?`A saved ${t(e).replace(` (retired)`,``)} fallback is retired. Remove it before changing this order.`:null})(),disabled:U||z,value:N,onChange:e=>{K()&&(P(e),J(`fallbackOrder`,{value:e,original:X.fallbackOrder||[],valid:!e.some(n)}))},placeholder:`cli name`})}),(0,C.jsxs)(s,{title:`Active overrides`,hint:`Per-session overrides applied on top of per-CLI defaults.`,children:[$.length===0?(0,C.jsx)(`p`,{className:`settings-empty`,children:`No active overrides.`}):(0,C.jsxs)(`table`,{className:`settings-overrides-table`,children:[(0,C.jsx)(`thead`,{children:(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`th`,{scope:`col`,children:`CLI`}),(0,C.jsx)(`th`,{scope:`col`,children:`Model`}),(0,C.jsx)(`th`,{scope:`col`,children:`Effort`})]})}),(0,C.jsx)(`tbody`,{children:$.map(([e,t])=>(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`td`,{children:e}),(0,C.jsx)(`td`,{children:(0,C.jsx)(`code`,{children:t?.model||`—`})}),(0,C.jsx)(`td`,{children:(0,C.jsx)(`code`,{children:t?.effort||`—`})})]},e))})]}),(0,C.jsxs)(`div`,{className:`settings-overrides-actions`,children:[(0,C.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>void se(),disabled:U||z||$.length===0,children:z?`Resetting…`:`Reset overrides`}),re?(0,C.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:re}):null]})]})]})}export{ne as buildResetOverridesPatch,z as default,te as orderModelCliKeys};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-C_pPTFsM.js";import{t as n}from"./jsx-runtime-NZYk81nU.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-BeGD0rRQ.js";import{a as c,i as l,s as u}from"./fields-mlGpofqQ.js";import{t as d}from"./InlineWarn-DIMbcbzk.js";import{t as f}from"./path-utils-B6vBr0DD.js";var p=e(t(),1),m=n(),h=[`off`,`http-only`,`full`];function g(e){return e===`off`||e===`http-only`||e===`full`}var _=[`network.bindHost`,`network.lanBypass`,`network.remoteAccess.mode`,`network.remoteAccess.trustProxies`,`network.remoteAccess.trustForwardedFor`,`network.remoteAccess.publicOriginHint`],v=[{value:`127.0.0.1`,label:`127.0.0.1 — loopback only (recommended)`},{value:`0.0.0.0`,label:`0.0.0.0 — all interfaces (LAN exposed)`}],y=[{value:`off`,label:`off — block remote requests`},{value:`http-only`,label:`http-only — read-only HTTP from remote`},{value:`full`,label:`full — HTTP + WebSocket from remote`}];function b(e){let t={};return e.bindHost!==void 0&&(t.bindHost=e.bindHost),e.lanBypass!==void 0&&(t.lanBypass=e.lanBypass),t.remoteAccess={...e.remoteAccess??{}},t}function x(e){let t=(e||``).trim();if(t===``)return{kind:`empty`};let n;try{n=new URL(t)}catch{return{kind:`invalid`,reason:`Must be an absolute URL (https://… or http://…).`}}return n.protocol!==`http:`&&n.protocol!==`https:`?{kind:`invalid`,reason:`Only http:// or https:// origins are accepted.`}:n.hostname?n.pathname&&n.pathname!==`/`?{kind:`invalid`,reason:`Origin must not include a path.`}:n.search||n.hash?{kind:`invalid`,reason:`Origin must not include query or hash.`}:{kind:`valid`,origin:n.origin}:{kind:`invalid`,reason:`Origin must include a host.`}}function S(e){let t=(e.locationHost||``).toLowerCase().split(`:`)[0]||``;return t===``||t===`localhost`||t===`127.0.0.1`||t===`::1`||e.currentMode===e.nextMode?!1:e.nextMode===`off`}function C({port:e,client:t,dirty:n,registerSave:h}){let{state:C,refresh:w,setData:T}=r(t,`/api/settings`),[E,D]=(0,p.useState)({});(0,p.useEffect)(()=>{if(C.kind===`ready`){let e=C.data.network??{};D(b(e))}},[C]),(0,p.useEffect)(()=>()=>{for(let e of _)n.remove(e)},[n]);let O=(0,p.useCallback)((e,t)=>n.set(e,t),[n]),k=(0,p.useMemo)(()=>C.kind===`ready`?C.data.network??{}:{},[C]),A=k.remoteAccess??{},j=E.remoteAccess??{},M=E.bindHost??k.bindHost??`127.0.0.1`,N=!!(E.lanBypass??k.lanBypass),P=g(j.mode)?j.mode:g(A.mode)?A.mode:`off`,F=P!==`off`,I=!!(j.trustProxies??A.trustProxies),L=!!(j.trustForwardedFor??A.trustForwardedFor),R=j.publicOriginHint??A.publicOriginHint??``,z=x(R),B=S({currentMode:g(A.mode)?A.mode:`off`,nextMode:P,locationHost:typeof window<`u`?window.location.host:``}),V=(0,p.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0||B&&typeof window<`u`&&!window.confirm(`You are accessing this dashboard over a remote origin. Saving with remote access "off" will lock you out. Continue?`))return;let r=f(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear();let o=a.network??{};D(b(o)),T(a),await w()},[t,n,B,w,T]);if((0,p.useEffect)(()=>{if(h)return h(V),()=>h(null)},[h,V]),C.kind===`loading`)return(0,m.jsx)(a,{});if(C.kind===`offline`)return(0,m.jsx)(o,{port:e});if(C.kind===`error`)return(0,m.jsx)(s,{message:C.message});let H=(E.bindHost??k.bindHost)!==(k.bindHost??`127.0.0.1`);return(0,m.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),V()},children:[(0,m.jsxs)(i,{title:`Bind`,hint:`Listening interface for /i/${e}. Changes require an instance restart.`,children:[(0,m.jsx)(l,{id:`network-bindHost`,label:`Bind host`,value:M,options:v,onChange:e=>{D({...E,bindHost:e}),O(`network.bindHost`,{value:e,original:k.bindHost??`127.0.0.1`,valid:!0})}}),M===`0.0.0.0`&&(0,m.jsxs)(d,{children:[`Listening on `,(0,m.jsx)(`code`,{children:`0.0.0.0`}),` exposes this instance's API to anyone on your LAN. Pair with auth + firewall rules.`]}),H&&(0,m.jsx)(d,{tone:`info`,children:`Restart the instance for the new bind host to take effect.`}),(0,m.jsx)(c,{id:`network-lanBypass`,label:`LAN bypass`,description:`Skip auth checks for clients on the same LAN.`,value:N,onChange:e=>{D({...E,lanBypass:e}),O(`network.lanBypass`,{value:e,original:!!k.lanBypass,valid:!0})}}),N&&(0,m.jsx)(d,{children:`LAN bypass disables auth for any client on the same network. Only enable on a trusted network.`})]}),(0,m.jsxs)(i,{title:`Remote access`,hint:`Mode controls what reaches the API from outside the loopback interface.`,children:[(0,m.jsx)(l,{id:`network-remoteAccess-mode`,label:`Remote access mode`,value:P,options:y,onChange:e=>{g(e)&&(D({...E,remoteAccess:{...j,mode:e}}),O(`network.remoteAccess.mode`,{value:e,original:g(A.mode)?A.mode:`off`,valid:!0}))}}),(0,m.jsxs)(`p`,{className:`settings-section-hint`,children:[(0,m.jsx)(`strong`,{children:`off`}),` — only loopback can talk to the API.`,` `,(0,m.jsx)(`strong`,{children:`http-only`}),` — remote can issue HTTP requests but no WebSocket upgrades. `,(0,m.jsx)(`strong`,{children:`full`}),` — HTTP + WebSocket open to remote (use with auth).`]}),B&&(0,m.jsxs)(d,{role:`alert`,children:[`Saving will close remote access while you're connected from`,(0,m.jsxs)(`code`,{children:[` `,typeof window<`u`?window.location.host:``,` `]}),`— you will be locked out. Reach the dashboard over loopback first.`]}),F&&(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(c,{id:`network-remoteAccess-trustProxies`,label:`Trust proxies`,description:`Honor proxy headers when computing the client origin.`,value:I,onChange:e=>{D({...E,remoteAccess:{...j,trustProxies:e}}),O(`network.remoteAccess.trustProxies`,{value:e,original:!!A.trustProxies,valid:!0})}}),(0,m.jsx)(c,{id:`network-remoteAccess-trustForwardedFor`,label:`Trust X-Forwarded-For`,description:`Use X-Forwarded-For for the client IP. Only enable behind a known proxy.`,value:L,onChange:e=>{D({...E,remoteAccess:{...j,trustForwardedFor:e}}),O(`network.remoteAccess.trustForwardedFor`,{value:e,original:!!A.trustForwardedFor,valid:!0})}}),L&&!I&&(0,m.jsx)(d,{children:`Trusting X-Forwarded-For without trusting the proxy chain lets any client spoof its IP. Enable "Trust proxies" too.`}),(0,m.jsx)(u,{id:`network-remoteAccess-publicOriginHint`,label:`Public origin hint`,value:R,placeholder:`https://your-tunnel-url`,error:z.kind===`invalid`?z.reason:null,onChange:e=>{D({...E,remoteAccess:{...j,publicOriginHint:e}});let t=x(e);O(`network.remoteAccess.publicOriginHint`,{value:t.kind===`valid`?t.origin:e,original:A.publicOriginHint??``,valid:t.kind!==`invalid`})}})]})]})]})}export{h as REMOTE_ACCESS_MODES,C as default,S as detectSelfLockoutRisk,g as isRemoteAccessMode,x as parsePublicOriginHint};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-C_pPTFsM.js";import{t as n}from"./jsx-runtime-NZYk81nU.js";import{a as r,i,n as a,o,r as s,t as c}from"./notes-graph-settings-BUoTzvqs.js";import{B as l,Bt as u,Ft as d,It as f,Lt as p,Nt as m,Pt as h,V as g,zt as _}from"./vendor-utils-C1xaEGmb.js";var v=e(t(),1);function y(e){return{nodeSize:e.nodeSize,linkDistance:e.linkDistance,chargeStrength:e.chargeStrength,labelDensity:e.labelDensity,showArrows:e.showArrows,animate:e.animate}}function b(e,t){let n=e.kind===`tag`?5:e.kind===`missing`||e.kind===`ambiguous`?6:7,r=Math.sqrt(Math.max(0,e.degree))*2.4;return Math.min(26,Math.max(4,(n+r)*t.nodeSize))}function x(e,t,n){return e.kind===`missing`||e.kind===`ambiguous`?t>=.45:e.kind===`tag`?n.labelDensity>.35&&t>=.65:n.labelDensity>=.75?t>=.35:n.labelDensity>=.45?e.degree>0&&t>=.6:e.degree>=2&&t>=.85}var S=n();function C(e,t){let n=e.id===t?` is-selected`:``;return`notes-graph-node notes-graph-node-${e.kind}${n}`}function w(e){return`notes-graph-link notes-graph-link-${e.status}${e.virtual?` is-virtual`:``}`}function T(e){let t=(0,v.useRef)(null),n=(0,v.useRef)(null),r=(0,v.useRef)(e.onNavigate),[i,a]=(0,v.useState)({width:900,height:650});r.current=e.onNavigate;let o=(0,v.useMemo)(()=>y(e.settings),[e.settings]);return(0,v.useEffect)(()=>{let e=n.current;if(!e)return;let t=()=>{let t=e.getBoundingClientRect();a({width:Math.max(320,Math.floor(t.width||900)),height:Math.max(320,Math.floor(t.height||650))})};if(t(),typeof window.ResizeObserver!=`function`)return;let r=new window.ResizeObserver(t);return r.observe(e),()=>r.disconnect()},[]),(0,v.useEffect)(()=>{let n=t.current;if(!n)return;let a=u(n);if(a.selectAll(`*`).remove(),a.attr(`viewBox`,`0 0 ${i.width} ${i.height}`),e.data.nodes.length===0)return;let s=window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches??!1,c=e.data.nodes.map(e=>({...e})),v=new Map(c.map(e=>[e.id,e])),y=e.data.edges.flatMap(e=>{let t=v.get(e.source),n=v.get(e.target),r={raw:e.raw,status:e.status,...e.resolvedPath?{resolvedPath:e.resolvedPath}:{},...e.virtual?{virtual:e.virtual}:{}};return t&&n?[{...r,source:t,target:n}]:[]});a.append(`defs`).append(`marker`).attr(`id`,`notes-graph-arrow`).attr(`viewBox`,`0 -5 10 10`).attr(`refX`,15).attr(`refY`,0).attr(`markerWidth`,6).attr(`markerHeight`,6).attr(`orient`,`auto`).append(`path`).attr(`d`,`M0,-5L10,0L0,5`).attr(`fill`,`currentColor`);let S=a.append(`g`).attr(`class`,`notes-graph-viewport`),T=S.append(`g`).attr(`class`,`notes-graph-links`).selectAll(`line`).data(y).join(`line`).attr(`class`,w).attr(`marker-end`,o.showArrows?`url(#notes-graph-arrow)`:null),E=S.append(`g`).attr(`class`,`notes-graph-nodes`).selectAll(`g`).data(c).join(`g`).attr(`class`,t=>C(t,e.selectedPath)).attr(`tabindex`,e=>e.kind===`note`?0:-1).attr(`role`,e=>e.kind===`note`?`button`:`img`).attr(`aria-label`,e=>`${e.title}, ${e.kind}, ${e.degree} links`).on(`click`,(e,t)=>{t.kind===`note`&&t.path&&r.current(t.path)}).on(`keydown`,(e,t)=>{t.kind===`note`&&t.path&&(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),r.current(t.path))});E.append(`circle`).attr(`r`,e=>b(e,o)).attr(`fill`,e=>e.groupColor??null),E.append(`text`).attr(`class`,`notes-graph-label`).attr(`x`,e=>b(e,o)+8).attr(`y`,4).text(e=>e.title),E.append(`title`).text(e=>e.groupLabel?`${e.title} · ${e.groupLabel}`:e.title);let D=h(c).force(`link`,d(y).id(e=>e.id).distance(o.linkDistance)).force(`charge`,m().strength(o.chargeStrength)).force(`center`,p(i.width/2,i.height/2)).force(`collision`,f().radius(e=>b(e,o)+8));function O(){T.attr(`x1`,e=>e.source.x??0).attr(`y1`,e=>e.source.y??0).attr(`x2`,e=>e.target.x??0).attr(`y2`,e=>e.target.y??0),E.attr(`transform`,e=>`translate(${e.x??i.width/2},${e.y??i.height/2})`)}let k=l().scaleExtent([.18,5]).on(`zoom`,e=>{S.attr(`transform`,e.transform),E.classed(`is-label-visible`,t=>x(t,e.transform.k,o))});a.call(k);let A=g.translate(0,0).scale(1);a.call(k.transform,A);let j=_().on(`start`,(e,t)=>{!e.active&&o.animate&&!s&&D.alphaTarget(.25).restart(),t.fx=t.x,t.fy=t.y}).on(`drag`,(e,t)=>{t.fx=e.x,t.fy=e.y}).on(`end`,(e,t)=>{e.active||D.alphaTarget(0),t.fx=null,t.fy=null});return E.call(j),o.animate&&!s?D.on(`tick`,O):(D.tick(120),O(),D.stop()),()=>{D.stop(),a.on(`.zoom`,null)}},[e.data,e.selectedPath,i,o,e.fitToken]),(0,S.jsxs)(`div`,{ref:n,className:`notes-graph-canvas`,"data-empty":e.data.nodes.length===0?`true`:`false`,children:[e.data.nodes.length===0?(0,S.jsx)(`div`,{className:`notes-graph-empty-state`,children:`No matching graph nodes`}):null,(0,S.jsx)(`svg`,{ref:t,className:`notes-graph-svg`,"aria-label":`Notes graph`})]})}function E(e){return e===`filters`?`Filters`:e===`display`?`Display`:e===`forces`?`Forces`:`Groups`}function D(e,t){return{...e,...t,collapsedSections:t.collapsedSections??e.collapsedSections,groups:t.groups??e.groups}}function O(e){return(0,S.jsxs)(`label`,{className:`notes-graph-toggle${e.disabled?` is-disabled`:``}`,children:[(0,S.jsx)(`span`,{children:e.label}),(0,S.jsx)(`input`,{type:`checkbox`,checked:e.checked,disabled:e.disabled,onChange:t=>e.onChange(t.currentTarget.checked)})]})}function k(e){let{settings:t}=e;function n(n){e.onChange(D(t,n))}function i(e){n({[e]:!t[e]})}function o(e){n({collapsedSections:{...t.collapsedSections,[e]:!t.collapsedSections[e]}})}function c(e,r){n({groups:t.groups.map(t=>t.id===e?{...t,...r}:t)})}function l(){n({groups:[...t.groups,r(t.groups.length,t.query)]})}function u(e){n({groups:t.groups.filter(t=>t.id!==e)})}return(0,S.jsxs)(`aside`,{className:`notes-graph-controls`,"aria-label":`Graph controls`,children:[(0,S.jsxs)(`header`,{className:`notes-graph-controls-header`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h3`,{children:`Graph`}),(0,S.jsx)(`span`,{children:e.selectedPath?`Focus-ready`:`Global view`})]}),(0,S.jsx)(`button`,{type:`button`,className:`notes-graph-icon-button`,onClick:e.onClose,"aria-label":`Close graph controls`,children:`X`})]}),s.map(r=>(0,S.jsxs)(`section`,{className:`notes-graph-control-section`,children:[(0,S.jsxs)(`button`,{type:`button`,className:`notes-graph-section-toggle`,onClick:()=>o(r),"aria-expanded":!t.collapsedSections[r],children:[(0,S.jsx)(`span`,{children:E(r)}),(0,S.jsx)(`span`,{children:t.collapsedSections[r]?`+`:`-`})]}),!t.collapsedSections[r]&&r===`filters`?(0,S.jsxs)(`div`,{className:`notes-graph-control-body`,children:[(0,S.jsxs)(`label`,{className:`notes-graph-field`,children:[(0,S.jsx)(`span`,{children:`Search`}),(0,S.jsx)(`input`,{value:t.query,onChange:e=>n({query:e.currentTarget.value}),placeholder:`title, path:, tag:, kind:`})]}),(0,S.jsx)(O,{label:`Existing files only`,checked:t.existingFilesOnly,onChange:()=>i(`existingFilesOnly`)}),(0,S.jsx)(O,{label:`Show orphans`,checked:t.showOrphans,onChange:()=>i(`showOrphans`)}),(0,S.jsx)(O,{label:`Show tags`,checked:t.showTags,onChange:()=>i(`showTags`)}),(0,S.jsx)(O,{label:`Show attachments`,checked:t.showAttachments,onChange:()=>i(`showAttachments`)}),(0,S.jsx)(O,{label:`Focus selected`,checked:t.focusSelected,disabled:!e.selectedPath,onChange:()=>i(`focusSelected`)}),(0,S.jsxs)(`label`,{className:`notes-graph-field`,children:[(0,S.jsxs)(`span`,{children:[`Depth `,t.focusDepth]}),(0,S.jsx)(`input`,{type:`range`,min:`1`,max:`4`,value:t.focusDepth,disabled:!t.focusSelected||!e.selectedPath,onChange:e=>n({focusDepth:Number(e.currentTarget.value)})})]})]}):null,!t.collapsedSections[r]&&r===`display`?(0,S.jsxs)(`div`,{className:`notes-graph-control-body`,children:[(0,S.jsxs)(`label`,{className:`notes-graph-field`,children:[(0,S.jsxs)(`span`,{children:[`Node size `,t.nodeSize.toFixed(1)]}),(0,S.jsx)(`input`,{type:`range`,min:`0.6`,max:`2`,step:`0.1`,value:t.nodeSize,onChange:e=>n({nodeSize:Number(e.currentTarget.value)})})]}),(0,S.jsxs)(`label`,{className:`notes-graph-field`,children:[(0,S.jsxs)(`span`,{children:[`Labels `,Math.round(t.labelDensity*100),`%`]}),(0,S.jsx)(`input`,{type:`range`,min:`0`,max:`1`,step:`0.05`,value:t.labelDensity,onChange:e=>n({labelDensity:Number(e.currentTarget.value)})})]}),(0,S.jsx)(O,{label:`Show arrows`,checked:t.showArrows,onChange:()=>i(`showArrows`)}),(0,S.jsx)(O,{label:`Animate`,checked:t.animate,onChange:()=>i(`animate`)})]}):null,!t.collapsedSections[r]&&r===`forces`?(0,S.jsxs)(`div`,{className:`notes-graph-control-body`,children:[(0,S.jsxs)(`label`,{className:`notes-graph-field`,children:[(0,S.jsxs)(`span`,{children:[`Link distance `,t.linkDistance]}),(0,S.jsx)(`input`,{type:`range`,min:`40`,max:`240`,value:t.linkDistance,onChange:e=>n({linkDistance:Number(e.currentTarget.value)})})]}),(0,S.jsxs)(`label`,{className:`notes-graph-field`,children:[(0,S.jsxs)(`span`,{children:[`Repel `,Math.abs(t.chargeStrength)]}),(0,S.jsx)(`input`,{type:`range`,min:`-800`,max:`-20`,value:t.chargeStrength,onChange:e=>n({chargeStrength:Number(e.currentTarget.value)})})]}),(0,S.jsxs)(`div`,{className:`notes-graph-control-row`,children:[(0,S.jsx)(`button`,{type:`button`,onClick:e.onFit,children:`Fit`}),(0,S.jsx)(`button`,{type:`button`,onClick:e.onReset,children:`Reset`})]})]}):null,!t.collapsedSections[r]&&r===`groups`?(0,S.jsxs)(`div`,{className:`notes-graph-control-body`,children:[(0,S.jsx)(O,{label:`Query groups`,checked:t.groupMode===`query`,onChange:e=>n({groupMode:e?`query`:`off`})}),(0,S.jsx)(`div`,{className:`notes-graph-groups`,children:t.groups.map((e,t)=>(0,S.jsxs)(`div`,{className:`notes-graph-group-row`,children:[(0,S.jsx)(`input`,{className:`notes-graph-color`,type:`color`,value:e.color,onChange:t=>c(e.id,{color:t.currentTarget.value})}),(0,S.jsx)(`input`,{value:e.label,onChange:t=>c(e.id,{label:t.currentTarget.value}),"aria-label":`Group ${t+1} label`}),(0,S.jsx)(`input`,{value:e.query,onChange:t=>c(e.id,{query:t.currentTarget.value}),"aria-label":`Group ${t+1} query`}),(0,S.jsx)(`button`,{type:`button`,onClick:()=>c(e.id,{enabled:!e.enabled}),"aria-pressed":e.enabled,children:e.enabled?`On`:`Off`}),(0,S.jsx)(`button`,{type:`button`,className:`notes-graph-icon-button`,onClick:()=>u(e.id),"aria-label":`Remove ${e.label}`,children:`X`})]},e.id))}),(0,S.jsx)(`div`,{className:`notes-graph-swatches`,"aria-label":`Group color presets`,children:a.map(e=>(0,S.jsx)(`span`,{style:{background:e}},e))}),(0,S.jsx)(`button`,{type:`button`,onClick:l,children:`Add group`})]}):null]},r))]})}var A={note:0,tag:1,missing:2,ambiguous:3,attachment:4};function j(e){return e.trim().replace(/^#/,``).toLowerCase()}function M(e){return`tag:${j(e)}`}function N(e,t){let n=[e.id,e.title,e.path??``];return t&&n.push(t.title,t.path,...t.aliases,...t.tags),n.filter(Boolean).map(e=>e.toLowerCase())}function P(e,t,n){let r=e.toLowerCase();if(r.startsWith(`kind:`))return t.kind===r.slice(5);if(r.startsWith(`path:`))return(t.path??t.id).toLowerCase().includes(r.slice(5));if(r.startsWith(`tag:`)){let e=j(r.slice(4));return e?t.kind===`tag`?j(t.title).includes(e)||t.id.includes(e):!!n?.tags.some(t=>j(t).includes(e)):!0}return N(t,n).some(e=>e.includes(r))}function F(e,t,n){let r=e.trim().split(/\s+/).filter(Boolean);return r.length===0||r.every(e=>P(e,t,n))}function I(e,t,n){if(n.groupMode!==`off`)return n.groups.find(n=>n.enabled&&F(n.query,e,t))}function L(e,t){let n=new Map;for(let t of e.graph.nodes)n.set(t.id,{...t});for(let t of e.notes)n.has(t.path)||n.set(t.path,{id:t.path,title:t.title,kind:`note`,path:t.path});let r=e.graph.edges.map(e=>({...e}));if(t.showTags)for(let t of e.notes)for(let e of t.tags){let i=j(e);if(!i)continue;let a=M(i);n.has(a)||n.set(a,{id:a,title:`#${i}`,kind:`tag`}),r.push({source:t.path,target:a,raw:`#${i}`,status:`resolved`,resolvedPath:t.path})}return{nodes:[...n.values()],edges:r}}function R(e){let t=new Map;for(let n of e)t.set(n.source,(t.get(n.source)??0)+1),t.set(n.target,(t.get(n.target)??0)+1);return t}function z(e,t,n){let r=new Map;for(let t of e)r.has(t.source)||r.set(t.source,new Set),r.has(t.target)||r.set(t.target,new Set),r.get(t.source)?.add(t.target),r.get(t.target)?.add(t.source);let i=new Set([t]),a=new Set([t]);for(let e=0;e<n;e+=1){let e=new Set;for(let t of a)for(let n of r.get(t)??[])i.has(n)||(i.add(n),e.add(n));if(a=e,a.size===0)break}return i}function B(e,t){return A[e.kind]-A[t.kind]||e.title.localeCompare(t.title)||e.id.localeCompare(t.id)}function V(e,t,n){if(!e)return{nodes:[],edges:[],noteCount:0,linkCount:0,missingCount:0,tagCount:0,hiddenCount:0};let r=new Map(e.notes.map(e=>[e.path,e])),i=L(e,t),a=i.nodes.filter(e=>t.existingFilesOnly&&(e.kind===`missing`||e.kind===`ambiguous`)||!t.showTags&&e.kind===`tag`||!t.showAttachments&&e.kind===`attachment`?!1:F(t.query,e,r.get(e.path??e.id))),o=new Set(a.map(e=>e.id)),s=i.edges.filter(e=>o.has(e.source)&&o.has(e.target));if(!t.showOrphans){let e=R(s);a=a.filter(t=>t.id===n||(e.get(t.id)??0)>0||t.kind!==`note`),o=new Set(a.map(e=>e.id)),s=s.filter(e=>o.has(e.source)&&o.has(e.target))}if(t.focusSelected&&n&&o.has(n)){let e=z(s,n,t.focusDepth);a=a.filter(t=>e.has(t.id)),o=new Set(a.map(e=>e.id)),s=s.filter(e=>o.has(e.source)&&o.has(e.target))}let c=R(s),l=a.map(e=>{let n=r.get(e.path??e.id),i=I(e,n,t);return{...e,degree:c.get(e.id)??0,...i?{groupColor:i.color,groupLabel:i.label}:{},searchMatch:F(t.query,e,n)}}).sort(B),u=new Set(l.map(e=>e.id)),d=s.filter(e=>u.has(e.source)&&u.has(e.target)).map(e=>({...e,virtual:e.target.startsWith(`tag:`)||e.source.startsWith(`tag:`)})).sort((e,t)=>e.source.localeCompare(t.source)||e.target.localeCompare(t.target)||e.raw.localeCompare(t.raw));return{nodes:l,edges:d,noteCount:l.filter(e=>e.kind===`note`).length,linkCount:d.filter(e=>!e.virtual).length,missingCount:l.filter(e=>e.kind===`missing`||e.kind===`ambiguous`).length,tagCount:l.filter(e=>e.kind===`tag`).length,hiddenCount:i.nodes.length-l.length}}var H={dataPlane:`dashboard-notes-api`,shellPanels:`render-only`};function U(){return i(c)}function W(e){let[t,n]=(0,v.useState)(()=>o(e.settings??U())),[r,i]=(0,v.useState)(0),a=(0,v.useRef)(null);(0,v.useEffect)(()=>{n(o(e.settings??U()))},[e.settings]),(0,v.useEffect)(()=>()=>{a.current!=null&&window.clearTimeout(a.current)},[]);function s(t,r=!1){if(n(t),e.onSettingsChange){if(a.current!=null&&window.clearTimeout(a.current),r){e.onSettingsChange(t);return}a.current=window.setTimeout(()=>e.onSettingsChange?.(t),140)}}function c(){s(U(),!0),i(e=>e+1)}function l(){s({...t,panelOpen:!1},!0)}function u(){s({...t,panelOpen:!0},!0)}let d=(0,v.useMemo)(()=>V(e.vaultIndex,t,e.selectedPath),[e.vaultIndex,t,e.selectedPath]);return(0,S.jsxs)(`div`,{className:`notes-graph-workspace${t.panelOpen?` has-controls`:``}`,children:[(0,S.jsxs)(`header`,{className:`notes-graph-toolbar`,children:[(0,S.jsxs)(`div`,{className:`notes-graph-counts`,"aria-live":`polite`,children:[(0,S.jsx)(`strong`,{children:d.noteCount}),` notes`,(0,S.jsxs)(`span`,{children:[d.linkCount,` links`]}),(0,S.jsxs)(`span`,{children:[d.missingCount,` unresolved`]}),d.tagCount>0?(0,S.jsxs)(`span`,{children:[d.tagCount,` tags`]}):null]}),(0,S.jsxs)(`div`,{className:`notes-graph-actions`,children:[(0,S.jsx)(`button`,{type:`button`,onClick:()=>i(e=>e+1),children:`Fit`}),(0,S.jsx)(`button`,{type:`button`,onClick:c,children:`Reset`}),t.panelOpen?null:(0,S.jsx)(`button`,{type:`button`,onClick:u,children:`Controls`})]})]}),(0,S.jsxs)(`div`,{className:`notes-graph-body`,children:[(0,S.jsx)(T,{data:d,selectedPath:e.selectedPath,settings:t,fitToken:r,onNavigate:e.onNavigate}),t.panelOpen?(0,S.jsx)(k,{settings:t,selectedPath:e.selectedPath,onChange:e=>s(e),onReset:c,onFit:()=>i(e=>e+1),onClose:l}):null]})]})}export{H as NOTES_GRAPH_RUNTIME_BOUNDARY,W as NotesGraphWorkspace};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-C_pPTFsM.js";import{t as n}from"./jsx-runtime-NZYk81nU.js";import{r}from"./terminal-shortcut-queue-B_AyW1hN.js";var i=e(t(),1),a=null,o={register(e){return a=e,()=>{a===e&&(a=null)}},dispatch(e){return a?.(e)??!1}},s=[`terminal`,`browser`,`logs`,`activity`],c=9999,l=[`files`,`diff`,`browser`,`design`],u={files:`Files`,diff:`Diff`,browser:`Browser`,design:`Design`},d=[`files`,`browser`,`design`],f=`Working tree`,p=.5,m=n();function h(e){return d.includes(e)}function g(e,t){return e===`diff`?`right-diff`:`right-${e}-${t??1}`}function _(e,t){return e===`diff`?f:`${u[e]} ${t??1}`}function v(e,t,n){if(t===`diff`){let t=e.openTabs.find(e=>e.kind===`diff`);if(t)return{...e,activeTabId:t.id};let r={id:g(`diff`),kind:`diff`,title:n?.title??u.diff,specificName:n?.specificName??`Working tree`,...n?.sourceLabel?{sourceLabel:n.sourceLabel}:{}};return{...e,openTabs:[...e.openTabs,r],activeTabId:r.id}}let r=e.openTabs.filter(e=>e.kind===t).reduce((e,t)=>Math.max(e,t.ordinal??1),0),i=Math.max(e.nextOrdinalByKind[t]??1,r+1),a={id:g(t,i),kind:t,title:n?.title??u[t],specificName:n?.specificName??_(t,i),ordinal:i,...n?.sourceLabel?{sourceLabel:n.sourceLabel}:{}},o=h(t)?{...e.nextOrdinalByKind,[t]:i+1}:e.nextOrdinalByKind;return{openTabs:[...e.openTabs,a],activeTabId:a.id,nextOrdinalByKind:o}}function y(e,t){let n=e.openTabs.find(e=>e.kind===t);return n?{...e,activeTabId:n.id}:v(e,t)}function b(e,t){return e.openTabs.find(e=>e.id===t)?{...e,activeTabId:t}:e}function x(e,t,n){let r=e.openTabs.findIndex(e=>e.id===t);if(r===-1)return e;let i=e.openTabs[r],a={...i,...n.title===void 0?{}:{title:n.title},...n.specificName===void 0?{}:{specificName:n.specificName},...n.sourceLabel===void 0?{}:{sourceLabel:n.sourceLabel}};if(a.title===i.title&&a.specificName===i.specificName&&a.sourceLabel===i.sourceLabel)return e;let o=[...e.openTabs];return o[r]=a,{...e,openTabs:o}}function S(e){if(!e)return null;let t=e.replace(/\\/g,`/`).replace(/\/+$/,``).split(`/`).filter(Boolean);return t[t.length-1]??null}function C(e,t){return S(t.activeFilePath)??S(t.folderRootPath)??_(`files`,e.ordinal)}function w(e,t,n){let r=e.openTabs.findIndex(e=>e.id===t&&e.kind===`files`);if(r===-1)return e;let i=e.openTabs[r],a={...i.files,...n},o=C(i,a),s=a.activeFilePath??a.folderRootPath??void 0,c=[...e.openTabs];return c[r]={...i,files:a,specificName:o,...s?{sourceLabel:s}:{}},{...e,openTabs:c}}function T(e,t,n,r){let i=e.openTabs.find(e=>e.id===t&&e.kind===`files`);return i?r===`follow-instance`?w(e,t,{repoRootPath:n,repoRootMode:`instance`}):r===`instance`&&i.files?.repoRootMode===`manual`?e:w(e,t,{repoRootPath:n,repoRootMode:r}):e}function E(e){let t=e.openTabs.find(t=>t.id===e.activeTabId);return t?.kind===`files`?t:e.openTabs.find(e=>e.kind===`files`)??null}function D(e,t){let n=e,r=E(n);return r?n=b(n,r.id):(n=v(n,`files`),r=n.openTabs[n.openTabs.length-1]??null),r?w(n,r.id,{activeFilePath:t}):n}function O(e,t){let n=e,r=E(n);return r?n=b(n,r.id):(n=v(n,`files`),r=n.openTabs[n.openTabs.length-1]??null),r?w(n,r.id,{folderRootPath:t,repoRootPath:null,repoRootMode:`instance`}):n}function k(e){if(!e)return null;try{return new URL(e).hostname.replace(/^www\./,``)||null}catch{return null}}function A(e,t,n){let r=e.openTabs.findIndex(e=>e.id===t&&e.kind===`browser`);if(r===-1)return e;let i=e.openTabs[r],a=n.url??i.browser?.url,o=n.title?.trim()||k(a)||_(`browser`,i.ordinal),s={...i,...a?{browser:{...i.browser,url:a}}:{},specificName:o,...a?{sourceLabel:a}:{}};if(s.specificName===i.specificName&&s.sourceLabel===i.sourceLabel&&s.browser?.url===i.browser?.url)return e;let c=[...e.openTabs];return c[r]=s,{...e,openTabs:c}}function j(e,t,n){let r=e.openTabs.findIndex(e=>e.id===t&&e.kind===`design`);if(r===-1)return e;let i=e.openTabs[r],a={...i.design};if(n.pageId!==void 0&&(a.pageId=n.pageId),n.zoom!==void 0&&(a.zoom=n.zoom),n.projectKey!==void 0&&(a.projectKey===void 0||a.projectKey===null)&&(a.projectKey=n.projectKey),a.pageId===i.design?.pageId&&a.projectKey===i.design?.projectKey&&a.zoom===i.design?.zoom)return e;let o=[...e.openTabs];return o[r]={...i,design:a},{...e,openTabs:o}}function M(e,t){let n=v(e,`browser`),r=n.openTabs[n.openTabs.length-1];return r?A(n,r.id,{url:t}):n}function N(e,t){let n=e.openTabs.findIndex(e=>e.id===t);if(n===-1)return e;let r=e.openTabs.filter(e=>e.id!==t),i=e.activeTabId;if(e.activeTabId===t){if(r.length===0)i=null;else{let e=Math.min(n,r.length-1);i=(n>0?r[n-1]:r[e])?.id??null}}return{openTabs:r,activeTabId:i,nextOrdinalByKind:e.nextOrdinalByKind}}function P(e){return e<=.12?`folder-only`:e>=.88?`file-only`:`split`}function F(e){return typeof e!=`number`||!Number.isFinite(e)?p:Math.max(0,Math.min(1,e))}function I(e){if(e.mode!==`folder-only`)return e;let t=e.lastSplitRatio||.5;return{mode:`split`,splitRatio:t,lastSplitRatio:t}}function L(e){return typeof e!=`number`||!Number.isFinite(e)?480:Math.min(c,Math.max(260,Math.round(e)))}function R(e){return typeof e!=`number`||!Number.isFinite(e)?320:Math.min(520,Math.max(180,Math.round(e)))}function z(e){let t={...e};t.width=L(t.width);let n=t.tabs.openTabs.filter(e=>l.includes(e.kind));return n.length!==t.tabs.openTabs.length&&(t.tabs={...t.tabs,openTabs:n}),t.tabs.activeTabId&&!n.find(e=>e.id===t.tabs.activeTabId)&&(t.tabs={...t.tabs,activeTabId:n[0]?.id??null}),!t.tabs.activeTabId&&n.length>0&&(t.tabs={...t.tabs,activeTabId:n[0].id}),t.tabs.openTabs.length===0&&t.open&&(t.open=!1),t}function B(e,t){switch(t.type){case`SET_RIGHT_OPEN`:return{...e,rightPanel:{...e.rightPanel,open:t.open}};case`SET_RIGHT_WIDTH`:return{...e,rightPanel:{...e.rightPanel,width:L(t.width)}};case`FOCUS_OR_CREATE_FIRST_RIGHT_SIDEBAR_TAB`:{let n=y(e.rightPanel.tabs,t.kind);return{...e,rightPanel:{...e.rightPanel,open:!0,tabs:n}}}case`CREATE_RIGHT_SIDEBAR_TAB`:{let n=v(e.rightPanel.tabs,t.kind,t.tab);return{...e,rightPanel:{...e.rightPanel,open:!0,tabs:n}}}case`ACTIVATE_RIGHT_SIDEBAR_TAB`:{let n=b(e.rightPanel.tabs,t.tabId);return{...e,rightPanel:{...e.rightPanel,tabs:n}}}case`SET_RIGHT_SIDEBAR_TAB_META`:{let n=x(e.rightPanel.tabs,t.tabId,t.patch);return n===e.rightPanel.tabs?e:{...e,rightPanel:{...e.rightPanel,tabs:n}}}case`CLOSE_RIGHT_SIDEBAR_TAB`:{let n=N(e.rightPanel.tabs,t.tabId),r=n.openTabs.length>0;return{...e,rightPanel:{...e.rightPanel,open:r,tabs:n}}}case`OPEN_FILE_IN_FILES_TAB`:{let n=D(e.rightPanel.tabs,t.path);return{...e,rightPanel:{...e.rightPanel,open:!0,tabs:n,fileFolderLayout:I(e.rightPanel.fileFolderLayout)}}}case`OPEN_FOLDER_IN_FILES_TAB`:{let n=O(e.rightPanel.tabs,t.path);return{...e,rightPanel:{...e.rightPanel,open:!0,tabs:n}}}case`SET_FILES_TAB_FILE`:{let n=w(e.rightPanel.tabs,t.tabId,{activeFilePath:t.path});if(n===e.rightPanel.tabs)return e;let r=t.path?I(e.rightPanel.fileFolderLayout):e.rightPanel.fileFolderLayout;return{...e,rightPanel:{...e.rightPanel,tabs:n,fileFolderLayout:r}}}case`SET_FILES_TAB_ROOT`:{let n=w(e.rightPanel.tabs,t.tabId,{folderRootPath:t.path,repoRootPath:null,repoRootMode:`instance`});return n===e.rightPanel.tabs?e:{...e,rightPanel:{...e.rightPanel,tabs:n}}}case`SET_FILES_TAB_REPO_ROOT`:{let n=T(e.rightPanel.tabs,t.tabId,t.path,t.mode);return n===e.rightPanel.tabs?e:{...e,rightPanel:{...e.rightPanel,tabs:n}}}case`SET_BROWSER_TAB_STATE`:{let n={};t.url!==void 0&&(n.url=t.url),t.title!==void 0&&(n.title=t.title);let r=A(e.rightPanel.tabs,t.tabId,n);return r===e.rightPanel.tabs?e:{...e,rightPanel:{...e.rightPanel,tabs:r}}}case`OPEN_BROWSER_MODULE_TAB`:{let n=M(e.rightPanel.tabs,t.url);return{...e,rightPanel:{...e.rightPanel,open:!0,tabs:n}}}case`SET_DESIGN_TAB_STATE`:{let n=j(e.rightPanel.tabs,t.tabId,t.patch);return n===e.rightPanel.tabs?e:{...e,rightPanel:{...e.rightPanel,tabs:n}}}case`SET_FILE_FOLDER_SPLIT_RATIO`:{let n=F(t.ratio),r=P(n),i=r===`split`?n:e.rightPanel.fileFolderLayout.lastSplitRatio;return{...e,rightPanel:{...e.rightPanel,fileFolderLayout:{mode:r,splitRatio:n,lastSplitRatio:i}}}}case`SET_FILE_FOLDER_VIEW_MODE`:{let n=e.rightPanel.fileFolderLayout;if(t.mode===n.mode)return e;let r=n.splitRatio,i=n.lastSplitRatio;return t.mode===`folder-only`?r=0:t.mode===`file-only`?r=1:(r=i||.5,i=r),{...e,rightPanel:{...e.rightPanel,fileFolderLayout:{mode:t.mode,splitRatio:r,lastSplitRatio:i}}}}case`RESTORE_FILE_FOLDER_SPLIT`:{let t=e.rightPanel.fileFolderLayout.lastSplitRatio||.5;return{...e,rightPanel:{...e.rightPanel,fileFolderLayout:{mode:`split`,splitRatio:t,lastSplitRatio:t}}}}case`SET_BOTTOM_OPEN`:return{...e,bottomPanel:{...e.bottomPanel,open:t.open}};case`SET_BOTTOM_HEIGHT`:return{...e,bottomPanel:{...e.bottomPanel,height:R(t.height)}};case`OPEN_BOTTOM_TAB`:{let n=e.bottomPanel,r=n.tabs.includes(t.tab)?n.tabs:[...n.tabs,t.tab];return{...e,bottomPanel:{...n,open:!0,tabs:r,activeTab:t.tab}}}case`CLOSE_BOTTOM_TAB`:{let n=e.bottomPanel,r=n.tabs.filter(e=>e!==t.tab),i=n.activeTab===t.tab?r[0]??null:n.activeTab,a=r.length>0;return{...e,bottomPanel:{...n,tabs:r,activeTab:i,open:a}}}case`SET_BOTTOM_ACTIVE_TAB`:return{...e,bottomPanel:{...e.bottomPanel,activeTab:t.tab}};case`HYDRATE`:{let n=t.state,r=z({...e.rightPanel,...n.rightPanel}),i={...e.bottomPanel,...n.bottomPanel};return i.height=R(i.height),i.tabs=(i.tabs??[]).filter(e=>s.includes(e)),i.activeTab!==null&&!i.tabs.includes(i.activeTab)&&(i.activeTab=i.tabs[0]??null),{rightPanel:r,bottomPanel:i}}default:return e}}var V={rightPanel:{open:!1,width:480,tabs:{openTabs:[],activeTabId:null,nextOrdinalByKind:{}},fileFolderLayout:{mode:`split`,splitRatio:p,lastSplitRatio:p}},bottomPanel:{open:!1,height:320,tabs:[],activeTab:null}},H=(0,i.createContext)(null);function U(e){let{tabs:t}=e.rightPanel;return t.activeTabId?t.openTabs.find(e=>e.id===t.activeTabId)?.kind??null:null}function W(e){let[t,n]=(0,i.useReducer)(B,V),a=(0,i.useRef)(null),s=(0,i.useCallback)(e=>{a.current??=r(window),a.current.enqueue(e)},[]);(0,i.useEffect)(()=>()=>{a.current?.dispose(),a.current=null},[]);let c=(0,i.useRef)(!1);(0,i.useEffect)(()=>{e.initialPanelState&&!c.current&&(c.current=!0,n({type:`HYDRATE`,state:e.initialPanelState}))},[e.initialPanelState]);let l=(0,i.useRef)(e.onStateChange);l.current=e.onStateChange,(0,i.useEffect)(()=>{if(!l.current)return;let e=setTimeout(()=>l.current?.(t),300);return()=>clearTimeout(e)},[t]);let u=t.rightPanel.open&&t.rightPanel.tabs.openTabs.length>0&&t.rightPanel.tabs.activeTabId!==null,d=U(t);(0,i.useEffect)(()=>o.register(e=>{switch(e){case`toggleBottomPanel`:return t.bottomPanel.open?n({type:`SET_BOTTOM_OPEN`,open:!1}):n({type:`OPEN_BOTTOM_TAB`,tab:`terminal`}),!0;case`toggleRightPanel`:return n(u?{type:`SET_RIGHT_OPEN`,open:!1}:{type:`FOCUS_OR_CREATE_FIRST_RIGHT_SIDEBAR_TAB`,kind:`files`}),!0;case`focusTerminal`:return n({type:`OPEN_BOTTOM_TAB`,tab:`terminal`}),s(`focusTerminal`),!0;case`newTerminalSession`:return n({type:`OPEN_BOTTOM_TAB`,tab:`terminal`}),s(`newTerminalSession`),!0;case`openDiff`:return n({type:`FOCUS_OR_CREATE_FIRST_RIGHT_SIDEBAR_TAB`,kind:`diff`}),!0;case`openFolderTree`:return n({type:`FOCUS_OR_CREATE_FIRST_RIGHT_SIDEBAR_TAB`,kind:`files`}),!0;case`closeActiveBottomTab`:return t.bottomPanel.activeTab&&n({type:`CLOSE_BOTTOM_TAB`,tab:t.bottomPanel.activeTab}),!0;default:return!1}}),[t.bottomPanel.open,t.bottomPanel.activeTab,u,s]);let f=(0,i.useMemo)(()=>({state:t,dispatch:n,effectiveRightOpen:u,activeRightTabKind:d}),[t,u,d]);return(0,m.jsx)(H.Provider,{value:f,children:e.children})}function G(){let e=(0,i.useContext)(H);if(!e)throw Error(`usePanelLayout must be used within PanelLayoutProvider`);return e}function K(){let{dispatch:e,state:t}=G();return(0,i.useMemo)(()=>({focusOrCreateFirstRightSidebarTab:t=>e({type:`FOCUS_OR_CREATE_FIRST_RIGHT_SIDEBAR_TAB`,kind:t}),createRightSidebarTab:(t,n)=>e({type:`CREATE_RIGHT_SIDEBAR_TAB`,kind:t,...n?{tab:n}:{}}),activateRightSidebarTab:t=>e({type:`ACTIVATE_RIGHT_SIDEBAR_TAB`,tabId:t}),setRightSidebarTabMeta:(t,n)=>e({type:`SET_RIGHT_SIDEBAR_TAB_META`,tabId:t,patch:n}),closeRightSidebarTab:t=>e({type:`CLOSE_RIGHT_SIDEBAR_TAB`,tabId:t}),setRightWidth:t=>e({type:`SET_RIGHT_WIDTH`,width:t}),setFileFolderSplitRatio:t=>e({type:`SET_FILE_FOLDER_SPLIT_RATIO`,ratio:t}),setFileFolderViewMode:t=>e({type:`SET_FILE_FOLDER_VIEW_MODE`,mode:t}),restoreFileFolderSplit:()=>e({type:`RESTORE_FILE_FOLDER_SPLIT`}),toggleRightPanel:()=>t.rightPanel.open&&t.rightPanel.tabs.openTabs.length>0?e({type:`SET_RIGHT_OPEN`,open:!1}):e({type:`FOCUS_OR_CREATE_FIRST_RIGHT_SIDEBAR_TAB`,kind:`files`}),openBottomTab:t=>e({type:`OPEN_BOTTOM_TAB`,tab:t}),closeBottomTab:t=>e({type:`CLOSE_BOTTOM_TAB`,tab:t}),setBottomActiveTab:t=>e({type:`SET_BOTTOM_ACTIVE_TAB`,tab:t}),setBottomHeight:t=>e({type:`SET_BOTTOM_HEIGHT`,height:t}),toggleBottomPanel:()=>t.bottomPanel.open?e({type:`SET_BOTTOM_OPEN`,open:!1}):e({type:`OPEN_BOTTOM_TAB`,tab:`terminal`}),hydrate:t=>e({type:`HYDRATE`,state:t})}),[e,t.rightPanel.open,t.bottomPanel.open])}export{p as a,l as c,G as i,u as l,P as n,f as o,K as r,d as s,W as t,o as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-C_pPTFsM.js";import{t as n}from"./jsx-runtime-NZYk81nU.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-BeGD0rRQ.js";import{i as c,n as l}from"./fields-mlGpofqQ.js";import{t as u}from"./InlineWarn-DIMbcbzk.js";var d=e(t(),1),f=/^[a-zA-Z0-9._:*-]+$/;function p(e){return typeof e==`string`&&e.length>0&&e.length<=64&&f.test(e)}function m(e){if(typeof e!=`string`)return!1;let t=e.trim();return t.length===0||p(t)}function h(e){if(e===`auto`||e===`safe`)return!0;if(!Array.isArray(e))return!1;for(let t=0;t<e.length;t+=1)if(!m(e[t]))return!1;return!0}var g=n(),_=[`bash`,`read`,`write`,`edit`,`mcp.*`];function v(e){return e===`auto`?`Auto (YOLO)`:e===`safe`?`Safe`:e==null?`Not provided`:Array.isArray(e)&&h(e)?`Custom (${e.length} ${e.length===1?`entry`:`entries`})`:`Unrecognized`}function y(e){return e===`auto`}function b(e){return y(e)?{mode:`auto`}:e===`safe`?{mode:`safe`}:Array.isArray(e)?{mode:`custom`,tokens:e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e.length>0)}:{mode:`unknown`}}function x(e){return p(e)}function S(e){return h(e)?e===`auto`?`auto`:e===`safe`?`safe`:`custom`:`invalid`}function C(e){return Array.isArray(e)&&e.length>0?Array.from(new Set(e.filter(x))):[..._]}function w(e){return e.length!==0&&e.every(x)}var T=[{value:`auto`,label:`Auto (YOLO)`},{value:`safe`,label:`Safe`},{value:`custom`,label:`Custom — explicit allowlist below`}];function E({port:e,client:t,dirty:n,registerSave:f}){let{state:p,refresh:m,setData:h}=r(t,`/api/settings`),[_,y]=(0,d.useState)(`auto`),[E,D]=(0,d.useState)([]),O=(0,d.useMemo)(()=>p.kind===`ready`?b(p.data.permissions):null,[p]);(0,d.useEffect)(()=>{if(p.kind!==`ready`)return;let e=S(p.data.permissions),t=b(p.data.permissions);y(e),D(e===`custom`&&t.mode===`custom`?t.tokens:[])},[p]),(0,d.useEffect)(()=>()=>{n.remove(`permissions`)},[n]);let k=(0,d.useCallback)(e=>n.set(`permissions`,e),[n]),A=p.kind===`ready`?p.data.permissions:void 0,j=(0,d.useMemo)(()=>O?O.mode===`custom`?O.tokens:O.mode===`safe`?`safe`:O.mode===`unknown`?A:`auto`:`auto`,[O,A]),M=(0,d.useCallback)(e=>{if(e===`auto`){y(`auto`),D([]),k({value:`auto`,original:j,valid:!0});return}if(e===`safe`){y(`safe`),D([]),k({value:`safe`,original:j,valid:!0});return}if(e===`custom`){y(`custom`);let e=O&&O.mode===`custom`&&O.tokens.length>0?[...O.tokens]:C(null);D(e),k({value:e,original:j,valid:w(e)})}},[O,j,k]),N=(0,d.useCallback)(e=>{let t=e.map(e=>e.trim()).filter(e=>e.length>0);D(t),k({value:t,original:j,valid:w(t)})},[j,k]),P=(0,d.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=await t.put(`/api/settings`,e),i=r&&typeof r==`object`&&`data`in r?r.data:r;n.clear();let a=S(i.permissions),o=b(i.permissions);y(a),D(a===`custom`&&o.mode===`custom`?o.tokens:[]),h(i),await m()},[t,n,m,h]);if((0,d.useEffect)(()=>{if(f)return f(P),()=>f(null)},[f,P]),p.kind===`loading`)return(0,g.jsx)(a,{});if(p.kind===`offline`)return(0,g.jsx)(o,{port:e});if(p.kind===`error`)return(0,g.jsx)(s,{message:p.message});let F=E.filter(e=>!x(e)),I=F.length>0,L=_===`custom`&&E.length===0,R=v(p.data.permissions);return(0,g.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:[(0,g.jsxs)(i,{title:`Permissions`,hint:`Selecting a value changes the draft. Save applies it. Auto (YOLO) requests automatic approval or permission bypass. Behavior varies by runtime.`,children:[(0,g.jsx)(c,{id:`permissions-mode`,label:`Change policy to`,value:_,options:T,onChange:M,missingValueLabel:_===`invalid`?`Unrecognized saved policy`:void 0}),_===`invalid`&&(0,g.jsx)(u,{role:`alert`,children:`The saved permissions value is not a recognized policy. Pick a policy above to replace it.`}),_===`custom`&&(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(l,{id:`permissions-allowlist`,label:`Allowlist`,value:E,onChange:N,placeholder:`bash, read, mcp.*`,error:I?`Invalid token${F.length===1?``:`s`}: ${F.join(`, `)}`:L?`Allowlist cannot be empty in Custom mode.`:null}),(0,g.jsxs)(`p`,{className:`settings-section-hint`,children:[`Each chip is a permission token. Examples: `,(0,g.jsx)(`code`,{children:`bash`}),`,`,(0,g.jsx)(`code`,{children:` read`}),`, `,(0,g.jsx)(`code`,{children:` write`}),`, `,(0,g.jsx)(`code`,{children:` mcp.*`}),`.`]}),L&&(0,g.jsx)(u,{role:`alert`,children:`An empty Custom allowlist cannot be saved. Add at least one token or switch back to Auto (YOLO).`})]})]}),(0,g.jsxs)(i,{title:`Saved policy`,hint:`Shows the saved permission policy.`,children:[(0,g.jsxs)(`p`,{className:`settings-readonly-line`,children:[(0,g.jsx)(`span`,{className:`settings-field-label`,children:`Configured policy:`}),` `,(0,g.jsx)(`span`,{children:R})]}),O?.mode===`unknown`?(0,g.jsx)(`p`,{className:`settings-section-hint`,children:`Unrecognized value: choose a policy above (or in Agent) to replace it.`}):null]})]})}export{y as a,C as c,x as i,v as n,b as o,w as r,S as s,E as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-C_pPTFsM.js";import{t as n}from"./jsx-runtime-NZYk81nU.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-BeGD0rRQ.js";import{a as c,i as l}from"./fields-mlGpofqQ.js";import{t as u}from"./path-utils-B6vBr0DD.js";var d=e(t(),1),f=n(),p=`image/png,image/jpeg,image/webp,image/gif`;function m({kind:e,port:t}){let[n,r]=(0,d.useState)(null),[i,a]=(0,d.useState)(!1),[o,s]=(0,d.useState)(null),c=(0,d.useRef)(null);(0,d.useEffect)(()=>{let n=!1;return s(null),r(null),fetch(`/i/${t}/api/avatar`).then(e=>e.ok?e.json():Promise.reject(Error(`avatar HTTP ${e.status}`))).then(t=>{if(n)return;let i=(`data`in t&&t.data?t.data:t)[e]||null;r(i)}).catch(e=>{n||s(e instanceof Error?e.message:String(e))}),()=>{n=!0}},[e,t]);let l=()=>c.current?.click(),u=async n=>{a(!0),s(null);try{let i=await n.arrayBuffer(),a=n.type||`application/octet-stream`,o=await fetch(`/i/${t}/api/avatar/${e}/upload`,{method:`POST`,headers:{"content-type":a,"x-filename":encodeURIComponent(n.name)},body:i});if(!o.ok){let e=await o.text().catch(()=>``);throw Error(`upload failed: ${o.status} ${e}`)}let s=await o.json(),c=`data`in s&&s.data?s.data:s;r(c)}catch(e){s(e instanceof Error?e.message:String(e))}finally{a(!1),c.current&&(c.current.value=``)}},m=async()=>{a(!0),s(null);try{let n=await fetch(`/i/${t}/api/avatar/${e}/image`,{method:`DELETE`});if(!n.ok)throw Error(`clear failed: ${n.status}`);let i=await n.json(),a=`data`in i&&i.data?i.data:i;r(a)}catch(e){s(e instanceof Error?e.message:String(e))}finally{a(!1)}},h=n&&n.kind===`image`?`/i/${t}${n.imageUrl}`:null,g=e===`agent`?`Agent avatar`:`User avatar`;return(0,f.jsxs)(`div`,{className:`settings-avatar-card`,children:[(0,f.jsx)(`div`,{className:`settings-avatar-preview`,"aria-label":`${g} preview`,children:h?(0,f.jsx)(`img`,{src:h,alt:`${g} current`}):e===`agent`?(0,f.jsx)(`img`,{className:`settings-avatar-mascot`,src:`/icons/mascot.png`,alt:``,"aria-hidden":`true`}):(0,f.jsx)(`span`,{className:`settings-avatar-placeholder`,"aria-hidden":`true`,children:`👤`})}),(0,f.jsxs)(`div`,{className:`settings-avatar-controls`,children:[(0,f.jsx)(`span`,{className:`settings-field-label`,children:g}),(0,f.jsx)(`input`,{ref:c,type:`file`,accept:p,style:{display:`none`},onChange:e=>{let t=e.target.files?.[0];t&&u(t)}}),(0,f.jsxs)(`div`,{className:`settings-avatar-buttons`,children:[(0,f.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,onClick:l,disabled:i,children:i?`Working…`:`Upload image`}),h?(0,f.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>void m(),disabled:i,children:`Clear`}):null]}),o?(0,f.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:o}):null]})]})}var h=[{value:`ko`,label:`한국어 (ko)`},{value:`en`,label:`English (en)`},{value:`ja`,label:`日本語 (ja)`},{value:`zh`,label:`中文 (zh)`}];function g({port:e,client:t,dirty:n,registerSave:p}){let{state:g,refresh:_,setData:v}=r(t,`/api/settings`),[y,b]=(0,d.useState)({});(0,d.useEffect)(()=>{g.kind===`ready`&&b(g.data)},[g]),(0,d.useEffect)(()=>()=>{for(let e of Array.from(n.pending.keys()))(e===`locale`||e===`showReasoning`)&&n.remove(e)},[n]);let x=(0,d.useCallback)((e,t)=>n.set(e,t),[n]),S=(0,d.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=u(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),b(a),v(a),await _()},[t,n,_,v]);if((0,d.useEffect)(()=>{if(p)return p(S),()=>p(null)},[p,S]),g.kind===`loading`)return(0,f.jsx)(a,{});if(g.kind===`offline`)return(0,f.jsx)(o,{port:e});if(g.kind===`error`)return(0,f.jsx)(s,{message:g.message});let C=g.data;return(0,f.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),S()},children:[(0,f.jsxs)(i,{title:`Profile`,hint:`Identity and display preferences for this instance.`,children:[(0,f.jsx)(l,{id:`profile-locale`,label:`Locale`,value:y.locale??C.locale??`ko`,options:h,onChange:e=>{b({...y,locale:e}),x(`locale`,{value:e,original:C.locale??`ko`,valid:!0})}}),(0,f.jsx)(c,{id:`profile-showReasoning`,label:`Show reasoning traces`,value:!!(y.showReasoning??C.showReasoning),onChange:e=>{b({...y,showReasoning:e}),x(`showReasoning`,{value:e,original:!!C.showReasoning,valid:!0})}})]}),(0,f.jsxs)(i,{title:`Avatars`,hint:`Uploads write to the instance's home folder.`,children:[(0,f.jsx)(m,{kind:`agent`,port:e}),(0,f.jsx)(m,{kind:`user`,port:e})]})]})}export{g as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-C_pPTFsM.js";import{t as n}from"./jsx-runtime-NZYk81nU.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-BeGD0rRQ.js";import{t as c}from"./InlineWarn-DIMbcbzk.js";var l=e(t(),1),u=n(),d=`prompt.system`;function f(e){return`prompt.template.${e}`}function p(e){return!e||!Array.isArray(e.templates)?[]:e.templates.filter(e=>!!e&&typeof e.id==`string`&&typeof e.content==`string`)}function m(e){let t=p(e),n=e?.tree,r=[],i=new Set;if(Array.isArray(n)){for(let e of n)if(e&&Array.isArray(e.children))for(let n of e.children){if(i.has(n))continue;let a=t.find(e=>e.id===n);if(!a)continue;let o=e.emoji?`${e.emoji} ${e.label} · `:`${e.label} · `;r.push({value:a.id,label:`${o}${a.id}`}),i.add(n)}}for(let e of t)i.has(e.id)||(r.push({value:e.id,label:e.id}),i.add(e.id));return r}function h(e,t){return p(e).find(e=>e.id===t)??null}function g({port:e,client:t,dirty:n,registerSave:g}){let _=r(t,`/api/prompt`),v=r(t,`/api/prompt-templates`),[y,b]=(0,l.useState)(``),[x,S]=(0,l.useState)(null),[C,w]=(0,l.useState)(``),T=(0,l.useMemo)(()=>_.state.kind===`ready`?_.state.data?.content??``:``,[_.state]),E=(0,l.useMemo)(()=>v.state.kind===`ready`?v.state.data:null,[v.state]),D=(0,l.useMemo)(()=>m(E),[E]),O=(0,l.useRef)(new Set);(0,l.useEffect)(()=>{_.state.kind===`ready`&&b(_.state.data?.content??``)},[_.state]),(0,l.useEffect)(()=>{if(!E||x!==null)return;let e=p(E);if(e.length===0)return;let t=D[0]?.value??e[0].id;S(t);let n=h(E,t);w(n?.content??``)},[E,D,x]),(0,l.useEffect)(()=>()=>{n.remove(d);for(let e of O.current)n.remove(e)},[n]);let k=(0,l.useCallback)((e,t)=>{n.set(e,t),O.current.add(e)},[n]),A=(0,l.useCallback)(e=>{b(e),n.set(d,{value:e,original:T,valid:!0})},[n,T]),j=(0,l.useCallback)(e=>{if(!x)return;w(e);let t=h(E,x)?.content??``;k(f(x),{value:e,original:t,valid:!0})},[x,k,E]),M=(0,l.useCallback)(e=>{if(!x||e===x)return;let t=f(x);if(n.pending.get(t)&&typeof window<`u`&&!window.confirm(`You have unsaved edits to "${x}". Switching will keep them pending — Save will write all dirty templates.`))return;S(e);let r=f(e),i=n.pending.get(r),a=h(E,e)?.content??``;w(i&&typeof i.value==`string`?i.value:a)},[x,n,E]),N=(0,l.useCallback)(async()=>{let e=n.saveBundle(),r=[];d in e&&r.push(t.put(`/api/prompt`,{content:e[d]}));for(let[n,i]of Object.entries(e)){if(!n.startsWith(`prompt.template.`))continue;let e=n.slice(16);r.push(t.put(`/api/prompt-templates/${e}`,{content:i}))}if(r.length!==0){for(let e of r)await e;n.clear(),O.current.clear(),await Promise.all([_.refresh(),v.refresh()])}},[t,n,_,v]);if((0,l.useEffect)(()=>{if(g)return g(N),()=>g(null)},[g,N]),_.state.kind===`loading`||v.state.kind===`loading`)return(0,u.jsx)(a,{});if(_.state.kind===`offline`||v.state.kind===`offline`)return(0,u.jsx)(o,{port:e});if(_.state.kind===`error`)return(0,u.jsx)(s,{message:_.state.message});if(v.state.kind===`error`)return(0,u.jsx)(s,{message:v.state.message});let P=p(E),F=x?h(E,x)?.content??``:``,I=x!==null&&C!==F;return(0,u.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:[(0,u.jsxs)(i,{title:`System prompt`,hint:`The agent's a2/system prompt. Saved to a2.md; regenerates the merged b prompt.`,children:[(0,u.jsxs)(`label`,{className:`settings-field settings-field-text`,htmlFor:`prompt-system-body`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`a2.md`}),(0,u.jsx)(`textarea`,{id:`prompt-system-body`,className:`settings-field-monospace`,value:y,rows:14,spellCheck:!1,onChange:e=>A(e.target.value)})]}),y!==T&&(0,u.jsx)(`p`,{className:`settings-section-hint`,children:`Pending edits to a2.md.`})]}),(0,u.jsx)(i,{title:`Templates`,hint:`Edit individual prompt template bodies. Saving regenerates b automatically.`,children:P.length===0?(0,u.jsx)(c,{tone:`info`,children:`No templates returned by /api/prompt-templates.`}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)(`label`,{className:`settings-field settings-field-select`,htmlFor:`prompt-template-select`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Template`}),(0,u.jsx)(`select`,{id:`prompt-template-select`,value:x??``,onChange:e=>M(e.target.value),children:D.map(e=>(0,u.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(0,u.jsxs)(`label`,{className:`settings-field settings-field-text`,htmlFor:`prompt-template-body`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:x?`${x}.md`:`Template body`}),(0,u.jsx)(`textarea`,{id:`prompt-template-body`,className:`settings-field-monospace`,value:C,rows:16,spellCheck:!1,disabled:!x,onChange:e=>j(e.target.value)})]}),I&&(0,u.jsxs)(`p`,{className:`settings-section-hint`,children:[`Pending edits to `,x,`.md.`]})]})})]})}export{m as buildTemplateOptions,g as default,h as findTemplate,p as flattenTemplates,f as templateDirtyKey};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-C_pPTFsM.js";import{t as n}from"./jsx-runtime-NZYk81nU.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-BeGD0rRQ.js";import{i as c,o as l,s as u,t as d}from"./fields-mlGpofqQ.js";import{t as f}from"./path-utils-B6vBr0DD.js";var p=e(t(),1),m=n();function h({title:e,hint:t,children:n}){return(0,m.jsxs)(`fieldset`,{className:`settings-engine-subsection`,children:[(0,m.jsx)(`legend`,{className:`settings-engine-subsection-legend`,children:e}),t?(0,m.jsx)(`p`,{className:`settings-engine-subsection-hint`,children:t}):null,(0,m.jsx)(`div`,{className:`settings-engine-subsection-body`,children:n})]})}var g=[`auto`,`gemini`,`openai`,`whisper`,`vertex`],_={auto:`Auto (try in order)`,gemini:`Gemini`,openai:`OpenAI`,whisper:`Whisper (local MLX)`,vertex:`Vertex AI`};function v(e){return e===`auto`?[`gemini`,`openai`,`whisper`,`vertex`]:[e]}function y(e){if(e.trim()===``)return{valid:!0,error:null};try{return JSON.parse(e),{valid:!0,error:null}}catch(e){return{valid:!1,error:e instanceof Error?e.message:`Invalid JSON`}}}var b=[`stt.engine`,`stt.geminiApiKey`,`stt.geminiModel`,`stt.openaiApiKey`,`stt.openaiBaseUrl`,`stt.openaiModel`,`stt.whisperModel`,`stt.vertexConfig`];function x(e){return g.includes(e)?e:`auto`}function S({port:e,client:t,dirty:n,registerSave:S}){let{state:C,refresh:w,setData:T}=r(t,`/api/settings`),[E,D]=(0,p.useState)(`auto`),[O,k]=(0,p.useState)(``),[A,j]=(0,p.useState)(``),[M,N]=(0,p.useState)(``),[P,F]=(0,p.useState)(``),[I,L]=(0,p.useState)(``),[R,z]=(0,p.useState)(``),[B,V]=(0,p.useState)(``),[H,U]=(0,p.useState)(null);(0,p.useEffect)(()=>{if(C.kind!==`ready`)return;let e=C.data.stt||{};D(x(e.engine)),k(``),j(e.geminiModel??``),N(``),F(e.openaiBaseUrl??``),L(e.openaiModel??``),z(e.whisperModel??``),V(e.vertexConfig??``),U(null)},[C]),(0,p.useEffect)(()=>()=>{for(let e of b)n.remove(e)},[n]);let W=(0,p.useCallback)((e,t)=>n.set(e,t),[n]),G=(0,p.useMemo)(()=>C.kind===`ready`&&C.data.stt||{},[C]),K=(0,p.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=f(e),i=await t.put(`/api/settings`,r),a=i&&typeof i==`object`&&`data`in i?i.data:i;n.clear(),T(a);let o=a.stt||{};D(x(o.engine)),k(``),j(o.geminiModel??``),N(``),F(o.openaiBaseUrl??``),L(o.openaiModel??``),z(o.whisperModel??``),V(o.vertexConfig??``),U(null),await w()},[t,n,w,T]);if((0,p.useEffect)(()=>{if(S)return S(K),()=>S(null)},[S,K]),C.kind===`loading`)return(0,m.jsx)(a,{});if(C.kind===`offline`)return(0,m.jsx)(o,{port:e});if(C.kind===`error`)return(0,m.jsx)(s,{message:C.message});let q=v(E),J=q.includes(`gemini`),Y=q.includes(`openai`),X=q.includes(`whisper`),Z=q.includes(`vertex`),Q=G.geminiKeySet?`••••••••${G.geminiKeyLast4??``}`:`(empty)`,$=G.openaiKeySet?`••••••••${G.openaiKeyLast4??``}`:`(empty)`;return(0,m.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),K()},children:[(0,m.jsx)(i,{title:`Engine`,hint:`Pick a single engine, or 'auto' to fall back through the ladder.`,children:(0,m.jsx)(c,{id:`stt-engine`,label:`Speech-to-text engine`,value:E,options:g.map(e=>({value:e,label:_[e]})),onChange:e=>{let t=x(e);D(t),W(`stt.engine`,{value:t,original:x(G.engine),valid:!0})}})}),J?(0,m.jsx)(i,{title:`Gemini`,hint:`Google AI Studio key. Used by the Gemini transcription path.`,children:(0,m.jsxs)(h,{title:`Credentials`,children:[(0,m.jsx)(l,{id:`stt-gemini-key`,label:`API key`,value:O,placeholder:Q,onChange:e=>{if(k(e),e.length===0){n.remove(`stt.geminiApiKey`);return}W(`stt.geminiApiKey`,{value:e,original:``,valid:!0})}}),(0,m.jsx)(u,{id:`stt-gemini-model`,label:`Model`,value:A,placeholder:`gemini-2.5-flash-lite`,onChange:e=>{j(e),W(`stt.geminiModel`,{value:e,original:G.geminiModel??``,valid:!0})}})]})}):null,Y?(0,m.jsx)(i,{title:`OpenAI`,hint:`Compatible with OpenAI-style transcription endpoints (incl. self-hosted).`,children:(0,m.jsxs)(h,{title:`Credentials`,children:[(0,m.jsx)(l,{id:`stt-openai-key`,label:`API key`,value:M,placeholder:$,onChange:e=>{if(N(e),e.length===0){n.remove(`stt.openaiApiKey`);return}W(`stt.openaiApiKey`,{value:e,original:``,valid:!0})}}),(0,m.jsx)(u,{id:`stt-openai-base-url`,label:`Base URL (optional)`,value:P,placeholder:`https://api.openai.com/v1`,onChange:e=>{F(e),W(`stt.openaiBaseUrl`,{value:e,original:G.openaiBaseUrl??``,valid:!0})}}),(0,m.jsx)(u,{id:`stt-openai-model`,label:`Model`,value:I,placeholder:`whisper-1`,onChange:e=>{L(e),W(`stt.openaiModel`,{value:e,original:G.openaiModel??``,valid:!0})}})]})}):null,X?(0,m.jsx)(i,{title:`Whisper (local MLX)`,hint:`Runs on-device via mlx-whisper. No API key required.`,children:(0,m.jsx)(h,{title:`Model`,children:(0,m.jsx)(u,{id:`stt-whisper-model`,label:`Model identifier`,value:R,placeholder:`mlx-community/whisper-large-v3-mlx`,onChange:e=>{z(e),W(`stt.whisperModel`,{value:e,original:G.whisperModel??``,valid:!0})}})})}):null,Z?(0,m.jsx)(i,{title:`Vertex AI`,hint:`Service-account credentials JSON for Google Cloud Vertex transcription.`,children:(0,m.jsxs)(h,{title:`Service account`,hint:`Paste the service-account credentials JSON. Treated as a secret — invalid JSON refuses to save.`,children:[(0,m.jsx)(d,{id:`stt-vertex-config`,label:`Credentials JSON`,value:B,onChange:(e,t)=>{let n=typeof e==`string`?e:e==null?``:JSON.stringify(e);V(n);let r=y(n);U(t?null:r.error),W(`stt.vertexConfig`,{value:n,original:G.vertexConfig??``,valid:t&&r.valid})}}),H?(0,m.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:H}):null]})}):null,(0,m.jsx)(i,{title:`Probe`,hint:`A live mic-test isn't available yet — verify by triggering speech-to-text from the active channel.`,children:(0,m.jsx)(`p`,{className:`settings-section-hint`,children:`No backend self-test endpoint is exposed for speech today; this lands as a Phase 9 polish.`})})]})}export{g as STT_ENGINES,S as default,v as revealsForEngine,y as validateVertexConfig};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{t}from"./react-C_pPTFsM.js";import{t as n}from"./jsx-runtime-NZYk81nU.js";import{a as r,i,n as a,t as o}from"./page-shell-BeGD0rRQ.js";import{a as s,o as c,s as l}from"./fields-mlGpofqQ.js";var u=e(t(),1),d=n(),f=3457,p=3506;function m(){return{async get(e){let t=await fetch(e);if(!t.ok)throw Error(`GET ${e} → ${t.status}`);return await t.json()},async put(e,t){let n=await fetch(e,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify(t)});if(!n.ok)throw Error(`PUT ${e} → ${n.status}`);return await n.json()},async delete(e){let t=await fetch(e,{method:`DELETE`});if(!t.ok)throw Error(`DELETE ${e} → ${t.status}`);return await t.json()}}}var h=[`hub.enabled`,`hub.token`,`hub.chatId`,`hub.defaultPort`];function g({port:e,client:t,dirty:n,registerSave:g,managerClient:_}){let{state:v}=r(t,`__telegram_hub_unused__`,[e]),[y,b]=(0,u.useState)(null),[x,S]=(0,u.useState)(null),[C,w]=(0,u.useState)(null),[T,E]=(0,u.useState)(!1),[D,O]=(0,u.useState)(``),[k,A]=(0,u.useState)(``),[j,M]=(0,u.useState)(f),N=_||m(),P=(0,u.useCallback)(async()=>{w(null);try{let e=await N.get(`/api/dashboard/telegram-hub`);b(e.config),S(e.runtime||null),E(e.config.enabled),A(e.config.chatId),M(e.config.defaultPort),O(``)}catch(e){w(e instanceof Error?e.message:String(e))}},[N]);(0,u.useEffect)(()=>{P()},[e]),(0,u.useEffect)(()=>()=>{for(let e of h)n.remove(e)},[n]);let F=(0,u.useCallback)(async()=>{let e={enabled:T,chatId:k.trim(),defaultPort:j};D.trim()&&(e.token=D.trim());let t=await N.put(`/api/dashboard/telegram-hub`,e);b(t.config),S(t.runtime||null),O(``);for(let e of h)n.remove(e)},[T,k,j,D,N,n]);(0,u.useEffect)(()=>{if(g)return g(F),()=>g(null)},[g,F]);let I=(0,u.useCallback)(async e=>{try{await N.delete(`/api/dashboard/telegram-hub/routes/${encodeURIComponent(e.chatId)}/${encodeURIComponent(e.threadId)}`)}catch(e){w(e instanceof Error?e.message:String(e))}await P()},[N,P]);return C?(0,d.jsx)(o,{message:C}):y?(0,d.jsxs)(`form`,{className:`settings-page-form settings-form`,onSubmit:e=>{e.preventDefault(),F()},children:[(0,d.jsxs)(i,{title:`Telegram hub`,hint:`One dashboard-owned bot routes Telegram chat topics to instances 3457–3506.`,children:[(0,d.jsx)(s,{id:`hub-enabled`,label:`Enable hub`,value:T,onChange:e=>{E(e),n.set(`hub.enabled`,{value:e,original:y.enabled,valid:!0})}}),(0,d.jsx)(c,{id:`hub-token`,label:`Bot token`,value:D,placeholder:y.hasToken?`•••• (saved)`:`paste bot token`,onChange:e=>{O(e),n.set(`hub.token`,{value:e,original:``,valid:!0})}}),(0,d.jsx)(l,{id:`hub-chat-id`,label:`Hub chat ID`,value:k,placeholder:`823… or -100…`,onChange:e=>{A(e),n.set(`hub.chatId`,{value:e,original:y.chatId,valid:!0})}}),x?(0,d.jsxs)(`p`,{className:`settings-help`,children:[`Runtime: `,x.state,x.chatId?` · ${x.chatId}`:``,x.error?` · ${x.error}`:``]}):null,(0,d.jsxs)(`label`,{className:`settings-field`,htmlFor:`hub-default-port`,children:[(0,d.jsx)(`span`,{className:`settings-field-label`,children:`Default port`}),(0,d.jsx)(`input`,{id:`hub-default-port`,type:`number`,min:f,max:p,value:j,onChange:e=>{let t=Number(e.target.value);M(t),n.set(`hub.defaultPort`,{value:t,original:y.defaultPort,valid:t>=f&&t<=p})}})]})]}),(0,d.jsx)(i,{title:`Topic routes`,hint:`(chatId, threadId) → instance port. Bind in a bot private topic or group topic with /setthread <port>.`,children:y.routes.length===0?(0,d.jsx)(`p`,{className:`settings-empty`,children:`No routes yet.`}):(0,d.jsxs)(`table`,{className:`settings-table`,children:[(0,d.jsx)(`thead`,{children:(0,d.jsxs)(`tr`,{children:[(0,d.jsx)(`th`,{children:`Thread`}),(0,d.jsx)(`th`,{children:`Port`}),(0,d.jsx)(`th`,{children:`Label`}),(0,d.jsx)(`th`,{children:`Model`}),(0,d.jsx)(`th`,{children:`Prompt`}),(0,d.jsx)(`th`,{children:`On`}),(0,d.jsx)(`th`,{})]})}),(0,d.jsx)(`tbody`,{children:y.routes.map(e=>(0,d.jsxs)(`tr`,{children:[(0,d.jsx)(`td`,{children:e.threadId}),(0,d.jsx)(`td`,{children:e.port}),(0,d.jsx)(`td`,{children:e.label||`—`}),(0,d.jsx)(`td`,{children:e.model||`—`}),(0,d.jsx)(`td`,{children:e.systemPrompt?`✓`:`—`}),(0,d.jsx)(`td`,{children:e.enabled?`✓`:`—`}),(0,d.jsx)(`td`,{children:(0,d.jsx)(`button`,{type:`button`,onClick:()=>void I(e),children:`Delete`})})]},`${e.chatId}:${e.threadId}`))})]})})]}):(0,d.jsx)(a,{label:`Loading Telegram hub…`})}function _(e){return e.manager?(0,d.jsx)(g,{...e}):null}export{_ as default};
|
|
@@ -1,55 +0,0 @@
|
|
|
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{n as e,r as t}from"./vendor-render-Cmfl_oW8.js";import{t as n}from"./state-Dl-xxPoS.js";import{a as r,i,n as a,r as o,t as s}from"./api-CUtiCd2-.js";import{a as c,c as l,d as u,f as d,i as ee,l as te,r as f,s as p,t as m,u as ne}from"./sidebar-BUemG2ZN.js";import{t as h}from"./preload-helper-CfbQpVni.js";import{C as re,D as ie,M as ae,N as oe,O as g,P as _,b as se,g as ce,h as v,j as le,l as ue,m as de,n as fe,p as pe,u as me,w as he,x as ge,y as _e}from"./render-Dp07lZAJ.js";import{r as ve,t as y}from"./icons-CVkqyECl.js";import{t as ye}from"./copy-text-DjgetgoZ.js";import{_ as be,d as xe,f as b,n as Se,u as Ce}from"./iframe-renderer-Bj1JolO8.js";import{$ as we,H as x,U as S,X as Te,t as Ee}from"./message-history-D2vniu04.js";import{c as C,n as De}from"./idb-cache-BRpjf_a8.js";import{c as Oe,o as ke,p as Ae}from"./ui-vm2iuLcS.js";import{t as je}from"./locale-B9w_kUtW.js";import{a as Me,c as Ne,i as Pe,n as Fe,o as Ie,r as Le,s as Re,t as ze}from"./slash-commands-D34GgHFX.js";import{i as Be,l as Ve,n as He,o as w,r as Ue,s as We,t as Ge}from"./settings-core-B5Uf_lWY.js";import{o as Ke}from"./constants-DmZ9Rjym.js";import{t as qe}from"./provider-icons-Bge6teOj.js";import{a as Je,i as Ye,t as Xe}from"./skills-CKUcEN9m.js";import{C as Ze,S as Qe,_ as $e,a as et,b as tt,c as nt,d as rt,f as it,g as at,h as ot,i as st,l as ct,m as lt,n as T,o as ut,p as dt,r as E,s as ft,t as pt,u as mt,v as ht,w as gt,y as _t}from"./settings-jlI4X-zt.js";import{a as vt,c as yt,d as bt,f as xt,i as St,l as Ct,m as wt,n as Tt,o as Et,p as Dt,r as Ot,s as kt,t as At,u as jt}from"./memory-EG1B51up.js";import{n as Mt}from"./bgtask-badge-DfiHuzxT.js";var Nt=new Set([`.png`,`.jpg`,`.jpeg`,`.gif`,`.webp`,`.svg`]),Pt=new Set([`.mp4`,`.webm`,`.mov`,`.ogg`]);function Ft(e){let t=String(e||``).split(/[\\/]/).pop()||``,n=t.lastIndexOf(`.`),r=n>0?t.slice(n).toLowerCase():``;return Nt.has(r)?`image`:Pt.has(r)?`video`:`file`}var D=[],It=8e3;function Lt(e){return/^\/compact(?:\s|$)/i.test(String(e||``).trim())?3e5:1e4}var Rt={image:`chat.file.sentImage`,video:`chat.file.sentVideo`,file:`chat.file.sent`};function zt(e){return _(Rt[Ft(e)],{path:e})}function Bt(e,t=``){let n=e.map(zt).join(`
|
|
3
|
-
`);return t?`${n}${_(`chat.file.sentWithMsg`,{text:t})}`:n}function Vt(e,t){let n=t.map(zt).join(`
|
|
4
|
-
`);return n?`${e}\n\n${n}`:e}function Ht(e){let t=re();return t?new Promise(n=>{let r=`preview-send-${Date.now()}-${Math.random().toString(36).slice(2)}`,i=!1,a=()=>{window.removeEventListener(`message`,s),window.clearTimeout(c)},o=e=>{i||(i=!0,a(),n(e))},s=e=>{if(e.source!==window.parent||!ge(e.origin))return;let t=e.data;t&&t.type===`jaw-preview-send-result`&&t.requestId===r&&o({ok:!!t.ok,status:Number.isInteger(t.status)?t.status:t.ok?200:502,data:t.data||(t.error?{error:t.error}:{}),viaRelay:!0})},c=window.setTimeout(()=>o(null),It);window.addEventListener(`message`,s);try{window.parent.postMessage(v({type:`jaw-preview-send-message`,requestId:r,prompt:e}),t)}catch{o(null)}}):Promise.resolve(null)}async function Ut(e){let t=await Ht(e);if(t?.ok)return t;try{let t=await fetch(`${s}/api/message`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(v({prompt:e}))}),n=await t.json().catch(()=>({}));return{ok:t.ok,status:t.status,data:n}}catch(e){return{ok:!1,status:0,data:{error:e.message}}}}async function Wt(e){let t,n,i=Lt(e);if(typeof AbortSignal?.timeout==`function`)t=AbortSignal.timeout(i);else{let e=new AbortController;t=e.signal,n=setTimeout(()=>e.abort(),i)}let a=je(),o=await r(),c=await fetch(`${s}/api/command`,{method:`POST`,headers:{"Content-Type":`application/json`,"Accept-Language":a,...o?{Authorization:`Bearer ${o}`}:{}},body:JSON.stringify(v({text:e,locale:a})),signal:t});n&&clearTimeout(n);let l=await c.json().catch(()=>({}));return{ok:c.ok,status:c.status,result:l}}async function Gt(e,t,n){let r=t.result;if(r?.code===`not_command`){if(n){await n();return}x(`user`,e),C({role:`user`,content:e,timestamp:Date.now()}),await i(`/api/message`,`POST`,v({prompt:e}));return}if(!t.ok&&!r?.text)throw Error(`HTTP ${t.status}`);if(r?.code===`clear_screen`){fe(),be().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``)}(r?.text||r?.recovery)&&S(Kt(r),``,r.type),r?.steerPrompt&&await i(`/api/message`,`POST`,v({prompt:r.steerPrompt}))}function Kt(e){let t=e.recovery;if(!t?.originalText)return e.text?g(e.text):``;let n=(t.suggestedCommands||[]).slice(0,5),r=n.length?`<div class="cmd-recovery-suggestions">${n.map(e=>`<code>${g(e)}</code>`).join(` `)}</div>`:``,i=g(t.originalText);return`${e.text?`<div>${g(e.text)}</div>`:``}
|
|
5
|
-
<div class="cmd-recovery" data-cmd-recovery>
|
|
6
|
-
<div class="cmd-recovery-label">${g(_(`cmd.recovery.originalPrompt`))}</div>
|
|
7
|
-
<pre class="cmd-recovery-text">${i}</pre>
|
|
8
|
-
${r}
|
|
9
|
-
<div class="cmd-recovery-actions">
|
|
10
|
-
<button type="button" class="cmd-recovery-btn" data-cmd-recovery-action="reinsert" data-cmd-text="${i}">${g(_(`cmd.artifact.action.reinsert`))}</button>
|
|
11
|
-
<button type="button" class="cmd-recovery-btn" data-cmd-recovery-action="copy" data-cmd-text="${i}">${g(_(`cmd.artifact.action.copy`))}</button>
|
|
12
|
-
</div>
|
|
13
|
-
</div>`}document.addEventListener(`click`,async e=>{let t=e.target?.closest(`[data-cmd-recovery-action]`);if(!t)return;let n=t.dataset.cmdRecoveryAction||``,r=t.dataset.cmdText||``;if(r){if(n===`reinsert`){let e=document.getElementById(`chatInput`);if(!e)return;e.value=r,e.focus(),e.selectionStart=e.selectionEnd=e.value.length,e.dispatchEvent(new Event(`input`,{bubbles:!0}));return}n===`copy`&&await ye(r)}});var qt=!1;async function Jt(e=`enter`){let t=document.getElementById(`chatInput`),r=document.getElementById(`btnSend`);if(!t||!r)return;let a=t.value,s=a.trim(),c=e===`button`&&r.classList.contains(`stop-mode`);if(!ue(c?``:s)){de();return}let u=e===`button`;if(r.classList.contains(`stop-mode`)&&u){o(`/api/stop`,`POST`,v({}));return}if(qt||!s&&!n.attachedFiles.length)return;te();let d=0,ee=d,f=()=>{d++};t.addEventListener(`input`,f);let p=()=>{document.getElementById(`chatInput`)===t&&t.value===a&&d===ee&&(t.value=``,rn())};qt=!0;let m=r,ne=m.disabled;m.disabled=!0;try{await Ve();let e=s.slice(1).trim().split(/\s+/)[0]||``,t=e.includes(`/`)||e.includes(`\\`),r=s.startsWith(`/`)&&!t;if(r&&!n.attachedFiles.length){if(p(),ze(),Re(s))return;try{await Gt(s,await Wt(s))}catch(e){S(_(`chat.cmd.fail`,{msg:e.message}),``,`error`)}finally{l(`command`).catch(()=>{})}return}if(n.attachedFiles.length){let e=`📎 [${n.attachedFiles.map(e=>e.name).join(`, `)}] ${s}`;x(`user`,e),C({role:`user`,content:e,timestamp:Date.now()}),p();try{let e=await Promise.all(n.attachedFiles.map(e=>Xt(e))),t=Bt(e,s);if(O(),r){ze();try{let n=Vt(s,e);await Gt(n,await Wt(n),async()=>{await i(`/api/message`,`POST`,v({prompt:t}))})}catch(e){S(_(`chat.cmd.fail`,{msg:e.message}),``,`error`)}finally{l(`command`).catch(()=>{})}return}await i(`/api/message`,`POST`,v({prompt:t}))}catch(e){S(_(`chat.file.uploadFail`,{msg:e.message})),O()}}else{p();let e=await Ut(s),t=e.data;if(e.status===409&&t.error===`duplicate`)return;if(!e.ok){S(`${y.error} ${g(t.error||_(`chat.requestFail`,{status:e.status}))}`,``,`error`);return}if(t.queued){let{updateQueueBadge:e}=await h(async()=>{let{updateQueueBadge:e}=await import(`./ui-TUyJsMUf.js`);return{updateQueueBadge:e}},__vite__mapDeps([0]));e(t.pending||1)}else e.viaRelay?(C({role:`user`,content:s,timestamp:Date.now()}),t.continued&&S(_(`chat.continue`)),b(!0)):t.noPendingContinue?(x(`user`,s),C({role:`user`,content:s,timestamp:Date.now()}),b(!0)):t.continued?(x(`user`,s),C({role:`user`,content:s,timestamp:Date.now()}),S(_(`chat.continue`)),b(!0)):(x(`user`,s),C({role:`user`,content:s,timestamp:Date.now()}),b(!0))}}finally{t.removeEventListener(`input`,f),qt=!1,m.disabled=ne}}function Yt(e){e.key===`Enter`&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),Jt(`enter`))}async function Xt(e){let t=await fetch(`${s}/api/upload`,{method:`POST`,headers:{"X-Filename":encodeURIComponent(e.name)},body:e});if(!t.ok)throw Error(`upload failed`);return(await t.json()).path}function Zt(e){for(let t of e)n.attachedFiles.some(e=>e.name===t.name)||n.attachedFiles.push(t);k(),document.getElementById(`chatInput`)?.focus()}function Qt(e){n.attachedFiles.splice(e,1),k()}function O(){D.forEach(e=>URL.revokeObjectURL(e)),D=[],n.attachedFiles=[],k();let e=document.getElementById(`fileInput`);e&&(e.value=``)}function k(){let e=document.getElementById(`filePreview`),t=document.getElementById(`filePreviewList`);if(e){if(D.forEach(e=>URL.revokeObjectURL(e)),D=[],!n.attachedFiles.length){e.classList.remove(`visible`),t&&(t.innerHTML=``);return}e.classList.add(`visible`),t&&(t.innerHTML=n.attachedFiles.map((e,t)=>{let n=(e.size/1024).toFixed(1),r=e.type.startsWith(`image/`),i=``;if(r){let t=URL.createObjectURL(e);D.push(t),i=`<img src="${t}" class="file-chip-thumb" alt="">`}return`<div class="file-chip">
|
|
14
|
-
${i}
|
|
15
|
-
<span class="file-chip-name">${y.paperclip} ${g(e.name)} (${n}KB)</span>
|
|
16
|
-
<button class="file-chip-remove" data-file-idx="${t}" title="Remove">${y.close}</button>
|
|
17
|
-
</div>`}).join(``))}}async function $t(){fe(),be().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``);let{cleanupToolActivity:t}=await h(async()=>{let{cleanupToolActivity:e}=await import(`./ui-TUyJsMUf.js`);return{cleanupToolActivity:e}},__vite__mapDeps([0]));t(),De().catch(()=>{}),te()}var en=0;function tn(e){if(en)return;let t=Ce();en=requestAnimationFrame(()=>{if(en=0,e.style.height=`auto`,e.style.height=e.scrollHeight+`px`,t){let e=document.getElementById(`chatMessages`);e&&(e.scrollTop=e.scrollHeight,xe())}})}function nn(){let e=document.getElementById(`chatInput`);e&&e.addEventListener(`input`,()=>tn(e))}function rn(){let e=document.getElementById(`chatInput`),t=Ce();if(e&&(e.style.height=`auto`),t){let e=document.getElementById(`chatMessages`);e&&(e.scrollTop=e.scrollHeight,xe())}}function an(){let e=document.querySelector(`.chat-area`),t=document.getElementById(`dragOverlay`);if(!e||!t)return;let n=0;e.addEventListener(`dragenter`,e=>{e.preventDefault(),n++,t.classList.add(`visible`)}),e.addEventListener(`dragleave`,e=>{e.preventDefault(),n--,n<=0&&(n=0,t.classList.remove(`visible`))}),e.addEventListener(`dragover`,e=>e.preventDefault()),e.addEventListener(`drop`,e=>{e.preventDefault(),n=0,t.classList.remove(`visible`);let r=[...e.dataTransfer?.files||[]];r.length&&Zt(r)}),document.getElementById(`fileInput`)?.addEventListener(`change`,e=>{let t=e.target,n=[...t.files||[]];n.length&&Zt(n),t.value=``}),document.addEventListener(`paste`,e=>{let t=e.clipboardData?.items;if(!t)return;let n=[];for(let e of t){if(e.kind!==`file`)continue;let t=e.getAsFile();if(t){if(!t.name||t.name===`image.png`){let e=new Date().toISOString().replace(/[:.]/g,`-`),r=t.type.split(`/`)[1]||`png`,i=new File([t],`pasted-${e}.${r}`,{type:t.type});n.push(i)}else n.push(t)}}n.length&&(e.preventDefault(),Zt(n))})}async function on(e,t,r){if(!ue()){de();return}let a=document.getElementById(`chatInput`),o=a?.value.trim()||``,c=[...n.attachedFiles],l=[_(`chat.voice.label`)];c.length&&l.push(`📎 [${c.map(e=>e.name).join(`, `)}]`),o&&l.push(o),x(`user`,l.join(` `)),C({role:`user`,content:l.join(` `),timestamp:Date.now()}),a&&o&&(a.value=``,rn()),c.length&&O();try{let n=await fetch(`${s}/api/voice`,{method:`POST`,headers:{"Content-Type":r,"X-Voice-Ext":t,"X-STT-Only":`true`},body:e});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`HTTP ${n.status}`)}let a=await n.json().catch(()=>null);if(!a?.text)throw Error(`Empty STT result`);S(`${y.mic} STT (${g(a.engine||``)}, ${a.elapsed?.toFixed(1)}s): "${g(a.text.slice(0,100))}"`,``,`info`);let l=[];c.length&&(l=await Promise.all(c.map(e=>Xt(e))));let u=[];for(let e of l)u.push(zt(e));u.push(`🎤 ${a.text}`),o&&u.push(o),await i(`/api/message`,`POST`,v({prompt:u.join(`
|
|
18
|
-
`)}))}catch(e){S(_(`voice.sttFail`,{msg:e.message}),``,`error`)}}var sn={sun:0,mon:1,tue:2,wed:3,thu:4,fri:5,sat:6},cn={jan:1,feb:2,mar:3,apr:4,may:5,jun:6,jul:7,aug:8,sep:9,oct:10,nov:11,dec:12};function ln(e){let t=typeof e==`string`?e.trim():``;if(t)try{return new Intl.DateTimeFormat(`en-US`,{timeZone:t}).format(new Date),t}catch{return}}function un(e){let t=e&&typeof e==`object`?e:{},n=t.kind,r=typeof t.timeZone==`string`?t.timeZone.trim():``,i=ln(t.timeZone);if(r&&!i)return{ok:!1,code:`invalid_timezone`,error:`invalid timeZone "${r}"`};if(n===`cron`){let e=typeof t.cron==`string`?t.cron.trim().replace(/\s+/g,` `):``;if(!e)return{ok:!1,code:`invalid_cron`,error:`cron expression required`};let n=dn(e);return n?{ok:!1,code:`invalid_cron`,error:n}:{ok:!0,schedule:i?{kind:`cron`,cron:e,timeZone:i}:{kind:`cron`,cron:e}}}if(n==null||n===`every`){let e=typeof t.minutes==`number`?t.minutes:Number(t.minutes);if(!Number.isInteger(e)||e<1)return{ok:!1,code:`invalid_minutes`,error:`minutes must be an integer >= 1`};let n=Math.max(1,Math.floor(e));return{ok:!0,schedule:i?{kind:`every`,minutes:n,timeZone:i}:{kind:`every`,minutes:n}}}return{ok:!1,code:`invalid_kind`,error:`invalid heartbeat schedule kind "${String(n)}"`}}function dn(e){try{let[t,n,r,i,a]=fn(e);return A(t,{min:0,max:59}),A(n,{min:0,max:23}),A(r,{min:1,max:31}),A(i,{min:1,max:12,aliases:cn}),A(a,{min:0,max:7,aliases:sn,normalize:gn}),null}catch(e){return e.message}}function fn(e){let t=String(e||``).trim().replace(/\s+/g,` `).split(` `);if(t.length!==5)throw Error(`cron must have 5 fields, got ${t.length}`);return t}function A(e,t){for(let n of e.split(`,`))pn(n.trim(),t)}function pn(e,t){if(!e)throw Error(`empty cron segment`);let n=e;if(e.includes(`/`)){let[t,r,...i]=e.split(`/`);if(!t||!r||i.length>0)throw Error(`invalid cron step segment "${e}"`);n=t,hn(r,`invalid cron step "${r}"`)}if(n!==`*`){if(n.includes(`-`)){let[e,r,...i]=n.split(`-`);if(!e||!r||i.length>0||mn(e,t)>mn(r,t))throw Error(`invalid cron range "${n}"`);return}mn(n,t)}}function mn(e,t){let n=e.trim().toLowerCase(),r=t.aliases?.[n]??Number(n);if(!Number.isInteger(r))throw Error(`invalid cron value "${e}"`);let i=t.normalize?t.normalize(r):r;if(!_n(i,t.min,t.max))throw Error(`cron value "${e}" out of range ${t.min}-${t.max}`);return i}function hn(e,t){let n=Number(e);if(!Number.isInteger(n)||n<=0)throw Error(t);return n}function gn(e){return e===7?0:e}function _n(e,t,n){return e>=t&&e<=n}async function vn(){let e=await a(`/api/heartbeat`);n.heartbeatJobs=(e?.jobs||[]).map(N),n.heartbeatErrors=F(n.heartbeatJobs),j(),document.getElementById(`heartbeatModal`)?.classList.add(`open`)}function yn(e){e&&e.target!==e.currentTarget||document.getElementById(`heartbeatModal`)?.classList.remove(`open`)}function j(){let e=document.getElementById(`hbJobsList`);if(!e)return;let t=n.heartbeatJobs.map(N);n.heartbeatJobs=t,n.heartbeatErrors=F(t),e.innerHTML=t.length===0?`<p style="color:var(--text-dim);font-size:12px;text-align:center">${_(`hb.empty`)}</p>`:t.map((e,t)=>{let r=Tn(e.schedule),i=r.kind===`cron`,a=n.heartbeatErrors[e.id],o=a||jn(r),s=a?`hb-schedule-meta hb-error`:`hb-schedule-meta hb-help`,c=i?`<input type="text" value="${g(r.cron)}" placeholder="${g(_(`hb.cronPlaceholder`))}"
|
|
19
|
-
data-hb-cron="${t}">`:`<input type="number" value="${r.minutes}" min="1" data-hb-minutes="${t}">`,l=i?`<span class="hb-chip">${g(_(`hb.cronLabel`))}</span>`:`<span class="hb-chip">${g(_(`hb.minutesLabel`))}</span>`;return`
|
|
20
|
-
<div class="hb-job-card">
|
|
21
|
-
<div class="hb-job-header">
|
|
22
|
-
<input type="text" value="${g(String(e.name||``))}" placeholder="${g(_(`hb.name`))}"
|
|
23
|
-
data-hb-name="${t}">
|
|
24
|
-
<button class="hb-toggle ${e.enabled?`on`:`off`}"
|
|
25
|
-
data-hb-toggle="${t}" aria-label="${g(String(e.name||`job`)+` toggle`)}"></button>
|
|
26
|
-
<button class="hb-del" data-hb-remove="${t}">${y.close}</button>
|
|
27
|
-
</div>
|
|
28
|
-
<div class="hb-job-schedule">
|
|
29
|
-
<select data-hb-kind="${t}">
|
|
30
|
-
<option value="every"${i?``:` selected`}>${g(_(`hb.kindEvery`))}</option>
|
|
31
|
-
<option value="cron"${i?` selected`:``}>${g(_(`hb.kindCron`))}</option>
|
|
32
|
-
</select>
|
|
33
|
-
${c}
|
|
34
|
-
${l}
|
|
35
|
-
<input type="text" value="${g(r.timeZone||``)}" placeholder="${g(On())}"
|
|
36
|
-
data-hb-timezone="${t}">
|
|
37
|
-
</div>
|
|
38
|
-
<p class="${s}">${g(o)}</p>
|
|
39
|
-
<textarea class="hb-prompt" rows="2" placeholder="${g(_(`hb.prompt`))}"
|
|
40
|
-
data-hb-prompt="${t}">${g(String(e.prompt||``))}</textarea>
|
|
41
|
-
</div>
|
|
42
|
-
`}).join(``);let r=t.filter(e=>e.enabled).length,i=document.getElementById(`hbSidebarBtn`);i&&(i.innerHTML=`${y.heartPulse} Heartbeat (${r})`)}var bn=0;function xn(){n.heartbeatJobs.push({id:`hb_${Date.now()}_${bn++}`,name:``,enabled:!0,schedule:Dn({kind:`every`,minutes:5}),prompt:``}),j(),M()}function Sn(e){n.heartbeatJobs.splice(e,1),j(),M()}function Cn(e){let t=n.heartbeatJobs[e];t&&(t.enabled=!t.enabled,j(),M())}async function M(){let e=n.heartbeatJobs.map(N);if(n.heartbeatJobs=e,n.heartbeatErrors=F(e),Object.keys(n.heartbeatErrors).length>0){j();return}let t=await i(`/api/heartbeat`,`PUT`,{jobs:e});t?.jobs&&(n.heartbeatJobs=t.jobs.map(N),n.heartbeatErrors=F(n.heartbeatJobs),j())}async function wn(){try{let e=((await a(`/api/heartbeat`))?.jobs||[]).filter(e=>e.enabled!==!1&&!e.held).length,t=document.getElementById(`hbSidebarBtn`);t&&(t.innerHTML=`${y.heartPulse} Heartbeat (${e})`)}catch{}}function N(e){return{id:String(e.id||`hb_${Date.now()}_${bn++}`),name:String(e.name||``),enabled:e.enabled!==!1,schedule:Tn(e.schedule),prompt:String(e.prompt||``)}}function Tn(e){let t=En(e?.timeZone);if(e?.kind===`cron`){let n=typeof e.cron==`string`?e.cron.trim().replace(/\s+/g,` `):`0 9 * * *`;return t?{kind:`cron`,cron:n,timeZone:t}:{kind:`cron`,cron:n}}let n=typeof e?.minutes==`number`&&Number.isFinite(e.minutes)&&e.minutes>0?Math.max(1,Math.floor(e.minutes)):5;return t?{kind:`every`,minutes:n,timeZone:t}:{kind:`every`,minutes:n}}function En(e){return(typeof e==`string`?e.trim():``)||void 0}function Dn(e){let t=P();return t?{...e,timeZone:t}:e}function P(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||void 0}catch{return}}function On(){let e=P();return e?`${_(`hb.timezoneAuto`)} ${e}`:_(`hb.timezoneAuto`)}function F(e){let t={};for(let n of e){let e=kn(n);e&&(t[n.id]=e)}return t}function kn(e){let t=un(e.schedule);return t.ok?null:An(t.code,t.error)}function An(e,t){switch(e){case`invalid_cron`:return _(`hb.invalidCron`);case`invalid_timezone`:return _(`hb.invalidTimeZone`);case`invalid_minutes`:return _(`hb.invalidMinutes`);default:return t||_(`hb.invalidSchedule`)}}function jn(e){let t=e.timeZone||P()||`Asia/Seoul`;return e.kind===`cron`?_(`hb.scheduleHintCron`,{cron:`0 9 * * *`,timeZone:t}):_(`hb.scheduleHintEvery`,{minutes:e.minutes,timeZone:t})}var I=`jaw.uiTheme`,L=null;function Mn(e){return e===`dark`||e===`light`||e===`auto`}function Nn(e){return e===`light`||e===`auto`&&typeof window<`u`&&window.matchMedia&&window.matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`}function Pn(n){let r=n===`light`?e:t;L||(L=document.createElement(`style`),L.id=`hljsTheme`,document.head.appendChild(L)),L.textContent=r}function Fn(){!localStorage.getItem(I)&&localStorage.getItem(`theme`)&&(localStorage.setItem(I,localStorage.getItem(`theme`)),localStorage.removeItem(`theme`));let e=Ln(),t=localStorage.getItem(I),n=window.matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`;R(e||t||n),document.getElementById(`toggleTheme`)?.addEventListener(`click`,In),window.addEventListener(`message`,zn),window.matchMedia(`(prefers-color-scheme: dark)`).addEventListener(`change`,()=>{let e=localStorage.getItem(I);(!e||e===`auto`)&&R(e||`auto`)}),window.addEventListener(`storage`,e=>{e.key===I&&e.newValue&&R(e.newValue)})}function In(){let e=(document.documentElement.getAttribute(`data-theme`)||`dark`)===`dark`?`light`:`dark`;R(e),localStorage.setItem(I,e)}function R(e){let t=Nn(e);document.documentElement.setAttribute(`data-theme`,t);let n=document.getElementById(`toggleTheme`);n&&n.classList.toggle(`is-light`,t===`light`),Pn(t),Se(),ie()}function Ln(){let e=new URLSearchParams(window.location.search).get(`jawTheme`);return Mn(e)?e:null}function Rn(e){if(e===window.location.origin)return!0;try{let t=new URL(e).hostname;return t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`}catch{return!1}}function zn(e){if(window.parent===window||e.source!==window.parent||!Rn(e.origin))return;let t=e.data;t&&t.type===`jaw-preview-theme-sync`&&Mn(t.theme)&&R(t.theme)}var Bn=new Set([`j`,`k`,`i`,`n`,`p`]);function Vn(e){if(e.altKey&&!e.ctrlKey&&!e.metaKey){let t=e.key.toLowerCase();return(t.length!==1||!Bn.has(t))&&e.code?.startsWith(`Key`)&&(t=e.code.slice(3).toLowerCase()),Bn.has(t)}return e.ctrlKey&&!e.metaKey&&!e.altKey?e.code===`Backquote`:!(!e.metaKey||e.ctrlKey||e.altKey||(e.shiftKey||e.code!==`Backquote`&&e.code!==`KeyB`&&e.code!==`KeyJ`)&&(!e.shiftKey||e.code!==`KeyB`&&e.code!==`KeyD`&&e.code!==`KeyE`))}function Hn(){window.parent!==window&&document.addEventListener(`keydown`,e=>{if(Vn(e)){e.preventDefault();try{window.parent.postMessage({type:`jaw-preview-shortcut`,key:e.key,code:e.code,altKey:e.altKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,shiftKey:e.shiftKey},`*`)}catch{}}})}var Un=50,Wn=30,Gn=80,Kn=500,z=null,qn=!1;function Jn(){if(qn||!(`ontouchstart`in window))return;qn=!0;let e=document.querySelector(`.chat-area`);e&&(e.addEventListener(`touchstart`,Yn,{passive:!0}),e.addEventListener(`touchend`,Xn,{passive:!0}))}function Yn(e){let t=e.touches[0],n=window.innerWidth,r=null;t.clientX<Wn?r=`left`:t.clientX>n-Wn&&(r=`right`),z={startX:t.clientX,startY:t.clientY,startTime:Date.now(),isEdge:r}}function Xn(e){if(!z)return;let t=e.changedTouches[0],n=t.clientX-z.startX,r=Math.abs(t.clientY-z.startY),i=Date.now()-z.startTime,a=z;z=null,!(r>Gn||i>Kn||Math.abs(n)<Un)&&(n>0&&a.isEdge===`left`&&f(),n<0&&a.isEdge===`right`&&ee())}var B=!1,V=null,H=[],U=null,Zn=null,Qn=0,W=!1,G=`stopped`,$n=15e3;function er(){if(typeof MediaRecorder>`u`)return``;for(let e of[`audio/webm;codecs=opus`,`audio/mp4`,`audio/ogg;codecs=opus`])if(MediaRecorder.isTypeSupported(e))return e;return``}function tr(e){let t=e;switch(t.name){case`NotAllowedError`:return _(`voice.micDenied`);case`NotFoundError`:return _(`voice.micNotFound`);case`NotReadableError`:case`AbortError`:return _(`voice.micBusy`);case`TimeoutError`:return or();default:return t instanceof TypeError||!navigator.mediaDevices?_(`voice.httpsRequired`):_(`voice.micDenied`)}}function nr(){let e=document;return e.permissionsPolicy||e.featurePolicy||null}function rr(){try{return nr()?.allowsFeature?.(`microphone`)===!1}catch{return!1}}async function ir(){try{return navigator.permissions?.query?(await navigator.permissions.query({name:`microphone`})).state:null}catch{return null}}function ar(){let e=new URL(window.location.href),t=new URL(e.href);e.hostname===`127.0.0.1`?t.hostname=`localhost`:e.hostname===`localhost`&&(t.hostname=`127.0.0.1`);let n=t.origin===e.origin?``:t.origin;return{origin:e.origin,alternateOrigin:n}}function or(){let e=ar();return e.alternateOrigin?_(`voice.requestTimeoutLoopback`,e):_(`voice.requestTimeout`,e)}function sr(e){let t=e;return t.name===`NotSupportedError`?_(`voice.unsupported`):t.name===`NotReadableError`||t.name===`AbortError`?_(`voice.micBusy`):t instanceof TypeError?_(`voice.httpsRequired`):_(`voice.interrupted`)}function K(e){if(window.parent!==window)try{window.parent.postMessage({type:`jaw-preview-stt-recording`,action:e},`*`)}catch{}}function cr(){return new DOMException(`Timed out waiting for microphone permission prompt`,`TimeoutError`)}async function lr(){let e=!1,t=null,n=navigator.mediaDevices.getUserMedia({audio:!0}).then(t=>e?(t.getTracks().forEach(e=>e.stop()),null):t,t=>{if(e)return null;throw t}),r=new Promise((n,r)=>{t=setTimeout(()=>{e=!0,r(cr())},$n)});try{let e=await Promise.race([n,r]);if(!e)throw cr();return e}finally{t!==null&&clearTimeout(t)}}async function ur(){if(n.isRecording||W)return;if(typeof MediaRecorder>`u`||!navigator.mediaDevices?.getUserMedia){S(_(`voice.unsupported`),``,`error`);return}if(rr()){S(_(`voice.policyBlocked`),``,`error`);return}if(await ir()===`denied`){S(_(`voice.permissionDeniedBrowser`,ar()),``,`error`);return}W=!0,B=!1,G=`stopped`,J(!1),K(`request`);let e=null;try{e=await lr(),U=e}catch(e){W=!1,J(!1),K(`failed`),S(tr(e),``,`error`);return}try{let t=er(),r=new MediaRecorder(e,t?{mimeType:t}:{});V=r,H=[],r.ondataavailable=e=>{e.data.size>0&&H.push(e.data)},r.onerror=()=>{B=!0,G=`failed`,n.isRecording=!1,hr(),J(!1),r.state===`recording`?r.stop():(H=[],q(),V=null,K(`failed`)),S(_(`voice.interrupted`),``,`error`)},r.onstop=async()=>{let e=G,n=B||e!==`stopped`;if(G=`stopped`,n){H=[],q(),V=null,B=!1,K(e);return}let i=r.mimeType||t||`audio/webm`,a=i.includes(`mp4`)?`.m4a`:i.includes(`ogg`)?`.ogg`:`.webm`,o=new Blob(H,{type:i});if(H=[],q(),V=null,B=!1,K(`stopped`),o.size>20971520){S(_(`voice.tooLarge`),``,`error`);return}if(o.size<1e3){S(_(`voice.tooShort`),``,`error`);return}await on(o,a,i)},r.start(),n.isRecording=!0,W=!1,Qn=Date.now(),J(!0),mr(),K(`started`)}catch(e){W=!1,n.isRecording=!1,H=[],V=null,q(),J(!1),K(`failed`),S(sr(e),``,`error`)}}function dr(){n.isRecording&&V&&(G=`stopped`,V.state===`recording`?V.stop():(q(),V=null,K(`stopped`)),n.isRecording=!1,hr(),J(!1))}function fr(){n.isRecording&&V&&(B=!0,G=`cancelled`,V.state===`recording`?V.stop():(H=[],q(),V=null,K(`cancelled`)),n.isRecording=!1,hr(),J(!1))}function pr(){n.isRecording?dr():ur()}function q(){U?.getTracks().forEach(e=>e.stop()),U=null}function mr(){let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`inline`,Zn=setInterval(()=>{let t=Math.floor((Date.now()-Qn)/1e3),n=String(Math.floor(t/60)).padStart(2,`0`),r=String(t%60).padStart(2,`0`);e.textContent=`${n}:${r}`},500))}function hr(){Zn&&=(clearInterval(Zn),null);let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`none`,e.textContent=`00:00`)}function J(e){let t=document.getElementById(`btnVoice`),n=document.getElementById(`btnVoiceCancel`),r=W&&!e;t&&(t.classList.toggle(`recording`,e),t.classList.toggle(`arming`,r),t.innerHTML=e?y.stop:y.mic,t.title=_(r?`voice.requesting`:e?`voice.stop`:`voice.start`),t.toggleAttribute(`aria-busy`,r),t instanceof HTMLButtonElement&&(t.disabled=r)),n&&(n.style.display=e?`inline-block`:`none`)}window.parent;var gr=null,Y=``,X=null,_r=!1;function vr(){let e=document.getElementById(`chatSearchInput`),t=document.getElementById(`chatSearchClose`),n=document.getElementById(`chatSearchResults`),r=document.getElementById(`chatSearchCount`);e&&t&&n&&r&&(_r||(_r=!0,window.addEventListener(`message`,e=>{e.data?.type===`jaw-preview-search`&&yr()}),e.addEventListener(`input`,()=>{let t=e.value.trim();if(gr&&clearTimeout(gr),!t){Dr(n,r);return}gr=setTimeout(()=>void xr(t,n,r),250)}),e.addEventListener(`keydown`,e=>{if(e.key===`Escape`){Z();return}e.key===`Enter`&&(e.preventDefault(),n.querySelector(`.chat-search-result`)?.click()),e.key===`ArrowDown`&&(e.preventDefault(),Er(n,1)),e.key===`ArrowUp`&&(e.preventDefault(),Er(n,-1))}),n.addEventListener(`wheel`,e=>{let t=n,r=t.scrollTop===0&&e.deltaY<0,i=t.scrollTop+t.clientHeight>=t.scrollHeight&&e.deltaY>0;!r&&!i&&e.stopPropagation(),(r||i)&&e.preventDefault()},{passive:!1}),t.addEventListener(`click`,Z)))}function yr(){let e=document.getElementById(`chatSearch`),t=document.getElementById(`chatSearchInput`);e&&t&&(e.classList.contains(`open`)?Z():(e.classList.add(`open`),t.focus(),br()))}function Z(){let e=document.getElementById(`chatSearch`),t=document.getElementById(`chatSearchInput`),n=document.getElementById(`chatSearchResults`),r=document.getElementById(`chatSearchCount`);e&&(e.classList.remove(`open`),t&&(t.value=``),n&&r&&Dr(n,r),Y=``)}function br(){X=new Map,a(`/api/messages${Ee()}`).then(e=>{e&&(X=new Map,e.forEach((e,t)=>X.set(e.id,t)))}).catch(()=>{})}async function xr(e,t,n){Y=e;let r=await a(ce(`/api/messages/search?q=${encodeURIComponent(e)}&limit=20`));if(r&&Y===e){if(n.textContent=r.length>0?`${r.length} found`:`no results`,r.length===0){t.classList.remove(`has-results`),t.innerHTML=``;return}t.innerHTML=r.map(t=>Sr(t,e)).join(``),t.classList.add(`has-results`),t.querySelectorAll(`.chat-search-result`).forEach(e=>{e.addEventListener(`click`,()=>{Tr(Number(e.dataset.msgId))})})}}function Sr(e,t){let n=e.role===`assistant`?`agent`:e.role,r=n===`agent`?e.cli||`agent`:`you`,i=e.match_field===`tool_log`,a=i?`<span class="chat-search-result-badge">tool</span>`:``,o=wr(i?Cr(e.tool_log,t):e.content,t),s=Or(e.created_at);return`<div class="chat-search-result" data-msg-id="${e.id}" tabindex="-1">
|
|
43
|
-
<div class="chat-search-result-meta">
|
|
44
|
-
<span class="chat-search-result-role ${n}">${g(r)}</span>
|
|
45
|
-
${a}
|
|
46
|
-
<span>${g(s)}</span>
|
|
47
|
-
</div>
|
|
48
|
-
<div class="chat-search-result-snippet">${o}</div>
|
|
49
|
-
</div>`}function Cr(e,t){if(!e)return``;try{let n=JSON.parse(e),r=t.toLowerCase();for(let e of n){let t=`${e.label||``} ${e.detail||``}`;if(t.toLowerCase().includes(r))return t}}catch{}return e.slice(0,300)}function wr(e,t){let n=e.toLowerCase().indexOf(t.toLowerCase());if(n===-1)return g(e.slice(0,120));let r=Math.max(0,n-40),i=Math.min(e.length,n+t.length+80),a=g(e.slice(r,n)),o=g(e.slice(n,n+t.length)),s=g(e.slice(n+t.length,i));return`${r>0?`…`:``}${a}<mark>${o}</mark>${s}${i<e.length?`…`:``}`}function Tr(e){if(!X)return;let t=X.get(e);t!=null&&(be().scrollToIndex(t,`center`),requestAnimationFrame(()=>{setTimeout(()=>{let e=document.getElementById(`chatMessages`);if(!e)return;e.querySelectorAll(`.msg.search-highlight`).forEach(e=>e.classList.remove(`search-highlight`));let n=e.querySelectorAll(`.msg`);for(let e of n){let n=e.getAttribute(`data-turn-index`);if(n!=null&&Number(n)===t){e.classList.add(`search-highlight`);break}}},150)}))}function Er(e,t){let n=Array.from(e.querySelectorAll(`.chat-search-result`));if(n.length===0)return;let r=e.querySelector(`.chat-search-result.active`),i=r?n.indexOf(r)+t:0;i<0&&(i=n.length-1),i>=n.length&&(i=0),n.forEach(e=>e.classList.remove(`active`)),n[i].classList.add(`active`),n[i].scrollIntoView({block:`nearest`}),n[i].click()}function Dr(e,t){e.classList.remove(`has-results`),e.innerHTML=``,t.textContent=``}function Or(e){try{let t=new Date(e),n=new Date;return t.toDateString()===n.toDateString()?t.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`}):t.toLocaleDateString([],{month:`short`,day:`numeric`})+` `+t.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}catch{return``}}var kr=!1;function Ar(){if(kr)return;kr=!0;let e=document.createElement(`div`);e.id=`mediaLightbox`,e.className=`media-lightbox hidden`,e.innerHTML=`<div class="media-lightbox-backdrop"></div>
|
|
50
|
-
<div class="media-lightbox-content">
|
|
51
|
-
<img class="media-lightbox-img" alt="" />
|
|
52
|
-
<div class="media-lightbox-controls">
|
|
53
|
-
<button class="media-lightbox-open" aria-label="Open in browser">↗ Open</button>
|
|
54
|
-
<button class="media-lightbox-close" aria-label="Close">✕</button>
|
|
55
|
-
</div></div>`,document.body.appendChild(e);let t=``,n=()=>e.classList.add(`hidden`),r=()=>{t&&window.open(t,`_blank`)};e.querySelector(`.media-lightbox-backdrop`).addEventListener(`click`,n),e.querySelector(`.media-lightbox-close`).addEventListener(`click`,n),e.querySelector(`.media-lightbox-open`).addEventListener(`click`,r),e.querySelector(`.media-lightbox-img`).addEventListener(`dblclick`,r),document.addEventListener(`keydown`,t=>{t.key===`Escape`&&!e.classList.contains(`hidden`)&&n()}),document.addEventListener(`click`,n=>{let r=n.target;(r.classList.contains(`chat-inline-img`)||r.closest(`.file-preview-list`)&&r.tagName===`IMG`)&&(t=r.src,e.querySelector(`.media-lightbox-img`).src=t,e.classList.remove(`hidden`))})}var jr=`jaw:stale-bundle-reload-pending`;function Mr(e){let t=typeof e==`string`?e:e instanceof Error||typeof e?.message==`string`?e.message:``;if(!/(failed to fetch dynamically imported module|error loading dynamically imported module|importing a module script failed|chunkloaderror)/i.test(t))return!1;console.warn(`[stale-bundle] detected dynamic import failure:`,t);try{if(sessionStorage.getItem(jr)===`1`)return!0;sessionStorage.setItem(jr,`1`)}catch{}let n=()=>window.location.reload();return`serviceWorker`in navigator?(navigator.serviceWorker.getRegistration().then(e=>e?.update()).catch(()=>{}).finally(n),!0):(n(),!0)}window.addEventListener(`unhandledrejection`,e=>{if(Mr(e.reason)){e.preventDefault();return}console.error(`[unhandled]`,e.reason),e.preventDefault()}),window.addEventListener(`error`,e=>{if(Mr(e.error||e.message)){e.preventDefault();return}console.error(`[error]`,e.message,e.filename,e.lineno)});var{loadEmployees:Nr,addEmployee:Pr,deleteEmployee:Fr,updateEmployee:Q,onEmpCliChange:Ir,onEmpRoleChange:Lr}=await h(async()=>{let{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}=await import(`./employees-BQaJNp-u.js`);return{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}},__vite__mapDeps([0]));function Rr(e){if(e===window.location.origin)return!0;try{let t=new URL(e).hostname;return t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`}catch{return!1}}function zr(e){let t=(e.ctrlKey||e.metaKey)&&e.shiftKey&&e.code===`Space`,n=e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey&&e.code===`KeyM`;return t||n}document.getElementById(`btnSend`)?.addEventListener(`click`,()=>{Jt(`button`)});var Br=document.getElementById(`chatInput`);Br?.addEventListener(`keydown`,e=>{Le(e)||Yt(e)});var $=0;Br?.addEventListener(`input`,e=>{e.isComposing||($&&cancelAnimationFrame($),$=requestAnimationFrame(()=>{Ie(e.target?.value||``),$=0}))}),Br?.addEventListener(`cmd-execute`,()=>{Jt(`cmd-execute`)}),document.getElementById(`cmdDropdown`)?.addEventListener(`click`,Fe),document.addEventListener(`click`,Pe),u(),Mt(),document.getElementById(`filePreviewClear`)?.addEventListener(`click`,O),document.getElementById(`filePreviewList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-file-idx]`);t&&Qt(+(t.dataset.fileIdx||`0`))}),document.querySelector(`.btn-attach`)?.addEventListener(`click`,()=>{document.getElementById(`fileInput`)?.click()}),document.getElementById(`btnVoice`)?.addEventListener(`click`,()=>pr()),document.getElementById(`btnVoiceCancel`)?.addEventListener(`click`,()=>fr()),window.addEventListener(`message`,e=>{if(window.parent===window||e.source!==window.parent||!Rr(e.origin))return;let t=e.data;t&&t.type===`jaw-preview-stt-toggle`&&pr()}),document.getElementById(`memorySidebarBtn`)?.addEventListener(`click`,St),document.getElementById(`btnClearChat`)?.addEventListener(`click`,$t),document.getElementById(`hbSidebarBtn`)?.addEventListener(`click`,vn),document.getElementById(`langSelect`)?.addEventListener(`change`,async e=>{let t=e.target.value;[`ko`,`en`,`zh`,`ja`].includes(t)&&(await oe(t),p())}),document.querySelector(`.tab-bar`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`.tab-btn`);if(!t)return;let n=[...t.parentElement?.children||[]].filter(e=>e.classList.contains(`tab-btn`)).indexOf(t),r=[`agents`,`skills`];r[n]&&Ae(r[n],t)}),document.querySelector(`.tab-bar`)?.addEventListener(`keydown`,e=>{let t=e;if(t.key!==`ArrowRight`&&t.key!==`ArrowLeft`)return;let n=t.target?.closest(`.tab-btn`);if(!n)return;let r=[...n.parentElement?.children||[]].filter(e=>e.classList.contains(`tab-btn`)),i=r[(r.indexOf(n)+(t.key===`ArrowRight`?1:r.length-1))%r.length];i&&(t.preventDefault(),i.focus(),i.click())}),document.getElementById(`btnSettings`)?.addEventListener(`click`,()=>T()),document.querySelector(`.sidebar-save-bar .btn-save`)?.addEventListener(`click`,ke),document.getElementById(`selCli`)?.addEventListener(`change`,()=>Ue()),document.getElementById(`selCliProvider`)?.addEventListener(`change`,()=>{Ue(),w()}),document.getElementById(`selModel`)?.addEventListener(`change`,()=>w()),document.getElementById(`selEffort`)?.addEventListener(`change`,()=>w()),document.getElementById(`selPerm`)?.addEventListener(`change`,e=>{We(e.target.value)}),document.getElementById(`flushCli`)?.addEventListener(`change`,()=>Be()),document.getElementById(`flushModel`)?.addEventListener(`change`,()=>Be()),document.querySelector(`[data-action="addEmployee"]`)?.addEventListener(`click`,Pr),document.getElementById(`employeesList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-emp-delete]`);if(t){Fr(t.dataset.empDelete||``);return}}),document.getElementById(`employeesList`)?.addEventListener(`change`,e=>{let t=e.target,n=t.closest(`[data-emp-name]`);if(n){Q(n.dataset.empName||``,{name:t.value});return}let r=t.closest(`[data-emp-cli]`);if(r){Ir(r.dataset.empCli||``,t.value);return}let i=t.closest(`[data-emp-model]`);if(i){if(t.value===`__custom__`){let e=prompt(_(`model.promptInput`));if(e?.trim()){let n=document.createElement(`option`);n.value=e.trim(),n.textContent=e.trim();let r=t.querySelector(`option[value="__custom__"]`);r&&t.insertBefore(n,r),t.value=e.trim(),Q(i.dataset.empModel||``,{model:e.trim()})}else t.value=`default`}else Q(i.dataset.empModel||``,{model:t.value});return}let a=t.closest(`[data-emp-role]`);if(a){Lr(a.dataset.empRole||``,t.value);return}let o=t.closest(`[data-emp-custom]`);if(o){Q(o.dataset.empCustom||``,{role:t.value});return}}),document.getElementById(`skillsList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-skill-id]`);t&&Je(t.dataset.skillId||``,t.dataset.skillEnabled===`true`)}),document.querySelector(`#tabSkills`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`.skill-filter`);if(t){let e=t.dataset.filter||`all`;Xe(e,t)}}),document.getElementById(`skillSearchInput`)?.addEventListener(`input`,e=>{Ye(e.target.value)}),document.querySelector(`[data-action="openPrompt"]`)?.addEventListener(`click`,et),gt(),pt(),document.querySelector(`[data-action="openMcpModal"]`)?.addEventListener(`click`,Qe),document.querySelector(`[data-action="syncMcp"]`)?.addEventListener(`click`,Ze),document.querySelector(`[data-action="installMcp"]`)?.addEventListener(`click`,tt),_t(),document.querySelector(`[data-action="refreshCli"]`)?.addEventListener(`click`,()=>{lt()?at(!0):rt()}),document.getElementById(`cliStatusInterval`)?.addEventListener(`change`,function(){ht(this.value)}),document.getElementById(`promptModal`)?.addEventListener(`click`,e=>E(e)),document.querySelector(`#promptModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closePrompt"]`)?.addEventListener(`click`,()=>E()),document.querySelector(`[data-action="cancelPrompt"]`)?.addEventListener(`click`,()=>E()),document.querySelector(`[data-action="savePrompt"]`)?.addEventListener(`click`,ft),document.addEventListener(`keydown`,e=>{e.key===`Escape`&&!n.isRecording&&E()}),document.querySelector(`[data-action="openTemplates"]`)?.addEventListener(`click`,ut),document.querySelector(`[data-action="saveTemplate"]`)?.addEventListener(`click`,nt),document.querySelector(`[data-action="closeTemplate"]`)?.addEventListener(`click`,()=>st()),document.getElementById(`templateModal`)?.addEventListener(`click`,e=>st(e)),document.querySelector(`#templateModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.getElementById(`templateBack`)?.addEventListener(`click`,ct),document.getElementById(`templateDevToggle`)?.addEventListener(`click`,mt);var{openPiSettingsModal:Vr,closePiSettingsModal:Hr,registerPiProfile:Ur,onPiModeChange:Wr}=await h(async()=>{let{openPiSettingsModal:e,closePiSettingsModal:t,registerPiProfile:n,onPiModeChange:r}=await import(`./pi-settings-Ch6XdqIF.js`);return{openPiSettingsModal:e,closePiSettingsModal:t,registerPiProfile:n,onPiModeChange:r}},[]);document.getElementById(`btnPiSettings`)?.addEventListener(`click`,Vr),document.getElementById(`piSettingsModal`)?.addEventListener(`click`,e=>{e.target===e.currentTarget&&Hr()}),document.querySelector(`#piSettingsModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closePiSettings"]`)?.addEventListener(`click`,Hr),document.getElementById(`btnPiRegister`)?.addEventListener(`click`,()=>void Ur()),document.getElementById(`piMode`)?.addEventListener(`change`,Wr),document.getElementById(`heartbeatModal`)?.addEventListener(`click`,e=>yn(e)),document.querySelector(`#heartbeatModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeHeartbeat"]`)?.addEventListener(`click`,()=>yn()),document.querySelector(`[data-action="addHeartbeat"]`)?.addEventListener(`click`,xn),document.getElementById(`hbJobsList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-hb-toggle]`);if(t){Cn(+(t.dataset.hbToggle||`0`));return}let n=e.target?.closest(`[data-hb-remove]`);if(n){Sn(+(n.dataset.hbRemove||`0`));return}}),document.getElementById(`hbJobsList`)?.addEventListener(`change`,e=>{let t=e.target,r=t.closest(`[data-hb-name]`);if(r){n.heartbeatJobs[+(r.dataset.hbName||`0`)].name=t.value,M();return}let i=t.closest(`[data-hb-kind]`);if(i){let e=+(i.dataset.hbKind||`0`),r=n.heartbeatJobs[e]?.schedule,a=typeof r?.timeZone==`string`?r.timeZone:void 0;n.heartbeatJobs[e].schedule=t.value===`cron`?{kind:`cron`,cron:typeof r?.cron==`string`&&r.cron.trim()?r.cron:`0 9 * * *`,...a?{timeZone:a}:{}}:{kind:`every`,minutes:typeof r?.minutes==`number`&&r.minutes>0?Math.floor(r.minutes):5,...a?{timeZone:a}:{}},j(),M();return}let a=t.closest(`[data-hb-minutes]`);if(a){let e=+(a.dataset.hbMinutes||`0`),r=n.heartbeatJobs[e]?.schedule,i=Math.max(1,Math.floor(Number(t.value)||5)),o=typeof r?.timeZone==`string`?r.timeZone:void 0;n.heartbeatJobs[e].schedule={kind:`every`,minutes:i,...o?{timeZone:o}:{}},j(),M();return}let o=t.closest(`[data-hb-cron]`);if(o){let e=+(o.dataset.hbCron||`0`),r=n.heartbeatJobs[e]?.schedule,i=typeof r?.timeZone==`string`?r.timeZone:void 0,a=t.value.trim().replace(/\s+/g,` `);n.heartbeatJobs[e].schedule={kind:`cron`,cron:a,...i?{timeZone:i}:{}},j(),M();return}let s=t.closest(`[data-hb-timezone]`);if(s){let e=+(s.dataset.hbTimezone||`0`),r=n.heartbeatJobs[e]?.schedule;r?.kind===`cron`?n.heartbeatJobs[e].schedule={kind:`cron`,cron:typeof r.cron==`string`&&r.cron.trim()?r.cron:`0 9 * * *`,...t.value.trim()?{timeZone:t.value.trim()}:{}}:n.heartbeatJobs[e].schedule={kind:`every`,minutes:typeof r?.minutes==`number`&&r.minutes>0?Math.floor(r.minutes):5,...t.value.trim()?{timeZone:t.value.trim()}:{}},j(),M();return}let c=t.closest(`[data-hb-prompt]`);if(c){n.heartbeatJobs[+(c.dataset.hbPrompt||`0`)].prompt=t.value,M();return}}),document.getElementById(`memoryModal`)?.addEventListener(`click`,e=>At(e)),document.querySelector(`#memoryModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeMemory"]`)?.addEventListener(`click`,()=>At()),document.getElementById(`memTabBtnSettings`)?.addEventListener(`click`,()=>jt(`settings`)),document.getElementById(`memTabBtnAdvOps`)?.addEventListener(`click`,()=>jt(`status`)),document.getElementById(`memTabBtnFiles`)?.addEventListener(`click`,()=>jt(`files`)),document.getElementById(`memOn`)?.addEventListener(`click`,()=>Ct(!0)),document.getElementById(`memOff`)?.addEventListener(`click`,()=>Ct(!1)),document.getElementById(`memFlushEvery`)?.addEventListener(`change`,yt),document.getElementById(`memRetention`)?.addEventListener(`change`,yt),document.getElementById(`memFlushLang`)?.addEventListener(`change`,yt),document.getElementById(`memFlushNowBtn`)?.addEventListener(`click`,xt),document.getElementById(`advBootstrapBtn`)?.addEventListener(`click`,kt),document.getElementById(`advReindexBtn`)?.addEventListener(`click`,Et),document.getElementById(`advReimportBtn`)?.addEventListener(`click`,kt),document.getElementById(`advOpenCorruptedBtn`)?.addEventListener(`click`,Ot),document.getElementById(`advStatusBanner`)?.addEventListener(`click`,e=>{e.target?.id===`advUpgradeSoulBtn`&&Dt(),e.target?.id===`advSynthesizeSoulBtn`&&bt()}),document.getElementById(`basicMemoryFiles`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-mem-delete]`);if(t){e.stopPropagation(),Tt(t.dataset.memDelete||``);return}let n=e.target?.closest(`[data-mem-view]`);if(n){wt(n.dataset.memView||``);return}if(e.target?.closest(`[data-mem-back]`)){St();return}});async function Gr(){ve(),qe(),Fn(),Hn(),_e(),se(),await ae();let e=await pe({cancelRecording:fr});if(e===`redirect`)return;d(me);let t=document.getElementById(`langSelect`);if(t&&(t.value=le()),Ne(),e===`hub`){ne(),c();return}vr(),Ar(),document.getElementById(`chatSearchTrigger`)?.addEventListener(`click`,yr),ne(),c(),await Ke(),an(),nn(),await Me(),await He(),Ge(),$e(),dt(),it(),lt()&&at(),m(),Nr(),wn(),vt(),Te(),await we(),Oe(),Jn(),window.location.hash===`#settings`&&T(!0);try{sessionStorage.removeItem(jr)}catch{}setTimeout(()=>{document.querySelector(`.mermaid-pending, [data-mermaid-code-raw], .diagram-widget-pending`)&&he()},3e3),`serviceWorker`in navigator&&!ot()&&navigator.serviceWorker.register(`/sw.js`).catch(()=>{})}Gr().catch(e=>{console.error(`[bootstrap]`,e)}),document.addEventListener(`keydown`,e=>{(e.ctrlKey||e.metaKey)&&e.key===`f`&&(e.preventDefault(),e.stopPropagation(),yr())},!0),document.addEventListener(`keydown`,e=>{if(e.key===`Escape`){if(document.body.dataset.settingsOpen===`true`){e.preventDefault(),T(!1);return}if(document.getElementById(`chatSearch`)?.classList.contains(`open`)){e.preventDefault(),Z();return}if(n.isRecording){e.preventDefault(),fr();return}document.querySelectorAll(`.modal-overlay.open`).forEach(e=>{e.classList.remove(`open`)})}zr(e)&&(e.preventDefault(),pr())}),document.getElementById(`mobileMenuLeft`)?.addEventListener(`click`,f),document.getElementById(`mobileMenuRight`)?.addEventListener(`click`,ee);
|