sliccy 6.112.6 → 6.113.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 (100) hide show
  1. package/README.md +1 -1
  2. package/dist/node-server/hostfs.d.ts +1 -1
  3. package/dist/node-server/hostfs.js +32 -3
  4. package/dist/ui/.vite/manifest.json +141 -141
  5. package/dist/ui/assets/{SKILL-D4YtbN6n.js → SKILL-BPuaCaUr.js} +1 -1
  6. package/dist/ui/assets/{account-store-yyvxS08-.js → account-store-BoblUQxS.js} +1 -1
  7. package/dist/ui/assets/{account-store-1jHrkitr.js → account-store-CAFlX5K_.js} +1 -1
  8. package/dist/ui/assets/{adobe-cyqThTLM.js → adobe-CQJHG1Ks.js} +1 -1
  9. package/dist/ui/assets/{adobe-C6Ak2LWa.js → adobe-EObT5Qia.js} +1 -1
  10. package/dist/ui/assets/{agent-bridge-AAfpu4bW.js → agent-bridge-B-OH7VjH.js} +1 -1
  11. package/dist/ui/assets/{agent-panels-YPIVBeEc.js → agent-panels-B66yFH2Q.js} +1 -1
  12. package/dist/ui/assets/{apply-layout-Cmqkui7H.js → apply-layout-ERanJD1f.js} +1 -1
  13. package/dist/ui/assets/{apps-D_K9az00.js → apps-C_f4tfHb.js} +1 -1
  14. package/dist/ui/assets/{auto-mount-table-BhFTO0Bn.js → auto-mount-table-DnB3cBQZ.js} +1 -1
  15. package/dist/ui/assets/{azure-openai-BAZHGshY.js → azure-openai-CzFN-Ym3.js} +1 -1
  16. package/dist/ui/assets/{azure-openai-DHiy6rJ1.js → azure-openai-OwuWxaII.js} +1 -1
  17. package/dist/ui/assets/backend-hostfs-67ZrRvDd.js +1 -0
  18. package/dist/ui/assets/backend-hostfs-BRPUUyZC.js +1 -0
  19. package/dist/ui/assets/{cerebras-CsLqCFVZ.js → cerebras-BKPx5Ryi.js} +1 -1
  20. package/dist/ui/assets/{cerebras-BLGqA_gt.js → cerebras-De-br_MV.js} +1 -1
  21. package/dist/ui/assets/{connect-surface-BDPFxWKQ.js → connect-surface-Dgfo_X4g.js} +1 -1
  22. package/dist/ui/assets/{directed-approval-BBEtrnVX.js → directed-approval-c9i6VVva.js} +1 -1
  23. package/dist/ui/assets/{fs-B1pXkOnM.js → fs-BLoZrnh-.js} +1 -1
  24. package/dist/ui/assets/{fs-Ci9jn8-T.js → fs-_hKUzpR2.js} +2 -2
  25. package/dist/ui/assets/{github-D-U4rb-W.js → github-53EdSP8-.js} +1 -1
  26. package/dist/ui/assets/{github-C-Av-0iP.js → github-BC2fGb-J.js} +2 -2
  27. package/dist/ui/assets/{github-copilot-BpV7MG9i.js → github-copilot-7zW_nQIc.js} +1 -1
  28. package/dist/ui/assets/{github-copilot-CAbnrkuq.js → github-copilot-BmYiP20H.js} +1 -1
  29. package/dist/ui/assets/{github-install-D0ytYYbu.js → github-install-h-E9PifB.js} +1 -1
  30. package/dist/ui/assets/{github-zip-DZbr3qWX.js → github-zip-D1RV4xtg.js} +1 -1
  31. package/dist/ui/assets/{js-realm-worker-DlWEsScS.js → js-realm-worker-BtMgjF6F.js} +1 -1
  32. package/dist/ui/assets/{kernel-worker-DWGg_sxz.js → kernel-worker-DzGFoiBE.js} +644 -643
  33. package/dist/ui/assets/{legacy-styles-DcRu2WCJ.js → legacy-styles-5GUwx9VK.js} +1 -1
  34. package/dist/ui/assets/{local-llm-DvAmncyT.js → local-llm-BDzhcvLn.js} +1 -1
  35. package/dist/ui/assets/{local-llm-BU7S-AVF.js → local-llm-CzODHEnR.js} +1 -1
  36. package/dist/ui/assets/{main-u8HY3_-C.js → main-BN-GF8sT.js} +3 -3
  37. package/dist/ui/assets/{mount-i111XTmz.js → mount--B_IpEAt.js} +1 -1
  38. package/dist/ui/assets/{mount-DPKD0kyn.js → mount-B_1Rpl0T.js} +3 -3
  39. package/dist/ui/assets/{mount-recovery-D8egEvQB.js → mount-recovery-DGsvxx4J.js} +1 -1
  40. package/dist/ui/assets/{new-session-Ds3amI7B.js → new-session-BE8-Kpxb.js} +2 -2
  41. package/dist/ui/assets/{oauth-bootstrap-CnqTURKj.js → oauth-bootstrap-AgooOsML.js} +2 -2
  42. package/dist/ui/assets/{openai-codex-CZ6BCC2H.js → openai-codex-DksEQbF6.js} +1 -1
  43. package/dist/ui/assets/{openai-codex-BrybEwLX.js → openai-codex-NrHIPSuJ.js} +1 -1
  44. package/dist/ui/assets/{openrouter-Blcz-X3E.js → openrouter-BLxZ_YfE.js} +1 -1
  45. package/dist/ui/assets/{openrouter-COyFG8jP.js → openrouter-CpPMXp49.js} +1 -1
  46. package/dist/ui/assets/{openrouter-oauth-BNrHFJJ3.js → openrouter-oauth-BoFHeAvY.js} +1 -1
  47. package/dist/ui/assets/{openrouter-oauth-ZPlHUd1U.js → openrouter-oauth-BwhMnbQ-.js} +1 -1
  48. package/dist/ui/assets/{panel-rpc-handlers-CWWZNkBG.js → panel-rpc-handlers-DQHXjMwb.js} +2 -2
  49. package/dist/ui/assets/{panelize-shell-BKRcYmaD.js → panelize-shell-JhGehB2n.js} +1 -1
  50. package/dist/ui/assets/{provider-l8PeSdKi.js → provider-C96QYEUu.js} +2 -2
  51. package/dist/ui/assets/{provider-settings-CFYVC9dl.js → provider-settings-C6RMFf8c.js} +1 -1
  52. package/dist/ui/assets/{provider-settings-DJmsw9lZ.js → provider-settings-CPEsmE27.js} +1 -1
  53. package/dist/ui/assets/provider-store-access-CchLvU6E.js +1 -0
  54. package/dist/ui/assets/{provider-store-access-lAE2ULA-.js → provider-store-access-sHV0u0_Z.js} +2 -2
  55. package/dist/ui/assets/{provider-Cg1bP565.js → provider-zINM--yg.js} +1 -1
  56. package/dist/ui/assets/{providers-BKaQ7cr_.js → providers-DFcXy4_v.js} +2 -2
  57. package/dist/ui/assets/{providers-DERBWQMz.js → providers-I8fLlE1F.js} +1 -1
  58. package/dist/ui/assets/{quick-llm-CWShBYyo.js → quick-llm-lc--g_uQ.js} +1 -1
  59. package/dist/ui/assets/{recovery-screen-D_DG7koi.js → recovery-screen-BnxVYjcD.js} +1 -1
  60. package/dist/ui/assets/{run-BTvgQczm.js → run-DLMvI-Vw.js} +2 -2
  61. package/dist/ui/assets/{run-1LYrXYmz.js → run-czitDqud.js} +1 -1
  62. package/dist/ui/assets/{session-freezer-CcmV_y6V.js → session-freezer-Cg8JbMxX.js} +3 -3
  63. package/dist/ui/assets/{setup-feature-flags-remote-BUVzW-8N.js → setup-feature-flags-remote-B_hTnn3Q.js} +1 -1
  64. package/dist/ui/assets/{setup-standalone-prelude-OwqR_Yuo.js → setup-standalone-prelude-CWEAAw7h.js} +1 -1
  65. package/dist/ui/assets/{setup-sudo-Baouj9Bk.js → setup-sudo-ZkvaRNmm.js} +2 -2
  66. package/dist/ui/assets/{skills-CQj4SPDp.js → skills-Bcw1p2tI.js} +1 -1
  67. package/dist/ui/assets/slicc-version-BZefq3Mk.js +1 -0
  68. package/dist/ui/assets/sprinkle-components-CnBwNM6o.css +1 -0
  69. package/dist/ui/assets/{state-CghWg_Kw.js → state-LDqsPBxJ.js} +1 -1
  70. package/dist/ui/assets/{store-Dl-OYaSV.js → store-DkIaF7uq.js} +1 -1
  71. package/dist/ui/assets/{store-gvOC7Lmj.js → store-n4nzO2R4.js} +1 -1
  72. package/dist/ui/assets/{style-guide-Bgzsk7bf.js → style-guide-BXma5vDN.js} +2 -0
  73. package/dist/ui/assets/{sudo-BHrJ0pDh.js → sudo-D_A1VAiv.js} +1 -1
  74. package/dist/ui/assets/{tokens-Drbn7djl.css → tokens-FjEJwUyJ.css} +1 -1
  75. package/dist/ui/assets/{upgrade-detection-CiGs_jPp.js → upgrade-detection-Cc_AO_g_.js} +1 -1
  76. package/dist/ui/assets/{wc-attach-BTwhdveb.js → wc-attach-CJi8w0io.js} +2 -2
  77. package/dist/ui/assets/{wc-extension-BfUkz-HX.js → wc-extension-BCgMujQH.js} +2 -2
  78. package/dist/ui/assets/{wc-float-label-D8jbiKPt.js → wc-float-label-Y_qKBmxa.js} +1 -1
  79. package/dist/ui/assets/{wc-floatbar-online-CEXclrfN.js → wc-floatbar-online-DnS44ghj.js} +1 -1
  80. package/dist/ui/assets/{wc-follower-oauth-DAzZYGjh.js → wc-follower-oauth-sOkPkY_L.js} +1 -1
  81. package/dist/ui/assets/{wc-follower-C-Ejb2MU.js → wc-follower-rs3oFOdy.js} +3 -3
  82. package/dist/ui/assets/{wc-live-CJTVhCzY.js → wc-live-DkVXbTow.js} +4 -4
  83. package/dist/ui/assets/{wc-nav-nf4MwQVm.js → wc-nav-Ca4YwbPX.js} +2 -2
  84. package/dist/ui/assets/{wc-onboarding-Bi2JZ0qd.js → wc-onboarding-AKfdCWlj.js} +2 -2
  85. package/dist/ui/assets/{wc-placeholder-CNr8ACxD.js → wc-placeholder-BHwcaeI6.js} +2 -2
  86. package/dist/ui/assets/{wc-settings-C07YcGBL.js → wc-settings-B_DygKjz.js} +2 -2
  87. package/dist/ui/assets/{wc-shell-CO135SLj.js → wc-shell-CLWeEjhz.js} +10 -3
  88. package/dist/ui/assets/{wc-shortcut-config-BqJ_oRIq.js → wc-shortcut-config-Dv1Q-J84.js} +1 -1
  89. package/dist/ui/assets/{wc-sprinkles-D8kYOeh_.js → wc-sprinkles-CmAZfPmr.js} +2 -2
  90. package/dist/ui/assets/{wc-tray-BHQm7jst.js → wc-tray-wPUoPcs2.js} +4 -4
  91. package/dist/ui/assets/{xai-grok-BeET6lOL.js → xai-grok-oOuoY7Mj.js} +1 -1
  92. package/dist/ui/assets/{xai-grok-B1G96fYR.js → xai-grok-xHaLFJXt.js} +1 -1
  93. package/dist/ui/index.html +6 -6
  94. package/dist/ui/packages/webapp/index.html +6 -6
  95. package/package.json +1 -1
  96. package/dist/ui/assets/backend-hostfs-CciGcalA.js +0 -1
  97. package/dist/ui/assets/backend-hostfs-In96W2M8.js +0 -1
  98. package/dist/ui/assets/provider-store-access-DGPvTOHA.js +0 -1
  99. package/dist/ui/assets/slicc-version-CRzt7Voe.js +0 -1
  100. package/dist/ui/assets/sprinkle-components-Bqvrxol0.css +0 -1
package/README.md CHANGED
@@ -81,7 +81,7 @@ SLICC is for you if:
81
81
  - **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`.
82
82
  - **Delegate parallel work to scoops.** Split tasks into isolated sub-agents with their own sandboxes and context, then let the main agent coordinate the results.
83
83
  - **Turn one-off wins into reusable workflows.** Package behavior as skills, build interactive sprinkles, and react to external events with webhooks and cron-driven licks.
84
- - **Mount your local file system.** By default, SLICC is confined to your browser. But you can ask it to mount folders from your local file system, so it can read and write from there. Mount into an empty path such as `/mnt/myproject` so you do not hide existing skills or scripts. Picker mounts ask again after a page reload; for folders you always want available, map them in the launcher's mount table (`npx slicc --mount=~/Projects/foo:/mnt/foo`, or Settings → Mounts in Sliccstart.app) and they are mounted automatically on every launch, with no picker or permission prompt — see [Auto-mounted host folders](docs/mounts.md#auto-mounted-host-folders-the-mount-table).
84
+ - **Mount your local file system.** By default, SLICC is confined to your browser. But you can ask it to mount folders from your local file system, so it can read and write from there. Mount into an empty path such as `/mnt/myproject` so you do not hide existing skills or scripts. Tear one down with `umount /mnt/myproject` (or the longer `mount unmount /mnt/myproject`). Picker mounts ask again after a page reload; for folders you always want available, map them in the launcher's mount table (`npx slicc --mount=~/Projects/foo:/mnt/foo`, or Settings → Mounts in Sliccstart.app) and they are mounted automatically on every launch, with no picker or permission prompt — see [Auto-mounted host folders](docs/mounts.md#auto-mounted-host-folders-the-mount-table).
85
85
  - **Mount remote storage as if it were local.** Beyond local folders, `mount --source` bridges S3 buckets, S3-compatible services like Cloudflare R2 and MinIO, and Adobe authoring content — both da.live repositories and Helix 6 sites on the AEM Source Bus — into the same VFS surface. Reads use TTL+ETag caching with conditional revalidation; writes use ETag-conditional PUTs that surface concurrent-edit conflicts as `EBUSY`. Credentials live server-side (`~/.slicc/secrets.env` in CLI, `chrome.storage.local` in the extension via the **Extension options** page) and never reach the agent. After setup: `mount --source s3://my-bucket --profile r2 /mnt/r2`, `mount --source da://my-org/my-repo /mnt/da`, or `mount --source aem://my-org/my-site /mnt/aem`. A `da://` source checks the site config first and re-routes to the Source Bus when the site has been upgraded to Helix 6, rather than quietly mounting a store that no longer holds its content. See [docs/mounts.md](docs/mounts.md) for the full guide.
86
86
 
87
87
  ## Getting started
@@ -89,7 +89,7 @@ export declare function isHostFsStableBodyRequest(req: {
89
89
  *
90
90
  * POST /api/hostfs ← { op, mount, path, to?, recursive? }
91
91
  * GET /api/hostfs/list?mount=&path= → { entries: [...] }
92
- * GET /api/hostfs/stat?mount=&path= → { kind, size, mtime }
92
+ * GET /api/hostfs/stat?mount=&path= → { kind, size, mtime, ctime, ino, uid, gid, mode }
93
93
  * GET /api/hostfs/read?mount=&path= → octet-stream body
94
94
  * PUT /api/hostfs/write?mount=&path= ← octet-stream body
95
95
  * POST /api/hostfs/mkdir?mount=&path=
@@ -114,11 +114,38 @@ export async function resolveWithinRoot(root, relPath) {
114
114
  }
115
115
  return target;
116
116
  }
117
+ /**
118
+ * Identity/permission fields of a host `fs.Stats`, as the webapp needs them.
119
+ *
120
+ * isomorphic-git's `compareStats` decides whether a working-tree file is
121
+ * still the one the index recorded by comparing mode, mtime, ctime, uid,
122
+ * gid, ino and size. The bridge used to report only `{kind,size,mtime}`, so
123
+ * the comparison was stale for EVERY file — every read-only git command
124
+ * re-hashed the whole tree and rewrote `.git/index` once per file
125
+ * (issue #2708). `mode` is the full `st_mode` (type bits included), so the
126
+ * executable bit survives instead of being flattened to `100644`.
127
+ *
128
+ * Timestamps go over the wire UNROUNDED. isomorphic-git derives the seconds
129
+ * it compares with `Math.floor(ms / 1000)`, so rounding a `.9996 s` stat up
130
+ * lands it in the NEXT second, disagrees with the seconds native git wrote,
131
+ * and makes that one file stale on every single walk. Never round up; JSON
132
+ * carries the fractional double fine.
133
+ */
134
+ function statIdentity(s) {
135
+ return {
136
+ ctime: s.ctimeMs,
137
+ ino: Number(s.ino),
138
+ uid: s.uid,
139
+ gid: s.gid,
140
+ mode: s.mode,
141
+ };
142
+ }
117
143
  function statPayload(s) {
118
144
  return {
119
145
  kind: s.isDirectory() ? 'directory' : 'file',
120
146
  size: s.isDirectory() ? 0 : s.size,
121
- mtime: Math.round(s.mtimeMs),
147
+ mtime: s.mtimeMs,
148
+ ...statIdentity(s),
122
149
  };
123
150
  }
124
151
  /**
@@ -227,7 +254,8 @@ async function listOp(target) {
227
254
  name: d.name,
228
255
  kind: 'file',
229
256
  size: s.size,
230
- lastModified: Math.round(s.mtimeMs),
257
+ lastModified: s.mtimeMs,
258
+ ...statIdentity(s),
231
259
  };
232
260
  }
233
261
  catch {
@@ -237,6 +265,7 @@ async function listOp(target) {
237
265
  }));
238
266
  return { entries };
239
267
  }
268
+ /** Shared by the stable dispatcher and `GET /api/hostfs/stat` — same payload. */
240
269
  async function statOp(target) {
241
270
  return statPayload(await stat(target));
242
271
  }
@@ -261,7 +290,7 @@ async function removeOp(target, recursive, roots) {
261
290
  *
262
291
  * POST /api/hostfs ← { op, mount, path, to?, recursive? }
263
292
  * GET /api/hostfs/list?mount=&path= → { entries: [...] }
264
- * GET /api/hostfs/stat?mount=&path= → { kind, size, mtime }
293
+ * GET /api/hostfs/stat?mount=&path= → { kind, size, mtime, ctime, ino, uid, gid, mode }
265
294
  * GET /api/hostfs/read?mount=&path= → octet-stream body
266
295
  * PUT /api/hostfs/write?mount=&path= ← octet-stream body
267
296
  * POST /api/hostfs/mkdir?mount=&path=