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.
Files changed (328) hide show
  1. package/README.md +1 -1
  2. package/dist/node-server/_shared/agent-wire-types.d.ts +54 -0
  3. package/dist/node-server/_shared/agent-wire-types.d.ts.map +1 -1
  4. package/dist/node-server/_shared/cdp-target-info.d.ts +19 -0
  5. package/dist/node-server/_shared/cdp-target-info.d.ts.map +1 -0
  6. package/dist/node-server/_shared/cdp-target-info.js +9 -0
  7. package/dist/node-server/_shared/cdp-target-info.js.map +1 -0
  8. package/dist/node-server/_shared/discovery-link.d.ts +76 -0
  9. package/dist/node-server/_shared/discovery-link.d.ts.map +1 -0
  10. package/dist/node-server/_shared/discovery-link.js +76 -0
  11. package/dist/node-server/_shared/discovery-link.js.map +1 -0
  12. package/dist/node-server/_shared/extension-bridge-protocol.d.ts +165 -0
  13. package/dist/node-server/_shared/extension-bridge-protocol.d.ts.map +1 -0
  14. package/dist/node-server/_shared/extension-bridge-protocol.js +65 -0
  15. package/dist/node-server/_shared/extension-bridge-protocol.js.map +1 -0
  16. package/dist/node-server/_shared/handoff-link.d.ts +90 -0
  17. package/dist/node-server/_shared/handoff-link.d.ts.map +1 -0
  18. package/dist/node-server/_shared/handoff-link.js +192 -0
  19. package/dist/node-server/_shared/handoff-link.js.map +1 -0
  20. package/dist/node-server/_shared/iframe-repaint.d.ts +51 -0
  21. package/dist/node-server/_shared/iframe-repaint.d.ts.map +1 -0
  22. package/dist/node-server/_shared/iframe-repaint.js +118 -0
  23. package/dist/node-server/_shared/iframe-repaint.js.map +1 -0
  24. package/dist/node-server/_shared/index.d.ts +9 -0
  25. package/dist/node-server/_shared/index.d.ts.map +1 -1
  26. package/dist/node-server/_shared/index.js +9 -0
  27. package/dist/node-server/_shared/index.js.map +1 -1
  28. package/dist/node-server/_shared/leader-ext-id.d.ts +16 -0
  29. package/dist/node-server/_shared/leader-ext-id.d.ts.map +1 -0
  30. package/dist/node-server/_shared/leader-ext-id.js +16 -0
  31. package/dist/node-server/_shared/leader-ext-id.js.map +1 -0
  32. package/dist/node-server/_shared/link-header.d.ts +98 -0
  33. package/dist/node-server/_shared/link-header.d.ts.map +1 -0
  34. package/dist/node-server/_shared/link-header.js +441 -0
  35. package/dist/node-server/_shared/link-header.js.map +1 -0
  36. package/dist/node-server/_shared/proxy-headers.d.ts +46 -0
  37. package/dist/node-server/_shared/proxy-headers.d.ts.map +1 -0
  38. package/dist/node-server/_shared/proxy-headers.js +133 -0
  39. package/dist/node-server/_shared/proxy-headers.js.map +1 -0
  40. package/dist/node-server/_shared/well-known-probe.d.ts +63 -0
  41. package/dist/node-server/_shared/well-known-probe.d.ts.map +1 -0
  42. package/dist/node-server/_shared/well-known-probe.js +104 -0
  43. package/dist/node-server/_shared/well-known-probe.js.map +1 -0
  44. package/dist/node-server/electron-controller.d.ts +51 -0
  45. package/dist/node-server/electron-controller.js +88 -5
  46. package/dist/ui/.vite/manifest.json +414 -488
  47. package/dist/ui/assets/CLAUDE-CWMPcWVI.js +34 -0
  48. package/dist/ui/assets/{CLAUDE-BG8Wfdn_.js → CLAUDE-DM1onrcU.js} +1 -1
  49. package/dist/ui/assets/SKILL--AFE5RE3.js +1 -0
  50. package/dist/ui/assets/{SKILL-DT72j81i.js → SKILL-cpVS35My.js} +1 -1
  51. package/dist/ui/assets/__vite-browser-external-B6A3FtA_.js +1 -0
  52. package/dist/ui/assets/{account-store-XKjChfD5.js → account-store-DsMvFZgS.js} +3 -3
  53. package/dist/ui/assets/account-store-naVgJKHe.js +1 -0
  54. package/dist/ui/assets/{adobe-DWv_nW7C.js → adobe-BhZB46bT.js} +1 -1
  55. package/dist/ui/assets/{adobe-B7sd2ey1.js → adobe-sRIQnDEl.js} +2 -2
  56. package/dist/ui/assets/{agent-bridge-CmEtyUJl.js → agent-bridge-DVqU5-sn.js} +1 -1
  57. package/dist/ui/assets/{agent-message-to-chat-Cnv4uh07.js → agent-message-to-chat-Df4an5Ei.js} +1 -1
  58. package/dist/ui/assets/{agent-message-to-chat-DW2ZZk9R.js → agent-message-to-chat-xGeYopQz.js} +1 -1
  59. package/dist/ui/assets/api-endpoint-DGxXvrur.js +1 -0
  60. package/dist/ui/assets/api-endpoint-Lx_FU5cP.js +1 -0
  61. package/dist/ui/assets/{apply-layout-D-QW1Bgf.js → apply-layout-dNkV0TEv.js} +1 -1
  62. package/dist/ui/assets/{apps-Dl5abdz0.js → apps-tzFQ7_KO.js} +1 -1
  63. package/dist/ui/assets/{auto-mount-table-CEBCZFRF.js → auto-mount-table-0jMTi9rV.js} +1 -1
  64. package/dist/ui/assets/{azure-openai-CZHEfw9U.js → azure-openai-B9ZeZZ0T.js} +1 -1
  65. package/dist/ui/assets/{azure-openai-rq6LQC_C.js → azure-openai-DsmgiFlX.js} +1 -1
  66. package/dist/ui/assets/{backend-hostfs-t651gkrP.js → backend-hostfs-BH8uwRZG.js} +1 -1
  67. package/dist/ui/assets/{backend-hostfs-BQYf7TAS.js → backend-hostfs-BxfjZHzO.js} +1 -1
  68. package/dist/ui/assets/bridge-protocol-06nbmp2X.js +1 -0
  69. package/dist/ui/assets/bridge-protocol-DdqxTTSu.js +1 -0
  70. package/dist/ui/assets/{bsh-watchdog-D97yX3sQ.js → bsh-watchdog-CxyhQHy5.js} +1 -1
  71. package/dist/ui/assets/{capability-Btlr4Wc-.js → capability-Bxl0SE1s.js} +2 -2
  72. package/dist/ui/assets/{cdp-DHIp_AO9.js → cdp-CmXwwigc.js} +1 -1
  73. package/dist/ui/assets/{cerebras-CjhIAx1j.js → cerebras-CsdnfQnc.js} +1 -1
  74. package/dist/ui/assets/{cerebras-UuG-yCJ_.js → cerebras-Mux-1Uqj.js} +1 -1
  75. package/dist/ui/assets/{client-CjV_9a9h.js → client-C6Cmi9c4.js} +1 -1
  76. package/dist/ui/assets/composer-speech-CElQJ4q_.js +1 -0
  77. package/dist/ui/assets/{connect-surface-AitKSc2i.js → connect-surface-DgrjdeR5.js} +1 -1
  78. package/dist/ui/assets/{context-compaction-huebTevb.js → context-compaction-DRymamfD.js} +3 -3
  79. package/dist/ui/assets/{core-CdPvxBo3.js → core-B8y1Kyh_.js} +2 -2
  80. package/dist/ui/assets/{derive-C_gfjwp6.js → derive-TWFNEJkb.js} +1 -1
  81. package/dist/ui/assets/dip-1TiuHkUR.js +233 -0
  82. package/dist/ui/assets/{directed-approval-Ca0RuudO.js → directed-approval-BDO2wdC5.js} +1 -1
  83. package/dist/ui/assets/{discovery-preference-DFkmIHQo.js → discovery-preference-B9KlkVuR.js} +1 -1
  84. package/dist/ui/assets/ensure-speech-assets-DasC7jBA.js +1 -0
  85. package/dist/ui/assets/{esbuild-wasm-CSKOA492.js → esbuild-wasm-Ew76Vf_V.js} +2 -2
  86. package/dist/ui/assets/export-provider-CqI0pk50.js +1 -0
  87. package/dist/ui/assets/export-spool-CuNzzI8a.js +1 -0
  88. package/dist/ui/assets/{extension-bridge-transport-D3PItLFo.js → extension-bridge-transport-DfRNjx8c.js} +1 -1
  89. package/dist/ui/assets/extension-media-capture-2FcAdcuB.js +1 -0
  90. package/dist/ui/assets/extension-ops-owOXVncP.js +1 -0
  91. package/dist/ui/assets/float-topology-hfgMx1Yq.js +1 -0
  92. package/dist/ui/assets/{follower-navigate-watcher-B9ZostUJ.js → follower-navigate-watcher-JQ0b_cW8.js} +1 -1
  93. package/dist/ui/assets/{fs-0AC_1kYN.js → fs-CBaQR8Xc.js} +2 -2
  94. package/dist/ui/assets/{fs-ClRFZsKp.js → fs-CDaCMxrL.js} +1 -1
  95. package/dist/ui/assets/github-B7uOq9Q1.js +1 -0
  96. package/dist/ui/assets/{github-copilot-hBCBR7n3.js → github-copilot-BeWJoZwD.js} +1 -1
  97. package/dist/ui/assets/{github-copilot-BlR9rGzE.js → github-copilot-DwKSI23j.js} +1 -1
  98. package/dist/ui/assets/{github-install-c-7WlKF0.js → github-install-DE7dF6r8.js} +1 -1
  99. package/dist/ui/assets/{github-DA1dJZHt.js → github-qhOhjD2Q.js} +2 -2
  100. package/dist/ui/assets/{github-zip-BAPGRyWK.js → github-zip-CuwUOO-U.js} +1 -1
  101. package/dist/ui/assets/{guest-tool-gate-CG9Yw8Kq.js → guest-tool-gate-BxRAm4CU.js} +1 -1
  102. package/dist/ui/assets/{hear-D7MO-jTh.js → hear-CNQSuR1y.js} +1 -1
  103. package/dist/ui/assets/{help-LDG2J6R7.js → help-D66VHlYj.js} +8 -4
  104. package/dist/ui/assets/hid-picker-sFJ8vzUj.js +1 -0
  105. package/dist/ui/assets/host-command-29ain4NA.js +1 -0
  106. package/dist/ui/assets/idle-compaction-B9i1duyd.js +1 -0
  107. package/dist/ui/assets/idle-compaction-settings-1yyApSsQ.js +1 -0
  108. package/dist/ui/assets/image-markers-BFDmhPy4.js +1 -0
  109. package/dist/ui/assets/image-markers-DuyWsic3.js +1 -0
  110. package/dist/ui/assets/{installer-7BWtTgd6.js → installer-C6TqZaGO.js} +3 -3
  111. package/dist/ui/assets/{js-realm-worker-CLGBN8Zo.js → js-realm-worker-Bsb6rmK5.js} +4 -4
  112. package/dist/ui/assets/{jsh-runtime-extensions-Bf9eAUzp.js → jsh-runtime-extensions-Dkujbplu.js} +1 -1
  113. package/dist/ui/assets/{kernel-worker-V_qJr_00.js → kernel-worker-CkZd8Enf.js} +679 -628
  114. package/dist/ui/assets/lick-manager-ULemXDKa.js +2 -0
  115. package/dist/ui/assets/lick-urls-BX4Jyu_T.js +1 -0
  116. package/dist/ui/assets/{lick-ws-bridge-Jk_oJNDM.js → lick-ws-bridge-Bo5sH7lf.js} +1 -1
  117. package/dist/ui/assets/{lick-ws-bridge-ct0HLNad.js → lick-ws-bridge-RFOSPq0w.js} +1 -1
  118. package/dist/ui/assets/{live-session-snapshot-DnNBHXrk.js → live-session-snapshot-BTnyrQCU.js} +1 -1
  119. package/dist/ui/assets/{loader-B90Xxi7L.js → loader-Dw-TPPKt.js} +1 -1
  120. package/dist/ui/assets/{local-llm-Z6hqEJOJ.js → local-llm-B-qS5oNT.js} +1 -1
  121. package/dist/ui/assets/{local-llm-Ko45nuy7.js → local-llm-COCS88AU.js} +1 -1
  122. package/dist/ui/assets/{magick-wasm-BEYfJbAX.js → magick-wasm-C7OGcZrJ.js} +2 -2
  123. package/dist/ui/assets/main-CAXbdHY8.js +22 -0
  124. package/dist/ui/assets/main-cherry-DSNvH0CD.js +1 -0
  125. package/dist/ui/assets/{mount-BrmPOs2_.js → mount-BbUBqN71.js} +2 -2
  126. package/dist/ui/assets/{mount-bridge-client-CUPodVo6.js → mount-bridge-client-BejrWSrL.js} +1 -1
  127. package/dist/ui/assets/{mount-bridge-client-BrMqFu_x.js → mount-bridge-client-DGJyqEPG.js} +1 -1
  128. package/dist/ui/assets/{mount-picker-popup-CVvcLs1V.js → mount-picker-popup--ijSfN8u.js} +1 -1
  129. package/dist/ui/assets/{mount-recovery-lKw_Vyz_.js → mount-recovery-OxgGejDC.js} +1 -1
  130. package/dist/ui/assets/{mount-O6L8YW8P.js → mount-ysOnJBjr.js} +3 -3
  131. package/dist/ui/assets/navigation-watcher-C8xRyQBd.js +1 -0
  132. package/dist/ui/assets/new-session-JIL4tJ1I.js +2 -0
  133. package/dist/ui/assets/oauth-bootstrap-DP5y5Dy8.js +2 -0
  134. package/dist/ui/assets/oauth-service-Bconf2Pz.js +1 -0
  135. package/dist/ui/assets/oauth-service-t2taQm3p.js +1 -0
  136. package/dist/ui/assets/{openai-codex-39sNBZa4.js → openai-codex-BZDYkVh6.js} +1 -1
  137. package/dist/ui/assets/{openai-codex-DUyhVHOH.js → openai-codex-DlFMWNVB.js} +1 -1
  138. package/dist/ui/assets/{openrouter-Dt0-tju5.js → openrouter-BrS9XpJS.js} +1 -1
  139. package/dist/ui/assets/{openrouter-Dpc-slj8.js → openrouter-Dn_iX45f.js} +1 -1
  140. package/dist/ui/assets/{openrouter-oauth-Bw9klnns.js → openrouter-oauth-CioQlp0x.js} +1 -1
  141. package/dist/ui/assets/{openrouter-oauth-WcOnlgk3.js → openrouter-oauth-D9gZVt7e.js} +1 -1
  142. package/dist/ui/assets/{page-approval-service-DnWfuBVQ.js → page-approval-service-IZdlRu-_.js} +1 -1
  143. package/dist/ui/assets/panel-rpc-handlers-DUN0E_f8.js +2 -0
  144. package/dist/ui/assets/{panelize-shell-C7Ptpa69.js → panelize-shell-KNX1XTnq.js} +1 -1
  145. package/dist/ui/assets/picker-popup-sQtXmfAo.js +1 -0
  146. package/dist/ui/assets/{port-bridge-client-wFmUGeZa.js → port-bridge-client-C1tBBqwu.js} +1 -1
  147. package/dist/ui/assets/{port-bridge-client-BTnhFM03.js → port-bridge-client-CN1cFP4D.js} +1 -1
  148. package/dist/ui/assets/preview-url-r19H6zH1.js +1 -0
  149. package/dist/ui/assets/{provider-BKNTonMh.js → provider-BfGyOQHs.js} +2 -2
  150. package/dist/ui/assets/{provider-Bc9U8jIG.js → provider-DnIZJQjl.js} +1 -1
  151. package/dist/ui/assets/provider-settings-C6uIHjd4.js +1 -0
  152. package/dist/ui/assets/provider-settings-DrWv51sQ.js +2 -0
  153. package/dist/ui/assets/{provider-store-access-CvRhpMjO.js → provider-store-access-BqErJhmB.js} +2 -2
  154. package/dist/ui/assets/provider-store-access-BuQzycZu.js +1 -0
  155. package/dist/ui/assets/{providers-Chea6cTR.js → providers-CF2FF0H2.js} +1 -1
  156. package/dist/ui/assets/providers-CqZKx9qW.js +2 -0
  157. package/dist/ui/assets/proxied-fetch-CiijUcSt.js +2 -0
  158. package/dist/ui/assets/proxied-fetch-DUC7X0GS.js +1 -0
  159. package/dist/ui/assets/{py-realm-worker-DGFMfg27.js → py-realm-worker-BYQkpReo.js} +2 -2
  160. package/dist/ui/assets/{pyodide-BDRAQKP6.js → pyodide-BwD0AtZB.js} +2 -2
  161. package/dist/ui/assets/{quick-llm-Dg39s0LK.js → quick-llm-B9NubAhJ.js} +1 -1
  162. package/dist/ui/assets/{recovery-screen-B5CPvW63.js → recovery-screen-cHPORxsj.js} +1 -1
  163. package/dist/ui/assets/{redirect-uri-DZXyVwvI.js → redirect-uri-BKkf61lT.js} +1 -1
  164. package/dist/ui/assets/{remote-terminal-view-Db-9V2n9.js → remote-terminal-view-BHs39pzZ.js} +1 -1
  165. package/dist/ui/assets/request-body-DWn6QJ_H.js +1 -0
  166. package/dist/ui/assets/rest-ops-CLpS_ilI.js +1 -0
  167. package/dist/ui/assets/rest-ops-D2ig8qfG.js +1 -0
  168. package/dist/ui/assets/{run-BBAgk3Ml.js → run-03JeZZol.js} +1 -1
  169. package/dist/ui/assets/{run-COi81T_1.js → run-B5YOTTPD.js} +1 -1
  170. package/dist/ui/assets/run-BOu4zIOZ.js +29 -0
  171. package/dist/ui/assets/{run-DZMSwK6o.js → run-CUXVFhoI.js} +1 -1
  172. package/dist/ui/assets/run-D5Va_gO8.js +81 -0
  173. package/dist/ui/assets/{run-BMFAdS2O.js → run-DZh-18uA.js} +3 -3
  174. package/dist/ui/assets/{secret-env-Cp2Eduxg.js → secret-env-CtpVPUh5.js} +1 -1
  175. package/dist/ui/assets/secret-topology-Yt0aO4Gz.js +1 -0
  176. package/dist/ui/assets/{secrets-bridge-client-CHMeCH4_.js → secrets-bridge-client-BVl0YuB2.js} +1 -1
  177. package/dist/ui/assets/{secrets-bridge-client-CNOtgwnq.js → secrets-bridge-client-C3MaYf_O.js} +1 -1
  178. package/dist/ui/assets/serial-picker-BQF_Eitc.js +1 -0
  179. package/dist/ui/assets/{session-freezer-DcYjRdMg.js → session-freezer-Bltt6zUt.js} +3 -3
  180. package/dist/ui/assets/{setup-feature-flags-remote-w6i7-xsn.js → setup-feature-flags-remote-BkP-HRZt.js} +1 -1
  181. package/dist/ui/assets/setup-standalone-prelude-C2tPUGcI.js +2 -0
  182. package/dist/ui/assets/setup-sudo-BSw__xoN.js +2 -0
  183. package/dist/ui/assets/shared-Djytys1b.js +1 -0
  184. package/dist/ui/assets/shared-Dq_aaG_m.js +4 -0
  185. package/dist/ui/assets/silent-renew-backoff-DIMz5UqB.js +1 -0
  186. package/dist/ui/assets/silent-renew-backoff-SSzHR-oP.js +1 -0
  187. package/dist/ui/assets/{skills-DHmzZdlX.js → skills-wzno5Tj5.js} +1 -1
  188. package/dist/ui/assets/slicc-app-url-B9OxaBDe.js +1 -0
  189. package/dist/ui/assets/slicc-version-HwuyIZfW.js +1 -0
  190. package/dist/ui/assets/{snapshot-CB063Z3h.js → snapshot-Bi6QabWh.js} +1 -1
  191. package/dist/ui/assets/{snapshot-features-CpPq39XU.js → snapshot-features-BEPdcWF6.js} +3 -3
  192. package/dist/ui/assets/{speak-Dx2FEQBZ.js → speak-BxNdNjKi.js} +1 -1
  193. package/dist/ui/assets/{sprinkle-bridge-BVfyHi8X.js → sprinkle-bridge-BNzhEsPj.js} +1 -1
  194. package/dist/ui/assets/{sprinkle-manager-Dxc8U2h1.js → sprinkle-manager-CflRWcbq.js} +1 -1
  195. package/dist/ui/assets/{sprinkle-renderer-1C1DNVyK.js → sprinkle-renderer-BnSqYzuY.js} +1 -1
  196. package/dist/ui/assets/{src-kInvzkEg.js → src-Bex_z_yH.js} +583 -148
  197. package/dist/ui/assets/state-DIwkpIaB.js +42 -0
  198. package/dist/ui/assets/{store-IAZCSKrZ.js → store-CFx1fIZL.js} +1 -1
  199. package/dist/ui/assets/{store-BiIJ0_As.js → store-i7XHN1Er.js} +1 -1
  200. package/dist/ui/assets/{sudo-llO15-hr.js → sudo-r7OrTMGT.js} +1 -1
  201. package/dist/ui/assets/sync-dialog-D7Wg49Up.js +1 -0
  202. package/dist/ui/assets/tab-teleport-PAaKnGkm.js +1 -0
  203. package/dist/ui/assets/transcript-export-DP-r8eDz.js +1 -0
  204. package/dist/ui/assets/transformers-env-BmBEKck6.js +1 -0
  205. package/dist/ui/assets/{tray-leader-DTpZEm3l.js → tray-leader-DabyaEs-.js} +1 -1
  206. package/dist/ui/assets/{tray-leave-runtime-BrGJs1g5.js → tray-leave-runtime-VfTj-MHR.js} +1 -1
  207. package/dist/ui/assets/tray-runtime-config-BQL-GPqt.js +1 -0
  208. package/dist/ui/assets/tray-runtime-config-C3Ti4Pik.js +1 -0
  209. package/dist/ui/assets/tray-sidecar-Zx9F34-1.js +2 -0
  210. package/dist/ui/assets/tray-sync-protocol-jKTx-dCF.js +1 -0
  211. package/dist/ui/assets/tray-webrtc-uW6sTyIA.js +1 -0
  212. package/dist/ui/assets/{upgrade-detection-D4-saTZd.js → upgrade-detection-Cz0eOMYf.js} +1 -1
  213. package/dist/ui/assets/usb-picker-Cbm0jfjl.js +1 -0
  214. package/dist/ui/assets/{voice-reply-BGR2cNZ_.js → voice-reply-B43Nr1Xr.js} +1 -1
  215. package/dist/ui/assets/{wc-attach-BLZapYO1.js → wc-attach-BbT2famN.js} +3 -3
  216. package/dist/ui/assets/wc-browser-Ctsf5Y23.js +1 -0
  217. package/dist/ui/assets/{wc-extension-BKv2ap0T.js → wc-extension-CJ6cvLnw.js} +2 -2
  218. package/dist/ui/assets/{wc-float-label-Ck2cAgp3.js → wc-float-label-CnFnKVLC.js} +1 -1
  219. package/dist/ui/assets/wc-follower-CkrdiOKN.js +17 -0
  220. package/dist/ui/assets/wc-follower-oauth-B6m2XpVI.js +5 -0
  221. package/dist/ui/assets/wc-live-CxoqWHpR.js +8 -0
  222. package/dist/ui/assets/wc-nav-Bnd_bEYw.js +2 -0
  223. package/dist/ui/assets/wc-onboarding-FeHr2fj5.js +2 -0
  224. package/dist/ui/assets/{wc-permissions-iZXqGvtf.js → wc-permissions-CppSymRx.js} +3 -3
  225. package/dist/ui/assets/wc-permissions-providers-BjqCnuQT.js +2 -0
  226. package/dist/ui/assets/wc-placeholder-C79lmtig.js +4 -0
  227. package/dist/ui/assets/wc-settings-DdAeaZhQ.js +59 -0
  228. package/dist/ui/assets/wc-shell-BP3biEU1.js +125 -0
  229. package/dist/ui/assets/{wc-shortcut-config--IseG9bJ.js → wc-shortcut-config-CjOJXjsp.js} +2 -2
  230. package/dist/ui/assets/wc-shortcuts-BDQiHczD.js +41 -0
  231. package/dist/ui/assets/wc-sprinkles-ChlcnDD2.js +2 -0
  232. package/dist/ui/assets/wc-transcript-export-DdEuCfi6.js +2 -0
  233. package/dist/ui/assets/wc-tray-BfoqEbBg.js +5 -0
  234. package/dist/ui/assets/whisper-session-DW7HkDu2.js +2 -0
  235. package/dist/ui/assets/{xai-grok-0dg6iolO.js → xai-grok-3L0LL1R8.js} +1 -1
  236. package/dist/ui/assets/{xai-grok-pGpFfbjv.js → xai-grok-CKevFY8L.js} +1 -1
  237. package/dist/ui/index.html +15 -17
  238. package/dist/ui/llm-proxy-sw.js +1 -1
  239. package/dist/ui/packages/webapp/index.html +15 -17
  240. package/package.json +5 -4
  241. package/dist/ui/assets/CLAUDE-DhkULx_E.js +0 -1
  242. package/dist/ui/assets/SKILL-DJAvKejL.js +0 -1
  243. package/dist/ui/assets/__vite-browser-external-B19j3y2v.js +0 -1
  244. package/dist/ui/assets/account-store-Bt3zihHK.js +0 -1
  245. package/dist/ui/assets/api-endpoint-BB41u1PK.js +0 -1
  246. package/dist/ui/assets/api-endpoint-DRYP1Kfj.js +0 -1
  247. package/dist/ui/assets/composer-speech-C8OcijP-.js +0 -1
  248. package/dist/ui/assets/dip-Co-Ga2Ny.js +0 -233
  249. package/dist/ui/assets/ensure-speech-assets-Csum3_gw.js +0 -1
  250. package/dist/ui/assets/export-provider-BunpOA08.js +0 -1
  251. package/dist/ui/assets/export-spool-Bvpvkbul.js +0 -1
  252. package/dist/ui/assets/extension-media-capture-DiCJSgES.js +0 -1
  253. package/dist/ui/assets/extension-ops-CsNT8YjX.js +0 -1
  254. package/dist/ui/assets/float-topology-ey0oewfq.js +0 -1
  255. package/dist/ui/assets/github-Bo32za86.js +0 -1
  256. package/dist/ui/assets/handoff-link-CGs8AaQW.js +0 -1
  257. package/dist/ui/assets/hid-picker-C4WMZ0dN.js +0 -1
  258. package/dist/ui/assets/host-command-PnmJLRej.js +0 -1
  259. package/dist/ui/assets/idle-compaction-CACtwRU_.js +0 -1
  260. package/dist/ui/assets/idle-compaction-settings-wK6JTbJh.js +0 -1
  261. package/dist/ui/assets/image-markers-DXh8szCT.js +0 -1
  262. package/dist/ui/assets/image-markers-Gur55AOh.js +0 -1
  263. package/dist/ui/assets/lick-manager-DtpJc-rA.js +0 -2
  264. package/dist/ui/assets/lick-urls-f41PW9LN.js +0 -1
  265. package/dist/ui/assets/main-DG-TOKaI.js +0 -22
  266. package/dist/ui/assets/main-cherry-D1l6FfCM.js +0 -1
  267. package/dist/ui/assets/navigation-watcher-C3S1JDXr.js +0 -1
  268. package/dist/ui/assets/new-session-Bl4ZsQ9b.js +0 -2
  269. package/dist/ui/assets/oauth-bootstrap-Ch6w-P0O.js +0 -2
  270. package/dist/ui/assets/oauth-service-CT-Lvflt.js +0 -1
  271. package/dist/ui/assets/oauth-service-nBlvta_T.js +0 -1
  272. package/dist/ui/assets/panel-rpc-handlers-CRIaZYfR.js +0 -2
  273. package/dist/ui/assets/picker-popup-BjCTzsQH.js +0 -1
  274. package/dist/ui/assets/picker-popup-CFr7T4TJ.js +0 -1
  275. package/dist/ui/assets/preview-url-BvtKejEp.js +0 -1
  276. package/dist/ui/assets/provider-settings-9D34aQwf.js +0 -1
  277. package/dist/ui/assets/provider-settings-BdsyHTuR.js +0 -2
  278. package/dist/ui/assets/provider-store-access-Dk0cF7LZ.js +0 -1
  279. package/dist/ui/assets/providers-gHHjy3ja.js +0 -2
  280. package/dist/ui/assets/proxied-fetch-B0SF_J0b.js +0 -1
  281. package/dist/ui/assets/proxied-fetch-CNztWUVW.js +0 -2
  282. package/dist/ui/assets/remote-cdp-transport-BZuQZZe1.js +0 -1
  283. package/dist/ui/assets/request-body-CsruB58l.js +0 -1
  284. package/dist/ui/assets/rest-ops-31ZkM4IG.js +0 -1
  285. package/dist/ui/assets/rest-ops-D6OyHX5S.js +0 -1
  286. package/dist/ui/assets/run-C31PlCiF.js +0 -81
  287. package/dist/ui/assets/runtime-env-BFnohVwN.js +0 -1
  288. package/dist/ui/assets/runtime-env-Dc36nUmg.js +0 -1
  289. package/dist/ui/assets/runtime-env-NCI8LQob.js +0 -1
  290. package/dist/ui/assets/runtime-env-a_l4ilH_.js +0 -1
  291. package/dist/ui/assets/secret-topology-B8MYKYm6.js +0 -1
  292. package/dist/ui/assets/serial-picker-fzg2DxKj.js +0 -1
  293. package/dist/ui/assets/setup-standalone-prelude-DFrkjkWu.js +0 -2
  294. package/dist/ui/assets/setup-sudo-C0g6ApHD.js +0 -2
  295. package/dist/ui/assets/shared-BpOmrBY4.js +0 -1
  296. package/dist/ui/assets/shared-CTdWt5ZU.js +0 -4
  297. package/dist/ui/assets/silent-renew-backoff-B8p8Ja1t.js +0 -1
  298. package/dist/ui/assets/silent-renew-backoff-BjF-rXLR.js +0 -1
  299. package/dist/ui/assets/slicc-app-url-DnN_aesz.js +0 -1
  300. package/dist/ui/assets/slicc-version-CVpFSZ60.js +0 -1
  301. package/dist/ui/assets/src-DXa5EsFV.js +0 -1
  302. package/dist/ui/assets/src-XLzS9HFL.js +0 -1
  303. package/dist/ui/assets/state-Ct1GOwP8.js +0 -42
  304. package/dist/ui/assets/sync-dialog-BZ2j4xTg.js +0 -1
  305. package/dist/ui/assets/tab-teleport-D1Xeuund.js +0 -1
  306. package/dist/ui/assets/transformers-env-DnkszgHP.js +0 -1
  307. package/dist/ui/assets/tray-runtime-config-D9gR_d0I.js +0 -1
  308. package/dist/ui/assets/tray-runtime-config-DCaFjGSS.js +0 -1
  309. package/dist/ui/assets/tray-sidecar-CWqVyj-w.js +0 -2
  310. package/dist/ui/assets/tray-sync-protocol-BNw4_0UD.js +0 -1
  311. package/dist/ui/assets/tray-sync-protocol-BZ5yhJH9.js +0 -1
  312. package/dist/ui/assets/tray-webrtc-De2SkVvZ.js +0 -1
  313. package/dist/ui/assets/usb-picker-B8B4LJT7.js +0 -1
  314. package/dist/ui/assets/wc-browser-AyZY1PPl.js +0 -1
  315. package/dist/ui/assets/wc-follower-DEUkZTu_.js +0 -17
  316. package/dist/ui/assets/wc-follower-oauth-CTgC7D7W.js +0 -5
  317. package/dist/ui/assets/wc-live-DkTXA2Bw.js +0 -8
  318. package/dist/ui/assets/wc-nav-2fZPqw9y.js +0 -2
  319. package/dist/ui/assets/wc-onboarding-C8kBkCKD.js +0 -2
  320. package/dist/ui/assets/wc-permissions-providers-BzoJwkWd.js +0 -2
  321. package/dist/ui/assets/wc-placeholder-CzEI-8XA.js +0 -4
  322. package/dist/ui/assets/wc-settings--cPEMbHv.js +0 -59
  323. package/dist/ui/assets/wc-shell-58xXdR-i.js +0 -122
  324. package/dist/ui/assets/wc-shortcuts-BWBA9QlD.js +0 -11
  325. package/dist/ui/assets/wc-sprinkles-CN5LWTpu.js +0 -2
  326. package/dist/ui/assets/wc-transcript-export-B6x5VMbH.js +0 -2
  327. package/dist/ui/assets/wc-tray-D--vd5uV.js +0 -5
  328. 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":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,qBAAqB,CAAC;IAC5B,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,EAAE,EAAE,MAAM,CAAC;IACX,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAAC;IACrC,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;CACnC;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1D;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B,GACD;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzF;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC9D;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAM9C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,CAAC;AAE/C;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAClC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yFAAyF;IACzF,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,uGAAuG;IACvG,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,uFAAuF;IACvF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sEAAsE;IACtE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;qBAEiB;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,UAAU,CAAC;AAEtD,MAAM,WAAW,SAAS;IACxB,IAAI,EACA,SAAS,GACT,MAAM,GACN,UAAU,GACV,SAAS,GACT,gBAAgB,GAChB,UAAU,GACV,SAAS,GACT,QAAQ,GACR,UAAU,GACV,MAAM,GACN,cAAc,GACd,SAAS,GACT,WAAW,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,yFAAyF;IACzF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6FAA6F;IAC7F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC;IAChD;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,eAAe,CAAC,EAAE,iBAAiB,CAAC;IACpC;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,EAAE,OAAO,CAAC;CACf"}
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