@jetcrab/pi-desk 1.1.20-dev → 1.1.21
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/docs/plugins.md +81 -1
- package/package.json +3 -3
- package/src/app/page.tsx +6 -1
- package/src/app/project-preview/page.tsx +10 -0
- package/src/client/l1_entry/pages/l1-home-page.tsx +30 -0
- package/src/client/l1_entry/pages/l1-project-preview-page.tsx +33 -0
- package/src/client/l1_entry/providers/l1-app-providers.tsx +18 -15
- package/src/client/l1_entry/providers/l1-app-runtime-provider.tsx +2 -2
- package/src/client/l2_biz/auth/l2-login-biz.ts +3 -0
- package/src/client/l2_biz/auth/l2-login.tsx +2 -3
- package/src/client/l2_biz/plugin-host/l2-plugin-capability-details.tsx +6 -1
- package/src/client/l2_biz/plugin-host/l2-plugin-contribution-host.tsx +71 -10
- package/src/client/l2_biz/plugin-host/l2-plugin-management-controls.tsx +9 -0
- package/src/client/l2_biz/plugin-host/l2-plugin-session-header-layout.ts +18 -0
- package/src/client/l2_biz/plugin-host/l2-plugin-session-header.tsx +247 -0
- package/src/client/l2_biz/plugin-host/l2-plugin-widgets.tsx +50 -0
- package/src/client/l2_biz/plugin-host/views/l2-plugin-session-header-action.tsx +112 -0
- package/src/client/l2_biz/project-preview/hooks/l2-use-project-picker.ts +76 -0
- package/src/client/l2_biz/project-preview/hooks/l2-use-project-preview.ts +214 -0
- package/src/client/l2_biz/project-preview/l2-project-preview-biz.ts +49 -4
- package/src/client/l2_biz/project-preview/l2-project-preview-dialog.tsx +42 -450
- package/src/client/l2_biz/project-preview/l2-project-preview-page.tsx +61 -0
- package/src/client/l2_biz/project-preview/l2-project-preview.tsx +342 -0
- package/src/client/l2_biz/project-preview/runtime/l2-project-history-runtime.ts +9 -3
- package/src/client/l2_biz/project-preview/views/l2-project-picker.tsx +168 -0
- package/src/client/l2_biz/settings/hooks/l2-use-model-settings.ts +34 -31
- package/src/client/l2_biz/settings/views/l2-model-replacement-preview.tsx +7 -1
- package/src/client/l2_biz/workbench/file-workspace/l2-project-preview-biz.ts +4 -3
- package/src/client/l2_biz/workbench/hooks/l2-workbench-chat-viewport.ts +28 -21
- package/src/client/l2_biz/workbench/l2-work-session-columns.module.css +32 -0
- package/src/client/l2_biz/workbench/l2-work-session-columns.tsx +55 -16
- package/src/client/l2_biz/workbench/l2-work-session-sidebar.tsx +19 -8
- package/src/client/l2_biz/workbench/l2-workbench-chat-composer.tsx +12 -1
- package/src/client/l2_biz/workbench/l2-workbench-initialization-notice.tsx +8 -3
- package/src/client/l2_biz/workbench/l2-workbench-plugin-slots.ts +13 -0
- package/src/client/l2_biz/workbench/l2-workbench.tsx +15 -2
- package/src/client/l3_modules/conversation/l3-conversation-viewport.tsx +12 -6
- package/src/client/l3_modules/project-files/l3-markdown-preview.module.css +1 -1
- package/src/client/l3_modules/project-files/l3-project-document-git.ts +4 -3
- package/src/client/l3_modules/project-files/l3-project-document-view.tsx +4 -1
- package/src/client/l3_modules/project-files/l3-project-reader.ts +23 -35
- package/src/client/l4_foundation/lib/l4-client-id.tsx +11 -0
- package/src/client/l4_foundation/plugin-host/l4-plugin-host-runtime.ts +316 -35
- package/src/common/l2_biz/auth/l2-auth-return-to.ts +41 -0
- package/src/common/l2_biz/model-settings/l2-model-settings-contract.ts +5 -1
- package/src/common/l2_biz/plugin/l2-plugin-management-messages.ts +4 -0
- package/src/common/l2_biz/project-preview/l2-project-history-messages.ts +28 -0
- package/src/common/l2_biz/project-preview/l2-project-preview-navigation.ts +5 -0
- package/src/common/l2_biz/settings/l2-settings-messages.ts +4 -3
- package/src/common/l2_biz/workbench/l2-workbench-locale-messages.ts +2 -0
- package/src/server/l1_entry/node/l1-server.ts +8 -4
- package/src/server/l4_foundation/model-settings/l4-model-settings-store.ts +29 -20
- package/src/server/l4_foundation/model-settings/l4-model-settings-types.ts +1 -1
- package/src/server/l4_foundation/pi/l4-pi-chat-worker.ts +22 -5
- package/src/server/l4_foundation/pi/l4-pi-plugin-owner-runtime.ts +133 -13
- package/src/server/l4_foundation/pi/l4-pi-session-initialization.ts +9 -0
- package/temp/build/pi-desk/release/.next/BUILD_ID +1 -1
- package/temp/build/pi-desk/release/.next/app-path-routes-manifest.json +3 -2
- package/temp/build/pi-desk/release/.next/build-manifest.json +3 -3
- package/temp/build/pi-desk/release/.next/prerender-manifest.json +3 -3
- package/temp/build/pi-desk/release/.next/react-loadable-manifest.json +1 -2
- package/temp/build/pi-desk/release/.next/required-server-files.js +3 -3
- package/temp/build/pi-desk/release/.next/required-server-files.json +3 -3
- package/temp/build/pi-desk/release/.next/routes-manifest.json +6 -0
- package/temp/build/pi-desk/release/.next/server/app/_global-error/page.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.html +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.rsc +3 -3
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_full.segment.rsc +3 -3
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +3 -3
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_not-found/page.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/auth/login/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/auth/logout/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/auth-settings/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/auth-settings/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/capability-modes/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/capability-modes/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/chat/context/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/chat/images/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/chat/messages/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/health/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/mcp-check/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/mcp-settings/del/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/mcp-settings/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/mcp-settings/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/model-catalog/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/model-settings/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/model-settings/preview/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/model-settings/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/directories/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/directory-entries/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/directory-ignores/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/directory-ignores/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/models/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/session-user-messages/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/sessions/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/search/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/settings-get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/settings-replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/add/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/apply/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/batch/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/browser-resources/[resourceGroup]/[...resourcePath]/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/del/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/enabled-set/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/host-runtime/[runtimeVersion]/[...resourcePath]/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/reload/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/update/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-files/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-files/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-files/reveal/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-files/search/route.js +2 -2
- package/temp/build/pi-desk/release/.next/server/app/api/project-git/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-git-branches/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-git-changes/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-git-diff/get/route.js +2 -2
- package/temp/build/pi-desk/release/.next/server/app/api/project-git-heads/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-git-log/list/route.js +2 -2
- package/temp/build/pi-desk/release/.next/server/app/api/project-model-default/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-model-default/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/skill-files/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/skill-files/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/skill-files/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/skills/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/task-center/images/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/task-center/messages/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-session-git-branch/add/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-session-git-branch/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-session-tree/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-session-tree-entry/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/add/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/branch/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/del/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/rename/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/sort/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/favicon.ico/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/login/page.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/page.js +140 -140
- package/temp/build/pi-desk/release/.next/server/app/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/project-preview/page.js +1 -0
- package/temp/build/pi-desk/release/.next/server/app/project-preview/page_client-reference-manifest.js +1 -0
- package/temp/build/pi-desk/release/.next/server/app-paths-manifest.json +3 -2
- package/temp/build/pi-desk/release/.next/server/chunks/10912.js +2 -2
- package/temp/build/pi-desk/release/.next/server/chunks/20460.js +15 -0
- package/temp/build/pi-desk/release/.next/server/chunks/25406.js +8 -8
- package/temp/build/pi-desk/release/.next/server/chunks/35985.js +3 -17
- package/temp/build/pi-desk/release/.next/server/chunks/36361.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/48180.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/56830.js +235 -0
- package/temp/build/pi-desk/release/.next/server/chunks/78262.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/79686.js +62 -0
- package/temp/build/pi-desk/release/.next/server/chunks/80780.js +1 -0
- package/temp/build/pi-desk/release/.next/server/chunks/81363.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/82499.js +4 -4
- package/temp/build/pi-desk/release/.next/server/chunks/92386.js +8 -8
- package/temp/build/pi-desk/release/.next/server/middleware-build-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/pages/500.html +1 -1
- package/temp/build/pi-desk/release/.next/server/server-reference-manifest.json +1 -1
- package/temp/build/pi-desk/release/.next/static/8Yd33M0zPi4tbRn4xCaRY/_buildManifest.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/11937-1d0a9822f2c7995b.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/14825-5579aed34a631ad7.js +62 -0
- package/temp/build/pi-desk/release/.next/static/chunks/15302-9c807afc6c60de0c.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/19991.8aa2e4b6df15fad6.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/22092-6d1bfbefa825ec03.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/37313-d5970e2d0c270d22.js +238 -0
- package/temp/build/pi-desk/release/.next/static/chunks/57235-03ba1044f22b6c84.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/79267-7d21d7cdbd7cfca1.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/82371-f7ba4a07a5dbcf34.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/9038-03144ed96d613f75.js +15 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/{error-0296a3b20cd1bf00.js → error-216b14b5da089ed3.js} +1 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/layout-20718f1503910291.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/login/page-0d3d4827802108e5.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/{not-found-2aab8b33ebbf3257.js → not-found-720cdf6a606b821a.js} +1 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/page-6ebc1c877f6025dd.js +158 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/project-preview/page-d70ee4e9409b970a.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/webpack-b60891a214e0925d.js +1 -0
- package/temp/build/pi-desk/release/.next/static/css/{250a6b93cc2222d1.css → 1e780a4936aa6ba3.css} +1 -1
- package/temp/build/pi-desk/release/.next/static/css/f646ca6c07245c4c.css +1 -0
- package/temp/build/pi-desk/release/.next/trace-build +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/10881.js +0 -296
- package/temp/build/pi-desk/release/.next/static/RLKcK-RQF5FvEeDmS9uih/_buildManifest.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/27611-0890482fe76bd9d6.js +0 -238
- package/temp/build/pi-desk/release/.next/static/chunks/31087-d8e5765d541d5c26.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/3814-35cfab0ce3aa7c41.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/70669.07f3670bfb7d6dd2.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/74220-795a2e7185bd66cb.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/77592-5bef6acb8e7c4b96.js +0 -13
- package/temp/build/pi-desk/release/.next/static/chunks/78923-17a9c337b29dcecd.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/81881-f11dbe7dc0d04ed9.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/96995-8f8313ea2ac3abd7.js +0 -62
- package/temp/build/pi-desk/release/.next/static/chunks/app/layout-a50c456648537afb.js +0 -3
- package/temp/build/pi-desk/release/.next/static/chunks/app/login/page-84892b06243891f0.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/page-0789c43551b29dd2.js +0 -158
- package/temp/build/pi-desk/release/.next/static/chunks/webpack-d7248206b7fc7ba8.js +0 -1
- package/temp/build/pi-desk/release/.next/static/css/a4cf28fd76c70165.css +0 -1
- /package/temp/build/pi-desk/release/.next/static/{RLKcK-RQF5FvEeDmS9uih → 8Yd33M0zPi4tbRn4xCaRY}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";exports.id=36361,exports.ids=[36361],exports.modules={4287:(a,b,c)=>{c.d(b,{LD:()=>k,SZ:()=>f,_C:()=>j,mR:()=>e,ug:()=>l,w3:()=>g,zj:()=>m});var d=c(36153);let e=d.Yj().trim().min(1).max(128).regex(/^[a-zA-Z][a-zA-Z0-9._-]*$/),f=d.Yj().trim().url().max(2048).refine(a=>{let b=new URL(a);return["https:","http:"].includes(b.protocol)&&!b.username&&!b.password&&!b.search&&!b.hash},"插件源必须是 HTTP 或 HTTPS 仓库地址"),g=d.gM("mode",[d.Ik({mode:d.eu("auto")}).strict(),d.Ik({mode:d.eu("local")}).strict(),d.Ik({mode:d.eu("official")}).strict(),d.Ik({mode:d.eu("domestic")}).strict(),d.Ik({mode:d.eu("custom"),registry:f}).strict()]),h=d.Ik({description:d.Yj().trim().min(1).max(4e3).optional(),readme:d.Yj().trim().min(1).max(1024).optional()}),i=d.Ik({description:d.Yj().optional(),piDesk:d.Ik({i18n:d.g1(d.Yj().min(1).max(35),h).optional()}).passthrough().optional()}).passthrough();function j(a){let b=i.safeParse(a);if(!b.success)return null;let c=b.data.description?.trim();if(!c)return null;let d=Object.fromEntries(Object.entries(b.data.piDesk?.i18n??{}).slice(0,16).flatMap(([a,b])=>b.description?[[a,b.description]]:[]));return Object.keys(d).length?{default:c,translations:d}:c}function k(a){let b=/^npm:((?:@[^/]+\/)?[^@]+)(?:@.+)?$/.exec(a);return b?`npm:${b[1]}`:a.replaceAll("\\","/")}function l(a){return/^npm:((?:@[^/]+\/)?[^@]+)(?:@.+)?$/.exec(a)?.[1]??null}function m(a,b){let c=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/,d=c.exec(a),e=c.exec(b);if(!d||!e)return!1;for(let a=1;a<=3;a++){let b=Number(d[a])-Number(e[a]);if(b)return b>0}if(!d[4]||!e[4])return!d[4]&&!!e[4];let f=d[4].split("."),g=e[4].split(".");for(let a=0;a<Math.max(f.length,g.length);a++){let b=f[a],c=g[a];if(b===c)continue;if(void 0===b||void 0===c)return void 0===c;let d=/^\d+$/.test(b),e=/^\d+$/.test(c);if(d&&e)return Number(b)>Number(c);if(d!==e)return e;return b>c}return!1}},5235:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{El:()=>n,Nx:()=>q,ey:()=>o,ks:()=>p,sv:()=>r,to:()=>l});var e=c(73024),f=c(76760),g=c(77598),h=c(75430),i=c(36153),j=c(4287),k=a([h]);h=(k.then?(await k)():k)[0];let q="https://registry.npmjs.org",r="https://mirrors.cloud.tencent.com/npm",s=i.Ik({downloadSource:j.w3.default({mode:"auto"}),disabled:i.YO(i.Yj()).max(2e3).default([]),registries:i.g1(i.Yj(),j.SZ).default({}),updateTags:i.g1(i.Yj(),j.mR).default({})}).strict();function l(a=(0,h.getAgentDir)()){let b=(0,f.join)(a,"pi-desk-plugins.json");return(0,e.existsSync)(b)?s.parse(JSON.parse((0,e.readFileSync)(b,"utf8"))):s.parse({})}function m(a,b){let c=(0,f.join)(a,"pi-desk-plugins.json"),d=s.parse(b(l(a)));(0,e.mkdirSync)((0,f.dirname)(c),{recursive:!0});let h=`${c}.${(0,g.randomUUID)()}.tmp`;try{(0,e.writeFileSync)(h,`${JSON.stringify(d,null,2)}
|
|
2
2
|
`,"utf8"),(0,e.renameSync)(h,c)}finally{(0,e.rmSync)(h,{force:!0})}}function n(a,b,c=(0,h.getAgentDir)()){let d=(0,j.LD)(a);m(c,a=>({...a,disabled:[...a.disabled.filter(a=>a!==d),...b?[]:[d]]}))}function o(a,b=(0,h.getAgentDir)()){let c=l(b).updateTags[(0,j.LD)(a)];if(c)return c;let d=/^npm:(?:@[^/]+\/)?[^@]+@([^@]+)$/.exec(a)?.[1];return d&&!/^v?\d+\./.test(d)&&j.mR.safeParse(d).success?d:"latest"}function p(a,b,c=(0,h.getAgentDir)()){let d=(0,j.LD)(a);m(c,a=>({...a,updateTags:{...a.updateTags,[d]:b}}))}d()}catch(a){d(a)}})},16056:(a,b,c)=>{c.d(b,{P:()=>e});let d=process.argv.includes("--safe-mode")||"1"===process.env.PI_DESK_SAFE_MODE;function e(){return d}},30987:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{n:()=>n});var e=c(51455),f=c(48161),g=c(76760),h=c(4287),i=c(5235),j=a([i]);async function k(a){let b=await (0,e.realpath)(a).catch(()=>(0,g.resolve)(a));return"win32"===process.platform?b.toLowerCase():b}function l(a,b){return/^(npm:|git:|https?:|ssh:|git@)/.test(a)?null:a.startsWith("~/")?(0,g.join)((0,f.homedir)(),a.slice(2)):(0,g.resolve)(b,a)}function m(a,b){let c=(0,g.relative)(a,b);return""===c||!c.startsWith("..")&&!(0,g.isAbsolute)(c)}async function n(a,b,c){let d=new Set((0,i.to)(a).disabled.map(h.LD)),f=new Set;for(let b of d){let c=l(b,a);c&&f.add(await k(c))}for(let c of b.listConfiguredPackages()){if("user"!==c.scope||!c.installedPath)continue;let b=l(c.source,a),e=b&&f.has(await k(b));(d.has((0,h.LD)(c.source))||e)&&f.add(await k(c.installedPath))}if(f.size>0){let d=(0,g.join)(a,"extensions"),h=await (0,e.readdir)(d,{withFileTypes:!0}).catch(a=>{if(a&&"object"==typeof a&&"code"in a&&"ENOENT"===a.code)return[];throw a}),i=[...b.listConfiguredPackages().filter(a=>"user"===a.scope).flatMap(a=>a.installedPath??[]),...h.filter(a=>!a.name.startsWith(".")&&"node_modules"!==a.name&&(a.isDirectory()||a.isSymbolicLink())).map(a=>(0,g.join)(d,a.name)),...(c.getGlobalSettings().extensions??[]).filter(a=>!/^[!+-]|[?*{}]/.test(a)).flatMap(b=>l(b,a)??[])],j=[];for(let a of i)await (0,e.stat)(a).then(a=>a.isDirectory(),()=>!1)&&j.push(await k(a));for(let a of(j.sort((a,b)=>b.length-a.length),[...f])){if(!await (0,e.stat)(a).then(a=>a.isFile(),()=>!1))continue;let b=j.find(b=>m(b,a));b&&f.add(b)}}let j=new Map;return async(a,b,c)=>{if(c&&d.has((0,h.LD)(a)))return!0;if(!b||b.startsWith("builtin:")||0===f.size)return!1;let e=j.get(b);e||(e=k(b),j.set(b,e));let g=await e;return[...f].some(a=>m(a,g))}}i=(j.then?(await j)():j)[0],d()}catch(a){d(a)}})},36361:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{L4PiGlobalPluginRuntime:()=>o,L4PiPluginOwnerRuntime:()=>g.K,L4PiPluginRuntimeBusyError:()=>g.y,disposeL4PiGlobalPluginRuntime:()=>n,getL4PiGlobalPluginRuntime:()=>m});var e=c(67841),f=c(75430),g=c(99667),h=c(16056),i=c(60719),j=c(66024),k=c(44493),l=a([e,f,g,i,k]);[e,f,g,i,k]=l.then?(await l)():l;class o extends g.K{constructor(a=process.cwd(),b=(0,f.getAgentDir)()){const c=new j.N,d=async()=>(0,h.P)()?{sources:[],errors:[]}:(0,i.o)(a,b,{DefaultPackageManager:f.DefaultPackageManager,SettingsManager:f.SettingsManager});super(async()=>{let a=await d();for(let b of a.errors)console.warn("[Pi Desk][GlobalPluginRuntime] 插件来源发现诊断",{message:b});return await c.initialize(a),a.sources.flatMap(a=>a.enabled&&!a.error&&a.piDeskRoot?[{source:a.source,installedPath:a.piDeskRoot}]:[])},(0,e.J)()),this.sourceChanges=c,this.discover=d}async scanSourceChanges(a){return await this.initialize(),this.sourceChanges.scan(await this.discover(),a)}async applySourceChange(a){let[b]=await this.scanSourceChanges([a.source]);if(!b||b.fingerprint!==a.fingerprint||b.current?.enabled&&b.current.error)throw Error(b?.current?.error??"插件源码在预检后发生变化,请重新加载");a.previous?.piDeskRoot||a.current?.piDeskRoot?await this.replaceSource(a.source,a.current?.enabled?a.current.piDeskRoot:null):(0,k.N)(),this.sourceChanges.commit(a)}}function m(){return globalThis.__piDeskGlobalPluginRuntime||(globalThis.__piDeskGlobalPluginRuntime=new o),globalThis.__piDeskGlobalPluginRuntime}async function n(){let a=globalThis.__piDeskGlobalPluginRuntime;globalThis.__piDeskGlobalPluginRuntime=void 0,await a?.dispose()}d()}catch(a){d(a)}})},44493:(a,b,c)=>{c.a(a,async(a,d)=>{try{let n;c.d(b,{G:()=>m,N:()=>k});var e=c(93736),f=c(73024),g=c(76760),h=a([e]);e=(h.then?(await h)():h)[0];let o=(0,g.join)(process.cwd(),"package.json"),{createRequire:p}=process.getBuiltinModule("module"),q=(0,e.createJiti)((0,g.join)(process.env.PI_DESK_PI_PACKAGE_DIR??process.cwd(),"package.json")),r=new Map,s=0;function i(a){let b=r.get(a);return b&&(r.delete(a),r.set(a,b)),b}function j(a,b){let c=r.get(a);if(c&&(r.delete(a),s-=c.bytes),!(b.bytes>0x2000000)){for(;r.size>=512||s+b.bytes>0x2000000;){let a=r.entries().next().value;r.delete(a[0]),s-=a[1].bytes}r.set(a,b),s+=b.bytes}}function k(){r.size>0&&console.info("[Pi Desk][PluginResources] 已清除插件代码缓存",{fileCount:r.size,bytes:s}),r.clear(),s=0}async function l(){let[a,b,c,d,f,h,k,l,m]=await Promise.all([q.import("@earendil-works/pi-coding-agent"),q.import("@earendil-works/pi-agent-core"),q.import("@earendil-works/pi-tui"),q.import("@earendil-works/pi-ai/compat"),q.import("@earendil-works/pi-ai/oauth"),q.import("@earendil-works/pi-ai/providers/all"),q.import("typebox"),q.import("typebox/compile"),q.import("typebox/value")]),n=(0,e.createJiti)(o,{moduleCache:!1,fsCache:!1,tryNative:!1,virtualModules:{"@earendil-works/pi-coding-agent":a,"@earendil-works/pi-agent-core":b,"@earendil-works/pi-tui":c,"@earendil-works/pi-ai/providers/all":h,"@earendil-works/pi-ai/compat":d,"@earendil-works/pi-ai/oauth":f,"@earendil-works/pi-ai":d,"@mariozechner/pi-coding-agent":a,"@mariozechner/pi-agent-core":b,"@mariozechner/pi-tui":c,"@mariozechner/pi-ai/providers/all":h,"@mariozechner/pi-ai/compat":d,"@mariozechner/pi-ai/oauth":f,"@mariozechner/pi-ai":d,typebox:k,"typebox/compile":l,"typebox/value":m,"@sinclair/typebox":k,"@sinclair/typebox/compile":l,"@sinclair/typebox/value":m}}),p=n.options.transform;return n.options.transform=a=>(function(a,b){if(!a.filename)return b(a);let c=(0,g.resolve)(a.filename),d=i(c),e=d?.source===a.source?d:void 0,f=!0===a.async,h=e?.transforms.get(f);if(h)return h;let k=a.source,l=b(a);return l.error||l.code.includes("__JITI_ERROR__")||j(c,{source:k,transforms:new Map(e?.transforms).set(f,l),bytes:(e?.bytes??Buffer.byteLength(k))+Buffer.byteLength(l.code)}),l})(a,p),n}async function m(a,b=(0,g.dirname)(a)){let c=await (n??=l()),d=p(o).cache,e=(0,g.resolve)(b);for(let a of Object.keys(d)){let b=(0,g.relative)(e,a);b.startsWith("..")||(0,g.isAbsolute)(b)||b.split(/[\\/]/).includes("node_modules")||delete d[a]}try{let b,d=(0,g.resolve)(a),e=c.evalModule((b=(0,f.readFileSync)(d,"utf8"),i(d)?.source!==b&&j(d,{source:b,transforms:new Map,bytes:Buffer.byteLength(b)}),b),{filename:d,async:!1});return{default:e?.default??e}}catch(a){if(k(),a instanceof Error&&/await is only valid|top.level await|ERR_REQUIRE_ASYNC_MODULE/i.test(a.message))throw Error("Pi Desk Node Entry 不支持模块顶层 await,请将异步初始化放入 async setup()",{cause:a});throw a}}d()}catch(a){d(a)}})},59214:(a,b,c)=>{c.d(b,{J:()=>f,a:()=>e});var d=c(36153);let e=d.Ik({locale:d.k5(["zh-CN","en"]),timeZone:d.Yj().trim().min(1).max(100).refine(a=>{try{return new Intl.DateTimeFormat("en",{timeZone:a}),!0}catch{return!1}},"无效的 IANA 时区")}).strict().readonly(),f=d.Ik({region:e}).strict().readonly()},60719:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{W:()=>p,o:()=>o});var e=c(51455),f=c(48161),g=c(76760),h=c(4287),i=c(30987),j=a([i]);function k(a,b){let c=(0,g.relative)(a,b);return""===c||!c.startsWith("..")&&!(0,g.isAbsolute)(c)}async function l(a){try{return await (0,e.realpath)(a)}catch{return(0,g.resolve)(a)}}function m(a){return"win32"===process.platform?a.toLowerCase():a}async function n(a){try{if((await (0,e.stat)(a)).isFile())return{version:null,description:null,hasNodeEntry:!1,error:null};let b=JSON.parse(await (0,e.readFile)((0,g.join)(a,"package.json"),"utf8"));if(!b||"object"!=typeof b||Array.isArray(b))throw Error("package.json 必须是对象");return{version:"string"==typeof b.version?b.version:null,description:(0,h._C)(b),hasNodeEntry:b.piDesk?.entry!==void 0||b.piDesk?.global!==void 0,hasNativeEntries:Array.isArray(b.pi?.extensions)&&b.pi.extensions.length>0,error:null}}catch(a){if(a&&"object"==typeof a&&"code"in a&&"ENOENT"===a.code)return{version:null,description:null,hasNodeEntry:!1,error:null};return{version:null,description:null,hasNodeEntry:!1,error:a instanceof Error?a.message:String(a)}}}async function o(a,b,c){let d=c.SettingsManager.create(a,b,{projectTrusted:!1}),h=new c.DefaultPackageManager({cwd:a,agentDir:b,settingsManager:d}),j=d.drainErrors().map(({error:a})=>a.message),o=new Map,p=new Map;for(let a of h.listConfiguredPackages()){if("user"!==a.scope)continue;let b=a.installedPath?await l(a.installedPath):null,c=b?await n(b):null,d=b?p.get(m(b)):void 0;b&&!d&&p.set(m(b),a.source),o.set(a.source,{source:a.source,kind:"package",path:b,nativePaths:[],hasPiResources:!0,piDeskRoot:b&&c?.hasNodeEntry&&!d?b:null,version:c?.version??null,description:c?.description??null,enabled:!0,error:d?`此目录已由 ${d} 声明,不能重复加载`:b?c?.error??null:"插件包未安装或安装目录不存在"})}let q=(0,g.join)(b,"extensions"),r=new Set;try{for(let a of(await (0,e.readdir)(q,{withFileTypes:!0})))if(!a.name.startsWith(".")&&"node_modules"!==a.name&&(a.isDirectory()||a.isSymbolicLink()))try{let b=await l((0,g.join)(q,a.name));(await (0,e.stat)(b)).isDirectory()&&r.add(b)}catch(b){j.push(`${a.name}: ${b instanceof Error?b.message:String(b)}`)}}catch(a){a&&"object"==typeof a&&"code"in a&&"ENOENT"===a.code||j.push(a instanceof Error?a.message:String(a))}for(let a of d.getGlobalSettings().extensions??[]){if(/^[!+-]|[?*{}]/.test(a))continue;let c=await l(a.startsWith("~/")?(0,g.join)((0,f.homedir)(),a.slice(2)):(0,g.resolve)(b,a));try{(await (0,e.stat)(c)).isDirectory()&&r.add(c)}catch{}}let s=[...r].sort((a,b)=>b.length-a.length);try{let a=await h.resolve(async()=>"skip");for(let a of o.values())a.hasPiResources=!1;for(let b of[...a.extensions,...a.skills,...a.prompts,...a.themes])if(b.enabled&&"user"===b.metadata.scope&&"package"===b.metadata.origin){let a=o.get(b.metadata.source);a&&(a.hasPiResources=!0)}for(let b of a.extensions){if("user"!==b.metadata.scope)continue;let a=await l(b.path);if("package"===b.metadata.origin){let c=o.get(b.metadata.source);c&&b.enabled&&!c.nativePaths.includes(a)&&c.nativePaths.push(a);continue}let c=s.find(b=>k(b,a))??a,d=[...p].find(([b])=>k(b,m(a)));if(d){let c=o.get(d[1]);b.enabled&&c&&!c.nativePaths.includes(a)&&c.nativePaths.push(a),j.push(`扩展入口 ${a} 与已配置包 ${d[1]} 重复,保留包来源`);continue}let e=o.get(c);e||(e={source:c,kind:"extension",path:c,nativePaths:[],piDeskRoot:null,version:null,description:null,enabled:!1,error:null},o.set(c,e)),b.enabled&&(e.enabled=!0,e.nativePaths.includes(a)||e.nativePaths.push(a))}}catch(a){j.push(a instanceof Error?a.message:String(a))}for(let a of s){if([...p.keys()].some(b=>k(b,m(a))))continue;let b=await n(a),c=o.get(a);if(!c&&!b.hasNodeEntry&&!b.error)continue;let d=(await Promise.all(["index.ts","index.js"].map(b=>(0,e.stat)((0,g.join)(a,b)).then(a=>a.isFile(),()=>!1)))).some(Boolean),f=c??{source:a,kind:"extension",path:a,nativePaths:[],piDeskRoot:null,version:null,description:null,enabled:!b.hasNativeEntries&&!d,error:null};f.version=b.version,f.description=b.description,f.error=b.error,b.hasNodeEntry&&f.enabled&&(f.piDeskRoot=a),o.set(a,f)}let t=await (0,i.n)(b,h,d);for(let a of o.values())await t(a.source,a.path,"package"===a.kind)&&(a.enabled=!1);return{sources:[...o.values()].sort((a,b)=>a.source.localeCompare(b.source)),errors:j}}async function p(a){if(!a.path)return null;try{return(await (0,e.stat)(a.path)).isFile()?(0,g.dirname)(a.path):a.path}catch{return null}}i=(j.then?(await j)():j)[0],d()}catch(a){d(a)}})},63603:(a,b,c)=>{c.d(b,{Qg:()=>m,RC:()=>p,a4:()=>k,dO:()=>j,j0:()=>n});var d=c(36153);let e=d.Yj().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=d.Yj().trim().min(1).max(256),g=d.Ik({allow:d.YO(f).max(5e3).optional(),deny:d.YO(f).max(5e3).optional()}).strict(),h=d.Ik({value:d.Yj().trim().min(1).max(256),label:d.Yj().trim().min(1).max(120).optional(),description:d.Yj().trim().max(1e3).optional()}).strict(),i=d.Ik({label:d.Yj().trim().min(1).max(120),options:d.YO(h).max(5e3)}).strict(),j=d.g1(e,i),k=d.Yj().min(1).max(64),l=d.Ik({name:d.Yj().trim().min(1).max(64),tools:g.optional(),skills:g.optional(),plugins:d.g1(e,d.g1(e,g)).optional()}).strict(),m=d.g1(k,l).refine(a=>Object.keys(a).length<=100,"最多保存 100 个能力模式").refine(a=>new Set(Object.values(a).map(a=>a.name)).size===Object.keys(a).length,"模式名称不能重复"),n=d.g1(k,l.shape.name);function o(a,b){let c=0,d=0,e=-1,f=0;for(;d<b.length;)if("*"===a[c])e=c++,f=d;else if(a[c]===b[d])c+=1,d+=1;else{if(!(e>=0))return!1;c=e+1,d=++f}for(;"*"===a[c];)c+=1;return c===a.length}function p(a,b){return(a?.allow===void 0||a.allow.some(a=>o(a,b)))&&!a?.deny?.some(a=>o(a,b))}d.Ik({tools:d.YO(h),skills:d.YO(h),plugins:d.g1(e,j)}).strict(),d.Ik({tools:g,skills:g,capabilities:d.g1(e,g)}).strict()},66024:(a,b,c)=>{c.d(b,{N:()=>l});var d=c(77598),e=c(51455),f=c(76760);let g=new Set([".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".json",".md",".css",".yaml",".yml",".toml",".wasm",".node"]),h=new Set(["node_modules","temp","logs","coverage"]);class i extends Error{constructor(a){super(`插件来源不存在:${a}`),this.source=a,this.name="L4PiPluginSourceNotFoundError"}}async function j(a){let b=(0,d.createHash)("sha256").update(JSON.stringify({path:a.path,enabled:a.enabled,nativePaths:[...a.nativePaths].sort(),piDeskRoot:a.piDeskRoot,hasPiResources:a.hasPiResources}));if(!a.path||a.error||!a.enabled)return b.update(a.error??"").digest("hex");let c=await (0,e.realpath)(a.path),i=0,j=0,k=async(a,d,l)=>{if(++j>8192)throw Error("源码目录条目超过8192项,请使用独立插件目录");let m=await (0,e.realpath)(a),n=(0,f.relative)(c,m);if(n.startsWith("..")||(0,f.isAbsolute)(n))return;let o=await (0,e.stat)(m);if(o.isDirectory()){if(l.has(m))throw Error("源码目录存在符号链接循环");let a=new Set(l).add(m);for(let b of(await (0,e.readdir)(m,{withFileTypes:!0})).sort((a,b)=>a.name.localeCompare(b.name)))b.name.startsWith(".")||h.has(b.name)||await k((0,f.join)(m,b.name),`${d}/${b.name}`,a)}else if(o.isFile()&&(""===d||g.has((0,f.extname)(d)))){if(o.size>0x1000000||i+o.size>0x4000000)throw Error("源码指纹内容超过容量上限");let a=await (0,e.readFile)(m),c=await (0,e.stat)(m);if(c.size!==o.size||c.mtimeMs!==o.mtimeMs||a.length!==o.size)throw Error("插件源码正在变化,请保存或构建完成后重新加载");i+=a.length,b.update(d).update("\0").update(a).update("\0")}};return await k(c,"",new Set),b.digest("hex")}async function k(a){try{return{source:a,fingerprint:await j(a)}}catch(c){let b={...a,error:c instanceof Error?c.message:String(c)};return{source:b,fingerprint:`failed:${b.error}`}}}class l{async initialize(a){for(let b of(this.applied.clear(),a.sources))this.applied.set(b.source,await k(b))}async scan(a,b){let c=new Map(a.sources.map(a=>[a.source,a])),d=b?[...new Set(b)]:[...new Set([...this.applied.keys(),...c.keys()])],e=[];for(let f of d){let d=this.applied.get(f),g=c.get(f);if(!d&&!g)throw new i(f);if(!g&&a.errors.length>0){if(b)throw Error(`来源发现不完整,不能确认已删除:${f}`);continue}let h=g?await k(g):null;(b||d?.fingerprint!==h?.fingerprint)&&e.push({source:f,previous:d?.source??null,current:h?.source??null,fingerprint:h?.fingerprint??null})}return e}commit(a){a.current&&null!==a.fingerprint?this.applied.set(a.source,{source:a.current,fingerprint:a.fingerprint}):this.applied.delete(a.source)}constructor(){this.applied=new Map}}},67841:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{J:()=>l});var e=c(77598),f=c(73024),g=c(76760),h=c(75430),i=c(59214),j=a([h]);function k(){let a=Intl.DateTimeFormat().resolvedOptions();return i.J.parse({region:{locale:a.locale.toLowerCase().startsWith("zh")?"zh-CN":"en",timeZone:a.timeZone||"UTC"}})}h=(j.then?(await j)():j)[0];class m{constructor(a=(0,g.join)((0,h.getAgentDir)(),"pi-desk-settings.json"),b=k){this.path=a,this.defaults=b,this.snapshot=null,this.listeners=new Set,this.tail=Promise.resolve()}getSnapshot(){if(!this.snapshot)if((0,f.existsSync)(this.path))this.snapshot=i.J.parse(JSON.parse((0,f.readFileSync)(this.path,"utf8")));else{let a=i.J.parse(this.defaults());this.save(a),this.snapshot=a}return this.snapshot}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}update(a){let b=this.tail.then(()=>{let b=this.getSnapshot(),c=i.J.parse({region:{...b.region,...a}});if(JSON.stringify(b)!==JSON.stringify(c))for(let a of(this.save(c),this.snapshot=c,console.info("[Pi Desk][Settings] 共享地区设置已保存",c.region),this.listeners))try{a()}catch(a){console.error("[Pi Desk][Settings] 设置订阅回调失败",{message:a instanceof Error?a.message:String(a)})}});return this.tail=b.catch(()=>void 0),b}save(a){(0,f.mkdirSync)((0,g.dirname)(this.path),{recursive:!0});let b=`${this.path}.${process.pid}.${(0,e.randomUUID)()}.tmp`;try{(0,f.writeFileSync)(b,`${JSON.stringify(a,null,2)}
|
|
3
|
-
`,"utf8"),(0,f.renameSync)(b,this.path)}finally{(0,f.existsSync)(b)&&(0,f.unlinkSync)(b)}}}function l(){return globalThis.__piDeskHostSettingsStore??=new m}d()}catch(a){d(a)}})},73630:(a,b,c)=>{c.d(b,{f:()=>h});var d=c(77598),e=c(51455),f=c(76760);function g(a,b){let c=(0,f.relative)(a,b);return""===c||!c.startsWith("..")&&!(0,f.isAbsolute)(c)}async function h(a){if("entry.js"!==(0,f.basename)(a))throw Error("Browser Entry 必须命名为 entry.js");let b=await (0,e.realpath)((0,f.dirname)(a)),c=new Map,h=0,i=0,j=[],k=async(a,l,m)=>{let n=await (0,e.realpath)(a);if(!g(b,n))return;if(m.has(n))throw Error("Browser 模块目录存在符号链接循环");let o=new Set(m).add(n);for(let a of(await (0,e.readdir)(n,{withFileTypes:!0})).sort((a,b)=>a.name.localeCompare(b.name))){if(++i>4096)throw Error("Browser 模块目录条目超过上限");if(a.name.startsWith(".")||"node_modules"===a.name)continue;let m=(0,f.join)(n,a.name),p=await (0,e.realpath)(m);if(!g(b,p))continue;let q=await (0,e.stat)(p),r=l?`${l}/${a.name}`:a.name;if(q.isDirectory()){await k(p,r,o);continue}if(!q.isFile()||!a.name.endsWith(".js"))continue;if("entry.js"===r&&"entry.js"!==(0,f.basename)(p))throw Error("Browser Entry 符号链接必须指向 entry.js");if(c.size>=2048||q.size>0x1000000||h+q.size>0x2000000)throw Error("Browser 模块快照超过数量或容量上限");let s=await (0,e.readFile)(p),t=await (0,e.stat)(p);if(s.length!==q.size||t.size!==q.size||t.mtimeMs!==q.mtimeMs)throw Error("Browser 模块在读取时发生变化,请构建完成后重新加载");h+=s.length,j.push({path:p,size:t.size,mtimeMs:t.mtimeMs,ino:t.ino}),c.set(r,{content:s,etag:`"${(0,d.createHash)("sha256").update(s).digest("hex")}"`})}};for(let a of(await k(b,"",new Set),j)){let b=await (0,e.stat)(a.path);if(b.size!==a.size||b.mtimeMs!==a.mtimeMs||b.ino!==a.ino)throw Error("Browser 模块组在读取时发生变化,请构建完成后重新加载")}if(!c.has("entry.js"))throw Error("Browser Entry 模块缺失或越出专用目录");return{size:h,modules:c}}},90733:(a,b,c)=>{c.d(b,{$m:()=>g,FX:()=>h,Pu:()=>m,QK:()=>i,Tk:()=>k,nJ:()=>j,qs:()=>l});var d=c(36153);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=d.g1(d.Yj(),d.Pq());function g(a,b){return`${a}\u0000${b}`}function h(a){return e.parse(a)}function i(a){return e.parse(a)}function j(a,b){let c=f.parse(a);if(Buffer.byteLength(JSON.stringify(c),"utf8")>2097152)throw new m(b);return c}class k extends Error{constructor(a,b){super(`Plugin method was not found: ${a}/${b}`),this.name="L4PiPluginMethodNotFoundError"}}class l extends Error{constructor(a,b){super(`Plugin method is already registered: ${a}/${b}`),this.name="L4PiPluginMethodConflictError"}}class m extends Error{constructor(a){super(`Plugin method ${a} exceeds 2MB`),this.direction=a,this.name="L4PiPluginMethodPayloadTooLargeError"}}},99667:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{K:()=>y,y:()=>w});var e=c(77598),f=c(58500),g=c(51455),h=c(76760),i=c(36153),j=c(63603),k=c(44493),l=c(73630),m=c(90733),n=a([k]);k=(n.then?(await n)():n)[0];let r=i.g1(i.Yj(),i.Pq()),s=i.Ik({workId:i.Yj().trim().min(1),sessionId:i.Yj().trim().min(1),branchId:i.Yj().trim().min(1)}).strict(),t=i.Ik({source:s,cwd:i.Yj().trim().min(1),status:i.k5(["main_running","background_running","completed","idle"])}).strict(),u=i.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),v=i.ai().int().safe();class w extends Error{constructor(){super("插件运行时仍有调用正在执行"),this.name="L4PiPluginRuntimeBusyError"}}class x extends Error{constructor(a,b){super(b instanceof Error?b.message:String(b),{cause:b}),this.phase=a,this.name="L4PiPluginPhaseError"}}function o(a,b,c){if("string"!=typeof b||!b.trim())throw Error(`package.json.${c} must be a non-empty string`);let d=(0,h.resolve)(a,b),e=(0,h.relative)(a,d);if(e.startsWith("..")||(0,h.isAbsolute)(e))throw Error(`package.json.${c} must stay inside the package root`);return d}function p(a){return a instanceof Error&&a.message?a.message:String(a)}async function q(a){let b=null;try{if(await Promise.race([Promise.resolve().then(a.execute).then(()=>!0),new Promise(a=>{b=setTimeout(()=>a(!1),1500)})]))return;throw a.onTimeout?.(),Error(`插件 ${a.phase} 超时,关闭结果未确认`)}catch(b){console.warn("[Pi Desk][GlobalPluginRuntime] Pi Desk Plugin 生命周期执行失败",{source:a.owner.source,packageName:a.owner.packageName,phase:a.phase,timeoutMs:1500,message:p(b)})}finally{b&&clearTimeout(b)}}class y{constructor(a,b){this.packageProvider=a,this.hostSettings=b,this.methods=new Map,this.pluginOwners=new Map,this.browserEntries=new Map,this.declarations=new Map,this.capabilityLoaders=new Map,this.owners=[],this.loadingOwners=new Set,this.changeListeners=new Set,this.changingSources=new Set,this.maintainingSources=new Set,this.lifetime=new AbortController,this.packageDiagnostics=new Map,this.initializePromise=null,this.initialized=!1,this.disposed=!1,this.acceptingCalls=!0,this.loadError=null,this.workSessionProvider=null,this.pushSender=null,this.appRuntimeSink=null}initialize(){return this.disposed?Promise.reject(Error("Global plugin runtime has been disposed")):this.initialized?Promise.resolve():(this.initializePromise||(this.initializePromise=this.loadConfiguredPackages().catch(a=>{this.loadError=p(a),console.error("[Pi Desk][GlobalPluginRuntime] 读取插件配置失败,核心应用继续启动",{errorName:a instanceof Error?a.name:"UnknownError",message:this.loadError})}).finally(()=>{this.initializePromise=null,this.initialized=!0,this.publishChanges()})),this.initializePromise)}subscribeChanges(a){return this.changeListeners.add(a),()=>this.changeListeners.delete(a)}publishChanges(){if(!this.disposed)for(let a of this.changeListeners)try{a()}catch(a){console.warn("[Pi Desk][GlobalPluginRuntime] 状态监听失败",{message:p(a)})}}async withSourceIdle(a,b,c,d){let e,g=AbortSignal.any([c,this.lifetime.signal]);g.throwIfAborted();let h=new Promise((a,b)=>{e=()=>b(g.reason),g.addEventListener("abort",e,{once:!0})});try{await Promise.race([this.initialize(),h])}finally{g.removeEventListener("abort",e)}if(g.throwIfAborted(),!this.acceptingCalls||this.changingSources.has(a)||this.maintainingSources.has(a))throw new w;this.maintainingSources.add(a);try{for(;this.owners.some(b=>b.source===a&&b.activeCalls.size>0);)d(`插件 ${a} 仍有调用正在执行`),await (0,f.setTimeout)(250,void 0,{signal:g});return g.throwIfAborted(),await b()}finally{this.maintainingSources.delete(a)}}async replaceSource(a,b){if(await this.initialize(),this.disposed||!this.acceptingCalls||this.changingSources.has(a))throw new w;let c=this.owners.find(b=>b.source===a);this.changingSources.add(a);try{if(c&&this.releaseOwner(c),this.disposed)throw Error("Global plugin runtime has been disposed");if((0,k.N)(),this.packageDiagnostics.delete(a),null!==b){if(await this.loadPackage(a,b),this.disposed)throw Error("Global plugin runtime has been disposed");let c=this.packageDiagnostics.get(a);if(c?.status==="failed")throw Error(c.error?.message??"插件加载失败")}}finally{this.changingSources.delete(a),this.publishChanges()}}ownerPublished(a){return a.active&&!a.draining&&!this.changingSources.has(a.source)&&this.owners.includes(a)}readDiagnostics(){return{packages:[...this.packageDiagnostics.values()].sort((a,b)=>a.source.localeCompare(b.source)).map(a=>structuredClone(a)),loadError:this.loadError}}readCapabilityRegistrations(){return[...this.owners].filter(a=>this.ownerPublished(a)).sort((a,b)=>a.source.localeCompare(b.source)).map(a=>({source:a.source,methods:[...this.methods.values()].filter(b=>b.owner===a).sort((a,b)=>{let c=a.pluginName.localeCompare(b.pluginName);return 0===c?a.method.localeCompare(b.method):c}).map(({pluginName:a,method:b})=>({pluginName:a,method:b})),browserEntries:[...this.browserEntries.values()].filter(b=>b.owner===a).sort((a,b)=>a.pluginName.localeCompare(b.pluginName)).map(({pluginName:a})=>({pluginName:a})),messageDeclarations:[...this.declarations.values()].filter(b=>b.owner===a).sort((a,b)=>{let c=a.pluginName.localeCompare(b.pluginName);return 0===c?a.declarationName.localeCompare(b.declarationName):c}).map(({pluginName:a,declarationName:b,declaration:c})=>({pluginName:a,declarationName:b,priority:c.priority}))}))}async prepareReload(){if(await this.initialize(),this.disposed)throw Error("Global plugin runtime has been disposed");if(!this.acceptingCalls||this.changingSources.size>0||this.maintainingSources.size>0||this.owners.some(a=>a.activeCalls.size>0))throw new w;for(let a of(this.acceptingCalls=!1,this.owners))a.draining=!0;await Promise.all([...this.owners].reverse().map(async a=>{let b=a.beforeReload;if(!b)return;a.beforeReload=null;let c=new AbortController;await q({owner:a,phase:"beforeReload",execute:()=>b({signal:c.signal}),onTimeout:()=>c.abort()})}))}bindWorkSessionProvider(a){if(this.disposed)throw Error("Global plugin runtime has been disposed");return this.workSessionProvider=a,()=>{this.workSessionProvider===a&&(this.workSessionProvider=null)}}bindPushSender(a){if(this.disposed)throw Error("Global plugin runtime has been disposed");return this.pushSender=a,()=>{this.pushSender===a&&(this.pushSender=null)}}bindAppRuntimeSink(a){if(this.disposed)throw Error("Global plugin runtime has been disposed");return this.appRuntimeSink=a,()=>{this.appRuntimeSink===a&&(this.appRuntimeSink=null)}}async runOwnedCall(a,b){let c;if(this.ensureOwnerActive(a),this.maintainingSources.has(a.source))throw new w;let d=new AbortController,e=new Promise((a,b)=>{c=b}),f=()=>{c(Error("Pi Desk Plugin owner is no longer active"))};d.signal.addEventListener("abort",f,{once:!0}),a.activeCalls.add(d);try{let c=await Promise.race([Promise.resolve().then(()=>(this.ensureOwnerActive(a),b(d.signal))),e]);return this.ensureOwnerActive(a),c}finally{a.activeCalls.delete(d),d.signal.removeEventListener("abort",f)}}async invoke(a,b,c){if(await this.initialize(),this.disposed)throw Error("Global plugin runtime has been disposed");if(!this.acceptingCalls)throw new w;let d=(0,m.FX)(a),e=(0,m.QK)(b),f=this.methods.get((0,m.$m)(d,e));if(!f)throw new m.Tk(d,e);if(!this.ownerPublished(f.owner)||this.changingSources.has(f.owner.source))throw new w;let g=(0,m.nJ)(c,"input");return this.runOwnedCall(f.owner,async a=>{let b=await f.execute(g,{signal:a});return(0,m.nJ)(b,"output")})}async listCapabilityDeclarations(){if(await this.initialize(),this.disposed||!this.acceptingCalls)throw new w;let a=await Promise.all([...this.capabilityLoaders].filter(([,a])=>this.ownerPublished(a.owner)&&!this.changingSources.has(a.owner.source)).map(async([a,b])=>{try{return await this.runOwnedCall(b.owner,async c=>{let d=await b.load({signal:c});if(this.capabilityLoaders.get(a)!==b)throw Error(`能力声明已被替换:${a}`);return[a,j.dO.parse(d)]})}catch(b){throw Error(`读取 ${a} 能力选项失败:${p(b)}`,{cause:b})}}));return Object.fromEntries(a)}async listBrowserEntries(){return await this.initialize(),[...this.browserEntries.values()].filter(a=>this.ownerPublished(a.owner)).sort((a,b)=>a.pluginName.localeCompare(b.pluginName)).flatMap(({pluginName:a,entryPath:b,resourceKey:c,snapshot:d})=>d?[{pluginName:a,entryPath:b,resourceKey:c,snapshot:d}]:[])}async listMessageDeclarations(){return await this.initialize(),this.readMessageDeclarations()}readMessageDeclarations(){return[...this.declarations.values()].filter(a=>this.ownerPublished(a.owner)).sort((a,b)=>{let c=a.pluginName.localeCompare(b.pluginName);return 0===c?a.declarationName.localeCompare(b.declarationName):c}).map(({pluginName:a,declarationName:b,declaration:c})=>({pluginName:a,declarationName:b,declaration:c}))}async dispose(){if(this.disposed)return;this.disposed=!0,this.lifetime.abort(),this.acceptingCalls=!1,this.changeListeners.clear(),this.workSessionProvider=null,this.pushSender=null;let a=[...new Set([...this.owners,...this.loadingOwners])].reverse();this.owners.length=0,this.loadingOwners.clear(),await Promise.all(a.map(a=>this.releaseOwner(a))),this.methods.clear(),this.pluginOwners.clear(),this.browserEntries.clear(),this.declarations.clear(),this.capabilityLoaders.clear(),this.appRuntimeSink=null}async loadConfiguredPackages(){for(let a of(this.loadError=null,this.packageDiagnostics.clear(),await this.packageProvider())){if(this.disposed)return;await this.loadPackage(a.source,a.installedPath)}}async loadOwnerWithinDeadline(a,b,c){let d,e=(async()=>{void 0!==b?await this.loadEntryOwner(a,b):await this.loadLegacyOwner(a,c);try{await this.validateOwnerResources(a)}catch(a){throw new x("resources",a)}this.ensureOwnerActive(a)})();try{await Promise.race([e,new Promise((a,b)=>{d=setTimeout(()=>{b(new x("setup",Error("插件初始化超时,已放弃加载")))},15e3)})])}finally{d&&clearTimeout(d)}}async loadPackage(a,b){let c,d=performance.now(),e=(0,h.resolve)(b);try{let a=(0,h.join)(e,"package.json");c=JSON.parse(await (0,g.readFile)(a,"utf8"))}catch(b){this.packageDiagnostics.set(a,{source:a,packageName:null,version:null,pluginName:null,status:"failed",error:{phase:"package",message:p(b)}});return}let f=c.piDesk?.entry,i=c.piDesk?.global;if(void 0===f&&void 0===i||this.disposed)return;let j={source:a,packageName:"string"==typeof c.name?c.name:null,version:"string"==typeof c.version?c.version:null,packageRoot:e,active:!0,draining:!1,pluginNames:new Set,activeCalls:new Set,subscriptions:new Set,beforeReload:null,disposer:null};console.info("[Pi Desk][GlobalPluginRuntime] 开始加载 Pi Desk Plugin",{source:a,packageName:j.packageName}),this.loadingOwners.add(j);try{await this.loadOwnerWithinDeadline(j,f,i),this.owners.push(j),this.recordOwnerDiagnostic(j),console.info("[Pi Desk][GlobalPluginRuntime] Pi Desk Plugin 已加载",{source:a,packageName:j.packageName,pluginNames:[...j.pluginNames],methodCount:[...this.methods.values()].filter(a=>a.owner===j).length,browserEntryCount:[...this.browserEntries.values()].filter(a=>a.owner===j).length,declarationCount:[...this.declarations.values()].filter(a=>a.owner===j).length,durationMs:Math.round(performance.now()-d)})}catch(f){let b=f instanceof x?f.phase:"entry",c=[...j.pluginNames][0]??null;await this.releaseOwner(j);let e=p(f);this.packageDiagnostics.set(a,{source:a,packageName:j.packageName,version:j.version,pluginName:c,status:"failed",error:{phase:b,message:e}}),console.warn("[Pi Desk][GlobalPluginRuntime] Pi Desk Plugin 加载失败",{source:a,packageName:j.packageName,phase:b,errorName:f instanceof Error?f.name:"UnknownError",message:e,durationMs:Math.round(performance.now()-d)})}finally{this.loadingOwners.delete(j)}}async loadEntryOwner(a,b){let c=o(a.packageRoot,b,"piDesk.entry");if(!(await (0,g.stat)(c)).isFile())throw Error("Pi Desk Plugin entry is not a file");let d=(await (0,k.G)(c,a.packageRoot)).default;if(!d||"object"!=typeof d||"string"!=typeof d.name||"function"!=typeof d.setup)throw Error("Pi Desk Plugin entry must default-export definePiDeskPlugin(...)");let e=(0,m.FX)(d.name);this.claimPluginName(a,e);try{let b=function(a){if(void 0===a)return{beforeReload:null,disposer:null};if("function"==typeof a)return{beforeReload:null,disposer:a};if(!a||"object"!=typeof a)throw Error("Pi Desk Plugin setup must return void, a disposer, or a lifecycle object");if(void 0!==a.beforeReload&&"function"!=typeof a.beforeReload)throw Error("Pi Desk Plugin lifecycle.beforeReload must be a function");if(void 0!==a.dispose&&"function"!=typeof a.dispose)throw Error("Pi Desk Plugin lifecycle.dispose must be a function");return{beforeReload:a.beforeReload??null,disposer:a.dispose??null}}(await d.setup(this.createPiDeskFacade(a,e,a.packageRoot)));if(a.beforeReload=b.beforeReload,a.disposer=b.disposer,!a.active||this.disposed)throw await this.releaseOwner(a),Error("插件初始化完成时 Owner 已失效")}catch(a){throw new x("setup",a)}}async loadLegacyOwner(a,b){let c=o(a.packageRoot,b,"piDesk.global");if(!(await (0,g.stat)(c)).isFile())throw Error("Global Plugin entry is not a file");let d=await (0,k.G)(c,a.packageRoot);if("function"!=typeof d.default)throw Error("Global Plugin entry must default-export a factory function");let e=d.default;try{let b=await e(this.createLegacyApi(a));if(void 0!==b&&"function"!=typeof b)throw Error("Global Plugin factory must return void or a disposer function");if(a.disposer=b??null,!a.active||this.disposed)throw await this.releaseOwner(a),Error("插件初始化完成时 Owner 已失效")}catch(a){throw new x("setup",a)}}claimPluginName(a,b){this.ensureOwnerActive(a);let c=this.pluginOwners.get(b);if(c&&c!==a)throw Error(`Pi Desk pluginName is already registered: ${b}`);this.pluginOwners.set(b,a),a.pluginNames.add(b)}createLegacyApi(a){return{bindPlugin:b=>{let c=(0,m.FX)(b);return this.claimPluginName(a,c),{name:c,registerMethod:(b,d)=>this.registerMethod(a,c,b,d)}}}}createPiDeskFacade(a,b,c){return{name:b,host:{settings:{getSnapshot:()=>{if(this.ensureOwnerActive(a),!this.hostSettings)throw Error("宿主共享设置尚未就绪");return this.hostSettings.getSnapshot()},subscribe:b=>{if(this.ensureOwnerActive(a),!this.hostSettings)throw Error("宿主共享设置尚未就绪");let c=this.hostSettings.subscribe(()=>{a.active&&!a.draining&&b()});return a.subscriptions.add(c),()=>{if(a.subscriptions.delete(c))return c()}}},workSessions:{listWorkSessions:async()=>{this.ensureOwnerActive(a);let b=await this.readWorkSessions();return this.ensureOwnerActive(a),b}}},notifications:{publish:c=>(this.ensureOwnerActive(a),this.requireAppRuntimeSink().publishNotification(b,c)),update:(c,d)=>{this.ensureOwnerActive(a),this.requireAppRuntimeSink().updateNotification(b,c,d)},delete:c=>{this.ensureOwnerActive(a),this.requireAppRuntimeSink().deleteNotification(b,c)}},setState:c=>{this.ensureOwnerActive(a),this.requireAppRuntimeSink().setState(b,c)},registerMethod:(c,d)=>this.registerMethod(a,b,c,d),registerBrowserEntry:d=>{if(this.ensureOwnerActive(a),this.browserEntries.has(b))throw Error(`Browser Entry is already registered: ${b}`);let f=o(c,d,"browserEntry"),g={pluginName:b,entryPath:f,resourceKey:(0,e.randomUUID)(),snapshot:null,owner:a};return this.browserEntries.set(b,g),this.registrationDisposer(a,()=>{this.browserEntries.get(b)===g&&this.browserEntries.delete(b)})},declareCapabilities:c=>{if(this.ensureOwnerActive(a),"function"!=typeof c)throw Error("能力声明必须是按需查询函数");if(this.capabilityLoaders.has(b))throw Error(`能力声明已注册:${b}`);let d={load:c,owner:a};return this.capabilityLoaders.set(b,d),this.registrationDisposer(a,()=>{this.capabilityLoaders.get(b)===d&&this.capabilityLoaders.delete(b)})},declareMessage:(c,d)=>this.registerDeclaration(a,b,c,d),pushGlobal:(c,d)=>{a.active&&!a.draining&&this.sendPush(b,{scope:"global"},c,d)},pushSession:(c,d,e)=>{a.active&&!a.draining&&this.sendPush(b,{scope:"session",source:s.parse(c)},d,e)}}}registerMethod(a,b,c,d){this.ensureOwnerActive(a);let e=(0,m.QK)(c),f=(0,m.$m)(b,e);if(this.methods.has(f))throw new m.qs(b,e);let g={pluginName:b,method:e,execute:d,owner:a};return this.methods.set(f,g),this.registrationDisposer(a,()=>{this.methods.get(f)===g&&this.methods.delete(f)})}registerDeclaration(a,b,c,d){var e;this.ensureOwnerActive(a);let f=u.parse(c);if(!d||"object"!=typeof d||"function"!=typeof d.match||"function"!=typeof d.project)throw Error("Message Declaration must provide match and project functions");let g={priority:(e=d.priority,v.parse(e)),match:d.match,project:d.project},h=`${b}\u0000${f}`;if(this.declarations.has(h))throw Error(`Message Declaration is already registered: ${b}/${f}`);let i={pluginName:b,declarationName:f,declaration:g,owner:a};return this.declarations.set(h,i),this.registrationDisposer(a,()=>{this.declarations.get(h)===i&&this.declarations.delete(h)})}registrationDisposer(a,b){let c=!0;return()=>{c&&(c=!1,a.active&&b())}}requireAppRuntimeSink(){if(!this.appRuntimeSink)throw Error("App Runtime sink has not been bound");return this.appRuntimeSink}sendPush(a,b,c,d){if(this.disposed)return;let e=(0,m.QK)(c),f=function(a){let b=r.parse(a);if(Buffer.byteLength(JSON.stringify(b),"utf8")>65536)throw Error("Plugin Push data exceeds 64KB");return b}(d);this.pushSender?.({pluginName:a,target:b,event:e,data:structuredClone(f)})}async readWorkSessions(){if(!this.workSessionProvider||this.disposed)return[];let a=await this.workSessionProvider();return i.YO(t).parse(a).map(a=>structuredClone(a))}async validateOwnerResources(a){for(let b of[...this.browserEntries.values()].filter(b=>b.owner===a)){if(!(await (0,g.stat)(b.entryPath)).isFile())throw Error("Browser Entry resource is not a file");if("entry.js"!==(0,h.basename)(b.entryPath))throw Error("Browser Entry resource file must be named entry.js");let c=await (0,l.f)(b.entryPath);if(this.ensureOwnerActive(a),[...this.browserEntries.values()].reduce((a,b)=>a+(b.snapshot?.size??0),0)+c.size>0x8000000)throw Error("Browser 模块快照总量超过128MB,拒绝加载此插件");b.snapshot=c}}recordOwnerDiagnostic(a){this.packageDiagnostics.set(a.source,{source:a.source,packageName:a.packageName,version:a.version,pluginName:[...a.pluginNames][0]??null,status:"ready",error:null})}ensureOwnerActive(a){if(!a.active||a.draining||this.disposed)throw Error("Pi Desk Plugin owner is no longer active")}async releaseOwner(a){let b=[...a.subscriptions];if(a.subscriptions.clear(),a.active){for(let b of(a.active=!1,a.activeCalls))b.abort();a.activeCalls.clear();let b=this.owners.indexOf(a);for(let[c,d]of(b>=0&&this.owners.splice(b,1),this.methods))d.owner===a&&this.methods.delete(c);for(let[b,c]of this.browserEntries)c.owner===a&&this.browserEntries.delete(b);for(let[b,c]of this.declarations)c.owner===a&&this.declarations.delete(b);for(let[b,c]of this.capabilityLoaders)c.owner===a&&this.capabilityLoaders.delete(b);for(let b of a.pluginNames)if(this.pluginOwners.get(b)===a){this.pluginOwners.delete(b);try{this.appRuntimeSink?.releasePlugin(b)}catch(a){console.warn("[Pi Desk][GlobalPluginRuntime] 清理插件 App Runtime 失败",{pluginName:b,errorName:a instanceof Error?a.name:"UnknownError",message:p(a)})}}a.pluginNames.clear()}let c=a.beforeReload,d=a.disposer;a.beforeReload=null,a.disposer=null;let e=new AbortController;await Promise.all([...b.map(b=>q({owner:a,phase:"dispose",execute:b})),c?q({owner:a,phase:"beforeReload",execute:()=>c({signal:e.signal}),onTimeout:()=>e.abort()}):Promise.resolve(),d?q({owner:a,phase:"dispose",execute:d}):Promise.resolve()])}}d()}catch(a){d(a)}})}};
|
|
3
|
+
`,"utf8"),(0,f.renameSync)(b,this.path)}finally{(0,f.existsSync)(b)&&(0,f.unlinkSync)(b)}}}function l(){return globalThis.__piDeskHostSettingsStore??=new m}d()}catch(a){d(a)}})},73630:(a,b,c)=>{c.d(b,{f:()=>h});var d=c(77598),e=c(51455),f=c(76760);function g(a,b){let c=(0,f.relative)(a,b);return""===c||!c.startsWith("..")&&!(0,f.isAbsolute)(c)}async function h(a){if("entry.js"!==(0,f.basename)(a))throw Error("Browser Entry 必须命名为 entry.js");let b=await (0,e.realpath)((0,f.dirname)(a)),c=new Map,h=0,i=0,j=[],k=async(a,l,m)=>{let n=await (0,e.realpath)(a);if(!g(b,n))return;if(m.has(n))throw Error("Browser 模块目录存在符号链接循环");let o=new Set(m).add(n);for(let a of(await (0,e.readdir)(n,{withFileTypes:!0})).sort((a,b)=>a.name.localeCompare(b.name))){if(++i>4096)throw Error("Browser 模块目录条目超过上限");if(a.name.startsWith(".")||"node_modules"===a.name)continue;let m=(0,f.join)(n,a.name),p=await (0,e.realpath)(m);if(!g(b,p))continue;let q=await (0,e.stat)(p),r=l?`${l}/${a.name}`:a.name;if(q.isDirectory()){await k(p,r,o);continue}if(!q.isFile()||!a.name.endsWith(".js"))continue;if("entry.js"===r&&"entry.js"!==(0,f.basename)(p))throw Error("Browser Entry 符号链接必须指向 entry.js");if(c.size>=2048||q.size>0x1000000||h+q.size>0x2000000)throw Error("Browser 模块快照超过数量或容量上限");let s=await (0,e.readFile)(p),t=await (0,e.stat)(p);if(s.length!==q.size||t.size!==q.size||t.mtimeMs!==q.mtimeMs)throw Error("Browser 模块在读取时发生变化,请构建完成后重新加载");h+=s.length,j.push({path:p,size:t.size,mtimeMs:t.mtimeMs,ino:t.ino}),c.set(r,{content:s,etag:`"${(0,d.createHash)("sha256").update(s).digest("hex")}"`})}};for(let a of(await k(b,"",new Set),j)){let b=await (0,e.stat)(a.path);if(b.size!==a.size||b.mtimeMs!==a.mtimeMs||b.ino!==a.ino)throw Error("Browser 模块组在读取时发生变化,请构建完成后重新加载")}if(!c.has("entry.js"))throw Error("Browser Entry 模块缺失或越出专用目录");return{size:h,modules:c}}},90733:(a,b,c)=>{c.d(b,{$m:()=>g,FX:()=>h,Pu:()=>m,QK:()=>i,Tk:()=>k,nJ:()=>j,qs:()=>l});var d=c(36153);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=d.g1(d.Yj(),d.Pq());function g(a,b){return`${a}\u0000${b}`}function h(a){return e.parse(a)}function i(a){return e.parse(a)}function j(a,b){let c=f.parse(a);if(Buffer.byteLength(JSON.stringify(c),"utf8")>2097152)throw new m(b);return c}class k extends Error{constructor(a,b){super(`Plugin method was not found: ${a}/${b}`),this.name="L4PiPluginMethodNotFoundError"}}class l extends Error{constructor(a,b){super(`Plugin method is already registered: ${a}/${b}`),this.name="L4PiPluginMethodConflictError"}}class m extends Error{constructor(a){super(`Plugin method ${a} exceeds 2MB`),this.direction=a,this.name="L4PiPluginMethodPayloadTooLargeError"}}},99667:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{K:()=>z,y:()=>w});var e=c(77598),f=c(58500),g=c(51455),h=c(76760),i=c(36153),j=c(63603),k=c(44493),l=c(73630),m=c(90733),n=a([k]);k=(n.then?(await n)():n)[0];let r=i.g1(i.Yj(),i.Pq()),s=i.Ik({workId:i.Yj().trim().min(1),sessionId:i.Yj().trim().min(1),branchId:i.Yj().trim().min(1)}).strict(),t=i.Ik({source:s,cwd:i.Yj().trim().min(1),status:i.k5(["main_running","background_running","completed","idle"])}).strict(),u=i.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),v=i.ai().int().safe();class w extends Error{constructor(){super("插件运行时仍有调用正在执行"),this.name="L4PiPluginRuntimeBusyError"}}class x extends Error{constructor(a,b){super(b instanceof Error?b.message:String(b),{cause:b}),this.phase=a,this.name="L4PiPluginPhaseError"}}class y extends x{constructor(a,b){super(a,Error("插件加载超时,已停止本次加载")),this.execution=b,this.name="L4PiPluginLoadTimeoutError"}}function o(a,b,c){if("string"!=typeof b||!b.trim())throw Error(`package.json.${c} must be a non-empty string`);let d=(0,h.resolve)(a,b),e=(0,h.relative)(a,d);if(e.startsWith("..")||(0,h.isAbsolute)(e))throw Error(`package.json.${c} must stay inside the package root`);return d}function p(a){return a instanceof Error&&a.message?a.message:String(a)}async function q(a){let b=null,c=Promise.resolve().then(a.execute);a.owner.pendingCleanup.add(c);let d=()=>{a.owner.pendingCleanup.delete(c)};c.then(d,d);try{if(await Promise.race([c.then(()=>!0),new Promise(a=>{b=setTimeout(()=>a(!1),1500)})]))return;throw a.onTimeout?.(),Error(`插件 ${a.phase} 超时,关闭结果未确认`)}catch(b){console.warn("[Pi Desk][GlobalPluginRuntime] Pi Desk Plugin 生命周期执行失败",{source:a.owner.source,packageName:a.owner.packageName,phase:a.phase,timeoutMs:1500,message:p(b)})}finally{b&&clearTimeout(b)}}class z{constructor(a,b){this.packageProvider=a,this.hostSettings=b,this.methods=new Map,this.pluginOwners=new Map,this.browserEntries=new Map,this.declarations=new Map,this.capabilityLoaders=new Map,this.owners=[],this.loadingOwners=new Set,this.changeListeners=new Set,this.changingSources=new Set,this.maintainingSources=new Set,this.lifetime=new AbortController,this.packageDiagnostics=new Map,this.recoveries=new Map,this.initializePromise=null,this.initialized=!1,this.disposed=!1,this.acceptingCalls=!0,this.loadError=null,this.workSessionProvider=null,this.pushSender=null,this.appRuntimeSink=null}initialize(){return this.disposed?Promise.reject(Error("Global plugin runtime has been disposed")):this.initialized?Promise.resolve():(this.initializePromise||(this.initializePromise=this.loadConfiguredPackages().catch(a=>{this.loadError=p(a),console.error("[Pi Desk][GlobalPluginRuntime] 读取插件配置失败,核心应用继续启动",{errorName:a instanceof Error?a.name:"UnknownError",message:this.loadError})}).finally(()=>{this.initializePromise=null,this.initialized=!0,this.publishChanges()})),this.initializePromise)}subscribeChanges(a){return this.changeListeners.add(a),()=>this.changeListeners.delete(a)}publishChanges(){if(!this.disposed)for(let a of this.changeListeners)try{a()}catch(a){console.warn("[Pi Desk][GlobalPluginRuntime] 状态监听失败",{message:p(a)})}}async withSourceIdle(a,b,c,d){let e,g=AbortSignal.any([c,this.lifetime.signal]);g.throwIfAborted();let h=new Promise((a,b)=>{e=()=>b(g.reason),g.addEventListener("abort",e,{once:!0})});try{await Promise.race([this.initialize(),h])}finally{g.removeEventListener("abort",e)}if(g.throwIfAborted(),!this.acceptingCalls||this.changingSources.has(a)||this.maintainingSources.has(a))throw new w;this.cancelRecovery(a),this.maintainingSources.add(a);try{for(;this.owners.some(b=>b.source===a&&b.activeCalls.size>0);)d(`插件 ${a} 仍有调用正在执行`),await (0,f.setTimeout)(250,void 0,{signal:g});return g.throwIfAborted(),await b()}finally{this.maintainingSources.delete(a)}}async replaceSource(a,b){if(await this.initialize(),this.disposed||!this.acceptingCalls||this.changingSources.has(a))throw new w;this.cancelRecovery(a);let c=this.owners.find(b=>b.source===a);this.changingSources.add(a);try{if(c&&this.releaseOwner(c),this.disposed)throw Error("Global plugin runtime has been disposed");if((0,k.N)(),this.packageDiagnostics.delete(a),null!==b){if(await this.loadPackage(a,b),this.disposed)throw Error("Global plugin runtime has been disposed");let c=this.packageDiagnostics.get(a);if(c?.status==="failed")throw Error(c.error?.message??"插件加载失败")}}finally{this.changingSources.delete(a),this.publishChanges()}}ownerPublished(a){return a.active&&!a.draining&&!this.changingSources.has(a.source)&&this.owners.includes(a)}readDiagnostics(){return{packages:[...this.packageDiagnostics.values()].sort((a,b)=>a.source.localeCompare(b.source)).map(a=>structuredClone(a)),loadError:this.loadError}}readCapabilityRegistrations(){return[...this.owners].filter(a=>this.ownerPublished(a)).sort((a,b)=>a.source.localeCompare(b.source)).map(a=>({source:a.source,methods:[...this.methods.values()].filter(b=>b.owner===a).sort((a,b)=>{let c=a.pluginName.localeCompare(b.pluginName);return 0===c?a.method.localeCompare(b.method):c}).map(({pluginName:a,method:b})=>({pluginName:a,method:b})),browserEntries:[...this.browserEntries.values()].filter(b=>b.owner===a).sort((a,b)=>a.pluginName.localeCompare(b.pluginName)).map(({pluginName:a})=>({pluginName:a})),messageDeclarations:[...this.declarations.values()].filter(b=>b.owner===a).sort((a,b)=>{let c=a.pluginName.localeCompare(b.pluginName);return 0===c?a.declarationName.localeCompare(b.declarationName):c}).map(({pluginName:a,declarationName:b,declaration:c})=>({pluginName:a,declarationName:b,priority:c.priority}))}))}async prepareReload(){if(await this.initialize(),this.disposed)throw Error("Global plugin runtime has been disposed");if(!this.acceptingCalls||this.changingSources.size>0||this.maintainingSources.size>0||this.owners.some(a=>a.activeCalls.size>0))throw new w;for(let a of(this.acceptingCalls=!1,this.recoveries.keys()))this.cancelRecovery(a);for(let a of this.owners)a.draining=!0;await Promise.all([...this.owners].reverse().map(async a=>{let b=a.beforeReload;if(!b)return;a.beforeReload=null;let c=new AbortController;await q({owner:a,phase:"beforeReload",execute:()=>b({signal:c.signal}),onTimeout:()=>c.abort()})}))}bindWorkSessionProvider(a){if(this.disposed)throw Error("Global plugin runtime has been disposed");return this.workSessionProvider=a,()=>{this.workSessionProvider===a&&(this.workSessionProvider=null)}}bindPushSender(a){if(this.disposed)throw Error("Global plugin runtime has been disposed");return this.pushSender=a,()=>{this.pushSender===a&&(this.pushSender=null)}}bindAppRuntimeSink(a){if(this.disposed)throw Error("Global plugin runtime has been disposed");return this.appRuntimeSink=a,()=>{this.appRuntimeSink===a&&(this.appRuntimeSink=null)}}async runOwnedCall(a,b){let c;if(this.ensureOwnerActive(a),this.maintainingSources.has(a.source))throw new w;let d=new AbortController,e=new Promise((a,b)=>{c=b}),f=()=>{c(Error("Pi Desk Plugin owner is no longer active"))};d.signal.addEventListener("abort",f,{once:!0}),a.activeCalls.add(d);try{let c=await Promise.race([Promise.resolve().then(()=>(this.ensureOwnerActive(a),b(d.signal))),e]);return this.ensureOwnerActive(a),c}finally{a.activeCalls.delete(d),d.signal.removeEventListener("abort",f)}}async invoke(a,b,c){if(await this.initialize(),this.disposed)throw Error("Global plugin runtime has been disposed");if(!this.acceptingCalls)throw new w;let d=(0,m.FX)(a),e=(0,m.QK)(b),f=this.methods.get((0,m.$m)(d,e));if(!f)throw new m.Tk(d,e);if(!this.ownerPublished(f.owner)||this.changingSources.has(f.owner.source))throw new w;let g=(0,m.nJ)(c,"input");return this.runOwnedCall(f.owner,async a=>{let b=await f.execute(g,{signal:a});return(0,m.nJ)(b,"output")})}async listCapabilityDeclarations(){if(await this.initialize(),this.disposed||!this.acceptingCalls)throw new w;let a=await Promise.all([...this.capabilityLoaders].filter(([,a])=>this.ownerPublished(a.owner)&&!this.changingSources.has(a.owner.source)).map(async([a,b])=>{try{return await this.runOwnedCall(b.owner,async c=>{let d=await b.load({signal:c});if(this.capabilityLoaders.get(a)!==b)throw Error(`能力声明已被替换:${a}`);return[a,j.dO.parse(d)]})}catch(b){throw Error(`读取 ${a} 能力选项失败:${p(b)}`,{cause:b})}}));return Object.fromEntries(a)}async listBrowserEntries(){return await this.initialize(),[...this.browserEntries.values()].filter(a=>this.ownerPublished(a.owner)).sort((a,b)=>a.pluginName.localeCompare(b.pluginName)).flatMap(({pluginName:a,entryPath:b,resourceKey:c,snapshot:d})=>d?[{pluginName:a,entryPath:b,resourceKey:c,snapshot:d}]:[])}async listMessageDeclarations(){return await this.initialize(),this.readMessageDeclarations()}readMessageDeclarations(){return[...this.declarations.values()].filter(a=>this.ownerPublished(a.owner)).sort((a,b)=>{let c=a.pluginName.localeCompare(b.pluginName);return 0===c?a.declarationName.localeCompare(b.declarationName):c}).map(({pluginName:a,declarationName:b,declaration:c})=>({pluginName:a,declarationName:b,declaration:c}))}async dispose(){if(this.disposed)return;for(let a of(this.disposed=!0,this.lifetime.abort(),this.recoveries.keys()))this.cancelRecovery(a);this.acceptingCalls=!1,this.changeListeners.clear(),this.workSessionProvider=null,this.pushSender=null;let a=[...new Set([...this.owners,...this.loadingOwners])].reverse();this.owners.length=0,this.loadingOwners.clear(),await Promise.all(a.map(a=>this.releaseOwner(a))),this.methods.clear(),this.pluginOwners.clear(),this.browserEntries.clear(),this.declarations.clear(),this.capabilityLoaders.clear(),this.appRuntimeSink=null}async loadConfiguredPackages(){for(let a of(this.loadError=null,this.packageDiagnostics.clear(),await this.packageProvider())){if(this.disposed)return;let b=await this.loadPackage(a.source,a.installedPath);b&&!this.disposed&&this.recoveries.set(a.source,{installedPath:a.installedPath,settled:b.execution,controller:new AbortController})}for(let[a,b]of this.recoveries)this.recoverSource(a,b)}cancelRecovery(a){let b=this.recoveries.get(a);this.recoveries.delete(a),b?.controller.abort()}async recoverSource(a,b){let c,d=b.controller.signal,e=new Promise((a,b)=>{c=()=>b(d.reason),d.addEventListener("abort",c,{once:!0})});try{await Promise.race([b.settled,e]),d.throwIfAborted(),console.info("[Pi Desk][GlobalPluginRuntime] 插件加载超时,稍后自动重试一次",{source:a,delayMs:1e4}),await (0,f.setTimeout)(1e4,void 0,{signal:d}),d.throwIfAborted(),this.recoveries.delete(a),await this.replaceSource(a,b.installedPath),console.info("[Pi Desk][GlobalPluginRuntime] 插件自动重试成功",{source:a})}catch(b){d.aborted||console.warn("[Pi Desk][GlobalPluginRuntime] 插件自动重试失败,不再自动加载",{source:a,message:p(b)})}finally{d.removeEventListener("abort",c),this.recoveries.get(a)===b&&this.recoveries.delete(a)}}async loadOwnerWithinDeadline(a,b,c){let d,e="entry",f=performance.now(),g=()=>{let b=Math.round(performance.now()-f);b<1e3||console.info("[Pi Desk][GlobalPluginRuntime] 插件加载阶段耗时",{source:a.source,packageName:a.packageName,phase:e,durationMs:b})},h=a=>{g(),e=a,f=performance.now()},i=(async()=>{let d=()=>h("setup");void 0!==b?await this.loadEntryOwner(a,b,d):await this.loadLegacyOwner(a,c,d),h("resources");try{await this.validateOwnerResources(a)}catch(a){throw new x("resources",a)}this.ensureOwnerActive(a)})();try{await Promise.race([i,new Promise((a,b)=>{d=setTimeout(()=>{b(new y(e,i))},15e3)})])}finally{d&&clearTimeout(d),g()}}async loadPackage(a,b){let c,d=performance.now(),e=(0,h.resolve)(b);try{let a=(0,h.join)(e,"package.json");c=JSON.parse(await (0,g.readFile)(a,"utf8"))}catch(b){return this.packageDiagnostics.set(a,{source:a,packageName:null,version:null,pluginName:null,status:"failed",error:{phase:"package",message:p(b)}}),null}let f=c.piDesk?.entry,i=c.piDesk?.global;if(void 0===f&&void 0===i||this.disposed)return null;let j={source:a,packageName:"string"==typeof c.name?c.name:null,version:"string"==typeof c.version?c.version:null,packageRoot:e,active:!0,draining:!1,pluginNames:new Set,activeCalls:new Set,subscriptions:new Set,pendingCleanup:new Set,beforeReload:null,disposer:null};console.info("[Pi Desk][GlobalPluginRuntime] 开始加载 Pi Desk Plugin",{source:a,packageName:j.packageName}),this.loadingOwners.add(j);try{await this.loadOwnerWithinDeadline(j,f,i),this.owners.push(j),this.recordOwnerDiagnostic(j),console.info("[Pi Desk][GlobalPluginRuntime] Pi Desk Plugin 已加载",{source:a,packageName:j.packageName,pluginNames:[...j.pluginNames],methodCount:[...this.methods.values()].filter(a=>a.owner===j).length,browserEntryCount:[...this.browserEntries.values()].filter(a=>a.owner===j).length,declarationCount:[...this.declarations.values()].filter(a=>a.owner===j).length,durationMs:Math.round(performance.now()-d)})}catch(f){let b=f instanceof x?f.phase:"entry",c=[...j.pluginNames][0]??null;await this.releaseOwner(j);let e=p(f);if(this.packageDiagnostics.set(a,{source:a,packageName:j.packageName,version:j.version,pluginName:c,status:"failed",error:{phase:b,message:e}}),console.warn("[Pi Desk][GlobalPluginRuntime] Pi Desk Plugin 加载失败",{source:a,packageName:j.packageName,phase:b,errorName:f instanceof Error?f.name:"UnknownError",message:e,durationMs:Math.round(performance.now()-d)}),f instanceof y)return{execution:f.execution.catch(()=>{}).then(async()=>{await Promise.allSettled([...j.pendingCleanup])})}}finally{this.loadingOwners.delete(j)}return null}async loadEntryOwner(a,b,c){let d=o(a.packageRoot,b,"piDesk.entry");if(!(await (0,g.stat)(d)).isFile())throw Error("Pi Desk Plugin entry is not a file");let e=(await (0,k.G)(d,a.packageRoot)).default;if(!e||"object"!=typeof e||"string"!=typeof e.name||"function"!=typeof e.setup)throw Error("Pi Desk Plugin entry must default-export definePiDeskPlugin(...)");let f=(0,m.FX)(e.name);this.claimPluginName(a,f),c();try{let b=function(a){if(void 0===a)return{beforeReload:null,disposer:null};if("function"==typeof a)return{beforeReload:null,disposer:a};if(!a||"object"!=typeof a)throw Error("Pi Desk Plugin setup must return void, a disposer, or a lifecycle object");if(void 0!==a.beforeReload&&"function"!=typeof a.beforeReload)throw Error("Pi Desk Plugin lifecycle.beforeReload must be a function");if(void 0!==a.dispose&&"function"!=typeof a.dispose)throw Error("Pi Desk Plugin lifecycle.dispose must be a function");return{beforeReload:a.beforeReload??null,disposer:a.dispose??null}}(await e.setup(this.createPiDeskFacade(a,f,a.packageRoot)));if(a.beforeReload=b.beforeReload,a.disposer=b.disposer,!a.active||this.disposed)throw await this.releaseOwner(a),Error("插件初始化完成时 Owner 已失效")}catch(a){throw new x("setup",a)}}async loadLegacyOwner(a,b,c){let d=o(a.packageRoot,b,"piDesk.global");if(!(await (0,g.stat)(d)).isFile())throw Error("Global Plugin entry is not a file");let e=await (0,k.G)(d,a.packageRoot);if("function"!=typeof e.default)throw Error("Global Plugin entry must default-export a factory function");let f=e.default;c();try{let b=await f(this.createLegacyApi(a));if(void 0!==b&&"function"!=typeof b)throw Error("Global Plugin factory must return void or a disposer function");if(a.disposer=b??null,!a.active||this.disposed)throw await this.releaseOwner(a),Error("插件初始化完成时 Owner 已失效")}catch(a){throw new x("setup",a)}}claimPluginName(a,b){this.ensureOwnerActive(a);let c=this.pluginOwners.get(b);if(c&&c!==a)throw Error(`Pi Desk pluginName is already registered: ${b}`);this.pluginOwners.set(b,a),a.pluginNames.add(b)}createLegacyApi(a){return{bindPlugin:b=>{let c=(0,m.FX)(b);return this.claimPluginName(a,c),{name:c,registerMethod:(b,d)=>this.registerMethod(a,c,b,d)}}}}createPiDeskFacade(a,b,c){return{name:b,host:{settings:{getSnapshot:()=>{if(this.ensureOwnerActive(a),!this.hostSettings)throw Error("宿主共享设置尚未就绪");return this.hostSettings.getSnapshot()},subscribe:b=>{if(this.ensureOwnerActive(a),!this.hostSettings)throw Error("宿主共享设置尚未就绪");let c=this.hostSettings.subscribe(()=>{a.active&&!a.draining&&b()});return a.subscriptions.add(c),()=>{if(a.subscriptions.delete(c))return c()}}},workSessions:{listWorkSessions:async()=>{this.ensureOwnerActive(a);let b=await this.readWorkSessions();return this.ensureOwnerActive(a),b}}},notifications:{publish:c=>(this.ensureOwnerActive(a),this.requireAppRuntimeSink().publishNotification(b,c)),update:(c,d)=>{this.ensureOwnerActive(a),this.requireAppRuntimeSink().updateNotification(b,c,d)},delete:c=>{this.ensureOwnerActive(a),this.requireAppRuntimeSink().deleteNotification(b,c)}},setState:c=>{this.ensureOwnerActive(a),this.requireAppRuntimeSink().setState(b,c)},registerMethod:(c,d)=>this.registerMethod(a,b,c,d),registerBrowserEntry:d=>{if(this.ensureOwnerActive(a),this.browserEntries.has(b))throw Error(`Browser Entry is already registered: ${b}`);let f=o(c,d,"browserEntry"),g={pluginName:b,entryPath:f,resourceKey:(0,e.randomUUID)(),snapshot:null,owner:a};return this.browserEntries.set(b,g),this.registrationDisposer(a,()=>{this.browserEntries.get(b)===g&&this.browserEntries.delete(b)})},declareCapabilities:c=>{if(this.ensureOwnerActive(a),"function"!=typeof c)throw Error("能力声明必须是按需查询函数");if(this.capabilityLoaders.has(b))throw Error(`能力声明已注册:${b}`);let d={load:c,owner:a};return this.capabilityLoaders.set(b,d),this.registrationDisposer(a,()=>{this.capabilityLoaders.get(b)===d&&this.capabilityLoaders.delete(b)})},declareMessage:(c,d)=>this.registerDeclaration(a,b,c,d),pushGlobal:(c,d)=>{a.active&&!a.draining&&this.sendPush(b,{scope:"global"},c,d)},pushSession:(c,d,e)=>{a.active&&!a.draining&&this.sendPush(b,{scope:"session",source:s.parse(c)},d,e)}}}registerMethod(a,b,c,d){this.ensureOwnerActive(a);let e=(0,m.QK)(c),f=(0,m.$m)(b,e);if(this.methods.has(f))throw new m.qs(b,e);let g={pluginName:b,method:e,execute:d,owner:a};return this.methods.set(f,g),this.registrationDisposer(a,()=>{this.methods.get(f)===g&&this.methods.delete(f)})}registerDeclaration(a,b,c,d){var e;this.ensureOwnerActive(a);let f=u.parse(c);if(!d||"object"!=typeof d||"function"!=typeof d.match||"function"!=typeof d.project)throw Error("Message Declaration must provide match and project functions");let g={priority:(e=d.priority,v.parse(e)),match:d.match,project:d.project},h=`${b}\u0000${f}`;if(this.declarations.has(h))throw Error(`Message Declaration is already registered: ${b}/${f}`);let i={pluginName:b,declarationName:f,declaration:g,owner:a};return this.declarations.set(h,i),this.registrationDisposer(a,()=>{this.declarations.get(h)===i&&this.declarations.delete(h)})}registrationDisposer(a,b){let c=!0;return()=>{c&&(c=!1,a.active&&b())}}requireAppRuntimeSink(){if(!this.appRuntimeSink)throw Error("App Runtime sink has not been bound");return this.appRuntimeSink}sendPush(a,b,c,d){if(this.disposed)return;let e=(0,m.QK)(c),f=function(a){let b=r.parse(a);if(Buffer.byteLength(JSON.stringify(b),"utf8")>65536)throw Error("Plugin Push data exceeds 64KB");return b}(d);this.pushSender?.({pluginName:a,target:b,event:e,data:structuredClone(f)})}async readWorkSessions(){if(!this.workSessionProvider||this.disposed)return[];let a=await this.workSessionProvider();return i.YO(t).parse(a).map(a=>structuredClone(a))}async validateOwnerResources(a){for(let b of[...this.browserEntries.values()].filter(b=>b.owner===a)){if(!(await (0,g.stat)(b.entryPath)).isFile())throw Error("Browser Entry resource is not a file");if("entry.js"!==(0,h.basename)(b.entryPath))throw Error("Browser Entry resource file must be named entry.js");let c=await (0,l.f)(b.entryPath);if(this.ensureOwnerActive(a),[...this.browserEntries.values()].reduce((a,b)=>a+(b.snapshot?.size??0),0)+c.size>0x8000000)throw Error("Browser 模块快照总量超过128MB,拒绝加载此插件");b.snapshot=c}}recordOwnerDiagnostic(a){this.packageDiagnostics.set(a.source,{source:a.source,packageName:a.packageName,version:a.version,pluginName:[...a.pluginNames][0]??null,status:"ready",error:null})}ensureOwnerActive(a){if(!a.active||a.draining||this.disposed)throw Error("Pi Desk Plugin owner is no longer active")}async releaseOwner(a){let b=[...a.subscriptions];if(a.subscriptions.clear(),a.active){for(let b of(a.active=!1,a.activeCalls))b.abort();a.activeCalls.clear();let b=this.owners.indexOf(a);for(let[c,d]of(b>=0&&this.owners.splice(b,1),this.methods))d.owner===a&&this.methods.delete(c);for(let[b,c]of this.browserEntries)c.owner===a&&this.browserEntries.delete(b);for(let[b,c]of this.declarations)c.owner===a&&this.declarations.delete(b);for(let[b,c]of this.capabilityLoaders)c.owner===a&&this.capabilityLoaders.delete(b);for(let b of a.pluginNames)if(this.pluginOwners.get(b)===a){this.pluginOwners.delete(b);try{this.appRuntimeSink?.releasePlugin(b)}catch(a){console.warn("[Pi Desk][GlobalPluginRuntime] 清理插件 App Runtime 失败",{pluginName:b,errorName:a instanceof Error?a.name:"UnknownError",message:p(a)})}}a.pluginNames.clear()}let c=a.beforeReload,d=a.disposer;a.beforeReload=null,a.disposer=null;let e=new AbortController;await Promise.all([...b.map(b=>q({owner:a,phase:"dispose",execute:b})),c?q({owner:a,phase:"beforeReload",execute:()=>c({signal:e.signal}),onTimeout:()=>e.abort()}):Promise.resolve(),d?q({owner:a,phase:"dispose",execute:d}):Promise.resolve()])}}d()}catch(a){d(a)}})}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=48180,exports.ids=[48180],exports.modules={48180:(a,b,c)=>{c.r(b),c.d(b,{default:()=>f});var d=c(19737);let e=Object.freeze(JSON.parse('{"displayName":"F#","name":"fsharp","patterns":[{"include":"#compiler_directives"},{"include":"#comments"},{"include":"#constants"},{"include":"#strings"},{"include":"#chars"},{"include":"#double_tick"},{"include":"#definition"},{"include":"#abstract_definition"},{"include":"#attributes"},{"include":"#modules"},{"include":"#anonymous_functions"},{"include":"#du_declaration"},{"include":"#record_declaration"},{"include":"#records"},{"include":"#strp_inlined"},{"include":"#keywords"},{"include":"#cexprs"},{"include":"#text"}],"repository":{"abstract_definition":{"begin":"\\\\b(static\\\\s+)?(abstract)\\\\s+(member)?(\\\\s+\\\\[<.*>])?\\\\s*([,.0-9_`[:alpha:]\\\\s]+)(<)?","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"keyword.fsharp"},"3":{"name":"keyword.fsharp"},"4":{"name":"support.function.attribute.fsharp"},"5":{"name":"keyword.symbol.fsharp"}},"end":"\\\\s*(with)\\\\b|=|$","endCaptures":{"1":{"name":"keyword.fsharp"}},"name":"abstract.definition.fsharp","patterns":[{"include":"#comments"},{"include":"#common_declaration"},{"captures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"variable.parameter.fsharp"},"3":{"name":"keyword.symbol.fsharp"},"4":{"name":"entity.name.type.fsharp"}},"match":"(\\\\??)([ \'.0-9^_`[:alpha:]]+)\\\\s*(:)((?!with\\\\b)\\\\b([ \'.0-9^_`\\\\w]+))?"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"comments":"Here we need the \\\\w modifier in order to check that the words isn\'t blacklisted","match":"(?!with|get|set\\\\b)\\\\s*([\'.0-9^_`\\\\w]+)"},{"include":"#keywords"}]},"anonymous_functions":{"patterns":[{"begin":"\\\\b(fun)\\\\b","beginCaptures":{"1":{"name":"keyword.fsharp"}},"end":"(->)","endCaptures":{"1":{"name":"keyword.symbol.arrow.fsharp"}},"name":"function.anonymous","patterns":[{"include":"#comments"},{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"\\\\s*(?=(->))","endCaptures":{"1":{"name":"keyword.symbol.arrow.fsharp"}},"patterns":[{"include":"#member_declaration"}]},{"include":"#variables"}]}]},"anonymous_record_declaration":{"begin":"(\\\\{\\\\|)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\|})","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"keyword.symbol.fsharp"}},"match":"[ \'0-9^_`[:alpha:]]+(:)"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"([ \'0-9^_`[:alpha:]]+)"},{"include":"#anonymous_record_declaration"},{"include":"#keywords"}]},"attributes":{"patterns":[{"begin":"\\\\[<","end":">?]","name":"support.function.attribute.fsharp","patterns":[{"include":"$self"}]}]},"cexprs":{"patterns":[{"captures":{"0":{"name":"keyword.fsharp"}},"match":"\\\\b(async|seq|promise|task|maybe|asyncMaybe|controller|scope|application|pipeline)(?=\\\\s*\\\\{)","name":"cexpr.fsharp"}]},"chars":{"patterns":[{"captures":{"1":{"name":"string.quoted.single.fsharp"}},"match":"(\'\\\\\\\\?.\')","name":"char.fsharp"}]},"comments":{"patterns":[{"begin":"^\\\\s*(\\\\(\\\\*\\\\*(?!\\\\)))((?!\\\\*\\\\)).)*$","beginCaptures":{"1":{"name":"comment.block.fsharp"}},"name":"comment.block.markdown.fsharp","patterns":[{"include":"text.html.markdown"}],"while":"^(?!\\\\s*(\\\\*)+\\\\)\\\\s*$)","whileCaptures":{"1":{"name":"comment.block.fsharp"}}},{"begin":"(\\\\(\\\\*(?!\\\\)))","beginCaptures":{"1":{"name":"comment.block.fsharp"}},"end":"(\\\\*+\\\\))","endCaptures":{"1":{"name":"comment.block.fsharp"}},"name":"comment.block.fsharp","patterns":[{"comments":"Capture // when inside of (* *) like that the rule which capture comments starting by // is not trigger. See https://github.com/ionide/ionide-fsgrammar/issues/155","match":"//","name":"fast-capture.comment.line.double-slash.fsharp"},{"comments":"Capture (*) when inside of (* *) so that it doesn\'t prematurely end the comment block.","match":"\\\\(\\\\*\\\\)","name":"fast-capture.comment.line.mul-operator.fsharp"},{"include":"#comments"}]},{"captures":{"1":{"name":"comment.block.fsharp"}},"match":"((?<!\\\\()(\\\\*)+\\\\))","name":"comment.block.markdown.fsharp.end"},{"begin":"(?<![!%\\\\&+-/<-@^|])///(?!/)","name":"comment.line.markdown.fsharp","patterns":[{"include":"text.html.markdown"}],"while":"(?<![!%\\\\&+-/<-@^|])///(?!/)"},{"match":"(?<![!%\\\\&+-/<-@^|])//(.*)$","name":"comment.line.double-slash.fsharp"}]},"common_binding_definition":{"patterns":[{"include":"#comments"},{"include":"#attributes"},{"begin":"(:)\\\\s*(\\\\()\\\\s*((?:static |)member)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"keyword.symbol.fsharp"},"3":{"name":"keyword.fsharp"}},"comments":"SRTP syntax support","end":"(\\\\))\\\\s*((?=,)|(?==))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(\\\\^[\'.0-9_[:alpha:]]+)"},{"include":"#variables"},{"include":"#keywords"}]},{"begin":"(:)\\\\s*(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\)\\\\s*(([ \'.0-9?^_`[:alpha:]]*)))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"entity.name.type.fsharp"}},"patterns":[{"include":"#tuple_signature"}]},{"begin":"(:)\\\\s*(\\\\^[\'.0-9_[:alpha:]]+)\\\\s*(when)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"entity.name.type.fsharp"},"3":{"name":"keyword.fsharp"}},"end":"(?=:)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"match":"\\\\b(and|when|or)\\\\b","name":"keyword.fsharp"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"([\'.0-9^_[:alpha:]]+)"},{"match":"([()])","name":"keyword.symbol.fsharp"}]},{"captures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"entity.name.type.fsharp"},"4":{"name":"entity.name.type.fsharp"}},"match":"(:)\\\\s*([ \'.0-9?^_`[:alpha:]]+)(\\\\|\\\\s*(null))?"},{"captures":{"1":{"name":"keyword.symbol.arrow.fsharp"},"2":{"name":"keyword.symbol.fsharp"},"3":{"name":"entity.name.type.fsharp"}},"match":"(->)\\\\s*(\\\\()?\\\\s*([ \'.0-9?^_`[:alpha:]]+)*"},{"begin":"(\\\\*)\\\\s*(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\)\\\\s*(([ \'.0-9?^_`[:alpha:]]+))*)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"entity.name.type.fsharp"}},"patterns":[{"include":"#tuple_signature"}]},{"begin":"(\\\\*)(\\\\s*([ \'.0-9?^_`[:alpha:]]+))*","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"entity.name.type.fsharp"}},"end":"(?==)|(?=\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#tuple_signature"}]},{"begin":"(<+(?!\\\\s*\\\\)))","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"beginComment":"The group (?![[:space:]]*\\\\) is for protection against overload operator. static member (<)","end":"((?<!:)>|\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"endComment":"The group (?<!:) prevent us from stopping on :> when using SRTP synthax","patterns":[{"include":"#generic_declaration"}]},{"include":"#anonymous_record_declaration"},{"begin":"(\\\\{)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(})","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#record_signature"}]},{"include":"#definition"},{"include":"#variables"},{"include":"#keywords"}]},"common_declaration":{"patterns":[{"begin":"\\\\s*(->)\\\\s*([ \'.0-9^_`[:alpha:]]+)(<)","beginCaptures":{"1":{"name":"keyword.symbol.arrow.fsharp"},"2":{"name":"entity.name.type.fsharp"},"3":{"name":"keyword.symbol.fsharp"}},"end":"(>)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"([ \'.0-9^_`[:alpha:]]+)"},{"include":"#keywords"}]},{"captures":{"1":{"name":"keyword.symbol.arrow.fsharp"},"2":{"name":"entity.name.type.fsharp"}},"match":"\\\\s*(->)\\\\s*(?!with|get|set\\\\b)\\\\b([\'.0-9^_`\\\\w]+)"},{"include":"#anonymous_record_declaration"},{"begin":"(\\\\??)([ \'.0-9^_`[:alpha:]]+)\\\\s*(:)(\\\\s*([ \'.0-9?^_`[:alpha:]]+)(<))","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"variable.parameter.fsharp"},"3":{"name":"keyword.symbol.fsharp"},"4":{"name":"keyword.symbol.fsharp"},"5":{"name":"entity.name.type.fsharp"}},"end":"(>)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"([ \'.0-9^_`[:alpha:]]+)"},{"include":"#keywords"}]}]},"compiler_directives":{"patterns":[{"captures":{},"match":"\\\\s?(#(?:if|elif|elseif|else|endif|light|nowarn|warnon))","name":"keyword.control.directive.fsharp"}]},"constants":{"patterns":[{"match":"\\\\(\\\\)","name":"keyword.symbol.fsharp"},{"match":"\\\\b-?[0-9][0-9_]*((\\\\.(?!\\\\.)([0-9][0-9_]*([Ee][-+]??[0-9][0-9_]*)?)?)|([Ee][-+]??[0-9][0-9_]*))","name":"constant.numeric.float.fsharp"},{"match":"\\\\b(-?((0([Xx])\\\\h[_\\\\h]*)|(0([Oo])[0-7][0-7_]*)|(0([Bb])[01][01_]*)|([0-9][0-9_]*)))","name":"constant.numeric.integer.nativeint.fsharp"},{"match":"\\\\b(true|false)\\\\b","name":"constant.language.boolean.fsharp"},{"match":"\\\\b(null|void)\\\\b","name":"constant.other.fsharp"}]},"definition":{"patterns":[{"begin":"\\\\b(let mutable|static let mutable|static let|let inline|let|and inline|and|member val|member inline|static member inline|static member val|static member|default|member|override|let!)(\\\\s+rec|mutable)?(\\\\s+\\\\[<.*>])?\\\\s*(private|internal|public)?\\\\s+(\\\\[[^-=]*]|[_[:alpha:]]([.0-9_[:alpha:]]+)*|``[_[:alpha:]]([.0-9_`[:alpha:]\\\\s]+|(?<=,)\\\\s)*)?","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"keyword.fsharp"},"3":{"name":"support.function.attribute.fsharp"},"4":{"name":"storage.modifier.fsharp"},"5":{"name":"variable.fsharp"}},"end":"\\\\s*((with(?: inline|))\\\\b|(=|\\\\n+=|(?<==)))","endCaptures":{"2":{"name":"keyword.fsharp"},"3":{"name":"keyword.symbol.fsharp"}},"name":"binding.fsharp","patterns":[{"include":"#common_binding_definition"}]},{"begin":"\\\\b(use!??|and!??)\\\\s+(\\\\[[^-=]*]|[_[:alpha:]]([.0-9_[:alpha:]]+)*|``[_[:alpha:]]([.0-9_`[:alpha:]\\\\s]+|(?<=,)\\\\s)*)?","beginCaptures":{"1":{"name":"keyword.fsharp"}},"end":"\\\\s*(=)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"name":"binding.fsharp","patterns":[{"include":"#common_binding_definition"}]},{"begin":"(?<=with|and)\\\\s*\\\\b(([gs]et)\\\\s*(?=\\\\())(\\\\[[^-=]*]|[_[:alpha:]]([.0-9_[:alpha:]]+)*|``[_[:alpha:]]([.0-9_`[:alpha:]\\\\s]+|(?<=,)\\\\s)*)?","beginCaptures":{"4":{"name":"variable.fsharp"}},"end":"\\\\s*(=|\\\\n+=|(?<==))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"name":"binding.fsharp","patterns":[{"include":"#common_binding_definition"}]},{"begin":"\\\\b(static val mutable|val mutable|val inline|val)(\\\\s+rec|mutable)?(\\\\s+\\\\[<.*>])?\\\\s*(private|internal|public)?\\\\s+(\\\\[[^-=]*]|[_[:alpha:]]([,.0-9_[:alpha:]]+)*|``[_[:alpha:]]([,.0-9_`[:alpha:]\\\\s]+|(?<=,)\\\\s)*)?","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"keyword.fsharp"},"3":{"name":"support.function.attribute.fsharp"},"4":{"name":"storage.modifier.fsharp"},"5":{"name":"variable.fsharp"}},"end":"\\\\n$","name":"binding.fsharp","patterns":[{"include":"#common_binding_definition"}]},{"begin":"\\\\b(new)\\\\b\\\\s+(\\\\()","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"name":"binding.fsharp","patterns":[{"include":"#common_binding_definition"}]}]},"double_tick":{"patterns":[{"captures":{"1":{"name":"string.quoted.single.fsharp"},"2":{"name":"variable.other.binding.fsharp"},"3":{"name":"string.quoted.single.fsharp"}},"match":"(``)([^`]*)(``)","name":"variable.other.binding.fsharp"}]},"du_declaration":{"patterns":[{"begin":"\\\\b(of)\\\\b","beginCaptures":{"1":{"name":"keyword.fsharp"}},"end":"$|(\\\\|)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"name":"du_declaration.fsharp","patterns":[{"include":"#comments"},{"captures":{"1":{"name":"variable.parameter.fsharp"},"2":{"name":"keyword.symbol.fsharp"},"3":{"name":"entity.name.type.fsharp"}},"match":"([\'.0-9<>^_`[:alpha:]]+|``[ \'.0-9<>^_[:alpha:]]+``)\\\\s*(:)\\\\s*([\'.0-9<>^_`[:alpha:]]+|``[ \'.0-9<>^_[:alpha:]]+``)"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(``([ \'.0-9^_[:alpha:]]+)``|[\'.0-9^_`[:alpha:]]+)"},{"include":"#anonymous_record_declaration"},{"include":"#keywords"}]}]},"generic_declaration":{"patterns":[{"begin":"(:)\\\\s*(\\\\()\\\\s*((?:static |)member)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"keyword.symbol.fsharp"},"3":{"name":"keyword.fsharp"}},"comments":"SRTP syntax support","end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#member_declaration"}]},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(([\'^])[\'.0-9_[:alpha:]]+)"},{"include":"#variables"},{"include":"#keywords"}]},{"match":"\\\\b(private|to|public|internal|function|yield!?|class|exception|match|delegate|of|new|in|as|if|then|else|elif|for|begin|end|inherit|do|let!|return!?|interface|with|abstract|enum|member|try|finally|and|when|or|use!??|struct|while|mutable|assert|base|done|downcast|downto|extern|fixed|global|lazy|upcast|not)(?!\')\\\\b","name":"keyword.fsharp"},{"match":":","name":"keyword.symbol.fsharp"},{"include":"#constants"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(([\'^])[\'.0-9_[:alpha:]]+)"},{"begin":"(<)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(>)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(([\'^])[\'.0-9_[:alpha:]]+)"},{"include":"#tuple_signature"},{"include":"#generic_declaration"}]},{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(([ \'.0-9?^_`[:alpha:]]+))+"},{"include":"#tuple_signature"}]},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"comments":"Here we need the \\\\w modifier in order to check that the words are allowed","match":"(?!when|and|or\\\\b)\\\\b([\'.0-9^_`\\\\w]+)"},{"captures":{"1":{"name":"keyword.symbol.fsharp"}},"comments":"Prevent captures of `|>` as a keyword when defining custom operator like `<|>`","match":"(\\\\|)"},{"include":"#keywords"}]},"keywords":{"patterns":[{"match":"\\\\b(private|public|internal)\\\\b","name":"storage.modifier"},{"match":"\\\\b(private|to|public|internal|function|class|exception|delegate|of|new|as|begin|end|inherit|let!|interface|abstract|enum|member|and|when|or|use!??|struct|mutable|assert|base|done|downcast|downto|extern|fixed|global|lazy|upcast|not)(?!\')\\\\b","name":"keyword.fsharp"},{"match":"\\\\b(match|yield!??|with|if|then|else|elif|for|in|return!?|try|finally|while|do)(?!\')\\\\b","name":"keyword.control"},{"match":"(->|<-)","name":"keyword.symbol.arrow.fsharp"},{"match":"[.?]*(&&&|\\\\|\\\\|\\\\||\\\\^\\\\^\\\\^|~~~|~\\\\+|~-|<<<|>>>|\\\\|>|:>|:\\\\?>|[]:;\\\\[]|<>|[=@]|\\\\|\\\\||&&|[%\\\\&_{|}]|\\\\.\\\\.|[!*-\\\\-/>^]|>=|>>|<=??|[()]|<<)[.?]*","name":"keyword.symbol.fsharp"}]},"member_declaration":{"patterns":[{"include":"#comments"},{"include":"#common_declaration"},{"begin":"(:)\\\\s*(\\\\()\\\\s*((?:static |)member)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"keyword.symbol.fsharp"},"3":{"name":"keyword.fsharp"}},"comments":"SRTP syntax support","end":"(\\\\))\\\\s*((?=,)|(?==))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#member_declaration"}]},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(\\\\^[\'.0-9_[:alpha:]]+)"},{"include":"#variables"},{"include":"#keywords"}]},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(\\\\^[\'.0-9_[:alpha:]]+)"},{"match":"\\\\b(and|when|or)\\\\b","name":"keyword.fsharp"},{"match":"([()])","name":"keyword.symbol.fsharp"},{"captures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"variable.parameter.fsharp"},"3":{"name":"keyword.symbol.fsharp"},"4":{"name":"entity.name.type.fsharp"},"7":{"name":"entity.name.type.fsharp"}},"match":"(\\\\??)([\'.0-9^_`[:alpha:]]+|``[ \',.0-:^_`[:alpha:]]+``)\\\\s*(:?)(\\\\s*([ \'.0-9<>?_`[:alpha:]]+))?(\\\\|\\\\s*(null))?"},{"include":"#keywords"}]},"modules":{"patterns":[{"begin":"\\\\b(?:(namespace global)|(namespace|module)\\\\s*(public|internal|private|rec)?\\\\s+([`|[:alpha:]][ \'.0-9_[:alpha:]]*))","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"keyword.fsharp"},"3":{"name":"storage.modifier.fsharp"},"4":{"name":"entity.name.section.fsharp"}},"end":"(\\\\s?=|\\\\s|$)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"name":"entity.name.section.fsharp","patterns":[{"captures":{"1":{"name":"punctuation.separator.namespace-reference.fsharp"},"2":{"name":"entity.name.section.fsharp"}},"match":"(\\\\.)([A-Z][\'0-9_[:alpha:]]*)","name":"entity.name.section.fsharp"}]},{"begin":"\\\\b(open(?: type|))\\\\s+([`|[:alpha:]][\'0-9_[:alpha:]]*)(?=(\\\\.[A-Z][0-9_[:alpha:]]*)*)","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"entity.name.section.fsharp"}},"end":"(\\\\s|$)","name":"namespace.open.fsharp","patterns":[{"captures":{"1":{"name":"punctuation.separator.namespace-reference.fsharp"},"2":{"name":"entity.name.section.fsharp"}},"match":"(\\\\.)(\\\\p{alpha}[\'0-9_[:alpha:]]*)","name":"entity.name.section.fsharp"},{"include":"#comments"}]},{"begin":"^\\\\s*(module)\\\\s+([A-Z][\'0-9_[:alpha:]]*)\\\\s*(=)\\\\s*([A-Z][\'0-9_[:alpha:]]*)","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"entity.name.type.namespace.fsharp"},"3":{"name":"keyword.symbol.fsharp"},"4":{"name":"entity.name.section.fsharp"}},"end":"(\\\\s|$)","name":"namespace.alias.fsharp","patterns":[{"captures":{"1":{"name":"punctuation.separator.namespace-reference.fsharp"},"2":{"name":"entity.name.section.fsharp"}},"match":"(\\\\.)([A-Z][\'0-9_[:alpha:]]*)","name":"entity.name.section.fsharp"}]}]},"record_declaration":{"patterns":[{"begin":"(\\\\{)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(?<=})","patterns":[{"include":"#comments"},{"begin":"(((mutable)\\\\s\\\\p{alpha}+)|[\'.0-9<>^_`[:alpha:]]*)\\\\s*((?<!:):(?!:))\\\\s*","beginCaptures":{"3":{"name":"keyword.fsharp"},"4":{"name":"keyword.symbol.fsharp"}},"end":"$|([;}])","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#comments"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"([ \'0-9^_`[:alpha:]]+)"},{"include":"#keywords"}]},{"include":"#compiler_directives"},{"include":"#constants"},{"include":"#strings"},{"include":"#chars"},{"include":"#double_tick"},{"include":"#definition"},{"include":"#attributes"},{"include":"#anonymous_functions"},{"include":"#keywords"},{"include":"#cexprs"},{"include":"#text"}]}]},"record_signature":{"patterns":[{"captures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"variable.parameter.fsharp"}},"match":"[ \'0-9^_`[:alpha:]]+(=)([ \'0-9^_`[:alpha:]]+)"},{"begin":"(\\\\{)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(})","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"variable.parameter.fsharp"}},"match":"[ \'0-9^_`[:alpha:]]+(=)([ \'0-9^_`[:alpha:]]+)"},{"include":"#record_signature"}]},{"include":"#keywords"}]},"records":{"patterns":[{"begin":"\\\\b(type)\\\\s+(private|internal|public)?\\\\s*","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"storage.modifier.fsharp"}},"end":"\\\\s*((with)|((as)\\\\s+([\'0-9[:alpha:]]+))|(=)|[\\\\n=]|(\\\\(\\\\)))","endCaptures":{"2":{"name":"keyword.fsharp"},"3":{"name":"keyword.fsharp"},"4":{"name":"keyword.fsharp"},"5":{"name":"variable.parameter.fsharp"},"6":{"name":"keyword.symbol.fsharp"},"7":{"name":"keyword.symbol.fsharp"}},"name":"record.fsharp","patterns":[{"include":"#comments"},{"include":"#attributes"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"([\'.0-9^_[:alpha:]]+|``[ \',.0-:^_`[:alpha:]]+``)"},{"begin":"(<)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"((?<!:)>)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(([\'^])``[ ,.0-:^_`[:alpha:]]+``|([\'^])[.0-:^_`[:alpha:]]+)"},{"match":"\\\\b(interface|with|abstract|and|when|or|not|struct|equality|comparison|unmanaged|delegate|enum)\\\\b","name":"keyword.fsharp"},{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"keyword.fsharp"}},"match":"(static member|member|new)"},{"include":"#common_binding_definition"}]},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"comments":"Here we need the \\\\w modifier in order to check that the words isn\'t blacklisted","match":"([\'.0-9^_`\\\\w]+)"},{"include":"#keywords"}]},{"captures":{"1":{"name":"storage.modifier.fsharp"}},"match":"\\\\s*(private|internal|public)"},{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"\\\\s*(?=(=)|[\\\\n=]|(\\\\(\\\\))|(as))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#member_declaration"}]},{"include":"#keywords"}]}]},"string_formatter":{"patterns":[{"captures":{"1":{"name":"keyword.format.specifier.fsharp"}},"match":"(%0?-?(\\\\d+)?(([at])|(\\\\.\\\\d+)?([EFGMefg])|([Xbcdiosux])|([Obs])|(\\\\+?A)))","name":"entity.name.type.format.specifier.fsharp"}]},"strings":{"patterns":[{"begin":"(?=[^\\\\\\\\])(@\\")","beginCaptures":{"1":{"name":"punctuation.definition.string.begin.fsharp"}},"end":"(\\")(?!\\")","endCaptures":{"1":{"name":"punctuation.definition.string.end.fsharp"}},"name":"string.quoted.literal.fsharp","patterns":[{"match":"\\"(\\")","name":"constant.character.string.escape.fsharp"}]},{"begin":"(?=[^\\\\\\\\])(\\"\\"\\")","beginCaptures":{"1":{"name":"punctuation.definition.string.begin.fsharp"}},"end":"(\\"\\"\\")","endCaptures":{"1":{"name":"punctuation.definition.string.end.fsharp"}},"name":"string.quoted.triple.fsharp","patterns":[{"include":"#string_formatter"}]},{"begin":"(?=[^\\\\\\\\])(\\")","beginCaptures":{"1":{"name":"punctuation.definition.string.begin.fsharp"}},"end":"(\\")","endCaptures":{"1":{"name":"punctuation.definition.string.end.fsharp"}},"name":"string.quoted.double.fsharp","patterns":[{"match":"\\\\\\\\$[\\\\t ]*","name":"punctuation.separator.string.ignore-eol.fsharp"},{"match":"\\\\\\\\([\\"\'\\\\\\\\abfnrtv]|([01][0-9][0-9]|2[0-4][0-9]|25[0-5])|(x\\\\h{2})|(u\\\\h{4})|(U00(0\\\\h|10)\\\\h{4}))","name":"constant.character.string.escape.fsharp"},{"match":"\\\\\\\\(([0-9]{1,3})|(x\\\\S{0,2})|(u\\\\S{0,4})|(U\\\\S{0,8})|\\\\S)","name":"invalid.illegal.character.string.fsharp"},{"include":"#string_formatter"}]}]},"strp_inlined":{"patterns":[{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#strp_inlined_body"}]}]},"strp_inlined_body":{"patterns":[{"include":"#comments"},{"include":"#anonymous_functions"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(\\\\^[\'.0-9_[:alpha:]]+)"},{"match":"\\\\b(and|when|or)\\\\b","name":"keyword.fsharp"},{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#strp_inlined_body"}]},{"captures":{"1":{"name":"keyword.fsharp"},"2":{"name":"variable.fsharp"},"3":{"name":"keyword.symbol.fsharp"}},"match":"((?:static |)member)\\\\s*([\'.0-9<>^_`[:alpha:]]+|``[ \'.0-9<>^_[:alpha:]]+``)\\\\s*(:)"},{"include":"#compiler_directives"},{"include":"#constants"},{"include":"#strings"},{"include":"#chars"},{"include":"#double_tick"},{"include":"#keywords"},{"include":"#text"},{"include":"#definition"},{"include":"#attributes"},{"include":"#keywords"},{"include":"#cexprs"},{"include":"#text"}]},"text":{"patterns":[{"match":"\\\\\\\\","name":"text.fsharp"}]},"tuple_signature":{"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(([ \'.0-9?^_`[:alpha:]]+))+"},{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(([ \'.0-9?^_`[:alpha:]]+))+"},{"include":"#tuple_signature"}]},{"include":"#keywords"}]},"variables":{"patterns":[{"match":"\\\\(\\\\)","name":"keyword.symbol.fsharp"},{"captures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"variable.parameter.fsharp"}},"match":"(\\\\??)(``[ \',.0-:^_`[:alpha:]]+``|(?!private|struct\\\\b)\\\\b[ \'.0-9<>^_`\\\\w[:alpha:]]+)"}]}},"scopeName":"source.fsharp","embeddedLangs":["markdown"],"aliases":["f#","fs"]}')),f=[...d.default,e]}};
|
|
1
|
+
"use strict";exports.id=48180,exports.ids=[48180],exports.modules={25799:(a,b,c)=>{c.r(b),c.d(b,{default:()=>f});var d=c(19737);let e=Object.freeze(JSON.parse('{"displayName":"F#","name":"fsharp","patterns":[{"include":"#compiler_directives"},{"include":"#comments"},{"include":"#constants"},{"include":"#strings"},{"include":"#chars"},{"include":"#double_tick"},{"include":"#definition"},{"include":"#abstract_definition"},{"include":"#attributes"},{"include":"#modules"},{"include":"#anonymous_functions"},{"include":"#du_declaration"},{"include":"#record_declaration"},{"include":"#records"},{"include":"#strp_inlined"},{"include":"#keywords"},{"include":"#cexprs"},{"include":"#text"}],"repository":{"abstract_definition":{"begin":"\\\\b(static\\\\s+)?(abstract)\\\\s+(member)?(\\\\s+\\\\[<.*>])?\\\\s*([,.0-9_`[:alpha:]\\\\s]+)(<)?","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"keyword.fsharp"},"3":{"name":"keyword.fsharp"},"4":{"name":"support.function.attribute.fsharp"},"5":{"name":"keyword.symbol.fsharp"}},"end":"\\\\s*(with)\\\\b|=|$","endCaptures":{"1":{"name":"keyword.fsharp"}},"name":"abstract.definition.fsharp","patterns":[{"include":"#comments"},{"include":"#common_declaration"},{"captures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"variable.parameter.fsharp"},"3":{"name":"keyword.symbol.fsharp"},"4":{"name":"entity.name.type.fsharp"}},"match":"(\\\\??)([ \'.0-9^_`[:alpha:]]+)\\\\s*(:)((?!with\\\\b)\\\\b([ \'.0-9^_`\\\\w]+))?"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"comments":"Here we need the \\\\w modifier in order to check that the words isn\'t blacklisted","match":"(?!with|get|set\\\\b)\\\\s*([\'.0-9^_`\\\\w]+)"},{"include":"#keywords"}]},"anonymous_functions":{"patterns":[{"begin":"\\\\b(fun)\\\\b","beginCaptures":{"1":{"name":"keyword.fsharp"}},"end":"(->)","endCaptures":{"1":{"name":"keyword.symbol.arrow.fsharp"}},"name":"function.anonymous","patterns":[{"include":"#comments"},{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"\\\\s*(?=(->))","endCaptures":{"1":{"name":"keyword.symbol.arrow.fsharp"}},"patterns":[{"include":"#member_declaration"}]},{"include":"#variables"}]}]},"anonymous_record_declaration":{"begin":"(\\\\{\\\\|)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\|})","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"keyword.symbol.fsharp"}},"match":"[ \'0-9^_`[:alpha:]]+(:)"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"([ \'0-9^_`[:alpha:]]+)"},{"include":"#anonymous_record_declaration"},{"include":"#keywords"}]},"attributes":{"patterns":[{"begin":"\\\\[<","end":">?]","name":"support.function.attribute.fsharp","patterns":[{"include":"$self"}]}]},"cexprs":{"patterns":[{"captures":{"0":{"name":"keyword.fsharp"}},"match":"\\\\b(async|seq|promise|task|maybe|asyncMaybe|controller|scope|application|pipeline)(?=\\\\s*\\\\{)","name":"cexpr.fsharp"}]},"chars":{"patterns":[{"captures":{"1":{"name":"string.quoted.single.fsharp"}},"match":"(\'\\\\\\\\?.\')","name":"char.fsharp"}]},"comments":{"patterns":[{"begin":"^\\\\s*(\\\\(\\\\*\\\\*(?!\\\\)))((?!\\\\*\\\\)).)*$","beginCaptures":{"1":{"name":"comment.block.fsharp"}},"name":"comment.block.markdown.fsharp","patterns":[{"include":"text.html.markdown"}],"while":"^(?!\\\\s*(\\\\*)+\\\\)\\\\s*$)","whileCaptures":{"1":{"name":"comment.block.fsharp"}}},{"begin":"(\\\\(\\\\*(?!\\\\)))","beginCaptures":{"1":{"name":"comment.block.fsharp"}},"end":"(\\\\*+\\\\))","endCaptures":{"1":{"name":"comment.block.fsharp"}},"name":"comment.block.fsharp","patterns":[{"comments":"Capture // when inside of (* *) like that the rule which capture comments starting by // is not trigger. See https://github.com/ionide/ionide-fsgrammar/issues/155","match":"//","name":"fast-capture.comment.line.double-slash.fsharp"},{"comments":"Capture (*) when inside of (* *) so that it doesn\'t prematurely end the comment block.","match":"\\\\(\\\\*\\\\)","name":"fast-capture.comment.line.mul-operator.fsharp"},{"include":"#comments"}]},{"captures":{"1":{"name":"comment.block.fsharp"}},"match":"((?<!\\\\()(\\\\*)+\\\\))","name":"comment.block.markdown.fsharp.end"},{"begin":"(?<![!%\\\\&+-/<-@^|])///(?!/)","name":"comment.line.markdown.fsharp","patterns":[{"include":"text.html.markdown"}],"while":"(?<![!%\\\\&+-/<-@^|])///(?!/)"},{"match":"(?<![!%\\\\&+-/<-@^|])//(.*)$","name":"comment.line.double-slash.fsharp"}]},"common_binding_definition":{"patterns":[{"include":"#comments"},{"include":"#attributes"},{"begin":"(:)\\\\s*(\\\\()\\\\s*((?:static |)member)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"keyword.symbol.fsharp"},"3":{"name":"keyword.fsharp"}},"comments":"SRTP syntax support","end":"(\\\\))\\\\s*((?=,)|(?==))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(\\\\^[\'.0-9_[:alpha:]]+)"},{"include":"#variables"},{"include":"#keywords"}]},{"begin":"(:)\\\\s*(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\)\\\\s*(([ \'.0-9?^_`[:alpha:]]*)))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"entity.name.type.fsharp"}},"patterns":[{"include":"#tuple_signature"}]},{"begin":"(:)\\\\s*(\\\\^[\'.0-9_[:alpha:]]+)\\\\s*(when)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"entity.name.type.fsharp"},"3":{"name":"keyword.fsharp"}},"end":"(?=:)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"match":"\\\\b(and|when|or)\\\\b","name":"keyword.fsharp"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"([\'.0-9^_[:alpha:]]+)"},{"match":"([()])","name":"keyword.symbol.fsharp"}]},{"captures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"entity.name.type.fsharp"},"4":{"name":"entity.name.type.fsharp"}},"match":"(:)\\\\s*([ \'.0-9?^_`[:alpha:]]+)(\\\\|\\\\s*(null))?"},{"captures":{"1":{"name":"keyword.symbol.arrow.fsharp"},"2":{"name":"keyword.symbol.fsharp"},"3":{"name":"entity.name.type.fsharp"}},"match":"(->)\\\\s*(\\\\()?\\\\s*([ \'.0-9?^_`[:alpha:]]+)*"},{"begin":"(\\\\*)\\\\s*(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\)\\\\s*(([ \'.0-9?^_`[:alpha:]]+))*)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"entity.name.type.fsharp"}},"patterns":[{"include":"#tuple_signature"}]},{"begin":"(\\\\*)(\\\\s*([ \'.0-9?^_`[:alpha:]]+))*","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"entity.name.type.fsharp"}},"end":"(?==)|(?=\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#tuple_signature"}]},{"begin":"(<+(?!\\\\s*\\\\)))","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"beginComment":"The group (?![[:space:]]*\\\\) is for protection against overload operator. static member (<)","end":"((?<!:)>|\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"endComment":"The group (?<!:) prevent us from stopping on :> when using SRTP synthax","patterns":[{"include":"#generic_declaration"}]},{"include":"#anonymous_record_declaration"},{"begin":"(\\\\{)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(})","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#record_signature"}]},{"include":"#definition"},{"include":"#variables"},{"include":"#keywords"}]},"common_declaration":{"patterns":[{"begin":"\\\\s*(->)\\\\s*([ \'.0-9^_`[:alpha:]]+)(<)","beginCaptures":{"1":{"name":"keyword.symbol.arrow.fsharp"},"2":{"name":"entity.name.type.fsharp"},"3":{"name":"keyword.symbol.fsharp"}},"end":"(>)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"([ \'.0-9^_`[:alpha:]]+)"},{"include":"#keywords"}]},{"captures":{"1":{"name":"keyword.symbol.arrow.fsharp"},"2":{"name":"entity.name.type.fsharp"}},"match":"\\\\s*(->)\\\\s*(?!with|get|set\\\\b)\\\\b([\'.0-9^_`\\\\w]+)"},{"include":"#anonymous_record_declaration"},{"begin":"(\\\\??)([ \'.0-9^_`[:alpha:]]+)\\\\s*(:)(\\\\s*([ \'.0-9?^_`[:alpha:]]+)(<))","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"variable.parameter.fsharp"},"3":{"name":"keyword.symbol.fsharp"},"4":{"name":"keyword.symbol.fsharp"},"5":{"name":"entity.name.type.fsharp"}},"end":"(>)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"([ \'.0-9^_`[:alpha:]]+)"},{"include":"#keywords"}]}]},"compiler_directives":{"patterns":[{"captures":{},"match":"\\\\s?(#(?:if|elif|elseif|else|endif|light|nowarn|warnon))","name":"keyword.control.directive.fsharp"}]},"constants":{"patterns":[{"match":"\\\\(\\\\)","name":"keyword.symbol.fsharp"},{"match":"\\\\b-?[0-9][0-9_]*((\\\\.(?!\\\\.)([0-9][0-9_]*([Ee][-+]??[0-9][0-9_]*)?)?)|([Ee][-+]??[0-9][0-9_]*))","name":"constant.numeric.float.fsharp"},{"match":"\\\\b(-?((0([Xx])\\\\h[_\\\\h]*)|(0([Oo])[0-7][0-7_]*)|(0([Bb])[01][01_]*)|([0-9][0-9_]*)))","name":"constant.numeric.integer.nativeint.fsharp"},{"match":"\\\\b(true|false)\\\\b","name":"constant.language.boolean.fsharp"},{"match":"\\\\b(null|void)\\\\b","name":"constant.other.fsharp"}]},"definition":{"patterns":[{"begin":"\\\\b(let mutable|static let mutable|static let|let inline|let|and inline|and|member val|member inline|static member inline|static member val|static member|default|member|override|let!)(\\\\s+rec|mutable)?(\\\\s+\\\\[<.*>])?\\\\s*(private|internal|public)?\\\\s+(\\\\[[^-=]*]|[_[:alpha:]]([.0-9_[:alpha:]]+)*|``[_[:alpha:]]([.0-9_`[:alpha:]\\\\s]+|(?<=,)\\\\s)*)?","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"keyword.fsharp"},"3":{"name":"support.function.attribute.fsharp"},"4":{"name":"storage.modifier.fsharp"},"5":{"name":"variable.fsharp"}},"end":"\\\\s*((with(?: inline|))\\\\b|(=|\\\\n+=|(?<==)))","endCaptures":{"2":{"name":"keyword.fsharp"},"3":{"name":"keyword.symbol.fsharp"}},"name":"binding.fsharp","patterns":[{"include":"#common_binding_definition"}]},{"begin":"\\\\b(use!??|and!??)\\\\s+(\\\\[[^-=]*]|[_[:alpha:]]([.0-9_[:alpha:]]+)*|``[_[:alpha:]]([.0-9_`[:alpha:]\\\\s]+|(?<=,)\\\\s)*)?","beginCaptures":{"1":{"name":"keyword.fsharp"}},"end":"\\\\s*(=)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"name":"binding.fsharp","patterns":[{"include":"#common_binding_definition"}]},{"begin":"(?<=with|and)\\\\s*\\\\b(([gs]et)\\\\s*(?=\\\\())(\\\\[[^-=]*]|[_[:alpha:]]([.0-9_[:alpha:]]+)*|``[_[:alpha:]]([.0-9_`[:alpha:]\\\\s]+|(?<=,)\\\\s)*)?","beginCaptures":{"4":{"name":"variable.fsharp"}},"end":"\\\\s*(=|\\\\n+=|(?<==))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"name":"binding.fsharp","patterns":[{"include":"#common_binding_definition"}]},{"begin":"\\\\b(static val mutable|val mutable|val inline|val)(\\\\s+rec|mutable)?(\\\\s+\\\\[<.*>])?\\\\s*(private|internal|public)?\\\\s+(\\\\[[^-=]*]|[_[:alpha:]]([,.0-9_[:alpha:]]+)*|``[_[:alpha:]]([,.0-9_`[:alpha:]\\\\s]+|(?<=,)\\\\s)*)?","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"keyword.fsharp"},"3":{"name":"support.function.attribute.fsharp"},"4":{"name":"storage.modifier.fsharp"},"5":{"name":"variable.fsharp"}},"end":"\\\\n$","name":"binding.fsharp","patterns":[{"include":"#common_binding_definition"}]},{"begin":"\\\\b(new)\\\\b\\\\s+(\\\\()","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"name":"binding.fsharp","patterns":[{"include":"#common_binding_definition"}]}]},"double_tick":{"patterns":[{"captures":{"1":{"name":"string.quoted.single.fsharp"},"2":{"name":"variable.other.binding.fsharp"},"3":{"name":"string.quoted.single.fsharp"}},"match":"(``)([^`]*)(``)","name":"variable.other.binding.fsharp"}]},"du_declaration":{"patterns":[{"begin":"\\\\b(of)\\\\b","beginCaptures":{"1":{"name":"keyword.fsharp"}},"end":"$|(\\\\|)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"name":"du_declaration.fsharp","patterns":[{"include":"#comments"},{"captures":{"1":{"name":"variable.parameter.fsharp"},"2":{"name":"keyword.symbol.fsharp"},"3":{"name":"entity.name.type.fsharp"}},"match":"([\'.0-9<>^_`[:alpha:]]+|``[ \'.0-9<>^_[:alpha:]]+``)\\\\s*(:)\\\\s*([\'.0-9<>^_`[:alpha:]]+|``[ \'.0-9<>^_[:alpha:]]+``)"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(``([ \'.0-9^_[:alpha:]]+)``|[\'.0-9^_`[:alpha:]]+)"},{"include":"#anonymous_record_declaration"},{"include":"#keywords"}]}]},"generic_declaration":{"patterns":[{"begin":"(:)\\\\s*(\\\\()\\\\s*((?:static |)member)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"keyword.symbol.fsharp"},"3":{"name":"keyword.fsharp"}},"comments":"SRTP syntax support","end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#member_declaration"}]},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(([\'^])[\'.0-9_[:alpha:]]+)"},{"include":"#variables"},{"include":"#keywords"}]},{"match":"\\\\b(private|to|public|internal|function|yield!?|class|exception|match|delegate|of|new|in|as|if|then|else|elif|for|begin|end|inherit|do|let!|return!?|interface|with|abstract|enum|member|try|finally|and|when|or|use!??|struct|while|mutable|assert|base|done|downcast|downto|extern|fixed|global|lazy|upcast|not)(?!\')\\\\b","name":"keyword.fsharp"},{"match":":","name":"keyword.symbol.fsharp"},{"include":"#constants"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(([\'^])[\'.0-9_[:alpha:]]+)"},{"begin":"(<)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(>)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(([\'^])[\'.0-9_[:alpha:]]+)"},{"include":"#tuple_signature"},{"include":"#generic_declaration"}]},{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(([ \'.0-9?^_`[:alpha:]]+))+"},{"include":"#tuple_signature"}]},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"comments":"Here we need the \\\\w modifier in order to check that the words are allowed","match":"(?!when|and|or\\\\b)\\\\b([\'.0-9^_`\\\\w]+)"},{"captures":{"1":{"name":"keyword.symbol.fsharp"}},"comments":"Prevent captures of `|>` as a keyword when defining custom operator like `<|>`","match":"(\\\\|)"},{"include":"#keywords"}]},"keywords":{"patterns":[{"match":"\\\\b(private|public|internal)\\\\b","name":"storage.modifier"},{"match":"\\\\b(private|to|public|internal|function|class|exception|delegate|of|new|as|begin|end|inherit|let!|interface|abstract|enum|member|and|when|or|use!??|struct|mutable|assert|base|done|downcast|downto|extern|fixed|global|lazy|upcast|not)(?!\')\\\\b","name":"keyword.fsharp"},{"match":"\\\\b(match|yield!??|with|if|then|else|elif|for|in|return!?|try|finally|while|do)(?!\')\\\\b","name":"keyword.control"},{"match":"(->|<-)","name":"keyword.symbol.arrow.fsharp"},{"match":"[.?]*(&&&|\\\\|\\\\|\\\\||\\\\^\\\\^\\\\^|~~~|~\\\\+|~-|<<<|>>>|\\\\|>|:>|:\\\\?>|[]:;\\\\[]|<>|[=@]|\\\\|\\\\||&&|[%\\\\&_{|}]|\\\\.\\\\.|[!*-\\\\-/>^]|>=|>>|<=??|[()]|<<)[.?]*","name":"keyword.symbol.fsharp"}]},"member_declaration":{"patterns":[{"include":"#comments"},{"include":"#common_declaration"},{"begin":"(:)\\\\s*(\\\\()\\\\s*((?:static |)member)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"keyword.symbol.fsharp"},"3":{"name":"keyword.fsharp"}},"comments":"SRTP syntax support","end":"(\\\\))\\\\s*((?=,)|(?==))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#member_declaration"}]},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(\\\\^[\'.0-9_[:alpha:]]+)"},{"include":"#variables"},{"include":"#keywords"}]},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(\\\\^[\'.0-9_[:alpha:]]+)"},{"match":"\\\\b(and|when|or)\\\\b","name":"keyword.fsharp"},{"match":"([()])","name":"keyword.symbol.fsharp"},{"captures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"variable.parameter.fsharp"},"3":{"name":"keyword.symbol.fsharp"},"4":{"name":"entity.name.type.fsharp"},"7":{"name":"entity.name.type.fsharp"}},"match":"(\\\\??)([\'.0-9^_`[:alpha:]]+|``[ \',.0-:^_`[:alpha:]]+``)\\\\s*(:?)(\\\\s*([ \'.0-9<>?_`[:alpha:]]+))?(\\\\|\\\\s*(null))?"},{"include":"#keywords"}]},"modules":{"patterns":[{"begin":"\\\\b(?:(namespace global)|(namespace|module)\\\\s*(public|internal|private|rec)?\\\\s+([`|[:alpha:]][ \'.0-9_[:alpha:]]*))","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"keyword.fsharp"},"3":{"name":"storage.modifier.fsharp"},"4":{"name":"entity.name.section.fsharp"}},"end":"(\\\\s?=|\\\\s|$)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"name":"entity.name.section.fsharp","patterns":[{"captures":{"1":{"name":"punctuation.separator.namespace-reference.fsharp"},"2":{"name":"entity.name.section.fsharp"}},"match":"(\\\\.)([A-Z][\'0-9_[:alpha:]]*)","name":"entity.name.section.fsharp"}]},{"begin":"\\\\b(open(?: type|))\\\\s+([`|[:alpha:]][\'0-9_[:alpha:]]*)(?=(\\\\.[A-Z][0-9_[:alpha:]]*)*)","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"entity.name.section.fsharp"}},"end":"(\\\\s|$)","name":"namespace.open.fsharp","patterns":[{"captures":{"1":{"name":"punctuation.separator.namespace-reference.fsharp"},"2":{"name":"entity.name.section.fsharp"}},"match":"(\\\\.)(\\\\p{alpha}[\'0-9_[:alpha:]]*)","name":"entity.name.section.fsharp"},{"include":"#comments"}]},{"begin":"^\\\\s*(module)\\\\s+([A-Z][\'0-9_[:alpha:]]*)\\\\s*(=)\\\\s*([A-Z][\'0-9_[:alpha:]]*)","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"entity.name.type.namespace.fsharp"},"3":{"name":"keyword.symbol.fsharp"},"4":{"name":"entity.name.section.fsharp"}},"end":"(\\\\s|$)","name":"namespace.alias.fsharp","patterns":[{"captures":{"1":{"name":"punctuation.separator.namespace-reference.fsharp"},"2":{"name":"entity.name.section.fsharp"}},"match":"(\\\\.)([A-Z][\'0-9_[:alpha:]]*)","name":"entity.name.section.fsharp"}]}]},"record_declaration":{"patterns":[{"begin":"(\\\\{)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(?<=})","patterns":[{"include":"#comments"},{"begin":"(((mutable)\\\\s\\\\p{alpha}+)|[\'.0-9<>^_`[:alpha:]]*)\\\\s*((?<!:):(?!:))\\\\s*","beginCaptures":{"3":{"name":"keyword.fsharp"},"4":{"name":"keyword.symbol.fsharp"}},"end":"$|([;}])","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#comments"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"([ \'0-9^_`[:alpha:]]+)"},{"include":"#keywords"}]},{"include":"#compiler_directives"},{"include":"#constants"},{"include":"#strings"},{"include":"#chars"},{"include":"#double_tick"},{"include":"#definition"},{"include":"#attributes"},{"include":"#anonymous_functions"},{"include":"#keywords"},{"include":"#cexprs"},{"include":"#text"}]}]},"record_signature":{"patterns":[{"captures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"variable.parameter.fsharp"}},"match":"[ \'0-9^_`[:alpha:]]+(=)([ \'0-9^_`[:alpha:]]+)"},{"begin":"(\\\\{)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(})","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"variable.parameter.fsharp"}},"match":"[ \'0-9^_`[:alpha:]]+(=)([ \'0-9^_`[:alpha:]]+)"},{"include":"#record_signature"}]},{"include":"#keywords"}]},"records":{"patterns":[{"begin":"\\\\b(type)\\\\s+(private|internal|public)?\\\\s*","beginCaptures":{"1":{"name":"keyword.fsharp"},"2":{"name":"storage.modifier.fsharp"}},"end":"\\\\s*((with)|((as)\\\\s+([\'0-9[:alpha:]]+))|(=)|[\\\\n=]|(\\\\(\\\\)))","endCaptures":{"2":{"name":"keyword.fsharp"},"3":{"name":"keyword.fsharp"},"4":{"name":"keyword.fsharp"},"5":{"name":"variable.parameter.fsharp"},"6":{"name":"keyword.symbol.fsharp"},"7":{"name":"keyword.symbol.fsharp"}},"name":"record.fsharp","patterns":[{"include":"#comments"},{"include":"#attributes"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"([\'.0-9^_[:alpha:]]+|``[ \',.0-:^_`[:alpha:]]+``)"},{"begin":"(<)","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"((?<!:)>)","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(([\'^])``[ ,.0-:^_`[:alpha:]]+``|([\'^])[.0-:^_`[:alpha:]]+)"},{"match":"\\\\b(interface|with|abstract|and|when|or|not|struct|equality|comparison|unmanaged|delegate|enum)\\\\b","name":"keyword.fsharp"},{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"keyword.fsharp"}},"match":"(static member|member|new)"},{"include":"#common_binding_definition"}]},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"comments":"Here we need the \\\\w modifier in order to check that the words isn\'t blacklisted","match":"([\'.0-9^_`\\\\w]+)"},{"include":"#keywords"}]},{"captures":{"1":{"name":"storage.modifier.fsharp"}},"match":"\\\\s*(private|internal|public)"},{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"\\\\s*(?=(=)|[\\\\n=]|(\\\\(\\\\))|(as))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#member_declaration"}]},{"include":"#keywords"}]}]},"string_formatter":{"patterns":[{"captures":{"1":{"name":"keyword.format.specifier.fsharp"}},"match":"(%0?-?(\\\\d+)?(([at])|(\\\\.\\\\d+)?([EFGMefg])|([Xbcdiosux])|([Obs])|(\\\\+?A)))","name":"entity.name.type.format.specifier.fsharp"}]},"strings":{"patterns":[{"begin":"(?=[^\\\\\\\\])(@\\")","beginCaptures":{"1":{"name":"punctuation.definition.string.begin.fsharp"}},"end":"(\\")(?!\\")","endCaptures":{"1":{"name":"punctuation.definition.string.end.fsharp"}},"name":"string.quoted.literal.fsharp","patterns":[{"match":"\\"(\\")","name":"constant.character.string.escape.fsharp"}]},{"begin":"(?=[^\\\\\\\\])(\\"\\"\\")","beginCaptures":{"1":{"name":"punctuation.definition.string.begin.fsharp"}},"end":"(\\"\\"\\")","endCaptures":{"1":{"name":"punctuation.definition.string.end.fsharp"}},"name":"string.quoted.triple.fsharp","patterns":[{"include":"#string_formatter"}]},{"begin":"(?=[^\\\\\\\\])(\\")","beginCaptures":{"1":{"name":"punctuation.definition.string.begin.fsharp"}},"end":"(\\")","endCaptures":{"1":{"name":"punctuation.definition.string.end.fsharp"}},"name":"string.quoted.double.fsharp","patterns":[{"match":"\\\\\\\\$[\\\\t ]*","name":"punctuation.separator.string.ignore-eol.fsharp"},{"match":"\\\\\\\\([\\"\'\\\\\\\\abfnrtv]|([01][0-9][0-9]|2[0-4][0-9]|25[0-5])|(x\\\\h{2})|(u\\\\h{4})|(U00(0\\\\h|10)\\\\h{4}))","name":"constant.character.string.escape.fsharp"},{"match":"\\\\\\\\(([0-9]{1,3})|(x\\\\S{0,2})|(u\\\\S{0,4})|(U\\\\S{0,8})|\\\\S)","name":"invalid.illegal.character.string.fsharp"},{"include":"#string_formatter"}]}]},"strp_inlined":{"patterns":[{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#strp_inlined_body"}]}]},"strp_inlined_body":{"patterns":[{"include":"#comments"},{"include":"#anonymous_functions"},{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(\\\\^[\'.0-9_[:alpha:]]+)"},{"match":"\\\\b(and|when|or)\\\\b","name":"keyword.fsharp"},{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"include":"#strp_inlined_body"}]},{"captures":{"1":{"name":"keyword.fsharp"},"2":{"name":"variable.fsharp"},"3":{"name":"keyword.symbol.fsharp"}},"match":"((?:static |)member)\\\\s*([\'.0-9<>^_`[:alpha:]]+|``[ \'.0-9<>^_[:alpha:]]+``)\\\\s*(:)"},{"include":"#compiler_directives"},{"include":"#constants"},{"include":"#strings"},{"include":"#chars"},{"include":"#double_tick"},{"include":"#keywords"},{"include":"#text"},{"include":"#definition"},{"include":"#attributes"},{"include":"#keywords"},{"include":"#cexprs"},{"include":"#text"}]},"text":{"patterns":[{"match":"\\\\\\\\","name":"text.fsharp"}]},"tuple_signature":{"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(([ \'.0-9?^_`[:alpha:]]+))+"},{"begin":"(\\\\()","beginCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"end":"(\\\\))","endCaptures":{"1":{"name":"keyword.symbol.fsharp"}},"patterns":[{"captures":{"1":{"name":"entity.name.type.fsharp"}},"match":"(([ \'.0-9?^_`[:alpha:]]+))+"},{"include":"#tuple_signature"}]},{"include":"#keywords"}]},"variables":{"patterns":[{"match":"\\\\(\\\\)","name":"keyword.symbol.fsharp"},{"captures":{"1":{"name":"keyword.symbol.fsharp"},"2":{"name":"variable.parameter.fsharp"}},"match":"(\\\\??)(``[ \',.0-:^_`[:alpha:]]+``|(?!private|struct\\\\b)\\\\b[ \'.0-9<>^_`\\\\w[:alpha:]]+)"}]}},"scopeName":"source.fsharp","embeddedLangs":["markdown"],"aliases":["f#","fs"]}')),f=[...d.default,e]}};
|