cli-jaw 2.2.4 → 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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e,r as t}from"./chunk-AGHRB4JF-
|
|
1
|
+
import{n as e,r as t}from"./chunk-AGHRB4JF-BXLzSehp.js";import{D as n,H as r,K as i,U as a,a as o,b as s,c,f as l,v as u,w as d,y as f,z as p}from"./chunk-CSCIHK7Q-CmvetykJ.js";import{Ot as m,kt as h,lt as g}from"./vendor-utils-DJY0EWnQ.js";import{t as _}from"./chunk-WU5MYG2G-CkoHFn0F.js";import{i as v}from"./chunk-5ZQYHXKU-DVpWOoGS.js";import{t as y}from"./chunk-O5CBEL6O-BWbe_grt.js";var b=(function(){var t=e(function(e,t,n,r){for(n||={},r=e.length;r--;n[e[r]]=t);return n},`o`),n=[1,10,12,14,16,18,19,21,23],r=[2,6],i=[1,3],a=[1,5],o=[1,6],s=[1,7],c=[1,5,10,12,14,16,18,19,21,23,34,35,36],l=[1,25],u=[1,26],d=[1,28],f=[1,29],p=[1,30],m=[1,31],h=[1,32],g=[1,33],_=[1,34],v=[1,35],y=[1,36],b=[1,37],x=[1,43],S=[1,42],C=[1,47],w=[1,50],T=[1,10,12,14,16,18,19,21,23,34,35,36],E=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],D=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],O=[1,64],k={trace:e(function(){},`trace`),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:`error`,5:`XYCHART`,8:`CHART_ORIENTATION`,10:`title`,12:`X_AXIS`,14:`Y_AXIS`,16:`LINE`,18:`BAR`,19:`acc_title`,20:`acc_title_value`,21:`acc_descr`,22:`acc_descr_value`,23:`acc_descr_multiline_value`,24:`SQUARE_BRACES_START`,26:`SQUARE_BRACES_END`,27:`NUMBER_WITH_DECIMAL`,28:`COMMA`,31:`ARROW_DELIMITER`,34:`NEWLINE`,35:`SEMI`,36:`EOF`,38:`STR`,39:`MD_STR`,41:`AMP`,42:`NUM`,43:`ALPHA`,44:`PLUS`,45:`EQUALS`,46:`MULT`,47:`DOT`,48:`BRKT`,49:`MINUS`,50:`UNDERSCORE`},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:e(function(e,t,n,r,i,a,o){var s=a.length-1;switch(i){case 5:r.setOrientation(a[s]);break;case 9:r.setDiagramTitle(a[s].text.trim());break;case 12:r.setLineData({text:``,type:`text`},a[s]);break;case 13:r.setLineData(a[s-1],a[s]);break;case 14:r.setBarData({text:``,type:`text`},a[s]);break;case 15:r.setBarData(a[s-1],a[s]);break;case 16:this.$=a[s].trim(),r.setAccTitle(this.$);break;case 17:case 18:this.$=a[s].trim(),r.setAccDescription(this.$);break;case 19:this.$=a[s-1];break;case 20:this.$=[Number(a[s-2]),...a[s]];break;case 21:this.$=[Number(a[s])];break;case 22:r.setXAxisTitle(a[s]);break;case 23:r.setXAxisTitle(a[s-1]);break;case 24:r.setXAxisTitle({type:`text`,text:``});break;case 25:r.setXAxisBand(a[s]);break;case 26:r.setXAxisRangeData(Number(a[s-2]),Number(a[s]));break;case 27:this.$=a[s-1];break;case 28:this.$=[a[s-2],...a[s]];break;case 29:this.$=[a[s]];break;case 30:r.setYAxisTitle(a[s]);break;case 31:r.setYAxisTitle(a[s-1]);break;case 32:r.setYAxisTitle({type:`text`,text:``});break;case 33:r.setYAxisRangeData(Number(a[s-2]),Number(a[s]));break;case 37:this.$={text:a[s],type:`text`};break;case 38:this.$={text:a[s],type:`text`};break;case 39:this.$={text:a[s],type:`markdown`};break;case 40:this.$=a[s];break;case 41:this.$=a[s-1]+``+a[s];break}},`anonymous`),table:[t(n,r,{3:1,4:2,7:4,5:i,34:a,35:o,36:s}),{1:[3]},t(n,r,{4:2,7:4,3:8,5:i,34:a,35:o,36:s}),t(n,r,{4:2,7:4,6:9,3:10,5:i,8:[1,11],34:a,35:o,36:s}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},t(c,[2,34]),t(c,[2,35]),t(c,[2,36]),{1:[2,1]},t(n,r,{4:2,7:4,3:21,5:i,34:a,35:o,36:s}),{1:[2,3]},t(c,[2,5]),t(n,[2,7],{4:22,34:a,35:o,36:s}),{11:23,37:24,38:l,39:u,40:27,41:d,42:f,43:p,44:m,45:h,46:g,47:_,48:v,49:y,50:b},{11:39,13:38,24:x,27:S,29:40,30:41,37:24,38:l,39:u,40:27,41:d,42:f,43:p,44:m,45:h,46:g,47:_,48:v,49:y,50:b},{11:45,15:44,27:C,33:46,37:24,38:l,39:u,40:27,41:d,42:f,43:p,44:m,45:h,46:g,47:_,48:v,49:y,50:b},{11:49,17:48,24:w,37:24,38:l,39:u,40:27,41:d,42:f,43:p,44:m,45:h,46:g,47:_,48:v,49:y,50:b},{11:52,17:51,24:w,37:24,38:l,39:u,40:27,41:d,42:f,43:p,44:m,45:h,46:g,47:_,48:v,49:y,50:b},{20:[1,53]},{22:[1,54]},t(T,[2,18]),{1:[2,2]},t(T,[2,8]),t(T,[2,9]),t(E,[2,37],{40:55,41:d,42:f,43:p,44:m,45:h,46:g,47:_,48:v,49:y,50:b}),t(E,[2,38]),t(E,[2,39]),t(D,[2,40]),t(D,[2,42]),t(D,[2,43]),t(D,[2,44]),t(D,[2,45]),t(D,[2,46]),t(D,[2,47]),t(D,[2,48]),t(D,[2,49]),t(D,[2,50]),t(D,[2,51]),t(T,[2,10]),t(T,[2,22],{30:41,29:56,24:x,27:S}),t(T,[2,24]),t(T,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:l,39:u,40:27,41:d,42:f,43:p,44:m,45:h,46:g,47:_,48:v,49:y,50:b},t(T,[2,11]),t(T,[2,30],{33:60,27:C}),t(T,[2,32]),{31:[1,61]},t(T,[2,12]),{17:62,24:w},{25:63,27:O},t(T,[2,14]),{17:65,24:w},t(T,[2,16]),t(T,[2,17]),t(D,[2,41]),t(T,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},t(T,[2,31]),{27:[1,69]},t(T,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},t(T,[2,15]),t(T,[2,26]),t(T,[2,27]),{11:59,32:72,37:24,38:l,39:u,40:27,41:d,42:f,43:p,44:m,45:h,46:g,47:_,48:v,49:y,50:b},t(T,[2,33]),t(T,[2,19]),{25:73,27:O},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:e(function(e,t){if(t.recoverable)this.trace(e);else{var n=Error(e);throw n.hash=t,n}},`parseError`),parse:e(function(t){var n=this,r=[0],i=[],a=[null],o=[],s=this.table,c=``,l=0,u=0,d=0,f=2,p=1,m=o.slice.call(arguments,1),h=Object.create(this.lexer),g={yy:{}};for(var _ in this.yy)Object.prototype.hasOwnProperty.call(this.yy,_)&&(g.yy[_]=this.yy[_]);h.setInput(t,g.yy),g.yy.lexer=h,g.yy.parser=this,h.yylloc===void 0&&(h.yylloc={});var v=h.yylloc;o.push(v);var y=h.options&&h.options.ranges;typeof g.yy.parseError==`function`?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function b(e){r.length-=2*e,a.length-=e,o.length-=e}e(b,`popStack`);function x(){var e=i.pop()||h.lex()||p;return typeof e!=`number`&&(e instanceof Array&&(i=e,e=i.pop()),e=n.symbols_[e]||e),e}e(x,`lex`);for(var S,C,w,T,E,D={},O,k,A,j;;){if(w=r[r.length-1],this.defaultActions[w]?T=this.defaultActions[w]:(S??=x(),T=s[w]&&s[w][S]),T===void 0||!T.length||!T[0]){var M=``;for(O in j=[],s[w])this.terminals_[O]&&O>f&&j.push(`'`+this.terminals_[O]+`'`);M=h.showPosition?`Parse error on line `+(l+1)+`:
|
|
2
2
|
`+h.showPosition()+`
|
|
3
3
|
Expecting `+j.join(`, `)+`, got '`+(this.terminals_[S]||S)+`'`:`Parse error on line `+(l+1)+`: Unexpected `+(S==p?`end of input`:`'`+(this.terminals_[S]||S)+`'`),this.parseError(M,{text:h.match,token:this.terminals_[S]||S,line:h.yylineno,loc:v,expected:j})}if(T[0]instanceof Array&&T.length>1)throw Error(`Parse Error: multiple actions possible at state: `+w+`, token: `+S);switch(T[0]){case 1:r.push(S),a.push(h.yytext),o.push(h.yylloc),r.push(T[1]),S=null,C?(S=C,C=null):(u=h.yyleng,c=h.yytext,l=h.yylineno,v=h.yylloc,d>0&&d--);break;case 2:if(k=this.productions_[T[1]][1],D.$=a[a.length-k],D._$={first_line:o[o.length-(k||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(k||1)].first_column,last_column:o[o.length-1].last_column},y&&(D._$.range=[o[o.length-(k||1)].range[0],o[o.length-1].range[1]]),E=this.performAction.apply(D,[c,u,l,g.yy,T[1],a,o].concat(m)),E!==void 0)return E;k&&(r=r.slice(0,-1*k*2),a=a.slice(0,-1*k),o=o.slice(0,-1*k)),r.push(this.productions_[T[1]][0]),a.push(D.$),o.push(D._$),A=s[r[r.length-2]][r[r.length-1]],r.push(A);break;case 3:return!0}}return!0},`parse`)};k.lexer=(function(){return{EOF:1,parseError:e(function(e,t){if(this.yy.parser)this.yy.parser.parseError(e,t);else throw Error(e)},`parseError`),setInput:e(function(e,t){return this.yy=t||this.yy||{},this._input=e,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match=``,this.conditionStack=[`INITIAL`],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},`setInput`),input:e(function(){var e=this._input[0];return this.yytext+=e,this.yyleng++,this.offset++,this.match+=e,this.matched+=e,e.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),e},`input`),unput:e(function(e){var t=e.length,n=e.split(/(?:\r\n?|\n)/g);this._input=e+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-t),this.offset-=t;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-t},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-t]),this.yyleng=this.yytext.length,this},`unput`),more:e(function(){return this._more=!0,this},`more`),reject:e(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError(`Lexical error on line `+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).
|
|
4
4
|
`+this.showPosition(),{text:``,token:null,line:this.yylineno});return this},`reject`),less:e(function(e){this.unput(this.match.slice(e))},`less`),pastInput:e(function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?`...`:``)+e.substr(-20).replace(/\n/g,``)},`pastInput`),upcomingInput:e(function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?`...`:``)).replace(/\n/g,``)},`upcomingInput`),showPosition:e(function(){var e=this.pastInput(),t=Array(e.length+1).join(`-`);return e+this.upcomingInput()+`
|
package/public/dist/index.html
CHANGED
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
href="https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@400;500;600;700&family=Outfit:wght@400;500;600;700&display=swap"
|
|
32
32
|
rel="stylesheet">
|
|
33
33
|
<!-- Vite handles module bundling in dev (HMR) and production (build) -->
|
|
34
|
-
<script type="module" crossorigin src="/dist/assets/app-
|
|
34
|
+
<script type="module" crossorigin src="/dist/assets/app-BJVZZqTm.js"></script>
|
|
35
35
|
<link rel="stylesheet" crossorigin href="/dist/assets/vendor-render-Bjnw0wQ6.css">
|
|
36
|
-
<link rel="stylesheet" crossorigin href="/dist/assets/app-
|
|
36
|
+
<link rel="stylesheet" crossorigin href="/dist/assets/app-CvNmD8jx.css">
|
|
37
37
|
</head>
|
|
38
38
|
|
|
39
39
|
<body>
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
<link rel="icon" type="image/png" href="/dist/assets/icon-192-CwXPIYF5.png">
|
|
7
7
|
<title>Jaw Manager</title>
|
|
8
8
|
<script src="/manager/theme-boot.js"></script>
|
|
9
|
-
<script type="module" crossorigin src="/dist/assets/manager-
|
|
9
|
+
<script type="module" crossorigin src="/dist/assets/manager-pcvo6od1.js"></script>
|
|
10
10
|
<link rel="stylesheet" crossorigin href="/dist/assets/vendor-render-Bjnw0wQ6.css">
|
|
11
|
-
<link rel="stylesheet" crossorigin href="/dist/assets/manager-
|
|
11
|
+
<link rel="stylesheet" crossorigin href="/dist/assets/manager-C4eNDNFt.css">
|
|
12
12
|
</head>
|
|
13
13
|
<body>
|
|
14
14
|
<div id="manager-root"></div>
|
|
@@ -6,6 +6,7 @@ import { ICONS } from '../icons.js';
|
|
|
6
6
|
import { validateWidgetHtml } from './widget-validator.js';
|
|
7
7
|
import { isChatNearBottom, reconcileChatBottomAfterLayout } from '../features/chat-scroll.js';
|
|
8
8
|
import { copyText } from '../features/copy-text.js';
|
|
9
|
+
import { API_BASE, getAuthToken } from '../api.js';
|
|
9
10
|
|
|
10
11
|
// ── Action Button Helpers ──
|
|
11
12
|
function createDiagramCopyBtn(): HTMLButtonElement {
|
|
@@ -65,6 +66,38 @@ const registeredIframes = new Set<Window>();
|
|
|
65
66
|
const iframeNonces = new Map<Window, string>();
|
|
66
67
|
|
|
67
68
|
const widgetLifecycleCleanups = new WeakMap<HTMLElement, () => void>();
|
|
69
|
+
const INLINE_WIDGET_MAX_BYTES = 524_288;
|
|
70
|
+
const FILE_WIDGET_MAX_BYTES = 2_097_152;
|
|
71
|
+
const ACTIVE_CHAT_CACHE_MS = 30_000;
|
|
72
|
+
let activeChatIdCache: { id: string; expiresAt: number } | null = null;
|
|
73
|
+
|
|
74
|
+
window.addEventListener('session_switched', () => {
|
|
75
|
+
activeChatIdCache = null;
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
async function authFetch(path: string, opts: RequestInit = {}): Promise<Response> {
|
|
79
|
+
const token = await getAuthToken();
|
|
80
|
+
const headers = new Headers(opts.headers || {});
|
|
81
|
+
if (token) headers.set('Authorization', `Bearer ${token}`);
|
|
82
|
+
return fetch(`${API_BASE}${path}`, { ...opts, headers });
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async function resolveActiveChatId(force = false): Promise<string | null> {
|
|
86
|
+
const now = Date.now();
|
|
87
|
+
if (!force && activeChatIdCache && activeChatIdCache.expiresAt > now) return activeChatIdCache.id;
|
|
88
|
+
try {
|
|
89
|
+
const res = await authFetch('/api/chat-sessions');
|
|
90
|
+
if (!res.ok) return null;
|
|
91
|
+
const json = await res.json() as { ok?: boolean; data?: { active?: unknown }; active?: unknown };
|
|
92
|
+
const active = json.data?.active ?? json.active;
|
|
93
|
+
if (typeof active !== 'string' || !active) return null;
|
|
94
|
+
activeChatIdCache = { id: active, expiresAt: now + ACTIVE_CHAT_CACHE_MS };
|
|
95
|
+
return active;
|
|
96
|
+
} catch (err) {
|
|
97
|
+
console.warn('[jaw-diagram] Failed to resolve active chat session:', (err as Error).message);
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
68
101
|
|
|
69
102
|
function cleanupWidgetOwner(owner: HTMLElement): void {
|
|
70
103
|
const cleanup = widgetLifecycleCleanups.get(owner);
|
|
@@ -394,11 +427,16 @@ export function createWidgetIframe(htmlCode: string): { iframe: HTMLIFrameElemen
|
|
|
394
427
|
export function activateWidgets(container?: HTMLElement): void {
|
|
395
428
|
const root = container || document;
|
|
396
429
|
root.querySelectorAll('.diagram-widget-pending').forEach(el => {
|
|
397
|
-
const
|
|
398
|
-
|
|
430
|
+
const pending = el as HTMLElement;
|
|
431
|
+
const encoded = pending.dataset['diagramHtml'];
|
|
432
|
+
if (!encoded) {
|
|
433
|
+
const widgetId = pending.dataset['widgetId'];
|
|
434
|
+
if (widgetId && pending.dataset['widgetPending'] !== '1') void activateFileWidget(pending, widgetId);
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
399
437
|
let htmlCode: string;
|
|
400
438
|
try {
|
|
401
|
-
htmlCode = decodeWidgetHtml(encoded);
|
|
439
|
+
htmlCode = decodeWidgetHtml(encoded, INLINE_WIDGET_MAX_BYTES);
|
|
402
440
|
} catch {
|
|
403
441
|
el.replaceWith(Object.assign(document.createElement('div'), {
|
|
404
442
|
className: 'diagram-error',
|
|
@@ -408,45 +446,147 @@ export function activateWidgets(container?: HTMLElement): void {
|
|
|
408
446
|
return;
|
|
409
447
|
}
|
|
410
448
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
449
|
+
renderWidgetIframe(pending, htmlCode, encoded);
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
async function activateFileWidget(el: HTMLElement, widgetId: string): Promise<void> {
|
|
454
|
+
if (el.dataset['widgetLoading'] === '1') return;
|
|
455
|
+
el.dataset['widgetLoading'] = '1';
|
|
456
|
+
delete el.dataset['widgetPending'];
|
|
457
|
+
try {
|
|
458
|
+
const chatId = await resolveActiveChatId();
|
|
459
|
+
if (!chatId) {
|
|
460
|
+
showWidgetFilePending(el, widgetId, 'widget file pending');
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
let res = await authFetch(`/api/widgets/${encodeURIComponent(chatId)}/${encodeURIComponent(widgetId)}`);
|
|
465
|
+
if (res.status === 404) {
|
|
466
|
+
activeChatIdCache = null;
|
|
467
|
+
const freshChatId = await resolveActiveChatId(true);
|
|
468
|
+
if (freshChatId && freshChatId !== chatId) {
|
|
469
|
+
res = await authFetch(`/api/widgets/${encodeURIComponent(freshChatId)}/${encodeURIComponent(widgetId)}`);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
if (res.status === 404) {
|
|
474
|
+
showWidgetFilePending(el, widgetId, 'widget file pending');
|
|
419
475
|
return;
|
|
420
476
|
}
|
|
421
|
-
if (
|
|
422
|
-
|
|
477
|
+
if (!res.ok) {
|
|
478
|
+
showWidgetFilePending(el, widgetId, 'widget file pending');
|
|
479
|
+
return;
|
|
423
480
|
}
|
|
424
481
|
|
|
425
|
-
const
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
482
|
+
const htmlCode = await res.text();
|
|
483
|
+
const encoded = encodeWidgetHtml(htmlCode);
|
|
484
|
+
renderWidgetIframe(el, htmlCode, encoded, widgetId, FILE_WIDGET_MAX_BYTES);
|
|
485
|
+
} catch (err) {
|
|
486
|
+
console.warn('[jaw-diagram] Failed to load widget file:', (err as Error).message);
|
|
487
|
+
showWidgetFilePending(el, widgetId, 'widget file pending');
|
|
488
|
+
}
|
|
489
|
+
}
|
|
429
490
|
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
}
|
|
449
|
-
|
|
491
|
+
export async function refreshFileWidget(chatId: string, widgetId: string): Promise<void> {
|
|
492
|
+
if (!chatId || !widgetId) return;
|
|
493
|
+
const activeChatId = await resolveActiveChatId();
|
|
494
|
+
if (activeChatId !== chatId) return;
|
|
495
|
+
|
|
496
|
+
const targets = [...document.querySelectorAll<HTMLElement>('[data-widget-id]')]
|
|
497
|
+
.filter(el => el.dataset['widgetId'] === widgetId
|
|
498
|
+
&& (el.classList.contains('diagram-widget') || el.classList.contains('diagram-widget-pending')));
|
|
499
|
+
if (!targets.length) return;
|
|
500
|
+
|
|
501
|
+
await Promise.all(targets.map(async (target) => {
|
|
502
|
+
if (target.dataset['widgetLoading'] === '1') return;
|
|
503
|
+
target.dataset['widgetLoading'] = '1';
|
|
504
|
+
try {
|
|
505
|
+
const res = await authFetch(`/api/widgets/${encodeURIComponent(chatId)}/${encodeURIComponent(widgetId)}`);
|
|
506
|
+
if (res.status === 404) {
|
|
507
|
+
showWidgetFilePending(target, widgetId, 'widget file pending');
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
510
|
+
if (!res.ok) {
|
|
511
|
+
delete target.dataset['widgetLoading'];
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
514
|
+
const htmlCode = await res.text();
|
|
515
|
+
const encoded = encodeWidgetHtml(htmlCode);
|
|
516
|
+
renderWidgetIframe(target, htmlCode, encoded, widgetId, FILE_WIDGET_MAX_BYTES);
|
|
517
|
+
} catch (err) {
|
|
518
|
+
delete target.dataset['widgetLoading'];
|
|
519
|
+
console.warn('[jaw-diagram] Failed to refresh widget file:', (err as Error).message);
|
|
520
|
+
}
|
|
521
|
+
}));
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
function showWidgetFilePending(el: HTMLElement, widgetId: string, message: string): void {
|
|
525
|
+
delete el.dataset['widgetLoading'];
|
|
526
|
+
el.dataset['widgetPending'] = '1';
|
|
527
|
+
el.className = 'diagram-widget-pending diagram-widget-file-pending';
|
|
528
|
+
el.dataset['widgetId'] = widgetId;
|
|
529
|
+
el.setAttribute('role', 'status');
|
|
530
|
+
el.setAttribute('aria-label', 'Widget file pending');
|
|
531
|
+
el.innerHTML = '';
|
|
532
|
+
const label = document.createElement('span');
|
|
533
|
+
label.textContent = message;
|
|
534
|
+
const retry = document.createElement('button');
|
|
535
|
+
retry.type = 'button';
|
|
536
|
+
retry.className = 'diagram-widget-retry';
|
|
537
|
+
retry.textContent = 'Retry';
|
|
538
|
+
retry.addEventListener('click', () => {
|
|
539
|
+
delete el.dataset['widgetPending'];
|
|
540
|
+
void activateFileWidget(el, widgetId);
|
|
541
|
+
});
|
|
542
|
+
el.append(label, retry);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
function renderWidgetIframe(
|
|
546
|
+
pending: HTMLElement,
|
|
547
|
+
htmlCode: string,
|
|
548
|
+
encoded: string,
|
|
549
|
+
widgetId?: string,
|
|
550
|
+
maxBytes = INLINE_WIDGET_MAX_BYTES,
|
|
551
|
+
): void {
|
|
552
|
+
const validation = validateWidgetHtml(htmlCode, { maxBytes });
|
|
553
|
+
if (!validation.valid) {
|
|
554
|
+
pending.replaceWith(Object.assign(document.createElement('div'), {
|
|
555
|
+
className: 'diagram-error',
|
|
556
|
+
textContent: `Widget blocked: ${validation.reason}`,
|
|
557
|
+
role: 'alert',
|
|
558
|
+
}));
|
|
559
|
+
return;
|
|
560
|
+
}
|
|
561
|
+
if (validation.warnings.length) {
|
|
562
|
+
console.warn('[jaw-diagram] Widget warnings:', validation.warnings);
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
const wrapper = document.createElement('div');
|
|
566
|
+
wrapper.className = 'diagram-container diagram-widget';
|
|
567
|
+
// Preserve source for theme-change reload and virtual-scroll reactivation.
|
|
568
|
+
wrapper.dataset['widgetHtml'] = encoded;
|
|
569
|
+
if (widgetId) wrapper.dataset['widgetId'] = widgetId;
|
|
570
|
+
|
|
571
|
+
wrapper.appendChild(createDiagramZoomBtn());
|
|
572
|
+
wrapper.appendChild(createDiagramSaveBtn());
|
|
573
|
+
wrapper.appendChild(createDiagramCopyBtn());
|
|
574
|
+
const { iframe, nonce } = createWidgetIframe(htmlCode);
|
|
575
|
+
wrapper.appendChild(iframe);
|
|
576
|
+
bindWidgetZoom(wrapper);
|
|
577
|
+
|
|
578
|
+
pending.replaceWith(wrapper);
|
|
579
|
+
|
|
580
|
+
attachWidgetIframeLifecycle({
|
|
581
|
+
iframe,
|
|
582
|
+
nonce,
|
|
583
|
+
owner: wrapper,
|
|
584
|
+
onTimeout: () => {
|
|
585
|
+
wrapper.innerHTML = `<div class="diagram-error" role="alert">
|
|
586
|
+
Widget failed to load within 10 seconds.
|
|
587
|
+
</div>`;
|
|
588
|
+
console.warn('[jaw-diagram] Widget timeout — iframe deregistered');
|
|
589
|
+
},
|
|
450
590
|
});
|
|
451
591
|
}
|
|
452
592
|
|
|
@@ -457,20 +597,26 @@ function bindWidgetZoom(container: HTMLElement): void {
|
|
|
457
597
|
btn.addEventListener('click', () => {
|
|
458
598
|
const encoded = container.dataset['widgetHtml'];
|
|
459
599
|
if (!encoded) return;
|
|
460
|
-
|
|
600
|
+
const maxBytes = container.dataset['widgetId'] ? FILE_WIDGET_MAX_BYTES : INLINE_WIDGET_MAX_BYTES;
|
|
601
|
+
openWidgetOverlay(encoded, maxBytes);
|
|
461
602
|
});
|
|
462
603
|
}
|
|
463
604
|
|
|
464
|
-
function
|
|
465
|
-
|
|
466
|
-
|
|
605
|
+
function encodeWidgetHtml(htmlCode: string): string {
|
|
606
|
+
return btoa(unescape(encodeURIComponent(htmlCode)));
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
function decodeWidgetHtml(encoded: string, maxBytes = INLINE_WIDGET_MAX_BYTES): string {
|
|
610
|
+
const htmlCode = decodeURIComponent(escape(atob(encoded)));
|
|
611
|
+
if (new TextEncoder().encode(htmlCode).length > maxBytes) throw new Error('Widget payload too large');
|
|
612
|
+
return htmlCode;
|
|
467
613
|
}
|
|
468
614
|
|
|
469
|
-
function openWidgetOverlay(encoded: string): void {
|
|
615
|
+
function openWidgetOverlay(encoded: string, maxBytes = INLINE_WIDGET_MAX_BYTES): void {
|
|
470
616
|
const previousFocus = document.activeElement as HTMLElement | null;
|
|
471
617
|
let htmlCode: string;
|
|
472
618
|
try {
|
|
473
|
-
htmlCode = decodeWidgetHtml(encoded);
|
|
619
|
+
htmlCode = decodeWidgetHtml(encoded, maxBytes);
|
|
474
620
|
} catch {
|
|
475
621
|
htmlCode = '';
|
|
476
622
|
}
|
|
@@ -511,7 +657,7 @@ function openWidgetOverlay(encoded: string): void {
|
|
|
511
657
|
}
|
|
512
658
|
};
|
|
513
659
|
|
|
514
|
-
const validation = htmlCode ? validateWidgetHtml(htmlCode) : { valid: false, reason: 'Failed to decode widget content', warnings: [] };
|
|
660
|
+
const validation = htmlCode ? validateWidgetHtml(htmlCode, { maxBytes }) : { valid: false, reason: 'Failed to decode widget content', warnings: [] };
|
|
515
661
|
if (!validation.valid) {
|
|
516
662
|
content.innerHTML = `<div class="diagram-error" role="alert">Widget blocked: ${validation.reason}</div>`;
|
|
517
663
|
} else {
|
|
@@ -588,11 +734,13 @@ function throttledResize(source: Window, height: number): void {
|
|
|
588
734
|
// Also recreates iframes so baked-in chart colors update with new theme.
|
|
589
735
|
export function broadcastThemeToIframes(): void {
|
|
590
736
|
document.querySelectorAll('.diagram-widget').forEach(container => {
|
|
591
|
-
const
|
|
737
|
+
const containerEl = container as HTMLElement;
|
|
738
|
+
const encoded = containerEl.dataset['widgetHtml'];
|
|
592
739
|
if (!encoded) return;
|
|
740
|
+
const maxBytes = containerEl.dataset['widgetId'] ? FILE_WIDGET_MAX_BYTES : INLINE_WIDGET_MAX_BYTES;
|
|
593
741
|
let htmlCode: string;
|
|
594
742
|
try {
|
|
595
|
-
htmlCode = decodeWidgetHtml(encoded);
|
|
743
|
+
htmlCode = decodeWidgetHtml(encoded, maxBytes);
|
|
596
744
|
} catch { return; }
|
|
597
745
|
|
|
598
746
|
// Deregister old iframe
|
|
@@ -603,7 +751,7 @@ export function broadcastThemeToIframes(): void {
|
|
|
603
751
|
}
|
|
604
752
|
|
|
605
753
|
// Bump generation to invalidate pending timeouts from activateWidgets
|
|
606
|
-
const cEl =
|
|
754
|
+
const cEl = containerEl;
|
|
607
755
|
cEl.dataset['gen'] = String((Number(cEl.dataset['gen'] || '0') || 0) + 1);
|
|
608
756
|
|
|
609
757
|
// Recreate with fresh theme tokens
|
|
@@ -613,8 +761,8 @@ export function broadcastThemeToIframes(): void {
|
|
|
613
761
|
container.appendChild(createDiagramSaveBtn());
|
|
614
762
|
container.appendChild(createDiagramCopyBtn());
|
|
615
763
|
container.appendChild(iframe);
|
|
616
|
-
bindWidgetZoom(
|
|
617
|
-
attachWidgetIframeLifecycle({ iframe, nonce, owner:
|
|
764
|
+
bindWidgetZoom(containerEl);
|
|
765
|
+
attachWidgetIframeLifecycle({ iframe, nonce, owner: containerEl });
|
|
618
766
|
});
|
|
619
767
|
}
|
|
620
768
|
|
|
@@ -36,12 +36,26 @@ export interface ValidationResult {
|
|
|
36
36
|
warnings: string[];
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
const DEFAULT_MAX_BYTES = 524_288;
|
|
40
|
+
|
|
41
|
+
function htmlByteLength(html: string): number {
|
|
42
|
+
return new TextEncoder().encode(html).length;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function formatMaxBytes(maxBytes: number): string {
|
|
46
|
+
if (maxBytes === DEFAULT_MAX_BYTES) return '512KB';
|
|
47
|
+
if (maxBytes % 1_048_576 === 0) return `${maxBytes / 1_048_576}MB`;
|
|
48
|
+
if (maxBytes % 1024 === 0) return `${maxBytes / 1024}KB`;
|
|
49
|
+
return `${maxBytes} bytes`;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function validateWidgetHtml(html: string, opts: { maxBytes?: number } = {}): ValidationResult {
|
|
40
53
|
const warnings: string[] = [];
|
|
54
|
+
const maxBytes = opts.maxBytes ?? DEFAULT_MAX_BYTES;
|
|
41
55
|
|
|
42
56
|
// 1. Size cap (redundant with activateWidgets but defense-in-depth)
|
|
43
|
-
if (html
|
|
44
|
-
return { valid: false, reason:
|
|
57
|
+
if (htmlByteLength(html) > maxBytes) {
|
|
58
|
+
return { valid: false, reason: `Payload too large (>${formatMaxBytes(maxBytes)})`, warnings };
|
|
45
59
|
}
|
|
46
60
|
|
|
47
61
|
// 2. External URL validation — only allowlisted CDN domains
|
|
@@ -117,7 +117,11 @@ export function addMessage(role: string, text: string, cli?: string | null): HTM
|
|
|
117
117
|
div.className = 'msg msg-agent';
|
|
118
118
|
div.innerHTML = `<div class="agent-icon" aria-hidden="true">${getAgentIcon(cli)}</div><div class="agent-body"><div class="msg-content">${rendered}</div>${actions}</div>`;
|
|
119
119
|
} else {
|
|
120
|
-
|
|
120
|
+
// Goal-continuation boundary rows stay .msg-user (the class is the
|
|
121
|
+
// run-boundary signal for hasFollowingUserMessage) but get a modifier
|
|
122
|
+
// class so they render as a slim marker, not a full user bubble.
|
|
123
|
+
const isGoalBoundary = role === 'user' && cli === 'goal_continuation';
|
|
124
|
+
div.className = `msg msg-${role}${isGoalBoundary ? ' msg-goal-boundary' : ''}`;
|
|
121
125
|
div.innerHTML = `<div class="user-body"><div class="msg-label">${label}</div><div class="msg-content">${rendered}</div>${actions}</div><div class="user-icon" aria-hidden="true">${getUserAvatarMarkup()}</div>`;
|
|
122
126
|
}
|
|
123
127
|
const contentEl = div.querySelector('.msg-content');
|
|
@@ -215,14 +215,19 @@ export function scrollToBottom(force = false): void {
|
|
|
215
215
|
ensureScrollTracking();
|
|
216
216
|
if (!force && !userNearBottom) return;
|
|
217
217
|
if (force) markFollowingBottom();
|
|
218
|
-
const vs = getVirtualScroll();
|
|
219
|
-
if (vs.active) {
|
|
220
|
-
vs.scrollToBottom();
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
218
|
if (scrollRAF) return;
|
|
224
219
|
scrollRAF = requestAnimationFrame(() => {
|
|
225
220
|
scrollRAF = null;
|
|
221
|
+
// Re-read VS state inside the frame: activation can flip between
|
|
222
|
+
// schedule and fire (threshold promotion). One rAF gate batches BOTH
|
|
223
|
+
// paths — streaming emits scrollToBottom per chunk/tool event, and the
|
|
224
|
+
// VS branch used to run virtualizer.scrollToIndex + scrollTop reads
|
|
225
|
+
// synchronously per call (devlog 260705_frontend_perf H1).
|
|
226
|
+
const vs = getVirtualScroll();
|
|
227
|
+
if (vs.active) {
|
|
228
|
+
vs.scrollToBottom();
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
226
231
|
const c = document.getElementById('chatMessages');
|
|
227
232
|
if (c) c.scrollTop = c.scrollHeight;
|
|
228
233
|
});
|
|
@@ -36,7 +36,7 @@ interface CommandResult {
|
|
|
36
36
|
recovery?: UnknownCommandRecovery;
|
|
37
37
|
}
|
|
38
38
|
interface MessageResult { queued?: boolean; pending?: number; continued?: boolean; noPendingContinue?: boolean; error?: string; queuedId?: string; }
|
|
39
|
-
type MessagePostResult = { ok: boolean; status: number; data: MessageResult };
|
|
39
|
+
type MessagePostResult = { ok: boolean; status: number; data: MessageResult; viaRelay?: boolean };
|
|
40
40
|
type PreviewSendRelayResult = MessagePostResult & {
|
|
41
41
|
type?: unknown;
|
|
42
42
|
requestId?: unknown;
|
|
@@ -85,6 +85,7 @@ function sendPreviewMessageViaParent(prompt: string): Promise<MessagePostResult
|
|
|
85
85
|
ok: !!data.ok,
|
|
86
86
|
status: Number.isInteger(data.status) ? data.status : (data.ok ? 200 : 502),
|
|
87
87
|
data: data.data || (data.error ? { error: data.error } : {}),
|
|
88
|
+
viaRelay: true,
|
|
88
89
|
});
|
|
89
90
|
};
|
|
90
91
|
const timeout = window.setTimeout(() => settle(null), PREVIEW_SEND_RELAY_TIMEOUT_MS);
|
|
@@ -335,6 +336,13 @@ export async function sendMessage(source: SendSource = 'enter'): Promise<void> {
|
|
|
335
336
|
// bubble when the message actually starts running.
|
|
336
337
|
const { updateQueueBadge } = await import('../ui.js');
|
|
337
338
|
updateQueueBadge(data.pending || 1);
|
|
339
|
+
} else if (result.viaRelay) {
|
|
340
|
+
// Preview relay: the manager POSTs with external:true, so the
|
|
341
|
+
// SSE new_message handler renders this bubble. Rendering here
|
|
342
|
+
// too would duplicate it (devlog 260705).
|
|
343
|
+
upsertMessage({ role: 'user', content: text, timestamp: Date.now() });
|
|
344
|
+
if (data.continued) addSystemMsg(t('chat.continue'));
|
|
345
|
+
reconcileChatBottomAfterLayout(true);
|
|
338
346
|
} else if (data.noPendingContinue) {
|
|
339
347
|
// No system copy here: orchestrateContinue() emits the single
|
|
340
348
|
// user-facing no-pending response through orchestrate_done.
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
type NormalizedQuestion,
|
|
8
8
|
type NormalizedSpec,
|
|
9
9
|
} from './elicitation-state.js';
|
|
10
|
+
import { escapeHtml } from '../render/html.js';
|
|
10
11
|
|
|
11
12
|
type ElicitationKind = 'elicitation' | 'choice-buttons';
|
|
12
13
|
|
|
@@ -36,11 +37,6 @@ function escapeAttr(value: string): string {
|
|
|
36
37
|
return value.replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');
|
|
37
38
|
}
|
|
38
39
|
|
|
39
|
-
function escapeHtml(value: string): string {
|
|
40
|
-
return value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')
|
|
41
|
-
.replace(/"/g, '"').replace(/'/g, ''');
|
|
42
|
-
}
|
|
43
|
-
|
|
44
40
|
export function renderElicitationPlaceholder(raw: string, kind: ElicitationKind): string {
|
|
45
41
|
const encoded = encodeURIComponent(raw);
|
|
46
42
|
return `<div class="elicitation-pending" data-elicitation-kind="${escapeAttr(kind)}" data-elicitation-spec="${escapeAttr(encoded)}" role="status" aria-label="Structured question loading">
|
|
@@ -27,8 +27,10 @@ export function buildLazyVirtualMessageItem(m: MessageItem, index: number): Virt
|
|
|
27
27
|
const toolAttr = rawToolLog ? ` data-tool-log="${rawToolLog}"` : '';
|
|
28
28
|
const contentHtml = `<div class="msg-content lazy-pending" data-raw="${escapeHtml(rawContent)}"></div>`;
|
|
29
29
|
const actions = renderMessageActionsHtml();
|
|
30
|
+
// Keep .msg-user for boundary semantics; modifier slims the visual (see chat-messages.ts).
|
|
31
|
+
const goalBoundaryClass = role === 'user' && m.cli === 'goal_continuation' ? ' msg-goal-boundary' : '';
|
|
30
32
|
const html = role === 'agent'
|
|
31
33
|
? `<div class="msg msg-agent" ${sourceAttrs}><div class="agent-icon" aria-hidden="true">${getAgentIcon(m.cli)}</div><div class="agent-body"${toolAttr}>${contentHtml}${actions}</div></div>`
|
|
32
|
-
: `<div class="msg msg-${role}" ${sourceAttrs}><div class="user-body"><div class="msg-label">${label}</div>${contentHtml}${actions}</div><div class="user-icon" aria-hidden="true">${getUserAvatarMarkup()}</div></div>`;
|
|
34
|
+
: `<div class="msg msg-${role}${goalBoundaryClass}" ${sourceAttrs}><div class="user-body"><div class="msg-label">${label}</div>${contentHtml}${actions}</div><div class="user-icon" aria-hidden="true">${getUserAvatarMarkup()}</div></div>`;
|
|
33
35
|
return { id: generateId(), html, height: 80, rehydratesProcessDetails: Boolean(rawToolLog) };
|
|
34
36
|
}
|
|
@@ -334,7 +334,7 @@ function renderStep(step: ProcessStep): string {
|
|
|
334
334
|
function renderOmittedStepSummary(count: number): string {
|
|
335
335
|
// Clickable: reveals the elided middle (data is in pb.steps). Default-collapsed for
|
|
336
336
|
// DOM/memory safety; expanding is an explicit opt-in (devlog 260620 Phase 4).
|
|
337
|
-
return `<button type="button" class="process-step process-step-omitted" data-expand-steps>
|
|
337
|
+
return `<button type="button" class="process-step process-step-omitted" data-expand-steps data-omitted-count="${count}">
|
|
338
338
|
<span class="process-step-snippet">Show ${count} hidden tool step${count === 1 ? '' : 's'}</span>
|
|
339
339
|
</button>`;
|
|
340
340
|
}
|
|
@@ -545,13 +545,56 @@ export function createProcessBlock(parentEl: HTMLElement): ProcessBlockState {
|
|
|
545
545
|
return state;
|
|
546
546
|
}
|
|
547
547
|
|
|
548
|
+
// Incremental append support for the elided regime (devlog 260705_frontend_perf H2).
|
|
549
|
+
// Past PROCESS_BLOCK_MAX_RENDERED_STEPS the tail window shifts on EVERY append, so a
|
|
550
|
+
// full renderSteps() per event was O(steps^2) over a long run. Instead: append the new
|
|
551
|
+
// tail step, evict the one step that exits the tail window (kept if running/error, the
|
|
552
|
+
// same exception visibleStepIndexes makes), and patch the omitted-button count.
|
|
553
|
+
function updateOmittedButtonCount(btn: HTMLElement, count: number): void {
|
|
554
|
+
btn.setAttribute('data-omitted-count', String(count));
|
|
555
|
+
const snippet = btn.querySelector('.process-step-snippet');
|
|
556
|
+
if (snippet) snippet.textContent = `Show ${count} hidden tool step${count === 1 ? '' : 's'}`;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
function evictExitingTailStep(pb: ProcessBlockState, inner: Element): void {
|
|
560
|
+
const len = pb.steps.length;
|
|
561
|
+
const exitIdx = len - 1 - PROCESS_BLOCK_TAIL_STEPS;
|
|
562
|
+
if (exitIdx < PROCESS_BLOCK_HEAD_STEPS) return;
|
|
563
|
+
const exiting = pb.steps[exitIdx];
|
|
564
|
+
if (!exiting || exiting.status === 'running' || exiting.status === 'error') return;
|
|
565
|
+
const el = inner.querySelector(`[data-step-id="${exiting.id}"]`);
|
|
566
|
+
if (!el) return; // already elided (e.g. mid-list step evicted earlier)
|
|
567
|
+
const prev = el.previousElementSibling as HTMLElement | null;
|
|
568
|
+
if (prev && prev.hasAttribute('data-expand-steps')) {
|
|
569
|
+
updateOmittedButtonCount(prev, Number(prev.getAttribute('data-omitted-count') || '0') + 1);
|
|
570
|
+
el.remove();
|
|
571
|
+
} else {
|
|
572
|
+
// Exiting step is not adjacent to an omitted segment (a kept-visible
|
|
573
|
+
// running/error step precedes it) — start a new omitted segment here.
|
|
574
|
+
const temp = document.createElement('div');
|
|
575
|
+
temp.innerHTML = renderOmittedStepSummary(1);
|
|
576
|
+
const marker = temp.firstElementChild;
|
|
577
|
+
if (marker) el.replaceWith(marker);
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
|
|
548
581
|
export function addStep(pb: ProcessBlockState, step: ProcessStep): void {
|
|
549
582
|
const compactStep = compactProcessStepForStorage(step);
|
|
550
583
|
pb.steps.push(compactStep);
|
|
551
584
|
const inner = pb.element.querySelector('.process-steps-inner');
|
|
552
585
|
if (inner) {
|
|
553
|
-
if (pb.steps.length
|
|
554
|
-
|
|
586
|
+
if (pb.steps.length === PROCESS_BLOCK_MAX_RENDERED_STEPS + 1 && !pb.expandedSteps) {
|
|
587
|
+
// First append past the cap: one full render establishes the
|
|
588
|
+
// head / omitted-button / tail structure the incremental path patches.
|
|
589
|
+
inner.innerHTML = renderSteps(pb.steps, pb.expandedSteps);
|
|
590
|
+
} else if (pb.steps.length > PROCESS_BLOCK_MAX_RENDERED_STEPS && !pb.expandedSteps) {
|
|
591
|
+
inner.insertAdjacentHTML('beforeend', renderStep(compactStep));
|
|
592
|
+
evictExitingTailStep(pb, inner);
|
|
593
|
+
} else {
|
|
594
|
+
// Short block, or user-expanded long block: plain append keeps
|
|
595
|
+
// every step visible (no elision to maintain).
|
|
596
|
+
inner.insertAdjacentHTML('beforeend', renderStep(compactStep));
|
|
597
|
+
}
|
|
555
598
|
}
|
|
556
599
|
updateProcessBlockDetailIndex(pb);
|
|
557
600
|
updateSummary(pb);
|
|
@@ -43,7 +43,7 @@ export async function loadMcpServers(): Promise<void> {
|
|
|
43
43
|
return `<div style="padding:2px 0">• <b>${escapeHtml(n)}</b> <span style="opacity:.6">${detail}</span>${tagHtml}</div>`;
|
|
44
44
|
}).join('');
|
|
45
45
|
updateBundleLabel(countBundleCandidates(d.servers));
|
|
46
|
-
} catch { }
|
|
46
|
+
} catch { } // best-effort: MCP list render is non-critical UI
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
function updateBundleLabel(n: number): void {
|
package/public/js/locale.ts
CHANGED
|
@@ -8,7 +8,7 @@ export function getPreferredLocale(): string {
|
|
|
8
8
|
const saved = localStorage.getItem(key);
|
|
9
9
|
if (saved) return saved;
|
|
10
10
|
}
|
|
11
|
-
} catch { }
|
|
11
|
+
} catch { } // best-effort: localStorage may be unavailable (private mode)
|
|
12
12
|
return navigator.language || 'ko';
|
|
13
13
|
}
|
|
14
14
|
|
|
@@ -19,7 +19,7 @@ export function syncStoredLocale(locale: string): void {
|
|
|
19
19
|
for (const key of LOCALE_KEYS) {
|
|
20
20
|
localStorage.setItem(key, value);
|
|
21
21
|
}
|
|
22
|
-
} catch { }
|
|
22
|
+
} catch { } // best-effort: localStorage may be unavailable (private mode)
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
// ── Translation Map ──
|