sliccy 6.130.1 → 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 +1 -1
- 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-XKjChfD5.js → account-store-DsMvFZgS.js} +3 -3
- package/dist/ui/assets/account-store-naVgJKHe.js +1 -0
- package/dist/ui/assets/{adobe-DWv_nW7C.js → adobe-BhZB46bT.js} +1 -1
- package/dist/ui/assets/{adobe-B7sd2ey1.js → adobe-sRIQnDEl.js} +2 -2
- package/dist/ui/assets/{agent-bridge-CmEtyUJl.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-D-QW1Bgf.js → apply-layout-dNkV0TEv.js} +1 -1
- package/dist/ui/assets/{apps-Dl5abdz0.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-CZHEfw9U.js → azure-openai-B9ZeZZ0T.js} +1 -1
- package/dist/ui/assets/{azure-openai-rq6LQC_C.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-CjhIAx1j.js → cerebras-CsdnfQnc.js} +1 -1
- package/dist/ui/assets/{cerebras-UuG-yCJ_.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-AitKSc2i.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-Ca0RuudO.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-0AC_1kYN.js → fs-CBaQR8Xc.js} +2 -2
- package/dist/ui/assets/{fs-ClRFZsKp.js → fs-CDaCMxrL.js} +1 -1
- package/dist/ui/assets/github-B7uOq9Q1.js +1 -0
- package/dist/ui/assets/{github-copilot-hBCBR7n3.js → github-copilot-BeWJoZwD.js} +1 -1
- package/dist/ui/assets/{github-copilot-BlR9rGzE.js → github-copilot-DwKSI23j.js} +1 -1
- package/dist/ui/assets/{github-install-c-7WlKF0.js → github-install-DE7dF6r8.js} +1 -1
- package/dist/ui/assets/{github-DA1dJZHt.js → github-qhOhjD2Q.js} +2 -2
- package/dist/ui/assets/{github-zip-BAPGRyWK.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-LDG2J6R7.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-CLGBN8Zo.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-V_qJr_00.js → kernel-worker-CkZd8Enf.js} +679 -628
- 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-Z6hqEJOJ.js → local-llm-B-qS5oNT.js} +1 -1
- package/dist/ui/assets/{local-llm-Ko45nuy7.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-BrmPOs2_.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-lKw_Vyz_.js → mount-recovery-OxgGejDC.js} +1 -1
- package/dist/ui/assets/{mount-O6L8YW8P.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-39sNBZa4.js → openai-codex-BZDYkVh6.js} +1 -1
- package/dist/ui/assets/{openai-codex-DUyhVHOH.js → openai-codex-DlFMWNVB.js} +1 -1
- package/dist/ui/assets/{openrouter-Dt0-tju5.js → openrouter-BrS9XpJS.js} +1 -1
- package/dist/ui/assets/{openrouter-Dpc-slj8.js → openrouter-Dn_iX45f.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-Bw9klnns.js → openrouter-oauth-CioQlp0x.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-WcOnlgk3.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-BKNTonMh.js → provider-BfGyOQHs.js} +2 -2
- package/dist/ui/assets/{provider-Bc9U8jIG.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-CvRhpMjO.js → provider-store-access-BqErJhmB.js} +2 -2
- package/dist/ui/assets/provider-store-access-BuQzycZu.js +1 -0
- package/dist/ui/assets/{providers-Chea6cTR.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-Dg39s0LK.js → quick-llm-B9NubAhJ.js} +1 -1
- package/dist/ui/assets/{recovery-screen-B5CPvW63.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-BMFAdS2O.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-DcYjRdMg.js → session-freezer-Bltt6zUt.js} +3 -3
- package/dist/ui/assets/{setup-feature-flags-remote-w6i7-xsn.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-DHmzZdlX.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-CB063Z3h.js → snapshot-Bi6QabWh.js} +1 -1
- package/dist/ui/assets/{snapshot-features-CpPq39XU.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-IAZCSKrZ.js → store-CFx1fIZL.js} +1 -1
- package/dist/ui/assets/{store-BiIJ0_As.js → store-i7XHN1Er.js} +1 -1
- package/dist/ui/assets/{sudo-llO15-hr.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-D4-saTZd.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-BKv2ap0T.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-0dg6iolO.js → xai-grok-3L0LL1R8.js} +1 -1
- package/dist/ui/assets/{xai-grok-pGpFfbjv.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-Bt3zihHK.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-Bo32za86.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/lick-manager-DtpJc-rA.js +0 -2
- package/dist/ui/assets/lick-urls-f41PW9LN.js +0 -1
- package/dist/ui/assets/main-DG-TOKaI.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-Bl4ZsQ9b.js +0 -2
- package/dist/ui/assets/oauth-bootstrap-Ch6w-P0O.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-CRIaZYfR.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-9D34aQwf.js +0 -1
- package/dist/ui/assets/provider-settings-BdsyHTuR.js +0 -2
- package/dist/ui/assets/provider-store-access-Dk0cF7LZ.js +0 -1
- package/dist/ui/assets/providers-gHHjy3ja.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-C31PlCiF.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-DFrkjkWu.js +0 -2
- package/dist/ui/assets/setup-sudo-C0g6ApHD.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-CVpFSZ60.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-Ct1GOwP8.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-DEUkZTu_.js +0 -17
- package/dist/ui/assets/wc-follower-oauth-CTgC7D7W.js +0 -5
- package/dist/ui/assets/wc-live-DkTXA2Bw.js +0 -8
- package/dist/ui/assets/wc-nav-2fZPqw9y.js +0 -2
- package/dist/ui/assets/wc-onboarding-C8kBkCKD.js +0 -2
- package/dist/ui/assets/wc-permissions-providers-BzoJwkWd.js +0 -2
- package/dist/ui/assets/wc-placeholder-CzEI-8XA.js +0 -4
- package/dist/ui/assets/wc-settings--cPEMbHv.js +0 -59
- package/dist/ui/assets/wc-shell-58xXdR-i.js +0 -122
- package/dist/ui/assets/wc-shortcuts-BWBA9QlD.js +0 -11
- package/dist/ui/assets/wc-sprinkles-CN5LWTpu.js +0 -2
- package/dist/ui/assets/wc-transcript-export-B6x5VMbH.js +0 -2
- package/dist/ui/assets/wc-tray-D--vd5uV.js +0 -5
- package/dist/ui/assets/whisper-session-i96-W77q.js +0 -2
package/README.md
CHANGED
|
@@ -76,7 +76,7 @@ SLICC is for you if:
|
|
|
76
76
|
- **Read markdown and HTML, or read their source.** A `.md` or `.html` preview opens as the document — formatted prose, a laid-out page — with a **Source** toggle for the syntax-highlighted markup (and **Diff** when the file has uncommitted changes). HTML renders in a sandboxed frame that cannot run scripts or reach the app.
|
|
77
77
|
- **Preview any file, not just the well-known types.** The previewer identifies files from their CONTENT rather than a list of extensions, so an unrecognized extension (`.jsh`, a `Justfile`) previews as source instead of refusing. Text is syntax-highlighted, PDFs render inline, and images, audio, and video play as before.
|
|
78
78
|
- **Add visual and file context directly in chat.** Drop images or files onto the workspace, or use the paperclip button. Dropped `.skill` archives still install into `/workspace/skills`.
|
|
79
|
-
- **Never lose a conversation to compaction.** Whenever a cone's history is summarized to fit the context window, the full transcript is first saved to `/sessions` as a live snapshot (one per cone, extended on every round) and the summary tells the agent where to find it. **New chat** completes that snapshot into a normal frozen session (Save / New chat, fast) or deletes it (Discard). With the experimental **Compact on idle** flag on, a cone that has sat idle for 30 minutes with a context of at least 200k tokens compacts in the background; if you come back mid-round, the round is thrown away and your chat continues as it was.
|
|
79
|
+
- **Never lose a conversation to compaction.** Whenever a cone's history is summarized to fit the context window, the full transcript is first saved to `/sessions` as a live snapshot (one per cone, extended on every round) and the summary tells the agent where to find it. **New chat** completes that snapshot into a normal frozen session (Save / New chat, fast) or deletes it (Discard). With the experimental **Compact on idle** flag on, a cone that has sat idle for 30 minutes with a context of at least 200k tokens compacts in the background; if you come back mid-round, the round is thrown away and your chat continues as it was. Every compaction — idle or not — leaves a small marker in the transcript naming what happened, with a link to the snapshot it replaced; a round that ends up keeping nothing takes its marker back out.
|
|
80
80
|
- **Inspect experimental features from the avatar menu.** When centrally managed flags enable the surface for the current runtime, click your avatar and choose **Experimental features…** to open its standalone dialog. The dialog may honestly be empty: `experimental-settings` controls its availability but is not itself user-toggleable.
|
|
81
81
|
- **Steer a running turn instead of waiting for it.** In the chat composer, `Enter` sends — including from a hardware keyboard in the native iOS follower — and queues behind whatever the cone is already doing; `Shift+Enter` inserts a newline. `Ctrl+Enter` (`Cmd+Enter` on macOS) steers: the message is injected as soon as the current step finishes, so you can redirect the agent mid-turn.
|
|
82
82
|
- **Boot full x86 virtual machines in the browser.** `v86 start` runs real operating systems (Alpine, FreeDOS, KolibriOS, ...) on the wasm-based [v86](https://github.com/copy/v86) emulator, entirely client-side. The agent drives the guest from the shell — type, click, screenshot, stream the screen live, save/restore state — and `-net <model>,relay=fetch` gives the guest HTTP access through SLICC's fetch proxy. Install with `ipk add -g v86`.
|
|
@@ -118,6 +118,26 @@ export type AgentEvent = {
|
|
|
118
118
|
} | {
|
|
119
119
|
type: 'turn_end';
|
|
120
120
|
messageId: string;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* A context-compaction round announcing itself as its own transcript row.
|
|
124
|
+
*
|
|
125
|
+
* Deliberately NOT a `message_start` / `content_delta` / `content_done`
|
|
126
|
+
* triple: a compaction round is not an assistant turn. Faking one made the
|
|
127
|
+
* UI's `message_start` handler declare the cone busy, and nothing ever
|
|
128
|
+
* cleared it — no `turn_end` follows a notice, and a live float drives
|
|
129
|
+
* `processing` from scoop-status broadcasts that only fire when the status
|
|
130
|
+
* CHANGES (an idle round never leaves `ready`). The stranded busy state
|
|
131
|
+
* then parked every later user submission in the queued stack while the
|
|
132
|
+
* agent answered it anyway (#2843).
|
|
133
|
+
*
|
|
134
|
+
* `messageId` is stable for the whole round, so the terminal state UPDATES
|
|
135
|
+
* the row the opening state created rather than appending a second one.
|
|
136
|
+
*/
|
|
137
|
+
| {
|
|
138
|
+
type: 'compaction_notice';
|
|
139
|
+
messageId: string;
|
|
140
|
+
marker: ChatCompactionMarker;
|
|
121
141
|
} | {
|
|
122
142
|
type: 'error';
|
|
123
143
|
error: string;
|
|
@@ -136,6 +156,34 @@ export type MessageRole = 'user' | 'assistant';
|
|
|
136
156
|
* `dismissed` (denied). Drives the `<slicc-lick-card>` `state` attribute.
|
|
137
157
|
*/
|
|
138
158
|
export type LickState = 'pending' | 'confirmed' | 'dismissed';
|
|
159
|
+
/** What started a compaction round; mirrors `CompactionTrigger` in the webapp core. */
|
|
160
|
+
export type CompactionMarkerTrigger = 'threshold' | 'overflow' | 'idle';
|
|
161
|
+
/**
|
|
162
|
+
* How a compaction round ended, as the transcript shows it:
|
|
163
|
+
*
|
|
164
|
+
* - `summarizing` — in flight; the summary LLM call has not returned yet.
|
|
165
|
+
* - `summarized` — the history was replaced by a summary.
|
|
166
|
+
* - `fallback` — summarization was unavailable or failed, so older messages
|
|
167
|
+
* were truncated WITHOUT a summary.
|
|
168
|
+
* - `discarded` — the round produced nothing the conversation kept: the user
|
|
169
|
+
* came back mid-round (compact-on-idle aborts and throws the result away),
|
|
170
|
+
* or the summary made no progress. A `discarded` marker is not a row to
|
|
171
|
+
* render — hosts REMOVE the row, because announcing a compaction that never
|
|
172
|
+
* happened is worse than saying nothing.
|
|
173
|
+
*/
|
|
174
|
+
export type CompactionMarkerState = 'summarizing' | 'summarized' | 'fallback' | 'discarded';
|
|
175
|
+
/**
|
|
176
|
+
* The transcript's record of one context-compaction round. Carries state, not
|
|
177
|
+
* prose: every renderer (web `<slicc-compaction-marker>`, iOS
|
|
178
|
+
* `CompactionMarkerRow`) derives its own copy from these fields, so the two
|
|
179
|
+
* can never drift into different wordings of the same envelope.
|
|
180
|
+
*/
|
|
181
|
+
export interface ChatCompactionMarker {
|
|
182
|
+
trigger: CompactionMarkerTrigger;
|
|
183
|
+
state: CompactionMarkerState;
|
|
184
|
+
/** `/sessions` path of the pre-compaction transcript snapshot, once written. */
|
|
185
|
+
transcriptPath?: string;
|
|
186
|
+
}
|
|
139
187
|
export interface ChatMessage {
|
|
140
188
|
id: string;
|
|
141
189
|
role: MessageRole;
|
|
@@ -165,6 +213,12 @@ export interface ChatMessage {
|
|
|
165
213
|
lickState?: LickState;
|
|
166
214
|
/** True when the message is queued (submitted while the agent is still processing). */
|
|
167
215
|
queued?: boolean;
|
|
216
|
+
/**
|
|
217
|
+
* Compaction-marker row: this message records a compaction round rather
|
|
218
|
+
* than anything anyone said. Set, the view renders a
|
|
219
|
+
* `<slicc-compaction-marker>` seam instead of an assistant bubble.
|
|
220
|
+
*/
|
|
221
|
+
compaction?: ChatCompactionMarker;
|
|
168
222
|
/**
|
|
169
223
|
* Cone-error marker — set by the chat controller's `error` AgentEvent
|
|
170
224
|
* handler. The view renders this assistant message as a `slicc-error-card`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-wire-types.d.ts","sourceRoot":"","sources":["../src/agent-wire-types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent-wire-types.d.ts","sourceRoot":"","sources":["../src/agent-wire-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `TargetInfo` — the subset of `packages/webapp/src/cdp/types.ts` the thin
|
|
3
|
+
* chrome extension needs (`Target.getTargets` results). The rest of that
|
|
4
|
+
* file (command/response/event envelopes, connection state, page-level
|
|
5
|
+
* types) stays webapp-internal; only this shape crosses the package
|
|
6
|
+
* boundary (#2276 slice E).
|
|
7
|
+
*/
|
|
8
|
+
/** Target info returned by Target.getTargets. */
|
|
9
|
+
export interface TargetInfo {
|
|
10
|
+
targetId: string;
|
|
11
|
+
type: string;
|
|
12
|
+
title: string;
|
|
13
|
+
url: string;
|
|
14
|
+
attached: boolean;
|
|
15
|
+
browserContextId?: string;
|
|
16
|
+
/** True if this is the user's active tab (extension mode only). */
|
|
17
|
+
active?: boolean;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=cdp-target-info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp-target-info.d.ts","sourceRoot":"","sources":["../src/cdp-target-info.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,iDAAiD;AACjD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mEAAmE;IACnE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `TargetInfo` — the subset of `packages/webapp/src/cdp/types.ts` the thin
|
|
3
|
+
* chrome extension needs (`Target.getTargets` results). The rest of that
|
|
4
|
+
* file (command/response/event envelopes, connection state, page-level
|
|
5
|
+
* types) stays webapp-internal; only this shape crosses the package
|
|
6
|
+
* boundary (#2276 slice E).
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=cdp-target-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp-target-info.js","sourceRoot":"","sources":["../src/cdp-target-info.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic Resource Discovery (ARD) `Link` extractor.
|
|
3
|
+
*
|
|
4
|
+
* The ARD spec advertises a capability manifest at
|
|
5
|
+
* `/.well-known/ai-catalog.json`. Beyond the well-known file, a response can
|
|
6
|
+
* point agents at it with a bare `rel="ai-catalog"` relation carried in an RFC
|
|
7
|
+
* 8288 `Link` header (or the equivalent HTML `<link rel="ai-catalog">`):
|
|
8
|
+
*
|
|
9
|
+
* Link: <https://example.com/.well-known/ai-catalog.json>; rel="ai-catalog"
|
|
10
|
+
*
|
|
11
|
+
* Unlike SLICC's `handoff` / `upskill` rels (which are URI rels under the
|
|
12
|
+
* `https://www.sliccy.ai/rel/` namespace), `ai-catalog` is a bare token
|
|
13
|
+
* defined by the ARD spec — so recognition is a plain token match against the
|
|
14
|
+
* parsed `rel` list.
|
|
15
|
+
*
|
|
16
|
+
* This module is pure — no I/O. It is the `Link`-header half of discovery; the
|
|
17
|
+
* `/.well-known` fallback lives in `well-known-probe.ts`.
|
|
18
|
+
*/
|
|
19
|
+
import type { DiscoveryKind } from './agent-wire-types.js';
|
|
20
|
+
import type { ParsedLink } from './link-header.js';
|
|
21
|
+
/** The bare ARD relation token that advertises an `ai-catalog.json` manifest. */
|
|
22
|
+
export declare const AI_CATALOG_REL = "ai-catalog";
|
|
23
|
+
/**
|
|
24
|
+
* CDP `Network.Response.headers` bag. Header names map to string values;
|
|
25
|
+
* same-name headers are joined with `\n`.
|
|
26
|
+
*/
|
|
27
|
+
export type CdpResponseHeaders = Record<string, string>;
|
|
28
|
+
export interface CatalogMatch {
|
|
29
|
+
/** Always `'ai-catalog'` for a `Link`-header match. */
|
|
30
|
+
kind: DiscoveryKind;
|
|
31
|
+
/** Absolute URL of the advertised `ai-catalog.json` manifest. */
|
|
32
|
+
url: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Find the first ARD `ai-catalog` link in a parsed Link header set.
|
|
36
|
+
*
|
|
37
|
+
* Rel comparison is exact-token and case-sensitive: RFC 8288 relation types
|
|
38
|
+
* are compared as-is, and the ARD spec's canonical token is lowercase
|
|
39
|
+
* `ai-catalog`. Returns `null` when no such relation is present.
|
|
40
|
+
*/
|
|
41
|
+
export declare function extractCatalog(links: ParsedLink[]): CatalogMatch | null;
|
|
42
|
+
/**
|
|
43
|
+
* Stable identity for a discovery artifact, independent of the page URL that
|
|
44
|
+
* advertised it.
|
|
45
|
+
*
|
|
46
|
+
* A site can advertise the same `ai-catalog` rel on every page response (and
|
|
47
|
+
* the well-known probe re-checks the same origin on every navigation), so
|
|
48
|
+
* keying dedup on the page URL would never collapse repeats. Keying on the
|
|
49
|
+
* artifact identity (`origin` + `kind` + manifest `url`) lets callers surface a
|
|
50
|
+
* given discovery once per session and drop repeat sightings.
|
|
51
|
+
*
|
|
52
|
+
* The NUL separator can't appear in an origin, kind token, or URL, so
|
|
53
|
+
* concatenation is collision-free without hashing (mirrors
|
|
54
|
+
* `handoffFingerprint`).
|
|
55
|
+
*/
|
|
56
|
+
export declare function discoveryFingerprint(input: {
|
|
57
|
+
origin?: string;
|
|
58
|
+
kind?: string;
|
|
59
|
+
url?: string;
|
|
60
|
+
}): string;
|
|
61
|
+
export declare function extractCatalogFromCdpHeaders(headers: CdpResponseHeaders | undefined, baseUrl?: string): {
|
|
62
|
+
match: CatalogMatch | null;
|
|
63
|
+
links: ParsedLink[];
|
|
64
|
+
};
|
|
65
|
+
export declare function extractCatalogFromWebRequest(headers: Array<{
|
|
66
|
+
name: string;
|
|
67
|
+
value?: string;
|
|
68
|
+
}> | undefined, baseUrl?: string): {
|
|
69
|
+
match: CatalogMatch | null;
|
|
70
|
+
links: ParsedLink[];
|
|
71
|
+
};
|
|
72
|
+
export declare function extractCatalogFromFetchHeaders(headers: Headers | undefined, baseUrl?: string): {
|
|
73
|
+
match: CatalogMatch | null;
|
|
74
|
+
links: ParsedLink[];
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=discovery-link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-link.d.ts","sourceRoot":"","sources":["../src/discovery-link.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQnD,iFAAiF;AACjF,eAAO,MAAM,cAAc,eAAe,CAAC;AAE3C;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,IAAI,EAAE,aAAa,CAAC;IACpB,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,YAAY,GAAG,IAAI,CAOvE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,CAET;AAID,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,kBAAkB,GAAG,SAAS,EACvC,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,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic Resource Discovery (ARD) `Link` extractor.
|
|
3
|
+
*
|
|
4
|
+
* The ARD spec advertises a capability manifest at
|
|
5
|
+
* `/.well-known/ai-catalog.json`. Beyond the well-known file, a response can
|
|
6
|
+
* point agents at it with a bare `rel="ai-catalog"` relation carried in an RFC
|
|
7
|
+
* 8288 `Link` header (or the equivalent HTML `<link rel="ai-catalog">`):
|
|
8
|
+
*
|
|
9
|
+
* Link: <https://example.com/.well-known/ai-catalog.json>; rel="ai-catalog"
|
|
10
|
+
*
|
|
11
|
+
* Unlike SLICC's `handoff` / `upskill` rels (which are URI rels under the
|
|
12
|
+
* `https://www.sliccy.ai/rel/` namespace), `ai-catalog` is a bare token
|
|
13
|
+
* defined by the ARD spec — so recognition is a plain token match against the
|
|
14
|
+
* parsed `rel` list.
|
|
15
|
+
*
|
|
16
|
+
* This module is pure — no I/O. It is the `Link`-header half of discovery; the
|
|
17
|
+
* `/.well-known` fallback lives in `well-known-probe.ts`.
|
|
18
|
+
*/
|
|
19
|
+
import { getLinkHeaderValuesFromCdp, getLinkHeaderValuesFromHeaders, getLinkHeaderValuesFromWebRequest, parseLinkHeader, } from './link-header.js';
|
|
20
|
+
/** The bare ARD relation token that advertises an `ai-catalog.json` manifest. */
|
|
21
|
+
export const AI_CATALOG_REL = 'ai-catalog';
|
|
22
|
+
/**
|
|
23
|
+
* Find the first ARD `ai-catalog` link in a parsed Link header set.
|
|
24
|
+
*
|
|
25
|
+
* Rel comparison is exact-token and case-sensitive: RFC 8288 relation types
|
|
26
|
+
* are compared as-is, and the ARD spec's canonical token is lowercase
|
|
27
|
+
* `ai-catalog`. Returns `null` when no such relation is present.
|
|
28
|
+
*/
|
|
29
|
+
export function extractCatalog(links) {
|
|
30
|
+
for (const link of links) {
|
|
31
|
+
if (link.rel.includes(AI_CATALOG_REL)) {
|
|
32
|
+
return { kind: 'ai-catalog', url: link.href };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Stable identity for a discovery artifact, independent of the page URL that
|
|
39
|
+
* advertised it.
|
|
40
|
+
*
|
|
41
|
+
* A site can advertise the same `ai-catalog` rel on every page response (and
|
|
42
|
+
* the well-known probe re-checks the same origin on every navigation), so
|
|
43
|
+
* keying dedup on the page URL would never collapse repeats. Keying on the
|
|
44
|
+
* artifact identity (`origin` + `kind` + manifest `url`) lets callers surface a
|
|
45
|
+
* given discovery once per session and drop repeat sightings.
|
|
46
|
+
*
|
|
47
|
+
* The NUL separator can't appear in an origin, kind token, or URL, so
|
|
48
|
+
* concatenation is collision-free without hashing (mirrors
|
|
49
|
+
* `handoffFingerprint`).
|
|
50
|
+
*/
|
|
51
|
+
export function discoveryFingerprint(input) {
|
|
52
|
+
return [input.origin ?? '', input.kind ?? '', input.url ?? ''].join('\u0000');
|
|
53
|
+
}
|
|
54
|
+
/* ────────── header-shape adapters that go straight to a catalog match ────────── */
|
|
55
|
+
export function extractCatalogFromCdpHeaders(headers, baseUrl) {
|
|
56
|
+
const values = getLinkHeaderValuesFromCdp(headers);
|
|
57
|
+
if (values.length === 0)
|
|
58
|
+
return { match: null, links: [] };
|
|
59
|
+
const links = parseLinkHeader(values, baseUrl);
|
|
60
|
+
return { match: extractCatalog(links), links };
|
|
61
|
+
}
|
|
62
|
+
export function extractCatalogFromWebRequest(headers, baseUrl) {
|
|
63
|
+
const values = getLinkHeaderValuesFromWebRequest(headers);
|
|
64
|
+
if (values.length === 0)
|
|
65
|
+
return { match: null, links: [] };
|
|
66
|
+
const links = parseLinkHeader(values, baseUrl);
|
|
67
|
+
return { match: extractCatalog(links), links };
|
|
68
|
+
}
|
|
69
|
+
export function extractCatalogFromFetchHeaders(headers, baseUrl) {
|
|
70
|
+
const values = getLinkHeaderValuesFromHeaders(headers);
|
|
71
|
+
if (values.length === 0)
|
|
72
|
+
return { match: null, links: [] };
|
|
73
|
+
const links = parseLinkHeader(values, baseUrl);
|
|
74
|
+
return { match: extractCatalog(links), links };
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=discovery-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-link.js","sourceRoot":"","sources":["../src/discovery-link.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,iCAAiC,EACjC,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B,iFAAiF;AACjF,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAe3C;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,KAAmB;IAChD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACtC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAIpC;IACC,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChF,CAAC;AAED,qFAAqF;AAErF,MAAM,UAAU,4BAA4B,CAC1C,OAAuC,EACvC,OAAgB;IAEhB,MAAM,MAAM,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC3D,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,OAA4D,EAC5D,OAAgB;IAEhB,MAAM,MAAM,GAAG,iCAAiC,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC3D,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,OAA4B,EAC5B,OAAgB;IAEhB,MAAM,MAAM,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC3D,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension bridge protocol: envelope contract spoken between the sliccy.ai
|
|
3
|
+
* leader tab and the extension service worker over the long-lived
|
|
4
|
+
* `chrome.runtime.connect` Port.
|
|
5
|
+
*
|
|
6
|
+
* Wave 3b — full CDP pass-through. The leader tab opens a Port to the
|
|
7
|
+
* extension via `chrome.runtime.connect(EXT_ID, { name: PORT_NAME })`; the SW
|
|
8
|
+
* gates the connection in `onConnectExternal` with the three-factor pin
|
|
9
|
+
* (origin allowlist + `sender.tab.id === storedLeaderTabId` + `sender.frameId
|
|
10
|
+
* === 0`) decided in Wave-1 Spike B. The envelope shapes below are the
|
|
11
|
+
* post-handshake wire format both sides exchange.
|
|
12
|
+
*
|
|
13
|
+
* The envelopes deliberately mirror the Cherry handshake/CDP-request shape
|
|
14
|
+
* (`packages/webapp/src/cdp/cherry-host-protocol.ts`) so the two transports
|
|
15
|
+
* stay structurally aligned; they are NOT interchangeable (Cherry is a
|
|
16
|
+
* synthetic CDP subset over postMessage; this one is full chrome.debugger
|
|
17
|
+
* pass-through over chrome.runtime.Port).
|
|
18
|
+
*/
|
|
19
|
+
import type { DiscoveryKind } from './agent-wire-types.js';
|
|
20
|
+
import type { CDPPayload } from './tray-sync-protocol.js';
|
|
21
|
+
/** Protocol version bumped on any breaking envelope change. */
|
|
22
|
+
export declare const EXTENSION_BRIDGE_PROTOCOL_VERSION = 1;
|
|
23
|
+
/** Port name the leader passes to `chrome.runtime.connect`. */
|
|
24
|
+
export declare const EXTENSION_BRIDGE_PORT_NAME = "slicc.cdp-bridge";
|
|
25
|
+
/** Envelope-shaped message with a non-current `bridge` version (version skew). */
|
|
26
|
+
export interface ExtensionBridgeVersionMismatch {
|
|
27
|
+
bridge: number;
|
|
28
|
+
channelId: string;
|
|
29
|
+
kind: string;
|
|
30
|
+
}
|
|
31
|
+
export interface ExtensionBridgeHello {
|
|
32
|
+
bridge: typeof EXTENSION_BRIDGE_PROTOCOL_VERSION;
|
|
33
|
+
channelId: string;
|
|
34
|
+
kind: 'handshake.hello';
|
|
35
|
+
}
|
|
36
|
+
export interface ExtensionBridgeWelcome {
|
|
37
|
+
bridge: typeof EXTENSION_BRIDGE_PROTOCOL_VERSION;
|
|
38
|
+
channelId: string;
|
|
39
|
+
kind: 'handshake.welcome';
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Handshake rejection. The SW posts this when the three-factor pin fails
|
|
43
|
+
* (e.g. `slicc_leader_tab_id` absent, sender tab mismatch, non-top-level
|
|
44
|
+
* frame). Pin failures fail closed: the SW disconnects right after.
|
|
45
|
+
*/
|
|
46
|
+
export interface ExtensionBridgeRejected {
|
|
47
|
+
bridge: typeof EXTENSION_BRIDGE_PROTOCOL_VERSION;
|
|
48
|
+
channelId: string;
|
|
49
|
+
kind: 'handshake.rejected';
|
|
50
|
+
reason: string;
|
|
51
|
+
}
|
|
52
|
+
export interface ExtensionBridgeCdpRequest {
|
|
53
|
+
bridge: typeof EXTENSION_BRIDGE_PROTOCOL_VERSION;
|
|
54
|
+
channelId: string;
|
|
55
|
+
kind: 'cdp.request';
|
|
56
|
+
id: number;
|
|
57
|
+
method: string;
|
|
58
|
+
/** Per-method CDP params; shape is known only to the caller that issued the method. */
|
|
59
|
+
params?: CDPPayload;
|
|
60
|
+
sessionId?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface ExtensionBridgeCdpResponse {
|
|
63
|
+
bridge: typeof EXTENSION_BRIDGE_PROTOCOL_VERSION;
|
|
64
|
+
channelId: string;
|
|
65
|
+
kind: 'cdp.response';
|
|
66
|
+
id: number;
|
|
67
|
+
/** Per-method CDP result; shape depends on the request method. */
|
|
68
|
+
result?: CDPPayload;
|
|
69
|
+
error?: string;
|
|
70
|
+
}
|
|
71
|
+
export interface ExtensionBridgeCdpEvent {
|
|
72
|
+
bridge: typeof EXTENSION_BRIDGE_PROTOCOL_VERSION;
|
|
73
|
+
channelId: string;
|
|
74
|
+
kind: 'cdp.event';
|
|
75
|
+
method: string;
|
|
76
|
+
/** Per-method CDP event params; shape depends on `method`. */
|
|
77
|
+
params?: CDPPayload;
|
|
78
|
+
sessionId?: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Navigate/upskill lick pushed SW → leader tab. The SW observes a SLICC
|
|
82
|
+
* handoff `Link` header (`chrome.webRequest.onHeadersReceived`) and forwards
|
|
83
|
+
* it over the welcomed Port so the leader can inject it into the worker-side
|
|
84
|
+
* `LickManager`. The payload mirrors `dispatchNavigateEvent`'s fields in
|
|
85
|
+
* `scoops/lick-ws-bridge.ts` (the standalone `/licks-ws` navigate shape).
|
|
86
|
+
*/
|
|
87
|
+
export interface ExtensionBridgeLick {
|
|
88
|
+
bridge: typeof EXTENSION_BRIDGE_PROTOCOL_VERSION;
|
|
89
|
+
channelId: string;
|
|
90
|
+
kind: 'extension.lick';
|
|
91
|
+
verb: 'handoff' | 'upskill';
|
|
92
|
+
target: string;
|
|
93
|
+
url: string;
|
|
94
|
+
instruction?: string;
|
|
95
|
+
branch?: string;
|
|
96
|
+
path?: string;
|
|
97
|
+
title?: string;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Discovery lick pushed SW → leader tab. The SW observes an agentic-resource-
|
|
101
|
+
* discovery artifact on a main-frame document response — either a bare
|
|
102
|
+
* `rel="ai-catalog"` RFC 8288 `Link` header (`chrome.webRequest`) or a
|
|
103
|
+
* throttled per-origin well-known probe of `/.well-known/ai-catalog.json` /
|
|
104
|
+
* `/llms.txt` (host_permissions bypass CORS) — and forwards it over the
|
|
105
|
+
* welcomed Port so the leader can inject a `discovery` `LickEvent` into the
|
|
106
|
+
* worker-side `LickManager`. Mirrors {@link ExtensionBridgeLick} (the navigate
|
|
107
|
+
* path) but carries the structured discovery fields the `discovery` lick needs
|
|
108
|
+
* (`discoveryOrigin` + `discoveryKind` + `discoveryUrl`). Silent: no OS
|
|
109
|
+
* notification is shown for discovery (unlike a handoff).
|
|
110
|
+
*/
|
|
111
|
+
export interface ExtensionBridgeDiscovery {
|
|
112
|
+
bridge: typeof EXTENSION_BRIDGE_PROTOCOL_VERSION;
|
|
113
|
+
channelId: string;
|
|
114
|
+
kind: 'extension.discovery';
|
|
115
|
+
/** Origin the artifact was advertised on / found at. */
|
|
116
|
+
discoveryOrigin: string;
|
|
117
|
+
/** Which artifact: an ARD `ai-catalog` manifest or an `llms-txt` digest. */
|
|
118
|
+
discoveryKind: DiscoveryKind;
|
|
119
|
+
/** Absolute URL of the manifest (`ai-catalog.json`) or digest (`llms.txt`). */
|
|
120
|
+
discoveryUrl: string;
|
|
121
|
+
/** URL of the main-frame document whose response triggered the discovery. */
|
|
122
|
+
url: string;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Leader tray joinUrl pushed leader tab → SW. The leader's tray session mints a
|
|
126
|
+
* `/join/<trayId>.<secret>` URL that per-page cherry followers need to connect;
|
|
127
|
+
* the URL is NOT in the page URL itself (only `/tray/<trayId>` with no secret).
|
|
128
|
+
* The leader sends this over the welcomed Port so the SW can cache it and push
|
|
129
|
+
* it to injected per-page cherry relays. `null` when the tray drops (so the SW
|
|
130
|
+
* clears its cache).
|
|
131
|
+
*/
|
|
132
|
+
export interface ExtensionBridgeLeaderJoinUrl {
|
|
133
|
+
bridge: typeof EXTENSION_BRIDGE_PROTOCOL_VERSION;
|
|
134
|
+
channelId: string;
|
|
135
|
+
kind: 'leader.join-url';
|
|
136
|
+
joinUrl: string | null;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* SW → leader tab: open the provider Settings dialog. Sent when the extension
|
|
140
|
+
* side-panel follower hands a sign-in off to the leader (a provider login can't
|
|
141
|
+
* complete in the cross-origin panel iframe). The SW focuses the leader tab and
|
|
142
|
+
* posts this so the user lands on an already-open Settings dialog instead of a
|
|
143
|
+
* dead tab. Carries no payload — it's a pure command.
|
|
144
|
+
*/
|
|
145
|
+
export interface ExtensionBridgeOpenSettings {
|
|
146
|
+
bridge: typeof EXTENSION_BRIDGE_PROTOCOL_VERSION;
|
|
147
|
+
channelId: string;
|
|
148
|
+
kind: 'extension.open-settings';
|
|
149
|
+
}
|
|
150
|
+
export type ExtensionBridgeEnvelope = ExtensionBridgeHello | ExtensionBridgeWelcome | ExtensionBridgeRejected | ExtensionBridgeCdpRequest | ExtensionBridgeCdpResponse | ExtensionBridgeCdpEvent | ExtensionBridgeLick | ExtensionBridgeDiscovery | ExtensionBridgeLeaderJoinUrl | ExtensionBridgeOpenSettings;
|
|
151
|
+
/**
|
|
152
|
+
* Structural validator. Both sides MUST run this on every inbound message
|
|
153
|
+
* before acting on it — the Port is trusted (gated by `onConnectExternal`),
|
|
154
|
+
* but a buggy / outdated peer could still post malformed envelopes.
|
|
155
|
+
*/
|
|
156
|
+
export declare function isExtensionBridgeEnvelope(value: unknown): value is ExtensionBridgeEnvelope;
|
|
157
|
+
/**
|
|
158
|
+
* True when a message is shaped like a bridge envelope but carries a DIFFERENT
|
|
159
|
+
* protocol version — i.e. the peer (hosted leader tab vs installed extension)
|
|
160
|
+
* is a version-skewed build, not Port noise. `isExtensionBridgeEnvelope`
|
|
161
|
+
* rejects these, so without this check a skewed peer is indistinguishable
|
|
162
|
+
* from the generic handshake timeout. Callers log it distinctly.
|
|
163
|
+
*/
|
|
164
|
+
export declare function isBridgeVersionMismatch(value: unknown): value is ExtensionBridgeVersionMismatch;
|
|
165
|
+
//# sourceMappingURL=extension-bridge-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-bridge-protocol.d.ts","sourceRoot":"","sources":["../src/extension-bridge-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension bridge protocol: envelope contract spoken between the sliccy.ai
|
|
3
|
+
* leader tab and the extension service worker over the long-lived
|
|
4
|
+
* `chrome.runtime.connect` Port.
|
|
5
|
+
*
|
|
6
|
+
* Wave 3b — full CDP pass-through. The leader tab opens a Port to the
|
|
7
|
+
* extension via `chrome.runtime.connect(EXT_ID, { name: PORT_NAME })`; the SW
|
|
8
|
+
* gates the connection in `onConnectExternal` with the three-factor pin
|
|
9
|
+
* (origin allowlist + `sender.tab.id === storedLeaderTabId` + `sender.frameId
|
|
10
|
+
* === 0`) decided in Wave-1 Spike B. The envelope shapes below are the
|
|
11
|
+
* post-handshake wire format both sides exchange.
|
|
12
|
+
*
|
|
13
|
+
* The envelopes deliberately mirror the Cherry handshake/CDP-request shape
|
|
14
|
+
* (`packages/webapp/src/cdp/cherry-host-protocol.ts`) so the two transports
|
|
15
|
+
* stay structurally aligned; they are NOT interchangeable (Cherry is a
|
|
16
|
+
* synthetic CDP subset over postMessage; this one is full chrome.debugger
|
|
17
|
+
* pass-through over chrome.runtime.Port).
|
|
18
|
+
*/
|
|
19
|
+
/** Protocol version bumped on any breaking envelope change. */
|
|
20
|
+
export const EXTENSION_BRIDGE_PROTOCOL_VERSION = 1;
|
|
21
|
+
/** Port name the leader passes to `chrome.runtime.connect`. */
|
|
22
|
+
export const EXTENSION_BRIDGE_PORT_NAME = 'slicc.cdp-bridge';
|
|
23
|
+
const KINDS = new Set([
|
|
24
|
+
'handshake.hello',
|
|
25
|
+
'handshake.welcome',
|
|
26
|
+
'handshake.rejected',
|
|
27
|
+
'cdp.request',
|
|
28
|
+
'cdp.response',
|
|
29
|
+
'cdp.event',
|
|
30
|
+
'extension.lick',
|
|
31
|
+
'extension.discovery',
|
|
32
|
+
'leader.join-url',
|
|
33
|
+
'extension.open-settings',
|
|
34
|
+
]);
|
|
35
|
+
/**
|
|
36
|
+
* Structural validator. Both sides MUST run this on every inbound message
|
|
37
|
+
* before acting on it — the Port is trusted (gated by `onConnectExternal`),
|
|
38
|
+
* but a buggy / outdated peer could still post malformed envelopes.
|
|
39
|
+
*/
|
|
40
|
+
export function isExtensionBridgeEnvelope(value) {
|
|
41
|
+
if (typeof value !== 'object' || value === null)
|
|
42
|
+
return false;
|
|
43
|
+
const v = value;
|
|
44
|
+
return (v.bridge === EXTENSION_BRIDGE_PROTOCOL_VERSION &&
|
|
45
|
+
typeof v.channelId === 'string' &&
|
|
46
|
+
typeof v.kind === 'string' &&
|
|
47
|
+
KINDS.has(v.kind));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* True when a message is shaped like a bridge envelope but carries a DIFFERENT
|
|
51
|
+
* protocol version — i.e. the peer (hosted leader tab vs installed extension)
|
|
52
|
+
* is a version-skewed build, not Port noise. `isExtensionBridgeEnvelope`
|
|
53
|
+
* rejects these, so without this check a skewed peer is indistinguishable
|
|
54
|
+
* from the generic handshake timeout. Callers log it distinctly.
|
|
55
|
+
*/
|
|
56
|
+
export function isBridgeVersionMismatch(value) {
|
|
57
|
+
if (typeof value !== 'object' || value === null)
|
|
58
|
+
return false;
|
|
59
|
+
const v = value;
|
|
60
|
+
return (typeof v.bridge === 'number' &&
|
|
61
|
+
v.bridge !== EXTENSION_BRIDGE_PROTOCOL_VERSION &&
|
|
62
|
+
typeof v.channelId === 'string' &&
|
|
63
|
+
typeof v.kind === 'string');
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=extension-bridge-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-bridge-protocol.js","sourceRoot":"","sources":["../src/extension-bridge-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,+DAA+D;AAC/D,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,CAAC;AAEnD,+DAA+D;AAC/D,MAAM,CAAC,MAAM,0BAA0B,GAAG,kBAAkB,CAAC;AAiK7D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAkC;IACrD,iBAAiB;IACjB,mBAAmB;IACnB,oBAAoB;IACpB,aAAa;IACb,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,qBAAqB;IACrB,iBAAiB;IACjB,yBAAyB;CAC1B,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAiC,CAAC;IAC5C,OAAO,CACL,CAAC,CAAC,MAAM,KAAK,iCAAiC;QAC9C,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;QAC/B,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;QAC1B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAuC,CAAC,CACrD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAiC,CAAC;IAC5C,OAAO,CACL,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;QAC5B,CAAC,CAAC,MAAM,KAAK,iCAAiC;QAC9C,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;QAC/B,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAC3B,CAAC;AACJ,CAAC"}
|
|
@@ -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
|