cli-jaw 2.2.4-preview.20260703203439 → 2.2.5
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.md +5 -4
- package/dist/bin/cli-jaw.js +9 -1
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/chat.js +9 -1
- package/dist/bin/commands/chat.js.map +1 -1
- package/dist/bin/commands/design.js +172 -0
- package/dist/bin/commands/design.js.map +1 -0
- package/dist/bin/commands/dispatch-helpers.js +28 -0
- package/dist/bin/commands/dispatch-helpers.js.map +1 -1
- package/dist/bin/commands/dispatch.js +133 -31
- package/dist/bin/commands/dispatch.js.map +1 -1
- package/dist/bin/commands/doctor.js +1 -1
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/init.js +1 -1
- package/dist/bin/commands/init.js.map +1 -1
- package/dist/bin/commands/map.js +53 -0
- package/dist/bin/commands/map.js.map +1 -0
- package/dist/bin/commands/mcp.js +1 -1
- package/dist/bin/commands/mcp.js.map +1 -1
- package/dist/bin/commands/skill.js +64 -3
- package/dist/bin/commands/skill.js.map +1 -1
- package/dist/bin/commands/status.js +1 -1
- package/dist/bin/commands/status.js.map +1 -1
- package/dist/bin/commands/tui/channel.js +20 -4
- package/dist/bin/commands/tui/channel.js.map +1 -1
- package/dist/bin/commands/tui/fullscreen-mode.js +17 -9
- package/dist/bin/commands/tui/fullscreen-mode.js.map +1 -1
- package/dist/bin/commands/tui/input-handler.js +30 -22
- package/dist/bin/commands/tui/input-handler.js.map +1 -1
- package/dist/bin/commands/tui/overlays.js +36 -8
- package/dist/bin/commands/tui/overlays.js.map +1 -1
- package/dist/bin/commands/tui/queue-command.js +71 -0
- package/dist/bin/commands/tui/queue-command.js.map +1 -0
- package/dist/bin/commands/tui/renderer.js +1 -0
- package/dist/bin/commands/tui/renderer.js.map +1 -1
- package/dist/bin/commands/tui/simple-mode.js +39 -1
- package/dist/bin/commands/tui/simple-mode.js.map +1 -1
- package/dist/bin/commands/tui/slash-command-runner.js +92 -4
- package/dist/bin/commands/tui/slash-command-runner.js.map +1 -1
- package/dist/bin/commands/tui/types.js +6 -4
- package/dist/bin/commands/tui/types.js.map +1 -1
- package/dist/bin/commands/tui/ws-handler.js +78 -9
- package/dist/bin/commands/tui/ws-handler.js.map +1 -1
- package/dist/bin/commands/worker.js +1 -3
- package/dist/bin/commands/worker.js.map +1 -1
- package/dist/bin/postinstall.js +3 -3
- package/dist/bin/postinstall.js.map +1 -1
- package/dist/server.js +7 -2
- package/dist/server.js.map +1 -1
- package/dist/src/agent/args.js +3 -0
- package/dist/src/agent/args.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +20 -0
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/spawn.js +24 -2
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/bgtask/notifier.js +2 -1
- package/dist/src/bgtask/notifier.js.map +1 -1
- package/dist/src/bgtask/recover.js +8 -7
- package/dist/src/bgtask/recover.js.map +1 -1
- package/dist/src/bgtask/registry.js +2 -1
- package/dist/src/bgtask/registry.js.map +1 -1
- package/dist/src/bgtask/runner.js +3 -2
- package/dist/src/bgtask/runner.js.map +1 -1
- package/dist/src/browser/vision.js +3 -1
- package/dist/src/browser/vision.js.map +1 -1
- package/dist/src/browser/web-ai/tab-lease-store.js +1 -3
- package/dist/src/browser/web-ai/tab-lease-store.js.map +1 -1
- package/dist/src/cli/commands.js +26 -4
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/handlers-runtime.js +7 -1
- package/dist/src/cli/handlers-runtime.js.map +1 -1
- package/dist/src/cli/handlers.js +1 -1
- package/dist/src/cli/handlers.js.map +1 -1
- package/dist/src/cli/tui/jawcode-bridge.js +13 -14
- package/dist/src/cli/tui/jawcode-bridge.js.map +1 -1
- package/dist/src/cli/tui/markdown.js +1 -1
- package/dist/src/cli/tui/markdown.js.map +1 -1
- package/dist/src/cli/tui/overlay.js +65 -10
- package/dist/src/cli/tui/overlay.js.map +1 -1
- package/dist/src/cli/tui/render/frame.js +109 -103
- package/dist/src/cli/tui/render/frame.js.map +1 -1
- package/dist/src/cli/tui/transcript.js +31 -9
- package/dist/src/cli/tui/transcript.js.map +1 -1
- package/dist/src/core/bus.js +2 -0
- package/dist/src/core/bus.js.map +1 -1
- package/dist/src/core/chat-sessions.js +2 -0
- package/dist/src/core/chat-sessions.js.map +1 -1
- package/dist/src/core/codex-config.js +2 -1
- package/dist/src/core/codex-config.js.map +1 -1
- package/dist/src/core/config.js +6 -3
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/event-bus.js +1 -1
- package/dist/src/core/event-bus.js.map +1 -1
- package/dist/src/core/logger.js +9 -1
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/main-session.js +2 -1
- package/dist/src/core/main-session.js.map +1 -1
- package/dist/src/core/runtime-settings.js +2 -1
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/core/session-ops.js +1 -1
- package/dist/src/core/session-ops.js.map +1 -1
- package/dist/src/core/widget-watcher.js +113 -0
- package/dist/src/core/widget-watcher.js.map +1 -0
- package/dist/src/discord/bot.js +42 -31
- package/dist/src/discord/bot.js.map +1 -1
- package/dist/src/discord/channel-types.js +16 -0
- package/dist/src/discord/channel-types.js.map +1 -1
- package/dist/src/discord/commands.js +8 -6
- package/dist/src/discord/commands.js.map +1 -1
- package/dist/src/discord/discord-file.js +4 -2
- package/dist/src/discord/discord-file.js.map +1 -1
- package/dist/src/discord/forwarder.js +10 -6
- package/dist/src/discord/forwarder.js.map +1 -1
- package/dist/src/ide/diff.js +1 -1
- package/dist/src/ide/diff.js.map +1 -1
- package/dist/src/manager/dashboard-service.js +5 -5
- package/dist/src/manager/dashboard-service.js.map +1 -1
- package/dist/src/manager/design/path-guards.js +86 -0
- package/dist/src/manager/design/path-guards.js.map +1 -0
- package/dist/src/manager/design/schema.js +54 -0
- package/dist/src/manager/design/schema.js.map +1 -0
- package/dist/src/manager/design/snapshots.js +62 -0
- package/dist/src/manager/design/snapshots.js.map +1 -0
- package/dist/src/manager/design/store.js +269 -0
- package/dist/src/manager/design/store.js.map +1 -0
- package/dist/src/manager/design/watcher.js +49 -0
- package/dist/src/manager/design/watcher.js.map +1 -0
- package/dist/src/manager/memory/embedding/vec-store.js +1 -1
- package/dist/src/manager/memory/embedding/vec-store.js.map +1 -1
- package/dist/src/manager/registry.js +84 -0
- package/dist/src/manager/registry.js.map +1 -1
- package/dist/src/manager/routes/dashboard-design.js +234 -0
- package/dist/src/manager/routes/dashboard-design.js.map +1 -0
- package/dist/src/manager/routes/dashboard-memory.js +1 -1
- package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
- package/dist/src/manager/routes/embedded-browser.js +497 -0
- package/dist/src/manager/routes/embedded-browser.js.map +1 -0
- package/dist/src/manager/routes/telegram-hub.js +4 -3
- package/dist/src/manager/routes/telegram-hub.js.map +1 -1
- package/dist/src/manager/server.js +17 -2
- package/dist/src/manager/server.js.map +1 -1
- package/dist/src/manager/telegram-hub/hub-bot.js +127 -7
- package/dist/src/manager/telegram-hub/hub-bot.js.map +1 -1
- package/dist/src/memory/heartbeat.js +15 -14
- package/dist/src/memory/heartbeat.js.map +1 -1
- package/dist/src/memory/identity.js +3 -2
- package/dist/src/memory/identity.js.map +1 -1
- package/dist/src/memory/memory.js +3 -2
- package/dist/src/memory/memory.js.map +1 -1
- package/dist/src/memory/reflect.js +2 -1
- package/dist/src/memory/reflect.js.map +1 -1
- package/dist/src/memory/runtime.js +3 -2
- package/dist/src/memory/runtime.js.map +1 -1
- package/dist/src/memory/shared.js +4 -3
- package/dist/src/memory/shared.js.map +1 -1
- package/dist/src/memory/worklog.js +3 -2
- package/dist/src/memory/worklog.js.map +1 -1
- package/dist/src/messaging/runtime.js +4 -3
- package/dist/src/messaging/runtime.js.map +1 -1
- package/dist/src/messaging/send.js +1 -1
- package/dist/src/messaging/send.js.map +1 -1
- package/dist/src/orchestrator/attestation.js +33 -0
- package/dist/src/orchestrator/attestation.js.map +1 -1
- package/dist/src/orchestrator/collect.js +9 -4
- package/dist/src/orchestrator/collect.js.map +1 -1
- package/dist/src/orchestrator/distribute.js +0 -142
- package/dist/src/orchestrator/distribute.js.map +1 -1
- package/dist/src/orchestrator/gateway.js +3 -3
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +19 -1
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/state-machine.js +93 -16
- package/dist/src/orchestrator/state-machine.js.map +1 -1
- package/dist/src/orchestrator/worker-replay-notice.js +31 -11
- package/dist/src/orchestrator/worker-replay-notice.js.map +1 -1
- package/dist/src/prompt/builder.js +20 -20
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/context-hooks.js +2 -1
- package/dist/src/prompt/context-hooks.js.map +1 -1
- package/dist/src/prompt/templates/a1-system.md +69 -45
- package/dist/src/prompt/templates/employee.md +3 -2
- package/dist/src/prompt/templates/orchestration.md +13 -15
- package/dist/src/prompt/templates/skills.md +1 -0
- package/dist/src/routes/avatar.js +4 -3
- package/dist/src/routes/avatar.js.map +1 -1
- package/dist/src/routes/bgtask.js +2 -1
- package/dist/src/routes/bgtask.js.map +1 -1
- package/dist/src/routes/browser.js +2 -1
- package/dist/src/routes/browser.js.map +1 -1
- package/dist/src/routes/command.js +32 -2
- package/dist/src/routes/command.js.map +1 -1
- package/dist/src/routes/messaging.js +6 -5
- package/dist/src/routes/messaging.js.map +1 -1
- package/dist/src/routes/orchestrate.js +144 -29
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/quota.js +217 -33
- package/dist/src/routes/quota.js.map +1 -1
- package/dist/src/routes/settings.js +3 -2
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/static.js +37 -2
- package/dist/src/routes/static.js.map +1 -1
- package/dist/src/telegram/bot.js +123 -67
- package/dist/src/telegram/bot.js.map +1 -1
- package/dist/src/telegram/elicitation-buttons.js +71 -0
- package/dist/src/telegram/elicitation-buttons.js.map +1 -0
- package/dist/src/telegram/fetch-body.js +11 -0
- package/dist/src/telegram/fetch-body.js.map +1 -0
- package/dist/src/telegram/forwarder.js +3 -5
- package/dist/src/telegram/forwarder.js.map +1 -1
- package/dist/src/telegram/rich-message.js +85 -11
- package/dist/src/telegram/rich-message.js.map +1 -1
- package/dist/src/telegram/status-update-buffer.js +15 -0
- package/dist/src/telegram/status-update-buffer.js.map +1 -0
- package/dist/src/telegram/telegram-file.js +5 -4
- package/dist/src/telegram/telegram-file.js.map +1 -1
- package/dist/src/telegram/voice.js +5 -4
- package/dist/src/telegram/voice.js.map +1 -1
- package/dist/src/workflows/planaudit.js +2 -1
- package/dist/src/workflows/planaudit.js.map +1 -1
- package/dist/src/workflows/repo-map/index.js +157 -0
- package/dist/src/workflows/repo-map/index.js.map +1 -0
- package/dist/src/workflows/scope-sandbox.js +1 -0
- package/dist/src/workflows/scope-sandbox.js.map +1 -1
- package/package.json +5 -2
- package/public/css/chat.css +17 -1
- package/public/css/orc-state.css +2 -1
- package/public/css/variables.css +0 -1
- package/public/dist/assets/{AdvancedExport-qa01DKDO.js → AdvancedExport-DsDpqXoH.js} +1 -1
- package/public/dist/assets/{Agent-CHCXjXSN.js → Agent-CrLn42Jb.js} +1 -1
- package/public/dist/assets/{Browser-Df4B5cnl.js → Browser-B52Bdaeu.js} +1 -1
- package/public/dist/assets/BrowserPanel-Bh3JpkZO.js +3 -0
- package/public/dist/assets/BrowserPanel-DpntR8EJ.css +1 -0
- package/public/dist/assets/{ChannelsDiscord-BqPckWSY.js → ChannelsDiscord-Bt1_rtNC.js} +1 -1
- package/public/dist/assets/{ChannelsTelegram-B9Feggy7.js → ChannelsTelegram-BLV0m1oq.js} +1 -1
- package/public/dist/assets/{CodeCanvas-BzhNLZVF.js → CodeCanvas-COgs1P6U.js} +2 -2
- package/public/dist/assets/{DashboardEmbeddingSection-CocnWvOE.js → DashboardEmbeddingSection-DMgHZQnn.js} +1 -1
- package/public/dist/assets/{DashboardMeta-C9BshDiw.js → DashboardMeta-B7CVqXcU.js} +1 -1
- package/public/dist/assets/DesignPanel-3XpGjuEW.css +1 -0
- package/public/dist/assets/DesignPanel-BGMPhZSx.js +2 -0
- package/public/dist/assets/{DiffPanel-DsFwEFjd.js → DiffPanel-B_ljObDk.js} +1 -1
- package/public/dist/assets/{Display-D_r_BwdJ.js → Display-BF-rACK6.js} +1 -1
- package/public/dist/assets/{DocPanel-6Z_RELzd.js → DocPanel-DtYwv3n3.js} +1 -1
- package/public/dist/assets/{Employees-DL3R3z7K.js → Employees-D3hnciP0.js} +1 -1
- package/public/dist/assets/{FolderPanel-DdlzWAuK.js → FolderPanel-DbPhzzvi.js} +3 -3
- package/public/dist/assets/{Heartbeat-BblY8Z4a.js → Heartbeat-Dk-_TtKV.js} +1 -1
- package/public/dist/assets/{InlineWarn-DrqqH39Y.js → InlineWarn-DDzeHxQw.js} +1 -1
- package/public/dist/assets/{MarkdownRenderer-Cl0oEICj.js → MarkdownRenderer-CHacL2M_.js} +2 -2
- package/public/dist/assets/MarkdownRenderer-DyrB9FbZ.js +1 -0
- package/public/dist/assets/{Mcp-CP6h9IQP.js → Mcp-SfytKWGX.js} +1 -1
- package/public/dist/assets/{Memory-BWcfxzCz.js → Memory-BOicOlcn.js} +1 -1
- package/public/dist/assets/{MilkdownWysiwygEditor-B-j0IUe6.js → MilkdownWysiwygEditor-BNoLGbFC.js} +1 -1
- package/public/dist/assets/{ModelProvider-D4LBX7K2.js → ModelProvider-DQ2AA0gJ.js} +1 -1
- package/public/dist/assets/{Network-TkeE8ldB.js → Network-DISUhige.js} +1 -1
- package/public/dist/assets/{NotesGraphWorkspace-B55jfeiE.js → NotesGraphWorkspace-Dm1xUFl8.js} +1 -1
- package/public/dist/assets/PanelLayoutProvider-XpTo-i_s.js +1 -0
- package/public/dist/assets/{Permissions-Dc5xnPMu.js → Permissions-CnKt44dN.js} +1 -1
- package/public/dist/assets/Permissions-DNT0TxYL.js +1 -0
- package/public/dist/assets/{Profile-Bacunq6W.js → Profile-B8yBO3Ju.js} +1 -1
- package/public/dist/assets/{Prompts-D36Mj9HS.js → Prompts-5lNQ5qOm.js} +1 -1
- package/public/dist/assets/{SpeechKeys-Dda4Dt6M.js → SpeechKeys-BepaIHBa.js} +1 -1
- package/public/dist/assets/{TelegramHub-CuJoPPib.js → TelegramHub--DNjRAwW.js} +1 -1
- package/public/dist/assets/{TerminalPanel-DSCJeGjp.js → TerminalPanel-DQovYfwz.js} +1 -1
- package/public/dist/assets/{TransportStatusChips-C5QcQVCy.js → TransportStatusChips-Bld0yXi7.js} +1 -1
- package/public/dist/assets/app-BJVZZqTm.js +55 -0
- package/public/dist/assets/app-CvNmD8jx.css +1 -0
- package/public/dist/assets/architecture-7EHR7CIX-D-6Nx315.js +1 -0
- package/public/dist/assets/{architectureDiagram-3BPJPVTR-C4lVLx8A.js → architectureDiagram-3BPJPVTR-q8idz3H3.js} +1 -1
- package/public/dist/assets/{bgtask-badge-b7pj_Dbh.js → bgtask-badge-Bz8_kUKd.js} +1 -1
- package/public/dist/assets/bgtask-badge-iOk9R0RF.js +1 -0
- package/public/dist/assets/{blockDiagram-GPEHLZMM-BHjdqDcb.js → blockDiagram-GPEHLZMM-DGB0dsia.js} +1 -1
- package/public/dist/assets/{c4Diagram-AAUBKEIU-B1QuN7gf.js → c4Diagram-AAUBKEIU-ChP5YfVt.js} +1 -1
- package/public/dist/assets/channel-ByNDsZsH.js +1 -0
- package/public/dist/assets/{chunk-2J33WTMH-D1olIwij.js → chunk-2J33WTMH-D3OPoEHg.js} +1 -1
- package/public/dist/assets/{chunk-3OPIFGDE-Cf7991q8.js → chunk-3OPIFGDE-CULJ8ZHF.js} +1 -1
- package/public/dist/assets/{chunk-4BX2VUAB-zmO3Vjrm.js → chunk-4BX2VUAB-DGgktZYr.js} +1 -1
- package/public/dist/assets/{chunk-4EGX6M5U-B-uS9w6F.js → chunk-4EGX6M5U-BD3v8KR4.js} +1 -1
- package/public/dist/assets/chunk-55IACEB6-CQFLXxVc.js +1 -0
- package/public/dist/assets/{chunk-5DO6E6H7-AkI69lqb.js → chunk-5DO6E6H7-B-FbGqHn.js} +1 -1
- package/public/dist/assets/{chunk-5ZQYHXKU-C3d9OOmT.js → chunk-5ZQYHXKU-DVpWOoGS.js} +1 -1
- package/public/dist/assets/{chunk-727SXJPM-BOt5gU_h.js → chunk-727SXJPM-CZjR7q6H.js} +1 -1
- package/public/dist/assets/{chunk-AQP2D5EJ-CrRyjYkJ.js → chunk-AQP2D5EJ-BlGjnlsV.js} +1 -1
- package/public/dist/assets/{chunk-BR22UD5L-DR9GxWFk.js → chunk-BR22UD5L-MK8KuB9X.js} +1 -1
- package/public/dist/assets/{chunk-BSJP7CBP-B24w6Ihw.js → chunk-BSJP7CBP-ypXC4wBv.js} +1 -1
- package/public/dist/assets/{chunk-CSCIHK7Q-BPBO8B3q.js → chunk-CSCIHK7Q-CmvetykJ.js} +1 -1
- package/public/dist/assets/{chunk-FHYWG6QK-CXhRbK1g.js → chunk-FHYWG6QK-Do5csWDm.js} +1 -1
- package/public/dist/assets/{chunk-FMBD7UC4-tu50fn_l.js → chunk-FMBD7UC4-BXpT25MP.js} +1 -1
- package/public/dist/assets/{chunk-KSCS5N6A-CnJg0Z_l.js → chunk-KSCS5N6A-DtlfLqto.js} +1 -1
- package/public/dist/assets/{chunk-L5ZTLDWV-B3Ak80dW.js → chunk-L5ZTLDWV-Czv9NkHn.js} +1 -1
- package/public/dist/assets/{chunk-LZXEDZCA-C3fVGX8q.js → chunk-LZXEDZCA-vD7oFdiq.js} +1 -1
- package/public/dist/assets/{chunk-MPE355IW-iQbf4K4s.js → chunk-MPE355IW-2ei0PVn0.js} +1 -1
- package/public/dist/assets/{chunk-MZUSXYTE-BEKROhpC.js → chunk-MZUSXYTE-JO_qTk4K.js} +1 -1
- package/public/dist/assets/{chunk-N66VUXT2-DUtPpNne.js → chunk-N66VUXT2-BXL-FniY.js} +1 -1
- package/public/dist/assets/{chunk-ND2GUHAM-DW2SkbNq.js → chunk-ND2GUHAM-B9SIO-4a.js} +1 -1
- package/public/dist/assets/{chunk-NZK2D7GU-SJvHIVX3.js → chunk-NZK2D7GU-CqOo06-Z.js} +1 -1
- package/public/dist/assets/{chunk-O5CBEL6O-D_hkyy5c.js → chunk-O5CBEL6O-BWbe_grt.js} +1 -1
- package/public/dist/assets/{chunk-PUPMXCY4-DcRmz6F2.js → chunk-PUPMXCY4-aFTMGBaR.js} +1 -1
- package/public/dist/assets/chunk-QZHKN3VN-Becu19mF.js +1 -0
- package/public/dist/assets/{chunk-UIBZB4QT-CFemVDOF.js → chunk-UIBZB4QT-S8EH0jZR.js} +1 -1
- package/public/dist/assets/{chunk-WCWK7LTN-B6ske8a4.js → chunk-WCWK7LTN-EgrNk7Dj.js} +1 -1
- package/public/dist/assets/chunk-WU5MYG2G-CkoHFn0F.js +1 -0
- package/public/dist/assets/{chunk-XPW4576I-elhPZgkY.js → chunk-XPW4576I-8oydVjY6.js} +1 -1
- package/public/dist/assets/classDiagram-4FO5ZUOK-DVGoKviY.js +1 -0
- package/public/dist/assets/classDiagram-v2-Q7XG4LA2-BIZeptY-.js +1 -0
- package/public/dist/assets/{copy-text-BKruhU_y.js → copy-text-BDs2wKjA.js} +1 -1
- package/public/dist/assets/{cose-bilkent-S5V4N54A-B-gwVajW.js → cose-bilkent-S5V4N54A-PNmvcq_6.js} +1 -1
- package/public/dist/assets/{dagre-BM42HDAG-C9BDjgRM.js → dagre-BM42HDAG-BP_m3uo9.js} +1 -1
- package/public/dist/assets/{dagre-HAOs7bVl.js → dagre-Ct2n78X9.js} +1 -1
- package/public/dist/assets/{diagram-2AECGRRQ-CvEawheC.js → diagram-2AECGRRQ-DhgfR-ol.js} +1 -1
- package/public/dist/assets/{diagram-5GNKFQAL-Da4DwByP.js → diagram-5GNKFQAL-BRLvmdeK.js} +1 -1
- package/public/dist/assets/{diagram-KO2AKTUF-Cnhf5Czo.js → diagram-KO2AKTUF-Co3C18-Q.js} +1 -1
- package/public/dist/assets/{diagram-LMA3HP47-CMusMTT2.js → diagram-LMA3HP47-3SwoWQij.js} +1 -1
- package/public/dist/assets/{diagram-OG6HWLK6-D5nQR5rT.js → diagram-OG6HWLK6-bjEryAd3.js} +1 -1
- package/public/dist/assets/{dist-jZTs_0Zg.js → dist-B6T-R4xY.js} +1 -1
- package/public/dist/assets/{dist-woWoxWmX.js → dist-B8V2LYzt.js} +1 -1
- package/public/dist/assets/{dist-DL8oabBM.js → dist-BDPUxeoi.js} +1 -1
- package/public/dist/assets/{dist-Dpn3ujr3.js → dist-BMC_dTfR.js} +1 -1
- package/public/dist/assets/{dist-C4WouNM7.js → dist-BSf40pae.js} +1 -1
- package/public/dist/assets/{dist-CPOW-jfg.js → dist-BlMOeJym.js} +1 -1
- package/public/dist/assets/dist-BmXnOAlo.js +1 -0
- package/public/dist/assets/{dist-C_6E126b.js → dist-BqzMcuh8.js} +1 -1
- package/public/dist/assets/{dist-CHB0SFvU.js → dist-BvQlb9-o.js} +1 -1
- package/public/dist/assets/{dist-BvgkNZ7r.js → dist-C7pD0dEn.js} +1 -1
- package/public/dist/assets/{dist-DvlZh9GF.js → dist-CC2vK_6S.js} +1 -1
- package/public/dist/assets/{dist-wdt8RQwr.js → dist-CFU9RsAu.js} +1 -1
- package/public/dist/assets/{dist-Y5dy_sSf.js → dist-CS1XLdz3.js} +1 -1
- package/public/dist/assets/{dist-CiaEUSjf.js → dist-CjzfPsGt.js} +1 -1
- package/public/dist/assets/{dist-DlqIM5Y-.js → dist-CvzAXxlb.js} +1 -1
- package/public/dist/assets/{dist-CLMpv9qF.js → dist-D8SW_REQ.js} +1 -1
- package/public/dist/assets/dist-DLY5I6dK.js +1 -0
- package/public/dist/assets/{dist-DfOlJSUk.js → dist-DMZVNaIe.js} +1 -1
- package/public/dist/assets/{dist-BSwjNBYz.js → dist-DN-hkAIC.js} +1 -1
- package/public/dist/assets/dist-DPHcMCqI.js +1 -0
- package/public/dist/assets/{dist-DQR4gW5j.js → dist-DStWZVZ0.js} +1 -1
- package/public/dist/assets/{dist-BpbqDhsq.js → dist-DTcoHNXr.js} +1 -1
- package/public/dist/assets/{dist-DRKfpxOd.js → dist-DdJuxxG7.js} +1 -1
- package/public/dist/assets/{dist-KuP6Gt4m.js → dist-DhgwoIqj.js} +1 -1
- package/public/dist/assets/{dist-nbzW6Sn7.js → dist-DmjSXJAP.js} +1 -1
- package/public/dist/assets/{dist-8hLkyg-D.js → dist-cBBDKBli.js} +1 -1
- package/public/dist/assets/{dist-CKTQ2eXH.js → dist-ph7PUr0c.js} +1 -1
- package/public/dist/assets/{dist-DGJG2rr2.js → dist-qUky5WRy.js} +1 -1
- package/public/dist/assets/{dist-CYw9JGM_.js → dist-w2YzIhc5.js} +1 -1
- package/public/dist/assets/dist-xHOEvyuU.js +1 -0
- package/public/dist/assets/{dockerfile-Bq20q5i6.js → dockerfile-C0jniLkw.js} +1 -1
- package/public/dist/assets/{employees-DbgFV33i.js → employees-BYebrTfH.js} +1 -1
- package/public/dist/assets/{erDiagram-TEJ5UH35-BnsX5Dzt.js → erDiagram-TEJ5UH35-DQBxHU1q.js} +1 -1
- package/public/dist/assets/{error-normalize-DLzj47d_.js → error-normalize-BzeO0SXE.js} +1 -1
- package/public/dist/assets/eventmodeling-FCH6USID-BB1OVDLb.js +1 -0
- package/public/dist/assets/{factor-BfAVKjvH.js → factor-nzjoQ9cK.js} +1 -1
- package/public/dist/assets/{fields-MeoSVgIK.js → fields-zkeByFQW.js} +1 -1
- package/public/dist/assets/{flowDiagram-I6XJVG4X-BSy1p30u.js → flowDiagram-I6XJVG4X-BN90fCt5.js} +1 -1
- package/public/dist/assets/{ganttDiagram-6RSMTGT7-BILWylat.js → ganttDiagram-6RSMTGT7-B-JAlIhh.js} +1 -1
- package/public/dist/assets/gitGraph-WXDBUCRP-DAWTa5Fn.js +1 -0
- package/public/dist/assets/{gitGraphDiagram-PVQCEYII-BaRlZZ_k.js → gitGraphDiagram-PVQCEYII-CLL2G5U-.js} +1 -1
- package/public/dist/assets/{graphlib-DdtRn62K.js → graphlib-B6dRm8vZ.js} +1 -1
- package/public/dist/assets/idb-cache-ZH6lOebk.js +1 -0
- package/public/dist/assets/iframe-renderer-Clu9EYLW.js +1 -0
- package/public/dist/assets/iframe-renderer-DACMLTYf.js +142 -0
- package/public/dist/assets/info-J43DQDTF-C530y5-j.js +1 -0
- package/public/dist/assets/{infoDiagram-5YYISTIA-BElvxLr3.js → infoDiagram-5YYISTIA-CftYDPfc.js} +1 -1
- package/public/dist/assets/{ishikawaDiagram-YF4QCWOH-DPQZsd5R.js → ishikawaDiagram-YF4QCWOH-BVa5AJbz.js} +1 -1
- package/public/dist/assets/javascript-DbM-pSY-.js +1 -0
- package/public/dist/assets/{journeyDiagram-JHISSGLW-BJZNR2qA.js → journeyDiagram-JHISSGLW-BeUKm6ME.js} +1 -1
- package/public/dist/assets/{kanban-definition-UN3LZRKU-OQLDtH0g.js → kanban-definition-UN3LZRKU-K5DYNY4p.js} +1 -1
- package/public/dist/assets/{manager-rHNwUB4e.css → manager-C4eNDNFt.css} +1 -1
- package/public/dist/assets/manager-pcvo6od1.js +13 -0
- package/public/dist/assets/{memory-QobGT0Kv.js → memory-DLD5Xpk8.js} +1 -1
- package/public/dist/assets/memory-oWWwCkg5.js +1 -0
- package/public/dist/assets/mermaid-loader-Bd9rYyxD.js +1 -0
- package/public/dist/assets/{mermaid-parser.core-D1KUUauv.js → mermaid-parser.core-Cz70RgAa.js} +1 -1
- package/public/dist/assets/mermaid-preprocess-0hqEN7sn.js +5 -0
- package/public/dist/assets/{mermaid.core-R6dUFqZC.js → mermaid.core-Dj5GOPe1.js} +2 -2
- package/public/dist/assets/mermaid.core-TSG49mwm.js +1 -0
- package/public/dist/assets/message-history-C6D4juRe.js +1 -0
- package/public/dist/assets/message-history-DdIshS4Q.js +1 -0
- package/public/dist/assets/{mindmap-definition-RKZ34NQL-B8WJHpYI.js → mindmap-definition-RKZ34NQL-PsH0E_3e.js} +1 -1
- package/public/dist/assets/{nsis-CIoRNUaw.js → nsis-BI3I3OhH.js} +1 -1
- package/public/dist/assets/packet-YPE3B663-BHcxn4sy.js +1 -0
- package/public/dist/assets/{page-shell-BeAyKBJW.js → page-shell-LF7vVVfG.js} +1 -1
- package/public/dist/assets/pi-settings-CBUGDAuT.js +1 -0
- package/public/dist/assets/pie-LRSECV5Y-DjigSia_.js +1 -0
- package/public/dist/assets/{pieDiagram-4H26LBE5-BuBruIcx.js → pieDiagram-4H26LBE5-Dtwtlr0z.js} +1 -1
- package/public/dist/assets/{pug-Cb8OCun5.js → pug-DHfNwv1w.js} +1 -1
- package/public/dist/assets/{quadrantDiagram-W4KKPZXB-B6rzGZvr.js → quadrantDiagram-W4KKPZXB-CAFUbaV6.js} +1 -1
- package/public/dist/assets/radar-GUYGQ44K-DPCrmsHJ.js +1 -0
- package/public/dist/assets/{react-dom-CZtrmbYs.js → react-dom-AWKMTIe7.js} +1 -1
- package/public/dist/assets/render-E2PXsTyS.js +122 -0
- package/public/dist/assets/{requirementDiagram-4Y6WPE33-Cvj5JknB.js → requirementDiagram-4Y6WPE33-CvBM4AjK.js} +1 -1
- package/public/dist/assets/{sankeyDiagram-5OEKKPKP-DNGNYR7j.js → sankeyDiagram-5OEKKPKP-cordQgRs.js} +1 -1
- package/public/dist/assets/{sequenceDiagram-3UESZ5HK-DuUAH96Z.js → sequenceDiagram-3UESZ5HK-DDAqRdga.js} +1 -1
- package/public/dist/assets/{settings-D70uFh8l.js → settings-DYIfnpYq.js} +1 -1
- package/public/dist/assets/settings-core-BURhLoX3.js +1 -0
- package/public/dist/assets/{settings-core-B2lw2bgO.js → settings-core-DRYE_5Wb.js} +1 -1
- package/public/dist/assets/settings-yyDc7X3c.js +1 -0
- package/public/dist/assets/{sidebar-BqWm2XWP.js → sidebar-Cn-KLQ0U.js} +3 -3
- package/public/dist/assets/{skills-CdNOfXlk.js → skills-Brt3opa5.js} +1 -1
- package/public/dist/assets/skills-KHfKUuAJ.js +1 -0
- package/public/dist/assets/{slash-commands-4Ntm5N7h.js → slash-commands-jMNf0b43.js} +1 -1
- package/public/dist/assets/slash-commands-nb096e6A.js +1 -0
- package/public/dist/assets/{stateDiagram-AJRCARHV-DGZNs20Q.js → stateDiagram-AJRCARHV-DUaoSRgZ.js} +1 -1
- package/public/dist/assets/stateDiagram-v2-BHNVJYJU-BAesfdhr.js +1 -0
- package/public/dist/assets/{timeline-definition-PNZ67QCA-yDl1yISI.js → timeline-definition-PNZ67QCA-D85QNy9b.js} +1 -1
- package/public/dist/assets/{trace-drawer-DqAwwHHQ.js → trace-drawer-Dv5cDGLR.js} +1 -1
- package/public/dist/assets/treeView-BLDUP644-DmufUMul.js +1 -0
- package/public/dist/assets/treemap-LRROVOQU-Cg48uw_D.js +1 -0
- package/public/dist/assets/ui-BeyzLs7f.js +2 -0
- package/public/dist/assets/ui-DabvyDGc.js +1 -0
- package/public/dist/assets/{vennDiagram-CIIHVFJN-C0TNoBYO.js → vennDiagram-CIIHVFJN-CQSILdx8.js} +1 -1
- package/public/dist/assets/wardley-L42UT6IY-QZOEXU7f.js +1 -0
- package/public/dist/assets/{wardleyDiagram-YWT4CUSO-C6cJR4Ib.js → wardleyDiagram-YWT4CUSO-BZEVMlJ4.js} +1 -1
- package/public/dist/assets/{wiki-link-suggestions-BMHWTE4_.js → wiki-link-suggestions-DZQc78gj.js} +1 -1
- package/public/dist/assets/{xychartDiagram-2RQKCTM6-DqEqpcox.js → xychartDiagram-2RQKCTM6-C8573Tgs.js} +1 -1
- package/public/dist/index.html +2 -2
- package/public/dist/manager/index.html +2 -2
- package/public/js/diagram/iframe-renderer.ts +197 -49
- package/public/js/diagram/widget-validator.ts +17 -3
- package/public/js/features/chat-messages.ts +5 -1
- package/public/js/features/chat-scroll.ts +10 -5
- package/public/js/features/chat.ts +9 -1
- package/public/js/features/elicitation.ts +1 -5
- package/public/js/features/message-item-html.ts +3 -1
- package/public/js/features/process-block.ts +46 -3
- package/public/js/features/settings-mcp.ts +1 -1
- package/public/js/locale.ts +2 -2
- package/public/js/main.ts +15 -4
- package/public/js/preview-parent-origin.ts +73 -9
- package/public/js/render/chart-json.ts +2 -5
- package/public/js/render/compose-block.ts +2 -5
- package/public/js/render/dataframe.ts +2 -5
- package/public/js/render/diff-viewer.ts +2 -5
- package/public/js/render/link-preview.ts +1 -5
- package/public/js/render/markdown.ts +22 -0
- package/public/js/render/post-render.ts +7 -3
- package/public/js/render/sanitize.ts +6 -0
- package/public/js/render/search-results.ts +2 -5
- package/public/js/streaming-render.ts +12 -1
- package/public/js/ui.ts +6 -3
- package/public/js/ws.ts +39 -25
- package/public/locales/en.json +2 -1
- package/public/locales/ja.json +2 -1
- package/public/locales/ko.json +2 -1
- package/public/locales/zh.json +2 -1
- package/public/manager/src/InstancePreview.tsx +35 -0
- package/public/manager/src/SidebarRailRouter.tsx +209 -124
- package/public/manager/src/browser-panel/BrowserPanel.tsx +714 -17
- package/public/manager/src/browser-panel/browser-panel.css +305 -0
- package/public/manager/src/browser-panel/use-embedded-target-sync.ts +182 -0
- package/public/manager/src/components/DesktopPanelControls.tsx +1 -1
- package/public/manager/src/design-panel/DesignPageSelector.tsx +27 -0
- package/public/manager/src/design-panel/DesignPanel.tsx +265 -0
- package/public/manager/src/design-panel/DesignViewport.tsx +34 -0
- package/public/manager/src/design-panel/design-api.ts +106 -0
- package/public/manager/src/design-panel/design-panel.css +137 -0
- package/public/manager/src/design-panel/design-types.ts +43 -0
- package/public/manager/src/folder-panel/FolderPanel.tsx +15 -1
- package/public/manager/src/jaw-ceo/JawCeoWorkbenchButton.tsx +10 -5
- package/public/manager/src/jaw-ceo/jaw-ceo.css +8 -0
- package/public/manager/src/jaw-ceo/useJawCeoDashboardBridge.tsx +2 -1
- package/public/manager/src/panels/FileFolderSplitPanel.tsx +97 -0
- package/public/manager/src/panels/PanelErrorBoundary.tsx +44 -0
- package/public/manager/src/panels/PanelLayoutProvider.tsx +569 -86
- package/public/manager/src/panels/RightSidebar.tsx +389 -134
- package/public/manager/src/panels/desktop-bridge.ts +88 -0
- package/public/manager/src/panels/panel-layout-registry-state.ts +252 -10
- package/public/manager/src/panels/panels.css +479 -0
- package/public/manager/src/panels/right-sidebar-tab-display.ts +36 -0
- package/public/manager/src/panels/types.ts +79 -4
- package/public/manager/src/types.ts +11 -0
- package/scripts/bundle-sidecar.sh +3 -0
- package/scripts/check-strict-baseline.mjs +26 -2
- package/scripts/docs/check-docs.mts +87 -0
- package/scripts/docs/extract-commands.mts +215 -0
- package/scripts/docs/extract-routes.mts +350 -0
- package/scripts/release-gates.mjs +32 -0
- package/public/dist/assets/BrowserPanel-CV_bbQpM.css +0 -1
- package/public/dist/assets/BrowserPanel-Ua0Xck6V.js +0 -1
- package/public/dist/assets/MarkdownRenderer-BivJ4hJm.js +0 -1
- package/public/dist/assets/Permissions-CddCEaJl.js +0 -1
- package/public/dist/assets/app-BPsa7jSJ.css +0 -1
- package/public/dist/assets/app-DszWzakT.js +0 -55
- package/public/dist/assets/architecture-7EHR7CIX-GJhmD5MC.js +0 -1
- package/public/dist/assets/bgtask-badge-DZEQ5fMl.js +0 -1
- package/public/dist/assets/channel-Sut8CY6m.js +0 -1
- package/public/dist/assets/chunk-55IACEB6-C3KMx7HH.js +0 -1
- package/public/dist/assets/chunk-QZHKN3VN-C7Qk10ab.js +0 -1
- package/public/dist/assets/chunk-WU5MYG2G-BpCiJpUL.js +0 -1
- package/public/dist/assets/classDiagram-4FO5ZUOK-BVeAlcVw.js +0 -1
- package/public/dist/assets/classDiagram-v2-Q7XG4LA2-mvRsJL7t.js +0 -1
- package/public/dist/assets/dist-BQ6IjZAx.js +0 -1
- package/public/dist/assets/dist-CB1yXHdY.js +0 -1
- package/public/dist/assets/dist-El7lM3OZ.js +0 -1
- package/public/dist/assets/dist-ZXqltO6b.js +0 -1
- package/public/dist/assets/eventmodeling-FCH6USID-BASBZB6y.js +0 -1
- package/public/dist/assets/gitGraph-WXDBUCRP-C6UAXKTO.js +0 -1
- package/public/dist/assets/idb-cache-DQM-odDV.js +0 -1
- package/public/dist/assets/info-J43DQDTF-DZvaZ8fx.js +0 -1
- package/public/dist/assets/javascript-ocJZALE4.js +0 -1
- package/public/dist/assets/manager-CdNOlCyS.js +0 -13
- package/public/dist/assets/memory-BT-rs3ag.js +0 -1
- package/public/dist/assets/mermaid-loader-BMIvbrMb.js +0 -1
- package/public/dist/assets/mermaid-preprocess-CqOBWYEb.js +0 -5
- package/public/dist/assets/mermaid.core-CE6des8A.js +0 -1
- package/public/dist/assets/message-history-BY1UNJAO.js +0 -1
- package/public/dist/assets/message-history-BmP5JKio.js +0 -142
- package/public/dist/assets/packet-YPE3B663-Br_gfHDJ.js +0 -1
- package/public/dist/assets/pi-settings-BVYmGHWD.js +0 -1
- package/public/dist/assets/pie-LRSECV5Y-CPSw09Lc.js +0 -1
- package/public/dist/assets/radar-GUYGQ44K-D5jGe4n0.js +0 -1
- package/public/dist/assets/render-C3r-9_-J.js +0 -119
- package/public/dist/assets/settings-CJm8ZSJs.js +0 -1
- package/public/dist/assets/settings-core-gdS0lo1b.js +0 -1
- package/public/dist/assets/skills-DG_CbTEf.js +0 -1
- package/public/dist/assets/slash-commands-B9kOEhJ_.js +0 -1
- package/public/dist/assets/stateDiagram-v2-BHNVJYJU-D2I0t9Bo.js +0 -1
- package/public/dist/assets/treeView-BLDUP644-i3ZwrLGf.js +0 -1
- package/public/dist/assets/treemap-LRROVOQU-CJRBfbOx.js +0 -1
- package/public/dist/assets/ui-Anw2S64o.js +0 -1
- package/public/dist/assets/ui-DsK6r0Xv.js +0 -2
- package/public/dist/assets/wardley-L42UT6IY-B1NLyOET.js +0 -1
- /package/public/dist/assets/{agent-meta-FyI15KAa.js → agent-meta-tiPlp7OI.js} +0 -0
- /package/public/dist/assets/{api-DvCd2Uff.js → api-C9dOxby7.js} +0 -0
- /package/public/dist/assets/{apl-CUNx2Nxr.js → apl-2tE96F_Y.js} +0 -0
- /package/public/dist/assets/{asciiarmor-B9JjJqLb.js → asciiarmor-ynSKiC17.js} +0 -0
- /package/public/dist/assets/{asn1-NstwUq_r.js → asn1-CfqO1VY8.js} +0 -0
- /package/public/dist/assets/{asterisk-Box6GWx7.js → asterisk-DSiRJoqT.js} +0 -0
- /package/public/dist/assets/{brainfuck-DAD60u2v.js → brainfuck-DTcanv-8.js} +0 -0
- /package/public/dist/assets/{chunk-AGHRB4JF-BeNb9aN4.js → chunk-AGHRB4JF-BXLzSehp.js} +0 -0
- /package/public/dist/assets/{chunk-NNHCCRGN-hPUSf84G.js → chunk-NNHCCRGN-D69GtSOc.js} +0 -0
- /package/public/dist/assets/{clike-B-3e4_rA.js → clike-qn72CMAj.js} +0 -0
- /package/public/dist/assets/{clojure-DpNVclFl.js → clojure-m8yDiYVc.js} +0 -0
- /package/public/dist/assets/{cmake-DzNe63Ys.js → cmake-4AHAWHiF.js} +0 -0
- /package/public/dist/assets/{cobol-CoytNvhw.js → cobol-CxxJP5eX.js} +0 -0
- /package/public/dist/assets/{coffeescript-Cq3xHp7h.js → coffeescript-BAB3zi48.js} +0 -0
- /package/public/dist/assets/{commonlisp-CVjsh9SW.js → commonlisp-BPbWuAds.js} +0 -0
- /package/public/dist/assets/{constants-EMUBd5RQ.js → constants-DzwdndBj.js} +0 -0
- /package/public/dist/assets/{crystal-BlIILE-v.js → crystal-CGuSsWYR.js} +0 -0
- /package/public/dist/assets/{css-D1TAh_-V.js → css-DszbR74r.js} +0 -0
- /package/public/dist/assets/{cypher-ZntLuJzU.js → cypher-GUnmv522.js} +0 -0
- /package/public/dist/assets/{cytoscape.esm-89N3cqwG.js → cytoscape.esm-D_XyYSBG.js} +0 -0
- /package/public/dist/assets/{d-CzwXOQ5h.js → d-Cfm0cznj.js} +0 -0
- /package/public/dist/assets/{desktop-bridge-B1whMBS2.js → desktop-bridge-CvdhnJQo.js} +0 -0
- /package/public/dist/assets/{diff-DI7-Ikca.js → diff-C6rPA7NX.js} +0 -0
- /package/public/dist/assets/{dist-B51C28kc.js → dist-AgQwqBLq.js} +0 -0
- /package/public/dist/assets/{dtd-7UKQtPWR.js → dtd-Dxh5tS6M.js} +0 -0
- /package/public/dist/assets/{dylan-CM1mkXYp.js → dylan-BdIVFR1j.js} +0 -0
- /package/public/dist/assets/{ebnf-Llv_5uW5.js → ebnf-iU-8xYFu.js} +0 -0
- /package/public/dist/assets/{ecl-uqtp9saI.js → ecl-DjbzOHI6.js} +0 -0
- /package/public/dist/assets/{eiffel-BqzGlVPY.js → eiffel-B2ID8LZ3.js} +0 -0
- /package/public/dist/assets/{elm-bajSbBYX.js → elm-B6vPcfMj.js} +0 -0
- /package/public/dist/assets/{erlang-B5uEM5Ke.js → erlang-nDQwRdZV.js} +0 -0
- /package/public/dist/assets/{esm-3SgqVBY5.js → esm-CT1xxdH5.js} +0 -0
- /package/public/dist/assets/{fcl-BcH_K33Z.js → fcl-Bf86o55I.js} +0 -0
- /package/public/dist/assets/{folder-drag-payload-DE3ZS9PZ.js → folder-drag-payload-Bhln9Mk2.js} +0 -0
- /package/public/dist/assets/{forth-DpLesGXt.js → forth-CeQJji0n.js} +0 -0
- /package/public/dist/assets/{fortran--G-GJVGI.js → fortran-Dm_CqDsH.js} +0 -0
- /package/public/dist/assets/{gas-DpoQvniR.js → gas-e3EfgE3p.js} +0 -0
- /package/public/dist/assets/{gherkin-Dr59UACG.js → gherkin-Dn_7tSzg.js} +0 -0
- /package/public/dist/assets/{groovy-Cn2K6Dx3.js → groovy-LaKuGRkK.js} +0 -0
- /package/public/dist/assets/{haskell-B7lFmXEG.js → haskell-D9nNX9Mr.js} +0 -0
- /package/public/dist/assets/{haxe-BHWvyysr.js → haxe-Rp176QXJ.js} +0 -0
- /package/public/dist/assets/{http-DBZ5ODWR.js → http-BOeYLbuM.js} +0 -0
- /package/public/dist/assets/{idb-cache-DTKWSF12.js → idb-cache-BzzftUET.js} +0 -0
- /package/public/dist/assets/{idl-D6JLbJZt.js → idl-DHv3vdme.js} +0 -0
- /package/public/dist/assets/{javascript-CMsRa3Ah.js → javascript-Dk2fbl1a.js} +0 -0
- /package/public/dist/assets/{jsx-runtime-B3ZGMGGg.js → jsx-runtime-gFMgZ0TQ.js} +0 -0
- /package/public/dist/assets/{julia-BgEiFqoe.js → julia-D7CKCk5I.js} +0 -0
- /package/public/dist/assets/{livescript-Bl00ljSh.js → livescript-gRbr9rhj.js} +0 -0
- /package/public/dist/assets/{locale-GY3-GGWm.js → locale-DC-ZsWOf.js} +0 -0
- /package/public/dist/assets/{lua-C7XaZlrp.js → lua-CgZ_7bxf.js} +0 -0
- /package/public/dist/assets/{mathematica-8EcxUjYb.js → mathematica-B6bTyoab.js} +0 -0
- /package/public/dist/assets/{mbox-rZy25Spd.js → mbox-C8oQj1cJ.js} +0 -0
- /package/public/dist/assets/{mirc-BUmwqSCT.js → mirc-v6L6kZuh.js} +0 -0
- /package/public/dist/assets/{mllike-BqDqEdQF.js → mllike-CWu4RdWO.js} +0 -0
- /package/public/dist/assets/{modelica-MhacK6Xw.js → modelica-B3NBpX1d.js} +0 -0
- /package/public/dist/assets/{mscgen-B_VJszPL.js → mscgen-C8u7qRYw.js} +0 -0
- /package/public/dist/assets/{mumps-CEdRH9V2.js → mumps-DHjVG4PS.js} +0 -0
- /package/public/dist/assets/{nginx-CnXgGeyP.js → nginx-BMt87X3t.js} +0 -0
- /package/public/dist/assets/{notes-graph-settings-BaqO8hYl.js → notes-graph-settings-BgNrT_58.js} +0 -0
- /package/public/dist/assets/{ntriples-CyZcmI8c.js → ntriples-C8U-Jud2.js} +0 -0
- /package/public/dist/assets/{octave-DGH2kDhB.js → octave-Bq37AoFm.js} +0 -0
- /package/public/dist/assets/{oz-DUSpf7eX.js → oz-D6HxSRn3.js} +0 -0
- /package/public/dist/assets/{pascal-BYIqfrcG.js → pascal-BBqiAVg6.js} +0 -0
- /package/public/dist/assets/{path-utils-DX1HplvB.js → path-utils-LsJeDCKF.js} +0 -0
- /package/public/dist/assets/{perl-C7iNkbFR.js → perl-sHANlXjx.js} +0 -0
- /package/public/dist/assets/{pi-settings-D6opgoo4.js → pi-settings-Dh5lgb87.js} +0 -0
- /package/public/dist/assets/{pig-CR5p2dpV.js → pig-Cufgew--.js} +0 -0
- /package/public/dist/assets/{powershell-UK-_nKBG.js → powershell--Q4mDip6.js} +0 -0
- /package/public/dist/assets/{properties-CJAqwakm.js → properties-DoVpJ-kT.js} +0 -0
- /package/public/dist/assets/{protobuf-D3Vrac9j.js → protobuf-B5OiV2Zv.js} +0 -0
- /package/public/dist/assets/{provider-icons-BXm8sy5x.js → provider-icons-stsNmQKx.js} +0 -0
- /package/public/dist/assets/{puppet-DxgW6kGv.js → puppet-Ce_CFfqW.js} +0 -0
- /package/public/dist/assets/{python-C_ebQp0Y.js → python-pK7Wt6QH.js} +0 -0
- /package/public/dist/assets/{q-IMCDaQ03.js → q-Dd3Ltku0.js} +0 -0
- /package/public/dist/assets/{r-BXdh3mvZ.js → r-CsX__2f0.js} +0 -0
- /package/public/dist/assets/{rough.esm-BJMyUbab.js → rough.esm--LLpAgPj.js} +0 -0
- /package/public/dist/assets/{rpm-DA-4RGFa.js → rpm-D78AjDAl.js} +0 -0
- /package/public/dist/assets/{ruby-Bl1KGNRx.js → ruby-D_-KI498.js} +0 -0
- /package/public/dist/assets/{sas-vK1DtUVf.js → sas-D-GUPiy4.js} +0 -0
- /package/public/dist/assets/{scheme-DiOFQmiy.js → scheme-DF9WwQDv.js} +0 -0
- /package/public/dist/assets/{settings-client-Di8KLXq_.js → settings-client-CjbBShxm.js} +0 -0
- /package/public/dist/assets/{shell-DlO-WCDP.js → shell-BTUwbV-w.js} +0 -0
- /package/public/dist/assets/{sieve-CbtkgRpt.js → sieve--Z-EbGZo.js} +0 -0
- /package/public/dist/assets/{simple-mode-BlwHYanN.js → simple-mode-BUow4bpn.js} +0 -0
- /package/public/dist/assets/{smalltalk-BvKYa3AC.js → smalltalk-C2YIwVx3.js} +0 -0
- /package/public/dist/assets/{solr-BR4fru6p.js → solr-CYVq4fbf.js} +0 -0
- /package/public/dist/assets/{sparql-DXGln-02.js → sparql-Ccd4fsFv.js} +0 -0
- /package/public/dist/assets/{spreadsheet-vehQVAxe.js → spreadsheet-DW0WgMrS.js} +0 -0
- /package/public/dist/assets/{sql-DqGFyXDS.js → sql-C71Zp6qn.js} +0 -0
- /package/public/dist/assets/{stex-BMDhbycI.js → stex-CKuX0g_6.js} +0 -0
- /package/public/dist/assets/{stylus-KnS0CroG.js → stylus-CBH8s0NO.js} +0 -0
- /package/public/dist/assets/{swift-DgdcCI7r.js → swift-CfZoxKRA.js} +0 -0
- /package/public/dist/assets/{tcl-BdAMpvp9.js → tcl-D5MGbeQu.js} +0 -0
- /package/public/dist/assets/{textile-BHP2MzNo.js → textile-DJ3U30FW.js} +0 -0
- /package/public/dist/assets/{tiddlywiki-DXpY2p61.js → tiddlywiki-_fe1dHUq.js} +0 -0
- /package/public/dist/assets/{tiki-rmXXYsbl.js → tiki-Dd1udTrQ.js} +0 -0
- /package/public/dist/assets/{toml-C5KR4pi6.js → toml-xpw8pqjz.js} +0 -0
- /package/public/dist/assets/{troff-CCKOxFhE.js → troff-CgWiec8m.js} +0 -0
- /package/public/dist/assets/{ttcn-DbUUkNp1.js → ttcn-CSwmFrer.js} +0 -0
- /package/public/dist/assets/{ttcn-cfg-DXcL9aHC.js → ttcn-cfg-B5HVIC6z.js} +0 -0
- /package/public/dist/assets/{turtle-C8XIIixq.js → turtle-Cl_SuWQk.js} +0 -0
- /package/public/dist/assets/{vb-6dJ8H6C5.js → vb-BT131bSf.js} +0 -0
- /package/public/dist/assets/{vbscript-DIhYyfyM.js → vbscript-D6S8_XkU.js} +0 -0
- /package/public/dist/assets/{velocity-D4VFCVF7.js → velocity-9HkI645n.js} +0 -0
- /package/public/dist/assets/{vendor-utils-BgdgpA_R.js → vendor-utils-DJY0EWnQ.js} +0 -0
- /package/public/dist/assets/{verilog-CMPJNboz.js → verilog-BzMguKeI.js} +0 -0
- /package/public/dist/assets/{vhdl-CnU0dAe0.js → vhdl-bHScWzT1.js} +0 -0
- /package/public/dist/assets/{w3c-keyname-_Vjqp3zl.js → w3c-keyname-a_sRwNLm.js} +0 -0
- /package/public/dist/assets/{webidl-DrscPGMb.js → webidl-CbgaVHNS.js} +0 -0
- /package/public/dist/assets/{wiki-link-resolver-C197VhRP.js → wiki-link-resolver-BfNXN9px.js} +0 -0
- /package/public/dist/assets/{xquery-B8_nl088.js → xquery-DWZPmAiC.js} +0 -0
- /package/public/dist/assets/{yacas-BCnk2qQq.js → yacas-CEdW4z4K.js} +0 -0
- /package/public/dist/assets/{z80-CG_mQV7a.js → z80-CMH3qxNg.js} +0 -0
package/public/js/main.ts
CHANGED
|
@@ -538,14 +538,17 @@ async function bootstrap(): Promise<void> {
|
|
|
538
538
|
await initI18n();
|
|
539
539
|
const langSel = document.getElementById('langSelect') as HTMLSelectElement | null;
|
|
540
540
|
if (langSel) langSel.value = getLang();
|
|
541
|
-
await loadCliRegistry();
|
|
542
|
-
bindPerCliControlEvents();
|
|
543
541
|
initHelpDialog();
|
|
544
542
|
initChatSearch();
|
|
545
543
|
initMediaLightbox();
|
|
546
544
|
document.getElementById('chatSearchTrigger')?.addEventListener('click', toggleChatSearch);
|
|
547
545
|
initAttentionBadge();
|
|
546
|
+
// Connect early (devlog 260705_frontend_perf H5): channel-up drives
|
|
547
|
+
// loadMessages(), which only needs i18n + the badge/help listeners above —
|
|
548
|
+
// the CLI-registry fetch below used to serially delay first history paint.
|
|
548
549
|
connect();
|
|
550
|
+
await loadCliRegistry();
|
|
551
|
+
bindPerCliControlEvents();
|
|
549
552
|
initDragDrop();
|
|
550
553
|
initAutoResize();
|
|
551
554
|
await loadCommands();
|
|
@@ -566,8 +569,16 @@ async function bootstrap(): Promise<void> {
|
|
|
566
569
|
initGestures();
|
|
567
570
|
try { sessionStorage.removeItem(STALE_BUNDLE_RELOAD_KEY); } catch {}
|
|
568
571
|
|
|
569
|
-
// Phase 127-F2: prewarm Mermaid at idle so first diagram renders fast
|
|
570
|
-
|
|
572
|
+
// Phase 127-F2: prewarm Mermaid at idle so first diagram renders fast.
|
|
573
|
+
// 260705_frontend_perf M6: check AFTER history has had a chance to load
|
|
574
|
+
// (channel-up → loadMessages is async) and only prewarm when the DOM
|
|
575
|
+
// actually contains a diagram candidate — otherwise skip the chunk fetch.
|
|
576
|
+
// renderMermaidBlocks still lazy-loads on demand if a diagram streams in.
|
|
577
|
+
setTimeout(() => {
|
|
578
|
+
if (document.querySelector('.mermaid-pending, [data-mermaid-code-raw], .diagram-widget-pending')) {
|
|
579
|
+
prewarmMermaid();
|
|
580
|
+
}
|
|
581
|
+
}, 3000);
|
|
571
582
|
|
|
572
583
|
// Register Service Worker (production only — Vite HMR handles dev; skip embedded dashboard preview iframes)
|
|
573
584
|
if ('serviceWorker' in navigator && !import.meta.env.DEV && !isEmbeddedPreviewFrame()) {
|
|
@@ -105,10 +105,66 @@ function isTextInputElement(element: Element): element is HTMLInputElement {
|
|
|
105
105
|
return ['text', 'search', 'url', 'tel', 'email', 'password'].includes(element.type);
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
+
function editableTargetFromElement(element: Element | null): HTMLInputElement | HTMLTextAreaElement | HTMLElement | null {
|
|
109
|
+
if (!element) return null;
|
|
110
|
+
if (element instanceof HTMLTextAreaElement) return element;
|
|
111
|
+
if (isTextInputElement(element)) return element;
|
|
112
|
+
const editable = element.closest('[contenteditable="true"]');
|
|
113
|
+
return editable instanceof HTMLElement ? editable : null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function editableTargetAcceptsInput(target: HTMLInputElement | HTMLTextAreaElement | HTMLElement): boolean {
|
|
117
|
+
if (target instanceof HTMLTextAreaElement || target instanceof HTMLInputElement) {
|
|
118
|
+
return !target.disabled && !target.readOnly;
|
|
119
|
+
}
|
|
120
|
+
return target.isContentEditable;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function isVisibleEditableTarget(target: HTMLInputElement | HTMLTextAreaElement | HTMLElement): boolean {
|
|
124
|
+
if (!editableTargetAcceptsInput(target)) return false;
|
|
125
|
+
if (target === document.activeElement) return true;
|
|
126
|
+
const style = window.getComputedStyle(target);
|
|
127
|
+
if (style.display === 'none' || style.visibility === 'hidden' || style.visibility === 'collapse') return false;
|
|
128
|
+
const rect = target.getBoundingClientRect();
|
|
129
|
+
return rect.width > 0 && rect.height > 0;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function findPreviewInsertTarget(): HTMLInputElement | HTMLTextAreaElement | HTMLElement | null {
|
|
133
|
+
const activeTarget = editableTargetFromElement(document.activeElement);
|
|
134
|
+
if (activeTarget && isVisibleEditableTarget(activeTarget)) return activeTarget;
|
|
135
|
+
|
|
136
|
+
const selectors = [
|
|
137
|
+
'#chatInput',
|
|
138
|
+
'textarea.chat-input',
|
|
139
|
+
'textarea[data-chat-input="true"]',
|
|
140
|
+
'textarea[aria-label*="chat" i]',
|
|
141
|
+
'textarea[placeholder*="message" i]',
|
|
142
|
+
'textarea[placeholder*="메시지" i]',
|
|
143
|
+
'textarea[placeholder*="입력" i]',
|
|
144
|
+
'textarea',
|
|
145
|
+
'input[type="text"]',
|
|
146
|
+
'input[type="search"]',
|
|
147
|
+
'input:not([type])',
|
|
148
|
+
'[contenteditable="true"]',
|
|
149
|
+
];
|
|
150
|
+
const seen = new Set<Element>();
|
|
151
|
+
for (const selector of selectors) {
|
|
152
|
+
for (const element of document.querySelectorAll(selector)) {
|
|
153
|
+
if (seen.has(element)) continue;
|
|
154
|
+
seen.add(element);
|
|
155
|
+
const target = editableTargetFromElement(element);
|
|
156
|
+
if (target && isVisibleEditableTarget(target)) return target;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
|
|
108
162
|
function insertIntoEditable(target: Element, text: string): boolean {
|
|
109
163
|
if (target instanceof HTMLTextAreaElement || isTextInputElement(target)) {
|
|
110
|
-
|
|
111
|
-
const
|
|
164
|
+
if (!editableTargetAcceptsInput(target)) return false;
|
|
165
|
+
const hasFocus = document.activeElement === target;
|
|
166
|
+
const start = hasFocus ? (target.selectionStart ?? target.value.length) : target.value.length;
|
|
167
|
+
const end = hasFocus ? (target.selectionEnd ?? start) : start;
|
|
112
168
|
target.setRangeText(text, start, end, 'end');
|
|
113
169
|
target.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: text }));
|
|
114
170
|
target.focus();
|
|
@@ -116,17 +172,25 @@ function insertIntoEditable(target: Element, text: string): boolean {
|
|
|
116
172
|
}
|
|
117
173
|
const editable = target.closest('[contenteditable="true"]');
|
|
118
174
|
if (!(editable instanceof HTMLElement)) return false;
|
|
175
|
+
if (!editableTargetAcceptsInput(editable)) return false;
|
|
119
176
|
const selection = window.getSelection();
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
177
|
+
let range: Range | null = null;
|
|
178
|
+
if (selection && selection.rangeCount > 0) {
|
|
179
|
+
const selectedRange = selection.getRangeAt(0);
|
|
180
|
+
if (editable.contains(selectedRange.commonAncestorContainer)) range = selectedRange;
|
|
181
|
+
}
|
|
182
|
+
if (!range) {
|
|
183
|
+
range = document.createRange();
|
|
184
|
+
range.selectNodeContents(editable);
|
|
185
|
+
range.collapse(false);
|
|
186
|
+
}
|
|
123
187
|
range.deleteContents();
|
|
124
188
|
const node = document.createTextNode(text);
|
|
125
189
|
range.insertNode(node);
|
|
126
190
|
range.setStartAfter(node);
|
|
127
191
|
range.setEndAfter(node);
|
|
128
|
-
selection
|
|
129
|
-
selection
|
|
192
|
+
selection?.removeAllRanges();
|
|
193
|
+
selection?.addRange(range);
|
|
130
194
|
editable.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: text }));
|
|
131
195
|
editable.focus();
|
|
132
196
|
return true;
|
|
@@ -150,8 +214,8 @@ export function ensurePreviewInsertTextListener(): void {
|
|
|
150
214
|
reply(false, 'invalid insert request');
|
|
151
215
|
return;
|
|
152
216
|
}
|
|
153
|
-
const
|
|
154
|
-
if (!
|
|
217
|
+
const target = findPreviewInsertTarget();
|
|
218
|
+
if (!target || !insertIntoEditable(target, text)) {
|
|
155
219
|
reply(false, 'no editable target');
|
|
156
220
|
return;
|
|
157
221
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { escapeHtml } from './html.js';
|
|
2
|
+
|
|
1
3
|
type ChartType = 'bar' | 'line' | 'pie';
|
|
2
4
|
|
|
3
5
|
export type ChartJsonSpec = {
|
|
@@ -17,11 +19,6 @@ function escapeAttr(value: string): string {
|
|
|
17
19
|
return value.replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');
|
|
18
20
|
}
|
|
19
21
|
|
|
20
|
-
function escapeHtml(value: string): string {
|
|
21
|
-
return value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')
|
|
22
|
-
.replace(/"/g, '"').replace(/'/g, ''');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
22
|
function clampText(value: unknown, max: number): string {
|
|
26
23
|
const text = typeof value === 'string' ? value.trim() : '';
|
|
27
24
|
return text.length > max ? `${text.slice(0, max - 1)}…` : text;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { escapeHtml } from './html.js';
|
|
2
|
+
|
|
1
3
|
type ComposeKind = 'email' | 'message' | 'document' | 'other';
|
|
2
4
|
|
|
3
5
|
type ComposeVariant = {
|
|
@@ -30,11 +32,6 @@ function escapeAttr(value: string): string {
|
|
|
30
32
|
return value.replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');
|
|
31
33
|
}
|
|
32
34
|
|
|
33
|
-
function escapeHtml(value: string): string {
|
|
34
|
-
return value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')
|
|
35
|
-
.replace(/"/g, '"').replace(/'/g, ''');
|
|
36
|
-
}
|
|
37
|
-
|
|
38
35
|
function asText(value: unknown, max: number): string {
|
|
39
36
|
const text = typeof value === 'string' ? value.trim() : '';
|
|
40
37
|
return text.length > max ? text.slice(0, max) : text;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { escapeHtml } from './html.js';
|
|
2
|
+
|
|
1
3
|
type DataframeType = 'string' | 'number' | 'boolean' | 'date' | 'json';
|
|
2
4
|
|
|
3
5
|
export type DataframeSpec = {
|
|
@@ -30,11 +32,6 @@ function escapeAttr(value: string): string {
|
|
|
30
32
|
return value.replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');
|
|
31
33
|
}
|
|
32
34
|
|
|
33
|
-
function escapeHtml(value: string): string {
|
|
34
|
-
return value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')
|
|
35
|
-
.replace(/"/g, '"').replace(/'/g, ''');
|
|
36
|
-
}
|
|
37
|
-
|
|
38
35
|
function clampText(value: unknown, max = MAX_CELL): string {
|
|
39
36
|
let text = '';
|
|
40
37
|
if (value === null || value === undefined) text = '';
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
+
import { escapeHtml } from './html.js';
|
|
2
|
+
|
|
1
3
|
const DIFF_PATTERN = /^---\s+\S+\n\+\+\+\s+\S+\n@@\s/m;
|
|
2
4
|
const MAX_LINES = 800;
|
|
3
5
|
|
|
4
|
-
function escapeHtml(value: string): string {
|
|
5
|
-
return value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')
|
|
6
|
-
.replace(/"/g, '"').replace(/'/g, ''');
|
|
7
|
-
}
|
|
8
|
-
|
|
9
6
|
export function isUnifiedDiff(text: string): boolean {
|
|
10
7
|
return DIFF_PATTERN.test(text.trim());
|
|
11
8
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { API_BASE } from '../api.js';
|
|
2
|
+
import { escapeHtml } from './html.js';
|
|
2
3
|
|
|
3
4
|
type LinkPreviewData = {
|
|
4
5
|
title?: string;
|
|
@@ -25,11 +26,6 @@ function escapeAttr(value: string): string {
|
|
|
25
26
|
return value.replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');
|
|
26
27
|
}
|
|
27
28
|
|
|
28
|
-
function escapeHtml(value: string): string {
|
|
29
|
-
return value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')
|
|
30
|
-
.replace(/"/g, '"').replace(/'/g, ''');
|
|
31
|
-
}
|
|
32
|
-
|
|
33
29
|
function isPrivateHost(hostname: string): boolean {
|
|
34
30
|
const host = hostname.replace(/^\[|\]$/g, '').toLowerCase();
|
|
35
31
|
return host === 'localhost'
|
|
@@ -47,6 +47,20 @@ function renderCodeBlock(text: string, lang?: string): string {
|
|
|
47
47
|
return `<div class="code-block"><div class="code-header"><span class="code-lang">${langDisplay}</span><button class="code-copy-btn" type="button" aria-label="${escapeHtml(copyLabel)}">${escapeHtml(copyLabel)}</button></div><pre><code class="hljs${lang ? ` language-${escapeHtml(lang)}` : ''}">${highlighted}</code></pre></div>`;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
function parseDiagramFileWidgetId(text: string): string {
|
|
51
|
+
const trimmed = text.trim();
|
|
52
|
+
if (!trimmed) return '';
|
|
53
|
+
if (trimmed.startsWith('{')) {
|
|
54
|
+
try {
|
|
55
|
+
const parsed = JSON.parse(trimmed) as { id?: unknown };
|
|
56
|
+
return typeof parsed.id === 'string' ? parsed.id.trim() : '';
|
|
57
|
+
} catch {
|
|
58
|
+
return '';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return trimmed;
|
|
62
|
+
}
|
|
63
|
+
|
|
50
64
|
function ensureMarked(): boolean {
|
|
51
65
|
if (markedReady) return true;
|
|
52
66
|
|
|
@@ -74,6 +88,14 @@ function ensureMarked(): boolean {
|
|
|
74
88
|
<div class="diagram-spinner"></div>
|
|
75
89
|
</div>`;
|
|
76
90
|
}
|
|
91
|
+
if (normalizedLang === 'diagram-file') {
|
|
92
|
+
const widgetId = parseDiagramFileWidgetId(text);
|
|
93
|
+
if (!widgetId) return renderCodeBlock(text, lang);
|
|
94
|
+
return `<div class="diagram-widget-pending" data-widget-id="${escapeHtml(widgetId)}"
|
|
95
|
+
role="status" aria-label="Interactive widget loading">
|
|
96
|
+
<div class="diagram-spinner"></div>
|
|
97
|
+
</div>`;
|
|
98
|
+
}
|
|
77
99
|
if (normalizedLang === 'elicitation' || normalizedLang === 'choice-buttons') {
|
|
78
100
|
if (renderContextIsStreaming) return renderCodeBlock(text, lang);
|
|
79
101
|
return renderElicitationPlaceholder(text, normalizedLang);
|
|
@@ -20,10 +20,14 @@ export function schedulePostRender(): void {
|
|
|
20
20
|
postRenderTimer = null;
|
|
21
21
|
postRenderRAF = requestAnimationFrame(() => {
|
|
22
22
|
postRenderRAF = null;
|
|
23
|
-
renderMermaidBlocks();
|
|
24
|
-
rehighlightAll();
|
|
25
|
-
bindDiagramZoom();
|
|
26
23
|
const msgContainer = document.getElementById('chatMessages');
|
|
24
|
+
// Cheap guards (devlog 260705_frontend_perf M1): these three walk
|
|
25
|
+
// the whole container; skip when no candidate nodes exist. The
|
|
26
|
+
// hydrate* calls below stay unconditional — each is already a
|
|
27
|
+
// scoped selector scan and their call shape is a renderer contract.
|
|
28
|
+
if (!msgContainer || msgContainer.querySelector('.mermaid-pending, [data-mermaid-code-raw]')) renderMermaidBlocks();
|
|
29
|
+
if (!msgContainer || msgContainer.querySelector('.code-block pre code, .code-block-wrapper pre code')) rehighlightAll();
|
|
30
|
+
if (!msgContainer || msgContainer.querySelector('.diagram-zoom-btn, .mermaid-zoom-btn')) bindDiagramZoom();
|
|
27
31
|
if (msgContainer) {
|
|
28
32
|
hydrateElicitationBlocks(msgContainer);
|
|
29
33
|
hydrateSearchResultsBlocks(msgContainer);
|
|
@@ -10,6 +10,11 @@ function purifier() {
|
|
|
10
10
|
// and external url() references (resource loading / cookie exfiltration).
|
|
11
11
|
// Internal fragment refs like url(#gradient) are preserved via negative lookahead.
|
|
12
12
|
function sanitizeCssInStyleTags(html: string): string {
|
|
13
|
+
// Fast path: no <style> tag → nothing to strip. Avoids a full div
|
|
14
|
+
// innerHTML parse + serialize round-trip on every markdown render
|
|
15
|
+
// (devlog 260705_frontend_perf M2). False positives (literal "<style"
|
|
16
|
+
// in text) just take the slow path harmlessly.
|
|
17
|
+
if (!/<style/i.test(html)) return html;
|
|
13
18
|
const div = document.createElement('div');
|
|
14
19
|
div.innerHTML = html;
|
|
15
20
|
for (const style of div.querySelectorAll('style')) {
|
|
@@ -59,6 +64,7 @@ export function sanitizeHtml(html: string): string {
|
|
|
59
64
|
'data-compose-block-kind', 'data-compose-block-spec', 'data-compose-block-hydrated',
|
|
60
65
|
'data-dataframe-kind', 'data-dataframe-spec', 'data-dataframe-hydrated',
|
|
61
66
|
'data-chart-json-kind', 'data-chart-json-spec', 'data-chart-json-hydrated',
|
|
67
|
+
'data-widget-id',
|
|
62
68
|
'href', 'xlink:href', 'dominant-baseline'],
|
|
63
69
|
});
|
|
64
70
|
return sanitizeCssInStyleTags(clean);
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { escapeHtml } from './html.js';
|
|
2
|
+
|
|
1
3
|
type RawSearchResult = {
|
|
2
4
|
title?: unknown;
|
|
3
5
|
url?: unknown;
|
|
@@ -28,11 +30,6 @@ function escapeAttr(value: string): string {
|
|
|
28
30
|
return value.replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');
|
|
29
31
|
}
|
|
30
32
|
|
|
31
|
-
function escapeHtml(value: string): string {
|
|
32
|
-
return value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')
|
|
33
|
-
.replace(/"/g, '"').replace(/'/g, ''');
|
|
34
|
-
}
|
|
35
|
-
|
|
36
33
|
function clampText(value: unknown, max = MAX_TEXT): string {
|
|
37
34
|
const text = typeof value === 'string' ? value.trim().replace(/\s+/g, ' ') : '';
|
|
38
35
|
return text.length > max ? `${text.slice(0, max - 1)}…` : text;
|
|
@@ -18,6 +18,17 @@ export interface StreamState {
|
|
|
18
18
|
const FULL_RENDER_THRESHOLD = 2000;
|
|
19
19
|
const THROTTLE_MS = 80; // ~12fps — was 32ms (30fps), reduced to avoid blocking input
|
|
20
20
|
|
|
21
|
+
// Adaptive throttle (devlog 260705_frontend_perf H4): each live render re-parses
|
|
22
|
+
// the FULL accumulated text (marked + sanitize), so per-render cost grows with
|
|
23
|
+
// message length. Stretch the interval as the text grows to keep total work
|
|
24
|
+
// near-linear: 80ms under 2k chars, up to 400ms past ~50k chars.
|
|
25
|
+
const THROTTLE_MAX_MS = 400;
|
|
26
|
+
function throttleMsFor(textLength: number): number {
|
|
27
|
+
if (textLength <= FULL_RENDER_THRESHOLD) return THROTTLE_MS;
|
|
28
|
+
const scaled = THROTTLE_MS * (textLength / FULL_RENDER_THRESHOLD);
|
|
29
|
+
return Math.min(THROTTLE_MAX_MS, Math.round(scaled));
|
|
30
|
+
}
|
|
31
|
+
|
|
21
32
|
export function createStreamRenderer(el: HTMLElement): StreamState {
|
|
22
33
|
return {
|
|
23
34
|
chunks: [], fullText: '', textDirty: false,
|
|
@@ -57,7 +68,7 @@ export function appendChunk(ss: StreamState, chunk: string): void {
|
|
|
57
68
|
if (ss.isFinalized) return;
|
|
58
69
|
const now = performance.now();
|
|
59
70
|
const text = getFullText(ss);
|
|
60
|
-
if (text.length < FULL_RENDER_THRESHOLD || now - ss.lastRenderTime >
|
|
71
|
+
if (text.length < FULL_RENDER_THRESHOLD || now - ss.lastRenderTime > throttleMsFor(text.length)) {
|
|
61
72
|
ss.element.innerHTML = renderMarkdown(text, true) +
|
|
62
73
|
'<span class="stream-cursor" aria-hidden="true"></span>';
|
|
63
74
|
ss.lastRenderTime = now;
|
package/public/js/ui.ts
CHANGED
|
@@ -494,11 +494,14 @@ export function finalizeAgent(text: string, toolLog?: ToolLogEntry[]): void {
|
|
|
494
494
|
const div = state.currentAgentDiv;
|
|
495
495
|
clearMermaidTransientState(div);
|
|
496
496
|
div.querySelectorAll('.diagram-widget').forEach(widget => {
|
|
497
|
-
const
|
|
498
|
-
|
|
497
|
+
const widgetEl = widget as HTMLElement;
|
|
498
|
+
const encoded = widgetEl.dataset['widgetHtml'];
|
|
499
|
+
const widgetId = widgetEl.dataset['widgetId'];
|
|
500
|
+
if (!encoded && !widgetId) return;
|
|
499
501
|
const pending = document.createElement('div');
|
|
500
502
|
pending.className = 'diagram-widget-pending';
|
|
501
|
-
pending.dataset['
|
|
503
|
+
if (widgetId) pending.dataset['widgetId'] = widgetId;
|
|
504
|
+
else if (encoded) pending.dataset['diagramHtml'] = encoded;
|
|
502
505
|
widget.replaceWith(pending);
|
|
503
506
|
});
|
|
504
507
|
if (durableToolLogJson) {
|
package/public/js/ws.ts
CHANGED
|
@@ -35,10 +35,10 @@ function positionShark(roadmap: HTMLElement, shark: HTMLElement, phase: string):
|
|
|
35
35
|
const dotRect = dot.getBoundingClientRect();
|
|
36
36
|
const nextRect = nextDot.getBoundingClientRect();
|
|
37
37
|
const mid = (dotRect.right + nextRect.left) / 2;
|
|
38
|
-
shark.style.
|
|
38
|
+
shark.style.transform = `translateX(${mid - barRect.left - sharkW / 2}px)`;
|
|
39
39
|
} else {
|
|
40
40
|
const dotRect = dot.getBoundingClientRect();
|
|
41
|
-
shark.style.
|
|
41
|
+
shark.style.transform = `translateX(${dotRect.left - barRect.left + dotRect.width / 2 - sharkW / 2}px)`;
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
|
|
@@ -83,6 +83,7 @@ interface WsMessage {
|
|
|
83
83
|
title?: string;
|
|
84
84
|
isEmployee?: boolean;
|
|
85
85
|
fromQueue?: boolean;
|
|
86
|
+
external?: boolean;
|
|
86
87
|
reason?: HeartbeatRuntimeState['reason'];
|
|
87
88
|
policy?: HeartbeatRuntimeState['policy'];
|
|
88
89
|
jobId?: string;
|
|
@@ -904,6 +905,14 @@ function connectLegacyWebSocket(): void {
|
|
|
904
905
|
}
|
|
905
906
|
|
|
906
907
|
function wireEventChannel(): void {
|
|
908
|
+
subscribe('widget', 'widget_updated', (data) => {
|
|
909
|
+
const chatId = data['chatId'];
|
|
910
|
+
const widgetId = data['widgetId'];
|
|
911
|
+
if (typeof chatId !== 'string' || typeof widgetId !== 'string') return;
|
|
912
|
+
import('./diagram/iframe-renderer.js')
|
|
913
|
+
.then(m => m.refreshFileWidget(chatId, widgetId))
|
|
914
|
+
.catch(err => console.warn('[widget] refresh failed:', (err as Error).message));
|
|
915
|
+
});
|
|
907
916
|
subscribe('*', null, (data) => {
|
|
908
917
|
const msg = { ...data, type: data['event'] } as unknown as WsMessage;
|
|
909
918
|
handleServerEvent(msg);
|
|
@@ -914,28 +923,12 @@ function wireEventChannel(): void {
|
|
|
914
923
|
}
|
|
915
924
|
|
|
916
925
|
function handleServerEvent(msg: WsMessage): void {
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
setStatus(msg.status || 'idle');
|
|
924
|
-
}
|
|
925
|
-
// Track per-agent phase for badge rendering
|
|
926
|
-
if (msg.agentId && msg.phase) {
|
|
927
|
-
agentPhaseState[msg.agentId] = { phase: msg.phase, phaseLabel: msg.phaseLabel || '' };
|
|
928
|
-
import('./features/employees.js').then(m => m.loadEmployees());
|
|
929
|
-
}
|
|
930
|
-
} else if (msg.type === 'bgtask_update') {
|
|
931
|
-
import('./features/bgtask-badge.js').then(m => m.applyBgtaskUpdate(msg)).catch(() => {});
|
|
932
|
-
} else if (msg.type === 'queue_update') {
|
|
933
|
-
updateQueueBadge(msg.pending || 0);
|
|
934
|
-
if (Array.isArray(msg.queued)) {
|
|
935
|
-
renderPendingQueue(msg.queued);
|
|
936
|
-
}
|
|
937
|
-
syncOrchestrateSnapshot('queue_update').catch(() => { /* snapshot not critical — UI recovers on next event */ });
|
|
938
|
-
} else if (msg.type === 'agent_tool') {
|
|
926
|
+
// Hot-path first (devlog 260705_frontend_perf M5): agent_tool/agent_output
|
|
927
|
+
// arrive many times per second during streaming — they head the chain so
|
|
928
|
+
// each event pays 1-2 string compares instead of walking cold branches.
|
|
929
|
+
// Textual order agent_tool < agent_output < agent_retry is a test contract
|
|
930
|
+
// (web-sse-replay-idempotency slices between those markers).
|
|
931
|
+
if (msg.type === 'agent_tool') {
|
|
939
932
|
if (isRecentSteer()) return;
|
|
940
933
|
const toolRunId = typeof msg.traceRunId === 'string' && msg.traceRunId ? msg.traceRunId : null;
|
|
941
934
|
const toolSeq = positiveSeq(msg.traceSeq);
|
|
@@ -999,6 +992,27 @@ function handleServerEvent(msg: WsMessage): void {
|
|
|
999
992
|
liveAppliedTextLen = msg.textLen;
|
|
1000
993
|
}
|
|
1001
994
|
appendAgentText(outputText);
|
|
995
|
+
} else if (msg.type === 'agent_status') {
|
|
996
|
+
if (!msg.running && isRecentSteer()) return;
|
|
997
|
+
if (msg.running && isRecentSteer()) clearSteer();
|
|
998
|
+
if (msg.running !== undefined) {
|
|
999
|
+
setStatus(msg.running ? 'running' : 'idle');
|
|
1000
|
+
} else {
|
|
1001
|
+
setStatus(msg.status || 'idle');
|
|
1002
|
+
}
|
|
1003
|
+
// Track per-agent phase for badge rendering
|
|
1004
|
+
if (msg.agentId && msg.phase) {
|
|
1005
|
+
agentPhaseState[msg.agentId] = { phase: msg.phase, phaseLabel: msg.phaseLabel || '' };
|
|
1006
|
+
import('./features/employees.js').then(m => m.loadEmployees());
|
|
1007
|
+
}
|
|
1008
|
+
} else if (msg.type === 'bgtask_update') {
|
|
1009
|
+
import('./features/bgtask-badge.js').then(m => m.applyBgtaskUpdate(msg)).catch(() => {});
|
|
1010
|
+
} else if (msg.type === 'queue_update') {
|
|
1011
|
+
updateQueueBadge(msg.pending || 0);
|
|
1012
|
+
if (Array.isArray(msg.queued)) {
|
|
1013
|
+
renderPendingQueue(msg.queued);
|
|
1014
|
+
}
|
|
1015
|
+
syncOrchestrateSnapshot('queue_update').catch(() => { /* snapshot not critical — UI recovers on next event */ });
|
|
1002
1016
|
} else if (msg.type === 'agent_retry') {
|
|
1003
1017
|
const retryDelay = Number(msg.delay ?? 0);
|
|
1004
1018
|
const retryReasonValue = (msg as WsMessage & { reason?: unknown }).reason;
|
|
@@ -1074,7 +1088,7 @@ function handleServerEvent(msg: WsMessage): void {
|
|
|
1074
1088
|
markRunFinalized(null); // killed run — drop its replayed stream too
|
|
1075
1089
|
finalizeAgent('');
|
|
1076
1090
|
setStatus('steering');
|
|
1077
|
-
} else if (msg.type === 'new_message' && (msg.source === 'telegram' || msg.source === 'discord' || msg.source === 'bgtask' || msg.fromQueue === true)) {
|
|
1091
|
+
} else if (msg.type === 'new_message' && (msg.source === 'telegram' || msg.source === 'discord' || msg.source === 'bgtask' || msg.source === 'cli' || msg.source === 'goal' || msg.external === true || msg.fromQueue === true)) {
|
|
1078
1092
|
const newMessageRole = msg.role === 'assistant' ? 'agent' : (msg.role || 'user');
|
|
1079
1093
|
const newMessageContent = msg.content || '';
|
|
1080
1094
|
const newMessageCli = msg.cli;
|
package/public/locales/en.json
CHANGED
|
@@ -801,5 +801,6 @@
|
|
|
801
801
|
"help.keyboardShortcuts.subcmd.1": "/help — Show full command list",
|
|
802
802
|
"help.keyboardShortcuts.subcmd.2": "/help <command> — Show detailed help for a specific command",
|
|
803
803
|
"help.keyboardShortcuts.subcmd.3": "/commands — Open command palette (alias: /cmd)",
|
|
804
|
-
"bgtask.title": "Background"
|
|
804
|
+
"bgtask.title": "Background",
|
|
805
|
+
"tg.elicitationExpired": "Selection expired. Please reply with text."
|
|
805
806
|
}
|
package/public/locales/ja.json
CHANGED
|
@@ -790,5 +790,6 @@
|
|
|
790
790
|
"help.keyboardShortcuts.subcmd.1": "/help — 全コマンド一覧を表示します",
|
|
791
791
|
"help.keyboardShortcuts.subcmd.2": "/help <command> — 特定コマンドの詳細ヘルプを表示します",
|
|
792
792
|
"help.keyboardShortcuts.subcmd.3": "/commands — コマンドパレットを開きます(エイリアス: /cmd)",
|
|
793
|
-
"bgtask.title": "バックグラウンド"
|
|
793
|
+
"bgtask.title": "バックグラウンド",
|
|
794
|
+
"tg.elicitationExpired": "選択セッションの有効期限が切れました。テキストで返信してください。"
|
|
794
795
|
}
|
package/public/locales/ko.json
CHANGED
|
@@ -801,5 +801,6 @@
|
|
|
801
801
|
"help.keyboardShortcuts.subcmd.1": "/help — 전체 명령어 목록을 표시합니다",
|
|
802
802
|
"help.keyboardShortcuts.subcmd.2": "/help <command> — 특정 명령어의 상세 도움말을 표시합니다",
|
|
803
803
|
"help.keyboardShortcuts.subcmd.3": "/commands — 명령 팔레트를 엽니다 (별칭: /cmd)",
|
|
804
|
-
"bgtask.title": "백그라운드"
|
|
804
|
+
"bgtask.title": "백그라운드",
|
|
805
|
+
"tg.elicitationExpired": "선택 세션이 만료되었습니다. 텍스트로 답해주세요."
|
|
805
806
|
}
|
package/public/locales/zh.json
CHANGED
|
@@ -790,5 +790,6 @@
|
|
|
790
790
|
"help.keyboardShortcuts.subcmd.1": "/help — 显示完整命令列表",
|
|
791
791
|
"help.keyboardShortcuts.subcmd.2": "/help <command> — 显示特定命令的详细帮助",
|
|
792
792
|
"help.keyboardShortcuts.subcmd.3": "/commands — 打开命令面板(别名: /cmd)",
|
|
793
|
-
"bgtask.title": "后台任务"
|
|
793
|
+
"bgtask.title": "后台任务",
|
|
794
|
+
"tg.elicitationExpired": "选择会话已过期,请用文字回复。"
|
|
794
795
|
}
|
|
@@ -18,10 +18,20 @@ type InstancePreviewProps = {
|
|
|
18
18
|
onOpenDocFromPreview?: (absolutePath: string) => void;
|
|
19
19
|
onPreviewDroppedFiles?: (files: File[]) => void;
|
|
20
20
|
docPanelCapable?: boolean;
|
|
21
|
+
previewInsertTextRequest?: PreviewInsertTextRequest | null;
|
|
22
|
+
onPreviewInsertTextResult?: (id: string, result: PreviewInsertTextResult) => void;
|
|
21
23
|
};
|
|
22
24
|
|
|
23
25
|
const PREVIEW_IFRAME_SANDBOX = 'allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads';
|
|
24
26
|
|
|
27
|
+
export type PreviewInsertTextRequest = {
|
|
28
|
+
id: string;
|
|
29
|
+
port: number;
|
|
30
|
+
text: string;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export type PreviewInsertTextResult = { ok: true } | { ok: false; error: string };
|
|
34
|
+
|
|
25
35
|
type PreviewOpenNotesMessage = {
|
|
26
36
|
type?: unknown;
|
|
27
37
|
path?: unknown;
|
|
@@ -240,6 +250,7 @@ function extractDroppedFiles(data: PreviewDroppedFilesMessage | null): File[] {
|
|
|
240
250
|
export function InstancePreview(props: InstancePreviewProps) {
|
|
241
251
|
const iframeRef = useRef<HTMLIFrameElement | null>(null);
|
|
242
252
|
const loadedSrcRef = useRef<string | null>(null);
|
|
253
|
+
const handledInsertRequestRef = useRef<string | null>(null);
|
|
243
254
|
const [pathDropStatus, setPathDropStatus] = useState<string | null>(null);
|
|
244
255
|
const [folderDragActive, setFolderDragActive] = useState(false);
|
|
245
256
|
const state = buildPreviewState(
|
|
@@ -259,6 +270,30 @@ export function InstancePreview(props: InstancePreviewProps) {
|
|
|
259
270
|
postPreviewTheme(iframeRef.current, state.src, props.theme);
|
|
260
271
|
}, [props.enabled, props.theme, state.canPreview, state.src]);
|
|
261
272
|
|
|
273
|
+
useEffect(() => {
|
|
274
|
+
const request = props.previewInsertTextRequest;
|
|
275
|
+
if (!request || handledInsertRequestRef.current === request.id) return;
|
|
276
|
+
handledInsertRequestRef.current = request.id;
|
|
277
|
+
const finish = (result: PreviewInsertTextResult): void => {
|
|
278
|
+
props.onPreviewInsertTextResult?.(request.id, result);
|
|
279
|
+
};
|
|
280
|
+
if (!props.instance?.ok || props.instance.port !== request.port) {
|
|
281
|
+
finish({ ok: false, error: 'selected instance preview is not mounted' });
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
if (!props.enabled || !state.canPreview || !state.src) {
|
|
285
|
+
finish({ ok: false, error: disabledReason || 'selected instance preview is unavailable' });
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
if (loadedSrcRef.current !== state.src) {
|
|
289
|
+
finish({ ok: false, error: 'selected instance preview is still loading' });
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
void postPreviewInsertText(iframeRef.current, state.src, request.text)
|
|
293
|
+
.then(finish)
|
|
294
|
+
.catch(error => finish({ ok: false, error: (error as Error).message }));
|
|
295
|
+
}, [disabledReason, props.enabled, props.instance, props.onPreviewInsertTextResult, props.previewInsertTextRequest, state.canPreview, state.src]);
|
|
296
|
+
|
|
262
297
|
const handleFolderPathDrop = useCallback(async (event: React.DragEvent): Promise<void> => {
|
|
263
298
|
if (!hasFolderPanelDragPayload(event.dataTransfer)) return;
|
|
264
299
|
event.preventDefault();
|