shadow-claw 1.23.3 → 1.24.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/README.md +42 -5
- package/bin/assert-version-bump.mjs +60 -38
- package/bin/assert-version-bump.test.mjs +74 -11
- package/bin/cli.mjs +166 -0
- package/bin/cli.test.mjs +60 -0
- package/bin/commands/backup.mjs +70 -0
- package/bin/commands/clients.mjs +41 -0
- package/bin/commands/peer-id.mjs +76 -0
- package/bin/commands/peer-id.test.mjs +104 -0
- package/bin/commands/send.mjs +51 -0
- package/bin/commands/tasks.mjs +59 -0
- package/bin/commands/webrtc-listen.mjs +254 -0
- package/bin/prerender-dsd-shell/prerender-dsd-shell.test.mjs +46 -0
- package/bin/rolldown.config.test.mjs +401 -8
- package/bin/utils/control-client.mjs +243 -0
- package/bin/utils/control-client.test.mjs +83 -0
- package/bin/utils/ulid.mjs +45 -0
- package/bin/utils/webrtc-control-client.mjs +699 -0
- package/bin/utils/webrtc-control-client.test.mjs +318 -0
- package/dist/electron/main.cjs +1 -1
- package/dist/public/AGENTS.md +5 -3
- package/dist/public/README.md +42 -5
- package/dist/public/agent.worker.js +6 -6
- package/dist/public/{app-routes-B0ePT49v.js → app-routes-Bs-riIvr.js} +1 -1
- package/dist/public/backup-controller-C_s9in2t.js +1 -0
- package/dist/public/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.css +1 -0
- package/dist/public/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.html +1 -0
- package/dist/public/components/settings/shadow-claw-storage/shadow-claw-storage.html +1 -1
- package/dist/public/components/settings/shadow-claw-task-server/shadow-claw-task-server.css +1 -1
- package/dist/public/components/settings/shadow-claw-task-server/shadow-claw-task-server.html +1 -1
- package/dist/public/components/shadow-claw-files/shadow-claw-files.css +1 -1
- package/dist/public/components/shadow-claw-files/shadow-claw-files.html +1 -1
- package/dist/public/components/shadow-claw-settings/shadow-claw-settings.html +1 -1
- package/dist/public/config-CrHchneq.js +1 -0
- package/dist/public/{configurePeerJs-B7kNU8AQ.js → configurePeerJs-CxpZeDJJ.js} +1 -1
- package/dist/public/{connections-xd_66YVU.js → connections-DvbgdkaB.js} +1 -1
- package/dist/public/{custom-element-security-CZ92anB8.js → custom-element-security-NCqQ5lmC.js} +1 -1
- package/dist/public/docs/README.md +3 -1
- package/dist/public/docs/architecture/overview.md +12 -12
- package/dist/public/docs/architecture/storage.md +5 -2
- package/dist/public/docs/decisions/bundled-typescript-architecture.md +1 -1
- package/dist/public/docs/decisions/indexeddb-and-opfs-storage.md +6 -3
- package/dist/public/docs/decisions/native-web-components-and-signals.md +1 -1
- package/dist/public/docs/example/article/index.html +2 -2
- package/dist/public/docs/guides/configuring-messaging-channels.md +41 -6
- package/dist/public/docs/guides/server-development-configuration.md +24 -0
- package/dist/public/docs/publishing/index.html +19 -76
- package/dist/public/docs/skill-creator/index.html +2 -2
- package/dist/public/docs/subsystems/backup.md +56 -0
- package/dist/public/docs/subsystems/cli.md +124 -0
- package/dist/public/docs/subsystems/control-plane.md +158 -0
- package/dist/public/docs/subsystems/notifications.md +54 -2
- package/dist/public/docs/subsystems/reactive-ui.md +1 -0
- package/dist/public/downloadGroupFile-By0GR6eV.js +1 -0
- package/dist/public/e2e/README.md +5 -1
- package/dist/public/{e2e-bridge-DkS5xFGX.js → e2e-bridge-IGWsRl4i.js} +1 -1
- package/dist/public/file-viewer-D0eflgt6.js +1 -0
- package/dist/public/files/main/~/docs/publishing-to-github-pages.md +17 -82
- package/dist/public/getAllTasks-vpBlgGsc.js +1 -0
- package/dist/public/getGroupDir-P1h9wl6S.js +1 -0
- package/dist/public/{git-BkjrsRXX.js → git-7Vq_SJSp.js} +2 -2
- package/dist/public/{iframe-sanitizer-L6Jyu__Z.js → iframe-sanitizer-y2Z1pPwY.js} +1 -1
- package/dist/public/index.html +2 -2
- package/dist/public/index.js +1 -1
- package/dist/public/{initChatSplitResize-BslPXAXS.js → initChatSplitResize-CzV2E7Ul.js} +1 -1
- package/dist/public/initControlPlane-C9jpnWev.js +1 -0
- package/dist/public/llms.txt +1 -1
- package/dist/public/main/index.html +2 -2
- package/dist/public/main/memory/index.html +2 -2
- package/dist/public/{markdown-6MBrIo-S.js → markdown-BnpKxSxl.js} +1 -1
- package/dist/public/mcp-reconnect-9emsqGRe.js +1 -0
- package/dist/public/{memoryStorage-CjGseKI1.js → memoryStorage-C0KvLNUp.js} +1 -1
- package/dist/public/{orchestrator-B9KmIj8Q.js → orchestrator-3h9xxHUm.js} +676 -676
- package/dist/public/orchestrator-nJj59RqD.js +15 -0
- package/dist/public/pages/main/~/docs/publishing-to-github-pages.md +17 -82
- package/dist/public/{peerjs-Dv8JNm7v.js → peerjs-BP4laMXj.js} +1 -1
- package/dist/public/{push-client-Dqq06wbB.js → push-client-CrjEXK3U.js} +1 -1
- package/dist/public/service-worker/fetch-proxy.js +1 -1
- package/dist/public/service-worker/push-handler.js +1 -1
- package/dist/public/service-worker.js +1 -1
- package/dist/public/{shadow-claw-Bd1rfuVC.js → shadow-claw-CbwETBWf.js} +2 -2
- package/dist/public/{shadow-claw-accounts-DL2l3oM0.js → shadow-claw-accounts-B4sBTQEj.js} +3 -3
- package/dist/public/{shadow-claw-channels-BGXDsQ38.js → shadow-claw-channels-BDWG5Qa3.js} +1 -1
- package/dist/public/{shadow-claw-chat-NXg6zz_l.js → shadow-claw-chat-Crv0DTCY.js} +6 -6
- package/dist/public/shadow-claw-control-plane-CX1IGbh9.js +199 -0
- package/dist/public/{shadow-claw-conversations-C8eqGpP9.js → shadow-claw-conversations-_9qAaRXk.js} +1 -1
- package/dist/public/shadow-claw-dialog-BrOwAOdk.js +1 -0
- package/dist/public/shadow-claw-file-viewer-Blf6yGVD.js +577 -0
- package/dist/public/shadow-claw-files-CYySBDCl.js +840 -0
- package/dist/public/{shadow-claw-git-C0ntz7aX.js → shadow-claw-git-v8S0JjuR.js} +3 -3
- package/dist/public/{shadow-claw-integrations-DCXV2r69.js → shadow-claw-integrations-D7ufpwhX.js} +1 -1
- package/dist/public/{shadow-claw-llm-CudgFQsS.js → shadow-claw-llm-GWgoVfhI.js} +2 -2
- package/dist/public/{shadow-claw-mcp-remote-B8RkpX28.js → shadow-claw-mcp-remote-kY4LMFNN.js} +1 -1
- package/dist/public/{shadow-claw-networking-BLiRsrsK.js → shadow-claw-networking-qHbP95z9.js} +1 -1
- package/dist/public/{shadow-claw-notifications-CQhQcjtL.js → shadow-claw-notifications-YyHOK2Fr.js} +1 -1
- package/dist/public/{shadow-claw-page-header-NeRD0tKU.js → shadow-claw-page-header-DMKbkv3s.js} +1 -1
- package/dist/public/{shadow-claw-pages-DCHnFh6r.js → shadow-claw-pages-DFZHhzFZ.js} +3 -3
- package/dist/public/{shadow-claw-settings-VAfjKFQg.js → shadow-claw-settings-DhxrKIfA.js} +10 -3
- package/dist/public/shadow-claw-storage-BFynbP0j.js +219 -0
- package/dist/public/{shadow-claw-task-server-Dk33N_1G.js → shadow-claw-task-server-3BIeb5oZ.js} +25 -4
- package/dist/public/{shadow-claw-tasks-xA1VfmWN.js → shadow-claw-tasks-Caxc9atL.js} +4 -4
- package/dist/public/{shadow-claw-terminal-Du2r0ciq.js → shadow-claw-terminal-Beb5qF-U.js} +1 -1
- package/dist/public/{shadow-claw-tools-CZj4rq7l.js → shadow-claw-tools-BfJx3A9W.js} +2 -2
- package/dist/public/{shadow-claw-webvm-JYUkWICG.js → shadow-claw-webvm-BCS8ykeP.js} +1 -1
- package/dist/public/static-main/~/docs/publishing-to-github-pages.md +17 -82
- package/dist/public/static-main-manifest.json +1 -1
- package/dist/public/{syncWebMcpRegistration-DfpvASnh.js → syncWebMcpRegistration-B_M2fCjH.js} +1 -1
- package/dist/server.js +286 -189
- package/package.json +2 -1
- package/src/__mocks__/jszip.cjs +15 -5
- package/src/components/settings/shadow-claw-accounts/shadow-claw-accounts.test.ts +35 -0
- package/src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.css +117 -0
- package/src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.html +81 -0
- package/src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.test.ts +127 -0
- package/src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.ts +292 -0
- package/src/components/settings/shadow-claw-git/shadow-claw-git.test.ts +72 -0
- package/src/components/settings/shadow-claw-integrations/connection-test-auth.test.ts +20 -30
- package/src/components/settings/shadow-claw-integrations/shadow-claw-integrations.test.ts +116 -0
- package/src/components/settings/shadow-claw-llm/model-ranking.test.ts +143 -51
- package/src/components/settings/shadow-claw-llm/shadow-claw-llm.test.ts +307 -4
- package/src/components/settings/shadow-claw-llm/shadow-claw-llm.ts +8 -8
- package/src/components/settings/shadow-claw-mcp-remote/shadow-claw-mcp-remote.test.ts +31 -0
- package/src/components/settings/shadow-claw-peerjs/shadow-claw-peerjs.test.ts +186 -0
- package/src/components/settings/shadow-claw-storage/shadow-claw-storage.html +17 -0
- package/src/components/settings/shadow-claw-storage/shadow-claw-storage.test.ts +120 -0
- package/src/components/settings/shadow-claw-storage/shadow-claw-storage.ts +56 -0
- package/src/components/settings/shadow-claw-task-server/shadow-claw-task-server.css +23 -2
- package/src/components/settings/shadow-claw-task-server/shadow-claw-task-server.html +1 -1
- package/src/components/settings/shadow-claw-task-server/shadow-claw-task-server.test.ts +19 -0
- package/src/components/settings/shadow-claw-task-server/shadow-claw-task-server.ts +2 -1
- package/src/components/shadow-claw/utils/initChatSplitResize.test.ts +180 -13
- package/src/components/shadow-claw/utils/setupEffects.test.ts +39 -0
- package/src/components/shadow-claw-a2ui/catalog/basic/shared.test.ts +117 -0
- package/src/components/shadow-claw-a2ui/shadow-claw-a2ui.test.ts +1159 -1
- package/src/components/shadow-claw-chat/shadow-claw-chat.test.ts +1523 -19
- package/src/components/shadow-claw-chat/utils/escapeHtml.test.ts +13 -0
- package/src/components/shadow-claw-chat/utils/getPeerChatDisplayStatus.test.ts +20 -0
- package/src/components/shadow-claw-conversations/shadow-claw-conversations.test.ts +494 -0
- package/src/components/shadow-claw-dialog/shadow-claw-dialog.ts +13 -2
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.test.ts +378 -0
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +11 -9
- package/src/components/shadow-claw-files/shadow-claw-files.css +41 -17
- package/src/components/shadow-claw-files/shadow-claw-files.html +35 -0
- package/src/components/shadow-claw-files/shadow-claw-files.test.ts +627 -1
- package/src/components/shadow-claw-files/shadow-claw-files.ts +170 -6
- package/src/components/shadow-claw-pages/utils/resolveWorkspaceLinkPath.test.ts +31 -0
- package/src/components/shadow-claw-pages/utils/resolveWorkspaceLinkPath.ts +2 -1
- package/src/components/shadow-claw-pages/utils/rewriteWorkspacePreviewHtml.test.ts +15 -0
- package/src/components/shadow-claw-pdf-viewer/utils/installGetOrInsertComputedPolyfill.test.ts +65 -0
- package/src/components/shadow-claw-settings/shadow-claw-settings.html +7 -0
- package/src/components/shadow-claw-settings/shadow-claw-settings.test.ts +221 -0
- package/src/components/shadow-claw-settings/shadow-claw-settings.ts +2 -0
- package/src/components/shadow-claw-tasks/shadow-claw-tasks.test.ts +407 -0
- package/src/components/shadow-claw-terminal/utils/consumeEscapeSequence.test.ts +58 -0
- package/src/components/shadow-claw-tools/shadow-claw-tools.test.ts +80 -0
- package/src/config/config.test.ts +9 -0
- package/src/config/config.ts +15 -0
- package/src/core/app-routes.test.ts +56 -0
- package/src/core/app-routes.ts +8 -1
- package/src/core/backup-controller.test.ts +101 -0
- package/src/core/backup-controller.ts +137 -0
- package/src/core/control-plane-client.test.ts +408 -0
- package/src/core/control-plane-client.ts +425 -0
- package/src/core/orchestrator/orchestrator.ts +4 -0
- package/src/core/orchestrator/utils/compactContext.test.ts +78 -0
- package/src/core/orchestrator/utils/operations/channel.test.ts +254 -9
- package/src/core/orchestrator/utils/operations/provider.test.ts +326 -34
- package/src/core/orchestrator/utils/operations/vm.test.ts +114 -2
- package/src/core/orchestrator/utils/syncProxyConfigToServiceWorker.test.ts +60 -0
- package/src/core/utils/initControlPlane.test.ts +276 -0
- package/src/core/utils/initControlPlane.ts +437 -0
- package/src/core/utils/initializeApp.ts +18 -0
- package/src/db/getSession.test.ts +13 -1
- package/src/db/openDatabase.test.ts +10 -1
- package/src/db/openDatabase.ts +3 -1
- package/src/server/app.test.ts +12 -0
- package/src/server/app.ts +18 -8
- package/src/server/client-registry.test.ts +250 -0
- package/src/server/client-registry.ts +477 -0
- package/src/server/config.ts +15 -0
- package/src/server/control-plane-types.ts +120 -0
- package/src/server/control-plane.test.ts +472 -0
- package/src/server/control-plane.ts +581 -0
- package/src/server/routes/backup.test.ts +263 -0
- package/src/server/routes/backup.ts +262 -0
- package/src/server/routes/integrations-email.test.ts +532 -0
- package/src/server/routes/llamafile.test.ts +172 -48
- package/src/server/routes/mesh-llm.test.ts +192 -0
- package/src/server/routes/ollama.test.ts +49 -0
- package/src/server/server-peer.test.ts +86 -0
- package/src/server/server-peer.ts +330 -0
- package/src/server/server.ts +35 -0
- package/src/server/services/llamafile-manager.test.ts +230 -6
- package/src/server/services/transformers-runtime.test.ts +186 -18
- package/src/server/webrtc.test.ts +21 -0
- package/src/server/webrtc.ts +72 -0
- package/src/service-worker/fetch-proxy.test.ts +64 -1
- package/src/service-worker/push-handler.ts +39 -0
- package/src/shell/vm.test.ts +744 -12
- package/src/storage/ensureMainGroupIndex.test.ts +153 -0
- package/src/storage/getGroupFile.test.ts +66 -0
- package/src/storage/memoryStorage.test.ts +82 -2
- package/src/storage/migrateLegacyOpfs.test.ts +327 -0
- package/src/storage/migrateLegacyOpfs.ts +117 -0
- package/src/storage/writeGroupFileBytes.test.ts +143 -0
- package/src/stores/chat-ui.test.ts +20 -0
- package/src/stores/orchestrator.test.ts +134 -0
- package/src/stores/toast.test.ts +50 -0
- package/src/stores/tools.test.ts +147 -10
- package/src/subsystems/channels/imessage.test.ts +59 -0
- package/src/subsystems/channels/peerjs.test.ts +500 -62
- package/src/subsystems/channels/peerjs.ts +71 -4
- package/src/subsystems/channels/telegram.test.ts +177 -0
- package/src/subsystems/email/catalog.test.ts +1 -0
- package/src/subsystems/email/connections.test.ts +39 -1
- package/src/subsystems/git/credentials.test.ts +160 -825
- package/src/subsystems/git/git.test.ts +463 -0
- package/src/subsystems/notifications/__mocks__/node-sqlite.cjs +12 -1
- package/src/subsystems/notifications/push-routes.test.ts +33 -0
- package/src/subsystems/notifications/push-routes.ts +23 -0
- package/src/subsystems/notifications/push-store.ts +1 -1
- package/src/subsystems/providers/builtin-ai-tasks.test.ts +74 -0
- package/src/subsystems/providers/litert-lm-provider.test.ts +212 -51
- package/src/subsystems/providers/model-registry.test.ts +115 -0
- package/src/subsystems/providers/providers.test.ts +94 -1
- package/src/subsystems/providers/transformers-js-provider.test.ts +279 -0
- package/src/subsystems/providers/utils/createModelCacheFetch.test.ts +2 -2
- package/src/subsystems/providers/utils/downloadModelToCache.test.ts +2 -2
- package/src/subsystems/providers/utils/loadModelStream.test.ts +2 -2
- package/src/subsystems/skills/activateSkill.test.ts +101 -0
- package/src/subsystems/skills/discoverSkills.test.ts +251 -0
- package/src/subsystems/tools/cron.test.ts +64 -0
- package/src/subsystems/tools/declarative.test.ts +255 -89
- package/src/testing/assets/v86.9pfs/libv86.mjs +63 -0
- package/src/testing/assets/v86.ext2/libv86.mjs +3 -0
- package/src/testing/assets_missing_v86/assets/v86.9pfs/libv86.mjs +1 -0
- package/src/testing/jest-setup.ts +328 -40
- package/src/testing/mock-v86.mjs +49 -0
- package/src/ui/a2ui/types.ts +4 -3
- package/src/ui/a2ui/utils/normaliseComponentsToMap.test.ts +102 -0
- package/src/ui/a2ui/utils/resolveChildIds.test.ts +63 -0
- package/src/ui/a2ui/utils/resolveDynamicNumber.test.ts +13 -1
- package/src/worker/tools/bash/utils/waitForVMReady.test.ts +40 -0
- package/src/worker/tools/email/email.test.ts +193 -8
- package/src/worker/tools/email/utils/asEmailAttachmentInputs.test.ts +47 -0
- package/src/worker/tools/git/git.test.ts +214 -3
- package/src/worker/tools/rooms/invite-to-room.test.ts +54 -0
- package/src/worker/tools/rooms/leave-room.test.ts +40 -0
- package/src/worker/tools/rooms/list-room-members.test.ts +75 -0
- package/src/worker/tools/tasks/tasks-utils.test.ts +22 -0
- package/src/worker/tools/ui/ask-user.test.ts +50 -0
- package/src/worker/tools/ui/clear-chat.test.ts +19 -0
- package/src/worker/tools/ui/get-current-time.test.ts +19 -0
- package/src/worker/tools/ui/javascript.test.ts +116 -0
- package/src/worker/tools/ui/list-components.test.ts +10 -0
- package/src/worker/tools/ui/list-tool-profiles.test.ts +42 -0
- package/src/worker/tools/ui/manage-tools.test.ts +34 -0
- package/src/worker/tools/ui/render-component.test.ts +346 -0
- package/src/worker/tools/ui/send-notification.test.ts +40 -0
- package/src/worker/tools/ui/utils/getAllowFullInternetAccess.test.ts +31 -0
- package/src/worker/tools/ui/utils/parseBooleanConfig.test.ts +25 -0
- package/src/worker/tools/workspace/attach-file.test.ts +84 -0
- package/src/worker/tools/workspace/copy-file.test.ts +69 -0
- package/src/worker/tools/workspace/create-directory.test.ts +40 -0
- package/src/worker/tools/workspace/delete-file.test.ts +73 -0
- package/src/worker/tools/workspace/diff-files.test.ts +94 -0
- package/src/worker/tools/workspace/list-files.test.ts +36 -0
- package/src/worker/tools/workspace/move-file.test.ts +66 -0
- package/src/worker/tools/workspace/open-file.test.ts +57 -0
- package/src/worker/tools/workspace/patch-file.test.ts +81 -0
- package/src/worker/tools/workspace/read-file.test.ts +116 -0
- package/src/worker/tools/workspace/send-file.test.ts +82 -0
- package/src/worker/tools/workspace/update-memory.test.ts +29 -0
- package/src/worker/tools/workspace/write-file.test.ts +28 -0
- package/src/worker/utils/rate-limit.test.ts +199 -0
- package/src/worker/utils/tool-state.test.ts +29 -0
- package/src/worker/utils/transformers-js-utils.test.ts +59 -0
- package/dist/public/config-AL77QAx4.js +0 -1
- package/dist/public/downloadGroupFile-BABv_1mJ.js +0 -1
- package/dist/public/file-viewer-CCSABMsE.js +0 -1
- package/dist/public/mcp-reconnect-DoicazQd.js +0 -1
- package/dist/public/orchestrator-4su7iyWj.js +0 -15
- package/dist/public/shadow-claw-dialog-ByyHgxM9.js +0 -1
- package/dist/public/shadow-claw-file-viewer-9Qkwc30T.js +0 -577
- package/dist/public/shadow-claw-files-aDyq6Hv7.js +0 -781
- package/dist/public/shadow-claw-storage-Cf31np81.js +0 -202
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{L as e,N as t,b as n,h as r,r as i}from"./config-CrHchneq.js";import{t as a}from"./getConfig-D89uJgo5.js";import{t as o}from"./setConfig-DFMYnYLE.js";import{t as s}from"./ulid-BY7rQVLN.js";import{n as c,r as l}from"./crypto-C8c5wMzN.js";function u(e){return!e||e.authMode===`token`||e.authMode===`pat`?`token`:e.authMode===`basic`?`basic`:e.authMode===`oauth`||e.oauthProviderId||e.oauthClientId||e.oauthClientSecret||e.refreshToken||e.accessTokenExpiresAt||e.tokenType||e.oauthReauthRequired?`oauth`:`token`}function d(e){return u(e)}function f(e,t){return d(e)!==`oauth`||e.oauthReauthRequired||!e.refreshToken||!e.oauthProviderId||!e.oauthClientId?!1:t.forceRefresh?!0:e.accessTokenExpiresAt?e.accessTokenExpiresAt<=Date.now()+6e4:!1}async function p(e,t,n){if(!n.refreshToken||!n.oauthProviderId||!n.oauthClientId)return n;let r=await c(n.refreshToken);if(!r)return n;let a=n.oauthClientSecret?await c(n.oauthClientSecret):void 0,s=async r=>{let a=t.findIndex(e=>e.id===n.id);a!==-1&&(t[a]=r,await o(e,i.SERVICE_ACCOUNTS,t))},u=async()=>{let e=(n.oauthRefreshFailureCount||0)+1,t=e>=3,r={...n,oauthRefreshFailureCount:e,oauthReauthRequired:t,oauthReauthRequiredAt:t?n.oauthReauthRequiredAt||Date.now():void 0};return await s(r),r};try{let e=await fetch(`/oauth/refresh`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({providerId:n.oauthProviderId,clientId:n.oauthClientId,clientSecret:a,refreshToken:r,scope:n.scopes,tokenUrl:n.oauthCustomTokenUrl})});if(!e.ok)return u();let t=await e.json();if(!t.accessToken)return u();let i=await l(t.accessToken);if(!i)return u();let o=n.refreshToken;if(t.refreshToken){let e=await l(t.refreshToken);e&&(o=e)}let c={...n,token:i,refreshToken:o,accessTokenExpiresAt:t.expiresIn?Date.now()+t.expiresIn*1e3:n.accessTokenExpiresAt,tokenType:t.tokenType||n.tokenType,scopes:t.scope?t.scope.split(/[\s,]+/).map(e=>e.trim()).filter(Boolean):n.scopes,oauthRefreshFailureCount:0,oauthReauthRequired:!1,oauthReauthRequiredAt:void 0};return await s(c),c}catch{return u()}}function m(e,n){if(e.oauthProviderId){let n=t(e.oauthProviderId);if(n)return n}let i=[e.service,e.hostPattern,n].filter(e=>!!e).map(e=>e.toLowerCase());for(let e of Object.values(r))if([e.providerId,...e.aliases||[]].map(e=>e.toLowerCase()).some(e=>i.some(t=>t.includes(e))))return e;return null}function h(e,t){let n=d(e),r=m(e,t);if(r){let e;return e=n===`oauth`?r.tokenAuth.oauth:n===`basic`&&r.tokenAuth.basic?r.tokenAuth.basic:r.tokenAuth.token,{headerName:e.headerName,headerPrefix:e.headerPrefix||``}}return{headerName:`Authorization`,headerPrefix:n===`basic`?`Basic `:`Bearer `}}function g(e,t){let n=[],r=-1,i=t.toLowerCase();for(let t of e){if(!t.hostPattern)continue;let e=t.hostPattern.toLowerCase();i.includes(e)&&(e.length>r?(r=e.length,n.length=0,n.push(t)):e.length===r&&n.push(t))}return n}function _(e,t){return e.length?t&&e.find(e=>d(e)===t)||e[0]:void 0}async function v(e,t,n={}){let r=await a(e,i.SERVICE_ACCOUNTS),o=Array.isArray(r)?r:[];if(o.length===0)return;let s;if(n.accountId&&(s=o.find(e=>e.id===n.accountId)),!s&&t){let e=g(o,t);s=n.authMode?_(e,n.authMode):_(e,e[0]?m(e[0],t)?.defaultMode:void 0)}if(!s){let t=await a(e,i.SERVICE_DEFAULT_ACCOUNT);t&&(s=o.find(e=>e.id===t))}if(!s&&n.authMode&&(s=_(o,n.authMode)),s||=o[0],!s)return;if(f(s,n)&&(s=await p(e,o,s)),d(s)===`oauth`&&s.oauthReauthRequired)return{token:``,service:s.service,hostPattern:s.hostPattern,headerName:`Authorization`,headerValue:``,accountId:s.id,authMode:`oauth`,reauthRequired:!0};let l=``;s.token&&(l=await c(s.token)??``);let{headerName:u,headerPrefix:v}=h(s,t),y=l;d(s)===`basic`&&s.basicUsername&&(y=btoa(`${s.basicUsername}:${l}`));let b=v?`${v}${y}`:y;return{token:l,service:s.service,hostPattern:s.hostPattern,headerName:u,headerValue:b,accountId:s.id,authMode:d(s)}}function y(e){return u(e)}function b(e){switch(e){case`azure-devops`:return`azure_devops`;default:return e}}function x(e){if(!e)return`generic`;let t=e.toLowerCase();return t.includes(`github`)?`github`:t.includes(`dev.azure.com`)||t.includes(`visualstudio.com`)?`azure-devops`:t.includes(`gitlab`)?`gitlab`:`generic`}function S(t){if(t.reauthRequired)return{};let n=t.provider||x(t.hostPattern||``),r=b(n),i=t.authMode||`token`;if(t.token&&r===`azure_devops`&&e(r,i,`git_remote`)?.headerPrefix===`Basic `)return{Authorization:`Basic ${btoa(`:`+t.token)}`};switch(n){case`azure-devops`:if(t.username&&t.password)return{Authorization:`Basic ${btoa(t.username+`:`+t.password)}`};break;default:break}if(t.token){let n=e(r,i,`git_remote`);return n?.headerName?{[n.headerName]:`${n.headerPrefix||``}${t.token}`}:{Authorization:`Bearer ${t.token}`}}return{}}function C(e){try{let t=new URL(e),n=t.pathname.replace(/\/+$/,``);return n?t.hostname+n:t.hostname}catch{return}}function w(e,t){let n=t.toLowerCase(),r=[],i=-1;for(let t of e){if(!t.hostPattern)continue;let e=t.hostPattern.toLowerCase();n.includes(e)&&(e.length>i?(i=e.length,r.length=0,r.push(t)):e.length===i&&r.push(t))}return r}function T(e,t){if(!e.length)return;if(!t)return e[0];let n=e.find(e=>y(e)===t);if(n)return n;if(t===`token`){let t=e.find(e=>y(e)===`token`&&!e.authMode);if(t)return t}return e[0]}async function E(e){if(e)return await c(e)??void 0}function D(e,t){return y(e)!==`oauth`||e.oauthReauthRequired||!e.refreshToken||!e.oauthProviderId||!e.oauthClientId?!1:t.forceRefresh?!0:e.accessTokenExpiresAt?e.accessTokenExpiresAt<=Date.now()+6e4:!1}async function O(e,t,n){if(!n.refreshToken||!n.oauthProviderId||!n.oauthClientId)return n;let r=await E(n.refreshToken);if(!r)return n;let a=n.oauthClientSecret?await E(n.oauthClientSecret):void 0,s=async r=>{let a=t.findIndex(e=>e.id===n.id);a!==-1&&(t[a]=r,await o(e,i.GIT_ACCOUNTS,t))},c=async()=>{let e=(n.oauthRefreshFailureCount||0)+1,t=e>=3,r={...n,oauthRefreshFailureCount:e,oauthReauthRequired:t,oauthReauthRequiredAt:t?n.oauthReauthRequiredAt||Date.now():void 0};return await s(r),r};try{let e=await fetch(`/oauth/refresh`,{body:JSON.stringify({clientId:n.oauthClientId,clientSecret:a,providerId:n.oauthProviderId,refreshToken:r,scope:n.scopes}),headers:{"content-type":`application/json`},method:`POST`});if(!e.ok)return c();let t=await e.json();if(!t.accessToken)return c();let i=await l(t.accessToken);if(!i)return c();let o=n.refreshToken;if(t.refreshToken){let e=await l(t.refreshToken);e&&(o=e)}let u={...n,token:i,refreshToken:o,accessTokenExpiresAt:t.expiresIn?Date.now()+t.expiresIn*1e3:n.accessTokenExpiresAt,tokenType:t.tokenType||n.tokenType,scopes:t.scope?t.scope.split(/[\s,]+/).map(e=>e.trim()).filter(Boolean):n.scopes,oauthRefreshFailureCount:0,oauthReauthRequired:!1,oauthReauthRequiredAt:void 0};return await s(u),u}catch{return c()}}async function k(e,t,n={}){let r=await a(e,i.GIT_ACCOUNTS);return Array.isArray(r)&&r.length>0?ee(e,r,t,n):A(e)}async function ee(e,t,n,r={}){let o;if(r.accountId&&(o=t.find(e=>e.id===r.accountId)),!o&&n){let e=C(n);e&&(o=T(w(t,e),r.authMode))}if(!o){let r=await a(e,i.GIT_DEFAULT_ACCOUNT);if(r){let e=t.find(e=>e.id===r);if(e)if(!n)o=e;else{let t=C(n);if(t&&e.hostPattern){let n=t?.toLowerCase(),r=e.hostPattern.toLowerCase();n?.includes(r)&&(o=e)}}}}if(!o&&!n&&r.authMode&&(o=T(t,r.authMode)),!o&&!n&&(o=t[0]),!o)return{authMode:`token`,authorEmail:void 0,authorName:void 0,password:void 0,provider:`generic`,token:void 0,username:void 0};D(o,r)&&(o=await O(e,t,o));let s=o.provider||x(o.hostPattern||``);return y(o)===`oauth`&&o.oauthReauthRequired?{accountId:o.id,authMode:`oauth`,authorEmail:o.authorEmail||void 0,authorName:o.authorName||void 0,hostPattern:o.hostPattern||void 0,password:void 0,provider:s,reauthRequired:!0,token:void 0,username:o.username||void 0}:{accountId:o.id,authMode:y(o),authorEmail:o.authorEmail||void 0,authorName:o.authorName||void 0,hostPattern:o.hostPattern||void 0,password:await E(o.password),provider:s,token:await E(o.token),username:o.username||void 0}}async function A(e){let t=await a(e,i.GIT_TOKEN),n=await a(e,i.GIT_PASSWORD);return{authMode:`token`,authorEmail:await a(e,i.GIT_AUTHOR_EMAIL)||void 0,authorName:await a(e,i.GIT_AUTHOR_NAME)||void 0,password:n?await E(n):void 0,provider:`generic`,token:t?await E(t):void 0,username:await a(e,i.GIT_USERNAME)||void 0}}function j(e){if(typeof e!=`string`||!e.trim())return!1;try{let t=new URL(e);return t.protocol===`https:`||t.protocol===`http:`}catch{return!1}}function M(e,t){if(!e||typeof e!=`object`)return null;let n=e;if(!n.serviceType||!n.authType)return null;if(n.serviceType!==t)throw Error(`Credential ref serviceType must match connection serviceType`);return{serviceType:n.serviceType,authType:n.authType,providerId:n.providerId||void 0,accountId:n.accountId||void 0,gitAccountId:n.gitAccountId||void 0,headerName:n.headerName||void 0,encryptedValue:n.encryptedValue||void 0}}function N(e){if(!e||typeof e!=`object`)return null;let t=e;return!t.id||!t.label||!t.serviceType||!t.transport||typeof t.enabled!=`boolean`||typeof t.createdAt!=`number`||typeof t.updatedAt!=`number`||!j(t.serverUrl)||t.serviceType!==`mcp_remote`&&t.serviceType!==`webmcp_local`||t.transport!==`streamable_http`&&t.transport!==`sse`&&t.transport!==`websocket`?null:{id:t.id,label:t.label,serviceType:t.serviceType,serverUrl:t.serverUrl,transport:t.transport,enabled:t.enabled,autoReconnectOAuth:t.autoReconnectOAuth===!0,createdAt:t.createdAt,updatedAt:t.updatedAt,credentialRef:M(t.credentialRef,t.serviceType)}}async function P(e){let t=await a(e,i.REMOTE_MCP_CONNECTIONS);if(!Array.isArray(t))return[];let n=[];for(let e of t){let t=N(e);t&&n.push(t)}return n}async function F(e,t){await o(e,i.REMOTE_MCP_CONNECTIONS,t)}async function te(e){return P(e)}async function I(e,t){if(!t)return null;let n=await P(e);return n.find(e=>e.id===t)||n.find(e=>e.label.toLowerCase()===t.toLowerCase())||null}async function ne(e,t){if(!t?.label?.trim())throw Error(`Connection label is required`);if(!j(t.serverUrl))throw Error(`Connection serverUrl must be an absolute http(s) URL`);let n=t.serviceType||`mcp_remote`;if(n!==`mcp_remote`&&n!==`webmcp_local`)throw Error(`Unsupported serviceType for remote MCP connection`);let r=await P(e),i=Date.now();if(t.id){let a=r.findIndex(e=>e.id===t.id);if(a!==-1){let o=r[a],s={...o,label:t.label.trim(),serviceType:n,serverUrl:t.serverUrl,transport:t.transport,enabled:t.enabled??o.enabled,autoReconnectOAuth:t.autoReconnectOAuth??o.autoReconnectOAuth,updatedAt:i};return r[a]=s,await F(e,r),s}}let a={id:t.id||s(),label:t.label.trim(),serviceType:n,serverUrl:t.serverUrl,transport:t.transport,enabled:t.enabled??!0,autoReconnectOAuth:t.autoReconnectOAuth??!1,createdAt:i,updatedAt:i,credentialRef:null};return r.push(a),await F(e,r),a}async function re(e,t,n){if(!t)return null;let r=await P(e),i=r.findIndex(e=>e.id===t);if(i===-1)return null;let a=r[i],o=n?M(n,a.serviceType):null,s={...a,credentialRef:o,updatedAt:Date.now()};return r[i]=s,await F(e,r),s}async function L(e,t){if(!t)return!1;let n=await P(e),r=n.filter(e=>e.id!==t);return r.length===n.length?!1:(await F(e,r),!0)}function R(e){return e===`oauth`?`oauth`:`token`}async function z(e,t,n={}){let r=await I(e,t);if(!r)return null;let i=r.credentialRef;if(!i||i.authType===`none`)return{connection:r,authType:`none`,headers:{}};if(i.authType===`custom_header`){if(!i.headerName||!i.encryptedValue)return{connection:r,authType:`custom_header`,headers:{}};let e=await c(i.encryptedValue);return{connection:r,authType:`custom_header`,headers:e?{[i.headerName]:e}:{}}}let a=R(i.authType);if(i.accountId){let t=await v(e,r.serverUrl,{accountId:i.accountId,authMode:a,forceRefresh:n.forceRefresh});return t?t.reauthRequired?{connection:r,authType:i.authType,headers:{},reauthRequired:!0}:{connection:r,authType:i.authType,headers:t.headerValue?{[t.headerName]:t.headerValue}:{}}:{connection:r,authType:i.authType,headers:{}}}if(i.gitAccountId){let t=await k(e,r.serverUrl,{accountId:i.gitAccountId,authMode:a,forceRefresh:n.forceRefresh});return t.reauthRequired?{connection:r,authType:i.authType,headers:{},reauthRequired:!0}:{connection:r,authType:i.authType,headers:S(t)}}return{connection:r,authType:i.authType,headers:{}}}const B=new Map;function V(e){return typeof e==`object`&&!!e&&`method`in e&&`id`in e&&!(`result`in e)&&!(`error`in e)}function H(e){let t=(e.requestedSchema||{}).properties||{},n={};for(let[e,r]of Object.entries(t))`default`in r?n[e]=r.default:r.type===`boolean`&&(n[e]=!0);return n}var U=class extends Error{constructor(e){super(e),this.name=`InvalidRemoteMcpSessionError`}},W=class extends Error{status;constructor(e,t){super(t),this.name=`HttpRemoteMcpError`,this.status=e}},G=class extends Error{connectionId;constructor(e){super(`OAuth reconnect required for remote MCP connection`),this.name=`McpReauthRequiredError`,this.connectionId=e}};function K(e,t){return!e.headers||typeof e.headers.get!=`function`?null:e.headers.get(t)}function ie(e){return/no valid session id provided/i.test(e)}function q(e,t){let n=t&&`error`in t?t.error.message||`Remote MCP JSON-RPC error`:``;return ie(n)?new U(n):e.ok?Error(n||`Remote MCP JSON-RPC error`):new W(e.status,n?`Remote MCP HTTP error: ${e.status} (${n})`:`Remote MCP HTTP error: ${e.status}`)}function ae(e){if(!e)return null;let t=null,n=e.split(/\r?\n/);for(let e of n){let n=e.trim();if(!n.startsWith(`data:`))continue;let r=n.slice(5).trim();if(!(!r||r===`[DONE]`))try{let e=JSON.parse(r);e&&typeof e==`object`&&`jsonrpc`in e&&(t=e)}catch{}}return t}function oe(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function J(e,t,n){let r=await fetch(e,{method:`POST`,headers:{"content-type":`application/json`,accept:`application/json, text/event-stream`,...t},body:JSON.stringify(n)}),i=(K(r,`content-type`)||``).toLowerCase(),a=null;if(typeof r.text==`function`){let e=await r.text();a=i.includes(`text/event-stream`)?ae(e):oe(e)}else try{a=await r.json()}catch{a=null}return{response:r,payload:a}}async function se(e,t,n){let{response:r,payload:i}=await J(e,{...t,"mcp-session-id":n},{jsonrpc:`2.0`,method:`notifications/initialized`,params:{}});if(!r.ok||i&&`error`in i)throw q(r,i)}async function Y(e,t,n){let r=B.get(e);if(r?.sessionId)return r;let{response:i,payload:a}=await J(t,n,{jsonrpc:`2.0`,id:`initialize-${Date.now().toString(36)}`,method:`initialize`,params:{protocolVersion:`2025-03-26`,capabilities:{elicitation:{}},clientInfo:{name:`shadowclaw-remote-mcp-client`,version:`1.0.0`}}});if(!i.ok||a&&`error`in a)throw q(i,a);let o=K(i,`mcp-session-id`)||`local-${Date.now()}-${Math.random().toString(36).slice(2)}`,s={sessionId:o,protocolVersion:K(i,`mcp-protocol-version`)||a?.result?.protocolVersion,lastUsedAt:Date.now()};return await se(t,n,o),B.set(e,s),s}async function X(e,t,n,r,i){let a=await Y(e,t,n),o=async e=>{let a={jsonrpc:`2.0`,id:Date.now().toString(),method:r,params:i||{}},o={...n,"mcp-session-id":e},{response:s,payload:c}=await J(t,o,a),l=0;for(;V(c)&&l<5&&(l++,c.method===`elicitation/create`);){let e=H(c.params||{});({response:s,payload:c}=await J(t,o,{jsonrpc:`2.0`,id:c.id,result:{action:`accept`,content:e}}))}if(V(c))throw Error(`Unsupported server request: ${c.method}`);if(!s.ok||!c||`error`in c)throw q(s,c);return c.result};try{let t=await o(a.sessionId);return a.lastUsedAt=Date.now(),B.set(e,a),t}catch(r){if(!(r instanceof U))throw r;B.delete(e),a=await Y(e,t,n);let i=await o(a.sessionId);return a.lastUsedAt=Date.now(),B.set(e,a),i}}function Z(e){e&&B.delete(e)}async function Q(e,t,n,r){let i=await z(e,t);if(!i)throw Error(`Remote MCP connection not found`);if(i.reauthRequired)throw new G(t);let{connection:a,authType:o,headers:s}=i;if(a.transport!==`streamable_http`)throw Error(`Unsupported remote MCP transport`);try{return await X(t,a.serverUrl,s,n,r)}catch(i){if(!(i instanceof W)||i.status!==401||o!==`oauth`)throw i;Z(t);let a=await z(e,t,{forceRefresh:!0});if(!a||a.reauthRequired)throw new G(t);try{return await X(t,a.connection.serverUrl,a.headers,n,r)}catch(e){throw e instanceof W&&e.status===401?new G(t):e}}}async function ce(e,t){let n=await Q(e,t,`tools/list`);return Array.isArray(n.tools)?n.tools:[]}async function le(e,t,n,r={}){return Q(e,t,`tools/call`,{name:n,arguments:r})}async function ue(e,t){let n=[],r;try{r=await z(e,t)}catch(e){let t=e instanceof Error?e.message:String(e);return n.push({step:`Resolve authentication`,status:`error`,detail:t}),{success:!1,error:t,toolCount:0,toolNames:[],steps:n}}if(!r)return n.push({step:`Resolve authentication`,status:`error`,detail:`Connection not found`}),{success:!1,error:`Connection not found`,toolCount:0,toolNames:[],steps:n};if(r.reauthRequired){let e=`OAuth token expired or revoked — re-authenticate in Settings`;return n.push({step:`Resolve authentication`,status:`error`,detail:e}),{success:!1,error:e,toolCount:0,toolNames:[],steps:n}}n.push({step:`Resolve authentication`,status:`ok`,detail:`Auth type: ${r.authType}`});let{connection:i,authType:a,headers:o}=r;if(i.transport!==`streamable_http`){let e=`Unsupported transport: ${i.transport}`;return n.push({step:`Establish MCP session`,status:`error`,detail:e}),{success:!1,error:e,toolCount:0,toolNames:[],steps:n}}Z(t);try{await Y(t,i.serverUrl,o),n.push({step:`Establish MCP session`,status:`ok`,detail:`Session established`})}catch(r){let s=r instanceof Error?r.message:String(r);if(n.push({step:`Establish MCP session`,status:`error`,detail:s}),r instanceof W&&r.status===401&&a===`oauth`){Z(t);let r=await z(e,t,{forceRefresh:!0});if(r&&!r.reauthRequired){n.push({step:`Refresh OAuth token`,status:`ok`,detail:`Token refreshed, retrying`}),i=r.connection,o=r.headers;try{await Y(t,i.serverUrl,o),n.push({step:`Establish MCP session`,status:`ok`,detail:`Session established`})}catch(e){let t=e instanceof Error?e.message:String(e),r=e instanceof W&&e.status===401?`${t} — re-authorize in Settings → Accounts`:t;return n.push({step:`Establish MCP session`,status:`error`,detail:r}),{success:!1,error:r,toolCount:0,toolNames:[],steps:n}}}else return n.push({step:`Refresh OAuth token`,status:`error`,detail:`Token refresh failed — re-authenticate in Settings`}),{success:!1,error:s,toolCount:0,toolNames:[],steps:n}}else return{success:!1,error:s,toolCount:0,toolNames:[],steps:n}}try{let e=await X(t,i.serverUrl,o,`tools/list`),r=Array.isArray(e.tools)?e.tools:[],a=r.map(e=>e.name);return n.push({step:`Discover tools`,status:`ok`,detail:`${r.length} tool${r.length===1?``:`s`} available`}),{success:!0,error:null,toolCount:r.length,toolNames:a,steps:n}}catch(e){let t=e instanceof Error?e.message:String(e);return n.push({step:`Discover tools`,status:`error`,detail:t}),{success:!1,error:t,toolCount:0,toolNames:[],steps:n}}}function $(e,t,n,r){return{accessTokenExpiresAt:e.expiresIn?Date.now()+e.expiresIn*1e3:t.accessTokenExpiresAt,oauthReauthRequired:!1,oauthReauthRequiredAt:void 0,oauthRefreshFailureCount:0,refreshToken:r,scopes:e.scope?e.scope.split(/[\s,]+/).map(e=>e.trim()).filter(Boolean):t.scopes,token:n,tokenType:e.tokenType||t.tokenType}}async function de(e,t,n,r,a,s,u){if(!t.refreshToken)return{success:!1,error:`No refresh token available.`};let d=await c(t.refreshToken);if(!d)return{success:!1,error:`Failed to decrypt refresh token.`};let f=t.oauthClientSecret?await c(t.oauthClientSecret):void 0;try{let c=await fetch(`/oauth/refresh`,{body:JSON.stringify({clientId:t.oauthClientId,clientSecret:f||void 0,providerId:t.oauthProviderId,refreshToken:d,scope:t.scopes,tokenUrl:t.oauthCustomTokenUrl}),headers:{"content-type":`application/json`},method:`POST`});if(!c.ok)return{success:!1,error:`Token refresh request failed.`};let p=await c.json();if(!p.accessToken)return{success:!1,error:`No access token in refresh response.`};let m=await l(p.accessToken);if(!m)return{success:!1,error:`Failed to encrypt access token.`};let h=t.refreshToken;if(p.refreshToken){let e=await l(p.refreshToken);e&&(h=e)}let g=$({accessToken:p.accessToken,expiresIn:p.expiresIn,refreshToken:p.refreshToken,scope:p.scope,tokenType:p.tokenType},t,m,h);if(n===`service`&&s.accountId){let t=r.findIndex(e=>e.id===s.accountId);t!==-1&&(Object.assign(r[t],g),await o(e,i.SERVICE_ACCOUNTS,r))}else if(n===`git`&&s.gitAccountId){let t=a.findIndex(e=>e.id===s.gitAccountId);t!==-1&&(Object.assign(a[t],g),await o(e,i.GIT_ACCOUNTS,a))}return Z(u),{success:!0}}catch(e){return{success:!1,error:`Silent refresh failed: ${e instanceof Error?e.message:String(e)}`}}}async function fe(e,t,r={}){let s=await I(e,t);if(!s?.credentialRef)return{success:!1,error:`Connection not found.`};let u=s.credentialRef;if(u.authType!==`oauth`)return{success:!1,error:`This connection does not use OAuth authentication.`};let d=await a(e,i.SERVICE_ACCOUNTS),f=Array.isArray(d)?d:[],p=await a(e,i.GIT_ACCOUNTS),m=Array.isArray(p)?p:[],h,g=null;if(u.accountId?(h=f.find(e=>e.id===u.accountId),g=`service`):u.gitAccountId&&(h=m.find(e=>e.id===u.gitAccountId),g=`git`),!h||!g)return{error:`Linked account not found. Edit the connection to re-configure authentication.`,success:!1};let _=h.oauthClientId,v=h.oauthProviderId;if(!v||!_)return{error:`Account is missing OAuth provider or client ID. Edit the account in Settings → Accounts to fix.`,success:!1};if(h.refreshToken){let n=await de(e,h,g,f,m,u,t);if(n.success)return n}if(r.silentOnly)return{error:`Silent token refresh failed. Use Settings → Remote MCP → Reconnect OAuth for full re-authorization.`,success:!1};let y=h.oauthClientSecret?await c(h.oauthClientSecret):void 0,b=h.scopes,x=n[v],S=v===`custom_mcp`,C=S&&h.oauthCustomRedirectUri?h.oauthCustomRedirectUri:x?.redirectUri?x.redirectUri:`${globalThis.location?.origin||``}/oauth/callback`;try{let n=await fetch(`/oauth/authorize`,{body:JSON.stringify({providerId:v,clientId:_,clientSecret:y||void 0,redirectUri:C,scope:b,...S&&h.oauthCustomAuthorizeUrl?{authorizeUrl:h.oauthCustomAuthorizeUrl}:{},...S&&h.oauthCustomTokenUrl?{tokenUrl:h.oauthCustomTokenUrl}:{},...S&&typeof h.oauthCustomUsePkce==`boolean`?{usePkce:h.oauthCustomUsePkce}:{}}),headers:{"content-type":`application/json`},method:`POST`}),r=await n.json();if(!n.ok||!r.state||!r.authorizeUrl)throw Error(r.error||`OAuth authorize failed`);let a=window.open(r.authorizeUrl,`shadowclaw-oauth`,`popup=yes,width=540,height=720`);if(!a||a.closed||a.closed===void 0)throw Error(`OAuth popup was blocked by the browser. Please enable popups for this site and try again.`);let s=r.state,c=`pending`;for(let e=0;e<60;e++){let e=await fetch(`/oauth/session/${encodeURIComponent(s)}`),t=await e.json();if(!e.ok)throw Error(t.error||`OAuth session not found`);if(c=t.status||`pending`,c===`authorized`)break;if(c===`error`)throw Error(t.error||`OAuth authorization failed`);await new Promise(e=>setTimeout(e,1e3))}if(c!==`authorized`)throw Error(`OAuth authorization timed out`);let d=await fetch(`/oauth/token`,{body:JSON.stringify({state:s}),headers:{"content-type":`application/json`},method:`POST`}),p=await d.json();if(!d.ok||!p.accessToken)throw Error(p.error||`OAuth token exchange failed`);let x=await l(p.accessToken);if(!x)throw Error(`Failed to encrypt access token`);let w=h.refreshToken;if(p.refreshToken){let e=await l(p.refreshToken);e&&(w=e)}let T=$({accessToken:p.accessToken,expiresIn:p.expiresIn,refreshToken:p.refreshToken,scope:p.scope,tokenType:p.tokenType},h,x,w);if(g===`service`&&u.accountId){let t=f.findIndex(e=>e.id===u.accountId);t!==-1&&(Object.assign(f[t],T),await o(e,i.SERVICE_ACCOUNTS,f))}else if(g===`git`&&u.gitAccountId){let t=m.findIndex(e=>e.id===u.gitAccountId);t!==-1&&(Object.assign(m[t],T),await o(e,i.GIT_ACCOUNTS,m))}return Z(t),{success:!0}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}export{ue as a,I as c,S as d,x as f,u as h,ce as i,te as l,v as m,G as n,re as o,k as p,le as r,L as s,fe as t,ne as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-aKtaBQYM.js";import{
|
|
1
|
+
import{n as e}from"./rolldown-runtime-aKtaBQYM.js";import{x as t}from"./config-CrHchneq.js";var n=e({MemoryDirectoryHandle:()=>c,MemoryFileHandle:()=>s,MemorySyncAccessHandle:()=>a,MemoryWritableStream:()=>o,getMemoryOpfsRoot:()=>u,isMemoryStorageFallbackActive:()=>d});function r(e,t){if(typeof DOMException<`u`)try{return new DOMException(e,t)}catch{}let n=Error(e);return n.name=t,n}function i(e){let t=e();return t[Symbol.asyncDispose??Symbol.for(`Symbol.asyncDispose`)]=async()=>{},t}var a=class{_file;_closed=!1;constructor(e){this._file=e}close(){this._closed=!0}flush(){}getSize(){if(this._closed)throw r(`SyncAccessHandle is closed`,`InvalidStateError`);return this._file.getRawData().byteLength}read(e,t){if(this._closed)throw r(`SyncAccessHandle is closed`,`InvalidStateError`);let n=this._file.getRawData(),i=t?.at??0;if(i>=n.byteLength)return 0;let a=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),o=n.subarray(i,i+a.byteLength);return a.set(o),o.byteLength}write(e,t){if(this._closed)throw r(`SyncAccessHandle is closed`,`InvalidStateError`);let n=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),i=t?.at??0,a=this._file.getRawData(),o=i+n.byteLength,s;return o>a.byteLength?(s=new Uint8Array(o),s.set(a)):s=new Uint8Array(a),s.set(n,i),this._file.setRawData(s),n.byteLength}truncate(e){if(this._closed)throw r(`SyncAccessHandle is closed`,`InvalidStateError`);let t=this._file.getRawData(),n=new Uint8Array(e);n.set(t.subarray(0,Math.min(t.byteLength,e))),this._file.setRawData(n)}},o=class{_file;_buffer;_position=0;_length=0;_closed=!1;constructor(e,t=!1){this._file=e;let n=e.getRawData();t?(this._buffer=new Uint8Array(n),this._length=n.byteLength):(this._buffer=new Uint8Array(1024),this._length=0)}async write(e){if(this._closed)throw r(`WritableStream is closed`,`InvalidStateError`);let t;if(typeof e==`string`)t=new TextEncoder().encode(e);else if(e instanceof Uint8Array)t=e;else if(e instanceof ArrayBuffer)t=new Uint8Array(e);else if(typeof Blob<`u`&&e instanceof Blob)t=typeof e.arrayBuffer==`function`?new Uint8Array(await e.arrayBuffer()):typeof e.text==`function`?new TextEncoder().encode(await e.text()):typeof FileReader<`u`?await new Promise(t=>{let n=new FileReader;n.onload=()=>{t(new Uint8Array(n.result))},n.onerror=()=>t(new Uint8Array),n.readAsArrayBuffer(e)}):new Uint8Array;else if(e&&typeof e==`object`&&`type`in e)if(e.type===`write`){typeof e.position==`number`&&(this._position=e.position);let n=e.data;t=typeof n==`string`?new TextEncoder().encode(n):n instanceof Uint8Array?n:n instanceof ArrayBuffer?new Uint8Array(n):typeof Blob<`u`&&n instanceof Blob&&typeof n.arrayBuffer==`function`?new Uint8Array(await n.arrayBuffer()):new Uint8Array}else if(e.type===`seek`){this._position=e.position??0;return}else if(e.type===`truncate`){this._truncate(e.size??0);return}else t=new Uint8Array;else t=new Uint8Array;let n=this._position+t.length;if(n>this._buffer.length){let e=Math.max(this._buffer.length*2,n,1024),t=new Uint8Array(e);t.set(this._buffer),this._buffer=t}this._buffer.set(t,this._position),this._position+=t.length,this._position>this._length&&(this._length=this._position)}_truncate(e){if(e<this._length)this._length=e;else if(e>this._length){if(e>this._buffer.length){let t=new Uint8Array(e);t.set(this._buffer),this._buffer=t}this._length=e}this._position>e&&(this._position=e)}async seek(e){if(this._closed)throw r(`WritableStream is closed`,`InvalidStateError`);this._position=e}async truncate(e){if(this._closed)throw r(`WritableStream is closed`,`InvalidStateError`);this._truncate(e)}async close(){if(this._closed)return;this._closed=!0;let e=this._buffer.slice(0,this._length);this._file.setRawData(e)}async abort(){this._closed=!0}},s=class{kind=`file`;name;_data;_lastModified;constructor(e,t=new Uint8Array){this.name=e,this._data=t,this._lastModified=Date.now()}getRawData(){return this._data}setRawData(e){this._data=e,this._lastModified=Date.now()}_getArrayBuffer(){let e=new ArrayBuffer(this._data.byteLength);return new Uint8Array(e).set(this._data),e}async getFile(){let e=this._getArrayBuffer(),t=this._data,n=this.name,r=this._lastModified,i={name:n,size:t.byteLength,type:``,lastModified:r,async text(){return new TextDecoder().decode(t)},async arrayBuffer(){return e},slice(n=0,r=t.byteLength){return new Blob([e.slice(n,r)])}};if(typeof File<`u`)try{let t=new File([e],this.name,{lastModified:this._lastModified});return typeof t.text!=`function`&&(t.text=i.text),typeof t.arrayBuffer!=`function`&&(t.arrayBuffer=i.arrayBuffer),t}catch{}return i}async createWritable(e){return new o(this,e?.keepExistingData??!1)}async createSyncAccessHandle(){return new a(this)}async isSameEntry(e){return this===e}async queryPermission(){return`granted`}async requestPermission(){return`granted`}},c=class e{kind=`directory`;name;_entries=new Map;constructor(e){this.name=e}_setEntry(e,t){this._entries.set(e,t)}async getDirectoryHandle(t,n){if(t===`.`||t===``)return this;if(t===`..`)throw r(`Cannot navigate to parent directory with '..'`,`SecurityError`);let i=this._entries.get(t);if(i){if(i.kind===`directory`)return i;throw r(`"${t}" is a file, not a directory`,`TypeMismatchError`)}if(n?.create){let n=new e(t);return this._entries.set(t,n),n}throw r(`A requested file or directory could not be found at "${t}"`,`NotFoundError`)}async getFileHandle(e,t){if(e===`.`||e===`..`||e===``)throw r(`Invalid file name "${e}"`,`TypeMismatchError`);let n=this._entries.get(e);if(n){if(n.kind===`file`)return n;throw r(`"${e}" is a directory, not a file`,`TypeMismatchError`)}if(t?.create){let t=new s(e);return this._entries.set(e,t),t}throw r(`A requested file could not be found at "${e}"`,`NotFoundError`)}async removeEntry(e,t){let n=this._entries.get(e);if(!n)throw r(`Entry "${e}" not found`,`NotFoundError`);if(n.kind===`directory`&&n._entries.size>0&&!t?.recursive)throw r(`Directory "${e}" is not empty`,`InvalidModificationError`);this._entries.delete(e)}async resolve(e){if(this===e)return[];for(let[t,n]of this._entries.entries()){if(n===e)return[t];if(n.kind===`directory`){let r=await n.resolve(e);if(r)return[t,...r]}}return null}entries(){let e=this;return i(async function*(){for(let[t,n]of e._entries.entries())yield[t,n]})}values(){let e=this;return i(async function*(){for(let t of e._entries.values())yield t})}keys(){let e=this;return i(async function*(){for(let t of e._entries.keys())yield t})}[Symbol.asyncIterator](){return this.entries()}async isSameEntry(e){return this===e}async queryPermission(){return`granted`}async requestPermission(){return`granted`}};let l=null;function u(){if(!l){let e=new c(`memory-root`),n=new c(t);e._setEntry(t,n),l=n}return l}function d(){return l!==null}export{n,u as t};
|