sliccy 6.217.0 → 6.218.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/node-server/chrome-launch.d.ts +8 -2
- package/dist/node-server/chrome-launch.js +35 -27
- package/dist/ui/.vite/manifest.json +207 -200
- package/dist/ui/assets/{account-store-DEEMsVyJ.js → account-store-DYJJCxJo.js} +1 -1
- package/dist/ui/assets/{account-store-BOPuEMqI.js → account-store-D_dPl16L.js} +1 -1
- package/dist/ui/assets/{adobe-BJLSWwia.js → adobe-B4MN5_M4.js} +1 -1
- package/dist/ui/assets/{adobe-U9X3cRQ7.js → adobe-BYw0VHpu.js} +1 -1
- package/dist/ui/assets/{agent-panels-C2-uYlp_.js → agent-panels-C9dRkirO.js} +1 -1
- package/dist/ui/assets/{almost-bash-shell-headless-C_6K2YYO.js → almost-bash-shell-headless-DeH8ulQM.js} +526 -526
- package/dist/ui/assets/{apply-layout-Dg36cwSk.js → apply-layout-CXJ_8NAT.js} +1 -1
- package/dist/ui/assets/approval-decision-BvumWm-U.js +1 -0
- package/dist/ui/assets/approval-timeout-CeQbGMnv.js +1 -0
- package/dist/ui/assets/{apps-BHKYBwKI.js → apps-VP5mbnB8.js} +1 -1
- package/dist/ui/assets/{azure-openai-HHzueyMf.js → azure-openai-DQEwsige.js} +1 -1
- package/dist/ui/assets/{azure-openai-BGxf50uQ.js → azure-openai-iU6X70QW.js} +1 -1
- package/dist/ui/assets/{backend-hostfs-BjxRqXat.js → backend-hostfs-DLWkun8N.js} +1 -1
- package/dist/ui/assets/{boundary-Cp9c_bPu.js → boundary-DjgipyWT.js} +1 -1
- package/dist/ui/assets/{capability-BArmeMYf.js → capability-BsxMoeMg.js} +2 -2
- package/dist/ui/assets/{cdp-MViMwyXE.js → cdp-BVM0EV0h.js} +1 -1
- package/dist/ui/assets/{cerebras-zyC3IFAH.js → cerebras-C-MguQUF.js} +1 -1
- package/dist/ui/assets/{cerebras-WhszYDrM.js → cerebras-Dar5RPlL.js} +1 -1
- package/dist/ui/assets/{composer-speech-CtQBB9wd.js → composer-speech-d17pZjld.js} +1 -1
- package/dist/ui/assets/{connect-surface-DxqdV0pU.js → connect-surface-CzqhHOpk.js} +1 -1
- package/dist/ui/assets/directed-approval-CLyy98kZ.js +1 -0
- package/dist/ui/assets/emscripten-vfs-hook-Dgp8TEZK.js +1 -0
- package/dist/ui/assets/{emscripten-vfs-hook-CEQbJmZa.js → emscripten-vfs-hook-ctdnPZVN.js} +1 -1
- package/dist/ui/assets/{ensure-speech-assets-BD8LBQqZ.js → ensure-speech-assets-C12IV4u7.js} +1 -1
- package/dist/ui/assets/extension-ops-Ded2__AC.js +1 -0
- package/dist/ui/assets/{frozen-archive-writer-CKKM2Jif.js → frozen-archive-writer-BweL88zo.js} +1 -1
- package/dist/ui/assets/{fs-BMFVg7cy.js → fs-BvMvRMgl.js} +1 -1
- package/dist/ui/assets/{fs-CMiBtw7D.js → fs-Cr6FJg4V.js} +2 -2
- package/dist/ui/assets/{gelatiere-store-BiS0OWaH.js → gelatiere-store-CKuvVPdN.js} +1 -1
- package/dist/ui/assets/{gelatiere-unit-Cvsx6GjW.js → gelatiere-unit-Cro5t__k.js} +1 -1
- package/dist/ui/assets/{github-BB7o_Wpz.js → github-BMVOcdI8.js} +1 -1
- package/dist/ui/assets/{github-hpAX34vV.js → github-BiKuW-LL.js} +2 -2
- package/dist/ui/assets/{github-auth-3c5S4myF.js → github-auth-B_Ll-Y6P.js} +1 -1
- package/dist/ui/assets/{github-copilot-B4_eCJL8.js → github-copilot-Cpy-cNE7.js} +1 -1
- package/dist/ui/assets/{github-copilot-BkkYdoJq.js → github-copilot-D15AlMDG.js} +1 -1
- package/dist/ui/assets/{github-install-DLy4Fcr_.js → github-install-Q0KoGVpi.js} +1 -1
- package/dist/ui/assets/{github-zip-Bvlh8BqL.js → github-zip-Bz2IXLub.js} +1 -1
- package/dist/ui/assets/{hear-uDUBW-27.js → hear-DJyelQhP.js} +1 -1
- package/dist/ui/assets/{help-CPoBGA_p.js → help-D2h40n15.js} +1 -1
- package/dist/ui/assets/{installer-D27U027H.js → installer-BSR8SD5W.js} +1 -1
- package/dist/ui/assets/{ipk-mamba-D5JvnQqj.js → ipk-mamba-CUVvtYaQ.js} +1 -1
- package/dist/ui/assets/{js-realm-worker-9YVJnX-1.js → js-realm-worker-hsxBVRhi.js} +3 -3
- package/dist/ui/assets/{jsh-executor-B7LWgSEg.js → jsh-executor-CZKkf290.js} +2 -2
- package/dist/ui/assets/{kernel-worker-CwYO76P1.js → kernel-worker-B4R2PngA.js} +45 -45
- package/dist/ui/assets/{lick-ws-bridge-DLi1GXRX.js → lick-ws-bridge-COSKCGDc.js} +1 -1
- package/dist/ui/assets/{lick-ws-bridge-DEgEDvro.js → lick-ws-bridge-CWfL-fuc.js} +1 -1
- package/dist/ui/assets/{live-session-curation-IeL1i9Kq.js → live-session-curation-CF7-JQNt.js} +1 -1
- package/dist/ui/assets/{live-session-snapshot-DMljp105.js → live-session-snapshot-2a2d2niQ.js} +1 -1
- package/dist/ui/assets/live-vfs-fs-0VhJ1yJW.js +1 -0
- package/dist/ui/assets/{local-llm-C_q1qxQf.js → local-llm-DSc1eBI_.js} +1 -1
- package/dist/ui/assets/{local-llm-CEKxQjHM.js → local-llm-Dm67J4Or.js} +1 -1
- package/dist/ui/assets/main-B61BvKBb.js +22 -0
- package/dist/ui/assets/{main-cherry-ZZUNKpNu.js → main-cherry-BXtTBLP6.js} +1 -1
- package/dist/ui/assets/{memory-curation-seam-tmAQXZZh.js → memory-curation-seam-dMRe3LAt.js} +1 -1
- package/dist/ui/assets/{memory-health-BcNUYJ1h.js → memory-health-D0VOxGUq.js} +1 -1
- package/dist/ui/assets/{memory-write-execute-CZvWcgNO.js → memory-write-execute-B12BlJli.js} +1 -1
- package/dist/ui/assets/{merge-folded-cost-into-frozen-CLn1pgXV.js → merge-folded-cost-into-frozen-BJuchBJs.js} +1 -1
- package/dist/ui/assets/{mount-IZGjP_Ii.js → mount-C8XxJIcW.js} +3 -3
- package/dist/ui/assets/{mount-Bm0uHvq-.js → mount-CdMxbkwV.js} +1 -1
- package/dist/ui/assets/new-session-Ck977dr8.js +2 -0
- package/dist/ui/assets/{oauth-bootstrap-CqdiSEg6.js → oauth-bootstrap-VagnehHV.js} +2 -2
- package/dist/ui/assets/{onboarding-orchestrator-D3WdXuUK.js → onboarding-orchestrator-BlvLR2uv.js} +1 -1
- package/dist/ui/assets/{openai-codex-uFXagdsX.js → openai-codex-CgJV38ez.js} +1 -1
- package/dist/ui/assets/{openai-codex-CKqwo_3u.js → openai-codex-lx77uf95.js} +1 -1
- package/dist/ui/assets/{openrouter-D8XbzRPO.js → openrouter-BYF3f4hE.js} +1 -1
- package/dist/ui/assets/{openrouter-D1z7UC50.js → openrouter-FAB81Bs-.js} +1 -1
- package/dist/ui/assets/{openrouter-free-CC_KdTm_.js → openrouter-free-C-tzJPNS.js} +1 -1
- package/dist/ui/assets/{openrouter-free-DnovGZBZ.js → openrouter-free-C9Jp7Pjg.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-B4l5773C.js → openrouter-oauth-BtfMq4eX.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-CH74pIPL.js → openrouter-oauth-CgPTtO9Z.js} +1 -1
- package/dist/ui/assets/{opfs-mount-Cjeki81r.js → opfs-mount-B58s34ro.js} +1 -1
- package/dist/ui/assets/page-approval-service-BbEv1dSc.js +1 -0
- package/dist/ui/assets/panel-rpc-handlers-CFU49OK-.js +2 -0
- package/dist/ui/assets/{panelize-shell-Ca8jU9bz.js → panelize-shell-DG1WSdD6.js} +1 -1
- package/dist/ui/assets/{pi-edit-execution-imx0gp05.js → pi-edit-execution-CBxKNy1e.js} +1 -1
- package/dist/ui/assets/process-worker-Bm14-oXj.js +3 -0
- package/dist/ui/assets/{provider-DbuVBBue.js → provider-DmFA_o6z.js} +2 -2
- package/dist/ui/assets/{provider-DLcxXuhZ.js → provider-YkRt54jM.js} +1 -1
- package/dist/ui/assets/{provider-settings-C6j__6sI.js → provider-settings-BffwNjqW.js} +1 -1
- package/dist/ui/assets/provider-store-access-CiNO5BWB.js +1 -0
- package/dist/ui/assets/provider-store-access-DPC_h0n0.js +1 -0
- package/dist/ui/assets/{providers-CzioQa6A.js → providers-D91qSZ-7.js} +1 -1
- package/dist/ui/assets/{providers-CDCjovrE.js → providers-DniKJDnW.js} +2 -2
- package/dist/ui/assets/{py-live-vfs-BB10PxRM.js → py-live-vfs-BCSnlFm0.js} +1 -1
- package/dist/ui/assets/py-live-vfs-D_X8Ts9M.js +180 -0
- package/dist/ui/assets/{py-realm-worker-COX6g80P.js → py-realm-worker-vN-Y0duM.js} +1 -1
- package/dist/ui/assets/{quick-llm-CHkGjtc6.js → quick-llm-CrLkA2_d.js} +1 -1
- package/dist/ui/assets/{realm-inprocess-rhXVLUbw.js → realm-inprocess-DKN0ZHJ_.js} +2 -2
- package/dist/ui/assets/realm-sync-transport-BD8czJdC.js +1 -0
- package/dist/ui/assets/{realm-unhandled-rejections-B3ZSvhl_.js → realm-unhandled-rejections-AiJm7tb8.js} +1 -1
- package/dist/ui/assets/{realm-unhandled-rejections-DiL5sSwr.js → realm-unhandled-rejections-CZx2IMUV.js} +1 -1
- package/dist/ui/assets/{recovery-screen-rb6SOJ7U.js → recovery-screen-Dif0XJec.js} +1 -1
- package/dist/ui/assets/{remote-terminal-view-DKPsFcjB.js → remote-terminal-view-Bogfkp0a.js} +2 -2
- package/dist/ui/assets/{require-guards-DKdJuMhY.js → require-guards-jYsd9xiG.js} +1 -1
- package/dist/ui/assets/{rest-ops-DDzQA0qH.js → rest-ops-DyAkn44S.js} +1 -1
- package/dist/ui/assets/{rest-ops-BMlgdArp.js → rest-ops-d6LSiWDZ.js} +1 -1
- package/dist/ui/assets/{restore-l1zQRO1O.js → restore-BuvAnvWO.js} +1 -1
- package/dist/ui/assets/{run-CvaoxH-1.js → run-B41YZRab.js} +1 -1
- package/dist/ui/assets/{run-D1TXxMmP.js → run-BBBDnSZP.js} +1 -1
- package/dist/ui/assets/{run-zJ9eMMQs.js → run-BLIuToUE.js} +2 -2
- package/dist/ui/assets/{run-DLsP-0lq.js → run-BQ9HnxuZ.js} +1 -1
- package/dist/ui/assets/{run-BG58gE0v.js → run-BTy1lN10.js} +2 -2
- package/dist/ui/assets/{run-b5wNaXoy.js → run-C5EU0z0t.js} +1 -1
- package/dist/ui/assets/{run-CrySk672.js → run-CYXAZSqv.js} +2 -2
- package/dist/ui/assets/{run-Gue_kIPE.js → run-qKtH39R0.js} +8 -7
- package/dist/ui/assets/{session-command-memory-BPIfyZMe.js → session-command-memory-Bd4fBxop.js} +2 -2
- package/dist/ui/assets/{session-jsonl-DC0przLd.js → session-jsonl-BgfNc5-K.js} +1 -1
- package/dist/ui/assets/{session-jsonl-Cxda94qB.js → session-jsonl-BoKaLBjt.js} +1 -1
- package/dist/ui/assets/{session-search-index-CEyiMR4z.js → session-search-index-DR3LjlVj.js} +1 -1
- package/dist/ui/assets/{setup-feature-flags-remote-CAMyvmIv.js → setup-feature-flags-remote-De-0v4XT.js} +1 -1
- package/dist/ui/assets/{setup-model-catalog-nGrUbfNi.js → setup-model-catalog-B6luXfNv.js} +1 -1
- package/dist/ui/assets/{signed-fetch-BEGZCYqx.js → signed-fetch-CO-Bnl47.js} +1 -1
- package/dist/ui/assets/{silent-renew-backoff-C4Rqfsye.js → silent-renew-backoff-BH-9_m4E.js} +1 -1
- package/dist/ui/assets/slicc-version-DEtAf6Eq.js +1 -0
- package/dist/ui/assets/{snapshot-BdGz92tf.js → snapshot-C1F-yOO0.js} +1 -1
- package/dist/ui/assets/{snapshot-features-p_X3SG7L.js → snapshot-features-CExRojJx.js} +1 -1
- package/dist/ui/assets/{soundscape-ClBgC3To.js → soundscape-BOv4ciPN.js} +1 -1
- package/dist/ui/assets/{speak-BjsAbkrC.js → speak-CGde-S7y.js} +1 -1
- package/dist/ui/assets/{sprinkle-manager-D4Ulyvja.js → sprinkle-manager-Bd6_RBxS.js} +1 -1
- package/dist/ui/assets/{sprinkle-renderer-C9DF3FJv.js → sprinkle-renderer-D7GUEjZL.js} +1 -1
- package/dist/ui/assets/{ssh-Bs6hnIoe.js → ssh-CO09HVge.js} +1 -1
- package/dist/ui/assets/{state-BwzBgXWm.js → state-CPqokSG7.js} +1 -1
- package/dist/ui/assets/{store-DEUFR3Ei.js → store-BaNNo1We.js} +1 -1
- package/dist/ui/assets/{store-D5JwUJQV.js → store-Bu_WlNqx.js} +1 -1
- package/dist/ui/assets/sudo-4tXqhxkX.js +5 -0
- package/dist/ui/assets/{sudo-fs-CGjo9awW.js → sudo-fs-mI-V4QkM.js} +1 -1
- package/dist/ui/assets/{supervisor-D9goiiYr.js → supervisor-CKUGA1zo.js} +1 -1
- package/dist/ui/assets/{sync-dialog-BWpzJbtP.js → sync-dialog-lNuhtsLb.js} +1 -1
- package/dist/ui/assets/sync-exec-dispatch-DvIKQEFv.js +1 -0
- package/dist/ui/assets/{sync-sab-responder-Bfd9S0pw.js → sync-sab-responder-CKgRMoHC.js} +1 -1
- package/dist/ui/assets/{telemetry-CKoAhRMv.js → telemetry-B0sKnLBU.js} +2 -2
- package/dist/ui/assets/{transformers-env-5YP8lO1Y.js → transformers-env-SiVQM-3h.js} +1 -1
- package/dist/ui/assets/{tray-leader-DBekFKtV.js → tray-leader-DGzx35nP.js} +1 -1
- package/dist/ui/assets/{tray-leave-runtime-XU5GNEL4.js → tray-leave-runtime-B1q8KWLf.js} +1 -1
- package/dist/ui/assets/{tray-sidecar-D9mLvrWu.js → tray-sidecar-BWndOel0.js} +1 -1
- package/dist/ui/assets/types-DSxCdZw6.js +1 -0
- package/dist/ui/assets/types-Dj5TU-Qg.js +1 -0
- package/dist/ui/assets/types-JfhqX7lD.js +1 -0
- package/dist/ui/assets/{upgrade-detection-D9bMYnZE.js → upgrade-detection-DQSTN2sW.js} +1 -1
- package/dist/ui/assets/{upskill-lick-skip-DK2aB9YG.js → upskill-lick-skip-DlilF4rc.js} +1 -1
- package/dist/ui/assets/{voice-reply-DzLNXqvk.js → voice-reply-CP7WG1rY.js} +1 -1
- package/dist/ui/assets/{wc-attach-DtSHOZy3.js → wc-attach-CAnoEIAv.js} +2 -2
- package/dist/ui/assets/{wc-browser-Qt4xcbCv.js → wc-browser-CNHm9mOO.js} +1 -1
- package/dist/ui/assets/{wc-computers-3ANjZGmC.js → wc-computers-BBq_pLL5.js} +1 -1
- package/dist/ui/assets/{wc-detached-Cj7Q39TM.js → wc-detached-CLtrY4dJ.js} +1 -1
- package/dist/ui/assets/{wc-extension--4MnugYi.js → wc-extension-DAUjLmyi.js} +2 -2
- package/dist/ui/assets/{wc-follower-oauth-CbAR50KX.js → wc-follower-oauth-DJaH6NcY.js} +1 -1
- package/dist/ui/assets/{wc-follower-C-wJMGT-.js → wc-follower-rlyd2qoE.js} +3 -3
- package/dist/ui/assets/{wc-gelatiere-BTNvLUaJ.js → wc-gelatiere-DBjNosRS.js} +1 -1
- package/dist/ui/assets/wc-live-Bv8ygCb1.js +433 -0
- package/dist/ui/assets/{wc-nav-xZY0Kn73.js → wc-nav-CEYJqyOP.js} +2 -2
- package/dist/ui/assets/{wc-onboarding-CM5CNuAu.js → wc-onboarding-DiVhjaWE.js} +2 -2
- package/dist/ui/assets/{wc-permissions-B5BHyVex.js → wc-permissions-BDEnxsRc.js} +2 -2
- package/dist/ui/assets/{wc-placeholder-D8_CQqxQ.js → wc-placeholder-BwtwD-4U.js} +3 -3
- package/dist/ui/assets/{wc-secret-request-BIEPNN_s.js → wc-secret-request-BqsFJf8J.js} +1 -1
- package/dist/ui/assets/{wc-settings--27TP4-c.js → wc-settings-DHJ5-fBJ.js} +3 -3
- package/dist/ui/assets/{wc-shell-DNXWncTn.js → wc-shell-C_FnQT_B.js} +3 -3
- package/dist/ui/assets/{wc-shortcut-config-Bibkh7Yf.js → wc-shortcut-config-yKU5tM0c.js} +1 -1
- package/dist/ui/assets/{wc-sprinkles-DX_H2km2.js → wc-sprinkles-D1qkDv5r.js} +2 -2
- package/dist/ui/assets/{wc-transcript-export--kF-Vxt_.js → wc-transcript-export-DRvYtZAz.js} +2 -2
- package/dist/ui/assets/wc-tray-Dg5lvLPA.js +5 -0
- package/dist/ui/assets/welcome-detection-CYN-rZLL.js +1 -0
- package/dist/ui/assets/{whisper-session-3XJkKghL.js → whisper-session-B7DGbMeT.js} +2 -2
- package/dist/ui/assets/{xai-grok-B42huSYK.js → xai-grok-BMGn7sDb.js} +1 -1
- package/dist/ui/assets/{xai-grok-Bjy2zwFV.js → xai-grok-BknauR83.js} +1 -1
- package/dist/ui/index.html +4 -4
- package/dist/ui/packages/webapp/index.html +4 -4
- package/package.json +1 -1
- package/dist/ui/assets/approval-decision-CS9Wwm5B.js +0 -1
- package/dist/ui/assets/approval-timeout-BQ29Z0gf.js +0 -1
- package/dist/ui/assets/directed-approval-BfoHF_26.js +0 -1
- package/dist/ui/assets/emscripten-vfs-hook-DgdMcqyP.js +0 -1
- package/dist/ui/assets/extension-ops-i_xfuHy5.js +0 -1
- package/dist/ui/assets/live-vfs-fs-DWvmF4OR.js +0 -1
- package/dist/ui/assets/main-CrQ4lqof.js +0 -22
- package/dist/ui/assets/new-session-CSVzNHeE.js +0 -2
- package/dist/ui/assets/page-approval-service-C8ldGtOt.js +0 -1
- package/dist/ui/assets/panel-rpc-handlers-D6__UWuk.js +0 -2
- package/dist/ui/assets/process-worker-DTdozhx3.js +0 -3
- package/dist/ui/assets/provider-store-access-DE9qdrpb.js +0 -1
- package/dist/ui/assets/provider-store-access-DOArIKIU.js +0 -1
- package/dist/ui/assets/py-live-vfs-CjvQr88H.js +0 -180
- package/dist/ui/assets/realm-sync-transport-Bxw8OlvF.js +0 -1
- package/dist/ui/assets/slicc-version-Cl3RUQFw.js +0 -1
- package/dist/ui/assets/sudo-XWnflknm.js +0 -5
- package/dist/ui/assets/sync-exec-dispatch-BwrIjhDd.js +0 -1
- package/dist/ui/assets/types-BfwydWt7.js +0 -1
- package/dist/ui/assets/wc-live-Bt0oy5Ed.js +0 -433
- package/dist/ui/assets/wc-tray-BnsH1nNt.js +0 -5
- package/dist/ui/assets/welcome-detection-EPHOljaE.js +0 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ If this scares, confuses, or excites you, keep reading.
|
|
|
11
11
|
|
|
12
12
|
# slicc — Self-Licking Ice Cream Cone
|
|
13
13
|
|
|
14
|
-
[](https://github.com/ai-ecoverse/vibe-coded-badge-action)
|
|
15
15
|
|
|
16
16
|
[](https://www.npmjs.com/package/sliccy)
|
|
17
17
|
|
|
@@ -213,7 +213,7 @@ SLICC shares one core across every runtime ("float"). The browser is not just wh
|
|
|
213
213
|
|
|
214
214
|
Once the product makes sense, the ice-cream language is easier to enjoy: it maps to real architecture, not just mascot energy.
|
|
215
215
|
|
|
216
|
-
- **Cone** — the main agent you interact with. It holds the broad context, owns the overall workflow, and delegates work. You can run several at once: the left rail's action row offers **New cone** (name it; your current chat stays where it is) and **Drop cone** (its chat goes to the Freezer without memory extraction, together with its scoops; the last cone can never be dropped). Cones switch from the tab strip — all cones first, then the scoops of the one you are in. Each cone keeps its own conversation and its own model: the model picker changes the cone you are looking at, switching cones switches the model back, a new cone starts on the model of the cone you created it from, and a scoop keeps the model its cone had when it was spawned. **New chat** / **New chat, fast** / **Discard** archive and clear the cone you are looking at. There is one Freezer for all cones; a thawed chat says which cone it came from. Licks and the first-run welcome stay with the original cone. Each extra cone also gets its own workspace (`/cones/<folder>/workspace`) and memory file, so cones do not overwrite each other's files or interleave each other's memory — what a cone learns is remembered for that cone; `/shared`, `/tmp` and installed skills stay common. **You never talk to a scoop directly**: opening one from the tab strip shows its transcript with no composer — you watch it work, and everything it needs from you (a sudo request, an approval, a nudge when it goes idle) appears in the chat of the cone that owns it. The cone is where you answer, and `feed_scoop` from the cone is the only way to send a scoop input. The iPhone/iPad follower shows the same read-only scoop view. A Cherry embed — SLICC as a garnish inside someone else's page — mirrors the cones its leader has but never offers to create or drop one.
|
|
216
|
+
- **Cone** — the main agent you interact with. It holds the broad context, owns the overall workflow, and delegates work. You can run several at once: the left rail's action row offers **New cone** (name it; your current chat stays where it is) and **Drop cone** (its chat goes to the Freezer without memory extraction, together with its scoops; the last cone can never be dropped). Cones switch from the tab strip — all cones first, then the scoops of the one you are in. Each cone keeps its own conversation and its own model: the model picker changes the cone you are looking at, switching cones switches the model back, a new cone starts on the model of the cone you created it from, and a scoop keeps the model its cone had when it was spawned. **New chat** / **New chat, fast** / **Discard** archive and clear the cone you are looking at. A complete transcript snapshot is attempted for five seconds; working scoops cannot hold the new chat open indefinitely, and the saved chat remains in the Freezer if that extra snapshot is unavailable. There is one Freezer for all cones; a thawed chat says which cone it came from. Licks and the first-run welcome stay with the original cone. Each extra cone also gets its own workspace (`/cones/<folder>/workspace`) and memory file, so cones do not overwrite each other's files or interleave each other's memory — what a cone learns is remembered for that cone; `/shared`, `/tmp` and installed skills stay common. **You never talk to a scoop directly**: opening one from the tab strip shows its transcript with no composer — you watch it work, and everything it needs from you (a sudo request, an approval, a nudge when it goes idle) appears in the chat of the cone that owns it. The cone is where you answer, and `feed_scoop` from the cone is the only way to send a scoop input. The iPhone/iPad follower shows the same read-only scoop view. A Cherry embed — SLICC as a garnish inside someone else's page — mirrors the cones its leader has but never offers to create or drop one.
|
|
217
217
|
- **Scoops** — isolated sub-agents with their own filesystem sandbox, shell, and conversation history.
|
|
218
218
|
- **Licks** — external events that wake an agent up: webhooks, cron jobs, and other signals from the outside world.
|
|
219
219
|
- **Floats** — normal engineers would call it runtimes, but would normal engineers have come up with this?
|
|
@@ -186,9 +186,15 @@ export declare const TAB_LIFECYCLE_EXEMPT_SITES: string[];
|
|
|
186
186
|
* FreezingFollowsDiscardOptOut) freeze policy.
|
|
187
187
|
*
|
|
188
188
|
* Merges into existing prefs (the profile persists logins across runs) and
|
|
189
|
-
* never throws — a failure here must not block a launch.
|
|
189
|
+
* never throws — a failure here must not block a launch. Read faults other
|
|
190
|
+
* than a missing file fail closed: the existing Preferences are left
|
|
191
|
+
* untouched rather than rewritten from an empty default (#3625).
|
|
190
192
|
*/
|
|
191
|
-
|
|
193
|
+
/** Injectable seams for {@link seedChromeProfilePreferences} (tests). */
|
|
194
|
+
export interface SeedChromeProfilePreferencesDeps {
|
|
195
|
+
readFileImpl?: (path: string) => Promise<string>;
|
|
196
|
+
}
|
|
197
|
+
export declare function seedChromeProfilePreferences(userDataDir: string, deps?: SeedChromeProfilePreferencesDeps): Promise<void>;
|
|
192
198
|
/**
|
|
193
199
|
* Remove Chrome's session-restore snapshot so a relaunch opens ONLY the
|
|
194
200
|
* command-line tab instead of also reopening the previous window's tabs.
|
|
@@ -439,14 +439,31 @@ export function findChromeExecutable(options = {}) {
|
|
|
439
439
|
? (installedChrome ?? chromeForTesting)
|
|
440
440
|
: (chromeForTesting ?? installedChrome);
|
|
441
441
|
}
|
|
442
|
-
|
|
442
|
+
/**
|
|
443
|
+
* Read a Chrome profile JSON file for a subsequent write-back.
|
|
444
|
+
*
|
|
445
|
+
* - Missing file (`ENOENT`) → `{}` so callers can seed a first-run scaffold.
|
|
446
|
+
* - Any other read fault (EIO/EACCES/EBUSY/…) or JSON parse / non-object
|
|
447
|
+
* result → `null`. Callers MUST fail closed and leave the existing file
|
|
448
|
+
* untouched — collapsing those faults to `{}` and rewriting would wipe the
|
|
449
|
+
* user's persistent Preferences (#3625).
|
|
450
|
+
*/
|
|
451
|
+
async function readJsonFile(filePath, readFileImpl = (path) => readFile(path, 'utf8')) {
|
|
452
|
+
let raw;
|
|
453
|
+
try {
|
|
454
|
+
raw = await readFileImpl(filePath);
|
|
455
|
+
}
|
|
456
|
+
catch (err) {
|
|
457
|
+
if (err.code === 'ENOENT')
|
|
458
|
+
return {};
|
|
459
|
+
return null;
|
|
460
|
+
}
|
|
443
461
|
try {
|
|
444
|
-
const raw = await readFile(filePath, 'utf8');
|
|
445
462
|
const parsed = JSON.parse(raw);
|
|
446
|
-
return isJsonObject(parsed) ? parsed :
|
|
463
|
+
return isJsonObject(parsed) ? parsed : null;
|
|
447
464
|
}
|
|
448
465
|
catch {
|
|
449
|
-
return
|
|
466
|
+
return null;
|
|
450
467
|
}
|
|
451
468
|
}
|
|
452
469
|
async function writeJsonFile(filePath, value) {
|
|
@@ -494,10 +511,16 @@ export async function ensureQaProfileScaffold(projectRoot) {
|
|
|
494
511
|
await writeFile(join(profile.userDataDir, 'First Run'), '', 'utf8');
|
|
495
512
|
const localStatePath = join(profile.userDataDir, 'Local State');
|
|
496
513
|
const preferencesPath = join(profile.userDataDir, 'Default', 'Preferences');
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
await
|
|
500
|
-
|
|
514
|
+
// Fail closed per file: a transient read fault must not clobber the
|
|
515
|
+
// existing scaffold (#3625). Missing files still seed from {}.
|
|
516
|
+
const localStateBase = await readJsonFile(localStatePath);
|
|
517
|
+
if (localStateBase !== null) {
|
|
518
|
+
await writeJsonFile(localStatePath, seedLocalState(localStateBase, definition));
|
|
519
|
+
}
|
|
520
|
+
const preferencesBase = await readJsonFile(preferencesPath);
|
|
521
|
+
if (preferencesBase !== null) {
|
|
522
|
+
await writeJsonFile(preferencesPath, seedPreferences(preferencesBase, definition));
|
|
523
|
+
}
|
|
501
524
|
}
|
|
502
525
|
return profiles;
|
|
503
526
|
}
|
|
@@ -676,27 +699,12 @@ export const TAB_LIFECYCLE_EXEMPT_SITES = [
|
|
|
676
699
|
hostedLeaderHost.replace(/^www\./, ''),
|
|
677
700
|
'localhost',
|
|
678
701
|
];
|
|
679
|
-
|
|
680
|
-
* Seed the profile's `Default/Preferences` with tab-lifecycle opt-outs before
|
|
681
|
-
* every launch. The `--disable-features` list in {@link buildChromeLaunchArgs}
|
|
682
|
-
* is the primary defense against Chrome freezing/discarding the backgrounded
|
|
683
|
-
* leader tab, but feature names churn between Chrome versions (Chrome 151
|
|
684
|
-
* renamed the whole pipeline, silently reviving the freeze); these prefs are
|
|
685
|
-
* the version-stable belt:
|
|
686
|
-
*
|
|
687
|
-
* - `tab_freezing_enabled: false` — master pref gating tab freezing;
|
|
688
|
-
* - `performance_tuning.high_efficiency_mode.state: 0` — Memory Saver off;
|
|
689
|
-
* - `performance_tuning.tab_discarding.exceptions` — per-site exemption list
|
|
690
|
-
* covering the leader origins, honored by both discard and (via Chrome's
|
|
691
|
-
* FreezingFollowsDiscardOptOut) freeze policy.
|
|
692
|
-
*
|
|
693
|
-
* Merges into existing prefs (the profile persists logins across runs) and
|
|
694
|
-
* never throws — a failure here must not block a launch.
|
|
695
|
-
*/
|
|
696
|
-
export async function seedChromeProfilePreferences(userDataDir) {
|
|
702
|
+
export async function seedChromeProfilePreferences(userDataDir, deps = {}) {
|
|
697
703
|
const prefsPath = join(userDataDir, 'Default', 'Preferences');
|
|
698
704
|
try {
|
|
699
|
-
const prefs = await readJsonFile(prefsPath);
|
|
705
|
+
const prefs = await readJsonFile(prefsPath, deps.readFileImpl);
|
|
706
|
+
if (prefs === null)
|
|
707
|
+
return; // fail closed — do not overwrite durable prefs
|
|
700
708
|
prefs['tab_freezing_enabled'] = false;
|
|
701
709
|
const performanceTuning = ensureObject(prefs, 'performance_tuning');
|
|
702
710
|
const highEfficiencyMode = ensureObject(performanceTuning, 'high_efficiency_mode');
|