@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
|
@@ -5,7 +5,9 @@ import {
|
|
|
5
5
|
getSessionInfo as sdkGetSessionInfo,
|
|
6
6
|
getSessionMessages,
|
|
7
7
|
} from "@anthropic-ai/claude-agent-sdk";
|
|
8
|
-
import { buildModelQueryOptions } from "./claude-agent-sdk-query-options.ts";
|
|
8
|
+
import { buildModelQueryOptions, buildSystemPromptOption, designMcpServers, preToolUseDecision } from "./claude-agent-sdk-query-options.ts";
|
|
9
|
+
import { CLAUDE_DESIGN_CHECK_TOOL } from "../services/design/mcp/design-mcp-tool.ts";
|
|
10
|
+
import { designToolDecision } from "../services/design/design-tool-policy.ts";
|
|
9
11
|
import { CLAUDE_MODELS } from "../types/claude-models.ts";
|
|
10
12
|
import { isImageLimitRejection } from "./image-limit-detection.ts";
|
|
11
13
|
import type {
|
|
@@ -215,6 +217,7 @@ interface PendingApproval {
|
|
|
215
217
|
*/
|
|
216
218
|
export class ClaudeAgentSdkProvider implements AIProvider {
|
|
217
219
|
readonly supportsSharedContext = true;
|
|
220
|
+
readonly supportsDesignInstructions = true;
|
|
218
221
|
id = "claude";
|
|
219
222
|
name = "Claude";
|
|
220
223
|
|
|
@@ -881,23 +884,34 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
881
884
|
const providerConfig = this.getProviderConfig();
|
|
882
885
|
const permissionMode = opts?.permissionMode || providerConfig.permission_mode || "bypassPermissions";
|
|
883
886
|
const isBypass = permissionMode === "bypassPermissions";
|
|
884
|
-
const systemPromptOpt = providerConfig.system_prompt
|
|
885
|
-
|
|
886
|
-
|
|
887
|
+
const systemPromptOpt = buildSystemPromptOption(providerConfig.system_prompt, opts?.designInstructions);
|
|
888
|
+
// A design session in acceptEdits auto-approves file tools only while they target the
|
|
889
|
+
// project, and asks for everything else. Any other mode the user picks for a design
|
|
890
|
+
// session behaves exactly as that mode does in an ordinary chat.
|
|
891
|
+
const designPolicy = !!opts?.designSession && permissionMode === "acceptEdits";
|
|
892
|
+
// No project root means nothing can be proven inside it, so every file tool asks.
|
|
893
|
+
const designRoot = designPolicy && meta.projectPath && existsSync(meta.projectPath) ? meta.projectPath : undefined;
|
|
887
894
|
|
|
888
895
|
// Build allowedTools based on permission mode.
|
|
889
896
|
// SDK auto-approves everything in allowedTools (skips canUseTool callback).
|
|
890
897
|
// In non-bypass modes, only pre-approve read-only tools so write/execute tools
|
|
891
898
|
// go through the permission evaluation chain → canUseTool callback.
|
|
899
|
+
// The design policy pre-approves nothing: the read-only list would let Read and Grep
|
|
900
|
+
// reach any path on disk and every MCP tool run unasked, which is exactly what a
|
|
901
|
+
// design session's agent (fed page content it did not write) must not do.
|
|
892
902
|
const readOnlyTools = ["Read", "Glob", "Grep", "WebSearch", "WebFetch", "ToolSearch"];
|
|
893
903
|
const writeTools = ["Write", "Edit", "Bash", "Agent", "Skill", "TodoWrite", "AskUserQuestion"];
|
|
894
904
|
const teamTools = providerConfig.agent_teams
|
|
895
905
|
? ["TeamCreate", "TeamDelete", "SendMessage", "TaskCreate", "TaskUpdate", "TaskList", "TaskGet"]
|
|
896
906
|
: [];
|
|
897
907
|
const mcpTools = ["mcp__*"];
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
908
|
+
// `design_check` only reads the canvas, so a design session never asks before it runs.
|
|
909
|
+
const designCheckTool = opts?.designSession && opts.designMcp ? CLAUDE_DESIGN_CHECK_TOOL : null;
|
|
910
|
+
const allowedTools = designPolicy
|
|
911
|
+
? (designCheckTool ? [designCheckTool] : [])
|
|
912
|
+
: isBypass
|
|
913
|
+
? [...readOnlyTools, ...writeTools, ...teamTools, ...mcpTools]
|
|
914
|
+
: [...readOnlyTools, ...mcpTools];
|
|
901
915
|
|
|
902
916
|
/**
|
|
903
917
|
* Approval events to yield from the generator.
|
|
@@ -936,6 +950,12 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
936
950
|
}
|
|
937
951
|
return { behavior: "deny" as const, message: "User skipped the question" };
|
|
938
952
|
}
|
|
953
|
+
// The PreToolUse hook normally settles design-policy tools before this runs; this is
|
|
954
|
+
// the fail-closed backstop for any path that reaches the callback without it.
|
|
955
|
+
if (designPolicy && toolName !== designCheckTool && designToolDecision(toolName, input, designRoot) !== "allow") {
|
|
956
|
+
const result = await waitForApproval(toolName, input);
|
|
957
|
+
if (!result.approved) return { behavior: "deny" as const, message: "User denied tool execution" };
|
|
958
|
+
}
|
|
939
959
|
return { behavior: "allow" as const, updatedInput: input };
|
|
940
960
|
};
|
|
941
961
|
|
|
@@ -952,18 +972,27 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
952
972
|
// Bypass mode: allow everything
|
|
953
973
|
if (isBypass) return {};
|
|
954
974
|
|
|
955
|
-
// Read-only tools: always allow
|
|
956
|
-
if (readOnlyTools.includes(toolName)) return {};
|
|
957
|
-
|
|
958
975
|
// AskUserQuestion: handled by canUseTool callback
|
|
959
976
|
if (toolName === "AskUserQuestion") return {};
|
|
960
977
|
|
|
978
|
+
if (designCheckTool && toolName === designCheckTool) return preToolUseDecision("allow");
|
|
979
|
+
|
|
980
|
+
// Design policy: project-scoped file tools pass, everything else falls through to
|
|
981
|
+
// the approval prompt below. The decision is explicit so the SDK's own acceptEdits
|
|
982
|
+
// auto-approvals (which include some shell commands) never get a say.
|
|
983
|
+
if (designPolicy) {
|
|
984
|
+
if (designToolDecision(toolName, hookInput?.tool_input, designRoot) === "allow") {
|
|
985
|
+
return preToolUseDecision("allow");
|
|
986
|
+
}
|
|
987
|
+
} else if (readOnlyTools.includes(toolName)) {
|
|
988
|
+
// Read-only tools: always allow
|
|
989
|
+
return {};
|
|
990
|
+
}
|
|
991
|
+
|
|
961
992
|
// Non-bypass mode: ask FE for approval on write/execute tools
|
|
962
993
|
const result = await waitForApproval(toolName, hookInput?.tool_input);
|
|
963
|
-
if (result.approved)
|
|
964
|
-
|
|
965
|
-
}
|
|
966
|
-
return { hookSpecificOutput: { permissionDecision: "deny", message: "User denied tool execution" } };
|
|
994
|
+
if (result.approved) return preToolUseDecision("allow");
|
|
995
|
+
return preToolUseDecision("deny", "User denied tool execution");
|
|
967
996
|
};
|
|
968
997
|
|
|
969
998
|
// Hooks config: add our permission hook for non-bypass modes
|
|
@@ -1072,7 +1101,7 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
1072
1101
|
}
|
|
1073
1102
|
console.log(`[sdk] query: session=${sessionId} isFirst=${isFirstMessage} fork=${shouldFork} cwd=${effectiveCwd} platform=${process.platform} accountMode=${!!account} permissionMode=${permissionMode} isBypass=${isBypass}`);
|
|
1074
1103
|
|
|
1075
|
-
const mcpServers = this.resolveMcpServers(effectiveCwd);
|
|
1104
|
+
const mcpServers = { ...this.resolveMcpServers(effectiveCwd), ...designMcpServers(opts?.designSession ? opts.designMcp : undefined) };
|
|
1076
1105
|
const hasMcp = Object.keys(mcpServers).length > 0;
|
|
1077
1106
|
|
|
1078
1107
|
// Buffer subprocess stderr for crash diagnostics + log in real-time
|
|
@@ -146,6 +146,23 @@ export function itemToToolUse(item: Item): ChatEvent {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
/** Build the tool_result from a completed ThreadItem. */
|
|
149
|
+
/**
|
|
150
|
+
* An MCP result's content blocks as readable text, with any image reduced to a label. A
|
|
151
|
+
* block's base64 payload (a `design_check` screenshot is up to half a megabyte) would
|
|
152
|
+
* otherwise be the visible result, and ride through the turn buffer and the JSONL with it.
|
|
153
|
+
*/
|
|
154
|
+
export function mcpResultText(result: unknown): string | undefined {
|
|
155
|
+
if (result == null) return undefined;
|
|
156
|
+
const content = (result as { content?: unknown }).content;
|
|
157
|
+
if (!Array.isArray(content)) return typeof result === "string" ? result : JSON.stringify(result);
|
|
158
|
+
return content.map((block) => {
|
|
159
|
+
const b = (block ?? {}) as { type?: unknown; text?: unknown; mimeType?: unknown };
|
|
160
|
+
if (b.type === "text" && typeof b.text === "string") return b.text;
|
|
161
|
+
if (b.type === "image") return `[image ${typeof b.mimeType === "string" ? b.mimeType : ""}]`.replace(" ]", "]");
|
|
162
|
+
return JSON.stringify(block);
|
|
163
|
+
}).join("\n");
|
|
164
|
+
}
|
|
165
|
+
|
|
149
166
|
export function itemToToolResult(item: Item): ChatEvent {
|
|
150
167
|
const type = item.type;
|
|
151
168
|
let output = "";
|
|
@@ -158,7 +175,7 @@ export function itemToToolResult(item: Item): ChatEvent {
|
|
|
158
175
|
exitCode = typeof exit === "number" ? exit : undefined;
|
|
159
176
|
isError = exitCode != null && exitCode !== 0;
|
|
160
177
|
} else if (type === "mcpToolCall") {
|
|
161
|
-
output = redactTruncate(item.result ?? item.error ?? "");
|
|
178
|
+
output = redactTruncate(mcpResultText(item.result) ?? item.error ?? "");
|
|
162
179
|
isError = item.error != null;
|
|
163
180
|
} else if (type === "fileChange") {
|
|
164
181
|
const changes = Array.isArray(item.changes) ? item.changes : [];
|
|
@@ -58,9 +58,10 @@ export class CodexJsonRpcClient {
|
|
|
58
58
|
private closed = false;
|
|
59
59
|
|
|
60
60
|
/** Spawn the subprocess. Injectable streams allow unit testing without a real spawn.
|
|
61
|
-
* `codexHome` selects which account's auth the app-server uses (CODEX_HOME)
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
* `codexHome` selects which account's auth the app-server uses (CODEX_HOME); `env` adds
|
|
62
|
+
* variables this one session needs (a design session's MCP token). */
|
|
63
|
+
start(opts?: { cwd?: string; codexHome?: string; env?: Record<string, string> }): void {
|
|
64
|
+
const env = { ...buildSpawnEnv(), ...(opts?.env ?? {}) };
|
|
64
65
|
if (opts?.codexHome) env.CODEX_HOME = opts.codexHome;
|
|
65
66
|
this.proc = spawn(process.execPath, ["x", "@openai/codex", "app-server"], {
|
|
66
67
|
cwd: opts?.cwd,
|
|
@@ -22,7 +22,17 @@ const MAP: Record<string, CodexPermission> = {
|
|
|
22
22
|
plan: { sandbox: "read-only", approvalPolicy: "never" },
|
|
23
23
|
};
|
|
24
24
|
|
|
25
|
+
/**
|
|
26
|
+
* A design session's acceptEdits: file edits stay inside the workspace, and any command
|
|
27
|
+
* outside codex's trusted read-only set asks first. `on-request` would let the model run
|
|
28
|
+
* arbitrary commands in the sandbox unasked, which is the opposite of the design default
|
|
29
|
+
* ("edits yes, shell asks"). Residual, and accepted: codex still auto-runs its trusted
|
|
30
|
+
* read-only commands (`cat`, `ls`, …) and its sandbox can read outside the workspace.
|
|
31
|
+
*/
|
|
32
|
+
const DESIGN_ACCEPT_EDITS: CodexPermission = { sandbox: "workspace-write", approvalPolicy: "untrusted" };
|
|
33
|
+
|
|
25
34
|
/** Pure map from PPM permissionMode → codex {sandbox, approvalPolicy}. Unknown → bypass. */
|
|
26
|
-
export function permissionModeToCodex(mode?: string): CodexPermission {
|
|
35
|
+
export function permissionModeToCodex(mode?: string, opts?: { designSession?: boolean }): CodexPermission {
|
|
36
|
+
if (opts?.designSession && mode === "acceptEdits") return DESIGN_ACCEPT_EDITS;
|
|
27
37
|
return (mode && MAP[mode]) || MAP.bypassPermissions!;
|
|
28
38
|
}
|
|
@@ -27,6 +27,9 @@ export interface ThreadStartParams {
|
|
|
27
27
|
sandbox?: SandboxMode;
|
|
28
28
|
approvalPolicy?: AskForApproval;
|
|
29
29
|
model?: string;
|
|
30
|
+
/** Supplements (never replaces) codex's base instructions. Not persisted by the thread:
|
|
31
|
+
* it is a per-request override, so every thread/start and thread/resume must carry it. */
|
|
32
|
+
developerInstructions?: string;
|
|
30
33
|
}
|
|
31
34
|
|
|
32
35
|
export interface ThreadResumeParams {
|
|
@@ -35,6 +38,8 @@ export interface ThreadResumeParams {
|
|
|
35
38
|
sandbox?: SandboxMode;
|
|
36
39
|
approvalPolicy?: AskForApproval;
|
|
37
40
|
model?: string;
|
|
41
|
+
/** See ThreadStartParams.developerInstructions. */
|
|
42
|
+
developerInstructions?: string;
|
|
38
43
|
}
|
|
39
44
|
|
|
40
45
|
/** thread/started notification + thread/start response both carry a Thread. */
|
|
@@ -31,6 +31,8 @@ import { homedir } from "node:os";
|
|
|
31
31
|
import { join } from "node:path";
|
|
32
32
|
import { CodexJsonRpcClient, CONTROL_REQUEST_TIMEOUT_MS } from "./codex-jsonrpc-client.ts";
|
|
33
33
|
import { permissionModeToCodex, type CodexPermission } from "./codex-permission-map.ts";
|
|
34
|
+
import { buildThreadParams, designMcpEnv, requestWithInstructionsFallback, type CodexThreadParams } from "./codex-thread-params.ts";
|
|
35
|
+
import type { DesignMcpAccess } from "../../services/design/mcp/design-mcp-tool.ts";
|
|
34
36
|
import { mapCodexEvent, parseTokenUsage } from "./codex-event-mapper.ts";
|
|
35
37
|
import { subagentCardId } from "./codex-subagent-thread.ts";
|
|
36
38
|
import { decisionFor, isApprovalMethod, type ApprovalMethod } from "./codex-approval-decision.ts";
|
|
@@ -139,6 +141,11 @@ interface LiveSession {
|
|
|
139
141
|
channel: EventChannel;
|
|
140
142
|
permission: CodexPermission;
|
|
141
143
|
model?: string;
|
|
144
|
+
/** Design instructions, resent on every thread/start and thread/resume — codex does not
|
|
145
|
+
* persist them, and the account-switch respawn has no send options to read them from. */
|
|
146
|
+
developerInstructions?: string;
|
|
147
|
+
/** A design session's `design_check` endpoint, kept for the same reason. */
|
|
148
|
+
designMcp?: DesignMcpAccess;
|
|
142
149
|
pendingApprovals: Map<string, PendingApproval>;
|
|
143
150
|
answeredCodexIds: Set<number | string>;
|
|
144
151
|
/** Rollout history snapshot at connect — lets live message ids continue the
|
|
@@ -297,6 +304,7 @@ function buildUserInputResponse(questions: unknown, data: unknown): ToolRequestU
|
|
|
297
304
|
*/
|
|
298
305
|
export class CodexAppServerProvider implements AIProvider {
|
|
299
306
|
readonly supportsSharedContext = true;
|
|
307
|
+
readonly supportsDesignInstructions = true;
|
|
300
308
|
readonly id = "codex";
|
|
301
309
|
readonly name = "Codex";
|
|
302
310
|
|
|
@@ -680,20 +688,22 @@ export class CodexAppServerProvider implements AIProvider {
|
|
|
680
688
|
client.onNotification((n) => this.handleNotification(live, n));
|
|
681
689
|
client.onServerRequest((r) => this.handleServerRequest(live, r));
|
|
682
690
|
client.onClose(() => this.handleClose(live));
|
|
683
|
-
client.start({ cwd: live.cwd, codexHome: account.home });
|
|
691
|
+
client.start({ cwd: live.cwd, codexHome: account.home, env: designMcpEnv(live.designMcp) });
|
|
684
692
|
live.client = client;
|
|
685
693
|
|
|
686
694
|
await client.request("initialize", { clientInfo: CLIENT_INFO, capabilities: CAPABILITIES }, CONTROL_REQUEST_TIMEOUT_MS);
|
|
687
695
|
client.notify("initialized");
|
|
688
696
|
|
|
689
|
-
const resumeBase = {
|
|
690
|
-
...this.contextConfigOverrides(),
|
|
697
|
+
const resumeBase = buildThreadParams({
|
|
691
698
|
cwd: live.cwd,
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
699
|
+
permission: live.permission,
|
|
700
|
+
model: live.model,
|
|
701
|
+
configOverrides: this.contextConfigOverrides(),
|
|
702
|
+
developerInstructions: live.developerInstructions,
|
|
703
|
+
designMcp: live.designMcp,
|
|
704
|
+
});
|
|
705
|
+
await requestWithInstructionsFallback(resumeBase,
|
|
706
|
+
(params) => this.resumeThread(client, threadId, found, account.home, params));
|
|
697
707
|
}
|
|
698
708
|
|
|
699
709
|
/**
|
|
@@ -714,7 +724,7 @@ export class CodexAppServerProvider implements AIProvider {
|
|
|
714
724
|
threadId: string,
|
|
715
725
|
found: { path: string; sessionsDir: string },
|
|
716
726
|
codexHome: string | undefined,
|
|
717
|
-
resumeBase:
|
|
727
|
+
resumeBase: CodexThreadParams,
|
|
718
728
|
): Promise<unknown> {
|
|
719
729
|
const target = sessionsDirForHome(codexHome);
|
|
720
730
|
const path = localizeRollout(found.path, found.sessionsDir, target);
|
|
@@ -738,7 +748,7 @@ export class CodexAppServerProvider implements AIProvider {
|
|
|
738
748
|
private async connect(sessionId: string, opts?: SendMessageOpts): Promise<LiveSession> {
|
|
739
749
|
const meta = this.sessions.get(sessionId);
|
|
740
750
|
const cwd = meta?.projectPath || getSessionProjectPath(sessionId) || process.cwd();
|
|
741
|
-
const permission = permissionModeToCodex(opts?.permissionMode ?? this.config?.permission_mode);
|
|
751
|
+
const permission = permissionModeToCodex(opts?.permissionMode ?? this.config?.permission_mode, { designSession: opts?.designSession });
|
|
742
752
|
const model = codexModel(opts?.model ?? this.config?.model);
|
|
743
753
|
|
|
744
754
|
// Only resume a rollout attributable to this project. An unknown/resumed ID
|
|
@@ -750,6 +760,8 @@ export class CodexAppServerProvider implements AIProvider {
|
|
|
750
760
|
const channel = createEventChannel();
|
|
751
761
|
const live: LiveSession = {
|
|
752
762
|
client, threadId: null, cwd, channel, permission, model,
|
|
763
|
+
developerInstructions: opts?.designInstructions,
|
|
764
|
+
designMcp: opts?.designSession ? opts.designMcp : undefined,
|
|
753
765
|
pendingApprovals: new Map(), answeredCodexIds: new Set(),
|
|
754
766
|
history: [], transcript: [], currentAssistant: "", currentEvents: [],
|
|
755
767
|
pendingTurns: [], subagentThreadIds: new Set(),
|
|
@@ -763,17 +775,22 @@ export class CodexAppServerProvider implements AIProvider {
|
|
|
763
775
|
client.onNotification((n) => this.handleNotification(live, n));
|
|
764
776
|
client.onServerRequest((r) => this.handleServerRequest(live, r));
|
|
765
777
|
client.onClose(() => this.handleClose(live));
|
|
766
|
-
client.start({ cwd, codexHome: account?.home });
|
|
778
|
+
client.start({ cwd, codexHome: account?.home, env: designMcpEnv(live.designMcp) });
|
|
767
779
|
|
|
768
780
|
await client.request("initialize", { clientInfo: CLIENT_INFO, capabilities: CAPABILITIES }, CONTROL_REQUEST_TIMEOUT_MS);
|
|
769
781
|
client.notify("initialized");
|
|
770
782
|
|
|
771
|
-
const resumeBase =
|
|
783
|
+
const resumeBase = buildThreadParams({
|
|
784
|
+
cwd, permission, model,
|
|
785
|
+
configOverrides: this.contextConfigOverrides(),
|
|
786
|
+
developerInstructions: live.developerInstructions,
|
|
787
|
+
designMcp: live.designMcp,
|
|
788
|
+
});
|
|
772
789
|
// Only treat as a resume when a rollout for this id is attributable to THIS
|
|
773
790
|
// project (fail-closed cwd guard) — never resume another project's thread.
|
|
774
|
-
const result = found
|
|
775
|
-
?
|
|
776
|
-
:
|
|
791
|
+
const result = await requestWithInstructionsFallback(resumeBase, (params) => found
|
|
792
|
+
? this.resumeThread(client, sessionId, found, account?.home, params)
|
|
793
|
+
: client.request("thread/start", params));
|
|
777
794
|
|
|
778
795
|
const threadId = extractThreadId(result) ?? (found ? sessionId : null);
|
|
779
796
|
if (!threadId) throw new Error("codex thread/start returned no thread id");
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { CodexPermission } from "./codex-permission-map.ts";
|
|
2
|
+
import type { ThreadStartParams } from "./codex-protocol.ts";
|
|
3
|
+
import {
|
|
4
|
+
CODEX_DESIGN_MCP_SERVER, CODEX_DESIGN_MCP_TOKEN_ENV, DESIGN_CHECK_TOOL, DESIGN_CHECK_TOOL_TIMEOUT_MS,
|
|
5
|
+
type DesignMcpAccess,
|
|
6
|
+
} from "../../services/design/mcp/design-mcp-tool.ts";
|
|
7
|
+
|
|
8
|
+
/** Config overrides, keyed like `-c key=value` on codex's command line (dotted paths). */
|
|
9
|
+
export type CodexConfigOverrides = Record<string, unknown>;
|
|
10
|
+
|
|
11
|
+
/** The overrides both thread/start and thread/resume carry (resume adds threadId + path). */
|
|
12
|
+
export type CodexThreadParams = ThreadStartParams & { config?: CodexConfigOverrides };
|
|
13
|
+
|
|
14
|
+
export interface ThreadParamsInput {
|
|
15
|
+
cwd: string;
|
|
16
|
+
permission: CodexPermission;
|
|
17
|
+
model?: string;
|
|
18
|
+
/** Provider-wide config overrides, already shaped as `{ config }` or `{}`. */
|
|
19
|
+
configOverrides?: { config?: CodexConfigOverrides };
|
|
20
|
+
developerInstructions?: string;
|
|
21
|
+
/** A design session's `design_check` endpoint; added as one more MCP server. */
|
|
22
|
+
designMcp?: DesignMcpAccess;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The design MCP server as a codex config override. The dotted key adds this one server and
|
|
27
|
+
* leaves the user's own `mcp_servers` alone. The token is not in the config: codex reads it
|
|
28
|
+
* from the app-server's environment (`bearer_token_env_var`), so it is never written into a
|
|
29
|
+
* thread's saved settings, and codex's default shell policy drops `*TOKEN*` variables from
|
|
30
|
+
* the commands the agent runs. The tool only reads the canvas, so it is approved up front —
|
|
31
|
+
* an approval prompt here would reach PPM as an elicitation it declines, cancelling the call.
|
|
32
|
+
*/
|
|
33
|
+
export function designMcpConfig(access: DesignMcpAccess | undefined): CodexConfigOverrides {
|
|
34
|
+
if (!access) return {};
|
|
35
|
+
return {
|
|
36
|
+
[`mcp_servers.${CODEX_DESIGN_MCP_SERVER}`]: {
|
|
37
|
+
url: access.url,
|
|
38
|
+
bearer_token_env_var: CODEX_DESIGN_MCP_TOKEN_ENV,
|
|
39
|
+
enabled_tools: [DESIGN_CHECK_TOOL],
|
|
40
|
+
default_tools_approval_mode: "approve",
|
|
41
|
+
startup_timeout_sec: 10,
|
|
42
|
+
tool_timeout_sec: Math.ceil(DESIGN_CHECK_TOOL_TIMEOUT_MS / 1000),
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** The environment the app-server needs for {@link designMcpConfig}; `{}` for other sessions. */
|
|
48
|
+
export function designMcpEnv(access: DesignMcpAccess | undefined): Record<string, string> {
|
|
49
|
+
return access ? { [CODEX_DESIGN_MCP_TOKEN_ENV]: access.token } : {};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* One builder for the params of every thread/start and thread/resume — the first connect
|
|
54
|
+
* and the account-switch respawn used to assemble them separately, which is how a field
|
|
55
|
+
* added to one silently goes missing from the other. `developerInstructions` is left out
|
|
56
|
+
* entirely when empty, so an ordinary session sends exactly what it always has.
|
|
57
|
+
*/
|
|
58
|
+
export function buildThreadParams(input: ThreadParamsInput): CodexThreadParams {
|
|
59
|
+
const instructions = input.developerInstructions?.trim();
|
|
60
|
+
const config = { ...(input.configOverrides?.config ?? {}), ...designMcpConfig(input.designMcp) };
|
|
61
|
+
return {
|
|
62
|
+
...(Object.keys(config).length ? { config } : {}),
|
|
63
|
+
cwd: input.cwd,
|
|
64
|
+
sandbox: input.permission.sandbox,
|
|
65
|
+
approvalPolicy: input.permission.approvalPolicy,
|
|
66
|
+
...(input.model ? { model: input.model } : {}),
|
|
67
|
+
...(instructions ? { developerInstructions: instructions } : {}),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** A codex build that predates `developerInstructions` rejects it as an unknown field. */
|
|
72
|
+
export function isUnknownDeveloperInstructionsError(err: unknown): boolean {
|
|
73
|
+
const message = err instanceof Error ? err.message : String(err ?? "");
|
|
74
|
+
return /developerInstructions|developer_instructions/.test(message)
|
|
75
|
+
&& /unknown|unexpected|unrecognized|not allowed|invalid/i.test(message);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Send a thread request, and if an older codex refuses the instructions field, send it
|
|
80
|
+
* once more without it — a design session that loses its instructions still works as a
|
|
81
|
+
* chat, while a refused thread/start is no session at all. Logged, never silent.
|
|
82
|
+
*/
|
|
83
|
+
export async function requestWithInstructionsFallback<T>(
|
|
84
|
+
params: CodexThreadParams,
|
|
85
|
+
send: (params: CodexThreadParams) => Promise<T>,
|
|
86
|
+
log: (message: string) => void = console.warn,
|
|
87
|
+
): Promise<T> {
|
|
88
|
+
try {
|
|
89
|
+
return await send(params);
|
|
90
|
+
} catch (err) {
|
|
91
|
+
if (!params.developerInstructions || !isUnknownDeveloperInstructionsError(err)) throw err;
|
|
92
|
+
log("[codex] app-server rejected developerInstructions; retrying without design instructions");
|
|
93
|
+
const { developerInstructions: _dropped, ...rest } = params;
|
|
94
|
+
return send(rest);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { dirname, extname, isAbsolute, relative, sep } from "node:path";
|
|
2
|
+
import { assertAllowed, assertNotPpmDir } from "../../services/fs-path-guard.service.ts";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The file-level rules every sandboxed preview route shares (the HTML file preview and the
|
|
6
|
+
* design canvas): which files may be served at all, and which Host may be written into a
|
|
7
|
+
* CSP directive.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** Web assets a preview may load. Anything else (dotenv, databases, keys) is a 403. */
|
|
11
|
+
export const PREVIEW_ASSET_EXTENSIONS = new Set([".html", ".htm", ".css", ".js", ".mjs", ".json", ".png", ".jpg", ".jpeg", ".gif", ".webp", ".avif", ".svg", ".ico", ".mp4", ".webm", ".mov", ".mp3", ".wav", ".ogg", ".m4a", ".woff", ".woff2", ".ttf", ".otf", ".vtt"]);
|
|
12
|
+
|
|
13
|
+
export function previewDenied(): never {
|
|
14
|
+
throw Object.assign(new Error("Preview path is not allowed"), { status: 403 });
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function isInsideRoot(root: string, path: string): boolean {
|
|
18
|
+
const rel = relative(root, path);
|
|
19
|
+
return rel !== ".." && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function guardPreviewAsset(path: string, root = dirname(path)): void {
|
|
23
|
+
assertAllowed(path);
|
|
24
|
+
assertNotPpmDir(path);
|
|
25
|
+
// Only web assets, never hidden directories, dotenv, database or key files.
|
|
26
|
+
if (relative(root, path).split(/[\\/]/).some((part) => part.startsWith(".")) || !PREVIEW_ASSET_EXTENSIONS.has(extname(path).toLowerCase())) previewDenied();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Bun reconstructs req.url with its listening port. Preserve the browser's Host through
|
|
31
|
+
* Vite/tunnels; validate before inserting into a CSP directive.
|
|
32
|
+
*/
|
|
33
|
+
export function browserFacingHost(requestHost: string | undefined, requestUrl: string): string {
|
|
34
|
+
const host = requestHost ?? "";
|
|
35
|
+
return /^(?:[a-z0-9.-]+|\[[a-f0-9:]+\])(?::\d{1,5})?$/i.test(host) ? host : new URL(requestUrl).host;
|
|
36
|
+
}
|
package/src/server/index.ts
CHANGED
|
@@ -180,17 +180,28 @@ app.route("/proxy", proxyRoutes);
|
|
|
180
180
|
// HTML assets authenticate with bounded preview capabilities, never the PPM session token.
|
|
181
181
|
app.route("/api/html-preview/content", htmlPreviewRoutes.content);
|
|
182
182
|
|
|
183
|
+
// Design canvas files: the same bounded-capability model, one design per token.
|
|
184
|
+
import { designPreviewRoutes } from "./routes/design-preview.ts";
|
|
185
|
+
app.route("/api/design-preview/content", designPreviewRoutes.content);
|
|
186
|
+
|
|
183
187
|
// MCP sign-in redirect: reached by a browser navigation from the authorization server,
|
|
184
188
|
// which carries no PPM token. It only completes a flow an authenticated user started.
|
|
185
189
|
import { mcpAuthRoutes, mcpAuthCallbackHandler } from "./routes/mcp-auth.ts";
|
|
186
190
|
import { mcpOAuthFlows } from "../services/mcp-oauth/mcp-oauth-flows.ts";
|
|
187
191
|
app.get("/api/mcp-auth/callback", mcpAuthCallbackHandler);
|
|
188
192
|
|
|
193
|
+
// Design MCP endpoint: called by a design session's own Claude/Codex subprocess, which has
|
|
194
|
+
// no PPM token. A per-session capability token in `Authorization` is its only credential.
|
|
195
|
+
import { designMcpHandler } from "../services/design/mcp/design-mcp-endpoint.ts";
|
|
196
|
+
import { setServerListenAddress } from "../services/server-listen-address.ts";
|
|
197
|
+
app.all("/api/design-mcp", designMcpHandler);
|
|
198
|
+
|
|
189
199
|
// Auth check endpoint (behind auth middleware)
|
|
190
200
|
app.use("/api/*", authMiddleware);
|
|
191
201
|
app.use("/api/*", gzipJson);
|
|
192
202
|
app.get("/api/auth/check", (c) => c.json(ok(true)));
|
|
193
203
|
app.route("/api/html-preview", htmlPreviewRoutes.api);
|
|
204
|
+
app.route("/api/design-preview", designPreviewRoutes.api);
|
|
194
205
|
|
|
195
206
|
// Port forwarding — starts per-port Cloudflare tunnels
|
|
196
207
|
app.route("/api/preview", portForwardingRoutes);
|
|
@@ -1084,6 +1095,10 @@ if (process.argv.includes("__serve__")) {
|
|
|
1084
1095
|
}, 200);
|
|
1085
1096
|
}
|
|
1086
1097
|
|
|
1098
|
+
// Child processes calling back into this server (the design MCP endpoint) need the
|
|
1099
|
+
// port actually bound, which is not the configured one under the supervisor (port 0).
|
|
1100
|
+
setServerListenAddress(Number(server.port), host);
|
|
1101
|
+
|
|
1087
1102
|
// Publish the port we actually bound so the edge forwarder knows where to
|
|
1088
1103
|
// send traffic. Only meaningful when the supervisor spawned us with port 0
|
|
1089
1104
|
// (OS-assigned); a dev server on a fixed port (e.g. `bun dev:server` on 8081)
|
|
@@ -5,13 +5,14 @@ import { unlink } from "node:fs/promises";
|
|
|
5
5
|
import { countLines } from "../../services/file-lines.ts";
|
|
6
6
|
import { ensureUploadsDir, resolveUploadPath } from "../../services/chat-upload-storage.service.ts";
|
|
7
7
|
import { chatService } from "../../services/chat.service.ts";
|
|
8
|
+
import { isValidDesignSlug } from "../../services/design/design-slug.ts";
|
|
8
9
|
import { draftService } from "../../services/draft.service.ts";
|
|
9
10
|
import { providerRegistry } from "../../providers/registry.ts";
|
|
10
11
|
import { renameSession as sdkRenameSession } from "@anthropic-ai/claude-agent-sdk";
|
|
11
12
|
import { listSlashItems, searchSlashItems, invalidateCache } from "../../services/slash-items.service.ts";
|
|
12
13
|
import type { SlashItem } from "../../services/slash-discovery/types.ts";
|
|
13
14
|
import { ensureSdkCommands, invalidateSdkCommands } from "../../services/slash-discovery/sdk-commands.ts";
|
|
14
|
-
import { upsertSlashRecent, getSlashRecents, setSessionClearedFrom, listTurnUsage, getSessionAccount, getSessionProvider, resolveMigratedSession } from "../../services/db.service.ts";
|
|
15
|
+
import { upsertSlashRecent, getSlashRecents, setSessionClearedFrom, listTurnUsage, getSessionAccount, getSessionProvider, resolveMigratedSession, getSessionDesignSlugs, setSessionDesignSlug, copySessionDesignSettings } from "../../services/db.service.ts";
|
|
15
16
|
import type { TurnUsage } from "../../shared/turn-usage.ts";
|
|
16
17
|
import { getCachedUsage, refreshUsageNow } from "../../services/claude-usage.service.ts";
|
|
17
18
|
import { bindPickedAccount, bindRefusalReason } from "../../services/picked-account-binding.ts";
|
|
@@ -166,7 +167,12 @@ chatRoutes.get("/usage", async (c) => {
|
|
|
166
167
|
/** GET /chat/providers — list available AI providers */
|
|
167
168
|
chatRoutes.get("/providers", (c) => {
|
|
168
169
|
try {
|
|
169
|
-
|
|
170
|
+
// The capability rides along so a client offering design sessions can list only the
|
|
171
|
+
// providers that will actually deliver the instructions.
|
|
172
|
+
return c.json(ok(providerRegistry.list().map((p) => ({
|
|
173
|
+
...p,
|
|
174
|
+
supportsDesignInstructions: !!providerRegistry.get(p.id)?.supportsDesignInstructions,
|
|
175
|
+
}))));
|
|
170
176
|
} catch (e) {
|
|
171
177
|
return c.json(err((e as Error).message), 500);
|
|
172
178
|
}
|
|
@@ -221,7 +227,10 @@ chatRoutes.get("/sessions", async (c) => {
|
|
|
221
227
|
const seen = new Set<string>();
|
|
222
228
|
const deduped = merged.filter((s) => { if (seen.has(s.id)) return false; seen.add(s.id); return true; });
|
|
223
229
|
const tagMap = getSessionTags(deduped.map((s) => s.id));
|
|
224
|
-
const
|
|
230
|
+
const designSlugs = getSessionDesignSlugs(deduped.map((s) => s.id));
|
|
231
|
+
const enriched = deduped.map((s) => ({
|
|
232
|
+
...s, pinned: pinnedIds.has(s.id), tag: tagMap[s.id] ?? null, designSlug: designSlugs[s.id] ?? null,
|
|
233
|
+
}));
|
|
225
234
|
|
|
226
235
|
// Collapse edit-message branch trees: each tree shows a single row (its
|
|
227
236
|
// most recently active node). Pinned sessions are never collapsed.
|
|
@@ -314,6 +323,9 @@ chatRoutes.get("/search", async (c) => {
|
|
|
314
323
|
});
|
|
315
324
|
}
|
|
316
325
|
|
|
326
|
+
const designSlugs = getSessionDesignSlugs(results.map((r) => r.sessionId));
|
|
327
|
+
for (const r of results) r.designSlug = designSlugs[r.sessionId] ?? null;
|
|
328
|
+
|
|
317
329
|
// Pinned first, then title matches above content, then most-recent within group.
|
|
318
330
|
results.sort((a, b) => {
|
|
319
331
|
if (a.pinned !== b.pinned) return a.pinned ? -1 : 1;
|
|
@@ -328,6 +340,16 @@ chatRoutes.get("/search", async (c) => {
|
|
|
328
340
|
});
|
|
329
341
|
|
|
330
342
|
/** GET /chat/sessions/:id/messages — get message history */
|
|
343
|
+
/**
|
|
344
|
+
* The design a session belongs to, if any. A chat tab asks on open: every surface that opens
|
|
345
|
+
* sessions as plain chats (a notification, a search hit, a link) would otherwise take a design
|
|
346
|
+
* session out of design mode, and this lets the tab hand itself over to the design tab.
|
|
347
|
+
*/
|
|
348
|
+
chatRoutes.get("/sessions/:id/design", (c) => {
|
|
349
|
+
const id = c.req.param("id");
|
|
350
|
+
return c.json(ok({ designSlug: getSessionDesignSlugs([id])[id] ?? null }));
|
|
351
|
+
});
|
|
352
|
+
|
|
331
353
|
chatRoutes.get("/sessions/:id/messages", async (c) => {
|
|
332
354
|
try {
|
|
333
355
|
const requestedId = c.req.param("id");
|
|
@@ -371,13 +393,25 @@ chatRoutes.post("/sessions", async (c) => {
|
|
|
371
393
|
try {
|
|
372
394
|
const projectName = c.get("projectName");
|
|
373
395
|
const projectPath = c.get("projectPath");
|
|
374
|
-
const body = await c.req.json<{ providerId?: string; title?: string; clearedFrom?: string; accountId?: string }>();
|
|
396
|
+
const body = await c.req.json<{ providerId?: string; title?: string; clearedFrom?: string; accountId?: string; designSlug?: unknown }>();
|
|
397
|
+
// A design session is only created on a provider that will carry its instructions;
|
|
398
|
+
// anywhere else it would silently be an ordinary chat that believes it is not.
|
|
399
|
+
const designSlug = body.designSlug;
|
|
400
|
+
if (designSlug !== undefined && designSlug !== null) {
|
|
401
|
+
if (!isValidDesignSlug(designSlug)) return c.json(err("Invalid designSlug"), 400);
|
|
402
|
+
const provider = body.providerId ? providerRegistry.get(body.providerId) : providerRegistry.getDefault();
|
|
403
|
+
if (!provider) return c.json(err(`Provider "${body.providerId}" not found`), 400);
|
|
404
|
+
if (!provider.supportsDesignInstructions) {
|
|
405
|
+
return c.json(err(`Provider "${provider.id}" does not support design sessions`), 400);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
375
408
|
const session = await chatService.createSession(body.providerId, {
|
|
376
409
|
projectName,
|
|
377
410
|
projectPath,
|
|
378
411
|
title: body.title,
|
|
379
412
|
});
|
|
380
413
|
if (body.clearedFrom) setSessionClearedFrom(session.id, body.clearedFrom);
|
|
414
|
+
if (isValidDesignSlug(designSlug)) setSessionDesignSlug(session.id, designSlug);
|
|
381
415
|
// The tab claimed an account when it opened and showed its name; honour that here so
|
|
382
416
|
// the first message runs on the account the user was actually looking at. Advisory,
|
|
383
417
|
// never authoritative: bindPickedAccount re-checks the id against the server's own
|
|
@@ -687,6 +721,8 @@ chatRoutes.post("/sessions/:id/fork", async (c) => {
|
|
|
687
721
|
});
|
|
688
722
|
// Register forked session with provider + DB so it's tracked in memory
|
|
689
723
|
setSessionMetadata(result.sessionId, projectName, projectPath);
|
|
724
|
+
// Before the resume below: a fork of a design chat must stay a design chat.
|
|
725
|
+
copySessionDesignSettings(sourceId, result.sessionId);
|
|
690
726
|
// Persist the inherited user-set title so the collapsed-tree head shows
|
|
691
727
|
// it regardless of the SDK-derived summary.
|
|
692
728
|
if (inheritedTitle) setSessionTitle(result.sessionId, inheritedTitle);
|
|
@@ -750,6 +786,7 @@ chatRoutes.post("/sessions/:id/fork", async (c) => {
|
|
|
750
786
|
projectName, projectPath, title: inheritedTitle ?? "Forked Chat",
|
|
751
787
|
});
|
|
752
788
|
if (inheritedTitle) setSessionTitle(session.id, inheritedTitle);
|
|
789
|
+
copySessionDesignSettings(sourceId, session.id);
|
|
753
790
|
return c.json(ok({ ...session, forkedFrom: sourceId }), 201);
|
|
754
791
|
}
|
|
755
792
|
} catch (e) {
|