sliccy 6.167.0 → 6.168.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 -0
- package/dist/node-server/_shared/computer-protocol.d.ts +2 -0
- package/dist/node-server/_shared/computer-protocol.d.ts.map +1 -1
- package/dist/node-server/computer-demo.d.ts +36 -0
- package/dist/node-server/computer-demo.js +126 -0
- package/dist/node-server/index.js +13 -3
- package/dist/node-server/runtime-flags.d.ts +2 -0
- package/dist/node-server/runtime-flags.js +5 -0
- package/dist/ui/.vite/manifest.json +260 -251
- package/dist/ui/assets/SKILL-CQxpe2fi.js +1 -0
- package/dist/ui/assets/{account-store-B05_LKnj.js → account-store-jjUZwcjI.js} +1 -1
- package/dist/ui/assets/{account-store-CNTI4kr_.js → account-store-pXgYgQVx.js} +2 -2
- package/dist/ui/assets/{adobe-nu3irXcy.js → adobe-C42_geSB.js} +1 -1
- package/dist/ui/assets/{adobe-CRRWEbtf.js → adobe-CKCos4Yf.js} +2 -2
- package/dist/ui/assets/{agent-panels-DvH_qfTh.js → agent-panels-C34MxFav.js} +1 -1
- package/dist/ui/assets/{almost-bash-shell-headless-BA5r_r61.js → almost-bash-shell-headless-B5YFQ1wh.js} +521 -548
- package/dist/ui/assets/{apply-layout-CASSSWEy.js → apply-layout-D2V9rxZu.js} +1 -1
- package/dist/ui/assets/approval-timeout-BQ29Z0gf.js +1 -0
- package/dist/ui/assets/{apps-BGe9_zJ7.js → apps-CVkFAyGJ.js} +1 -1
- package/dist/ui/assets/{azure-openai-C-Iw82HZ.js → azure-openai-DucxGbzT.js} +1 -1
- package/dist/ui/assets/{azure-openai-DuJciOKd.js → azure-openai-yAg-vpgC.js} +1 -1
- package/dist/ui/assets/{backend-hostfs-DdAVlPMP.js → backend-hostfs-Ls-A2H2N.js} +1 -1
- package/dist/ui/assets/browser-DuyhpHbR.js +1 -0
- package/dist/ui/assets/{capability-C2eJ1wdx.js → capability-SIitRcq_.js} +2 -2
- package/dist/ui/assets/{cdp-DG8TVjf3.js → cdp-DDYzhKE6.js} +1 -1
- package/dist/ui/assets/{cerebras-BXwtUxTj.js → cerebras-CNR3k849.js} +1 -1
- package/dist/ui/assets/{cerebras-Xadzrxfp.js → cerebras-_--8Umtj.js} +1 -1
- package/dist/ui/assets/{client-BDN4zG90.js → client-_vVqanZy.js} +1 -1
- package/dist/ui/assets/{composer-speech-_uq5e0Bo.js → composer-speech-D8IeaPdq.js} +1 -1
- package/dist/ui/assets/{connect-surface-odDz37TJ.js → connect-surface-Bnfiw-HT.js} +1 -1
- package/dist/ui/assets/{core-BoFWHLIW.js → core-eZ1aR21T.js} +1 -1
- package/dist/ui/assets/core-vzw5Cr8B.js +36 -0
- package/dist/ui/assets/{directed-approval-D_AXAvuz.js → directed-approval-CtbQZigA.js} +1 -1
- package/dist/ui/assets/{discovery-preference-TziZ7Yxu.js → discovery-preference-G3mw_EUO.js} +1 -1
- package/dist/ui/assets/{ensure-speech-assets-DTj236n-.js → ensure-speech-assets-BGvEg25e.js} +1 -1
- package/dist/ui/assets/es-DJTRBqjm.js +52 -0
- package/dist/ui/assets/{extension-ops-DNPAsYbK.js → extension-ops-B2RMipFn.js} +1 -1
- package/dist/ui/assets/{float-topology-CurCyQFy.js → float-topology-CyZCUfkj.js} +1 -1
- package/dist/ui/assets/{follower-navigate-watcher-C98XMw_C.js → follower-navigate-watcher-BAstHBQ5.js} +1 -1
- package/dist/ui/assets/frames-FHlUaNCs.js +1 -0
- package/dist/ui/assets/{frozen-archive-writer-BIzZxx8R.js → frozen-archive-writer-DFE4MYD-.js} +1 -1
- package/dist/ui/assets/{fs-Bq8bUwe2.js → fs-BLqkdQnU.js} +1 -1
- package/dist/ui/assets/{fs-CJs9n90Q.js → fs-DRouAGaW.js} +2 -2
- package/dist/ui/assets/{gelatiere-store-BY0hZvSS.js → gelatiere-store-D_JKXdpV.js} +1 -1
- package/dist/ui/assets/{gelatiere-unit-DrQwRL3O.js → gelatiere-unit-Q-gB5yVf.js} +1 -1
- package/dist/ui/assets/{github-uDwUwz5H.js → github-Cfpmwf1n.js} +1 -1
- package/dist/ui/assets/{github-D1gd3q6u.js → github-DLAFwQdm.js} +2 -2
- package/dist/ui/assets/{github-auth-CzzE1eDf.js → github-auth-DnIBV6_3.js} +1 -1
- package/dist/ui/assets/{github-copilot-Bx2lXrwK.js → github-copilot-BFfPdiKK.js} +1 -1
- package/dist/ui/assets/{github-copilot-DidNEEe_.js → github-copilot-EtGePnlq.js} +1 -1
- package/dist/ui/assets/{github-install--_xp8s-S.js → github-install-1nDy7YKR.js} +1 -1
- package/dist/ui/assets/{github-zip-Bs35nBig.js → github-zip-B-FKgUOX.js} +1 -1
- package/dist/ui/assets/{guest-tool-gate-B-lZT9hl.js → guest-tool-gate-GANtsowg.js} +1 -1
- package/dist/ui/assets/{hear-BNmJphKg.js → hear-BMEHlsdb.js} +1 -1
- package/dist/ui/assets/{help-C7Nq107k.js → help-DWGffc9y.js} +1 -1
- package/dist/ui/assets/{host-iTtS0MRF.js → host-AggLcUuh.js} +1 -1
- package/dist/ui/assets/host-command-XUdketMY.js +28 -0
- package/dist/ui/assets/{installer-C0xiAs69.js → installer-BHkUBh6r.js} +1 -1
- package/dist/ui/assets/{isomorphic-git-D2fV6xS-.js → isomorphic-git-B8-ayEVu.js} +7 -7
- package/dist/ui/assets/{isomorphic-git-B7et_8Xe.js → isomorphic-git-DuHitnAl.js} +10 -10
- package/dist/ui/assets/{js-realm-worker-B9Rz0g1p.js → js-realm-worker-Zk_Jd1kr.js} +1 -1
- package/dist/ui/assets/{jsh-executor-C7QPZ2Qr.js → jsh-executor-K5sbbmbA.js} +2 -2
- package/dist/ui/assets/{kernel-worker-4aPSVJ1C.js → kernel-worker-Bq9IjFw5.js} +34 -34
- package/dist/ui/assets/lick-urls-CgPiVwD-.js +1 -0
- package/dist/ui/assets/lick-ws-bridge-8HhoCHq8.js +1 -0
- package/dist/ui/assets/{lick-ws-bridge-BcAhlead.js → lick-ws-bridge-Ra_w6naR.js} +1 -1
- package/dist/ui/assets/{live-session-snapshot-COMr2v0o.js → live-session-snapshot-lUnl-mYx.js} +1 -1
- package/dist/ui/assets/{local-llm-DdGb9WMG.js → local-llm-B80bjN-D.js} +1 -1
- package/dist/ui/assets/{local-llm-DqeU7kV3.js → local-llm-OcOXhJKt.js} +1 -1
- package/dist/ui/assets/{main-jc6OS8lz.js → main-BRoNZPBl.js} +3 -3
- package/dist/ui/assets/{main-cherry-BGZmJFd_.js → main-cherry-DD2gWq8O.js} +1 -1
- package/dist/ui/assets/{memory-curation-seam-B8pprlUo.js → memory-curation-seam-CcNJCyMJ.js} +1 -1
- package/dist/ui/assets/{memory-health-CGkpyA7o.js → memory-health-DZmKH-IW.js} +1 -1
- package/dist/ui/assets/memory-v2-flag-DK0lPu0X.js +1 -0
- package/dist/ui/assets/{memory-write-execute-B-ahXjaO.js → memory-write-execute-6yK_MOdy.js} +1 -1
- package/dist/ui/assets/{mount-BzdPNQoA.js → mount-CQBa9QoF.js} +3 -3
- package/dist/ui/assets/{mount-FkNAB0be.js → mount-Dz-lPlKf.js} +1 -1
- package/dist/ui/assets/{mount-bridge-client-BO0N4wwP.js → mount-bridge-client-BOZDQLbT.js} +1 -1
- package/dist/ui/assets/{mount-bridge-client-CRnohfom.js → mount-bridge-client-BRywSH1d.js} +1 -1
- package/dist/ui/assets/{mv-DRuZuDHt.js → mv-C7mk2zT1.js} +1 -1
- package/dist/ui/assets/{new-session-B8iOhaK0.js → new-session-CXbgg4am.js} +2 -2
- package/dist/ui/assets/{oauth-bootstrap-B9PwK4-d.js → oauth-bootstrap-1lsyWJGc.js} +2 -2
- package/dist/ui/assets/{oauth-service-UTPOqIwj.js → oauth-service-CRmx6zI1.js} +1 -1
- package/dist/ui/assets/{oauth-service-Bkaz0Dt4.js → oauth-service-WTeDvR5m.js} +1 -1
- package/dist/ui/assets/{onboarding-orchestrator-Cc8Glrem.js → onboarding-orchestrator-SsjiVLB2.js} +1 -1
- package/dist/ui/assets/{openai-codex-BrQ1tsgu.js → openai-codex-BJzpp5yt.js} +1 -1
- package/dist/ui/assets/{openai-codex-DmHr_2RR.js → openai-codex-DDer9WGr.js} +1 -1
- package/dist/ui/assets/{openrouter-C6WDBJvB.js → openrouter-CdsU1YkP.js} +1 -1
- package/dist/ui/assets/{openrouter-free-CUKlyrhq.js → openrouter-free-D1H2Ji7e.js} +1 -1
- package/dist/ui/assets/{openrouter-free-CFBzPY5J.js → openrouter-free-zplQAXSX.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-DOdpRMfw.js → openrouter-oauth-Bu3uuWMP.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-RC0CxY4X.js → openrouter-oauth-CrvWvUZV.js} +1 -1
- package/dist/ui/assets/{openrouter-BvM36eS5.js → openrouter-xGsvfFPH.js} +1 -1
- package/dist/ui/assets/{opfs-mount-B78yj9gx.js → opfs-mount-BqBx391V.js} +1 -1
- package/dist/ui/assets/{page-approval-service-Dy-UA1aK.js → page-approval-service-BkqDCbBQ.js} +1 -1
- package/dist/ui/assets/panel-rpc-handlers-CXr7dAtk.js +2 -0
- package/dist/ui/assets/{panelize-shell-CFPiIneK.js → panelize-shell-DjnrzeLU.js} +1 -1
- package/dist/ui/assets/{pi-edit-execution-BDl_Xp_M.js → pi-edit-execution-Dn7wc7f8.js} +1 -1
- package/dist/ui/assets/{port-bridge-client-ff8DctEN.js → port-bridge-client-CZFX4fUT.js} +1 -1
- package/dist/ui/assets/{port-bridge-client-H03Pohgj.js → port-bridge-client-CkkC3v5w.js} +1 -1
- package/dist/ui/assets/{provider-1ByYSphI.js → provider-BCNJf9_1.js} +2 -2
- package/dist/ui/assets/{provider-Df8LFEZ7.js → provider-DiIrGlmw.js} +1 -1
- package/dist/ui/assets/{provider-settings-Bk-fk9dp.js → provider-settings-DSf8xD9N.js} +1 -1
- package/dist/ui/assets/provider-store-access-CsczvZfg.js +1 -0
- package/dist/ui/assets/provider-store-access-et-xszx-.js +1 -0
- package/dist/ui/assets/{providers-Q92pCQ8h.js → providers-CFveri5U.js} +2 -2
- package/dist/ui/assets/{providers-T_FH_8cU.js → providers-CfE8Z8rn.js} +1 -1
- package/dist/ui/assets/{proxied-fetch-DARKNygr.js → proxied-fetch-CPL8wJM2.js} +1 -1
- package/dist/ui/assets/{proxied-fetch-Bl8AeYdt.js → proxied-fetch-CnCvBaGV.js} +1 -1
- package/dist/ui/assets/{quick-llm-CbGHjrhX.js → quick-llm-t6CBwwSm.js} +1 -1
- package/dist/ui/assets/{realm-inprocess-CWMnXeN3.js → realm-inprocess-CmaGqRYS.js} +1 -1
- package/dist/ui/assets/{recovery-screen-DhUqOdby.js → recovery-screen-DdKutJyi.js} +1 -1
- package/dist/ui/assets/{redirect-uri-Dd0j1fSp.js → redirect-uri-D2aDPCyB.js} +1 -1
- package/dist/ui/assets/{remote-terminal-view-D4Ah4AQY.js → remote-terminal-view-CA-SfvvZ.js} +2 -2
- package/dist/ui/assets/{rest-ops-CQOwDiTR.js → rest-ops-Yu_dXm4T.js} +1 -1
- package/dist/ui/assets/{rest-ops-DkUeDpiM.js → rest-ops-aP40ni1y.js} +1 -1
- package/dist/ui/assets/{restore-CVkulBmU.js → restore-Dk9r9feA.js} +1 -1
- package/dist/ui/assets/{run-B-t7kWH3.js → run-BEs473Sp.js} +1 -1
- package/dist/ui/assets/run-CHjRjdbt.js +75 -0
- package/dist/ui/assets/{run-DgVV_DFr.js → run-CNldrNje.js} +3 -3
- package/dist/ui/assets/{run-ZmpHaamT.js → run-CyYVrNXy.js} +2 -2
- package/dist/ui/assets/{run-BX9uHbIi.js → run-D5s_jfOL.js} +1 -1
- package/dist/ui/assets/{run-COfTem8j.js → run-QfYlwe2c.js} +1 -1
- package/dist/ui/assets/{run-IexPmM2B.js → run-V-RPlN7V.js} +2 -2
- package/dist/ui/assets/{run-CUCg2cJM.js → run-wxYu-gUG.js} +2 -2
- package/dist/ui/assets/screen-s6LdF1JP.js +1 -0
- package/dist/ui/assets/screen-share-approval-live-D388fVD9.js +1 -0
- package/dist/ui/assets/screencapture-media-BjmoKpyn.js +1 -0
- package/dist/ui/assets/screencapture-media-CM5E2g6c.js +1 -0
- package/dist/ui/assets/screencapture-media-shared-DlK1Wqh8.js +1 -0
- package/dist/ui/assets/{screencapture-run-yMA5c_HS.js → screencapture-run-zmx5QKf_.js} +2 -2
- package/dist/ui/assets/{secret-env-BhWGz7yx.js → secret-env-DgrZZVFU.js} +1 -1
- package/dist/ui/assets/secret-topology-BrobAGSV.js +1 -0
- package/dist/ui/assets/{secrets-bridge-client-C0tvQeuX.js → secrets-bridge-client-BJqZCK6Q.js} +1 -1
- package/dist/ui/assets/{secrets-bridge-client-BS3V1JBF.js → secrets-bridge-client-CeK7HpDf.js} +1 -1
- package/dist/ui/assets/{session-command-memory-DzuRy-nC.js → session-command-memory-x5HxxZtb.js} +2 -2
- package/dist/ui/assets/{session-jsonl-iOOR_32X.js → session-jsonl-3Y2sXuNG.js} +1 -1
- package/dist/ui/assets/{session-jsonl-D01HYAS2.js → session-jsonl-DI8wVUpH.js} +1 -1
- package/dist/ui/assets/{session-search-index-CABvtt-r.js → session-search-index-DRFKeHXl.js} +1 -1
- package/dist/ui/assets/{setup-feature-flags-remote-CvstKwBW.js → setup-feature-flags-remote-CEtNYgED.js} +1 -1
- package/dist/ui/assets/{signed-fetch-7NwdVmf1.js → signed-fetch-E-2q08XL.js} +1 -1
- package/dist/ui/assets/{silent-renew-backoff-CXHqSiPb.js → silent-renew-backoff-Ddlf2gAw.js} +1 -1
- package/dist/ui/assets/slicc-version-bYxfYms3.js +1 -0
- package/dist/ui/assets/{snapshot-BcYaw9Ip.js → snapshot-Dv7-7kFE.js} +1 -1
- package/dist/ui/assets/{snapshot-features-3xslkGtL.js → snapshot-features-rlYmVQ8i.js} +1 -1
- package/dist/ui/assets/{soundscape-TygolFwj.js → soundscape-CyBhtUGQ.js} +1 -1
- package/dist/ui/assets/{speak-BCLm04Z2.js → speak-qRc1po5e.js} +1 -1
- package/dist/ui/assets/{sprinkle-manager-DDzNanda.js → sprinkle-manager-DT2AYalc.js} +1 -1
- package/dist/ui/assets/{sprinkle-renderer-B-CADNjq.js → sprinkle-renderer-DF4JYgsw.js} +1 -1
- package/dist/ui/assets/ssh-BQqlQVXQ.js +6 -0
- package/dist/ui/assets/{state-BCTAzK_L.js → state-RVr0GidF.js} +1 -1
- package/dist/ui/assets/{store-C-AW4ogv.js → store-BlFQl8dG.js} +1 -1
- package/dist/ui/assets/{store-CzlK9KIc.js → store-CYwEydJ4.js} +1 -1
- package/dist/ui/assets/{sudo-BtkDnUA_.js → sudo-BqpeZUOO.js} +1 -1
- package/dist/ui/assets/sudo-fs-C6r_MIIY.js +3 -0
- package/dist/ui/assets/{supervisor-B6-QPxI3.js → supervisor-C1sPrIbH.js} +1 -1
- package/dist/ui/assets/{sync-dialog-B4G7kCwj.js → sync-dialog-sC277gbg.js} +1 -1
- package/dist/ui/assets/tool-ui-DRnUkp2g.js +1 -0
- package/dist/ui/assets/{transformers-env-1TbBNkOp.js → transformers-env-BzsQpYgD.js} +1 -1
- package/dist/ui/assets/{tray-leader-_KISvFyF.js → tray-leader-Gx_yzXFX.js} +1 -1
- package/dist/ui/assets/{lick-urls-DdKPDlgq.js → tray-leader-status-CpkFr6n7.js} +1 -1
- package/dist/ui/assets/{tray-leave-runtime-CRsRkPHc.js → tray-leave-runtime-Cuj-CStD.js} +1 -1
- package/dist/ui/assets/{tray-runtime-config-BVgVR3H2.js → tray-runtime-config-dyxCfUex.js} +1 -1
- package/dist/ui/assets/{tray-sidecar-BRvCb-i7.js → tray-sidecar-BCAds1ts.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-C5daiUbn.js → upgrade-detection-CXNgKpwK.js} +1 -1
- package/dist/ui/assets/{upskill-lick-skip-C2ZQ0c2-.js → upskill-lick-skip-wDM3Vdyq.js} +1 -1
- package/dist/ui/assets/url-Dq7PTmNp.js +1 -0
- package/dist/ui/assets/v86-Cv7l0TeZ.js +1 -0
- package/dist/ui/assets/{voice-reply-Dk4ztuZL.js → voice-reply-DPbxkmsy.js} +1 -1
- package/dist/ui/assets/{wc-attach-CFj2ZF5_.js → wc-attach-C-7ZwxKV.js} +2 -2
- package/dist/ui/assets/{wc-browser-BFL2Tl8W.js → wc-browser-D-03DBqa.js} +1 -1
- package/dist/ui/assets/wc-computers-m_Qiklfg.js +3 -0
- package/dist/ui/assets/{wc-detached-ncc8KuL1.js → wc-detached-D5_bAfyn.js} +1 -1
- package/dist/ui/assets/{wc-extension-DppNe2VK.js → wc-extension-DSvNnUY6.js} +2 -2
- package/dist/ui/assets/{wc-follower-CcxFCW-y.js → wc-follower-1feBQ0f-.js} +3 -3
- package/dist/ui/assets/{wc-follower-oauth-DQ-JPxl6.js → wc-follower-oauth-JZo8mi8y.js} +1 -1
- package/dist/ui/assets/{wc-gelatiere-CANPh9TU.js → wc-gelatiere-Wr8PEKDG.js} +1 -1
- package/dist/ui/assets/{wc-live-BLozTZsg.js → wc-live-DT1WB50h.js} +17 -17
- package/dist/ui/assets/{wc-nav-BlLpBAJG.js → wc-nav-BCq8EXtI.js} +2 -2
- package/dist/ui/assets/{wc-onboarding-OKaUOQ3X.js → wc-onboarding-1l4fZpDo.js} +2 -2
- package/dist/ui/assets/{wc-permissions-BsGMi4OQ.js → wc-permissions-CCA-0PP4.js} +2 -2
- package/dist/ui/assets/{wc-placeholder-BrX9-mPv.js → wc-placeholder-ODIHzW-8.js} +3 -3
- package/dist/ui/assets/{wc-secret-request-QPmTs_eW.js → wc-secret-request-CWyoYT_T.js} +1 -1
- package/dist/ui/assets/{wc-settings-BFgFDtTk.js → wc-settings-Df49ivPm.js} +3 -3
- package/dist/ui/assets/{wc-shell-CCKjmASt.js → wc-shell-CZ95TYrc.js} +4 -4
- package/dist/ui/assets/{wc-shortcut-config-CeUoljrV.js → wc-shortcut-config-CmRCkDN0.js} +1 -1
- package/dist/ui/assets/{wc-sprinkles-BNp18_jW.js → wc-sprinkles-Cm0F47mC.js} +2 -2
- package/dist/ui/assets/{wc-transcript-export-DJnnZ8L-.js → wc-transcript-export-CMdPvQk4.js} +2 -2
- package/dist/ui/assets/{wc-tray-f1LxbB98.js → wc-tray-2XQPor_4.js} +4 -4
- package/dist/ui/assets/welcome-detection-CouG8kRR.js +1 -0
- package/dist/ui/assets/{whisper-session-CMiImrJg.js → whisper-session-z9qnQTAM.js} +2 -2
- package/dist/ui/assets/{xai-grok-BMr5udF6.js → xai-grok-BmuhN83h.js} +1 -1
- package/dist/ui/assets/{xai-grok-Dzeo18XM.js → xai-grok-CaNUqqnT.js} +1 -1
- package/dist/ui/index.html +9 -9
- package/dist/ui/packages/webapp/index.html +9 -9
- package/package.json +1 -1
- package/dist/ui/assets/SKILL-CWR-bsvH.js +0 -1
- package/dist/ui/assets/browser-2rCVqcqy.js +0 -1
- package/dist/ui/assets/core-Bvc89tkf.js +0 -36
- package/dist/ui/assets/es-DwGGEZle.js +0 -51
- package/dist/ui/assets/keys-Dexx8cLD.js +0 -1
- package/dist/ui/assets/lick-ws-bridge-DZ0vVYNF.js +0 -1
- package/dist/ui/assets/memory-v2-flag-DVbOtPFF.js +0 -1
- package/dist/ui/assets/panel-rpc-handlers-CQ_iaU6N.js +0 -2
- package/dist/ui/assets/provider-store-access-BJPbOUku.js +0 -1
- package/dist/ui/assets/provider-store-access-BrjCBzpb.js +0 -1
- package/dist/ui/assets/run-DvD576xV.js +0 -53
- package/dist/ui/assets/screencapture-media-DL5YxrlG.js +0 -1
- package/dist/ui/assets/screencapture-media-YBE2VnLF.js +0 -1
- package/dist/ui/assets/secret-topology-CVneCnID.js +0 -1
- package/dist/ui/assets/slicc-version-CN6V2aMa.js +0 -1
- package/dist/ui/assets/sudo-fs-D620mZry.js +0 -3
- package/dist/ui/assets/v86-BfdTUFBK.js +0 -1
- package/dist/ui/assets/wc-computers-CcJuQUyG.js +0 -3
- package/dist/ui/assets/welcome-detection-Dg9THpkh.js +0 -1
package/README.md
CHANGED
|
@@ -83,6 +83,7 @@ SLICC is for you if:
|
|
|
83
83
|
- **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.
|
|
84
84
|
- **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`.
|
|
85
85
|
- **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). **Compact on idle**: a cone that has sat idle for 30 minutes with a context of at least 200k tokens compacts in the background, so you never wait for a summary at the start of your next turn; 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.
|
|
86
|
+
- **Keep terminal failures visible.** If a cone or delegated scoop exhausts its provider retries, the error card is stored outside the model-facing history and survives a reload. Retrying or rebuilding the transcript does not duplicate it.
|
|
86
87
|
- **Keep a gelatiere.** Turn on **Memory v2** under Experimental features and SLICC keeps a resident advisor: a persistent scoop no cone owns and nobody can prompt that reviews your archived sessions every night and after you end a chat, then comes back with a few concrete suggestions — a skill from the catalog that fits what you keep doing by hand, a use case you have not tried, a habit that would have avoided a detour. They show up as cards in the suggestions sprinkle (Install / Try it / Dismiss) and every open cone gets a lick. `gelatiere run` asks for a pass now; the instructions, the nightly schedule and the budget live in `/shared/GELATIERE.md`.
|
|
87
88
|
- **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. Experimental features take effect when SLICC boots, so flipping one only matters on the next load. Changes are held until you confirm: the dialog says what is waiting and offers **Reload now** to save and apply them, or **Revert** to drop them. Nothing is written until you reload, and dismissing the dialog discards — so a flag can never end up reading `on` with nothing to show for it.
|
|
88
89
|
- **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.
|
|
@@ -101,6 +101,8 @@ export interface ComputerFrame {
|
|
|
101
101
|
export interface ComputerScreenshotOpts {
|
|
102
102
|
format: 'png' | 'jpeg';
|
|
103
103
|
maxWidth?: number;
|
|
104
|
+
/** Adapters that issue HTTP must abort the in-flight request when this fires. */
|
|
105
|
+
signal?: AbortSignal;
|
|
104
106
|
}
|
|
105
107
|
export interface ComputerExecResult {
|
|
106
108
|
stdout: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computer-protocol.d.ts","sourceRoot":"","sources":["../src/computer-protocol.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"computer-protocol.d.ts","sourceRoot":"","sources":["../src/computer-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reference HTTP computer behind `--computer-demo`. Implements the
|
|
3
|
+
* phase-3 URL contract so `computer add url http://127.0.0.1:<port>` and
|
|
4
|
+
* the fake-LLM e2e can drive a real remote without a third-party host.
|
|
5
|
+
*
|
|
6
|
+
* GET /computer
|
|
7
|
+
* GET /computer/screenshot?maxWidth=&format=
|
|
8
|
+
* GET /computer/text
|
|
9
|
+
* POST /computer/input
|
|
10
|
+
* WS /computer/frames?fps=4 (optional; HTTP poll still works)
|
|
11
|
+
*/
|
|
12
|
+
import type { IncomingMessage } from 'node:http';
|
|
13
|
+
import type { Duplex } from 'node:stream';
|
|
14
|
+
import type { ComputerDescriptor, ComputerInputEvent } from './_shared/index.js';
|
|
15
|
+
import type { Express } from 'express';
|
|
16
|
+
import { WebSocketServer } from 'ws';
|
|
17
|
+
/** 1×1 SOF0 JPEG — enough for protocol tests; not a displayable photo. */
|
|
18
|
+
export declare const COMPUTER_DEMO_JPEG: Uint8Array<ArrayBuffer>;
|
|
19
|
+
export declare class ComputerDemoState {
|
|
20
|
+
seq: number;
|
|
21
|
+
readonly events: ComputerInputEvent[];
|
|
22
|
+
descriptor(): ComputerDescriptor;
|
|
23
|
+
screenshot(): {
|
|
24
|
+
bytes: Uint8Array;
|
|
25
|
+
mime: string;
|
|
26
|
+
width: number;
|
|
27
|
+
height: number;
|
|
28
|
+
seq: number;
|
|
29
|
+
};
|
|
30
|
+
text(): string;
|
|
31
|
+
input(events: ComputerInputEvent[]): void;
|
|
32
|
+
}
|
|
33
|
+
export declare function registerComputerDemoRoutes(app: Express, state: ComputerDemoState): void;
|
|
34
|
+
export declare function createComputerDemoFrameServer(state: ComputerDemoState): WebSocketServer;
|
|
35
|
+
/** True when this upgrade was the demo frames socket. */
|
|
36
|
+
export declare function handleComputerDemoUpgrade(pathname: string, request: IncomingMessage, socket: Duplex, head: Buffer, wss: WebSocketServer): boolean;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reference HTTP computer behind `--computer-demo`. Implements the
|
|
3
|
+
* phase-3 URL contract so `computer add url http://127.0.0.1:<port>` and
|
|
4
|
+
* the fake-LLM e2e can drive a real remote without a third-party host.
|
|
5
|
+
*
|
|
6
|
+
* GET /computer
|
|
7
|
+
* GET /computer/screenshot?maxWidth=&format=
|
|
8
|
+
* GET /computer/text
|
|
9
|
+
* POST /computer/input
|
|
10
|
+
* WS /computer/frames?fps=4 (optional; HTTP poll still works)
|
|
11
|
+
*/
|
|
12
|
+
import { WebSocketServer } from 'ws';
|
|
13
|
+
/** 1×1 SOF0 JPEG — enough for protocol tests; not a displayable photo. */
|
|
14
|
+
export const COMPUTER_DEMO_JPEG = Uint8Array.of(0xff, 0xd8, 0xff, 0xc0, 0x00, 0x0b, 0x08, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x11, 0x00, 0xff, 0xd9);
|
|
15
|
+
export class ComputerDemoState {
|
|
16
|
+
seq = 0;
|
|
17
|
+
events = [];
|
|
18
|
+
descriptor() {
|
|
19
|
+
return {
|
|
20
|
+
id: 'url:demo',
|
|
21
|
+
kind: 'url',
|
|
22
|
+
title: 'computer-demo',
|
|
23
|
+
size: { width: 1, height: 1 },
|
|
24
|
+
state: 'live',
|
|
25
|
+
capabilities: {
|
|
26
|
+
screenshot: true,
|
|
27
|
+
text: true,
|
|
28
|
+
frames: 'poll',
|
|
29
|
+
keyboard: true,
|
|
30
|
+
mouse: 'absolute',
|
|
31
|
+
scroll: true,
|
|
32
|
+
exec: false,
|
|
33
|
+
inputAllowed: true,
|
|
34
|
+
},
|
|
35
|
+
pid: null,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
screenshot() {
|
|
39
|
+
this.seq += 1;
|
|
40
|
+
return {
|
|
41
|
+
bytes: COMPUTER_DEMO_JPEG,
|
|
42
|
+
mime: 'image/jpeg',
|
|
43
|
+
width: 1,
|
|
44
|
+
height: 1,
|
|
45
|
+
seq: this.seq,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
text() {
|
|
49
|
+
if (this.events.length === 0)
|
|
50
|
+
return 'demo\n';
|
|
51
|
+
return `${this.events.map((event) => event.type).join('\n')}\n`;
|
|
52
|
+
}
|
|
53
|
+
input(events) {
|
|
54
|
+
this.events.push(...events);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function isInputEvent(value) {
|
|
58
|
+
if (typeof value !== 'object' || value === null)
|
|
59
|
+
return false;
|
|
60
|
+
if (!('type' in value) || typeof value.type !== 'string')
|
|
61
|
+
return false;
|
|
62
|
+
return (value.type === 'mousemove' ||
|
|
63
|
+
value.type === 'button' ||
|
|
64
|
+
value.type === 'click' ||
|
|
65
|
+
value.type === 'scroll' ||
|
|
66
|
+
value.type === 'drag' ||
|
|
67
|
+
value.type === 'key' ||
|
|
68
|
+
value.type === 'text' ||
|
|
69
|
+
value.type === 'wait');
|
|
70
|
+
}
|
|
71
|
+
export function registerComputerDemoRoutes(app, state) {
|
|
72
|
+
app.get('/computer', (_req, res) => {
|
|
73
|
+
res.json(state.descriptor());
|
|
74
|
+
});
|
|
75
|
+
app.get('/computer/screenshot', (_req, res) => {
|
|
76
|
+
const shot = state.screenshot();
|
|
77
|
+
res.set('Content-Type', shot.mime);
|
|
78
|
+
res.set('Cache-Control', 'no-store');
|
|
79
|
+
res.send(Buffer.from(shot.bytes));
|
|
80
|
+
});
|
|
81
|
+
app.get('/computer/text', (_req, res) => {
|
|
82
|
+
res.type('text/plain').send(state.text());
|
|
83
|
+
});
|
|
84
|
+
app.post('/computer/input', (req, res) => {
|
|
85
|
+
if (!Array.isArray(req.body)) {
|
|
86
|
+
res.status(400).json({ error: 'expected ComputerInputEvent[]' });
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const events = [];
|
|
90
|
+
for (const item of req.body) {
|
|
91
|
+
if (!isInputEvent(item)) {
|
|
92
|
+
res.status(400).json({ error: 'invalid ComputerInputEvent' });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
events.push(item);
|
|
96
|
+
}
|
|
97
|
+
state.input(events);
|
|
98
|
+
res.json({ ok: true, count: events.length });
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
export function createComputerDemoFrameServer(state) {
|
|
102
|
+
const wss = new WebSocketServer({ noServer: true });
|
|
103
|
+
wss.on('connection', (ws, request) => {
|
|
104
|
+
const url = new URL(request.url ?? '/', 'http://computer-demo.local');
|
|
105
|
+
const fps = Math.min(8, Math.max(1, Number(url.searchParams.get('fps')) || 4));
|
|
106
|
+
const tick = () => {
|
|
107
|
+
if (ws.readyState !== ws.OPEN)
|
|
108
|
+
return;
|
|
109
|
+
const shot = state.screenshot();
|
|
110
|
+
ws.send(shot.bytes);
|
|
111
|
+
};
|
|
112
|
+
tick();
|
|
113
|
+
const timer = setInterval(tick, Math.round(1000 / fps));
|
|
114
|
+
ws.on('close', () => clearInterval(timer));
|
|
115
|
+
});
|
|
116
|
+
return wss;
|
|
117
|
+
}
|
|
118
|
+
/** True when this upgrade was the demo frames socket. */
|
|
119
|
+
export function handleComputerDemoUpgrade(pathname, request, socket, head, wss) {
|
|
120
|
+
if (pathname !== '/computer/frames')
|
|
121
|
+
return false;
|
|
122
|
+
wss.handleUpgrade(request, socket, head, (ws) => {
|
|
123
|
+
wss.emit('connection', ws, request);
|
|
124
|
+
});
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
@@ -27,6 +27,7 @@ import { FileRegistry } from './cloud/registry-file.js';
|
|
|
27
27
|
import { runResume } from './cloud/resume.js';
|
|
28
28
|
import { runStart } from './cloud/start.js';
|
|
29
29
|
import { registerCloudStatusEndpoint } from './cloud-status.js';
|
|
30
|
+
import { ComputerDemoState, createComputerDemoFrameServer, handleComputerDemoUpgrade, registerComputerDemoRoutes, } from './computer-demo.js';
|
|
30
31
|
import { ElectronAppAlreadyRunningError, ElectronOverlayInjector, launchElectronApp, resolveOverlayThinBridge, } from './electron-controller.js';
|
|
31
32
|
import { getElectronAppPorts } from './electron-runtime.js';
|
|
32
33
|
import { ElectronTrayFollower } from './electron-tray-follower.js';
|
|
@@ -580,9 +581,11 @@ function rejectUpgradeUnauthorized(socket, reason) {
|
|
|
580
581
|
* `Sec-WebSocket-Protocol` token = socket destroyed before
|
|
581
582
|
* `wss.emit('connection', ...)` ever fires. Legacy modes (dev / electron /
|
|
582
583
|
* serve-only / hosted) pass `null` to keep same-origin behavior unchanged.
|
|
583
|
-
* `/licks-ws` is loopback-only and stays ungated.
|
|
584
|
+
* `/licks-ws` is loopback-only and stays ungated. When `--computer-demo` is
|
|
585
|
+
* on, `/computer/frames` is the optional push socket for the URL adapter
|
|
586
|
+
* reference server (HTTP poll still works without the upgrade).
|
|
584
587
|
*/
|
|
585
|
-
function attachCdpUpgradeRouting(server, wss, lickWss, bridgeToken) {
|
|
588
|
+
function attachCdpUpgradeRouting(server, wss, lickWss, bridgeToken, computerDemoWss = null) {
|
|
586
589
|
server.on('upgrade', (request, socket, head) => {
|
|
587
590
|
const { pathname } = new URL(request.url, `http://${request.headers.host}`);
|
|
588
591
|
if (pathname === '/cdp') {
|
|
@@ -607,6 +610,9 @@ function attachCdpUpgradeRouting(server, wss, lickWss, bridgeToken) {
|
|
|
607
610
|
lickWss.emit('connection', ws, request);
|
|
608
611
|
});
|
|
609
612
|
}
|
|
613
|
+
else if (computerDemoWss) {
|
|
614
|
+
handleComputerDemoUpgrade(pathname, request, socket, head, computerDemoWss);
|
|
615
|
+
}
|
|
610
616
|
});
|
|
611
617
|
}
|
|
612
618
|
/**
|
|
@@ -1256,6 +1262,9 @@ async function main() {
|
|
|
1256
1262
|
// trusted process so the in-browser agent can request, but never fabricate,
|
|
1257
1263
|
// an approval. Loopback-only; selects a backend by environment at call time.
|
|
1258
1264
|
registerSudoApproveEndpoint(app);
|
|
1265
|
+
const computerDemo = RUNTIME_FLAGS.computerDemo ? new ComputerDemoState() : null;
|
|
1266
|
+
if (computerDemo)
|
|
1267
|
+
registerComputerDemoRoutes(app, computerDemo);
|
|
1259
1268
|
// Fetch proxy — forwards cross-origin requests from the browser to bypass CORS,
|
|
1260
1269
|
// injecting/unmasking secrets and streaming the response with a UTF-8-safe scrub.
|
|
1261
1270
|
registerFetchProxyRoute(app, { secretProxy });
|
|
@@ -1267,7 +1276,8 @@ async function main() {
|
|
|
1267
1276
|
// 4. CDP WebSocket proxy at /cdp — noServer mode so we own the upgrade
|
|
1268
1277
|
// handler routing for /cdp and /licks-ws.
|
|
1269
1278
|
const wss = createCdpWebSocketServer(state.bridgeToken);
|
|
1270
|
-
|
|
1279
|
+
const computerDemoWss = computerDemo ? createComputerDemoFrameServer(computerDemo) : null;
|
|
1280
|
+
attachCdpUpgradeRouting(server, wss, lickWss, state.bridgeToken, computerDemoWss);
|
|
1271
1281
|
const cdpCtx = {
|
|
1272
1282
|
wss,
|
|
1273
1283
|
secretProxy,
|
|
@@ -24,6 +24,8 @@ export interface CliRuntimeFlags {
|
|
|
24
24
|
installCli: boolean;
|
|
25
25
|
/** Target directory for --install-cli (default: OS-idiomatic, see install-cli.ts) */
|
|
26
26
|
installDir: string | null;
|
|
27
|
+
/** Mount GET/POST `/computer` + optional WS `/computer/frames` (URL adapter reference). */
|
|
28
|
+
computerDemo: boolean;
|
|
27
29
|
/**
|
|
28
30
|
* Mount table: OS-folder → SLICC-target mappings served over the local
|
|
29
31
|
* host-FS bridge (`/api/hostfs`) and auto-mounted by the webapp at boot,
|
|
@@ -92,6 +92,7 @@ function createDefaultFlags() {
|
|
|
92
92
|
hosted: false,
|
|
93
93
|
installCli: false,
|
|
94
94
|
installDir: null,
|
|
95
|
+
computerDemo: false,
|
|
95
96
|
mounts: [],
|
|
96
97
|
};
|
|
97
98
|
}
|
|
@@ -122,6 +123,10 @@ function applySimpleFlag(flags, arg) {
|
|
|
122
123
|
flags.installCli = true;
|
|
123
124
|
return true;
|
|
124
125
|
}
|
|
126
|
+
if (arg === '--computer-demo') {
|
|
127
|
+
flags.computerDemo = true;
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
125
130
|
return false;
|
|
126
131
|
}
|
|
127
132
|
/** `--flag=value` style flags that consume no following token. Returns whether handled. */
|