cli-jaw 2.0.4 → 2.0.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.ja.md +17 -0
- package/README.ko.md +17 -0
- package/README.md +17 -0
- package/README.zh-CN.md +16 -1
- package/dist/bin/cli-jaw.js +7 -1
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/browser.js +5 -0
- package/dist/bin/commands/browser.js.map +1 -1
- package/dist/bin/commands/connector.js +227 -0
- package/dist/bin/commands/connector.js.map +1 -0
- package/dist/bin/commands/dashboard-memory.js +243 -0
- package/dist/bin/commands/dashboard-memory.js.map +1 -0
- package/dist/bin/commands/dashboard.js +5 -0
- package/dist/bin/commands/dashboard.js.map +1 -1
- package/dist/bin/commands/dispatch-helpers.js +17 -0
- package/dist/bin/commands/dispatch-helpers.js.map +1 -0
- package/dist/bin/commands/dispatch.js +8 -3
- package/dist/bin/commands/dispatch.js.map +1 -1
- package/dist/bin/commands/doctor.js +34 -8
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/reminders.js +105 -0
- package/dist/bin/commands/reminders.js.map +1 -0
- package/dist/bin/postinstall.js +26 -0
- package/dist/bin/postinstall.js.map +1 -1
- package/dist/server.js +71 -9
- package/dist/server.js.map +1 -1
- package/dist/src/agent/events.js +58 -30
- package/dist/src/agent/events.js.map +1 -1
- package/dist/src/agent/spawn.js +20 -3
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/agent/tool-timeout.js +27 -0
- package/dist/src/agent/tool-timeout.js.map +1 -0
- package/dist/src/agent/watchdog.js +20 -3
- package/dist/src/agent/watchdog.js.map +1 -1
- package/dist/src/browser/launch-policy.js +1 -1
- package/dist/src/browser/launch-policy.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-model.js +102 -19
- package/dist/src/browser/web-ai/chatgpt-model.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-response.js +30 -1
- package/dist/src/browser/web-ai/chatgpt-response.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt.js +55 -8
- package/dist/src/browser/web-ai/chatgpt.js.map +1 -1
- package/dist/src/browser/web-ai/diagnostics.js +1 -0
- package/dist/src/browser/web-ai/diagnostics.js.map +1 -1
- package/dist/src/browser/web-ai/gemini-live.js +24 -3
- package/dist/src/browser/web-ai/gemini-live.js.map +1 -1
- package/dist/src/browser/web-ai/interstitial.js +64 -0
- package/dist/src/browser/web-ai/interstitial.js.map +1 -0
- package/dist/src/browser/web-ai/session.js +12 -0
- package/dist/src/browser/web-ai/session.js.map +1 -1
- package/dist/src/browser/web-ai/watcher.js +25 -7
- package/dist/src/browser/web-ai/watcher.js.map +1 -1
- package/dist/src/cli/connector.js +60 -0
- package/dist/src/cli/connector.js.map +1 -0
- package/dist/src/cli/handlers-runtime.js +39 -0
- package/dist/src/cli/handlers-runtime.js.map +1 -1
- package/dist/src/cli/reminders.js +29 -0
- package/dist/src/cli/reminders.js.map +1 -0
- package/dist/src/core/cli-detect.js +161 -0
- package/dist/src/core/cli-detect.js.map +1 -0
- package/dist/src/core/config.js +9 -22
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +14 -1
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/settings-merge.js +2 -2
- package/dist/src/core/settings-merge.js.map +1 -1
- package/dist/src/jaw-ceo/completion.js +101 -0
- package/dist/src/jaw-ceo/completion.js.map +1 -0
- package/dist/src/jaw-ceo/confirmations.js +39 -0
- package/dist/src/jaw-ceo/confirmations.js.map +1 -0
- package/dist/src/jaw-ceo/coordinator-admin.js +295 -0
- package/dist/src/jaw-ceo/coordinator-admin.js.map +1 -0
- package/dist/src/jaw-ceo/coordinator-completions.js +201 -0
- package/dist/src/jaw-ceo/coordinator-completions.js.map +1 -0
- package/dist/src/jaw-ceo/coordinator-realtime-tools.js +108 -0
- package/dist/src/jaw-ceo/coordinator-realtime-tools.js.map +1 -0
- package/dist/src/jaw-ceo/coordinator-types.js +2 -0
- package/dist/src/jaw-ceo/coordinator-types.js.map +1 -0
- package/dist/src/jaw-ceo/coordinator-utils.js +86 -0
- package/dist/src/jaw-ceo/coordinator-utils.js.map +1 -0
- package/dist/src/jaw-ceo/coordinator-workers.js +234 -0
- package/dist/src/jaw-ceo/coordinator-workers.js.map +1 -0
- package/dist/src/jaw-ceo/coordinator.js +116 -0
- package/dist/src/jaw-ceo/coordinator.js.map +1 -0
- package/dist/src/jaw-ceo/docs-edit.js +142 -0
- package/dist/src/jaw-ceo/docs-edit.js.map +1 -0
- package/dist/src/jaw-ceo/openai-key.js +22 -0
- package/dist/src/jaw-ceo/openai-key.js.map +1 -0
- package/dist/src/jaw-ceo/policy.js +92 -0
- package/dist/src/jaw-ceo/policy.js.map +1 -0
- package/dist/src/jaw-ceo/realtime-sideband.js +372 -0
- package/dist/src/jaw-ceo/realtime-sideband.js.map +1 -0
- package/dist/src/jaw-ceo/store.js +206 -0
- package/dist/src/jaw-ceo/store.js.map +1 -0
- package/dist/src/jaw-ceo/transcript-persistence.js +28 -0
- package/dist/src/jaw-ceo/transcript-persistence.js.map +1 -0
- package/dist/src/jaw-ceo/types.js +2 -0
- package/dist/src/jaw-ceo/types.js.map +1 -0
- package/dist/src/manager/connector/audit-log.js +95 -0
- package/dist/src/manager/connector/audit-log.js.map +1 -0
- package/dist/src/manager/connector/routes.js +251 -0
- package/dist/src/manager/connector/routes.js.map +1 -0
- package/dist/src/manager/connector/types.js +2 -0
- package/dist/src/manager/connector/types.js.map +1 -0
- package/dist/src/manager/memory/embedding/hybrid-search.js +61 -0
- package/dist/src/manager/memory/embedding/hybrid-search.js.map +1 -0
- package/dist/src/manager/memory/embedding/index.js +6 -0
- package/dist/src/manager/memory/embedding/index.js.map +1 -0
- package/dist/src/manager/memory/embedding/provider.js +187 -0
- package/dist/src/manager/memory/embedding/provider.js.map +1 -0
- package/dist/src/manager/memory/embedding/state-machine.js +68 -0
- package/dist/src/manager/memory/embedding/state-machine.js.map +1 -0
- package/dist/src/manager/memory/embedding/sync.js +156 -0
- package/dist/src/manager/memory/embedding/sync.js.map +1 -0
- package/dist/src/manager/memory/embedding/vec-store.js +166 -0
- package/dist/src/manager/memory/embedding/vec-store.js.map +1 -0
- package/dist/src/manager/memory/federation.js +56 -0
- package/dist/src/manager/memory/federation.js.map +1 -0
- package/dist/src/manager/memory/index.js +5 -0
- package/dist/src/manager/memory/index.js.map +1 -0
- package/dist/src/manager/memory/instance-discovery.js +83 -0
- package/dist/src/manager/memory/instance-discovery.js.map +1 -0
- package/dist/src/manager/memory/result-rerank.js +28 -0
- package/dist/src/manager/memory/result-rerank.js.map +1 -0
- package/dist/src/manager/memory/types.js +2 -0
- package/dist/src/manager/memory/types.js.map +1 -0
- package/dist/src/manager/observability.js.map +1 -1
- package/dist/src/manager/process-verify.js +4 -1
- package/dist/src/manager/process-verify.js.map +1 -1
- package/dist/src/manager/registry.js +59 -1
- package/dist/src/manager/registry.js.map +1 -1
- package/dist/src/manager/reminders/api.js +16 -0
- package/dist/src/manager/reminders/api.js.map +1 -0
- package/dist/src/manager/reminders/dispatcher.js +40 -0
- package/dist/src/manager/reminders/dispatcher.js.map +1 -0
- package/dist/src/manager/reminders/due-time.js +16 -0
- package/dist/src/manager/reminders/due-time.js.map +1 -0
- package/dist/src/manager/reminders/instance-link.js +22 -0
- package/dist/src/manager/reminders/instance-link.js.map +1 -0
- package/dist/src/manager/reminders/routes.js +170 -0
- package/dist/src/manager/reminders/routes.js.map +1 -0
- package/dist/src/manager/reminders/scheduler.js +67 -0
- package/dist/src/manager/reminders/scheduler.js.map +1 -0
- package/dist/src/manager/reminders/store.js +311 -0
- package/dist/src/manager/reminders/store.js.map +1 -0
- package/dist/src/manager/routes/dashboard-memory.js +380 -0
- package/dist/src/manager/routes/dashboard-memory.js.map +1 -0
- package/dist/src/manager/server.js +209 -4
- package/dist/src/manager/server.js.map +1 -1
- package/dist/src/manager/worker-messages.js +60 -0
- package/dist/src/manager/worker-messages.js.map +1 -0
- package/dist/src/manager/workspace/routes.js +240 -0
- package/dist/src/manager/workspace/routes.js.map +1 -0
- package/dist/src/manager/workspace/store.js +369 -0
- package/dist/src/manager/workspace/store.js.map +1 -0
- package/dist/src/manager/workspace/types.js +5 -0
- package/dist/src/manager/workspace/types.js.map +1 -0
- package/dist/src/memory/indexing.js +38 -11
- package/dist/src/memory/indexing.js.map +1 -1
- package/dist/src/memory/shared.js +6 -0
- package/dist/src/memory/shared.js.map +1 -1
- package/dist/src/orchestrator/parser.js +3 -8
- package/dist/src/orchestrator/parser.js.map +1 -1
- package/dist/src/prompt/builder.js +35 -16
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/templates/a1-system.md +23 -1
- package/dist/src/reminders/jaw-reminders-bridge.js +313 -0
- package/dist/src/reminders/jaw-reminders-bridge.js.map +1 -0
- package/dist/src/reminders/types.js +7 -0
- package/dist/src/reminders/types.js.map +1 -0
- package/dist/src/routes/jaw-ceo.js +290 -0
- package/dist/src/routes/jaw-ceo.js.map +1 -0
- package/dist/src/routes/jaw-memory.js +37 -1
- package/dist/src/routes/jaw-memory.js.map +1 -1
- package/dist/src/routes/settings.js +47 -12
- package/dist/src/routes/settings.js.map +1 -1
- package/package.json +4 -1
- package/public/css/chat.css +90 -12
- package/public/css/diagram.css +9 -9
- package/public/css/modals.css +60 -1
- package/public/css/sidebar.css +18 -0
- package/public/dist/assets/{AdvancedExport-DJZ2VmBR.js → AdvancedExport-BAdZUC-6.js} +1 -1
- package/public/dist/assets/{Agent-CgpLT8IY.js → Agent-DNpehKB2.js} +1 -1
- package/public/dist/assets/{Browser-CrkiQoB8.js → Browser-BsdxDVgM.js} +1 -1
- package/public/dist/assets/{ChannelsDiscord-CVUC22D4.js → ChannelsDiscord-Dg_jto6l.js} +1 -1
- package/public/dist/assets/{ChannelsTelegram-DEatIQNM.js → ChannelsTelegram-DGyZfJGS.js} +1 -1
- package/public/dist/assets/DashboardEmbeddingSection-BYdGgqg7.js +2 -0
- package/public/dist/assets/{DashboardMeta-BKoxRc7i.js → DashboardMeta-CAH9ONTb.js} +1 -1
- package/public/dist/assets/{Display-DnNGV9Km.js → Display-DM_yvyKL.js} +1 -1
- package/public/dist/assets/{Employees-DZ2iJYKy.js → Employees-CuYuTy0R.js} +1 -1
- package/public/dist/assets/{HealthBadge-Cq2c7G9s.js → HealthBadge-Dtr-dDnw.js} +1 -1
- package/public/dist/assets/{Heartbeat-BML6eTXZ.js → Heartbeat-C-vq02MW.js} +1 -1
- package/public/dist/assets/{InlineWarn-BooBRm7o.js → InlineWarn-E64UaKFh.js} +1 -1
- package/public/dist/assets/{Mcp-BlEviQ3h.js → Mcp-Dlp2X7X7.js} +1 -1
- package/public/dist/assets/{Memory-BRyH80He.js → Memory-BPKWJDXK.js} +1 -1
- package/public/dist/assets/MilkdownWysiwygEditor-Ctww8i0L.js +160 -0
- package/public/dist/assets/{ModelProvider-DxyR7EL9.js → ModelProvider-Bd6vGkXT.js} +1 -1
- package/public/dist/assets/{Network-DDOOESh1.js → Network-Df1R2YcQ.js} +1 -1
- package/public/dist/assets/{Permissions-Br0eSbKb.js → Permissions-BKJ5K6EL.js} +1 -1
- package/public/dist/assets/{Permissions-QHkzStqQ.js → Permissions-CcWZoOVP.js} +1 -1
- package/public/dist/assets/{Profile-C79NKumk.js → Profile-DZ7xf1WZ.js} +1 -1
- package/public/dist/assets/{Prompts-BmiIDiXW.js → Prompts-Bh5DYt8e.js} +1 -1
- package/public/dist/assets/{SpeechKeys-B8304XJK.js → SpeechKeys-CQwtVxOP.js} +1 -1
- package/public/dist/assets/app-BxsIleo0.js +32 -0
- package/public/dist/assets/app-CB9n5A77.css +1 -0
- package/public/dist/assets/architecture-YZFGNWBL-BRI-0IaU.js +1 -0
- package/public/dist/assets/{architectureDiagram-Q4EWVU46-D0VjH4Hz.js → architectureDiagram-Q4EWVU46-z0JCgZrJ.js} +1 -1
- package/public/dist/assets/{blockDiagram-DXYQGD6D-CY4ROZPD.js → blockDiagram-DXYQGD6D-KaOz3aFS.js} +1 -1
- package/public/dist/assets/{c4Diagram-AHTNJAMY-CXSKBhA5.js → c4Diagram-AHTNJAMY-Bp2QLC-s.js} +1 -1
- package/public/dist/assets/channel-jLopKIgm.js +1 -0
- package/public/dist/assets/{chunk-2KRD3SAO-DKaML5Aw.js → chunk-2KRD3SAO-C8hJZPJu.js} +1 -1
- package/public/dist/assets/{chunk-336JU56O-CU3sZss9.js → chunk-336JU56O-CAt5aBOe.js} +1 -1
- package/public/dist/assets/chunk-426QAEUC-atJRhvKN.js +1 -0
- package/public/dist/assets/{chunk-4BX2VUAB-X0ZSlark.js → chunk-4BX2VUAB-Cm3KqBkS.js} +1 -1
- package/public/dist/assets/{chunk-4TB4RGXK-DxI0GIVy.js → chunk-4TB4RGXK-BD7UhIN8.js} +1 -1
- package/public/dist/assets/chunk-55IACEB6-CAWcPDdr.js +1 -0
- package/public/dist/assets/{chunk-5FUZZQ4R-BqlA0aLQ.js → chunk-5FUZZQ4R-Cg1pzs6p.js} +1 -1
- package/public/dist/assets/{chunk-5PVQY5BW-BVW1DG4s.js → chunk-5PVQY5BW-otv3HwE_.js} +1 -1
- package/public/dist/assets/{chunk-67CJDMHE-Blm2TZ-J.js → chunk-67CJDMHE-AU2iOKLT.js} +1 -1
- package/public/dist/assets/{chunk-7N4EOEYR-BoIOnnji.js → chunk-7N4EOEYR-BTIS4jBw.js} +1 -1
- package/public/dist/assets/{chunk-AA7GKIK3-Dsfi7oEW.js → chunk-AA7GKIK3-c9UUJO_T.js} +1 -1
- package/public/dist/assets/{chunk-BSJP7CBP-DMGz9IOn.js → chunk-BSJP7CBP-DnSYKjii.js} +1 -1
- package/public/dist/assets/{chunk-CIAEETIT-T5_zEp7h.js → chunk-CIAEETIT-Dwbln6rM.js} +1 -1
- package/public/dist/assets/{chunk-EDXVE4YY-DjfvQwok.js → chunk-EDXVE4YY-COudQKkJ.js} +1 -1
- package/public/dist/assets/{chunk-ENJZ2VHE-LawplD1x.js → chunk-ENJZ2VHE-PT_jAckw.js} +1 -1
- package/public/dist/assets/{chunk-FMBD7UC4-C7tckXtF.js → chunk-FMBD7UC4-6yXYicjw.js} +1 -1
- package/public/dist/assets/{chunk-FOC6F5B3-xPGbUzqY.js → chunk-FOC6F5B3-BqDmFFeg.js} +1 -1
- package/public/dist/assets/{chunk-ICPOFSXX-Cdp_Bt1o.js → chunk-ICPOFSXX-P6V6jqiT.js} +2 -2
- package/public/dist/assets/{chunk-K5T4RW27-BwIFil23.js → chunk-K5T4RW27-C42sOmZR.js} +1 -1
- package/public/dist/assets/{chunk-KGLVRYIC-BsNQ1OkZ.js → chunk-KGLVRYIC-K-BVa8b2.js} +1 -1
- package/public/dist/assets/{chunk-LIHQZDEY-DbaX7k3n.js → chunk-LIHQZDEY-Xw9ZX8of.js} +1 -1
- package/public/dist/assets/{chunk-ORNJ4GCN-C6D0ZHHr.js → chunk-ORNJ4GCN-CEXU6WaD.js} +1 -1
- package/public/dist/assets/{chunk-OYMX7WX6-C1WV9uUT.js → chunk-OYMX7WX6-DmJG2z1S.js} +1 -1
- package/public/dist/assets/chunk-QZHKN3VN-BkVLii_3.js +1 -0
- package/public/dist/assets/{chunk-U2HBQHQK-B-5yzlzA.js → chunk-U2HBQHQK-Ny6UwUgK.js} +1 -1
- package/public/dist/assets/{chunk-X2U36JSP-yL0Tpsl1.js → chunk-X2U36JSP-CoMFMVNF.js} +1 -1
- package/public/dist/assets/{chunk-XPW4576I-CeaUaSCU.js → chunk-XPW4576I-CmAz5C-j.js} +1 -1
- package/public/dist/assets/{chunk-YZCP3GAM-CASMOrQq.js → chunk-YZCP3GAM-c7FYtZME.js} +1 -1
- package/public/dist/assets/{chunk-ZZ45TVLE-B4c7TOr9.js → chunk-ZZ45TVLE-D5oxCC1O.js} +1 -1
- package/public/dist/assets/classDiagram-6PBFFD2Q-BgOyAynm.js +1 -0
- package/public/dist/assets/classDiagram-v2-HSJHXN6E-5gBdoVH9.js +1 -0
- package/public/dist/assets/{cose-bilkent-S5V4N54A-B21AcnwY.js → cose-bilkent-S5V4N54A-CvH6qY_r.js} +1 -1
- package/public/dist/assets/{dagre-DzTKkA3a.js → dagre--20B2-ZQ.js} +1 -1
- package/public/dist/assets/{dagre-KV5264BT-fAyzMxIJ.js → dagre-KV5264BT-CQ0wo0ma.js} +1 -1
- package/public/dist/assets/{diagram-5BDNPKRD-O30SB9_x.js → diagram-5BDNPKRD-Cl4PzCD0.js} +1 -1
- package/public/dist/assets/{diagram-G4DWMVQ6-DZ1S54sq.js → diagram-G4DWMVQ6-_aP6kMTh.js} +1 -1
- package/public/dist/assets/{diagram-MMDJMWI5-DRO_GSWW.js → diagram-MMDJMWI5-J1l6Q0JG.js} +1 -1
- package/public/dist/assets/{diagram-TYMM5635-BxWgQj5r.js → diagram-TYMM5635-B_Xoa1Gp.js} +1 -1
- package/public/dist/assets/{dist-W51oDoeA.js → dist-2oDfqE98.js} +1 -1
- package/public/dist/assets/{dist-BZosRD2u.js → dist-55MYVjjj.js} +1 -1
- package/public/dist/assets/dist-B1p80u1b.js +1 -0
- package/public/dist/assets/{dist-Bd9PlnQm.js → dist-B1rKu9eP.js} +1 -1
- package/public/dist/assets/{dist-Ch5VAlV9.js → dist-B6G8pbap.js} +1 -1
- package/public/dist/assets/{dist-CpUK8ypo.js → dist-BA7sRne4.js} +1 -1
- package/public/dist/assets/{dist-eU7TyC86.js → dist-BDMNMdPF.js} +1 -1
- package/public/dist/assets/{dist-DFYRUAjN.js → dist-BGzHP3f8.js} +1 -1
- package/public/dist/assets/dist-BKyzWv22.js +1 -0
- package/public/dist/assets/{dist-BNfXO3Yr.js → dist-BTp_Oy_x.js} +1 -1
- package/public/dist/assets/{dist-BD0UXfgF2.js → dist-BhzKO6nt2.js} +1 -1
- package/public/dist/assets/{dist-BUnPYbK3.js → dist-BjqyutOM.js} +1 -1
- package/public/dist/assets/dist-BoG5I6U5.js +1 -0
- package/public/dist/assets/{dist-yHP6L0Ty.js → dist-BuaQLcgQ.js} +1 -1
- package/public/dist/assets/{dist-DZsFVYF4.js → dist-C0sOT_UM.js} +5 -5
- package/public/dist/assets/{dist-CIuXW-sc.js → dist-C5S-Rbvc.js} +1 -1
- package/public/dist/assets/{dist-Db16ogVk.js → dist-C9LWf2uC.js} +1 -1
- package/public/dist/assets/{dist-urPTQzXL.js → dist-CCKktDoF.js} +1 -1
- package/public/dist/assets/{dist-D7bCuS3f.js → dist-CEDX2HGI.js} +1 -1
- package/public/dist/assets/dist-Ch6JG5jE.js +23 -0
- package/public/dist/assets/{dist-SU-YTAIg.js → dist-CkMC2PPt.js} +1 -1
- package/public/dist/assets/dist-CxJpXP6s.js +1 -0
- package/public/dist/assets/dist-DNLFuTrS.js +1 -0
- package/public/dist/assets/{dist-CL4PTYWf.js → dist-DdhWu7OM.js} +1 -1
- package/public/dist/assets/{dist-D6cUXP7K.js → dist-G7QUHtDS.js} +1 -1
- package/public/dist/assets/{dist-UYn7T-GH.js → dist-W7IGn2ug.js} +1 -1
- package/public/dist/assets/{dist-Cp42cMcI.js → dist-wdLr2dSH.js} +1 -1
- package/public/dist/assets/{dockerfile-zC7EsydA.js → dockerfile-CrC2HXHP.js} +1 -1
- package/public/dist/assets/employees-CIkIyvtL.js +33 -0
- package/public/dist/assets/{erDiagram-SMLLAGMA-oYlCN-2d.js → erDiagram-SMLLAGMA-BvtqhMsS.js} +1 -1
- package/public/dist/assets/{error-normalize-5n-zlEQ3.js → error-normalize-CkhPeQYx.js} +1 -1
- package/public/dist/assets/esm-BmJkIat2.js +4 -0
- package/public/dist/assets/{factor-DSufIRGh.js → factor-1CttFx2G.js} +1 -1
- package/public/dist/assets/{fields-BtncIZYA.js → fields-BISouxp2.js} +1 -1
- package/public/dist/assets/{flowDiagram-DWJPFMVM-er6Wfb34.js → flowDiagram-DWJPFMVM-C_F0rqqT.js} +1 -1
- package/public/dist/assets/{ganttDiagram-T4ZO3ILL-Co2j1qn3.js → ganttDiagram-T4ZO3ILL-B5S8EZRg.js} +1 -1
- package/public/dist/assets/gitGraph-7Q5UKJZL-DTTW6pxr.js +1 -0
- package/public/dist/assets/{gitGraphDiagram-UUTBAWPF-clYndUgV.js → gitGraphDiagram-UUTBAWPF-DMGzYJeb.js} +1 -1
- package/public/dist/assets/{graphlib-BjOif-SH.js → graphlib-CZk_Ii16.js} +1 -1
- package/public/dist/assets/idb-cache-BnZfG5FD.js +1 -0
- package/public/dist/assets/info-OMHHGYJF-BU-iuaSm.js +1 -0
- package/public/dist/assets/{infoDiagram-42DDH7IO-uYs7OoSA.js → infoDiagram-42DDH7IO-dzSaYFFK.js} +1 -1
- package/public/dist/assets/{ishikawaDiagram-UXIWVN3A-32bIEtCb.js → ishikawaDiagram-UXIWVN3A-DZW-Nqsf.js} +1 -1
- package/public/dist/assets/javascript-BhB45e0W.js +1 -0
- package/public/dist/assets/{journeyDiagram-VCZTEJTY-hBNsU7mK.js → journeyDiagram-VCZTEJTY-ByVRJxVF.js} +1 -1
- package/public/dist/assets/{kanban-definition-6JOO6SKY-DoepMHBI.js → kanban-definition-6JOO6SKY-xwN0YCW2.js} +1 -1
- package/public/dist/assets/katex-DamPUmTE.js +1 -0
- package/public/dist/assets/manager-B84u-pcn.js +25 -0
- package/public/dist/assets/manager-DMg_sTEP.css +1 -0
- package/public/dist/assets/memory-BV62wlsG.js +1 -0
- package/public/dist/assets/{memory-dJGp6QBv.js → memory-CnBc2_Va.js} +1 -1
- package/public/dist/assets/mermaid-loader-DxFGz4EE.js +1 -0
- package/public/dist/assets/{mermaid-parser.core-CrXy-45O.js → mermaid-parser.core-CMIZ0my_.js} +1 -1
- package/public/dist/assets/mermaid-preprocess-p7OIpOon.js +5 -0
- package/public/dist/assets/mermaid.core-CicVBD9l.js +1 -0
- package/public/dist/assets/{mermaid.core-DYApH8sc.js → mermaid.core-Dj6viEzN.js} +2 -2
- package/public/dist/assets/{mindmap-definition-QFDTVHPH-C-QWWjaf.js → mindmap-definition-QFDTVHPH-Chqgsh1N.js} +1 -1
- package/public/dist/assets/{nsis-DLskXEqR.js → nsis-_CjIiUyF.js} +1 -1
- package/public/dist/assets/packet-4T2RLAQJ-DzmBsAf0.js +1 -0
- package/public/dist/assets/{page-shell-D5tbivHH.js → page-shell-CTxVDJ8Y.js} +1 -1
- package/public/dist/assets/pie-ZZUOXDRM-DyG1KzTn.js +1 -0
- package/public/dist/assets/{pieDiagram-DEJITSTG-DvMWxH5R.js → pieDiagram-DEJITSTG-DJLiSymi.js} +1 -1
- package/public/dist/assets/{pug-B2rz0Rz1.js → pug-CbR8lCtK.js} +1 -1
- package/public/dist/assets/{quadrantDiagram-34T5L4WZ-DjoQDyzO.js → quadrantDiagram-34T5L4WZ-qcnWmcRr.js} +1 -1
- package/public/dist/assets/radar-PYXPWWZC-CEBZARUu.js +1 -0
- package/public/dist/assets/render-lpTpN1El.js +28 -0
- package/public/dist/assets/{requirementDiagram-MS252O5E-sQav3xIA.js → requirementDiagram-MS252O5E-wnPtv0LG.js} +1 -1
- package/public/dist/assets/{sankeyDiagram-XADWPNL6-DkdEFMeo.js → sankeyDiagram-XADWPNL6-Bn3pUd_K.js} +1 -1
- package/public/dist/assets/{sequenceDiagram-FGHM5R23-kaplo282.js → sequenceDiagram-FGHM5R23-DfxcHSdj.js} +1 -1
- package/public/dist/assets/settings-CfAXLa8a.js +1 -0
- package/public/dist/assets/{settings-C7QWaUHB.js → settings-FWgmcubl.js} +8 -8
- package/public/dist/assets/sidebar-Cwt0FxQl.js +14 -0
- package/public/dist/assets/skills-D-qUVJ-e.js +1 -0
- package/public/dist/assets/{skills-CHkTgM7L.js → skills-DDmTyywh.js} +2 -2
- package/public/dist/assets/slash-commands-BfI19vIz.js +1 -0
- package/public/dist/assets/{slash-commands-2ThyUGvX.js → slash-commands-D5y5AVvS.js} +1 -1
- package/public/dist/assets/{stateDiagram-FHFEXIEX-B2L3h2aE.js → stateDiagram-FHFEXIEX-CiR7P2OG.js} +1 -1
- package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-BaWWpysK.js +1 -0
- package/public/dist/assets/{timeline-definition-GMOUNBTQ-_Nnp2LU-.js → timeline-definition-GMOUNBTQ-DUz1-iOx.js} +1 -1
- package/public/dist/assets/{trace-drawer-Dis80M6X.js → trace-drawer-DVF5F1df.js} +1 -1
- package/public/dist/assets/treeView-SZITEDCU-D5-TP7Qp.js +1 -0
- package/public/dist/assets/treemap-W4RFUUIX-BQhm_ZSp.js +1 -0
- package/public/dist/assets/ui-BJXY16Dk.js +140 -0
- package/public/dist/assets/ui-BXm3OPPh.js +1 -0
- package/public/dist/assets/{vendor-render-984tPmpy.js → vendor-render-DEStnpJ8.js} +22 -22
- package/public/dist/assets/{vennDiagram-DHZGUBPP-vNU8EDoW.js → vennDiagram-DHZGUBPP-CYu7SDdG.js} +1 -1
- package/public/dist/assets/wardley-RL74JXVD-CpnBMRe0.js +1 -0
- package/public/dist/assets/{wardleyDiagram-NUSXRM2D-DB2wK0zr.js → wardleyDiagram-NUSXRM2D-CLAhOzap.js} +1 -1
- package/public/dist/assets/wiki-link-suggestions-LQuYT22G.js +23 -0
- package/public/dist/assets/{xychartDiagram-5P7HB3ND-CisgDiJM.js → xychartDiagram-5P7HB3ND-DLnY9i8z.js} +1 -1
- package/public/dist/index.html +36 -12
- package/public/dist/manager/index.html +2 -2
- package/public/index.html +34 -10
- package/public/js/features/chat-messages.ts +132 -0
- package/public/js/features/chat-scroll.ts +226 -0
- package/public/js/features/employees.ts +4 -1
- package/public/js/features/help-content.ts +11 -1
- package/public/js/features/help-dialog.ts +78 -17
- package/public/js/features/message-actions.ts +157 -0
- package/public/js/features/message-history.ts +138 -0
- package/public/js/features/message-item-html.ts +34 -0
- package/public/js/features/preview-shortcut-bridge.ts +29 -0
- package/public/js/features/process-block-dom.ts +175 -0
- package/public/js/features/process-log-adapter.ts +104 -0
- package/public/js/features/settings-cli-status.ts +52 -1
- package/public/js/features/settings.ts +1 -0
- package/public/js/features/sidebar.ts +7 -1
- package/public/js/features/ui-status.ts +47 -0
- package/public/js/main.ts +10 -3
- package/public/js/render/code-copy.ts +47 -0
- package/public/js/render/delegations.ts +10 -0
- package/public/js/render/file-links.ts +150 -0
- package/public/js/render/highlight.ts +83 -0
- package/public/js/render/html.ts +26 -0
- package/public/js/render/markdown.ts +84 -0
- package/public/js/render/math.ts +76 -0
- package/public/js/render/mermaid-preprocess.ts +77 -0
- package/public/js/render/mermaid.ts +267 -0
- package/public/js/render/post-render.ts +35 -0
- package/public/js/render/sanitize.ts +51 -0
- package/public/js/render/svg-actions.ts +291 -0
- package/public/js/render.ts +17 -1081
- package/public/js/ui.ts +23 -841
- package/public/js/virtual-scroll-bootstrap.ts +18 -5
- package/public/js/virtual-scroll.ts +17 -0
- package/public/js/ws.ts +5 -0
- package/public/locales/en.json +76 -1
- package/public/locales/ja.json +74 -1
- package/public/locales/ko.json +76 -1
- package/public/locales/zh.json +74 -1
- package/public/manager/src/App.tsx +143 -258
- package/public/manager/src/AppChrome.tsx +144 -0
- package/public/manager/src/InstancePreview.tsx +18 -0
- package/public/manager/src/SidebarRailRouter.tsx +229 -0
- package/public/manager/src/components/ActivityTimeline.tsx +9 -1
- package/public/manager/src/components/ProcessControlPanel.tsx +3 -0
- package/public/manager/src/components/SidebarRail.tsx +22 -0
- package/public/manager/src/components/Workbench.tsx +17 -13
- package/public/manager/src/components/WorkbenchHeader.tsx +44 -33
- package/public/manager/src/components/WorkspaceLayout.tsx +3 -0
- package/public/manager/src/dashboard-board/DashboardBoardSidebar.tsx +1 -1
- package/public/manager/src/dashboard-board/DashboardBoardWorkspace.tsx +6 -0
- package/public/manager/src/dashboard-features.ts +4 -1
- package/public/manager/src/dashboard-reminders/DashboardRemindersSidebar.tsx +157 -0
- package/public/manager/src/dashboard-reminders/DashboardRemindersWorkspace.tsx +502 -0
- package/public/manager/src/dashboard-reminders/InlineReminderTitle.tsx +78 -0
- package/public/manager/src/dashboard-reminders/ReminderDetailPopover.tsx +118 -0
- package/public/manager/src/dashboard-reminders/reminder-order.ts +45 -0
- package/public/manager/src/dashboard-reminders/reminders-api.ts +126 -0
- package/public/manager/src/dashboard-reminders/reminders-view-model.ts +63 -0
- package/public/manager/src/dashboard-reminders/useDashboardReminderDrag.ts +55 -0
- package/public/manager/src/dashboard-reminders/useRemindersFeed.ts +72 -0
- package/public/manager/src/dashboard-schedule/DashboardScheduleWorkspace.tsx +10 -4
- package/public/manager/src/dashboard-settings/DashboardEmbeddingSection.tsx +350 -0
- package/public/manager/src/dashboard-settings/DashboardSettingsSidebar.tsx +6 -2
- package/public/manager/src/dashboard-settings/DashboardSettingsWorkspace.tsx +217 -6
- package/public/manager/src/dashboard-settings/dashboard-settings-ui.ts +2 -0
- package/public/manager/src/dashboard-url-state.ts +15 -0
- package/public/manager/src/help/HelpDrawer.tsx +5 -6
- package/public/manager/src/help/HelpTopicButton.tsx +23 -0
- package/public/manager/src/help/help-shortcuts.ts +7 -0
- package/public/manager/src/help/helpContent.tsx +155 -5
- package/public/manager/src/hooks/useDashboardView.ts +12 -1
- package/public/manager/src/hooks/useInstanceMessageEvents.ts +3 -1
- package/public/manager/src/jaw-ceo/JawCeoConsole.tsx +108 -0
- package/public/manager/src/jaw-ceo/JawCeoConsolePanels.tsx +331 -0
- package/public/manager/src/jaw-ceo/JawCeoSettingsPanel.tsx +94 -0
- package/public/manager/src/jaw-ceo/JawCeoTabs.tsx +28 -0
- package/public/manager/src/jaw-ceo/JawCeoVoiceOverlay.tsx +34 -0
- package/public/manager/src/jaw-ceo/JawCeoWorkbenchButton.tsx +61 -0
- package/public/manager/src/jaw-ceo/api.ts +169 -0
- package/public/manager/src/jaw-ceo/jaw-ceo-console.css +481 -0
- package/public/manager/src/jaw-ceo/jaw-ceo-virtual.css +24 -0
- package/public/manager/src/jaw-ceo/jaw-ceo.css +429 -0
- package/public/manager/src/jaw-ceo/types.ts +164 -0
- package/public/manager/src/jaw-ceo/useJawCeo.ts +235 -0
- package/public/manager/src/jaw-ceo/useJawCeoConsoleModel.ts +67 -0
- package/public/manager/src/jaw-ceo/useJawCeoDashboardBridge.tsx +76 -0
- package/public/manager/src/jaw-ceo/useJawCeoVirtualTimeline.ts +109 -0
- package/public/manager/src/jaw-ceo/useJawCeoVoice.ts +219 -0
- package/public/manager/src/jaw-ceo/voice-cues.ts +34 -0
- package/public/manager/src/jaw-ceo/voice-session.ts +87 -0
- package/public/manager/src/main.tsx +10 -0
- package/public/manager/src/manager-components.css +7 -0
- package/public/manager/src/manager-dashboard-board-sidebar-scroll.css +64 -0
- package/public/manager/src/manager-dashboard-reminders-parity.css +156 -0
- package/public/manager/src/manager-dashboard-reminders-priority.css +164 -0
- package/public/manager/src/manager-dashboard-reminders.css +482 -0
- package/public/manager/src/manager-dashboard-schedule.css +12 -0
- package/public/manager/src/manager-dashboard-settings.css +16 -2
- package/public/manager/src/manager-help.css +27 -0
- package/public/manager/src/manager-layout.css +19 -0
- package/public/manager/src/manager-notes.css +13 -4
- package/public/manager/src/manager-p0-1-1.css +3 -3
- package/public/manager/src/manager-polish.css +7 -3
- package/public/manager/src/manager-shortcuts.ts +116 -0
- package/public/manager/src/notes/MarkdownEditor.tsx +20 -3
- package/public/manager/src/notes/MarkdownPreview.tsx +10 -1
- package/public/manager/src/notes/NotesFrontmatterStrip.tsx +61 -0
- package/public/manager/src/notes/NotesQuickSwitcher.tsx +187 -0
- package/public/manager/src/notes/NotesSidebar.tsx +36 -14
- package/public/manager/src/notes/NotesWorkspace.tsx +63 -4
- package/public/manager/src/notes/frontmatter-preview.ts +16 -0
- package/public/manager/src/notes/notes-quick-switcher.css +151 -0
- package/public/manager/src/notes/notes-tags.css +292 -0
- package/public/manager/src/notes/notes-types.ts +4 -0
- package/public/manager/src/notes/rendering/MarkdownRenderer.tsx +67 -3
- package/public/manager/src/notes/rendering/MermaidBlock.tsx +11 -1
- package/public/manager/src/notes/useNoteDocument.ts +14 -2
- package/public/manager/src/notes/useNotesModel.ts +39 -2
- package/public/manager/src/notes/wiki-link-codemirror-completion.ts +55 -0
- package/public/manager/src/notes/wiki-link-rendering.ts +129 -0
- package/public/manager/src/notes/wiki-link-resolver.ts +220 -0
- package/public/manager/src/notes/wiki-link-suggestions.ts +153 -0
- package/public/manager/src/notes/wysiwyg/MilkdownWysiwygEditor.tsx +126 -79
- package/public/manager/src/notes/wysiwyg/WysiwygFrontmatterPanel.tsx +93 -0
- package/public/manager/src/notes/wysiwyg/milkdown-code-block-view.ts +11 -0
- package/public/manager/src/notes/wysiwyg/milkdown-editor-utils.ts +32 -0
- package/public/manager/src/notes/wysiwyg/milkdown-math.ts +9 -0
- package/public/manager/src/notes/wysiwyg/milkdown-wikilink-completion.ts +195 -0
- package/public/manager/src/notes/wysiwyg/milkdown-wikilink-plugin.ts +152 -0
- package/public/manager/src/notes/wysiwyg/milkdown-wysiwyg-types.ts +13 -0
- package/public/manager/src/notes/wysiwyg/wysiwyg-fixtures.ts +4 -0
- package/public/manager/src/notes/wysiwyg/wysiwyg-frontmatter.ts +155 -0
- package/public/manager/src/settings/pages/Embedding.tsx +382 -0
- package/public/manager/src/settings-embedding.css +168 -0
- package/public/manager/src/types.ts +12 -2
- package/scripts/install-officecli.sh +3 -1
- package/scripts/install-wsl.sh +65 -11
- package/public/dist/assets/MilkdownWysiwygEditor-DIebNZF7.js +0 -52
- package/public/dist/assets/app-CphocJzo.css +0 -1
- package/public/dist/assets/app-DJ8ys0j5.js +0 -32
- package/public/dist/assets/architecture-YZFGNWBL-VpdnYwVC.js +0 -1
- package/public/dist/assets/channel-xhp7drfS.js +0 -1
- package/public/dist/assets/chunk-426QAEUC-DadS7Aoc.js +0 -1
- package/public/dist/assets/chunk-55IACEB6-Cr281urY.js +0 -1
- package/public/dist/assets/chunk-QZHKN3VN-BYRU3VjK.js +0 -1
- package/public/dist/assets/classDiagram-6PBFFD2Q-Brk35lpl.js +0 -1
- package/public/dist/assets/classDiagram-v2-HSJHXN6E-CVZHK0Hg.js +0 -1
- package/public/dist/assets/dist-BsT5UdNP.js +0 -1
- package/public/dist/assets/dist-ClqO40BE.js +0 -1
- package/public/dist/assets/dist-CxeLAw2Y.js +0 -1
- package/public/dist/assets/dist-D2SH8nxa.js +0 -1
- package/public/dist/assets/dist-DfodGES_.js +0 -23
- package/public/dist/assets/dist-l9HH00ip.js +0 -1
- package/public/dist/assets/employees-RJ_wRL09.js +0 -33
- package/public/dist/assets/gitGraph-7Q5UKJZL-CBKRRUZJ.js +0 -1
- package/public/dist/assets/idb-cache-C5ilDI6r.js +0 -1
- package/public/dist/assets/info-OMHHGYJF-BqzRlF_E.js +0 -1
- package/public/dist/assets/insert-image-markdown-kk053MvN.js +0 -22
- package/public/dist/assets/javascript-DT-6B2IU.js +0 -1
- package/public/dist/assets/katex-CS4w7U2j.js +0 -1
- package/public/dist/assets/manager-DAe38I94.js +0 -25
- package/public/dist/assets/manager-fQR46YFa.css +0 -1
- package/public/dist/assets/memory-w3yQettQ.js +0 -1
- package/public/dist/assets/mermaid-loader-BEFIOoJn.js +0 -1
- package/public/dist/assets/mermaid.core-D0tXHgVC.js +0 -1
- package/public/dist/assets/packet-4T2RLAQJ-D7VqJs5z.js +0 -1
- package/public/dist/assets/pie-ZZUOXDRM-FbISwuBg.js +0 -1
- package/public/dist/assets/radar-PYXPWWZC-CLzM3m4R.js +0 -1
- package/public/dist/assets/render-KVGsbWj1.js +0 -31
- package/public/dist/assets/settings-DmUCo6lz.js +0 -1
- package/public/dist/assets/skills-SxG_nfwn.js +0 -1
- package/public/dist/assets/slash-commands-BxJkKdhB.js +0 -1
- package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-DScAhoyh.js +0 -1
- package/public/dist/assets/treeView-SZITEDCU-HJajkeQK.js +0 -1
- package/public/dist/assets/treemap-W4RFUUIX-CsRQ896G.js +0 -1
- package/public/dist/assets/ui-LhD1VfQs.js +0 -1
- package/public/dist/assets/ui-kS1ZJfez.js +0 -143
- package/public/dist/assets/wardley-RL74JXVD-DMQFnlJp.js +0 -1
- package/public/dist/assets/ws-DVE3eWRj.js +0 -14
- /package/public/dist/assets/{agent-meta-DHddpWHQ.js → agent-meta-C1pQzExf.js} +0 -0
- /package/public/dist/assets/{apl-1H3fJ-n9.js → apl-HYRstREL.js} +0 -0
- /package/public/dist/assets/{asciiarmor-_1f4lqIZ.js → asciiarmor-BDXCrhAK.js} +0 -0
- /package/public/dist/assets/{asn1-B_wp1Pdt.js → asn1-CnSBhb0M.js} +0 -0
- /package/public/dist/assets/{asterisk-9Hxmlnbz.js → asterisk-AqV7rnIi.js} +0 -0
- /package/public/dist/assets/{brainfuck-C-PAVNT8.js → brainfuck-Dv46-iL9.js} +0 -0
- /package/public/dist/assets/{chunk-AGHRB4JF-EroDCcEL.js → chunk-AGHRB4JF-DIMn8T3_.js} +0 -0
- /package/public/dist/assets/{clike-DAVXDhrz.js → clike-GRffz5hY.js} +0 -0
- /package/public/dist/assets/{clojure-BIpQu4v4.js → clojure-DzgT_fqE.js} +0 -0
- /package/public/dist/assets/{cmake-YlOBEvgc.js → cmake-Co1237r5.js} +0 -0
- /package/public/dist/assets/{cobol-CU8lw6mH.js → cobol-rUaLketb.js} +0 -0
- /package/public/dist/assets/{coffeescript-DKG8mABL.js → coffeescript-DQyfHE86.js} +0 -0
- /package/public/dist/assets/{commonlisp-CbWboHR_.js → commonlisp-Buue1PGW.js} +0 -0
- /package/public/dist/assets/{constants-CYjOMbjf.js → constants-4A2GptQT.js} +0 -0
- /package/public/dist/assets/{crystal-WWs3Njra.js → crystal-BMWO0kOJ.js} +0 -0
- /package/public/dist/assets/{css-C9qNtc8P.js → css-DaxibPo5.js} +0 -0
- /package/public/dist/assets/{cypher-DglnWVZO.js → cypher-CmpGfiBR.js} +0 -0
- /package/public/dist/assets/{cytoscape.esm-BH6rhG9A.js → cytoscape.esm-zT8GwLFm.js} +0 -0
- /package/public/dist/assets/{d-DiNW6jcC.js → d-qmdtoIzU.js} +0 -0
- /package/public/dist/assets/{diff-PxsoX0eK.js → diff-B40m6u1h.js} +0 -0
- /package/public/dist/assets/{dist-BRFvH5ne.js → dist-BJyDhGpS.js} +0 -0
- /package/public/dist/assets/{dtd-BSiaE0hE.js → dtd-569ynYVj.js} +0 -0
- /package/public/dist/assets/{dylan-GcUJt0a5.js → dylan-Dxolp30i.js} +0 -0
- /package/public/dist/assets/{ebnf-DSIN9Ycp.js → ebnf-BZiX9Iq3.js} +0 -0
- /package/public/dist/assets/{ecl-LP9l5g0J.js → ecl-B8F1Q0oZ.js} +0 -0
- /package/public/dist/assets/{eiffel-CqpH5qaY.js → eiffel-Bv8Kvgh1.js} +0 -0
- /package/public/dist/assets/{elm-Dw3cJ7hz.js → elm-QWXQaIis.js} +0 -0
- /package/public/dist/assets/{erlang-DL9rpJep.js → erlang-CuDGzTGm.js} +0 -0
- /package/public/dist/assets/{fcl-DUmfTiJ7.js → fcl-BiFeqtHf.js} +0 -0
- /package/public/dist/assets/{forth-BSp-YOKj.js → forth-R7Uc2VcL.js} +0 -0
- /package/public/dist/assets/{fortran-BtIRmo6s.js → fortran-kDRG6BzW.js} +0 -0
- /package/public/dist/assets/{gas-okqIRy8I.js → gas-CyRkuC5T.js} +0 -0
- /package/public/dist/assets/{gherkin-DIlSAX9i.js → gherkin-BE0p00ey.js} +0 -0
- /package/public/dist/assets/{groovy-Dn6VQ7le.js → groovy-B_Sh3D1t.js} +0 -0
- /package/public/dist/assets/{haskell-DxXJRRAf.js → haskell-DWXgCy4o.js} +0 -0
- /package/public/dist/assets/{haxe-Cf0nItU4.js → haxe-xGxZ54Hv.js} +0 -0
- /package/public/dist/assets/{http-C3zQeWFV.js → http-CKv9cSBA.js} +0 -0
- /package/public/dist/assets/{idb-cache-CjnC_K0x.js → idb-cache-CZ3JdK8r.js} +0 -0
- /package/public/dist/assets/{idl-BvqkcZq5.js → idl-DmlI3XzS.js} +0 -0
- /package/public/dist/assets/{javascript-D1nkUbtD.js → javascript-j6r5uf_k.js} +0 -0
- /package/public/dist/assets/{jsx-runtime-DOs-BiPY.js → jsx-runtime-BjL7qHh8.js} +0 -0
- /package/public/dist/assets/{julia-CCUCEuMJ.js → julia-CQSp9Qa0.js} +0 -0
- /package/public/dist/assets/{livescript-DJ-6Zja2.js → livescript-CqvtVTlb.js} +0 -0
- /package/public/dist/assets/{locale-f397XJgr.js → locale-BHMJIzyw.js} +0 -0
- /package/public/dist/assets/{lua-CxE7YJaJ.js → lua-DazQKUZ0.js} +0 -0
- /package/public/dist/assets/{mathematica-oNEp3xtK.js → mathematica-DqhJVCs9.js} +0 -0
- /package/public/dist/assets/{mbox-AvjHxuWl.js → mbox-Dsyo1_UL.js} +0 -0
- /package/public/dist/assets/{mirc-CiJGiXcS.js → mirc-D7ThhoF-.js} +0 -0
- /package/public/dist/assets/{mllike-CV8oQtvy.js → mllike-EPZ6pqQD.js} +0 -0
- /package/public/dist/assets/{modelica-M4BAagfL.js → modelica-PU45hbqg.js} +0 -0
- /package/public/dist/assets/{mscgen-3QXoaqEl.js → mscgen-DEnh2Ojr.js} +0 -0
- /package/public/dist/assets/{mumps-BZoVj2VG.js → mumps-8GhR7rRa.js} +0 -0
- /package/public/dist/assets/{nginx-CBycrar_.js → nginx-CXwagpwp.js} +0 -0
- /package/public/dist/assets/{ntriples-BzBBWYSl.js → ntriples-BDQxxstw.js} +0 -0
- /package/public/dist/assets/{octave-BeIsGSMy.js → octave-2c90WnyU.js} +0 -0
- /package/public/dist/assets/{oz-DdNR63iD.js → oz-CO0rQ8EL.js} +0 -0
- /package/public/dist/assets/{pascal-BvmM4Y7z.js → pascal-CcVwOGeN.js} +0 -0
- /package/public/dist/assets/{path-utils-BuEEtj9w.js → path-utils-DySmCVZK.js} +0 -0
- /package/public/dist/assets/{perl-DFibaVbf.js → perl-B9UvGoAV.js} +0 -0
- /package/public/dist/assets/{pig-DyLcrln-.js → pig-Cd1f86ZJ.js} +0 -0
- /package/public/dist/assets/{powershell-CDOpEwhN.js → powershell-DV4cOnkJ.js} +0 -0
- /package/public/dist/assets/{preload-helper-CMqhPRCH.js → preload-helper-DuH3-WbD.js} +0 -0
- /package/public/dist/assets/{properties-Ju2yMwi3.js → properties-DaSVPhrZ.js} +0 -0
- /package/public/dist/assets/{protobuf-CfKx2SfO.js → protobuf-CEtFnY22.js} +0 -0
- /package/public/dist/assets/{puppet-dmjzqANu.js → puppet-Ca0DHfcW.js} +0 -0
- /package/public/dist/assets/{python-D9BZyYi1.js → python-ydzCwWG-.js} +0 -0
- /package/public/dist/assets/{q-C68SC4ma.js → q-Cl8kzQmk.js} +0 -0
- /package/public/dist/assets/{r-DP6KYC7N.js → r-DKZPJFrD.js} +0 -0
- /package/public/dist/assets/{rough.esm-BRGGwqOp.js → rough.esm-Dnk3WN4D.js} +0 -0
- /package/public/dist/assets/{rpm-DH2Z4z_v.js → rpm-D0lqeHoZ.js} +0 -0
- /package/public/dist/assets/{ruby-CwiqsW2a.js → ruby-RVmtmNDw.js} +0 -0
- /package/public/dist/assets/{sas-Btq5K1IU.js → sas-CEzodAB7.js} +0 -0
- /package/public/dist/assets/{scheme-BvG_RNGf.js → scheme-Pqmt6dh3.js} +0 -0
- /package/public/dist/assets/{settings-client-ajlwI-oK.js → settings-client-BN3XzwEo.js} +0 -0
- /package/public/dist/assets/{shell-waWIPbLL.js → shell-CLG3zy-u.js} +0 -0
- /package/public/dist/assets/{sieve-wIycBENd.js → sieve-C95IWC3O.js} +0 -0
- /package/public/dist/assets/{simple-mode-lHvrAolQ.js → simple-mode-B9ErAHMD.js} +0 -0
- /package/public/dist/assets/{smalltalk-SHoYQOtw.js → smalltalk-4cL-gRJb.js} +0 -0
- /package/public/dist/assets/{solr-D1Apesak.js → solr-CEA7oOx_.js} +0 -0
- /package/public/dist/assets/{sparql-BJozOrmN.js → sparql-w8kHjP6I.js} +0 -0
- /package/public/dist/assets/{spreadsheet-71jLW2fq.js → spreadsheet-C8bDfTgC.js} +0 -0
- /package/public/dist/assets/{sql-BaHU6gLz.js → sql-BrKz8968.js} +0 -0
- /package/public/dist/assets/{stex-BuVGLRtt.js → stex-xFw1nXeT.js} +0 -0
- /package/public/dist/assets/{stylus-Cqweyusm.js → stylus-gS_68vPk.js} +0 -0
- /package/public/dist/assets/{swift-Dx3m4XfV.js → swift-D5lXmY2d.js} +0 -0
- /package/public/dist/assets/{tcl-5yXjCZ8e.js → tcl-D-41REtC.js} +0 -0
- /package/public/dist/assets/{textile-9HVfsYV6.js → textile-D-Znao0j.js} +0 -0
- /package/public/dist/assets/{tiddlywiki-DlSf8L__.js → tiddlywiki-Co8lXJKd.js} +0 -0
- /package/public/dist/assets/{tiki-CDZRH0A4.js → tiki-DsiNRYMP.js} +0 -0
- /package/public/dist/assets/{toml-BgjfE0Y7.js → toml-CaVZGou4.js} +0 -0
- /package/public/dist/assets/{troff-B4ZrJIrZ.js → troff-DJvDVr-d.js} +0 -0
- /package/public/dist/assets/{ttcn-BJIiaYhP.js → ttcn-DAC92l4d.js} +0 -0
- /package/public/dist/assets/{ttcn-cfg-PZp_QKQg.js → ttcn-cfg-C0X-mYlr.js} +0 -0
- /package/public/dist/assets/{turtle--ft5y7IN.js → turtle-D6WHyCrL.js} +0 -0
- /package/public/dist/assets/{vb-DL6cecZs.js → vb-CEo_ccq3.js} +0 -0
- /package/public/dist/assets/{vbscript-Bb1xiv7E.js → vbscript-B_PKDV1v.js} +0 -0
- /package/public/dist/assets/{velocity-DKS9ZfbJ.js → velocity-ClKnKBLH.js} +0 -0
- /package/public/dist/assets/{vendor-utils-CWelFt6C.js → vendor-utils-IVTPs69f.js} +0 -0
- /package/public/dist/assets/{verilog-DSfhYFaT.js → verilog-Pnuspgw6.js} +0 -0
- /package/public/dist/assets/{vhdl-CFTSUmh9.js → vhdl-CZnyY4fs.js} +0 -0
- /package/public/dist/assets/{w3c-keyname-IiiZScED.js → w3c-keyname-DJlC6DTY.js} +0 -0
- /package/public/dist/assets/{webidl-C-IpKmuN.js → webidl-DHr762Dm.js} +0 -0
- /package/public/dist/assets/{xquery-9pXYEith.js → xquery-5-FiyUtN.js} +0 -0
- /package/public/dist/assets/{yacas-CqSYoSTv.js → yacas-GlqsXIeT.js} +0 -0
- /package/public/dist/assets/{z80-BltHQfm4.js → z80-CI7N40Oo.js} +0 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import type { Dispatch, ReactNode, SetStateAction } from 'react';
|
|
2
|
+
import { CommandBar } from './components/CommandBar';
|
|
3
|
+
import { CommandPalette } from './components/CommandPalette';
|
|
4
|
+
import { ManagerShell } from './components/ManagerShell';
|
|
5
|
+
import { HelpDrawer } from './help/HelpDrawer';
|
|
6
|
+
import { type HelpTopicId } from './help/helpContent';
|
|
7
|
+
import { SidebarRailRouter } from './SidebarRailRouter';
|
|
8
|
+
import { ElectronMetricsPanel } from './electron-metrics';
|
|
9
|
+
import { IframeBridge } from './sync/IframeBridge';
|
|
10
|
+
import { VisibilityBridge } from './sync/VisibilityBridge';
|
|
11
|
+
import { instanceLabel } from './instance-label';
|
|
12
|
+
import type { BoardView } from './dashboard-board/board-view';
|
|
13
|
+
import { type ScheduleGroup } from './dashboard-schedule/DashboardScheduleSidebar';
|
|
14
|
+
import { REMINDERS_WORKSPACE_ENABLED, SCHEDULE_WORKSPACE_ENABLED } from './dashboard-features';
|
|
15
|
+
import type { NotesModelState } from './notes/useNotesModel';
|
|
16
|
+
import type { NotesSidebarMode } from './notes/NotesSidebar';
|
|
17
|
+
import type { CommandPaletteApi } from './hooks/useCommandPalette';
|
|
18
|
+
import type { ThemeApi } from './hooks/useTheme';
|
|
19
|
+
import type { useDashboardView } from './hooks/useDashboardView';
|
|
20
|
+
import type { DashboardDetailTab, DashboardInstance, DashboardNotesAuthoringMode, DashboardNotesViewMode, DashboardScanResult, ManagerEvent, NoteMetadata } from './types';
|
|
21
|
+
|
|
22
|
+
type AppChromeProps = {
|
|
23
|
+
view: ReturnType<typeof useDashboardView>;
|
|
24
|
+
palette: CommandPaletteApi;
|
|
25
|
+
theme: ThemeApi;
|
|
26
|
+
query: string;
|
|
27
|
+
loading: boolean;
|
|
28
|
+
showHidden: boolean;
|
|
29
|
+
instances: DashboardInstance[];
|
|
30
|
+
selectedInstance: DashboardInstance | null;
|
|
31
|
+
data: DashboardScanResult | null;
|
|
32
|
+
summary: Record<string, number>;
|
|
33
|
+
scheduleGroup: ScheduleGroup;
|
|
34
|
+
boardView: BoardView;
|
|
35
|
+
notesModel: NotesModelState;
|
|
36
|
+
notesSelectedNote: NoteMetadata | null;
|
|
37
|
+
notesDirtyPath: string | null;
|
|
38
|
+
notesSidebarMode: NotesSidebarMode;
|
|
39
|
+
notesSearchFocusToken: number;
|
|
40
|
+
settingsSection: Parameters<typeof SidebarRailRouter>[0]['settingsSection'];
|
|
41
|
+
dashboardSettingsUi: Parameters<typeof SidebarRailRouter>[0]['dashboardSettingsUi'];
|
|
42
|
+
titleSupport: Parameters<typeof SidebarRailRouter>[0]['titleSupport'];
|
|
43
|
+
activityEvents: ManagerEvent[];
|
|
44
|
+
busyPorts: Set<number>;
|
|
45
|
+
titlesByPort: Record<number, string>;
|
|
46
|
+
lifecycleMessage: string | null;
|
|
47
|
+
error: string | null;
|
|
48
|
+
registryMessage: string | null;
|
|
49
|
+
workbenchHeader: ReactNode;
|
|
50
|
+
detailContent: (tab: DashboardDetailTab) => ReactNode;
|
|
51
|
+
instanceListContent: ReactNode;
|
|
52
|
+
drawerProfileFilters: ReactNode;
|
|
53
|
+
jawCeoWorkbenchButton?: ReactNode;
|
|
54
|
+
jawCeoVoiceOverlay?: ReactNode;
|
|
55
|
+
jawCeoConsoleContent?: ReactNode;
|
|
56
|
+
previewEnabled: boolean;
|
|
57
|
+
previewRefreshKey: number;
|
|
58
|
+
autoUnloadNotice: boolean;
|
|
59
|
+
helpOpen: boolean;
|
|
60
|
+
helpTopic: HelpTopicId | null;
|
|
61
|
+
setQuery: Dispatch<SetStateAction<string>>;
|
|
62
|
+
setShowHidden: Dispatch<SetStateAction<boolean>>;
|
|
63
|
+
setPreviewEnabled: Dispatch<SetStateAction<boolean>>;
|
|
64
|
+
setAutoUnloadNotice: Dispatch<SetStateAction<boolean>>;
|
|
65
|
+
setHelpOpen: Dispatch<SetStateAction<boolean>>;
|
|
66
|
+
setHelpTopic: Dispatch<SetStateAction<HelpTopicId | null>>;
|
|
67
|
+
onOpenHelpTopic: (topic: HelpTopicId) => void;
|
|
68
|
+
setNotesSidebarMode: Dispatch<SetStateAction<NotesSidebarMode>>;
|
|
69
|
+
setBoardView: Dispatch<SetStateAction<BoardView>>;
|
|
70
|
+
setScheduleGroup: Dispatch<SetStateAction<ScheduleGroup>>;
|
|
71
|
+
setDashboardSettingsSection: Dispatch<SetStateAction<Parameters<typeof SidebarRailRouter>[0]['settingsSection']>>;
|
|
72
|
+
load: (nextShowHidden?: boolean) => Promise<void>;
|
|
73
|
+
cycleTheme: () => void;
|
|
74
|
+
openSelectedInBrowser: () => void;
|
|
75
|
+
handleSelectInstance: (instance: DashboardInstance) => void;
|
|
76
|
+
handleSidebarModeChange: Parameters<typeof SidebarRailRouter>[0]['onSidebarModeChange'];
|
|
77
|
+
handleSidebarToggle: () => void;
|
|
78
|
+
handleNotesSelectedPathChange: (path: string | null) => void;
|
|
79
|
+
handleNotesViewModeChange: (mode: DashboardNotesViewMode) => void;
|
|
80
|
+
handleNotesAuthoringModeChange: (mode: DashboardNotesAuthoringMode) => void;
|
|
81
|
+
handleNotesWordWrapChange: (value: boolean) => void;
|
|
82
|
+
handleNotesTreeWidthChange: (value: number) => void;
|
|
83
|
+
openNotesSidebarSearch: () => void;
|
|
84
|
+
setNotesDirtyPath: Dispatch<SetStateAction<string | null>>;
|
|
85
|
+
handleTabChange: (tab: DashboardDetailTab) => void;
|
|
86
|
+
handleActivityToggle: () => void;
|
|
87
|
+
handleActivityHeight: (height: number) => void;
|
|
88
|
+
onDismissLifecycleMessage: () => void;
|
|
89
|
+
handleDashboardSettingsPatch: Parameters<typeof SidebarRailRouter>[0]['onDashboardSettingsPatch'];
|
|
90
|
+
activityUnreadOpenAndMarkSeen: () => void;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export function AppChrome(props: AppChromeProps) {
|
|
94
|
+
return (
|
|
95
|
+
<>
|
|
96
|
+
<IframeBridge />
|
|
97
|
+
<VisibilityBridge />
|
|
98
|
+
<ManagerShell
|
|
99
|
+
sidebarCollapsed={props.view.sidebarCollapsed}
|
|
100
|
+
commandBar={<CommandBar query={props.query} loading={props.loading} onQueryChange={props.setQuery} onRefresh={() => void props.load()} onOpenDrawer={() => props.view.setDrawerOpen(true)} theme={props.theme.theme} onThemeChange={props.theme.setTheme} onOpenPalette={props.palette.toggle} />}
|
|
101
|
+
workspace={(
|
|
102
|
+
<SidebarRailRouter sidebarCollapsed={props.view.sidebarCollapsed} activityDockCollapsed={props.view.activityDockCollapsed}
|
|
103
|
+
activityDockHeight={props.view.activityDockHeight} drawerOpen={props.view.drawerOpen} onCloseDrawer={() => props.view.setDrawerOpen(false)}
|
|
104
|
+
onlineCount={props.summary['online'] || 0} sidebarMode={props.view.sidebarMode} scheduleWorkspaceEnabled={SCHEDULE_WORKSPACE_ENABLED}
|
|
105
|
+
remindersWorkspaceEnabled={REMINDERS_WORKSPACE_ENABLED} onSidebarModeChange={props.handleSidebarModeChange}
|
|
106
|
+
onToggleSidebar={props.handleSidebarToggle} helpOpen={props.helpOpen} onToggleHelp={() => { props.setHelpTopic(null); props.setHelpOpen(open => !open); }}
|
|
107
|
+
onOpenHelpTopic={props.onOpenHelpTopic}
|
|
108
|
+
settingsSection={props.settingsSection} locale={props.view.locale} onSettingsSectionChange={props.setDashboardSettingsSection}
|
|
109
|
+
notesModel={props.notesModel} notesSelectedPath={props.view.notesSelectedPath} notesSelectedNote={props.notesSelectedNote}
|
|
110
|
+
notesDirtyPath={props.notesDirtyPath} notesTreeWidth={props.view.notesTreeWidth} notesSidebarMode={props.notesSidebarMode}
|
|
111
|
+
notesSearchFocusToken={props.notesSearchFocusToken} notesViewMode={props.view.notesViewMode} notesAuthoringMode={props.view.notesAuthoringMode}
|
|
112
|
+
notesWordWrap={props.view.notesWordWrap} onNotesSidebarModeChange={props.setNotesSidebarMode} onOpenNotesSearch={props.openNotesSidebarSearch}
|
|
113
|
+
onNotesSelectedPathChange={props.handleNotesSelectedPathChange} onNotesDirtyPathChange={props.setNotesDirtyPath}
|
|
114
|
+
onNotesViewModeChange={props.handleNotesViewModeChange} onNotesAuthoringModeChange={props.handleNotesAuthoringModeChange}
|
|
115
|
+
onNotesWordWrapChange={props.handleNotesWordWrapChange} onNotesTreeWidthChange={props.handleNotesTreeWidthChange}
|
|
116
|
+
boardView={props.boardView} onBoardViewChange={props.setBoardView} scheduleGroup={props.scheduleGroup} onScheduleGroupChange={props.setScheduleGroup}
|
|
117
|
+
instances={props.instances} selectedInstance={props.selectedInstance} data={props.data} titlesByPort={props.titlesByPort}
|
|
118
|
+
busyPorts={props.busyPorts} activeDetailTab={props.view.activeDetailTab} onDetailTabChange={props.handleTabChange}
|
|
119
|
+
workbenchHeader={props.workbenchHeader} detailContent={props.detailContent} previewEnabled={props.previewEnabled}
|
|
120
|
+
previewRefreshKey={props.previewRefreshKey} previewTheme={props.theme.resolved} lifecycleMessage={props.lifecycleMessage}
|
|
121
|
+
onDismissLifecycleMessage={props.onDismissLifecycleMessage} instanceListContent={props.instanceListContent} loading={props.loading}
|
|
122
|
+
jawCeoWorkbenchButton={props.jawCeoWorkbenchButton} jawCeoVoiceOverlay={props.jawCeoVoiceOverlay} jawCeoConsoleContent={props.jawCeoConsoleContent}
|
|
123
|
+
error={props.error} registryMessage={props.registryMessage} managerEvents={props.activityEvents}
|
|
124
|
+
onToggleActivity={props.handleActivityToggle} onActivityHeightChange={props.handleActivityHeight} onOpenDrawer={() => props.view.setDrawerOpen(true)}
|
|
125
|
+
onSelectTab={props.handleTabChange} onToggleActivityFromMobile={props.activityUnreadOpenAndMarkSeen} drawerProfileFilters={props.drawerProfileFilters}
|
|
126
|
+
dashboardSettingsUi={props.dashboardSettingsUi} titleSupport={props.titleSupport} onDashboardSettingsPatch={props.handleDashboardSettingsPatch} />
|
|
127
|
+
)}
|
|
128
|
+
activityHeight={props.view.activityDockCollapsed ? 48 : props.view.activityDockHeight}
|
|
129
|
+
/>
|
|
130
|
+
<CommandPalette open={props.palette.open} onClose={props.palette.close} instances={props.instances} getLabel={instanceLabel}
|
|
131
|
+
onSelectInstance={props.handleSelectInstance} theme={props.theme.theme} onCycleTheme={props.cycleTheme} onRefresh={() => void props.load()}
|
|
132
|
+
onToggleHidden={() => { const next = !props.showHidden; props.setShowHidden(next); void props.load(next); }}
|
|
133
|
+
showHidden={props.showHidden} onOpenSelected={props.openSelectedInBrowser} selectedInstance={props.selectedInstance} />
|
|
134
|
+
<ElectronMetricsPanel onUnloadPreview={() => props.setPreviewEnabled(false)} />
|
|
135
|
+
<HelpDrawer open={props.helpOpen} topic={props.helpTopic ?? props.view.sidebarMode} onClose={() => props.setHelpOpen(false)} />
|
|
136
|
+
{props.autoUnloadNotice && (
|
|
137
|
+
<div className="preview-auto-unload-notice" role="status">
|
|
138
|
+
Preview was unloaded after 5 minutes of inactivity. Toggle the preview switch to re-enable.
|
|
139
|
+
<button type="button" className="preview-auto-unload-dismiss" aria-label="Dismiss preview auto-unload notice" onClick={() => props.setAutoUnloadNotice(false)}>x</button>
|
|
140
|
+
</div>
|
|
141
|
+
)}
|
|
142
|
+
</>
|
|
143
|
+
);
|
|
144
|
+
}
|
|
@@ -7,6 +7,7 @@ type InstancePreviewProps = {
|
|
|
7
7
|
instance: DashboardInstance | null;
|
|
8
8
|
data: DashboardScanResult | null;
|
|
9
9
|
enabled: boolean;
|
|
10
|
+
active: boolean;
|
|
10
11
|
refreshKey: number;
|
|
11
12
|
theme: PreviewTheme;
|
|
12
13
|
};
|
|
@@ -59,6 +60,23 @@ export function InstancePreview(props: InstancePreviewProps) {
|
|
|
59
60
|
syncTheme();
|
|
60
61
|
}, [syncTheme]);
|
|
61
62
|
|
|
63
|
+
const prevActiveRef = useRef(false);
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
const wasActive = prevActiveRef.current;
|
|
66
|
+
prevActiveRef.current = props.active;
|
|
67
|
+
if (!wasActive && props.active && iframeRef.current?.contentWindow && state.src) {
|
|
68
|
+
const origin = previewTargetOrigin(state.src, iframeRef.current);
|
|
69
|
+
if (origin && origin !== 'null') {
|
|
70
|
+
try {
|
|
71
|
+
iframeRef.current.contentWindow.postMessage(
|
|
72
|
+
{ type: 'jaw-preview-visibility', visible: true },
|
|
73
|
+
origin,
|
|
74
|
+
);
|
|
75
|
+
} catch { /* cross-origin guard */ }
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}, [props.active, state.src]);
|
|
79
|
+
|
|
62
80
|
return (
|
|
63
81
|
<aside className="preview-panel" aria-label="Instance preview">
|
|
64
82
|
{(!props.enabled || !state.canPreview) && <div className="preview-empty">{disabledReason}</div>}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { useState, type ReactNode } from 'react';
|
|
2
|
+
import { ActivityDock } from './components/ActivityDock';
|
|
3
|
+
import { InstanceDrawer } from './components/InstanceDrawer';
|
|
4
|
+
import { InstanceNavigator } from './components/InstanceNavigator';
|
|
5
|
+
import { MobileNav } from './components/MobileNav';
|
|
6
|
+
import { SidebarRail } from './components/SidebarRail';
|
|
7
|
+
import { Workbench } from './components/Workbench';
|
|
8
|
+
import { WorkspaceLayout } from './components/WorkspaceLayout';
|
|
9
|
+
import { InstancePreview } from './InstancePreview';
|
|
10
|
+
import { DashboardSettingsSidebar, type DashboardSettingsSection } from './dashboard-settings/DashboardSettingsSidebar';
|
|
11
|
+
import { DashboardSettingsWorkspace } from './dashboard-settings/DashboardSettingsWorkspace';
|
|
12
|
+
import { NotesSidebar, type NotesSidebarMode } from './notes/NotesSidebar';
|
|
13
|
+
import { NotesWorkspace } from './notes/NotesWorkspace';
|
|
14
|
+
import { DashboardBoardSidebar } from './dashboard-board/DashboardBoardSidebar';
|
|
15
|
+
import { DashboardBoardWorkspace } from './dashboard-board/DashboardBoardWorkspace';
|
|
16
|
+
import type { BoardView } from './dashboard-board/board-view';
|
|
17
|
+
import { DashboardScheduleSidebar, type ScheduleGroup } from './dashboard-schedule/DashboardScheduleSidebar';
|
|
18
|
+
import { DashboardScheduleWorkspace } from './dashboard-schedule/DashboardScheduleWorkspace';
|
|
19
|
+
import { DashboardRemindersSidebar, type RemindersView } from './dashboard-reminders/DashboardRemindersSidebar';
|
|
20
|
+
import { DashboardRemindersWorkspace } from './dashboard-reminders/DashboardRemindersWorkspace';
|
|
21
|
+
import { useRemindersFeed } from './dashboard-reminders/useRemindersFeed';
|
|
22
|
+
import type { HelpTopicId } from './help/helpContent';
|
|
23
|
+
import type { NotesModelState } from './notes/useNotesModel';
|
|
24
|
+
import type {
|
|
25
|
+
DashboardDetailTab,
|
|
26
|
+
DashboardInstance,
|
|
27
|
+
DashboardNotesAuthoringMode,
|
|
28
|
+
DashboardNotesViewMode,
|
|
29
|
+
DashboardScanResult,
|
|
30
|
+
DashboardSidebarMode,
|
|
31
|
+
NoteMetadata,
|
|
32
|
+
DashboardLocale,
|
|
33
|
+
ManagerEvent,
|
|
34
|
+
} from './types';
|
|
35
|
+
|
|
36
|
+
type WorkspaceSurfaceProps = {
|
|
37
|
+
active: boolean;
|
|
38
|
+
children: ReactNode;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
function WorkspaceSurface(props: WorkspaceSurfaceProps) {
|
|
42
|
+
return <section className={`workspace-surface${props.active ? ' is-active' : ''}`} hidden={!props.active} aria-hidden={!props.active}>{props.children}</section>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
type Props = {
|
|
46
|
+
sidebarCollapsed: boolean;
|
|
47
|
+
activityDockCollapsed: boolean;
|
|
48
|
+
activityDockHeight: number;
|
|
49
|
+
drawerOpen: boolean;
|
|
50
|
+
onCloseDrawer: () => void;
|
|
51
|
+
onlineCount: number;
|
|
52
|
+
sidebarMode: DashboardSidebarMode;
|
|
53
|
+
scheduleWorkspaceEnabled: boolean;
|
|
54
|
+
remindersWorkspaceEnabled: boolean;
|
|
55
|
+
onSidebarModeChange: (mode: DashboardSidebarMode) => void;
|
|
56
|
+
onToggleSidebar: () => void;
|
|
57
|
+
helpOpen: boolean;
|
|
58
|
+
onToggleHelp: () => void;
|
|
59
|
+
onOpenHelpTopic: (topic: HelpTopicId) => void;
|
|
60
|
+
settingsSection: DashboardSettingsSection;
|
|
61
|
+
locale: DashboardLocale;
|
|
62
|
+
onSettingsSectionChange: (section: DashboardSettingsSection) => void;
|
|
63
|
+
notesModel: NotesModelState;
|
|
64
|
+
notesSelectedPath: string | null;
|
|
65
|
+
notesSelectedNote: NoteMetadata | null;
|
|
66
|
+
notesDirtyPath: string | null;
|
|
67
|
+
notesTreeWidth: number;
|
|
68
|
+
notesSidebarMode: NotesSidebarMode;
|
|
69
|
+
notesSearchFocusToken: number;
|
|
70
|
+
notesViewMode: DashboardNotesViewMode;
|
|
71
|
+
notesAuthoringMode: DashboardNotesAuthoringMode;
|
|
72
|
+
notesWordWrap: boolean;
|
|
73
|
+
onNotesSidebarModeChange: (mode: NotesSidebarMode) => void;
|
|
74
|
+
onOpenNotesSearch: () => void;
|
|
75
|
+
onNotesSelectedPathChange: (path: string | null) => void;
|
|
76
|
+
onNotesDirtyPathChange: (path: string | null) => void;
|
|
77
|
+
onNotesViewModeChange: (mode: DashboardNotesViewMode) => void;
|
|
78
|
+
onNotesAuthoringModeChange: (mode: DashboardNotesAuthoringMode) => void;
|
|
79
|
+
onNotesWordWrapChange: (value: boolean) => void;
|
|
80
|
+
onNotesTreeWidthChange: (value: number) => void;
|
|
81
|
+
boardView: BoardView;
|
|
82
|
+
onBoardViewChange: (view: BoardView) => void;
|
|
83
|
+
scheduleGroup: ScheduleGroup;
|
|
84
|
+
onScheduleGroupChange: (group: ScheduleGroup) => void;
|
|
85
|
+
instances: DashboardInstance[];
|
|
86
|
+
selectedInstance: DashboardInstance | null;
|
|
87
|
+
data: DashboardScanResult | null;
|
|
88
|
+
titlesByPort: Record<number, string>;
|
|
89
|
+
busyPorts: Set<number>;
|
|
90
|
+
activeDetailTab: DashboardDetailTab;
|
|
91
|
+
onDetailTabChange: (tab: DashboardDetailTab) => void;
|
|
92
|
+
workbenchHeader: ReactNode;
|
|
93
|
+
detailContent: (tab: DashboardDetailTab) => ReactNode;
|
|
94
|
+
previewEnabled: boolean;
|
|
95
|
+
previewRefreshKey: number;
|
|
96
|
+
previewTheme: 'dark' | 'light';
|
|
97
|
+
lifecycleMessage: string | null;
|
|
98
|
+
onDismissLifecycleMessage: () => void;
|
|
99
|
+
instanceListContent: ReactNode;
|
|
100
|
+
jawCeoWorkbenchButton?: ReactNode;
|
|
101
|
+
jawCeoVoiceOverlay?: ReactNode;
|
|
102
|
+
jawCeoConsoleContent?: ReactNode;
|
|
103
|
+
loading: boolean;
|
|
104
|
+
error: string | null;
|
|
105
|
+
registryMessage: string | null;
|
|
106
|
+
managerEvents: ManagerEvent[];
|
|
107
|
+
onToggleActivity: () => void;
|
|
108
|
+
onActivityHeightChange: (height: number) => void;
|
|
109
|
+
onOpenDrawer: () => void;
|
|
110
|
+
onSelectTab: (tab: DashboardDetailTab) => void;
|
|
111
|
+
onToggleActivityFromMobile: () => void;
|
|
112
|
+
drawerProfileFilters: ReactNode;
|
|
113
|
+
dashboardSettingsUi: Parameters<typeof DashboardSettingsWorkspace>[0]['ui'];
|
|
114
|
+
titleSupport: Parameters<typeof DashboardSettingsWorkspace>[0]['titleSupport'];
|
|
115
|
+
onDashboardSettingsPatch: Parameters<typeof DashboardSettingsWorkspace>[0]['onUiPatch'];
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export function SidebarRailRouter(props: Props) {
|
|
119
|
+
const [remindersView, setRemindersView] = useState<RemindersView>('matrix');
|
|
120
|
+
const remindersFeed = useRemindersFeed({ active: props.sidebarMode === 'reminders' });
|
|
121
|
+
const notesSelectedHiddenByFilter = Boolean(
|
|
122
|
+
props.notesModel.tagFilter
|
|
123
|
+
&& props.notesSelectedPath
|
|
124
|
+
&& props.notesSelectedNote
|
|
125
|
+
&& !props.notesSelectedNote.tags?.includes(props.notesModel.tagFilter),
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
return (
|
|
129
|
+
<>
|
|
130
|
+
{props.jawCeoVoiceOverlay}
|
|
131
|
+
<WorkspaceLayout
|
|
132
|
+
sidebarCollapsed={props.sidebarCollapsed}
|
|
133
|
+
inspectorCollapsed={props.activityDockCollapsed}
|
|
134
|
+
inspectorHeight={props.activityDockCollapsed ? 48 : props.activityDockHeight}
|
|
135
|
+
drawerOpen={props.drawerOpen}
|
|
136
|
+
onCloseDrawer={props.onCloseDrawer}
|
|
137
|
+
navigator={(
|
|
138
|
+
<>
|
|
139
|
+
<SidebarRail
|
|
140
|
+
onlineCount={props.onlineCount}
|
|
141
|
+
collapsed={props.sidebarCollapsed}
|
|
142
|
+
mode={props.sidebarMode}
|
|
143
|
+
scheduleWorkspaceEnabled={props.scheduleWorkspaceEnabled}
|
|
144
|
+
remindersWorkspaceEnabled={props.remindersWorkspaceEnabled}
|
|
145
|
+
onModeChange={props.onSidebarModeChange}
|
|
146
|
+
onToggleSidebar={props.onToggleSidebar}
|
|
147
|
+
helpOpen={props.helpOpen}
|
|
148
|
+
onToggleHelp={props.onToggleHelp}
|
|
149
|
+
/>
|
|
150
|
+
<div id="manager-sidebar-list" className="manager-sidebar-list">
|
|
151
|
+
{props.sidebarMode === 'settings' ? (
|
|
152
|
+
<DashboardSettingsSidebar activeSection={props.settingsSection} locale={props.locale} onSectionChange={props.onSettingsSectionChange} />
|
|
153
|
+
) : props.sidebarMode === 'notes' ? (
|
|
154
|
+
<NotesSidebar tree={props.notesModel.filteredTree} loading={props.notesModel.loading} error={props.notesModel.error} notesRoot={props.notesModel.notesRoot} selectedPath={props.notesSelectedPath} dirtyPath={props.notesDirtyPath} treeWidth={props.notesTreeWidth} mode={props.notesSidebarMode} searchFocusToken={props.notesSearchFocusToken} tagFilter={props.notesModel.tagFilter} selectedHiddenByFilter={notesSelectedHiddenByFilter} onModeChange={props.onNotesSidebarModeChange} onOpenSearch={props.onOpenNotesSearch} onSelectedPathChange={props.onNotesSelectedPathChange} onRefreshTree={props.notesModel.refresh} onClearTagFilter={() => props.notesModel.setTagFilter(null)} />
|
|
155
|
+
) : props.sidebarMode === 'board' ? (
|
|
156
|
+
<DashboardBoardSidebar view={props.boardView} onViewChange={props.onBoardViewChange} instances={props.instances} titlesByPort={props.titlesByPort} busyPorts={props.busyPorts} />
|
|
157
|
+
) : props.scheduleWorkspaceEnabled && props.sidebarMode === 'schedule' ? (
|
|
158
|
+
<DashboardScheduleSidebar activeGroup={props.scheduleGroup} onGroupChange={props.onScheduleGroupChange} />
|
|
159
|
+
) : props.remindersWorkspaceEnabled && props.sidebarMode === 'reminders' ? (
|
|
160
|
+
<DashboardRemindersSidebar view={remindersView} onViewChange={setRemindersView} items={remindersFeed.items} loading={remindersFeed.loading} onRefresh={() => void remindersFeed.refresh()} onUpdate={(id, patch) => void remindersFeed.update(id, patch)} />
|
|
161
|
+
) : (
|
|
162
|
+
<InstanceNavigator active={props.selectedInstance} hiddenCount={props.instances.filter(instance => instance.hidden).length} collapsed={props.sidebarCollapsed}>
|
|
163
|
+
{props.instanceListContent}
|
|
164
|
+
</InstanceNavigator>
|
|
165
|
+
)}
|
|
166
|
+
</div>
|
|
167
|
+
</>
|
|
168
|
+
)}
|
|
169
|
+
workbench={(
|
|
170
|
+
<div className="workspace-surface-stack">
|
|
171
|
+
{props.lifecycleMessage && (
|
|
172
|
+
<section className="state lifecycle-state" role="status">
|
|
173
|
+
<span>{props.lifecycleMessage}</span>
|
|
174
|
+
<button type="button" className="state-dismiss" aria-label="Dismiss lifecycle message" onClick={props.onDismissLifecycleMessage}>X</button>
|
|
175
|
+
</section>
|
|
176
|
+
)}
|
|
177
|
+
<div className="workspace-surface-layer">
|
|
178
|
+
<WorkspaceSurface active={props.sidebarMode === 'instances'}>
|
|
179
|
+
<Workbench mode={props.activeDetailTab} onModeChange={props.onDetailTabChange} header={props.workbenchHeader} modeActions={props.jawCeoWorkbenchButton} overview={props.detailContent('overview')} preview={(
|
|
180
|
+
<InstancePreview instance={props.selectedInstance} data={props.data} enabled={props.previewEnabled} active={props.sidebarMode === 'instances' && props.activeDetailTab === 'preview'} refreshKey={props.previewRefreshKey} theme={props.previewTheme} />
|
|
181
|
+
)} logs={props.detailContent('logs')} settings={props.detailContent('settings')} />
|
|
182
|
+
</WorkspaceSurface>
|
|
183
|
+
<WorkspaceSurface active={props.sidebarMode === 'notes'}>
|
|
184
|
+
<NotesWorkspace active={props.sidebarMode === 'notes'} selectedPath={props.notesSelectedPath} selectedNote={props.notesSelectedNote} vaultIndex={props.notesModel.index} viewMode={props.notesViewMode} authoringMode={props.notesAuthoringMode} wordWrap={props.notesWordWrap} treeWidth={props.notesTreeWidth} tagFilter={props.notesModel.tagFilter} onOpenSidebarSearch={props.onOpenNotesSearch} onSelectedPathChange={props.onNotesSelectedPathChange} onDirtyPathChange={props.onNotesDirtyPathChange} onViewModeChange={props.onNotesViewModeChange} onAuthoringModeChange={props.onNotesAuthoringModeChange} onWordWrapChange={props.onNotesWordWrapChange} onTreeWidthChange={props.onNotesTreeWidthChange} onTagSelect={props.notesModel.setTagFilter} onWikiLinkNavigate={props.onNotesSelectedPathChange} />
|
|
185
|
+
</WorkspaceSurface>
|
|
186
|
+
<WorkspaceSurface active={props.sidebarMode === 'settings'}>
|
|
187
|
+
<DashboardSettingsWorkspace activeSection={props.settingsSection} ui={props.dashboardSettingsUi} titleSupport={props.titleSupport} onUiPatch={props.onDashboardSettingsPatch} onOpenHelpTopic={props.onOpenHelpTopic} />
|
|
188
|
+
</WorkspaceSurface>
|
|
189
|
+
<WorkspaceSurface active={props.sidebarMode === 'board'}>
|
|
190
|
+
<DashboardBoardWorkspace active={props.sidebarMode === 'board'} view={props.boardView} onViewChange={props.onBoardViewChange} instances={props.instances} selectedPort={props.selectedInstance?.port ?? null} titlesByPort={props.titlesByPort} busyPorts={props.busyPorts} onOpenHelpTopic={props.onOpenHelpTopic} />
|
|
191
|
+
</WorkspaceSurface>
|
|
192
|
+
{props.scheduleWorkspaceEnabled ? (
|
|
193
|
+
<WorkspaceSurface active={props.sidebarMode === 'schedule'}>
|
|
194
|
+
<DashboardScheduleWorkspace active={props.sidebarMode === 'schedule'} activeGroup={props.scheduleGroup} busyPorts={props.busyPorts} onOpenHelpTopic={props.onOpenHelpTopic} />
|
|
195
|
+
</WorkspaceSurface>
|
|
196
|
+
) : null}
|
|
197
|
+
{props.remindersWorkspaceEnabled ? (
|
|
198
|
+
<WorkspaceSurface active={props.sidebarMode === 'reminders'}>
|
|
199
|
+
<DashboardRemindersWorkspace active={props.sidebarMode === 'reminders'} view={remindersView} feed={remindersFeed} onRefresh={() => void remindersFeed.refresh()} onCreate={(input) => void remindersFeed.create(input)} onUpdate={(id, patch) => void remindersFeed.update(id, patch)} onOpenHelpTopic={props.onOpenHelpTopic} />
|
|
200
|
+
</WorkspaceSurface>
|
|
201
|
+
) : null}
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
)}
|
|
205
|
+
inspector={(
|
|
206
|
+
<ActivityDock
|
|
207
|
+
collapsed={props.activityDockCollapsed}
|
|
208
|
+
height={props.activityDockHeight}
|
|
209
|
+
loading={props.loading}
|
|
210
|
+
error={props.error}
|
|
211
|
+
lifecycleMessage={props.lifecycleMessage}
|
|
212
|
+
selectedInstance={props.selectedInstance}
|
|
213
|
+
registryMessage={props.registryMessage}
|
|
214
|
+
events={props.managerEvents}
|
|
215
|
+
onToggle={props.onToggleActivity}
|
|
216
|
+
onHeightChange={props.onActivityHeightChange}
|
|
217
|
+
/>
|
|
218
|
+
)}
|
|
219
|
+
sidePanel={props.jawCeoConsoleContent}
|
|
220
|
+
mobileNav={<MobileNav activeTab={props.activeDetailTab} onOpenInstances={props.onOpenDrawer} onSelectTab={props.onSelectTab} onToggleActivity={props.onToggleActivityFromMobile} />}
|
|
221
|
+
drawer={(
|
|
222
|
+
<InstanceDrawer open={props.drawerOpen} profileFilters={props.drawerProfileFilters} onClose={props.onCloseDrawer}>
|
|
223
|
+
{props.instanceListContent}
|
|
224
|
+
</InstanceDrawer>
|
|
225
|
+
)}
|
|
226
|
+
/>
|
|
227
|
+
</>
|
|
228
|
+
);
|
|
229
|
+
}
|
|
@@ -25,7 +25,7 @@ type ActivityTimelineProps = {
|
|
|
25
25
|
emptyMessage?: string;
|
|
26
26
|
};
|
|
27
27
|
|
|
28
|
-
function eventToEntry(event: ManagerEvent): ActivityEntry {
|
|
28
|
+
export function eventToEntry(event: ManagerEvent): ActivityEntry {
|
|
29
29
|
switch (event.kind) {
|
|
30
30
|
case 'scan-completed':
|
|
31
31
|
return { at: event.at, source: 'scan', message: `range ${event.from}-${event.to}, ${event.reachable} reachable` };
|
|
@@ -35,6 +35,14 @@ function eventToEntry(event: ManagerEvent): ActivityEntry {
|
|
|
35
35
|
return { at: event.at, source: event.action, message: `:${event.port} ${event.status}` };
|
|
36
36
|
case 'health-changed':
|
|
37
37
|
return { at: event.at, source: 'health', message: `:${event.port} ${event.from} → ${event.to}` };
|
|
38
|
+
case 'instance-message': {
|
|
39
|
+
const title = event.title?.trim();
|
|
40
|
+
return {
|
|
41
|
+
at: event.at,
|
|
42
|
+
source: `:${event.port}`,
|
|
43
|
+
message: `${event.role}: ${title || `message #${event.messageId}`}`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
38
46
|
case 'version-mismatch':
|
|
39
47
|
return { at: event.at, source: 'version', message: `:${event.port} ${event.expected || '?'} → ${event.seen}` };
|
|
40
48
|
case 'port-collision':
|
|
@@ -68,6 +68,9 @@ export function ProcessControlPanel() {
|
|
|
68
68
|
Force release port
|
|
69
69
|
</button>
|
|
70
70
|
</div>
|
|
71
|
+
<p className="process-control-hint">
|
|
72
|
+
Stop all affects only dashboard-managed servers. Adopt/recover reconnects known managed process records without stopping external instances.
|
|
73
|
+
</p>
|
|
71
74
|
<div className="process-control-list">
|
|
72
75
|
{state?.managed.map(entry => (
|
|
73
76
|
<div key={entry.port} className="process-control-row">
|
|
@@ -5,6 +5,7 @@ type SidebarRailProps = {
|
|
|
5
5
|
collapsed: boolean;
|
|
6
6
|
mode: DashboardSidebarMode;
|
|
7
7
|
scheduleWorkspaceEnabled: boolean;
|
|
8
|
+
remindersWorkspaceEnabled?: boolean;
|
|
8
9
|
onModeChange: (mode: DashboardSidebarMode) => void;
|
|
9
10
|
onToggleSidebar: () => void;
|
|
10
11
|
helpOpen: boolean;
|
|
@@ -68,6 +69,15 @@ function ScheduleIcon() {
|
|
|
68
69
|
);
|
|
69
70
|
}
|
|
70
71
|
|
|
72
|
+
function ReminderIcon() {
|
|
73
|
+
return (
|
|
74
|
+
<svg viewBox="0 0 20 20" width="16" height="16" fill="none" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" focusable="false">
|
|
75
|
+
<path d="M5 4h10v13H5z" />
|
|
76
|
+
<path d="M8 2v4M12 2v4M8 10h4M8 13h3" />
|
|
77
|
+
</svg>
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
71
81
|
function SettingsIcon() {
|
|
72
82
|
return (
|
|
73
83
|
<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" focusable="false">
|
|
@@ -136,6 +146,18 @@ export function SidebarRail(props: SidebarRailProps) {
|
|
|
136
146
|
<ScheduleIcon />
|
|
137
147
|
</button>
|
|
138
148
|
) : null}
|
|
149
|
+
{props.remindersWorkspaceEnabled ? (
|
|
150
|
+
<button
|
|
151
|
+
className={`rail-button rail-workspace-button${props.mode === 'reminders' ? ' is-active' : ''}`}
|
|
152
|
+
type="button"
|
|
153
|
+
onClick={() => props.onModeChange('reminders')}
|
|
154
|
+
aria-label="Reminders"
|
|
155
|
+
aria-pressed={props.mode === 'reminders'}
|
|
156
|
+
title="Reminders"
|
|
157
|
+
>
|
|
158
|
+
<ReminderIcon />
|
|
159
|
+
</button>
|
|
160
|
+
) : null}
|
|
139
161
|
<button
|
|
140
162
|
className={`rail-button rail-workspace-button${props.mode === 'notes' ? ' is-active' : ''}`}
|
|
141
163
|
type="button"
|
|
@@ -5,6 +5,7 @@ type WorkbenchProps = {
|
|
|
5
5
|
mode: DashboardDetailTab;
|
|
6
6
|
onModeChange: (mode: DashboardDetailTab) => void;
|
|
7
7
|
header: ReactNode;
|
|
8
|
+
modeActions?: ReactNode;
|
|
8
9
|
overview: ReactNode;
|
|
9
10
|
preview: ReactNode;
|
|
10
11
|
logs: ReactNode;
|
|
@@ -22,19 +23,22 @@ export function Workbench(props: WorkbenchProps) {
|
|
|
22
23
|
<section className={`workbench workbench-${props.mode}`} aria-label="Selected instance workbench">
|
|
23
24
|
<div className="workbench-header">
|
|
24
25
|
{props.header}
|
|
25
|
-
<div className="workbench-mode-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
26
|
+
<div className="workbench-mode-bar">
|
|
27
|
+
<div className="workbench-mode-tabs" role="tablist" aria-label="Workbench modes">
|
|
28
|
+
{MODES.map(mode => (
|
|
29
|
+
<button
|
|
30
|
+
key={mode}
|
|
31
|
+
type="button"
|
|
32
|
+
role="tab"
|
|
33
|
+
aria-selected={props.mode === mode}
|
|
34
|
+
className={props.mode === mode ? 'is-active' : ''}
|
|
35
|
+
onClick={() => props.onModeChange(mode)}
|
|
36
|
+
>
|
|
37
|
+
{modeLabel(mode)}
|
|
38
|
+
</button>
|
|
39
|
+
))}
|
|
40
|
+
</div>
|
|
41
|
+
{props.modeActions}
|
|
38
42
|
</div>
|
|
39
43
|
</div>
|
|
40
44
|
<div className="workbench-body">
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { instanceLabel } from '../instance-label';
|
|
2
|
+
import { HelpTopicButton } from '../help/HelpTopicButton';
|
|
3
|
+
import type { HelpTopicId } from '../help/helpContent';
|
|
2
4
|
import type { DashboardInstance } from '../types';
|
|
3
5
|
|
|
4
6
|
type WorkbenchHeaderProps = {
|
|
@@ -6,12 +8,14 @@ type WorkbenchHeaderProps = {
|
|
|
6
8
|
previewEnabled: boolean;
|
|
7
9
|
onPreviewEnabledChange: (enabled: boolean) => void;
|
|
8
10
|
onPreviewRefresh: () => void;
|
|
11
|
+
onOpenHelpTopic?: (topic: HelpTopicId) => void;
|
|
9
12
|
};
|
|
10
13
|
|
|
11
14
|
export function WorkbenchHeader(props: WorkbenchHeaderProps) {
|
|
12
15
|
const instance = props.instance;
|
|
13
16
|
const canPreview = Boolean(instance?.ok);
|
|
14
17
|
const previewLabel = props.previewEnabled ? 'Preview on' : 'Preview off';
|
|
18
|
+
const hasActions = Boolean(instance || props.onOpenHelpTopic);
|
|
15
19
|
|
|
16
20
|
return (
|
|
17
21
|
<div className="detail-header">
|
|
@@ -20,40 +24,47 @@ export function WorkbenchHeader(props: WorkbenchHeaderProps) {
|
|
|
20
24
|
<h2>{instance ? instanceLabel(instance) : 'No instance selected'}</h2>
|
|
21
25
|
<span>{instance?.workingDir || instance?.url || 'Select an online instance to inspect it.'}</span>
|
|
22
26
|
</div>
|
|
23
|
-
{
|
|
27
|
+
{hasActions && (
|
|
24
28
|
<div className="detail-header-actions">
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
29
|
+
{props.onOpenHelpTopic ? (
|
|
30
|
+
<HelpTopicButton topic="instances" label="Open Instances help" onOpen={props.onOpenHelpTopic} />
|
|
31
|
+
) : null}
|
|
32
|
+
{instance ? (
|
|
33
|
+
<>
|
|
34
|
+
<span
|
|
35
|
+
className={`preview-inline-status ${instance.ok && props.previewEnabled ? 'is-ready' : 'is-unavailable'}`}
|
|
36
|
+
aria-label={instance.ok && props.previewEnabled ? 'Preview ready' : 'Preview unavailable'}
|
|
37
|
+
title={instance.ok && props.previewEnabled ? 'Preview ready' : 'Preview unavailable'}
|
|
38
|
+
/>
|
|
39
|
+
<button
|
|
40
|
+
type="button"
|
|
41
|
+
className={`preview-switch ${props.previewEnabled ? 'is-on' : 'is-off'}`}
|
|
42
|
+
role="switch"
|
|
43
|
+
aria-checked={props.previewEnabled}
|
|
44
|
+
disabled={!canPreview}
|
|
45
|
+
onClick={() => props.onPreviewEnabledChange(!props.previewEnabled)}
|
|
46
|
+
>
|
|
47
|
+
<span className="preview-switch-track" aria-hidden="true" />
|
|
48
|
+
<span>{previewLabel}</span>
|
|
49
|
+
</button>
|
|
50
|
+
<button
|
|
51
|
+
type="button"
|
|
52
|
+
className="preview-refresh-button"
|
|
53
|
+
disabled={!canPreview || !props.previewEnabled}
|
|
54
|
+
onClick={props.onPreviewRefresh}
|
|
55
|
+
>
|
|
56
|
+
Refresh
|
|
57
|
+
</button>
|
|
58
|
+
<a className="open-link" href={instance.url} target="_blank" rel="noreferrer">
|
|
59
|
+
<svg viewBox="0 0 24 24" width="12" height="12" stroke="currentColor" strokeWidth="2" fill="none" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
|
|
60
|
+
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
|
|
61
|
+
<polyline points="15 3 21 3 21 9" />
|
|
62
|
+
<line x1="10" y1="14" x2="21" y2="3" />
|
|
63
|
+
</svg>
|
|
64
|
+
Open
|
|
65
|
+
</a>
|
|
66
|
+
</>
|
|
67
|
+
) : null}
|
|
57
68
|
</div>
|
|
58
69
|
)}
|
|
59
70
|
</div>
|