cli-jaw 2.1.0 → 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/orc-state.css +21 -2
- 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-DZSPGlaH.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-B4RpXXJ7.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-DnylWKO1.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-CW7NEhew.js → skills-BDVLIrVT.js} +6 -6
- package/public/dist/assets/{slash-commands-CAydTUgf.js → slash-commands-C5da3q1p.js} +1 -1
- package/public/dist/assets/slash-commands-RJWO8wJZ.js +1 -0
- package/public/dist/assets/{trace-drawer-G-KP3IbQ.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 +163 -10
- 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-DLDdZ41k.js +0 -48
- package/public/dist/assets/app-RpnKs-sT.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-C9EVOb_D.js +0 -1
- package/public/dist/assets/settings-DIG_i79X.js +0 -1
- package/public/dist/assets/settings-VCXKhhhz.js +0 -66
- package/public/dist/assets/sidebar-Bi_ktFVw.js +0 -18
- package/public/dist/assets/skills-RjRqvykb.js +0 -1
- package/public/dist/assets/slash-commands-DdXu96Zd.js +0 -1
- package/public/dist/assets/ui-CIQjTLzc.js +0 -1
- package/public/dist/assets/ui-CkHB9Jmo.js +0 -140
package/dist/src/trace/store.js
CHANGED
|
@@ -40,6 +40,11 @@ const interruptStaleStmt = db.prepare(`
|
|
|
40
40
|
UPDATE trace_runs SET status = 'interrupted', finished_at = ?, error = COALESCE(error, 'process exited before finalization')
|
|
41
41
|
WHERE status = 'running'
|
|
42
42
|
`);
|
|
43
|
+
const pruneEventsStmt = db.prepare('DELETE FROM trace_events WHERE created_at < ?');
|
|
44
|
+
const pruneRunsStmt = db.prepare('DELETE FROM trace_runs WHERE started_at < ?');
|
|
45
|
+
const countAllEventsStmt = db.prepare('SELECT COUNT(*) AS c FROM trace_events');
|
|
46
|
+
const trimEventsStmt = db.prepare('DELETE FROM trace_events WHERE rowid IN (SELECT rowid FROM trace_events ORDER BY created_at ASC LIMIT ?)');
|
|
47
|
+
const liveRunIdsStmt = db.prepare('SELECT id FROM trace_runs');
|
|
43
48
|
const seqCache = new Map();
|
|
44
49
|
function createTraceId() { return `tr_${crypto.randomUUID().replace(/-/g, '')}`; }
|
|
45
50
|
function ensureTraceDir(runId) {
|
|
@@ -131,6 +136,33 @@ export function linkTraceRunToMessage(runId, messageId) {
|
|
|
131
136
|
linkRunStmt.run(messageId, runId);
|
|
132
137
|
}
|
|
133
138
|
export function markStaleTraceRunsInterrupted() { interruptStaleStmt.run(Date.now()); }
|
|
139
|
+
// Remove on-disk spill dirs whose run no longer exists in trace_runs.
|
|
140
|
+
function pruneOrphanTraceDirs() {
|
|
141
|
+
if (!fs.existsSync(TRACE_DIR))
|
|
142
|
+
return;
|
|
143
|
+
const live = new Set(liveRunIdsStmt.all().map((r) => r.id));
|
|
144
|
+
for (const name of fs.readdirSync(TRACE_DIR)) {
|
|
145
|
+
if (TRACE_ID_RE.test(name) && !live.has(name))
|
|
146
|
+
fs.rmSync(join(TRACE_DIR, name), { recursive: true, force: true });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Delete trace data older than retentionDays, then trim to maxRows, then sweep orphan spill dirs.
|
|
150
|
+
export function pruneTraceEvents(retentionDays = 7, maxRows = 50_000) {
|
|
151
|
+
try {
|
|
152
|
+
const cutoff = Date.now() - retentionDays * 86_400_000;
|
|
153
|
+
let deletedEvents = pruneEventsStmt.run(cutoff).changes;
|
|
154
|
+
const deletedRuns = pruneRunsStmt.run(cutoff).changes;
|
|
155
|
+
const total = Number(countAllEventsStmt.get().c);
|
|
156
|
+
if (total > maxRows)
|
|
157
|
+
deletedEvents += trimEventsStmt.run(total - maxRows).changes;
|
|
158
|
+
pruneOrphanTraceDirs();
|
|
159
|
+
return { deletedEvents, deletedRuns };
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
console.error('[trace] prune failed:', error instanceof Error ? error.message : String(error));
|
|
163
|
+
return { deletedEvents: 0, deletedRuns: 0 };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
134
166
|
export function getTraceRun(runId) {
|
|
135
167
|
if (!TRACE_ID_RE.test(runId))
|
|
136
168
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/trace/store.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/trace/store.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAEnC,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhE,MAAM,sBAAsB,GAAG,MAAM,CAAC;AACtC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC3C,MAAM,WAAW,GAAG,2BAA2B,CAAC;AAchD,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC;;;;CAI5B,CAAC,CAAC;AACH,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC;;;;CAI9B,CAAC,CAAC;AACH,MAAM,mBAAmB,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;CAOtC,CAAC,CAAC;AACH,MAAM,eAAe,GAAG,EAAE,CAAC,OAAO,CAAC,4FAA4F,CAAC,CAAC;AACjI,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC;AACpF,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;AACvE,MAAM,cAAc,GAAG,EAAE,CAAC,OAAO,CAAC;;;CAGjC,CAAC,CAAC;AACH,MAAM,eAAe,GAAG,EAAE,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC;AAClG,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC;AAC3F,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC;AAC3F,MAAM,kBAAkB,GAAG,EAAE,CAAC,OAAO,CAAC;;;CAGrC,CAAC,CAAC;AACH,MAAM,eAAe,GAAG,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC;AACpF,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;AAChF,MAAM,kBAAkB,GAAG,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;AAChF,MAAM,cAAc,GAAG,EAAE,CAAC,OAAO,CAAC,0GAA0G,CAAC,CAAC;AAC9I,MAAM,cAAc,GAAG,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;AAC/D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE3C,SAAS,aAAa,KAAa,OAAO,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1F,SAAS,cAAc,CAAC,KAAa;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACnC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,OAAO,GAAG,CAAC;AACf,CAAC;AACD,SAAS,OAAO,CAAC,KAAa;IAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QAAC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IACxF,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAwC,CAAC;IACzE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACvC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC;AAChB,CAAC;AACD,SAAS,WAAW,CAAC,OAAe;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACvE,OAAO,QAAQ,CAAC;AACpB,CAAC;AACD,SAAS,cAAc,CAAC,KAAa,EAAE,GAAW,EAAE,OAAe;IAG/D,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,sBAAsB;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAClI,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACjF,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAoB;IAC9C,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,OAAO,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI,EAClF,KAAK,CAAC,UAAU,IAAI,IAAI,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI,EAAE,KAAK,CAAC,QAAQ,IAAI,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9F,OAAO,EAAE,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAsB;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAC/F,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,IAAI,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1I,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1D,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC9H,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAChG,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAe,EAAE,GAAiB,EAAE,SAAS,GAAG,MAAM;IACjF,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IACpD,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,KAAK,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAClK,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,KAAK,UAAU,CAAC;IACjD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAChB,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1D,eAAe,EAAE,OAAO,IAAI,OAAO,CAAC,eAAe,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW;QACrF,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU;KACxE,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AAChB,CAAC;AACD,MAAM,UAAU,qBAAqB,CAAC,GAA6C;IAC/E,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO;IAC3D,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO;QAAE,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;AACvF,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,KAAgC,EAAE,MAAsB,EAAE,KAAqB;IAC5G,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO;IAC/C,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9D,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AACD,MAAM,UAAU,qBAAqB,CAAC,KAAgC,EAAE,SAAiB;IACrF,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;QAAE,OAAO;IAC/E,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC;AACD,MAAM,UAAU,6BAA6B,KAAW,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAE7F,sEAAsE;AACtE,SAAS,oBAAoB;IACzB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO;IACtC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAE,cAAc,CAAC,GAAG,EAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtH,CAAC;AACL,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,gBAAgB,CAAC,aAAa,GAAG,CAAC,EAAE,OAAO,GAAG,MAAM;IAChE,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,UAAU,CAAC;QACvD,IAAI,aAAa,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;QACxD,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;QACtD,MAAM,KAAK,GAAG,MAAM,CAAE,kBAAkB,CAAC,GAAG,EAAoB,CAAC,CAAC,CAAC,CAAC;QACpE,IAAI,KAAK,GAAG,OAAO;YAAE,aAAa,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC;QAClF,oBAAoB,EAAE,CAAC;QACvB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/F,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAChD,CAAC;AACL,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,KAAa;IACrC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAQ,UAAU,CAAC,GAAG,CAAC,KAAK,CAA6B,IAAI,IAAI,CAAC;AACtE,CAAC;AACD,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE;IACjE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAmC,CAAC;IAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAoB,EAAE,CAAC;AAChI,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,GAAW;IACpD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAA8B,CAAC;IACtE,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,GAAG,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;QAC9D,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-engine.js","sourceRoot":"","sources":["../../../src/types/cli-engine.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,+DAA+D;AAC/D,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,wEAAwE;AACxE,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,kCAAkC;AAClC,EAAE;AACF,uBAAuB;AACvB,6BAA6B;AAC7B,uEAAuE;AACvE,yDAAyD;AACzD,+DAA+D;
|
|
1
|
+
{"version":3,"file":"cli-engine.js","sourceRoot":"","sources":["../../../src/types/cli-engine.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,+DAA+D;AAC/D,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,wEAAwE;AACxE,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,kCAAkC;AAClC,EAAE;AACF,uBAAuB;AACvB,6BAA6B;AAC7B,uEAAuE;AACvE,yDAAyD;AACzD,+DAA+D;AAgB/D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,KAAK;IACL,MAAM;IACN,QAAQ;IACR,UAAU;IACV,OAAO;IACP,WAAW;IACX,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,WAAW;IACX,UAAU;CAC2B,CAAC;AAE1C,MAAM,UAAU,WAAW,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,WAAiC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3F,CAAC"}
|
|
@@ -6,13 +6,13 @@ export function assertBossOnlyDispatch(isBoss) {
|
|
|
6
6
|
throw new Error('Only the Boss agent can dispatch jaw employees');
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
-
export function assertNoImplementationDelegation(phase, taskBody) {
|
|
10
|
-
if (phase === 'B' && hasImplementationDelegation(taskBody)) {
|
|
11
|
-
throw new Error('B-phase employees are read-only verifiers; implementation delegation is forbidden');
|
|
9
|
+
export function assertNoImplementationDelegation(phase, taskBody, allowWrite = false) {
|
|
10
|
+
if (phase === 'B' && !allowWrite && hasImplementationDelegation(taskBody)) {
|
|
11
|
+
throw new Error('B-phase employees are read-only verifiers; implementation delegation is forbidden. Use --mutable to allow writes.');
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
export function assertReadOnlyAudit(phase, taskBody) {
|
|
15
|
-
if (phase === 'A') {
|
|
14
|
+
export function assertReadOnlyAudit(phase, taskBody, allowWrite = false) {
|
|
15
|
+
if (phase === 'A' && !allowWrite) {
|
|
16
16
|
const lc = taskBody.toLowerCase();
|
|
17
17
|
if (lc.includes('write file') || lc.includes('create file') || lc.includes('modify code')) {
|
|
18
18
|
throw new Error('A-phase audit must be read-only');
|
|
@@ -22,8 +22,8 @@ export function assertReadOnlyAudit(phase, taskBody) {
|
|
|
22
22
|
export function validateDispatchTask(opts) {
|
|
23
23
|
try {
|
|
24
24
|
assertBossOnlyDispatch(opts.isBoss);
|
|
25
|
-
assertNoImplementationDelegation(opts.phase, opts.taskBody);
|
|
26
|
-
assertReadOnlyAudit(opts.phase, opts.taskBody);
|
|
25
|
+
assertNoImplementationDelegation(opts.phase, opts.taskBody, opts.allowWrite);
|
|
26
|
+
assertReadOnlyAudit(opts.phase, opts.taskBody, opts.allowWrite);
|
|
27
27
|
return { ok: true };
|
|
28
28
|
}
|
|
29
29
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"employee-boundary.js","sourceRoot":"","sources":["../../../src/workflows/employee-boundary.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,iCAAiC;AAGjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,sBAAsB,CAAC,MAAe;IAClD,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACtE,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAAmB,EAAE,QAAgB;
|
|
1
|
+
{"version":3,"file":"employee-boundary.js","sourceRoot":"","sources":["../../../src/workflows/employee-boundary.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,iCAAiC;AAGjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,sBAAsB,CAAC,MAAe;IAClD,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACtE,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAAmB,EAAE,QAAgB,EAAE,UAAU,GAAG,KAAK;IACtG,IAAI,KAAK,KAAK,GAAG,IAAI,CAAC,UAAU,IAAI,2BAA2B,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,mHAAmH,CAAC,CAAC;IACzI,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAmB,EAAE,QAAgB,EAAE,UAAU,GAAG,KAAK;IACzF,IAAI,KAAK,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACxF,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACvD,CAAC;IACL,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAKpC;IACG,IAAI,CAAC;QACD,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,gCAAgC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7E,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;IACxD,CAAC;AACL,CAAC"}
|
|
@@ -10,11 +10,20 @@ export function buildHandoff(opts) {
|
|
|
10
10
|
? 'advisory'
|
|
11
11
|
: (opts.phase === 'A' || opts.phase === 'B') ? opts.phase : 'advisory';
|
|
12
12
|
const verdictTokens = VERDICT_TOKENS[verdictKey] ?? ['PASS', 'FAIL'];
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
?
|
|
17
|
-
: '
|
|
13
|
+
let modeHeader;
|
|
14
|
+
if (opts.mutable) {
|
|
15
|
+
const scopeNote = opts.scope
|
|
16
|
+
? `Files inside \`${opts.scope}\` may be created or modified.`
|
|
17
|
+
: 'Files in the project may be created or modified.';
|
|
18
|
+
modeHeader = `WRITE-ENABLED session. ${scopeNote} Protected files (.git, .env, settings.json) are still blocked.`;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
modeHeader = opts.mode === 'read-only'
|
|
22
|
+
? 'READ-ONLY verification. Do not modify files.'
|
|
23
|
+
: opts.mode === 'verification'
|
|
24
|
+
? 'VERIFICATION only. Do not implement new code.'
|
|
25
|
+
: 'Advisory review. Results are non-binding.';
|
|
26
|
+
}
|
|
18
27
|
const taskBody = [
|
|
19
28
|
`Project root: ${opts.projectRoot}`,
|
|
20
29
|
'',
|
|
@@ -32,17 +41,8 @@ export function buildHandoff(opts) {
|
|
|
32
41
|
verdictTokens,
|
|
33
42
|
};
|
|
34
43
|
}
|
|
44
|
+
const IMPL_DELEGATION_PATTERN = /\b(implement(?:\s+the\s+feature|\s+this|\s+code)?|write\s+(?:the\s+)?(?:code|function)|create\s+(?:the\s+)?file|build\s+(?:the\s+)?(?:feature|module)|add\s+(?:the\s+)?(?:method|function|class))\b/i;
|
|
35
45
|
export function hasImplementationDelegation(taskBody) {
|
|
36
|
-
|
|
37
|
-
const delegationPatterns = [
|
|
38
|
-
'implement the feature',
|
|
39
|
-
'implement this',
|
|
40
|
-
'write the code',
|
|
41
|
-
'create the file',
|
|
42
|
-
'write the function',
|
|
43
|
-
'implement code',
|
|
44
|
-
'build the module',
|
|
45
|
-
];
|
|
46
|
-
return delegationPatterns.some(p => lc.includes(p));
|
|
46
|
+
return IMPL_DELEGATION_PATTERN.test(taskBody);
|
|
47
47
|
}
|
|
48
48
|
//# sourceMappingURL=handoff.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../../src/workflows/handoff.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,iCAAiC;AAKjC,MAAM,cAAc,GAA6B;IAC7C,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IACnB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;IACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;CAClC,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../../src/workflows/handoff.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,iCAAiC;AAKjC,MAAM,cAAc,GAA6B;IAC7C,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IACnB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;IACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;CAClC,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,IAO5B;IACG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,UAAU;QACvC,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;IAE3E,MAAM,aAAa,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAErE,IAAI,UAAkB,CAAC;IACvB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK;YACxB,CAAC,CAAC,kBAAkB,IAAI,CAAC,KAAK,gCAAgC;YAC9D,CAAC,CAAC,kDAAkD,CAAC;QACzD,UAAU,GAAG,0BAA0B,SAAS,iEAAiE,CAAC;IACtH,CAAC;SAAM,CAAC;QACJ,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,WAAW;YAClC,CAAC,CAAC,8CAA8C;YAChD,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc;gBAC1B,CAAC,CAAC,+CAA+C;gBACjD,CAAC,CAAC,2CAA2C,CAAC;IAC1D,CAAC;IAED,MAAM,QAAQ,GAAG;QACb,iBAAiB,IAAI,CAAC,WAAW,EAAE;QACnC,EAAE;QACF,UAAU;QACV,qFAAqF;QACrF,6BAA6B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACxD,EAAE;QACF,IAAI,CAAC,eAAe;KACvB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;QACH,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ;QACR,aAAa;KAChB,CAAC;AACN,CAAC;AAED,MAAM,uBAAuB,GAAG,sMAAsM,CAAC;AAEvO,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IACxD,OAAO,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Physical directory sandboxing and post-dispatch scope verification.
|
|
2
|
+
// Uses only Node.js built-ins — no new dependencies.
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import { execSync } from 'child_process';
|
|
6
|
+
const PROTECTED_PATTERNS = [
|
|
7
|
+
/\.git\//,
|
|
8
|
+
/\.env$/,
|
|
9
|
+
/settings\.json$/,
|
|
10
|
+
/package-lock\.json$/,
|
|
11
|
+
/yarn\.lock$/,
|
|
12
|
+
/pnpm-lock\.yaml$/,
|
|
13
|
+
];
|
|
14
|
+
export function normalizeScope(projectRoot, scopePath) {
|
|
15
|
+
const resolvedRoot = path.resolve(projectRoot);
|
|
16
|
+
const resolvedScope = path.resolve(projectRoot, scopePath);
|
|
17
|
+
if (!resolvedScope.startsWith(resolvedRoot)) {
|
|
18
|
+
throw new Error(`Security Error: Scope [${scopePath}] escapes project root.`);
|
|
19
|
+
}
|
|
20
|
+
if (fs.existsSync(resolvedScope)) {
|
|
21
|
+
const realScope = fs.realpathSync(resolvedScope);
|
|
22
|
+
if (!realScope.startsWith(resolvedRoot)) {
|
|
23
|
+
throw new Error(`Security Error: Realpath of scope is outside project root.`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return resolvedScope;
|
|
27
|
+
}
|
|
28
|
+
export function isProtectedPath(filePath) {
|
|
29
|
+
return PROTECTED_PATTERNS.some(regex => regex.test(filePath));
|
|
30
|
+
}
|
|
31
|
+
export function postDispatchDiffCheck(projectRoot, allowedScope) {
|
|
32
|
+
if (!allowedScope)
|
|
33
|
+
return { ok: true, modifiedOutside: [] };
|
|
34
|
+
const diffOutput = execSync('git diff --name-only', { cwd: projectRoot }).toString();
|
|
35
|
+
const modifiedFiles = diffOutput.split('\n').filter(Boolean);
|
|
36
|
+
const absoluteAllowedScope = path.resolve(projectRoot, allowedScope);
|
|
37
|
+
const outsideFiles = modifiedFiles.filter(file => {
|
|
38
|
+
const absFile = path.resolve(projectRoot, file);
|
|
39
|
+
return !absFile.startsWith(absoluteAllowedScope) || isProtectedPath(file);
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
ok: outsideFiles.length === 0,
|
|
43
|
+
modifiedOutside: outsideFiles,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=scope-sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-sandbox.js","sourceRoot":"","sources":["../../../src/workflows/scope-sandbox.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,qDAAqD;AAErD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,kBAAkB,GAAG;IACvB,SAAS;IACT,QAAQ;IACR,iBAAiB;IACjB,qBAAqB;IACrB,aAAa;IACb,kBAAkB;CACrB,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,SAAiB;IACjE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAE3D,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,yBAAyB,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAClF,CAAC;IACL,CAAC;IAED,OAAO,aAAa,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC5C,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,qBAAqB,CACjC,WAAmB,EAAE,YAAqB;IAE1C,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;IAE5D,MAAM,UAAU,GAAG,QAAQ,CAAC,sBAAsB,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrF,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE7D,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,OAAO;QACH,EAAE,EAAE,YAAY,CAAC,MAAM,KAAK,CAAC;QAC7B,eAAe,EAAE,YAAY;KAChC,CAAC;AACN,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cli-jaw",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.2",
|
|
4
4
|
"description": "Personal AI assistant powered by Antigravity, AI-E, Claude, Claude E, Codex, Codex App, Cursor, Gemini, Grok, OpenCode, and Copilot — Web, Terminal, Telegram, and Discord interfaces with 107 built-in skills",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<!-- Source: https://kiro.dev/icon.svg (official Kiro app icon, fetched 2026-05-31) -->
|
|
2
|
+
<svg width="1em" height="1em" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<title>Kiro</title>
|
|
4
|
+
<g transform="scale(0.02)">
|
|
5
|
+
<rect width="1200" height="1200" rx="260" fill="#9046FF"/>
|
|
6
|
+
<mask id="kiroColorMask" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="272" y="202" width="655" height="796">
|
|
7
|
+
<path d="M926.578 202.793H272.637V997.857H926.578V202.793Z" fill="white"/>
|
|
8
|
+
</mask>
|
|
9
|
+
<g mask="url(#kiroColorMask)">
|
|
10
|
+
<path d="M398.554 818.914C316.315 1001.03 491.477 1046.74 620.672 940.156C658.687 1059.66 801.052 970.473 852.234 877.795C964.787 673.567 919.318 465.357 907.64 422.374C827.637 129.443 427.623 128.946 358.8 423.865C342.651 475.544 342.402 534.18 333.458 595.051C328.986 625.86 325.507 645.488 313.83 677.785C306.873 696.424 297.68 712.819 282.773 740.645C259.915 783.881 269.604 867.113 387.87 823.883L399.051 818.914H398.554Z" fill="white"/>
|
|
11
|
+
<path d="M636.123 549.353C603.328 549.353 598.359 510.097 598.359 486.742C598.359 465.623 602.086 448.977 609.293 438.293C615.504 428.852 624.697 424.131 636.123 424.131C647.555 424.131 657.492 428.852 664.447 438.541C672.398 449.474 676.623 466.12 676.623 486.742C676.623 525.998 661.471 549.353 636.375 549.353H636.123Z" fill="black"/>
|
|
12
|
+
<path d="M771.24 549.353C738.445 549.353 733.477 510.097 733.477 486.742C733.477 465.623 737.203 448.977 744.41 438.293C750.621 428.852 759.814 424.131 771.24 424.131C782.672 424.131 792.609 428.852 799.564 438.541C807.516 449.474 811.74 466.12 811.74 486.742C811.74 525.998 796.588 549.353 771.492 549.353H771.24Z" fill="black"/>
|
|
13
|
+
</g>
|
|
14
|
+
</g>
|
|
15
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!-- Source: https://kiro.dev/icon.svg (official Kiro mascot mark, fetched 2026-05-31) -->
|
|
2
|
+
<svg width="1em" height="1em" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<title>Kiro</title>
|
|
4
|
+
<g transform="scale(0.02)">
|
|
5
|
+
<mask id="kiroMonoMask" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="272" y="202" width="655" height="796">
|
|
6
|
+
<path d="M926.578 202.793H272.637V997.857H926.578V202.793Z" fill="white"/>
|
|
7
|
+
</mask>
|
|
8
|
+
<g mask="url(#kiroMonoMask)">
|
|
9
|
+
<path d="M398.554 818.914C316.315 1001.03 491.477 1046.74 620.672 940.156C658.687 1059.66 801.052 970.473 852.234 877.795C964.787 673.567 919.318 465.357 907.64 422.374C827.637 129.443 427.623 128.946 358.8 423.865C342.651 475.544 342.402 534.18 333.458 595.051C328.986 625.86 325.507 645.488 313.83 677.785C306.873 696.424 297.68 712.819 282.773 740.645C259.915 783.881 269.604 867.113 387.87 823.883L399.051 818.914H398.554Z" fill="currentColor"/>
|
|
10
|
+
<path d="M636.123 549.353C603.328 549.353 598.359 510.097 598.359 486.742C598.359 465.623 602.086 448.977 609.293 438.293C615.504 428.852 624.697 424.131 636.123 424.131C647.555 424.131 657.492 428.852 664.447 438.541C672.398 449.474 676.623 466.12 676.623 486.742C676.623 525.998 661.471 549.353 636.375 549.353H636.123Z" fill="black"/>
|
|
11
|
+
<path d="M771.24 549.353C738.445 549.353 733.477 510.097 733.477 486.742C733.477 465.623 737.203 448.977 744.41 438.293C750.621 428.852 759.814 424.131 771.24 424.131C782.672 424.131 792.609 428.852 799.564 438.541C807.516 449.474 811.74 466.12 811.74 486.742C811.74 525.998 796.588 549.353 771.492 549.353H771.24Z" fill="black"/>
|
|
12
|
+
</g>
|
|
13
|
+
</g>
|
|
14
|
+
</svg>
|
package/public/css/modals.css
CHANGED
|
@@ -461,3 +461,82 @@
|
|
|
461
461
|
.hb-add:hover {
|
|
462
462
|
opacity: .9;
|
|
463
463
|
}
|
|
464
|
+
|
|
465
|
+
/* ── MCP Modal overrides ── */
|
|
466
|
+
.mcp-modal-overlay {
|
|
467
|
+
background: rgba(0, 0, 0, 0.85);
|
|
468
|
+
backdrop-filter: blur(16px);
|
|
469
|
+
-webkit-backdrop-filter: blur(16px);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
.mcp-modal-box {
|
|
473
|
+
background: var(--surface);
|
|
474
|
+
backdrop-filter: none;
|
|
475
|
+
-webkit-backdrop-filter: none;
|
|
476
|
+
width: 620px;
|
|
477
|
+
max-height: 85vh;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
.mcp-modal-box .modal-header {
|
|
481
|
+
font-size: 14px;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
.mcp-active-row {
|
|
485
|
+
display: flex;
|
|
486
|
+
align-items: flex-start;
|
|
487
|
+
gap: 8px;
|
|
488
|
+
padding: 10px 0;
|
|
489
|
+
border-bottom: 1px solid var(--border);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
.mcp-active-name {
|
|
493
|
+
font-weight: 600;
|
|
494
|
+
min-width: 80px;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
.mcp-active-detail {
|
|
498
|
+
flex: 1;
|
|
499
|
+
opacity: 0.6;
|
|
500
|
+
font-size: 0.9em;
|
|
501
|
+
word-break: break-all;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
.mcp-active-tag {
|
|
505
|
+
opacity: 0.5;
|
|
506
|
+
font-size: 0.85em;
|
|
507
|
+
white-space: nowrap;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
.mcp-active-remove {
|
|
511
|
+
color: var(--color-error);
|
|
512
|
+
font-size: 0.85em;
|
|
513
|
+
white-space: nowrap;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
.mcp-help-inner {
|
|
517
|
+
background: var(--surface);
|
|
518
|
+
border: 1px solid var(--border);
|
|
519
|
+
border-radius: var(--radius-xl);
|
|
520
|
+
padding: 16px;
|
|
521
|
+
max-width: 460px;
|
|
522
|
+
max-height: 70vh;
|
|
523
|
+
overflow-y: auto;
|
|
524
|
+
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
|
|
525
|
+
position: relative;
|
|
526
|
+
z-index: 1001;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
.mcp-help-overlay {
|
|
530
|
+
position: fixed;
|
|
531
|
+
inset: 0;
|
|
532
|
+
background: rgba(0, 0, 0, 0.6);
|
|
533
|
+
z-index: 1000;
|
|
534
|
+
display: flex;
|
|
535
|
+
align-items: center;
|
|
536
|
+
justify-content: center;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
.mcp-help-inner h4 { margin: 0 0 8px; font-size: 13px; }
|
|
540
|
+
.mcp-help-inner p { margin: 4px 0; font-size: 12px; opacity: 0.85; }
|
|
541
|
+
.mcp-help-inner code { background: var(--bg); padding: 1px 4px; border-radius: 3px; font-size: 11px; }
|
|
542
|
+
.mcp-help-inner pre { background: var(--bg); padding: 8px; border-radius: 6px; font-size: 11px; overflow-x: auto; margin: 6px 0; }
|
package/public/css/orc-state.css
CHANGED
|
@@ -240,10 +240,29 @@ body[data-orc-state].orc-pulse #chatMessages {
|
|
|
240
240
|
}
|
|
241
241
|
|
|
242
242
|
/* ─── Interview Panel ─── */
|
|
243
|
-
.interview-panel { margin: 0 auto 8px; max-width: 600px;
|
|
243
|
+
.interview-panel { margin: 0 auto 8px; max-width: 600px; font-size: 0.82rem; }
|
|
244
244
|
.interview-panel[hidden] { display: none; }
|
|
245
|
+
|
|
246
|
+
/* One-line toggle header — sits right under the IPABCD bar */
|
|
247
|
+
.iv-toggle {
|
|
248
|
+
display: flex; align-items: center; gap: 6px; width: 100%;
|
|
249
|
+
background: var(--bg-secondary, rgba(255,255,255,0.04));
|
|
250
|
+
border: 1px solid var(--border-color, rgba(255,255,255,0.08));
|
|
251
|
+
border-radius: 8px; padding: 4px 10px; cursor: pointer;
|
|
252
|
+
color: var(--text-secondary, inherit); font: inherit; font-size: 0.78rem;
|
|
253
|
+
text-align: left;
|
|
254
|
+
}
|
|
255
|
+
.iv-toggle:hover { background: var(--bg-hover, rgba(255,255,255,0.08)); }
|
|
256
|
+
.iv-chevron { display: inline-block; opacity: 0.65; transition: transform 0.15s ease; }
|
|
257
|
+
.interview-panel:not(.collapsed) .iv-chevron { transform: rotate(90deg); }
|
|
258
|
+
.iv-summary { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
259
|
+
.iv-known-count { color: var(--accent-green, #4caf50); }
|
|
260
|
+
.iv-unknown-count { color: var(--accent-yellow, #ff9800); }
|
|
261
|
+
|
|
262
|
+
/* Expandable body — capped height so it never buries the chat */
|
|
263
|
+
.iv-body { display: flex; gap: 16px; margin-top: 6px; max-height: 220px; overflow-y: auto; }
|
|
264
|
+
.interview-panel.collapsed .iv-body { display: none; }
|
|
245
265
|
.iv-section { flex: 1; }
|
|
246
266
|
.iv-section ul { list-style: none; padding: 0; margin: 4px 0; }
|
|
247
267
|
.iv-known::before { content: '✓ '; color: var(--accent-green, #4caf50); }
|
|
248
268
|
.iv-unknown::before { content: '? '; color: var(--accent-yellow, #ff9800); }
|
|
249
|
-
.iv-round { font-size: 0.75rem; opacity: 0.6; align-self: flex-end; }
|
package/public/css/sidebar.css
CHANGED
|
@@ -16,6 +16,91 @@
|
|
|
16
16
|
content: '▾';
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
.cli-status-toolbar {
|
|
20
|
+
display: flex;
|
|
21
|
+
align-items: center;
|
|
22
|
+
gap: var(--space-2);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.cli-status-toolbar .cli-status-header {
|
|
26
|
+
flex: 1;
|
|
27
|
+
min-width: 0;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.btn-refresh {
|
|
31
|
+
transition:
|
|
32
|
+
color var(--duration-fast),
|
|
33
|
+
border-color var(--duration-fast),
|
|
34
|
+
background var(--duration-fast),
|
|
35
|
+
transform var(--duration-fast);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.btn-refresh:active:not(:disabled) {
|
|
39
|
+
transform: translateY(1px);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.btn-refresh:disabled {
|
|
43
|
+
cursor: wait;
|
|
44
|
+
opacity: 0.72;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.btn-refresh.is-refreshing {
|
|
48
|
+
color: var(--accent);
|
|
49
|
+
border-color: color-mix(in oklch, var(--accent) 38%, var(--border));
|
|
50
|
+
background: color-mix(in oklch, var(--accent) 10%, transparent);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.btn-refresh.is-refreshing svg {
|
|
54
|
+
animation: cliRefreshSpin 0.85s linear infinite;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.btn-refresh.is-success {
|
|
58
|
+
color: var(--success);
|
|
59
|
+
border-color: color-mix(in oklch, var(--success) 42%, var(--border));
|
|
60
|
+
background: var(--success-dim);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.btn-refresh.is-error {
|
|
64
|
+
color: var(--error);
|
|
65
|
+
border-color: color-mix(in oklch, var(--error) 42%, var(--border));
|
|
66
|
+
background: var(--error-dim);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.cli-refresh-state {
|
|
70
|
+
min-height: 13px;
|
|
71
|
+
max-width: 86px;
|
|
72
|
+
color: var(--text-dim);
|
|
73
|
+
font-family: var(--font-mono);
|
|
74
|
+
font-size: 10px;
|
|
75
|
+
line-height: 1.2;
|
|
76
|
+
overflow: hidden;
|
|
77
|
+
text-align: right;
|
|
78
|
+
text-overflow: ellipsis;
|
|
79
|
+
white-space: nowrap;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.cli-refresh-state[data-state="refreshing"] {
|
|
83
|
+
color: var(--accent);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.cli-refresh-state[data-state="success"] {
|
|
87
|
+
color: var(--success);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.cli-refresh-state[data-state="error"] {
|
|
91
|
+
color: var(--error);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@keyframes cliRefreshSpin {
|
|
95
|
+
to { transform: rotate(360deg); }
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
@media (prefers-reduced-motion: reduce) {
|
|
99
|
+
.btn-refresh.is-refreshing svg {
|
|
100
|
+
animation: none;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
19
104
|
/* ── Settings Tab ── */
|
|
20
105
|
.cli-status-row {
|
|
21
106
|
display: flex;
|
package/public/css/variables.css
CHANGED
|
@@ -495,8 +495,8 @@ select:focus-visible {
|
|
|
495
495
|
/* Queue badge on send button */
|
|
496
496
|
.queue-badge {
|
|
497
497
|
position: absolute;
|
|
498
|
-
top:
|
|
499
|
-
right:
|
|
498
|
+
top: 6px;
|
|
499
|
+
right: 6px;
|
|
500
500
|
background: var(--warning);
|
|
501
501
|
color: var(--bg);
|
|
502
502
|
border-radius: var(--radius-full);
|
|
@@ -1 +1 @@
|
|
|
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{i as c,s as l}from"./fields-C-y_8RgA.js";import{a as u,n as d,o as f}from"./Permissions-BvtVczZS.js";import{a as p,i as m,n as h,r as g,t as _}from"./agent-meta-BhEbjy4P.js";import{t as v}from"./path-utils-ztBHV7MX.js";var y=e(t(),1),b=n();function x({cli:e,cliOptions:t,provider:n=``,providerOptions:r=[],model:a,modelOptions:o,effort:s,effortOptions:u,workingDir:d,workingDirError:f,onCliChange:p,onProviderChange:m,onModelChange:g,onEffortChange:v,onWorkingDirChange:y}){return(0,b.jsx)(i,{title:`Agent runtime`,hint:`Active CLI, model, effort, and workspace used by this instance.`,children:(0,b.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,b.jsx)(c,{id:`agent-cli`,label:`Active CLI`,value:e,options:[...t.filter(e=>_.includes(e)).map(e=>({value:e,label:h(e).label||e})),...t.filter(e=>!_.includes(e)).map(e=>({value:e,label:h(e).label||e}))],collapsedAfter:t.filter(e=>_.includes(e)).length,onChange:p}),e===`ai-e`&&r.length>0?(0,b.jsx)(c,{id:`agent-ai-e-provider`,label:`AI-E provider`,value:n,options:r.map(e=>({value:e,label:e})),onChange:e=>m?.(e)}):null,(0,b.jsx)(c,{id:`agent-model`,label:`Active model`,value:a,options:o.length>0?o:[{value:``,label:`(default)`}],onChange:g}),(0,b.jsx)(c,{id:`agent-effort`,label:`Effort`,value:s,options:[{value:``,label:`(default)`},...u.map(e=>({value:e,label:e}))],disabled:u.length===0,onChange:v}),(0,b.jsx)(l,{id:`agent-workingDir`,label:`Working directory`,value:d,error:f,placeholder:`/path/to/project`,onChange:y})]})})}var S=[{value:`auto`,label:`Auto`},{value:`custom`,label:`Custom allowlist`}];function C({value:e,onChange:t}){let n=u(e),r=n.mode===`custom`?`custom`:`auto`,a=n.mode===`custom`?n.tokens:[],o=n.mode===`custom`?`${a.length} explicit token${a.length===1?``:`s`}`:`Runtime resolves allowed capabilities`;return(0,b.jsxs)(i,{title:`Permissions`,hint:`Quick runtime mode. Open Permissions for detailed allowlist editing.`,children:[(0,b.jsx)(c,{id:`agent-permissions-mode`,label:`Mode`,value:r,options:S,onChange:e=>{t(e===`auto`?`auto`:a.length>0&&d(a)?a:f(null))}}),(0,b.jsx)(`p`,{className:`settings-agent-note`,children:o})]})}function w({activeCli:e,flushCli:t,flushModel:n,cliOptions:r,modelOptions:a,loading:o,error:s,onFlushCliChange:l,onFlushModelChange:u}){let d=t||e,f=d?h(d).label||d:`active`;return(0,b.jsx)(i,{title:`Flush Agent`,hint:`Separate summary agent used for context flush and compact work.`,children:(0,b.jsxs)(`details`,{className:`settings-agent-flush`,children:[(0,b.jsxs)(`summary`,{children:[(0,b.jsx)(`span`,{children:`Flush runtime`}),(0,b.jsxs)(`code`,{children:[f,n&&n!==`default`?` / ${n}`:``]})]}),o?(0,b.jsx)(`p`,{className:`settings-agent-note`,children:`Loading flush settings...`}):null,s?(0,b.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:s}):null,(0,b.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,b.jsx)(c,{id:`agent-flush-cli`,label:`Flush CLI`,value:t,options:[{value:``,label:`(active CLI)`},...r.map(e=>({value:e,label:h(e).label||e}))],onChange:l}),(0,b.jsx)(c,{id:`agent-flush-model`,label:`Flush model`,value:n,options:[{value:``,label:`(default)`},...a],onChange:u})]})]})})}function T(e){return e.source===`static`||e.id.startsWith(`static:`)}function E(){return`new:${Date.now().toString(36)}:${Math.random().toString(36).slice(2,8)}`}function D(e){let t=e[0]||`claude`;return{id:E(),name:`New Agent`,cli:t,model:`default`,role:``,status:`idle`,source:`db`}}function ee(e){return Array.isArray(e)?e.map(O).filter(Boolean):e.data.map(O).filter(Boolean)}function O(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.id==`string`?t.id:``,r=typeof t.name==`string`?t.name:``;if(!n||!r)return null;let i=t.source===`static`||n.startsWith(`static:`)?`static`:`db`,a={id:n,name:r,cli:typeof t.cli==`string`&&t.cli?t.cli:`claude`,model:typeof t.model==`string`&&t.model?t.model:`default`,role:typeof t.role==`string`?t.role:``,source:i};return typeof t.status==`string`&&(a.status=t.status),a}function k(e){return e.name.trim()?e.cli.trim()?e.model.trim()?null:`Model is required`:`CLI is required`:`Name is required`}function A(e){return e.some(e=>k(e)!==null)}function j(e,t){return JSON.stringify(e.map(L))===JSON.stringify(t.map(L))}function M(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Set(t.map(e=>e.id)),i=[],a=[],o=[];for(let e of t){let t=n.get(e.id);if(!t||e.id.startsWith(`new:`)){i.push(e);continue}let r=F(t,e);Object.keys(r).length>0&&a.push({before:t,after:e,patch:r})}for(let t of e)!r.has(t.id)&&!T(t)&&o.push(t);return{added:i,updated:a,removed:o}}function N(e,t){let n=M(e,t);return{added:n.added.length,updated:n.updated.length,removed:n.removed.length}}async function P(e,t,n){let r=M(t,n);for(let t of r.removed)await e.delete(`/api/employees/${encodeURIComponent(t.id)}`);for(let t of r.added)await e.post(`/api/employees`,I(t));for(let t of r.updated)await e.put(`/api/employees/${encodeURIComponent(t.after.id)}`,t.patch)}function F(e,t){if(T(t))return e.model===t.model?{}:{model:t.model};let n={};for(let r of[`name`,`cli`,`model`,`role`,`status`])(e[r]||``)!==(t[r]||``)&&(n[r]=t[r]||``);return n}function I(e){return{name:e.name.trim()||`New Agent`,cli:e.cli.trim()||`claude`,model:e.model.trim()||`default`,role:e.role.trim()}}function L(e){let t={id:e.id,name:e.name,cli:e.cli,model:e.model,role:e.role,source:e.source};return e.status!==void 0&&(t.status=e.status),t}function R({employee:e,index:t,cliOptions:n,onChange:r,onRemove:i}){let a=T(e),o=g(h(e.cli).models,e.model),s=k(e),u=Array.from(new Set([...n,e.cli,`claude`])).filter(Boolean);return(0,b.jsxs)(`fieldset`,{className:`settings-runtime-employee-row`,children:[(0,b.jsxs)(`legend`,{children:[e.name||`Employee ${t+1}`,a?(0,b.jsx)(`span`,{children:`static`}):null]}),(0,b.jsxs)(`div`,{className:`settings-runtime-employee-grid`,children:[(0,b.jsx)(l,{id:`runtime-employee-${e.id}-name`,label:`Name`,value:e.name,disabled:a,error:s===`Name is required`?s:null,onChange:e=>r({name:e})}),(0,b.jsx)(c,{id:`runtime-employee-${e.id}-cli`,label:`CLI`,value:e.cli,disabled:a,options:u.map(e=>({value:e,label:h(e).label||e})),onChange:e=>{r({cli:e,model:h(e).models[0]||`default`})}}),(0,b.jsx)(c,{id:`runtime-employee-${e.id}-model`,label:`Model`,value:e.model,options:o.length>0?o:[{value:`default`,label:`default`}],onChange:e=>r({model:e})}),(0,b.jsx)(l,{id:`runtime-employee-${e.id}-role`,label:`Role`,value:e.role,disabled:a,onChange:e=>r({role:e})})]}),(0,b.jsxs)(`div`,{className:`settings-runtime-employee-footer`,children:[(0,b.jsxs)(`span`,{children:[e.source,e.status?` / ${e.status}`:``]}),(0,b.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:a,onClick:i,"aria-label":`Remove employee ${e.name||t+1}`,children:`Remove`})]})]})}function z({roster:e,original:t,cliOptions:n,loading:r,error:a,onRosterChange:o}){let s=N(t,e),c=A(e);function l(t,n){o(e.map((e,r)=>r===t?{...e,...n}:e))}function u(t){o(e.filter((e,n)=>n!==t))}return(0,b.jsxs)(i,{title:`Employees`,hint:`Runtime dispatch roster. Static employees keep their locked identity; database employees can be edited.`,children:[(0,b.jsxs)(`div`,{className:`settings-runtime-employee-summary`,children:[(0,b.jsxs)(`span`,{children:[`+`,s.added]}),(0,b.jsxs)(`span`,{children:[`~`,s.updated]}),(0,b.jsxs)(`span`,{children:[`-`,s.removed]}),c?(0,b.jsx)(`strong`,{children:`Fix invalid rows before saving.`}):null]}),r?(0,b.jsx)(`p`,{className:`settings-agent-note`,children:`Loading employees...`}):null,a?(0,b.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:a}):null,e.length===0?(0,b.jsx)(`p`,{className:`settings-empty`,children:`No runtime employees configured.`}):(0,b.jsx)(`div`,{className:`settings-runtime-employee-list`,children:e.map((e,t)=>(0,b.jsx)(R,{employee:e,index:t,cliOptions:n,onChange:e=>l(t,e),onRemove:()=>u(t)},e.id))}),(0,b.jsx)(`div`,{className:`settings-employee-footer-bar`,children:(0,b.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>o([...e,D(n)]),children:`+ Add employee`})})]})}var B=new Set([`runtimeEmployees`,`flushCli`,`flushModel`]);function V(e){let t={},n=null,r=null;for(let[i,a]of Object.entries(e))i===`runtimeEmployees`?r=a:i===`flushCli`||i===`flushModel`?(n??={},n[i===`flushCli`?`cli`:`model`]=String(a??``)):B.has(i)||(t[i]=a);return{settingsBundle:t,flushPatch:n,runtimeEmployeesNext:r}}async function H(e){let{client:t,bundle:n,employeeDraft:r,employeeOriginal:i}=e;if(A(r))throw Error(`runtime employees: fix invalid rows before saving`);let{settingsBundle:a,flushPatch:o,runtimeEmployeesNext:s}=V(n),c=null;try{if(Object.keys(a).length>0){let e=await t.put(`/api/settings`,v(a));c=e&&typeof e==`object`&&`data`in e?e.data:e}}catch(e){throw Error(`settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{o&&await t.put(`/api/memory-files/settings`,o)}catch(e){throw Error(`flush settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{s&&await P(t,i,s)}catch(e){throw Error(`runtime employees save failed: ${e instanceof Error?e.message:String(e)}`)}return c}function U({port:e,client:t,dirty:n,registerSave:i}){let{state:c,refresh:l,setData:d}=r(t,`/api/settings`),[f,_]=(0,y.useState)({cli:``,provider:``,model:``,effort:``,workingDir:``,permissions:`auto`}),[v,S]=(0,y.useState)({}),[T,E]=(0,y.useState)({}),[D,O]=(0,y.useState)(!0),[k,M]=(0,y.useState)(null),[N,P]=(0,y.useState)([]),[F,I]=(0,y.useState)([]),[L,R]=(0,y.useState)(!0),[B,V]=(0,y.useState)(null),U=(0,y.useCallback)(async()=>{O(!0),M(null);try{let e=await t.get(`/api/memory-files`),n={cli:e.cli||``,model:e.model||``};S(n),E(n)}catch(e){M(e instanceof Error?e.message:String(e))}finally{O(!1)}},[t]),W=(0,y.useCallback)(async()=>{R(!0),V(null);try{let e=ee(await t.get(`/api/employees`));P(e),I(e)}catch(e){V(e instanceof Error?e.message:String(e))}finally{R(!1)}},[t]);(0,y.useEffect)(()=>{U(),W()},[W,U]),(0,y.useEffect)(()=>{if(c.kind!==`ready`)return;let e=Object.keys(c.data.perCli||{}),t=c.data.cli||e[0]||``,n=u(c.data.permissions);_({cli:t,provider:c.data.perCli?.[t]?.provider||h(t).defaultProvider||``,model:p(t,c.data.perCli,c.data.activeOverrides),effort:m(t,c.data.perCli,c.data.activeOverrides),workingDir:c.data.workingDir||``,permissions:n.mode===`custom`?n.tokens:`auto`})},[c]),(0,y.useEffect)(()=>()=>{for(let e of Array.from(n.pending.keys()))(e===`cli`||e===`workingDir`||e===`permissions`||e===`runtimeEmployees`||e===`flushCli`||e===`flushModel`||e.startsWith(`activeOverrides.`))&&n.remove(e)},[n]);let G=(0,y.useCallback)((e,t)=>n.set(e,t),[n]),K=(0,y.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=await H({client:t,bundle:e,employeeDraft:F,employeeOriginal:N});n.clear(),r&&d(r),await l(),await U(),await W()},[t,n,F,N,W,U,l,d]);(0,y.useEffect)(()=>{if(i)return i(K),()=>i(null)},[i,K]);let q=c.kind===`ready`?c.data:{},J=q.perCli||{},Y=q.activeOverrides||{},X=(0,y.useMemo)(()=>Object.keys(J),[J]),Z=h(f.cli),Q=f.provider||Z.defaultProvider||Z.providers?.[0]||``,te=f.cli===`ai-e`?g(Z.modelsByProvider?.[Q]||Z.models,f.model):g(Z.models,f.model),ne=f.cli===`ai-e`&&Z.effortsByProvider?.[Q]||Z.efforts,re=f.workingDir.trim()?null:`Required`;if(c.kind===`loading`)return(0,b.jsx)(a,{});if(c.kind===`offline`)return(0,b.jsx)(o,{port:e});if(c.kind===`error`)return(0,b.jsx)(s,{message:c.message});function ie(){for(let e of Array.from(n.pending.keys()))e.startsWith(`activeOverrides.`)&&n.remove(e)}function $(e){_(e)}return(0,b.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),K()},children:[(0,b.jsx)(x,{cli:f.cli,cliOptions:X.length>0?X:[f.cli||`claude`],provider:Q,providerOptions:Z.providers||[],model:f.model,modelOptions:te,effort:f.effort,effortOptions:ne,workingDir:f.workingDir,workingDirError:re,onCliChange:e=>{let t={...f,cli:e,provider:J[e]?.provider||h(e).defaultProvider||``,model:p(e,J,Y),effort:m(e,J,Y)};ie(),$(t),G(`cli`,{value:e,original:q.cli||``,valid:!0})},onProviderChange:e=>{let t=Z.modelsByProvider?.[e]||[],n=Z.effortsByProvider?.[e]||[],r=t.includes(f.model)?f.model:t[0]||``,i=n.includes(f.effort)?f.effort:``;$({...f,provider:e,model:r,effort:i}),G(`perCli.ai-e.provider`,{value:e,original:J[`ai-e`]?.provider||Z.defaultProvider||`claude`,valid:!0}),G(`activeOverrides.ai-e.model`,{value:r,original:p(`ai-e`,J,Y),valid:r.trim().length>0}),G(`activeOverrides.ai-e.effort`,{value:i,original:m(`ai-e`,J,Y),valid:!0})},onModelChange:e=>{$({...f,model:e}),G(`activeOverrides.${f.cli}.model`,{value:e,original:p(f.cli,J,Y),valid:e.trim().length>0})},onEffortChange:e=>{$({...f,effort:e}),G(`activeOverrides.${f.cli}.effort`,{value:e,original:m(f.cli,J,Y),valid:!0})},onWorkingDirChange:e=>{$({...f,workingDir:e}),G(`workingDir`,{value:e,original:q.workingDir||``,valid:e.trim().length>0})}}),(0,b.jsx)(C,{value:f.permissions,onChange:e=>{$({...f,permissions:e}),G(`permissions`,{value:e,original:q.permissions??`auto`,valid:e===`auto`||e.length>0})}}),(0,b.jsx)(w,{activeCli:f.cli,flushCli:T.cli||``,flushModel:T.model||``,cliOptions:X,modelOptions:g(h(T.cli||f.cli).models,T.model||``),loading:D,error:k,onFlushCliChange:e=>{let t=e&&h(e).models[0]||``;E({cli:e,model:t}),G(`flushCli`,{value:e,original:v.cli||``,valid:!0}),G(`flushModel`,{value:t,original:v.model||``,valid:!0})},onFlushModelChange:e=>{E({...T,model:e}),G(`flushModel`,{value:e,original:v.model||``,valid:!0})}}),(0,b.jsx)(z,{roster:F,original:N,cliOptions:X,loading:L,error:B,onRosterChange:e=>{if(I(e),j(e,N)){n.remove(`runtimeEmployees`);return}n.set(`runtimeEmployees`,{value:e,original:N,valid:!A(e)})}})]})}export{U as default,V as splitAgentSaveBundle};
|
|
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{i as c,s as l}from"./fields-C-y_8RgA.js";import{a as u,n as d,o as f}from"./Permissions-BvtVczZS.js";import{a as p,i as m,n as h,r as g,t as _}from"./agent-meta-B1098B_a.js";import{t as v}from"./path-utils-ztBHV7MX.js";var y=e(t(),1),b=n();function x({cli:e,cliOptions:t,provider:n=``,providerOptions:r=[],model:a,modelOptions:o,effort:s,effortOptions:u,workingDir:d,workingDirError:f,onCliChange:p,onProviderChange:m,onModelChange:g,onEffortChange:v,onWorkingDirChange:y}){return(0,b.jsx)(i,{title:`Agent runtime`,hint:`Active CLI, model, effort, and workspace used by this instance.`,children:(0,b.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,b.jsx)(c,{id:`agent-cli`,label:`Active CLI`,value:e,options:[...t.filter(e=>_.includes(e)).map(e=>({value:e,label:h(e).label||e})),...t.filter(e=>!_.includes(e)).map(e=>({value:e,label:h(e).label||e}))],collapsedAfter:t.filter(e=>_.includes(e)).length,onChange:p}),e===`ai-e`&&r.length>0?(0,b.jsx)(c,{id:`agent-ai-e-provider`,label:`AI-E provider`,value:n,options:r.map(e=>({value:e,label:e})),onChange:e=>m?.(e)}):null,(0,b.jsx)(c,{id:`agent-model`,label:`Active model`,value:a,options:o.length>0?o:[{value:``,label:`(default)`}],onChange:g}),(0,b.jsx)(c,{id:`agent-effort`,label:`Effort`,value:s,options:[{value:``,label:`(default)`},...u.map(e=>({value:e,label:e}))],disabled:u.length===0,onChange:v}),(0,b.jsx)(l,{id:`agent-workingDir`,label:`Working directory`,value:d,error:f,placeholder:`/path/to/project`,onChange:y})]})})}var S=[{value:`auto`,label:`Auto`},{value:`custom`,label:`Custom allowlist`}];function C({value:e,onChange:t}){let n=u(e),r=n.mode===`custom`?`custom`:`auto`,a=n.mode===`custom`?n.tokens:[],o=n.mode===`custom`?`${a.length} explicit token${a.length===1?``:`s`}`:`Runtime resolves allowed capabilities`;return(0,b.jsxs)(i,{title:`Permissions`,hint:`Quick runtime mode. Open Permissions for detailed allowlist editing.`,children:[(0,b.jsx)(c,{id:`agent-permissions-mode`,label:`Mode`,value:r,options:S,onChange:e=>{t(e===`auto`?`auto`:a.length>0&&d(a)?a:f(null))}}),(0,b.jsx)(`p`,{className:`settings-agent-note`,children:o})]})}function w({activeCli:e,flushCli:t,flushModel:n,cliOptions:r,modelOptions:a,loading:o,error:s,onFlushCliChange:l,onFlushModelChange:u}){let d=t||e,f=d?h(d).label||d:`active`;return(0,b.jsx)(i,{title:`Flush Agent`,hint:`Separate summary agent used for context flush and compact work.`,children:(0,b.jsxs)(`details`,{className:`settings-agent-flush`,children:[(0,b.jsxs)(`summary`,{children:[(0,b.jsx)(`span`,{children:`Flush runtime`}),(0,b.jsxs)(`code`,{children:[f,n&&n!==`default`?` / ${n}`:``]})]}),o?(0,b.jsx)(`p`,{className:`settings-agent-note`,children:`Loading flush settings...`}):null,s?(0,b.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:s}):null,(0,b.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,b.jsx)(c,{id:`agent-flush-cli`,label:`Flush CLI`,value:t,options:[{value:``,label:`(active CLI)`},...r.map(e=>({value:e,label:h(e).label||e}))],onChange:l}),(0,b.jsx)(c,{id:`agent-flush-model`,label:`Flush model`,value:n,options:[{value:``,label:`(default)`},...a],onChange:u})]})]})})}function T(e){return e.source===`static`||e.id.startsWith(`static:`)}function E(){return`new:${Date.now().toString(36)}:${Math.random().toString(36).slice(2,8)}`}function D(e){let t=e[0]||`claude`;return{id:E(),name:`New Agent`,cli:t,model:`default`,role:``,status:`idle`,source:`db`}}function ee(e){return Array.isArray(e)?e.map(O).filter(Boolean):e.data.map(O).filter(Boolean)}function O(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.id==`string`?t.id:``,r=typeof t.name==`string`?t.name:``;if(!n||!r)return null;let i=t.source===`static`||n.startsWith(`static:`)?`static`:`db`,a={id:n,name:r,cli:typeof t.cli==`string`&&t.cli?t.cli:`claude`,model:typeof t.model==`string`&&t.model?t.model:`default`,role:typeof t.role==`string`?t.role:``,source:i};return typeof t.status==`string`&&(a.status=t.status),a}function k(e){return e.name.trim()?e.cli.trim()?e.model.trim()?null:`Model is required`:`CLI is required`:`Name is required`}function A(e){return e.some(e=>k(e)!==null)}function j(e,t){return JSON.stringify(e.map(L))===JSON.stringify(t.map(L))}function M(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Set(t.map(e=>e.id)),i=[],a=[],o=[];for(let e of t){let t=n.get(e.id);if(!t||e.id.startsWith(`new:`)){i.push(e);continue}let r=F(t,e);Object.keys(r).length>0&&a.push({before:t,after:e,patch:r})}for(let t of e)!r.has(t.id)&&!T(t)&&o.push(t);return{added:i,updated:a,removed:o}}function N(e,t){let n=M(e,t);return{added:n.added.length,updated:n.updated.length,removed:n.removed.length}}async function P(e,t,n){let r=M(t,n);for(let t of r.removed)await e.delete(`/api/employees/${encodeURIComponent(t.id)}`);for(let t of r.added)await e.post(`/api/employees`,I(t));for(let t of r.updated)await e.put(`/api/employees/${encodeURIComponent(t.after.id)}`,t.patch)}function F(e,t){if(T(t))return e.model===t.model?{}:{model:t.model};let n={};for(let r of[`name`,`cli`,`model`,`role`,`status`])(e[r]||``)!==(t[r]||``)&&(n[r]=t[r]||``);return n}function I(e){return{name:e.name.trim()||`New Agent`,cli:e.cli.trim()||`claude`,model:e.model.trim()||`default`,role:e.role.trim()}}function L(e){let t={id:e.id,name:e.name,cli:e.cli,model:e.model,role:e.role,source:e.source};return e.status!==void 0&&(t.status=e.status),t}function R({employee:e,index:t,cliOptions:n,onChange:r,onRemove:i}){let a=T(e),o=g(h(e.cli).models,e.model),s=k(e),u=Array.from(new Set([...n,e.cli,`claude`])).filter(Boolean);return(0,b.jsxs)(`fieldset`,{className:`settings-runtime-employee-row`,children:[(0,b.jsxs)(`legend`,{children:[e.name||`Employee ${t+1}`,a?(0,b.jsx)(`span`,{children:`static`}):null]}),(0,b.jsxs)(`div`,{className:`settings-runtime-employee-grid`,children:[(0,b.jsx)(l,{id:`runtime-employee-${e.id}-name`,label:`Name`,value:e.name,disabled:a,error:s===`Name is required`?s:null,onChange:e=>r({name:e})}),(0,b.jsx)(c,{id:`runtime-employee-${e.id}-cli`,label:`CLI`,value:e.cli,disabled:a,options:u.map(e=>({value:e,label:h(e).label||e})),onChange:e=>{r({cli:e,model:h(e).models[0]||`default`})}}),(0,b.jsx)(c,{id:`runtime-employee-${e.id}-model`,label:`Model`,value:e.model,options:o.length>0?o:[{value:`default`,label:`default`}],onChange:e=>r({model:e})}),(0,b.jsx)(l,{id:`runtime-employee-${e.id}-role`,label:`Role`,value:e.role,disabled:a,onChange:e=>r({role:e})})]}),(0,b.jsxs)(`div`,{className:`settings-runtime-employee-footer`,children:[(0,b.jsxs)(`span`,{children:[e.source,e.status?` / ${e.status}`:``]}),(0,b.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:a,onClick:i,"aria-label":`Remove employee ${e.name||t+1}`,children:`Remove`})]})]})}function z({roster:e,original:t,cliOptions:n,loading:r,error:a,onRosterChange:o}){let s=N(t,e),c=A(e);function l(t,n){o(e.map((e,r)=>r===t?{...e,...n}:e))}function u(t){o(e.filter((e,n)=>n!==t))}return(0,b.jsxs)(i,{title:`Employees`,hint:`Runtime dispatch roster. Static employees keep their locked identity; database employees can be edited.`,children:[(0,b.jsxs)(`div`,{className:`settings-runtime-employee-summary`,children:[(0,b.jsxs)(`span`,{children:[`+`,s.added]}),(0,b.jsxs)(`span`,{children:[`~`,s.updated]}),(0,b.jsxs)(`span`,{children:[`-`,s.removed]}),c?(0,b.jsx)(`strong`,{children:`Fix invalid rows before saving.`}):null]}),r?(0,b.jsx)(`p`,{className:`settings-agent-note`,children:`Loading employees...`}):null,a?(0,b.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:a}):null,e.length===0?(0,b.jsx)(`p`,{className:`settings-empty`,children:`No runtime employees configured.`}):(0,b.jsx)(`div`,{className:`settings-runtime-employee-list`,children:e.map((e,t)=>(0,b.jsx)(R,{employee:e,index:t,cliOptions:n,onChange:e=>l(t,e),onRemove:()=>u(t)},e.id))}),(0,b.jsx)(`div`,{className:`settings-employee-footer-bar`,children:(0,b.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>o([...e,D(n)]),children:`+ Add employee`})})]})}var B=new Set([`runtimeEmployees`,`flushCli`,`flushModel`]);function V(e){let t={},n=null,r=null;for(let[i,a]of Object.entries(e))i===`runtimeEmployees`?r=a:i===`flushCli`||i===`flushModel`?(n??={},n[i===`flushCli`?`cli`:`model`]=String(a??``)):B.has(i)||(t[i]=a);return{settingsBundle:t,flushPatch:n,runtimeEmployeesNext:r}}async function H(e){let{client:t,bundle:n,employeeDraft:r,employeeOriginal:i}=e;if(A(r))throw Error(`runtime employees: fix invalid rows before saving`);let{settingsBundle:a,flushPatch:o,runtimeEmployeesNext:s}=V(n),c=null;try{if(Object.keys(a).length>0){let e=await t.put(`/api/settings`,v(a));c=e&&typeof e==`object`&&`data`in e?e.data:e}}catch(e){throw Error(`settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{o&&await t.put(`/api/memory-files/settings`,o)}catch(e){throw Error(`flush settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{s&&await P(t,i,s)}catch(e){throw Error(`runtime employees save failed: ${e instanceof Error?e.message:String(e)}`)}return c}function U({port:e,client:t,dirty:n,registerSave:i}){let{state:c,refresh:l,setData:d}=r(t,`/api/settings`),[f,_]=(0,y.useState)({cli:``,provider:``,model:``,effort:``,workingDir:``,permissions:`auto`}),[v,S]=(0,y.useState)({}),[T,E]=(0,y.useState)({}),[D,O]=(0,y.useState)(!0),[k,M]=(0,y.useState)(null),[N,P]=(0,y.useState)([]),[F,I]=(0,y.useState)([]),[L,R]=(0,y.useState)(!0),[B,V]=(0,y.useState)(null),U=(0,y.useCallback)(async()=>{O(!0),M(null);try{let e=await t.get(`/api/memory-files`),n={cli:e.cli||``,model:e.model||``};S(n),E(n)}catch(e){M(e instanceof Error?e.message:String(e))}finally{O(!1)}},[t]),W=(0,y.useCallback)(async()=>{R(!0),V(null);try{let e=ee(await t.get(`/api/employees`));P(e),I(e)}catch(e){V(e instanceof Error?e.message:String(e))}finally{R(!1)}},[t]);(0,y.useEffect)(()=>{U(),W()},[W,U]),(0,y.useEffect)(()=>{if(c.kind!==`ready`)return;let e=Object.keys(c.data.perCli||{}),t=c.data.cli||e[0]||``,n=u(c.data.permissions);_({cli:t,provider:c.data.perCli?.[t]?.provider||h(t).defaultProvider||``,model:p(t,c.data.perCli,c.data.activeOverrides),effort:m(t,c.data.perCli,c.data.activeOverrides),workingDir:c.data.workingDir||``,permissions:n.mode===`custom`?n.tokens:`auto`})},[c]),(0,y.useEffect)(()=>()=>{for(let e of Array.from(n.pending.keys()))(e===`cli`||e===`workingDir`||e===`permissions`||e===`runtimeEmployees`||e===`flushCli`||e===`flushModel`||e.startsWith(`activeOverrides.`))&&n.remove(e)},[n]);let G=(0,y.useCallback)((e,t)=>n.set(e,t),[n]),K=(0,y.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=await H({client:t,bundle:e,employeeDraft:F,employeeOriginal:N});n.clear(),r&&d(r),await l(),await U(),await W()},[t,n,F,N,W,U,l,d]);(0,y.useEffect)(()=>{if(i)return i(K),()=>i(null)},[i,K]);let q=c.kind===`ready`?c.data:{},J=q.perCli||{},Y=q.activeOverrides||{},X=(0,y.useMemo)(()=>Object.keys(J),[J]),Z=h(f.cli),Q=f.provider||Z.defaultProvider||Z.providers?.[0]||``,te=f.cli===`ai-e`?g(Z.modelsByProvider?.[Q]||Z.models,f.model):g(Z.models,f.model),ne=f.cli===`ai-e`&&Z.effortsByProvider?.[Q]||Z.efforts,re=f.workingDir.trim()?null:`Required`;if(c.kind===`loading`)return(0,b.jsx)(a,{});if(c.kind===`offline`)return(0,b.jsx)(o,{port:e});if(c.kind===`error`)return(0,b.jsx)(s,{message:c.message});function ie(){for(let e of Array.from(n.pending.keys()))e.startsWith(`activeOverrides.`)&&n.remove(e)}function $(e){_(e)}return(0,b.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),K()},children:[(0,b.jsx)(x,{cli:f.cli,cliOptions:X.length>0?X:[f.cli||`claude`],provider:Q,providerOptions:Z.providers||[],model:f.model,modelOptions:te,effort:f.effort,effortOptions:ne,workingDir:f.workingDir,workingDirError:re,onCliChange:e=>{let t={...f,cli:e,provider:J[e]?.provider||h(e).defaultProvider||``,model:p(e,J,Y),effort:m(e,J,Y)};ie(),$(t),G(`cli`,{value:e,original:q.cli||``,valid:!0})},onProviderChange:e=>{let t=Z.modelsByProvider?.[e]||[],n=Z.effortsByProvider?.[e]||[],r=t.includes(f.model)?f.model:t[0]||``,i=n.includes(f.effort)?f.effort:``;$({...f,provider:e,model:r,effort:i}),G(`perCli.ai-e.provider`,{value:e,original:J[`ai-e`]?.provider||Z.defaultProvider||`claude`,valid:!0}),G(`activeOverrides.ai-e.model`,{value:r,original:p(`ai-e`,J,Y),valid:r.trim().length>0}),G(`activeOverrides.ai-e.effort`,{value:i,original:m(`ai-e`,J,Y),valid:!0})},onModelChange:e=>{$({...f,model:e}),G(`activeOverrides.${f.cli}.model`,{value:e,original:p(f.cli,J,Y),valid:e.trim().length>0})},onEffortChange:e=>{$({...f,effort:e}),G(`activeOverrides.${f.cli}.effort`,{value:e,original:m(f.cli,J,Y),valid:!0})},onWorkingDirChange:e=>{$({...f,workingDir:e}),G(`workingDir`,{value:e,original:q.workingDir||``,valid:e.trim().length>0})}}),(0,b.jsx)(C,{value:f.permissions,onChange:e=>{$({...f,permissions:e}),G(`permissions`,{value:e,original:q.permissions??`auto`,valid:e===`auto`||e.length>0})}}),(0,b.jsx)(w,{activeCli:f.cli,flushCli:T.cli||``,flushModel:T.model||``,cliOptions:X,modelOptions:g(h(T.cli||f.cli).models,T.model||``),loading:D,error:k,onFlushCliChange:e=>{let t=e&&h(e).models[0]||``;E({cli:e,model:t}),G(`flushCli`,{value:e,original:v.cli||``,valid:!0}),G(`flushModel`,{value:t,original:v.model||``,valid:!0})},onFlushModelChange:e=>{E({...T,model:e}),G(`flushModel`,{value:e,original:v.model||``,valid:!0})}}),(0,b.jsx)(z,{roster:F,original:N,cliOptions:X,loading:L,error:B,onRosterChange:e=>{if(I(e),j(e,N)){n.remove(`runtimeEmployees`);return}n.set(`runtimeEmployees`,{value:e,original:N,valid:!A(e)})}})]})}export{U as default,V as splitAgentSaveBundle};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{c as r}from"./api-30EcU_Lb.js";import{t as i}from"./desktop-bridge-CrqidwSb.js";import{n as a,t as o}from"./MarkdownRenderer-CS6jvLpf.js";var s=e(t(),1),c=n(),l={ts:`typescript`,tsx:`typescript`,js:`javascript`,jsx:`javascript`,py:`python`,rs:`rust`,go:`go`,java:`java`,cpp:`cpp`,c:`cpp`,css:`css`,html:`html`,xml:`xml`,json:`json`,yaml:`yaml`,yml:`yaml`,sh:`bash`,bash:`bash`,sql:`sql`};function u(e){let t=e.split(`.`).pop()?.toLowerCase();return t?l[t]??null:null}function d(e){return/\.(md|mdx)$/i.test(e)}function f(){return i()?.folder??null}function p(e){return!e.startsWith(`/`)&&!/^[a-zA-Z]:[\\/]/.test(e)}function m(e){if(d(e.filePath))return(0,c.jsx)(`article`,{className:`notes-preview doc-markdown`,children:(0,c.jsx)(o,{markdown:e.content})});let t=u(e.filePath);return t?(0,c.jsx)(a,{code:e.content,language:t}):(0,c.jsx)(`pre`,{className:`doc-pre`,children:(0,c.jsx)(`code`,{children:e.content})})}function h(e){let t=f(),[n,i]=(0,s.useState)(``),[a,o]=(0,s.useState)(null),[l,u]=(0,s.useState)(!1);return(0,s.useEffect)(()=>{if(!e.filePath){i(``),o(null);return}(async()=>{if(t){let n=await t.readFile(e.filePath);n.ok&&n.content!==void 0?(n.binary?(u(!0),i(``)):(u(!1),i(n.content)),o(null)):o(n.error??`Failed to read file`);return}if(!p(e.filePath)){o(`Document preview for arbitrary local files requires Electron desktop app`);return}try{let t=await r(e.filePath);u(!1),i(t.content),o(null)}catch(e){o(e.message)}})()},[t,e.filePath]),e.filePath?a?(0,c.jsx)(`div`,{className:`doc-panel doc-error`,children:a}):l?(0,c.jsx)(`div`,{className:`doc-panel doc-binary`,children:`Binary file — cannot preview`}):(0,c.jsxs)(`div`,{className:`doc-panel`,children:[(0,c.
|
|
1
|
+
import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{c as r}from"./api-30EcU_Lb.js";import{t as i}from"./desktop-bridge-CrqidwSb.js";import{n as a,t as o}from"./MarkdownRenderer-CS6jvLpf.js";var s=e(t(),1),c=n(),l={ts:`typescript`,tsx:`typescript`,js:`javascript`,jsx:`javascript`,py:`python`,rs:`rust`,go:`go`,java:`java`,cpp:`cpp`,c:`cpp`,css:`css`,html:`html`,xml:`xml`,json:`json`,yaml:`yaml`,yml:`yaml`,sh:`bash`,bash:`bash`,sql:`sql`};function u(e){let t=e.split(`.`).pop()?.toLowerCase();return t?l[t]??null:null}function d(e){return/\.(md|mdx)$/i.test(e)}function f(){return i()?.folder??null}function p(e){return!e.startsWith(`/`)&&!/^[a-zA-Z]:[\\/]/.test(e)}function m(e){if(d(e.filePath))return(0,c.jsx)(`article`,{className:`notes-preview doc-markdown`,children:(0,c.jsx)(o,{markdown:e.content})});let t=u(e.filePath);return t?(0,c.jsx)(a,{code:e.content,language:t}):(0,c.jsx)(`pre`,{className:`doc-pre`,children:(0,c.jsx)(`code`,{children:e.content})})}function h(e){let t=f(),[n,i]=(0,s.useState)(``),[a,o]=(0,s.useState)(null),[l,u]=(0,s.useState)(!1);return(0,s.useEffect)(()=>{if(!e.filePath){i(``),o(null);return}(async()=>{if(t){let n=await t.readFile(e.filePath);n.ok&&n.content!==void 0?(n.binary?(u(!0),i(``)):(u(!1),i(n.content)),o(null)):o(n.error??`Failed to read file`);return}if(!p(e.filePath)){o(`Document preview for arbitrary local files requires Electron desktop app`);return}try{let t=await r(e.filePath);u(!1),i(t.content),o(null)}catch(e){o(e.message)}})()},[t,e.filePath]),e.filePath?a?(0,c.jsx)(`div`,{className:`doc-panel doc-error`,children:a}):l?(0,c.jsx)(`div`,{className:`doc-panel doc-binary`,children:`Binary file — cannot preview`}):(0,c.jsxs)(`div`,{className:`doc-panel`,children:[(0,c.jsxs)(`div`,{className:`doc-toolbar`,children:[(0,c.jsx)(`span`,{className:`doc-file-name`,title:e.filePath,children:e.filePath.split(`/`).pop()}),(0,c.jsx)(`button`,{type:`button`,className:`doc-copy-path`,title:`Copy full path`,onClick:()=>{navigator.clipboard.writeText(e.filePath).then(()=>{let e=document.querySelector(`.doc-copy-path`);e&&(e.textContent=`Copied`,setTimeout(()=>{e.textContent=`Path`},1200))})},children:`Path`})]}),(0,c.jsx)(`div`,{className:`doc-content`,children:(0,c.jsx)(m,{filePath:e.filePath,content:n})})]}):(0,c.jsx)(`div`,{className:`doc-panel doc-empty`,children:`Open Folders and select a file to preview it here.`})}export{h as DocPanel};
|
|
@@ -0,0 +1 @@
|
|
|
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;flex:1;font-size:11px;font-weight:500;overflow:hidden}.doc-copy-path{border:1px solid var(--border-subtle);color:var(--text-dim);cursor:pointer;background:0 0;border-radius:3px;flex-shrink:0;margin-left:6px;padding:1px 6px;font-size:10px}.doc-copy-path:hover{background:var(--border-subtle);color:var(--text-base)}.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}
|
|
@@ -0,0 +1 @@
|
|
|
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`,`kiro-code`,`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};
|