@hienlh/ppm 0.22.11 → 0.23.1
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/CHANGELOG.md +24 -1
- package/CLAUDE.md +14 -0
- package/THIRD-PARTY-NOTICES.md +1 -1
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/bun.lock +17 -0
- package/dist/web/assets/__vite-browser-external-CHpXvvmW.js +1 -0
- package/dist/web/assets/accounts-settings-section-BR7t8CEk.js +1 -0
- package/dist/web/assets/ai-resource-editor-BFVg2d2a.js +1 -0
- package/dist/web/assets/ai-settings-section-BJw7E_lM.js +1 -0
- package/dist/web/assets/ai-settings-section-CO-i3ghA.js +1 -0
- package/dist/web/assets/angular-html-D-rbk4zq.js +1 -0
- package/dist/web/assets/angular-ts-B_ldKah2.js +1 -0
- package/dist/web/assets/api-client-BgedDTvo.js +1 -0
- package/dist/web/assets/api-client-c8YOpTlT.js +1 -0
- package/dist/web/assets/api-settings-0s1Rfgcu.js +1 -0
- package/dist/web/assets/api-settings-Bnp28Ysw.js +1 -0
- package/dist/web/assets/api-themes-Pp-AZvwV.js +1 -0
- package/dist/web/assets/apl-19Dr02g6.js +1 -0
- package/dist/web/assets/appearance-settings-section-Ck_FPs9g.js +1 -0
- package/dist/web/assets/architecture-PBZL5I3N-B_n8ddB4.js +1 -0
- package/dist/web/assets/astro-1q5o0N64.js +1 -0
- package/dist/web/assets/audio-preview-DXtE1Lpz.js +1 -0
- package/dist/web/assets/blade-BNgXZCCk.js +1 -0
- package/dist/web/assets/branch-review-tab-CNVxMRuo.js +1 -0
- package/dist/web/assets/bsl-C5u8-gEq.js +1 -0
- package/dist/web/assets/button-CBehaXpV.js +1 -0
- package/dist/web/assets/c-Dko4ZphN.js +1 -0
- package/dist/web/assets/cairo-CrhmfCJH.js +1 -0
- package/dist/web/assets/chat-tab-DqLqcBci.js +1 -0
- package/dist/web/assets/chat-tab-MdU9Jr3F.js +15 -0
- package/dist/web/assets/cobol-BgRxrYyZ.js +1 -0
- package/dist/web/assets/code-editor-wEeCvvMR.js +7 -0
- package/dist/web/assets/codex-daily-guard-B21M4m-P.js +1 -0
- package/dist/web/assets/coffee-9hmEOIYs.js +1 -0
- package/dist/web/assets/conflict-editor-Cu-z_LdX.js +19 -0
- package/dist/web/assets/context-menu-CjYTq8DI.js +1 -0
- package/dist/web/assets/cpp-BntsLe3X.js +1 -0
- package/dist/web/assets/createLucideIcon-DBXq3G0e.js +1 -0
- package/dist/web/assets/crystal-CoXN2Gj8.js +1 -0
- package/dist/web/assets/css-DKuKlxIj.js +1 -0
- package/dist/web/assets/csv-preview-DHbBIqUu.js +2 -0
- package/dist/web/assets/data-grid-overlay-editor-2ERlh7_N.js +1 -0
- package/dist/web/assets/data-grid-types-DatI2Wee.js +1 -0
- package/dist/web/assets/database-viewer-_McYjRzc.js +1 -0
- package/dist/web/assets/design-export-client-SWCbGwwU.js +1 -0
- package/dist/web/assets/design-responsive-dialog-CcJETHO2.js +1 -0
- package/dist/web/assets/design-tab-C0TUD5g-.js +33 -0
- package/dist/web/assets/designs-sidebar-panel-XCAwSNtg.js +1 -0
- package/dist/web/assets/dialog-tzBRkGeW.js +1 -0
- package/dist/web/assets/diff-viewer-C4z-_68x.js +4 -0
- package/dist/web/assets/dist-CgtN5c7X.js +1 -0
- package/dist/web/assets/dist-wmDsBD_Z.js +1 -0
- package/dist/web/assets/docx-preview-C-UKGMXR.js +12 -0
- package/dist/web/assets/edge-gf7weBFr.js +1 -0
- package/dist/web/assets/edit-diff-preview-8nIct7kS.js +7 -0
- package/dist/web/assets/editor-language-service-D8hW_eew.js +1 -0
- package/dist/web/assets/elixir-DOEwBYus.js +1 -0
- package/dist/web/assets/elm-7yx1A5qt.js +1 -0
- package/dist/web/assets/erb-Bm_J_rBw.js +1 -0
- package/dist/web/assets/erlang-DgkAVj5y.js +1 -0
- package/dist/web/assets/esm-wquH4IhX.js +2 -0
- package/dist/web/assets/explorer-body-CdxolRQG.js +2 -0
- package/dist/web/assets/explorer-window-content-D1fkI_cL.js +1 -0
- package/dist/web/assets/extension-manager-section-CAaSoAuG.js +1 -0
- package/dist/web/assets/extension-webview-DmBZun_i.js +12 -0
- package/dist/web/assets/file-icons-BlOxPo3P.js +1 -0
- package/dist/web/assets/file-store-CTlJqj2m.js +1 -0
- package/dist/web/assets/files-settings-section-BFIzSuBh.js +1 -0
- package/dist/web/assets/format-date-BMtvCeb9.js +1 -0
- package/dist/web/assets/format-file-meta-DLaHgkdx.js +1 -0
- package/dist/web/assets/fortran-fixed-form-s8lQifxM.js +1 -0
- package/dist/web/assets/fs-api-RVc5RtTA.js +1 -0
- package/dist/web/assets/fsharp-D6bmDjka.js +1 -0
- package/dist/web/assets/gdresource-wPII3GWW.js +1 -0
- package/dist/web/assets/general-settings-section-BLLUvdhX.js +1 -0
- package/dist/web/assets/git-commit-DqLhxK6K.js +1 -0
- package/dist/web/assets/git-log-panel-Lq2Vkm8w.js +1 -0
- package/dist/web/assets/git-rebase-Cy0Mp9W1.js +1 -0
- package/dist/web/assets/git-repo-store-DFTJ5ngK.js +1 -0
- package/dist/web/assets/gitGraph-HDMCJU4V-w1WApLyy.js +1 -0
- package/dist/web/assets/glide-data-grid-CHdKFqis.js +141 -0
- package/dist/web/assets/glimmer-js-CmHFqq4N.js +1 -0
- package/dist/web/assets/glimmer-ts-vLmZC1JJ.js +1 -0
- package/dist/web/assets/glsl-DArPh0ws.js +1 -0
- package/dist/web/assets/graphql-B-_Ilekp.js +1 -0
- package/dist/web/assets/group-chat-tab-D2bluLme.js +1 -0
- package/dist/web/assets/hack-4KVRpwwM.js +1 -0
- package/dist/web/assets/haml-DoK94C5G.js +1 -0
- package/dist/web/assets/handlebars-D0_6yNlK.js +1 -0
- package/dist/web/assets/html-BOqZwhzR.js +1 -0
- package/dist/web/assets/html-derivative-If_2xbJ8.js +1 -0
- package/dist/web/assets/http-B6pQhqN4.js +1 -0
- package/dist/web/assets/hurl-BjW79rql.js +1 -0
- package/dist/web/assets/hxml-B1Yl76u6.js +1 -0
- package/dist/web/assets/icons-CO_II6D-.js +1 -0
- package/dist/web/assets/image-preview-78Fguk1f.js +1 -0
- package/dist/web/assets/index-CzYrKDUF.css +1 -0
- package/dist/web/assets/index-DSbUqWiH.js +52 -0
- package/dist/web/assets/info-3K5VOQVL-Bv1wKdPY.js +1 -0
- package/dist/web/assets/input-CP31LZnN.js +1 -0
- package/dist/web/assets/java-DPqGHyuh.js +1 -0
- package/dist/web/assets/javascript-D8x_R8ev.js +1 -0
- package/dist/web/assets/jinja-DOkXV84k.js +1 -0
- package/dist/web/assets/jira-watcher-section-BOe_ztas.js +1 -0
- package/dist/web/assets/jison-CGzlyBWT.js +1 -0
- package/dist/web/assets/json-kcFjaEWA.js +1 -0
- package/dist/web/assets/jsx-BzlJCumN.js +1 -0
- package/dist/web/assets/julia-CZrbm1Fa.js +1 -0
- package/dist/web/assets/just-bRG6zWI_.js +1 -0
- package/dist/web/assets/keybindings-store-DFPJBiXT.js +1 -0
- package/dist/web/assets/keyboard-shortcuts-section-CJubMhMq.js +1 -0
- package/dist/web/assets/latex-CZHLEkde.js +1 -0
- package/dist/web/assets/lib-KePrAxj7.js +4 -0
- package/dist/web/assets/liquid-Dcfq3Ccc.js +1 -0
- package/dist/web/assets/lua-Ggfu9EYp.js +1 -0
- package/dist/web/assets/markdown-renderer-6oU-L6RN.js +5 -0
- package/dist/web/assets/markdown-renderer-DxSQ4aqW.js +1 -0
- package/dist/web/assets/marko-BUwN_Iax.js +1 -0
- package/dist/web/assets/mdc-CIifdeNY.js +1 -0
- package/dist/web/assets/media-url-GqzhazJS.js +1 -0
- package/dist/web/assets/mobile-bottom-sheet-Cf4kV1hS.js +1 -0
- package/dist/web/assets/mobile-explorer-sheet-D0968cuP.js +1 -0
- package/dist/web/assets/monaco-dotenv-language-COsgiuQg.js +1 -0
- package/dist/web/assets/new-chat-provider-CJx_waY3.js +1 -0
- package/dist/web/assets/new-design-dialog-CbrMbKum.js +1 -0
- package/dist/web/assets/nextflow-DufnRZW1.js +1 -0
- package/dist/web/assets/nginx-DtUJGfad.js +1 -0
- package/dist/web/assets/nim-BeBPwibr.js +1 -0
- package/dist/web/assets/notification-store-BO3RInEL.js +1 -0
- package/dist/web/assets/notifications-settings-section-Bfxqz65i.js +1 -0
- package/dist/web/assets/number-overlay-editor-xzM7GhYV.js +9 -0
- package/dist/web/assets/onboarding-entry-CcvySZ_l.js +1 -0
- package/dist/web/assets/onboarding-quick-orientation-CT4PylG0.js +1 -0
- package/dist/web/assets/overview-panel-DshAIz6C.js +1 -0
- package/dist/web/assets/packet-RMMSAZCW-Scl5HE6U.js +1 -0
- package/dist/web/assets/panel-store-BUQ-CPsd.js +1 -0
- package/dist/web/assets/pdf-preview-BWim6mu1.js +1 -0
- package/dist/web/assets/perl-hV0EoLCp.js +1 -0
- package/dist/web/assets/php-N1YBqBhK.js +1 -0
- package/dist/web/assets/pie-UPGHQEXC-sY83O9qJ.js +1 -0
- package/dist/web/assets/portal-container-context-NFSuymMu.js +1 -0
- package/dist/web/assets/postgres-viewer-HwlL1UTJ.js +3 -0
- package/dist/web/assets/ppmbot-settings-section-CHr2FIDj.js +1 -0
- package/dist/web/assets/pptx-export-D6DOknBD.js +111 -0
- package/dist/web/assets/problems-panel-41z59l78.js +1 -0
- package/dist/web/assets/process-table-CVMEMJqQ.js +1 -0
- package/dist/web/assets/project-framework-store-XxFXcUpb.js +1 -0
- package/dist/web/assets/project-store-C5gJXkvb.js +1 -0
- package/dist/web/assets/proxy-settings-section-B4dkvCCx.js +1 -0
- package/dist/web/assets/pug-IMA1knL7.js +1 -0
- package/dist/web/assets/qml-DuwVuXga.js +1 -0
- package/dist/web/assets/query-audit-section-Cn11xqgz.js +1 -0
- package/dist/web/assets/r-DsXT2lmn.js +1 -0
- package/dist/web/assets/radar-KQ55EAFF-CNhm_kzj.js +1 -0
- package/dist/web/assets/razor-Be4LE-G0.js +1 -0
- package/dist/web/assets/react-CzUPVyyG.js +1 -0
- package/dist/web/assets/regexp-ztLDvplH.js +1 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-Co4vEiiB.js +1 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-Cv4yo7K4.js +2 -0
- package/dist/web/assets/remote-desktop-mobile-view-CcuulHIu.js +1 -0
- package/dist/web/assets/remote-desktop-readiness-gate-ouPRvBlu.js +1 -0
- package/dist/web/assets/remote-desktop-window-content-DmH3jBuG.js +1 -0
- package/dist/web/assets/rolldown-runtime-C5c2KzVm.js +1 -0
- package/dist/web/assets/rst-BdtOZUlL.js +1 -0
- package/dist/web/assets/ruby-DTna6e9n.js +1 -0
- package/dist/web/assets/run-in-terminal-SU9cwoZ4.js +1 -0
- package/dist/web/assets/sas-X50YKLBX.js +1 -0
- package/dist/web/assets/schedules-settings-section-Dy6hARk0.js +1 -0
- package/dist/web/assets/scroll-area-xAtds1T-.js +1 -0
- package/dist/web/assets/scss-cQk9zuqD.js +1 -0
- package/dist/web/assets/send-to-chat-TSKk3fI9.js +1 -0
- package/dist/web/assets/separator-D8SNZI6E.js +1 -0
- package/dist/web/assets/settings-body-CZSwxG0i.js +2 -0
- package/dist/web/assets/settings-store-DXmQug0m.js +2 -0
- package/dist/web/assets/settings-tab-B_WPC-y7.js +1 -0
- package/dist/web/assets/settings-window-content-CSWdwQn1.js +1 -0
- package/dist/web/assets/shaderlab-CSeOcwk6.js +1 -0
- package/dist/web/assets/shellscript-Dtzjnpp9.js +1 -0
- package/dist/web/assets/shellsession-AqADqsjv.js +1 -0
- package/dist/web/assets/soy-DeMex-y3.js +1 -0
- package/dist/web/assets/sparql-CDZTYDwx.js +1 -0
- package/dist/web/assets/sql-BS_vTOM8.js +1 -0
- package/dist/web/assets/sql-query-editor-6Ee_Zn5j.js +1 -0
- package/dist/web/assets/sqlite-viewer-Cj0S_m9V.js +1 -0
- package/dist/web/assets/stata-PkjbLwNy.js +1 -0
- package/dist/web/assets/surrealql-BJ6bKPXV.js +1 -0
- package/dist/web/assets/svelte-D4u1sGpe.js +1 -0
- package/dist/web/assets/system-monitor-body-PQqXdK4a.js +2 -0
- package/dist/web/assets/system-monitor-tab-BEjvgQuQ.js +1 -0
- package/dist/web/assets/system-monitor-window-content-DZwvvN-M.js +1 -0
- package/dist/web/assets/tab-host-window-content-CnV4Z4Yt.js +1 -0
- package/dist/web/assets/tab-store-DqeaGhhE.js +1 -0
- package/dist/web/assets/team-member-sheet-8EVCTM-X.js +2 -0
- package/dist/web/assets/team-member-window-content-Bc0ydBAn.js +1 -0
- package/dist/web/assets/templ-vtFoIgGG.js +1 -0
- package/dist/web/assets/terminal-tab-0b63-txz.js +3 -0
- package/dist/web/assets/tex-o6JLe3Qo.js +1 -0
- package/dist/web/assets/tool-cards-C09WknHl.js +9 -0
- package/dist/web/assets/treemap-KZPCXAKY-CfpX4ULx.js +1 -0
- package/dist/web/assets/ts-tags-DkmPnhIx.js +1 -0
- package/dist/web/assets/tsx-BUq9xm2T.js +1 -0
- package/dist/web/assets/twig-I9ja_Rk_.js +1 -0
- package/dist/web/assets/typescript-CP3RLBKz.js +1 -0
- package/dist/web/assets/use-blob-url-mZfScQdx.js +1 -0
- package/dist/web/assets/use-inline-blame-BuAc9IXE.js +16 -0
- package/dist/web/assets/use-is-mobile-CkO33jqU.js +1 -0
- package/dist/web/assets/use-lsp-DAtq1G0M.js +6 -0
- package/dist/web/assets/use-monaco-theme-Ch_znquJ.js +1 -0
- package/dist/web/assets/use-open-team-member-DHzZiJZw.js +1 -0
- package/dist/web/assets/use-visual-viewport-C307OVeV.js +1 -0
- package/dist/web/assets/use-websocket-DGEOad8p.js +1 -0
- package/dist/web/assets/vendor-markdown-QKPNiWEd.js +291 -0
- package/dist/web/assets/vendor-mermaid-eg2XWIjK.js +2921 -0
- package/dist/web/assets/vendor-ui-BHh12_0v.js +45 -0
- package/dist/web/assets/video-preview-DH3RtwVT.js +1 -0
- package/dist/web/assets/vue-DJf-APPD.js +1 -0
- package/dist/web/assets/vue-html-DUJ89Ycn.js +1 -0
- package/dist/web/assets/vue-vine-CWUFwuRE.js +1 -0
- package/dist/web/assets/window-pip-registry-DH07f_8k.js +1 -0
- package/dist/web/assets/window-store-B4cbZ5rr.js +1 -0
- package/dist/web/assets/ws-auth-B_y5rMfZ.js +1 -0
- package/dist/web/assets/xml-DshhaDKq.js +1 -0
- package/dist/web/assets/xsl-BlRNlmF7.js +1 -0
- package/dist/web/assets/yaml-seUOGdyI.js +1 -0
- package/dist/web/index.html +37 -36
- package/dist/web/sw.js +1 -1
- package/docs/architecture/workspace-and-ui.md +47 -0
- package/docs/project-roadmap.md +16 -0
- package/docs/system-architecture.md +11 -1
- package/package.json +4 -1
- package/scripts/gen-product-icons.ts +10 -0
- package/src/providers/claude-agent-sdk-query-options.ts +68 -1
- package/src/providers/claude-agent-sdk.ts +44 -15
- package/src/providers/codex-app-server/codex-event-mapper.ts +18 -1
- package/src/providers/codex-app-server/codex-jsonrpc-client.ts +4 -3
- package/src/providers/codex-app-server/codex-permission-map.ts +11 -1
- package/src/providers/codex-app-server/codex-protocol.ts +5 -0
- package/src/providers/codex-app-server/codex-provider.ts +32 -15
- package/src/providers/codex-app-server/codex-thread-params.ts +96 -0
- package/src/server/helpers/preview-asset-guard.ts +36 -0
- package/src/server/index.ts +15 -0
- package/src/server/routes/chat.ts +41 -4
- package/src/server/routes/design-check.ts +48 -0
- package/src/server/routes/design-comments.ts +63 -0
- package/src/server/routes/design-export.ts +84 -0
- package/src/server/routes/design-preview.ts +159 -0
- package/src/server/routes/design-route-helpers.ts +25 -0
- package/src/server/routes/design-style.ts +28 -0
- package/src/server/routes/design-tweaks.ts +38 -0
- package/src/server/routes/design-undo.ts +27 -0
- package/src/server/routes/designs.ts +101 -0
- package/src/server/routes/html-preview.ts +4 -24
- package/src/server/routes/project-scoped.ts +2 -0
- package/src/server/ws/chat.ts +8 -1
- package/src/server/ws/global.ts +22 -1
- package/src/services/chat.service.ts +64 -1
- package/src/services/db.service.ts +73 -4
- package/src/services/design/bridge/bridge-anchor-resolve.ts +96 -0
- package/src/services/design/bridge/bridge-core.ts +205 -0
- package/src/services/design/bridge/bridge-element-info.ts +180 -0
- package/src/services/design/bridge/bridge-extract-blocks.ts +115 -0
- package/src/services/design/bridge/bridge-extract-images.ts +96 -0
- package/src/services/design/bridge/bridge-extract-slides.ts +169 -0
- package/src/services/design/bridge/bridge-extract-text.ts +187 -0
- package/src/services/design/bridge/bridge-layout-boxes.ts +137 -0
- package/src/services/design/bridge/bridge-layout-check.ts +99 -0
- package/src/services/design/bridge/bridge-layout-grid.ts +165 -0
- package/src/services/design/bridge/bridge-layout-screenshot.ts +106 -0
- package/src/services/design/bridge/bridge-nav-guard.ts +61 -0
- package/src/services/design/bridge/bridge-picker-overlay.ts +54 -0
- package/src/services/design/bridge/bridge-picker.ts +174 -0
- package/src/services/design/bridge/bridge-pins.ts +157 -0
- package/src/services/design/bridge/bridge-script.ts +104 -0
- package/src/services/design/bridge/bridge-transform-math.ts +104 -0
- package/src/services/design/bridge/bridge-transform-overlay.ts +94 -0
- package/src/services/design/bridge/bridge-transform-style.ts +78 -0
- package/src/services/design/bridge/bridge-transform.ts +201 -0
- package/src/services/design/bridge/bridge-tweaks.ts +118 -0
- package/src/services/design/check/design-canvas-check-broker.ts +77 -0
- package/src/services/design/comments/design-comment-element-context.ts +81 -0
- package/src/services/design/comments/design-comments-store.ts +81 -0
- package/src/services/design/design-comments.service.ts +140 -0
- package/src/services/design/design-edit-undo-journal.ts +125 -0
- package/src/services/design/design-error.ts +19 -0
- package/src/services/design/design-events.ts +46 -0
- package/src/services/design/design-fs.ts +67 -0
- package/src/services/design/design-instructions.ts +97 -0
- package/src/services/design/design-lock.ts +74 -0
- package/src/services/design/design-manifest.ts +92 -0
- package/src/services/design/design-paths.ts +97 -0
- package/src/services/design/design-restore-journal.ts +143 -0
- package/src/services/design/design-restore.service.ts +77 -0
- package/src/services/design/design-safe-walk.ts +114 -0
- package/src/services/design/design-slug.ts +35 -0
- package/src/services/design/design-snapshot-history.ts +159 -0
- package/src/services/design/design-snapshots.service.ts +161 -0
- package/src/services/design/design-starter-template.ts +100 -0
- package/src/services/design/design-store.service.ts +156 -0
- package/src/services/design/design-style-patch.service.ts +83 -0
- package/src/services/design/design-tool-policy.ts +111 -0
- package/src/services/design/design-turn-snapshot.ts +80 -0
- package/src/services/design/design-tweaks-commit.service.ts +138 -0
- package/src/services/design/design-write-rate-limit.ts +51 -0
- package/src/services/design/export/css-url-inline.ts +130 -0
- package/src/services/design/export/design-export-asset-reader.ts +57 -0
- package/src/services/design/export/design-export-entry.ts +33 -0
- package/src/services/design/export/design-standalone-html.ts +167 -0
- package/src/services/design/export/design-zip-export.ts +106 -0
- package/src/services/design/mcp/design-mcp-access.ts +16 -0
- package/src/services/design/mcp/design-mcp-endpoint.ts +118 -0
- package/src/services/design/mcp/design-mcp-tokens.ts +82 -0
- package/src/services/design/mcp/design-mcp-tool.ts +41 -0
- package/src/services/design/preview/design-csp.ts +31 -0
- package/src/services/design/preview/design-preview-html.ts +98 -0
- package/src/services/design/preview/design-preview-scope.ts +66 -0
- package/src/services/design/preview/design-preview-tokens.ts +137 -0
- package/src/services/design/preview/expired-page.ts +30 -0
- package/src/services/design/preview/html-instrument.ts +119 -0
- package/src/services/design/preview/print-view.ts +62 -0
- package/src/services/design/source/css-root-selector.ts +20 -0
- package/src/services/design/source/css-root-vars-patch.ts +202 -0
- package/src/services/design/source/design-source-file.ts +62 -0
- package/src/services/design/source/design-style-sources.ts +101 -0
- package/src/services/design/source/element-source-range.ts +65 -0
- package/src/services/design/source/html-style-blocks.ts +87 -0
- package/src/services/design/source/inline-style-declarations.ts +131 -0
- package/src/services/design/source/inline-style-patch.ts +79 -0
- package/src/services/design/source/tweak-patch-plan.ts +143 -0
- package/src/services/file-watcher/ignore-rules.ts +9 -1
- package/src/services/server-listen-address.ts +25 -0
- package/src/shared/design-bridge-messages-check.ts +44 -0
- package/src/shared/design-bridge-messages-picker.ts +142 -0
- package/src/shared/design-bridge-messages-slides.ts +37 -0
- package/src/shared/design-bridge-messages-transform.ts +121 -0
- package/src/shared/design-bridge-messages-tweaks.ts +65 -0
- package/src/shared/design-bridge-protocol.ts +158 -0
- package/src/shared/design-canvas-check-format.ts +69 -0
- package/src/shared/design-canvas-check.ts +148 -0
- package/src/shared/design-cdn-hosts.ts +17 -0
- package/src/shared/design-comment-types.ts +111 -0
- package/src/shared/design-slide-doc-parse.ts +140 -0
- package/src/shared/design-slide-doc.ts +91 -0
- package/src/shared/design-system-init-prompt.ts +35 -0
- package/src/shared/design-tweaks.ts +175 -0
- package/src/shared/design-types.ts +63 -0
- package/src/shared/untrusted-text.ts +15 -0
- package/src/types/chat.ts +22 -0
- package/src/types/config.ts +1 -1
- package/src/web/components/chat/chat-history-bar.tsx +18 -15
- package/src/web/components/chat/chat-history-panel.tsx +3 -9
- package/src/web/components/chat/chat-tab.tsx +74 -40
- package/src/web/components/chat/message-input.tsx +11 -4
- package/src/web/components/chat/session-history-list.tsx +5 -9
- package/src/web/components/design/canvas/canvas-geometry.ts +47 -0
- package/src/web/components/design/canvas/design-canvas-pane.tsx +192 -0
- package/src/web/components/design/canvas/design-issues-badge.tsx +71 -0
- package/src/web/components/design/canvas/device-frame-presets.ts +37 -0
- package/src/web/components/design/canvas/use-design-bridge.ts +169 -0
- package/src/web/components/design/canvas/use-design-canvas-check.ts +110 -0
- package/src/web/components/design/canvas/use-design-canvas.ts +107 -0
- package/src/web/components/design/canvas/use-design-live-reload.ts +86 -0
- package/src/web/components/design/canvas/use-design-preview-url.ts +74 -0
- package/src/web/components/design/canvas/use-expanded-canvas-escape.ts +29 -0
- package/src/web/components/design/comments/comment-composer.tsx +107 -0
- package/src/web/components/design/comments/comment-overlay-geometry.ts +50 -0
- package/src/web/components/design/comments/comment-pins-overlay.tsx +70 -0
- package/src/web/components/design/comments/comments-panel.tsx +118 -0
- package/src/web/components/design/comments/comments-send-preview.tsx +43 -0
- package/src/web/components/design/comments/design-comments-layer.tsx +73 -0
- package/src/web/components/design/comments/element-action-bar.tsx +105 -0
- package/src/web/components/design/comments/use-comment-pins.ts +118 -0
- package/src/web/components/design/comments/use-design-comments-feature.ts +124 -0
- package/src/web/components/design/comments/use-design-comments.ts +89 -0
- package/src/web/components/design/comments/use-element-picker.ts +87 -0
- package/src/web/components/design/design-chat-pane.tsx +51 -0
- package/src/web/components/design/design-layout-controls.tsx +84 -0
- package/src/web/components/design/design-mobile-layout.tsx +34 -0
- package/src/web/components/design/design-split-layout.tsx +99 -0
- package/src/web/components/design/design-tab-context.ts +44 -0
- package/src/web/components/design/design-tab.tsx +116 -0
- package/src/web/components/design/design-toolbar-list.tsx +36 -0
- package/src/web/components/design/design-toolbar.tsx +200 -0
- package/src/web/components/design/designs-sidebar-panel.tsx +117 -0
- package/src/web/components/design/dialogs/delete-design-dialog.tsx +69 -0
- package/src/web/components/design/dialogs/design-responsive-dialog.tsx +48 -0
- package/src/web/components/design/dialogs/new-design-dialog.tsx +113 -0
- package/src/web/components/design/dialogs/rename-design-dialog.tsx +56 -0
- package/src/web/components/design/export/export-menu.tsx +108 -0
- package/src/web/components/design/export/export-warnings-sheet.tsx +35 -0
- package/src/web/components/design/export/pptx-export.ts +38 -0
- package/src/web/components/design/export/use-design-export.ts +142 -0
- package/src/web/components/design/history/design-history-panel.tsx +119 -0
- package/src/web/components/design/transform/design-undo-stack.ts +90 -0
- package/src/web/components/design/transform/transform-readout.tsx +50 -0
- package/src/web/components/design/transform/use-canvas-transform.ts +181 -0
- package/src/web/components/design/tweaks/tweak-control.tsx +94 -0
- package/src/web/components/design/tweaks/tweaks-panel.tsx +99 -0
- package/src/web/components/design/tweaks/use-design-tweaks.ts +151 -0
- package/src/web/components/design/use-design-auto-check.ts +94 -0
- package/src/web/components/design/use-design-layout.ts +55 -0
- package/src/web/components/design/use-design-summary.ts +63 -0
- package/src/web/components/layout/command-palette-design-commands.tsx +75 -0
- package/src/web/components/layout/command-palette.tsx +12 -4
- package/src/web/components/layout/editor-panel.tsx +4 -10
- package/src/web/components/layout/mobile-drawer.tsx +9 -2
- package/src/web/components/layout/mobile-nav.tsx +3 -2
- package/src/web/components/layout/mobile-tab-switcher-sheet.tsx +4 -5
- package/src/web/components/layout/sidebar.tsx +8 -1
- package/src/web/components/layout/tab-bar.tsx +3 -2
- package/src/web/components/layout/tab-content.tsx +5 -0
- package/src/web/components/layout/tab-pool.tsx +1 -0
- package/src/web/components/onboarding/onboarding-quick-orientation.tsx +1 -0
- package/src/web/hooks/use-chat.ts +8 -4
- package/src/web/hooks/use-design-session-redirect.ts +39 -0
- package/src/web/hooks/use-design-session-state.ts +94 -0
- package/src/web/hooks/use-global-events.ts +4 -1
- package/src/web/hooks/use-session-history.ts +4 -10
- package/src/web/hooks/use-url-sync.ts +10 -2
- package/src/web/lib/design/api-design-comments.ts +42 -0
- package/src/web/lib/design/api-design-edits.ts +62 -0
- package/src/web/lib/design/api-design-tweaks.ts +64 -0
- package/src/web/lib/design/api-designs.ts +81 -0
- package/src/web/lib/design/deliver-to-design-chat.ts +63 -0
- package/src/web/lib/design/design-auto-check-rounds.ts +32 -0
- package/src/web/lib/design/design-change-filter.ts +27 -0
- package/src/web/lib/design/design-comments-prompt.ts +55 -0
- package/src/web/lib/design/design-export-client.ts +101 -0
- package/src/web/lib/design/design-handoff-prompt.ts +48 -0
- package/src/web/lib/design/design-layout-mode.ts +79 -0
- package/src/web/lib/design/design-tab-metadata.ts +41 -0
- package/src/web/lib/design/design-transform-proposal.ts +62 -0
- package/src/web/lib/design/design-tweaks-model.ts +76 -0
- package/src/web/lib/design/design-ui-events.ts +25 -0
- package/src/web/lib/design/design-view-prefs.ts +90 -0
- package/src/web/lib/design/open-design-tab.ts +78 -0
- package/src/web/lib/design/pptx-slide-mapper.ts +118 -0
- package/src/web/lib/feature-badges.ts +2 -0
- package/src/web/lib/fluent-icon.tsx +38 -2
- package/src/web/lib/icons.generated.tsx +17 -1
- package/src/web/lib/patch-tab-metadata.ts +30 -0
- package/src/web/lib/send-to-chat.ts +16 -2
- package/src/web/lib/sidebar-tabs/tab-registry.ts +2 -0
- package/src/web/lib/tab-session-id.ts +16 -0
- package/src/web/lib/tab-type-icons.ts +2 -1
- package/src/web/stores/panel-store.ts +29 -1
- package/src/web/stores/panel-utils.ts +8 -1
- package/src/web/stores/settings-store.ts +2 -2
- package/src/web/stores/tab-store.ts +2 -1
- package/src/web/stores/window-panel-persistence.ts +1 -0
- package/dist/web/assets/accounts-settings-section-BDXYG6tT.js +0 -1
- package/dist/web/assets/ai-resource-editor-C3rKcZKN.js +0 -1
- package/dist/web/assets/ai-settings-section-ArqD8Nlg.js +0 -1
- package/dist/web/assets/ai-settings-section-DeWoAdLc.js +0 -1
- package/dist/web/assets/angular-html-DnrsWZqK.js +0 -1
- package/dist/web/assets/angular-ts-BXEqA9t1.js +0 -1
- package/dist/web/assets/api-client-Jn3njtNw.js +0 -1
- package/dist/web/assets/api-client-rSFnnCj4.js +0 -1
- package/dist/web/assets/api-settings-BZFSteM_.js +0 -1
- package/dist/web/assets/api-themes-CvKtX6Hd.js +0 -1
- package/dist/web/assets/apl-DUQ6Oyth.js +0 -1
- package/dist/web/assets/appearance-settings-section-K5o_Di4V.js +0 -1
- package/dist/web/assets/architecture-PBZL5I3N-B9M_VqZI.js +0 -1
- package/dist/web/assets/astro-CakOjJ6X.js +0 -1
- package/dist/web/assets/audio-preview-CwCDCN-_.js +0 -1
- package/dist/web/assets/blade-C903KM82.js +0 -1
- package/dist/web/assets/branch-review-tab-BNpYiUhC.js +0 -1
- package/dist/web/assets/bsl-slfcE_kB.js +0 -1
- package/dist/web/assets/button-B9CTrsEf.js +0 -1
- package/dist/web/assets/c-BWO-aeyf.js +0 -1
- package/dist/web/assets/cairo-DRwEaH6w.js +0 -1
- package/dist/web/assets/chat-tab-CC8KANoK.js +0 -15
- package/dist/web/assets/cobol--n4m6b70.js +0 -1
- package/dist/web/assets/code-editor-Ccf0Egrc.js +0 -7
- package/dist/web/assets/codex-daily-guard-CKk2WFlV.js +0 -1
- package/dist/web/assets/coffee-CjyFmw8_.js +0 -1
- package/dist/web/assets/conflict-editor-BCKbdpXy.js +0 -19
- package/dist/web/assets/context-menu-C6pIsf83.js +0 -1
- package/dist/web/assets/cpp-D18jdQPZ.js +0 -1
- package/dist/web/assets/createLucideIcon-DoiEKeJ_.js +0 -1
- package/dist/web/assets/crystal-CySzfH-7.js +0 -1
- package/dist/web/assets/css-Ca_hTmU6.js +0 -1
- package/dist/web/assets/csv-preview-I3a2lGUx.js +0 -2
- package/dist/web/assets/data-grid-overlay-editor-BD9eJweQ.js +0 -1
- package/dist/web/assets/data-grid-types-C6UX8kgh.js +0 -1
- package/dist/web/assets/database-viewer-DCuBR-bZ.js +0 -1
- package/dist/web/assets/dialog-B84_DJQ8.js +0 -1
- package/dist/web/assets/diff-viewer-DGaBe_Ln.js +0 -4
- package/dist/web/assets/dist-BD2gbdy0.js +0 -1
- package/dist/web/assets/docx-preview-CeH6p2Oi.js +0 -12
- package/dist/web/assets/edge-B6b5FHmU.js +0 -1
- package/dist/web/assets/edit-diff-preview-BG5DsLJG.js +0 -7
- package/dist/web/assets/editor-language-service-BaocEaLc.js +0 -1
- package/dist/web/assets/elixir-Dpo1rvn2.js +0 -1
- package/dist/web/assets/elm-D9CNOsWT.js +0 -1
- package/dist/web/assets/erb-sY7Yee1W.js +0 -1
- package/dist/web/assets/erlang-CfyrBxyF.js +0 -1
- package/dist/web/assets/esm-5AhGJcV8.js +0 -2
- package/dist/web/assets/explorer-body-2GYIYmUh.js +0 -2
- package/dist/web/assets/explorer-window-content-CYQSEX-g.js +0 -1
- package/dist/web/assets/extension-manager-section-BFAGdy3G.js +0 -1
- package/dist/web/assets/extension-webview-D5TXIBMf.js +0 -12
- package/dist/web/assets/file-icons-wS-OmEVu.js +0 -1
- package/dist/web/assets/file-store-Ds3qJ4hC.js +0 -1
- package/dist/web/assets/files-settings-section-BE6o-oHu.js +0 -1
- package/dist/web/assets/format-file-meta-eKLstbCL.js +0 -1
- package/dist/web/assets/fortran-fixed-form-N67gM_wp.js +0 -1
- package/dist/web/assets/fs-api-orca76dV.js +0 -1
- package/dist/web/assets/fsharp-Dq0K01wX.js +0 -1
- package/dist/web/assets/gdresource-DkFbszqY.js +0 -1
- package/dist/web/assets/general-settings-section-mQiXM537.js +0 -1
- package/dist/web/assets/git-commit-Ddt_nerD.js +0 -1
- package/dist/web/assets/git-log-panel-DqbcM9eC.js +0 -1
- package/dist/web/assets/git-rebase-CVK5OA7i.js +0 -1
- package/dist/web/assets/git-repo-store-BCEPfUGT.js +0 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-D3RB33aA.js +0 -1
- package/dist/web/assets/glide-data-grid-BjEF7M5i.js +0 -141
- package/dist/web/assets/glimmer-js-51jbYnyY.js +0 -1
- package/dist/web/assets/glimmer-ts-C5L1J32J.js +0 -1
- package/dist/web/assets/glsl-BcsfmwJZ.js +0 -1
- package/dist/web/assets/graphql-dv4wuJsK.js +0 -1
- package/dist/web/assets/group-chat-tab-aX2GEnkD.js +0 -1
- package/dist/web/assets/hack-DLE5d3bx.js +0 -1
- package/dist/web/assets/haml-CoKfcM3E.js +0 -1
- package/dist/web/assets/handlebars-Bn0jy8pD.js +0 -1
- package/dist/web/assets/html-DXzY5Cew.js +0 -1
- package/dist/web/assets/html-derivative-DhcVfYuw.js +0 -1
- package/dist/web/assets/http-DepeIWQ1.js +0 -1
- package/dist/web/assets/hurl-CfsP4sCj.js +0 -1
- package/dist/web/assets/hxml-IfVkY3HL.js +0 -1
- package/dist/web/assets/icons-DQjqk0lJ.js +0 -1
- package/dist/web/assets/image-preview-CWncz5iI.js +0 -1
- package/dist/web/assets/index-BoaecXhu.js +0 -52
- package/dist/web/assets/index-aXJy_SvC.css +0 -1
- package/dist/web/assets/info-3K5VOQVL-DDX-2VB7.js +0 -1
- package/dist/web/assets/input-QNG_gTHh.js +0 -1
- package/dist/web/assets/java-JWdrzVo8.js +0 -1
- package/dist/web/assets/javascript-5aQKJRxB.js +0 -1
- package/dist/web/assets/jinja-DcCmNDQ8.js +0 -1
- package/dist/web/assets/jira-watcher-section-BKn3A8zI.js +0 -1
- package/dist/web/assets/jison-Bt-5cKVZ.js +0 -1
- package/dist/web/assets/json-BOq7QblK.js +0 -1
- package/dist/web/assets/jsx-BSLWViGE.js +0 -1
- package/dist/web/assets/julia-DewYVRtE.js +0 -1
- package/dist/web/assets/just-CLT_ggBy.js +0 -1
- package/dist/web/assets/keybindings-store-Brz0qepi.js +0 -1
- package/dist/web/assets/keyboard-shortcuts-section-Ck8KIbJ8.js +0 -1
- package/dist/web/assets/latex-DXmcayW1.js +0 -1
- package/dist/web/assets/lib-BWyA9SvU.js +0 -4
- package/dist/web/assets/liquid-BVcHf0IA.js +0 -1
- package/dist/web/assets/lua-BYupsB1B.js +0 -1
- package/dist/web/assets/markdown-renderer-BGuM2PBI.js +0 -5
- package/dist/web/assets/markdown-renderer-Ddz8tPbb.js +0 -1
- package/dist/web/assets/marko-CsD0R5tv.js +0 -1
- package/dist/web/assets/mdc-DP2tC4Kc.js +0 -1
- package/dist/web/assets/media-url-CVO4m4zr.js +0 -1
- package/dist/web/assets/mobile-bottom-sheet-C3TniEP-.js +0 -1
- package/dist/web/assets/mobile-explorer-sheet-DpKfB6iF.js +0 -1
- package/dist/web/assets/monaco-dotenv-language-DD8_UQG7.js +0 -1
- package/dist/web/assets/nextflow-FQM6iZO2.js +0 -1
- package/dist/web/assets/nginx-Bg0TK_a9.js +0 -1
- package/dist/web/assets/nim-D1kSCHdq.js +0 -1
- package/dist/web/assets/notification-store-ByCdTvCC.js +0 -1
- package/dist/web/assets/notifications-settings-section-C5v8FoH9.js +0 -1
- package/dist/web/assets/number-overlay-editor-Bsr04yCI.js +0 -9
- package/dist/web/assets/onboarding-entry-C81awoR5.js +0 -1
- package/dist/web/assets/onboarding-quick-orientation-Dqmis-E5.js +0 -1
- package/dist/web/assets/overview-panel-9OdBcYJC.js +0 -1
- package/dist/web/assets/packet-RMMSAZCW-B0ZSm6VM.js +0 -1
- package/dist/web/assets/panel-store-D20Zuf3i.js +0 -1
- package/dist/web/assets/pdf-preview-DuR07OfN.js +0 -1
- package/dist/web/assets/perl-B6QNc69s.js +0 -1
- package/dist/web/assets/php-Bvwf1t96.js +0 -1
- package/dist/web/assets/pie-UPGHQEXC-DKM0oPn7.js +0 -1
- package/dist/web/assets/portal-container-context-BarKmT4S.js +0 -1
- package/dist/web/assets/postgres-viewer-CGf7_g6Z.js +0 -3
- package/dist/web/assets/ppmbot-settings-section-DeTFU1b-.js +0 -1
- package/dist/web/assets/problems-panel-Bgkcge5_.js +0 -1
- package/dist/web/assets/process-table-DH7pnH5I.js +0 -1
- package/dist/web/assets/project-framework-store-ViZgce6y.js +0 -1
- package/dist/web/assets/project-store-hNvwfqX3.js +0 -1
- package/dist/web/assets/proxy-settings-section-DMGMRHH-.js +0 -1
- package/dist/web/assets/pug-I8oitXP4.js +0 -1
- package/dist/web/assets/qml-LKb7CHg-.js +0 -1
- package/dist/web/assets/query-audit-section-CpiXQVcS.js +0 -1
- package/dist/web/assets/r-DHu15BOo.js +0 -1
- package/dist/web/assets/radar-KQ55EAFF-DKhtzXmy.js +0 -1
- package/dist/web/assets/razor-CIPT897U.js +0 -1
- package/dist/web/assets/react-Bghu0NUO.js +0 -1
- package/dist/web/assets/regexp-Vdt2OEkk.js +0 -1
- package/dist/web/assets/remote-desktop-clipboard-notice-Bj5FtU0O.js +0 -1
- package/dist/web/assets/remote-desktop-mobile-sheet-BhwVrKxv.js +0 -2
- package/dist/web/assets/remote-desktop-mobile-view-B1oAqbjG.js +0 -1
- package/dist/web/assets/remote-desktop-readiness-gate-2LE86aTu.js +0 -1
- package/dist/web/assets/remote-desktop-window-content-u8HwuzyN.js +0 -1
- package/dist/web/assets/rolldown-runtime-FhOqtrmT.js +0 -1
- package/dist/web/assets/rst-BpcmfJFA.js +0 -1
- package/dist/web/assets/ruby-Cx413jgE.js +0 -1
- package/dist/web/assets/run-in-terminal-BFR70TLU.js +0 -1
- package/dist/web/assets/sas-B3ui_NHy.js +0 -1
- package/dist/web/assets/schedules-settings-section-C8XNDdi9.js +0 -1
- package/dist/web/assets/scroll-area-C0fQWNnx.js +0 -1
- package/dist/web/assets/scss-V4NlXnGi.js +0 -1
- package/dist/web/assets/send-to-chat-C8l7AcV4.js +0 -1
- package/dist/web/assets/separator-DwDoQpxS.js +0 -1
- package/dist/web/assets/settings-body-DelxmiKf.js +0 -2
- package/dist/web/assets/settings-store-m6qOXoy4.js +0 -2
- package/dist/web/assets/settings-tab-Cb_dFdA6.js +0 -1
- package/dist/web/assets/settings-window-content-5EQQfC1t.js +0 -1
- package/dist/web/assets/shaderlab-Cf7qZ4DR.js +0 -1
- package/dist/web/assets/shellscript-DRxJLgrx.js +0 -1
- package/dist/web/assets/shellsession-BfA8Fmhb.js +0 -1
- package/dist/web/assets/soy-CGKN9rxg.js +0 -1
- package/dist/web/assets/sparql-CArCsIdI.js +0 -1
- package/dist/web/assets/sql-ljEiM8nf.js +0 -1
- package/dist/web/assets/sql-query-editor-B3wrPR6K.js +0 -1
- package/dist/web/assets/sqlite-viewer-iQXNp0kH.js +0 -1
- package/dist/web/assets/stata-CplvndbA.js +0 -1
- package/dist/web/assets/surrealql-DwX1PCpP.js +0 -1
- package/dist/web/assets/svelte-DYCNmQjy.js +0 -1
- package/dist/web/assets/system-monitor-body-5grJyA7C.js +0 -2
- package/dist/web/assets/system-monitor-tab-CJr797F8.js +0 -1
- package/dist/web/assets/system-monitor-window-content-OGAhFXXo.js +0 -1
- package/dist/web/assets/tab-host-window-content-C-eEo8I7.js +0 -1
- package/dist/web/assets/tab-store-krAuHQ6_.js +0 -1
- package/dist/web/assets/team-member-sheet-CRvJUtdh.js +0 -2
- package/dist/web/assets/team-member-window-content-C97N4RXb.js +0 -1
- package/dist/web/assets/templ-b_h2-Z9l.js +0 -1
- package/dist/web/assets/terminal-tab-eZwpkvEe.js +0 -3
- package/dist/web/assets/tex-022M3-MR.js +0 -1
- package/dist/web/assets/tool-cards-Bg4vjDYu.js +0 -9
- package/dist/web/assets/treemap-KZPCXAKY-CxqsD_6n.js +0 -1
- package/dist/web/assets/ts-tags-BUl0AdO6.js +0 -1
- package/dist/web/assets/tsx-CKaH7SzK.js +0 -1
- package/dist/web/assets/twig-CMzYUcSa.js +0 -1
- package/dist/web/assets/typescript-DZozDFsi.js +0 -1
- package/dist/web/assets/use-blob-url-C0VR6Uhh.js +0 -1
- package/dist/web/assets/use-inline-blame-CzR8CnOZ.js +0 -16
- package/dist/web/assets/use-is-mobile-TkcwP1Gx.js +0 -1
- package/dist/web/assets/use-lsp-BAoOSc-L.js +0 -6
- package/dist/web/assets/use-monaco-theme-Gd8cpt9n.js +0 -1
- package/dist/web/assets/use-open-team-member-y9sVhaNr.js +0 -1
- package/dist/web/assets/use-visual-viewport-Lp878uzs.js +0 -1
- package/dist/web/assets/use-websocket-CDfXkXo3.js +0 -1
- package/dist/web/assets/vendor-markdown-CuWCHIVb.js +0 -291
- package/dist/web/assets/vendor-mermaid-D6lgjvVE.js +0 -2921
- package/dist/web/assets/vendor-ui-DmZ-Mb-H.js +0 -45
- package/dist/web/assets/video-preview-BYJ3aVo1.js +0 -1
- package/dist/web/assets/vue-D83SsURi.js +0 -1
- package/dist/web/assets/vue-html-BGU-OYYb.js +0 -1
- package/dist/web/assets/vue-vine-1sHE1gZn.js +0 -1
- package/dist/web/assets/window-pip-registry-D1oXq-Dq.js +0 -1
- package/dist/web/assets/window-store-UC1jJeLM.js +0 -1
- package/dist/web/assets/ws-auth-CaxV807E.js +0 -1
- package/dist/web/assets/xml-bWQJszMK.js +0 -1
- package/dist/web/assets/xsl-DTMc1Tsm.js +0 -1
- package/dist/web/assets/yaml-4pzZq5KT.js +0 -1
- /package/dist/web/assets/{abap-DrxZXLHj.js → abap-DWbETETF.js} +0 -0
- /package/dist/web/assets/{actionscript-3-DOPR4pRC.js → actionscript-3-C278tgAF.js} +0 -0
- /package/dist/web/assets/{ada-DkqjEnDr.js → ada-C_5J29IC.js} +0 -0
- /package/dist/web/assets/{andromeeda-BSZjevw2.js → andromeeda-Ct0fb9Zo.js} +0 -0
- /package/dist/web/assets/{apache-DYwdQ5F_.js → apache-oMwCqc2o.js} +0 -0
- /package/dist/web/assets/{apex-Dohu7DfB.js → apex-n6XQQudq.js} +0 -0
- /package/dist/web/assets/{applescript-CdfGIVqp.js → applescript-QDMA6blY.js} +0 -0
- /package/dist/web/assets/{apply-theme-CbR31K6I.js → apply-theme-aVoqSG0I.js} +0 -0
- /package/dist/web/assets/{ara-i3_3TMnI.js → ara-D6rg_rTp.js} +0 -0
- /package/dist/web/assets/{asciidoc-DJFM-7vl.js → asciidoc-DVeBWv0S.js} +0 -0
- /package/dist/web/assets/{asm-bMFssizQ.js → asm-DzHQzzqu.js} +0 -0
- /package/dist/web/assets/{aurora-x-CetC7M8b.js → aurora-x-pJESoXa6.js} +0 -0
- /package/dist/web/assets/{awk-FFWx9ZrE.js → awk-BwfK4mzn.js} +0 -0
- /package/dist/web/assets/{ayu-dark-D4ION2wO.js → ayu-dark-CG-9c7ej.js} +0 -0
- /package/dist/web/assets/{ayu-light-BZN99P5A.js → ayu-light-BGUfMG6m.js} +0 -0
- /package/dist/web/assets/{ayu-mirage-B-IpsKiL.js → ayu-mirage-CMD89qy6.js} +0 -0
- /package/dist/web/assets/{ballerina-DhyJcKkq.js → ballerina-CP5gYaiB.js} +0 -0
- /package/dist/web/assets/{bat-GOVQY81F.js → bat-DCRdiK45.js} +0 -0
- /package/dist/web/assets/{beancount-BO749Rhc.js → beancount-DHkDiOKO.js} +0 -0
- /package/dist/web/assets/{berry-CHYYKXmK.js → berry-B6TPldKS.js} +0 -0
- /package/dist/web/assets/{bibtex-BnYiDnxT.js → bibtex-DIor8yh9.js} +0 -0
- /package/dist/web/assets/{bicep-kljgR_G3.js → bicep-BbIdLZZ_.js} +0 -0
- /package/dist/web/assets/{bird2-DnLtJGhV.js → bird2-C76TmOG1.js} +0 -0
- /package/dist/web/assets/{c3-fc_jio6D.js → c3-CqZ77xXr.js} +0 -0
- /package/dist/web/assets/{cadence-DopRCrdB.js → cadence-BlaAb6F6.js} +0 -0
- /package/dist/web/assets/{can-open-in-ppm-CUW3vVJg.js → can-open-in-ppm-D8T6Xca-.js} +0 -0
- /package/dist/web/assets/{catppuccin-frappe-DL6iCUa8.js → catppuccin-frappe-BuV7Zg67.js} +0 -0
- /package/dist/web/assets/{catppuccin-latte-DNF7n3uY.js → catppuccin-latte-B7HXEZf7.js} +0 -0
- /package/dist/web/assets/{catppuccin-macchiato-ByMic_k0.js → catppuccin-macchiato-B0KctcoC.js} +0 -0
- /package/dist/web/assets/{catppuccin-mocha-DcrJtZtv.js → catppuccin-mocha-Bofr5rzo.js} +0 -0
- /package/dist/web/assets/{clarity-0cRLlvQe.js → clarity-CerfZ3dW.js} +0 -0
- /package/dist/web/assets/{clojure-DPqZAcpI.js → clojure-BCEG1uj6.js} +0 -0
- /package/dist/web/assets/{cmake-Bx26bw5u.js → cmake-CRxSSKSr.js} +0 -0
- /package/dist/web/assets/{codeowners-BpgxIgxr.js → codeowners-BqW6DYSk.js} +0 -0
- /package/dist/web/assets/{codeql-TRoWjo5g.js → codeql-DlnOpgWF.js} +0 -0
- /package/dist/web/assets/{common-lisp-Ctohamsb.js → common-lisp-DgIX9jkq.js} +0 -0
- /package/dist/web/assets/{coq-BO6TJSED.js → coq-CFeLOER-.js} +0 -0
- /package/dist/web/assets/{csharp-DSy4nlrl.js → csharp-BGFGcV8G.js} +0 -0
- /package/dist/web/assets/{csv-DND7YJXD.js → csv-Cx126-fo.js} +0 -0
- /package/dist/web/assets/{csv-parser-DZ_75eCb.js → csv-parser-BXeH-yzY.js} +0 -0
- /package/dist/web/assets/{cue-BUnWK221.js → cue-Cd0PEGFL.js} +0 -0
- /package/dist/web/assets/{cypher-CInm9Etl.js → cypher-QS9S-1Nu.js} +0 -0
- /package/dist/web/assets/{d-BbsB8r6R.js → d-Bx6zK6J7.js} +0 -0
- /package/dist/web/assets/{dark-plus-DkzIiuQX.js → dark-plus-DLqXEd2I.js} +0 -0
- /package/dist/web/assets/{dart-BG2nw7Se.js → dart-BL2C2Z6E.js} +0 -0
- /package/dist/web/assets/{dax-j4h6VhlV.js → dax-ClxUDxvY.js} +0 -0
- /package/dist/web/assets/{desktop-Dg34JDlS.js → desktop-DLEkw1UR.js} +0 -0
- /package/dist/web/assets/{diff-CRrKo-mH.js → diff-Dlp9KQSL.js} +0 -0
- /package/dist/web/assets/{dist-D39GQICe.js → dist-CDpxSUMU.js} +0 -0
- /package/dist/web/assets/{docker-DAtcxZjt.js → docker-DVBsQYb-.js} +0 -0
- /package/dist/web/assets/{dotenv-DNUcgQCn.js → dotenv-DjBB7S8B.js} +0 -0
- /package/dist/web/assets/{dracula-bhhaShNC.js → dracula-Cu055q9D.js} +0 -0
- /package/dist/web/assets/{dracula-soft-CeHAoi-D.js → dracula-soft-BiX_luwV.js} +0 -0
- /package/dist/web/assets/{dream-maker-BMH1JI2G.js → dream-maker-S6ie6kFg.js} +0 -0
- /package/dist/web/assets/{editor-font-D_4aaSCa.js → editor-font-BOjGgYeg.js} +0 -0
- /package/dist/web/assets/{emacs-lisp-BaAYIdWN.js → emacs-lisp-DpOda430.js} +0 -0
- /package/dist/web/assets/{everforest-dark-Cs91gPa_.js → everforest-dark-BAfSXdLG.js} +0 -0
- /package/dist/web/assets/{everforest-light-lTkE6qWA.js → everforest-light-Dp59kp4R.js} +0 -0
- /package/dist/web/assets/{fennel-CmhYEhcM.js → fennel-CNaNUmMo.js} +0 -0
- /package/dist/web/assets/{fish-p1jauFum.js → fish-C8Z04ic7.js} +0 -0
- /package/dist/web/assets/{fluent-BsH-lUh2.js → fluent-Bugk01mf.js} +0 -0
- /package/dist/web/assets/{format-bytes-amUJ8Js8.js → format-bytes-DBBzVCYA.js} +0 -0
- /package/dist/web/assets/{fortran-free-form-CB6SdVKB.js → fortran-free-form-csIz6MQj.js} +0 -0
- /package/dist/web/assets/{gdscript--YoKuvEA.js → gdscript-fdzYQLfk.js} +0 -0
- /package/dist/web/assets/{gdshader-BRtMwf5z.js → gdshader-CfsEtDeZ.js} +0 -0
- /package/dist/web/assets/{genie-wrzVG2Z8.js → genie-CtHN5N2Q.js} +0 -0
- /package/dist/web/assets/{gherkin-HnpURN27.js → gherkin-gSp2ZJTf.js} +0 -0
- /package/dist/web/assets/{github-dark-XlZ3pGhn.js → github-dark-D7O9efii.js} +0 -0
- /package/dist/web/assets/{github-dark-default-D_R0hfJe.js → github-dark-default-Bv2wIhqD.js} +0 -0
- /package/dist/web/assets/{github-dark-dimmed-BHQgHLnK.js → github-dark-dimmed-BuY_SpCX.js} +0 -0
- /package/dist/web/assets/{github-dark-high-contrast-Pbl4mEFe.js → github-dark-high-contrast-Chv0f5Wu.js} +0 -0
- /package/dist/web/assets/{github-light-0P0VANJn.js → github-light-DV8f-W2f.js} +0 -0
- /package/dist/web/assets/{github-light-default-DTfsnyDq.js → github-light-default-CNBSU3dB.js} +0 -0
- /package/dist/web/assets/{github-light-high-contrast-DKITR-5Y.js → github-light-high-contrast-sg94tHwU.js} +0 -0
- /package/dist/web/assets/{gleam-refSZtkM.js → gleam-w7270-PJ.js} +0 -0
- /package/dist/web/assets/{gn-BZ9cGckR.js → gn-yo_iE_A_.js} +0 -0
- /package/dist/web/assets/{gnuplot-CMHqDcTW.js → gnuplot-DSBPrzl4.js} +0 -0
- /package/dist/web/assets/{go-bFdCrzvY.js → go-D1S7g97D.js} +0 -0
- /package/dist/web/assets/{groovy-Dvz5tluQ.js → groovy-C7xW-5IV.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-hard-D0Z-pclr.js → gruvbox-dark-hard-BZald7Z_.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-medium-BG6oIRQR.js → gruvbox-dark-medium-v6W4PZne.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-soft-ILJ-3tU6.js → gruvbox-dark-soft-CN5mIGkw.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-hard-Bl95khkz.js → gruvbox-light-hard-D3NIGRxd.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-medium-CdislFOh.js → gruvbox-light-medium-m4ShuCnD.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-soft-CTcEyxlX.js → gruvbox-light-soft-BEEYNyk-.js} +0 -0
- /package/dist/web/assets/{haskell-D9jfkQuH.js → haskell-CgtdXIH3.js} +0 -0
- /package/dist/web/assets/{haxe-Ckfl4osD.js → haxe-D7HQqtIx.js} +0 -0
- /package/dist/web/assets/{hcl-t03N4k5N.js → hcl-C-YHDaXH.js} +0 -0
- /package/dist/web/assets/{hjson-B_TIVRki.js → hjson-BrgEMvJK.js} +0 -0
- /package/dist/web/assets/{hlsl-BBCTeANz.js → hlsl-BsDumu1j.js} +0 -0
- /package/dist/web/assets/{horizon-CRY-xdGU.js → horizon-D9Kre3KQ.js} +0 -0
- /package/dist/web/assets/{horizon-bright-BpUM2C5u.js → horizon-bright-DJq8c_Yq.js} +0 -0
- /package/dist/web/assets/{houston-RVyAGlyS.js → houston-B9tnxzX8.js} +0 -0
- /package/dist/web/assets/{hy-BHFJHuHd.js → hy-DUYVvXOj.js} +0 -0
- /package/dist/web/assets/{image-gallery-DdQblMAe.js → image-gallery-DvAgPQ3L.js} +0 -0
- /package/dist/web/assets/{image-preview-geometry-BFKR37Pj.js → image-preview-geometry-B-SdD7_D.js} +0 -0
- /package/dist/web/assets/{imba-DyG0_0MS.js → imba-CGW-TsRm.js} +0 -0
- /package/dist/web/assets/{ini-CsCTH-_o.js → ini-PqgYiEAV.js} +0 -0
- /package/dist/web/assets/{json5-g3g-IFTV.js → json5-sbkvqHou.js} +0 -0
- /package/dist/web/assets/{jsonc-DQHBJwib.js → jsonc-pnywfpws.js} +0 -0
- /package/dist/web/assets/{jsonl-zFLDm4eB.js → jsonl-ZPOQ0pRn.js} +0 -0
- /package/dist/web/assets/{jsonnet-DgNm2IGn.js → jsonnet-B_Q7j1YF.js} +0 -0
- /package/dist/web/assets/{jssm-BErkU0In.js → jssm-K-xYeQyp.js} +0 -0
- /package/dist/web/assets/{kanagawa-dragon-Dgymfjca.js → kanagawa-dragon-DAdLBtU8.js} +0 -0
- /package/dist/web/assets/{kanagawa-lotus-CWZEYd27.js → kanagawa-lotus-5BwvVGu8.js} +0 -0
- /package/dist/web/assets/{kanagawa-wave-CQg17ecf.js → kanagawa-wave-C0h9fsDT.js} +0 -0
- /package/dist/web/assets/{kdl-DY4GHmJC.js → kdl-DXSsFcms.js} +0 -0
- /package/dist/web/assets/{kotlin-DeGTz7bl.js → kotlin-BXNIvloo.js} +0 -0
- /package/dist/web/assets/{kusto-BN-OqpQj.js → kusto-wM3eio5V.js} +0 -0
- /package/dist/web/assets/{laserwave-bAqiAiOp.js → laserwave-FcbxdP2A.js} +0 -0
- /package/dist/web/assets/{lean-CAypLWCf.js → lean-RenzGeoM.js} +0 -0
- /package/dist/web/assets/{less-ikHAUlPb.js → less-CcUdtNJi.js} +0 -0
- /package/dist/web/assets/{libesm-cUHvIIuW.js → libesm-DMnQ3WlF.js} +0 -0
- /package/dist/web/assets/{light-plus-BamuTcT9.js → light-plus-BsMoOZJR.js} +0 -0
- /package/dist/web/assets/{llvm-CddObVkW.js → llvm-CyylMBuq.js} +0 -0
- /package/dist/web/assets/{log-CWbfGTTc.js → log-BOi0GB58.js} +0 -0
- /package/dist/web/assets/{logo-AHyhxX3Z.js → logo-BQUr3X2Y.js} +0 -0
- /package/dist/web/assets/{luau-y7she9L3.js → luau-3YZRDIsh.js} +0 -0
- /package/dist/web/assets/{make-DP3sQaP3.js → make-DEkKRDRU.js} +0 -0
- /package/dist/web/assets/{markdown-9Nuxib8a.js → markdown-BmFN0-A1.js} +0 -0
- /package/dist/web/assets/{material-theme-DDpm-uS7.js → material-theme-DqLHjEZ8.js} +0 -0
- /package/dist/web/assets/{material-theme-darker-CHk91wbm.js → material-theme-darker-DhbvULnI.js} +0 -0
- /package/dist/web/assets/{material-theme-lighter-LkmOI8KM.js → material-theme-lighter-C_aA4yVe.js} +0 -0
- /package/dist/web/assets/{material-theme-ocean-PpkUhB4-.js → material-theme-ocean-Pk5JltJS.js} +0 -0
- /package/dist/web/assets/{material-theme-palenight-DZAigXgW.js → material-theme-palenight-DNi3VguV.js} +0 -0
- /package/dist/web/assets/{matlab-CexKVVPc.js → matlab-BqUtv2ml.js} +0 -0
- /package/dist/web/assets/{mdx-BrcepHfI.js → mdx-DFMrnHBn.js} +0 -0
- /package/dist/web/assets/{mermaid-CNFhZZaG.js → mermaid-BpyuE0L_.js} +0 -0
- /package/dist/web/assets/{min-dark-hd3nbDV4.js → min-dark-DVfCMEPW.js} +0 -0
- /package/dist/web/assets/{min-light-AqA5jmks.js → min-light-B96aMADV.js} +0 -0
- /package/dist/web/assets/{mipsasm-B3x4L8Zk.js → mipsasm-DHhEcvKr.js} +0 -0
- /package/dist/web/assets/{mojo-CvfXy3YL.js → mojo-BQ6HsVIQ.js} +0 -0
- /package/dist/web/assets/{monokai-CdxwmnU_.js → monokai-amcXAKGG.js} +0 -0
- /package/dist/web/assets/{moonbit-6Z_VCO0_.js → moonbit-CGSXXQJI.js} +0 -0
- /package/dist/web/assets/{move-B2__B6Po.js → move-BOa4mq0q.js} +0 -0
- /package/dist/web/assets/{narrat-D6vL6wL-.js → narrat-dBYNSnhr.js} +0 -0
- /package/dist/web/assets/{nextflow-groovy-L-FBME4e.js → nextflow-groovy-Dm2Y_qgn.js} +0 -0
- /package/dist/web/assets/{night-owl-DjKrkDjv.js → night-owl-Dy9ibYHN.js} +0 -0
- /package/dist/web/assets/{night-owl-light-CeGjPuUQ.js → night-owl-light-DamYjQKi.js} +0 -0
- /package/dist/web/assets/{nix-dr279CcA.js → nix-C1LyoszC.js} +0 -0
- /package/dist/web/assets/{nord-Dxn-_H_Y.js → nord-LtGRYAFI.js} +0 -0
- /package/dist/web/assets/{nushell-DgeAQO7j.js → nushell-BMoOkt47.js} +0 -0
- /package/dist/web/assets/{objective-c-CO0-Pacn.js → objective-c-CILaOZJu.js} +0 -0
- /package/dist/web/assets/{objective-cpp-SkrjegYw.js → objective-cpp-D5Fo-SoM.js} +0 -0
- /package/dist/web/assets/{ocaml-CAihtkib.js → ocaml-D1TCTCEJ.js} +0 -0
- /package/dist/web/assets/{odin-D0XZbUDB.js → odin-CjdYcmpW.js} +0 -0
- /package/dist/web/assets/{one-dark-pro-BUMNMxjX.js → one-dark-pro-GpsZUGZl.js} +0 -0
- /package/dist/web/assets/{one-light-C0Ui69Bx.js → one-light-DlketcS4.js} +0 -0
- /package/dist/web/assets/{openscad-fZ9ggqM-.js → openscad-BoT8wwuI.js} +0 -0
- /package/dist/web/assets/{pascal-DvZm-eun.js → pascal-Cqy403Sf.js} +0 -0
- /package/dist/web/assets/{pkl-CQSIp_z8.js → pkl-D6gRI9qQ.js} +0 -0
- /package/dist/web/assets/{plastic-CMspsouJ.js → plastic-DgvX8DXX.js} +0 -0
- /package/dist/web/assets/{plsql-B_HL7UfT.js → plsql-CTDnCVE3.js} +0 -0
- /package/dist/web/assets/{po-DxAfbdfe.js → po-DDnzm7AQ.js} +0 -0
- /package/dist/web/assets/{poimandres-JGmqmwux.js → poimandres-C4HQwFp-.js} +0 -0
- /package/dist/web/assets/{polar-_mNmplk8.js → polar-WBTQdMzX.js} +0 -0
- /package/dist/web/assets/{postcss-GpU0Sjqc.js → postcss-CWxogTg1.js} +0 -0
- /package/dist/web/assets/{powerquery-B1IP1lCQ.js → powerquery-DVtReIRR.js} +0 -0
- /package/dist/web/assets/{powershell-BiSO9XmG.js → powershell-Cb_RNzSh.js} +0 -0
- /package/dist/web/assets/{prisma-4QqDYSnH.js → prisma-nKLUh3DY.js} +0 -0
- /package/dist/web/assets/{prolog-BNjvyRqT.js → prolog-BD9orEy4.js} +0 -0
- /package/dist/web/assets/{proto-RNOumnkw.js → proto-B-AFoz75.js} +0 -0
- /package/dist/web/assets/{puppet-CDfv5o8f.js → puppet-DDW6wWm4.js} +0 -0
- /package/dist/web/assets/{purescript-YTjSoifd.js → purescript-DXy49AJg.js} +0 -0
- /package/dist/web/assets/{python-Mh7JD25U.js → python-BQnvDlc7.js} +0 -0
- /package/dist/web/assets/{qmldir-Da_ZrqZy.js → qmldir-CboMQXQW.js} +0 -0
- /package/dist/web/assets/{qss-DANVkyhy.js → qss-8XaprLEt.js} +0 -0
- /package/dist/web/assets/{racket-CwPOn4T1.js → racket-ChcVp15M.js} +0 -0
- /package/dist/web/assets/{raku-B04lBsXd.js → raku-dEgEXW0A.js} +0 -0
- /package/dist/web/assets/{red-MW6Zm5pd.js → red-hmwjontD.js} +0 -0
- /package/dist/web/assets/{reg-44SURM-E.js → reg-CIkOufh2.js} +0 -0
- /package/dist/web/assets/{rel-Gu5Erhpm.js → rel-NXKKDiTi.js} +0 -0
- /package/dist/web/assets/{resolve-theme-BNubecVz.js → resolve-theme-B87m6l4i.js} +0 -0
- /package/dist/web/assets/{riscv-DZDP0Ce7.js → riscv-BEIzhPcg.js} +0 -0
- /package/dist/web/assets/{ron-BwLObbl6.js → ron-CW2Bt8rN.js} +0 -0
- /package/dist/web/assets/{rose-pine-Bz6ToXok.js → rose-pine-DhnBfr5a.js} +0 -0
- /package/dist/web/assets/{rose-pine-dawn-LyFogzAh.js → rose-pine-dawn-Jyj59rVs.js} +0 -0
- /package/dist/web/assets/{rose-pine-moon-CpjkefjD.js → rose-pine-moon-BMulxhJC.js} +0 -0
- /package/dist/web/assets/{rosmsg-BldDLaz1.js → rosmsg-DuctJm-Q.js} +0 -0
- /package/dist/web/assets/{rust-74skZ8CC.js → rust-FbJ2fCp9.js} +0 -0
- /package/dist/web/assets/{sass-CitUFDWl.js → sass-Dfxwdu2h.js} +0 -0
- /package/dist/web/assets/{scala-D2kl5ghT.js → scala-ClsSR0wG.js} +0 -0
- /package/dist/web/assets/{scheme-DZqhC9Xs.js → scheme-Jj_Cc-8H.js} +0 -0
- /package/dist/web/assets/{sdbl-D6a8sHP9.js → sdbl-Bi8D_DGN.js} +0 -0
- /package/dist/web/assets/{slack-dark-DrlPLUB_.js → slack-dark-B7gbmJT9.js} +0 -0
- /package/dist/web/assets/{slack-ochin-Djgychog.js → slack-ochin-O7j_c76D.js} +0 -0
- /package/dist/web/assets/{smalltalk-CYQHXftK.js → smalltalk-BD5-U3JK.js} +0 -0
- /package/dist/web/assets/{snazzy-light-BQAdF14K.js → snazzy-light-BbiRB69_.js} +0 -0
- /package/dist/web/assets/{solarized-dark-JDtJfY-g.js → solarized-dark-2OWHYEBu.js} +0 -0
- /package/dist/web/assets/{solarized-light-DHzVPLDD.js → solarized-light-Cew4YqT3.js} +0 -0
- /package/dist/web/assets/{solidity-CYCEiPu1.js → solidity-Bpbne2Tx.js} +0 -0
- /package/dist/web/assets/{splunk-B7RHmJY2.js → splunk-Dq86L1_O.js} +0 -0
- /package/dist/web/assets/{ssh-config-B74-n00O.js → ssh-config-j5hsMvbs.js} +0 -0
- /package/dist/web/assets/{stylus-xlRhcbpN.js → stylus-DWhCIBg0.js} +0 -0
- /package/dist/web/assets/{swift-DTFwWJtu.js → swift-29fG5ztW.js} +0 -0
- /package/dist/web/assets/{synthwave-84-BuCpuX2E.js → synthwave-84-DraIUmiw.js} +0 -0
- /package/dist/web/assets/{system-verilog-CgxJCrOK.js → system-verilog-DqcJAWq_.js} +0 -0
- /package/dist/web/assets/{systemd-D0x7_XYJ.js → systemd-BUPJrx1D.js} +0 -0
- /package/dist/web/assets/{talonscript-B50aQRuc.js → talonscript-BGYbnAKh.js} +0 -0
- /package/dist/web/assets/{tasl-Byv8gHCL.js → tasl-CwbSJqng.js} +0 -0
- /package/dist/web/assets/{tcl-CzMjCzWo.js → tcl-Ba9376wa.js} +0 -0
- /package/dist/web/assets/{terraform-D6GH4CXG.js → terraform-ChSasWu8.js} +0 -0
- /package/dist/web/assets/{tokyo-night-CQ4rTpHY.js → tokyo-night-Bbw1Yguv.js} +0 -0
- /package/dist/web/assets/{toml-D9W-BuJE.js → toml-CYb7zi5B.js} +0 -0
- /package/dist/web/assets/{tsv-BddanT8p.js → tsv-P2eVmwf9.js} +0 -0
- /package/dist/web/assets/{turtle-BddVklvD.js → turtle-DIoQTATC.js} +0 -0
- /package/dist/web/assets/{typespec-D60I2kfB.js → typespec-Dpr1bC2k.js} +0 -0
- /package/dist/web/assets/{typst-Bxvc-9ID.js → typst-D4WMCDMn.js} +0 -0
- /package/dist/web/assets/{utils-Bmf_8h7Y.js → utils-btZ8C8-R.js} +0 -0
- /package/dist/web/assets/{v-kVYZE10o.js → v-B1wY-VFU.js} +0 -0
- /package/dist/web/assets/{vala-B3zj44PV.js → vala-BKqhrirP.js} +0 -0
- /package/dist/web/assets/{vb-CHgWrFTj.js → vb-S9PHCa7-.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-_yyu5n32.js → vendor-xterm-BHKF_Nsf.js} +0 -0
- /package/dist/web/assets/{verilog-zIMuE3hE.js → verilog-CrztYl3V.js} +0 -0
- /package/dist/web/assets/{vesper-BjqPTQr0.js → vesper-C5KfcyFv.js} +0 -0
- /package/dist/web/assets/{vhdl-Q2EtgpQN.js → vhdl-D0qMeIJu.js} +0 -0
- /package/dist/web/assets/{viml-CrtDZkFz.js → viml-Dsv9mRPK.js} +0 -0
- /package/dist/web/assets/{vitesse-black-D2VWO3oN.js → vitesse-black-rJvNN5GN.js} +0 -0
- /package/dist/web/assets/{vitesse-dark-lleZmHBJ.js → vitesse-dark-CYp0WWjf.js} +0 -0
- /package/dist/web/assets/{vitesse-light-utUY298S.js → vitesse-light-BczSAvzE.js} +0 -0
- /package/dist/web/assets/{vyper-LQ1KxOUo.js → vyper-DM7bKz7E.js} +0 -0
- /package/dist/web/assets/{wasm-CJ9U4zWg.js → wasm-BXCHhbrz.js} +0 -0
- /package/dist/web/assets/{wasm-B-mpMVDM.js → wasm-CAJoqhGc.js} +0 -0
- /package/dist/web/assets/{wenyan-LqMyA7px.js → wenyan-NQ8fdbEq.js} +0 -0
- /package/dist/web/assets/{wgsl-eI4U21sm.js → wgsl-C88C7vmC.js} +0 -0
- /package/dist/web/assets/{wikitext-CuWC2dfS.js → wikitext-D92r7uX8.js} +0 -0
- /package/dist/web/assets/{wit-CCPY0MNz.js → wit-DNvTfQjW.js} +0 -0
- /package/dist/web/assets/{wolfram-CXhjyJun.js → wolfram-CNS5lCGj.js} +0 -0
- /package/dist/web/assets/{zenscript-BzHPI08Q.js → zenscript-B_rGi-H_.js} +0 -0
- /package/dist/web/assets/{zig-CBuhKUve.js → zig-BRi9UYQa.js} +0 -0
package/src/server/ws/chat.ts
CHANGED
|
@@ -3,7 +3,8 @@ import { providerRegistry } from "../../providers/registry.ts";
|
|
|
3
3
|
import { resolveProjectPath } from "../helpers/resolve-project.ts";
|
|
4
4
|
import { logSessionEvent } from "../../services/session-log.service.ts";
|
|
5
5
|
import { listSessions as sdkListSessions } from "@anthropic-ai/claude-agent-sdk";
|
|
6
|
-
import { getSessionTitle, incrementSessionUnread, clearSessionUnread, getSessionModel, setSessionModel, getSessionProvider, getSessionEffort, setSessionEffort, getSessionThinking, setSessionThinking, setSessionMigratedTo } from "../../services/db.service.ts";
|
|
6
|
+
import { getSessionTitle, incrementSessionUnread, clearSessionUnread, getSessionModel, setSessionModel, getSessionProvider, getSessionEffort, setSessionEffort, getSessionThinking, setSessionThinking, setSessionMigratedTo, getSessionDesignSlug, setSessionPermissionMode } from "../../services/db.service.ts";
|
|
7
|
+
import { VALID_PERMISSION_MODES } from "../../types/config.ts";
|
|
7
8
|
import { VALID_EFFORT_VALUES, THINKING_ADAPTIVE, isThinkingEnabled } from "../../providers/claude-agent-sdk-query-options.ts";
|
|
8
9
|
import type { ChatWsClientMessage, SessionPhase } from "../../types/api.ts";
|
|
9
10
|
// File watching and app-wide broadcasts are owned by the global WS (`./global.ts`)
|
|
@@ -1210,6 +1211,12 @@ export const chatWebSocket = {
|
|
|
1210
1211
|
// Store permission mode — sticky for this session
|
|
1211
1212
|
if (parsed.permissionMode) {
|
|
1212
1213
|
entry.permissionMode = parsed.permissionMode;
|
|
1214
|
+
// A design session keeps its mode for callers that pass none (CLI, scheduler), so
|
|
1215
|
+
// the one the user picked here is written back rather than living in this socket.
|
|
1216
|
+
if (VALID_PERMISSION_MODES.includes(parsed.permissionMode as typeof VALID_PERMISSION_MODES[number])
|
|
1217
|
+
&& getSessionDesignSlug(sessionId)) {
|
|
1218
|
+
setSessionPermissionMode(sessionId, parsed.permissionMode);
|
|
1219
|
+
}
|
|
1213
1220
|
}
|
|
1214
1221
|
// Store model override — sticky for this session
|
|
1215
1222
|
if (parsed.model) {
|
package/src/server/ws/global.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* file watching at all — silently breaking editor live-reload, docx/pdf
|
|
11
11
|
* preview reload, and file-tree invalidation.
|
|
12
12
|
* 2. **Cross-cutting broadcasts** (`file:changed`, `session:unread_changed`,
|
|
13
|
-
* `session:phase_changed`, `jira:*`). These are app-wide, not session-scoped,
|
|
13
|
+
* `session:phase_changed`, `jira:*`, `design:*`). These are app-wide, not session-scoped,
|
|
14
14
|
* so they belong on an app-wide channel.
|
|
15
15
|
*
|
|
16
16
|
* Events go to global clients only — never also to chat clients — so a client
|
|
@@ -19,6 +19,8 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import { startWatching, stopWatching, onFileChange } from "../../services/file-watcher.service.ts";
|
|
21
21
|
import { configService } from "../../services/config.service.ts";
|
|
22
|
+
import { onDesignEvent } from "../../services/design/design-events.ts";
|
|
23
|
+
import { resolve } from "node:path";
|
|
22
24
|
|
|
23
25
|
type GlobalWsSocket = {
|
|
24
26
|
data: { type: string };
|
|
@@ -67,6 +69,25 @@ onFileChange((projectName, path) => {
|
|
|
67
69
|
broadcastGlobalEvent({ type: "file:changed", projectName, path });
|
|
68
70
|
});
|
|
69
71
|
|
|
72
|
+
/** Registered project whose folder is `projectPath`, or null. Case-folded on Windows. */
|
|
73
|
+
function projectNameForPath(projectPath: string): string | null {
|
|
74
|
+
const fold = (p: string) => (process.platform === "win32" ? resolve(p).toLowerCase() : resolve(p));
|
|
75
|
+
const target = fold(projectPath);
|
|
76
|
+
return configService.get("projects").find((p) => fold(p.path) === target)?.name ?? null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Design history/comment changes: `.design/` is not watched, so these are the only signal.
|
|
80
|
+
// Services know the project path; browsers address projects by name, and a path no
|
|
81
|
+
// registered project owns is dropped rather than broadcast.
|
|
82
|
+
onDesignEvent((type, { projectPath, slug, requestId, screenshot }) => {
|
|
83
|
+
const projectName = projectNameForPath(projectPath);
|
|
84
|
+
if (!projectName) return;
|
|
85
|
+
broadcastGlobalEvent({
|
|
86
|
+
type: `design:${type}`, projectName, slug,
|
|
87
|
+
...(requestId ? { requestId, screenshot: screenshot === true } : {}),
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
|
|
70
91
|
export const globalWebSocket = {
|
|
71
92
|
open(ws: GlobalWsSocket) {
|
|
72
93
|
clients.add(ws);
|
|
@@ -12,6 +12,23 @@ import type {
|
|
|
12
12
|
SendMessageOpts,
|
|
13
13
|
} from "../providers/provider.interface.ts";
|
|
14
14
|
import { compareSessionsByActivity } from "../types/chat.ts";
|
|
15
|
+
import { buildDesignInstructions } from "./design/design-instructions.ts";
|
|
16
|
+
import { isValidDesignSlug } from "./design/design-slug.ts";
|
|
17
|
+
import { scheduleTurnSnapshot } from "./design/design-turn-snapshot.ts";
|
|
18
|
+
import { designMcpAccessFor } from "./design/mcp/design-mcp-access.ts";
|
|
19
|
+
import { designMcpTokens } from "./design/mcp/design-mcp-tokens.ts";
|
|
20
|
+
import { isTerminalAgentStatus } from "../shared/background-agent-status.ts";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Events after which a design session's files may have settled: the end of a turn, and a
|
|
24
|
+
* background task (which can keep writing after the turn's `done`) reaching a final state.
|
|
25
|
+
*/
|
|
26
|
+
function endsDesignWork(event: ChatEvent): boolean {
|
|
27
|
+
if (event.type === "done") return true;
|
|
28
|
+
if (event.type !== "system" || event.subtype !== "task_notification") return false;
|
|
29
|
+
const status = (event as { taskStatus?: string }).taskStatus;
|
|
30
|
+
return isTerminalAgentStatus(status) || status === "killed";
|
|
31
|
+
}
|
|
15
32
|
|
|
16
33
|
class ChatService {
|
|
17
34
|
// Delivery hints only: a restart/eviction safely sends a fresh snapshot.
|
|
@@ -86,6 +103,7 @@ class ChatService {
|
|
|
86
103
|
const provider = providerRegistry.get(providerId);
|
|
87
104
|
if (!provider) throw new Error(`Provider "${providerId}" not found`);
|
|
88
105
|
this.invalidateSharedContext(providerId, sessionId);
|
|
106
|
+
designMcpTokens.revoke(sessionId);
|
|
89
107
|
return provider.deleteSession(sessionId);
|
|
90
108
|
}
|
|
91
109
|
|
|
@@ -111,6 +129,17 @@ class ChatService {
|
|
|
111
129
|
if (event.type === "error" || (event.type === "done" && event.resultSubtype?.startsWith("error")) || (event.type === "system" && event.subtype === "compact_done")) {
|
|
112
130
|
this.invalidateSharedContext(providerId, activeSessionId);
|
|
113
131
|
}
|
|
132
|
+
if (event.type === "session_migrated" && event.newSessionId !== event.oldSessionId) {
|
|
133
|
+
// Carries the design slug and stored mode (with model/effort) to the provider's
|
|
134
|
+
// real id for callers that are not the WebSocket, which records this itself —
|
|
135
|
+
// the copy keeps whatever the destination already has, so doing both is safe.
|
|
136
|
+
try {
|
|
137
|
+
const { setSessionMigratedTo } = await import("./db.service.ts");
|
|
138
|
+
setSessionMigratedTo(event.oldSessionId, event.newSessionId);
|
|
139
|
+
} catch (e) {
|
|
140
|
+
console.warn(`[chat] could not record session migration: ${(e as Error).message}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
114
143
|
const migratedId = event.type === "session_migrated" ? event.newSessionId : event.type === "done" ? event.sessionId : undefined;
|
|
115
144
|
if (migratedId && migratedId !== activeSessionId) {
|
|
116
145
|
const snapshot = this.sharedSnapshots.get(`${providerId}:${activeSessionId}`);
|
|
@@ -120,6 +149,10 @@ class ChatService {
|
|
|
120
149
|
}
|
|
121
150
|
activeSessionId = migratedId;
|
|
122
151
|
}
|
|
152
|
+
if (endsDesignWork(event)) {
|
|
153
|
+
// Not awaited: the snapshot is debounced and must never hold up or fail the turn.
|
|
154
|
+
scheduleTurnSnapshot(activeSessionId, this.getSession(activeSessionId)?.projectPath);
|
|
155
|
+
}
|
|
123
156
|
yield event;
|
|
124
157
|
}
|
|
125
158
|
finished = true;
|
|
@@ -136,6 +169,7 @@ class ChatService {
|
|
|
136
169
|
opts?: SendMessageOpts,
|
|
137
170
|
): Promise<SendMessageOpts> {
|
|
138
171
|
if (!providerRegistry.get(providerId)) throw new Error(`Provider "${providerId}" not found`);
|
|
172
|
+
const design = await this.resolveDesignOptions(sessionId, opts);
|
|
139
173
|
let sharedContext: string | undefined;
|
|
140
174
|
if (configService.get("ai").share_provider_context === false || /^\s*\/(compact|clear|new)(\s|$)/i.test(message)) {
|
|
141
175
|
this.invalidateSharedContext(providerId, sessionId);
|
|
@@ -155,7 +189,36 @@ class ChatService {
|
|
|
155
189
|
if (this.sharedSnapshots.get(`${providerId}:${sessionId}`) === hash) sharedContext = undefined;
|
|
156
190
|
}
|
|
157
191
|
}
|
|
158
|
-
return { ...
|
|
192
|
+
return { ...design, sharedContext };
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Design identity for this turn, resolved here because every caller — the WebSocket, the
|
|
197
|
+
* CLI, the scheduler, group chat, the bots — sends through this service, and a design
|
|
198
|
+
* session reached by any of them must get its instructions.
|
|
199
|
+
*
|
|
200
|
+
* Instruction text is only ever built from the stored slug: anything a caller put in
|
|
201
|
+
* `designInstructions`/`designSession` is discarded, so no client text reaches the
|
|
202
|
+
* system prompt. A design session has no permission default of its own — an agent that
|
|
203
|
+
* has to read and search the project to design for it would otherwise ask on every file.
|
|
204
|
+
* An explicit caller mode wins (the user picked it), then the mode stored for the session,
|
|
205
|
+
* then the provider's configured default, exactly as for any other chat.
|
|
206
|
+
*/
|
|
207
|
+
private async resolveDesignOptions(sessionId: string, opts?: SendMessageOpts): Promise<SendMessageOpts> {
|
|
208
|
+
const { designInstructions: _instructions, designSession: _flag, designMcp: _mcp, ...rest } = opts ?? {};
|
|
209
|
+
const { getSessionDesignSlug, getSessionPermissionMode, getSessionProjectPath } = await import("./db.service.ts");
|
|
210
|
+
const slug = getSessionDesignSlug(sessionId);
|
|
211
|
+
if (!slug || !isValidDesignSlug(slug)) return rest;
|
|
212
|
+
const permissionMode = opts?.permissionMode ?? getSessionPermissionMode(sessionId) ?? undefined;
|
|
213
|
+
const projectPath = this.getSession(sessionId)?.projectPath ?? getSessionProjectPath(sessionId);
|
|
214
|
+
const designMcp = designMcpAccessFor(sessionId, projectPath, slug);
|
|
215
|
+
return {
|
|
216
|
+
...rest,
|
|
217
|
+
designInstructions: buildDesignInstructions(slug, { checkTool: !!designMcp }),
|
|
218
|
+
designSession: true,
|
|
219
|
+
...(designMcp ? { designMcp } : {}),
|
|
220
|
+
...(permissionMode ? { permissionMode } : {}),
|
|
221
|
+
};
|
|
159
222
|
}
|
|
160
223
|
|
|
161
224
|
/** Push a live follow-up through the same context policy as sendMessage. */
|
|
@@ -6,7 +6,9 @@ import { getPpmDir } from "./ppm-dir.ts";
|
|
|
6
6
|
import { assertProdDbAccessAllowed } from "./prod-db-guard.ts";
|
|
7
7
|
import { backupDbSync } from "./db-backup/db-backup-sync.ts";
|
|
8
8
|
import { CODEX_DEFAULT_MODEL } from "../types/config.ts";
|
|
9
|
-
|
|
9
|
+
// Must equal the last `PRAGMA user_version` below: the pre-migration snapshot is skipped for
|
|
10
|
+
// any database already at this version, so a stale value silently drops that backup.
|
|
11
|
+
export const CURRENT_SCHEMA_VERSION = 50;
|
|
10
12
|
|
|
11
13
|
let db: Database | null = null;
|
|
12
14
|
let dbProfile: string | null = null;
|
|
@@ -1135,6 +1137,16 @@ export function runMigrations(database: Database): void {
|
|
|
1135
1137
|
database.exec(`UPDATE codex_accounts SET daily_guard_enabled = 1`);
|
|
1136
1138
|
database.exec(`PRAGMA user_version = 49;`);
|
|
1137
1139
|
}
|
|
1140
|
+
|
|
1141
|
+
if (current < 50) {
|
|
1142
|
+
// A design session is an ordinary session carrying the slug of the design it works on,
|
|
1143
|
+
// plus the permission mode it runs under. The mode is stored per session because
|
|
1144
|
+
// callers without a UI (CLI, scheduler, bots) pass none, and a design session must not
|
|
1145
|
+
// fall back to the provider-wide default (usually bypass). NULL = an ordinary session.
|
|
1146
|
+
try { database.exec("ALTER TABLE session_metadata ADD COLUMN design_slug TEXT"); } catch { /* exists */ }
|
|
1147
|
+
try { database.exec("ALTER TABLE session_metadata ADD COLUMN permission_mode TEXT"); } catch { /* exists */ }
|
|
1148
|
+
database.exec(`PRAGMA user_version = 50;`);
|
|
1149
|
+
}
|
|
1138
1150
|
}
|
|
1139
1151
|
|
|
1140
1152
|
// ---------------------------------------------------------------------------
|
|
@@ -1321,12 +1333,14 @@ export function setSessionMigratedTo(oldSessionId: string, newSessionId: string)
|
|
|
1321
1333
|
// Carry explicit choices with it before reconnect reads session_state.
|
|
1322
1334
|
// Keep any choices already made on the destination (including thinking OFF).
|
|
1323
1335
|
database.query(`
|
|
1324
|
-
INSERT INTO session_metadata (session_id, model, effort, thinking_budget)
|
|
1325
|
-
SELECT ?, model, effort, thinking_budget FROM session_metadata WHERE session_id = ?
|
|
1336
|
+
INSERT INTO session_metadata (session_id, model, effort, thinking_budget, design_slug, permission_mode)
|
|
1337
|
+
SELECT ?, model, effort, thinking_budget, design_slug, permission_mode FROM session_metadata WHERE session_id = ?
|
|
1326
1338
|
ON CONFLICT(session_id) DO UPDATE SET
|
|
1327
1339
|
model = COALESCE(session_metadata.model, excluded.model),
|
|
1328
1340
|
effort = COALESCE(session_metadata.effort, excluded.effort),
|
|
1329
|
-
thinking_budget = COALESCE(session_metadata.thinking_budget, excluded.thinking_budget)
|
|
1341
|
+
thinking_budget = COALESCE(session_metadata.thinking_budget, excluded.thinking_budget),
|
|
1342
|
+
design_slug = COALESCE(session_metadata.design_slug, excluded.design_slug),
|
|
1343
|
+
permission_mode = COALESCE(session_metadata.permission_mode, excluded.permission_mode)
|
|
1330
1344
|
`).run(newSessionId, oldSessionId);
|
|
1331
1345
|
database.query(
|
|
1332
1346
|
"INSERT INTO session_metadata (session_id, migrated_to) VALUES (?, ?) " +
|
|
@@ -1434,6 +1448,61 @@ export function setSessionThinking(sessionId: string, budget: number | null): vo
|
|
|
1434
1448
|
).run(sessionId, budget);
|
|
1435
1449
|
}
|
|
1436
1450
|
|
|
1451
|
+
/** Design this session works on (`designs/<slug>/`); null for an ordinary chat. */
|
|
1452
|
+
export function getSessionDesignSlug(sessionId: string): string | null {
|
|
1453
|
+
const row = getDb().query("SELECT design_slug FROM session_metadata WHERE session_id = ?").get(sessionId) as { design_slug: string | null } | null;
|
|
1454
|
+
return row?.design_slug ?? null;
|
|
1455
|
+
}
|
|
1456
|
+
|
|
1457
|
+
export function setSessionDesignSlug(sessionId: string, slug: string): void {
|
|
1458
|
+
getDb().query(
|
|
1459
|
+
"INSERT INTO session_metadata (session_id, design_slug) VALUES (?, ?) ON CONFLICT(session_id) DO UPDATE SET design_slug = excluded.design_slug",
|
|
1460
|
+
).run(sessionId, slug);
|
|
1461
|
+
}
|
|
1462
|
+
|
|
1463
|
+
/** Design slugs for many sessions at once (history lists); sessions without one are absent. */
|
|
1464
|
+
export function getSessionDesignSlugs(sessionIds: string[]): Record<string, string> {
|
|
1465
|
+
const result: Record<string, string> = {};
|
|
1466
|
+
// Chunked well under SQLite's bound-parameter limit, which a long history page can reach.
|
|
1467
|
+
for (let i = 0; i < sessionIds.length; i += 500) {
|
|
1468
|
+
const chunk = sessionIds.slice(i, i + 500);
|
|
1469
|
+
const placeholders = chunk.map(() => "?").join(", ");
|
|
1470
|
+
const rows = getDb().query(
|
|
1471
|
+
`SELECT session_id, design_slug FROM session_metadata WHERE design_slug IS NOT NULL AND session_id IN (${placeholders})`,
|
|
1472
|
+
).all(...chunk) as { session_id: string; design_slug: string }[];
|
|
1473
|
+
for (const r of rows) result[r.session_id] = r.design_slug;
|
|
1474
|
+
}
|
|
1475
|
+
return result;
|
|
1476
|
+
}
|
|
1477
|
+
|
|
1478
|
+
/** Permission mode stored for this session; null = the caller's or provider's default applies. */
|
|
1479
|
+
export function getSessionPermissionMode(sessionId: string): string | null {
|
|
1480
|
+
const row = getDb().query("SELECT permission_mode FROM session_metadata WHERE session_id = ?").get(sessionId) as { permission_mode: string | null } | null;
|
|
1481
|
+
return row?.permission_mode ?? null;
|
|
1482
|
+
}
|
|
1483
|
+
|
|
1484
|
+
export function setSessionPermissionMode(sessionId: string, mode: string): void {
|
|
1485
|
+
getDb().query(
|
|
1486
|
+
"INSERT INTO session_metadata (session_id, permission_mode) VALUES (?, ?) ON CONFLICT(session_id) DO UPDATE SET permission_mode = excluded.permission_mode",
|
|
1487
|
+
).run(sessionId, mode);
|
|
1488
|
+
}
|
|
1489
|
+
|
|
1490
|
+
/**
|
|
1491
|
+
* Give a fork the design identity of its source, so forking a design chat yields another
|
|
1492
|
+
* design chat rather than an ordinary one that has quietly lost its instructions and its
|
|
1493
|
+
* safer permission default. A no-op for a source that is not a design session.
|
|
1494
|
+
*/
|
|
1495
|
+
export function copySessionDesignSettings(sourceSessionId: string, targetSessionId: string): void {
|
|
1496
|
+
if (sourceSessionId === targetSessionId) return;
|
|
1497
|
+
const slug = getSessionDesignSlug(sourceSessionId);
|
|
1498
|
+
if (!slug) return;
|
|
1499
|
+
getDb().transaction(() => {
|
|
1500
|
+
setSessionDesignSlug(targetSessionId, slug);
|
|
1501
|
+
const mode = getSessionPermissionMode(sourceSessionId);
|
|
1502
|
+
if (mode) setSessionPermissionMode(targetSessionId, mode);
|
|
1503
|
+
})();
|
|
1504
|
+
}
|
|
1505
|
+
|
|
1437
1506
|
// ---------------------------------------------------------------------------
|
|
1438
1507
|
// Unread tracking
|
|
1439
1508
|
// ---------------------------------------------------------------------------
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { CommentQuote } from "../../../shared/design-comment-types.ts";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Finding a comment's element again after the file changed.
|
|
5
|
+
*
|
|
6
|
+
* An id is exact only while `gen` is unchanged: once the AI edits text above an element,
|
|
7
|
+
* every later start-tag offset moves and an old id may now name a *different* element. So
|
|
8
|
+
* the id is trusted only when the gen matches and the tag agrees. Otherwise every element
|
|
9
|
+
* of the same tag is scored by its text quote and the best one at or above 0.55 wins; the
|
|
10
|
+
* CSS path only breaks ties. No qualifying candidate means `orphaned` — a detached comment
|
|
11
|
+
* is always preferred to a pin on the wrong element.
|
|
12
|
+
*
|
|
13
|
+
* Shipped into the design frame as source (`ppm.lib.*`), so both functions are
|
|
14
|
+
* self-contained, and the similarity function is passed in rather than referenced. The
|
|
15
|
+
* server runs the same code to re-check a re-anchor the frame reports.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export interface AnchorLike {
|
|
19
|
+
ppmId: number | null;
|
|
20
|
+
gen: string | null;
|
|
21
|
+
tag: string;
|
|
22
|
+
cssPath: string;
|
|
23
|
+
quote: CommentQuote;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface AnchorCandidate {
|
|
27
|
+
ppmId: number | null;
|
|
28
|
+
tag: string;
|
|
29
|
+
cssPath: string;
|
|
30
|
+
quote: CommentQuote;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type AnchorResolution =
|
|
34
|
+
| { status: "exact" | "reanchored"; index: number; score: number }
|
|
35
|
+
| { status: "orphaned"; index: -1; score: number };
|
|
36
|
+
|
|
37
|
+
/** Bigram Dice coefficient over lowercased, whitespace-collapsed text, in [0, 1]. */
|
|
38
|
+
export function diceSimilarity(a: string, b: string): number {
|
|
39
|
+
const x = a.replace(/\s+/g, " ").trim().toLowerCase();
|
|
40
|
+
const y = b.replace(/\s+/g, " ").trim().toLowerCase();
|
|
41
|
+
if (x === y) return 1;
|
|
42
|
+
if (x.length < 2 || y.length < 2) return 0;
|
|
43
|
+
const counts = new Map<string, number>();
|
|
44
|
+
for (let i = 0; i < x.length - 1; i++) {
|
|
45
|
+
const g = x.slice(i, i + 2);
|
|
46
|
+
counts.set(g, (counts.get(g) || 0) + 1);
|
|
47
|
+
}
|
|
48
|
+
let shared = 0;
|
|
49
|
+
for (let i = 0; i < y.length - 1; i++) {
|
|
50
|
+
const g = y.slice(i, i + 2);
|
|
51
|
+
const n = counts.get(g) || 0;
|
|
52
|
+
if (n > 0) {
|
|
53
|
+
shared++;
|
|
54
|
+
counts.set(g, n - 1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return (2 * shared) / (x.length - 1 + (y.length - 1));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function resolveAnchor(
|
|
61
|
+
anchor: AnchorLike,
|
|
62
|
+
candidates: readonly AnchorCandidate[],
|
|
63
|
+
currentGen: string | null,
|
|
64
|
+
similarity: (a: string, b: string) => number,
|
|
65
|
+
): AnchorResolution {
|
|
66
|
+
const MIN_SCORE = 0.55;
|
|
67
|
+
if (anchor.ppmId !== null && currentGen !== null && anchor.gen === currentGen) {
|
|
68
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
69
|
+
const c = candidates[i]!;
|
|
70
|
+
if (c.ppmId === anchor.ppmId && c.tag === anchor.tag) return { status: "exact", index: i, score: 1 };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const q = anchor.quote;
|
|
74
|
+
// An element with no text of its own (an image, an empty cell) is recognised by its
|
|
75
|
+
// surroundings alone, and only matches another element with no text.
|
|
76
|
+
const textless = q.exact === "";
|
|
77
|
+
let best = -1;
|
|
78
|
+
let bestScore = 0;
|
|
79
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
80
|
+
const c = candidates[i]!;
|
|
81
|
+
if (c.tag !== anchor.tag) continue;
|
|
82
|
+
if (textless && c.quote.exact !== "") continue;
|
|
83
|
+
let score = textless
|
|
84
|
+
? 0.5 * similarity(q.prefix, c.quote.prefix) + 0.5 * similarity(q.suffix, c.quote.suffix)
|
|
85
|
+
: 0.7 * similarity(q.exact, c.quote.exact) + 0.15 * similarity(q.prefix, c.quote.prefix)
|
|
86
|
+
+ 0.15 * similarity(q.suffix, c.quote.suffix);
|
|
87
|
+
if (anchor.cssPath !== "" && c.cssPath === anchor.cssPath) score += 0.05;
|
|
88
|
+
if (score > bestScore) {
|
|
89
|
+
best = i;
|
|
90
|
+
bestScore = score;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return best >= 0 && bestScore >= MIN_SCORE
|
|
94
|
+
? { status: "reanchored", index: best, score: bestScore }
|
|
95
|
+
: { status: "orphaned", index: -1, score: bestScore };
|
|
96
|
+
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The bridge's core, running inside the sandboxed design document.
|
|
3
|
+
*
|
|
4
|
+
* This function is shipped to the frame as source (`toString()`, see bridge-script.ts), so
|
|
5
|
+
* it may not reference anything in this module's scope: every constant is written inline,
|
|
6
|
+
* and the window it runs in is passed in rather than read from a global. It is the first
|
|
7
|
+
* script in `<head>`, so every listener here is registered before the page's own.
|
|
8
|
+
*
|
|
9
|
+
* What it gives the feature modules (`ppm`): `post` (to the parent, nonce attached), `on`
|
|
10
|
+
* (handlers for parent messages, which are only ever accepted from `window.parent`), `byId`
|
|
11
|
+
* (the element carrying a `data-ppm-id`), and `issue` (errors, failed loads and CSP
|
|
12
|
+
* violations, at most 20 per load). It posts `ready` once the document is parsed and
|
|
13
|
+
* `scroll` as the page scrolls, and applies `restore-scroll`.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { anchorOf, cssPathOf, describeElement, domTreeAccess, elementQuote } from "./bridge-element-info.ts";
|
|
17
|
+
import type { diceSimilarity, resolveAnchor } from "./bridge-anchor-resolve.ts";
|
|
18
|
+
import type { createPickerOverlay } from "./bridge-picker-overlay.ts";
|
|
19
|
+
import type { applyDrag, formatPx, parseTranslate, zoneAt } from "./bridge-transform-math.ts";
|
|
20
|
+
import type { createTransformOverlay } from "./bridge-transform-overlay.ts";
|
|
21
|
+
import type { createTransformStyle } from "./bridge-transform-style.ts";
|
|
22
|
+
import type { extractTextRuns, mergeTextRuns, parseCssColor } from "./bridge-extract-text.ts";
|
|
23
|
+
import type { blockItems, cssRotation } from "./bridge-extract-blocks.ts";
|
|
24
|
+
import type { imageDataUrl } from "./bridge-extract-images.ts";
|
|
25
|
+
import type { checkLabel, gridImplicitFindings } from "./bridge-layout-grid.ts";
|
|
26
|
+
import type { boxFindings } from "./bridge-layout-boxes.ts";
|
|
27
|
+
import type { captureScreenshot } from "./bridge-layout-screenshot.ts";
|
|
28
|
+
|
|
29
|
+
export interface BridgeBoot {
|
|
30
|
+
nonce: string | null;
|
|
31
|
+
gen: string;
|
|
32
|
+
cssGens: Record<string, string>;
|
|
33
|
+
file: string;
|
|
34
|
+
instrumented: boolean;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export type BridgeHandler = (message: Record<string, unknown>) => void;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Helpers several features share, installed by the assembly as `ppm.lib` from their own
|
|
41
|
+
* source. Keyed by string names the assembly writes, so a bundler renaming the functions
|
|
42
|
+
* cannot break a feature that calls one.
|
|
43
|
+
*/
|
|
44
|
+
export interface BridgeLib {
|
|
45
|
+
elementQuote: typeof elementQuote;
|
|
46
|
+
domTreeAccess: typeof domTreeAccess;
|
|
47
|
+
cssPathOf: typeof cssPathOf;
|
|
48
|
+
anchorOf: typeof anchorOf;
|
|
49
|
+
describeElement: typeof describeElement;
|
|
50
|
+
diceSimilarity: typeof diceSimilarity;
|
|
51
|
+
resolveAnchor: typeof resolveAnchor;
|
|
52
|
+
createPickerOverlay: typeof createPickerOverlay;
|
|
53
|
+
parseTranslate: typeof parseTranslate;
|
|
54
|
+
formatPx: typeof formatPx;
|
|
55
|
+
applyDrag: typeof applyDrag;
|
|
56
|
+
zoneAt: typeof zoneAt;
|
|
57
|
+
createTransformOverlay: typeof createTransformOverlay;
|
|
58
|
+
createTransformStyle: typeof createTransformStyle;
|
|
59
|
+
parseCssColor: typeof parseCssColor;
|
|
60
|
+
mergeTextRuns: typeof mergeTextRuns;
|
|
61
|
+
extractTextRuns: typeof extractTextRuns;
|
|
62
|
+
cssRotation: typeof cssRotation;
|
|
63
|
+
blockItems: typeof blockItems;
|
|
64
|
+
imageDataUrl: typeof imageDataUrl;
|
|
65
|
+
checkLabel: typeof checkLabel;
|
|
66
|
+
gridImplicitFindings: typeof gridImplicitFindings;
|
|
67
|
+
boxFindings: typeof boxFindings;
|
|
68
|
+
captureScreenshot: typeof captureScreenshot;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface BridgeApi {
|
|
72
|
+
win: Window;
|
|
73
|
+
doc: Document;
|
|
74
|
+
boot: BridgeBoot;
|
|
75
|
+
lib: BridgeLib;
|
|
76
|
+
post(type: string, payload?: Record<string, unknown>): void;
|
|
77
|
+
on(type: string, handler: BridgeHandler): void;
|
|
78
|
+
byId(ppmId: unknown): Element | null;
|
|
79
|
+
issue(kind: "error" | "rejection" | "resource" | "csp", message: string, source?: string, line?: number): void;
|
|
80
|
+
/** Called by the assembly once every feature is installed; schedules `ready`. */
|
|
81
|
+
start(): void;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function installBridgeCore(win: Window): BridgeApi {
|
|
85
|
+
const doc = win.document;
|
|
86
|
+
const script = (doc.currentScript || doc.querySelector("script[data-ppm-bridge]")) as HTMLScriptElement | null;
|
|
87
|
+
const data: DOMStringMap = script ? script.dataset : {};
|
|
88
|
+
let cssGens: Record<string, string> = {};
|
|
89
|
+
try {
|
|
90
|
+
const parsed = JSON.parse(data.cssGens || "{}");
|
|
91
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) cssGens = parsed;
|
|
92
|
+
} catch (e) {
|
|
93
|
+
cssGens = {};
|
|
94
|
+
}
|
|
95
|
+
const nonce = data.nonce && /^[A-Za-z0-9_-]{16,64}$/.test(data.nonce) ? data.nonce : null;
|
|
96
|
+
const boot: BridgeBoot = {
|
|
97
|
+
nonce, gen: data.gen || "", cssGens, file: data.file || "", instrumented: data.instrumented === "1",
|
|
98
|
+
};
|
|
99
|
+
// Out of the DOM once read, so the page's own markup (and anything describing it) never
|
|
100
|
+
// includes the bridge.
|
|
101
|
+
if (script && script.parentNode) script.parentNode.removeChild(script);
|
|
102
|
+
|
|
103
|
+
const parent = win.parent;
|
|
104
|
+
const handlers = new Map<string, BridgeHandler[]>();
|
|
105
|
+
let issues = 0;
|
|
106
|
+
|
|
107
|
+
function post(type: string, payload?: Record<string, unknown>): void {
|
|
108
|
+
// Envelope fields are assigned last, so a payload cannot overwrite the nonce or type.
|
|
109
|
+
const message = Object.assign({}, payload || {}, { ppm: "design-bridge", v: 1, nonce, type });
|
|
110
|
+
try {
|
|
111
|
+
parent.postMessage(message, "*");
|
|
112
|
+
} catch (e) {
|
|
113
|
+
// An uncloneable payload is the feature's bug; the page must keep working.
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function issue(kind: "error" | "rejection" | "resource" | "csp", message: string, source?: string, line?: number): void {
|
|
118
|
+
if (issues >= 20) return;
|
|
119
|
+
issues++;
|
|
120
|
+
post("issue", { kind, message: String(message).slice(0, 500), source: source ? String(source).slice(0, 1024) : undefined, line });
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
win.addEventListener("message", (event: MessageEvent) => {
|
|
124
|
+
// `event.source` is set by the browser to the sender's own window, which nothing but
|
|
125
|
+
// `window.parent` itself can ever equal — so this alone authenticates the message as
|
|
126
|
+
// parent-originated, and the nonce (which the parent no longer sends anyway) adds nothing.
|
|
127
|
+
if (parent === win || event.source !== parent) return;
|
|
128
|
+
const m = event.data;
|
|
129
|
+
if (!m || typeof m !== "object" || m.ppm !== "design-bridge" || m.v !== 1 || typeof m.type !== "string") return;
|
|
130
|
+
const list = handlers.get(m.type);
|
|
131
|
+
if (!list) return;
|
|
132
|
+
for (let i = 0; i < list.length; i++) {
|
|
133
|
+
try {
|
|
134
|
+
list[i]!(m);
|
|
135
|
+
} catch (e) {
|
|
136
|
+
issue("error", "bridge handler " + m.type + ": " + (e && (e as Error).message));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
win.addEventListener("error", (event: Event) => {
|
|
142
|
+
const target = event.target as (Element & { src?: string; href?: string }) | null;
|
|
143
|
+
if (target && target !== (win as unknown) && target.tagName) {
|
|
144
|
+
issue("resource", "Failed to load <" + target.tagName.toLowerCase() + ">", target.src || target.href || "");
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const e = event as ErrorEvent;
|
|
148
|
+
issue("error", e.message || "Script error", e.filename, e.lineno);
|
|
149
|
+
}, true);
|
|
150
|
+
win.addEventListener("unhandledrejection", (event: PromiseRejectionEvent) => {
|
|
151
|
+
const reason = event.reason;
|
|
152
|
+
issue("rejection", reason && reason.message ? reason.message : String(reason));
|
|
153
|
+
});
|
|
154
|
+
doc.addEventListener("securitypolicyviolation", (event: SecurityPolicyViolationEvent) => {
|
|
155
|
+
issue("csp", event.violatedDirective + " blocked " + (event.blockedURI || "inline"), event.sourceFile, event.lineNumber);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
let scrollTimer: number | null = null;
|
|
159
|
+
win.addEventListener("scroll", () => {
|
|
160
|
+
if (scrollTimer !== null) return;
|
|
161
|
+
scrollTimer = win.setTimeout(() => {
|
|
162
|
+
scrollTimer = null;
|
|
163
|
+
post("scroll", { x: win.scrollX, y: win.scrollY });
|
|
164
|
+
}, 100);
|
|
165
|
+
}, { passive: true });
|
|
166
|
+
|
|
167
|
+
const ppm: BridgeApi = {
|
|
168
|
+
win,
|
|
169
|
+
doc,
|
|
170
|
+
boot,
|
|
171
|
+
// Filled in by the assembly before any feature runs.
|
|
172
|
+
lib: {} as BridgeLib,
|
|
173
|
+
post,
|
|
174
|
+
issue,
|
|
175
|
+
on(type: string, handler: BridgeHandler): void {
|
|
176
|
+
const list = handlers.get(type) || [];
|
|
177
|
+
list.push(handler);
|
|
178
|
+
handlers.set(type, list);
|
|
179
|
+
},
|
|
180
|
+
byId(ppmId: unknown): Element | null {
|
|
181
|
+
if (typeof ppmId !== "number" || !Number.isInteger(ppmId) || ppmId < 0) return null;
|
|
182
|
+
return doc.querySelector('[data-ppm-id="' + ppmId + '"]');
|
|
183
|
+
},
|
|
184
|
+
start(): void {
|
|
185
|
+
const ready = (): void => {
|
|
186
|
+
post("ready", {
|
|
187
|
+
gen: boot.gen,
|
|
188
|
+
cssGens: boot.cssGens,
|
|
189
|
+
file: boot.file,
|
|
190
|
+
instrumented: boot.instrumented,
|
|
191
|
+
title: String(doc.title || "").slice(0, 200),
|
|
192
|
+
docHeight: doc.documentElement ? doc.documentElement.scrollHeight : 0,
|
|
193
|
+
});
|
|
194
|
+
};
|
|
195
|
+
if (doc.readyState === "loading") doc.addEventListener("DOMContentLoaded", ready, { once: true });
|
|
196
|
+
else ready();
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
ppm.on("restore-scroll", (m) => {
|
|
201
|
+
const x = m.x, y = m.y;
|
|
202
|
+
if (typeof x === "number" && typeof y === "number" && isFinite(x) && isFinite(y)) win.scrollTo(x, y);
|
|
203
|
+
});
|
|
204
|
+
return ppm;
|
|
205
|
+
}
|