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
|
@@ -243,7 +243,7 @@ export function SidebarRailRouter(props: Props) {
|
|
|
243
243
|
<div className="workspace-surface-layer">
|
|
244
244
|
<WorkspaceSurface active={props.sidebarMode === 'instances'}>
|
|
245
245
|
<Workbench mode={props.activeDetailTab} onModeChange={props.onDetailTabChange} header={props.workbenchHeader} modeActions={props.jawCeoWorkbenchButton} overview={props.detailContent('overview')} preview={(
|
|
246
|
-
<InstancePreview instance={props.selectedInstance} data={props.data} enabled={props.previewEnabled} active={props.sidebarMode === 'instances' && props.activeDetailTab === 'preview'} refreshKey={props.previewRefreshKey} theme={props.previewTheme} {...(props.onOpenNotesFromPreview ? { onOpenNotesFromPreview: props.onOpenNotesFromPreview } : {})} />
|
|
246
|
+
<InstancePreview instance={props.selectedInstance} data={props.data} enabled={props.previewEnabled} active={props.sidebarMode === 'instances' && props.activeDetailTab === 'preview'} refreshKey={props.previewRefreshKey} theme={props.previewTheme} {...(props.onOpenNotesFromPreview ? { onOpenNotesFromPreview: props.onOpenNotesFromPreview } : {})} onOpenDocFromPreview={handleRightPreviewFile} />
|
|
247
247
|
)} logs={props.detailContent('logs')} settings={props.detailContent('settings')} />
|
|
248
248
|
</WorkspaceSurface>
|
|
249
249
|
<WorkspaceSurface active={props.sidebarMode === 'notes'}>
|
|
@@ -103,7 +103,20 @@ export function DocPanel(props: { filePath?: string | undefined }) {
|
|
|
103
103
|
return (
|
|
104
104
|
<div className="doc-panel">
|
|
105
105
|
<div className="doc-toolbar">
|
|
106
|
-
<span className="doc-file-name">{props.filePath.split('/').pop()}</span>
|
|
106
|
+
<span className="doc-file-name" title={props.filePath}>{props.filePath.split('/').pop()}</span>
|
|
107
|
+
<button
|
|
108
|
+
type="button"
|
|
109
|
+
className="doc-copy-path"
|
|
110
|
+
title="Copy full path"
|
|
111
|
+
onClick={() => {
|
|
112
|
+
void navigator.clipboard.writeText(props.filePath!).then(() => {
|
|
113
|
+
const btn = document.querySelector('.doc-copy-path');
|
|
114
|
+
if (btn) { btn.textContent = 'Copied'; setTimeout(() => { btn.textContent = 'Path'; }, 1200); }
|
|
115
|
+
});
|
|
116
|
+
}}
|
|
117
|
+
>
|
|
118
|
+
Path
|
|
119
|
+
</button>
|
|
107
120
|
</div>
|
|
108
121
|
<div className="doc-content">
|
|
109
122
|
<DocContent filePath={props.filePath} content={content} />
|
|
@@ -30,6 +30,22 @@
|
|
|
30
30
|
overflow: hidden;
|
|
31
31
|
text-overflow: ellipsis;
|
|
32
32
|
white-space: nowrap;
|
|
33
|
+
flex: 1;
|
|
34
|
+
}
|
|
35
|
+
.doc-copy-path {
|
|
36
|
+
font-size: 10px;
|
|
37
|
+
padding: 1px 6px;
|
|
38
|
+
border: 1px solid var(--border-subtle);
|
|
39
|
+
border-radius: 3px;
|
|
40
|
+
background: transparent;
|
|
41
|
+
color: var(--text-dim);
|
|
42
|
+
cursor: pointer;
|
|
43
|
+
flex-shrink: 0;
|
|
44
|
+
margin-left: 6px;
|
|
45
|
+
}
|
|
46
|
+
.doc-copy-path:hover {
|
|
47
|
+
background: var(--border-subtle);
|
|
48
|
+
color: var(--text-base);
|
|
33
49
|
}
|
|
34
50
|
.doc-content {
|
|
35
51
|
flex: 1;
|
|
@@ -57,20 +57,9 @@ function titleSupportFromEnvelope(data: MessageEnvelope['data']): DashboardActiv
|
|
|
57
57
|
return 'activity' in data || 'latestAssistant' in data ? 'ready' : 'legacy';
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const iso = raw.includes('T') ? raw : raw.replace(' ', 'T');
|
|
64
|
-
return Date.parse(iso.endsWith('Z') ? iso : iso + 'Z');
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function isActivityBusy(data: MessageEnvelope['data']): boolean {
|
|
68
|
-
if (!data || !('activity' in data)) return false;
|
|
69
|
-
const activity = data.activity;
|
|
70
|
-
if (!activity || activity.role !== 'user') return false;
|
|
71
|
-
const updatedAt = parseUtcTimestamp(activity.updatedAt);
|
|
72
|
-
if (Number.isNaN(updatedAt)) return false;
|
|
73
|
-
return Date.now() - updatedAt < BUSY_STALE_MS;
|
|
60
|
+
function isProcessBusy(data: MessageEnvelope['data']): boolean {
|
|
61
|
+
if (!data || typeof data !== 'object') return false;
|
|
62
|
+
return 'processBusy' in data && data.processBusy === true;
|
|
74
63
|
}
|
|
75
64
|
|
|
76
65
|
async function fetchLatestAssistantMessage(port: number): Promise<{
|
|
@@ -86,7 +75,7 @@ async function fetchLatestAssistantMessage(port: number): Promise<{
|
|
|
86
75
|
latest: notifiableAssistantFromEnvelope(body.data),
|
|
87
76
|
title: activityTitleFromEnvelope(body.data),
|
|
88
77
|
support: titleSupportFromEnvelope(body.data),
|
|
89
|
-
busy:
|
|
78
|
+
busy: isProcessBusy(body.data),
|
|
90
79
|
};
|
|
91
80
|
}
|
|
92
81
|
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { DashboardDetailTab, DashboardInstance, DashboardShortcutAction, DashboardSidebarMode } from './types';
|
|
2
|
+
import { panelShortcutBus } from './panels/panel-shortcut-bus';
|
|
3
|
+
import { getDesktop } from './panels/desktop-bridge';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Dependencies the manager keyboard-shortcut runner needs from <App>.
|
|
7
|
+
* Extracted from App.tsx to keep the component under the dashboard line budget;
|
|
8
|
+
* behaviour is identical — App passes current render values on every call.
|
|
9
|
+
*/
|
|
10
|
+
export interface ManagerShortcutRunnerDeps {
|
|
11
|
+
selectedInstance: DashboardInstance | null;
|
|
12
|
+
filtered: DashboardInstance[];
|
|
13
|
+
activeDetailTab: DashboardDetailTab;
|
|
14
|
+
setDrawerOpen: (open: boolean) => void;
|
|
15
|
+
handleSidebarModeChange: (mode: DashboardSidebarMode) => void;
|
|
16
|
+
handlePreview: (instance: DashboardInstance) => void;
|
|
17
|
+
selectRelativeInstance: (direction: 1 | -1) => void;
|
|
18
|
+
handleTabChange: (tab: DashboardDetailTab) => void;
|
|
19
|
+
setPreviewRefreshKey: (updater: (key: number) => number) => void;
|
|
20
|
+
handleSidebarToggle: () => void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function runManagerShortcut(action: DashboardShortcutAction, deps: ManagerShortcutRunnerDeps): void {
|
|
24
|
+
if (panelShortcutBus.dispatch(action)) return;
|
|
25
|
+
if (action === 'focusInstances') {
|
|
26
|
+
deps.handleSidebarModeChange('instances');
|
|
27
|
+
deps.setDrawerOpen(false);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (action === 'focusActiveSession') {
|
|
31
|
+
const target = deps.selectedInstance?.ok
|
|
32
|
+
? deps.selectedInstance
|
|
33
|
+
: deps.filtered.find(instance => instance.ok) || null;
|
|
34
|
+
if (target) deps.handlePreview(target);
|
|
35
|
+
else deps.handleSidebarModeChange('instances');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (action === 'focusNotes') {
|
|
39
|
+
deps.handleSidebarModeChange('notes');
|
|
40
|
+
deps.setDrawerOpen(false);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (action === 'previousInstance') {
|
|
44
|
+
deps.selectRelativeInstance(-1);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (action === 'nextInstance') {
|
|
48
|
+
deps.selectRelativeInstance(1);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (action === 'closeFocusedTab') {
|
|
52
|
+
const active = document.activeElement;
|
|
53
|
+
if (active?.closest('.browser-webview-stack, .browser-tab-strip')) {
|
|
54
|
+
document.dispatchEvent(new CustomEvent('jaw:shortcut-action', { detail: 'closeBrowserTab' }));
|
|
55
|
+
} else if (active?.closest('.terminal-panel, .xterm')) {
|
|
56
|
+
document.dispatchEvent(new CustomEvent('jaw:shortcut-action', { detail: 'closeTerminalTab' }));
|
|
57
|
+
} else if (active?.closest('.bottom-panel')) {
|
|
58
|
+
panelShortcutBus.dispatch('closeActiveBottomTab');
|
|
59
|
+
} else if (active?.closest('.right-panel')) {
|
|
60
|
+
panelShortcutBus.dispatch('toggleRightPanel');
|
|
61
|
+
}
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (action === 'switchTab1') { deps.handleTabChange('overview'); return; }
|
|
65
|
+
if (action === 'switchTab2') { deps.handleTabChange('preview'); return; }
|
|
66
|
+
if (action === 'switchTab3') { deps.handleTabChange('logs'); return; }
|
|
67
|
+
if (action === 'switchTab4') { deps.handleTabChange('settings'); return; }
|
|
68
|
+
if (action === 'previousTab' || action === 'nextTab') {
|
|
69
|
+
const tabs: DashboardDetailTab[] = ['overview', 'preview', 'logs', 'settings'];
|
|
70
|
+
const idx = tabs.indexOf(deps.activeDetailTab);
|
|
71
|
+
const dir = action === 'nextTab' ? 1 : -1;
|
|
72
|
+
deps.handleTabChange(tabs[(idx + dir + tabs.length) % tabs.length]);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (action === 'browserReload' || action === 'browserHardReload' || action === 'browserFocusUrl' || action === 'browserBack' || action === 'browserForward') {
|
|
76
|
+
const el = document.activeElement;
|
|
77
|
+
if (el?.closest('.browser-webview-stack, .browser-tab-strip, .browser-panel')) {
|
|
78
|
+
document.dispatchEvent(new CustomEvent('jaw:shortcut-action', { detail: action }));
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// Focus is NOT in the browser panel → reload acts on the preview or app.
|
|
82
|
+
// Preview focus refreshes the preview for both soft and hard (the iframe
|
|
83
|
+
// has no separate hard-reload concept).
|
|
84
|
+
if (action === 'browserReload' || action === 'browserHardReload') {
|
|
85
|
+
if (el?.closest('.preview-panel')) {
|
|
86
|
+
deps.setPreviewRefreshKey(key => key + 1);
|
|
87
|
+
} else if (action === 'browserReload') {
|
|
88
|
+
getDesktop()?.reloadWindow?.();
|
|
89
|
+
} else {
|
|
90
|
+
getDesktop()?.hardReloadWindow?.();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// browserFocusUrl / Back / Forward are browser-only → no-op outside the panel.
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (action === 'terminalClear' || action === 'terminalNewTab') {
|
|
97
|
+
const el = document.activeElement;
|
|
98
|
+
if (el?.closest('.terminal-panel, .xterm')) {
|
|
99
|
+
document.dispatchEvent(new CustomEvent('jaw:shortcut-action', { detail: action }));
|
|
100
|
+
}
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (action === 'toggleLeftSidebar') {
|
|
104
|
+
deps.handleSidebarToggle();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -134,12 +134,27 @@ export function shortcutMatches(event: KeyboardEvent, raw: string): boolean {
|
|
|
134
134
|
&& resolveEventKey(event) === parsed.key;
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
+
/**
|
|
138
|
+
* Actions whose keyboard shortcut is owned by the Electron application menu
|
|
139
|
+
* accelerator (single source of truth), so the renderer keydown matcher must
|
|
140
|
+
* NOT also match them — otherwise ⌘R fires twice (menu + keydown). The actions
|
|
141
|
+
* stay in MANAGER_SHORTCUT_ACTIONS so the menu can still dispatch them by name;
|
|
142
|
+
* only the renderer-side keyboard binding is suppressed. This also makes a
|
|
143
|
+
* persisted user keymap carrying Meta+R harmless, and preserves the browser's
|
|
144
|
+
* native ⌘R in a pure web build (no menu, no match → no preventDefault).
|
|
145
|
+
*/
|
|
146
|
+
export const RENDERER_DISABLED_SHORTCUT_ACTIONS = new Set<DashboardShortcutAction>([
|
|
147
|
+
'browserReload',
|
|
148
|
+
'browserHardReload',
|
|
149
|
+
]);
|
|
150
|
+
|
|
137
151
|
export function actionForShortcutEvent(
|
|
138
152
|
event: KeyboardEvent,
|
|
139
153
|
keymap: unknown,
|
|
140
154
|
): DashboardShortcutAction | null {
|
|
141
155
|
const shortcuts = normalizeManagerShortcutKeymap(keymap);
|
|
142
156
|
for (const action of MANAGER_SHORTCUT_ACTIONS) {
|
|
157
|
+
if (RENDERER_DISABLED_SHORTCUT_ACTIONS.has(action)) continue;
|
|
143
158
|
if (shortcutMatches(event, shortcuts[action])) return action;
|
|
144
159
|
if (MANAGER_SHORTCUT_ALIASES[action]?.some(shortcut => shortcutMatches(event, shortcut))) return action;
|
|
145
160
|
}
|
|
@@ -91,6 +91,8 @@ export type CliJawDesktopApi = {
|
|
|
91
91
|
permissions?: PermissionDiagnosticsBridgeApi | undefined;
|
|
92
92
|
shortcuts?: ShortcutBridgeApi | undefined;
|
|
93
93
|
browser?: BrowserBridgeApi | undefined;
|
|
94
|
+
reloadWindow?: (() => void) | undefined;
|
|
95
|
+
hardReloadWindow?: (() => void) | undefined;
|
|
94
96
|
};
|
|
95
97
|
|
|
96
98
|
export function getDesktop(): CliJawDesktopApi | null {
|
|
@@ -21,9 +21,9 @@ const CATEGORIES: SidebarEntry[] = [
|
|
|
21
21
|
{ id: 'channels-discord', label: 'Channels — Discord', group: 'channels' },
|
|
22
22
|
{ id: 'heartbeat', label: 'Heartbeat & schedules', group: 'automation' },
|
|
23
23
|
{ id: 'memory', label: 'Memory', group: 'automation' },
|
|
24
|
+
{ id: 'mcp', label: 'MCP servers', group: 'mcp' },
|
|
24
25
|
{ id: 'speech', label: 'Speech & keys', group: 'integrations' },
|
|
25
26
|
{ id: 'prompts', label: 'Prompts', group: 'integrations' },
|
|
26
|
-
{ id: 'mcp', label: 'MCP servers', group: 'integrations' },
|
|
27
27
|
{ id: 'browser', label: 'Browser / CDP', group: 'integrations' },
|
|
28
28
|
{ id: 'network', label: 'Network', group: 'network-security' },
|
|
29
29
|
{ id: 'permissions', label: 'Permissions', group: 'network-security' },
|
|
@@ -14,6 +14,7 @@ export type SidebarEntry = {
|
|
|
14
14
|
export const SIDEBAR_GROUP_ORDER: ReadonlyArray<SettingsCategoryGroup> = [
|
|
15
15
|
'runtime',
|
|
16
16
|
'identity',
|
|
17
|
+
'mcp',
|
|
17
18
|
'channels',
|
|
18
19
|
'automation',
|
|
19
20
|
'integrations',
|
|
@@ -24,6 +25,7 @@ export const SIDEBAR_GROUP_ORDER: ReadonlyArray<SettingsCategoryGroup> = [
|
|
|
24
25
|
export const SIDEBAR_GROUP_LABELS: Record<SettingsCategoryGroup, string> = {
|
|
25
26
|
runtime: 'Runtime',
|
|
26
27
|
identity: 'Identity',
|
|
28
|
+
mcp: 'MCP',
|
|
27
29
|
channels: 'Channels',
|
|
28
30
|
automation: 'Automation',
|
|
29
31
|
integrations: 'Integrations',
|