sliccy 6.120.2 → 6.122.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 (124) hide show
  1. package/dist/node-server/_shared/tray-signaling.d.ts +17 -0
  2. package/dist/node-server/_shared/tray-signaling.d.ts.map +1 -1
  3. package/dist/node-server/_shared/tray-signaling.js.map +1 -1
  4. package/dist/node-server/electron-tray-follower.d.ts +25 -8
  5. package/dist/node-server/electron-tray-follower.js +41 -9
  6. package/dist/node-server/hostfs-watch.d.ts +49 -0
  7. package/dist/node-server/hostfs-watch.js +125 -0
  8. package/dist/node-server/hostfs.d.ts +1 -2
  9. package/dist/node-server/index.js +10 -2
  10. package/dist/ui/.vite/manifest.json +155 -149
  11. package/dist/ui/assets/SKILL-CxxQT4Lx.js +75 -0
  12. package/dist/ui/assets/{account-store-D8X8RQZj.js → account-store-BeWWaisz.js} +1 -1
  13. package/dist/ui/assets/{account-store-SfugZBaZ.js → account-store-CrzQRVmk.js} +1 -1
  14. package/dist/ui/assets/{adobe-B1_spvgg.js → adobe-CU3EGPi1.js} +1 -1
  15. package/dist/ui/assets/{adobe-DgFjVD8s.js → adobe-CmJQOCEG.js} +1 -1
  16. package/dist/ui/assets/{agent-bridge-4QgeYgVw.js → agent-bridge-CxtEwZsO.js} +1 -1
  17. package/dist/ui/assets/{agent-panels-CLOQvNwx.js → agent-panels-D2g8j4Sb.js} +1 -1
  18. package/dist/ui/assets/{apply-layout-DtyAl0hp.js → apply-layout-M6igfUeQ.js} +1 -1
  19. package/dist/ui/assets/{apps-BEPPgN9K.js → apps-Dcr6dP3A.js} +1 -1
  20. package/dist/ui/assets/{auto-mount-table-gDMh6Ti9.js → auto-mount-table-C6w-8e_I.js} +1 -1
  21. package/dist/ui/assets/{azure-openai-B9P8QsP6.js → azure-openai-B2ax_lID.js} +1 -1
  22. package/dist/ui/assets/{azure-openai-CyZ9Ui4d.js → azure-openai-BtyN3IoK.js} +1 -1
  23. package/dist/ui/assets/backend-hostfs-CXNSj93M.js +1 -0
  24. package/dist/ui/assets/backend-hostfs-ZVYICVoE.js +1 -0
  25. package/dist/ui/assets/{cost-command-XUDMFE1u.js → browser-q8slJ96R.js} +645 -659
  26. package/dist/ui/assets/{bsh-watchdog-COvv_9Ni.js → bsh-watchdog-ClhQZQ2p.js} +1 -1
  27. package/dist/ui/assets/{cerebras-D7-dD3gu.js → cerebras-BsKWOUNG.js} +1 -1
  28. package/dist/ui/assets/{cerebras-CRXRLx94.js → cerebras-DUaxfafs.js} +1 -1
  29. package/dist/ui/assets/{connect-surface-6rLgBphF.js → connect-surface-DVIB7kxf.js} +1 -1
  30. package/dist/ui/assets/{core-Bh-r--NI.js → core-C2Fzha9I.js} +1 -1
  31. package/dist/ui/assets/cost-command-Ds2LwRkA.js +15 -0
  32. package/dist/ui/assets/{directed-approval-DVuDWoI8.js → directed-approval-Dm0LtHV8.js} +1 -1
  33. package/dist/ui/assets/{ensure-speech-assets-CmarhXRU.js → ensure-speech-assets-BBbl4aXA.js} +1 -1
  34. package/dist/ui/assets/{esbuild-wasm-Dl3vgXvq.js → esbuild-wasm-PXHRTefD.js} +1 -1
  35. package/dist/ui/assets/ffmpeg-command-eHNhx1yC.js +66 -0
  36. package/dist/ui/assets/{fs-ChWHUqpw.js → fs-BkxAKjex.js} +2 -2
  37. package/dist/ui/assets/{fs-BTApuFnn.js → fs-C3q6Q4sP.js} +1 -1
  38. package/dist/ui/assets/{github-Bhe4r8yT.js → github-BcG9_uX5.js} +2 -2
  39. package/dist/ui/assets/{github-D-jaY3WO.js → github-C-8X0lJB.js} +1 -1
  40. package/dist/ui/assets/{github-copilot-BJLiYTwN.js → github-copilot-DNYQa3vN.js} +1 -1
  41. package/dist/ui/assets/{github-copilot-DlCLP45Y.js → github-copilot-OGxtOON4.js} +1 -1
  42. package/dist/ui/assets/{github-install-DRi0MxS5.js → github-install-ByCG7pmU.js} +1 -1
  43. package/dist/ui/assets/{github-zip-49aLHvK_.js → github-zip-Dy4vkVfQ.js} +1 -1
  44. package/dist/ui/assets/{guest-tool-gate-DHUAohY8.js → guest-tool-gate-CW5Twbdj.js} +1 -1
  45. package/dist/ui/assets/{help-Cejd-G4M.js → help-xL2fSGd3.js} +1 -1
  46. package/dist/ui/assets/{installer-VcJEC2uC.js → installer-CPS-l1D-.js} +1 -1
  47. package/dist/ui/assets/{js-realm-worker-v2sDXVV_.js → js-realm-worker-prMqenKt.js} +1 -1
  48. package/dist/ui/assets/{kernel-worker-BOCtSlib.js → kernel-worker-DdroKmZo.js} +590 -655
  49. package/dist/ui/assets/lick-ws-bridge-CTypKosM.js +1 -0
  50. package/dist/ui/assets/{local-llm-DJoZEkZd.js → local-llm-D0mTvY7N.js} +1 -1
  51. package/dist/ui/assets/{local-llm-CXdmEK1l.js → local-llm-Drh6gTi0.js} +1 -1
  52. package/dist/ui/assets/{magick-wasm-Cjkds07K.js → magick-wasm-nq7J_5Mo.js} +1 -1
  53. package/dist/ui/assets/{main-CCHqhiJh.js → main-DSsincSj.js} +3 -3
  54. package/dist/ui/assets/{mount-D-wnvlrs.js → mount-CxIOoyoX.js} +2 -2
  55. package/dist/ui/assets/{mount-pXCQxF8h.js → mount-DnkQM4H_.js} +3 -3
  56. package/dist/ui/assets/{mount-recovery-CyIGmO6c.js → mount-recovery-pP0t0B5R.js} +1 -1
  57. package/dist/ui/assets/{new-session-5m_j1Lxi.js → new-session-TJkrfdmM.js} +2 -2
  58. package/dist/ui/assets/{oauth-bootstrap-CvcoHHSK.js → oauth-bootstrap-Cflkal2z.js} +2 -2
  59. package/dist/ui/assets/{openai-codex-B49_Vaav.js → openai-codex-LMiNXBpR.js} +1 -1
  60. package/dist/ui/assets/{openai-codex-DeaaiupD.js → openai-codex-WrMiquZ6.js} +1 -1
  61. package/dist/ui/assets/{openrouter-_anKkItD.js → openrouter-CF6GBIsh.js} +1 -1
  62. package/dist/ui/assets/{openrouter-D5lnyZIJ.js → openrouter-Y72OhjGZ.js} +1 -1
  63. package/dist/ui/assets/{openrouter-oauth-C32O4TGi.js → openrouter-oauth-iH7sVKzz.js} +1 -1
  64. package/dist/ui/assets/{openrouter-oauth-8Eifd0jg.js → openrouter-oauth-pLAIH3V3.js} +1 -1
  65. package/dist/ui/assets/{panel-rpc-handlers-B2rQwK-2.js → panel-rpc-handlers-E0Tvr752.js} +2 -2
  66. package/dist/ui/assets/{panelize-shell-rCfy6UTW.js → panelize-shell-Hn2-TJc6.js} +1 -1
  67. package/dist/ui/assets/{provider-BaPrv5Xx.js → provider-BxxPfI5S.js} +1 -1
  68. package/dist/ui/assets/{provider-BXp0BGZ2.js → provider-DZDGqjz1.js} +2 -2
  69. package/dist/ui/assets/{provider-settings-DdUjJgCk.js → provider-settings-BFUPdbhi.js} +1 -1
  70. package/dist/ui/assets/{provider-settings--fUWXqNi.js → provider-settings-Cr_y3ZO3.js} +1 -1
  71. package/dist/ui/assets/{provider-store-access-KNXv1l8_.js → provider-store-access-BgIb6-X8.js} +2 -2
  72. package/dist/ui/assets/provider-store-access-CJG-qJev.js +1 -0
  73. package/dist/ui/assets/{providers-5omoknr0.js → providers-Dz3RSRQx.js} +2 -2
  74. package/dist/ui/assets/{providers-BArdfPc3.js → providers-Rty0Ovfq.js} +1 -1
  75. package/dist/ui/assets/{quick-llm-BTT8VKf1.js → quick-llm-CvqNttpI.js} +1 -1
  76. package/dist/ui/assets/{recovery-screen-CgEKoDNt.js → recovery-screen-DX5Owqre.js} +1 -1
  77. package/dist/ui/assets/{redirect-uri-DgtoEJmu.js → redirect-uri-DEWLoW8H.js} +1 -1
  78. package/dist/ui/assets/remote-cache-3KNT1gsp.js +1 -0
  79. package/dist/ui/assets/{remote-cache-JAv9sQH_.js → remote-cache-BE5T1-53.js} +1 -1
  80. package/dist/ui/assets/{run-DkPJk9Ps.js → run-5X_LUY3w.js} +2 -2
  81. package/dist/ui/assets/run-B0Qw82nE.js +42 -0
  82. package/dist/ui/assets/{run-DT1YSMf5.js → run-BcjWAfpv.js} +1 -1
  83. package/dist/ui/assets/{session-freezer-Cju1rG12.js → session-freezer-DK9G_IkB.js} +3 -3
  84. package/dist/ui/assets/{setup-feature-flags-remote-D3SmmUZq.js → setup-feature-flags-remote-BcUIm2b6.js} +1 -1
  85. package/dist/ui/assets/{setup-standalone-prelude-Xd3afxoD.js → setup-standalone-prelude-l7nnbPF5.js} +1 -1
  86. package/dist/ui/assets/{setup-sudo-OGVmwMl-.js → setup-sudo-BSQT2Dh-.js} +2 -2
  87. package/dist/ui/assets/{shared-CPVZc-MN.js → shared-URkGo6WP.js} +4 -4
  88. package/dist/ui/assets/{skills-CxfRrpAT.js → skills-CnWQfgYe.js} +1 -1
  89. package/dist/ui/assets/slicc-version-B8zEDiZF.js +1 -0
  90. package/dist/ui/assets/{snapshot-D2clR32B.js → snapshot-DWBFaMd4.js} +1 -1
  91. package/dist/ui/assets/{snapshot-features-5xPjvu_j.js → snapshot-features-c8X_wCzy.js} +1 -1
  92. package/dist/ui/assets/{state-CGXdxknG.js → state-UQWwnZ8X.js} +1 -1
  93. package/dist/ui/assets/{store-DjqBL5CO.js → store-B-BowqJY.js} +1 -1
  94. package/dist/ui/assets/{store-Cl6xmSWa.js → store-D426O4iV.js} +1 -1
  95. package/dist/ui/assets/{sudo-Ce04Ty7p.js → sudo-B8CRodhJ.js} +1 -1
  96. package/dist/ui/assets/{tray-sidecar-DELq6UY1.js → tray-sidecar-au4iFVvJ.js} +1 -1
  97. package/dist/ui/assets/tray-webrtc-CThDQcWx.js +1 -0
  98. package/dist/ui/assets/{upgrade-detection-CJVRd1Xz.js → upgrade-detection-WvRCLHXP.js} +1 -1
  99. package/dist/ui/assets/{wc-attach-CDWiDrxB.js → wc-attach-CQIHVqTH.js} +2 -2
  100. package/dist/ui/assets/{wc-extension-D5QaEq9K.js → wc-extension-DDlPWYwq.js} +2 -2
  101. package/dist/ui/assets/{wc-float-label-CyWrTj5p.js → wc-float-label-CE5oCxJ4.js} +1 -1
  102. package/dist/ui/assets/{wc-floatbar-online-f81QZ57b.js → wc-floatbar-online-BBRpuOSH.js} +1 -1
  103. package/dist/ui/assets/{wc-follower-Di5kkRYo.js → wc-follower-TkW182aB.js} +3 -3
  104. package/dist/ui/assets/{wc-follower-oauth-CstFIMRH.js → wc-follower-oauth-BPhDEzGv.js} +1 -1
  105. package/dist/ui/assets/{wc-live-CxM9G2_r.js → wc-live-8nXQgC09.js} +4 -4
  106. package/dist/ui/assets/{wc-nav-DDcPc4RZ.js → wc-nav-DjyjVmrX.js} +2 -2
  107. package/dist/ui/assets/{wc-onboarding-gdwRiuno.js → wc-onboarding-xIF0sbif.js} +2 -2
  108. package/dist/ui/assets/{wc-placeholder-DWyjjnMo.js → wc-placeholder-v2B6i349.js} +2 -2
  109. package/dist/ui/assets/{wc-settings-BqpXd3aC.js → wc-settings-DvrfTqdG.js} +2 -2
  110. package/dist/ui/assets/{wc-shell-zAMezdgn.js → wc-shell-CxUba4CU.js} +226 -174
  111. package/dist/ui/assets/{wc-shortcut-config-C4_oA-Bw.js → wc-shortcut-config-BLk3x477.js} +1 -1
  112. package/dist/ui/assets/{wc-sprinkles-Cot4K4eb.js → wc-sprinkles-IRaAZH5E.js} +2 -2
  113. package/dist/ui/assets/{wc-tray-J1eWS9EM.js → wc-tray-DCHo1uuz.js} +4 -4
  114. package/dist/ui/assets/{xai-grok-Bxqaozwj.js → xai-grok-BnPIwUZr.js} +1 -1
  115. package/dist/ui/assets/{xai-grok-CqlBiLGH.js → xai-grok-Dgkd5vUZ.js} +1 -1
  116. package/dist/ui/index.html +6 -6
  117. package/dist/ui/packages/webapp/index.html +6 -6
  118. package/package.json +2 -2
  119. package/dist/ui/assets/backend-hostfs-D7L9KrlQ.js +0 -1
  120. package/dist/ui/assets/backend-hostfs-MpP40IA8.js +0 -1
  121. package/dist/ui/assets/lick-ws-bridge-BD2lQGbd.js +0 -1
  122. package/dist/ui/assets/provider-store-access-CP9d_CSa.js +0 -1
  123. package/dist/ui/assets/slicc-version-D7xLOkdb.js +0 -1
  124. package/dist/ui/assets/tray-webrtc-DfkvaMcO.js +0 -1
@@ -387,6 +387,23 @@ export type FollowerAttachResult = {
387
387
  code: 'INVALID_JOIN_CAPABILITY' | 'TRAY_EXPIRED';
388
388
  error: string;
389
389
  } | {
390
+ /**
391
+ * The tray moved. Rides on an HTTP 308 whose `Location` and
392
+ * `successor-version` link both name `joinUrl` (#1957), so this body is
393
+ * only ever observed by a client that suppressed redirect-following.
394
+ */
395
+ action: 'redirect';
396
+ code: 'TRAY_SUPERSEDED';
397
+ error: string;
398
+ joinUrl: string;
399
+ } | {
400
+ /**
401
+ * The pre-#1957 supersede shape, on HTTP 409. Still emitted when the
402
+ * stored replacement does not parse as a URL — there is nowhere to
403
+ * redirect to, so the outcome really is terminal — and still accepted
404
+ * because a current client may be talking to a hub that predates the
405
+ * flip.
406
+ */
390
407
  action: 'fail';
391
408
  code: 'TRAY_SUPERSEDED';
392
409
  error: string;
@@ -1 +1 @@
1
- {"version":3,"file":"tray-signaling.d.ts","sourceRoot":"","sources":["../src/tray-signaling.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tray-signaling.d.ts","sourceRoot":"","sources":["../src/tray-signaling.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tray-signaling.js","sourceRoot":"","sources":["../src/tray-signaling.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tray-signaling.js","sourceRoot":"","sources":["../src/tray-signaling.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,15 @@ import { type FederatedCdpInspectableTarget } from './electron-federated-cdp.js'
4
4
  export declare const TRAY_CONTROL_CHANNEL_LABEL = "tray-control";
5
5
  /** Runtime tag advertised on attach + `hello`. */
6
6
  export declare const FOLLOWER_RUNTIME_TAG = "slicc-electron";
7
+ /**
8
+ * The replacement join URL carried by a suppressed 3xx, or null. The hub's
9
+ * `Location` carries `json=true` (#1957) because platforms that auto-follow the
10
+ * redirect need it; this client re-appends nothing, so the parameter is dropped
11
+ * here rather than persisted into the next signaling client's join URL. A
12
+ * relative or unparseable target yields null, which the caller treats as "no
13
+ * replacement named" — never as a hop to a nonexistent tray.
14
+ */
15
+ export declare function redirectLocation(status: number, location: string | null): string | null;
7
16
  interface IceServerConfig {
8
17
  urls: string | string[];
9
18
  username?: string;
@@ -42,10 +51,17 @@ export declare class TrayFollowerSignaling {
42
51
  /**
43
52
  * Attach to the tray. Unlike poll/answer/ice, this tolerates a non-OK status
44
53
  * and returns the decoded body: the tray signals `TRAY_SUPERSEDED` with an
45
- * HTTP 409 + a replacement `joinUrl`, and `wait` plans (leader not yet
46
- * elected/connected) can also arrive on a non-2xx status. Throwing before
47
- * decoding — as `post()` does — would strand the follower on both.
48
- * `attachWithRedirects` interprets `result.code` / `result.action`.
54
+ * HTTP 308 + a replacement `joinUrl` (409 on hubs that predate #1957), and
55
+ * `wait` plans (leader not yet elected/connected) can also arrive on a
56
+ * non-2xx status. Throwing before decoding — as `post()` does — would strand
57
+ * the follower on both. `attachWithRedirects` interprets `result.code` /
58
+ * `result.action`.
59
+ *
60
+ * `redirect: 'manual'` keeps the supersede hop ours: undici surfaces the 308
61
+ * itself, headers intact, so `attachWithRedirects` keeps its own hop bound
62
+ * and reconstructs its signaling client against the replacement. Letting
63
+ * undici follow it instead would connect but leave `this.signaling` pointed
64
+ * at the dead tray, re-hopping on every reconnect for the rest of the run.
49
65
  */
50
66
  attach(controllerId: string, runtime: string): Promise<{
51
67
  status: number;
@@ -102,10 +118,11 @@ export declare class ElectronTrayFollower {
102
118
  /**
103
119
  * Attach to the tray, resolving the non-terminal attach outcomes the worker
104
120
  * returns before a bootstrap is available:
105
- * - superseded (HTTP 409 + `joinUrl`, and/or a `successor-version` `Link`
106
- * header): the leader reconnected onto a fresh tray follow the redirect
107
- * (bounded hops). The link alone is enough, so a body shape this client
108
- * does not recognize is not a dead end (#1957).
121
+ * - superseded (HTTP 308 + `Location`, plus a `successor-version` `Link`
122
+ * header and a `joinUrl` in the body; 409 on hubs that predate #1957): the
123
+ * leader reconnected onto a fresh tray follow the redirect (bounded
124
+ * hops). Any one of the three is enough, so a body shape this client does
125
+ * not recognize is not a dead end (#1957).
109
126
  * - `wait` (leader not yet elected/connected, carries `retryAfterMs`): sleep
110
127
  * then re-attach (bounded), as the shared Swift/Go followers do — otherwise
111
128
  * a follower that raced leader election resolves "started" but is never
@@ -29,6 +29,26 @@ const SIGNALLING_TIMEOUT_MS = 10_000;
29
29
  /** Bound on the bootstrap-event de-dup set so a long-lived follower can't grow
30
30
  * it without limit (`cursor` already gates re-delivery; this is belt-only). */
31
31
  const MAX_SEEN_EVENTS = 512;
32
+ /**
33
+ * The replacement join URL carried by a suppressed 3xx, or null. The hub's
34
+ * `Location` carries `json=true` (#1957) because platforms that auto-follow the
35
+ * redirect need it; this client re-appends nothing, so the parameter is dropped
36
+ * here rather than persisted into the next signaling client's join URL. A
37
+ * relative or unparseable target yields null, which the caller treats as "no
38
+ * replacement named" — never as a hop to a nonexistent tray.
39
+ */
40
+ export function redirectLocation(status, location) {
41
+ if (status < 300 || status >= 400 || !location)
42
+ return null;
43
+ try {
44
+ const url = new URL(location);
45
+ url.searchParams.delete('json');
46
+ return url.toString();
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
32
52
  /** Minimal tray follower-bootstrap signalling client (mirrors slicc-cli's
33
53
  * `internal/signaling`): POSTs join/poll/answer/ice to the join URL. */
34
54
  export class TrayFollowerSignaling {
@@ -52,16 +72,24 @@ export class TrayFollowerSignaling {
52
72
  /**
53
73
  * Attach to the tray. Unlike poll/answer/ice, this tolerates a non-OK status
54
74
  * and returns the decoded body: the tray signals `TRAY_SUPERSEDED` with an
55
- * HTTP 409 + a replacement `joinUrl`, and `wait` plans (leader not yet
56
- * elected/connected) can also arrive on a non-2xx status. Throwing before
57
- * decoding — as `post()` does — would strand the follower on both.
58
- * `attachWithRedirects` interprets `result.code` / `result.action`.
75
+ * HTTP 308 + a replacement `joinUrl` (409 on hubs that predate #1957), and
76
+ * `wait` plans (leader not yet elected/connected) can also arrive on a
77
+ * non-2xx status. Throwing before decoding — as `post()` does — would strand
78
+ * the follower on both. `attachWithRedirects` interprets `result.code` /
79
+ * `result.action`.
80
+ *
81
+ * `redirect: 'manual'` keeps the supersede hop ours: undici surfaces the 308
82
+ * itself, headers intact, so `attachWithRedirects` keeps its own hop bound
83
+ * and reconstructs its signaling client against the replacement. Letting
84
+ * undici follow it instead would connect but leave `this.signaling` pointed
85
+ * at the dead tray, re-hopping on every reconnect for the rest of the run.
59
86
  */
60
87
  async attach(controllerId, runtime) {
61
88
  const res = await this.fetchImpl(this.joinUrl, {
62
89
  method: 'POST',
63
90
  headers: { 'content-type': 'application/json' },
64
91
  body: JSON.stringify({ controllerId, runtime }),
92
+ redirect: 'manual',
65
93
  signal: AbortSignal.timeout(SIGNALLING_TIMEOUT_MS),
66
94
  });
67
95
  let body = {};
@@ -77,7 +105,10 @@ export class TrayFollowerSignaling {
77
105
  return {
78
106
  status: res.status,
79
107
  body,
80
- supersededByJoinUrl: successorVersionFromLinkHeader(res.headers.get('Link')),
108
+ // The link is preferred over `Location`: it is the canonical join URL,
109
+ // while `Location` carries the hub's `json=true` probe parameter (#1957).
110
+ supersededByJoinUrl: successorVersionFromLinkHeader(res.headers.get('Link')) ??
111
+ redirectLocation(res.status, res.headers.get('Location')),
81
112
  };
82
113
  }
83
114
  poll(controllerId, bootstrapId, cursor) {
@@ -134,10 +165,11 @@ export class ElectronTrayFollower {
134
165
  /**
135
166
  * Attach to the tray, resolving the non-terminal attach outcomes the worker
136
167
  * returns before a bootstrap is available:
137
- * - superseded (HTTP 409 + `joinUrl`, and/or a `successor-version` `Link`
138
- * header): the leader reconnected onto a fresh tray follow the redirect
139
- * (bounded hops). The link alone is enough, so a body shape this client
140
- * does not recognize is not a dead end (#1957).
168
+ * - superseded (HTTP 308 + `Location`, plus a `successor-version` `Link`
169
+ * header and a `joinUrl` in the body; 409 on hubs that predate #1957): the
170
+ * leader reconnected onto a fresh tray follow the redirect (bounded
171
+ * hops). Any one of the three is enough, so a body shape this client does
172
+ * not recognize is not a dead end (#1957).
141
173
  * - `wait` (leader not yet elected/connected, carries `retryAfterMs`): sleep
142
174
  * then re-attach (bounded), as the shared Swift/Go followers do — otherwise
143
175
  * a follower that raced leader election resolves "started" but is never
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Watch configured hostfs mount roots and broadcast `hostfs_invalidate`
3
+ * over `/licks-ws` so the webapp can drop RemoteMountCache keys when the
4
+ * OS changes a file outside SLICC (Finder, another editor, git on the host).
5
+ *
6
+ * Uses `fs.watch({ recursive: true })` (Node ≥ 19.1 on Linux; long-supported
7
+ * on macOS/Windows). Events are debounced per mount and coalesced into one
8
+ * broadcast; a storm larger than {@link MAX_PATHS_PER_EVENT} clears the whole
9
+ * mount cache instead of shipping a huge path list.
10
+ */
11
+ import { watch } from 'fs';
12
+ import type { HostMountRoot } from './hostfs.js';
13
+ /** Coalesce bursty FSEvents into one WS message. */
14
+ export declare const HOSTFS_WATCH_DEBOUNCE_MS = 75;
15
+ /**
16
+ * Above this many distinct relative paths in one debounce window, broadcast
17
+ * an empty `paths` list (= clear the whole mount cache).
18
+ */
19
+ export declare const MAX_PATHS_PER_EVENT = 64;
20
+ export interface HostfsInvalidateBroadcast {
21
+ type: 'hostfs_invalidate';
22
+ mount: string;
23
+ paths: string[];
24
+ timestamp: string;
25
+ }
26
+ export interface HostFsWatchHandle {
27
+ /** Stop every watcher. Idempotent. */
28
+ stop(): void;
29
+ }
30
+ export interface StartHostFsWatchersOptions {
31
+ debounceMs?: number;
32
+ maxPathsPerEvent?: number;
33
+ /** Injectable for tests. */
34
+ watchFn?: typeof watch;
35
+ setTimeoutFn?: typeof setTimeout;
36
+ clearTimeoutFn?: typeof clearTimeout;
37
+ }
38
+ /**
39
+ * Map an `fs.watch` filename (relative to the watched root, or absolute on
40
+ * some platforms) onto a mount-relative POSIX path. Empty string asks the
41
+ * client to clear the mount when the event cannot be attributed safely.
42
+ */
43
+ export declare function toMountRelativePath(root: string, filename: string | null | undefined): string | null;
44
+ export declare function buildHostfsInvalidateEvent(mount: string, paths: Iterable<string>, maxPaths?: number): HostfsInvalidateBroadcast;
45
+ /**
46
+ * Start one recursive watcher per mount root. Failures to open a watcher
47
+ * are logged and skipped — a missing watch must not take the /api surface down.
48
+ */
49
+ export declare function startHostFsWatchers(roots: readonly HostMountRoot[], broadcast: (event: HostfsInvalidateBroadcast) => void, opts?: StartHostFsWatchersOptions): HostFsWatchHandle;
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Watch configured hostfs mount roots and broadcast `hostfs_invalidate`
3
+ * over `/licks-ws` so the webapp can drop RemoteMountCache keys when the
4
+ * OS changes a file outside SLICC (Finder, another editor, git on the host).
5
+ *
6
+ * Uses `fs.watch({ recursive: true })` (Node ≥ 19.1 on Linux; long-supported
7
+ * on macOS/Windows). Events are debounced per mount and coalesced into one
8
+ * broadcast; a storm larger than {@link MAX_PATHS_PER_EVENT} clears the whole
9
+ * mount cache instead of shipping a huge path list.
10
+ */
11
+ import { watch } from 'fs';
12
+ import { relative, sep } from 'path';
13
+ /** Coalesce bursty FSEvents into one WS message. */
14
+ export const HOSTFS_WATCH_DEBOUNCE_MS = 75;
15
+ /**
16
+ * Above this many distinct relative paths in one debounce window, broadcast
17
+ * an empty `paths` list (= clear the whole mount cache).
18
+ */
19
+ export const MAX_PATHS_PER_EVENT = 64;
20
+ /**
21
+ * Map an `fs.watch` filename (relative to the watched root, or absolute on
22
+ * some platforms) onto a mount-relative POSIX path. Empty string asks the
23
+ * client to clear the mount when the event cannot be attributed safely.
24
+ */
25
+ export function toMountRelativePath(root, filename) {
26
+ if (filename == null || filename.length === 0)
27
+ return '';
28
+ const abs = filename.startsWith(root) ? filename : `${root}${sep}${filename}`;
29
+ let rel = relative(root, abs);
30
+ if (rel === '')
31
+ return '';
32
+ // `..data` is a valid child name; only a whole `..` segment escapes.
33
+ // Clear on a true escape rather than dropping the invalidation.
34
+ if (rel === '..' || rel.startsWith(`..${sep}`))
35
+ return '';
36
+ // Watchers may report Windows separators; the VFS / cache keys are POSIX.
37
+ rel = rel.split(sep).join('/');
38
+ return rel;
39
+ }
40
+ export function buildHostfsInvalidateEvent(mount, paths, maxPaths = MAX_PATHS_PER_EVENT) {
41
+ const unique = [...new Set(paths)];
42
+ // Empty string in the set means "unknown / whole root" — clear the mount.
43
+ if (unique.includes('') || unique.length > maxPaths) {
44
+ return {
45
+ type: 'hostfs_invalidate',
46
+ mount,
47
+ paths: [],
48
+ timestamp: new Date().toISOString(),
49
+ };
50
+ }
51
+ return {
52
+ type: 'hostfs_invalidate',
53
+ mount,
54
+ paths: unique,
55
+ timestamp: new Date().toISOString(),
56
+ };
57
+ }
58
+ /**
59
+ * Start one recursive watcher per mount root. Failures to open a watcher
60
+ * are logged and skipped — a missing watch must not take the /api surface down.
61
+ */
62
+ export function startHostFsWatchers(roots, broadcast, opts = {}) {
63
+ const debounceMs = opts.debounceMs ?? HOSTFS_WATCH_DEBOUNCE_MS;
64
+ const maxPaths = opts.maxPathsPerEvent ?? MAX_PATHS_PER_EVENT;
65
+ const watchFn = opts.watchFn ?? watch;
66
+ const setTimer = opts.setTimeoutFn ?? setTimeout;
67
+ const clearTimer = opts.clearTimeoutFn ?? clearTimeout;
68
+ const watchers = [];
69
+ const pending = new Map();
70
+ const timers = new Map();
71
+ const flush = (mount) => {
72
+ timers.delete(mount);
73
+ const paths = pending.get(mount);
74
+ pending.delete(mount);
75
+ if (!paths || paths.size === 0)
76
+ return;
77
+ broadcast(buildHostfsInvalidateEvent(mount, paths, maxPaths));
78
+ };
79
+ const note = (mount, rel) => {
80
+ if (rel === null)
81
+ return;
82
+ let set = pending.get(mount);
83
+ if (!set) {
84
+ set = new Set();
85
+ pending.set(mount, set);
86
+ }
87
+ set.add(rel);
88
+ const existing = timers.get(mount);
89
+ if (existing)
90
+ clearTimer(existing);
91
+ timers.set(mount, setTimer(() => flush(mount), debounceMs));
92
+ };
93
+ for (const { path: mount, root } of roots) {
94
+ try {
95
+ const watcher = watchFn(root, { recursive: true }, (_event, filename) => {
96
+ note(mount, toMountRelativePath(root, filename));
97
+ });
98
+ watcher.on('error', (err) => {
99
+ console.warn(`[hostfs-watch] watcher error for ${mount}:`, err);
100
+ });
101
+ watchers.push(watcher);
102
+ console.log(`[hostfs-watch] watching ${root} → ${mount}`);
103
+ }
104
+ catch (err) {
105
+ console.warn(`[hostfs-watch] failed to watch ${root} (${mount}):`, err instanceof Error ? err.message : err);
106
+ }
107
+ }
108
+ return {
109
+ stop() {
110
+ for (const t of timers.values())
111
+ clearTimer(t);
112
+ timers.clear();
113
+ pending.clear();
114
+ for (const w of watchers) {
115
+ try {
116
+ w.close();
117
+ }
118
+ catch {
119
+ /* already closed */
120
+ }
121
+ }
122
+ watchers.length = 0;
123
+ },
124
+ };
125
+ }
@@ -76,7 +76,7 @@ export declare const HOSTFS_MAX_BODY_BYTES: number;
76
76
  * to not-yet-existing paths are still validated.
77
77
  */
78
78
  export declare function resolveWithinRoot(root: string, relPath: string): Promise<string>;
79
- interface HostMountRoot {
79
+ export interface HostMountRoot {
80
80
  /** SLICC target path, e.g. /mnt/project. */
81
81
  path: string;
82
82
  /** realpath()'d OS root. */
@@ -167,4 +167,3 @@ export declare function isHostFsStableBodyRequest(req: {
167
167
  * per-op routes — so every error this route emits MUST carry a `code`.
168
168
  */
169
169
  export declare function registerHostFsRoutes(app: Express, roots: readonly HostMountRoot[]): void;
170
- export {};
@@ -31,6 +31,7 @@ import { shouldParseGlobalJson } from './fetch-proxy-headers.js';
31
31
  import { FileLogger } from './file-logger.js';
32
32
  import { registerHostedBootstrapEndpoint } from './hosted-bootstrap.js';
33
33
  import { registerHostFsRoutes, resolveHostMountRoots } from './hostfs.js';
34
+ import { startHostFsWatchers } from './hostfs-watch.js';
34
35
  import { createBridgeServer } from './http-keepalive.js';
35
36
  import { runInstallCli } from './install-cli.js';
36
37
  import { resolveCliBrowserLaunchUrl } from './launch-url.js';
@@ -1149,6 +1150,9 @@ async function main() {
1149
1150
  // Roots are resolved once at startup; a folder created later needs a restart.
1150
1151
  state.hostMountRoots = await resolveHostMountRoots(RUNTIME_FLAGS.mounts);
1151
1152
  registerHostFsRoutes(app, state.hostMountRoots);
1153
+ const hostFsWatch = startHostFsWatchers(state.hostMountRoots, (event) => {
1154
+ broadcastLickEvent(event);
1155
+ });
1152
1156
  // Sudo approval endpoint — raises a native OS dialog / TTY prompt from this
1153
1157
  // trusted process so the in-browser agent can request, but never fabricate,
1154
1158
  // an approval. Loopback-only; selects a backend by environment at call time.
@@ -1176,11 +1180,15 @@ async function main() {
1176
1180
  wss,
1177
1181
  server,
1178
1182
  });
1183
+ const shutdown = async () => {
1184
+ hostFsWatch.stop();
1185
+ await gracefulShutdown();
1186
+ };
1179
1187
  process.on('SIGINT', () => {
1180
- void gracefulShutdown();
1188
+ void shutdown();
1181
1189
  });
1182
1190
  process.on('SIGTERM', () => {
1183
- void gracefulShutdown();
1191
+ void shutdown();
1184
1192
  });
1185
1193
  process.on('exit', () => {
1186
1194
  // Synchronous last-resort cleanup — kill the launched browser if still running.