sliccy 6.130.0 → 6.131.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/node-server/_shared/agent-wire-types.d.ts +54 -0
- package/dist/node-server/_shared/agent-wire-types.d.ts.map +1 -1
- package/dist/node-server/_shared/cdp-target-info.d.ts +19 -0
- package/dist/node-server/_shared/cdp-target-info.d.ts.map +1 -0
- package/dist/node-server/_shared/cdp-target-info.js +9 -0
- package/dist/node-server/_shared/cdp-target-info.js.map +1 -0
- package/dist/node-server/_shared/discovery-link.d.ts +76 -0
- package/dist/node-server/_shared/discovery-link.d.ts.map +1 -0
- package/dist/node-server/_shared/discovery-link.js +76 -0
- package/dist/node-server/_shared/discovery-link.js.map +1 -0
- package/dist/node-server/_shared/extension-bridge-protocol.d.ts +165 -0
- package/dist/node-server/_shared/extension-bridge-protocol.d.ts.map +1 -0
- package/dist/node-server/_shared/extension-bridge-protocol.js +65 -0
- package/dist/node-server/_shared/extension-bridge-protocol.js.map +1 -0
- package/dist/node-server/_shared/handoff-link.d.ts +90 -0
- package/dist/node-server/_shared/handoff-link.d.ts.map +1 -0
- package/dist/node-server/_shared/handoff-link.js +192 -0
- package/dist/node-server/_shared/handoff-link.js.map +1 -0
- package/dist/node-server/_shared/iframe-repaint.d.ts +51 -0
- package/dist/node-server/_shared/iframe-repaint.d.ts.map +1 -0
- package/dist/node-server/_shared/iframe-repaint.js +118 -0
- package/dist/node-server/_shared/iframe-repaint.js.map +1 -0
- package/dist/node-server/_shared/index.d.ts +9 -0
- package/dist/node-server/_shared/index.d.ts.map +1 -1
- package/dist/node-server/_shared/index.js +9 -0
- package/dist/node-server/_shared/index.js.map +1 -1
- package/dist/node-server/_shared/leader-ext-id.d.ts +16 -0
- package/dist/node-server/_shared/leader-ext-id.d.ts.map +1 -0
- package/dist/node-server/_shared/leader-ext-id.js +16 -0
- package/dist/node-server/_shared/leader-ext-id.js.map +1 -0
- package/dist/node-server/_shared/link-header.d.ts +98 -0
- package/dist/node-server/_shared/link-header.d.ts.map +1 -0
- package/dist/node-server/_shared/link-header.js +441 -0
- package/dist/node-server/_shared/link-header.js.map +1 -0
- package/dist/node-server/_shared/proxy-headers.d.ts +46 -0
- package/dist/node-server/_shared/proxy-headers.d.ts.map +1 -0
- package/dist/node-server/_shared/proxy-headers.js +133 -0
- package/dist/node-server/_shared/proxy-headers.js.map +1 -0
- package/dist/node-server/_shared/well-known-probe.d.ts +63 -0
- package/dist/node-server/_shared/well-known-probe.d.ts.map +1 -0
- package/dist/node-server/_shared/well-known-probe.js +104 -0
- package/dist/node-server/_shared/well-known-probe.js.map +1 -0
- package/dist/node-server/electron-controller.d.ts +51 -0
- package/dist/node-server/electron-controller.js +88 -5
- package/dist/ui/.vite/manifest.json +414 -488
- package/dist/ui/assets/CLAUDE-CWMPcWVI.js +34 -0
- package/dist/ui/assets/{CLAUDE-BG8Wfdn_.js → CLAUDE-DM1onrcU.js} +1 -1
- package/dist/ui/assets/SKILL--AFE5RE3.js +1 -0
- package/dist/ui/assets/{SKILL-DT72j81i.js → SKILL-cpVS35My.js} +1 -1
- package/dist/ui/assets/__vite-browser-external-B6A3FtA_.js +1 -0
- package/dist/ui/assets/{account-store-EaBcIxhN.js → account-store-DsMvFZgS.js} +3 -3
- package/dist/ui/assets/account-store-naVgJKHe.js +1 -0
- package/dist/ui/assets/{adobe-B0U_BLCy.js → adobe-BhZB46bT.js} +1 -1
- package/dist/ui/assets/{adobe-DSoEAq_f.js → adobe-sRIQnDEl.js} +2 -2
- package/dist/ui/assets/{agent-bridge-sbs3wiia.js → agent-bridge-DVqU5-sn.js} +1 -1
- package/dist/ui/assets/{agent-message-to-chat-Cnv4uh07.js → agent-message-to-chat-Df4an5Ei.js} +1 -1
- package/dist/ui/assets/{agent-message-to-chat-DW2ZZk9R.js → agent-message-to-chat-xGeYopQz.js} +1 -1
- package/dist/ui/assets/api-endpoint-DGxXvrur.js +1 -0
- package/dist/ui/assets/api-endpoint-Lx_FU5cP.js +1 -0
- package/dist/ui/assets/{apply-layout-DvwSioYn.js → apply-layout-dNkV0TEv.js} +1 -1
- package/dist/ui/assets/{apps-DFIoDcds.js → apps-tzFQ7_KO.js} +1 -1
- package/dist/ui/assets/{auto-mount-table-CEBCZFRF.js → auto-mount-table-0jMTi9rV.js} +1 -1
- package/dist/ui/assets/{azure-openai-C_J_i_Uv.js → azure-openai-B9ZeZZ0T.js} +1 -1
- package/dist/ui/assets/{azure-openai-DUJebq5R.js → azure-openai-DsmgiFlX.js} +1 -1
- package/dist/ui/assets/{backend-hostfs-t651gkrP.js → backend-hostfs-BH8uwRZG.js} +1 -1
- package/dist/ui/assets/{backend-hostfs-BQYf7TAS.js → backend-hostfs-BxfjZHzO.js} +1 -1
- package/dist/ui/assets/bridge-protocol-06nbmp2X.js +1 -0
- package/dist/ui/assets/bridge-protocol-DdqxTTSu.js +1 -0
- package/dist/ui/assets/{bsh-watchdog-D97yX3sQ.js → bsh-watchdog-CxyhQHy5.js} +1 -1
- package/dist/ui/assets/{capability-Btlr4Wc-.js → capability-Bxl0SE1s.js} +2 -2
- package/dist/ui/assets/{cdp-DHIp_AO9.js → cdp-CmXwwigc.js} +1 -1
- package/dist/ui/assets/{cerebras-4vCJGBUt.js → cerebras-CsdnfQnc.js} +1 -1
- package/dist/ui/assets/{cerebras-CBjabVSb.js → cerebras-Mux-1Uqj.js} +1 -1
- package/dist/ui/assets/{client-CjV_9a9h.js → client-C6Cmi9c4.js} +1 -1
- package/dist/ui/assets/composer-speech-CElQJ4q_.js +1 -0
- package/dist/ui/assets/{connect-surface-DrBGja7c.js → connect-surface-DgrjdeR5.js} +1 -1
- package/dist/ui/assets/{context-compaction-huebTevb.js → context-compaction-DRymamfD.js} +3 -3
- package/dist/ui/assets/{core-CdPvxBo3.js → core-B8y1Kyh_.js} +2 -2
- package/dist/ui/assets/{derive-C_gfjwp6.js → derive-TWFNEJkb.js} +1 -1
- package/dist/ui/assets/dip-1TiuHkUR.js +233 -0
- package/dist/ui/assets/{directed-approval-cJrhWrrr.js → directed-approval-BDO2wdC5.js} +1 -1
- package/dist/ui/assets/{discovery-preference-DFkmIHQo.js → discovery-preference-B9KlkVuR.js} +1 -1
- package/dist/ui/assets/ensure-speech-assets-DasC7jBA.js +1 -0
- package/dist/ui/assets/{esbuild-wasm-CSKOA492.js → esbuild-wasm-Ew76Vf_V.js} +2 -2
- package/dist/ui/assets/export-provider-CqI0pk50.js +1 -0
- package/dist/ui/assets/export-spool-CuNzzI8a.js +1 -0
- package/dist/ui/assets/{extension-bridge-transport-D3PItLFo.js → extension-bridge-transport-DfRNjx8c.js} +1 -1
- package/dist/ui/assets/extension-media-capture-2FcAdcuB.js +1 -0
- package/dist/ui/assets/extension-ops-owOXVncP.js +1 -0
- package/dist/ui/assets/float-topology-hfgMx1Yq.js +1 -0
- package/dist/ui/assets/{follower-navigate-watcher-B9ZostUJ.js → follower-navigate-watcher-JQ0b_cW8.js} +1 -1
- package/dist/ui/assets/{fs-C9SJY4sJ.js → fs-CBaQR8Xc.js} +2 -2
- package/dist/ui/assets/{fs-n6R6QZv0.js → fs-CDaCMxrL.js} +1 -1
- package/dist/ui/assets/github-B7uOq9Q1.js +1 -0
- package/dist/ui/assets/{github-copilot-COZvaCzG.js → github-copilot-BeWJoZwD.js} +1 -1
- package/dist/ui/assets/{github-copilot-Cai-dPyZ.js → github-copilot-DwKSI23j.js} +1 -1
- package/dist/ui/assets/{github-install-DfhMDFC9.js → github-install-DE7dF6r8.js} +1 -1
- package/dist/ui/assets/{github-D-fdkiMQ.js → github-qhOhjD2Q.js} +2 -2
- package/dist/ui/assets/{github-zip-ZEV5pLGZ.js → github-zip-CuwUOO-U.js} +1 -1
- package/dist/ui/assets/{guest-tool-gate-CG9Yw8Kq.js → guest-tool-gate-BxRAm4CU.js} +1 -1
- package/dist/ui/assets/{hear-D7MO-jTh.js → hear-CNQSuR1y.js} +1 -1
- package/dist/ui/assets/{help-CQHZfeL3.js → help-D66VHlYj.js} +8 -4
- package/dist/ui/assets/hid-picker-sFJ8vzUj.js +1 -0
- package/dist/ui/assets/host-command-29ain4NA.js +1 -0
- package/dist/ui/assets/idle-compaction-B9i1duyd.js +1 -0
- package/dist/ui/assets/idle-compaction-settings-1yyApSsQ.js +1 -0
- package/dist/ui/assets/image-markers-BFDmhPy4.js +1 -0
- package/dist/ui/assets/image-markers-DuyWsic3.js +1 -0
- package/dist/ui/assets/{installer-7BWtTgd6.js → installer-C6TqZaGO.js} +3 -3
- package/dist/ui/assets/{js-realm-worker-CXI-Ngjy.js → js-realm-worker-Bsb6rmK5.js} +4 -4
- package/dist/ui/assets/{jsh-runtime-extensions-Bf9eAUzp.js → jsh-runtime-extensions-Dkujbplu.js} +1 -1
- package/dist/ui/assets/kernel-worker-CkZd8Enf.js +4991 -0
- package/dist/ui/assets/lick-manager-ULemXDKa.js +2 -0
- package/dist/ui/assets/lick-urls-BX4Jyu_T.js +1 -0
- package/dist/ui/assets/{lick-ws-bridge-Jk_oJNDM.js → lick-ws-bridge-Bo5sH7lf.js} +1 -1
- package/dist/ui/assets/{lick-ws-bridge-ct0HLNad.js → lick-ws-bridge-RFOSPq0w.js} +1 -1
- package/dist/ui/assets/{live-session-snapshot-DnNBHXrk.js → live-session-snapshot-BTnyrQCU.js} +1 -1
- package/dist/ui/assets/{loader-B90Xxi7L.js → loader-Dw-TPPKt.js} +1 -1
- package/dist/ui/assets/{local-llm-Dm5mp8ES.js → local-llm-B-qS5oNT.js} +1 -1
- package/dist/ui/assets/{local-llm-CXD-Qof4.js → local-llm-COCS88AU.js} +1 -1
- package/dist/ui/assets/{magick-wasm-BEYfJbAX.js → magick-wasm-C7OGcZrJ.js} +2 -2
- package/dist/ui/assets/main-CAXbdHY8.js +22 -0
- package/dist/ui/assets/main-cherry-DSNvH0CD.js +1 -0
- package/dist/ui/assets/{mount-DD8rKTRS.js → mount-BbUBqN71.js} +2 -2
- package/dist/ui/assets/{mount-bridge-client-CUPodVo6.js → mount-bridge-client-BejrWSrL.js} +1 -1
- package/dist/ui/assets/{mount-bridge-client-BrMqFu_x.js → mount-bridge-client-DGJyqEPG.js} +1 -1
- package/dist/ui/assets/{mount-picker-popup-CVvcLs1V.js → mount-picker-popup--ijSfN8u.js} +1 -1
- package/dist/ui/assets/{mount-recovery-D6g3iniZ.js → mount-recovery-OxgGejDC.js} +1 -1
- package/dist/ui/assets/{mount-C1nMn8bL.js → mount-ysOnJBjr.js} +3 -3
- package/dist/ui/assets/navigation-watcher-C8xRyQBd.js +1 -0
- package/dist/ui/assets/new-session-JIL4tJ1I.js +2 -0
- package/dist/ui/assets/oauth-bootstrap-DP5y5Dy8.js +2 -0
- package/dist/ui/assets/oauth-service-Bconf2Pz.js +1 -0
- package/dist/ui/assets/oauth-service-t2taQm3p.js +1 -0
- package/dist/ui/assets/{openai-codex-BveJezys.js → openai-codex-BZDYkVh6.js} +1 -1
- package/dist/ui/assets/{openai-codex-WPOtL2Mf.js → openai-codex-DlFMWNVB.js} +1 -1
- package/dist/ui/assets/{openrouter-98Q9mrw8.js → openrouter-BrS9XpJS.js} +1 -1
- package/dist/ui/assets/{openrouter-6nEYTdxI.js → openrouter-Dn_iX45f.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-C7w8rKLa.js → openrouter-oauth-CioQlp0x.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-BCNSNHpM.js → openrouter-oauth-D9gZVt7e.js} +1 -1
- package/dist/ui/assets/{page-approval-service-DnWfuBVQ.js → page-approval-service-IZdlRu-_.js} +1 -1
- package/dist/ui/assets/panel-rpc-handlers-DUN0E_f8.js +2 -0
- package/dist/ui/assets/{panelize-shell-C7Ptpa69.js → panelize-shell-KNX1XTnq.js} +1 -1
- package/dist/ui/assets/picker-popup-sQtXmfAo.js +1 -0
- package/dist/ui/assets/{port-bridge-client-wFmUGeZa.js → port-bridge-client-C1tBBqwu.js} +1 -1
- package/dist/ui/assets/{port-bridge-client-BTnhFM03.js → port-bridge-client-CN1cFP4D.js} +1 -1
- package/dist/ui/assets/preview-url-r19H6zH1.js +1 -0
- package/dist/ui/assets/{provider-1nSAXh4b.js → provider-BfGyOQHs.js} +2 -2
- package/dist/ui/assets/{provider-RrpO6cEr.js → provider-DnIZJQjl.js} +1 -1
- package/dist/ui/assets/provider-settings-C6uIHjd4.js +1 -0
- package/dist/ui/assets/provider-settings-DrWv51sQ.js +2 -0
- package/dist/ui/assets/{provider-store-access-kKnmyJjr.js → provider-store-access-BqErJhmB.js} +2 -2
- package/dist/ui/assets/provider-store-access-BuQzycZu.js +1 -0
- package/dist/ui/assets/{providers-CvD7PECK.js → providers-CF2FF0H2.js} +1 -1
- package/dist/ui/assets/providers-CqZKx9qW.js +2 -0
- package/dist/ui/assets/proxied-fetch-CiijUcSt.js +2 -0
- package/dist/ui/assets/proxied-fetch-DUC7X0GS.js +1 -0
- package/dist/ui/assets/{py-realm-worker-DGFMfg27.js → py-realm-worker-BYQkpReo.js} +2 -2
- package/dist/ui/assets/{pyodide-BDRAQKP6.js → pyodide-BwD0AtZB.js} +2 -2
- package/dist/ui/assets/{quick-llm-I3oLGgvo.js → quick-llm-B9NubAhJ.js} +1 -1
- package/dist/ui/assets/{recovery-screen-CBwlz3Qo.js → recovery-screen-cHPORxsj.js} +1 -1
- package/dist/ui/assets/{redirect-uri-DZXyVwvI.js → redirect-uri-BKkf61lT.js} +1 -1
- package/dist/ui/assets/{remote-terminal-view-Db-9V2n9.js → remote-terminal-view-BHs39pzZ.js} +1 -1
- package/dist/ui/assets/request-body-DWn6QJ_H.js +1 -0
- package/dist/ui/assets/rest-ops-CLpS_ilI.js +1 -0
- package/dist/ui/assets/rest-ops-D2ig8qfG.js +1 -0
- package/dist/ui/assets/{run-BBAgk3Ml.js → run-03JeZZol.js} +1 -1
- package/dist/ui/assets/{run-COi81T_1.js → run-B5YOTTPD.js} +1 -1
- package/dist/ui/assets/run-BOu4zIOZ.js +29 -0
- package/dist/ui/assets/{run-DZMSwK6o.js → run-CUXVFhoI.js} +1 -1
- package/dist/ui/assets/run-D5Va_gO8.js +81 -0
- package/dist/ui/assets/{run-DCeEfqcT.js → run-DZh-18uA.js} +3 -3
- package/dist/ui/assets/{secret-env-Cp2Eduxg.js → secret-env-CtpVPUh5.js} +1 -1
- package/dist/ui/assets/secret-topology-Yt0aO4Gz.js +1 -0
- package/dist/ui/assets/{secrets-bridge-client-CHMeCH4_.js → secrets-bridge-client-BVl0YuB2.js} +1 -1
- package/dist/ui/assets/{secrets-bridge-client-CNOtgwnq.js → secrets-bridge-client-C3MaYf_O.js} +1 -1
- package/dist/ui/assets/serial-picker-BQF_Eitc.js +1 -0
- package/dist/ui/assets/{session-freezer-DVh0_BPO.js → session-freezer-Bltt6zUt.js} +3 -3
- package/dist/ui/assets/{setup-feature-flags-remote-DBcwYFl-.js → setup-feature-flags-remote-BkP-HRZt.js} +1 -1
- package/dist/ui/assets/setup-standalone-prelude-C2tPUGcI.js +2 -0
- package/dist/ui/assets/setup-sudo-BSw__xoN.js +2 -0
- package/dist/ui/assets/shared-Djytys1b.js +1 -0
- package/dist/ui/assets/shared-Dq_aaG_m.js +4 -0
- package/dist/ui/assets/silent-renew-backoff-DIMz5UqB.js +1 -0
- package/dist/ui/assets/silent-renew-backoff-SSzHR-oP.js +1 -0
- package/dist/ui/assets/{skills-BEEjU5I5.js → skills-wzno5Tj5.js} +1 -1
- package/dist/ui/assets/slicc-app-url-B9OxaBDe.js +1 -0
- package/dist/ui/assets/slicc-version-HwuyIZfW.js +1 -0
- package/dist/ui/assets/{snapshot-CPjJBR4Z.js → snapshot-Bi6QabWh.js} +1 -1
- package/dist/ui/assets/{snapshot-features-BZbgnon7.js → snapshot-features-BEPdcWF6.js} +3 -3
- package/dist/ui/assets/{speak-Dx2FEQBZ.js → speak-BxNdNjKi.js} +1 -1
- package/dist/ui/assets/{sprinkle-bridge-BVfyHi8X.js → sprinkle-bridge-BNzhEsPj.js} +1 -1
- package/dist/ui/assets/{sprinkle-manager-Dxc8U2h1.js → sprinkle-manager-CflRWcbq.js} +1 -1
- package/dist/ui/assets/{sprinkle-renderer-1C1DNVyK.js → sprinkle-renderer-BnSqYzuY.js} +1 -1
- package/dist/ui/assets/{src-kInvzkEg.js → src-Bex_z_yH.js} +583 -148
- package/dist/ui/assets/state-DIwkpIaB.js +42 -0
- package/dist/ui/assets/{store-BHLq6CyB.js → store-CFx1fIZL.js} +1 -1
- package/dist/ui/assets/{store-Dd0aJqlJ.js → store-i7XHN1Er.js} +1 -1
- package/dist/ui/assets/{sudo-DBeYNsAF.js → sudo-r7OrTMGT.js} +1 -1
- package/dist/ui/assets/sync-dialog-D7Wg49Up.js +1 -0
- package/dist/ui/assets/tab-teleport-PAaKnGkm.js +1 -0
- package/dist/ui/assets/transcript-export-DP-r8eDz.js +1 -0
- package/dist/ui/assets/transformers-env-BmBEKck6.js +1 -0
- package/dist/ui/assets/{tray-leader-DTpZEm3l.js → tray-leader-DabyaEs-.js} +1 -1
- package/dist/ui/assets/{tray-leave-runtime-BrGJs1g5.js → tray-leave-runtime-VfTj-MHR.js} +1 -1
- package/dist/ui/assets/tray-runtime-config-BQL-GPqt.js +1 -0
- package/dist/ui/assets/tray-runtime-config-C3Ti4Pik.js +1 -0
- package/dist/ui/assets/tray-sidecar-Zx9F34-1.js +2 -0
- package/dist/ui/assets/tray-sync-protocol-jKTx-dCF.js +1 -0
- package/dist/ui/assets/tray-webrtc-uW6sTyIA.js +1 -0
- package/dist/ui/assets/{upgrade-detection-BwiYpjuO.js → upgrade-detection-Cz0eOMYf.js} +1 -1
- package/dist/ui/assets/usb-picker-Cbm0jfjl.js +1 -0
- package/dist/ui/assets/{voice-reply-BGR2cNZ_.js → voice-reply-B43Nr1Xr.js} +1 -1
- package/dist/ui/assets/{wc-attach-BLZapYO1.js → wc-attach-BbT2famN.js} +3 -3
- package/dist/ui/assets/wc-browser-Ctsf5Y23.js +1 -0
- package/dist/ui/assets/{wc-extension-B_OX4AT5.js → wc-extension-CJ6cvLnw.js} +2 -2
- package/dist/ui/assets/{wc-float-label-Ck2cAgp3.js → wc-float-label-CnFnKVLC.js} +1 -1
- package/dist/ui/assets/wc-follower-CkrdiOKN.js +17 -0
- package/dist/ui/assets/wc-follower-oauth-B6m2XpVI.js +5 -0
- package/dist/ui/assets/wc-live-CxoqWHpR.js +8 -0
- package/dist/ui/assets/wc-nav-Bnd_bEYw.js +2 -0
- package/dist/ui/assets/wc-onboarding-FeHr2fj5.js +2 -0
- package/dist/ui/assets/{wc-permissions-iZXqGvtf.js → wc-permissions-CppSymRx.js} +3 -3
- package/dist/ui/assets/wc-permissions-providers-BjqCnuQT.js +2 -0
- package/dist/ui/assets/wc-placeholder-C79lmtig.js +4 -0
- package/dist/ui/assets/wc-settings-DdAeaZhQ.js +59 -0
- package/dist/ui/assets/wc-shell-BP3biEU1.js +125 -0
- package/dist/ui/assets/{wc-shortcut-config--IseG9bJ.js → wc-shortcut-config-CjOJXjsp.js} +2 -2
- package/dist/ui/assets/wc-shortcuts-BDQiHczD.js +41 -0
- package/dist/ui/assets/wc-sprinkles-ChlcnDD2.js +2 -0
- package/dist/ui/assets/wc-transcript-export-DdEuCfi6.js +2 -0
- package/dist/ui/assets/wc-tray-BfoqEbBg.js +5 -0
- package/dist/ui/assets/whisper-session-DW7HkDu2.js +2 -0
- package/dist/ui/assets/{xai-grok-OLNPEXTT.js → xai-grok-3L0LL1R8.js} +1 -1
- package/dist/ui/assets/{xai-grok-C-iHnNxi.js → xai-grok-CKevFY8L.js} +1 -1
- package/dist/ui/index.html +15 -17
- package/dist/ui/llm-proxy-sw.js +1 -1
- package/dist/ui/packages/webapp/index.html +15 -17
- package/package.json +5 -4
- package/dist/ui/assets/CLAUDE-DhkULx_E.js +0 -1
- package/dist/ui/assets/SKILL-DJAvKejL.js +0 -1
- package/dist/ui/assets/__vite-browser-external-B19j3y2v.js +0 -1
- package/dist/ui/assets/account-store-CCqSr710.js +0 -1
- package/dist/ui/assets/api-endpoint-BB41u1PK.js +0 -1
- package/dist/ui/assets/api-endpoint-DRYP1Kfj.js +0 -1
- package/dist/ui/assets/composer-speech-C8OcijP-.js +0 -1
- package/dist/ui/assets/dip-Co-Ga2Ny.js +0 -233
- package/dist/ui/assets/ensure-speech-assets-Csum3_gw.js +0 -1
- package/dist/ui/assets/export-provider-BunpOA08.js +0 -1
- package/dist/ui/assets/export-spool-Bvpvkbul.js +0 -1
- package/dist/ui/assets/extension-media-capture-DiCJSgES.js +0 -1
- package/dist/ui/assets/extension-ops-CsNT8YjX.js +0 -1
- package/dist/ui/assets/float-topology-ey0oewfq.js +0 -1
- package/dist/ui/assets/github-BXAKydA_.js +0 -1
- package/dist/ui/assets/handoff-link-CGs8AaQW.js +0 -1
- package/dist/ui/assets/hid-picker-C4WMZ0dN.js +0 -1
- package/dist/ui/assets/host-command-PnmJLRej.js +0 -1
- package/dist/ui/assets/idle-compaction-CACtwRU_.js +0 -1
- package/dist/ui/assets/idle-compaction-settings-wK6JTbJh.js +0 -1
- package/dist/ui/assets/image-markers-DXh8szCT.js +0 -1
- package/dist/ui/assets/image-markers-Gur55AOh.js +0 -1
- package/dist/ui/assets/kernel-worker-Da1sBAJS.js +0 -4940
- package/dist/ui/assets/lick-manager-DtpJc-rA.js +0 -2
- package/dist/ui/assets/lick-urls-f41PW9LN.js +0 -1
- package/dist/ui/assets/main-BwL0siqZ.js +0 -22
- package/dist/ui/assets/main-cherry-D1l6FfCM.js +0 -1
- package/dist/ui/assets/navigation-watcher-C3S1JDXr.js +0 -1
- package/dist/ui/assets/new-session-DyvxhZfj.js +0 -2
- package/dist/ui/assets/oauth-bootstrap-KB9SK_o_.js +0 -2
- package/dist/ui/assets/oauth-service-CT-Lvflt.js +0 -1
- package/dist/ui/assets/oauth-service-nBlvta_T.js +0 -1
- package/dist/ui/assets/panel-rpc-handlers-BPA7Umeo.js +0 -2
- package/dist/ui/assets/picker-popup-BjCTzsQH.js +0 -1
- package/dist/ui/assets/picker-popup-CFr7T4TJ.js +0 -1
- package/dist/ui/assets/preview-url-BvtKejEp.js +0 -1
- package/dist/ui/assets/provider-settings-CHQp2onM.js +0 -1
- package/dist/ui/assets/provider-settings-Dp2FBrlU.js +0 -2
- package/dist/ui/assets/provider-store-access-8IJH8x4u.js +0 -1
- package/dist/ui/assets/providers-DuO7vxZy.js +0 -2
- package/dist/ui/assets/proxied-fetch-B0SF_J0b.js +0 -1
- package/dist/ui/assets/proxied-fetch-CNztWUVW.js +0 -2
- package/dist/ui/assets/remote-cdp-transport-BZuQZZe1.js +0 -1
- package/dist/ui/assets/request-body-CsruB58l.js +0 -1
- package/dist/ui/assets/rest-ops-31ZkM4IG.js +0 -1
- package/dist/ui/assets/rest-ops-D6OyHX5S.js +0 -1
- package/dist/ui/assets/run-b1PI_1dP.js +0 -81
- package/dist/ui/assets/runtime-env-BFnohVwN.js +0 -1
- package/dist/ui/assets/runtime-env-Dc36nUmg.js +0 -1
- package/dist/ui/assets/runtime-env-NCI8LQob.js +0 -1
- package/dist/ui/assets/runtime-env-a_l4ilH_.js +0 -1
- package/dist/ui/assets/secret-topology-B8MYKYm6.js +0 -1
- package/dist/ui/assets/serial-picker-fzg2DxKj.js +0 -1
- package/dist/ui/assets/setup-standalone-prelude-C2jWAIl4.js +0 -2
- package/dist/ui/assets/setup-sudo-BK3Rz-OI.js +0 -2
- package/dist/ui/assets/shared-BpOmrBY4.js +0 -1
- package/dist/ui/assets/shared-CTdWt5ZU.js +0 -4
- package/dist/ui/assets/silent-renew-backoff-B8p8Ja1t.js +0 -1
- package/dist/ui/assets/silent-renew-backoff-BjF-rXLR.js +0 -1
- package/dist/ui/assets/slicc-app-url-DnN_aesz.js +0 -1
- package/dist/ui/assets/slicc-version-CUqwa07v.js +0 -1
- package/dist/ui/assets/src-DXa5EsFV.js +0 -1
- package/dist/ui/assets/src-XLzS9HFL.js +0 -1
- package/dist/ui/assets/state-C7WiY9TK.js +0 -42
- package/dist/ui/assets/sync-dialog-BZ2j4xTg.js +0 -1
- package/dist/ui/assets/tab-teleport-D1Xeuund.js +0 -1
- package/dist/ui/assets/transformers-env-DnkszgHP.js +0 -1
- package/dist/ui/assets/tray-runtime-config-D9gR_d0I.js +0 -1
- package/dist/ui/assets/tray-runtime-config-DCaFjGSS.js +0 -1
- package/dist/ui/assets/tray-sidecar-CWqVyj-w.js +0 -2
- package/dist/ui/assets/tray-sync-protocol-BNw4_0UD.js +0 -1
- package/dist/ui/assets/tray-sync-protocol-BZ5yhJH9.js +0 -1
- package/dist/ui/assets/tray-webrtc-De2SkVvZ.js +0 -1
- package/dist/ui/assets/usb-picker-B8B4LJT7.js +0 -1
- package/dist/ui/assets/wc-browser-AyZY1PPl.js +0 -1
- package/dist/ui/assets/wc-follower-CYLEd4rs.js +0 -17
- package/dist/ui/assets/wc-follower-oauth-CTgC7D7W.js +0 -5
- package/dist/ui/assets/wc-live-s5MA_zAo.js +0 -8
- package/dist/ui/assets/wc-nav-DHUiLdz3.js +0 -2
- package/dist/ui/assets/wc-onboarding-CX3HBRTZ.js +0 -2
- package/dist/ui/assets/wc-permissions-providers-BzoJwkWd.js +0 -2
- package/dist/ui/assets/wc-placeholder-BPLzZhYP.js +0 -4
- package/dist/ui/assets/wc-settings-tszLzSGm.js +0 -59
- package/dist/ui/assets/wc-shell-BBDMmI8N.js +0 -122
- package/dist/ui/assets/wc-shortcuts-BWBA9QlD.js +0 -11
- package/dist/ui/assets/wc-sprinkles-Cx9Zvx6r.js +0 -2
- package/dist/ui/assets/wc-transcript-export-B6x5VMbH.js +0 -2
- package/dist/ui/assets/wc-tray-DEV2i60z.js +0 -5
- package/dist/ui/assets/whisper-session-i96-W77q.js +0 -2
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SLICC handoff link extractor.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the legacy `x-slicc` response header with two custom rels carried
|
|
5
|
+
* in a standard RFC 8288 `Link` header:
|
|
6
|
+
*
|
|
7
|
+
* Link: <https://github.com/owner/repo>; rel="https://www.sliccy.ai/rel/upskill"
|
|
8
|
+
* Link: <>; rel="https://www.sliccy.ai/rel/handoff";
|
|
9
|
+
* title*=UTF-8''Continue%20the%20signup%20flow
|
|
10
|
+
*
|
|
11
|
+
* SLICC dispatches by rel — the rel IS the verb. New verbs add new rels under
|
|
12
|
+
* the `https://www.sliccy.ai/rel/` namespace.
|
|
13
|
+
*/
|
|
14
|
+
import type { ParsedLink } from './link-header.js';
|
|
15
|
+
export declare const HANDOFF_REL = "https://www.sliccy.ai/rel/handoff";
|
|
16
|
+
export declare const UPSKILL_REL = "https://www.sliccy.ai/rel/upskill";
|
|
17
|
+
/**
|
|
18
|
+
* CDP `Network.Response.headers` bag. Values are strings at runtime (same-name
|
|
19
|
+
* headers joined with `\n`); the protocol envelope leaves them untyped until
|
|
20
|
+
* `getLinkHeaderValuesFromCdp` narrows.
|
|
21
|
+
*/
|
|
22
|
+
export type CdpHeaderBag = Record<string, unknown>;
|
|
23
|
+
export type HandoffVerb = 'handoff' | 'upskill';
|
|
24
|
+
export interface HandoffMatch {
|
|
25
|
+
verb: HandoffVerb;
|
|
26
|
+
/**
|
|
27
|
+
* Absolute URL when the verb's payload is a URL (e.g. upskill points at a
|
|
28
|
+
* GitHub repo). For prose-only verbs (handoff), this resolves to the page
|
|
29
|
+
* itself via the empty `<>` anchor convention.
|
|
30
|
+
*/
|
|
31
|
+
target: string;
|
|
32
|
+
/** Free-form prose instruction from the link's `title` parameter, if any. */
|
|
33
|
+
instruction?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Optional branch name carried by the upskill rel's `branch` Link param.
|
|
36
|
+
* Only populated for the upskill verb; the handoff verb ignores both
|
|
37
|
+
* `branch` and `path` because its target is the page itself, not a repo.
|
|
38
|
+
*/
|
|
39
|
+
branch?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Optional sub-path under the upskill rel's repo carried by the `path`
|
|
42
|
+
* Link param. Canonical directory form: a trailing `/SKILL.md` (which
|
|
43
|
+
* some emitters include to point at the manifest itself) is stripped so
|
|
44
|
+
* downstream consumers always see the skill's containing directory.
|
|
45
|
+
* Only populated for the upskill verb.
|
|
46
|
+
*/
|
|
47
|
+
path?: string;
|
|
48
|
+
}
|
|
49
|
+
export declare function isSafeUpskillBranch(value: string): boolean;
|
|
50
|
+
export declare function isSafeUpskillPath(value: string): boolean;
|
|
51
|
+
export declare function extractHandoff(links: ParsedLink[]): HandoffMatch | null;
|
|
52
|
+
/**
|
|
53
|
+
* Stable identity for a handoff/upskill payload, independent of the page URL
|
|
54
|
+
* that advertised it.
|
|
55
|
+
*
|
|
56
|
+
* A site can emit the same SLICC `Link` rel on every page response (e.g. a
|
|
57
|
+
* site-wide upskill pointing at one repo). Keying dedup on the page URL would
|
|
58
|
+
* never collapse those because the path changes on every navigation, while the
|
|
59
|
+
* payload (`verb` + `target` repo + `branch` + `path`, or for the prose
|
|
60
|
+
* `handoff` verb the page `target` + `instruction`) stays constant. Keying on
|
|
61
|
+
* this fingerprint lets callers process a given handoff once and silently drop
|
|
62
|
+
* repeat sightings of the same payload within a session.
|
|
63
|
+
*
|
|
64
|
+
* The NUL separator can't appear in any of the parts (URLs, git refs, paths,
|
|
65
|
+
* and the RFC 8187-decoded title are all NUL-free), so concatenation is
|
|
66
|
+
* collision-free without hashing.
|
|
67
|
+
*/
|
|
68
|
+
export declare function handoffFingerprint(input: {
|
|
69
|
+
verb: string;
|
|
70
|
+
target: string;
|
|
71
|
+
branch?: string;
|
|
72
|
+
path?: string;
|
|
73
|
+
instruction?: string;
|
|
74
|
+
}): string;
|
|
75
|
+
export declare function extractHandoffFromCdpHeaders(headers: CdpHeaderBag | undefined, baseUrl?: string): {
|
|
76
|
+
match: HandoffMatch | null;
|
|
77
|
+
links: ParsedLink[];
|
|
78
|
+
};
|
|
79
|
+
export declare function extractHandoffFromWebRequest(headers: Array<{
|
|
80
|
+
name: string;
|
|
81
|
+
value?: string;
|
|
82
|
+
}> | undefined, baseUrl?: string): {
|
|
83
|
+
match: HandoffMatch | null;
|
|
84
|
+
links: ParsedLink[];
|
|
85
|
+
};
|
|
86
|
+
export declare function extractHandoffFromFetchHeaders(headers: Headers | undefined, baseUrl?: string): {
|
|
87
|
+
match: HandoffMatch | null;
|
|
88
|
+
links: ParsedLink[];
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=handoff-link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff-link.d.ts","sourceRoot":"","sources":["../src/handoff-link.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQnD,eAAO,MAAM,WAAW,sCAAuC,CAAC;AAChE,eAAO,MAAM,WAAW,sCAAuC,CAAC;AAEhE;;;;GAIG;AAEH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAiDD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAO1D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAMxD;AAuCD,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,YAAY,GAAG,IAAI,CAevE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,CAQT;AAID,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,YAAY,GAAG,SAAS,EACjC,OAAO,CAAC,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,CAKrD;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,EAC5D,OAAO,CAAC,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,CAKrD;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,OAAO,CAAC,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,CAKrD"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SLICC handoff link extractor.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the legacy `x-slicc` response header with two custom rels carried
|
|
5
|
+
* in a standard RFC 8288 `Link` header:
|
|
6
|
+
*
|
|
7
|
+
* Link: <https://github.com/owner/repo>; rel="https://www.sliccy.ai/rel/upskill"
|
|
8
|
+
* Link: <>; rel="https://www.sliccy.ai/rel/handoff";
|
|
9
|
+
* title*=UTF-8''Continue%20the%20signup%20flow
|
|
10
|
+
*
|
|
11
|
+
* SLICC dispatches by rel — the rel IS the verb. New verbs add new rels under
|
|
12
|
+
* the `https://www.sliccy.ai/rel/` namespace.
|
|
13
|
+
*/
|
|
14
|
+
import { SLICC_HOSTED_ORIGIN } from './bridge-protocol.js';
|
|
15
|
+
import { getLinkHeaderValuesFromCdp, getLinkHeaderValuesFromHeaders, getLinkHeaderValuesFromWebRequest, parseLinkHeader, } from './link-header.js';
|
|
16
|
+
export const HANDOFF_REL = `${SLICC_HOSTED_ORIGIN}/rel/handoff`;
|
|
17
|
+
export const UPSKILL_REL = `${SLICC_HOSTED_ORIGIN}/rel/upskill`;
|
|
18
|
+
/** Strip a trailing `/SKILL.md` (case-insensitive) so callers see a directory. */
|
|
19
|
+
function canonicaliseUpskillPath(raw) {
|
|
20
|
+
const trimmed = raw.replace(/\/+$/, '');
|
|
21
|
+
const lower = trimmed.toLowerCase();
|
|
22
|
+
if (lower.endsWith('/skill.md'))
|
|
23
|
+
return trimmed.slice(0, -'/skill.md'.length);
|
|
24
|
+
if (lower === 'skill.md')
|
|
25
|
+
return '';
|
|
26
|
+
return trimmed;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Shell-metacharacter allowlists for `branch` and `path` Link params.
|
|
30
|
+
*
|
|
31
|
+
* The `Link` header is attacker-controlled (any page the user opens can
|
|
32
|
+
* emit one). The cone consumes the navigate-lick body verbatim and
|
|
33
|
+
* follows the `handoff` SKILL instruction to render `upskill --branch
|
|
34
|
+
* <b> --path <p> <target>` as a `bash` tool call — a string the WASM
|
|
35
|
+
* shell tokenizes. If `b` or `p` carry `;`, backticks, dollar-paren,
|
|
36
|
+
* or a trailing newline, an unquoted/mis-quoted splice could smuggle
|
|
37
|
+
* a second command past the approval card's visible code rows.
|
|
38
|
+
*
|
|
39
|
+
* Defense-in-depth: drop unsafe values here so they never enter the
|
|
40
|
+
* lick body the cone reads. The `upskill` command also re-validates
|
|
41
|
+
* (`upskill-command.ts` imports `isSafeUpskillBranch` /
|
|
42
|
+
* `isSafeUpskillPath`) as a second gate in case a future dispatch
|
|
43
|
+
* path bypasses this extractor.
|
|
44
|
+
*
|
|
45
|
+
* The allowlists are intentionally narrow:
|
|
46
|
+
*
|
|
47
|
+
* - Branch: `git check-ref-format` characters (alphanumerics, `.`,
|
|
48
|
+
* `_`, `/`, `-`). `..` segments, a leading `-`/`/`, a trailing `/`,
|
|
49
|
+
* and a `.lock` suffix are rejected to match git's own rules. Max
|
|
50
|
+
* length 250 (git's `MAX_REF_NAMELEN`).
|
|
51
|
+
* - Path: same character set as branches; no `..` traversal, no
|
|
52
|
+
* leading `-` (avoids being parsed as a flag) or leading `/` (the
|
|
53
|
+
* wire format is repo-relative). Max length 1024.
|
|
54
|
+
*
|
|
55
|
+
* Anything beyond ASCII is rejected on purpose: a homoglyph branch
|
|
56
|
+
* name would render identical to a real one in the approval card but
|
|
57
|
+
* resolve to a different ref. Real git branches in the wild are
|
|
58
|
+
* ASCII; the cost of rejecting unicode here is low and the
|
|
59
|
+
* homoglyph-spoofing surface this closes is meaningful.
|
|
60
|
+
*/
|
|
61
|
+
const SAFE_BRANCH_RE = /^[A-Za-z0-9._/-]+$/;
|
|
62
|
+
const SAFE_PATH_RE = /^[A-Za-z0-9._/-]+$/;
|
|
63
|
+
const MAX_BRANCH_LEN = 250;
|
|
64
|
+
const MAX_PATH_LEN = 1024;
|
|
65
|
+
export function isSafeUpskillBranch(value) {
|
|
66
|
+
if (value.length === 0 || value.length > MAX_BRANCH_LEN)
|
|
67
|
+
return false;
|
|
68
|
+
if (!SAFE_BRANCH_RE.test(value))
|
|
69
|
+
return false;
|
|
70
|
+
if (value.startsWith('-') || value.startsWith('/') || value.endsWith('/'))
|
|
71
|
+
return false;
|
|
72
|
+
if (value.includes('..'))
|
|
73
|
+
return false;
|
|
74
|
+
if (value.endsWith('.lock'))
|
|
75
|
+
return false;
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
export function isSafeUpskillPath(value) {
|
|
79
|
+
if (value.length === 0 || value.length > MAX_PATH_LEN)
|
|
80
|
+
return false;
|
|
81
|
+
if (!SAFE_PATH_RE.test(value))
|
|
82
|
+
return false;
|
|
83
|
+
if (value.startsWith('-') || value.startsWith('/'))
|
|
84
|
+
return false;
|
|
85
|
+
if (value.includes('..'))
|
|
86
|
+
return false;
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Find the first SLICC-recognised handoff link in a parsed Link header set.
|
|
91
|
+
*
|
|
92
|
+
* Rel comparison is case-sensitive: RFC 8288 §2.1.1 mandates URI rels, and
|
|
93
|
+
* generic URI comparison is case-sensitive in path/query. Scheme and host
|
|
94
|
+
* are case-insensitive, but our canonical form uses lowercase already.
|
|
95
|
+
*
|
|
96
|
+
* For the upskill verb, optional `branch` and `path` Link params are
|
|
97
|
+
* surfaced on the match so the dispatch path can pass them through to the
|
|
98
|
+
* `upskill` command's `--branch` / `--path` flags. These params are
|
|
99
|
+
* upskill-only — they are ignored on the handoff verb (whose target is the
|
|
100
|
+
* page itself, not a git tree).
|
|
101
|
+
*/
|
|
102
|
+
/**
|
|
103
|
+
* Populate optional upskill params (branch, path) on a match.
|
|
104
|
+
*
|
|
105
|
+
* `parseLinkHeader` lowercases param names and applies RFC 8187 ext-value
|
|
106
|
+
* decoding, so `branch`, `branch*=UTF-8''…`, `BRANCH=…` all land under
|
|
107
|
+
* the same `branch` key.
|
|
108
|
+
*
|
|
109
|
+
* Shell-injection defense: drop branch/path values that contain anything
|
|
110
|
+
* outside the allowlist (see `isSafeUpskillBranch` / `isSafeUpskillPath`).
|
|
111
|
+
* The values ride to the cone inside a navigate-lick body, then back out as
|
|
112
|
+
* flag arguments to the `upskill` bash command — every character has to be
|
|
113
|
+
* safe both as JSON content and as an argv token. Silent drop matches the
|
|
114
|
+
* existing "empty value -> field omitted" contract.
|
|
115
|
+
*/
|
|
116
|
+
function applyUpskillParams(result, params) {
|
|
117
|
+
const branch = params.branch;
|
|
118
|
+
if (typeof branch === 'string' && isSafeUpskillBranch(branch))
|
|
119
|
+
result.branch = branch;
|
|
120
|
+
const pathParam = params.path;
|
|
121
|
+
if (typeof pathParam === 'string' && pathParam.length > 0) {
|
|
122
|
+
const canon = canonicaliseUpskillPath(pathParam);
|
|
123
|
+
if (canon.length > 0 && isSafeUpskillPath(canon))
|
|
124
|
+
result.path = canon;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export function extractHandoff(links) {
|
|
128
|
+
for (const link of links) {
|
|
129
|
+
if (link.rel.includes(HANDOFF_REL)) {
|
|
130
|
+
const result = { verb: 'handoff', target: link.href };
|
|
131
|
+
if (link.title != null && link.title.length > 0)
|
|
132
|
+
result.instruction = link.title;
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
if (link.rel.includes(UPSKILL_REL)) {
|
|
136
|
+
const result = { verb: 'upskill', target: link.href };
|
|
137
|
+
if (link.title != null && link.title.length > 0)
|
|
138
|
+
result.instruction = link.title;
|
|
139
|
+
applyUpskillParams(result, link.params);
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Stable identity for a handoff/upskill payload, independent of the page URL
|
|
147
|
+
* that advertised it.
|
|
148
|
+
*
|
|
149
|
+
* A site can emit the same SLICC `Link` rel on every page response (e.g. a
|
|
150
|
+
* site-wide upskill pointing at one repo). Keying dedup on the page URL would
|
|
151
|
+
* never collapse those because the path changes on every navigation, while the
|
|
152
|
+
* payload (`verb` + `target` repo + `branch` + `path`, or for the prose
|
|
153
|
+
* `handoff` verb the page `target` + `instruction`) stays constant. Keying on
|
|
154
|
+
* this fingerprint lets callers process a given handoff once and silently drop
|
|
155
|
+
* repeat sightings of the same payload within a session.
|
|
156
|
+
*
|
|
157
|
+
* The NUL separator can't appear in any of the parts (URLs, git refs, paths,
|
|
158
|
+
* and the RFC 8187-decoded title are all NUL-free), so concatenation is
|
|
159
|
+
* collision-free without hashing.
|
|
160
|
+
*/
|
|
161
|
+
export function handoffFingerprint(input) {
|
|
162
|
+
return [
|
|
163
|
+
input.verb,
|
|
164
|
+
input.target,
|
|
165
|
+
input.branch ?? '',
|
|
166
|
+
input.path ?? '',
|
|
167
|
+
input.instruction ?? '',
|
|
168
|
+
].join('\u0000');
|
|
169
|
+
}
|
|
170
|
+
/* ────────── header-shape adapters that go straight to a verb match ────────── */
|
|
171
|
+
export function extractHandoffFromCdpHeaders(headers, baseUrl) {
|
|
172
|
+
const values = getLinkHeaderValuesFromCdp(headers);
|
|
173
|
+
if (values.length === 0)
|
|
174
|
+
return { match: null, links: [] };
|
|
175
|
+
const links = parseLinkHeader(values, baseUrl);
|
|
176
|
+
return { match: extractHandoff(links), links };
|
|
177
|
+
}
|
|
178
|
+
export function extractHandoffFromWebRequest(headers, baseUrl) {
|
|
179
|
+
const values = getLinkHeaderValuesFromWebRequest(headers);
|
|
180
|
+
if (values.length === 0)
|
|
181
|
+
return { match: null, links: [] };
|
|
182
|
+
const links = parseLinkHeader(values, baseUrl);
|
|
183
|
+
return { match: extractHandoff(links), links };
|
|
184
|
+
}
|
|
185
|
+
export function extractHandoffFromFetchHeaders(headers, baseUrl) {
|
|
186
|
+
const values = getLinkHeaderValuesFromHeaders(headers);
|
|
187
|
+
if (values.length === 0)
|
|
188
|
+
return { match: null, links: [] };
|
|
189
|
+
const links = parseLinkHeader(values, baseUrl);
|
|
190
|
+
return { match: extractHandoff(links), links };
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=handoff-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff-link.js","sourceRoot":"","sources":["../src/handoff-link.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether this page itself is running inside another frame (e.g. a cherry
|
|
3
|
+
* follower embedded in a third-party host page's iframe). A sprinkle's or
|
|
4
|
+
* dip's own render iframe is then nested two levels deep instead of one,
|
|
5
|
+
* which hits a Chromium first-paint bug: the innermost iframe's content
|
|
6
|
+
* loads and executes correctly but the compositor never rasterizes it,
|
|
7
|
+
* leaving the panel blank until something forces a full frame-tree repaint
|
|
8
|
+
* (DevTools attaching, or a page reload). `nudgeIframeRepaint` works around
|
|
9
|
+
* it without either of those.
|
|
10
|
+
*
|
|
11
|
+
* DOM globals (`window`, `HTMLIFrameElement`, `requestAnimationFrame`) are
|
|
12
|
+
* read through `globalThis` with local structural types rather than the
|
|
13
|
+
* ambient `lib.dom` identifiers: this module is only ever RUN in a browser,
|
|
14
|
+
* but it is also type-checked by non-browser tsconfig projects that compile
|
|
15
|
+
* `@slicc/shared-ts` source without the `DOM` lib (the worker/CLI/node-server
|
|
16
|
+
* projects) — see this package's Conventions in CLAUDE.md.
|
|
17
|
+
*/
|
|
18
|
+
export declare function isNestedInAnotherFrame(): boolean;
|
|
19
|
+
/** Structural subset of `HTMLIFrameElement` this module needs. */
|
|
20
|
+
interface RepaintableIframe {
|
|
21
|
+
style: {
|
|
22
|
+
display: string;
|
|
23
|
+
};
|
|
24
|
+
isConnected: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Force the browser to redo the render/compositing pass for `iframe` by
|
|
28
|
+
* toggling `display` off and back on across two animation frames. A resize
|
|
29
|
+
* event or explicit layout read (`getBoundingClientRect`) does NOT trigger
|
|
30
|
+
* the missing repaint for this bug — only a `display` toggle (or an
|
|
31
|
+
* out-of-band event like DevTools attaching) does.
|
|
32
|
+
*
|
|
33
|
+
* In nested cross-origin frames (cherry follower inside a host page), the
|
|
34
|
+
* single nudge on load can race with the compositor's frame-tree commit.
|
|
35
|
+
* A safety-net retry fires after 500ms, but ONLY when the first nudge was
|
|
36
|
+
* restored by the setTimeout fallback (indicating rAF was throttled and the
|
|
37
|
+
* compositor likely didn't commit). When rAF fires normally the retry is
|
|
38
|
+
* skipped — the compositor was responsive and the nudge almost certainly
|
|
39
|
+
* took effect.
|
|
40
|
+
*
|
|
41
|
+
* Re-entrancy-safe: the dip mount fires this from BOTH the iframe `load`
|
|
42
|
+
* handler AND an IntersectionObserver, which can overlap. A second call that
|
|
43
|
+
* landed mid-nudge would read the transient `display:'none'` as
|
|
44
|
+
* `previousDisplay` and "restore" the iframe to hidden — leaving dips
|
|
45
|
+
* permanently invisible in nested followers (the extension side panel). When a
|
|
46
|
+
* nudge is already pending we skip: the in-flight one will restore the correct
|
|
47
|
+
* display, so we just run the callback.
|
|
48
|
+
*/
|
|
49
|
+
export declare function nudgeIframeRepaint(iframe: RepaintableIframe, onDone?: () => void): void;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=iframe-repaint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iframe-repaint.d.ts","sourceRoot":"","sources":["../src/iframe-repaint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,wBAAgB,sBAAsB,IAAI,OAAO,CAchD;AAED,kEAAkE;AAClE,UAAU,iBAAiB;IACzB,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;CACtB;AASD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAoBvF"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether this page itself is running inside another frame (e.g. a cherry
|
|
3
|
+
* follower embedded in a third-party host page's iframe). A sprinkle's or
|
|
4
|
+
* dip's own render iframe is then nested two levels deep instead of one,
|
|
5
|
+
* which hits a Chromium first-paint bug: the innermost iframe's content
|
|
6
|
+
* loads and executes correctly but the compositor never rasterizes it,
|
|
7
|
+
* leaving the panel blank until something forces a full frame-tree repaint
|
|
8
|
+
* (DevTools attaching, or a page reload). `nudgeIframeRepaint` works around
|
|
9
|
+
* it without either of those.
|
|
10
|
+
*
|
|
11
|
+
* DOM globals (`window`, `HTMLIFrameElement`, `requestAnimationFrame`) are
|
|
12
|
+
* read through `globalThis` with local structural types rather than the
|
|
13
|
+
* ambient `lib.dom` identifiers: this module is only ever RUN in a browser,
|
|
14
|
+
* but it is also type-checked by non-browser tsconfig projects that compile
|
|
15
|
+
* `@slicc/shared-ts` source without the `DOM` lib (the worker/CLI/node-server
|
|
16
|
+
* projects) — see this package's Conventions in CLAUDE.md.
|
|
17
|
+
*/
|
|
18
|
+
export function isNestedInAnotherFrame() {
|
|
19
|
+
try {
|
|
20
|
+
// Read through `globalThis.window`, not `globalThis` itself: in a real
|
|
21
|
+
// browser `window === globalThis`, so the two are equivalent, but a test
|
|
22
|
+
// harness that stubs a separate `window` object (assigning only
|
|
23
|
+
// `globalThis.window`, not replacing `globalThis`) needs this to resolve
|
|
24
|
+
// the SAME way a bare `window.self`/`window.top` reference would.
|
|
25
|
+
const win = globalThis.window ?? globalThis;
|
|
26
|
+
return win.self !== win.top;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Cross-origin access to `window.top` throws — that itself means we're
|
|
30
|
+
// framed by a different origin, which is the case this guards against.
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Iframes with a repaint nudge currently in flight (display toggled off,
|
|
35
|
+
* restore pending). Guards against overlapping nudges corrupting the restore
|
|
36
|
+
* value — see {@link nudgeIframeRepaint}. */
|
|
37
|
+
const nudgeInFlight = new WeakSet();
|
|
38
|
+
/**
|
|
39
|
+
* Force the browser to redo the render/compositing pass for `iframe` by
|
|
40
|
+
* toggling `display` off and back on across two animation frames. A resize
|
|
41
|
+
* event or explicit layout read (`getBoundingClientRect`) does NOT trigger
|
|
42
|
+
* the missing repaint for this bug — only a `display` toggle (or an
|
|
43
|
+
* out-of-band event like DevTools attaching) does.
|
|
44
|
+
*
|
|
45
|
+
* In nested cross-origin frames (cherry follower inside a host page), the
|
|
46
|
+
* single nudge on load can race with the compositor's frame-tree commit.
|
|
47
|
+
* A safety-net retry fires after 500ms, but ONLY when the first nudge was
|
|
48
|
+
* restored by the setTimeout fallback (indicating rAF was throttled and the
|
|
49
|
+
* compositor likely didn't commit). When rAF fires normally the retry is
|
|
50
|
+
* skipped — the compositor was responsive and the nudge almost certainly
|
|
51
|
+
* took effect.
|
|
52
|
+
*
|
|
53
|
+
* Re-entrancy-safe: the dip mount fires this from BOTH the iframe `load`
|
|
54
|
+
* handler AND an IntersectionObserver, which can overlap. A second call that
|
|
55
|
+
* landed mid-nudge would read the transient `display:'none'` as
|
|
56
|
+
* `previousDisplay` and "restore" the iframe to hidden — leaving dips
|
|
57
|
+
* permanently invisible in nested followers (the extension side panel). When a
|
|
58
|
+
* nudge is already pending we skip: the in-flight one will restore the correct
|
|
59
|
+
* display, so we just run the callback.
|
|
60
|
+
*/
|
|
61
|
+
export function nudgeIframeRepaint(iframe, onDone) {
|
|
62
|
+
if (nudgeInFlight.has(iframe)) {
|
|
63
|
+
onDone?.();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Track whether rAF restored (compositor responsive) vs setTimeout fallback.
|
|
67
|
+
let rafRestored = false;
|
|
68
|
+
performNudge(iframe, onDone, () => {
|
|
69
|
+
rafRestored = true;
|
|
70
|
+
});
|
|
71
|
+
// Safety-net retry: fires only when the first nudge fell back to setTimeout
|
|
72
|
+
// (rAF was throttled), meaning the compositor likely didn't commit the frame
|
|
73
|
+
// tree in time for the first toggle to take effect.
|
|
74
|
+
setTimeout(() => {
|
|
75
|
+
if (rafRestored)
|
|
76
|
+
return;
|
|
77
|
+
if (!iframe.isConnected)
|
|
78
|
+
return;
|
|
79
|
+
performNudge(iframe);
|
|
80
|
+
}, 500);
|
|
81
|
+
}
|
|
82
|
+
function performNudge(iframe, onDone, onRafRestore) {
|
|
83
|
+
if (nudgeInFlight.has(iframe)) {
|
|
84
|
+
onDone?.();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
nudgeInFlight.add(iframe);
|
|
88
|
+
const previousDisplay = iframe.style.display;
|
|
89
|
+
iframe.style.display = 'none';
|
|
90
|
+
// In cross-origin iframes, rAF can be throttled. Use setTimeout as a
|
|
91
|
+
// fallback ceiling so the restore always fires within a bounded time.
|
|
92
|
+
let restored = false;
|
|
93
|
+
const restore = (viaRaf) => {
|
|
94
|
+
if (restored)
|
|
95
|
+
return;
|
|
96
|
+
restored = true;
|
|
97
|
+
iframe.style.display = previousDisplay;
|
|
98
|
+
nudgeInFlight.delete(iframe);
|
|
99
|
+
if (viaRaf)
|
|
100
|
+
onRafRestore?.();
|
|
101
|
+
onDone?.();
|
|
102
|
+
};
|
|
103
|
+
// rAF may be absent — a non-browser context, or (the common case) a test
|
|
104
|
+
// whose 500ms safety-net setTimeout fires AFTER the test tore down its jsdom
|
|
105
|
+
// global. Guard it so a missing rAF just falls through to the setTimeout
|
|
106
|
+
// ceiling below rather than throwing an unhandled `requestAnimationFrame is
|
|
107
|
+
// not a function` (which fails the whole vitest run — see #1603's merge-queue
|
|
108
|
+
// flake). In a real browser rAF is always present, so behavior is unchanged.
|
|
109
|
+
const raf = globalThis
|
|
110
|
+
.requestAnimationFrame;
|
|
111
|
+
if (typeof raf === 'function') {
|
|
112
|
+
raf(() => {
|
|
113
|
+
raf(() => restore(true));
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
setTimeout(() => restore(false), 100);
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=iframe-repaint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iframe-repaint.js","sourceRoot":"","sources":["../src/iframe-repaint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,MAAM,UAAU,sBAAsB;IACpC,IAAI,CAAC;QACH,uEAAuE;QACvE,yEAAyE;QACzE,gEAAgE;QAChE,yEAAyE;QACzE,kEAAkE;QAClE,MAAM,GAAG,GAAI,UAAuC,CAAC,MAAM,IAAK,UAA0B,CAAC;QAC3F,OAAO,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,uEAAuE;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAQD;;8CAE8C;AAC9C,MAAM,aAAa,GAAG,IAAI,OAAO,EAAqB,CAAC;AAIvD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAyB,EAAE,MAAmB;IAC/E,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,MAAM,EAAE,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,6EAA6E;IAC7E,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE;QAChC,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,6EAA6E;IAC7E,oDAAoD;IACpD,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,WAAW;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO;QAChC,YAAY,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC,EAAE,GAAG,CAAC,CAAC;AACV,CAAC;AAED,SAAS,YAAY,CACnB,MAAyB,EACzB,MAAmB,EACnB,YAAyB;IAEzB,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,MAAM,EAAE,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IACD,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;IAC7C,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IAE9B,qEAAqE;IACrE,sEAAsE;IACtE,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,OAAO,GAAG,CAAC,MAAe,EAAE,EAAE;QAClC,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,eAAe,CAAC;QACvC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,MAAM;YAAE,YAAY,EAAE,EAAE,CAAC;QAC7B,MAAM,EAAE,EAAE,CAAC;IACb,CAAC,CAAC;IAEF,yEAAyE;IACzE,6EAA6E;IAC7E,yEAAyE;IACzE,4EAA4E;IAC5E,8EAA8E;IAC9E,6EAA6E;IAC7E,MAAM,GAAG,GAAI,UAAkE;SAC5E,qBAAqB,CAAC;IACzB,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,GAAG,CAAC,GAAG,EAAE;YACP,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IACD,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -2,13 +2,21 @@ export * from './agent-wire-types.js';
|
|
|
2
2
|
export * from './base64.js';
|
|
3
3
|
export * from './bridge-protocol.js';
|
|
4
4
|
export * from './cdp-frame-unmask.js';
|
|
5
|
+
export * from './cdp-target-info.js';
|
|
5
6
|
export * from './content-type.js';
|
|
7
|
+
export * from './discovery-link.js';
|
|
6
8
|
export * from './electron-overlay-route.js';
|
|
9
|
+
export * from './extension-bridge-protocol.js';
|
|
7
10
|
export * from './fetch-proxy-protocol.js';
|
|
8
11
|
export * from './form-body-unmask.js';
|
|
12
|
+
export * from './handoff-link.js';
|
|
13
|
+
export * from './iframe-repaint.js';
|
|
14
|
+
export * from './leader-ext-id.js';
|
|
15
|
+
export * from './link-header.js';
|
|
9
16
|
export * from './loopback.js';
|
|
10
17
|
export * from './oauth-extra-domains-storage.js';
|
|
11
18
|
export * from './preview-url.js';
|
|
19
|
+
export * from './proxy-headers.js';
|
|
12
20
|
export * from './runtime-env.js';
|
|
13
21
|
export * from './secret-env-schema.js';
|
|
14
22
|
export * from './secret-masking.js';
|
|
@@ -22,4 +30,5 @@ export * from './transcript-redaction.js';
|
|
|
22
30
|
export * from './tray-signaling.js';
|
|
23
31
|
export * from './tray-sync-protocol.js';
|
|
24
32
|
export * from './tray-url-shared.js';
|
|
33
|
+
export * from './well-known-probe.js';
|
|
25
34
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC"}
|
|
@@ -3,13 +3,21 @@ export * from './agent-wire-types.js';
|
|
|
3
3
|
export * from './base64.js';
|
|
4
4
|
export * from './bridge-protocol.js';
|
|
5
5
|
export * from './cdp-frame-unmask.js';
|
|
6
|
+
export * from './cdp-target-info.js';
|
|
6
7
|
export * from './content-type.js';
|
|
8
|
+
export * from './discovery-link.js';
|
|
7
9
|
export * from './electron-overlay-route.js';
|
|
10
|
+
export * from './extension-bridge-protocol.js';
|
|
8
11
|
export * from './fetch-proxy-protocol.js';
|
|
9
12
|
export * from './form-body-unmask.js';
|
|
13
|
+
export * from './handoff-link.js';
|
|
14
|
+
export * from './iframe-repaint.js';
|
|
15
|
+
export * from './leader-ext-id.js';
|
|
16
|
+
export * from './link-header.js';
|
|
10
17
|
export * from './loopback.js';
|
|
11
18
|
export * from './oauth-extra-domains-storage.js';
|
|
12
19
|
export * from './preview-url.js';
|
|
20
|
+
export * from './proxy-headers.js';
|
|
13
21
|
export * from './runtime-env.js';
|
|
14
22
|
export * from './secret-env-schema.js';
|
|
15
23
|
export * from './secret-masking.js';
|
|
@@ -23,4 +31,5 @@ export * from './transcript-redaction.js';
|
|
|
23
31
|
export * from './tray-signaling.js';
|
|
24
32
|
export * from './tray-sync-protocol.js';
|
|
25
33
|
export * from './tray-url-shared.js';
|
|
34
|
+
export * from './well-known-probe.js';
|
|
26
35
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL query parameter the service worker appends to the pinned leader-tab
|
|
3
|
+
* URL carrying the extension id. The leader page reads it to open the
|
|
4
|
+
* `chrome.runtime.connect(<id>, { name: EXTENSION_BRIDGE_PORT_NAME })` Port
|
|
5
|
+
* (see `extension-bridge-protocol.ts`) — `chrome.runtime.id` is undefined on
|
|
6
|
+
* an externally_connectable page, so the id must be passed in out of band.
|
|
7
|
+
*
|
|
8
|
+
* Deliberately its own one-export module (#2276 slice E round-1 review)
|
|
9
|
+
* rather than living inside `extension-bridge-protocol.ts`: two first-load
|
|
10
|
+
* page files (`ui/boot/setup-standalone-prelude.ts`,
|
|
11
|
+
* `ui/llm-proxy-sw-config.ts`) import only this constant, and pulling in the
|
|
12
|
+
* whole 240-line envelope-type module for one string constant unnecessarily
|
|
13
|
+
* widens whatever a bundler decides is reachable from the eager page graph.
|
|
14
|
+
*/
|
|
15
|
+
export declare const LEADER_EXT_ID_QUERY_NAME = "ext";
|
|
16
|
+
//# sourceMappingURL=leader-ext-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leader-ext-id.d.ts","sourceRoot":"","sources":["../src/leader-ext-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL query parameter the service worker appends to the pinned leader-tab
|
|
3
|
+
* URL carrying the extension id. The leader page reads it to open the
|
|
4
|
+
* `chrome.runtime.connect(<id>, { name: EXTENSION_BRIDGE_PORT_NAME })` Port
|
|
5
|
+
* (see `extension-bridge-protocol.ts`) — `chrome.runtime.id` is undefined on
|
|
6
|
+
* an externally_connectable page, so the id must be passed in out of band.
|
|
7
|
+
*
|
|
8
|
+
* Deliberately its own one-export module (#2276 slice E round-1 review)
|
|
9
|
+
* rather than living inside `extension-bridge-protocol.ts`: two first-load
|
|
10
|
+
* page files (`ui/boot/setup-standalone-prelude.ts`,
|
|
11
|
+
* `ui/llm-proxy-sw-config.ts`) import only this constant, and pulling in the
|
|
12
|
+
* whole 240-line envelope-type module for one string constant unnecessarily
|
|
13
|
+
* widens whatever a bundler decides is reachable from the eager page graph.
|
|
14
|
+
*/
|
|
15
|
+
export const LEADER_EXT_ID_QUERY_NAME = 'ext';
|
|
16
|
+
//# sourceMappingURL=leader-ext-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leader-ext-id.js","sourceRoot":"","sources":["../src/leader-ext-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC"}
|