shadow-claw 1.26.0 → 1.27.0
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/.agents/skills/main/skill-creator/SKILL.md +39 -0
- package/.agents/skills/main/skill-creator/references/declarative-pipelines.md +44 -0
- package/.agents/skills/main/skill-creator/references/declarative-tools.md +35 -0
- package/.agents/skills/main/skill-creator/references/frontmatter-spec.md +50 -0
- package/.well-known/agent-skills/index.json +14 -0
- package/README.md +5 -3
- package/bin/build/build.mjs +146 -15
- package/bin/build/build.test.mjs +57 -0
- package/bin/cli.mjs +26 -0
- package/bin/commands/mcp.mjs +277 -55
- package/bin/commands/mcp.test.mjs +275 -1
- package/bin/commands/skills-index.mjs +328 -0
- package/bin/commands/skills-index.test.mjs +161 -0
- package/bin/site-config/utils/custom-elements/get-approved-custom-element-scripts.test.mjs +2 -0
- package/bin/site-config/utils/custom-elements/sanitize-embedded-custom-element-scripts.test.mjs +10 -1
- package/dist/lib/components/index.js +25 -25
- package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/settings/shadow-claw-git.js +1 -1
- package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
- package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
- package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
- package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw-a2ui.js +1 -1
- package/dist/lib/components/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/shadow-claw-channels.js +1 -1
- package/dist/lib/components/shadow-claw-chat.js +1 -1
- package/dist/lib/components/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/shadow-claw-conversations.js +1 -1
- package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
- package/dist/lib/components/shadow-claw-files.js +1 -1
- package/dist/lib/components/shadow-claw-git.js +1 -1
- package/dist/lib/components/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/shadow-claw-llm.js +1 -1
- package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/shadow-claw-networking.js +1 -1
- package/dist/lib/components/shadow-claw-page-header.js +1 -1
- package/dist/lib/components/shadow-claw-pages.js +1 -1
- package/dist/lib/components/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/shadow-claw-settings.js +1 -1
- package/dist/lib/components/shadow-claw-storage.js +1 -1
- package/dist/lib/components/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/shadow-claw-tasks.js +1 -1
- package/dist/lib/components/shadow-claw-terminal.js +1 -1
- package/dist/lib/components/shadow-claw-tools.js +1 -1
- package/dist/lib/components/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw.js +1 -1
- package/dist/lib/{configurePeerJs-CrlGan0m.js → configurePeerJs-oODzltaC.js} +2 -2
- package/dist/lib/{configurePeerJs-CrlGan0m.js.map → configurePeerJs-oODzltaC.js.map} +1 -1
- package/dist/lib/core/control-plane-client.d.ts +1 -0
- package/dist/lib/{downloadGroupFile-DboUjmp2.js → downloadGroupFile-DmcBQU1n.js} +2 -2
- package/dist/lib/{downloadGroupFile-DboUjmp2.js.map → downloadGroupFile-DmcBQU1n.js.map} +1 -1
- package/dist/lib/{file-viewer-BrK2Wxgh.js → file-viewer-C3YKnq_-.js} +4 -3
- package/dist/lib/{file-viewer-BrK2Wxgh.js.map → file-viewer-C3YKnq_-.js.map} +1 -1
- package/dist/lib/index.js +26 -26
- package/dist/lib/{initControlPlane-CsO4UR6_.js → initControlPlane-C2zURVIS.js} +86 -13
- package/dist/lib/initControlPlane-C2zURVIS.js.map +1 -0
- package/dist/lib/{markdown-eeSTFnMA.js → markdown-C6EHl9zs.js} +3 -3
- package/dist/lib/{markdown-eeSTFnMA.js.map → markdown-C6EHl9zs.js.map} +1 -1
- package/dist/lib/{orchestrator-CJvoC2Uu.js → orchestrator-CACLa_Ro.js} +7 -6
- package/dist/lib/{orchestrator-CJvoC2Uu.js.map → orchestrator-CACLa_Ro.js.map} +1 -1
- package/dist/lib/{orchestrator-DCfomsn9.js → orchestrator-KRjx0eba.js} +6 -534
- package/dist/lib/{orchestrator-DCfomsn9.js.map → orchestrator-KRjx0eba.js.map} +1 -1
- package/dist/lib/parsePath-DwC_YZjw.js +16 -0
- package/dist/lib/parsePath-DwC_YZjw.js.map +1 -0
- package/dist/lib/{peerjs-Dp02bXcG.js → peerjs-DFWOBcXf.js} +4 -4
- package/dist/lib/{peerjs-Dp02bXcG.js.map → peerjs-DFWOBcXf.js.map} +1 -1
- package/dist/lib/{readGroupFileBytes-Bve-e5e_.js → readGroupFileBytes-C8oOe8Iu.js} +3 -16
- package/dist/lib/readGroupFileBytes-C8oOe8Iu.js.map +1 -0
- package/dist/lib/security/custom-element-security.d.ts +8 -0
- package/dist/lib/server/control-plane-types.d.ts +1 -1
- package/dist/lib/{shadow-claw-D8xINM3c.js → shadow-claw-6UHdiy4a.js} +5 -5
- package/dist/lib/{shadow-claw-D8xINM3c.js.map → shadow-claw-6UHdiy4a.js.map} +1 -1
- package/dist/lib/{shadow-claw-a2ui-7rJqG4Ke.js → shadow-claw-a2ui-CpZUTzlh.js} +5 -4
- package/dist/lib/{shadow-claw-a2ui-7rJqG4Ke.js.map → shadow-claw-a2ui-CpZUTzlh.js.map} +1 -1
- package/dist/lib/{shadow-claw-accounts-CdruwN8A.js → shadow-claw-accounts-03oJ__XC.js} +2 -2
- package/dist/lib/{shadow-claw-accounts-CdruwN8A.js.map → shadow-claw-accounts-03oJ__XC.js.map} +1 -1
- package/dist/lib/{shadow-claw-channel-config-Bj0-Nk3t.js → shadow-claw-channel-config-DmfwJc6G.js} +3 -3
- package/dist/lib/{shadow-claw-channel-config-Bj0-Nk3t.js.map → shadow-claw-channel-config-DmfwJc6G.js.map} +1 -1
- package/dist/lib/{shadow-claw-channels-C_jI4KhP.js → shadow-claw-channels-1N6Jl-By.js} +3 -3
- package/dist/lib/{shadow-claw-channels-C_jI4KhP.js.map → shadow-claw-channels-1N6Jl-By.js.map} +1 -1
- package/dist/lib/{shadow-claw-chat-B16MspoP.js → shadow-claw-chat-BMoqQJRK.js} +10 -10
- package/dist/lib/{shadow-claw-chat-B16MspoP.js.map → shadow-claw-chat-BMoqQJRK.js.map} +1 -1
- package/dist/lib/{shadow-claw-control-plane-x8Ldid_h.js → shadow-claw-control-plane-UG0o7pCz.js} +6 -6
- package/dist/lib/{shadow-claw-control-plane-x8Ldid_h.js.map → shadow-claw-control-plane-UG0o7pCz.js.map} +1 -1
- package/dist/lib/{shadow-claw-conversations-Ct1kAYdB.js → shadow-claw-conversations-BwXep3iu.js} +4 -3
- package/dist/lib/{shadow-claw-conversations-Ct1kAYdB.js.map → shadow-claw-conversations-BwXep3iu.js.map} +1 -1
- package/dist/lib/{shadow-claw-file-viewer-BfDHHgpA.js → shadow-claw-file-viewer-DUxzVxDT.js} +14 -10
- package/dist/lib/shadow-claw-file-viewer-DUxzVxDT.js.map +1 -0
- package/dist/lib/{shadow-claw-files-EYhOPYIH.js → shadow-claw-files-DIREEnT2.js} +7 -7
- package/dist/lib/{shadow-claw-files-EYhOPYIH.js.map → shadow-claw-files-DIREEnT2.js.map} +1 -1
- package/dist/lib/{shadow-claw-git-tcSpT-P0.js → shadow-claw-git-Bg1SWgsF.js} +4 -4
- package/dist/lib/{shadow-claw-git-tcSpT-P0.js.map → shadow-claw-git-Bg1SWgsF.js.map} +1 -1
- package/dist/lib/{shadow-claw-integrations-NbcCx_ZI.js → shadow-claw-integrations-Ds-CLPhj.js} +2 -2
- package/dist/lib/{shadow-claw-integrations-NbcCx_ZI.js.map → shadow-claw-integrations-Ds-CLPhj.js.map} +1 -1
- package/dist/lib/{shadow-claw-llm-BazJdD5f.js → shadow-claw-llm-CazBrVpM.js} +3 -3
- package/dist/lib/{shadow-claw-llm-BazJdD5f.js.map → shadow-claw-llm-CazBrVpM.js.map} +1 -1
- package/dist/lib/{shadow-claw-mcp-remote-CYmhpg7a.js → shadow-claw-mcp-remote-CT5Q-54E.js} +2 -2
- package/dist/lib/{shadow-claw-mcp-remote-CYmhpg7a.js.map → shadow-claw-mcp-remote-CT5Q-54E.js.map} +1 -1
- package/dist/lib/{shadow-claw-networking-DImPxe0H.js → shadow-claw-networking-Df85tCbO.js} +2 -2
- package/dist/lib/{shadow-claw-networking-DImPxe0H.js.map → shadow-claw-networking-Df85tCbO.js.map} +1 -1
- package/dist/lib/{shadow-claw-page-header-CcHUfFUx.js → shadow-claw-page-header-Cti2fzf-.js} +2 -2
- package/dist/lib/{shadow-claw-page-header-CcHUfFUx.js.map → shadow-claw-page-header-Cti2fzf-.js.map} +1 -1
- package/dist/lib/{shadow-claw-pages-D54jF1Qq.js → shadow-claw-pages-BgPyIEZO.js} +15 -11
- package/dist/lib/shadow-claw-pages-BgPyIEZO.js.map +1 -0
- package/dist/lib/{shadow-claw-peerjs-B9-T8Nlx.js → shadow-claw-peerjs-xkBXILed.js} +3 -3
- package/dist/lib/{shadow-claw-peerjs-B9-T8Nlx.js.map → shadow-claw-peerjs-xkBXILed.js.map} +1 -1
- package/dist/lib/{shadow-claw-settings-Bt1VAe-1.js → shadow-claw-settings-CN89xRVU.js} +4 -4
- package/dist/lib/{shadow-claw-settings-Bt1VAe-1.js.map → shadow-claw-settings-CN89xRVU.js.map} +1 -1
- package/dist/lib/{shadow-claw-storage-CFOjGf1d.js → shadow-claw-storage-VnhcObCe.js} +3 -3
- package/dist/lib/{shadow-claw-storage-CFOjGf1d.js.map → shadow-claw-storage-VnhcObCe.js.map} +1 -1
- package/dist/lib/{shadow-claw-task-server-BiKa2GOm.js → shadow-claw-task-server-jgEC2hHB.js} +2 -2
- package/dist/lib/{shadow-claw-task-server-BiKa2GOm.js.map → shadow-claw-task-server-jgEC2hHB.js.map} +1 -1
- package/dist/lib/{shadow-claw-tasks-DDHd8W4d.js → shadow-claw-tasks-i_evIufy.js} +6 -6
- package/dist/lib/{shadow-claw-tasks-DDHd8W4d.js.map → shadow-claw-tasks-i_evIufy.js.map} +1 -1
- package/dist/lib/{shadow-claw-terminal-kB6_tWKz.js → shadow-claw-terminal-CwScROlu.js} +2 -2
- package/dist/lib/{shadow-claw-terminal-kB6_tWKz.js.map → shadow-claw-terminal-CwScROlu.js.map} +1 -1
- package/dist/lib/{shadow-claw-tools-DxXIm0ku.js → shadow-claw-tools-DD3fyXP4.js} +5 -4
- package/dist/lib/{shadow-claw-tools-DxXIm0ku.js.map → shadow-claw-tools-DD3fyXP4.js.map} +1 -1
- package/dist/lib/{shadow-claw-webvm-Dc8oo7ao.js → shadow-claw-webvm-DbJq4I3-.js} +2 -2
- package/dist/lib/{shadow-claw-webvm-Dc8oo7ao.js.map → shadow-claw-webvm-DbJq4I3-.js.map} +1 -1
- package/dist/lib/{syncWebMcpRegistration-jyRGbC9w.js → syncWebMcpRegistration-DNLnQ-jz.js} +3 -2
- package/dist/lib/{syncWebMcpRegistration-jyRGbC9w.js.map → syncWebMcpRegistration-DNLnQ-jz.js.map} +1 -1
- package/dist/lib/tools-DwwB9RBa.js +546 -0
- package/dist/lib/tools-DwwB9RBa.js.map +1 -0
- package/dist/lib/{trusted-types-CkLDpLiZ.js → trusted-types-Dx0RZlrd.js} +19 -8
- package/dist/lib/trusted-types-Dx0RZlrd.js.map +1 -0
- package/dist/lib/utils/index.js +1 -1
- package/dist/lib/utils/utils.js +1 -1
- package/dist/public/.well-known/agent-skills/index.json +14 -0
- package/dist/public/AGENTS.md +5 -3
- package/dist/public/README.md +5 -3
- package/dist/public/agent.worker.js +1 -1
- package/dist/public/{configurePeerJs-COcwE0E7.js → configurePeerJs-BqgeBjP7.js} +1 -1
- package/dist/public/custom-element-security-FU04Cq05.js +1 -0
- package/dist/public/dist-B9m1QM9v.js +58 -0
- package/dist/public/docs/README.md +31 -31
- package/dist/public/docs/example/article/index.html +1 -1
- package/dist/public/docs/publishing/index.html +1 -1
- package/dist/public/docs/skill-creator/index.html +1 -1
- package/dist/public/docs/subsystems/a2ui.md +11 -1
- package/dist/public/docs/subsystems/cli.md +29 -0
- package/dist/public/docs/subsystems/control-plane.md +8 -2
- package/dist/public/docs/subsystems/custom-element-security.md +19 -9
- package/dist/public/docs/subsystems/mcp-server.md +39 -15
- package/dist/public/docs/subsystems/skills.md +30 -0
- package/dist/public/docs/subsystems/webmcp.md +9 -0
- package/dist/public/downloadGroupFile-D8KRJGGL.js +1 -0
- package/dist/public/e2e/README.md +7 -4
- package/dist/public/{e2e-bridge-CHARpbpW.js → e2e-bridge-Ceqr5kGc.js} +1 -1
- package/dist/public/effect-BJCrpFdp.js +1 -0
- package/dist/public/file-viewer-C-6Jc_tb.js +1 -0
- package/dist/public/index.html +1 -1
- package/dist/public/index.js +1 -1
- package/dist/public/initControlPlane-BN9cWyO0.js +1 -0
- package/dist/public/main/index.html +1 -1
- package/dist/public/main/memory/index.html +1 -1
- package/dist/public/{markdown-1I3O6Mmd.js → markdown-C3M4OW_A.js} +1 -1
- package/dist/public/{orchestrator-Cl95w2vb.js → orchestrator-CMbCTjBf.js} +7 -7
- package/dist/public/{orchestrator-D-xlXG92.js → orchestrator-DHjdLtqa.js} +663 -663
- package/dist/public/peerjs-DUCKH-m9.js +1 -0
- package/dist/public/service-worker.js +1 -1
- package/dist/public/{shadow-claw-CaoKmIIB.js → shadow-claw-EAt2ml5Y.js} +3 -3
- package/dist/public/{shadow-claw-accounts-CJvYC4li.js → shadow-claw-accounts-xUOLBsQZ.js} +1 -1
- package/dist/public/{shadow-claw-channels-3K62sU5f.js → shadow-claw-channels-XsfuWFF8.js} +4 -4
- package/dist/public/{shadow-claw-chat-Cu2keU2I.js → shadow-claw-chat-CbSaOZ4q.js} +7 -7
- package/dist/public/{shadow-claw-control-plane-D1OwlQI_.js → shadow-claw-control-plane-DHvN3Ukg.js} +2 -2
- package/dist/public/{shadow-claw-conversations-DDtg3BEZ.js → shadow-claw-conversations-BWs5VVfs.js} +2 -2
- package/dist/public/{shadow-claw-file-viewer-BR__1z9S.js → shadow-claw-file-viewer-BWsoW5QS.js} +5 -4
- package/dist/public/{shadow-claw-files-BJSyZ-Bl.js → shadow-claw-files-CG7MqWiV.js} +8 -8
- package/dist/public/{shadow-claw-git-MAjhXRLc.js → shadow-claw-git-DBRPZNav.js} +6 -6
- package/dist/public/{shadow-claw-integrations-82UoFuDR.js → shadow-claw-integrations-BBVnO0Fc.js} +8 -8
- package/dist/public/{shadow-claw-llm-R8j0lwPP.js → shadow-claw-llm-DMvLgKXo.js} +2 -2
- package/dist/public/{shadow-claw-mcp-remote-BzZoz4LX.js → shadow-claw-mcp-remote-Bkx0gsmF.js} +2 -2
- package/dist/public/{shadow-claw-networking-DLEd9cNm.js → shadow-claw-networking-Dd8Rw31D.js} +2 -2
- package/dist/public/{shadow-claw-notifications-1vwR7TbT.js → shadow-claw-notifications-Dbevj-lq.js} +2 -2
- package/dist/public/{shadow-claw-page-header-DMKbkv3s.js → shadow-claw-page-header-BccSHItx.js} +1 -1
- package/dist/public/{shadow-claw-pages-CjyeIV__.js → shadow-claw-pages-3_lQAv0t.js} +4 -3
- package/dist/public/{shadow-claw-settings-BfbT4dBU.js → shadow-claw-settings-t8TIlgrM.js} +5 -5
- package/dist/public/{shadow-claw-storage-C-mWQQML.js → shadow-claw-storage-CfEXoSIE.js} +2 -2
- package/dist/public/{shadow-claw-task-server-D3lHp0Nc.js → shadow-claw-task-server-DxQSsgRZ.js} +2 -2
- package/dist/public/{shadow-claw-tasks-DVVWEm-c.js → shadow-claw-tasks-DNpicQwz.js} +14 -14
- package/dist/public/{shadow-claw-terminal-BwuTRp-O.js → shadow-claw-terminal-DpY6zU_r.js} +1 -1
- package/dist/public/{shadow-claw-toast-ClCwgzFG.js → shadow-claw-toast-BkrQIP-3.js} +1 -1
- package/dist/public/{shadow-claw-tools-zFLk2nbV.js → shadow-claw-tools-WSwWohnk.js} +2 -2
- package/dist/public/{shadow-claw-webvm-qR9X7fg7.js → shadow-claw-webvm-CP6oFjg5.js} +2 -2
- package/dist/public/syncWebMcpRegistration-DOn9gLnD.js +1 -0
- package/dist/public/toast-BXgUfbyh.js +1 -0
- package/dist/public/tools-DvckJZG2.js +1 -0
- package/dist/server.js +188 -188
- package/package.json +3 -1
- package/src/components/shadow-claw-a2ui/shadow-claw-a2ui.stories.ts +1380 -93
- package/src/components/shadow-claw-a2ui/shadow-claw-a2ui.ts +11 -6
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.test.ts +8 -1
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +13 -5
- package/src/components/shadow-claw-pages/utils/buildHtmlPageSrcdoc.ts +13 -5
- package/src/core/control-plane-client.ts +15 -0
- package/src/core/utils/initControlPlane.test.ts +187 -0
- package/src/core/utils/initControlPlane.ts +194 -20
- package/src/security/custom-element-security.test.ts +51 -0
- package/src/security/custom-element-security.ts +33 -15
- package/src/server/control-plane-types.ts +1 -0
- package/src/server/control-plane.test.ts +69 -0
- package/src/server/control-plane.ts +45 -3
- package/src/server/mcp/tools/built-in-tools.ts +80 -5
- package/src/server/mcp/tools/client-tool-relay.ts +183 -26
- package/src/server/mcp/tools/mcp-tools.test.ts +140 -0
- package/src/server/middleware/static-files.test.ts +142 -0
- package/src/server/middleware/static-files.ts +66 -8
- package/src/testing/jest-setup.ts +1 -0
- package/src/worker/utils/handleMessage.ts +4 -1
- package/dist/lib/initControlPlane-CsO4UR6_.js.map +0 -1
- package/dist/lib/readGroupFileBytes-Bve-e5e_.js.map +0 -1
- package/dist/lib/shadow-claw-file-viewer-BfDHHgpA.js.map +0 -1
- package/dist/lib/shadow-claw-pages-D54jF1Qq.js.map +0 -1
- package/dist/lib/trusted-types-CkLDpLiZ.js.map +0 -1
- package/dist/public/custom-element-security-NCqQ5lmC.js +0 -1
- package/dist/public/downloadGroupFile-G0BZQgQg.js +0 -1
- package/dist/public/effect-rHYr4nfu.js +0 -1
- package/dist/public/file-viewer-8PdCURDD.js +0 -1
- package/dist/public/initControlPlane-CcGXax0A.js +0 -1
- package/dist/public/peerjs-BZdxWQFv.js +0 -1
- package/dist/public/syncWebMcpRegistration-DD42YsYV.js +0 -1
- package/dist/public/toast-HAq8XWFj.js +0 -58
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shadow-claw-tasks-DDHd8W4d.js","names":["shadowClawTasksStyles","shadowClawTasksTemplate"],"sources":["../../src/components/shadow-claw-tasks/shadow-claw-tasks.ts"],"sourcesContent":["import { renderMarkdown } from \"../../content/markdown.js\";\nimport { CONFIG_KEYS } from \"../../config/config.js\";\nimport { effect } from \"../../core/effect.js\";\n\nimport { getDb, ShadowClawDatabase } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/getConfig.js\";\nimport { Task } from \"../../db/types.js\";\n\nimport { setSanitizedHtml } from \"../../security/trusted-types.js\";\nimport { fileViewerStore } from \"../../stores/file-viewer.js\";\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\n\nimport { showError, showInfo, showSuccess } from \"../../ui/toast.js\";\nimport { isTruthyConfigValue } from \"../../common/utils/config-value.mjs\";\nimport { escapeHtml } from \"../../utils/utils.js\";\n\nimport \"../common/shadow-claw-empty-state/shadow-claw-empty-state.js\";\nimport \"../common/shadow-claw-page-header-action-button/shadow-claw-page-header-action-button.js\";\nimport \"../shadow-claw-dialog/shadow-claw-dialog.js\";\nimport \"../shadow-claw-page-header/shadow-claw-page-header.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawTasksStyles from \"./shadow-claw-tasks.css\" with { type: \"css\" };\nimport shadowClawTasksTemplate from \"./shadow-claw-tasks.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-tasks\";\n\nasync function resolveFrontmatterToggle(\n db: ShadowClawDatabase | null,\n key: string,\n): Promise<boolean> {\n if (!db || typeof (db as any).transaction !== \"function\") {\n return true;\n }\n\n try {\n return isTruthyConfigValue(await getConfig(db, key), true);\n } catch {\n return true;\n }\n}\n\nexport class ShadowClawTasks extends ShadowClawElement {\n static styles = shadowClawTasksStyles;\n static template = shadowClawTasksTemplate;\n\n editingTask: any | null = null;\n editingTools: any[] = [];\n renderFrontmatter = true;\n tasks: any[] = [];\n private _autoScrollActive = false;\n private _autoScrollSpeed = 0;\n\n private _draggedTaskId: string | null = null;\n private _keyboardGrabbedId: string | null = null;\n private _touchDraggedTaskId: string | null = null;\n private _touchId: number | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n root.addEventListener(\"click\", (event: Event) => {\n if (event instanceof MouseEvent) {\n getDb()\n .then((db) => this.handlePreviewLinkClick(event, db))\n .catch(console.error);\n }\n });\n\n // Backup button\n const backupBtn = root.querySelector(\".tasks__backup-btn\");\n backupBtn?.addEventListener(\"click\", () => this.handleBackup());\n\n // Restore button\n const restoreBtn = root.querySelector(\".tasks__restore-btn\");\n const restoreInput = root.querySelector(\".tasks__hidden-restore\");\n restoreBtn?.addEventListener(\"click\", () => {\n if (restoreInput instanceof HTMLInputElement) {\n restoreInput.click();\n }\n });\n\n restoreInput?.addEventListener(\"change\", (e) => {\n if (e.target instanceof HTMLInputElement) {\n const target = e.target;\n getDb()\n .then((db) => this.handleRestore(db, target))\n .catch(console.error);\n }\n });\n\n // Clear all button\n const clearBtn = root.querySelector(\".tasks__clear-btn\");\n clearBtn?.addEventListener(\"click\", () => {\n getDb()\n .then((db) => this.handleClearAll(db))\n .catch(console.error);\n });\n\n // Add task button\n const addBtn = root.querySelector(\".tasks__add-btn\");\n addBtn?.addEventListener(\"click\", () => this.handleAdd());\n\n // Dialog controls\n const dialog = root.querySelector(\"dialog\");\n const closeBtn = root.querySelector(\".tasks__dialog-close\");\n const cancelBtn = root.querySelector(\".tasks__btn-cancel\");\n const form = root.querySelector(\n \".tasks__dialog-form\",\n ) as HTMLFormElement | null;\n\n closeBtn?.addEventListener(\"click\", () => {\n dialog?.close();\n });\n\n cancelBtn?.addEventListener(\"click\", () => {\n dialog?.close();\n });\n\n form?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (form) {\n getDb()\n .then((db) => this.handleEditSubmit(db, form))\n .catch(console.error);\n }\n });\n\n // Close dialog when clicking outside (on backdrop)\n dialog?.addEventListener(\"click\", (e) => {\n if (e.target === dialog) {\n dialog.close();\n }\n });\n\n // Preview update logic\n const promptTextarea = root.querySelector(\"textarea[name='prompt']\");\n const previewDiv = root.querySelector(\".tasks__preview\");\n const typeRadios = root.querySelectorAll(\"input[name='taskType']\");\n const promptGroup = root.querySelector(\".tasks__prompt-group\");\n const toolsGroup = root.querySelector(\".tasks__tools-group\");\n const addToolBtn = root.querySelector(\".tasks__add-tool-btn\");\n\n const updatePreview = async () => {\n if (previewDiv instanceof HTMLElement) {\n const type =\n Array.from(typeRadios)\n .find((r: any) => r.checked)\n ?.getAttribute(\"value\") || \"prompt\";\n if (type === \"tools\") {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n } else if (promptTextarea instanceof HTMLTextAreaElement) {\n setSanitizedHtml(\n previewDiv,\n await this.renderPreview(promptTextarea.value),\n );\n }\n }\n };\n\n promptTextarea?.addEventListener(\"input\", updatePreview);\n\n typeRadios.forEach((radio) => {\n radio.addEventListener(\"change\", (e) => {\n const val = (e.target as HTMLInputElement).value;\n if (val === \"tools\") {\n promptGroup?.setAttribute(\"style\", \"display: none;\");\n toolsGroup?.removeAttribute(\"style\");\n promptTextarea?.removeAttribute(\"required\");\n } else {\n toolsGroup?.setAttribute(\"style\", \"display: none;\");\n promptGroup?.removeAttribute(\"style\");\n }\n\n updatePreview();\n });\n });\n\n addToolBtn?.addEventListener(\"click\", () => {\n this.editingTools.push({ name: \"\", input: {} });\n this.renderToolsEditor();\n updatePreview();\n });\n\n const db = await getDb();\n this.renderFrontmatter = await resolveFrontmatterToggle(\n db,\n CONFIG_KEYS.MARKDOWN_FRONTMATTER_TASKS,\n );\n\n // apply highlight.js atom-one-dark.min.css to shadow dom\n try {\n const cssText = await (\n await fetch(\n \"https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/styles/atom-one-dark.min.css\",\n )\n ).text();\n\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(cssText);\n\n if (this.shadowRoot?.adoptedStyleSheets) {\n this.shadowRoot.adoptedStyleSheets.push(sheet);\n }\n } catch (err) {\n console.warn(\"Failed to load highlight.js styles:\", err);\n }\n\n // Global dragover auto-scroll listener on shadowRoot\n root.addEventListener(\"dragover\", (e: any) => {\n if (this._draggedTaskId !== null) {\n this._updateAutoScrollSpeed(e.clientY);\n }\n });\n\n // Ensure we stop scrolling if the drag ends or leaves\n root.addEventListener(\"dragend\", () => {\n this._stopAutoScroll();\n });\n root.addEventListener(\"drop\", () => {\n this._stopAutoScroll();\n });\n\n this.render();\n this.dispatchTerminalSlotReady();\n\n // Re-render when tasks change\n this.cleanup = effect(() => {\n orchestratorStore.tasks;\n this.updateTaskList(db);\n });\n }\n\n disconnectedCallback() {\n this.cleanup();\n }\n\n cleanup: () => void = () => {};\n\n dispatchTerminalSlotReady() {\n this.dispatchEvent(\n new CustomEvent(\"shadow-claw-terminal-slot-ready\", {\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /**\n * Escape HTML special characters\n */\n escapeHtml(text: string) {\n const div = document.createElement(\"div\");\n div.textContent = text;\n\n return div.innerHTML;\n }\n\n /**\n * Open dialog to add a new task\n */\n handleAdd() {\n this.editingTask = null;\n this.editingTools = [];\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\"dialog\");\n const form = root.querySelector(\".tasks__dialog-form\");\n const title = root.querySelector(\".tasks__dialog-title\");\n const submitBtn = root.querySelector(\".tasks__dialog-submit\");\n\n if (!form || !(form instanceof HTMLFormElement)) {\n return;\n }\n\n // Update dialog for add mode\n if (title) {\n title.textContent = \"Add Task\";\n }\n\n if (submitBtn) {\n submitBtn.textContent = \"Add Task\";\n }\n\n // Clear form\n form.reset();\n\n const nameInput = form.querySelector(\"input[name='name']\");\n if (nameInput instanceof HTMLInputElement) {\n nameInput.value = \"\";\n }\n\n // Reset type toggle\n const promptRadio = form.querySelector(\n \"input[name='taskType'][value='prompt']\",\n ) as HTMLInputElement;\n if (promptRadio) {\n promptRadio.checked = true;\n promptRadio.dispatchEvent(new Event(\"change\"));\n }\n\n this.renderToolsEditor();\n\n // Reset preview\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv instanceof HTMLElement) {\n this.renderPreview(\"\", false).then((html) => {\n setSanitizedHtml(previewDiv, html);\n });\n }\n\n // Show dialog\n dialog?.showModal();\n }\n\n /**\n * Open edit dialog for a task\n */\n handleEdit(task: Task) {\n this.editingTask = task;\n this.editingTools = JSON.parse(JSON.stringify(task.tools || []));\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\"dialog\");\n const form = root.querySelector(\".tasks__dialog-form\");\n const title = root.querySelector(\".tasks__dialog-title\");\n const submitBtn = root.querySelector(\".tasks__dialog-submit\");\n\n if (!form || !(form instanceof HTMLFormElement)) {\n return;\n }\n\n // Update dialog for edit mode\n if (title) {\n title.textContent = \"Edit Task\";\n }\n\n if (submitBtn) {\n submitBtn.textContent = \"Save Changes\";\n }\n\n // Set form values\n const nameInput = form.querySelector(\"input[name='name']\");\n if (nameInput instanceof HTMLInputElement) {\n nameInput.value = task.name || \"\";\n }\n\n const scheduleInput = form.querySelector(\"input[name='schedule']\");\n const promptInput = form.querySelector(\"textarea[name='prompt']\");\n if (scheduleInput instanceof HTMLInputElement) {\n scheduleInput.value = task.schedule || \"\";\n }\n\n if (promptInput instanceof HTMLTextAreaElement) {\n promptInput.value = task.prompt || \"\";\n }\n\n const freshContextInput = form.querySelector(\"input[name='freshContext']\");\n if (freshContextInput instanceof HTMLInputElement) {\n freshContextInput.checked = !!task.freshContext;\n }\n\n const subagentInput = form.querySelector(\"input[name='subagent']\");\n if (subagentInput instanceof HTMLInputElement) {\n subagentInput.checked = !!task.subagent;\n }\n\n const typeRadio = form.querySelector(\n `input[name='taskType'][value='${task.type || \"prompt\"}']`,\n ) as HTMLInputElement;\n if (typeRadio) {\n typeRadio.checked = true;\n typeRadio.dispatchEvent(new Event(\"change\"));\n }\n\n this.renderToolsEditor();\n\n // Set initial preview\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv instanceof HTMLElement) {\n if (task.type === \"tools\") {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n } else {\n this.renderPreview(task.prompt).then((html) => {\n setSanitizedHtml(previewDiv, html);\n });\n }\n }\n\n // Show dialog\n dialog?.showModal();\n }\n\n /**\n * Run a task\n */\n handleRun(task: Task) {\n orchestratorStore.runTask(task, true);\n }\n\n renderToolsEditor() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const list = root.querySelector(\".tasks__tools-list\");\n if (!list) {\n return;\n }\n\n list.innerHTML = \"\";\n\n this.editingTools.forEach((tool, index) => {\n const item = document.createElement(\"div\");\n item.className = \"tasks__tool-item\";\n\n const header = document.createElement(\"div\");\n header.className = \"tasks__tool-header\";\n\n const title = document.createElement(\"div\");\n title.className = \"tasks__tool-title\";\n title.textContent = `Tool ${index + 1}`;\n\n const removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"tasks__tool-remove-btn\";\n removeBtn.textContent = \"Remove\";\n removeBtn.addEventListener(\"click\", () => {\n this.editingTools.splice(index, 1);\n this.renderToolsEditor();\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv) {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n }\n });\n\n header.appendChild(title);\n header.appendChild(removeBtn);\n\n const nameInput = document.createElement(\"input\");\n nameInput.type = \"text\";\n nameInput.className = \"tasks__form-input\";\n nameInput.placeholder = \"Tool Name (e.g. show_toast)\";\n nameInput.value = tool.name || \"\";\n nameInput.addEventListener(\"input\", (e) => {\n tool.name = (e.target as HTMLInputElement).value;\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv) {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n }\n });\n\n const paramsInput = document.createElement(\"textarea\");\n paramsInput.className = \"tasks__form-textarea\";\n paramsInput.placeholder = '{\\n \"key\": \"value\"\\n}';\n try {\n paramsInput.value =\n tool.input && Object.keys(tool.input).length\n ? JSON.stringify(tool.input, null, 2)\n : \"\";\n } catch (e) {\n paramsInput.value = \"\";\n }\n\n paramsInput.addEventListener(\"change\", (e) => {\n const val = (e.target as HTMLTextAreaElement).value;\n if (!val.trim()) {\n tool.input = {};\n } else {\n try {\n tool.input = JSON.parse(val);\n (e.target as HTMLTextAreaElement).style.borderColor = \"\";\n } catch (err) {\n (e.target as HTMLTextAreaElement).style.borderColor =\n \"var(--shadow-claw-error-color)\";\n }\n }\n\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv) {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n }\n });\n\n const suppressLabel = document.createElement(\"label\");\n suppressLabel.className = \"tasks__tool-suppress\";\n\n const suppressInput = document.createElement(\"input\");\n suppressInput.type = \"checkbox\";\n suppressInput.checked = !!tool.suppressOutput;\n suppressInput.addEventListener(\"change\", (e) => {\n tool.suppressOutput = (e.target as HTMLInputElement).checked;\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv) {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n }\n });\n\n suppressLabel.appendChild(suppressInput);\n suppressLabel.appendChild(document.createTextNode(\" Suppress Output\"));\n\n const suppressToastLabel = document.createElement(\"label\");\n suppressToastLabel.className = \"tasks__tool-suppress\";\n\n const suppressToastInput = document.createElement(\"input\");\n suppressToastInput.type = \"checkbox\";\n suppressToastInput.checked = !!tool.suppressToast;\n suppressToastInput.addEventListener(\"change\", (e) => {\n tool.suppressToast = (e.target as HTMLInputElement).checked;\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv) {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n }\n });\n\n suppressToastLabel.appendChild(suppressToastInput);\n suppressToastLabel.appendChild(\n document.createTextNode(\" Suppress Toast\"),\n );\n\n item.appendChild(header);\n item.appendChild(nameInput);\n item.appendChild(paramsInput);\n item.appendChild(suppressLabel);\n item.appendChild(suppressToastLabel);\n list.appendChild(item);\n });\n }\n\n renderToolsPreview(tools: any[], allowCollapse = false) {\n if (!tools || tools.length === 0) {\n return '<span class=\"tasks__preview-empty\">No tools configured</span>';\n }\n\n const html = tools\n .map((t, i) => {\n let params = \"{}\";\n try {\n params = JSON.stringify(t.input, null, 2);\n } catch (e) {\n params = \"Invalid JSON\";\n }\n\n return `<div><strong>${i + 1}. ${escapeHtml(t.name || \"Unnamed Tool\")}</strong><pre><code>${escapeHtml(params)}</code></pre></div>`;\n })\n .join(\"\");\n\n if (allowCollapse && tools.length > 2) {\n return `\n <details class=\"tasks__content-details\">\n <summary class=\"tasks__content-summary\">\n <span class=\"tasks__summary-text\">${tools.length} Tools configured</span>\n <span class=\"tasks__summary-label\">(View more)</span>\n </summary>\n <div class=\"tasks__prompt\">${html}</div>\n </details>\n `;\n }\n\n return `<div class=\"tasks__prompt\">${html}</div>`;\n }\n\n resolveWorkspaceLinkPath(href: string): string | null {\n const trimmed = href.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) {\n return null;\n }\n\n let candidate = trimmed;\n const hasScheme = /^[a-zA-Z][a-zA-Z\\d+.-]*:/.test(trimmed);\n\n if (hasScheme || trimmed.startsWith(\"//\")) {\n let parsed: URL;\n try {\n parsed = new URL(trimmed, window.location.href);\n } catch {\n return null;\n }\n\n const isHttp =\n parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n if (!isHttp || parsed.host !== window.location.host) {\n return null;\n }\n\n candidate = `${parsed.pathname}${parsed.search}${parsed.hash}`;\n }\n\n let normalized = candidate.split(/[?#]/, 1)[0].replace(/\\\\/g, \"/\");\n normalized = normalized.replace(/^\\/+/, \"\");\n normalized = normalized.replace(/^\\.\\//, \"\");\n\n if (!normalized) {\n return null;\n }\n\n const parts = normalized.split(\"/\").filter(Boolean);\n if (parts.some((part) => part === \"..\")) {\n return null;\n }\n\n return parts.join(\"/\");\n }\n\n /**\n * Handle backup (download all tasks as JSON)\n */\n async handleBackup() {\n try {\n const btn = this.shadowRoot?.querySelector(\".tasks__backup-btn\");\n btn?.toggleAttribute(\"disabled\", true);\n\n if (btn) {\n btn.textContent = \"⏳\";\n }\n\n const tasks = orchestratorStore.getTasksForBackup();\n const json = JSON.stringify(tasks, null, 2);\n const blob = new Blob([json], { type: \"application/json\" });\n\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = `shadowclaw-tasks-backup-${Date.now()}.json`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to create backup: ${message}`);\n console.error(\"Backup error:\", err);\n } finally {\n const btn = this.shadowRoot?.querySelector(\".tasks__backup-btn\");\n btn?.toggleAttribute(\"disabled\", false);\n\n if (btn) {\n btn.textContent = \"💾 Backup\";\n }\n }\n }\n\n /**\n * Handle clear all (delete all tasks)\n */\n async handleClearAll(db: ShadowClawDatabase) {\n const confirmed = await this.requestConfirmation({\n title: \"Clear All Tasks\",\n message: \"Delete ALL tasks? This cannot be undone!\",\n confirmLabel: \"Delete All\",\n cancelLabel: \"Cancel\",\n });\n\n if (!confirmed) {\n return;\n }\n\n try {\n const btn = this.shadowRoot?.querySelector(\".tasks__clear-btn\");\n btn?.toggleAttribute(\"disabled\", true);\n\n if (btn) {\n btn.textContent = \"⏳\";\n }\n\n await orchestratorStore.clearAllTasks(db);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to clear tasks: ${message}`);\n console.error(\"Clear error:\", err);\n } finally {\n const btn = this.shadowRoot?.querySelector(\".tasks__clear-btn\");\n btn?.toggleAttribute(\"disabled\", false);\n\n if (btn) {\n btn.textContent = \"🗑️ Clear All\";\n }\n }\n }\n\n /**\n * Copy a task's ID to the clipboard\n */\n async handleCopyId(id: string) {\n try {\n await navigator.clipboard.writeText(id);\n showSuccess(\"Task ID copied to clipboard!\");\n } catch (err) {\n showError(\"Failed to copy task ID.\");\n }\n }\n\n /**\n * Delete a task\n */\n async handleDelete(db: ShadowClawDatabase, id: string) {\n const confirmed = await this.requestConfirmation({\n title: \"Delete Scheduled Task\",\n message: \"Are you sure you want to delete this scheduled task?\",\n confirmLabel: \"Delete\",\n cancelLabel: \"Cancel\",\n });\n\n if (!confirmed) {\n return;\n }\n\n try {\n await orchestratorStore.deleteTask(db, id);\n } catch (err) {\n console.error(\"Failed to delete task:\", err);\n }\n }\n\n async handleEditSubmit(db: ShadowClawDatabase, form: HTMLFormElement) {\n const formData = new FormData(form);\n const name = formData.get(\"name\");\n const schedule = formData.get(\"schedule\");\n const prompt = formData.get(\"prompt\");\n const type = (formData.get(\"taskType\") as \"prompt\" | \"tools\") || \"prompt\";\n\n const nameStr = name ? String(name).trim() : \"\";\n const scheduleStr = schedule ? String(schedule).trim() : \"\";\n\n if (type === \"prompt\" && !prompt) {\n showInfo(\"Please provide a task prompt.\");\n\n return;\n }\n\n const freshContext = !!formData.get(\"freshContext\");\n const subagent = !!formData.get(\"subagent\");\n\n try {\n let taskToSave;\n\n if (this.editingTask) {\n // Update existing task\n taskToSave = {\n ...this.editingTask,\n name: nameStr || undefined,\n schedule: scheduleStr,\n type,\n prompt: String(prompt || \"\"),\n tools: JSON.parse(JSON.stringify(this.editingTools)),\n freshContext,\n subagent,\n };\n } else {\n // Create new task\n const currentGroupId = orchestratorStore.activeGroupId;\n taskToSave = {\n id: crypto.randomUUID\n ? crypto.randomUUID()\n : `task-${Date.now()}-${Math.random()}`,\n groupId: currentGroupId,\n name: nameStr || undefined,\n schedule: scheduleStr,\n type,\n prompt: String(prompt || \"\"),\n tools: JSON.parse(JSON.stringify(this.editingTools)),\n enabled: true,\n lastRun: null,\n createdAt: Date.now(),\n freshContext,\n subagent,\n };\n }\n\n await orchestratorStore.upsertTask(db, taskToSave);\n\n const root = this.shadowRoot;\n const dialog = root?.querySelector(\"dialog\");\n dialog?.close();\n\n this.editingTask = null;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to save task: ${message}`);\n console.error(\"Save error:\", err);\n }\n }\n\n async handlePreviewLinkClick(event: MouseEvent, db: ShadowClawDatabase) {\n if (event.defaultPrevented || event.button !== 0) {\n return;\n }\n\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof Element)) {\n return;\n }\n\n const link = target.closest(\"a\");\n if (!(link instanceof HTMLAnchorElement)) {\n return;\n }\n\n const href = link.getAttribute(\"href\") || \"\";\n const resolved = this.resolveWorkspaceLinkPath(href);\n if (!resolved) {\n return;\n }\n\n event.preventDefault();\n\n const attempts = [resolved];\n const lastSegment = resolved.split(\"/\").filter(Boolean).pop() || \"\";\n const hasExtension = /\\.[^./]+$/u.test(lastSegment);\n\n if (!hasExtension) {\n attempts.push(`${resolved}.md`, `${resolved}/index.md`);\n }\n\n for (const candidate of attempts) {\n try {\n await fileViewerStore.openFile(\n db,\n candidate,\n orchestratorStore.activeGroupId,\n );\n\n return;\n } catch {\n // Try next candidate path.\n }\n }\n\n showError(`Failed to open linked file: ${resolved}`, 5000);\n }\n\n async handleReorder(\n draggedId: string,\n targetId: string,\n precomputedIds?: string[],\n ) {\n const db = await getDb();\n if (!db) {\n return;\n }\n\n if (precomputedIds) {\n await orchestratorStore.reorderTasks(\n db,\n orchestratorStore.activeGroupId,\n precomputedIds,\n );\n return;\n }\n\n const tasks = orchestratorStore.tasks || [];\n const ids = tasks.map((t) => t.id);\n const fromIdx = ids.indexOf(draggedId);\n const toIdx = ids.indexOf(targetId);\n\n if (fromIdx < 0 || toIdx < 0) {\n return;\n }\n\n ids.splice(fromIdx, 1);\n ids.splice(toIdx, 0, draggedId);\n\n await orchestratorStore.reorderTasks(\n db,\n orchestratorStore.activeGroupId,\n ids,\n );\n }\n\n /**\n * Handle restore (upload and import JSON)\n */\n async handleRestore(db: ShadowClawDatabase, input: HTMLInputElement) {\n const files = input.files;\n if (!files || files.length === 0) {\n return;\n }\n\n const jsonFile = files[0];\n if (!jsonFile.name.endsWith(\".json\")) {\n showInfo(\"Please select a .json file\");\n\n return;\n }\n\n const confirmed = await this.requestConfirmation({\n title: \"Restore Tasks\",\n message: \"Restore from backup will replace all current tasks. Continue?\",\n confirmLabel: \"Restore\",\n cancelLabel: \"Cancel\",\n });\n\n if (!confirmed) {\n input.value = \"\";\n\n return;\n }\n\n try {\n const btn = this.shadowRoot?.querySelector(\".tasks__restore-btn\");\n btn?.toggleAttribute(\"disabled\", true);\n\n if (btn) {\n btn.textContent = \"⏳\";\n }\n\n const text = await jsonFile.text();\n const tasks = JSON.parse(text);\n\n if (!Array.isArray(tasks)) {\n throw new Error(\"Invalid backup file format\");\n }\n\n await orchestratorStore.restoreTasksFromBackup(db, tasks);\n input.value = \"\";\n showSuccess(\"Tasks restored successfully!\");\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to restore from backup: ${message}`);\n console.error(\"Restore error:\", err);\n } finally {\n const btn = this.shadowRoot?.querySelector(\".tasks__restore-btn\");\n btn?.toggleAttribute(\"disabled\", false);\n\n if (btn) {\n btn.textContent = \"♻️ Restore\";\n }\n }\n }\n\n async renderPreview(prompt: string, allowCollapse = false) {\n if (!prompt.trim()) {\n return '<span class=\"tasks__preview-empty\">No content</span>';\n }\n\n const lines = prompt.split(\"\\n\");\n const isLong = prompt.length > 120 || lines.length > 1;\n\n const rendered = await renderMarkdown(prompt, {\n breaks: true,\n renderFrontmatter: this.renderFrontmatter,\n });\n\n if (allowCollapse && isLong) {\n const summaryText = prompt.trim();\n\n return `\n <details class=\"tasks__content-details\">\n <summary class=\"tasks__content-summary\">\n <span class=\"tasks__summary-text\">${escapeHtml(summaryText)}</span>\n <span class=\"tasks__summary-label\">(View more)</span>\n </summary>\n <div class=\"tasks__prompt\">${rendered}</div>\n </details>\n `;\n }\n\n return `<div class=\"tasks__prompt\">${rendered}</div>`;\n }\n\n async requestConfirmation(options: {\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n }): Promise<boolean> {\n const appShell = document.querySelector(\"shadow-claw\") as any;\n if (appShell && typeof appShell.requestDialog === \"function\") {\n return await appShell.requestDialog({ mode: \"confirm\", ...options });\n }\n\n showInfo(options.message, 4000);\n\n return false;\n }\n\n async updateTaskList(db: ShadowClawDatabase) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const list = root.querySelector(\".tasks__list\");\n if (!list) {\n return;\n }\n\n const tasks = orchestratorStore.tasks;\n\n if (tasks.length === 0) {\n setSanitizedHtml(\n list,\n `<shadow-claw-empty-state\n class=\"tasks__empty\"\n message=\"No scheduled tasks for this group.\"\n hint=\"Ask the agent to create one using 'create_task'.\"\n ></shadow-claw-empty-state>`,\n );\n\n return;\n }\n\n // Capture render content first to avoid partially cleared list while awaiting\n const fragment = document.createDocumentFragment();\n\n for (let i = 0; i < tasks.length; i++) {\n const task = tasks[i];\n const item = document.createElement(\"div\");\n item.className = \"tasks__item\";\n item.setAttribute(\"role\", \"listitem\");\n item.setAttribute(\"tabindex\", \"0\");\n item.setAttribute(\"aria-describedby\", \"reorder-instructions\");\n item.setAttribute(\n \"aria-label\",\n `${task.name || \"Task\"}, position ${i + 1} of ${tasks.length}`,\n );\n item.setAttribute(\"data-task-id\", task.id);\n\n if (this._keyboardGrabbedId === task.id) {\n item.classList.add(\"keyboard-grabbed\");\n item.setAttribute(\"aria-grabbed\", \"true\");\n }\n\n const lastRunStr = task.lastRun\n ? new Date(task.lastRun).toLocaleString()\n : \"Never\";\n\n const isTools = task.type === \"tools\";\n const previewHtml = isTools\n ? this.renderToolsPreview(task.tools || [], true)\n : await this.renderPreview(task.prompt, true);\n\n const scheduleDisplay = task.schedule\n ? `⏰ ${escapeHtml(task.schedule)}`\n : \"⏸ Unscheduled\";\n const toggleHtml = task.schedule\n ? `\n <label class=\"tasks__toggle\">\n <input type=\"checkbox\" ${task.enabled ? \"checked\" : \"\"} data-id=\"${escapeHtml(task.id)}\" class=\"tasks__toggle-input\" aria-label=\"${task.enabled ? \"Disable\" : \"Enable\"} task scheduled ${escapeHtml(task.schedule)}\">\n ${task.enabled ? \"Enabled\" : \"Disabled\"}\n </label>`\n : \"\";\n\n const badges = [isTools ? \"Tools\" : \"Prompt\"];\n if (task.freshContext) {\n badges.push(\"Fresh Context\");\n }\n if (task.subagent) {\n badges.push(\"Subagent\");\n }\n const badgesDisplay = badges.join(\" · \");\n\n const nameHtml = task.name\n ? `<div class=\"tasks__name\" style=\"font-weight: 600; font-size: var(--shadow-claw-font-size-md); margin-bottom: 0.25rem;\">${escapeHtml(task.name)}</div>`\n : \"\";\n\n const dragHandleHtml = `<span class=\"tasks__drag-handle\" draggable=\"true\" aria-hidden=\"true\" title=\"Drag to reorder\">⠿</span>`;\n\n setSanitizedHtml(\n item,\n `<div class=\"tasks__item-header\">\n <div style=\"display: flex; align-items: flex-start; flex: 1; min-width: 0;\">\n ${dragHandleHtml}\n <div class=\"tasks__item-info\">\n ${nameHtml}\n <div class=\"tasks__schedule-row\">\n <div class=\"tasks__schedule\">${scheduleDisplay} <span class=\"tasks__type-badge\">(${escapeHtml(badgesDisplay)})</span></div>\n </div>\n <div class=\"tasks__prompt-container\">\n ${previewHtml}\n </div>\n <div class=\"tasks__last-run\">Last run: ${escapeHtml(lastRunStr)}</div>\n </div>\n </div>\n <div class=\"tasks__actions\">\n ${toggleHtml}\n <button type=\"button\" class=\"tasks__copy-id-btn\" data-id=\"${escapeHtml(task.id)}\" aria-label=\"Copy task ID\" title=\"Copy task ID\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" aria-hidden=\"true\" style=\"vertical-align: middle; margin-right: 0.125rem; margin-top: -0.125rem;\"><path d=\"M360-240q-33 0-56.5-23.5T280-320v-480q0-33 23.5-56.5T360-880h360q33 0 56.5 23.5T800-800v480q0 33-23.5 56.5T720-240H360Zm0-80h360v-480H360v480ZM200-80q-33 0-56.5-23.5T120-160v-560h80v560h440v80H200Zm160-240v-480 480Z\"/></svg> Copy ID\n </button>\n <button type=\"button\" class=\"tasks__run-btn\" data-id=\"${escapeHtml(task.id)}\" aria-label=\"Run task\">Run</button>\n <button type=\"button\" class=\"tasks__edit-btn\" data-id=\"${escapeHtml(task.id)}\" aria-label=\"Edit task\">✎ Edit</button>\n <button type=\"button\" class=\"tasks__delete-btn\" data-id=\"${escapeHtml(task.id)}\" aria-label=\"Delete task\">Delete</button>\n </div>\n </div>`,\n );\n\n // Bind events\n const toggle = item.querySelector(\n \".tasks__toggle-input\",\n ) as HTMLInputElement | null;\n\n toggle?.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLInputElement;\n orchestratorStore.toggleTask(db, task, target.checked);\n });\n\n const copyIdBtn = item.querySelector(\".tasks__copy-id-btn\");\n copyIdBtn?.addEventListener(\"click\", () => this.handleCopyId(task.id));\n\n const runBtn = item.querySelector(\".tasks__run-btn\");\n runBtn?.addEventListener(\"click\", () => this.handleRun(task));\n\n const editBtn = item.querySelector(\".tasks__edit-btn\");\n editBtn?.addEventListener(\"click\", () => this.handleEdit(task));\n\n const deleteBtn = item.querySelector(\".tasks__delete-btn\");\n deleteBtn?.addEventListener(\"click\", () =>\n this.handleDelete(db, task.id),\n );\n\n const handleEl = item.querySelector(\n \".tasks__drag-handle\",\n ) as HTMLElement | null;\n\n handleEl?.addEventListener(\"dragstart\", (e) => {\n this._draggedTaskId = task.id;\n item.classList.add(\"dragging\");\n e.dataTransfer?.setData(\"text/plain\", task.id);\n });\n\n handleEl?.addEventListener(\"dragend\", () => {\n item.classList.remove(\"dragging\");\n this._draggedTaskId = null;\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n });\n\n handleEl?.addEventListener(\n \"touchstart\",\n (e) => {\n const touch = e.touches[0];\n if (!touch) {\n return;\n }\n this._touchId = touch.identifier;\n this._touchDraggedTaskId = task.id;\n item.classList.add(\"dragging\");\n e.preventDefault();\n },\n { passive: false },\n );\n\n item.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n if (this._draggedTaskId && this._draggedTaskId !== task.id) {\n item.classList.add(\"drag-over\");\n }\n });\n\n item.addEventListener(\"dragleave\", () => {\n item.classList.remove(\"drag-over\");\n });\n\n item.addEventListener(\"drop\", (e) => {\n e.preventDefault();\n item.classList.remove(\"drag-over\");\n if (this._draggedTaskId && this._draggedTaskId !== task.id) {\n this.handleReorder(this._draggedTaskId, task.id);\n }\n });\n\n item.addEventListener(\"keydown\", (e) => {\n this._handleKeyboard(e, task.id, task.name || \"Task\");\n });\n\n fragment.appendChild(item);\n }\n\n list.replaceChildren();\n list.appendChild(fragment);\n\n this._bindTouchListEvents(list);\n }\n\n _announce(message: string) {\n const region = this.shadowRoot?.querySelector(\"#live-region\");\n if (region) {\n region.textContent = \"\";\n requestAnimationFrame(() => {\n region.textContent = message;\n });\n }\n }\n\n _bindTouchListEvents(list: Element) {\n if ((list as any)._touchBound) {\n return;\n }\n (list as any)._touchBound = true;\n\n list.addEventListener(\n \"touchmove\",\n (e) => {\n if (this._touchDraggedTaskId === null) {\n return;\n }\n\n const touch = this._findTouch(e as TouchEvent);\n if (!touch) {\n return;\n }\n\n e.preventDefault();\n\n const target = this._itemAtPoint(touch.clientX, touch.clientY);\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n\n if (\n target &&\n target.getAttribute(\"data-task-id\") !== this._touchDraggedTaskId\n ) {\n target.classList.add(\"drag-over\");\n }\n\n this._updateAutoScrollSpeed(touch.clientY);\n },\n { passive: false },\n );\n\n list.addEventListener(\"touchend\", (e) => {\n if (this._touchDraggedTaskId === null) {\n return;\n }\n\n const touch = this._findChangedTouch(e as TouchEvent);\n if (!touch) {\n return;\n }\n\n const target = this._itemAtPoint(touch.clientX, touch.clientY);\n const targetId = target?.getAttribute(\"data-task-id\");\n\n list\n .querySelectorAll(\".dragging\")\n .forEach((el) => el.classList.remove(\"dragging\"));\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n\n if (targetId && targetId !== this._touchDraggedTaskId) {\n this.handleReorder(this._touchDraggedTaskId, targetId);\n }\n\n this._stopAutoScroll();\n this._touchDraggedTaskId = null;\n this._touchId = null;\n });\n\n list.addEventListener(\"touchcancel\", () => {\n list\n .querySelectorAll(\".dragging\")\n .forEach((el) => el.classList.remove(\"dragging\"));\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n this._stopAutoScroll();\n this._touchDraggedTaskId = null;\n this._touchId = null;\n });\n }\n\n _findChangedTouch(e: TouchEvent): Touch | undefined {\n for (let i = 0; i < e.changedTouches.length; i++) {\n const t = e.changedTouches[i];\n if (t.identifier === this._touchId) {\n return t;\n }\n }\n }\n\n _findTouch(e: TouchEvent): Touch | undefined {\n for (let i = 0; i < e.touches.length; i++) {\n const t = e.touches[i];\n if (t.identifier === this._touchId) {\n return t;\n }\n }\n }\n\n _focusNext(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const focusables = Array.from(\n root.querySelectorAll(\n '.tasks__item[tabindex=\"0\"], button:not([disabled]), input:not([type=\"hidden\"]):not([disabled])',\n ),\n ) as HTMLElement[];\n const idx = focusables.indexOf(current);\n if (idx !== -1 && idx < focusables.length - 1) {\n focusables[idx + 1].focus();\n }\n }\n\n _focusNextItem(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const items = Array.from(\n root.querySelectorAll(\".tasks__item\"),\n ) as HTMLElement[];\n const currentItem = current.closest(\".tasks__item\") as HTMLElement;\n const idx = items.indexOf(currentItem);\n if (idx !== -1 && idx < items.length - 1) {\n items[idx + 1].focus();\n }\n }\n\n _focusPrev(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const focusables = Array.from(\n root.querySelectorAll(\n '.tasks__item[tabindex=\"0\"], button:not([disabled]), input:not([type=\"hidden\"]):not([disabled])',\n ),\n ) as HTMLElement[];\n const idx = focusables.indexOf(current);\n if (idx > 0) {\n focusables[idx - 1].focus();\n }\n }\n\n _focusPrevItem(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const items = Array.from(\n root.querySelectorAll(\".tasks__item\"),\n ) as HTMLElement[];\n const currentItem = current.closest(\".tasks__item\") as HTMLElement;\n const idx = items.indexOf(currentItem);\n if (idx > 0) {\n items[idx - 1].focus();\n }\n }\n\n _handleKeyboard(e: KeyboardEvent, taskId: string, name: string) {\n const tasks = orchestratorStore.tasks || [];\n const ids = tasks.map((t) => t.id);\n const total = ids.length;\n\n if (this._keyboardGrabbedId === null) {\n // Navigation & Selection\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n this._focusNextItem(e.target as HTMLElement);\n return;\n }\n\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n this._focusPrevItem(e.target as HTMLElement);\n return;\n }\n\n if (e.key === \"ArrowRight\") {\n e.preventDefault();\n this._focusNext(e.target as HTMLElement);\n return;\n }\n\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n this._focusPrev(e.target as HTMLElement);\n return;\n }\n\n // Grab for reorder\n if (e.key === \"m\" || e.key === \"M\") {\n e.preventDefault();\n this._keyboardGrabbedId = taskId;\n const pos = ids.indexOf(taskId) + 1;\n this._announce(\n `${name} grabbed. Current position ${pos} of ${total}. Use Arrow Up and Down to move, Space or Enter to drop.`,\n );\n getDb()\n .then((db) => this.updateTaskList(db))\n .catch(console.error);\n }\n\n return;\n }\n\n // Currently grabbed\n if (e.key === \"Escape\") {\n e.preventDefault();\n this._announce(\n `Reorder cancelled. ${name} returned to original position.`,\n );\n this._keyboardGrabbedId = null;\n getDb()\n .then((db) => this.updateTaskList(db))\n .catch(console.error);\n return;\n }\n\n if (e.key === \" \" || e.key === \"Spacebar\" || e.key === \"Enter\") {\n // Drop\n e.preventDefault();\n const pos = ids.indexOf(this._keyboardGrabbedId) + 1;\n const droppedName =\n tasks.find((t) => t.id === this._keyboardGrabbedId)?.name || \"Task\";\n this._announce(\n `${droppedName} dropped at position ${pos} of ${total}. Reordering complete.`,\n );\n this._keyboardGrabbedId = null;\n getDb()\n .then((db) => this.updateTaskList(db))\n .catch(console.error);\n return;\n }\n\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n const currentIdx = ids.indexOf(this._keyboardGrabbedId);\n const newIdx = e.key === \"ArrowUp\" ? currentIdx - 1 : currentIdx + 1;\n if (newIdx < 0 || newIdx >= total) {\n return;\n }\n\n // Swap\n ids.splice(currentIdx, 1);\n ids.splice(newIdx, 0, this._keyboardGrabbedId);\n this._announce(`Moved to position ${newIdx + 1} of ${total}.`);\n this.handleReorder(this._keyboardGrabbedId, ids[currentIdx], ids);\n }\n }\n\n _itemAtPoint(x: number, y: number): Element | null {\n const root = this.shadowRoot;\n if (!root) {\n return null;\n }\n\n const el = root.elementFromPoint(x, y);\n return el?.closest?.(\".tasks__item\") || null;\n }\n\n _startAutoScroll() {\n if (this._autoScrollActive) {\n return;\n }\n this._autoScrollActive = true;\n\n const scrollLoop = () => {\n if (!this._autoScrollActive) {\n return;\n }\n\n const root = this.shadowRoot;\n const content = root?.querySelector(\n \".tasks__content\",\n ) as HTMLElement | null;\n if (content && this._autoScrollSpeed !== 0) {\n content.scrollTop += this._autoScrollSpeed;\n }\n\n requestAnimationFrame(scrollLoop);\n };\n\n requestAnimationFrame(scrollLoop);\n }\n\n _stopAutoScroll() {\n this._autoScrollActive = false;\n this._autoScrollSpeed = 0;\n }\n\n _updateAutoScrollSpeed(clientY: number) {\n const root = this.shadowRoot;\n const content = root?.querySelector(\n \".tasks__content\",\n ) as HTMLElement | null;\n if (!content) {\n this._autoScrollSpeed = 0;\n return;\n }\n\n const rect = content.getBoundingClientRect();\n const threshold = 50; // pixels from top/bottom to start scrolling\n\n const distTop = clientY - rect.top;\n const distBottom = rect.bottom - clientY;\n\n if (distTop >= 0 && distTop < threshold) {\n // Near the top: scroll up. Speed is faster the closer to the edge.\n this._autoScrollSpeed = -((threshold - distTop) / threshold) * 8;\n this._startAutoScroll();\n } else if (distBottom >= 0 && distBottom < threshold) {\n // Near the bottom: scroll down.\n this._autoScrollSpeed = ((threshold - distBottom) / threshold) * 8;\n this._startAutoScroll();\n } else {\n this._autoScrollSpeed = 0;\n }\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawTasks);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shadow-claw-tasks-i_evIufy.js","names":["shadowClawTasksStyles","shadowClawTasksTemplate"],"sources":["../../src/components/shadow-claw-tasks/shadow-claw-tasks.ts"],"sourcesContent":["import { renderMarkdown } from \"../../content/markdown.js\";\nimport { CONFIG_KEYS } from \"../../config/config.js\";\nimport { effect } from \"../../core/effect.js\";\n\nimport { getDb, ShadowClawDatabase } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/getConfig.js\";\nimport { Task } from \"../../db/types.js\";\n\nimport { setSanitizedHtml } from \"../../security/trusted-types.js\";\nimport { fileViewerStore } from \"../../stores/file-viewer.js\";\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\n\nimport { showError, showInfo, showSuccess } from \"../../ui/toast.js\";\nimport { isTruthyConfigValue } from \"../../common/utils/config-value.mjs\";\nimport { escapeHtml } from \"../../utils/utils.js\";\n\nimport \"../common/shadow-claw-empty-state/shadow-claw-empty-state.js\";\nimport \"../common/shadow-claw-page-header-action-button/shadow-claw-page-header-action-button.js\";\nimport \"../shadow-claw-dialog/shadow-claw-dialog.js\";\nimport \"../shadow-claw-page-header/shadow-claw-page-header.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawTasksStyles from \"./shadow-claw-tasks.css\" with { type: \"css\" };\nimport shadowClawTasksTemplate from \"./shadow-claw-tasks.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-tasks\";\n\nasync function resolveFrontmatterToggle(\n db: ShadowClawDatabase | null,\n key: string,\n): Promise<boolean> {\n if (!db || typeof (db as any).transaction !== \"function\") {\n return true;\n }\n\n try {\n return isTruthyConfigValue(await getConfig(db, key), true);\n } catch {\n return true;\n }\n}\n\nexport class ShadowClawTasks extends ShadowClawElement {\n static styles = shadowClawTasksStyles;\n static template = shadowClawTasksTemplate;\n\n editingTask: any | null = null;\n editingTools: any[] = [];\n renderFrontmatter = true;\n tasks: any[] = [];\n private _autoScrollActive = false;\n private _autoScrollSpeed = 0;\n\n private _draggedTaskId: string | null = null;\n private _keyboardGrabbedId: string | null = null;\n private _touchDraggedTaskId: string | null = null;\n private _touchId: number | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n root.addEventListener(\"click\", (event: Event) => {\n if (event instanceof MouseEvent) {\n getDb()\n .then((db) => this.handlePreviewLinkClick(event, db))\n .catch(console.error);\n }\n });\n\n // Backup button\n const backupBtn = root.querySelector(\".tasks__backup-btn\");\n backupBtn?.addEventListener(\"click\", () => this.handleBackup());\n\n // Restore button\n const restoreBtn = root.querySelector(\".tasks__restore-btn\");\n const restoreInput = root.querySelector(\".tasks__hidden-restore\");\n restoreBtn?.addEventListener(\"click\", () => {\n if (restoreInput instanceof HTMLInputElement) {\n restoreInput.click();\n }\n });\n\n restoreInput?.addEventListener(\"change\", (e) => {\n if (e.target instanceof HTMLInputElement) {\n const target = e.target;\n getDb()\n .then((db) => this.handleRestore(db, target))\n .catch(console.error);\n }\n });\n\n // Clear all button\n const clearBtn = root.querySelector(\".tasks__clear-btn\");\n clearBtn?.addEventListener(\"click\", () => {\n getDb()\n .then((db) => this.handleClearAll(db))\n .catch(console.error);\n });\n\n // Add task button\n const addBtn = root.querySelector(\".tasks__add-btn\");\n addBtn?.addEventListener(\"click\", () => this.handleAdd());\n\n // Dialog controls\n const dialog = root.querySelector(\"dialog\");\n const closeBtn = root.querySelector(\".tasks__dialog-close\");\n const cancelBtn = root.querySelector(\".tasks__btn-cancel\");\n const form = root.querySelector(\n \".tasks__dialog-form\",\n ) as HTMLFormElement | null;\n\n closeBtn?.addEventListener(\"click\", () => {\n dialog?.close();\n });\n\n cancelBtn?.addEventListener(\"click\", () => {\n dialog?.close();\n });\n\n form?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (form) {\n getDb()\n .then((db) => this.handleEditSubmit(db, form))\n .catch(console.error);\n }\n });\n\n // Close dialog when clicking outside (on backdrop)\n dialog?.addEventListener(\"click\", (e) => {\n if (e.target === dialog) {\n dialog.close();\n }\n });\n\n // Preview update logic\n const promptTextarea = root.querySelector(\"textarea[name='prompt']\");\n const previewDiv = root.querySelector(\".tasks__preview\");\n const typeRadios = root.querySelectorAll(\"input[name='taskType']\");\n const promptGroup = root.querySelector(\".tasks__prompt-group\");\n const toolsGroup = root.querySelector(\".tasks__tools-group\");\n const addToolBtn = root.querySelector(\".tasks__add-tool-btn\");\n\n const updatePreview = async () => {\n if (previewDiv instanceof HTMLElement) {\n const type =\n Array.from(typeRadios)\n .find((r: any) => r.checked)\n ?.getAttribute(\"value\") || \"prompt\";\n if (type === \"tools\") {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n } else if (promptTextarea instanceof HTMLTextAreaElement) {\n setSanitizedHtml(\n previewDiv,\n await this.renderPreview(promptTextarea.value),\n );\n }\n }\n };\n\n promptTextarea?.addEventListener(\"input\", updatePreview);\n\n typeRadios.forEach((radio) => {\n radio.addEventListener(\"change\", (e) => {\n const val = (e.target as HTMLInputElement).value;\n if (val === \"tools\") {\n promptGroup?.setAttribute(\"style\", \"display: none;\");\n toolsGroup?.removeAttribute(\"style\");\n promptTextarea?.removeAttribute(\"required\");\n } else {\n toolsGroup?.setAttribute(\"style\", \"display: none;\");\n promptGroup?.removeAttribute(\"style\");\n }\n\n updatePreview();\n });\n });\n\n addToolBtn?.addEventListener(\"click\", () => {\n this.editingTools.push({ name: \"\", input: {} });\n this.renderToolsEditor();\n updatePreview();\n });\n\n const db = await getDb();\n this.renderFrontmatter = await resolveFrontmatterToggle(\n db,\n CONFIG_KEYS.MARKDOWN_FRONTMATTER_TASKS,\n );\n\n // apply highlight.js atom-one-dark.min.css to shadow dom\n try {\n const cssText = await (\n await fetch(\n \"https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/styles/atom-one-dark.min.css\",\n )\n ).text();\n\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(cssText);\n\n if (this.shadowRoot?.adoptedStyleSheets) {\n this.shadowRoot.adoptedStyleSheets.push(sheet);\n }\n } catch (err) {\n console.warn(\"Failed to load highlight.js styles:\", err);\n }\n\n // Global dragover auto-scroll listener on shadowRoot\n root.addEventListener(\"dragover\", (e: any) => {\n if (this._draggedTaskId !== null) {\n this._updateAutoScrollSpeed(e.clientY);\n }\n });\n\n // Ensure we stop scrolling if the drag ends or leaves\n root.addEventListener(\"dragend\", () => {\n this._stopAutoScroll();\n });\n root.addEventListener(\"drop\", () => {\n this._stopAutoScroll();\n });\n\n this.render();\n this.dispatchTerminalSlotReady();\n\n // Re-render when tasks change\n this.cleanup = effect(() => {\n orchestratorStore.tasks;\n this.updateTaskList(db);\n });\n }\n\n disconnectedCallback() {\n this.cleanup();\n }\n\n cleanup: () => void = () => {};\n\n dispatchTerminalSlotReady() {\n this.dispatchEvent(\n new CustomEvent(\"shadow-claw-terminal-slot-ready\", {\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /**\n * Escape HTML special characters\n */\n escapeHtml(text: string) {\n const div = document.createElement(\"div\");\n div.textContent = text;\n\n return div.innerHTML;\n }\n\n /**\n * Open dialog to add a new task\n */\n handleAdd() {\n this.editingTask = null;\n this.editingTools = [];\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\"dialog\");\n const form = root.querySelector(\".tasks__dialog-form\");\n const title = root.querySelector(\".tasks__dialog-title\");\n const submitBtn = root.querySelector(\".tasks__dialog-submit\");\n\n if (!form || !(form instanceof HTMLFormElement)) {\n return;\n }\n\n // Update dialog for add mode\n if (title) {\n title.textContent = \"Add Task\";\n }\n\n if (submitBtn) {\n submitBtn.textContent = \"Add Task\";\n }\n\n // Clear form\n form.reset();\n\n const nameInput = form.querySelector(\"input[name='name']\");\n if (nameInput instanceof HTMLInputElement) {\n nameInput.value = \"\";\n }\n\n // Reset type toggle\n const promptRadio = form.querySelector(\n \"input[name='taskType'][value='prompt']\",\n ) as HTMLInputElement;\n if (promptRadio) {\n promptRadio.checked = true;\n promptRadio.dispatchEvent(new Event(\"change\"));\n }\n\n this.renderToolsEditor();\n\n // Reset preview\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv instanceof HTMLElement) {\n this.renderPreview(\"\", false).then((html) => {\n setSanitizedHtml(previewDiv, html);\n });\n }\n\n // Show dialog\n dialog?.showModal();\n }\n\n /**\n * Open edit dialog for a task\n */\n handleEdit(task: Task) {\n this.editingTask = task;\n this.editingTools = JSON.parse(JSON.stringify(task.tools || []));\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\"dialog\");\n const form = root.querySelector(\".tasks__dialog-form\");\n const title = root.querySelector(\".tasks__dialog-title\");\n const submitBtn = root.querySelector(\".tasks__dialog-submit\");\n\n if (!form || !(form instanceof HTMLFormElement)) {\n return;\n }\n\n // Update dialog for edit mode\n if (title) {\n title.textContent = \"Edit Task\";\n }\n\n if (submitBtn) {\n submitBtn.textContent = \"Save Changes\";\n }\n\n // Set form values\n const nameInput = form.querySelector(\"input[name='name']\");\n if (nameInput instanceof HTMLInputElement) {\n nameInput.value = task.name || \"\";\n }\n\n const scheduleInput = form.querySelector(\"input[name='schedule']\");\n const promptInput = form.querySelector(\"textarea[name='prompt']\");\n if (scheduleInput instanceof HTMLInputElement) {\n scheduleInput.value = task.schedule || \"\";\n }\n\n if (promptInput instanceof HTMLTextAreaElement) {\n promptInput.value = task.prompt || \"\";\n }\n\n const freshContextInput = form.querySelector(\"input[name='freshContext']\");\n if (freshContextInput instanceof HTMLInputElement) {\n freshContextInput.checked = !!task.freshContext;\n }\n\n const subagentInput = form.querySelector(\"input[name='subagent']\");\n if (subagentInput instanceof HTMLInputElement) {\n subagentInput.checked = !!task.subagent;\n }\n\n const typeRadio = form.querySelector(\n `input[name='taskType'][value='${task.type || \"prompt\"}']`,\n ) as HTMLInputElement;\n if (typeRadio) {\n typeRadio.checked = true;\n typeRadio.dispatchEvent(new Event(\"change\"));\n }\n\n this.renderToolsEditor();\n\n // Set initial preview\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv instanceof HTMLElement) {\n if (task.type === \"tools\") {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n } else {\n this.renderPreview(task.prompt).then((html) => {\n setSanitizedHtml(previewDiv, html);\n });\n }\n }\n\n // Show dialog\n dialog?.showModal();\n }\n\n /**\n * Run a task\n */\n handleRun(task: Task) {\n orchestratorStore.runTask(task, true);\n }\n\n renderToolsEditor() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const list = root.querySelector(\".tasks__tools-list\");\n if (!list) {\n return;\n }\n\n list.innerHTML = \"\";\n\n this.editingTools.forEach((tool, index) => {\n const item = document.createElement(\"div\");\n item.className = \"tasks__tool-item\";\n\n const header = document.createElement(\"div\");\n header.className = \"tasks__tool-header\";\n\n const title = document.createElement(\"div\");\n title.className = \"tasks__tool-title\";\n title.textContent = `Tool ${index + 1}`;\n\n const removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"tasks__tool-remove-btn\";\n removeBtn.textContent = \"Remove\";\n removeBtn.addEventListener(\"click\", () => {\n this.editingTools.splice(index, 1);\n this.renderToolsEditor();\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv) {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n }\n });\n\n header.appendChild(title);\n header.appendChild(removeBtn);\n\n const nameInput = document.createElement(\"input\");\n nameInput.type = \"text\";\n nameInput.className = \"tasks__form-input\";\n nameInput.placeholder = \"Tool Name (e.g. show_toast)\";\n nameInput.value = tool.name || \"\";\n nameInput.addEventListener(\"input\", (e) => {\n tool.name = (e.target as HTMLInputElement).value;\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv) {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n }\n });\n\n const paramsInput = document.createElement(\"textarea\");\n paramsInput.className = \"tasks__form-textarea\";\n paramsInput.placeholder = '{\\n \"key\": \"value\"\\n}';\n try {\n paramsInput.value =\n tool.input && Object.keys(tool.input).length\n ? JSON.stringify(tool.input, null, 2)\n : \"\";\n } catch (e) {\n paramsInput.value = \"\";\n }\n\n paramsInput.addEventListener(\"change\", (e) => {\n const val = (e.target as HTMLTextAreaElement).value;\n if (!val.trim()) {\n tool.input = {};\n } else {\n try {\n tool.input = JSON.parse(val);\n (e.target as HTMLTextAreaElement).style.borderColor = \"\";\n } catch (err) {\n (e.target as HTMLTextAreaElement).style.borderColor =\n \"var(--shadow-claw-error-color)\";\n }\n }\n\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv) {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n }\n });\n\n const suppressLabel = document.createElement(\"label\");\n suppressLabel.className = \"tasks__tool-suppress\";\n\n const suppressInput = document.createElement(\"input\");\n suppressInput.type = \"checkbox\";\n suppressInput.checked = !!tool.suppressOutput;\n suppressInput.addEventListener(\"change\", (e) => {\n tool.suppressOutput = (e.target as HTMLInputElement).checked;\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv) {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n }\n });\n\n suppressLabel.appendChild(suppressInput);\n suppressLabel.appendChild(document.createTextNode(\" Suppress Output\"));\n\n const suppressToastLabel = document.createElement(\"label\");\n suppressToastLabel.className = \"tasks__tool-suppress\";\n\n const suppressToastInput = document.createElement(\"input\");\n suppressToastInput.type = \"checkbox\";\n suppressToastInput.checked = !!tool.suppressToast;\n suppressToastInput.addEventListener(\"change\", (e) => {\n tool.suppressToast = (e.target as HTMLInputElement).checked;\n const previewDiv = root.querySelector(\".tasks__preview\");\n if (previewDiv) {\n setSanitizedHtml(\n previewDiv,\n this.renderToolsPreview(this.editingTools),\n );\n }\n });\n\n suppressToastLabel.appendChild(suppressToastInput);\n suppressToastLabel.appendChild(\n document.createTextNode(\" Suppress Toast\"),\n );\n\n item.appendChild(header);\n item.appendChild(nameInput);\n item.appendChild(paramsInput);\n item.appendChild(suppressLabel);\n item.appendChild(suppressToastLabel);\n list.appendChild(item);\n });\n }\n\n renderToolsPreview(tools: any[], allowCollapse = false) {\n if (!tools || tools.length === 0) {\n return '<span class=\"tasks__preview-empty\">No tools configured</span>';\n }\n\n const html = tools\n .map((t, i) => {\n let params = \"{}\";\n try {\n params = JSON.stringify(t.input, null, 2);\n } catch (e) {\n params = \"Invalid JSON\";\n }\n\n return `<div><strong>${i + 1}. ${escapeHtml(t.name || \"Unnamed Tool\")}</strong><pre><code>${escapeHtml(params)}</code></pre></div>`;\n })\n .join(\"\");\n\n if (allowCollapse && tools.length > 2) {\n return `\n <details class=\"tasks__content-details\">\n <summary class=\"tasks__content-summary\">\n <span class=\"tasks__summary-text\">${tools.length} Tools configured</span>\n <span class=\"tasks__summary-label\">(View more)</span>\n </summary>\n <div class=\"tasks__prompt\">${html}</div>\n </details>\n `;\n }\n\n return `<div class=\"tasks__prompt\">${html}</div>`;\n }\n\n resolveWorkspaceLinkPath(href: string): string | null {\n const trimmed = href.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) {\n return null;\n }\n\n let candidate = trimmed;\n const hasScheme = /^[a-zA-Z][a-zA-Z\\d+.-]*:/.test(trimmed);\n\n if (hasScheme || trimmed.startsWith(\"//\")) {\n let parsed: URL;\n try {\n parsed = new URL(trimmed, window.location.href);\n } catch {\n return null;\n }\n\n const isHttp =\n parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n if (!isHttp || parsed.host !== window.location.host) {\n return null;\n }\n\n candidate = `${parsed.pathname}${parsed.search}${parsed.hash}`;\n }\n\n let normalized = candidate.split(/[?#]/, 1)[0].replace(/\\\\/g, \"/\");\n normalized = normalized.replace(/^\\/+/, \"\");\n normalized = normalized.replace(/^\\.\\//, \"\");\n\n if (!normalized) {\n return null;\n }\n\n const parts = normalized.split(\"/\").filter(Boolean);\n if (parts.some((part) => part === \"..\")) {\n return null;\n }\n\n return parts.join(\"/\");\n }\n\n /**\n * Handle backup (download all tasks as JSON)\n */\n async handleBackup() {\n try {\n const btn = this.shadowRoot?.querySelector(\".tasks__backup-btn\");\n btn?.toggleAttribute(\"disabled\", true);\n\n if (btn) {\n btn.textContent = \"⏳\";\n }\n\n const tasks = orchestratorStore.getTasksForBackup();\n const json = JSON.stringify(tasks, null, 2);\n const blob = new Blob([json], { type: \"application/json\" });\n\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = `shadowclaw-tasks-backup-${Date.now()}.json`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to create backup: ${message}`);\n console.error(\"Backup error:\", err);\n } finally {\n const btn = this.shadowRoot?.querySelector(\".tasks__backup-btn\");\n btn?.toggleAttribute(\"disabled\", false);\n\n if (btn) {\n btn.textContent = \"💾 Backup\";\n }\n }\n }\n\n /**\n * Handle clear all (delete all tasks)\n */\n async handleClearAll(db: ShadowClawDatabase) {\n const confirmed = await this.requestConfirmation({\n title: \"Clear All Tasks\",\n message: \"Delete ALL tasks? This cannot be undone!\",\n confirmLabel: \"Delete All\",\n cancelLabel: \"Cancel\",\n });\n\n if (!confirmed) {\n return;\n }\n\n try {\n const btn = this.shadowRoot?.querySelector(\".tasks__clear-btn\");\n btn?.toggleAttribute(\"disabled\", true);\n\n if (btn) {\n btn.textContent = \"⏳\";\n }\n\n await orchestratorStore.clearAllTasks(db);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to clear tasks: ${message}`);\n console.error(\"Clear error:\", err);\n } finally {\n const btn = this.shadowRoot?.querySelector(\".tasks__clear-btn\");\n btn?.toggleAttribute(\"disabled\", false);\n\n if (btn) {\n btn.textContent = \"🗑️ Clear All\";\n }\n }\n }\n\n /**\n * Copy a task's ID to the clipboard\n */\n async handleCopyId(id: string) {\n try {\n await navigator.clipboard.writeText(id);\n showSuccess(\"Task ID copied to clipboard!\");\n } catch (err) {\n showError(\"Failed to copy task ID.\");\n }\n }\n\n /**\n * Delete a task\n */\n async handleDelete(db: ShadowClawDatabase, id: string) {\n const confirmed = await this.requestConfirmation({\n title: \"Delete Scheduled Task\",\n message: \"Are you sure you want to delete this scheduled task?\",\n confirmLabel: \"Delete\",\n cancelLabel: \"Cancel\",\n });\n\n if (!confirmed) {\n return;\n }\n\n try {\n await orchestratorStore.deleteTask(db, id);\n } catch (err) {\n console.error(\"Failed to delete task:\", err);\n }\n }\n\n async handleEditSubmit(db: ShadowClawDatabase, form: HTMLFormElement) {\n const formData = new FormData(form);\n const name = formData.get(\"name\");\n const schedule = formData.get(\"schedule\");\n const prompt = formData.get(\"prompt\");\n const type = (formData.get(\"taskType\") as \"prompt\" | \"tools\") || \"prompt\";\n\n const nameStr = name ? String(name).trim() : \"\";\n const scheduleStr = schedule ? String(schedule).trim() : \"\";\n\n if (type === \"prompt\" && !prompt) {\n showInfo(\"Please provide a task prompt.\");\n\n return;\n }\n\n const freshContext = !!formData.get(\"freshContext\");\n const subagent = !!formData.get(\"subagent\");\n\n try {\n let taskToSave;\n\n if (this.editingTask) {\n // Update existing task\n taskToSave = {\n ...this.editingTask,\n name: nameStr || undefined,\n schedule: scheduleStr,\n type,\n prompt: String(prompt || \"\"),\n tools: JSON.parse(JSON.stringify(this.editingTools)),\n freshContext,\n subagent,\n };\n } else {\n // Create new task\n const currentGroupId = orchestratorStore.activeGroupId;\n taskToSave = {\n id: crypto.randomUUID\n ? crypto.randomUUID()\n : `task-${Date.now()}-${Math.random()}`,\n groupId: currentGroupId,\n name: nameStr || undefined,\n schedule: scheduleStr,\n type,\n prompt: String(prompt || \"\"),\n tools: JSON.parse(JSON.stringify(this.editingTools)),\n enabled: true,\n lastRun: null,\n createdAt: Date.now(),\n freshContext,\n subagent,\n };\n }\n\n await orchestratorStore.upsertTask(db, taskToSave);\n\n const root = this.shadowRoot;\n const dialog = root?.querySelector(\"dialog\");\n dialog?.close();\n\n this.editingTask = null;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to save task: ${message}`);\n console.error(\"Save error:\", err);\n }\n }\n\n async handlePreviewLinkClick(event: MouseEvent, db: ShadowClawDatabase) {\n if (event.defaultPrevented || event.button !== 0) {\n return;\n }\n\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof Element)) {\n return;\n }\n\n const link = target.closest(\"a\");\n if (!(link instanceof HTMLAnchorElement)) {\n return;\n }\n\n const href = link.getAttribute(\"href\") || \"\";\n const resolved = this.resolveWorkspaceLinkPath(href);\n if (!resolved) {\n return;\n }\n\n event.preventDefault();\n\n const attempts = [resolved];\n const lastSegment = resolved.split(\"/\").filter(Boolean).pop() || \"\";\n const hasExtension = /\\.[^./]+$/u.test(lastSegment);\n\n if (!hasExtension) {\n attempts.push(`${resolved}.md`, `${resolved}/index.md`);\n }\n\n for (const candidate of attempts) {\n try {\n await fileViewerStore.openFile(\n db,\n candidate,\n orchestratorStore.activeGroupId,\n );\n\n return;\n } catch {\n // Try next candidate path.\n }\n }\n\n showError(`Failed to open linked file: ${resolved}`, 5000);\n }\n\n async handleReorder(\n draggedId: string,\n targetId: string,\n precomputedIds?: string[],\n ) {\n const db = await getDb();\n if (!db) {\n return;\n }\n\n if (precomputedIds) {\n await orchestratorStore.reorderTasks(\n db,\n orchestratorStore.activeGroupId,\n precomputedIds,\n );\n return;\n }\n\n const tasks = orchestratorStore.tasks || [];\n const ids = tasks.map((t) => t.id);\n const fromIdx = ids.indexOf(draggedId);\n const toIdx = ids.indexOf(targetId);\n\n if (fromIdx < 0 || toIdx < 0) {\n return;\n }\n\n ids.splice(fromIdx, 1);\n ids.splice(toIdx, 0, draggedId);\n\n await orchestratorStore.reorderTasks(\n db,\n orchestratorStore.activeGroupId,\n ids,\n );\n }\n\n /**\n * Handle restore (upload and import JSON)\n */\n async handleRestore(db: ShadowClawDatabase, input: HTMLInputElement) {\n const files = input.files;\n if (!files || files.length === 0) {\n return;\n }\n\n const jsonFile = files[0];\n if (!jsonFile.name.endsWith(\".json\")) {\n showInfo(\"Please select a .json file\");\n\n return;\n }\n\n const confirmed = await this.requestConfirmation({\n title: \"Restore Tasks\",\n message: \"Restore from backup will replace all current tasks. Continue?\",\n confirmLabel: \"Restore\",\n cancelLabel: \"Cancel\",\n });\n\n if (!confirmed) {\n input.value = \"\";\n\n return;\n }\n\n try {\n const btn = this.shadowRoot?.querySelector(\".tasks__restore-btn\");\n btn?.toggleAttribute(\"disabled\", true);\n\n if (btn) {\n btn.textContent = \"⏳\";\n }\n\n const text = await jsonFile.text();\n const tasks = JSON.parse(text);\n\n if (!Array.isArray(tasks)) {\n throw new Error(\"Invalid backup file format\");\n }\n\n await orchestratorStore.restoreTasksFromBackup(db, tasks);\n input.value = \"\";\n showSuccess(\"Tasks restored successfully!\");\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n showError(`Failed to restore from backup: ${message}`);\n console.error(\"Restore error:\", err);\n } finally {\n const btn = this.shadowRoot?.querySelector(\".tasks__restore-btn\");\n btn?.toggleAttribute(\"disabled\", false);\n\n if (btn) {\n btn.textContent = \"♻️ Restore\";\n }\n }\n }\n\n async renderPreview(prompt: string, allowCollapse = false) {\n if (!prompt.trim()) {\n return '<span class=\"tasks__preview-empty\">No content</span>';\n }\n\n const lines = prompt.split(\"\\n\");\n const isLong = prompt.length > 120 || lines.length > 1;\n\n const rendered = await renderMarkdown(prompt, {\n breaks: true,\n renderFrontmatter: this.renderFrontmatter,\n });\n\n if (allowCollapse && isLong) {\n const summaryText = prompt.trim();\n\n return `\n <details class=\"tasks__content-details\">\n <summary class=\"tasks__content-summary\">\n <span class=\"tasks__summary-text\">${escapeHtml(summaryText)}</span>\n <span class=\"tasks__summary-label\">(View more)</span>\n </summary>\n <div class=\"tasks__prompt\">${rendered}</div>\n </details>\n `;\n }\n\n return `<div class=\"tasks__prompt\">${rendered}</div>`;\n }\n\n async requestConfirmation(options: {\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n }): Promise<boolean> {\n const appShell = document.querySelector(\"shadow-claw\") as any;\n if (appShell && typeof appShell.requestDialog === \"function\") {\n return await appShell.requestDialog({ mode: \"confirm\", ...options });\n }\n\n showInfo(options.message, 4000);\n\n return false;\n }\n\n async updateTaskList(db: ShadowClawDatabase) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const list = root.querySelector(\".tasks__list\");\n if (!list) {\n return;\n }\n\n const tasks = orchestratorStore.tasks;\n\n if (tasks.length === 0) {\n setSanitizedHtml(\n list,\n `<shadow-claw-empty-state\n class=\"tasks__empty\"\n message=\"No scheduled tasks for this group.\"\n hint=\"Ask the agent to create one using 'create_task'.\"\n ></shadow-claw-empty-state>`,\n );\n\n return;\n }\n\n // Capture render content first to avoid partially cleared list while awaiting\n const fragment = document.createDocumentFragment();\n\n for (let i = 0; i < tasks.length; i++) {\n const task = tasks[i];\n const item = document.createElement(\"div\");\n item.className = \"tasks__item\";\n item.setAttribute(\"role\", \"listitem\");\n item.setAttribute(\"tabindex\", \"0\");\n item.setAttribute(\"aria-describedby\", \"reorder-instructions\");\n item.setAttribute(\n \"aria-label\",\n `${task.name || \"Task\"}, position ${i + 1} of ${tasks.length}`,\n );\n item.setAttribute(\"data-task-id\", task.id);\n\n if (this._keyboardGrabbedId === task.id) {\n item.classList.add(\"keyboard-grabbed\");\n item.setAttribute(\"aria-grabbed\", \"true\");\n }\n\n const lastRunStr = task.lastRun\n ? new Date(task.lastRun).toLocaleString()\n : \"Never\";\n\n const isTools = task.type === \"tools\";\n const previewHtml = isTools\n ? this.renderToolsPreview(task.tools || [], true)\n : await this.renderPreview(task.prompt, true);\n\n const scheduleDisplay = task.schedule\n ? `⏰ ${escapeHtml(task.schedule)}`\n : \"⏸ Unscheduled\";\n const toggleHtml = task.schedule\n ? `\n <label class=\"tasks__toggle\">\n <input type=\"checkbox\" ${task.enabled ? \"checked\" : \"\"} data-id=\"${escapeHtml(task.id)}\" class=\"tasks__toggle-input\" aria-label=\"${task.enabled ? \"Disable\" : \"Enable\"} task scheduled ${escapeHtml(task.schedule)}\">\n ${task.enabled ? \"Enabled\" : \"Disabled\"}\n </label>`\n : \"\";\n\n const badges = [isTools ? \"Tools\" : \"Prompt\"];\n if (task.freshContext) {\n badges.push(\"Fresh Context\");\n }\n if (task.subagent) {\n badges.push(\"Subagent\");\n }\n const badgesDisplay = badges.join(\" · \");\n\n const nameHtml = task.name\n ? `<div class=\"tasks__name\" style=\"font-weight: 600; font-size: var(--shadow-claw-font-size-md); margin-bottom: 0.25rem;\">${escapeHtml(task.name)}</div>`\n : \"\";\n\n const dragHandleHtml = `<span class=\"tasks__drag-handle\" draggable=\"true\" aria-hidden=\"true\" title=\"Drag to reorder\">⠿</span>`;\n\n setSanitizedHtml(\n item,\n `<div class=\"tasks__item-header\">\n <div style=\"display: flex; align-items: flex-start; flex: 1; min-width: 0;\">\n ${dragHandleHtml}\n <div class=\"tasks__item-info\">\n ${nameHtml}\n <div class=\"tasks__schedule-row\">\n <div class=\"tasks__schedule\">${scheduleDisplay} <span class=\"tasks__type-badge\">(${escapeHtml(badgesDisplay)})</span></div>\n </div>\n <div class=\"tasks__prompt-container\">\n ${previewHtml}\n </div>\n <div class=\"tasks__last-run\">Last run: ${escapeHtml(lastRunStr)}</div>\n </div>\n </div>\n <div class=\"tasks__actions\">\n ${toggleHtml}\n <button type=\"button\" class=\"tasks__copy-id-btn\" data-id=\"${escapeHtml(task.id)}\" aria-label=\"Copy task ID\" title=\"Copy task ID\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" aria-hidden=\"true\" style=\"vertical-align: middle; margin-right: 0.125rem; margin-top: -0.125rem;\"><path d=\"M360-240q-33 0-56.5-23.5T280-320v-480q0-33 23.5-56.5T360-880h360q33 0 56.5 23.5T800-800v480q0 33-23.5 56.5T720-240H360Zm0-80h360v-480H360v480ZM200-80q-33 0-56.5-23.5T120-160v-560h80v560h440v80H200Zm160-240v-480 480Z\"/></svg> Copy ID\n </button>\n <button type=\"button\" class=\"tasks__run-btn\" data-id=\"${escapeHtml(task.id)}\" aria-label=\"Run task\">Run</button>\n <button type=\"button\" class=\"tasks__edit-btn\" data-id=\"${escapeHtml(task.id)}\" aria-label=\"Edit task\">✎ Edit</button>\n <button type=\"button\" class=\"tasks__delete-btn\" data-id=\"${escapeHtml(task.id)}\" aria-label=\"Delete task\">Delete</button>\n </div>\n </div>`,\n );\n\n // Bind events\n const toggle = item.querySelector(\n \".tasks__toggle-input\",\n ) as HTMLInputElement | null;\n\n toggle?.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLInputElement;\n orchestratorStore.toggleTask(db, task, target.checked);\n });\n\n const copyIdBtn = item.querySelector(\".tasks__copy-id-btn\");\n copyIdBtn?.addEventListener(\"click\", () => this.handleCopyId(task.id));\n\n const runBtn = item.querySelector(\".tasks__run-btn\");\n runBtn?.addEventListener(\"click\", () => this.handleRun(task));\n\n const editBtn = item.querySelector(\".tasks__edit-btn\");\n editBtn?.addEventListener(\"click\", () => this.handleEdit(task));\n\n const deleteBtn = item.querySelector(\".tasks__delete-btn\");\n deleteBtn?.addEventListener(\"click\", () =>\n this.handleDelete(db, task.id),\n );\n\n const handleEl = item.querySelector(\n \".tasks__drag-handle\",\n ) as HTMLElement | null;\n\n handleEl?.addEventListener(\"dragstart\", (e) => {\n this._draggedTaskId = task.id;\n item.classList.add(\"dragging\");\n e.dataTransfer?.setData(\"text/plain\", task.id);\n });\n\n handleEl?.addEventListener(\"dragend\", () => {\n item.classList.remove(\"dragging\");\n this._draggedTaskId = null;\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n });\n\n handleEl?.addEventListener(\n \"touchstart\",\n (e) => {\n const touch = e.touches[0];\n if (!touch) {\n return;\n }\n this._touchId = touch.identifier;\n this._touchDraggedTaskId = task.id;\n item.classList.add(\"dragging\");\n e.preventDefault();\n },\n { passive: false },\n );\n\n item.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n if (this._draggedTaskId && this._draggedTaskId !== task.id) {\n item.classList.add(\"drag-over\");\n }\n });\n\n item.addEventListener(\"dragleave\", () => {\n item.classList.remove(\"drag-over\");\n });\n\n item.addEventListener(\"drop\", (e) => {\n e.preventDefault();\n item.classList.remove(\"drag-over\");\n if (this._draggedTaskId && this._draggedTaskId !== task.id) {\n this.handleReorder(this._draggedTaskId, task.id);\n }\n });\n\n item.addEventListener(\"keydown\", (e) => {\n this._handleKeyboard(e, task.id, task.name || \"Task\");\n });\n\n fragment.appendChild(item);\n }\n\n list.replaceChildren();\n list.appendChild(fragment);\n\n this._bindTouchListEvents(list);\n }\n\n _announce(message: string) {\n const region = this.shadowRoot?.querySelector(\"#live-region\");\n if (region) {\n region.textContent = \"\";\n requestAnimationFrame(() => {\n region.textContent = message;\n });\n }\n }\n\n _bindTouchListEvents(list: Element) {\n if ((list as any)._touchBound) {\n return;\n }\n (list as any)._touchBound = true;\n\n list.addEventListener(\n \"touchmove\",\n (e) => {\n if (this._touchDraggedTaskId === null) {\n return;\n }\n\n const touch = this._findTouch(e as TouchEvent);\n if (!touch) {\n return;\n }\n\n e.preventDefault();\n\n const target = this._itemAtPoint(touch.clientX, touch.clientY);\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n\n if (\n target &&\n target.getAttribute(\"data-task-id\") !== this._touchDraggedTaskId\n ) {\n target.classList.add(\"drag-over\");\n }\n\n this._updateAutoScrollSpeed(touch.clientY);\n },\n { passive: false },\n );\n\n list.addEventListener(\"touchend\", (e) => {\n if (this._touchDraggedTaskId === null) {\n return;\n }\n\n const touch = this._findChangedTouch(e as TouchEvent);\n if (!touch) {\n return;\n }\n\n const target = this._itemAtPoint(touch.clientX, touch.clientY);\n const targetId = target?.getAttribute(\"data-task-id\");\n\n list\n .querySelectorAll(\".dragging\")\n .forEach((el) => el.classList.remove(\"dragging\"));\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n\n if (targetId && targetId !== this._touchDraggedTaskId) {\n this.handleReorder(this._touchDraggedTaskId, targetId);\n }\n\n this._stopAutoScroll();\n this._touchDraggedTaskId = null;\n this._touchId = null;\n });\n\n list.addEventListener(\"touchcancel\", () => {\n list\n .querySelectorAll(\".dragging\")\n .forEach((el) => el.classList.remove(\"dragging\"));\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n this._stopAutoScroll();\n this._touchDraggedTaskId = null;\n this._touchId = null;\n });\n }\n\n _findChangedTouch(e: TouchEvent): Touch | undefined {\n for (let i = 0; i < e.changedTouches.length; i++) {\n const t = e.changedTouches[i];\n if (t.identifier === this._touchId) {\n return t;\n }\n }\n }\n\n _findTouch(e: TouchEvent): Touch | undefined {\n for (let i = 0; i < e.touches.length; i++) {\n const t = e.touches[i];\n if (t.identifier === this._touchId) {\n return t;\n }\n }\n }\n\n _focusNext(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const focusables = Array.from(\n root.querySelectorAll(\n '.tasks__item[tabindex=\"0\"], button:not([disabled]), input:not([type=\"hidden\"]):not([disabled])',\n ),\n ) as HTMLElement[];\n const idx = focusables.indexOf(current);\n if (idx !== -1 && idx < focusables.length - 1) {\n focusables[idx + 1].focus();\n }\n }\n\n _focusNextItem(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const items = Array.from(\n root.querySelectorAll(\".tasks__item\"),\n ) as HTMLElement[];\n const currentItem = current.closest(\".tasks__item\") as HTMLElement;\n const idx = items.indexOf(currentItem);\n if (idx !== -1 && idx < items.length - 1) {\n items[idx + 1].focus();\n }\n }\n\n _focusPrev(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const focusables = Array.from(\n root.querySelectorAll(\n '.tasks__item[tabindex=\"0\"], button:not([disabled]), input:not([type=\"hidden\"]):not([disabled])',\n ),\n ) as HTMLElement[];\n const idx = focusables.indexOf(current);\n if (idx > 0) {\n focusables[idx - 1].focus();\n }\n }\n\n _focusPrevItem(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const items = Array.from(\n root.querySelectorAll(\".tasks__item\"),\n ) as HTMLElement[];\n const currentItem = current.closest(\".tasks__item\") as HTMLElement;\n const idx = items.indexOf(currentItem);\n if (idx > 0) {\n items[idx - 1].focus();\n }\n }\n\n _handleKeyboard(e: KeyboardEvent, taskId: string, name: string) {\n const tasks = orchestratorStore.tasks || [];\n const ids = tasks.map((t) => t.id);\n const total = ids.length;\n\n if (this._keyboardGrabbedId === null) {\n // Navigation & Selection\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n this._focusNextItem(e.target as HTMLElement);\n return;\n }\n\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n this._focusPrevItem(e.target as HTMLElement);\n return;\n }\n\n if (e.key === \"ArrowRight\") {\n e.preventDefault();\n this._focusNext(e.target as HTMLElement);\n return;\n }\n\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n this._focusPrev(e.target as HTMLElement);\n return;\n }\n\n // Grab for reorder\n if (e.key === \"m\" || e.key === \"M\") {\n e.preventDefault();\n this._keyboardGrabbedId = taskId;\n const pos = ids.indexOf(taskId) + 1;\n this._announce(\n `${name} grabbed. Current position ${pos} of ${total}. Use Arrow Up and Down to move, Space or Enter to drop.`,\n );\n getDb()\n .then((db) => this.updateTaskList(db))\n .catch(console.error);\n }\n\n return;\n }\n\n // Currently grabbed\n if (e.key === \"Escape\") {\n e.preventDefault();\n this._announce(\n `Reorder cancelled. ${name} returned to original position.`,\n );\n this._keyboardGrabbedId = null;\n getDb()\n .then((db) => this.updateTaskList(db))\n .catch(console.error);\n return;\n }\n\n if (e.key === \" \" || e.key === \"Spacebar\" || e.key === \"Enter\") {\n // Drop\n e.preventDefault();\n const pos = ids.indexOf(this._keyboardGrabbedId) + 1;\n const droppedName =\n tasks.find((t) => t.id === this._keyboardGrabbedId)?.name || \"Task\";\n this._announce(\n `${droppedName} dropped at position ${pos} of ${total}. Reordering complete.`,\n );\n this._keyboardGrabbedId = null;\n getDb()\n .then((db) => this.updateTaskList(db))\n .catch(console.error);\n return;\n }\n\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n const currentIdx = ids.indexOf(this._keyboardGrabbedId);\n const newIdx = e.key === \"ArrowUp\" ? currentIdx - 1 : currentIdx + 1;\n if (newIdx < 0 || newIdx >= total) {\n return;\n }\n\n // Swap\n ids.splice(currentIdx, 1);\n ids.splice(newIdx, 0, this._keyboardGrabbedId);\n this._announce(`Moved to position ${newIdx + 1} of ${total}.`);\n this.handleReorder(this._keyboardGrabbedId, ids[currentIdx], ids);\n }\n }\n\n _itemAtPoint(x: number, y: number): Element | null {\n const root = this.shadowRoot;\n if (!root) {\n return null;\n }\n\n const el = root.elementFromPoint(x, y);\n return el?.closest?.(\".tasks__item\") || null;\n }\n\n _startAutoScroll() {\n if (this._autoScrollActive) {\n return;\n }\n this._autoScrollActive = true;\n\n const scrollLoop = () => {\n if (!this._autoScrollActive) {\n return;\n }\n\n const root = this.shadowRoot;\n const content = root?.querySelector(\n \".tasks__content\",\n ) as HTMLElement | null;\n if (content && this._autoScrollSpeed !== 0) {\n content.scrollTop += this._autoScrollSpeed;\n }\n\n requestAnimationFrame(scrollLoop);\n };\n\n requestAnimationFrame(scrollLoop);\n }\n\n _stopAutoScroll() {\n this._autoScrollActive = false;\n this._autoScrollSpeed = 0;\n }\n\n _updateAutoScrollSpeed(clientY: number) {\n const root = this.shadowRoot;\n const content = root?.querySelector(\n \".tasks__content\",\n ) as HTMLElement | null;\n if (!content) {\n this._autoScrollSpeed = 0;\n return;\n }\n\n const rect = content.getBoundingClientRect();\n const threshold = 50; // pixels from top/bottom to start scrolling\n\n const distTop = clientY - rect.top;\n const distBottom = rect.bottom - clientY;\n\n if (distTop >= 0 && distTop < threshold) {\n // Near the top: scroll up. Speed is faster the closer to the edge.\n this._autoScrollSpeed = -((threshold - distTop) / threshold) * 8;\n this._startAutoScroll();\n } else if (distBottom >= 0 && distBottom < threshold) {\n // Near the bottom: scroll down.\n this._autoScrollSpeed = ((threshold - distBottom) / threshold) * 8;\n this._startAutoScroll();\n } else {\n this._autoScrollSpeed = 0;\n }\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawTasks);\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import ShadowClawElement from "./components/shadow-claw-element.js";
|
|
2
|
-
import { C as sendTerminalInput, S as openTerminalSession, t as orchestratorStore, x as closeTerminalSession } from "./orchestrator-
|
|
2
|
+
import { C as sendTerminalInput, S as openTerminalSession, t as orchestratorStore, x as closeTerminalSession } from "./orchestrator-KRjx0eba.js";
|
|
3
3
|
|
|
4
4
|
//#region src/components/shadow-claw-terminal/utils/extractLastPromptLine.ts
|
|
5
5
|
function extractLastPromptLine(text) {
|
|
@@ -703,4 +703,4 @@ customElements.define("shadow-claw-terminal", ShadowClawTerminal);
|
|
|
703
703
|
|
|
704
704
|
//#endregion
|
|
705
705
|
export { ShadowClawTerminal as n, AUTO_SCROLL_BOTTOM_THRESHOLD_PX as t };
|
|
706
|
-
//# sourceMappingURL=shadow-claw-terminal-
|
|
706
|
+
//# sourceMappingURL=shadow-claw-terminal-CwScROlu.js.map
|
package/dist/lib/{shadow-claw-terminal-kB6_tWKz.js.map → shadow-claw-terminal-CwScROlu.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shadow-claw-terminal-kB6_tWKz.js","names":["shadowClawTerminalStyles","shadowClawTerminalTemplate"],"sources":["../../src/components/shadow-claw-terminal/utils/extractLastPromptLine.ts","../../src/components/shadow-claw-terminal/utils/isNearBottom.ts","../../src/components/shadow-claw-terminal/utils/consumeEscapeSequence.ts","../../src/components/shadow-claw-terminal/utils/stripInternalVMNoise.ts","../../src/components/shadow-claw-terminal/utils/normalizeTerminalText.ts","../../src/components/shadow-claw-terminal/shadow-claw-terminal.ts"],"sourcesContent":["export function extractLastPromptLine(text: string): string {\n if (!text) {\n return \"\";\n }\n\n const lines = text.split(\"\\n\");\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index] || \"\";\n if (/[#$](?:\\s|$)/.test(line)) {\n return line;\n }\n }\n\n return \"\";\n}\n","import { AUTO_SCROLL_BOTTOM_THRESHOLD_PX } from \"../shadow-claw-terminal.js\";\n\nexport function isNearBottom(screen: HTMLElement): boolean {\n const distanceToBottom =\n screen.scrollHeight - (screen.scrollTop + screen.clientHeight);\n\n return distanceToBottom <= AUTO_SCROLL_BOTTOM_THRESHOLD_PX;\n}\n","export function consumeEscapeSequence(text: string, startIndex: number) {\n const nextChar = text[startIndex + 1];\n\n if (nextChar === undefined) {\n return { action: \"ignore\", nextIndex: startIndex + 1, incomplete: true };\n }\n\n if (nextChar === \"[\") {\n let cursor = startIndex + 2;\n\n while (cursor < text.length) {\n const code = text.charCodeAt(cursor);\n\n if (code >= 0x40 && code <= 0x7e) {\n const finalChar = text[cursor];\n\n if (finalChar === \"J\") {\n return { action: \"clear-screen\", nextIndex: cursor + 1 };\n }\n\n if (finalChar === \"K\") {\n return { action: \"clear-line\", nextIndex: cursor + 1 };\n }\n\n return { action: \"ignore\", nextIndex: cursor + 1 };\n }\n\n cursor += 1;\n }\n\n return { action: \"ignore\", nextIndex: text.length, incomplete: true };\n }\n\n if (nextChar === \"]\") {\n let cursor = startIndex + 2;\n\n while (cursor < text.length) {\n const char = text[cursor];\n\n if (char === \"\\u0007\") {\n return { action: \"ignore\", nextIndex: cursor + 1 };\n }\n\n if (char === \"\\u001b\" && text[cursor + 1] === \"\\\\\") {\n return { action: \"ignore\", nextIndex: cursor + 2 };\n }\n\n cursor += 1;\n }\n\n return { action: \"ignore\", nextIndex: text.length, incomplete: true };\n }\n\n return {\n action: \"ignore\",\n nextIndex: Math.min(startIndex + 2, text.length),\n };\n}\n","/**\n * Remove internal WebVM control markers and setup command echoes from the\n * visible terminal output. These are implementation details, not user output.\n */\nexport function stripInternalVMNoise(text: string) {\n const withoutInternalCommandEcho = text.replace(\n /(?:^|\\n)[^\\n]*mkdir -p \\/home\\/user 2>&1; echo \"?__BCDONE_\\d+__\\$\\?\"?[^\\n]*(?:\\n|$)/g,\n \"\\n\",\n );\n\n const withoutMarkers = withoutInternalCommandEcho.replace(\n /(?:^|\\n)\\s*__BCDONE_\\d+__(?:\\d+|\\$\\?)?\\s*(?:\\n|$)/g,\n \"\\n\",\n );\n\n return withoutMarkers.replace(/^\\n+(?=\\S)/, \"\");\n}\n","import { consumeEscapeSequence } from \"./consumeEscapeSequence.js\";\nimport { stripInternalVMNoise } from \"./stripInternalVMNoise.js\";\n\n/**\n * Apply minimal terminal control character handling to the visible buffer.\n *\n * Returns the updated text and any trailing incomplete escape sequence to be\n * prepended to the next chunk (cross-chunk boundary handling).\n */\nexport function normalizeTerminalText(\n current: string,\n chunk: string,\n pendingEscape = \"\",\n options: { respectEraseSequences?: boolean },\n) {\n const respectEraseSequences = options?.respectEraseSequences ?? true;\n const input = pendingEscape + chunk;\n let next = current;\n\n for (let index = 0; index < input.length; index++) {\n const char = input[index];\n\n if (char === \"\\u001b\") {\n const escape = consumeEscapeSequence(input, index);\n\n if (escape.incomplete) {\n return { text: next, pending: input.slice(index) };\n }\n\n if (escape.action === \"clear-screen\" && respectEraseSequences) {\n next = \"\";\n }\n\n if (escape.action === \"clear-line\" && respectEraseSequences) {\n const lastLineBreak = next.lastIndexOf(\"\\n\");\n next = lastLineBreak === -1 ? \"\" : next.slice(0, lastLineBreak + 1);\n }\n\n index = escape.nextIndex - 1;\n\n continue;\n }\n\n if (char === \"\\r\") {\n const nextChar = input[index + 1];\n\n if (nextChar === \"\\n\") {\n // CRLF: skip the CR, let the LF be processed normally.\n\n continue;\n }\n\n if (nextChar !== undefined) {\n // Lone CR within the same chunk: cursor back to column 0,\n // overwriting the current line (e.g. shell prompt redraw).\n const lastLineBreak = next.lastIndexOf(\"\\n\");\n next = lastLineBreak === -1 ? \"\" : next.slice(0, lastLineBreak + 1);\n\n continue;\n }\n\n // CR at end of chunk — we can't tell yet whether it's CR or CRLF.\n // Defer it so the next chunk can resolve the ambiguity.\n\n return { text: next, pending: \"\\r\" };\n }\n\n if (char === \"\\b\" || char === \"\\u007f\") {\n next = next.slice(0, -1);\n\n continue;\n }\n\n if ((char < \" \" && char !== \"\\n\" && char !== \"\\t\") || char === \"\\u0007\") {\n continue;\n }\n\n next += char;\n }\n\n // Drop internal command protocol noise used by VM command execution.\n next = stripInternalVMNoise(next);\n\n return { text: next, pending: \"\" };\n}\n","import {\n closeTerminalSession,\n openTerminalSession,\n sendTerminalInput,\n} from \"../../core/orchestrator/utils/operations/vm.js\";\n\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\nimport { VMStatusPayload } from \"../../subsystems/worker/types.js\";\n\nimport { extractLastPromptLine } from \"./utils/extractLastPromptLine.js\";\nimport { isNearBottom } from \"./utils/isNearBottom.js\";\nimport { normalizeTerminalText } from \"./utils/normalizeTerminalText.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawTerminalStyles from \"./shadow-claw-terminal.css\" with { type: \"css\" };\nimport shadowClawTerminalTemplate from \"./shadow-claw-terminal.html\" with { type: \"html\" };\n\nconst MAX_OUTPUT_LENGTH = 80_000;\n\nexport const AUTO_SCROLL_BOTTOM_THRESHOLD_PX = 12;\nexport class ShadowClawTerminal extends ShadowClawElement {\n static styles = shadowClawTerminalStyles;\n static template = shadowClawTerminalTemplate;\n\n autoScrollEnabled: boolean;\n bootRequested: boolean;\n connectedToWorkerTerminal: boolean;\n isApplyingAutoScroll: boolean;\n orchestrator: any | null;\n outputBuffer: string;\n pendingAutoScrollFrame: number | null;\n pendingEscape: string;\n screenResizeObserver: ResizeObserver | null;\n session: any | null;\n terminalAttachRequested: boolean;\n vmStatus: any;\n\n constructor() {\n super();\n\n this.session = null;\n this.outputBuffer = \"\";\n this.pendingEscape = \"\";\n this.bootRequested = false;\n this.orchestrator = orchestratorStore.orchestrator;\n this.vmStatus = {\n ready: false,\n booting: false,\n bootAttempted: false,\n error: null,\n };\n\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n this.autoScrollEnabled = true;\n this.isApplyingAutoScroll = false;\n this.pendingAutoScrollFrame = null;\n this.screenResizeObserver = null;\n }\n\n async connectedCallback() {\n await this.render();\n this.renderOutput();\n\n this.bindEventListeners();\n this.bindResizeObserver();\n\n this.connectOrchestrator();\n this.startTerminal();\n }\n\n disconnectedCallback() {\n if (this.pendingAutoScrollFrame !== null) {\n cancelAnimationFrame(this.pendingAutoScrollFrame);\n this.pendingAutoScrollFrame = null;\n }\n\n this.screenResizeObserver?.disconnect();\n this.screenResizeObserver = null;\n\n super.disconnectedCallback();\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n if (this.orchestrator) {\n closeTerminalSession(this.orchestrator, orchestratorStore.activeGroupId);\n }\n }\n\n appendOutput(chunk) {\n const result = normalizeTerminalText(\n this.outputBuffer,\n chunk,\n this.pendingEscape,\n {\n // During boot we prefer a stable transcript over VT100 erase semantics.\n // Some boot paths clear the screen repeatedly, which otherwise leaves the\n // visible panel blank even though boot text was received.\n respectEraseSequences: this.vmStatus.ready,\n },\n );\n this.outputBuffer = result.text;\n this.pendingEscape = result.pending;\n\n if (this.outputBuffer.length > MAX_OUTPUT_LENGTH) {\n this.outputBuffer = this.outputBuffer.slice(-MAX_OUTPUT_LENGTH);\n }\n\n this.renderOutput();\n }\n\n attachSession() {\n if (this.connectedToWorkerTerminal || this.terminalAttachRequested) {\n return;\n }\n\n // Fresh boot attach should start with a clean terminal viewport.\n if (!this.vmStatus.ready) {\n this.clearOutput();\n }\n\n if (!this.orchestrator) {\n console.warn(\n \"[ShadowClawTerminal] Cannot attach session: orchestrator not initialized.\",\n );\n\n return;\n }\n\n this.terminalAttachRequested = true;\n openTerminalSession(this.orchestrator, orchestratorStore.activeGroupId);\n }\n\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-role=\"composer\"]')\n ?.addEventListener(\"submit\", (event) => {\n event.preventDefault();\n this.runCommand();\n });\n\n root\n .querySelector('[data-action=\"clear\"]')\n ?.addEventListener(\"click\", () => this.clearOutput());\n\n root\n .querySelector('[data-action=\"interrupt\"]')\n ?.addEventListener(\"click\", () => this.interrupt());\n\n root\n .querySelector('[data-role=\"screen\"]')\n ?.addEventListener(\"click\", () => {\n const input = this.getInput();\n input?.focus();\n });\n\n root\n .querySelector('[data-role=\"screen\"]')\n ?.addEventListener(\"scroll\", () => this.handleScreenScroll());\n }\n\n bindResizeObserver() {\n if (typeof ResizeObserver === \"undefined\") {\n return;\n }\n\n const screen = this.getScreen();\n if (!screen) {\n return;\n }\n\n this.screenResizeObserver = new ResizeObserver(() => {\n if (this.autoScrollEnabled) {\n this.scheduleAutoScroll();\n }\n });\n\n this.screenResizeObserver.observe(screen);\n }\n\n clearOutput() {\n const preservedPrompt =\n this.vmStatus.ready && this.connectedToWorkerTerminal\n ? extractLastPromptLine(this.outputBuffer)\n : \"\";\n\n this.outputBuffer = \"\";\n this.pendingEscape = \"\";\n this.autoScrollEnabled = true;\n\n if (preservedPrompt) {\n this.outputBuffer = preservedPrompt;\n }\n\n this.renderOutput();\n }\n\n connectOrchestrator() {\n if (!this.orchestrator) {\n return;\n }\n\n const statusListener = (status: VMStatusPayload) => {\n this.vmStatus = status;\n this.updateStatus(status);\n\n if (\n !status.error &&\n !this.connectedToWorkerTerminal &&\n !this.terminalAttachRequested\n ) {\n this.attachSession();\n }\n };\n\n const outputListener = ({ chunk }: { chunk: string }) => {\n this.appendOutput(chunk);\n };\n\n const openedListener = () => {\n this.connectedToWorkerTerminal = true;\n this.terminalAttachRequested = false;\n this.updateStatus(this.vmStatus);\n\n this.getInput()?.focus();\n };\n\n const closedListener = () => {\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n\n this.updateStatus(this.vmStatus);\n };\n\n const errorListener = ({ error }: { error: string }) => {\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n this.vmStatus = {\n ...this.vmStatus,\n error: typeof error === \"string\" ? error : \"WebVM terminal error\",\n };\n\n this.updateStatus(this.vmStatus);\n };\n\n this.orchestrator.events.on(\"vm-status\", statusListener);\n this.orchestrator.events.on(\"vm-terminal-output\", outputListener);\n this.orchestrator.events.on(\"vm-terminal-opened\", openedListener);\n this.orchestrator.events.on(\"vm-terminal-closed\", closedListener);\n this.orchestrator.events.on(\"vm-terminal-error\", errorListener);\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-status\", statusListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-output\", outputListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-opened\", openedListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-closed\", closedListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-error\", errorListener),\n );\n\n this.vmStatus = this.orchestrator.vmStatus || this.vmStatus;\n this.updateStatus(this.vmStatus);\n }\n\n getInput() {\n const input = this.shadowRoot?.querySelector('[data-role=\"input\"]');\n\n return input instanceof HTMLInputElement ? input : null;\n }\n\n getScreen() {\n const screen = this.shadowRoot?.querySelector('[data-role=\"screen\"]');\n\n return screen instanceof HTMLElement ? screen : null;\n }\n\n handleScreenScroll() {\n if (this.isApplyingAutoScroll) {\n return;\n }\n\n const screen = this.getScreen();\n if (!screen) {\n return;\n }\n\n this.autoScrollEnabled = isNearBottom(screen);\n }\n\n interrupt() {\n if (this.orchestrator) {\n sendTerminalInput(this.orchestrator, \"\\u0003\");\n }\n }\n\n renderOutput() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const output = root.querySelector('[data-role=\"output\"]');\n const screen = root.querySelector('[data-role=\"screen\"]');\n\n if (!(output instanceof HTMLElement) || !(screen instanceof HTMLElement)) {\n return;\n }\n\n output.textContent = this.outputBuffer;\n\n if (this.autoScrollEnabled) {\n this.scheduleAutoScroll();\n }\n }\n\n runCommand() {\n const input = this.getInput();\n if (!input || !this.connectedToWorkerTerminal) {\n return;\n }\n\n const command = input.value;\n\n if (!command.trim()) {\n return;\n }\n\n if (this.orchestrator) {\n sendTerminalInput(this.orchestrator, `${command}\\n`);\n }\n input.value = \"\";\n }\n\n scheduleAutoScroll() {\n if (this.pendingAutoScrollFrame !== null) {\n cancelAnimationFrame(this.pendingAutoScrollFrame);\n }\n\n this.pendingAutoScrollFrame = requestAnimationFrame(() => {\n this.pendingAutoScrollFrame = null;\n this.scrollScreenToBottom();\n });\n }\n\n scrollScreenToBottom() {\n const screen = this.getScreen();\n if (!screen) {\n return;\n }\n\n this.isApplyingAutoScroll = true;\n screen.scrollTop = screen.scrollHeight;\n this.isApplyingAutoScroll = false;\n this.autoScrollEnabled = isNearBottom(screen);\n }\n\n updateStatus(status: VMStatusPayload) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const statusEl = root.querySelector('[data-role=\"status\"]');\n const input = this.getInput();\n const runButton = root.querySelector('[data-action=\"run\"]');\n const interruptButton = root.querySelector('[data-action=\"interrupt\"]');\n\n if (\n !(statusEl instanceof HTMLElement) ||\n !(runButton instanceof HTMLButtonElement) ||\n !(interruptButton instanceof HTMLButtonElement)\n ) {\n return;\n }\n\n if (status.ready) {\n statusEl.dataset.state = \"ready\";\n statusEl.textContent = this.connectedToWorkerTerminal\n ? \"Connected to Alpine WebVM\"\n : \"WebVM ready. Connecting terminal...\";\n } else if (status.error) {\n statusEl.dataset.state = \"error\";\n statusEl.textContent = `WebVM unavailable: ${status.error}`;\n } else {\n statusEl.dataset.state = \"booting\";\n statusEl.textContent = status.booting\n ? \"Booting WebVM...\"\n : \"Waiting for WebVM...\";\n }\n\n if (input instanceof HTMLInputElement) {\n input.disabled = !(status.ready && this.connectedToWorkerTerminal);\n input.placeholder =\n status.ready && this.connectedToWorkerTerminal\n ? \"Type a shell command\"\n : status.ready\n ? \"Connecting to WebVM terminal...\"\n : status.error\n ? \"WebVM unavailable\"\n : \"Booting WebVM...\";\n }\n\n runButton.disabled = !(status.ready && this.connectedToWorkerTerminal);\n interruptButton.disabled = !(\n status.ready && this.connectedToWorkerTerminal\n );\n }\n\n async startTerminal() {\n const status = this.vmStatus;\n\n if (!this.orchestrator) {\n this.updateStatus({\n ready: false,\n booting: false,\n bootAttempted: false,\n error: \"Terminal bridge is unavailable.\",\n });\n\n return;\n }\n\n if (status.ready) {\n this.attachSession();\n\n return;\n }\n\n if (status.error) {\n this.updateStatus(status);\n\n return;\n }\n\n if (!this.bootRequested) {\n this.bootRequested = true;\n this.attachSession();\n }\n\n if (!this.isConnected || !this.connectedToWorkerTerminal) {\n this.updateStatus(this.vmStatus);\n\n return;\n }\n\n this.attachSession();\n }\n}\n\ncustomElements.define(\"shadow-claw-terminal\", ShadowClawTerminal);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shadow-claw-terminal-CwScROlu.js","names":["shadowClawTerminalStyles","shadowClawTerminalTemplate"],"sources":["../../src/components/shadow-claw-terminal/utils/extractLastPromptLine.ts","../../src/components/shadow-claw-terminal/utils/isNearBottom.ts","../../src/components/shadow-claw-terminal/utils/consumeEscapeSequence.ts","../../src/components/shadow-claw-terminal/utils/stripInternalVMNoise.ts","../../src/components/shadow-claw-terminal/utils/normalizeTerminalText.ts","../../src/components/shadow-claw-terminal/shadow-claw-terminal.ts"],"sourcesContent":["export function extractLastPromptLine(text: string): string {\n if (!text) {\n return \"\";\n }\n\n const lines = text.split(\"\\n\");\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index] || \"\";\n if (/[#$](?:\\s|$)/.test(line)) {\n return line;\n }\n }\n\n return \"\";\n}\n","import { AUTO_SCROLL_BOTTOM_THRESHOLD_PX } from \"../shadow-claw-terminal.js\";\n\nexport function isNearBottom(screen: HTMLElement): boolean {\n const distanceToBottom =\n screen.scrollHeight - (screen.scrollTop + screen.clientHeight);\n\n return distanceToBottom <= AUTO_SCROLL_BOTTOM_THRESHOLD_PX;\n}\n","export function consumeEscapeSequence(text: string, startIndex: number) {\n const nextChar = text[startIndex + 1];\n\n if (nextChar === undefined) {\n return { action: \"ignore\", nextIndex: startIndex + 1, incomplete: true };\n }\n\n if (nextChar === \"[\") {\n let cursor = startIndex + 2;\n\n while (cursor < text.length) {\n const code = text.charCodeAt(cursor);\n\n if (code >= 0x40 && code <= 0x7e) {\n const finalChar = text[cursor];\n\n if (finalChar === \"J\") {\n return { action: \"clear-screen\", nextIndex: cursor + 1 };\n }\n\n if (finalChar === \"K\") {\n return { action: \"clear-line\", nextIndex: cursor + 1 };\n }\n\n return { action: \"ignore\", nextIndex: cursor + 1 };\n }\n\n cursor += 1;\n }\n\n return { action: \"ignore\", nextIndex: text.length, incomplete: true };\n }\n\n if (nextChar === \"]\") {\n let cursor = startIndex + 2;\n\n while (cursor < text.length) {\n const char = text[cursor];\n\n if (char === \"\\u0007\") {\n return { action: \"ignore\", nextIndex: cursor + 1 };\n }\n\n if (char === \"\\u001b\" && text[cursor + 1] === \"\\\\\") {\n return { action: \"ignore\", nextIndex: cursor + 2 };\n }\n\n cursor += 1;\n }\n\n return { action: \"ignore\", nextIndex: text.length, incomplete: true };\n }\n\n return {\n action: \"ignore\",\n nextIndex: Math.min(startIndex + 2, text.length),\n };\n}\n","/**\n * Remove internal WebVM control markers and setup command echoes from the\n * visible terminal output. These are implementation details, not user output.\n */\nexport function stripInternalVMNoise(text: string) {\n const withoutInternalCommandEcho = text.replace(\n /(?:^|\\n)[^\\n]*mkdir -p \\/home\\/user 2>&1; echo \"?__BCDONE_\\d+__\\$\\?\"?[^\\n]*(?:\\n|$)/g,\n \"\\n\",\n );\n\n const withoutMarkers = withoutInternalCommandEcho.replace(\n /(?:^|\\n)\\s*__BCDONE_\\d+__(?:\\d+|\\$\\?)?\\s*(?:\\n|$)/g,\n \"\\n\",\n );\n\n return withoutMarkers.replace(/^\\n+(?=\\S)/, \"\");\n}\n","import { consumeEscapeSequence } from \"./consumeEscapeSequence.js\";\nimport { stripInternalVMNoise } from \"./stripInternalVMNoise.js\";\n\n/**\n * Apply minimal terminal control character handling to the visible buffer.\n *\n * Returns the updated text and any trailing incomplete escape sequence to be\n * prepended to the next chunk (cross-chunk boundary handling).\n */\nexport function normalizeTerminalText(\n current: string,\n chunk: string,\n pendingEscape = \"\",\n options: { respectEraseSequences?: boolean },\n) {\n const respectEraseSequences = options?.respectEraseSequences ?? true;\n const input = pendingEscape + chunk;\n let next = current;\n\n for (let index = 0; index < input.length; index++) {\n const char = input[index];\n\n if (char === \"\\u001b\") {\n const escape = consumeEscapeSequence(input, index);\n\n if (escape.incomplete) {\n return { text: next, pending: input.slice(index) };\n }\n\n if (escape.action === \"clear-screen\" && respectEraseSequences) {\n next = \"\";\n }\n\n if (escape.action === \"clear-line\" && respectEraseSequences) {\n const lastLineBreak = next.lastIndexOf(\"\\n\");\n next = lastLineBreak === -1 ? \"\" : next.slice(0, lastLineBreak + 1);\n }\n\n index = escape.nextIndex - 1;\n\n continue;\n }\n\n if (char === \"\\r\") {\n const nextChar = input[index + 1];\n\n if (nextChar === \"\\n\") {\n // CRLF: skip the CR, let the LF be processed normally.\n\n continue;\n }\n\n if (nextChar !== undefined) {\n // Lone CR within the same chunk: cursor back to column 0,\n // overwriting the current line (e.g. shell prompt redraw).\n const lastLineBreak = next.lastIndexOf(\"\\n\");\n next = lastLineBreak === -1 ? \"\" : next.slice(0, lastLineBreak + 1);\n\n continue;\n }\n\n // CR at end of chunk — we can't tell yet whether it's CR or CRLF.\n // Defer it so the next chunk can resolve the ambiguity.\n\n return { text: next, pending: \"\\r\" };\n }\n\n if (char === \"\\b\" || char === \"\\u007f\") {\n next = next.slice(0, -1);\n\n continue;\n }\n\n if ((char < \" \" && char !== \"\\n\" && char !== \"\\t\") || char === \"\\u0007\") {\n continue;\n }\n\n next += char;\n }\n\n // Drop internal command protocol noise used by VM command execution.\n next = stripInternalVMNoise(next);\n\n return { text: next, pending: \"\" };\n}\n","import {\n closeTerminalSession,\n openTerminalSession,\n sendTerminalInput,\n} from \"../../core/orchestrator/utils/operations/vm.js\";\n\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\nimport { VMStatusPayload } from \"../../subsystems/worker/types.js\";\n\nimport { extractLastPromptLine } from \"./utils/extractLastPromptLine.js\";\nimport { isNearBottom } from \"./utils/isNearBottom.js\";\nimport { normalizeTerminalText } from \"./utils/normalizeTerminalText.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawTerminalStyles from \"./shadow-claw-terminal.css\" with { type: \"css\" };\nimport shadowClawTerminalTemplate from \"./shadow-claw-terminal.html\" with { type: \"html\" };\n\nconst MAX_OUTPUT_LENGTH = 80_000;\n\nexport const AUTO_SCROLL_BOTTOM_THRESHOLD_PX = 12;\nexport class ShadowClawTerminal extends ShadowClawElement {\n static styles = shadowClawTerminalStyles;\n static template = shadowClawTerminalTemplate;\n\n autoScrollEnabled: boolean;\n bootRequested: boolean;\n connectedToWorkerTerminal: boolean;\n isApplyingAutoScroll: boolean;\n orchestrator: any | null;\n outputBuffer: string;\n pendingAutoScrollFrame: number | null;\n pendingEscape: string;\n screenResizeObserver: ResizeObserver | null;\n session: any | null;\n terminalAttachRequested: boolean;\n vmStatus: any;\n\n constructor() {\n super();\n\n this.session = null;\n this.outputBuffer = \"\";\n this.pendingEscape = \"\";\n this.bootRequested = false;\n this.orchestrator = orchestratorStore.orchestrator;\n this.vmStatus = {\n ready: false,\n booting: false,\n bootAttempted: false,\n error: null,\n };\n\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n this.autoScrollEnabled = true;\n this.isApplyingAutoScroll = false;\n this.pendingAutoScrollFrame = null;\n this.screenResizeObserver = null;\n }\n\n async connectedCallback() {\n await this.render();\n this.renderOutput();\n\n this.bindEventListeners();\n this.bindResizeObserver();\n\n this.connectOrchestrator();\n this.startTerminal();\n }\n\n disconnectedCallback() {\n if (this.pendingAutoScrollFrame !== null) {\n cancelAnimationFrame(this.pendingAutoScrollFrame);\n this.pendingAutoScrollFrame = null;\n }\n\n this.screenResizeObserver?.disconnect();\n this.screenResizeObserver = null;\n\n super.disconnectedCallback();\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n if (this.orchestrator) {\n closeTerminalSession(this.orchestrator, orchestratorStore.activeGroupId);\n }\n }\n\n appendOutput(chunk) {\n const result = normalizeTerminalText(\n this.outputBuffer,\n chunk,\n this.pendingEscape,\n {\n // During boot we prefer a stable transcript over VT100 erase semantics.\n // Some boot paths clear the screen repeatedly, which otherwise leaves the\n // visible panel blank even though boot text was received.\n respectEraseSequences: this.vmStatus.ready,\n },\n );\n this.outputBuffer = result.text;\n this.pendingEscape = result.pending;\n\n if (this.outputBuffer.length > MAX_OUTPUT_LENGTH) {\n this.outputBuffer = this.outputBuffer.slice(-MAX_OUTPUT_LENGTH);\n }\n\n this.renderOutput();\n }\n\n attachSession() {\n if (this.connectedToWorkerTerminal || this.terminalAttachRequested) {\n return;\n }\n\n // Fresh boot attach should start with a clean terminal viewport.\n if (!this.vmStatus.ready) {\n this.clearOutput();\n }\n\n if (!this.orchestrator) {\n console.warn(\n \"[ShadowClawTerminal] Cannot attach session: orchestrator not initialized.\",\n );\n\n return;\n }\n\n this.terminalAttachRequested = true;\n openTerminalSession(this.orchestrator, orchestratorStore.activeGroupId);\n }\n\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-role=\"composer\"]')\n ?.addEventListener(\"submit\", (event) => {\n event.preventDefault();\n this.runCommand();\n });\n\n root\n .querySelector('[data-action=\"clear\"]')\n ?.addEventListener(\"click\", () => this.clearOutput());\n\n root\n .querySelector('[data-action=\"interrupt\"]')\n ?.addEventListener(\"click\", () => this.interrupt());\n\n root\n .querySelector('[data-role=\"screen\"]')\n ?.addEventListener(\"click\", () => {\n const input = this.getInput();\n input?.focus();\n });\n\n root\n .querySelector('[data-role=\"screen\"]')\n ?.addEventListener(\"scroll\", () => this.handleScreenScroll());\n }\n\n bindResizeObserver() {\n if (typeof ResizeObserver === \"undefined\") {\n return;\n }\n\n const screen = this.getScreen();\n if (!screen) {\n return;\n }\n\n this.screenResizeObserver = new ResizeObserver(() => {\n if (this.autoScrollEnabled) {\n this.scheduleAutoScroll();\n }\n });\n\n this.screenResizeObserver.observe(screen);\n }\n\n clearOutput() {\n const preservedPrompt =\n this.vmStatus.ready && this.connectedToWorkerTerminal\n ? extractLastPromptLine(this.outputBuffer)\n : \"\";\n\n this.outputBuffer = \"\";\n this.pendingEscape = \"\";\n this.autoScrollEnabled = true;\n\n if (preservedPrompt) {\n this.outputBuffer = preservedPrompt;\n }\n\n this.renderOutput();\n }\n\n connectOrchestrator() {\n if (!this.orchestrator) {\n return;\n }\n\n const statusListener = (status: VMStatusPayload) => {\n this.vmStatus = status;\n this.updateStatus(status);\n\n if (\n !status.error &&\n !this.connectedToWorkerTerminal &&\n !this.terminalAttachRequested\n ) {\n this.attachSession();\n }\n };\n\n const outputListener = ({ chunk }: { chunk: string }) => {\n this.appendOutput(chunk);\n };\n\n const openedListener = () => {\n this.connectedToWorkerTerminal = true;\n this.terminalAttachRequested = false;\n this.updateStatus(this.vmStatus);\n\n this.getInput()?.focus();\n };\n\n const closedListener = () => {\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n\n this.updateStatus(this.vmStatus);\n };\n\n const errorListener = ({ error }: { error: string }) => {\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n this.vmStatus = {\n ...this.vmStatus,\n error: typeof error === \"string\" ? error : \"WebVM terminal error\",\n };\n\n this.updateStatus(this.vmStatus);\n };\n\n this.orchestrator.events.on(\"vm-status\", statusListener);\n this.orchestrator.events.on(\"vm-terminal-output\", outputListener);\n this.orchestrator.events.on(\"vm-terminal-opened\", openedListener);\n this.orchestrator.events.on(\"vm-terminal-closed\", closedListener);\n this.orchestrator.events.on(\"vm-terminal-error\", errorListener);\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-status\", statusListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-output\", outputListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-opened\", openedListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-closed\", closedListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-error\", errorListener),\n );\n\n this.vmStatus = this.orchestrator.vmStatus || this.vmStatus;\n this.updateStatus(this.vmStatus);\n }\n\n getInput() {\n const input = this.shadowRoot?.querySelector('[data-role=\"input\"]');\n\n return input instanceof HTMLInputElement ? input : null;\n }\n\n getScreen() {\n const screen = this.shadowRoot?.querySelector('[data-role=\"screen\"]');\n\n return screen instanceof HTMLElement ? screen : null;\n }\n\n handleScreenScroll() {\n if (this.isApplyingAutoScroll) {\n return;\n }\n\n const screen = this.getScreen();\n if (!screen) {\n return;\n }\n\n this.autoScrollEnabled = isNearBottom(screen);\n }\n\n interrupt() {\n if (this.orchestrator) {\n sendTerminalInput(this.orchestrator, \"\\u0003\");\n }\n }\n\n renderOutput() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const output = root.querySelector('[data-role=\"output\"]');\n const screen = root.querySelector('[data-role=\"screen\"]');\n\n if (!(output instanceof HTMLElement) || !(screen instanceof HTMLElement)) {\n return;\n }\n\n output.textContent = this.outputBuffer;\n\n if (this.autoScrollEnabled) {\n this.scheduleAutoScroll();\n }\n }\n\n runCommand() {\n const input = this.getInput();\n if (!input || !this.connectedToWorkerTerminal) {\n return;\n }\n\n const command = input.value;\n\n if (!command.trim()) {\n return;\n }\n\n if (this.orchestrator) {\n sendTerminalInput(this.orchestrator, `${command}\\n`);\n }\n input.value = \"\";\n }\n\n scheduleAutoScroll() {\n if (this.pendingAutoScrollFrame !== null) {\n cancelAnimationFrame(this.pendingAutoScrollFrame);\n }\n\n this.pendingAutoScrollFrame = requestAnimationFrame(() => {\n this.pendingAutoScrollFrame = null;\n this.scrollScreenToBottom();\n });\n }\n\n scrollScreenToBottom() {\n const screen = this.getScreen();\n if (!screen) {\n return;\n }\n\n this.isApplyingAutoScroll = true;\n screen.scrollTop = screen.scrollHeight;\n this.isApplyingAutoScroll = false;\n this.autoScrollEnabled = isNearBottom(screen);\n }\n\n updateStatus(status: VMStatusPayload) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const statusEl = root.querySelector('[data-role=\"status\"]');\n const input = this.getInput();\n const runButton = root.querySelector('[data-action=\"run\"]');\n const interruptButton = root.querySelector('[data-action=\"interrupt\"]');\n\n if (\n !(statusEl instanceof HTMLElement) ||\n !(runButton instanceof HTMLButtonElement) ||\n !(interruptButton instanceof HTMLButtonElement)\n ) {\n return;\n }\n\n if (status.ready) {\n statusEl.dataset.state = \"ready\";\n statusEl.textContent = this.connectedToWorkerTerminal\n ? \"Connected to Alpine WebVM\"\n : \"WebVM ready. Connecting terminal...\";\n } else if (status.error) {\n statusEl.dataset.state = \"error\";\n statusEl.textContent = `WebVM unavailable: ${status.error}`;\n } else {\n statusEl.dataset.state = \"booting\";\n statusEl.textContent = status.booting\n ? \"Booting WebVM...\"\n : \"Waiting for WebVM...\";\n }\n\n if (input instanceof HTMLInputElement) {\n input.disabled = !(status.ready && this.connectedToWorkerTerminal);\n input.placeholder =\n status.ready && this.connectedToWorkerTerminal\n ? \"Type a shell command\"\n : status.ready\n ? \"Connecting to WebVM terminal...\"\n : status.error\n ? \"WebVM unavailable\"\n : \"Booting WebVM...\";\n }\n\n runButton.disabled = !(status.ready && this.connectedToWorkerTerminal);\n interruptButton.disabled = !(\n status.ready && this.connectedToWorkerTerminal\n );\n }\n\n async startTerminal() {\n const status = this.vmStatus;\n\n if (!this.orchestrator) {\n this.updateStatus({\n ready: false,\n booting: false,\n bootAttempted: false,\n error: \"Terminal bridge is unavailable.\",\n });\n\n return;\n }\n\n if (status.ready) {\n this.attachSession();\n\n return;\n }\n\n if (status.error) {\n this.updateStatus(status);\n\n return;\n }\n\n if (!this.bootRequested) {\n this.bootRequested = true;\n this.attachSession();\n }\n\n if (!this.isConnected || !this.connectedToWorkerTerminal) {\n this.updateStatus(this.vmStatus);\n\n return;\n }\n\n this.attachSession();\n }\n}\n\ncustomElements.define(\"shadow-claw-terminal\", ShadowClawTerminal);\n"],"mappings":"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"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import ShadowClawElement from "./components/shadow-claw-element.js";
|
|
2
2
|
import { n as getDb } from "./txPromise-CuGh-TGK.js";
|
|
3
3
|
import { A as getAvailableProviders, F as getProvider } from "./config--CFrw3J3.js";
|
|
4
|
-
import {
|
|
4
|
+
import { t as toolsStore } from "./tools-DwwB9RBa.js";
|
|
5
|
+
import { t as orchestratorStore } from "./orchestrator-KRjx0eba.js";
|
|
5
6
|
import { ulid } from "./utils/ulid.js";
|
|
6
7
|
import { t as TOOL_DEFINITIONS } from "./tools-DBaMRiEu.js";
|
|
7
|
-
import { n as setWebMcpToolsEnabled, t as setWebMcpMode } from "./syncWebMcpRegistration-
|
|
8
|
+
import { n as setWebMcpToolsEnabled, t as setWebMcpMode } from "./syncWebMcpRegistration-DNLnQ-jz.js";
|
|
8
9
|
import "./tools-D4Pp-nUw.js";
|
|
9
10
|
import { a as showSuccess, i as showInfo, r as showError } from "./toast-DZ6r7_YI.js";
|
|
10
11
|
import { t as effect } from "./effect-DL6j9HJp.js";
|
|
11
12
|
import "./shadow-claw-page-header-action-button-BXXm5b5N.js";
|
|
12
13
|
import "./components/shadow-claw-dialog.js";
|
|
13
|
-
import "./shadow-claw-page-header-
|
|
14
|
+
import "./shadow-claw-page-header-Cti2fzf-.js";
|
|
14
15
|
import { t as getWebMcpMode } from "./webmcp-j_1_T3wf.js";
|
|
15
16
|
|
|
16
17
|
//#region src/components/shadow-claw-tools/shadow-claw-tools.css
|
|
@@ -1617,4 +1618,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
|
|
|
1617
1618
|
|
|
1618
1619
|
//#endregion
|
|
1619
1620
|
export { ShadowClawTools as t };
|
|
1620
|
-
//# sourceMappingURL=shadow-claw-tools-
|
|
1621
|
+
//# sourceMappingURL=shadow-claw-tools-DD3fyXP4.js.map
|