shadow-claw 1.27.0 → 1.28.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/.well-known/ai-catalog.json +11 -0
- package/.well-known/mcp/index.html +19 -0
- package/.well-known/mcp/server-card.json +52 -0
- package/.well-known/mcp/servers.json +15 -0
- package/.well-known/mcp.json +52 -0
- package/.well-known/oauth-protected-resource +10 -0
- package/.well-known/oauth-protected-resource.json +10 -0
- package/bin/assert-version-bump.mjs +61 -3
- package/bin/assert-version-bump.test.mjs +77 -1
- package/bin/build/build.mjs +116 -49
- package/bin/build/build.test.mjs +103 -0
- package/bin/cli.mjs +299 -237
- package/bin/cli.test.mjs +27 -0
- package/bin/commands/mcp.mjs +132 -2
- package/bin/commands/mcp.test.mjs +166 -0
- package/bin/commands/skills-index.mjs +139 -20
- package/bin/commands/skills-index.test.mjs +82 -0
- package/bin/utils/control-client.mjs +17 -0
- package/bin/utils/control-client.test.mjs +46 -0
- package/bin/version.mjs +208 -0
- package/bin/version.test.mjs +138 -0
- package/dist/electron/main.cjs +195 -185
- package/dist/lib/components/index.js +21 -21
- 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-llm.js +1 -1
- package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
- package/dist/lib/components/settings/shadow-claw-notifications.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/shadow-claw.d.ts +1 -0
- package/dist/lib/components/shadow-claw/utils/setupAppLifecycle.d.ts +23 -0
- 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-llm.js +1 -1
- package/dist/lib/components/shadow-claw-networking.js +1 -1
- package/dist/lib/components/shadow-claw-notifications.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-oODzltaC.js → configurePeerJs-D8Ph0-A9.js} +2 -2
- package/dist/lib/{configurePeerJs-oODzltaC.js.map → configurePeerJs-D8Ph0-A9.js.map} +1 -1
- package/dist/lib/core/control-plane-client.d.ts +2 -0
- package/dist/lib/core/orchestrator/orchestrator.d.ts +10 -0
- package/dist/lib/core/orchestrator/utils/operations/channel.d.ts +2 -2
- package/dist/lib/core/utils/initControlPlane.d.ts +6 -0
- package/dist/lib/index.js +21 -21
- package/dist/lib/{initControlPlane-C2zURVIS.js → initControlPlane-BIrWmpzc.js} +76 -9
- package/dist/lib/initControlPlane-BIrWmpzc.js.map +1 -0
- package/dist/lib/{markdown-C6EHl9zs.js → markdown-DEUoM1c6.js} +2 -2
- package/dist/lib/{markdown-C6EHl9zs.js.map → markdown-DEUoM1c6.js.map} +1 -1
- package/dist/lib/{orchestrator-KRjx0eba.js → orchestrator-BtVj9bBB.js} +11 -10
- package/dist/lib/{orchestrator-KRjx0eba.js.map → orchestrator-BtVj9bBB.js.map} +1 -1
- package/dist/lib/{orchestrator-CACLa_Ro.js → orchestrator-CFCW-l1O.js} +52 -4
- package/dist/lib/orchestrator-CFCW-l1O.js.map +1 -0
- package/dist/lib/{peerjs-DFWOBcXf.js → peerjs-BoBkx9DJ.js} +23 -3
- package/dist/lib/peerjs-BoBkx9DJ.js.map +1 -0
- package/dist/lib/{push-client-_tiWQsCT.js → push-client-D6hbzDNV.js} +10 -4
- package/dist/lib/push-client-D6hbzDNV.js.map +1 -0
- package/dist/lib/{shadow-claw-6UHdiy4a.js → shadow-claw-Cuf2O5bZ.js} +71 -4
- package/dist/lib/shadow-claw-Cuf2O5bZ.js.map +1 -0
- package/dist/lib/{shadow-claw-channel-config-DmfwJc6G.js → shadow-claw-channel-config-BDPKt6Bd.js} +3 -3
- package/dist/lib/{shadow-claw-channel-config-DmfwJc6G.js.map → shadow-claw-channel-config-BDPKt6Bd.js.map} +1 -1
- package/dist/lib/{shadow-claw-channels-1N6Jl-By.js → shadow-claw-channels-BsP5JABM.js} +2 -2
- package/dist/lib/{shadow-claw-channels-1N6Jl-By.js.map → shadow-claw-channels-BsP5JABM.js.map} +1 -1
- package/dist/lib/{shadow-claw-chat-BMoqQJRK.js → shadow-claw-chat-Cam2lX4k.js} +4 -4
- package/dist/lib/{shadow-claw-chat-BMoqQJRK.js.map → shadow-claw-chat-Cam2lX4k.js.map} +1 -1
- package/dist/lib/{shadow-claw-control-plane-UG0o7pCz.js → shadow-claw-control-plane-DB2qcCFs.js} +20 -10
- package/dist/lib/shadow-claw-control-plane-DB2qcCFs.js.map +1 -0
- package/dist/lib/{shadow-claw-conversations-BwXep3iu.js → shadow-claw-conversations-C9Vf4XGx.js} +2 -2
- package/dist/lib/{shadow-claw-conversations-BwXep3iu.js.map → shadow-claw-conversations-C9Vf4XGx.js.map} +1 -1
- package/dist/lib/{shadow-claw-file-viewer-DUxzVxDT.js → shadow-claw-file-viewer-B4HYiI0v.js} +3 -3
- package/dist/lib/{shadow-claw-file-viewer-DUxzVxDT.js.map → shadow-claw-file-viewer-B4HYiI0v.js.map} +1 -1
- package/dist/lib/{shadow-claw-files-DIREEnT2.js → shadow-claw-files-DVROUESO.js} +2 -2
- package/dist/lib/{shadow-claw-files-DIREEnT2.js.map → shadow-claw-files-DVROUESO.js.map} +1 -1
- package/dist/lib/{shadow-claw-git-Bg1SWgsF.js → shadow-claw-git-BqrO7cHJ.js} +3 -3
- package/dist/lib/{shadow-claw-git-Bg1SWgsF.js.map → shadow-claw-git-BqrO7cHJ.js.map} +1 -1
- package/dist/lib/{shadow-claw-llm-CazBrVpM.js → shadow-claw-llm-BexUQdYo.js} +2 -2
- package/dist/lib/{shadow-claw-llm-CazBrVpM.js.map → shadow-claw-llm-BexUQdYo.js.map} +1 -1
- package/dist/lib/{shadow-claw-networking-Df85tCbO.js → shadow-claw-networking-CfXRGpUD.js} +2 -2
- package/dist/lib/{shadow-claw-networking-Df85tCbO.js.map → shadow-claw-networking-CfXRGpUD.js.map} +1 -1
- package/dist/lib/{shadow-claw-notifications-v62FryTc.js → shadow-claw-notifications-C9KPMgx_.js} +2 -2
- package/dist/lib/{shadow-claw-notifications-v62FryTc.js.map → shadow-claw-notifications-C9KPMgx_.js.map} +1 -1
- package/dist/lib/{shadow-claw-pages-BgPyIEZO.js → shadow-claw-pages-CGzGXmrI.js} +3 -3
- package/dist/lib/{shadow-claw-pages-BgPyIEZO.js.map → shadow-claw-pages-CGzGXmrI.js.map} +1 -1
- package/dist/lib/{shadow-claw-peerjs-xkBXILed.js → shadow-claw-peerjs-B0ZB7yhB.js} +3 -3
- package/dist/lib/{shadow-claw-peerjs-xkBXILed.js.map → shadow-claw-peerjs-B0ZB7yhB.js.map} +1 -1
- package/dist/lib/{shadow-claw-settings-CN89xRVU.js → shadow-claw-settings-DBfMZdDS.js} +2 -2
- package/dist/lib/{shadow-claw-settings-CN89xRVU.js.map → shadow-claw-settings-DBfMZdDS.js.map} +1 -1
- package/dist/lib/{shadow-claw-storage-VnhcObCe.js → shadow-claw-storage-CM-w6mgG.js} +2 -2
- package/dist/lib/{shadow-claw-storage-VnhcObCe.js.map → shadow-claw-storage-CM-w6mgG.js.map} +1 -1
- package/dist/lib/{shadow-claw-task-server-jgEC2hHB.js → shadow-claw-task-server-DV4b1g2-.js} +4 -2
- package/dist/lib/{shadow-claw-task-server-jgEC2hHB.js.map → shadow-claw-task-server-DV4b1g2-.js.map} +1 -1
- package/dist/lib/{shadow-claw-tasks-i_evIufy.js → shadow-claw-tasks-K-foOHSE.js} +3 -3
- package/dist/lib/{shadow-claw-tasks-i_evIufy.js.map → shadow-claw-tasks-K-foOHSE.js.map} +1 -1
- package/dist/lib/{shadow-claw-terminal-CwScROlu.js → shadow-claw-terminal-CpAknKyA.js} +2 -2
- package/dist/lib/{shadow-claw-terminal-CwScROlu.js.map → shadow-claw-terminal-CpAknKyA.js.map} +1 -1
- package/dist/lib/{shadow-claw-tools-DD3fyXP4.js → shadow-claw-tools-D98XZ0Ep.js} +3 -3
- package/dist/lib/{shadow-claw-tools-DD3fyXP4.js.map → shadow-claw-tools-D98XZ0Ep.js.map} +1 -1
- package/dist/lib/{shadow-claw-webvm-DbJq4I3-.js → shadow-claw-webvm-DLOb8dMI.js} +2 -2
- package/dist/lib/{shadow-claw-webvm-DbJq4I3-.js.map → shadow-claw-webvm-DLOb8dMI.js.map} +1 -1
- package/dist/lib/subsystems/channels/imessage.d.ts +1 -0
- package/dist/lib/subsystems/channels/peerjs.d.ts +1 -0
- package/dist/lib/subsystems/channels/telegram.d.ts +1 -0
- package/dist/lib/subsystems/channels/types.d.ts +2 -0
- package/dist/lib/subsystems/notifications/push-client.d.ts +1 -1
- package/dist/lib/{syncWebMcpRegistration-DNLnQ-jz.js → syncWebMcpRegistration-NspKefOI.js} +2 -2
- package/dist/lib/{syncWebMcpRegistration-DNLnQ-jz.js.map → syncWebMcpRegistration-NspKefOI.js.map} +1 -1
- package/dist/public/.well-known/ai-catalog.json +11 -0
- package/dist/public/.well-known/mcp/index.html +19 -0
- package/dist/public/.well-known/mcp/server-card.json +52 -0
- package/dist/public/.well-known/mcp/servers.json +15 -0
- package/dist/public/.well-known/mcp.json +52 -0
- package/dist/public/.well-known/oauth-protected-resource +10 -0
- package/dist/public/.well-known/oauth-protected-resource.json +10 -0
- package/dist/public/404.html +28 -1
- package/dist/public/AGENTS.md +1 -1
- package/dist/public/agent.worker.js +1 -1
- package/dist/public/{configurePeerJs-BqgeBjP7.js → configurePeerJs-BhBokQlC.js} +1 -1
- package/dist/public/docs/example/article/index.html +3 -3
- package/dist/public/docs/publishing/index.html +3 -3
- package/dist/public/docs/skill-creator/index.html +3 -3
- package/dist/public/docs/subsystems/cli.md +11 -8
- package/dist/public/docs/subsystems/mcp-server.md +1 -0
- package/dist/public/docs/subsystems/notifications.md +10 -0
- package/dist/public/{e2e-bridge-Ceqr5kGc.js → e2e-bridge-DcBoeFvd.js} +1 -1
- package/dist/public/{file-viewer-C-6Jc_tb.js → file-viewer-CKtVC9Ix.js} +1 -1
- package/dist/public/index.css +1 -1
- package/dist/public/index.html +3 -3
- package/dist/public/index.js +1 -1
- package/dist/public/initControlPlane-Bi8ouFEb.js +1 -0
- package/dist/public/llms.txt +36 -1
- package/dist/public/main/index.html +3 -3
- package/dist/public/main/memory/index.html +3 -3
- package/dist/public/{markdown-C3M4OW_A.js → markdown-C-hCVJtc.js} +1 -1
- package/dist/public/orchestrator-8qNGfw8r.js +15 -0
- package/dist/public/{orchestrator-DHjdLtqa.js → orchestrator-BT3Ks5ip.js} +2 -2
- package/dist/public/peerjs-DfhwEiiq.js +1 -0
- package/dist/public/push-client-BVLrE9pK.js +1 -0
- package/dist/public/service-worker/fetch-proxy.js +1 -1
- package/dist/public/service-worker.js +1 -1
- package/dist/public/{shadow-claw-EAt2ml5Y.js → shadow-claw-DCjxNDCX.js} +3 -3
- package/dist/public/{shadow-claw-channels-XsfuWFF8.js → shadow-claw-channels-CITDrqMl.js} +1 -1
- package/dist/public/{shadow-claw-chat-CbSaOZ4q.js → shadow-claw-chat-BQrSgSKF.js} +1 -1
- package/dist/public/{shadow-claw-control-plane-DHvN3Ukg.js → shadow-claw-control-plane-Cp001OY0.js} +2 -2
- package/dist/public/{shadow-claw-conversations-BWs5VVfs.js → shadow-claw-conversations-EhX4RvIj.js} +1 -1
- package/dist/public/{shadow-claw-file-viewer-BWsoW5QS.js → shadow-claw-file-viewer-DiQXIjZD.js} +1 -1
- package/dist/public/{shadow-claw-files-CG7MqWiV.js → shadow-claw-files-lkTnSJsn.js} +1 -1
- package/dist/public/{shadow-claw-git-DBRPZNav.js → shadow-claw-git-BlcA_z8x.js} +2 -2
- package/dist/public/{shadow-claw-llm-DMvLgKXo.js → shadow-claw-llm-CW16X9Rg.js} +1 -1
- package/dist/public/{shadow-claw-networking-Dd8Rw31D.js → shadow-claw-networking-ySsMBY_i.js} +1 -1
- package/dist/public/{shadow-claw-notifications-Dbevj-lq.js → shadow-claw-notifications-CyV2zCQ8.js} +1 -1
- package/dist/public/{shadow-claw-pages-3_lQAv0t.js → shadow-claw-pages-Cx7cF9ah.js} +1 -1
- package/dist/public/{shadow-claw-settings-t8TIlgrM.js → shadow-claw-settings-zm4PHHGi.js} +2 -2
- package/dist/public/{shadow-claw-storage-CfEXoSIE.js → shadow-claw-storage-dy9JAEGd.js} +1 -1
- package/dist/public/{shadow-claw-task-server-DxQSsgRZ.js → shadow-claw-task-server-Bleww48s.js} +2 -2
- package/dist/public/{shadow-claw-tasks-DNpicQwz.js → shadow-claw-tasks-CTI5oaLN.js} +1 -1
- package/dist/public/{shadow-claw-terminal-DpY6zU_r.js → shadow-claw-terminal-mZ3i4HaQ.js} +1 -1
- package/dist/public/{shadow-claw-tools-WSwWohnk.js → shadow-claw-tools-B_nuk8Zl.js} +1 -1
- package/dist/public/{shadow-claw-webvm-CP6oFjg5.js → shadow-claw-webvm-Vl_jH5YL.js} +1 -1
- package/dist/public/{syncWebMcpRegistration-DOn9gLnD.js → syncWebMcpRegistration-n2vAMJ4w.js} +1 -1
- package/dist/server.js +197 -187
- package/package.json +2 -1
- package/src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.test.ts +6 -0
- package/src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.ts +19 -9
- package/src/components/settings/shadow-claw-task-server/shadow-claw-task-server.test.ts +14 -0
- package/src/components/settings/shadow-claw-task-server/shadow-claw-task-server.ts +12 -0
- package/src/components/shadow-claw/shadow-claw.ts +6 -0
- package/src/components/shadow-claw/utils/bindEventListeners.test.ts +57 -0
- package/src/components/shadow-claw/utils/bindEventListeners.ts +14 -0
- package/src/components/shadow-claw/utils/setupAppLifecycle.test.ts +201 -0
- package/src/components/shadow-claw/utils/setupAppLifecycle.ts +101 -0
- package/src/core/control-plane-client.test.ts +82 -1
- package/src/core/control-plane-client.ts +35 -1
- package/src/core/orchestrator/orchestrator.test.ts +49 -0
- package/src/core/orchestrator/orchestrator.ts +43 -0
- package/src/core/orchestrator/utils/operations/channel.test.ts +17 -0
- package/src/core/orchestrator/utils/operations/channel.ts +11 -5
- package/src/core/orchestrator/utils/operations/task.test.ts +26 -0
- package/src/core/orchestrator/utils/operations/task.ts +8 -1
- package/src/core/utils/initControlPlane.test.ts +138 -0
- package/src/core/utils/initControlPlane.ts +82 -0
- package/src/core/utils/initializeApp.test.ts +27 -1
- package/src/core/utils/initializeApp.ts +6 -13
- package/src/server/mcp/mcp-server.test.ts +6 -0
- package/src/server/mcp/mcp-server.ts +2 -1
- package/src/server/mcp/tools/built-in-tools.ts +88 -1
- package/src/server/mcp/tools/client-tool-relay.ts +6 -0
- package/src/server/mcp/tools/mcp-tools.test.ts +128 -0
- package/src/server/openapi/openapi-coverage.test.ts +2 -1
- package/src/server/openapi/openapi-spec.ts +2 -1
- package/src/server/openapi/paths/mcp.ts +104 -0
- package/src/server/openapi/paths/push.ts +3 -0
- package/src/server/routes/mcp.test.ts +92 -0
- package/src/server/routes/mcp.ts +138 -2
- package/src/server/utils/packageVersion.test.ts +10 -0
- package/src/server/utils/packageVersion.ts +32 -0
- package/src/service-worker/fetch-proxy-rules.test.ts +73 -0
- package/src/service-worker/fetch-proxy-rules.ts +44 -0
- package/src/service-worker/fetch-proxy.ts +1 -1
- package/src/subsystems/channels/imessage.test.ts +36 -0
- package/src/subsystems/channels/imessage.ts +11 -0
- package/src/subsystems/channels/peerjs.test.ts +56 -0
- package/src/subsystems/channels/peerjs.ts +29 -0
- package/src/subsystems/channels/telegram.test.ts +38 -0
- package/src/subsystems/channels/telegram.ts +13 -0
- package/src/subsystems/channels/types.ts +2 -0
- package/src/subsystems/notifications/push-client.test.ts +70 -0
- package/src/subsystems/notifications/push-client.ts +28 -3
- package/src/subsystems/notifications/push-routes.test.ts +82 -0
- package/src/subsystems/notifications/push-routes.ts +70 -16
- package/src/subsystems/notifications/push-store.test.ts +59 -0
- package/src/subsystems/notifications/push-store.ts +113 -19
- package/src/testing/jest-setup.ts +15 -0
- package/dist/lib/initControlPlane-C2zURVIS.js.map +0 -1
- package/dist/lib/orchestrator-CACLa_Ro.js.map +0 -1
- package/dist/lib/peerjs-DFWOBcXf.js.map +0 -1
- package/dist/lib/push-client-_tiWQsCT.js.map +0 -1
- package/dist/lib/shadow-claw-6UHdiy4a.js.map +0 -1
- package/dist/lib/shadow-claw-control-plane-UG0o7pCz.js.map +0 -1
- package/dist/public/initControlPlane-BN9cWyO0.js +0 -1
- package/dist/public/orchestrator-CMbCTjBf.js +0 -15
- package/dist/public/peerjs-DUCKH-m9.js +0 -1
- package/dist/public/push-client-D0lkwrK0.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shadow-claw-notifications-v62FryTc.js","names":["shadowClawNotificationsStyles","shadowClawNotificationsTemplate"],"sources":["../../src/components/settings/shadow-claw-notifications/shadow-claw-notifications.ts"],"sourcesContent":["import {\n getCurrentSubscription,\n getPushFetchOptions,\n getPushUrl,\n subscribeToPush,\n unsubscribeFromPush,\n} from \"../../../subsystems/notifications/push-client.js\";\n\nimport { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { getDb } from \"../../../db/db.js\";\nimport { getConfig } from \"../../../db/getConfig.js\";\nimport { setConfig } from \"../../../db/setConfig.js\";\nimport { showError, showSuccess } from \"../../../ui/toast.js\";\n\nimport \"../../common/shadow-claw-empty-state/shadow-claw-empty-state.js\";\n\nimport ShadowClawElement from \"../../shadow-claw-element.js\";\nimport shadowClawNotificationsStyles from \"./shadow-claw-notifications.css\" with { type: \"css\" };\nimport shadowClawNotificationsTemplate from \"./shadow-claw-notifications.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-notifications\";\n\n/**\n * Settings sub-component for Web Push Notification management:\n * subscribe/unsubscribe toggle, subscription list, send test notification.\n */\nexport class ShadowClawNotifications extends ShadowClawElement {\n static styles = shadowClawNotificationsStyles;\n static template = shadowClawNotificationsTemplate;\n\n public _backendAvailable: boolean = true;\n public _selectedId: number | null = null;\n public _subscribed: boolean = false;\n public _subscriptions: Array<{\n id: number;\n endpoint: string;\n created_at: string;\n }> = [];\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 await this.refreshState();\n await this.loadProxyConfig();\n await this.loadSubscriptions();\n\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"toggle-push\"]')\n ?.addEventListener(\"click\", () => this.handleToggle());\n\n root\n .querySelector('[data-action=\"send-notification\"]')\n ?.addEventListener(\"click\", () => this.handleSendNotification());\n\n root\n .querySelector('[data-action=\"delete-subscription\"]')\n ?.addEventListener(\"click\", () => this.handleDeleteSubscription());\n\n root\n .querySelector('[data-action=\"refresh-subscriptions\"]')\n ?.addEventListener(\"click\", () => this.loadSubscriptions());\n\n root\n .querySelector('[data-input=\"push-proxy-url\"]')\n ?.addEventListener(\"change\", (e) => this.handleProxyUrlChange(e));\n }\n\n renderSubscriptionList() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const list = root.querySelector('[data-info=\"subscription-list\"]');\n if (!list) {\n return;\n }\n\n list.replaceChildren();\n\n if (this._subscriptions.length === 0) {\n const message = this._backendAvailable\n ? \"No subscriptions stored.\"\n : \"⚠️ Backend services unavailable (push notification server is not running).\";\n\n const emptyState = document.createElement(\"shadow-claw-empty-state\");\n emptyState.setAttribute(\"compact\", \"\");\n emptyState.setAttribute(\"message\", message);\n list.append(emptyState);\n\n return;\n }\n\n this._subscriptions.forEach((sub) => {\n const shortId = `#${sub.id}`;\n const endpointShort =\n sub.endpoint.length > 60 ? `…${sub.endpoint.slice(-56)}` : sub.endpoint;\n const date = sub.created_at || \"\";\n\n const item = document.createElement(\"div\");\n item.className = `subscription-item${this._selectedId === sub.id ? \" selected\" : \"\"}`;\n item.setAttribute(\"data-sub-id\", String(sub.id));\n item.setAttribute(\"data-endpoint\", sub.endpoint);\n\n const idEl = document.createElement(\"span\");\n idEl.className = \"subscription-id\";\n idEl.title = sub.endpoint;\n idEl.textContent = `${shortId} ${endpointShort}`;\n\n const dateEl = document.createElement(\"span\");\n dateEl.className = \"subscription-date\";\n dateEl.textContent = date;\n\n item.append(idEl, dateEl);\n\n item.addEventListener(\"click\", () => {\n this._selectedId = sub.id;\n this.renderSubscriptionList();\n this.updateActionButtons();\n });\n\n list.append(item);\n });\n }\n\n updateActionButtons() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const hasSelection = this._selectedId != null;\n const sendBtn = root.querySelector(\n '[data-action=\"send-notification\"]',\n ) as HTMLButtonElement | null;\n const deleteBtn = root.querySelector(\n '[data-action=\"delete-subscription\"]',\n ) as HTMLButtonElement | null;\n\n if (sendBtn) {\n sendBtn.disabled = !hasSelection;\n }\n\n if (deleteBtn) {\n deleteBtn.disabled = !hasSelection;\n }\n }\n\n updateToggle() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const toggle = root.querySelector('[data-action=\"toggle-push\"]');\n const status = root.querySelector('[data-info=\"subscription-status\"]');\n\n if (toggle) {\n toggle.setAttribute(\"aria-checked\", String(this._subscribed));\n }\n\n if (status) {\n status.textContent = this._subscribed ? \"Enabled\" : \"Disabled\";\n }\n }\n\n async handleDeleteSubscription() {\n if (this._selectedId == null) {\n return;\n }\n\n try {\n const url = await getPushUrl(`/push/subscription/${this._selectedId}`);\n const res = await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"DELETE\",\n }),\n );\n\n if (res.ok) {\n showSuccess(\"Subscription deleted.\");\n await this.loadSubscriptions();\n } else {\n showError(\"Failed to delete subscription.\");\n }\n } catch (err) {\n showError(`Delete failed: ${(err as Error).message}`);\n }\n }\n\n async handleProxyUrlChange(e: Event) {\n const input = e.target as HTMLInputElement;\n const value = input.value.trim();\n\n try {\n const db = await getDb();\n await setConfig(db, CONFIG_KEYS.PUSH_PROXY_URL, value);\n showSuccess(\"Push proxy URL updated.\");\n await this.loadSubscriptions();\n } catch (err) {\n showError(`Failed to save proxy URL: ${(err as Error).message}`);\n }\n }\n\n async handleSendNotification() {\n if (this._selectedId == null) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-input=\"notification-text\"]',\n ) as HTMLInputElement | null;\n const payload = input?.value?.trim() || \"Test notification from ShadowClaw\";\n\n const sub = this._subscriptions.find((s) => s.id === this._selectedId);\n if (!sub) {\n return;\n }\n\n try {\n const url = await getPushUrl(\"/push/send\");\n const res = await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ endpoint: sub.endpoint, payload }),\n }),\n );\n\n if (res.ok) {\n showSuccess(\"Notification sent!\");\n } else if (res.status === 410) {\n showError(\"Subscription expired and was removed.\");\n await this.loadSubscriptions();\n } else {\n const data = await res.json().catch(() => ({}));\n showError(`Failed to send: ${data.error || res.statusText}`);\n }\n } catch (err) {\n showError(`Send failed: ${(err as Error).message}`);\n }\n }\n\n async handleToggle() {\n try {\n if (this._subscribed) {\n await unsubscribeFromPush();\n this._subscribed = false;\n showSuccess(\"Push notifications disabled.\");\n } else {\n await subscribeToPush();\n this._subscribed = true;\n showSuccess(\"Push notifications enabled!\");\n }\n\n this.updateToggle();\n await this.loadSubscriptions();\n } catch (err) {\n showError(`Push notification error: ${(err as Error).message}`);\n }\n }\n\n async loadProxyConfig() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const db = await getDb();\n const proxyUrl = await getConfig(db, CONFIG_KEYS.PUSH_PROXY_URL);\n const input = root.querySelector(\n '[data-input=\"push-proxy-url\"]',\n ) as HTMLInputElement | null;\n\n if (input) {\n input.value = proxyUrl || \"\";\n }\n }\n\n /**\n * Load all stored subscriptions from the server.\n */\n async loadSubscriptions() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n try {\n const isStaticHost =\n typeof location !== \"undefined\" &&\n (location.protocol === \"file:\" ||\n location.hostname.endsWith(\".github.io\") ||\n location.hostname.endsWith(\".pages.dev\"));\n\n const db = await getDb();\n const proxyUrl =\n (await getConfig(db, CONFIG_KEYS.PUSH_PROXY_URL)) ||\n (typeof localStorage !== \"undefined\"\n ? localStorage.getItem(CONFIG_KEYS.PUSH_PROXY_URL)\n : null);\n\n if (isStaticHost && !proxyUrl) {\n this._subscriptions = [];\n this._backendAvailable = false;\n this._selectedId = null;\n this.renderSubscriptionList();\n this.updateActionButtons();\n return;\n }\n\n const url = await getPushUrl(\"/push/subscriptions\");\n const res = await fetch(url, getPushFetchOptions(url));\n\n if (!res.ok) {\n this._subscriptions = [];\n this._backendAvailable = false;\n this._selectedId = null;\n this.renderSubscriptionList();\n this.updateActionButtons();\n return;\n }\n\n this._subscriptions = await res.json();\n this._backendAvailable = true;\n } catch {\n this._subscriptions = [];\n this._backendAvailable = false;\n }\n\n this._selectedId = null;\n this.renderSubscriptionList();\n this.updateActionButtons();\n }\n\n /**\n * Check current subscription state and update the toggle.\n */\n async refreshState() {\n try {\n const sub = await getCurrentSubscription();\n this._subscribed = !!sub;\n this.updateToggle();\n } catch {\n // Service worker may not be ready\n this._subscribed = false;\n this.updateToggle();\n }\n }\n}\n\n/**\n * Encode a string safe for use as an HTML attribute value.\n */\ncustomElements.define(elementName, ShadowClawNotifications);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shadow-claw-notifications-C9KPMgx_.js","names":["shadowClawNotificationsStyles","shadowClawNotificationsTemplate"],"sources":["../../src/components/settings/shadow-claw-notifications/shadow-claw-notifications.ts"],"sourcesContent":["import {\n getCurrentSubscription,\n getPushFetchOptions,\n getPushUrl,\n subscribeToPush,\n unsubscribeFromPush,\n} from \"../../../subsystems/notifications/push-client.js\";\n\nimport { CONFIG_KEYS } from \"../../../config/config.js\";\nimport { getDb } from \"../../../db/db.js\";\nimport { getConfig } from \"../../../db/getConfig.js\";\nimport { setConfig } from \"../../../db/setConfig.js\";\nimport { showError, showSuccess } from \"../../../ui/toast.js\";\n\nimport \"../../common/shadow-claw-empty-state/shadow-claw-empty-state.js\";\n\nimport ShadowClawElement from \"../../shadow-claw-element.js\";\nimport shadowClawNotificationsStyles from \"./shadow-claw-notifications.css\" with { type: \"css\" };\nimport shadowClawNotificationsTemplate from \"./shadow-claw-notifications.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-notifications\";\n\n/**\n * Settings sub-component for Web Push Notification management:\n * subscribe/unsubscribe toggle, subscription list, send test notification.\n */\nexport class ShadowClawNotifications extends ShadowClawElement {\n static styles = shadowClawNotificationsStyles;\n static template = shadowClawNotificationsTemplate;\n\n public _backendAvailable: boolean = true;\n public _selectedId: number | null = null;\n public _subscribed: boolean = false;\n public _subscriptions: Array<{\n id: number;\n endpoint: string;\n created_at: string;\n }> = [];\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 await this.refreshState();\n await this.loadProxyConfig();\n await this.loadSubscriptions();\n\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"toggle-push\"]')\n ?.addEventListener(\"click\", () => this.handleToggle());\n\n root\n .querySelector('[data-action=\"send-notification\"]')\n ?.addEventListener(\"click\", () => this.handleSendNotification());\n\n root\n .querySelector('[data-action=\"delete-subscription\"]')\n ?.addEventListener(\"click\", () => this.handleDeleteSubscription());\n\n root\n .querySelector('[data-action=\"refresh-subscriptions\"]')\n ?.addEventListener(\"click\", () => this.loadSubscriptions());\n\n root\n .querySelector('[data-input=\"push-proxy-url\"]')\n ?.addEventListener(\"change\", (e) => this.handleProxyUrlChange(e));\n }\n\n renderSubscriptionList() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const list = root.querySelector('[data-info=\"subscription-list\"]');\n if (!list) {\n return;\n }\n\n list.replaceChildren();\n\n if (this._subscriptions.length === 0) {\n const message = this._backendAvailable\n ? \"No subscriptions stored.\"\n : \"⚠️ Backend services unavailable (push notification server is not running).\";\n\n const emptyState = document.createElement(\"shadow-claw-empty-state\");\n emptyState.setAttribute(\"compact\", \"\");\n emptyState.setAttribute(\"message\", message);\n list.append(emptyState);\n\n return;\n }\n\n this._subscriptions.forEach((sub) => {\n const shortId = `#${sub.id}`;\n const endpointShort =\n sub.endpoint.length > 60 ? `…${sub.endpoint.slice(-56)}` : sub.endpoint;\n const date = sub.created_at || \"\";\n\n const item = document.createElement(\"div\");\n item.className = `subscription-item${this._selectedId === sub.id ? \" selected\" : \"\"}`;\n item.setAttribute(\"data-sub-id\", String(sub.id));\n item.setAttribute(\"data-endpoint\", sub.endpoint);\n\n const idEl = document.createElement(\"span\");\n idEl.className = \"subscription-id\";\n idEl.title = sub.endpoint;\n idEl.textContent = `${shortId} ${endpointShort}`;\n\n const dateEl = document.createElement(\"span\");\n dateEl.className = \"subscription-date\";\n dateEl.textContent = date;\n\n item.append(idEl, dateEl);\n\n item.addEventListener(\"click\", () => {\n this._selectedId = sub.id;\n this.renderSubscriptionList();\n this.updateActionButtons();\n });\n\n list.append(item);\n });\n }\n\n updateActionButtons() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const hasSelection = this._selectedId != null;\n const sendBtn = root.querySelector(\n '[data-action=\"send-notification\"]',\n ) as HTMLButtonElement | null;\n const deleteBtn = root.querySelector(\n '[data-action=\"delete-subscription\"]',\n ) as HTMLButtonElement | null;\n\n if (sendBtn) {\n sendBtn.disabled = !hasSelection;\n }\n\n if (deleteBtn) {\n deleteBtn.disabled = !hasSelection;\n }\n }\n\n updateToggle() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const toggle = root.querySelector('[data-action=\"toggle-push\"]');\n const status = root.querySelector('[data-info=\"subscription-status\"]');\n\n if (toggle) {\n toggle.setAttribute(\"aria-checked\", String(this._subscribed));\n }\n\n if (status) {\n status.textContent = this._subscribed ? \"Enabled\" : \"Disabled\";\n }\n }\n\n async handleDeleteSubscription() {\n if (this._selectedId == null) {\n return;\n }\n\n try {\n const url = await getPushUrl(`/push/subscription/${this._selectedId}`);\n const res = await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"DELETE\",\n }),\n );\n\n if (res.ok) {\n showSuccess(\"Subscription deleted.\");\n await this.loadSubscriptions();\n } else {\n showError(\"Failed to delete subscription.\");\n }\n } catch (err) {\n showError(`Delete failed: ${(err as Error).message}`);\n }\n }\n\n async handleProxyUrlChange(e: Event) {\n const input = e.target as HTMLInputElement;\n const value = input.value.trim();\n\n try {\n const db = await getDb();\n await setConfig(db, CONFIG_KEYS.PUSH_PROXY_URL, value);\n showSuccess(\"Push proxy URL updated.\");\n await this.loadSubscriptions();\n } catch (err) {\n showError(`Failed to save proxy URL: ${(err as Error).message}`);\n }\n }\n\n async handleSendNotification() {\n if (this._selectedId == null) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-input=\"notification-text\"]',\n ) as HTMLInputElement | null;\n const payload = input?.value?.trim() || \"Test notification from ShadowClaw\";\n\n const sub = this._subscriptions.find((s) => s.id === this._selectedId);\n if (!sub) {\n return;\n }\n\n try {\n const url = await getPushUrl(\"/push/send\");\n const res = await fetch(\n url,\n getPushFetchOptions(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ endpoint: sub.endpoint, payload }),\n }),\n );\n\n if (res.ok) {\n showSuccess(\"Notification sent!\");\n } else if (res.status === 410) {\n showError(\"Subscription expired and was removed.\");\n await this.loadSubscriptions();\n } else {\n const data = await res.json().catch(() => ({}));\n showError(`Failed to send: ${data.error || res.statusText}`);\n }\n } catch (err) {\n showError(`Send failed: ${(err as Error).message}`);\n }\n }\n\n async handleToggle() {\n try {\n if (this._subscribed) {\n await unsubscribeFromPush();\n this._subscribed = false;\n showSuccess(\"Push notifications disabled.\");\n } else {\n await subscribeToPush();\n this._subscribed = true;\n showSuccess(\"Push notifications enabled!\");\n }\n\n this.updateToggle();\n await this.loadSubscriptions();\n } catch (err) {\n showError(`Push notification error: ${(err as Error).message}`);\n }\n }\n\n async loadProxyConfig() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const db = await getDb();\n const proxyUrl = await getConfig(db, CONFIG_KEYS.PUSH_PROXY_URL);\n const input = root.querySelector(\n '[data-input=\"push-proxy-url\"]',\n ) as HTMLInputElement | null;\n\n if (input) {\n input.value = proxyUrl || \"\";\n }\n }\n\n /**\n * Load all stored subscriptions from the server.\n */\n async loadSubscriptions() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n try {\n const isStaticHost =\n typeof location !== \"undefined\" &&\n (location.protocol === \"file:\" ||\n location.hostname.endsWith(\".github.io\") ||\n location.hostname.endsWith(\".pages.dev\"));\n\n const db = await getDb();\n const proxyUrl =\n (await getConfig(db, CONFIG_KEYS.PUSH_PROXY_URL)) ||\n (typeof localStorage !== \"undefined\"\n ? localStorage.getItem(CONFIG_KEYS.PUSH_PROXY_URL)\n : null);\n\n if (isStaticHost && !proxyUrl) {\n this._subscriptions = [];\n this._backendAvailable = false;\n this._selectedId = null;\n this.renderSubscriptionList();\n this.updateActionButtons();\n return;\n }\n\n const url = await getPushUrl(\"/push/subscriptions\");\n const res = await fetch(url, getPushFetchOptions(url));\n\n if (!res.ok) {\n this._subscriptions = [];\n this._backendAvailable = false;\n this._selectedId = null;\n this.renderSubscriptionList();\n this.updateActionButtons();\n return;\n }\n\n this._subscriptions = await res.json();\n this._backendAvailable = true;\n } catch {\n this._subscriptions = [];\n this._backendAvailable = false;\n }\n\n this._selectedId = null;\n this.renderSubscriptionList();\n this.updateActionButtons();\n }\n\n /**\n * Check current subscription state and update the toggle.\n */\n async refreshState() {\n try {\n const sub = await getCurrentSubscription();\n this._subscribed = !!sub;\n this.updateToggle();\n } catch {\n // Service worker may not be ready\n this._subscribed = false;\n this.updateToggle();\n }\n }\n}\n\n/**\n * Encode a string safe for use as an HTML attribute value.\n */\ncustomElements.define(elementName, ShadowClawNotifications);\n"],"mappings":"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"}
|
|
@@ -7,13 +7,13 @@ import { t as getConfig } from "./getConfig-BxxXMyuM.js";
|
|
|
7
7
|
import { o as readGroupFile, t as toolsStore } from "./tools-DwwB9RBa.js";
|
|
8
8
|
import { t as readGroupFileBytes } from "./readGroupFileBytes-C8oOe8Iu.js";
|
|
9
9
|
import { t as fileViewerStore } from "./file-viewer-C3YKnq_-.js";
|
|
10
|
-
import { nn as writeGroupFile, r as getStaticPageContent, t as orchestratorStore } from "./orchestrator-
|
|
10
|
+
import { nn as writeGroupFile, r as getStaticPageContent, t as orchestratorStore } from "./orchestrator-BtVj9bBB.js";
|
|
11
11
|
import { _ as getIframeSandboxPolicy, b as isAllowedCustomElement, g as getIframeCsp, h as getApprovedCustomElementScriptDescriptors, n as setSanitizedHtml, r as setTrustedSrcdoc, t as sanitizeSrcdocHtml } from "./trusted-types-Dx0RZlrd.js";
|
|
12
12
|
import { t as require_buffer } from "./buffer-BEXn271X.js";
|
|
13
13
|
import { a as showSuccess, r as showError, s as showWarning } from "./toast-DZ6r7_YI.js";
|
|
14
14
|
import { getNamespacedItem, removeNamespacedItem, setNamespacedItem } from "./utils/namespacedStorage.js";
|
|
15
15
|
import { t as effect } from "./effect-DL6j9HJp.js";
|
|
16
|
-
import { n as splitFrontmatter, t as renderMarkdown } from "./markdown-
|
|
16
|
+
import { n as splitFrontmatter, t as renderMarkdown } from "./markdown-DEUoM1c6.js";
|
|
17
17
|
import { t as isTruthyConfigValue } from "./config-value-Cxggje2K.js";
|
|
18
18
|
import "./shadow-claw-page-header-action-button-BXXm5b5N.js";
|
|
19
19
|
import "./shadow-claw-page-header-Cti2fzf-.js";
|
|
@@ -2307,4 +2307,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
|
|
|
2307
2307
|
|
|
2308
2308
|
//#endregion
|
|
2309
2309
|
export { ShadowClawPages as t };
|
|
2310
|
-
//# sourceMappingURL=shadow-claw-pages-
|
|
2310
|
+
//# sourceMappingURL=shadow-claw-pages-CGzGXmrI.js.map
|