cli-jaw 2.0.5 → 2.0.6
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 +229 -315
- package/README.ko.md +248 -315
- package/README.md +103 -186
- package/README.zh-CN.md +282 -296
- package/dist/bin/commands/browser-web-ai.js +4 -2
- package/dist/bin/commands/browser-web-ai.js.map +1 -1
- package/dist/bin/commands/browser.js +76 -0
- package/dist/bin/commands/browser.js.map +1 -1
- package/dist/bin/commands/doctor.js +122 -4
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/skill.js +5 -3
- package/dist/bin/commands/skill.js.map +1 -1
- package/dist/bin/postinstall.js +507 -89
- package/dist/bin/postinstall.js.map +1 -1
- package/dist/lib/mcp/format-converters.js +32 -4
- package/dist/lib/mcp/format-converters.js.map +1 -1
- package/dist/lib/mcp/mcp-install.js +5 -0
- package/dist/lib/mcp/mcp-install.js.map +1 -1
- package/dist/lib/mcp/skills-distribution.js +52 -53
- package/dist/lib/mcp/skills-distribution.js.map +1 -1
- package/dist/lib/mcp/skills-reset.js +29 -16
- package/dist/lib/mcp/skills-reset.js.map +1 -1
- package/dist/lib/mcp/skills-utils.js +64 -2
- package/dist/lib/mcp/skills-utils.js.map +1 -1
- package/dist/lib/mcp/unified-config.js +7 -3
- package/dist/lib/mcp/unified-config.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 +44 -4
- package/dist/server.js.map +1 -1
- package/dist/src/agent/args.js +148 -1
- package/dist/src/agent/args.js.map +1 -1
- package/dist/src/agent/claude-e-runtime.js +42 -0
- package/dist/src/agent/claude-e-runtime.js.map +1 -0
- package/dist/src/agent/claude-i-runtime.js +42 -0
- package/dist/src/agent/claude-i-runtime.js.map +1 -0
- package/dist/src/agent/cli-helpers.js +9 -0
- package/dist/src/agent/cli-helpers.js.map +1 -0
- package/dist/src/agent/codex-app-client.js +240 -0
- package/dist/src/agent/codex-app-client.js.map +1 -0
- package/dist/src/agent/codex-app-events.js +268 -0
- package/dist/src/agent/codex-app-events.js.map +1 -0
- package/dist/src/agent/error-classifier.js +8 -2
- package/dist/src/agent/error-classifier.js.map +1 -1
- package/dist/src/agent/events/acp.js +200 -0
- package/dist/src/agent/events/acp.js.map +1 -0
- package/dist/src/agent/events/claude.js +200 -0
- package/dist/src/agent/events/claude.js.map +1 -0
- package/dist/src/agent/events/codex.js +118 -0
- package/dist/src/agent/events/codex.js.map +1 -0
- package/dist/src/agent/events/gemini.js +100 -0
- package/dist/src/agent/events/gemini.js.map +1 -0
- package/dist/src/agent/events/grok.js +298 -0
- package/dist/src/agent/events/grok.js.map +1 -0
- package/dist/src/agent/events/helpers.js +237 -0
- package/dist/src/agent/events/helpers.js.map +1 -0
- package/dist/src/agent/events/index.js +315 -0
- package/dist/src/agent/events/index.js.map +1 -0
- package/dist/src/agent/events/opencode.js +171 -0
- package/dist/src/agent/events/opencode.js.map +1 -0
- package/dist/src/agent/events/summary.js +128 -0
- package/dist/src/agent/events/summary.js.map +1 -0
- package/dist/src/agent/events/tool-labels.js +299 -0
- package/dist/src/agent/events/tool-labels.js.map +1 -0
- package/dist/src/agent/events/types.js +3 -0
- package/dist/src/agent/events/types.js.map +1 -0
- package/dist/src/agent/events.js +2 -1487
- package/dist/src/agent/events.js.map +1 -1
- package/dist/src/agent/grok-trace-backfill.js +153 -0
- package/dist/src/agent/grok-trace-backfill.js.map +1 -0
- package/dist/src/agent/lifecycle-handler.js +60 -16
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/live-run-state.js +1 -1
- package/dist/src/agent/live-run-state.js.map +1 -1
- package/dist/src/agent/memory-flush-controller.js +26 -0
- package/dist/src/agent/memory-flush-controller.js.map +1 -1
- package/dist/src/agent/resume-classifier.js +9 -0
- package/dist/src/agent/resume-classifier.js.map +1 -1
- package/dist/src/agent/session-persistence.js +7 -2
- package/dist/src/agent/session-persistence.js.map +1 -1
- package/dist/src/agent/spawn/process-kill.js +29 -0
- package/dist/src/agent/spawn/process-kill.js.map +1 -0
- package/dist/src/agent/spawn/queue.js +273 -0
- package/dist/src/agent/spawn/queue.js.map +1 -0
- package/dist/src/agent/spawn/resume.js +56 -0
- package/dist/src/agent/spawn/resume.js.map +1 -0
- package/dist/src/agent/spawn.js +435 -371
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/agent/watchdog.js +5 -1
- package/dist/src/agent/watchdog.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/browser-escalation.js +177 -0
- package/dist/src/browser/adaptive-fetch/browser-escalation.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/browser-runtime.js +38 -0
- package/dist/src/browser/adaptive-fetch/browser-runtime.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/browser-session.js +97 -0
- package/dist/src/browser/adaptive-fetch/browser-session.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/challenge-detector.js +88 -0
- package/dist/src/browser/adaptive-fetch/challenge-detector.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/content-scorer.js +145 -0
- package/dist/src/browser/adaptive-fetch/content-scorer.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js +382 -0
- package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/fetcher.js +105 -0
- package/dist/src/browser/adaptive-fetch/fetcher.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/human-loop.js +101 -0
- package/dist/src/browser/adaptive-fetch/human-loop.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/index.js +586 -0
- package/dist/src/browser/adaptive-fetch/index.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/metadata.js +169 -0
- package/dist/src/browser/adaptive-fetch/metadata.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/output.js +71 -0
- package/dist/src/browser/adaptive-fetch/output.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/reader-adapters.js +135 -0
- package/dist/src/browser/adaptive-fetch/reader-adapters.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/safety.js +296 -0
- package/dist/src/browser/adaptive-fetch/safety.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/third-party-readers.js +43 -0
- package/dist/src/browser/adaptive-fetch/third-party-readers.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/trace.js +61 -0
- package/dist/src/browser/adaptive-fetch/trace.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/transforms.js +81 -0
- package/dist/src/browser/adaptive-fetch/transforms.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/validators.js +108 -0
- package/dist/src/browser/adaptive-fetch/validators.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/waf-profiles.js +135 -0
- package/dist/src/browser/adaptive-fetch/waf-profiles.js.map +1 -0
- package/dist/src/browser/index.js +1 -0
- package/dist/src/browser/index.js.map +1 -1
- package/dist/src/browser/web-ai/gemini-model.js +42 -15
- package/dist/src/browser/web-ai/gemini-model.js.map +1 -1
- package/dist/src/cli/claude-models.js +1 -1
- package/dist/src/cli/claude-models.js.map +1 -1
- package/dist/src/cli/compact.js +2 -0
- package/dist/src/cli/compact.js.map +1 -1
- package/dist/src/cli/handlers-completions.js +3 -0
- package/dist/src/cli/handlers-completions.js.map +1 -1
- package/dist/src/cli/handlers-runtime.js +5 -2
- package/dist/src/cli/handlers-runtime.js.map +1 -1
- package/dist/src/cli/readiness.js +43 -1
- package/dist/src/cli/readiness.js.map +1 -1
- package/dist/src/cli/registry.js +58 -0
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/core/browser-open.js +4 -1
- package/dist/src/core/browser-open.js.map +1 -1
- package/dist/src/core/claude-install.js +4 -0
- package/dist/src/core/claude-install.js.map +1 -1
- package/dist/src/core/cli-detect.js +61 -13
- package/dist/src/core/cli-detect.js.map +1 -1
- package/dist/src/core/compact.js +295 -63
- package/dist/src/core/compact.js.map +1 -1
- package/dist/src/core/config.js +151 -11
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +10 -1
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/employees.js +1 -1
- package/dist/src/core/employees.js.map +1 -1
- package/dist/src/core/logger.js +28 -9
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/runtime-settings.js +32 -5
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/manager/memory/embedding/state-machine.js +2 -1
- package/dist/src/manager/memory/embedding/state-machine.js.map +1 -1
- package/dist/src/manager/memory/embedding/sync.js +52 -33
- package/dist/src/manager/memory/embedding/sync.js.map +1 -1
- package/dist/src/manager/memory/embedding/vec-store.js +10 -10
- package/dist/src/manager/memory/embedding/vec-store.js.map +1 -1
- package/dist/src/manager/routes/dashboard-memory.js +43 -16
- package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
- package/dist/src/manager/server.js +11 -0
- package/dist/src/manager/server.js.map +1 -1
- package/dist/src/memory/indexing.js +6 -1
- package/dist/src/memory/indexing.js.map +1 -1
- package/dist/src/orchestrator/distribute.js +5 -4
- package/dist/src/orchestrator/distribute.js.map +1 -1
- package/dist/src/prompt/builder.js +12 -1
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/runtime-context.js +69 -0
- package/dist/src/prompt/runtime-context.js.map +1 -0
- package/dist/src/routes/browser.js +33 -0
- package/dist/src/routes/browser.js.map +1 -1
- package/dist/src/routes/employees.js +1 -1
- package/dist/src/routes/employees.js.map +1 -1
- package/dist/src/routes/memory.js +1 -1
- package/dist/src/routes/memory.js.map +1 -1
- package/dist/src/routes/orchestrate.js +37 -10
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/quota.js +91 -1
- package/dist/src/routes/quota.js.map +1 -1
- package/dist/src/routes/runtime-context.js +43 -0
- package/dist/src/routes/runtime-context.js.map +1 -0
- package/dist/src/routes/security-audit.js +14 -0
- package/dist/src/routes/security-audit.js.map +1 -0
- package/dist/src/routes/settings.js +8 -1
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/security/security-audit-log.js +99 -0
- package/dist/src/security/security-audit-log.js.map +1 -0
- package/dist/src/telegram/bot.js +4 -2
- package/dist/src/telegram/bot.js.map +1 -1
- package/dist/src/types/cli-engine.js +4 -0
- package/dist/src/types/cli-engine.js.map +1 -1
- package/dist/src/types/cli-events.js +1 -1
- package/dist/src/types/cli-events.js.map +1 -1
- package/package.json +9 -3
- package/public/assets/providers/antigravity-color.svg +1 -0
- package/public/assets/providers/antigravity.svg +1 -0
- package/public/assets/providers/copilot-color.svg +1 -1
- package/public/assets/providers/copilot.svg +1 -1
- package/public/assets/providers/grok-color.svg +1 -0
- package/public/assets/providers/grok.svg +1 -0
- package/public/css/chat-search.css +168 -0
- package/public/css/chat.css +43 -1
- package/public/css/modals.css +41 -0
- package/public/dist/assets/{AdvancedExport-BAdZUC-6.js → AdvancedExport-CBvz4_IZ.js} +1 -1
- package/public/dist/assets/Agent-DlUqCMXJ.js +1 -0
- package/public/dist/assets/{Browser-BsdxDVgM.js → Browser-66BpLQck.js} +1 -1
- package/public/dist/assets/{ChannelsDiscord-Dg_jto6l.js → ChannelsDiscord-BifT2Dum.js} +1 -1
- package/public/dist/assets/{ChannelsTelegram-DGyZfJGS.js → ChannelsTelegram-CK6tYQ8k.js} +1 -1
- package/public/dist/assets/DashboardEmbeddingSection-6F8zSSja.js +2 -0
- package/public/dist/assets/{DashboardMeta-CAH9ONTb.js → DashboardMeta-Cc03HT5R.js} +1 -1
- package/public/dist/assets/{Display-DM_yvyKL.js → Display-arOjcMQZ.js} +1 -1
- package/public/dist/assets/Employees-YbW-mI67.js +1 -0
- package/public/dist/assets/{HealthBadge-Dtr-dDnw.js → HealthBadge-DEPFkcA0.js} +1 -1
- package/public/dist/assets/Heartbeat-CW4eIhtJ.js +1 -0
- package/public/dist/assets/{InlineWarn-E64UaKFh.js → InlineWarn-DoJS7AgM.js} +1 -1
- package/public/dist/assets/{Mcp-Dlp2X7X7.js → Mcp-ZQ6ARQb6.js} +1 -1
- package/public/dist/assets/Memory-BAUWJMqc.js +1 -0
- package/public/dist/assets/{MilkdownWysiwygEditor-Ctww8i0L.js → MilkdownWysiwygEditor-IAqFtXvM.js} +1 -1
- package/public/dist/assets/ModelProvider-DUtmFh0J.js +1 -0
- package/public/dist/assets/{Network-Df1R2YcQ.js → Network-B_4E82zQ.js} +1 -1
- package/public/dist/assets/{Permissions-BKJ5K6EL.js → Permissions-BkADXjQ4.js} +1 -1
- package/public/dist/assets/{Permissions-CcWZoOVP.js → Permissions-DvUCB8wA.js} +1 -1
- package/public/dist/assets/{Profile-DZ7xf1WZ.js → Profile-BcnTCSYM.js} +1 -1
- package/public/dist/assets/{Prompts-Bh5DYt8e.js → Prompts-CUs_RoRE.js} +1 -1
- package/public/dist/assets/{SpeechKeys-CQwtVxOP.js → SpeechKeys-qxc-ROWN.js} +1 -1
- package/public/dist/assets/agent-meta-Du8y6mSM.js +1 -0
- package/public/dist/assets/app-CGqTcIeF.js +39 -0
- package/public/dist/assets/app-Dpk6cE6C.css +1 -0
- package/public/dist/assets/architecture-7EHR7CIX-wVaUQezY.js +1 -0
- package/public/dist/assets/architectureDiagram-3BPJPVTR-kYIVzmWe.js +36 -0
- package/public/dist/assets/blockDiagram-GPEHLZMM-B204CPhe.js +132 -0
- package/public/dist/assets/{c4Diagram-AHTNJAMY-Bp2QLC-s.js → c4Diagram-AAUBKEIU-DAv6TAjg.js} +6 -6
- package/public/dist/assets/channel-CCQujL1n.js +1 -0
- package/public/dist/assets/{chunk-EDXVE4YY-COudQKkJ.js → chunk-2J33WTMH-xiPJWKcl.js} +1 -1
- package/public/dist/assets/chunk-3OPIFGDE-DOAvk9x8.js +62 -0
- package/public/dist/assets/{chunk-4BX2VUAB-Cm3KqBkS.js → chunk-4BX2VUAB-6lTRwyT0.js} +1 -1
- package/public/dist/assets/chunk-4EGX6M5U-DXtAEgX6.js +1 -0
- package/public/dist/assets/chunk-55IACEB6-Dx2JkQLw.js +1 -0
- package/public/dist/assets/chunk-5DO6E6H7-DDcMHB95.js +1 -0
- package/public/dist/assets/chunk-5ZQYHXKU-Bd-RFO5i.js +2 -0
- package/public/dist/assets/chunk-727SXJPM-BrsRzj8z.js +206 -0
- package/public/dist/assets/{chunk-AGHRB4JF-DIMn8T3_.js → chunk-AGHRB4JF-CYdXVA2-.js} +1 -1
- package/public/dist/assets/chunk-AQP2D5EJ-Di6Gstk-.js +231 -0
- package/public/dist/assets/{chunk-LIHQZDEY-Xw9ZX8of.js → chunk-BR22UD5L-CVuYkAd1.js} +1 -1
- package/public/dist/assets/{chunk-BSJP7CBP-DnSYKjii.js → chunk-BSJP7CBP-B47GpxcW.js} +1 -1
- package/public/dist/assets/chunk-CSCIHK7Q-CAE1p4Em.js +123 -0
- package/public/dist/assets/chunk-FHYWG6QK-CxZt-yZZ.js +1 -0
- package/public/dist/assets/{chunk-FMBD7UC4-6yXYicjw.js → chunk-FMBD7UC4-CwqBlx0l.js} +1 -1
- package/public/dist/assets/chunk-KSCS5N6A-D9a4ZkOy.js +10 -0
- package/public/dist/assets/{chunk-ZZ45TVLE-D5oxCC1O.js → chunk-L5ZTLDWV-D208QbfC.js} +1 -1
- package/public/dist/assets/{chunk-336JU56O-CAt5aBOe.js → chunk-LZXEDZCA-CE2KFduj.js} +1 -1
- package/public/dist/assets/chunk-MPE355IW-Bp4qAOUf.js +1 -0
- package/public/dist/assets/chunk-MZUSXYTE-DAU-v-0c.js +1 -0
- package/public/dist/assets/chunk-N66VUXT2-CpPz1L5u.js +1 -0
- package/public/dist/assets/chunk-ND2GUHAM-zZ7h1CPf.js +1 -0
- package/public/dist/assets/chunk-NNHCCRGN-BaiX9a5F.js +159 -0
- package/public/dist/assets/{chunk-X2U36JSP-CoMFMVNF.js → chunk-NZK2D7GU-CTqFQ8K5.js} +1 -1
- package/public/dist/assets/chunk-O5CBEL6O-BTuvXKFi.js +11 -0
- package/public/dist/assets/chunk-PUPMXCY4-ppZvktf-.js +1 -0
- package/public/dist/assets/chunk-QZHKN3VN-CBAtPPT7.js +1 -0
- package/public/dist/assets/chunk-UIBZB4QT-rJZEVBX0.js +1 -0
- package/public/dist/assets/chunk-WCWK7LTN-CGvUyB8h.js +1 -0
- package/public/dist/assets/chunk-WU5MYG2G-C3fKlSvP.js +1 -0
- package/public/dist/assets/{chunk-XPW4576I-CmAz5C-j.js → chunk-XPW4576I-BaQfzRci.js} +1 -1
- package/public/dist/assets/classDiagram-4FO5ZUOK-Cb-qL5u3.js +1 -0
- package/public/dist/assets/classDiagram-v2-Q7XG4LA2-BPhGdj15.js +1 -0
- package/public/dist/assets/constants-BxG09J6S.js +1 -0
- package/public/dist/assets/cose-bilkent-S5V4N54A-D1zmarou.js +1 -0
- package/public/dist/assets/dagre-BM42HDAG-BVkBttzA.js +4 -0
- package/public/dist/assets/dagre-DnoxfNXr.js +1 -0
- package/public/dist/assets/diagram-2AECGRRQ-Bs32KPnT.js +43 -0
- package/public/dist/assets/{diagram-5BDNPKRD-Cl4PzCD0.js → diagram-5GNKFQAL-YDYgPOQj.js} +2 -2
- package/public/dist/assets/diagram-KO2AKTUF-1tIdFl26.js +3 -0
- package/public/dist/assets/{diagram-TYMM5635-B_Xoa1Gp.js → diagram-LMA3HP47-B1y15kav.js} +1 -1
- package/public/dist/assets/diagram-OG6HWLK6-C25j1jGg.js +24 -0
- package/public/dist/assets/{dist-C9LWf2uC.js → dist-0v1UKkQ3.js} +1 -1
- package/public/dist/assets/dist-BMi_buEb.js +1 -0
- package/public/dist/assets/{dist-B6G8pbap.js → dist-BQNQk-1M.js} +1 -1
- package/public/dist/assets/{dist-CCKktDoF.js → dist-BVpa_e6W.js} +1 -1
- package/public/dist/assets/dist-BkrbW_LS.js +1 -0
- package/public/dist/assets/{dist-CkMC2PPt.js → dist-C1VqWrYZ.js} +1 -1
- package/public/dist/assets/{dist-BA7sRne4.js → dist-C3vh7d65.js} +1 -1
- package/public/dist/assets/{dist-BhzKO6nt2.js → dist-CE4s7vg82.js} +1 -1
- package/public/dist/assets/{dist-BDMNMdPF.js → dist-CjPin7Mr.js} +1 -1
- package/public/dist/assets/{dist-W7IGn2ug.js → dist-Ck6PnIlo.js} +1 -1
- package/public/dist/assets/{dist-B1rKu9eP.js → dist-CnIrGAPx.js} +1 -1
- package/public/dist/assets/{dist-CEDX2HGI.js → dist-Cv8S3FhF.js} +1 -1
- package/public/dist/assets/{dist-55MYVjjj.js → dist-D0PYXGt2.js} +1 -1
- package/public/dist/assets/{dist-C0sOT_UM.js → dist-D5GUqT-6.js} +1 -1
- package/public/dist/assets/{dist-C5S-Rbvc.js → dist-D66X8iAn.js} +1 -1
- package/public/dist/assets/dist-D815C1Fv.js +1 -0
- package/public/dist/assets/{dist-Ch6JG5jE.js → dist-DDDFJ8jG.js} +1 -1
- package/public/dist/assets/{dist-2oDfqE98.js → dist-DHQI31dn.js} +1 -1
- package/public/dist/assets/{dist-BTp_Oy_x.js → dist-DTQW91xt.js} +1 -1
- package/public/dist/assets/{dist-BuaQLcgQ.js → dist-Dm7RAaUo.js} +1 -1
- package/public/dist/assets/{dist-BJyDhGpS.js → dist-DrIWh2fi.js} +1 -1
- package/public/dist/assets/{dist-BGzHP3f8.js → dist-DzT7frM2.js} +1 -1
- package/public/dist/assets/{dist-wdLr2dSH.js → dist-Qs7HHNCC.js} +1 -1
- package/public/dist/assets/{dist-BjqyutOM.js → dist-Rs_Khtjb.js} +1 -1
- package/public/dist/assets/{dist-DdhWu7OM.js → dist-fJAyK82z.js} +1 -1
- package/public/dist/assets/{dist-G7QUHtDS.js → dist-jcptfm_T.js} +1 -1
- package/public/dist/assets/dist-sOV2kBhQ.js +1 -0
- package/public/dist/assets/{dist-BoG5I6U5.js → dist-vQskrHxt.js} +1 -1
- package/public/dist/assets/{dockerfile-CrC2HXHP.js → dockerfile-DAfh5qoE.js} +1 -1
- package/public/dist/assets/{employees-CIkIyvtL.js → employees-DRmX2RDd.js} +2 -2
- package/public/dist/assets/{erDiagram-SMLLAGMA-BvtqhMsS.js → erDiagram-TEJ5UH35-CRvCbztR.js} +6 -6
- package/public/dist/assets/{error-normalize-CkhPeQYx.js → error-normalize-CNbPE4lO.js} +1 -1
- package/public/dist/assets/eventmodeling-FCH6USID-Cq0nylxO.js +1 -0
- package/public/dist/assets/{factor-1CttFx2G.js → factor-BpoYJieo.js} +1 -1
- package/public/dist/assets/fields-DUawAHWZ.js +1 -0
- package/public/dist/assets/flowDiagram-I6XJVG4X-CzvVnib_.js +162 -0
- package/public/dist/assets/ganttDiagram-6RSMTGT7-BbUYP6iv.js +292 -0
- package/public/dist/assets/gitGraph-WXDBUCRP-DDq6-3D3.js +1 -0
- package/public/dist/assets/gitGraphDiagram-PVQCEYII-CbKdM7nW.js +106 -0
- package/public/dist/assets/graphlib-BLOO0H5r.js +1 -0
- package/public/dist/assets/info-J43DQDTF-OUnqwpUV.js +1 -0
- package/public/dist/assets/infoDiagram-5YYISTIA-BrZmg1At.js +2 -0
- package/public/dist/assets/{ishikawaDiagram-UXIWVN3A-DZW-Nqsf.js → ishikawaDiagram-YF4QCWOH-BDWXqJi5.js} +2 -2
- package/public/dist/assets/javascript-CZjRNq5R.js +1 -0
- package/public/dist/assets/{journeyDiagram-VCZTEJTY-ByVRJxVF.js → journeyDiagram-JHISSGLW-CPFRd_M3.js} +6 -6
- package/public/dist/assets/{jsx-runtime-BjL7qHh8.js → jsx-runtime-BZmCptaP.js} +1 -1
- package/public/dist/assets/{kanban-definition-6JOO6SKY-xwN0YCW2.js → kanban-definition-UN3LZRKU-BcQbBplS.js} +10 -10
- package/public/dist/assets/katex-CF5bGce6.js +1 -0
- package/public/dist/assets/manager-B5OmizBL.css +1 -0
- package/public/dist/assets/manager-Cs3eMBcx.js +25 -0
- package/public/dist/assets/{memory-CnBc2_Va.js → memory-BA-ki3gn.js} +1 -1
- package/public/dist/assets/memory-DLQbyBA3.js +1 -0
- package/public/dist/assets/mermaid-loader-BVPsKrpr.js +1 -0
- package/public/dist/assets/mermaid-parser.core-C62NUJRb.js +3 -0
- package/public/dist/assets/mermaid.core-ArqR5iFa.js +9 -0
- package/public/dist/assets/mermaid.core-BAwu4U2Y.js +1 -0
- package/public/dist/assets/{mindmap-definition-QFDTVHPH-Chqgsh1N.js → mindmap-definition-RKZ34NQL-C35cGkNU.js} +29 -29
- package/public/dist/assets/{nsis-_CjIiUyF.js → nsis-Ch4QINLN.js} +1 -1
- package/public/dist/assets/packet-YPE3B663-Bb9hBQ06.js +1 -0
- package/public/dist/assets/{page-shell-CTxVDJ8Y.js → page-shell-CVAobxbP.js} +1 -1
- package/public/dist/assets/pie-LRSECV5Y-CNRQnRNZ.js +1 -0
- package/public/dist/assets/pieDiagram-4H26LBE5-B8C_hoqJ.js +30 -0
- package/public/dist/assets/provider-icons-dxT69zGg.js +8 -0
- package/public/dist/assets/{pug-CbR8lCtK.js → pug-CXYqmmpP.js} +1 -1
- package/public/dist/assets/quadrantDiagram-W4KKPZXB-BEPrine5.js +7 -0
- package/public/dist/assets/radar-GUYGQ44K-BxngU2v0.js +1 -0
- package/public/dist/assets/{render-lpTpN1El.js → render-C7_e0J_X.js} +3 -3
- package/public/dist/assets/{requirementDiagram-MS252O5E-wnPtv0LG.js → requirementDiagram-4Y6WPE33-ClDDon9c.js} +4 -4
- package/public/dist/assets/rolldown-runtime-XQCOJYun.js +1 -0
- package/public/dist/assets/sankeyDiagram-5OEKKPKP-Bjs3OE-1.js +40 -0
- package/public/dist/assets/sequenceDiagram-3UESZ5HK-BM8IAaEe.js +162 -0
- package/public/dist/assets/settings-DjyKdqev.js +1 -0
- package/public/dist/assets/settings-pUJzyeX2.js +42 -0
- package/public/dist/assets/{sidebar-Cwt0FxQl.js → sidebar-CO9Qjj6v.js} +2 -2
- package/public/dist/assets/skills-CX3qJ77s.js +1 -0
- package/public/dist/assets/{skills-DDmTyywh.js → skills-Dq7fD8I3.js} +1 -1
- package/public/dist/assets/{slash-commands-D5y5AVvS.js → slash-commands-DRsKtuGT.js} +1 -1
- package/public/dist/assets/slash-commands-UbS8w9ij.js +1 -0
- package/public/dist/assets/stateDiagram-AJRCARHV-BvNABuXE.js +1 -0
- package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CCIo81qy.js +1 -0
- package/public/dist/assets/{timeline-definition-GMOUNBTQ-DUz1-iOx.js → timeline-definition-PNZ67QCA-CIvTvac3.js} +8 -8
- package/public/dist/assets/trace-drawer-DDFdU07_.js +15 -0
- package/public/dist/assets/treeView-BLDUP644-cXRzPGzz.js +1 -0
- package/public/dist/assets/treemap-LRROVOQU-BsZE5HPE.js +1 -0
- package/public/dist/assets/ui-CeBmBBZM.js +140 -0
- package/public/dist/assets/ui-TMXjvH0r.js +1 -0
- package/public/dist/assets/{vendor-render-DEStnpJ8.js → vendor-render-DCb9B75Q.js} +38 -37
- package/public/dist/assets/vendor-utils-BnxL60_-.js +1 -0
- package/public/dist/assets/vennDiagram-CIIHVFJN-C5cbS2KC.js +34 -0
- package/public/dist/assets/wardley-L42UT6IY-D_qm0cZD.js +1 -0
- package/public/dist/assets/{wardleyDiagram-NUSXRM2D-CLAhOzap.js → wardleyDiagram-YWT4CUSO-BsRBBGFP.js} +61 -3
- package/public/dist/assets/{wiki-link-suggestions-LQuYT22G.js → wiki-link-suggestions-BHwNQXT_.js} +2 -2
- package/public/dist/assets/{xychartDiagram-5P7HB3ND-DLnY9i8z.js → xychartDiagram-2RQKCTM6-B6rqui6F.js} +6 -6
- package/public/dist/index.html +102 -3
- package/public/dist/manager/index.html +2 -2
- package/public/index.html +101 -1
- package/public/js/constants.ts +72 -0
- package/public/js/diagram/iframe-renderer.ts +7 -0
- package/public/js/features/chat-scroll.ts +31 -0
- package/public/js/features/chat-search.ts +223 -0
- package/public/js/features/help-content.ts +20 -2
- package/public/js/features/help-dialog.ts +38 -2
- package/public/js/features/pending-queue.ts +6 -0
- package/public/js/features/process-block.ts +20 -0
- package/public/js/features/settings-channel.ts +3 -1
- package/public/js/features/settings-cli-status.ts +24 -3
- package/public/js/features/settings-core.ts +134 -21
- package/public/js/features/settings-types.ts +12 -1
- package/public/js/features/settings.ts +1 -1
- package/public/js/features/trace-drawer.ts +2 -1
- package/public/js/features/voice-recorder.ts +222 -42
- package/public/js/main.ts +58 -4
- package/public/js/provider-icons.ts +46 -27
- package/public/js/render/markdown.ts +6 -0
- package/public/js/ui.ts +33 -7
- package/public/js/ws.ts +5 -1
- package/public/locales/en.json +31 -7
- package/public/locales/ja.json +31 -7
- package/public/locales/ko.json +31 -7
- package/public/locales/zh.json +31 -7
- package/public/manager/src/App.tsx +19 -55
- package/public/manager/src/InstancePreview.tsx +46 -1
- package/public/manager/src/components/InstanceDetailPanel.tsx +7 -2
- package/public/manager/src/components/InstanceLogsPanel.tsx +138 -0
- package/public/manager/src/dashboard-settings/DashboardEmbeddingSection.tsx +37 -7
- package/public/manager/src/jaw-ceo/useJawCeoDashboardBridge.tsx +1 -0
- package/public/manager/src/manager-components.css +76 -0
- package/public/manager/src/preview.ts +26 -3
- package/public/manager/src/settings/fields/SelectField.tsx +51 -17
- package/public/manager/src/settings/pages/Agent.tsx +37 -2
- package/public/manager/src/settings/pages/Heartbeat.tsx +3 -2
- package/public/manager/src/settings/pages/Memory.tsx +3 -2
- package/public/manager/src/settings/pages/components/EmployeeRow.tsx +8 -4
- package/public/manager/src/settings/pages/components/PerCliRow.tsx +31 -5
- package/public/manager/src/settings/pages/components/agent/FlushAgentSection.tsx +4 -2
- package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +1 -1
- package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +23 -1
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +49 -0
- package/public/manager/src/settings/pages/components/employees-helpers.ts +6 -1
- package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +11 -1
- package/public/manager/src/settings-controls.css +25 -0
- package/public/manager/src/usePreviewShortcutMessages.ts +30 -0
- package/public/manager/src/usePreviewSttLifecycle.ts +31 -0
- package/scripts/fresh-install-smoke.ts +1 -1
- package/scripts/install-officecli.ps1 +33 -5
- package/scripts/install-officecli.sh +52 -8
- package/scripts/install-wsl.sh +96 -24
- package/scripts/install.sh +82 -11
- package/scripts/postinstall-guard.cjs +57 -30
- package/public/dist/assets/Agent-DNpehKB2.js +0 -1
- package/public/dist/assets/DashboardEmbeddingSection-BYdGgqg7.js +0 -2
- package/public/dist/assets/Employees-CuYuTy0R.js +0 -1
- package/public/dist/assets/Heartbeat-C-vq02MW.js +0 -1
- package/public/dist/assets/Memory-BPKWJDXK.js +0 -1
- package/public/dist/assets/ModelProvider-Bd6vGkXT.js +0 -1
- package/public/dist/assets/agent-meta-C1pQzExf.js +0 -1
- package/public/dist/assets/app-BxsIleo0.js +0 -32
- package/public/dist/assets/app-CB9n5A77.css +0 -1
- package/public/dist/assets/architecture-YZFGNWBL-BRI-0IaU.js +0 -1
- package/public/dist/assets/architectureDiagram-Q4EWVU46-z0JCgZrJ.js +0 -36
- package/public/dist/assets/blockDiagram-DXYQGD6D-KaOz3aFS.js +0 -132
- package/public/dist/assets/channel-jLopKIgm.js +0 -1
- package/public/dist/assets/chunk-2KRD3SAO-C8hJZPJu.js +0 -1
- package/public/dist/assets/chunk-426QAEUC-atJRhvKN.js +0 -1
- package/public/dist/assets/chunk-4TB4RGXK-BD7UhIN8.js +0 -206
- package/public/dist/assets/chunk-55IACEB6-CAWcPDdr.js +0 -1
- package/public/dist/assets/chunk-5FUZZQ4R-Cg1pzs6p.js +0 -62
- package/public/dist/assets/chunk-5PVQY5BW-otv3HwE_.js +0 -2
- package/public/dist/assets/chunk-67CJDMHE-AU2iOKLT.js +0 -1
- package/public/dist/assets/chunk-7N4EOEYR-BTIS4jBw.js +0 -1
- package/public/dist/assets/chunk-AA7GKIK3-c9UUJO_T.js +0 -1
- package/public/dist/assets/chunk-CIAEETIT-Dwbln6rM.js +0 -1
- package/public/dist/assets/chunk-ENJZ2VHE-PT_jAckw.js +0 -10
- package/public/dist/assets/chunk-FOC6F5B3-BqDmFFeg.js +0 -1
- package/public/dist/assets/chunk-ICPOFSXX-P6V6jqiT.js +0 -122
- package/public/dist/assets/chunk-K5T4RW27-C42sOmZR.js +0 -27
- package/public/dist/assets/chunk-KGLVRYIC-K-BVa8b2.js +0 -1
- package/public/dist/assets/chunk-ORNJ4GCN-CEXU6WaD.js +0 -1
- package/public/dist/assets/chunk-OYMX7WX6-DmJG2z1S.js +0 -231
- package/public/dist/assets/chunk-QZHKN3VN-BkVLii_3.js +0 -1
- package/public/dist/assets/chunk-U2HBQHQK-Ny6UwUgK.js +0 -11
- package/public/dist/assets/chunk-YZCP3GAM-c7FYtZME.js +0 -1
- package/public/dist/assets/classDiagram-6PBFFD2Q-BgOyAynm.js +0 -1
- package/public/dist/assets/classDiagram-v2-HSJHXN6E-5gBdoVH9.js +0 -1
- package/public/dist/assets/constants-4A2GptQT.js +0 -1
- package/public/dist/assets/cose-bilkent-S5V4N54A-CvH6qY_r.js +0 -1
- package/public/dist/assets/dagre--20B2-ZQ.js +0 -1
- package/public/dist/assets/dagre-KV5264BT-CQ0wo0ma.js +0 -4
- package/public/dist/assets/diagram-G4DWMVQ6-_aP6kMTh.js +0 -24
- package/public/dist/assets/diagram-MMDJMWI5-J1l6Q0JG.js +0 -43
- package/public/dist/assets/dist-B1p80u1b.js +0 -1
- package/public/dist/assets/dist-BKyzWv22.js +0 -1
- package/public/dist/assets/dist-CxJpXP6s.js +0 -1
- package/public/dist/assets/dist-DNLFuTrS.js +0 -1
- package/public/dist/assets/fields-BISouxp2.js +0 -1
- package/public/dist/assets/flowDiagram-DWJPFMVM-C_F0rqqT.js +0 -162
- package/public/dist/assets/ganttDiagram-T4ZO3ILL-B5S8EZRg.js +0 -292
- package/public/dist/assets/gitGraph-7Q5UKJZL-DTTW6pxr.js +0 -1
- package/public/dist/assets/gitGraphDiagram-UUTBAWPF-DMGzYJeb.js +0 -106
- package/public/dist/assets/graphlib-CZk_Ii16.js +0 -1
- package/public/dist/assets/info-OMHHGYJF-BU-iuaSm.js +0 -1
- package/public/dist/assets/infoDiagram-42DDH7IO-dzSaYFFK.js +0 -2
- package/public/dist/assets/javascript-BhB45e0W.js +0 -1
- package/public/dist/assets/katex-DamPUmTE.js +0 -1
- package/public/dist/assets/manager-B84u-pcn.js +0 -25
- package/public/dist/assets/manager-DMg_sTEP.css +0 -1
- package/public/dist/assets/memory-BV62wlsG.js +0 -1
- package/public/dist/assets/mermaid-loader-DxFGz4EE.js +0 -1
- package/public/dist/assets/mermaid-parser.core-CMIZ0my_.js +0 -3
- package/public/dist/assets/mermaid.core-CicVBD9l.js +0 -1
- package/public/dist/assets/mermaid.core-Dj6viEzN.js +0 -11
- package/public/dist/assets/packet-4T2RLAQJ-DzmBsAf0.js +0 -1
- package/public/dist/assets/pie-ZZUOXDRM-DyG1KzTn.js +0 -1
- package/public/dist/assets/pieDiagram-DEJITSTG-DJLiSymi.js +0 -30
- package/public/dist/assets/quadrantDiagram-34T5L4WZ-qcnWmcRr.js +0 -7
- package/public/dist/assets/radar-PYXPWWZC-CEBZARUu.js +0 -1
- package/public/dist/assets/rolldown-runtime-DE9SaGGd.js +0 -1
- package/public/dist/assets/sankeyDiagram-XADWPNL6-Bn3pUd_K.js +0 -10
- package/public/dist/assets/sequenceDiagram-FGHM5R23-DfxcHSdj.js +0 -157
- package/public/dist/assets/settings-CfAXLa8a.js +0 -1
- package/public/dist/assets/settings-FWgmcubl.js +0 -40
- package/public/dist/assets/skills-D-qUVJ-e.js +0 -1
- package/public/dist/assets/slash-commands-BfI19vIz.js +0 -1
- package/public/dist/assets/stateDiagram-FHFEXIEX-CiR7P2OG.js +0 -1
- package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-BaWWpysK.js +0 -1
- package/public/dist/assets/trace-drawer-DVF5F1df.js +0 -15
- package/public/dist/assets/treeView-SZITEDCU-D5-TP7Qp.js +0 -1
- package/public/dist/assets/treemap-W4RFUUIX-BQhm_ZSp.js +0 -1
- package/public/dist/assets/ui-BJXY16Dk.js +0 -140
- package/public/dist/assets/ui-BXm3OPPh.js +0 -1
- package/public/dist/assets/vendor-utils-IVTPs69f.js +0 -68
- package/public/dist/assets/vennDiagram-DHZGUBPP-CYu7SDdG.js +0 -34
- package/public/dist/assets/wardley-RL74JXVD-CpnBMRe0.js +0 -1
- package/public/manager/src/settings/pages/Embedding.tsx +0 -382
- /package/public/dist/assets/{apl-HYRstREL.js → apl-CieDeb7B.js} +0 -0
- /package/public/dist/assets/{asciiarmor-BDXCrhAK.js → asciiarmor-BRTyulZY.js} +0 -0
- /package/public/dist/assets/{asn1-CnSBhb0M.js → asn1-DoNAtQ5o.js} +0 -0
- /package/public/dist/assets/{asterisk-AqV7rnIi.js → asterisk-CR7oKPxi.js} +0 -0
- /package/public/dist/assets/{brainfuck-Dv46-iL9.js → brainfuck-abzPcrOz.js} +0 -0
- /package/public/dist/assets/{clike-GRffz5hY.js → clike-B71Zq38G.js} +0 -0
- /package/public/dist/assets/{clojure-DzgT_fqE.js → clojure-Zm0UzHPq.js} +0 -0
- /package/public/dist/assets/{cmake-Co1237r5.js → cmake-D3UNdg6L.js} +0 -0
- /package/public/dist/assets/{cobol-rUaLketb.js → cobol-4fYvwQR0.js} +0 -0
- /package/public/dist/assets/{coffeescript-DQyfHE86.js → coffeescript-Ct6bZdRU.js} +0 -0
- /package/public/dist/assets/{commonlisp-Buue1PGW.js → commonlisp-CrgXVPcd.js} +0 -0
- /package/public/dist/assets/{crystal-BMWO0kOJ.js → crystal-bGOl67VM.js} +0 -0
- /package/public/dist/assets/{css-DaxibPo5.js → css-B_EV3Xq2.js} +0 -0
- /package/public/dist/assets/{cypher-CmpGfiBR.js → cypher-DXDlHTYf.js} +0 -0
- /package/public/dist/assets/{cytoscape.esm-zT8GwLFm.js → cytoscape.esm-BK7ao2Ti.js} +0 -0
- /package/public/dist/assets/{d-qmdtoIzU.js → d-RL5ynsiz.js} +0 -0
- /package/public/dist/assets/{diff-B40m6u1h.js → diff-B5McBGjz.js} +0 -0
- /package/public/dist/assets/{dtd-569ynYVj.js → dtd-l3sK4p_C.js} +0 -0
- /package/public/dist/assets/{dylan-Dxolp30i.js → dylan-WjJGY-rW.js} +0 -0
- /package/public/dist/assets/{ebnf-BZiX9Iq3.js → ebnf-BGY79HOS.js} +0 -0
- /package/public/dist/assets/{ecl-B8F1Q0oZ.js → ecl-BKh7OE1d.js} +0 -0
- /package/public/dist/assets/{eiffel-Bv8Kvgh1.js → eiffel-Bzvlg3oK.js} +0 -0
- /package/public/dist/assets/{elm-QWXQaIis.js → elm-5_BqNmKu.js} +0 -0
- /package/public/dist/assets/{erlang-CuDGzTGm.js → erlang-BdVwz8I8.js} +0 -0
- /package/public/dist/assets/{fcl-BiFeqtHf.js → fcl-B9cnfODD.js} +0 -0
- /package/public/dist/assets/{forth-R7Uc2VcL.js → forth-wZbbnGzb.js} +0 -0
- /package/public/dist/assets/{fortran-kDRG6BzW.js → fortran-BAJZrRfU.js} +0 -0
- /package/public/dist/assets/{gas-CyRkuC5T.js → gas-D60ZhBat.js} +0 -0
- /package/public/dist/assets/{gherkin-BE0p00ey.js → gherkin-B8tKjAAi.js} +0 -0
- /package/public/dist/assets/{groovy-B_Sh3D1t.js → groovy-BAG9eJUD.js} +0 -0
- /package/public/dist/assets/{haskell-DWXgCy4o.js → haskell-Cj4TmWbg.js} +0 -0
- /package/public/dist/assets/{haxe-xGxZ54Hv.js → haxe-8chnvz-o.js} +0 -0
- /package/public/dist/assets/{http-CKv9cSBA.js → http-DDYeO71z.js} +0 -0
- /package/public/dist/assets/{idl-DmlI3XzS.js → idl-D1hY-Gp_.js} +0 -0
- /package/public/dist/assets/{javascript-j6r5uf_k.js → javascript-Sh0ZUMP2.js} +0 -0
- /package/public/dist/assets/{julia-CQSp9Qa0.js → julia-BibioBF2.js} +0 -0
- /package/public/dist/assets/{livescript-CqvtVTlb.js → livescript-CSZrB6F4.js} +0 -0
- /package/public/dist/assets/{lua-DazQKUZ0.js → lua-BvTlo5w3.js} +0 -0
- /package/public/dist/assets/{mathematica-DqhJVCs9.js → mathematica-Bexv8BWZ.js} +0 -0
- /package/public/dist/assets/{mbox-Dsyo1_UL.js → mbox-BAhbA8z2.js} +0 -0
- /package/public/dist/assets/{mirc-D7ThhoF-.js → mirc-BzT5Kh4S.js} +0 -0
- /package/public/dist/assets/{mllike-EPZ6pqQD.js → mllike-DeoJnUZQ.js} +0 -0
- /package/public/dist/assets/{modelica-PU45hbqg.js → modelica-FD_-Fxlc.js} +0 -0
- /package/public/dist/assets/{mscgen-DEnh2Ojr.js → mscgen-C-OyhbwB.js} +0 -0
- /package/public/dist/assets/{mumps-8GhR7rRa.js → mumps-BxkCDTK7.js} +0 -0
- /package/public/dist/assets/{nginx-CXwagpwp.js → nginx-2JaV__gC.js} +0 -0
- /package/public/dist/assets/{ntriples-BDQxxstw.js → ntriples--rhhCzqb.js} +0 -0
- /package/public/dist/assets/{octave-2c90WnyU.js → octave-rS4nMzRe.js} +0 -0
- /package/public/dist/assets/{oz-CO0rQ8EL.js → oz-I4fMb_NC.js} +0 -0
- /package/public/dist/assets/{pascal-CcVwOGeN.js → pascal-BEghJs8t.js} +0 -0
- /package/public/dist/assets/{path-utils-DySmCVZK.js → path-utils-r2bJIu28.js} +0 -0
- /package/public/dist/assets/{perl-B9UvGoAV.js → perl-BRO9ZFo9.js} +0 -0
- /package/public/dist/assets/{pig-Cd1f86ZJ.js → pig-L4Ii6KI0.js} +0 -0
- /package/public/dist/assets/{powershell-DV4cOnkJ.js → powershell-BBeqUCRp.js} +0 -0
- /package/public/dist/assets/{properties-DaSVPhrZ.js → properties-Boi0jF2J.js} +0 -0
- /package/public/dist/assets/{protobuf-CEtFnY22.js → protobuf-fB2aGypX.js} +0 -0
- /package/public/dist/assets/{puppet-Ca0DHfcW.js → puppet-BRmsErtO.js} +0 -0
- /package/public/dist/assets/{python-ydzCwWG-.js → python-Be4P9Dgp.js} +0 -0
- /package/public/dist/assets/{q-Cl8kzQmk.js → q-DZGhDLYt.js} +0 -0
- /package/public/dist/assets/{r-DKZPJFrD.js → r-B4NERjRM.js} +0 -0
- /package/public/dist/assets/{rough.esm-Dnk3WN4D.js → rough.esm-C0Gkx4O1.js} +0 -0
- /package/public/dist/assets/{rpm-D0lqeHoZ.js → rpm-e-QbHJ1q.js} +0 -0
- /package/public/dist/assets/{ruby-RVmtmNDw.js → ruby-BSVP_v59.js} +0 -0
- /package/public/dist/assets/{sas-CEzodAB7.js → sas-DHlU4v4g.js} +0 -0
- /package/public/dist/assets/{scheme-Pqmt6dh3.js → scheme-BGXbz5Hz.js} +0 -0
- /package/public/dist/assets/{settings-client-BN3XzwEo.js → settings-client-DPuJroyk.js} +0 -0
- /package/public/dist/assets/{shell-CLG3zy-u.js → shell-yonx6xY2.js} +0 -0
- /package/public/dist/assets/{sieve-C95IWC3O.js → sieve-ClPJUZyi.js} +0 -0
- /package/public/dist/assets/{simple-mode-B9ErAHMD.js → simple-mode-CjViblDK.js} +0 -0
- /package/public/dist/assets/{smalltalk-4cL-gRJb.js → smalltalk-CHXubeqS.js} +0 -0
- /package/public/dist/assets/{solr-CEA7oOx_.js → solr-C6q6YwPz.js} +0 -0
- /package/public/dist/assets/{sparql-w8kHjP6I.js → sparql-CcspZvEd.js} +0 -0
- /package/public/dist/assets/{spreadsheet-C8bDfTgC.js → spreadsheet-DH3a4LBS.js} +0 -0
- /package/public/dist/assets/{sql-BrKz8968.js → sql-meoY6gNi.js} +0 -0
- /package/public/dist/assets/{stex-xFw1nXeT.js → stex-D2bn6Zsh.js} +0 -0
- /package/public/dist/assets/{stylus-gS_68vPk.js → stylus-DbXGih0S.js} +0 -0
- /package/public/dist/assets/{swift-D5lXmY2d.js → swift-Ch391uOd.js} +0 -0
- /package/public/dist/assets/{tcl-D-41REtC.js → tcl-CQBgGWDP.js} +0 -0
- /package/public/dist/assets/{textile-D-Znao0j.js → textile-4i3oG3tg.js} +0 -0
- /package/public/dist/assets/{tiddlywiki-Co8lXJKd.js → tiddlywiki-CXG1-CcK.js} +0 -0
- /package/public/dist/assets/{tiki-DsiNRYMP.js → tiki-DJqKUhA-.js} +0 -0
- /package/public/dist/assets/{toml-CaVZGou4.js → toml-C1FnyICQ.js} +0 -0
- /package/public/dist/assets/{troff-DJvDVr-d.js → troff-Cp8NvRO0.js} +0 -0
- /package/public/dist/assets/{ttcn-DAC92l4d.js → ttcn-NlmW_fji.js} +0 -0
- /package/public/dist/assets/{ttcn-cfg-C0X-mYlr.js → ttcn-cfg-BVuxfGZf.js} +0 -0
- /package/public/dist/assets/{turtle-D6WHyCrL.js → turtle-Ba9ERlnm.js} +0 -0
- /package/public/dist/assets/{vb-CEo_ccq3.js → vb-DDs4gjJb.js} +0 -0
- /package/public/dist/assets/{vbscript-B_PKDV1v.js → vbscript-gOFmdMJN.js} +0 -0
- /package/public/dist/assets/{velocity-ClKnKBLH.js → velocity-DtSNZA7i.js} +0 -0
- /package/public/dist/assets/{verilog-Pnuspgw6.js → verilog-Pldmtxe7.js} +0 -0
- /package/public/dist/assets/{vhdl-CZnyY4fs.js → vhdl-BFfSgWGp.js} +0 -0
- /package/public/dist/assets/{w3c-keyname-DJlC6DTY.js → w3c-keyname-BggQEPNo.js} +0 -0
- /package/public/dist/assets/{webidl-DHr762Dm.js → webidl-B6ZFYE2L.js} +0 -0
- /package/public/dist/assets/{xquery-5-FiyUtN.js → xquery-DhxUT98N.js} +0 -0
- /package/public/dist/assets/{yacas-GlqsXIeT.js → yacas-jSkQeF1Q.js} +0 -0
- /package/public/dist/assets/{z80-CI7N40Oo.js → z80-D7Lt6v61.js} +0 -0
package/dist/src/agent/spawn.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// ─── Agent Spawn + Kill/Steer/Queue ──────────────────
|
|
2
2
|
import fs from 'fs';
|
|
3
3
|
import os from 'os';
|
|
4
|
-
import crypto from 'node:crypto';
|
|
5
4
|
import { join } from 'path';
|
|
6
|
-
import { spawn
|
|
5
|
+
import { spawn } from 'child_process';
|
|
7
6
|
import { broadcast } from '../core/bus.js';
|
|
8
|
-
import { settings, UPLOADS_DIR, detectCli
|
|
7
|
+
import { settings, UPLOADS_DIR, detectCli } from '../core/config.js';
|
|
8
|
+
import { migrateLegacyClaudeValue } from '../cli/claude-models.js';
|
|
9
9
|
import { stripUndefined } from '../core/strip-undefined.js';
|
|
10
10
|
import { clearEmployeeSession, getSession, insertMessage, getRecentMessages, listQueuedMessages, insertQueuedMessage, deleteQueuedMessage, getSessionBucket, clearSessionBucket, } from '../core/db.js';
|
|
11
11
|
import { getSystemPrompt, regenerateB } from '../prompt/builder.js';
|
|
@@ -14,7 +14,6 @@ import { detectSmokeResponse } from './smoke-detector.js';
|
|
|
14
14
|
import { saveUpload as _saveUpload, buildMediaPrompt, buildMediaPromptMany } from '../../lib/upload.js';
|
|
15
15
|
import { resolveMainCli, consumePendingBootstrapPrompt } from '../core/main-session.js';
|
|
16
16
|
import { getSessionOwnershipGeneration, persistMainSession, } from './session-persistence.js';
|
|
17
|
-
import { groupQueueKey } from '../messaging/session-key.js';
|
|
18
17
|
import { isCompactMarkerRow } from '../core/compact.js';
|
|
19
18
|
import { isRuntimeSettingsMutationInFlight, waitForRuntimeSettingsIdle } from '../core/runtime-settings-gate.js';
|
|
20
19
|
import { hasBlockingWorkers, hasPendingWorkerReplays, getActiveWorkers, clearAllWorkers } from '../orchestrator/worker-registry.js';
|
|
@@ -27,6 +26,7 @@ import { applyCliEnvDefaults, buildSessionResumeKey, ensureOpencodeAlwaysAllowPe
|
|
|
27
26
|
import { attachWatchdog } from './watchdog.js';
|
|
28
27
|
import { buildOpencodeRuntimeSnapshot, buildOpencodeSpawnAudit, pushOpencodeRawEvent, resolveOpencodeBinary, } from './opencode-diagnostics.js';
|
|
29
28
|
import { asCliEventRecord, discriminate, fieldString } from '../types/cli-events.js';
|
|
29
|
+
import { isJawRuntimeEvent, handleJawRuntimeEvent } from './claude-e-runtime.js';
|
|
30
30
|
import { appendTraceEvent, stampTraceTool, startTraceRun } from '../trace/store.js';
|
|
31
31
|
// ─── State ───────────────────────────────────────────
|
|
32
32
|
export let activeProcess = null;
|
|
@@ -38,33 +38,26 @@ export function getCurrentMainMeta() {
|
|
|
38
38
|
export function setCurrentMainMeta(meta) {
|
|
39
39
|
currentMainMeta = meta;
|
|
40
40
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
catch { /* no children or pgrep failed */ }
|
|
60
|
-
for (const cpid of childPids) {
|
|
61
|
-
killProcessTree(cpid, signal);
|
|
62
|
-
}
|
|
63
|
-
try {
|
|
64
|
-
process.kill(pid, signal);
|
|
65
|
-
}
|
|
66
|
-
catch { /* already dead */ }
|
|
41
|
+
export function buildAiERuntimeStatusMeta(cli, provider, model) {
|
|
42
|
+
if (cli !== 'ai-e')
|
|
43
|
+
return {};
|
|
44
|
+
const mode = provider === 'claude' ? 'pty' : 'headless';
|
|
45
|
+
return {
|
|
46
|
+
selector: 'ai-e',
|
|
47
|
+
provider,
|
|
48
|
+
effectiveProvider: provider,
|
|
49
|
+
model,
|
|
50
|
+
mode,
|
|
51
|
+
runtime: {
|
|
52
|
+
cli,
|
|
53
|
+
selector: 'ai-e',
|
|
54
|
+
provider,
|
|
55
|
+
model,
|
|
56
|
+
mode,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
67
59
|
}
|
|
60
|
+
import { killProcessTree } from './spawn/process-kill.js';
|
|
68
61
|
export function killAgentById(agentId) {
|
|
69
62
|
const proc = activeProcesses.get(agentId);
|
|
70
63
|
if (!proc)
|
|
@@ -97,92 +90,50 @@ export function killAgentById(agentId) {
|
|
|
97
90
|
}
|
|
98
91
|
}
|
|
99
92
|
export { memoryFlushCounter, flushCycleCount } from './memory-flush-controller.js';
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
requestId: parsed.requestId,
|
|
114
|
-
ts: typeof parsed.ts === 'number' ? parsed.ts : Date.now(),
|
|
115
|
-
})];
|
|
116
|
-
}
|
|
117
|
-
catch {
|
|
118
|
-
return [];
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
function loadPersistedQueue() {
|
|
122
|
-
return listQueuedMessages.all().flatMap(normalizeQueueItem);
|
|
123
|
-
}
|
|
124
|
-
export const messageQueue = loadPersistedQueue();
|
|
125
|
-
if (messageQueue.length > 0) {
|
|
126
|
-
console.log(`[queue] recovered ${messageQueue.length} persisted message(s) from previous session`);
|
|
127
|
-
}
|
|
128
|
-
let queueProcessing = false;
|
|
129
|
-
// ─── 429 Retry Timer State ──────────────────────────
|
|
130
|
-
// INVARIANT: single-main — 동시에 1개의 main spawnAgent만 존재한다고 가정.
|
|
131
|
-
// 멀티 main task 도입 시 request-id 키 맵으로 전환 필요.
|
|
132
|
-
let retryPendingTimer = null;
|
|
133
|
-
let retryPendingResolve = null;
|
|
134
|
-
let retryPendingOrigin = null;
|
|
135
|
-
let retryPendingIsEmployee = false;
|
|
93
|
+
const queueCtrl = createQueueController({
|
|
94
|
+
isSpawnBusy: () => Boolean(activeProcess) || mainSpawnStarting || queueCtrl.isRetryPending(),
|
|
95
|
+
hasBlockingWorkers,
|
|
96
|
+
hasPendingWorkerReplays,
|
|
97
|
+
insertMessage,
|
|
98
|
+
insertQueuedMessage,
|
|
99
|
+
deleteQueuedMessage,
|
|
100
|
+
listQueuedMessages: listQueuedMessages,
|
|
101
|
+
broadcast,
|
|
102
|
+
importPipeline: () => import('../orchestrator/pipeline.js'),
|
|
103
|
+
getWorkingDir: () => settings["workingDir"] || null,
|
|
104
|
+
});
|
|
105
|
+
export const { messageQueue, enqueueMessage, removeQueuedMessage, processQueue, setQueueHold, clearQueueHold, getQueueHoldId, clearRetryTimer, resetFallbackState, getFallbackState, getQueuedMessageSnapshotForScope, } = queueCtrl;
|
|
136
106
|
let mainSpawnStarting = false;
|
|
137
107
|
let cancelPendingMainSpawn = null;
|
|
138
|
-
/** busy = process alive OR retry timer pending OR main spawn waiting on settings gate */
|
|
139
108
|
export function isAgentBusy() {
|
|
140
|
-
return !!activeProcess ||
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Cancel pending retry timer AND resolve the dangling Promise.
|
|
144
|
-
*
|
|
145
|
-
* @param resumeQueue - true: 취소 후 대기 메시지 실행 (settings 변경 등)
|
|
146
|
-
* false: 큐도 중단 (stop/steer 의도)
|
|
147
|
-
*
|
|
148
|
-
* 취소 규약: broadcast agent_done(error:true) → collect.ts L39가 수집함.
|
|
149
|
-
*/
|
|
150
|
-
export function clearRetryTimer(resumeQueue = true) {
|
|
151
|
-
if (retryPendingTimer) {
|
|
152
|
-
clearTimeout(retryPendingTimer);
|
|
153
|
-
retryPendingTimer = null;
|
|
154
|
-
console.log('[jaw:retry] timer cancelled');
|
|
155
|
-
if (retryPendingResolve) {
|
|
156
|
-
broadcast('agent_done', {
|
|
157
|
-
text: '⏹️ 재시도 취소됨',
|
|
158
|
-
error: true,
|
|
159
|
-
origin: retryPendingOrigin || 'web',
|
|
160
|
-
...(retryPendingIsEmployee ? { isEmployee: true } : {}),
|
|
161
|
-
}, retryPendingIsEmployee ? 'internal' : 'public');
|
|
162
|
-
retryPendingResolve({ text: '', code: -1 });
|
|
163
|
-
retryPendingResolve = null;
|
|
164
|
-
retryPendingOrigin = null;
|
|
165
|
-
retryPendingIsEmployee = false;
|
|
166
|
-
}
|
|
167
|
-
if (resumeQueue)
|
|
168
|
-
processQueue();
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
// ─── Fallback Retry State ────────────────────────────
|
|
172
|
-
// key: originalCli, value: { fallbackCli, retriesLeft }
|
|
173
|
-
const FALLBACK_MAX_RETRIES = 3;
|
|
174
|
-
const fallbackState = new Map();
|
|
175
|
-
export function resetFallbackState() {
|
|
176
|
-
clearRetryTimer(true); // settings 변경 = 큐 재개 OK
|
|
177
|
-
fallbackState.clear();
|
|
178
|
-
console.log('[jaw:fallback] state reset');
|
|
179
|
-
}
|
|
180
|
-
export function getFallbackState() {
|
|
181
|
-
return Object.fromEntries(fallbackState);
|
|
109
|
+
return !!activeProcess || queueCtrl.isRetryPending() || mainSpawnStarting;
|
|
182
110
|
}
|
|
183
111
|
// ─── Kill / Steer ────────────────────────────────────
|
|
184
112
|
// [I2] Per-process kill reason map (replaces global variable to avoid cross-process confusion)
|
|
185
113
|
const killReasons = new Map();
|
|
114
|
+
const DEFAULT_STEER_WAIT_MS = 3_000;
|
|
115
|
+
const DEFAULT_KILL_ESCALATION_MS = 2_000;
|
|
116
|
+
const CLAUDE_E_STEER_WAIT_MS = 30_000;
|
|
117
|
+
const CLAUDE_E_STEER_KILL_ESCALATION_MS = 8_000;
|
|
118
|
+
function getActiveMainCli() {
|
|
119
|
+
return typeof currentMainMeta?.cli === 'string' ? currentMainMeta.cli : null;
|
|
120
|
+
}
|
|
121
|
+
function getActiveEffectiveProvider() {
|
|
122
|
+
return typeof currentMainMeta?.effectiveProvider === 'string' ? currentMainMeta.effectiveProvider : null;
|
|
123
|
+
}
|
|
124
|
+
function isActiveClaudePtyRuntime() {
|
|
125
|
+
const cli = getActiveMainCli();
|
|
126
|
+
return cli === 'claude-e' || (cli === 'ai-e' && getActiveEffectiveProvider() === 'claude');
|
|
127
|
+
}
|
|
128
|
+
function getKillPolicy(reason) {
|
|
129
|
+
if (reason === 'steer' && isActiveClaudePtyRuntime()) {
|
|
130
|
+
return { signal: 'SIGINT', escalationMs: CLAUDE_E_STEER_KILL_ESCALATION_MS };
|
|
131
|
+
}
|
|
132
|
+
return { signal: 'SIGTERM', escalationMs: DEFAULT_KILL_ESCALATION_MS };
|
|
133
|
+
}
|
|
134
|
+
export function getSteerWaitMsForActiveAgent() {
|
|
135
|
+
return isActiveClaudePtyRuntime() ? CLAUDE_E_STEER_WAIT_MS : DEFAULT_STEER_WAIT_MS;
|
|
136
|
+
}
|
|
186
137
|
/** Get kill reason for a process (by PID), consuming it */
|
|
187
138
|
function consumeKillReason(pid) {
|
|
188
139
|
if (!pid)
|
|
@@ -197,19 +148,6 @@ function consumeKillReason(pid) {
|
|
|
197
148
|
* 모두 폐기한다. exit handler의 processQueue() 자동 드레인이 stop 직후 잔존
|
|
198
149
|
* 메시지를 "스스로 steer" 처럼 실행하던 회귀를 차단.
|
|
199
150
|
*/
|
|
200
|
-
function purgeQueueOnStop(reason) {
|
|
201
|
-
if (messageQueue.length === 0)
|
|
202
|
-
return;
|
|
203
|
-
const dropped = messageQueue.length;
|
|
204
|
-
for (const item of messageQueue.splice(0)) {
|
|
205
|
-
try {
|
|
206
|
-
deleteQueuedMessage.run(item.id);
|
|
207
|
-
}
|
|
208
|
-
catch { /* best-effort */ }
|
|
209
|
-
}
|
|
210
|
-
console.log(`[jaw:stop] cleared ${dropped} pending message(s) (reason=${reason})`);
|
|
211
|
-
broadcast('queue_update', { pending: 0 });
|
|
212
|
-
}
|
|
213
151
|
/**
|
|
214
152
|
* Fix C2: 사용자 stop 시 worker-registry 도 비운다.
|
|
215
153
|
* gateway.submitMessage가 isAgentBusy() 외에 hasBlockingWorkers()/hasPendingWorkerReplays()
|
|
@@ -224,25 +162,26 @@ function clearWorkerSlotsOnStop(reason) {
|
|
|
224
162
|
console.log(`[jaw:stop] cleared worker registry (active=${active}, reason=${reason})`);
|
|
225
163
|
}
|
|
226
164
|
export function killActiveAgent(reason = 'user') {
|
|
227
|
-
const hadTimer =
|
|
165
|
+
const hadTimer = queueCtrl.isRetryPending();
|
|
228
166
|
const cancelledPendingMain = cancelPendingMainSpawn ? (cancelPendingMainSpawn(reason), true) : false;
|
|
229
167
|
clearRetryTimer(false); // stop 의도: 큐 재개 안 함
|
|
230
168
|
// Fix A: 사용자 stop은 큐도 폐기. steer/internal kill은 큐 보존.
|
|
231
169
|
// Fix C2: worker registry 도 비워서 hasBlockingWorkers/hasPendingWorkerReplays가 즉시 false.
|
|
232
170
|
if (reason === 'api' || reason === 'user') {
|
|
233
|
-
purgeQueueOnStop(reason);
|
|
171
|
+
queueCtrl.purgeQueueOnStop(reason);
|
|
234
172
|
clearWorkerSlotsOnStop(reason);
|
|
235
173
|
}
|
|
236
174
|
if (!activeProcess)
|
|
237
175
|
return hadTimer || cancelledPendingMain; // timer/gated spawn 취소도 "killed" 취급
|
|
238
|
-
|
|
176
|
+
const policy = getKillPolicy(reason);
|
|
177
|
+
console.log(`[jaw:kill] reason=${reason} cli=${getActiveMainCli() || 'unknown'} signal=${policy.signal} escalationMs=${policy.escalationMs}`);
|
|
239
178
|
if (activeProcess.pid)
|
|
240
179
|
killReasons.set(activeProcess.pid, reason);
|
|
241
180
|
try {
|
|
242
|
-
activeProcess.kill(
|
|
181
|
+
activeProcess.kill(policy.signal);
|
|
243
182
|
}
|
|
244
183
|
catch (e) {
|
|
245
|
-
console.warn(
|
|
184
|
+
console.warn(`[agent:kill] ${policy.signal} failed`, { pid: activeProcess?.pid, error: e.message });
|
|
246
185
|
}
|
|
247
186
|
const proc = activeProcess;
|
|
248
187
|
setTimeout(() => {
|
|
@@ -253,7 +192,7 @@ export function killActiveAgent(reason = 'user') {
|
|
|
253
192
|
catch (e) {
|
|
254
193
|
console.warn('[agent:kill] SIGKILL failed', { pid: proc?.pid, error: e.message });
|
|
255
194
|
}
|
|
256
|
-
},
|
|
195
|
+
}, policy.escalationMs);
|
|
257
196
|
// Fix C1: 사용자 stop 시 isAgentBusy()가 즉시 false가 되도록 참조를 동기 해제.
|
|
258
197
|
// 실제 child 종료는 위 setTimeout SIGKILL이 백그라운드에서 마무리.
|
|
259
198
|
// exit handler의 setActiveProcess(null) / activeProcesses.delete 는 idempotent.
|
|
@@ -263,12 +202,12 @@ export function killActiveAgent(reason = 'user') {
|
|
|
263
202
|
return true;
|
|
264
203
|
}
|
|
265
204
|
export function killAllAgents(reason = 'user') {
|
|
266
|
-
const hadTimer =
|
|
205
|
+
const hadTimer = queueCtrl.isRetryPending();
|
|
267
206
|
const cancelledPendingMain = cancelPendingMainSpawn ? (cancelPendingMainSpawn(reason), true) : false;
|
|
268
207
|
clearRetryTimer(false); // stop 의도: 큐 재개 안 함
|
|
269
208
|
// Fix A: 사용자 stop은 큐도 폐기. Fix C2: worker 슬롯도 비움.
|
|
270
209
|
if (reason === 'api' || reason === 'user') {
|
|
271
|
-
purgeQueueOnStop(reason);
|
|
210
|
+
queueCtrl.purgeQueueOnStop(reason);
|
|
272
211
|
clearWorkerSlotsOnStop(reason);
|
|
273
212
|
}
|
|
274
213
|
let killed = 0;
|
|
@@ -331,9 +270,10 @@ export function waitForProcessEnd(timeoutMs = 3000) {
|
|
|
331
270
|
});
|
|
332
271
|
}
|
|
333
272
|
export async function steerAgent(newPrompt, source) {
|
|
273
|
+
const steerWaitMs = getSteerWaitMsForActiveAgent();
|
|
334
274
|
const wasRunning = killActiveAgent('steer');
|
|
335
275
|
if (wasRunning)
|
|
336
|
-
await waitForProcessEnd(
|
|
276
|
+
await waitForProcessEnd(steerWaitMs);
|
|
337
277
|
insertMessage.run('user', newPrompt, source, '', settings["workingDir"] || null);
|
|
338
278
|
broadcast('new_message', { role: 'user', content: newPrompt, source });
|
|
339
279
|
const { orchestrate, orchestrateContinue, orchestrateReset, isContinueIntent, isResetIntent } = await import('../orchestrator/pipeline.js');
|
|
@@ -348,150 +288,6 @@ export async function steerAgent(newPrompt, source) {
|
|
|
348
288
|
broadcast('orchestrate_done', { text: `[error] ${err.message}`, error: true, origin });
|
|
349
289
|
});
|
|
350
290
|
}
|
|
351
|
-
// ─── Message Queue ───────────────────────────────────
|
|
352
|
-
export function getQueuedMessageSnapshotForScope(scope) {
|
|
353
|
-
return messageQueue
|
|
354
|
-
.filter(item => item.scope === scope)
|
|
355
|
-
.map(item => ({
|
|
356
|
-
id: item.id,
|
|
357
|
-
prompt: item.prompt,
|
|
358
|
-
source: item.source,
|
|
359
|
-
ts: item.ts,
|
|
360
|
-
}));
|
|
361
|
-
}
|
|
362
|
-
export function removeQueuedMessage(id) {
|
|
363
|
-
const idx = messageQueue.findIndex(item => item.id === id);
|
|
364
|
-
if (idx === -1)
|
|
365
|
-
return { removed: null, pending: messageQueue.length };
|
|
366
|
-
const [removed] = messageQueue.splice(idx, 1);
|
|
367
|
-
try {
|
|
368
|
-
deleteQueuedMessage.run(id);
|
|
369
|
-
}
|
|
370
|
-
catch (err) {
|
|
371
|
-
console.warn(`[queue] DB delete failed for ${id}:`, err.message);
|
|
372
|
-
}
|
|
373
|
-
console.log(`[queue] -1 (${messageQueue.length} pending) removed=${id}`);
|
|
374
|
-
broadcast('queue_update', { pending: messageQueue.length });
|
|
375
|
-
return { removed: removed, pending: messageQueue.length };
|
|
376
|
-
}
|
|
377
|
-
export function enqueueMessage(prompt, source, meta) {
|
|
378
|
-
const item = stripUndefined({
|
|
379
|
-
id: crypto.randomUUID(),
|
|
380
|
-
prompt,
|
|
381
|
-
source,
|
|
382
|
-
scope: meta?.scope || 'default',
|
|
383
|
-
target: meta?.target,
|
|
384
|
-
chatId: meta?.chatId,
|
|
385
|
-
requestId: meta?.requestId,
|
|
386
|
-
ts: Date.now(),
|
|
387
|
-
});
|
|
388
|
-
insertQueuedMessage.run(item.id, JSON.stringify(item));
|
|
389
|
-
messageQueue.push(item);
|
|
390
|
-
console.log(`[queue] +1 (${messageQueue.length} pending)`);
|
|
391
|
-
broadcast('queue_update', { pending: messageQueue.length });
|
|
392
|
-
processQueue();
|
|
393
|
-
return item.id;
|
|
394
|
-
}
|
|
395
|
-
export async function processQueue() {
|
|
396
|
-
if (queueProcessing)
|
|
397
|
-
return;
|
|
398
|
-
// Auto-drain pending worker replays when Boss is idle. Covers the case where
|
|
399
|
-
// Boss died after the dispatch client disconnected — the result was stuck in
|
|
400
|
-
// pendingReplay and nothing was triggering drainPendingReplays. Dynamic
|
|
401
|
-
// import avoids circular dep (pipeline.ts imports from this module).
|
|
402
|
-
if (!activeProcess && !retryPendingTimer && !mainSpawnStarting && !hasBlockingWorkers() && hasPendingWorkerReplays()) {
|
|
403
|
-
queueMicrotask(() => {
|
|
404
|
-
import('../orchestrator/pipeline.js')
|
|
405
|
-
.then(({ drainPendingReplays }) => drainPendingReplays({ origin: 'system' }))
|
|
406
|
-
.catch(err => console.error('[processQueue:drain]', err.message));
|
|
407
|
-
});
|
|
408
|
-
// Fall through: if messageQueue has entries, we still process them below.
|
|
409
|
-
// orchestrate() inside drain will also drain — idempotent via claimWorkerReplay.
|
|
410
|
-
}
|
|
411
|
-
if (activeProcess
|
|
412
|
-
|| retryPendingTimer
|
|
413
|
-
|| mainSpawnStarting
|
|
414
|
-
|| hasBlockingWorkers()
|
|
415
|
-
|| messageQueue.length === 0)
|
|
416
|
-
return;
|
|
417
|
-
// NOTE: hasPendingWorkerReplays() is intentionally NOT gated here —
|
|
418
|
-
// orchestrate() drains pending replays at entry (pipeline.ts drainPendingReplays),
|
|
419
|
-
// so the queued user message still arrives AFTER the worker result. Keeping this
|
|
420
|
-
// gate caused a deadlock (see devlog/_plan/260417_message_duplication/02_*).
|
|
421
|
-
queueProcessing = true;
|
|
422
|
-
// Group by source+target — only process the first group, leave rest in queue
|
|
423
|
-
const first = messageQueue[0];
|
|
424
|
-
const groupKey = groupQueueKey(first.source, first.target);
|
|
425
|
-
const batch = [];
|
|
426
|
-
const remaining = [];
|
|
427
|
-
for (const m of messageQueue) {
|
|
428
|
-
const key = groupQueueKey(m.source, m.target);
|
|
429
|
-
if (key === groupKey)
|
|
430
|
-
batch.push(m);
|
|
431
|
-
else
|
|
432
|
-
remaining.push(m);
|
|
433
|
-
}
|
|
434
|
-
// Replace queue with remaining items + unprocessed batch tail
|
|
435
|
-
// 📋 Queue policy: "fair" — 다른 chatId 메시지 우선 소비, 같은 chatId tail은 뒤로.
|
|
436
|
-
// "chatId-first" 정책이 필요하면 push 순서를 (batch.slice(1), ...remaining)으로 변경.
|
|
437
|
-
messageQueue.length = 0;
|
|
438
|
-
if (batch.length > 1) {
|
|
439
|
-
// 🔑 batch 분리: 첫 메시지만 처리
|
|
440
|
-
// remaining(다른 chatId) 먼저 → batch tail(같은 chatId) 뒤 → chatId 독점 방지
|
|
441
|
-
messageQueue.push(...remaining, ...batch.slice(1));
|
|
442
|
-
}
|
|
443
|
-
else {
|
|
444
|
-
messageQueue.push(...remaining);
|
|
445
|
-
}
|
|
446
|
-
const item = batch[0];
|
|
447
|
-
const combined = item.prompt;
|
|
448
|
-
const source = item.source;
|
|
449
|
-
const target = item.target;
|
|
450
|
-
const chatId = item.chatId;
|
|
451
|
-
const requestId = item.requestId;
|
|
452
|
-
const origin = source || 'web';
|
|
453
|
-
console.log(`[queue] processing 1/${batch.length} message(s) for ${groupKey}, ${messageQueue.length} remaining`);
|
|
454
|
-
let inserted = false;
|
|
455
|
-
try {
|
|
456
|
-
insertMessage.run('user', combined, source, '', settings["workingDir"] || null);
|
|
457
|
-
deleteQueuedMessage.run(item.id);
|
|
458
|
-
inserted = true;
|
|
459
|
-
// Broadcast WITH fromQueue=true so the web client renders the user bubble
|
|
460
|
-
// now (not at enqueue time). gateway.ts:130 also broadcasts at enqueue,
|
|
461
|
-
// but the web client ignores that one — it only acts on fromQueue.
|
|
462
|
-
broadcast('new_message', { role: 'user', content: combined, source, fromQueue: true });
|
|
463
|
-
broadcast('queue_update', { pending: messageQueue.length });
|
|
464
|
-
const { orchestrate, orchestrateContinue, orchestrateReset, isContinueIntent, isResetIntent } = await import('../orchestrator/pipeline.js');
|
|
465
|
-
const task = isResetIntent(combined)
|
|
466
|
-
? orchestrateReset({ origin, target, chatId, requestId, _skipInsert: true })
|
|
467
|
-
: isContinueIntent(combined)
|
|
468
|
-
? orchestrateContinue({ origin, target, chatId, requestId, _skipInsert: true })
|
|
469
|
-
: orchestrate(combined, { origin, target, chatId, requestId, _skipInsert: true });
|
|
470
|
-
try {
|
|
471
|
-
await task;
|
|
472
|
-
}
|
|
473
|
-
catch (err) {
|
|
474
|
-
const msg = err.message;
|
|
475
|
-
console.error('[queue:orchestrate]', msg);
|
|
476
|
-
broadcast('orchestrate_done', { text: `[error] ${msg}`, error: true, origin, chatId, target, requestId });
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
catch (setupErr) {
|
|
480
|
-
console.error('[queue:setup]', setupErr);
|
|
481
|
-
if (!inserted) {
|
|
482
|
-
// insertMessage hasn't run yet — safe to requeue
|
|
483
|
-
messageQueue.unshift(item);
|
|
484
|
-
}
|
|
485
|
-
else {
|
|
486
|
-
// Message is already in DB — broadcast error, don't requeue (would cause duplicate)
|
|
487
|
-
broadcast('orchestrate_done', { text: `[error] setup failed: ${setupErr.message}`, error: true, origin, chatId, target, requestId });
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
finally {
|
|
491
|
-
queueProcessing = false;
|
|
492
|
-
queueMicrotask(() => processQueue());
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
291
|
// ─── Helpers ─────────────────────────────────────────
|
|
496
292
|
function makeCleanEnv(extraEnv = {}) {
|
|
497
293
|
const env = { ...process.env };
|
|
@@ -588,68 +384,20 @@ function withHistoryPrompt(prompt, historyBlock) {
|
|
|
588
384
|
return body;
|
|
589
385
|
return `${historyBlock}\n\n---\n[Current Message]\n${body}`;
|
|
590
386
|
}
|
|
591
|
-
import { buildArgs, buildResumeArgs, resolveSessionBucket } from './args.js';
|
|
592
|
-
export { buildArgs, buildResumeArgs, resolveSessionBucket };
|
|
387
|
+
import { buildArgs, buildResumeArgs, resolveAiEProvider, resolveSessionBucket } from './args.js';
|
|
388
|
+
export { buildArgs, buildResumeArgs, resolveAiEProvider, resolveSessionBucket };
|
|
593
389
|
// ─── Upload wrapper ──────────────────────────────────
|
|
594
390
|
export const saveUpload = (buffer, originalName, options) => _saveUpload(UPLOADS_DIR, Buffer.isBuffer(buffer) ? buffer : Buffer.from(buffer), originalName, options);
|
|
595
391
|
export { buildMediaPrompt, buildMediaPromptMany };
|
|
596
392
|
// ─── Spawn Agent ─────────────────────────────────────
|
|
597
393
|
import { AcpClient } from '../cli/acp-client.js';
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
export function shouldEmitHeartbeat(lastVisibleTs, heartbeatSent, gateMs = DEFAULT_HEARTBEAT_GATE_MS, now = Date.now()) {
|
|
604
|
-
if (heartbeatSent)
|
|
605
|
-
return false;
|
|
606
|
-
return (now - lastVisibleTs) > gateMs;
|
|
607
|
-
}
|
|
608
|
-
export function shouldResumeBucketSession(cli, requestedModel, bucketModel, requestedResumeKey, bucketResumeKey, bucketUpdatedAt, nowMs = Date.now()) {
|
|
609
|
-
if (cli === 'gemini') {
|
|
610
|
-
if (!bucketModel)
|
|
611
|
-
return false;
|
|
612
|
-
if (isExpiredBucket(bucketUpdatedAt, GEMINI_RESUME_TTL_MS, nowMs))
|
|
613
|
-
return false;
|
|
614
|
-
const requested = normalizeGeminiResumeModel(requestedModel);
|
|
615
|
-
const bucket = normalizeGeminiResumeModel(bucketModel);
|
|
616
|
-
if (!requested || !bucket)
|
|
617
|
-
return false;
|
|
618
|
-
return requested === bucket;
|
|
619
|
-
}
|
|
620
|
-
if (cli === 'copilot' && bucketModel) {
|
|
621
|
-
return normalizeModelForCli(cli, requestedModel) === normalizeModelForCli(cli, bucketModel);
|
|
622
|
-
}
|
|
623
|
-
if (cli === 'opencode' && requestedResumeKey) {
|
|
624
|
-
return requestedResumeKey === (bucketResumeKey ?? null);
|
|
625
|
-
}
|
|
626
|
-
return true;
|
|
627
|
-
}
|
|
628
|
-
export const GEMINI_RESUME_TTL_MS = 72 * 60 * 60 * 1000;
|
|
394
|
+
import { CodexAppClient } from './codex-app-client.js';
|
|
395
|
+
import { extractFromCodexAppEvent } from './codex-app-events.js';
|
|
396
|
+
import { shouldEmitHeartbeat, shouldResumeBucketSession, GEMINI_RESUME_TTL_MS } from './spawn/resume.js';
|
|
397
|
+
export { shouldEmitHeartbeat, shouldResumeBucketSession, GEMINI_RESUME_TTL_MS };
|
|
398
|
+
import { createQueueController, FALLBACK_MAX_RETRIES } from './spawn/queue.js';
|
|
629
399
|
const GEMINI_HISTORY_MAX_SESSIONS = 4;
|
|
630
400
|
const GEMINI_HISTORY_MAX_CHARS = 3000;
|
|
631
|
-
function normalizeGeminiResumeModel(model) {
|
|
632
|
-
const normalized = String(model || '').trim().toLowerCase();
|
|
633
|
-
if (!normalized || normalized === 'default' || normalized === 'auto')
|
|
634
|
-
return '';
|
|
635
|
-
return normalized;
|
|
636
|
-
}
|
|
637
|
-
function parseBucketUpdatedAt(value) {
|
|
638
|
-
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
639
|
-
return value < 10_000_000_000 ? value * 1000 : value;
|
|
640
|
-
}
|
|
641
|
-
const text = String(value || '').trim();
|
|
642
|
-
if (!text)
|
|
643
|
-
return null;
|
|
644
|
-
const parsed = Date.parse(text.includes('T') ? text : `${text.replace(' ', 'T')}Z`);
|
|
645
|
-
return Number.isFinite(parsed) ? parsed : null;
|
|
646
|
-
}
|
|
647
|
-
function isExpiredBucket(value, ttlMs, nowMs) {
|
|
648
|
-
const updatedAtMs = parseBucketUpdatedAt(value);
|
|
649
|
-
if (updatedAtMs === null)
|
|
650
|
-
return true;
|
|
651
|
-
return nowMs - updatedAtMs > ttlMs;
|
|
652
|
-
}
|
|
653
401
|
function cleanupEmployeeTmpDir(cwd, workingDir, label) {
|
|
654
402
|
if (cwd !== workingDir) {
|
|
655
403
|
try {
|
|
@@ -669,7 +417,7 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
669
417
|
const isEmployee = !mainManaged;
|
|
670
418
|
const empTag = isEmployee ? { isEmployee: true } : {};
|
|
671
419
|
if (gateEligibleMain && !opts._settingsGateWaited && isRuntimeSettingsMutationInFlight()) {
|
|
672
|
-
if (activeProcess ||
|
|
420
|
+
if (activeProcess || queueCtrl.isRetryPending() || mainSpawnStarting) {
|
|
673
421
|
console.log('[jaw] Agent already running, skipping');
|
|
674
422
|
return { child: null, promise: Promise.resolve({ text: '', code: -1 }) };
|
|
675
423
|
}
|
|
@@ -733,7 +481,7 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
733
481
|
// instead of the legacy `isResumeGuess` heuristic. See comment near line 762.
|
|
734
482
|
// ─── Fallback retry: skip to fallback if retries exhausted ───
|
|
735
483
|
if (!opts._isFallback && !opts.internal) {
|
|
736
|
-
const st = fallbackState.get(cli);
|
|
484
|
+
const st = queueCtrl.fallbackState.get(cli);
|
|
737
485
|
if (st && st.retriesLeft <= 0) {
|
|
738
486
|
const fbAvail = detectCli(st.fallbackCli)?.available;
|
|
739
487
|
if (fbAvail) {
|
|
@@ -751,8 +499,30 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
751
499
|
}
|
|
752
500
|
const cfg = settings["perCli"]?.[cli] || {};
|
|
753
501
|
const ao = settings["activeOverrides"]?.[cli] || {};
|
|
754
|
-
const
|
|
502
|
+
const requestedModel = opts.model || ao.model || cfg.model || 'default';
|
|
755
503
|
const effort = opts.effort || ao.effort || cfg.effort || '';
|
|
504
|
+
const effectiveProvider = cli === 'ai-e'
|
|
505
|
+
? resolveAiEProvider(typeof cfg.provider === 'string'
|
|
506
|
+
? cfg.provider
|
|
507
|
+
: typeof ao.provider === 'string'
|
|
508
|
+
? ao.provider
|
|
509
|
+
: undefined, requestedModel)
|
|
510
|
+
: cli;
|
|
511
|
+
const model = cli === 'ai-e' && effectiveProvider === 'claude'
|
|
512
|
+
? migrateLegacyClaudeValue(requestedModel)
|
|
513
|
+
: requestedModel;
|
|
514
|
+
if (mainManaged) {
|
|
515
|
+
setCurrentMainMeta(stripUndefined({
|
|
516
|
+
origin,
|
|
517
|
+
target: opts.target,
|
|
518
|
+
chatId: opts.chatId,
|
|
519
|
+
requestId: opts.requestId,
|
|
520
|
+
scopeId: liveScope,
|
|
521
|
+
cli,
|
|
522
|
+
model,
|
|
523
|
+
effectiveProvider,
|
|
524
|
+
}));
|
|
525
|
+
}
|
|
756
526
|
const includeDirectories = Array.isArray(cfg.includeDirectories)
|
|
757
527
|
? cfg.includeDirectories.filter((dir) => typeof dir === 'string' && dir.trim().length > 0)
|
|
758
528
|
: [];
|
|
@@ -762,7 +532,7 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
762
532
|
// Bucket-aware resume: codex-spark is kept in its own session bucket so
|
|
763
533
|
// cross-model resume (gpt-5.4 ↔ gpt-5.3-codex-spark) doesn't send a
|
|
764
534
|
// mismatched session_id to the server.
|
|
765
|
-
const currentBucket = resolveSessionBucket(cli, model);
|
|
535
|
+
const currentBucket = resolveSessionBucket(cli, model, effectiveProvider);
|
|
766
536
|
const cliEnv = applyCliEnvDefaults(cli, opts.env);
|
|
767
537
|
const spawnEnv = makeCleanEnv(cliEnv);
|
|
768
538
|
const bucketRow = currentBucket ? getSessionBucket.get(currentBucket) : null;
|
|
@@ -771,10 +541,12 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
771
541
|
const bucketResumeKey = typeof bucketRow?.resume_key === 'string' ? bucketRow.resume_key : null;
|
|
772
542
|
const bucketUpdatedAt = bucketRow?.updated_at ?? null;
|
|
773
543
|
const resumeKey = buildSessionResumeKey(cli, spawnEnv);
|
|
544
|
+
const providerSupportsResume = !(cli === 'ai-e' && effectiveProvider !== 'claude');
|
|
774
545
|
const canResumeBucketSession = !bucketSessionId || shouldResumeBucketSession(cli, model, bucketModel, resumeKey, bucketResumeKey, bucketUpdatedAt);
|
|
775
546
|
const isResume = empSid
|
|
776
547
|
? true
|
|
777
|
-
: (!opts._skipResume && !forceNew && !!bucketSessionId && canResumeBucketSession);
|
|
548
|
+
: (providerSupportsResume && !opts._skipResume && !forceNew && !!bucketSessionId && canResumeBucketSession);
|
|
549
|
+
const runtimeStatusMeta = buildAiERuntimeStatusMeta(cli, effectiveProvider, model);
|
|
778
550
|
// ─── Bootstrap compact 1-shot injection (Phase 52: bucket-aware) ───
|
|
779
551
|
// Vendor-agnostic: compact handler reset session_id and stored bootstrap in DB.
|
|
780
552
|
// Inject only on fresh main spawns (not employee/fallback/internal/resume).
|
|
@@ -820,17 +592,27 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
820
592
|
const historyBlock = !isResume && !opts._skipHistory
|
|
821
593
|
? buildHistoryBlock(prompt, settings["workingDir"], cli === 'gemini' ? GEMINI_HISTORY_MAX_SESSIONS : 10, cli === 'gemini' ? GEMINI_HISTORY_MAX_CHARS : 8000)
|
|
822
594
|
: '';
|
|
823
|
-
const promptForArgs = (cli === 'gemini' || cli === 'opencode')
|
|
595
|
+
const promptForArgs = (cli === 'gemini' || cli === 'grok' || cli === 'opencode')
|
|
824
596
|
? withHistoryPrompt(prompt, historyBlock)
|
|
825
597
|
: prompt;
|
|
598
|
+
const claudeBin = (cli === 'claude-e' || (cli === 'ai-e' && effectiveProvider === 'claude'))
|
|
599
|
+
? detectCli('claude').path
|
|
600
|
+
: null;
|
|
601
|
+
const argOptions = {
|
|
602
|
+
fastMode: cfg.fastMode,
|
|
603
|
+
sysPrompt,
|
|
604
|
+
includeDirectories,
|
|
605
|
+
aiEProvider: effectiveProvider,
|
|
606
|
+
...(claudeBin ? { claudeBin } : {}),
|
|
607
|
+
};
|
|
826
608
|
let args;
|
|
827
609
|
if (isResume) {
|
|
828
610
|
const sid = resumeSessionId || '';
|
|
829
611
|
console.log(`[jaw:resume] ${cli} session=${sid.slice(0, 12)}...`);
|
|
830
|
-
args = buildResumeArgs(cli, model, effort, sid, prompt, permissions,
|
|
612
|
+
args = buildResumeArgs(cli, model, effort, sid, prompt, permissions, argOptions);
|
|
831
613
|
}
|
|
832
614
|
else {
|
|
833
|
-
args = buildArgs(cli, model, effort, promptForArgs, sysPrompt, permissions,
|
|
615
|
+
args = buildArgs(cli, model, effort, promptForArgs, sysPrompt, permissions, argOptions);
|
|
834
616
|
}
|
|
835
617
|
const agentLabel = agentId || 'main';
|
|
836
618
|
const traceAudience = (opts.internal || isEmployee) ? 'internal' : 'public';
|
|
@@ -886,6 +668,8 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
886
668
|
}
|
|
887
669
|
else {
|
|
888
670
|
console.log(`[jaw:${agentLabel}] Spawning: ${cli} ${args.join(' ').slice(0, 120)}...`);
|
|
671
|
+
if (cli === 'claude-e')
|
|
672
|
+
console.log(`[jaw:${agentLabel}:args] ${JSON.stringify(args)}`);
|
|
889
673
|
}
|
|
890
674
|
if (cli === 'gemini' && sysPrompt) {
|
|
891
675
|
const tmpSysFile = join(os.tmpdir(), `jaw-gemini-sys-${agentLabel}.md`);
|
|
@@ -1199,16 +983,8 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
1199
983
|
resolve: resolve,
|
|
1200
984
|
activeProcesses,
|
|
1201
985
|
setActiveProcess: (v) => { activeProcess = v; },
|
|
1202
|
-
retryState:
|
|
1203
|
-
|
|
1204
|
-
resolve: retryPendingResolve,
|
|
1205
|
-
origin: retryPendingOrigin,
|
|
1206
|
-
setTimer: (t) => { retryPendingTimer = t; },
|
|
1207
|
-
setResolve: (r) => { retryPendingResolve = r; },
|
|
1208
|
-
setOrigin: (o) => { retryPendingOrigin = o; },
|
|
1209
|
-
setIsEmployee: (v) => { retryPendingIsEmployee = v; },
|
|
1210
|
-
},
|
|
1211
|
-
fallbackState,
|
|
986
|
+
retryState: queueCtrl.retryState,
|
|
987
|
+
fallbackState: queueCtrl.fallbackState,
|
|
1212
988
|
fallbackMaxRetries: FALLBACK_MAX_RETRIES,
|
|
1213
989
|
processQueue,
|
|
1214
990
|
}).catch((err) => {
|
|
@@ -1217,11 +993,284 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
1217
993
|
});
|
|
1218
994
|
return { child, promise: resultPromise };
|
|
1219
995
|
}
|
|
996
|
+
// ─── Codex AppServer branch ────────────────────
|
|
997
|
+
if (cli === 'codex-app') {
|
|
998
|
+
const appClient = new CodexAppClient({
|
|
999
|
+
binary: detected.path || 'codex',
|
|
1000
|
+
workDir: spawnCwd,
|
|
1001
|
+
env: spawnEnv,
|
|
1002
|
+
model,
|
|
1003
|
+
effort,
|
|
1004
|
+
});
|
|
1005
|
+
appClient.spawn();
|
|
1006
|
+
const child = appClient.proc;
|
|
1007
|
+
if (!child) {
|
|
1008
|
+
throw new Error('Codex AppServer process was not created');
|
|
1009
|
+
}
|
|
1010
|
+
if (mainManaged)
|
|
1011
|
+
activeProcess = child;
|
|
1012
|
+
if (activeProcesses.has(agentLabel)) {
|
|
1013
|
+
console.warn(`[spawn:dup] activeProcesses already has child for ${agentLabel} — orphaning previous reference`);
|
|
1014
|
+
}
|
|
1015
|
+
activeProcesses.set(agentLabel, child);
|
|
1016
|
+
if (!opts.internal)
|
|
1017
|
+
broadcast('agent_status', { running: true, agentId: agentLabel, cli, ...empTag });
|
|
1018
|
+
if (mainManaged && !opts.internal)
|
|
1019
|
+
beginLiveRun(liveScope, cli);
|
|
1020
|
+
let codexAppSettled = false;
|
|
1021
|
+
appClient.on('error', (err) => {
|
|
1022
|
+
if (codexAppSettled)
|
|
1023
|
+
return;
|
|
1024
|
+
codexAppSettled = true;
|
|
1025
|
+
appClient.cleanup();
|
|
1026
|
+
cleanupEmployeeTmpDir(spawnCwd, settings["workingDir"], agentLabel);
|
|
1027
|
+
opts.lifecycle?.onExit?.(null);
|
|
1028
|
+
const msg = `Codex AppServer spawn failed: ${err.message}`;
|
|
1029
|
+
console.error(`[codex-app:error] ${msg}`);
|
|
1030
|
+
activeProcesses.delete(agentLabel);
|
|
1031
|
+
if (mainManaged) {
|
|
1032
|
+
activeProcess = null;
|
|
1033
|
+
clearLiveRun(liveScope);
|
|
1034
|
+
broadcast('agent_status', { running: false, agentId: agentLabel });
|
|
1035
|
+
}
|
|
1036
|
+
broadcast('agent_done', { text: `❌ ${msg}`, error: true, origin, ...empTag }, isEmployee ? 'internal' : 'public');
|
|
1037
|
+
resolve({ text: '', code: 1 });
|
|
1038
|
+
if (mainManaged)
|
|
1039
|
+
processQueue();
|
|
1040
|
+
});
|
|
1041
|
+
if (mainManaged && !opts.internal && !opts._skipInsert) {
|
|
1042
|
+
insertMessage.run('user', prompt, cli, model, settings["workingDir"] || null);
|
|
1043
|
+
}
|
|
1044
|
+
if (!opts.internal)
|
|
1045
|
+
broadcast('agent_status', { status: 'running', cli, agentId: agentLabel, ...empTag }, traceAudience);
|
|
1046
|
+
const traceRunId = startTraceRun({ cli, model, workingDir: settings["workingDir"] || null, agentLabel, audience: traceAudience });
|
|
1047
|
+
const ctx = {
|
|
1048
|
+
fullText: '', traceLog: [], toolLog: [], seenToolKeys: new Set(),
|
|
1049
|
+
hasClaudeStreamEvents: false, sessionId: null, cost: null,
|
|
1050
|
+
turns: null, duration: null, tokens: null, stderrBuf: '',
|
|
1051
|
+
thinkingBuf: '',
|
|
1052
|
+
liveScope: effectiveLiveScope,
|
|
1053
|
+
parentLiveScope: parentLiveScopeForChild,
|
|
1054
|
+
traceRunId,
|
|
1055
|
+
traceAudience,
|
|
1056
|
+
};
|
|
1057
|
+
function flushCodexAppThinking() {
|
|
1058
|
+
if (!ctx.thinkingBuf)
|
|
1059
|
+
return;
|
|
1060
|
+
const merged = ctx.thinkingBuf.trim();
|
|
1061
|
+
if (merged) {
|
|
1062
|
+
const singleLine = merged.replace(/\s+/g, ' ').trim();
|
|
1063
|
+
const label = singleLine.length > 120 ? `${singleLine.slice(0, 119)}…` : singleLine;
|
|
1064
|
+
console.log(` 💭 ${label}`);
|
|
1065
|
+
const tool = { icon: '💭', label, toolType: 'thinking', detail: merged };
|
|
1066
|
+
stampTraceTool(tool, ctx, 'thinking');
|
|
1067
|
+
ctx.toolLog.push(tool);
|
|
1068
|
+
if (ctx.liveScope)
|
|
1069
|
+
replaceLiveRunTools(ctx.liveScope, ctx.toolLog);
|
|
1070
|
+
if (ctx.parentLiveScope)
|
|
1071
|
+
appendLiveRunTool(ctx.parentLiveScope, { ...tool, isEmployee: true });
|
|
1072
|
+
broadcast('agent_tool', { agentId: agentLabel, ...tool, ...empTag }, traceAudience);
|
|
1073
|
+
}
|
|
1074
|
+
ctx.thinkingBuf = '';
|
|
1075
|
+
}
|
|
1076
|
+
let lastVisibleBroadcastTs = Date.now();
|
|
1077
|
+
let heartbeatSent = false;
|
|
1078
|
+
appClient.on('notification', (method, params) => {
|
|
1079
|
+
if (method === 'turn/completed' || method === 'turn/started' || method === 'error') {
|
|
1080
|
+
console.log(`[codex-app:notify] ${method}`);
|
|
1081
|
+
}
|
|
1082
|
+
appendTraceEvent({ runId: ctx.traceRunId, source: 'codex_app_raw', eventType: method, raw: params });
|
|
1083
|
+
const parsed = extractFromCodexAppEvent(method, params, ctx);
|
|
1084
|
+
if (!parsed)
|
|
1085
|
+
return;
|
|
1086
|
+
if (parsed.flushThinking) {
|
|
1087
|
+
flushCodexAppThinking();
|
|
1088
|
+
}
|
|
1089
|
+
if (parsed.tool) {
|
|
1090
|
+
const parsedTool = parsed.tool;
|
|
1091
|
+
if (parsedTool.icon === '💭') {
|
|
1092
|
+
ctx.thinkingBuf += parsedTool.detail || parsedTool.label;
|
|
1093
|
+
return;
|
|
1094
|
+
}
|
|
1095
|
+
flushCodexAppThinking();
|
|
1096
|
+
const key = `${parsedTool.icon}:${parsedTool.label}:${parsedTool.stepRef || ''}:${parsedTool.status || ''}`;
|
|
1097
|
+
if (!ctx.seenToolKeys.has(key)) {
|
|
1098
|
+
ctx.seenToolKeys.add(key);
|
|
1099
|
+
stampTraceTool(parsedTool, ctx, parsedTool.toolType || 'tool');
|
|
1100
|
+
ctx.toolLog.push(parsedTool);
|
|
1101
|
+
if (ctx.liveScope)
|
|
1102
|
+
replaceLiveRunTools(ctx.liveScope, ctx.toolLog);
|
|
1103
|
+
if (ctx.parentLiveScope)
|
|
1104
|
+
appendLiveRunTool(ctx.parentLiveScope, { ...parsedTool, isEmployee: true });
|
|
1105
|
+
broadcast('agent_tool', { agentId: agentLabel, ...parsedTool, ...empTag }, traceAudience);
|
|
1106
|
+
lastVisibleBroadcastTs = Date.now();
|
|
1107
|
+
heartbeatSent = false;
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
if (parsed.text) {
|
|
1111
|
+
flushCodexAppThinking();
|
|
1112
|
+
ctx.fullText += parsed.text;
|
|
1113
|
+
if (ctx.liveScope)
|
|
1114
|
+
appendLiveRunText(ctx.liveScope, parsed.text);
|
|
1115
|
+
}
|
|
1116
|
+
if (parsed.sessionId && !ctx.sessionId) {
|
|
1117
|
+
ctx.sessionId = parsed.sessionId;
|
|
1118
|
+
}
|
|
1119
|
+
if (parsed.tokens) {
|
|
1120
|
+
ctx.tokens = parsed.tokens;
|
|
1121
|
+
}
|
|
1122
|
+
if (parsed.turnStatus && parsed.turnStatus !== 'completed') {
|
|
1123
|
+
console.warn(`[codex-app:turn] final status: ${parsed.turnStatus}`);
|
|
1124
|
+
turnCompleted = false;
|
|
1125
|
+
}
|
|
1126
|
+
opts.lifecycle?.onActivity?.('codex-app');
|
|
1127
|
+
});
|
|
1128
|
+
appClient.on('stderr', (text) => {
|
|
1129
|
+
appendTraceEvent({ runId: ctx.traceRunId, source: 'stderr', eventType: 'stderr', raw: text });
|
|
1130
|
+
if (ctx.stderrBuf.length < 4000) {
|
|
1131
|
+
ctx.stderrBuf += text + '\n';
|
|
1132
|
+
}
|
|
1133
|
+
opts.lifecycle?.onActivity?.('stderr');
|
|
1134
|
+
if (shouldEmitHeartbeat(lastVisibleBroadcastTs, heartbeatSent)) {
|
|
1135
|
+
heartbeatSent = true;
|
|
1136
|
+
const elapsed = Math.round((Date.now() - lastVisibleBroadcastTs) / 1000);
|
|
1137
|
+
console.log(` ⏳ agent active (no visible event for ${elapsed}s)`);
|
|
1138
|
+
broadcast('agent_tool', {
|
|
1139
|
+
agentId: agentLabel,
|
|
1140
|
+
icon: '⏳',
|
|
1141
|
+
label: 'working... (no visible progress)',
|
|
1142
|
+
...empTag,
|
|
1143
|
+
}, traceAudience);
|
|
1144
|
+
}
|
|
1145
|
+
});
|
|
1146
|
+
let turnCompleted = false;
|
|
1147
|
+
(async () => {
|
|
1148
|
+
try {
|
|
1149
|
+
const initResult = await appClient.initialize();
|
|
1150
|
+
if (process.env["DEBUG"])
|
|
1151
|
+
console.log('[codex-app:init]', JSON.stringify(initResult).slice(0, 200));
|
|
1152
|
+
if (isResume && resumeSessionId) {
|
|
1153
|
+
try {
|
|
1154
|
+
await appClient.resumeThread(resumeSessionId);
|
|
1155
|
+
console.log(`[codex-app:session] resumeThread OK: ${resumeSessionId.slice(0, 12)}...`);
|
|
1156
|
+
}
|
|
1157
|
+
catch (resumeErr) {
|
|
1158
|
+
console.warn(`[codex-app:session] resumeThread FAILED: ${resumeErr.message} — starting new thread`);
|
|
1159
|
+
if (empSid && opts.agentId) {
|
|
1160
|
+
clearEmployeeSession.run(opts.agentId);
|
|
1161
|
+
}
|
|
1162
|
+
await appClient.startThread({ instructions: sysPrompt, cwd: spawnCwd });
|
|
1163
|
+
}
|
|
1164
|
+
}
|
|
1165
|
+
else {
|
|
1166
|
+
await appClient.startThread({ instructions: sysPrompt, cwd: spawnCwd });
|
|
1167
|
+
}
|
|
1168
|
+
ctx.sessionId = appClient.threadId;
|
|
1169
|
+
const useNativeResume = isResume && Boolean(resumeSessionId);
|
|
1170
|
+
const codexAppPrompt = (!useNativeResume && historyBlock)
|
|
1171
|
+
? `${historyBlock}\n\n[User Message]\n${prompt}`
|
|
1172
|
+
: prompt;
|
|
1173
|
+
const turnDone = new Promise((resolveTurn, rejectTurn) => {
|
|
1174
|
+
appClient.once('turn/completed', () => {
|
|
1175
|
+
appClient.removeListener('error', rejectTurn);
|
|
1176
|
+
resolveTurn();
|
|
1177
|
+
});
|
|
1178
|
+
appClient.once('error', rejectTurn);
|
|
1179
|
+
});
|
|
1180
|
+
await appClient.startTurn(codexAppPrompt);
|
|
1181
|
+
try {
|
|
1182
|
+
await turnDone;
|
|
1183
|
+
turnCompleted = true;
|
|
1184
|
+
}
|
|
1185
|
+
catch (turnErr) {
|
|
1186
|
+
console.warn(`[codex-app:turn] error during turn: ${turnErr.message}`);
|
|
1187
|
+
}
|
|
1188
|
+
flushCodexAppThinking();
|
|
1189
|
+
const persistedThreadId = appClient.threadId;
|
|
1190
|
+
if (persistedThreadId && persistMainSession(stripUndefined({
|
|
1191
|
+
ownerGeneration,
|
|
1192
|
+
forceNew,
|
|
1193
|
+
employeeSessionId: empSid,
|
|
1194
|
+
sessionId: persistedThreadId,
|
|
1195
|
+
isFallback: opts._isFallback,
|
|
1196
|
+
cli,
|
|
1197
|
+
model,
|
|
1198
|
+
resumeKey,
|
|
1199
|
+
effort: cfg.effort || '',
|
|
1200
|
+
skipSessionPersist: opts._skipSessionPersist === true,
|
|
1201
|
+
}))) {
|
|
1202
|
+
console.log(`[jaw:session] saved ${cli} session=${persistedThreadId.slice(0, 12)}... (pre-shutdown)`);
|
|
1203
|
+
}
|
|
1204
|
+
if (!codexAppSettled) {
|
|
1205
|
+
codexAppSettled = true;
|
|
1206
|
+
const smokeResult = detectSmokeResponse(ctx.fullText, ctx.toolLog, 0, cli);
|
|
1207
|
+
handleAgentExit({
|
|
1208
|
+
ctx, code: turnCompleted ? 0 : 1, cli, model, agentLabel, mainManaged, origin,
|
|
1209
|
+
resumeKey,
|
|
1210
|
+
prompt, opts, cfg, ownerGeneration, forceNew, empSid,
|
|
1211
|
+
isResume, wasKilled: false, wasSteer: false, smokeResult,
|
|
1212
|
+
effortDefault: '', costLine: '',
|
|
1213
|
+
resolve: resolve,
|
|
1214
|
+
activeProcesses,
|
|
1215
|
+
setActiveProcess: (v) => { activeProcess = v; },
|
|
1216
|
+
retryState: queueCtrl.retryState,
|
|
1217
|
+
fallbackState: queueCtrl.fallbackState,
|
|
1218
|
+
fallbackMaxRetries: FALLBACK_MAX_RETRIES,
|
|
1219
|
+
processQueue,
|
|
1220
|
+
}).catch((err) => {
|
|
1221
|
+
console.error(`[codex-app:handleAgentExit] ${err.message}`);
|
|
1222
|
+
});
|
|
1223
|
+
}
|
|
1224
|
+
await appClient.closeGracefully();
|
|
1225
|
+
}
|
|
1226
|
+
catch (err) {
|
|
1227
|
+
console.error(`[codex-app:error] ${err.message}`);
|
|
1228
|
+
ctx.stderrBuf += err.message;
|
|
1229
|
+
appClient.kill();
|
|
1230
|
+
}
|
|
1231
|
+
})();
|
|
1232
|
+
appClient.on('exit', (code, signal) => {
|
|
1233
|
+
if (codexAppSettled)
|
|
1234
|
+
return;
|
|
1235
|
+
codexAppSettled = true;
|
|
1236
|
+
appClient.cleanup();
|
|
1237
|
+
cleanupEmployeeTmpDir(spawnCwd, settings["workingDir"], agentLabel);
|
|
1238
|
+
opts.lifecycle?.onExit?.(code ?? null);
|
|
1239
|
+
const killReason = consumeKillReason(appClient.proc?.pid);
|
|
1240
|
+
if (code !== 0 && !killReason) {
|
|
1241
|
+
console.warn(`[codex-app:unexpected-exit] code=${code} signal=${signal} threadId=${ctx.sessionId || 'none'}`);
|
|
1242
|
+
}
|
|
1243
|
+
const wasKilled = !!killReason;
|
|
1244
|
+
const wasSteer = killReason === 'steer';
|
|
1245
|
+
flushCodexAppThinking();
|
|
1246
|
+
const smokeResult = detectSmokeResponse(ctx.fullText, ctx.toolLog, code, cli);
|
|
1247
|
+
const codexAppCode = turnCompleted ? 0 : (code ?? 1);
|
|
1248
|
+
handleAgentExit({
|
|
1249
|
+
ctx, code: codexAppCode, cli, model, agentLabel, mainManaged, origin,
|
|
1250
|
+
resumeKey,
|
|
1251
|
+
prompt, opts, cfg, ownerGeneration, forceNew, empSid,
|
|
1252
|
+
isResume, wasKilled, wasSteer, smokeResult,
|
|
1253
|
+
effortDefault: '', costLine: '',
|
|
1254
|
+
resolve: resolve,
|
|
1255
|
+
activeProcesses,
|
|
1256
|
+
setActiveProcess: (v) => { activeProcess = v; },
|
|
1257
|
+
retryState: queueCtrl.retryState,
|
|
1258
|
+
fallbackState: queueCtrl.fallbackState,
|
|
1259
|
+
fallbackMaxRetries: FALLBACK_MAX_RETRIES,
|
|
1260
|
+
processQueue,
|
|
1261
|
+
}).catch((err) => {
|
|
1262
|
+
console.error('[jaw:lifecycle] handleAgentExit failed (codex-app):', err.message);
|
|
1263
|
+
});
|
|
1264
|
+
});
|
|
1265
|
+
return { child, promise: resultPromise };
|
|
1266
|
+
}
|
|
1220
1267
|
// ─── Standard CLI branch (claude/codex/gemini/opencode) ──────
|
|
1221
|
-
// DIFF-B: Windows needs shell:true to
|
|
1268
|
+
// DIFF-B: Windows needs shell:true only when falling back to .cmd shims.
|
|
1222
1269
|
const spawnCommand = cli === 'opencode' && process.platform !== 'win32'
|
|
1223
1270
|
? (resolvedOpencodeBinary || detected.path || cli)
|
|
1224
|
-
: (
|
|
1271
|
+
: (detected.path || cli);
|
|
1272
|
+
const windowsSpawnUsesShell = process.platform === 'win32'
|
|
1273
|
+
&& !spawnCommand.toLowerCase().endsWith('.exe');
|
|
1225
1274
|
const opencodeSpawnAudit = cli === 'opencode'
|
|
1226
1275
|
? buildOpencodeSpawnAudit({ args, cwd: spawnCwd, env: spawnEnv, binary: spawnCommand })
|
|
1227
1276
|
: undefined;
|
|
@@ -1232,7 +1281,7 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
1232
1281
|
cwd: spawnCwd,
|
|
1233
1282
|
env: spawnEnv,
|
|
1234
1283
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
1235
|
-
...(
|
|
1284
|
+
...(windowsSpawnUsesShell ? { shell: true } : {}),
|
|
1236
1285
|
});
|
|
1237
1286
|
if (mainManaged)
|
|
1238
1287
|
activeProcess = child;
|
|
@@ -1242,7 +1291,7 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
1242
1291
|
}
|
|
1243
1292
|
activeProcesses.set(agentLabel, child);
|
|
1244
1293
|
if (!opts.internal)
|
|
1245
|
-
broadcast('agent_status', { running: true, agentId: agentLabel, cli, ...empTag });
|
|
1294
|
+
broadcast('agent_status', { running: true, agentId: agentLabel, cli, ...runtimeStatusMeta, ...empTag });
|
|
1246
1295
|
if (mainManaged && !opts.internal)
|
|
1247
1296
|
beginLiveRun(liveScope, cli);
|
|
1248
1297
|
// ─── DIFF-A: error guard — prevent uncaught ENOENT crash ───
|
|
@@ -1285,6 +1334,9 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
1285
1334
|
if (cli === 'claude') {
|
|
1286
1335
|
child.stdin.write(withHistoryPrompt(prompt, historyBlock));
|
|
1287
1336
|
}
|
|
1337
|
+
else if (cli === 'claude-e' || cli === 'ai-e') {
|
|
1338
|
+
child.stdin.write(isResume ? prompt : withHistoryPrompt(prompt, historyBlock));
|
|
1339
|
+
}
|
|
1288
1340
|
else if (cli === 'codex' && !isResume) {
|
|
1289
1341
|
const codexStdin = historyBlock
|
|
1290
1342
|
? `${historyBlock}\n\n[User Message]\n${prompt}`
|
|
@@ -1293,7 +1345,7 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
1293
1345
|
}
|
|
1294
1346
|
child.stdin.end();
|
|
1295
1347
|
if (!opts.internal)
|
|
1296
|
-
broadcast('agent_status', { status: 'running', cli, agentId: agentLabel, ...empTag }, traceAudience);
|
|
1348
|
+
broadcast('agent_status', { status: 'running', cli, agentId: agentLabel, ...runtimeStatusMeta, ...empTag }, traceAudience);
|
|
1297
1349
|
const traceRunId = startTraceRun({ cli, model, workingDir: settings["workingDir"] || null, agentLabel, audience: traceAudience });
|
|
1298
1350
|
const ctx = {
|
|
1299
1351
|
fullText: '',
|
|
@@ -1310,6 +1362,7 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
1310
1362
|
hasActiveSubAgent: false,
|
|
1311
1363
|
showReasoning: settings["showReasoning"] === true,
|
|
1312
1364
|
outputTextStarted: false,
|
|
1365
|
+
effectiveProvider,
|
|
1313
1366
|
liveScope: effectiveLiveScope,
|
|
1314
1367
|
parentLiveScope: parentLiveScopeForChild,
|
|
1315
1368
|
traceRunId,
|
|
@@ -1367,10 +1420,29 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
1367
1420
|
eventType: fieldString(asCliEventRecord(raw).type, '<no-type>'),
|
|
1368
1421
|
raw,
|
|
1369
1422
|
});
|
|
1370
|
-
|
|
1423
|
+
// claude-e / ai-e Claude: intercept jaw_runtime events BEFORE discriminator
|
|
1424
|
+
if ((cli === 'claude-e' || cli === 'ai-e') && isJawRuntimeEvent(raw)) {
|
|
1425
|
+
const rtEvt = raw;
|
|
1426
|
+
handleJawRuntimeEvent(rtEvt, agentLabel);
|
|
1427
|
+
// Extract sessionId from session_started or interrupted
|
|
1428
|
+
const evtName = rtEvt['event'];
|
|
1429
|
+
if ((evtName === 'session_started' || evtName === 'interrupted') && typeof rtEvt['sessionId'] === 'string') {
|
|
1430
|
+
ctx.sessionId = rtEvt['sessionId'];
|
|
1431
|
+
}
|
|
1432
|
+
if (evtName === 'error' && typeof rtEvt['message'] === 'string') {
|
|
1433
|
+
const message = `[jaw:${cli}:error] ${rtEvt['message']}`;
|
|
1434
|
+
ctx.stderrBuf = ctx.stderrBuf ? `${ctx.stderrBuf}\n${message}` : message;
|
|
1435
|
+
ctx.traceLog.push(message);
|
|
1436
|
+
}
|
|
1437
|
+
return;
|
|
1438
|
+
}
|
|
1439
|
+
const dispatchCli = cli === 'ai-e'
|
|
1440
|
+
? (ctx.effectiveProvider === 'claude' ? 'claude-e' : (ctx.effectiveProvider || 'ai-e'))
|
|
1441
|
+
: cli;
|
|
1442
|
+
const event = discriminate(dispatchCli, raw);
|
|
1371
1443
|
if (!event) {
|
|
1372
1444
|
const type = fieldString(asCliEventRecord(raw).type, '<no-type>');
|
|
1373
|
-
ctx.traceLog.push(`[cli:unknown-event] cli=${cli} type=${type} preview=${JSON.stringify(raw).slice(0, 200)}`);
|
|
1445
|
+
ctx.traceLog.push(`[cli:unknown-event] cli=${cli} provider=${dispatchCli} type=${type} preview=${JSON.stringify(raw).slice(0, 200)}`);
|
|
1374
1446
|
return;
|
|
1375
1447
|
}
|
|
1376
1448
|
recordOpencodeEvent(line, event);
|
|
@@ -1378,10 +1450,10 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
1378
1450
|
console.log(`[jaw:event:${agentLabel}] ${cli} type=${event.type}`);
|
|
1379
1451
|
console.log(`[jaw:raw:${agentLabel}] ${line.slice(0, 300)}`);
|
|
1380
1452
|
}
|
|
1381
|
-
logEventSummary(agentLabel,
|
|
1453
|
+
logEventSummary(agentLabel, dispatchCli, event, ctx);
|
|
1382
1454
|
if (!ctx.sessionId)
|
|
1383
|
-
ctx.sessionId = extractSessionId(
|
|
1384
|
-
extractFromEvent(
|
|
1455
|
+
ctx.sessionId = extractSessionId(dispatchCli, event);
|
|
1456
|
+
extractFromEvent(dispatchCli, event, ctx, agentLabel, empTag);
|
|
1385
1457
|
// Gemini watchdog: AFTER extractFromEvent sets geminiResultSeen
|
|
1386
1458
|
if (cli === 'gemini' && ctx.geminiResultSeen && !geminiWatchdog) {
|
|
1387
1459
|
geminiWatchdog = setTimeout(() => {
|
|
@@ -1396,7 +1468,7 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
1396
1468
|
if (ctx.hasActiveSubAgent) {
|
|
1397
1469
|
opts.lifecycle?.onActivity?.('heartbeat');
|
|
1398
1470
|
}
|
|
1399
|
-
const outputChunk = extractOutputChunk(
|
|
1471
|
+
const outputChunk = extractOutputChunk(dispatchCli, event, ctx);
|
|
1400
1472
|
if (outputChunk) {
|
|
1401
1473
|
if (ctx.liveScope)
|
|
1402
1474
|
appendLiveRunText(ctx.liveScope, outputChunk);
|
|
@@ -1478,24 +1550,16 @@ export function spawnAgent(prompt, opts = {}) {
|
|
|
1478
1550
|
// - error: code !== 0 && !wasKilled → classifyExitError
|
|
1479
1551
|
// - trace: if (traceText) traceText = `⏹️ [interrupted]…`
|
|
1480
1552
|
handleAgentExit({
|
|
1481
|
-
ctx, code, cli, model, agentLabel, mainManaged, origin,
|
|
1553
|
+
ctx, code, cli, model, effectiveProvider, agentLabel, mainManaged, origin,
|
|
1482
1554
|
resumeKey,
|
|
1483
1555
|
prompt, opts, cfg, ownerGeneration, forceNew, empSid,
|
|
1484
1556
|
isResume, wasKilled, wasSteer, smokeResult,
|
|
1485
|
-
effortDefault: 'medium', costLine,
|
|
1557
|
+
effortDefault: cli === 'grok' ? '' : 'medium', costLine,
|
|
1486
1558
|
resolve: resolve,
|
|
1487
1559
|
activeProcesses,
|
|
1488
1560
|
setActiveProcess: (v) => { activeProcess = v; },
|
|
1489
|
-
retryState:
|
|
1490
|
-
|
|
1491
|
-
resolve: retryPendingResolve,
|
|
1492
|
-
origin: retryPendingOrigin,
|
|
1493
|
-
setTimer: (t) => { retryPendingTimer = t; },
|
|
1494
|
-
setResolve: (r) => { retryPendingResolve = r; },
|
|
1495
|
-
setOrigin: (o) => { retryPendingOrigin = o; },
|
|
1496
|
-
setIsEmployee: (v) => { retryPendingIsEmployee = v; },
|
|
1497
|
-
},
|
|
1498
|
-
fallbackState,
|
|
1561
|
+
retryState: queueCtrl.retryState,
|
|
1562
|
+
fallbackState: queueCtrl.fallbackState,
|
|
1499
1563
|
fallbackMaxRetries: FALLBACK_MAX_RETRIES,
|
|
1500
1564
|
processQueue,
|
|
1501
1565
|
}).catch((err) => {
|