cli-jaw 2.1.1 → 2.1.2
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 +8 -6
- package/README.ko.md +8 -6
- package/README.md +12 -6
- package/README.zh-CN.md +8 -6
- package/dist/bin/cli-jaw.js +5 -1
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/browser.js +1 -1
- package/dist/bin/commands/browser.js.map +1 -1
- package/dist/bin/commands/chat.js +98 -58
- package/dist/bin/commands/chat.js.map +1 -1
- package/dist/bin/commands/dispatch.js +130 -5
- package/dist/bin/commands/dispatch.js.map +1 -1
- package/dist/bin/commands/goal.js +18 -6
- package/dist/bin/commands/goal.js.map +1 -1
- package/dist/bin/commands/orchestrate.js.map +1 -1
- package/dist/bin/commands/tui/fullscreen-mode.js +237 -0
- package/dist/bin/commands/tui/fullscreen-mode.js.map +1 -0
- package/dist/bin/commands/tui/input-handler.js +139 -52
- package/dist/bin/commands/tui/input-handler.js.map +1 -1
- package/dist/bin/commands/tui/overlays.js +177 -70
- package/dist/bin/commands/tui/overlays.js.map +1 -1
- package/dist/bin/commands/tui/renderer.js +70 -20
- package/dist/bin/commands/tui/renderer.js.map +1 -1
- package/dist/bin/commands/tui/simple-mode.js +1 -1
- package/dist/bin/commands/tui/simple-mode.js.map +1 -1
- package/dist/bin/commands/tui/tui-io.js +8 -0
- package/dist/bin/commands/tui/tui-io.js.map +1 -0
- package/dist/bin/commands/tui/types.js +9 -0
- package/dist/bin/commands/tui/types.js.map +1 -1
- package/dist/bin/commands/tui/ws-handler.js +115 -23
- package/dist/bin/commands/tui/ws-handler.js.map +1 -1
- package/dist/bin/commands/worker.js +159 -0
- package/dist/bin/commands/worker.js.map +1 -0
- package/dist/bin/postinstall.js +0 -76
- package/dist/bin/postinstall.js.map +1 -1
- package/dist/lib/mcp/format-converters.js +21 -2
- package/dist/lib/mcp/format-converters.js.map +1 -1
- package/dist/lib/mcp/mcp-registry.js +75 -0
- package/dist/lib/mcp/mcp-registry.js.map +1 -0
- package/dist/lib/stt.js +1 -1
- package/dist/lib/stt.js.map +1 -1
- package/dist/scripts/fresh-install-smoke.js +1 -1
- package/dist/scripts/fresh-install-smoke.js.map +1 -1
- package/dist/server.js +27 -6
- package/dist/server.js.map +1 -1
- package/dist/src/agent/args.js +33 -1
- package/dist/src/agent/args.js.map +1 -1
- package/dist/src/agent/claude-e-runtime.js +1 -1
- package/dist/src/agent/claude-e-runtime.js.map +1 -1
- package/dist/src/agent/codex-app-client.js +1 -1
- package/dist/src/agent/error-classifier.js +6 -1
- package/dist/src/agent/error-classifier.js.map +1 -1
- package/dist/src/agent/events/claude.js +1 -0
- package/dist/src/agent/events/claude.js.map +1 -1
- package/dist/src/agent/events/codex.js +0 -44
- package/dist/src/agent/events/codex.js.map +1 -1
- package/dist/src/agent/events/helpers.js +52 -5
- package/dist/src/agent/events/helpers.js.map +1 -1
- package/dist/src/agent/events/opencode.js +6 -2
- package/dist/src/agent/events/opencode.js.map +1 -1
- package/dist/src/agent/events/summary.js +3 -2
- package/dist/src/agent/events/summary.js.map +1 -1
- package/dist/src/agent/events/tool-labels.js +8 -5
- package/dist/src/agent/events/tool-labels.js.map +1 -1
- package/dist/src/agent/kiro-auth.js +213 -0
- package/dist/src/agent/kiro-auth.js.map +1 -0
- package/dist/src/agent/kiro-models.js +79 -0
- package/dist/src/agent/kiro-models.js.map +1 -0
- package/dist/src/agent/kiro-runtime.js +306 -0
- package/dist/src/agent/kiro-runtime.js.map +1 -0
- package/dist/src/agent/lifecycle-handler.js +190 -12
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/memory-flush-controller.js +1 -3
- package/dist/src/agent/memory-flush-controller.js.map +1 -1
- package/dist/src/agent/resume-classifier.js +18 -1
- package/dist/src/agent/resume-classifier.js.map +1 -1
- package/dist/src/agent/session-persistence.js +1 -1
- package/dist/src/agent/session-persistence.js.map +1 -1
- package/dist/src/agent/smoke-detector.js +3 -0
- package/dist/src/agent/smoke-detector.js.map +1 -1
- package/dist/src/agent/spawn/queue.js +10 -4
- package/dist/src/agent/spawn/queue.js.map +1 -1
- package/dist/src/agent/spawn/resume.js +6 -1
- package/dist/src/agent/spawn/resume.js.map +1 -1
- package/dist/src/agent/spawn-env.js +1 -1
- package/dist/src/agent/spawn-env.js.map +1 -1
- package/dist/src/agent/spawn.js +188 -28
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/browser/web-ai/grok-live.js +2 -0
- package/dist/src/browser/web-ai/grok-live.js.map +1 -1
- package/dist/src/cli/claude-models.js +2 -2
- package/dist/src/cli/claude-models.js.map +1 -1
- package/dist/src/cli/commands.js +3 -2
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/handlers-runtime.js +2 -0
- package/dist/src/cli/handlers-runtime.js.map +1 -1
- package/dist/src/cli/handlers-workflows.js +9 -4
- package/dist/src/cli/handlers-workflows.js.map +1 -1
- package/dist/src/cli/handlers.js +47 -7
- package/dist/src/cli/handlers.js.map +1 -1
- package/dist/src/cli/readiness.js +17 -1
- package/dist/src/cli/readiness.js.map +1 -1
- package/dist/src/cli/registry-live.js +17 -0
- package/dist/src/cli/registry-live.js.map +1 -0
- package/dist/src/cli/registry.js +44 -3
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/cli/tui/composer.js +135 -5
- package/dist/src/cli/tui/composer.js.map +1 -1
- package/dist/src/cli/tui/diffview.js +41 -0
- package/dist/src/cli/tui/diffview.js.map +1 -0
- package/dist/src/cli/tui/editor.js +45 -0
- package/dist/src/cli/tui/editor.js.map +1 -0
- package/dist/src/cli/tui/file-mention.js +78 -0
- package/dist/src/cli/tui/file-mention.js.map +1 -0
- package/dist/src/cli/tui/highlight.js +82 -0
- package/dist/src/cli/tui/highlight.js.map +1 -0
- package/dist/src/cli/tui/keymap.js +21 -0
- package/dist/src/cli/tui/keymap.js.map +1 -1
- package/dist/src/cli/tui/markdown.js +124 -0
- package/dist/src/cli/tui/markdown.js.map +1 -0
- package/dist/src/cli/tui/mode.js +26 -0
- package/dist/src/cli/tui/mode.js.map +1 -0
- package/dist/src/cli/tui/overlay.js +121 -98
- package/dist/src/cli/tui/overlay.js.map +1 -1
- package/dist/src/cli/tui/render/frame.js +72 -0
- package/dist/src/cli/tui/render/frame.js.map +1 -0
- package/dist/src/cli/tui/render/layout.js +22 -0
- package/dist/src/cli/tui/render/layout.js.map +1 -0
- package/dist/src/cli/tui/render/mouse.js +25 -0
- package/dist/src/cli/tui/render/mouse.js.map +1 -0
- package/dist/src/cli/tui/render/scheduler.js +37 -0
- package/dist/src/cli/tui/render/scheduler.js.map +1 -0
- package/dist/src/cli/tui/render/viewport.js +82 -0
- package/dist/src/cli/tui/render/viewport.js.map +1 -0
- package/dist/src/cli/tui/renderers.js +37 -0
- package/dist/src/cli/tui/renderers.js.map +1 -1
- package/dist/src/cli/tui/stream.js +48 -0
- package/dist/src/cli/tui/stream.js.map +1 -0
- package/dist/src/cli/tui/text-buffer.js +143 -0
- package/dist/src/cli/tui/text-buffer.js.map +1 -0
- package/dist/src/cli/tui/theme.js +128 -0
- package/dist/src/cli/tui/theme.js.map +1 -0
- package/dist/src/cli/tui/transcript.js +4 -0
- package/dist/src/cli/tui/transcript.js.map +1 -1
- package/dist/src/command-contract/help-renderer.js +1 -1
- package/dist/src/command-contract/help-renderer.js.map +1 -1
- package/dist/src/core/cli-detection.js +14 -0
- package/dist/src/core/cli-detection.js.map +1 -1
- package/dist/src/core/config.js +5 -0
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +7 -0
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/employees.js +2 -2
- package/dist/src/core/employees.js.map +1 -1
- package/dist/src/discord/bot.js.map +1 -1
- package/dist/src/discord/discord-file.js +1 -1
- package/dist/src/discord/discord-file.js.map +1 -1
- package/dist/src/discord/send-only-client.js +1 -3
- package/dist/src/discord/send-only-client.js.map +1 -1
- package/dist/src/goal/heartbeat.js +30 -7
- package/dist/src/goal/heartbeat.js.map +1 -1
- package/dist/src/goal/store.js +6 -2
- package/dist/src/goal/store.js.map +1 -1
- package/dist/src/ide/diff.js +37 -0
- package/dist/src/ide/diff.js.map +1 -1
- package/dist/src/manager/launchd-service.js +1 -1
- package/dist/src/manager/launchd-service.js.map +1 -1
- package/dist/src/manager/lifecycle-helpers.js +14 -0
- package/dist/src/manager/lifecycle-helpers.js.map +1 -1
- package/dist/src/manager/lifecycle.js +49 -4
- package/dist/src/manager/lifecycle.js.map +1 -1
- package/dist/src/manager/notes/routes.js +0 -31
- package/dist/src/manager/notes/routes.js.map +1 -1
- package/dist/src/manager/notes/ws.js.map +1 -1
- package/dist/src/manager/registry.js.map +1 -1
- package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
- package/dist/src/manager/scan.js +36 -1
- package/dist/src/manager/scan.js.map +1 -1
- package/dist/src/manager/server.js +21 -2
- package/dist/src/manager/server.js.map +1 -1
- package/dist/src/manager/systemd-service.js +1 -1
- package/dist/src/manager/systemd-service.js.map +1 -1
- package/dist/src/memory/keyword-expand.js +0 -187
- package/dist/src/memory/keyword-expand.js.map +1 -1
- package/dist/src/memory/runtime.js +2 -2
- package/dist/src/memory/runtime.js.map +1 -1
- package/dist/src/memory/shared.js.map +1 -1
- package/dist/src/orchestrator/collect.js +3 -2
- package/dist/src/orchestrator/collect.js.map +1 -1
- package/dist/src/orchestrator/distribute.js +7 -1
- package/dist/src/orchestrator/distribute.js.map +1 -1
- package/dist/src/orchestrator/friction.js +59 -0
- package/dist/src/orchestrator/friction.js.map +1 -0
- package/dist/src/orchestrator/pipeline.js +88 -45
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/sanitize.js +19 -0
- package/dist/src/orchestrator/sanitize.js.map +1 -0
- package/dist/src/orchestrator/seed.js +50 -0
- package/dist/src/orchestrator/seed.js.map +1 -0
- package/dist/src/orchestrator/state-machine.js +206 -74
- package/dist/src/orchestrator/state-machine.js.map +1 -1
- package/dist/src/orchestrator/worker-monitor.js +1 -1
- package/dist/src/orchestrator/worker-monitor.js.map +1 -1
- package/dist/src/orchestrator/worker-progress.js +29 -0
- package/dist/src/orchestrator/worker-progress.js.map +1 -0
- package/dist/src/orchestrator/worker-registry.js +63 -2
- package/dist/src/orchestrator/worker-registry.js.map +1 -1
- package/dist/src/prompt/builder.js +19 -29
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/templates/a1-system.md +40 -5
- package/dist/src/prompt/templates/control-system.md +2 -2
- package/dist/src/prompt/templates/employee.md +4 -1
- package/dist/src/prompt/templates/orchestration.md +23 -8
- package/dist/src/routes/employees.js +4 -4
- package/dist/src/routes/employees.js.map +1 -1
- package/dist/src/routes/goal.js +11 -3
- package/dist/src/routes/goal.js.map +1 -1
- package/dist/src/routes/heartbeat.js +1 -1
- package/dist/src/routes/heartbeat.js.map +1 -1
- package/dist/src/routes/i18n.js +1 -1
- package/dist/src/routes/i18n.js.map +1 -1
- package/dist/src/routes/jaw-memory.js +1 -1
- package/dist/src/routes/jaw-memory.js.map +1 -1
- package/dist/src/routes/memory.js.map +1 -1
- package/dist/src/routes/messaging.js.map +1 -1
- package/dist/src/routes/orchestrate.js +265 -116
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/quota-agy-reverse.js +0 -5
- package/dist/src/routes/quota-agy-reverse.js.map +1 -1
- package/dist/src/routes/quota-kiro-reverse.js +187 -0
- package/dist/src/routes/quota-kiro-reverse.js.map +1 -0
- package/dist/src/routes/settings.js +31 -2
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/skills.js.map +1 -1
- package/dist/src/security/security-audit-log.js.map +1 -1
- package/dist/src/shared/shell-command-display.js +51 -0
- package/dist/src/shared/shell-command-display.js.map +1 -0
- package/dist/src/telegram/bot.js.map +1 -1
- package/dist/src/trace/store.js +32 -0
- package/dist/src/trace/store.js.map +1 -1
- package/dist/src/types/cli-engine.js +1 -0
- package/dist/src/types/cli-engine.js.map +1 -1
- package/dist/src/workflows/employee-boundary.js +7 -7
- package/dist/src/workflows/employee-boundary.js.map +1 -1
- package/dist/src/workflows/handoff.js +16 -16
- package/dist/src/workflows/handoff.js.map +1 -1
- package/dist/src/workflows/scope-sandbox.js +46 -0
- package/dist/src/workflows/scope-sandbox.js.map +1 -0
- package/package.json +1 -1
- package/public/assets/providers/kiro-color.svg +15 -0
- package/public/assets/providers/kiro.svg +14 -0
- package/public/css/modals.css +79 -0
- package/public/css/sidebar.css +85 -0
- package/public/css/variables.css +2 -2
- package/public/dist/assets/{Agent-CIUGaUVn.js → Agent-DkH7eoHd.js} +1 -1
- package/public/dist/assets/{DocPanel-C1pGgE-S.js → DocPanel-BU16GUlB.js} +1 -1
- package/public/dist/assets/DocPanel-gU-WkgyA.css +1 -0
- package/public/dist/assets/Employees-F0ssNuO-.js +1 -0
- package/public/dist/assets/Heartbeat-C3JS6gkF.js +1 -0
- package/public/dist/assets/Mcp-_Yq4N3Sk.js +4 -0
- package/public/dist/assets/{Memory-BgN8djV4.js → Memory-C-EQubN2.js} +1 -1
- package/public/dist/assets/{ModelProvider-DHQ1Zvw0.js → ModelProvider-BD2KrypI.js} +1 -1
- package/public/dist/assets/agent-meta-B1098B_a.js +1 -0
- package/public/dist/assets/app-ByHYOMZE.js +48 -0
- package/public/dist/assets/app-CYdhP6Vh.css +1 -0
- package/public/dist/assets/constants-s2UJodER.js +1 -0
- package/public/dist/assets/{employees-DiNLzEXS.js → employees-_A-p_bZg.js} +7 -7
- package/public/dist/assets/idb-cache-0LNMskFB.js +1 -0
- package/public/dist/assets/idb-cache-5H89a4l8.js +1 -0
- package/public/dist/assets/{manager-DyrwJLZr.css → manager-B2qEQRxN.css} +1 -1
- package/public/dist/assets/manager-CR9BA-wO.js +12 -0
- package/public/dist/assets/memory-D1RKYvyu.js +1 -0
- package/public/dist/assets/{memory-B_nn0A4v.js → memory-D9AUn8fG.js} +9 -9
- package/public/dist/assets/{provider-icons-XEfJPGTe.js → provider-icons-CVVK5xUP.js} +35 -6
- package/public/dist/assets/{render-CgDEBoCX.js → render-DFBujF8n.js} +4 -4
- package/public/dist/assets/settings-B4ZkeaU-.js +1 -0
- package/public/dist/assets/settings-D9jTceN0.js +151 -0
- package/public/dist/assets/sidebar-DPPRNiTc.js +48 -0
- package/public/dist/assets/skills-8nHJkv-r.js +1 -0
- package/public/dist/assets/{skills-COa4iSwL.js → skills-BDVLIrVT.js} +6 -6
- package/public/dist/assets/{slash-commands-C_ePvrPi.js → slash-commands-C5da3q1p.js} +1 -1
- package/public/dist/assets/slash-commands-RJWO8wJZ.js +1 -0
- package/public/dist/assets/{trace-drawer-CY4z_Ie8.js → trace-drawer-5kqBzFMk.js} +1 -1
- package/public/dist/assets/ui-Crnp79bG.js +142 -0
- package/public/dist/assets/ui-HtSKByR3.js +1 -0
- package/public/dist/index.html +113 -86
- package/public/dist/manager/index.html +2 -2
- package/public/index.html +111 -84
- package/public/js/constants.ts +30 -7
- package/public/js/features/chat-search.ts +5 -1
- package/public/js/features/employees.ts +7 -2
- package/public/js/features/idb-cache.ts +4 -0
- package/public/js/features/message-history.ts +55 -7
- package/public/js/features/pending-queue.ts +8 -2
- package/public/js/features/process-block.ts +32 -17
- package/public/js/features/process-log-adapter.ts +11 -2
- package/public/js/features/settings-cli-status-render.ts +163 -0
- package/public/js/features/settings-cli-status.ts +130 -185
- package/public/js/features/settings-core.ts +5 -1
- package/public/js/features/settings-mcp.ts +513 -7
- package/public/js/features/settings.ts +1 -1
- package/public/js/features/tool-ui.ts +18 -4
- package/public/js/features/transport-status-row.ts +3 -0
- package/public/js/main.ts +3 -0
- package/public/js/preview-parent-origin.ts +14 -0
- package/public/js/provider-icons.ts +6 -1
- package/public/js/render/file-links.ts +10 -2
- package/public/js/ui.ts +5 -2
- package/public/js/virtual-scroll.ts +19 -0
- package/public/js/ws.ts +133 -8
- package/public/locales/en.json +8 -2
- package/public/locales/ja.json +8 -2
- package/public/locales/ko.json +8 -2
- package/public/locales/zh.json +8 -2
- package/public/manager/src/App.tsx +13 -70
- package/public/manager/src/InstancePreview.tsx +36 -11
- package/public/manager/src/SidebarRailRouter.tsx +1 -1
- package/public/manager/src/doc-panel/DocPanel.tsx +14 -1
- package/public/manager/src/doc-panel/doc-panel.css +16 -0
- package/public/manager/src/hooks/useInstanceMessageEvents.ts +4 -15
- package/public/manager/src/manager-components.css +1 -1
- package/public/manager/src/manager-polish.css +1 -1
- package/public/manager/src/manager-shortcut-runner.ts +107 -0
- package/public/manager/src/manager-shortcuts.ts +15 -0
- package/public/manager/src/panels/desktop-bridge.ts +2 -0
- package/public/manager/src/settings/SettingsSidebar.tsx +1 -1
- package/public/manager/src/settings/components/sidebar-filter.ts +2 -0
- package/public/manager/src/settings/pages/Mcp.tsx +311 -43
- package/public/manager/src/settings/pages/components/McpServerCard.tsx +89 -55
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +29 -6
- package/public/manager/src/settings/pages/components/employees-helpers.ts +1 -0
- package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +1 -0
- package/public/manager/src/settings/pages/mcp-helpers.ts +54 -12
- package/public/manager/src/settings/types.ts +1 -0
- package/public/manager/src/types.ts +2 -1
- package/scripts/fresh-install-smoke.ts +1 -1
- package/public/dist/assets/DocPanel-CL1scIfq.css +0 -1
- package/public/dist/assets/Employees-BL9MAzzx.js +0 -1
- package/public/dist/assets/Heartbeat-D64JCg4t.js +0 -1
- package/public/dist/assets/Mcp-wYwJA_61.js +0 -3
- package/public/dist/assets/agent-meta-BhEbjy4P.js +0 -1
- package/public/dist/assets/app-2Rz848bQ.js +0 -48
- package/public/dist/assets/app-BW-Xz2p6.css +0 -1
- package/public/dist/assets/constants-ahKI_aEG.js +0 -1
- package/public/dist/assets/idb-cache-BnZfG5FD.js +0 -1
- package/public/dist/assets/idb-cache-CZ3JdK8r.js +0 -1
- package/public/dist/assets/manager-CfyZloIP.js +0 -12
- package/public/dist/assets/memory-CCjNFWmO.js +0 -1
- package/public/dist/assets/settings-CY_6tGuS.js +0 -1
- package/public/dist/assets/settings-DWW4GzNc.js +0 -66
- package/public/dist/assets/sidebar-DQKE5IA1.js +0 -23
- package/public/dist/assets/skills-DYTlqoke.js +0 -1
- package/public/dist/assets/slash-commands-D7CU5oso.js +0 -1
- package/public/dist/assets/ui-Car1OUvV.js +0 -1
- package/public/dist/assets/ui-DK_9ndj0.js +0 -140
|
@@ -25,7 +25,7 @@ export type ActiveOverride = {
|
|
|
25
25
|
effort?: string;
|
|
26
26
|
};
|
|
27
27
|
|
|
28
|
-
export const PRIMARY_CLIS: ReadonlyArray<string> = ['claude', 'claude-e', 'agy', 'codex', 'cursor', 'gemini'];
|
|
28
|
+
export const PRIMARY_CLIS: ReadonlyArray<string> = ['claude', 'claude-e', 'agy', 'codex', 'cursor', 'kiro-code', 'gemini'];
|
|
29
29
|
|
|
30
30
|
export const CLI_META: Record<string, CliMeta> = {
|
|
31
31
|
agy: {
|
|
@@ -37,15 +37,16 @@ export const CLI_META: Record<string, CliMeta> = {
|
|
|
37
37
|
'ai-e': {
|
|
38
38
|
label: 'AI-E',
|
|
39
39
|
defaultProvider: 'claude',
|
|
40
|
-
providers: ['claude', 'codex', 'gemini', 'grok', 'copilot'],
|
|
41
|
-
models: ['opus', 'sonnet', 'haiku', 'gpt-5.4', 'gpt-5.4-mini', 'gemini-3-flash-preview', 'grok-build', 'gpt-5-mini'],
|
|
40
|
+
providers: ['claude', 'codex', 'gemini', 'grok', 'copilot', 'kiro'],
|
|
41
|
+
models: ['opus', 'sonnet', 'haiku', 'gpt-5.5', 'gpt-5.4', 'gpt-5.4-mini', 'gemini-3-flash-preview', 'grok-build', 'gpt-5-mini'],
|
|
42
42
|
efforts: ['low', 'medium', 'high', 'xhigh', 'max'],
|
|
43
43
|
modelsByProvider: {
|
|
44
|
-
claude: ['opus', 'sonnet', 'haiku'],
|
|
45
|
-
codex: ['gpt-5.4', 'gpt-5.4-mini'],
|
|
44
|
+
claude: ['claude-opus-4-8', 'opus', 'sonnet', 'haiku'],
|
|
45
|
+
codex: ['gpt-5.5', 'gpt-5.4', 'gpt-5.4-mini'],
|
|
46
46
|
gemini: ['gemini-3-flash-preview'],
|
|
47
47
|
grok: ['grok-build'],
|
|
48
48
|
copilot: ['gpt-5-mini'],
|
|
49
|
+
kiro: ['auto', 'claude-sonnet-4.6', 'deepseek-3.2', 'minimax-m2.5', 'glm-5', 'qwen3-coder-next'],
|
|
49
50
|
},
|
|
50
51
|
effortsByProvider: {
|
|
51
52
|
claude: ['low', 'medium', 'high', 'xhigh', 'max'],
|
|
@@ -53,6 +54,7 @@ export const CLI_META: Record<string, CliMeta> = {
|
|
|
53
54
|
gemini: [],
|
|
54
55
|
grok: [],
|
|
55
56
|
copilot: ['low', 'medium', 'high'],
|
|
57
|
+
kiro: [],
|
|
56
58
|
},
|
|
57
59
|
},
|
|
58
60
|
claude: {
|
|
@@ -62,7 +64,7 @@ export const CLI_META: Record<string, CliMeta> = {
|
|
|
62
64
|
// firstPartyNameToCanonical resolution; pinned IDs reach the API
|
|
63
65
|
// verbatim for stable prompt-cache prefixes. The `[1m]` suffix is
|
|
64
66
|
// parsed by Claude Code (stripped before send, enables 1M context
|
|
65
|
-
// on Opus 4.7/4.6 + Sonnet 4.6). Mirrors getDefaultClaudeChoices()
|
|
67
|
+
// on Opus 4.8/4.7/4.6 + Sonnet 4.6). Mirrors getDefaultClaudeChoices()
|
|
66
68
|
// in src/cli/claude-models.ts. Verified via Grok web research
|
|
67
69
|
// 2026-05-01 (devlog/_plan/260501_claude_model_passthrough/).
|
|
68
70
|
models: [
|
|
@@ -117,6 +119,27 @@ export const CLI_META: Record<string, CliMeta> = {
|
|
|
117
119
|
efforts: ['none', 'none-fast', 'low', 'low-fast', 'medium', 'medium-fast', 'high', 'high-fast', 'xhigh', 'xhigh-fast', 'max', 'max-fast'],
|
|
118
120
|
effortNote: 'Cursor effort resolves to model IDs; no separate --effort flag',
|
|
119
121
|
},
|
|
122
|
+
'kiro-code': {
|
|
123
|
+
label: 'Kiro',
|
|
124
|
+
models: [
|
|
125
|
+
'auto',
|
|
126
|
+
'claude-opus-4.8',
|
|
127
|
+
'claude-opus-4.7',
|
|
128
|
+
'claude-opus-4.6',
|
|
129
|
+
'claude-sonnet-4.6',
|
|
130
|
+
'claude-opus-4.5',
|
|
131
|
+
'claude-sonnet-4.5',
|
|
132
|
+
'claude-sonnet-4',
|
|
133
|
+
'claude-haiku-4.5',
|
|
134
|
+
'deepseek-3.2',
|
|
135
|
+
'minimax-m2.5',
|
|
136
|
+
'minimax-m2.1',
|
|
137
|
+
'glm-5',
|
|
138
|
+
'qwen3-coder-next',
|
|
139
|
+
],
|
|
140
|
+
efforts: [],
|
|
141
|
+
effortNote: 'Kiro CLI has no separate effort flag',
|
|
142
|
+
},
|
|
120
143
|
gemini: {
|
|
121
144
|
label: 'Gemini',
|
|
122
145
|
models: ['gemini-3-pro-preview', 'gemini-2.5-pro', 'gemini-3-flash-preview'],
|
|
@@ -7,9 +7,11 @@
|
|
|
7
7
|
// silently drop fields the runtime added later (e.g. `disabledServers`).
|
|
8
8
|
|
|
9
9
|
export type McpServer = {
|
|
10
|
-
command
|
|
10
|
+
command?: string;
|
|
11
11
|
args?: string[];
|
|
12
12
|
env?: Record<string, string>;
|
|
13
|
+
url?: string;
|
|
14
|
+
headers?: Record<string, string>;
|
|
13
15
|
autostart?: boolean;
|
|
14
16
|
[key: string]: unknown;
|
|
15
17
|
};
|
|
@@ -44,9 +46,10 @@ export function normalizeMcpConfig(raw: unknown): McpConfig {
|
|
|
44
46
|
}
|
|
45
47
|
|
|
46
48
|
export function normalizeServer(raw: unknown): McpServer {
|
|
47
|
-
if (!raw || typeof raw !== 'object') return {
|
|
49
|
+
if (!raw || typeof raw !== 'object') return {};
|
|
48
50
|
const r = raw as Record<string, unknown>;
|
|
49
|
-
const command = typeof r['command'] === 'string' ? r['command'] :
|
|
51
|
+
const command = typeof r['command'] === 'string' && r['command'] ? r['command'] : undefined;
|
|
52
|
+
const url = typeof r['url'] === 'string' && r['url'] ? r['url'] : undefined;
|
|
50
53
|
const args = Array.isArray(r['args'])
|
|
51
54
|
? r['args'].filter((v): v is string => typeof v === 'string')
|
|
52
55
|
: undefined;
|
|
@@ -59,21 +62,32 @@ export function normalizeServer(raw: unknown): McpServer {
|
|
|
59
62
|
),
|
|
60
63
|
)
|
|
61
64
|
: undefined;
|
|
65
|
+
const headers =
|
|
66
|
+
r['headers'] && typeof r['headers'] === 'object' && !Array.isArray(r['headers'])
|
|
67
|
+
? Object.fromEntries(
|
|
68
|
+
Object.entries(r['headers'] as Record<string, unknown>).filter(
|
|
69
|
+
(entry): entry is [string, string] =>
|
|
70
|
+
typeof entry[1] === 'string',
|
|
71
|
+
),
|
|
72
|
+
)
|
|
73
|
+
: undefined;
|
|
62
74
|
const autostart = typeof r['autostart'] === 'boolean' ? r['autostart'] : undefined;
|
|
63
|
-
const out: McpServer = {
|
|
75
|
+
const out: McpServer = {};
|
|
76
|
+
if (command) out.command = command;
|
|
77
|
+
if (url) out.url = url;
|
|
64
78
|
if (args && args.length > 0) out.args = args;
|
|
65
79
|
if (env && Object.keys(env).length > 0) out.env = env;
|
|
80
|
+
if (headers && Object.keys(headers).length > 0) out.headers = headers;
|
|
66
81
|
if (autostart !== undefined) out.autostart = autostart;
|
|
67
|
-
// Preserve any unknown extras so the runtime can keep evolving the schema.
|
|
68
82
|
for (const [k, v] of Object.entries(r)) {
|
|
69
|
-
if (
|
|
83
|
+
if (['command', 'url', 'args', 'env', 'headers', 'autostart'].includes(k)) continue;
|
|
70
84
|
out[k] = v;
|
|
71
85
|
}
|
|
72
86
|
return out;
|
|
73
87
|
}
|
|
74
88
|
|
|
75
|
-
export function makeEmptyServer(): McpServer {
|
|
76
|
-
return { command: '' };
|
|
89
|
+
export function makeEmptyServer(type: 'local' | 'remote' = 'local'): McpServer {
|
|
90
|
+
return type === 'remote' ? { url: '' } : { command: '' };
|
|
77
91
|
}
|
|
78
92
|
|
|
79
93
|
// Args round-tripping: prefer one-arg-per-line. We accept comma-separated
|
|
@@ -136,12 +150,35 @@ export function validateServer(name: string, server: McpServer): ServerValidatio
|
|
|
136
150
|
reason: 'Server name must match [a-zA-Z0-9._-] (1–64 chars).',
|
|
137
151
|
};
|
|
138
152
|
}
|
|
139
|
-
|
|
140
|
-
|
|
153
|
+
const hasCommand = server.command && server.command.trim() !== '';
|
|
154
|
+
const hasUrl = server.url && String(server.url).trim() !== '';
|
|
155
|
+
if (!hasCommand && !hasUrl) {
|
|
156
|
+
return { kind: 'invalid', reason: 'Command or URL is required.' };
|
|
141
157
|
}
|
|
142
158
|
return { kind: 'ok' };
|
|
143
159
|
}
|
|
144
160
|
|
|
161
|
+
export type ServerTag = 'npx' | 'uvx' | 'docker' | 'remote' | null;
|
|
162
|
+
|
|
163
|
+
export function getServerTag(server: McpServer): ServerTag {
|
|
164
|
+
if (server.url) return 'remote';
|
|
165
|
+
if (!server.command) return null;
|
|
166
|
+
const cmd = server.command;
|
|
167
|
+
if (cmd === 'npx' || cmd.endsWith('/npx')) return 'npx';
|
|
168
|
+
if (cmd === 'uvx' || cmd === 'uv' || cmd.endsWith('/uvx')) return 'uvx';
|
|
169
|
+
if (cmd === 'docker' || cmd.endsWith('/docker')) return 'docker';
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export function countInstallBundleCandidates(
|
|
174
|
+
servers: Record<string, McpServer>,
|
|
175
|
+
): number {
|
|
176
|
+
return Object.values(servers).filter(s => {
|
|
177
|
+
if (!s.command) return false;
|
|
178
|
+
return s.command === 'npx' || s.command === 'uv' || s.command === 'uvx';
|
|
179
|
+
}).length;
|
|
180
|
+
}
|
|
181
|
+
|
|
145
182
|
export function findDuplicateNames(
|
|
146
183
|
names: ReadonlyArray<string>,
|
|
147
184
|
): Set<string> {
|
|
@@ -163,14 +200,19 @@ export function findDuplicateNames(
|
|
|
163
200
|
export function toPersistShape(config: McpConfig): McpConfig {
|
|
164
201
|
const servers: Record<string, McpServer> = {};
|
|
165
202
|
for (const [name, srv] of Object.entries(config.servers)) {
|
|
166
|
-
const out: McpServer = {
|
|
203
|
+
const out: McpServer = {};
|
|
204
|
+
if (srv.command) out.command = srv.command;
|
|
205
|
+
if (srv.url) out.url = srv.url;
|
|
167
206
|
if (srv.args && srv.args.length > 0) out.args = [...srv.args];
|
|
168
207
|
if (srv.env && Object.keys(srv.env).length > 0) {
|
|
169
208
|
out.env = { ...srv.env };
|
|
170
209
|
}
|
|
210
|
+
if (srv.headers && Object.keys(srv.headers).length > 0) {
|
|
211
|
+
out.headers = { ...srv.headers };
|
|
212
|
+
}
|
|
171
213
|
if (srv.autostart !== undefined) out.autostart = srv.autostart;
|
|
172
214
|
for (const [k, v] of Object.entries(srv)) {
|
|
173
|
-
if (
|
|
215
|
+
if (['command', 'url', 'args', 'env', 'headers', 'autostart'].includes(k)) continue;
|
|
174
216
|
out[k] = v;
|
|
175
217
|
}
|
|
176
218
|
servers[name] = out;
|
|
@@ -7,7 +7,7 @@ export type DashboardInstanceStatus =
|
|
|
7
7
|
|
|
8
8
|
export type DashboardServiceMode = 'unknown' | 'ad-hoc' | 'service' | 'manager';
|
|
9
9
|
export type DashboardLifecycleAction = 'start' | 'stop' | 'restart' | 'perm' | 'unperm';
|
|
10
|
-
export type DashboardLifecycleOwner = 'none' | 'external' | 'manager' | 'service';
|
|
10
|
+
export type DashboardLifecycleOwner = 'none' | 'external' | 'manager' | 'service' | 'peer';
|
|
11
11
|
export type DashboardDetailTab = 'overview' | 'preview' | 'logs' | 'settings';
|
|
12
12
|
export type DashboardUiTheme = 'auto' | 'dark' | 'light';
|
|
13
13
|
export type DashboardLocale = 'ko' | 'en' | 'zh' | 'ja';
|
|
@@ -230,6 +230,7 @@ export type InstanceLatestMessageSummary = {
|
|
|
230
230
|
title: string;
|
|
231
231
|
updatedAt: string;
|
|
232
232
|
} | null;
|
|
233
|
+
processBusy?: boolean;
|
|
233
234
|
};
|
|
234
235
|
|
|
235
236
|
export type HealthEvent = {
|
|
@@ -176,7 +176,7 @@ async function main(): Promise<void> {
|
|
|
176
176
|
if (!cliRes.ok) throw new Error(`/api/cli-status HTTP ${cliRes.status}`);
|
|
177
177
|
const cliJson = (await cliRes.json()) as Record<string, unknown> | null;
|
|
178
178
|
const keys = Object.keys(cliJson ?? {});
|
|
179
|
-
const required: string[] = ['ai-e', 'claude', 'claude-e', 'codex', 'codex-app', 'copilot', 'cursor', 'gemini', 'grok', 'opencode'];
|
|
179
|
+
const required: string[] = ['ai-e', 'claude', 'claude-e', 'codex', 'codex-app', 'copilot', 'cursor', 'kiro-code', 'gemini', 'grok', 'opencode'];
|
|
180
180
|
for (const k of required) {
|
|
181
181
|
if (!keys.includes(k)) throw new Error(`missing cli key in status: ${k}`);
|
|
182
182
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.doc-panel{flex-direction:column;min-width:0;height:100%;min-height:0;font-size:12px;display:flex;overflow:hidden}.doc-unavailable,.doc-empty,.doc-error,.doc-binary{color:var(--text-dim);justify-content:center;align-items:center;padding:12px;font-size:11px;display:flex}.doc-error{color:var(--status-error)}.doc-toolbar{border-bottom:1px solid var(--border-subtle);flex-shrink:0;align-items:center;padding:6px 10px;display:flex}.doc-file-name{color:var(--text-base);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:500;overflow:hidden}.doc-content{flex:1;min-height:0;overflow:auto}.doc-pre{white-space:pre-wrap;word-break:break-all;margin:0;padding:8px 10px;font-family:SF Mono,Menlo,monospace;font-size:12px;line-height:1.5}.doc-markdown{padding:12px 16px}.doc-content .notes-code-block{border-radius:0;margin:0}.doc-content .notes-code-block pre{max-height:none}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{i as r}from"./page-shell-k5-hYhKb.js";var i=e(t(),1),a=n(),o=[`employees`],s=[`ai-e`,`claude`,`claude-e`,`codex`,`codex-app`,`copilot`,`cursor`,`gemini`,`grok`,`opencode`],c=0;function l(){return c+=1,`emp_${Date.now().toString(36)}_${c}`}function u(){let e=globalThis.crypto;if(e&&typeof e.randomUUID==`function`)try{return e.randomUUID()}catch{}return l()}function d(e=u()){return{id:e,name:``,cli:`claude`,role:``,prompt:``,active:!0}}function f(e){if(!Array.isArray(e))return[];let t=[],n=0;for(let r of e){if(typeof r==`string`){n+=1,t.push({...d(`emp_legacy_${n}`),name:r});continue}if(!r||typeof r!=`object`)continue;let e=r,i=typeof e.name==`string`?e.name:``;if(!i&&!e.id)continue;n+=1;let a=typeof e.id==`string`&&e.id.trim()?e.id.trim():`emp_unknown_${n}`,o=typeof e.cli==`string`&&e.cli.trim()?e.cli.trim():`claude`,s=typeof e.role==`string`?e.role:``,c=typeof e.prompt==`string`?e.prompt:``,l=e.active!==!1;t.push({id:a,name:i,cli:o,role:s,prompt:c,active:l})}return t}function p(e){return e.name.trim()?e.cli.trim()?null:`CLI is required`:`Name is required`}function m(e){return e.some(e=>p(e)!==null)}function h(e){let t=new Map;for(let n of e){let e=n.name.trim().toLowerCase();e&&t.set(e,(t.get(e)??0)+1)}let n=new Set;for(let[e,r]of t)r>1&&n.add(e);return n}function g(e){return e.map(e=>{let t={id:e.id,name:e.name.trim(),cli:e.cli.trim()||`claude`,role:e.role.trim(),active:e.active};return e.prompt.trim()&&(t.prompt=e.prompt),t})}function _({registerSave:e}){return(0,i.useEffect)(()=>{if(e)return e(null),()=>e(null)},[e]),(0,a.jsx)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:(0,a.jsx)(r,{title:`Employees`,hint:`Runtime employees are now managed from the Agent page.`,children:(0,a.jsx)(`p`,{className:`settings-section-hint`,children:`Open Runtime / Agent to edit dispatchable employees, static employee model overrides, and database-backed employees in one place.`})})})}export{s as DEFAULT_CLI_OPTIONS,o as EMPLOYEE_KEYS,_ as default,h as duplicateNameSet,p as employeeRowError,m as employeesHaveErrors,d as makeDefaultEmployee,u as newEmployeeId,f as normalizeEmployees,g as toPersistShape};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-k5-hYhKb.js";import{a as c,i as l,s as u}from"./fields-C-y_8RgA.js";import{n as d}from"./agent-meta-BhEbjy4P.js";import{t as f}from"./path-utils-ztBHV7MX.js";var p=e(t(),1),m=n(),h=[{value:`every`,label:`every (interval)`},{value:`cron`,label:`cron expression`}];function g({job:e,index:t,bodyError:n,timeZoneError:r,onChange:i,onRemove:a}){let o=(0,p.useId)(),s=e.schedule.kind,d=e.schedule.timeZone??``;return(0,m.jsxs)(`fieldset`,{className:`settings-heartbeat-job`,"aria-label":`Heartbeat job ${t+1}${e.name?` (${e.name})`:``}`,children:[(0,m.jsx)(`legend`,{className:`settings-heartbeat-job-legend`,children:e.name||`Job ${t+1}`}),(0,m.jsx)(c,{id:`${o}-enabled`,label:`Enabled`,value:e.enabled,onChange:e=>i({enabled:e})}),(0,m.jsx)(u,{id:`${o}-name`,label:`Name`,value:e.name,placeholder:`Morning summary`,onChange:e=>i({name:e})}),(0,m.jsx)(l,{id:`${o}-kind`,label:`Schedule kind`,value:s,options:h,onChange:e=>{e===`every`&&s!==`every`?i({schedule:{kind:`every`,minutes:30,...d?{timeZone:d}:{}}}):e===`cron`&&s!==`cron`&&i({schedule:{kind:`cron`,cron:`0 9 * * *`,...d?{timeZone:d}:{}}})}}),s===`every`?(0,m.jsx)(u,{id:`${o}-minutes`,label:`Every (minutes)`,value:String(e.schedule.minutes??``),placeholder:`30`,error:n??null,onChange:e=>{let t=e.trim(),n=Number(t);i({schedule:{kind:`every`,minutes:Number.isFinite(n)?n:NaN,...d?{timeZone:d}:{}}})}}):(0,m.jsx)(u,{id:`${o}-cron`,label:`Cron expression`,value:e.schedule.cron??``,placeholder:`0 9 * * *`,error:n??null,onChange:e=>i({schedule:{kind:`cron`,cron:e,...d?{timeZone:d}:{}}})}),(0,m.jsx)(u,{id:`${o}-tz`,label:`Time zone (optional)`,value:d,placeholder:`Asia/Seoul`,error:r??null,onChange:t=>{let n=t.trim();i(s===`every`?{schedule:{kind:`every`,minutes:e.schedule.minutes,...n?{timeZone:n}:{}}}:{schedule:{kind:`cron`,cron:e.schedule.cron,...n?{timeZone:n}:{}}})}}),(0,m.jsxs)(`label`,{className:`settings-field settings-field-textarea`,htmlFor:`${o}-prompt`,children:[(0,m.jsx)(`span`,{className:`settings-field-label`,children:`Prompt`}),(0,m.jsx)(`textarea`,{id:`${o}-prompt`,rows:3,value:e.prompt,placeholder:`What should this heartbeat do?`,onChange:e=>i({prompt:e.target.value})})]}),(0,m.jsx)(`div`,{className:`settings-heartbeat-job-footer`,children:(0,m.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:a,children:`Remove job`})})]})}var _=/^\d+[smh]$/,v=/^([01]\d|2[0-3]):[0-5]\d$/,y=[`ai-e`,`claude`,`claude-e`,`codex`,`codex-app`,`copilot`,`cursor`,`gemini`,`grok`,`opencode`],b=[`heartbeat.enabled`,`heartbeat.every`,`heartbeat.activeHours.start`,`heartbeat.activeHours.end`,`heartbeat.target`],x=[`heartbeat.jobs`,`heartbeat.md`];function S(e){return _.test(e.trim())}function C(e){return v.test(e.trim())}function w(e=Date.now()){return{id:`hb_${e}`,name:``,enabled:!0,schedule:{kind:`every`,minutes:30},prompt:``}}function T(e){return e.startsWith(`heartbeat.`)&&e!==`heartbeat.jobs`&&e!==`heartbeat.md`}function E(e,t){if(!e||typeof e!=`object`)return null;let n=e,r=typeof n.id==`string`&&n.id.trim()?n.id.trim():`hb_unknown_${t}`,i=typeof n.name==`string`?n.name:``,a=n.enabled!==!1,o=typeof n.prompt==`string`?n.prompt:``,s=n.schedule,c;if(s&&typeof s==`object`){let e=s;c=e.kind===`cron`&&typeof e.cron==`string`?{kind:`cron`,cron:e.cron,...typeof e.timeZone==`string`&&e.timeZone?{timeZone:e.timeZone}:{}}:{kind:`every`,minutes:typeof e.minutes==`number`?e.minutes:30,...typeof e.timeZone==`string`&&e.timeZone?{timeZone:e.timeZone}:{}}}else c={kind:`every`,minutes:30};return{id:r,name:i,enabled:a,schedule:c,prompt:o}}function D(e){if(!e||typeof e!=`object`)return[];let t=e.jobs;return Array.isArray(t)?t.map((e,t)=>E(e,t)).filter(e=>e!==null):[]}function O(e){if(e.kind===`every`){let t=e.minutes;return!Number.isFinite(t)||t<=0||!Number.isInteger(t)?`Minutes must be a positive integer`:null}let t=e.cron?.trim()??``;return t?t.split(/\s+/).length<5?`Cron must have at least 5 fields`:null:`Cron expression required`}function k(e){return e.some(e=>O(e.schedule)!==null)}function A({port:e,client:t,dirty:n,snapshot:r}){let[i,a]=(0,p.useState)([]),[c,l]=(0,p.useState)([]),[u,d]=(0,p.useState)(!1),[f,h]=(0,p.useState)(null);(0,p.useEffect)(()=>{if(r.kind!==`ready`)return;let e=D(r.data);a(e),l(e)},[r]),(0,p.useEffect)(()=>{n.set(`heartbeat.jobs`,{value:i,original:c,valid:!k(i)})},[i,c,n]),(0,p.useEffect)(()=>()=>{n.remove(`heartbeat.jobs`)},[n]);let _=(0,p.useCallback)(async()=>{if(k(i)){h(`Fix invalid schedules before saving.`);return}d(!0),h(null);try{let e=D(await t.put(`/api/heartbeat`,{jobs:i}));a(e),l(e),n.remove(`heartbeat.jobs`)}catch(e){h(e instanceof Error?e.message:String(e))}finally{d(!1)}},[t,n,i]);if(r.kind===`loading`)return(0,m.jsx)(`p`,{className:`settings-section-hint`,children:`Loading jobs…`});if(r.kind===`offline`)return(0,m.jsx)(o,{port:e});if(r.kind===`error`)return(0,m.jsx)(s,{message:r.message});let v=n.pending.has(`heartbeat.jobs`),y=k(i);function b(e,t){a(n=>n.map((n,r)=>r===e?{...n,...t}:n))}function x(){a(e=>[...e,w()])}function S(e){a(t=>t.filter((t,n)=>n!==e))}return(0,m.jsxs)(m.Fragment,{children:[i.length===0?(0,m.jsx)(`p`,{className:`settings-section-hint`,children:`No jobs configured. Add one below.`}):(0,m.jsx)(`div`,{className:`settings-heartbeat-jobs-list`,children:i.map((e,t)=>(0,m.jsx)(g,{job:e,index:t,bodyError:O(e.schedule),onChange:e=>b(t,e),onRemove:()=>S(t)},e.id))}),(0,m.jsxs)(`div`,{className:`settings-heartbeat-jobs-footer`,children:[(0,m.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:x,children:`+ Add job`}),(0,m.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void _(),disabled:u||!v||y,children:u?`Saving…`:`Apply jobs`})]}),f?(0,m.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:f}):null]})}function j({port:e,client:t,dirty:n,snapshot:r}){let[i,a]=(0,p.useState)(``),[c,l]=(0,p.useState)(``),[u,d]=(0,p.useState)(!1),[f,h]=(0,p.useState)(null);(0,p.useEffect)(()=>{if(r.kind!==`ready`)return;let e=r.data.content??``;a(e),l(e)},[r]),(0,p.useEffect)(()=>{n.set(`heartbeat.md`,{value:i,original:c,valid:!0})},[i,c,n]),(0,p.useEffect)(()=>()=>{n.remove(`heartbeat.md`)},[n]);let g=(0,p.useCallback)(async()=>{d(!0),h(null);try{await t.put(`/api/heartbeat-md`,{content:i}),l(i),n.remove(`heartbeat.md`)}catch(e){h(e instanceof Error?e.message:String(e))}finally{d(!1)}},[t,n,i]);if(r.kind===`loading`)return(0,m.jsx)(`p`,{className:`settings-section-hint`,children:`Loading template…`});if(r.kind===`offline`)return(0,m.jsx)(o,{port:e});if(r.kind===`error`)return(0,m.jsx)(s,{message:r.message});let _=n.pending.has(`heartbeat.md`);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)(`label`,{className:`settings-field settings-field-textarea`,htmlFor:`hb-md`,children:[(0,m.jsx)(`span`,{className:`settings-field-label`,children:`Template`}),(0,m.jsx)(`textarea`,{id:`hb-md`,rows:10,spellCheck:!1,value:i,onChange:e=>a(e.target.value),style:{fontFamily:`ui-monospace, monospace`}})]}),(0,m.jsx)(`div`,{className:`settings-heartbeat-md-footer`,children:(0,m.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void g(),disabled:u||!_,children:u?`Saving…`:`Save template`})}),f?(0,m.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:f}):null]})}function M({port:e,client:t,dirty:n,registerSave:h}){let g=r(t,`/api/settings`),_=r(t,`/api/heartbeat`),v=r(t,`/api/heartbeat-md`),[x,w]=(0,p.useState)(!1),[E,D]=(0,p.useState)(`30m`),[O,k]=(0,p.useState)(`08:00`),[M,N]=(0,p.useState)(`22:00`),[P,F]=(0,p.useState)(`all`);(0,p.useEffect)(()=>{if(g.state.kind!==`ready`)return;let e=g.state.data.heartbeat||{};w(!!e.enabled),D(typeof e.every==`string`?e.every:`30m`),k(e.activeHours?.start??`08:00`),N(e.activeHours?.end??`22:00`),F(typeof e.target==`string`?e.target:`all`)},[g.state]),(0,p.useEffect)(()=>()=>{for(let e of b)n.remove(e)},[n]);let I=(0,p.useMemo)(()=>g.state.kind===`ready`&&g.state.data.heartbeat||{},[g.state]),L=(0,p.useCallback)((e,t)=>n.set(e,t),[n]),R=(0,p.useRef)(0),z=(0,p.useCallback)(async()=>{let e=n.saveBundle(),r={};for(let[t,n]of Object.entries(e))T(t)&&(r[t]=n);if(Object.keys(r).length===0)return;let i=++R.current,a=f(r),o=await t.put(`/api/settings`,a);if(i!==R.current)return;let s=o&&typeof o==`object`&&`data`in o?o.data:o;for(let e of b)n.remove(e);g.setData(s);let c=s.heartbeat||{};w(!!c.enabled),D(typeof c.every==`string`?c.every:`30m`),k(c.activeHours?.start??`08:00`),N(c.activeHours?.end??`22:00`),F(typeof c.target==`string`?c.target:`all`),await g.refresh()},[t,n,g]);if((0,p.useEffect)(()=>{if(h)return h(z),()=>h(null)},[h,z]),g.state.kind===`loading`)return(0,m.jsx)(a,{});if(g.state.kind===`offline`)return(0,m.jsx)(o,{port:e});if(g.state.kind===`error`)return(0,m.jsx)(s,{message:g.state.message});let B=S(E)?null:"Use the form `<n>s|m|h`, e.g. `30m`",V=C(O)?null:`Use HH:MM (24h)`,H=C(M)?null:`Use HH:MM (24h)`,U=g.state.data.perCli||{},W=Object.keys(U),G=[{value:`all`,label:`all (broadcast)`},...(W.length>0?W:[...y]).map(e=>({value:e,label:d(e).label||e}))];return G.some(e=>e.value===P)||G.push({value:P,label:`${d(P).label||P} (legacy)`}),(0,m.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),z()},children:[(0,m.jsxs)(i,{title:`Heartbeat`,hint:`Background prompts the agent runs on a schedule.`,children:[(0,m.jsx)(c,{id:`hb-enabled`,label:`Heartbeat enabled`,value:x,onChange:e=>{w(e),L(`heartbeat.enabled`,{value:e,original:!!I.enabled,valid:!0})}}),(0,m.jsx)(u,{id:`hb-every`,label:`Default interval`,value:E,placeholder:`30m`,error:B,onChange:e=>{D(e),L(`heartbeat.every`,{value:e,original:I.every??`30m`,valid:S(e)})}}),(0,m.jsx)(u,{id:`hb-start`,label:`Active hours start`,value:O,placeholder:`08:00`,error:V,onChange:e=>{k(e),L(`heartbeat.activeHours.start`,{value:e,original:I.activeHours?.start??`08:00`,valid:C(e)})}}),(0,m.jsx)(u,{id:`hb-end`,label:`Active hours end`,value:M,placeholder:`22:00`,error:H,onChange:e=>{N(e),L(`heartbeat.activeHours.end`,{value:e,original:I.activeHours?.end??`22:00`,valid:C(e)})}}),(0,m.jsx)(l,{id:`hb-target`,label:`Target`,value:P,options:G,onChange:e=>{F(e),L(`heartbeat.target`,{value:e,original:I.target??`all`,valid:!0})}})]}),(0,m.jsx)(i,{title:`Jobs`,hint:`Each job replaces the entire heartbeat.json on save. Concurrent edits from multiple browsers will overwrite — last write wins.`,children:(0,m.jsx)(A,{port:e,client:t,dirty:n,snapshot:_.state})}),(0,m.jsx)(i,{title:`Default heartbeat prompt template`,hint:`Markdown shown to the agent when a heartbeat fires without a job-specific prompt.`,children:(0,m.jsx)(j,{port:e,client:t,dirty:n,snapshot:v.state})})]})}export{x as PAGE_LOCAL_KEYS,b as SECTION_A_KEYS,y as TARGET_FALLBACK,M as default,T as isHeartbeatSettingsKey,O as jobScheduleBodyError,k as jobsHaveErrors,w as makeDefaultJob,D as normalizeJobsResponse,C as validateHHMM,S as validateInterval};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-k5-hYhKb.js";import{t as c}from"./fields-C-y_8RgA.js";import{t as l}from"./InlineWarn-CY6dBBMq.js";var u=e(t(),1),d=/^[a-zA-Z0-9._-]+$/;function f(e){return typeof e!=`string`||e.length===0||e.length>64?!1:d.test(e)}function p(e){if(!e||typeof e!=`object`)return{servers:{}};let t=e,n=t.servers,r={};if(n&&typeof n==`object`&&!Array.isArray(n))for(let[e,t]of Object.entries(n))r[e]=m(t);return{...t,servers:r}}function m(e){if(!e||typeof e!=`object`)return{command:``};let t=e,n=typeof t.command==`string`?t.command:``,r=Array.isArray(t.args)?t.args.filter(e=>typeof e==`string`):void 0,i=t.env&&typeof t.env==`object`&&!Array.isArray(t.env)?Object.fromEntries(Object.entries(t.env).filter(e=>typeof e[1]==`string`)):void 0,a=typeof t.autostart==`boolean`?t.autostart:void 0,o={command:n};r&&r.length>0&&(o.args=r),i&&Object.keys(i).length>0&&(o.env=i),a!==void 0&&(o.autostart=a);for(let[e,n]of Object.entries(t))e===`command`||e===`args`||e===`env`||e===`autostart`||(o[e]=n);return o}function h(){return{command:``}}function g(e){return!e||e.length===0?``:e.join(`
|
|
2
|
-
`)}function _(e){if(!e)return[];let t=e.split(/\r?\n|,/),n=[];for(let e of t){let t=e.trim();t.length>0&&n.push(t)}return n}var v=/^[A-Za-z_][A-Za-z0-9_]*$/;function y(e){let t={};if(!e)return t;for(let n of e.split(/\r?\n/)){let e=n.trim();if(e===``||e.startsWith(`#`))continue;let r=e.indexOf(`=`);if(r===-1)continue;let i=e.slice(0,r).trim(),a=e.slice(r+1);v.test(i)&&(t[i]=a)}return t}function b(e){return e?Object.entries(e).map(([e,t])=>`${e}=${t}`).join(`
|
|
3
|
-
`):``}function x(e,t){return f(e)?!t.command||t.command.trim()===``?{kind:`invalid`,reason:`Command is required.`}:{kind:`ok`}:{kind:`invalid`,reason:`Server name must match [a-zA-Z0-9._-] (1–64 chars).`}}function S(e){let t=new Set,n=new Set;for(let r of e){let e=r.toLowerCase();t.has(e)?n.add(e):t.add(e)}return n}function C(e){let t={};for(let[n,r]of Object.entries(e.servers)){let e={command:r.command};r.args&&r.args.length>0&&(e.args=[...r.args]),r.env&&Object.keys(r.env).length>0&&(e.env={...r.env}),r.autostart!==void 0&&(e.autostart=r.autostart);for(let[t,n]of Object.entries(r))t===`command`||t===`args`||t===`env`||t===`autostart`||(e[t]=n);t[n]=e}return{...e,servers:t}}function w(e){let t=1;for(;e.includes(`server-${t}`);)t+=1;return`server-${t}`}var T=n();function E({name:e,server:t,onRename:n,onChange:r,onRemove:i,nameError:a}){let o=`mcp-${e||`unnamed`}`,s=g(t.args),c=b(t.env);return(0,T.jsxs)(`article`,{className:`mcp-server-card`,"aria-label":`MCP server ${e||`(unnamed)`}`,children:[(0,T.jsxs)(`header`,{className:`mcp-server-card-header`,children:[(0,T.jsxs)(`label`,{className:`settings-field settings-field-text`,htmlFor:`${o}-name`,children:[(0,T.jsx)(`span`,{className:`settings-field-label`,children:`Server name`}),(0,T.jsx)(`input`,{id:`${o}-name`,type:`text`,value:e,spellCheck:!1,placeholder:`my-server`,"aria-invalid":!!a,onChange:e=>n(e.target.value)}),a?(0,T.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:a}):null]}),(0,T.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:i,"aria-label":`Remove ${e||`server`}`,children:`Remove`})]}),(0,T.jsxs)(`label`,{className:`settings-field settings-field-text`,htmlFor:`${o}-command`,children:[(0,T.jsx)(`span`,{className:`settings-field-label`,children:`Command`}),(0,T.jsx)(`input`,{id:`${o}-command`,type:`text`,value:t.command||``,placeholder:`npx`,spellCheck:!1,onChange:e=>r({...t,command:e.target.value})})]}),(0,T.jsxs)(`label`,{className:`settings-field settings-field-text`,htmlFor:`${o}-args`,children:[(0,T.jsx)(`span`,{className:`settings-field-label`,children:`Args (one per line, or comma-separated)`}),(0,T.jsx)(`textarea`,{id:`${o}-args`,value:s,rows:3,spellCheck:!1,onChange:e=>r({...t,args:_(e.target.value)})})]}),(0,T.jsxs)(`label`,{className:`settings-field settings-field-text`,htmlFor:`${o}-env`,children:[(0,T.jsx)(`span`,{className:`settings-field-label`,children:`Env (KEY=value per line)`}),(0,T.jsx)(`textarea`,{id:`${o}-env`,value:c,rows:3,spellCheck:!1,onChange:e=>r({...t,env:y(e.target.value)})})]}),(0,T.jsxs)(`label`,{className:`settings-field settings-field-toggle`,htmlFor:`${o}-autostart`,children:[(0,T.jsx)(`input`,{id:`${o}-autostart`,type:`checkbox`,checked:!!t.autostart,onChange:e=>r({...t,autostart:e.target.checked})}),(0,T.jsx)(`span`,{className:`settings-field-label`,children:`Autostart`})]})]})}var D=`mcp.config`;function O({port:e,client:t,dirty:n,registerSave:d}){let{state:f,refresh:m,setData:g}=r(t,`/api/mcp`),[_,v]=(0,u.useState)({servers:{}}),[y,b]=(0,u.useState)([]),[O,k]=(0,u.useState)(!1),[A,j]=(0,u.useState)(!0),[M,N]=(0,u.useState)({kind:`idle`}),P=(0,u.useRef)(0),F=(0,u.useMemo)(()=>f.kind===`ready`?p(f.data):{servers:{}},[f]);(0,u.useEffect)(()=>{if(f.kind===`ready`){let e=p(f.data);v(e),b(Object.keys(e.servers))}},[f]),(0,u.useEffect)(()=>()=>{n.remove(D)},[n]);let I=(0,u.useMemo)(()=>Object.keys(_.servers),[_]),L=(0,u.useMemo)(()=>S(I),[I]),R=(0,u.useMemo)(()=>I.map(e=>({name:e,result:x(e,_.servers[e]??h())})),[_,I]).some(e=>e.result.kind===`invalid`),z=L.size>0,B=!R&&!z&&A,V=(0,u.useCallback)((e,t)=>{n.set(D,{value:C(e),original:C(F),valid:t})},[n,F]),H=(0,u.useCallback)((e,t)=>{v(e),t&&b(t);let n=t??Object.keys(e.servers),r=S(n);V(e,n.every(t=>x(t,e.servers[t]??h()).kind===`ok`)&&r.size===0&&A)},[A,V]),U=(0,u.useCallback)((e,t)=>{if(e===t)return;let n=y.map(n=>n===e?t:n),r={};for(let i of n)i===t?r[i]=_.servers[e]??h():r[i]=_.servers[i]??h();H({..._,servers:r},n)},[_,y,H]),W=(0,u.useCallback)((e,t)=>{H({..._,servers:{..._.servers,[e]:t}},y)},[_,y,H]),G=(0,u.useCallback)(e=>{let t={..._.servers};delete t[e];let n=y.filter(t=>t!==e);H({..._,servers:t},n)},[_,y,H]),K=(0,u.useCallback)(()=>{let e=w(y);H({..._,servers:{..._.servers,[e]:h()}},[...y,e])},[_,y,H]),q=(0,u.useCallback)((e,t)=>{if(j(t),!t){V(_,!1);return}if(e&&typeof e==`object`&&!Array.isArray(e)){let t=p(e);v(t),b(Object.keys(t.servers));let n=S(Object.keys(t.servers));V(t,Object.entries(t.servers).every(([e,t])=>x(e,t).kind===`ok`)&&n.size===0)}},[_,V]),J=(0,u.useCallback)(async()=>{let e=n.saveBundle();if(!(D in e))return;let r=e[D],i=await t.put(`/api/mcp`,r);n.clear();let a=await t.get(`/api/mcp`).catch(()=>i),o=p(a);v(o),b(Object.keys(o.servers)),g(a),await m()},[t,n,m,g]);(0,u.useEffect)(()=>{if(d)return d(J),()=>d(null)},[d,J]);let Y=(0,u.useCallback)(async(e,r)=>{if(n.isDirty()&&typeof window<`u`&&!window.confirm(`You have unsaved MCP edits. ${e} will use the on-disk config, not your unsaved changes. Continue?`))return;let i=P.current+1;P.current=i,N({kind:`pending`,label:e});try{let n=await t.post(r,{});if(P.current!==i)return;N({kind:`success`,message:`${e} succeeded${n?.servers?`: ${JSON.stringify(n.servers)}`:``}`})}catch(e){if(P.current!==i)return;N({kind:`error`,message:e instanceof Error?e.message:String(e)})}},[t,n]);if(f.kind===`loading`)return(0,T.jsx)(a,{});if(f.kind===`offline`)return(0,T.jsx)(o,{port:e});if(f.kind===`error`)return(0,T.jsx)(s,{message:f.message});let X=Array.from(L).sort();return(0,T.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:[(0,T.jsxs)(i,{title:`MCP servers`,hint:`Edit each server's command/args/env. Save writes back to mcp.json; Sync pushes the saved config to all CLIs.`,children:[(0,T.jsxs)(`div`,{className:`mcp-servers-list`,children:[y.length===0&&(0,T.jsxs)(`p`,{className:`settings-section-hint`,children:[`No servers configured. Add one or run `,(0,T.jsx)(`code`,{children:`Reset to defaults`}),`.`]}),y.map(e=>{let t=_.servers[e]??h(),n=e.toLowerCase(),r=L.has(n),i=x(e,t);return(0,T.jsx)(E,{name:e,server:t,onRename:t=>U(e,t),onChange:t=>W(e,t),onRemove:()=>G(e),nameError:r?`Duplicate server name (case-insensitive).`:i.kind===`invalid`?i.reason:null},e)})]}),(0,T.jsx)(`div`,{className:`mcp-servers-actions`,children:(0,T.jsx)(`button`,{type:`button`,className:`settings-action`,onClick:K,children:`Add server`})}),z&&(0,T.jsxs)(l,{role:`alert`,children:[`Duplicate server name`,X.length===1?``:`s`,`: `,X.join(`, `),`. Saving is blocked until names are unique.`]}),R&&!z&&(0,T.jsx)(l,{role:`alert`,children:`Some servers have errors (missing command or invalid name). Saving is blocked until they are fixed.`})]}),(0,T.jsxs)(i,{title:`Actions`,hint:`These act on the saved config. Save edits first if you want them included.`,children:[(0,T.jsxs)(`div`,{className:`mcp-action-buttons`,children:[(0,T.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:M.kind===`pending`,onClick:()=>void Y(`Sync to all CLIs`,`/api/mcp/sync`),children:`Sync to all CLIs`}),(0,T.jsx)(`button`,{type:`button`,className:`settings-action`,disabled:M.kind===`pending`,onClick:()=>void Y(`Install bundle`,`/api/mcp/install`),children:`Install bundle`}),(0,T.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:M.kind===`pending`,onClick:()=>{typeof window<`u`&&!window.confirm(`Reset MCP config to defaults? Your custom servers will be removed.`)||Y(`Reset to defaults`,`/api/mcp/reset`)},children:`Reset to defaults`})]}),M.kind===`pending`&&(0,T.jsxs)(`p`,{className:`settings-section-hint`,role:`status`,children:[M.label,`…`]}),M.kind===`success`&&(0,T.jsxs)(`p`,{className:`settings-section-hint`,role:`status`,children:[`✅ `,M.message]}),M.kind===`error`&&(0,T.jsx)(l,{role:`alert`,children:M.message})]}),(0,T.jsxs)(i,{title:`Advanced (raw JSON)`,hint:`Edit the entire config object. Useful for fields not surfaced in the structured editor.`,children:[(0,T.jsx)(`button`,{type:`button`,className:`settings-action`,onClick:()=>k(e=>!e),"aria-expanded":O,children:O?`Hide raw JSON`:`Show raw JSON`}),O&&(0,T.jsx)(c,{id:`mcp-raw`,label:`mcp.json`,value:C(_),rows:16,onChange:q}),!B&&(0,T.jsx)(`p`,{className:`settings-section-hint`,children:`Save is disabled while validation errors are present.`})]})]})}export{O as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=[`claude`,`claude-e`,`agy`,`codex`,`cursor`,`gemini`],t={agy:{label:`Antigravity`,models:[`gemini-3.5-flash`],efforts:[],effortNote:`AGY print mode uses the current AGY-selected model; switch models in native AGY UI, no --model/--effort flags in agy 1.0.0`},"ai-e":{label:`AI-E`,defaultProvider:`claude`,providers:[`claude`,`codex`,`gemini`,`grok`,`copilot`],models:[`opus`,`sonnet`,`haiku`,`gpt-5.4`,`gpt-5.4-mini`,`gemini-3-flash-preview`,`grok-build`,`gpt-5-mini`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`],modelsByProvider:{claude:[`opus`,`sonnet`,`haiku`],codex:[`gpt-5.4`,`gpt-5.4-mini`],gemini:[`gemini-3-flash-preview`],grok:[`grok-build`],copilot:[`gpt-5-mini`]},effortsByProvider:{claude:[`low`,`medium`,`high`,`xhigh`,`max`],codex:[`low`,`medium`,`high`,`xhigh`],gemini:[],grok:[],copilot:[`low`,`medium`,`high`]}},claude:{label:`Claude`,models:[`opus`,`sonnet`,`sonnet[1m]`,`haiku`,`claude-opus-4-8`,`claude-opus-4-8[1m]`,`claude-opus-4-7`,`claude-opus-4-7[1m]`,`claude-opus-4-6`,`claude-opus-4-6[1m]`,`claude-sonnet-4-6`,`claude-sonnet-4-6[1m]`,`claude-haiku-4-5`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`]},"claude-e":{label:`Claude E`,models:[`opus`,`sonnet`,`haiku`,`claude-opus-4-8`,`claude-opus-4-7`,`claude-sonnet-4-6`,`claude-haiku-4-5`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`]},codex:{label:`Codex`,models:[`gpt-5.5`,`gpt-5.4`,`gpt-5.4-mini`,`gpt-5.3-codex`],efforts:[`low`,`medium`,`high`,`xhigh`]},"codex-app":{label:`Codex App`,models:[`gpt-5.5`,`gpt-5.4`,`gpt-5.4-mini`,`gpt-5.3-codex`],efforts:[`low`,`medium`,`high`,`xhigh`]},cursor:{label:`Cursor`,models:`auto,composer-2.5,composer-2,gpt-5.5,gpt-5.4,gpt-5.4-mini,gpt-5.4-nano,gpt-5.3-codex,gpt-5.2,gpt-5.2-codex,gpt-5.1-codex-max,gpt-5.1-codex-mini,gpt-5.1,claude-opus-4-8,claude-opus-4-8-thinking,claude-opus-4-7,claude-opus-4-7-thinking,claude-4.6-opus,claude-4.6-sonnet,claude-4.5-opus-high,claude-4.5-sonnet,claude-4-sonnet,gemini-3.1-pro,gemini-3-flash,gemini-3.5-flash,grok-4.3,grok-build-0.1,gpt-5-mini,kimi-k2.5`.split(`,`),efforts:[`none`,`none-fast`,`low`,`low-fast`,`medium`,`medium-fast`,`high`,`high-fast`,`xhigh`,`xhigh-fast`,`max`,`max-fast`],effortNote:`Cursor effort resolves to model IDs; no separate --effort flag`},gemini:{label:`Gemini`,models:[`gemini-3-pro-preview`,`gemini-2.5-pro`,`gemini-3-flash-preview`],efforts:[]},grok:{label:`Grok`,models:[`grok-build`],efforts:[],effortNote:`unsupported by grok-build; do not pass --effort`},opencode:{label:`OpenCode`,models:[`opencode-go/kimi-k2.6`,`opencode-go/glm-5.1`],efforts:[`minimal`,`low`,`high`,`max`]},copilot:{label:`Copilot`,models:[`gpt-5.5`,`claude-opus-4.8`,`claude-opus-4.7`,`claude-sonnet-4.6`,`gpt-5.4`],efforts:[`low`,`medium`,`high`]}};function n(e){return t[e]||{label:e,models:[],efforts:[]}}function r(e,t={},n={}){return n[e]?.model||t[e]?.model||``}function i(e,t={},n={}){return n[e]?.effort||t[e]?.effort||``}function a(e,t=``){let n=new Set;t&&n.add(t);for(let t of e)n.add(t);return Array.from(n).map(e=>({value:e,label:e}))}export{r as a,i,n,a as r,e as t};
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-render-Bjnw0wQ6.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{n as e,r as t}from"./vendor-render-DCb9B75Q.js";import{t as n}from"./state-D04-chBy.js";import{a as r,i,n as a,r as o,t as s}from"./api-tVoG39dL.js";import{t as c}from"./preload-helper-DuH3-WbD.js";import{S as l,a as u,b as d,d as f,g as p,i as m,l as ee,m as te,n as ne,o as re,u as ie,x as ae,y as oe}from"./render-CgDEBoCX.js";import{C as se,D as ce,O as le,S as ue,_ as de,a as fe,g as h,h as g,s as pe,u as me,v as he,x as ge}from"./ui-DK_9ndj0.js";import{a as _,n as _e}from"./idb-cache-CZ3JdK8r.js";import{a as ve,c as ye,i as be,l as xe,r as Se,s as Ce,t as we,u as Te}from"./sidebar-DQKE5IA1.js";import{t as Ee}from"./provider-icons-XEfJPGTe.js";import{t as De}from"./locale-DT1WRaeJ.js";import{a as Oe,i as ke,n as Ae,o as je,r as Me,t as Ne}from"./slash-commands-C_ePvrPi.js";import{i as Pe,o as Fe}from"./constants-ahKI_aEG.js";import{A as Ie,B as Le,C as Re,E as v,F as ze,H as Be,I as Ve,L as He,M as Ue,P as We,R as Ge,S as Ke,T as qe,U as Je,V as Ye,W as Xe,_ as Ze,a as Qe,b as $e,c as et,d as tt,f as nt,g as rt,h as it,i as at,k as ot,l as st,m as ct,n as lt,o as ut,p as dt,r as ft,s as pt,t as y,u as mt,w as ht,x as gt,y as _t,z as vt}from"./settings-DWW4GzNc.js";import{a as yt,i as bt,t as xt}from"./skills-COa4iSwL.js";import{a as St,c as Ct,d as wt,f as Tt,i as Et,l as Dt,m as Ot,n as kt,o as At,p as jt,r as Mt,s as Nt,t as Pt,u as Ft}from"./memory-B_nn0A4v.js";var b=[],It=8e3;function Lt(e){return/^\/compact(?:\s|$)/i.test(String(e||``).trim())?300*1e3:1e4}function Rt(e){let t=u();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||!m(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}:{})})},c=window.setTimeout(()=>o(null),It);window.addEventListener(`message`,s);try{window.parent.postMessage({type:`jaw-preview-send-message`,requestId:r,prompt:e},t)}catch{o(null)}}):Promise.resolve(null)}async function zt(e){let t=await Rt(e);if(t?.ok)return t;try{let t=await fetch(`${s}/api/message`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({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}}}}function Bt(e){let t=e.recovery;if(!t?.originalText)return e.text?p(e.text):``;let n=(t.suggestedCommands||[]).slice(0,5),r=n.length?`<div class="cmd-recovery-suggestions">${n.map(e=>`<code>${p(e)}</code>`).join(` `)}</div>`:``,i=p(t.originalText);return`${e.text?`<div>${p(e.text)}</div>`:``}
|
|
3
|
-
<div class="cmd-recovery" data-cmd-recovery>
|
|
4
|
-
<div class="cmd-recovery-label">${p(l(`cmd.recovery.originalPrompt`))}</div>
|
|
5
|
-
<pre class="cmd-recovery-text">${i}</pre>
|
|
6
|
-
${r}
|
|
7
|
-
<div class="cmd-recovery-actions">
|
|
8
|
-
<button type="button" class="cmd-recovery-btn" data-cmd-recovery-action="reinsert" data-cmd-text="${i}">${p(l(`cmd.artifact.action.reinsert`))}</button>
|
|
9
|
-
<button type="button" class="cmd-recovery-btn" data-cmd-recovery-action="copy" data-cmd-text="${i}">${p(l(`cmd.artifact.action.copy`))}</button>
|
|
10
|
-
</div>
|
|
11
|
-
</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 ie(r)}});var Vt=!1;async function Ht(e=`enter`){let t=document.getElementById(`chatInput`),a=document.getElementById(`btnSend`);if(!t||!a)return;let u=e===`button`;if(a.classList.contains(`stop-mode`)&&u){o(`/api/stop`,`POST`);return}if(Vt)return;let d=t.value.trim();if(!d&&!n.attachedFiles.length)return;ye(),Vt=!0;let m=a,ee=m.disabled;m.disabled=!0;try{await ot();let e=d.slice(1).trim().split(/\s+/)[0]||``,a=e.includes(`/`)||e.includes(`\\`);if(d.startsWith(`/`)&&!n.attachedFiles.length&&!a){t.value=``,S(),Ne();try{let e,t,n=Lt(d);if(typeof AbortSignal?.timeout==`function`)e=AbortSignal.timeout(n);else{let r=new AbortController;e=r.signal,t=setTimeout(()=>r.abort(),n)}let a=De(),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({text:d,locale:a}),signal:e});t&&clearTimeout(t);let l=await c.json().catch(()=>({}));if(l?.code===`not_command`){g(`user`,d),_({role:`user`,content:d,timestamp:Date.now()}),await i(`/api/message`,`POST`,{prompt:d});return}if(!c.ok&&!l?.text)throw Error(`HTTP ${c.status}`);if(l?.code===`clear_screen`){ne(),ce().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``)}(l?.text||l?.recovery)&&h(Bt(l),``,l.type),l?.steerPrompt&&await i(`/api/message`,`POST`,{prompt:l.steerPrompt})}catch(e){h(l(`chat.cmd.fail`,{msg:e.message}),``,`error`)}finally{Ce(`command`).catch(()=>{})}return}if(n.attachedFiles.length){let e=`📎 [${n.attachedFiles.map(e=>e.name).join(`, `)}] ${d}`;g(`user`,e),_({role:`user`,content:e,timestamp:Date.now()}),t.value=``,S();try{let e=(await Promise.all(n.attachedFiles.map(e=>Wt(e)))).map(e=>l(`chat.file.sent`,{path:e})).join(`
|
|
12
|
-
`);d&&(e+=l(`chat.file.sentWithMsg`,{text:d})),x(),await i(`/api/message`,`POST`,{prompt:e})}catch(e){h(l(`chat.file.uploadFail`,{msg:e.message})),x()}}else{t.value=``,S();let e=await zt(d),n=e.data;if(e.status===409&&n.error===`duplicate`)return;if(!e.ok){h(`${f.error} ${p(n.error||l(`chat.requestFail`,{status:e.status}))}`,``,`error`);return}if(n.queued){let{updateQueueBadge:e}=await c(async()=>{let{updateQueueBadge:e}=await import(`./ui-Car1OUvV.js`);return{updateQueueBadge:e}},__vite__mapDeps([0]));e(n.pending||1)}else n.noPendingContinue?(g(`user`,d),_({role:`user`,content:d,timestamp:Date.now()}),se(!0)):n.continued?(g(`user`,d),_({role:`user`,content:d,timestamp:Date.now()}),h(l(`chat.continue`)),se(!0)):(g(`user`,d),_({role:`user`,content:d,timestamp:Date.now()}),se(!0))}}finally{Vt=!1,m.disabled=ee}}function Ut(e){e.key===`Enter`&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),Ht(`enter`))}async function Wt(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 Gt(e){for(let t of e)n.attachedFiles.some(e=>e.name===t.name)||n.attachedFiles.push(t);qt(),document.getElementById(`chatInput`)?.focus()}function Kt(e){n.attachedFiles.splice(e,1),qt()}function x(){b.forEach(e=>URL.revokeObjectURL(e)),b=[],n.attachedFiles=[],qt();let e=document.getElementById(`fileInput`);e&&(e.value=``)}function qt(){let e=document.getElementById(`filePreview`),t=document.getElementById(`filePreviewList`);if(e){if(b.forEach(e=>URL.revokeObjectURL(e)),b=[],!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);b.push(t),i=`<img src="${t}" class="file-chip-thumb" alt="">`}return`<div class="file-chip">
|
|
13
|
-
${i}
|
|
14
|
-
<span class="file-chip-name">${f.paperclip} ${p(e.name)} (${n}KB)</span>
|
|
15
|
-
<button class="file-chip-remove" data-file-idx="${t}" title="Remove">${f.close}</button>
|
|
16
|
-
</div>`}).join(``))}}async function Jt(){ne(),ce().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``);let{cleanupToolActivity:t}=await c(async()=>{let{cleanupToolActivity:e}=await import(`./ui-Car1OUvV.js`);return{cleanupToolActivity:e}},__vite__mapDeps([0]));t(),_e().catch(()=>{}),ye()}var Yt=0;function Xt(e){if(Yt)return;let t=ge();Yt=requestAnimationFrame(()=>{if(Yt=0,e.style.height=`auto`,e.style.height=e.scrollHeight+`px`,t){let e=document.getElementById(`chatMessages`);e&&(e.scrollTop=e.scrollHeight,ue())}})}function Zt(){let e=document.getElementById(`chatInput`);e&&e.addEventListener(`input`,()=>Xt(e))}function S(){let e=document.getElementById(`chatInput`),t=ge();if(e&&(e.style.height=`auto`),t){let e=document.getElementById(`chatMessages`);e&&(e.scrollTop=e.scrollHeight,ue())}}function Qt(){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&&Gt(r)}),document.getElementById(`fileInput`)?.addEventListener(`change`,e=>{let t=e.target,n=[...t.files||[]];n.length&&Gt(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(),Gt(n))})}async function $t(e,t,r){let a=document.getElementById(`chatInput`),o=a?.value.trim()||``,c=[...n.attachedFiles],u=[l(`chat.voice.label`)];c.length&&u.push(`📎 [${c.map(e=>e.name).join(`, `)}]`),o&&u.push(o),g(`user`,u.join(` `)),_({role:`user`,content:u.join(` `),timestamp:Date.now()}),a&&o&&(a.value=``,S()),c.length&&x();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`);h(`${f.mic} STT (${p(a.engine||``)}, ${a.elapsed?.toFixed(1)}s): "${p(a.text.slice(0,100))}"`,``,`info`);let u=[];c.length&&(u=await Promise.all(c.map(e=>Wt(e))));let d=[];for(let e of u)d.push(l(`chat.file.sent`,{path:e}));d.push(`🎤 ${a.text}`),o&&d.push(o),await i(`/api/message`,`POST`,{prompt:d.join(`
|
|
17
|
-
`)})}catch(e){h(l(`voice.sttFail`,{msg:e.message}),``,`error`)}}var en={sun:0,mon:1,tue:2,wed:3,thu:4,fri:5,sat:6},tn={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 nn(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 rn(e){let t=e&&typeof e==`object`?e:{},n=t.kind,r=typeof t.timeZone==`string`?t.timeZone.trim():``,i=nn(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=an(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 an(e){try{let[t,n,r,i,a]=on(e);return C(t,{min:0,max:59}),C(n,{min:0,max:23}),C(r,{min:1,max:31}),C(i,{min:1,max:12,aliases:tn}),C(a,{min:0,max:7,aliases:en,normalize:un}),null}catch(e){return e.message}}function on(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 C(e,t){for(let n of e.split(`,`))sn(n.trim(),t)}function sn(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,ln(r,`invalid cron step "${r}"`)}if(n!==`*`){if(n.includes(`-`)){let[e,r,...i]=n.split(`-`);if(!e||!r||i.length>0||cn(e,t)>cn(r,t))throw Error(`invalid cron range "${n}"`);return}cn(n,t)}}function cn(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(!dn(i,t.min,t.max))throw Error(`cron value "${e}" out of range ${t.min}-${t.max}`);return i}function ln(e,t){let n=Number(e);if(!Number.isInteger(n)||n<=0)throw Error(t);return n}function un(e){return e===7?0:e}function dn(e,t,n){return e>=t&&e<=n}async function fn(){n.heartbeatJobs=((await a(`/api/heartbeat`))?.jobs||[]).map(E),n.heartbeatErrors=D(n.heartbeatJobs),w(),document.getElementById(`heartbeatModal`)?.classList.add(`open`)}function pn(e){e&&e.target!==e.currentTarget||document.getElementById(`heartbeatModal`)?.classList.remove(`open`)}function w(){let e=document.getElementById(`hbJobsList`);if(!e)return;let t=n.heartbeatJobs.map(E);n.heartbeatJobs=t,n.heartbeatErrors=D(t),t.length===0?e.innerHTML=`<p style="color:var(--text-dim);font-size:12px;text-align:center">${l(`hb.empty`)}</p>`:e.innerHTML=t.map((e,t)=>{let r=vn(e.schedule),i=r.kind===`cron`,a=n.heartbeatErrors[e.id],o=a||Tn(r),s=a?`hb-schedule-meta hb-error`:`hb-schedule-meta hb-help`,c=i?`<input type="text" value="${p(r.cron)}" placeholder="${p(l(`hb.cronPlaceholder`))}"
|
|
18
|
-
data-hb-cron="${t}">`:`<input type="number" value="${r.minutes}" min="1" data-hb-minutes="${t}">`,u=i?`<span class="hb-chip">${p(l(`hb.cronLabel`))}</span>`:`<span class="hb-chip">${p(l(`hb.minutesLabel`))}</span>`;return`
|
|
19
|
-
<div class="hb-job-card">
|
|
20
|
-
<div class="hb-job-header">
|
|
21
|
-
<input type="text" value="${p(String(e.name||``))}" placeholder="${p(l(`hb.name`))}"
|
|
22
|
-
data-hb-name="${t}">
|
|
23
|
-
<button class="hb-toggle ${e.enabled?`on`:`off`}"
|
|
24
|
-
data-hb-toggle="${t}" aria-label="${p(String(e.name||`job`)+` toggle`)}"></button>
|
|
25
|
-
<button class="hb-del" data-hb-remove="${t}">${f.close}</button>
|
|
26
|
-
</div>
|
|
27
|
-
<div class="hb-job-schedule">
|
|
28
|
-
<select data-hb-kind="${t}">
|
|
29
|
-
<option value="every"${i?``:` selected`}>${p(l(`hb.kindEvery`))}</option>
|
|
30
|
-
<option value="cron"${i?` selected`:``}>${p(l(`hb.kindCron`))}</option>
|
|
31
|
-
</select>
|
|
32
|
-
${c}
|
|
33
|
-
${u}
|
|
34
|
-
<input type="text" value="${p(r.timeZone||``)}" placeholder="${p(Sn())}"
|
|
35
|
-
data-hb-timezone="${t}">
|
|
36
|
-
</div>
|
|
37
|
-
<p class="${s}">${p(o)}</p>
|
|
38
|
-
<textarea class="hb-prompt" rows="2" placeholder="${p(l(`hb.prompt`))}"
|
|
39
|
-
data-hb-prompt="${t}">${p(String(e.prompt||``))}</textarea>
|
|
40
|
-
</div>
|
|
41
|
-
`}).join(``);let r=t.filter(e=>e.enabled).length,i=document.getElementById(`hbSidebarBtn`);i&&(i.innerHTML=`${f.heartPulse} Heartbeat (${r})`)}function mn(){n.heartbeatJobs.push({id:`hb_`+Date.now(),name:``,enabled:!0,schedule:bn({kind:`every`,minutes:5}),prompt:``}),w(),T()}function hn(e){n.heartbeatJobs.splice(e,1),w(),T()}function gn(e){let t=n.heartbeatJobs[e];t&&(t.enabled=!t.enabled,w(),T())}async function T(){let e=n.heartbeatJobs.map(E);if(n.heartbeatJobs=e,n.heartbeatErrors=D(e),Object.keys(n.heartbeatErrors).length>0){w();return}let t=await i(`/api/heartbeat`,`PUT`,{jobs:e});t?.jobs&&(n.heartbeatJobs=t.jobs.map(E),n.heartbeatErrors=D(n.heartbeatJobs),w())}async function _n(){try{let e=((await a(`/api/heartbeat`))?.jobs||[]).map(E).filter(e=>e.enabled).length,t=document.getElementById(`hbSidebarBtn`);t&&(t.innerHTML=`${f.heartPulse} Heartbeat (${e})`)}catch{}}function E(e){return{id:String(e.id||`hb_${Date.now()}`),name:String(e.name||``),enabled:e.enabled!==!1,schedule:vn(e.schedule),prompt:String(e.prompt||``)}}function vn(e){let t=yn(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 yn(e){return(typeof e==`string`?e.trim():``)||void 0}function bn(e){let t=xn();return t?{...e,timeZone:t}:e}function xn(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||void 0}catch{return}}function Sn(){let e=xn();return e?`${l(`hb.timezoneAuto`)} ${e}`:l(`hb.timezoneAuto`)}function D(e){let t={};for(let n of e){let e=Cn(n);e&&(t[n.id]=e)}return t}function Cn(e){let t=rn(e.schedule);return t.ok?null:wn(t.code,t.error)}function wn(e,t){switch(e){case`invalid_cron`:return l(`hb.invalidCron`);case`invalid_timezone`:return l(`hb.invalidTimeZone`);case`invalid_minutes`:return l(`hb.invalidMinutes`);default:return t||l(`hb.invalidSchedule`)}}function Tn(e){let t=e.timeZone||xn()||`Asia/Seoul`;return e.kind===`cron`?l(`hb.scheduleHintCron`,{cron:`0 9 * * *`,timeZone:t}):l(`hb.scheduleHintEvery`,{minutes:e.minutes,timeZone:t})}var O=`jaw.uiTheme`,k=null;function En(e){return e===`dark`||e===`light`||e===`auto`}function Dn(e){return e===`light`||e===`auto`&&typeof window<`u`&&window.matchMedia&&window.matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`}function On(n){let r=n===`light`?e:t;k||(k=document.createElement(`style`),k.id=`hljsTheme`,document.head.appendChild(k)),k.textContent=r}function kn(){!localStorage.getItem(O)&&localStorage.getItem(`theme`)&&(localStorage.setItem(O,localStorage.getItem(`theme`)),localStorage.removeItem(`theme`));let e=jn(),t=localStorage.getItem(O),n=window.matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`;A(e||t||n),document.getElementById(`toggleTheme`)?.addEventListener(`click`,An),window.addEventListener(`message`,Nn),window.matchMedia(`(prefers-color-scheme: dark)`).addEventListener(`change`,()=>{let e=localStorage.getItem(O);(!e||e===`auto`)&&A(e||`auto`)}),window.addEventListener(`storage`,e=>{e.key===O&&e.newValue&&A(e.newValue)})}function An(){let e=(document.documentElement.getAttribute(`data-theme`)||`dark`)===`dark`?`light`:`dark`;A(e),localStorage.setItem(O,e)}function A(e){let t=Dn(e);document.documentElement.setAttribute(`data-theme`,t);let n=document.getElementById(`toggleTheme`);n&&n.classList.toggle(`is-light`,t===`light`),On(t),he(),ee()}function jn(){let e=new URLSearchParams(window.location.search).get(`jawTheme`);return En(e)?e:null}function Mn(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 Nn(e){if(window.parent===window||e.source!==window.parent||!Mn(e.origin))return;let t=e.data;!t||t.type!==`jaw-preview-theme-sync`||!En(t.theme)||A(t.theme)}var Pn=new Set([`j`,`k`,`i`,`n`,`p`]);function Fn(e){if(e.altKey&&!e.ctrlKey&&!e.metaKey){let t=e.key.toLowerCase();return(t.length!==1||!Pn.has(t))&&e.code?.startsWith(`Key`)&&(t=e.code.slice(3).toLowerCase()),Pn.has(t)}return e.ctrlKey&&e.shiftKey&&!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 In(){window.parent!==window&&document.addEventListener(`keydown`,e=>{if(Fn(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 Ln=50,Rn=30,zn=80,Bn=500,j=null,Vn=!1;function Hn(){if(Vn||!(`ontouchstart`in window))return;Vn=!0;let e=document.querySelector(`.chat-area`);e&&(e.addEventListener(`touchstart`,Un,{passive:!0}),e.addEventListener(`touchend`,Wn,{passive:!0}))}function Un(e){let t=e.touches[0],n=window.innerWidth,r=null;t.clientX<Rn?r=`left`:t.clientX>n-Rn&&(r=`right`),j={startX:t.clientX,startY:t.clientY,startTime:Date.now(),isEdge:r}}function Wn(e){if(!j)return;let t=e.changedTouches[0],n=t.clientX-j.startX,r=Math.abs(t.clientY-j.startY),i=Date.now()-j.startTime,a=j;j=null,!(r>zn||i>Bn||Math.abs(n)<Ln)&&(n>0&&a.isEdge===`left`&&Se(),n<0&&a.isEdge===`right`&&be())}var M=!1,N=null,P=[],Gn=null,Kn=null,qn=0,F=!1,I=`stopped`,Jn=15e3;function Yn(){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 Xn(e){let t=e;switch(t.name){case`NotAllowedError`:return l(`voice.micDenied`);case`NotFoundError`:return l(`voice.micNotFound`);case`NotReadableError`:case`AbortError`:return l(`voice.micBusy`);case`TimeoutError`:return tr();default:return t instanceof TypeError||!navigator.mediaDevices?l(`voice.httpsRequired`):l(`voice.micDenied`)}}function Zn(){let e=document;return e.permissionsPolicy||e.featurePolicy||null}function Qn(){try{return Zn()?.allowsFeature?.(`microphone`)===!1}catch{return!1}}async function $n(){try{return navigator.permissions?.query?(await navigator.permissions.query({name:`microphone`})).state:null}catch{return null}}function er(){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 tr(){let e=er();return e.alternateOrigin?l(`voice.requestTimeoutLoopback`,e):l(`voice.requestTimeout`,e)}function nr(e){let t=e;return t.name===`NotSupportedError`?l(`voice.unsupported`):t.name===`NotReadableError`||t.name===`AbortError`?l(`voice.micBusy`):t instanceof TypeError?l(`voice.httpsRequired`):l(`voice.interrupted`)}function L(e){if(window.parent!==window)try{window.parent.postMessage({type:`jaw-preview-stt-recording`,action:e},`*`)}catch{}}function rr(){return new DOMException(`Timed out waiting for microphone permission prompt`,`TimeoutError`)}async function ir(){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(rr())},Jn)});try{let e=await Promise.race([n,r]);if(!e)throw rr();return e}finally{t!==null&&clearTimeout(t)}}async function ar(){if(n.isRecording||F)return;if(typeof MediaRecorder>`u`||!navigator.mediaDevices?.getUserMedia){h(l(`voice.unsupported`),``,`error`);return}if(Qn()){h(l(`voice.policyBlocked`),``,`error`);return}if(await $n()===`denied`){h(l(`voice.permissionDeniedBrowser`,er()),``,`error`);return}F=!0,M=!1,I=`stopped`,z(!1),L(`request`);let e=null;try{e=await ir(),Gn=e}catch(e){F=!1,z(!1),L(`failed`),h(Xn(e),``,`error`);return}try{let t=Yn(),r=new MediaRecorder(e,t?{mimeType:t}:{});N=r,P=[],r.ondataavailable=e=>{e.data.size>0&&P.push(e.data)},r.onerror=()=>{M=!0,I=`failed`,n.isRecording=!1,ur(),z(!1),r.state===`recording`?r.stop():(P=[],R(),N=null,L(`failed`)),h(l(`voice.interrupted`),``,`error`)},r.onstop=async()=>{let e=I,n=M||e!==`stopped`;if(I=`stopped`,n){P=[],R(),N=null,M=!1,L(e);return}let i=r.mimeType||t||`audio/webm`,a=i.includes(`mp4`)?`.m4a`:i.includes(`ogg`)?`.ogg`:`.webm`,o=new Blob(P,{type:i});if(P=[],R(),N=null,M=!1,L(`stopped`),o.size>20*1024*1024){h(l(`voice.tooLarge`),``,`error`);return}if(o.size<1e3){h(l(`voice.tooShort`),``,`error`);return}await $t(o,a,i)},r.start(),n.isRecording=!0,F=!1,qn=Date.now(),z(!0),lr(),L(`started`)}catch(e){F=!1,n.isRecording=!1,P=[],N=null,R(),z(!1),L(`failed`),h(nr(e),``,`error`)}}function or(){!n.isRecording||!N||(I=`stopped`,N.state===`recording`?N.stop():(R(),N=null,L(`stopped`)),n.isRecording=!1,ur(),z(!1))}function sr(){!n.isRecording||!N||(M=!0,I=`cancelled`,N.state===`recording`?N.stop():(P=[],R(),N=null,L(`cancelled`)),n.isRecording=!1,ur(),z(!1))}function cr(){n.isRecording?or():ar()}function R(){Gn?.getTracks().forEach(e=>e.stop()),Gn=null}function lr(){let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`inline`,Kn=setInterval(()=>{let t=Math.floor((Date.now()-qn)/1e3);e.textContent=`${String(Math.floor(t/60)).padStart(2,`0`)}:${String(t%60).padStart(2,`0`)}`},500))}function ur(){Kn&&=(clearInterval(Kn),null);let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`none`,e.textContent=`00:00`)}function z(e){let t=document.getElementById(`btnVoice`),n=document.getElementById(`btnVoiceCancel`),r=F&&!e;t&&(t.classList.toggle(`recording`,e),t.classList.toggle(`arming`,r),t.innerHTML=e?f.stop:f.mic,t.title=l(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`)}var B={activeCli:V(`activeCli`,2,1,2),model:V(`model`,2,1,1),effort:V(`effort`,2,1,1),permissions:V(`permissions`,2,1,1),flushAgent:V(`flushAgent`,2,1,1),employees:V(`employees`,3,3,2),skills:V(`skills`,2,1,1),activeChannel:V(`activeChannel`,2,1,1),telegram:{...V(`telegram`,2,1,2,8),docLinks:[{url:`https://t.me/BotFather`,labelKey:`help.telegram.link.botfather`},{url:`https://core.telegram.org/bots/tutorial`,labelKey:`help.telegram.link.docs`}]},discord:{...V(`discord`,2,1,2,9),docLinks:[{url:`https://discord.com/developers/applications`,labelKey:`help.discord.link.portal`},{url:`https://discord.com/developers/docs/getting-started`,labelKey:`help.discord.link.docs`}]},fallbackOrder:V(`fallbackOrder`,2,1,1),mcp:V(`mcp`,2,1,1),memory:V(`memory`,2,1,2),stt:V(`stt`,2,1,1),promptTemplates:V(`promptTemplates`,2,1,1),chatInput:V(`chatInput`,3,2,2),orchestration:V(`orchestration`,3,2,2),attachments:V(`attachments`,3,2,2),diagrams:V(`diagrams`,3,2,2),keyboardShortcuts:V(`keyboardShortcuts`,3,2,2,3,2)};function dr(e){return typeof e==`string`&&Object.prototype.hasOwnProperty.call(B,e)}function V(e,t,n,r,i=2,a=1){return{titleKey:`help.${e}.title`,introKey:`help.${e}.intro`,effectKey:`help.${e}.effect`,useWhenKeys:H(`help.${e}.use`,t),howToKeys:H(`help.${e}.howTo`,i),exampleKeys:H(`help.${e}.example`,a),avoidWhenKeys:H(`help.${e}.avoid`,n),relatedKeys:H(`help.${e}.related`,r)}}function H(e,t){return Array.from({length:t},(t,n)=>`${e}.${n+1}`)}var fr=!1,U=null,W=null,G=null,K=null,pr=null,q=!1;function mr(){fr||(fr=!0,document.addEventListener(`click`,gr),document.addEventListener(`keydown`,_r,!0))}function hr(e,t=null,n=[e]){if(!B[e]){console.warn(`[help-dialog] unknown topic:`,e);return}vr(),pr=t,yr(e,Cr(n,e)),U?.classList.add(`open`),U?.setAttribute(`aria-hidden`,`false`),q=!0,requestAnimationFrame(()=>K?.focus())}function J(){if(!q)return;U?.classList.remove(`open`),U?.setAttribute(`aria-hidden`,`true`),q=!1;let e=pr;pr=null,e?.focus()}function gr(e){let t=e.target?.closest(`[data-help-topic]`);if(!t)return;let n=t.getAttribute(`data-help-topic`);if(!dr(n)){console.warn(`[help-dialog] invalid topic:`,n);return}e.preventDefault(),hr(n,t,Sr(t.getAttribute(`data-help-topics`),n))}function _r(e){!q||e.key!==`Escape`||(e.preventDefault(),e.stopImmediatePropagation(),J())}function vr(){if(U&&W&&G&&K)return;U=document.createElement(`div`),U.id=`helpDialog`,U.className=`modal-overlay help-dialog-overlay`,U.setAttribute(`role`,`presentation`),U.setAttribute(`aria-hidden`,`true`),U.addEventListener(`click`,e=>{e.target===U&&J()});let e=document.createElement(`div`);e.className=`modal-box help-dialog-box`,e.setAttribute(`role`,`dialog`),e.setAttribute(`aria-modal`,`true`),e.setAttribute(`aria-labelledby`,`helpDialogTitle`),e.addEventListener(`click`,e=>e.stopPropagation());let t=document.createElement(`div`);t.className=`modal-header help-dialog-header`,W=document.createElement(`span`),W.id=`helpDialogTitle`,K=document.createElement(`button`),K.type=`button`,K.className=`btn-modal-close help-dialog-close`,K.setAttribute(`aria-label`,l(`help.close`)),K.textContent=`x`,K.addEventListener(`click`,()=>J()),G=document.createElement(`div`),G.className=`help-dialog-body`;let n=document.createElement(`div`);n.className=`modal-footer help-dialog-footer`;let r=document.createElement(`button`);r.type=`button`,r.className=`btn-save help-dialog-done`,r.textContent=l(`help.close`),r.addEventListener(`click`,()=>J()),t.append(W,K),n.append(r),e.append(t,G,n),U.append(e),document.body.append(U)}function yr(e,t=[e]){if(!W||!G||!K)return;let n=B[e];W.textContent=l(n.titleKey),K.setAttribute(`aria-label`,l(`help.close`)),G.replaceChildren();let r=document.createElement(`div`);if(r.className=`help-dialog-content`,br(r,n),t.length<=1){G.append(r);return}let i=document.createElement(`div`);i.className=`help-dialog-layout`,i.append(xr(t,e),r),G.append(i)}function br(e,t){t.docLinks?.length&&wr(e,t.docLinks),Tr(e,l(`help.section.what`),l(t.introKey)),Tr(e,l(`help.section.effect`),l(t.effectKey),`help-effect-text`),Y(e,l(`help.section.useWhen`),t.useWhenKeys),Dr(e,l(`help.section.howTo`),t.howToKeys),Y(e,l(`help.section.example`),t.exampleKeys,!1,`help-example-list`),t.avoidWhenKeys?.length&&Y(e,l(`help.section.avoidWhen`),t.avoidWhenKeys),t.relatedKeys?.length&&Y(e,l(`help.section.related`),t.relatedKeys,!0)}function xr(e,t){let n=document.createElement(`nav`);n.className=`help-dialog-nav`,n.setAttribute(`aria-label`,l(`help.section.related`));for(let r of e){let i=B[r],a=document.createElement(`button`);a.type=`button`,a.className=`help-dialog-nav-item`,a.textContent=l(i.titleKey),r===t&&(a.classList.add(`active`),a.setAttribute(`aria-current`,`page`)),a.addEventListener(`click`,()=>yr(r,e)),n.append(a)}return n}function Sr(e,t){return Cr(e?.split(/[\s,]+/).filter(Boolean)??[],t)}function Cr(e,t){let n=[];for(let t of e)dr(t)&&!n.includes(t)&&n.push(t);return n.includes(t)||n.unshift(t),n}function wr(e,t){let n=document.createElement(`section`);n.className=`help-dialog-section help-doc-links`;let r=document.createElement(`nav`);r.className=`help-doc-links-nav`;for(let e of t){let t=document.createElement(`a`);t.href=e.url,t.target=`_blank`,t.rel=`noopener noreferrer`,t.className=`help-doc-link`,t.textContent=l(e.labelKey);let n=document.createElement(`span`);n.className=`help-doc-link-icon`,n.textContent=`↗`,t.append(n),r.append(t)}n.append(r),e.append(n)}function Tr(e,t,n,r){let i=Er(t),a=document.createElement(`p`);r&&(a.className=r),a.textContent=n,i.append(a),e.append(i)}function Y(e,t,n,r=!1,i){let a=Er(t),o=document.createElement(`ul`);o.className=i??(r?`help-related-list`:`help-dialog-list`);for(let e of n){let t=document.createElement(`li`);t.textContent=l(e),o.append(t)}a.append(o),e.append(a)}function Er(e){let t=document.createElement(`section`);t.className=`help-dialog-section`;let n=document.createElement(`h3`);return n.textContent=e,t.append(n),t}function Dr(e,t,n){let r=Er(t),i=document.createElement(`ol`);i.className=`help-dialog-list help-howto-list`;for(let e of n){let t=document.createElement(`li`);t.textContent=l(e),i.append(t)}r.append(i),e.append(r)}window.parent;var Or=null,kr=``,X=null;function Ar(){let e=document.getElementById(`chatSearchInput`),t=document.getElementById(`chatSearchClose`),n=document.getElementById(`chatSearchResults`),r=document.getElementById(`chatSearchCount`);!e||!t||!n||!r||(window.addEventListener(`message`,e=>{e.data?.type===`jaw-preview-search`&&jr()}),e.addEventListener(`input`,()=>{let t=e.value.trim();if(Or&&clearTimeout(Or),!t){zr(n,r);return}Or=setTimeout(()=>void Nr(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(),Rr(n,1)),e.key===`ArrowUp`&&(e.preventDefault(),Rr(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 jr(){let e=document.getElementById(`chatSearch`),t=document.getElementById(`chatSearchInput`);!e||!t||(e.classList.contains(`open`)?Z():(e.classList.add(`open`),t.focus(),Mr()))}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&&zr(n,r),kr=``)}function Mr(){X=new Map,a(`/api/messages`).then(e=>{e&&(X=new Map,e.forEach((e,t)=>X.set(e.id,t)))}).catch(()=>{})}async function Nr(e,t,n){kr=e;let r=await a(`/api/messages/search?q=${encodeURIComponent(e)}&limit=20`);if(!(!r||kr!==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=>Pr(t,e)).join(``),t.classList.add(`has-results`),t.querySelectorAll(`.chat-search-result`).forEach(e=>{e.addEventListener(`click`,()=>{Lr(Number(e.dataset.msgId))})})}}function Pr(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=Ir(i?Fr(e.tool_log,t):e.content,t),s=Br(e.created_at);return`<div class="chat-search-result" data-msg-id="${e.id}" tabindex="-1">
|
|
42
|
-
<div class="chat-search-result-meta">
|
|
43
|
-
<span class="chat-search-result-role ${n}">${p(r)}</span>
|
|
44
|
-
${a}
|
|
45
|
-
<span>${p(s)}</span>
|
|
46
|
-
</div>
|
|
47
|
-
<div class="chat-search-result-snippet">${o}</div>
|
|
48
|
-
</div>`}function Fr(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 Ir(e,t){let n=e.toLowerCase().indexOf(t.toLowerCase());if(n===-1)return p(e.slice(0,120));let r=Math.max(0,n-40),i=Math.min(e.length,n+t.length+80),a=p(e.slice(r,n)),o=p(e.slice(n,n+t.length)),s=p(e.slice(n+t.length,i));return`${r>0?`…`:``}${a}<mark>${o}</mark>${s}${i<e.length?`…`:``}`}function Lr(e){if(!X)return;let t=X.get(e);t!=null&&(ce().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 Rr(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 zr(e,t){e.classList.remove(`has-results`),e.innerHTML=``,t.textContent=``}function Br(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 Vr=`jaw:stale-bundle-reload-pending`;function Hr(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(Vr)===`1`)return!0;sessionStorage.setItem(Vr,`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(Hr(e.reason)){e.preventDefault();return}console.error(`[unhandled]`,e.reason),e.preventDefault()}),window.addEventListener(`error`,e=>{if(Hr(e.error||e.message)){e.preventDefault();return}console.error(`[error]`,e.message,e.filename,e.lineno)});var{loadEmployees:Ur,addEmployee:Wr,deleteEmployee:Gr,updateEmployee:Q,onEmpCliChange:Kr,onEmpRoleChange:qr}=await c(async()=>{let{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}=await import(`./employees-DiNLzEXS.js`);return{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}},__vite__mapDeps([0]));function Jr(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 Yr(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`,()=>{Ht(`button`)});var Xr=document.getElementById(`chatInput`);Xr?.addEventListener(`keydown`,e=>{Me(e)||Ut(e)});var $=0;Xr?.addEventListener(`input`,e=>{e.isComposing||($&&cancelAnimationFrame($),$=requestAnimationFrame(()=>{je(e.target?.value||``),$=0}))}),Xr?.addEventListener(`cmd-execute`,()=>{Ht(`cmd-execute`)}),document.getElementById(`cmdDropdown`)?.addEventListener(`click`,Ae),document.addEventListener(`click`,ke),Te(),document.getElementById(`filePreviewClear`)?.addEventListener(`click`,x),document.getElementById(`filePreviewList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-file-idx]`);t&&Kt(+(t.dataset.fileIdx||`0`))}),document.querySelector(`.btn-attach`)?.addEventListener(`click`,()=>{document.getElementById(`fileInput`)?.click()}),document.getElementById(`btnVoice`)?.addEventListener(`click`,()=>cr()),document.getElementById(`btnVoiceCancel`)?.addEventListener(`click`,()=>sr()),window.addEventListener(`message`,e=>{if(window.parent===window||e.source!==window.parent||!Jr(e.origin))return;let t=e.data;!t||t.type!==`jaw-preview-stt-toggle`||cr()}),document.getElementById(`memorySidebarBtn`)?.addEventListener(`click`,Et),document.getElementById(`btnClearChat`)?.addEventListener(`click`,Jt),document.getElementById(`hbSidebarBtn`)?.addEventListener(`click`,fn),document.getElementById(`langSelect`)?.addEventListener(`change`,async e=>{let t=e.target.value;[`ko`,`en`,`zh`,`ja`].includes(t)&&(await ae(t),n.ws&&n.ws.close())}),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`,`settings`];r[n]&&me(r[n],t)}),document.querySelector(`.sidebar-save-bar .btn-save`)?.addEventListener(`click`,fe);function Zr(e){let t=(e instanceof HTMLSelectElement?e:document.getElementById(`selAiEProvider`))?.value||``,n=document.getElementById(`providerAiE`);!t||!n||Array.from(n.options).some(e=>e.value===t)&&(n.value=t)}document.getElementById(`selCli`)?.addEventListener(`change`,()=>Ke()),document.getElementById(`selAiEProvider`)?.addEventListener(`change`,e=>{Zr(e.target),Ke(),qe()}),document.getElementById(`selModel`)?.addEventListener(`change`,()=>qe()),document.getElementById(`selEffort`)?.addEventListener(`change`,()=>qe()),document.getElementById(`flushCli`)?.addEventListener(`change`,()=>Re()),document.getElementById(`flushModel`)?.addEventListener(`change`,()=>Re()),document.querySelector(`[data-action="addEmployee"]`)?.addEventListener(`click`,Wr),document.getElementById(`employeesList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-emp-delete]`);if(t){Gr(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){Kr(r.dataset.empCli||``,t.value);return}let i=t.closest(`[data-emp-model]`);if(i){if(t.value===`__custom__`){let e=prompt(l(`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){qr(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&&yt(t.dataset.skillId||``,t.dataset.skillEnabled===`true`)}),document.querySelector(`#tabSkills`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`.skill-filter`);t&&xt(t.dataset.filter||`all`,t)}),document.getElementById(`skillSearchInput`)?.addEventListener(`input`,e=>{bt(e.target.value)}),document.querySelector(`[data-action="openPrompt"]`)?.addEventListener(`click`,ft),document.getElementById(`tgOff`)?.addEventListener(`click`,()=>Je(!1)),document.getElementById(`tgOn`)?.addEventListener(`click`,()=>Je(!0)),document.getElementById(`tgForwardOff`)?.addEventListener(`click`,()=>Be(!1)),document.getElementById(`tgForwardOn`)?.addEventListener(`click`,()=>Be(!0)),document.getElementById(`tgMentionOff`)?.addEventListener(`click`,()=>Xe(!1)),document.getElementById(`tgMentionOn`)?.addEventListener(`click`,()=>Xe(!0)),document.getElementById(`tgToken`)?.addEventListener(`change`,Ye),document.getElementById(`tgChatIds`)?.addEventListener(`change`,Ye),document.getElementById(`chTelegram`)?.addEventListener(`click`,()=>ze(`telegram`)),document.getElementById(`chDiscord`)?.addEventListener(`click`,()=>ze(`discord`)),document.getElementById(`dcOff`)?.addEventListener(`click`,()=>He(!1)),document.getElementById(`dcOn`)?.addEventListener(`click`,()=>He(!0)),document.getElementById(`dcForwardOff`)?.addEventListener(`click`,()=>vt(!1)),document.getElementById(`dcForwardOn`)?.addEventListener(`click`,()=>vt(!0)),document.getElementById(`dcAllowBotsOff`)?.addEventListener(`click`,()=>Ge(!1)),document.getElementById(`dcAllowBotsOn`)?.addEventListener(`click`,()=>Ge(!0)),document.getElementById(`dcMentionOff`)?.addEventListener(`click`,()=>Le(!1)),document.getElementById(`dcMentionOn`)?.addEventListener(`click`,()=>Le(!0)),document.getElementById(`dcToken`)?.addEventListener(`change`,Ve),document.getElementById(`dcGuildId`)?.addEventListener(`change`,Ve),document.getElementById(`dcChannelIds`)?.addEventListener(`change`,Ve),document.getElementById(`fallbackOrderList`)?.addEventListener(`change`,We);function Qr(e){let t=document.getElementById(`codexFastOn`),n=document.getElementById(`codexFastOff`);t&&n&&(t.classList.toggle(`active`,e),n.classList.toggle(`active`,!e)),v()}document.getElementById(`codexFastOn`)?.addEventListener(`click`,()=>Qr(!0)),document.getElementById(`codexFastOff`)?.addEventListener(`click`,()=>Qr(!1));function $r(e){let t=document.getElementById(`codexCtxOn`),n=document.getElementById(`codexCtxOff`),r=document.getElementById(`codexCtxValues`);t&&n&&(t.classList.toggle(`active`,e),n.classList.toggle(`active`,!e)),r&&(r.style.display=e?``:`none`),v()}document.getElementById(`codexCtxOn`)?.addEventListener(`click`,()=>$r(!0)),document.getElementById(`codexCtxOff`)?.addEventListener(`click`,()=>$r(!1)),document.getElementById(`codexCtxWindow`)?.addEventListener(`change`,v),document.getElementById(`codexCtxCompact`)?.addEventListener(`change`,v);function ei(e){let t=document.getElementById(`claude1mOn`),n=document.getElementById(`claude1mOff`),r=document.getElementById(`modelClaude`),i=e;if(r){let t=r.value||``;if(e&&!t.endsWith(`[1m]`)){let e=t+`[1m]`;Array.from(r.options).some(t=>t.value===e)?r.value=e:i=!1}else if(!e&&t.endsWith(`[1m]`)){let e=t.replace(/\[1m\]$/,``);Array.from(r.options).some(t=>t.value===e)?r.value=e:i=!0}else i=t.endsWith(`[1m]`)}t&&n&&(t.classList.toggle(`active`,i),n.classList.toggle(`active`,!i)),v()}document.getElementById(`claude1mOn`)?.addEventListener(`click`,()=>ei(!0)),document.getElementById(`claude1mOff`)?.addEventListener(`click`,()=>ei(!1));function ti(e){return e.split(/[^a-zA-Z0-9]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``)}function ni(){for(let e of Pe()){let t=ti(e),n=document.getElementById(`model`+t);n&&n.addEventListener(`change`,function(){_t(e,this)});let r=document.getElementById(`customModel`+t);r&&r.addEventListener(`change`,function(){Ze(e,this)});let i=document.getElementById(`effort`+t);i&&i.addEventListener(`change`,v)}document.getElementById(`providerAiE`)?.addEventListener(`change`,ht)}document.querySelector(`[data-action="syncMcp"]`)?.addEventListener(`click`,Ue),document.querySelector(`[data-action="installMcp"]`)?.addEventListener(`click`,Ie),document.querySelector(`[data-action="refreshCli"]`)?.addEventListener(`click`,()=>{nt()?ct(!0):st()}),document.getElementById(`cliStatusInterval`)?.addEventListener(`change`,function(){rt(this.value)}),document.getElementById(`promptModal`)?.addEventListener(`click`,e=>y(e)),document.querySelector(`#promptModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closePrompt"]`)?.addEventListener(`click`,()=>y()),document.querySelector(`[data-action="cancelPrompt"]`)?.addEventListener(`click`,()=>y()),document.querySelector(`[data-action="savePrompt"]`)?.addEventListener(`click`,Qe),document.addEventListener(`keydown`,e=>{e.key===`Escape`&&!n.isRecording&&y()}),document.querySelector(`[data-action="openTemplates"]`)?.addEventListener(`click`,at),document.querySelector(`[data-action="saveTemplate"]`)?.addEventListener(`click`,ut),document.querySelector(`[data-action="closeTemplate"]`)?.addEventListener(`click`,()=>lt()),document.getElementById(`templateModal`)?.addEventListener(`click`,e=>lt(e)),document.querySelector(`#templateModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.getElementById(`templateBack`)?.addEventListener(`click`,pt),document.getElementById(`templateDevToggle`)?.addEventListener(`click`,et),document.getElementById(`heartbeatModal`)?.addEventListener(`click`,e=>pn(e)),document.querySelector(`#heartbeatModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeHeartbeat"]`)?.addEventListener(`click`,()=>pn()),document.querySelector(`[data-action="addHeartbeat"]`)?.addEventListener(`click`,mn),document.getElementById(`hbJobsList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-hb-toggle]`);if(t){gn(+(t.dataset.hbToggle||`0`));return}let n=e.target?.closest(`[data-hb-remove]`);if(n){hn(+(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,T();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}:{}},w(),T();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}:{}},w(),T();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}:{}},w(),T();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()}:{}},w(),T();return}let c=t.closest(`[data-hb-prompt]`);if(c){n.heartbeatJobs[+(c.dataset.hbPrompt||`0`)].prompt=t.value,T();return}}),document.getElementById(`memoryModal`)?.addEventListener(`click`,e=>Pt(e)),document.querySelector(`#memoryModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeMemory"]`)?.addEventListener(`click`,()=>Pt()),document.getElementById(`memTabBtnSettings`)?.addEventListener(`click`,()=>Ft(`settings`)),document.getElementById(`memTabBtnAdvOps`)?.addEventListener(`click`,()=>Ft(`status`)),document.getElementById(`memTabBtnFiles`)?.addEventListener(`click`,()=>Ft(`files`)),document.getElementById(`memOn`)?.addEventListener(`click`,()=>Dt(!0)),document.getElementById(`memOff`)?.addEventListener(`click`,()=>Dt(!1)),document.getElementById(`memFlushEvery`)?.addEventListener(`change`,Ct),document.getElementById(`memRetention`)?.addEventListener(`change`,Ct),document.getElementById(`memFlushLang`)?.addEventListener(`change`,Ct),document.getElementById(`memFlushNowBtn`)?.addEventListener(`click`,Tt),document.getElementById(`advBootstrapBtn`)?.addEventListener(`click`,Nt),document.getElementById(`advReindexBtn`)?.addEventListener(`click`,At),document.getElementById(`advReimportBtn`)?.addEventListener(`click`,Nt),document.getElementById(`advOpenCorruptedBtn`)?.addEventListener(`click`,Mt),document.getElementById(`advStatusBanner`)?.addEventListener(`click`,e=>{e.target?.id===`advUpgradeSoulBtn`&&jt(),e.target?.id===`advSynthesizeSoulBtn`&&wt()}),document.getElementById(`basicMemoryFiles`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-mem-delete]`);if(t){e.stopPropagation(),kt(t.dataset.memDelete||``);return}let n=e.target?.closest(`[data-mem-view]`);if(n){Ot(n.dataset.memView||``);return}if(e.target?.closest(`[data-mem-back]`)){Et();return}});async function ri(){te(),Ee(),kn(),In(),await d();let e=document.getElementById(`langSelect`);e&&(e.value=oe()),await Fe(),ni(),mr(),Ar(),document.getElementById(`chatSearchTrigger`)?.addEventListener(`click`,jr),xe(),ve(),Qt(),Zt(),await Oe(),await gt(),$e(),it(),tt(),mt(),nt()&&ct(),we(),Ur(),_n(),St(),de(),await le(),pe(),Hn();try{sessionStorage.removeItem(Vr)}catch{}re(),`serviceWorker`in navigator&&!dt()&&navigator.serviceWorker.register(`/sw.js`).catch(()=>{})}ri().catch(e=>{console.error(`[bootstrap]`,e)}),document.addEventListener(`keydown`,e=>{(e.ctrlKey||e.metaKey)&&e.key===`f`&&(e.preventDefault(),e.stopPropagation(),jr())},!0),document.addEventListener(`keydown`,e=>{if(e.key===`Escape`){if(document.getElementById(`chatSearch`)?.classList.contains(`open`)){e.preventDefault(),Z();return}if(n.isRecording){e.preventDefault(),sr();return}document.querySelectorAll(`.modal-overlay.open`).forEach(e=>{e.classList.remove(`open`)})}Yr(e)&&(e.preventDefault(),cr())}),document.getElementById(`mobileMenuLeft`)?.addEventListener(`click`,Se),document.getElementById(`mobileMenuRight`)?.addEventListener(`click`,be);
|