cli-jaw 2.1.1 → 2.1.3
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 +18 -11
- package/README.zh-CN.md +8 -6
- package/dist/bin/cli-jaw.js +19 -3
- 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-search.js +71 -0
- package/dist/bin/commands/chat-search.js.map +1 -0
- 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 +66 -9
- package/dist/bin/commands/goal.js.map +1 -1
- package/dist/bin/commands/history.js +61 -0
- package/dist/bin/commands/history.js.map +1 -0
- package/dist/bin/commands/lock.js +104 -0
- package/dist/bin/commands/lock.js.map +1 -0
- package/dist/bin/commands/memory.js +23 -2
- package/dist/bin/commands/memory.js.map +1 -1
- package/dist/bin/commands/orchestrate.js.map +1 -1
- package/dist/bin/commands/project.js +4 -1
- package/dist/bin/commands/project.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 -2
- 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/lib/upload.js +7 -0
- package/dist/lib/upload.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 +151 -22
- package/dist/server.js.map +1 -1
- package/dist/src/agent/agy-runtime.js +1 -0
- package/dist/src/agent/agy-runtime.js.map +1 -1
- package/dist/src/agent/agy-transcript-watcher.js +78 -0
- package/dist/src/agent/agy-transcript-watcher.js.map +1 -0
- package/dist/src/agent/agy-transcript.js +158 -0
- package/dist/src/agent/agy-transcript.js.map +1 -0
- package/dist/src/agent/args.js +51 -5
- 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 +2 -2
- package/dist/src/agent/codex-app-client.js.map +1 -1
- package/dist/src/agent/cursor-runtime.js +1 -0
- package/dist/src/agent/cursor-runtime.js.map +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 +314 -0
- package/dist/src/agent/kiro-runtime.js.map +1 -0
- package/dist/src/agent/lifecycle-handler.js +208 -23
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/memory-flush-controller.js +3 -4
- 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 +2 -2
- 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 +11 -5
- 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 +231 -43
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/agent/watchdog.js +1 -1
- package/dist/src/agent/watchdog.js.map +1 -1
- package/dist/src/browser/actions.js +0 -8
- package/dist/src/browser/actions.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/browser-escalation.js +5 -29
- package/dist/src/browser/adaptive-fetch/browser-escalation.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/browser-runtime.js +5 -14
- package/dist/src/browser/adaptive-fetch/browser-runtime.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/browser-session.js +14 -28
- package/dist/src/browser/adaptive-fetch/browser-session.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/challenge-detector.js +4 -26
- package/dist/src/browser/adaptive-fetch/challenge-detector.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/content-scorer.js +5 -29
- package/dist/src/browser/adaptive-fetch/content-scorer.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js +0 -64
- package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/fetcher.js +4 -19
- package/dist/src/browser/adaptive-fetch/fetcher.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/human-loop.js +0 -26
- package/dist/src/browser/adaptive-fetch/human-loop.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/index.js +74 -145
- package/dist/src/browser/adaptive-fetch/index.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/metadata.js +1 -41
- package/dist/src/browser/adaptive-fetch/metadata.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/output.js +1 -18
- package/dist/src/browser/adaptive-fetch/output.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/reader-adapters.js +43 -75
- package/dist/src/browser/adaptive-fetch/reader-adapters.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/safety.js +5 -48
- package/dist/src/browser/adaptive-fetch/safety.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/third-party-readers.js +0 -11
- package/dist/src/browser/adaptive-fetch/third-party-readers.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/trace.js +3 -18
- package/dist/src/browser/adaptive-fetch/trace.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/transforms.js +0 -23
- package/dist/src/browser/adaptive-fetch/transforms.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/types.js +3 -0
- package/dist/src/browser/adaptive-fetch/types.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/validators.js +0 -17
- package/dist/src/browser/adaptive-fetch/validators.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/waf-profiles.js +0 -10
- package/dist/src/browser/adaptive-fetch/waf-profiles.js.map +1 -1
- package/dist/src/browser/connection.js +1 -1
- package/dist/src/browser/connection.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-response.js +0 -1
- package/dist/src/browser/web-ai/chatgpt-response.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt.js +0 -33
- package/dist/src/browser/web-ai/chatgpt.js.map +1 -1
- package/dist/src/browser/web-ai/diagnostics.js +0 -16
- package/dist/src/browser/web-ai/diagnostics.js.map +1 -1
- package/dist/src/browser/web-ai/doctor.js.map +1 -1
- package/dist/src/browser/web-ai/errors.js +1 -1
- package/dist/src/browser/web-ai/errors.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/command-context.js.map +1 -1
- package/dist/src/cli/commands.js +16 -4
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/compact.js +2 -1
- package/dist/src/cli/compact.js.map +1 -1
- package/dist/src/cli/handlers/session-handlers.js +34 -0
- package/dist/src/cli/handlers/session-handlers.js.map +1 -0
- package/dist/src/cli/handlers-project.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 +85 -17
- package/dist/src/cli/handlers-workflows.js.map +1 -1
- package/dist/src/cli/handlers.js +84 -43
- 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 +51 -10
- 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/chat-sessions.js +63 -0
- package/dist/src/core/chat-sessions.js.map +1 -0
- package/dist/src/core/cli-detection.js +14 -0
- package/dist/src/core/cli-detection.js.map +1 -1
- package/dist/src/core/compact.js +43 -11
- package/dist/src/core/compact.js.map +1 -1
- package/dist/src/core/config.js +14 -1
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +52 -12
- 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/core/main-session.js +3 -2
- package/dist/src/core/main-session.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 +113 -7
- package/dist/src/goal/heartbeat.js.map +1 -1
- package/dist/src/goal/store.js +44 -5
- 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-store.js.map +1 -1
- package/dist/src/manager/lifecycle.js +94 -5
- 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/preview-link-policy.js +11 -4
- package/dist/src/manager/preview-link-policy.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 +42 -7
- package/dist/src/manager/server.js.map +1 -1
- package/dist/src/manager/shutdown.js +8 -3
- package/dist/src/manager/shutdown.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/indexing.js +49 -1
- package/dist/src/memory/indexing.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 +3 -2
- package/dist/src/memory/runtime.js.map +1 -1
- package/dist/src/memory/shared.js.map +1 -1
- package/dist/src/messaging/send.js +66 -7
- package/dist/src/messaging/send.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 +9 -3
- 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/gateway.js +4 -4
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +89 -45
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/sanitize.js +69 -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 +215 -76
- 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 +190 -115
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/templates/a1-system.md +124 -61
- package/dist/src/prompt/templates/control-system.md +2 -2
- package/dist/src/prompt/templates/employee.md +41 -56
- package/dist/src/prompt/templates/orchestration.md +23 -8
- package/dist/src/prompt/templates/skills.md +6 -0
- package/dist/src/routes/browser.js +3 -3
- package/dist/src/routes/browser.js.map +1 -1
- package/dist/src/routes/employees.js +4 -4
- package/dist/src/routes/employees.js.map +1 -1
- package/dist/src/routes/goal.js +48 -4
- 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 +8 -3
- package/dist/src/routes/messaging.js.map +1 -1
- package/dist/src/routes/orchestrate.js +267 -117
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/quota-agy-reverse.js +6 -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/quota.js +68 -6
- package/dist/src/routes/quota.js.map +1 -1
- package/dist/src/routes/settings.js +37 -8
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/skills.js.map +1 -1
- package/dist/src/security/path-guards.js +0 -3
- package/dist/src/security/path-guards.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 +58 -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/chat.css +27 -0
- package/public/css/modals.css +79 -0
- package/public/css/orc-state.css +10 -6
- package/public/css/sidebar.css +85 -0
- package/public/css/variables.css +6 -2
- package/public/dist/assets/{Agent-CIUGaUVn.js → Agent-DBKNQ6tp.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/{FolderPanel-DSkanaGN.js → FolderPanel-DT0fU8f2.js} +1 -1
- package/public/dist/assets/Heartbeat-fsuLzY9c.js +1 -0
- package/public/dist/assets/Mcp-_Yq4N3Sk.js +4 -0
- package/public/dist/assets/{Memory-BgN8djV4.js → Memory-CRR8kotI.js} +1 -1
- package/public/dist/assets/{ModelProvider-DHQ1Zvw0.js → ModelProvider-DQgISbKw.js} +1 -1
- package/public/dist/assets/agent-meta-C4mauPL5.js +1 -0
- package/public/dist/assets/app-0OQhPpTG.css +1 -0
- package/public/dist/assets/app-CSqIyg9A.js +55 -0
- package/public/dist/assets/constants-BHMkzpN_.js +1 -0
- package/public/dist/assets/{employees-DiNLzEXS.js → employees-CZdWHH-r.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-CGTQ5EIm.js +12 -0
- package/public/dist/assets/manager-UBunDqMH.css +1 -0
- package/public/dist/assets/{memory-B_nn0A4v.js → memory-B3QSmj_e.js} +9 -9
- package/public/dist/assets/memory-DOBqiuPc.js +1 -0
- package/public/dist/assets/{provider-icons-XEfJPGTe.js → provider-icons-Crv6yvlG.js} +35 -6
- package/public/dist/assets/render-J11oxfnl.js +28 -0
- package/public/dist/assets/settings-BV_2Bh0_.js +1 -0
- package/public/dist/assets/settings-m_cim0ov.js +151 -0
- package/public/dist/assets/sidebar-ZBXdBgF7.js +49 -0
- package/public/dist/assets/{skills-COa4iSwL.js → skills-CjaBmIPV.js} +6 -6
- package/public/dist/assets/skills-Xm3fl1zr.js +1 -0
- package/public/dist/assets/{slash-commands-C_ePvrPi.js → slash-commands-71jc07Wf.js} +1 -1
- package/public/dist/assets/slash-commands-BO6ssnAz.js +1 -0
- package/public/dist/assets/{trace-drawer-CY4z_Ie8.js → trace-drawer-Czvf2P2o.js} +1 -1
- package/public/dist/assets/ui-CverZJnd.js +1 -0
- package/public/dist/assets/ui-qKxy-4p9.js +142 -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 +34 -11
- package/public/js/features/chat-messages.ts +13 -2
- package/public/js/features/chat-search.ts +5 -1
- package/public/js/features/chat.ts +86 -44
- package/public/js/features/employees.ts +7 -2
- package/public/js/features/idb-cache.ts +4 -0
- package/public/js/features/media-lightbox.ts +40 -0
- package/public/js/features/message-history.ts +55 -7
- package/public/js/features/pending-queue.ts +28 -4
- 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 +161 -0
- package/public/js/features/settings-cli-status.ts +136 -187
- package/public/js/features/settings-core.ts +5 -1
- package/public/js/features/settings-mcp.ts +513 -7
- package/public/js/features/settings-types.ts +1 -0
- 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/features/ui-status.ts +5 -1
- package/public/js/main.ts +5 -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/render/markdown.ts +16 -0
- package/public/js/ui.ts +8 -1
- package/public/js/virtual-scroll.ts +19 -0
- package/public/js/ws.ts +151 -15
- package/public/locales/en.json +9 -2
- package/public/locales/ja.json +9 -2
- package/public/locales/ko.json +9 -2
- package/public/locales/zh.json +9 -2
- package/public/manager/src/App.tsx +13 -70
- package/public/manager/src/InstancePreview.tsx +56 -11
- package/public/manager/src/SidebarRailRouter.tsx +32 -4
- package/public/manager/src/components/InstanceRow.tsx +0 -1
- package/public/manager/src/components/WorkbenchHeader.tsx +17 -7
- 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/folder-panel/FolderPanel.tsx +13 -2
- package/public/manager/src/hooks/useElectronDroppedPaths.ts +89 -0
- package/public/manager/src/hooks/useInstanceMessageEvents.ts +4 -15
- package/public/manager/src/manager-components.css +35 -1
- package/public/manager/src/manager-polish.css +11 -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 +13 -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 +32 -9
- 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/scripts/smoke/agy-transcript-tail-smoke.mjs +89 -0
- 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/manager-DyrwJLZr.css +0 -1
- package/public/dist/assets/memory-CCjNFWmO.js +0 -1
- package/public/dist/assets/render-CgDEBoCX.js +0 -28
- 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
- /package/public/dist/assets/{locale-DT1WRaeJ.js → locale-BHMJIzyw.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-monitor.js","sourceRoot":"","sources":["../../../src/orchestrator/worker-monitor.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,2DAA2D;AAC3D,6DAA6D;AAW7D,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACtD,IAAI,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,IAAI,OAAO;YAAE,OAAO;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;QACvC,IAAI,IAAI,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5C,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE;QAC7B,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAEvB,OAAO;QACH,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"worker-monitor.js","sourceRoot":"","sources":["../../../src/orchestrator/worker-monitor.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,2DAA2D;AAC3D,6DAA6D;AAW7D,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACtD,IAAI,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,IAAI,OAAO;YAAE,OAAO;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;QACvC,IAAI,IAAI,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5C,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE;QAC7B,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAEvB,OAAO;QACH,KAAK,CAAC,OAAkD;YACpD,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1B,IAAI,OAAO,EAAE,CAAC;gBACV,OAAO,GAAG,KAAK,CAAC;YACpB,CAAC;QACL,CAAC;QACD,IAAI,CAAC,IAAmB;YACpB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,aAAa,CAAC,UAAU,CAAC,CAAC;YAC1B,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvB,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC9B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1C,CAAC;QACL,CAAC;QACD,IAAI;YACA,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,aAAa,CAAC,UAAU,CAAC,CAAC;YAC1B,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;KACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { sanitizeToolLogForDurableStorage, } from '../shared/tool-log-sanitize.js';
|
|
2
|
+
import { displayShellCommand, displayShellCommandDetail, } from '../shared/shell-command-display.js';
|
|
3
|
+
export function isThinkingEntry(entry) {
|
|
4
|
+
const type = String(entry.toolType || '').toLowerCase();
|
|
5
|
+
const label = String(entry.label || '').toLowerCase();
|
|
6
|
+
return type === 'thinking' || entry.icon === '💭' || label.includes('thinking') || label.includes('reasoning');
|
|
7
|
+
}
|
|
8
|
+
export function sanitizeWorkerProgressTools(entries) {
|
|
9
|
+
const sanitized = sanitizeToolLogForDurableStorage(entries);
|
|
10
|
+
return sanitized
|
|
11
|
+
.filter((entry) => !isThinkingEntry(entry))
|
|
12
|
+
.map((entry) => {
|
|
13
|
+
const detail = entry.detail
|
|
14
|
+
? displayShellCommandDetail(entry.detail).replace(/\s+/g, ' ').trim().slice(0, 240)
|
|
15
|
+
: '';
|
|
16
|
+
return {
|
|
17
|
+
...entry,
|
|
18
|
+
label: displayShellCommand(entry.label),
|
|
19
|
+
...(detail ? { detail } : {}),
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export function previewText(value, max = 200) {
|
|
24
|
+
const text = String(value || '').replace(/\s+/g, ' ').trim();
|
|
25
|
+
if (!text)
|
|
26
|
+
return undefined;
|
|
27
|
+
return text.length > max ? `${text.slice(0, max - 1)}…` : text;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=worker-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-progress.js","sourceRoot":"","sources":["../../../src/orchestrator/worker-progress.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,gCAAgC,GAEnC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACH,mBAAmB,EACnB,yBAAyB,GAC5B,MAAM,oCAAoC,CAAC;AAwB5C,MAAM,UAAU,eAAe,CAAC,KAAiE;IAC7F,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACxD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,OAAO,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,OAAgB;IACxD,MAAM,SAAS,GAAG,gCAAgC,CAAC,OAAO,CAAC,CAAC;IAC5D,OAAO,SAAS;SACX,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;SAC1C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACX,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;YACvB,CAAC,CAAC,yBAAyB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YACnF,CAAC,CAAC,EAAE,CAAC;QACT,OAAO;YACH,GAAG,KAAK;YACR,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC;YACvC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC,CAAC;IACN,CAAC,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,GAAG,GAAG,GAAG;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// ─── Worker Registry ────────────────────────────────
|
|
2
2
|
// In-memory registry tracking worker ownership and result handoff.
|
|
3
3
|
import { stripUndefined } from '../core/strip-undefined.js';
|
|
4
|
+
import { previewText, sanitizeWorkerProgressTools, } from './worker-progress.js';
|
|
4
5
|
const workers = new Map();
|
|
6
|
+
const previousRuns = new Map();
|
|
5
7
|
// Phase 7: thrown when a worker slot with the same agentId is already running.
|
|
6
8
|
// Prevents double-dispatch from overwriting the in-flight slot and losing results.
|
|
7
9
|
export class WorkerBusyError extends Error {
|
|
@@ -31,6 +33,8 @@ export function claimWorker(emp, task, replayMeta) {
|
|
|
31
33
|
replayClaimed: false,
|
|
32
34
|
replayAttempts: 0,
|
|
33
35
|
result: null,
|
|
36
|
+
tools: [],
|
|
37
|
+
progressUpdatedAt: null,
|
|
34
38
|
replayMeta: replayMeta && Object.keys(replayMeta).length ? { ...replayMeta } : undefined,
|
|
35
39
|
});
|
|
36
40
|
workers.set(emp.id, slot);
|
|
@@ -46,13 +50,42 @@ export function updateWorkerPhase(agentId, phase, phaseLabel) {
|
|
|
46
50
|
slot.phase = phase;
|
|
47
51
|
slot.phaseLabel = phaseLabel;
|
|
48
52
|
}
|
|
49
|
-
|
|
53
|
+
function toProgressRun(slot) {
|
|
54
|
+
const resultPreview = previewText(slot.result, 240);
|
|
55
|
+
return {
|
|
56
|
+
agentId: slot.agentId,
|
|
57
|
+
employeeName: slot.employeeName,
|
|
58
|
+
state: slot.state,
|
|
59
|
+
taskPreview: previewText(slot.task, 200) || '',
|
|
60
|
+
startedAt: slot.startedAt,
|
|
61
|
+
completedAt: slot.completedAt,
|
|
62
|
+
progressUpdatedAt: slot.progressUpdatedAt,
|
|
63
|
+
...(resultPreview ? { resultPreview } : {}),
|
|
64
|
+
tools: slot.tools,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function rememberCompletedRun(slot) {
|
|
68
|
+
if (slot.state === 'running')
|
|
69
|
+
return;
|
|
70
|
+
previousRuns.set(slot.agentId, toProgressRun(slot));
|
|
71
|
+
}
|
|
72
|
+
export function updateWorkerTools(agentId, tools) {
|
|
73
|
+
const slot = workers.get(agentId);
|
|
74
|
+
if (!slot)
|
|
75
|
+
return;
|
|
76
|
+
slot.tools = sanitizeWorkerProgressTools(tools);
|
|
77
|
+
slot.progressUpdatedAt = Date.now();
|
|
78
|
+
}
|
|
79
|
+
export function finishWorker(agentId, result, tools = []) {
|
|
50
80
|
const slot = workers.get(agentId);
|
|
51
81
|
if (!slot)
|
|
52
82
|
return;
|
|
53
83
|
slot.state = 'done';
|
|
54
84
|
slot.completedAt = Date.now();
|
|
55
85
|
slot.result = result;
|
|
86
|
+
if (tools.length > 0)
|
|
87
|
+
updateWorkerTools(agentId, tools);
|
|
88
|
+
rememberCompletedRun(slot);
|
|
56
89
|
slot.pendingReplay = true;
|
|
57
90
|
}
|
|
58
91
|
export function failWorker(agentId, result) {
|
|
@@ -62,6 +95,7 @@ export function failWorker(agentId, result) {
|
|
|
62
95
|
slot.state = 'failed';
|
|
63
96
|
slot.completedAt = Date.now();
|
|
64
97
|
slot.result = result;
|
|
98
|
+
rememberCompletedRun(slot);
|
|
65
99
|
slot.pendingReplay = false; // Failed workers don't need replay — no result to feed back to Boss
|
|
66
100
|
}
|
|
67
101
|
export function cancelWorker(agentId) {
|
|
@@ -71,8 +105,28 @@ export function cancelWorker(agentId) {
|
|
|
71
105
|
slot.state = 'cancelled';
|
|
72
106
|
slot.completedAt = Date.now();
|
|
73
107
|
slot.pendingReplay = false;
|
|
108
|
+
rememberCompletedRun(slot);
|
|
74
109
|
workers.delete(agentId);
|
|
75
110
|
}
|
|
111
|
+
export function getWorkerProgressSnapshot(agentId) {
|
|
112
|
+
const slot = workers.get(agentId);
|
|
113
|
+
const previous = previousRuns.get(agentId) || null;
|
|
114
|
+
if (!slot && !previous)
|
|
115
|
+
return null;
|
|
116
|
+
return {
|
|
117
|
+
agentId,
|
|
118
|
+
employeeName: slot?.employeeName || previous?.employeeName || agentId,
|
|
119
|
+
current: slot?.state === 'running' ? toProgressRun(slot) : null,
|
|
120
|
+
previous: slot && slot.state !== 'running' ? toProgressRun(slot) : previous,
|
|
121
|
+
generatedAt: Date.now(),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
export function listWorkerProgressSnapshots() {
|
|
125
|
+
const ids = new Set([...workers.keys(), ...previousRuns.keys()]);
|
|
126
|
+
return [...ids]
|
|
127
|
+
.map(getWorkerProgressSnapshot)
|
|
128
|
+
.filter((value) => Boolean(value));
|
|
129
|
+
}
|
|
76
130
|
export function getActiveWorkers() {
|
|
77
131
|
return [...workers.values()].filter((slot) => slot.state === 'running');
|
|
78
132
|
}
|
|
@@ -94,7 +148,12 @@ export function listPendingWorkerResults() {
|
|
|
94
148
|
const results = [];
|
|
95
149
|
for (const slot of workers.values()) {
|
|
96
150
|
if (slot.state === 'done' && slot.pendingReplay && !slot.replayClaimed && slot.result !== null) {
|
|
97
|
-
results.push(stripUndefined({
|
|
151
|
+
results.push(stripUndefined({
|
|
152
|
+
agentId: slot.agentId,
|
|
153
|
+
text: slot.result,
|
|
154
|
+
tools: slot.tools.length > 0 ? slot.tools : undefined,
|
|
155
|
+
meta: slot.replayMeta,
|
|
156
|
+
}));
|
|
98
157
|
}
|
|
99
158
|
}
|
|
100
159
|
return results;
|
|
@@ -125,9 +184,11 @@ export function releaseWorkerReplay(agentId) {
|
|
|
125
184
|
console.error(`[worker-registry] ${agentId} replay failed 3 times — marking as failed`);
|
|
126
185
|
slot.state = 'failed';
|
|
127
186
|
slot.pendingReplay = false;
|
|
187
|
+
rememberCompletedRun(slot);
|
|
128
188
|
}
|
|
129
189
|
}
|
|
130
190
|
export function clearAllWorkers() {
|
|
131
191
|
workers.clear();
|
|
192
|
+
previousRuns.clear();
|
|
132
193
|
}
|
|
133
194
|
//# sourceMappingURL=worker-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-registry.js","sourceRoot":"","sources":["../../../src/orchestrator/worker-registry.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,mEAAmE;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"worker-registry.js","sourceRoot":"","sources":["../../../src/orchestrator/worker-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,13 +2,13 @@ import fs from 'fs';
|
|
|
2
2
|
import os from 'os';
|
|
3
3
|
import { createHash } from 'crypto';
|
|
4
4
|
import { join } from 'path';
|
|
5
|
-
import { settings, JAW_HOME, PROMPTS_DIR, SKILLS_DIR, SKILLS_REF_DIR, loadHeartbeatFile, deriveCdpPort } from '../core/config.js';
|
|
5
|
+
import { settings, JAW_HOME, PROMPTS_DIR, SKILLS_DIR, SKILLS_REF_DIR, loadHeartbeatFile, deriveCdpPort, getProjectDirs } from '../core/config.js';
|
|
6
6
|
import { expandHomePath } from '../core/path-expand.js';
|
|
7
7
|
import { stripUndefined } from '../core/strip-undefined.js';
|
|
8
8
|
import { getEmployees } from '../core/db.js';
|
|
9
9
|
import { memoryFlushCounter } from '../agent/spawn.js';
|
|
10
10
|
import { describeHeartbeatSchedule, normalizeHeartbeatSchedule } from '../memory/heartbeat-schedule.js';
|
|
11
|
-
import { buildTaskSnapshot,
|
|
11
|
+
import { buildTaskSnapshot, loadProfileSummary } from '../memory/runtime.js';
|
|
12
12
|
import { buildMemoryInjection } from '../memory/injection.js';
|
|
13
13
|
import { loadAndRender, loadTemplate, renderTemplate, parseWorkerContexts, clearTemplateCache } from './template-loader.js';
|
|
14
14
|
import { findStaticEmployee } from '../core/employees.js';
|
|
@@ -21,6 +21,101 @@ function getRepoBundledSkillPath(...parts) {
|
|
|
21
21
|
function findFirstExistingPath(paths) {
|
|
22
22
|
return paths.find(p => fs.existsSync(p)) || null;
|
|
23
23
|
}
|
|
24
|
+
function findSkillPath(skillName) {
|
|
25
|
+
return findFirstExistingPath([
|
|
26
|
+
join(SKILLS_DIR, skillName, 'SKILL.md'),
|
|
27
|
+
join(SKILLS_REF_DIR, skillName, 'SKILL.md'),
|
|
28
|
+
getRepoBundledSkillPath('skills', skillName, 'SKILL.md'),
|
|
29
|
+
getRepoBundledSkillPath('skills_ref', skillName, 'SKILL.md'),
|
|
30
|
+
]);
|
|
31
|
+
}
|
|
32
|
+
function normalizeSkillDescription(description) {
|
|
33
|
+
return String(description || '')
|
|
34
|
+
.trim()
|
|
35
|
+
.replace(/^["']|["']$/g, '')
|
|
36
|
+
.replace(/\s+/g, ' ');
|
|
37
|
+
}
|
|
38
|
+
function normalizeSkillMetadataList(value) {
|
|
39
|
+
if (Array.isArray(value))
|
|
40
|
+
return value.map(v => String(v).trim()).filter(Boolean);
|
|
41
|
+
const raw = String(value || '').trim();
|
|
42
|
+
if (!raw)
|
|
43
|
+
return [];
|
|
44
|
+
const unwrapped = raw.replace(/^\[/, '').replace(/\]$/, '');
|
|
45
|
+
return unwrapped.split(',').map(v => v.trim().replace(/^["']|["']$/g, '')).filter(Boolean);
|
|
46
|
+
}
|
|
47
|
+
function parseTopLevelSkillMetadataList(content, field) {
|
|
48
|
+
const match = content.match(new RegExp(`^${field}:\\s*(.+)$`, 'm'));
|
|
49
|
+
return normalizeSkillMetadataList(match?.[1]);
|
|
50
|
+
}
|
|
51
|
+
function parseSkillMetadataObject(content) {
|
|
52
|
+
const frontmatter = content.match(/^---\n([\s\S]*?)\n---/);
|
|
53
|
+
const source = frontmatter?.[1] || content;
|
|
54
|
+
const metadataMatch = source.match(/^metadata:\s*\n([\s\S]*)$/m);
|
|
55
|
+
if (!metadataMatch?.[1])
|
|
56
|
+
return {};
|
|
57
|
+
let raw = metadataMatch[1];
|
|
58
|
+
const nextTopLevelKey = raw.search(/\n[A-Za-z0-9_-]+:\s*/);
|
|
59
|
+
if (nextTopLevelKey >= 0)
|
|
60
|
+
raw = raw.slice(0, nextTopLevelKey);
|
|
61
|
+
try {
|
|
62
|
+
const parsed = JSON.parse(raw.trim());
|
|
63
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return {};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function parseSkillMetadataList(content, field) {
|
|
70
|
+
const topLevel = parseTopLevelSkillMetadataList(content, field);
|
|
71
|
+
const metadata = parseSkillMetadataObject(content);
|
|
72
|
+
const nested = normalizeSkillMetadataList(metadata[field]);
|
|
73
|
+
return [...new Set([...topLevel, ...nested])];
|
|
74
|
+
}
|
|
75
|
+
function formatSkillRoutingMetadata(skill) {
|
|
76
|
+
const keywords = normalizeSkillMetadataList(skill.keywords);
|
|
77
|
+
const triggers = normalizeSkillMetadataList(skill.triggers);
|
|
78
|
+
const parts = [];
|
|
79
|
+
if (keywords.length)
|
|
80
|
+
parts.push(`keywords: ${keywords.join(', ')}`);
|
|
81
|
+
if (triggers.length)
|
|
82
|
+
parts.push(`triggers: ${triggers.join(', ')}`);
|
|
83
|
+
return parts.length ? ` [${parts.join('; ')}]` : '';
|
|
84
|
+
}
|
|
85
|
+
function readSkillMetadata(skillName, skillPath) {
|
|
86
|
+
if (!skillPath || !fs.existsSync(skillPath))
|
|
87
|
+
return { name: skillName, description: '', keywords: [], triggers: [] };
|
|
88
|
+
try {
|
|
89
|
+
const content = fs.readFileSync(skillPath, 'utf8');
|
|
90
|
+
const nameMatch = content.match(/^name:\s*(.+)/m);
|
|
91
|
+
const descMatch = content.match(/^description:\s*"?(.+?)"?\s*$/m);
|
|
92
|
+
return {
|
|
93
|
+
name: nameMatch?.[1]?.trim() || skillName,
|
|
94
|
+
description: normalizeSkillDescription(descMatch?.[1]),
|
|
95
|
+
keywords: parseSkillMetadataList(content, 'keywords'),
|
|
96
|
+
triggers: parseSkillMetadataList(content, 'triggers'),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return { name: skillName, description: '', keywords: [], triggers: [] };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
export function formatSkillListItem(skill) {
|
|
104
|
+
const name = String(skill.name || skill.id).trim();
|
|
105
|
+
const label = name && name !== skill.id ? `${name} (${skill.id})` : skill.id;
|
|
106
|
+
const description = normalizeSkillDescription(skill.description);
|
|
107
|
+
const routing = formatSkillRoutingMetadata(skill);
|
|
108
|
+
return description ? `- ${label} — ${description}${routing}` : `- ${label}${routing}`;
|
|
109
|
+
}
|
|
110
|
+
function formatSkillPath(skillName, skillPath) {
|
|
111
|
+
if (!skillPath)
|
|
112
|
+
return `${skillName}: unavailable`;
|
|
113
|
+
const meta = readSkillMetadata(skillName, skillPath);
|
|
114
|
+
const label = meta.name && meta.name !== skillName ? `${meta.name} (${skillName})` : skillName;
|
|
115
|
+
return meta.description
|
|
116
|
+
? `${label}: ${skillPath} — ${meta.description}${formatSkillRoutingMetadata(meta)}`
|
|
117
|
+
: `${label}: ${skillPath}${formatSkillRoutingMetadata(meta)}`;
|
|
118
|
+
}
|
|
24
119
|
// ─── Legacy A1 Source Hashes ─────────────────────────
|
|
25
120
|
// MD5 hashes of source templates (unrendered) for every historical pre-hash version.
|
|
26
121
|
// Used to identify known stock files during pre-hash migration.
|
|
@@ -64,6 +159,8 @@ export function loadActiveSkills() {
|
|
|
64
159
|
id: d.name,
|
|
65
160
|
name: nameMatch?.[1]?.trim() || d.name,
|
|
66
161
|
description: descMatch?.[1]?.trim() || '',
|
|
162
|
+
keywords: parseSkillMetadataList(content, 'keywords'),
|
|
163
|
+
triggers: parseSkillMetadataList(content, 'triggers'),
|
|
67
164
|
content,
|
|
68
165
|
};
|
|
69
166
|
})
|
|
@@ -148,6 +245,8 @@ const DESKTOP_CONTROL_ANCHOR_OPEN = '<!-- anchor:desktop-control -->';
|
|
|
148
245
|
const DESKTOP_CONTROL_ANCHOR_CLOSE = '<!-- /anchor:desktop-control -->';
|
|
149
246
|
const DASHBOARD_CONNECTOR_ANCHOR_OPEN = '<!-- anchor:dashboard-connector-intent -->';
|
|
150
247
|
const DASHBOARD_CONNECTOR_ANCHOR_CLOSE = '<!-- /anchor:dashboard-connector-intent -->';
|
|
248
|
+
const SESSION_POLL_ANCHOR_OPEN = '<!-- anchor:session-poll -->';
|
|
249
|
+
const SESSION_POLL_ANCHOR_CLOSE = '<!-- /anchor:session-poll -->';
|
|
151
250
|
function extractAnchorBlock(rendered, open, close) {
|
|
152
251
|
const start = rendered.indexOf(open);
|
|
153
252
|
const end = rendered.indexOf(close);
|
|
@@ -164,14 +263,6 @@ function appendAnchorIfMissing(fileContent, rendered, open, close) {
|
|
|
164
263
|
const sep = fileContent.endsWith('\n') ? '\n' : '\n\n';
|
|
165
264
|
return fileContent + sep + block + '\n';
|
|
166
265
|
}
|
|
167
|
-
/**
|
|
168
|
-
* Extract the Desktop/Browser Control anchor block from the rendered A1
|
|
169
|
-
* template. Returns null when the template lacks the anchor pair (keeps
|
|
170
|
-
* future refactors from silently producing empty appends).
|
|
171
|
-
*/
|
|
172
|
-
function extractDesktopControlAnchor(rendered) {
|
|
173
|
-
return extractAnchorBlock(rendered, DESKTOP_CONTROL_ANCHOR_OPEN, DESKTOP_CONTROL_ANCHOR_CLOSE);
|
|
174
|
-
}
|
|
175
266
|
/**
|
|
176
267
|
* Safely append the Desktop/Browser Control anchor block to a user-edited
|
|
177
268
|
* A1 file when the anchor is missing. Returns true when an append was made.
|
|
@@ -182,6 +273,9 @@ function ensureDesktopControlAnchor(fileContent, rendered) {
|
|
|
182
273
|
function ensureDashboardConnectorAnchor(fileContent, rendered) {
|
|
183
274
|
return appendAnchorIfMissing(fileContent, rendered, DASHBOARD_CONNECTOR_ANCHOR_OPEN, DASHBOARD_CONNECTOR_ANCHOR_CLOSE);
|
|
184
275
|
}
|
|
276
|
+
function ensureSessionPollAnchor(fileContent, rendered) {
|
|
277
|
+
return appendAnchorIfMissing(fileContent, rendered, SESSION_POLL_ANCHOR_OPEN, SESSION_POLL_ANCHOR_CLOSE);
|
|
278
|
+
}
|
|
185
279
|
// ─── Initialize prompt files ─────────────────────────
|
|
186
280
|
export function initPromptFiles() {
|
|
187
281
|
const a1Content = getA1Content();
|
|
@@ -217,7 +311,12 @@ export function initPromptFiles() {
|
|
|
217
311
|
userText = appendedConnector;
|
|
218
312
|
console.log('[prompt] A-1.md: appended dashboard-connector-intent anchor (user edits preserved)');
|
|
219
313
|
}
|
|
220
|
-
|
|
314
|
+
const appendedSessionPoll = ensureSessionPollAnchor(userText, a1Content);
|
|
315
|
+
if (appendedSessionPoll) {
|
|
316
|
+
userText = appendedSessionPoll;
|
|
317
|
+
console.log('[prompt] A-1.md: appended session-poll anchor (user edits preserved)');
|
|
318
|
+
}
|
|
319
|
+
if (appendedDesktop || appendedConnector || appendedSessionPoll) {
|
|
221
320
|
fs.writeFileSync(A1_PATH, userText);
|
|
222
321
|
}
|
|
223
322
|
else {
|
|
@@ -335,21 +434,6 @@ function appendLegacyMemoryContext(prompt) {
|
|
|
335
434
|
catch { /* memory not ready */ }
|
|
336
435
|
return next;
|
|
337
436
|
}
|
|
338
|
-
function appendAdvancedMemoryContext(prompt, currentPrompt, providedSnapshot = '') {
|
|
339
|
-
let next = prompt;
|
|
340
|
-
const profile = loadProfileSummary(800);
|
|
341
|
-
const snapshot = providedSnapshot || buildTaskSnapshot(currentPrompt, 2800);
|
|
342
|
-
next += '\n\n---\n## Memory Runtime\n';
|
|
343
|
-
next += '- indexed memory context is active\n';
|
|
344
|
-
next += '- use task snapshot and profile context before assuming missing memory\n';
|
|
345
|
-
if (profile) {
|
|
346
|
-
next += '\n\n## Profile Context\n' + profile;
|
|
347
|
-
}
|
|
348
|
-
if (snapshot) {
|
|
349
|
-
next += '\n\n' + snapshot;
|
|
350
|
-
}
|
|
351
|
-
return next;
|
|
352
|
-
}
|
|
353
437
|
export function shouldIncludeVisionClickHint(activeCli) {
|
|
354
438
|
return activeCli === 'codex';
|
|
355
439
|
}
|
|
@@ -358,9 +442,13 @@ export function getSystemPrompt(opts = {}) {
|
|
|
358
442
|
const a1 = fs.existsSync(A1_PATH) ? fs.readFileSync(A1_PATH, 'utf8') : getA1Content();
|
|
359
443
|
const a2 = fs.existsSync(A2_PATH) ? fs.readFileSync(A2_PATH, 'utf8') : '';
|
|
360
444
|
let prompt = `${a1}\n\n${a2}`;
|
|
445
|
+
const projectDirs = getProjectDirs();
|
|
446
|
+
if (projectDirs && projectDirs.length > 0) {
|
|
447
|
+
const rootLines = projectDirs.map(d => `Project root: ${d}`).join('\n');
|
|
448
|
+
prompt = `${rootLines}\n\n${prompt}`;
|
|
449
|
+
}
|
|
361
450
|
const currentPrompt = String(opts.currentPrompt || '').trim();
|
|
362
451
|
const forDisk = opts.forDisk === true;
|
|
363
|
-
const mem = getMemoryStatus();
|
|
364
452
|
// Phase 15: Telegram guidance is now part of A1_CONTENT (hardcoded)
|
|
365
453
|
// No dynamic injection needed — Bot-First policy with curl examples included
|
|
366
454
|
if (!forDisk) {
|
|
@@ -433,7 +521,10 @@ export function getSystemPrompt(opts = {}) {
|
|
|
433
521
|
prompt += '\n\n---\n' + renderTemplate(loadTemplate('heartbeat-jobs.md'), vars);
|
|
434
522
|
}
|
|
435
523
|
}
|
|
436
|
-
catch {
|
|
524
|
+
catch (error) {
|
|
525
|
+
prompt += '\n\n---\n## Heartbeat Jobs\n';
|
|
526
|
+
prompt += `Heartbeat file failed to load: ${error.message}\n`;
|
|
527
|
+
}
|
|
437
528
|
try {
|
|
438
529
|
const activeSkills = loadActiveSkills();
|
|
439
530
|
const refSkills = loadSkillRegistry();
|
|
@@ -443,9 +534,21 @@ export function getSystemPrompt(opts = {}) {
|
|
|
443
534
|
prompt += '\n\n---\n## Skills System\n';
|
|
444
535
|
const vars = getTemplateVars();
|
|
445
536
|
vars["ACTIVE_SKILLS_COUNT"] = String(activeSkills.length);
|
|
446
|
-
vars["ACTIVE_SKILLS_LIST"] = activeSkills.map(s =>
|
|
537
|
+
vars["ACTIVE_SKILLS_LIST"] = activeSkills.map(s => formatSkillListItem({
|
|
538
|
+
id: s.id,
|
|
539
|
+
name: s.name,
|
|
540
|
+
description: s.description,
|
|
541
|
+
keywords: s.keywords,
|
|
542
|
+
triggers: s.triggers,
|
|
543
|
+
})).join('\n');
|
|
447
544
|
vars["REF_SKILLS_COUNT"] = String(availableRef.length);
|
|
448
|
-
vars["REF_SKILLS_LIST"] = availableRef.map(s =>
|
|
545
|
+
vars["REF_SKILLS_LIST"] = availableRef.map(s => formatSkillListItem({
|
|
546
|
+
id: s.id,
|
|
547
|
+
name: s.name,
|
|
548
|
+
description: s.description,
|
|
549
|
+
keywords: s.keywords,
|
|
550
|
+
triggers: s.triggers,
|
|
551
|
+
})).join('\n');
|
|
449
552
|
// Only render sections that have content
|
|
450
553
|
if (activeSkills.length > 0 && availableRef.length > 0) {
|
|
451
554
|
prompt += renderTemplate(loadTemplate('skills.md'), vars);
|
|
@@ -460,8 +563,9 @@ export function getSystemPrompt(opts = {}) {
|
|
|
460
563
|
else {
|
|
461
564
|
// Only ref skills
|
|
462
565
|
const tmpl = loadTemplate('skills.md');
|
|
566
|
+
const matchingSection = tmpl.split('### Active Skills')[0];
|
|
463
567
|
const refSection = tmpl.substring(tmpl.indexOf('### Available Skills'));
|
|
464
|
-
prompt += renderTemplate(refSection, vars);
|
|
568
|
+
prompt += renderTemplate(matchingSection + refSection, vars);
|
|
465
569
|
}
|
|
466
570
|
}
|
|
467
571
|
}
|
|
@@ -514,9 +618,19 @@ export function getEmployeePrompt(emp) {
|
|
|
514
618
|
const activeSkills = loadActiveSkills();
|
|
515
619
|
if (activeSkills.length > 0) {
|
|
516
620
|
let section = `\n## Active Skills (${activeSkills.length})\n`;
|
|
517
|
-
section += `Installed skills — automatically triggered by the CLI.\n`;
|
|
621
|
+
section += `Installed skills — automatically triggered by the CLI. Use each description to decide whether to read its SKILL.md.\n`;
|
|
622
|
+
section += `Read active skills from ${SKILLS_DIR}/<skill-id>/SKILL.md.\n`;
|
|
623
|
+
section += `Match by intent, not exact words: compare the request, files, domain nouns, output, and task verbs against visible skill names, descriptions, and any listed metadata, keywords, or triggers.\n`;
|
|
624
|
+
section += `When uncertain, inspect the best candidate: if metadata suggests a plausible match, read that SKILL.md once before deciding it does not apply.\n`;
|
|
625
|
+
section += `Search intent override: for "검색", "검색해", "찾아봐", "알아봐", "look up", or "search" targeting external/current/docs/library information, inspect the active search skill before local Grep/Glob.\n`;
|
|
518
626
|
for (const s of activeSkills) {
|
|
519
|
-
section +=
|
|
627
|
+
section += `${formatSkillListItem({
|
|
628
|
+
id: s.id,
|
|
629
|
+
name: s.name,
|
|
630
|
+
description: s.description,
|
|
631
|
+
keywords: s.keywords,
|
|
632
|
+
triggers: s.triggers,
|
|
633
|
+
})}\n`;
|
|
520
634
|
}
|
|
521
635
|
vars["ACTIVE_SKILLS_SECTION"] = section;
|
|
522
636
|
}
|
|
@@ -525,12 +639,16 @@ export function getEmployeePrompt(emp) {
|
|
|
525
639
|
return renderTemplate(loadTemplate('employee.md'), vars);
|
|
526
640
|
}
|
|
527
641
|
// ─── Employee Prompt v2 (orchestration phase-aware) ──
|
|
528
|
-
export function getEmployeePromptV2(emp, role, currentPhase) {
|
|
642
|
+
export function getEmployeePromptV2(emp, role, currentPhase, opts) {
|
|
529
643
|
const phase = Number(currentPhase);
|
|
530
|
-
const cacheKey = `${emp.id || emp.name}:${role}:${phase}:${settings["workingDir"] || '~'}`;
|
|
644
|
+
const cacheKey = `${emp.id || emp.name}:${role}:${phase}:${settings["workingDir"] || '~'}:${opts?.mutable ? 'mut' : 'ro'}:${opts?.scope || ''}`;
|
|
531
645
|
if (promptCache.has(cacheKey))
|
|
532
646
|
return promptCache.get(cacheKey);
|
|
533
647
|
let prompt = getEmployeePrompt(emp);
|
|
648
|
+
// --mutable: override the hard read-only block in employee.md
|
|
649
|
+
if (opts?.mutable) {
|
|
650
|
+
prompt = prompt.replace(/- ⛔ Do NOT create, modify, or delete files\..*/, `- ✅ You are authorized to create or modify files${opts.scope ? ` inside \`${opts.scope}\`` : ''}. Protected paths (.git, .env, settings.json) remain blocked.`);
|
|
651
|
+
}
|
|
534
652
|
// Static-employee system prompt patch (Control etc.) injected near the top
|
|
535
653
|
// so role-specific guidance downstream can still override style/tone.
|
|
536
654
|
const staticSpec = findStaticEmployee(emp?.name || '');
|
|
@@ -544,91 +662,48 @@ export function getEmployeePromptV2(emp, role, currentPhase) {
|
|
|
544
662
|
console.warn(`[prompt] ${staticSpec.name} system patch load failed:`, e.message);
|
|
545
663
|
}
|
|
546
664
|
}
|
|
547
|
-
//
|
|
548
|
-
//
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
665
|
+
// Skill bodies are intentionally not inlined. Each employee receives a
|
|
666
|
+
// compact path contract and reads only the guide needed for the task.
|
|
667
|
+
const devCommonPath = findSkillPath('dev');
|
|
668
|
+
const scaffoldingPath = findSkillPath('dev-scaffolding');
|
|
669
|
+
const ROLE_SKILL_NAME_MAP = {
|
|
670
|
+
frontend: 'dev-frontend',
|
|
671
|
+
backend: 'dev-backend',
|
|
672
|
+
data: 'dev-data',
|
|
673
|
+
docs: 'doc-coauthoring',
|
|
674
|
+
custom: null,
|
|
675
|
+
};
|
|
676
|
+
const roleSkillName = ROLE_SKILL_NAME_MAP[role] ?? null;
|
|
677
|
+
const roleSkillPath = roleSkillName ? findSkillPath(roleSkillName) : null;
|
|
678
|
+
const pabcdPath = findSkillPath('dev-pabcd');
|
|
679
|
+
const reviewerPath = findSkillPath('dev-code-reviewer');
|
|
680
|
+
const testingPath = findSkillPath('dev-testing');
|
|
681
|
+
prompt += `\n\n## Skill Loading Contract`;
|
|
682
|
+
prompt += `\nSkill bodies are not preloaded. Read each guide once, only when the task requires it.`;
|
|
683
|
+
prompt += `\n- Match by intent, not exact words: compare the task, files, domain nouns, output, and task verbs against visible skill names, descriptions, and any listed metadata, keywords, or triggers.`;
|
|
684
|
+
prompt += `\n- When uncertain, inspect the best candidate: if metadata suggests a plausible match, read that SKILL.md once before deciding it does not apply.`;
|
|
685
|
+
prompt += `\n- Search intent override: for "검색", "검색해", "찾아봐", "알아봐", "look up", or "search" targeting external/current/docs/library information, inspect the active search skill before local Grep/Glob.`;
|
|
686
|
+
prompt += `\n- Common dev guide: ${formatSkillPath('dev', devCommonPath)}`;
|
|
687
|
+
prompt += `\n- Scaffolding guide: ${formatSkillPath('dev-scaffolding', scaffoldingPath)} (read only for new projects, new modules, or structure audits)`;
|
|
553
688
|
if (staticSpec?.skills?.length) {
|
|
689
|
+
prompt += `\n- Static employee skills:`;
|
|
554
690
|
for (const skillName of staticSpec.skills) {
|
|
555
|
-
|
|
556
|
-
join(SKILLS_DIR, skillName, 'SKILL.md'),
|
|
557
|
-
join(SKILLS_REF_DIR, skillName, 'SKILL.md'),
|
|
558
|
-
getRepoBundledSkillPath('skills', skillName, 'SKILL.md'),
|
|
559
|
-
getRepoBundledSkillPath('skills_ref', skillName, 'SKILL.md'),
|
|
560
|
-
]);
|
|
561
|
-
if (skillPath && fs.existsSync(skillPath)) {
|
|
562
|
-
prompt += `\n\n## Skill: ${skillName} (inlined — do NOT read from disk)\n${fs.readFileSync(skillPath, 'utf8')}`;
|
|
563
|
-
}
|
|
564
|
-
else {
|
|
565
|
-
console.warn(`[prompt] ${staticSpec.name}: skill '${skillName}' not found on disk — check SKILLS_DIR/SKILLS_REF_DIR`);
|
|
566
|
-
}
|
|
691
|
+
prompt += `\n - ${formatSkillPath(skillName, findSkillPath(skillName))}`;
|
|
567
692
|
}
|
|
568
693
|
}
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
}
|
|
577
|
-
// ─── 1b. Scaffolding guide (always injected)
|
|
578
|
-
const scaffoldingPath = findFirstExistingPath([
|
|
579
|
-
join(SKILLS_DIR, 'dev-scaffolding', 'SKILL.md'),
|
|
580
|
-
getRepoBundledSkillPath('skills', 'dev-scaffolding', 'SKILL.md'),
|
|
581
|
-
]);
|
|
582
|
-
if (scaffoldingPath) {
|
|
583
|
-
prompt += `\n\n## Project Scaffolding Guide\n${fs.readFileSync(scaffoldingPath, 'utf8')}`;
|
|
584
|
-
}
|
|
585
|
-
// ─── 2. Role-based dev skill injection
|
|
586
|
-
const ROLE_SKILL_MAP = {
|
|
587
|
-
frontend: findFirstExistingPath([
|
|
588
|
-
join(SKILLS_DIR, 'dev-frontend', 'SKILL.md'),
|
|
589
|
-
getRepoBundledSkillPath('skills', 'dev-frontend', 'SKILL.md'),
|
|
590
|
-
]),
|
|
591
|
-
backend: findFirstExistingPath([
|
|
592
|
-
join(SKILLS_DIR, 'dev-backend', 'SKILL.md'),
|
|
593
|
-
getRepoBundledSkillPath('skills', 'dev-backend', 'SKILL.md'),
|
|
594
|
-
]),
|
|
595
|
-
data: findFirstExistingPath([
|
|
596
|
-
join(SKILLS_DIR, 'dev-data', 'SKILL.md'),
|
|
597
|
-
getRepoBundledSkillPath('skills', 'dev-data', 'SKILL.md'),
|
|
598
|
-
]),
|
|
599
|
-
docs: findFirstExistingPath([
|
|
600
|
-
join(SKILLS_DIR, 'documentation', 'SKILL.md'),
|
|
601
|
-
getRepoBundledSkillPath('skills', 'documentation', 'SKILL.md'),
|
|
602
|
-
]),
|
|
603
|
-
custom: null,
|
|
604
|
-
};
|
|
605
|
-
const skillPath = ROLE_SKILL_MAP[role];
|
|
606
|
-
if (skillPath && fs.existsSync(skillPath)) {
|
|
607
|
-
prompt += `\n\n## Development Guide (${role})\n${fs.readFileSync(skillPath, 'utf8')}`;
|
|
608
|
-
}
|
|
609
|
-
// ─── 3a. Plan audit phase(2) → inject dev-code-reviewer
|
|
694
|
+
prompt += `\n\n## Role Contract`;
|
|
695
|
+
prompt += `\n- Role: ${role}`;
|
|
696
|
+
prompt += `\n- Role guide: ${roleSkillName ? formatSkillPath(roleSkillName, roleSkillPath) : 'none'}`;
|
|
697
|
+
prompt += `\n- Apply this role on every assigned task. Before role-specific implementation or review, read the role guide once if it is available.`;
|
|
698
|
+
prompt += `\n- Also read the common dev guide before modifying code.`;
|
|
699
|
+
prompt += `\n\n## Phase Guide`;
|
|
700
|
+
prompt += `\n- Use the phase context below as the source of truth for what this employee should do now.`;
|
|
701
|
+
prompt += `\n- Full PABCD guide: ${formatSkillPath('dev-pabcd', pabcdPath)} (read only if phase rules are unclear).`;
|
|
610
702
|
if (phase === 2) {
|
|
611
|
-
|
|
612
|
-
join(SKILLS_DIR, 'dev-code-reviewer', 'SKILL.md'),
|
|
613
|
-
join(SKILLS_REF_DIR, 'dev-code-reviewer', 'SKILL.md'),
|
|
614
|
-
getRepoBundledSkillPath('skills', 'dev-code-reviewer', 'SKILL.md'),
|
|
615
|
-
getRepoBundledSkillPath('skills_ref', 'dev-code-reviewer', 'SKILL.md'),
|
|
616
|
-
]);
|
|
617
|
-
if (reviewerPath) {
|
|
618
|
-
prompt += `\n\n## Code Review Guide (Phase 2 — Strict Audit)\n${fs.readFileSync(reviewerPath, 'utf8')}`;
|
|
619
|
-
}
|
|
703
|
+
prompt += `\n- Phase 2 audit: read ${formatSkillPath('dev-code-reviewer', reviewerPath)} before reviewing plans or code.`;
|
|
620
704
|
}
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
const testingPath = findFirstExistingPath([
|
|
624
|
-
join(SKILLS_DIR, 'dev-testing', 'SKILL.md'),
|
|
625
|
-
join(SKILLS_REF_DIR, 'dev-testing', 'SKILL.md'),
|
|
626
|
-
getRepoBundledSkillPath('skills', 'dev-testing', 'SKILL.md'),
|
|
627
|
-
getRepoBundledSkillPath('skills_ref', 'dev-testing', 'SKILL.md'),
|
|
628
|
-
]);
|
|
629
|
-
if (testingPath) {
|
|
630
|
-
prompt += `\n\n## Testing Guide (Phase 4)\n${fs.readFileSync(testingPath, 'utf8')}`;
|
|
631
|
-
}
|
|
705
|
+
else if (phase === 4) {
|
|
706
|
+
prompt += `\n- Phase 4 check: read ${formatSkillPath('dev-testing', testingPath)} before designing or running verification.`;
|
|
632
707
|
}
|
|
633
708
|
// ─── 4. Employee context (PABCD-aware)
|
|
634
709
|
const workerContexts = parseWorkerContexts();
|
|
@@ -641,7 +716,7 @@ export function getEmployeePromptV2(emp, role, currentPhase) {
|
|
|
641
716
|
prompt += `\n- Report results clearly with specific file paths and line numbers`;
|
|
642
717
|
prompt += `\n- Your process cwd may be an isolated temporary directory. Do NOT treat process.cwd() as the repository root.`;
|
|
643
718
|
prompt += `\n- Use the task's ## Workspace Context block as the source of truth for Project root and Devlog root.`;
|
|
644
|
-
prompt += `\n- Resolve relative repository paths against Project root, and
|
|
719
|
+
prompt += `\n- Resolve relative repository paths against Project root, and always use absolute paths in commands and reports.`;
|
|
645
720
|
prompt += `\n\n## Delegation Rules`;
|
|
646
721
|
prompt += `\n- Execute the assigned task directly in this employee session.`;
|
|
647
722
|
prompt += `\n- You CAN use CLI sub-agents (Task/Agent tool) for parallel work: research, file reads, code analysis. This is encouraged.`;
|