@fnndsc/brasa 0.14.1 → 0.16.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 (58) hide show
  1. package/dist/buildinfo.json +1 -1
  2. package/dist/builtins/feedTotals.d.ts +24 -0
  3. package/dist/builtins/feedTotals.js +46 -0
  4. package/dist/builtins/feedTotals.js.map +1 -0
  5. package/dist/builtins/fs/acl.args.d.ts +69 -0
  6. package/dist/builtins/fs/acl.args.js +125 -0
  7. package/dist/builtins/fs/acl.args.js.map +1 -0
  8. package/dist/builtins/fs/acl.d.ts +27 -0
  9. package/dist/builtins/fs/acl.js +79 -0
  10. package/dist/builtins/fs/acl.js.map +1 -0
  11. package/dist/builtins/fs/cd.d.ts +8 -0
  12. package/dist/builtins/fs/cd.js +28 -0
  13. package/dist/builtins/fs/cd.js.map +1 -1
  14. package/dist/builtins/fs/ls.d.ts +2 -0
  15. package/dist/builtins/fs/ls.js +3 -3
  16. package/dist/builtins/fs/ls.js.map +1 -1
  17. package/dist/builtins/fs/upload.js +8 -0
  18. package/dist/builtins/fs/upload.js.map +1 -1
  19. package/dist/builtins/help.js +31 -1
  20. package/dist/builtins/help.js.map +1 -1
  21. package/dist/builtins/index.d.ts +2 -0
  22. package/dist/builtins/index.js +2 -0
  23. package/dist/builtins/index.js.map +1 -1
  24. package/dist/builtins/proc.js +59 -1
  25. package/dist/builtins/proc.js.map +1 -1
  26. package/dist/builtins/procWatch.d.ts +69 -0
  27. package/dist/builtins/procWatch.js +215 -0
  28. package/dist/builtins/procWatch.js.map +1 -0
  29. package/dist/builtins/res/feed.diagram.d.ts +6 -4
  30. package/dist/builtins/res/feed.diagram.js +96 -30
  31. package/dist/builtins/res/feed.diagram.js.map +1 -1
  32. package/dist/core/ambient.d.ts +34 -0
  33. package/dist/core/ambient.js +38 -0
  34. package/dist/core/ambient.js.map +1 -0
  35. package/dist/core/dispatch.js +5 -1
  36. package/dist/core/dispatch.js.map +1 -1
  37. package/dist/core/engine.d.ts +26 -1
  38. package/dist/core/engine.js +13 -0
  39. package/dist/core/engine.js.map +1 -1
  40. package/dist/core/promptContext.d.ts +9 -0
  41. package/dist/core/promptContext.js +19 -2
  42. package/dist/core/promptContext.js.map +1 -1
  43. package/dist/core/warmupFailures.d.ts +44 -0
  44. package/dist/core/warmupFailures.js +45 -0
  45. package/dist/core/warmupFailures.js.map +1 -0
  46. package/dist/index.d.ts +1 -0
  47. package/dist/index.js +1 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/lib/announceIndent.d.ts +28 -0
  50. package/dist/lib/announceIndent.js +32 -0
  51. package/dist/lib/announceIndent.js.map +1 -0
  52. package/dist/lib/prefetch.d.ts +3 -1
  53. package/dist/lib/prefetch.js +18 -5
  54. package/dist/lib/prefetch.js.map +1 -1
  55. package/dist/lib/vfs/vfs.d.ts +40 -8
  56. package/dist/lib/vfs/vfs.js +63 -46
  57. package/dist/lib/vfs/vfs.js.map +1 -1
  58. package/package.json +3 -3
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @file Warm-up steps that failed behind the prompt.
3
+ *
4
+ * A warm-up moved off the boot gate reports its failure afterwards, and a
5
+ * boot readout has scrolled away by then. So a failure is held here until
6
+ * a later attempt succeeds, and every surface reads it from the prompt
7
+ * context: a message that vanishes is one nobody acts on.
8
+ *
9
+ * Kept free of imports so it can be unit tested; the engine graph cannot
10
+ * be loaded under jest.
11
+ *
12
+ * @module
13
+ */
14
+ /** Failures by label, so a later attempt replaces rather than repeats. */
15
+ const failures = new Map();
16
+ /**
17
+ * Records that a deferred warm-up step failed.
18
+ *
19
+ * @param label - The boot-step label.
20
+ * @param message - What the failure said.
21
+ */
22
+ export function warmupFailure_note(label, message) {
23
+ failures.set(label, message);
24
+ }
25
+ /**
26
+ * Records that a step succeeded, clearing any failure it was holding.
27
+ *
28
+ * @param label - The boot-step label.
29
+ */
30
+ export function warmupFailure_clear(label) {
31
+ failures.delete(label);
32
+ }
33
+ /**
34
+ * The failures still outstanding, in the order they were first recorded.
35
+ *
36
+ * @returns One entry per step that failed and has not since succeeded.
37
+ */
38
+ export function warmupFailures_list() {
39
+ return Array.from(failures, ([label, message]) => ({ label, message }));
40
+ }
41
+ /** Forgets every recorded failure (tests, and a session starting over). */
42
+ export function warmupFailures_reset() {
43
+ failures.clear();
44
+ }
45
+ //# sourceMappingURL=warmupFailures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warmupFailures.js","sourceRoot":"","sources":["../../src/core/warmupFailures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAaH,0EAA0E;AAC1E,MAAM,QAAQ,GAAwB,IAAI,GAAG,EAAE,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,OAAe;IAC/D,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,CAAmB,EAAiB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAC3G,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,oBAAoB;IAClC,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -16,6 +16,7 @@ export * from './core/sink.js';
16
16
  export * from './core/progress.js';
17
17
  export * from './core/surface.js';
18
18
  export * from './core/promptContext.js';
19
+ export * from './core/warmupFailures.js';
19
20
  export * from './core/connect.js';
20
21
  export * from './core/question.js';
21
22
  export * from './core/elevation.js';
package/dist/index.js CHANGED
@@ -17,6 +17,7 @@ export * from './core/sink.js';
17
17
  export * from './core/progress.js';
18
18
  export * from './core/surface.js';
19
19
  export * from './core/promptContext.js';
20
+ export * from './core/warmupFailures.js';
20
21
  export * from './core/connect.js';
21
22
  export * from './core/question.js';
22
23
  export * from './core/elevation.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,kBAAkB,CAAC;AACjC,iEAAiE;AACjE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,kBAAkB,CAAC;AACjC,iEAAiE;AACjE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @file Where a boot step's label starts.
3
+ *
4
+ * A step is announced while it runs and again when it finishes. Both lines
5
+ * describe the same step, so their labels must begin in the same column;
6
+ * otherwise the readout jitters as each step settles.
7
+ *
8
+ * The finished line is rendered by the host as a status tag padded to a
9
+ * fixed width, a space, then the label. The running line has to reproduce
10
+ * that column without knowing the tag. An animated spinner draws a frame
11
+ * and a space of its own and owes only the remainder; a plain log line
12
+ * draws nothing and owes the whole width.
13
+ *
14
+ * Kept free of imports so it can be unit tested: the wider engine graph
15
+ * cannot be loaded under jest.
16
+ *
17
+ * @module
18
+ */
19
+ /** Columns an animated spinner draws for itself: one glyph and one space. */
20
+ export declare const SPINNER_GLYPH_WIDTH: number;
21
+ /**
22
+ * Spaces a running announcement must emit before its label.
23
+ *
24
+ * @param statusWidth - Width of the host's status-tag column.
25
+ * @param animated - Whether a spinner glyph precedes the text.
26
+ * @returns Leading spaces, never negative.
27
+ */
28
+ export declare function announceIndent_get(statusWidth: number, animated: boolean): number;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @file Where a boot step's label starts.
3
+ *
4
+ * A step is announced while it runs and again when it finishes. Both lines
5
+ * describe the same step, so their labels must begin in the same column;
6
+ * otherwise the readout jitters as each step settles.
7
+ *
8
+ * The finished line is rendered by the host as a status tag padded to a
9
+ * fixed width, a space, then the label. The running line has to reproduce
10
+ * that column without knowing the tag. An animated spinner draws a frame
11
+ * and a space of its own and owes only the remainder; a plain log line
12
+ * draws nothing and owes the whole width.
13
+ *
14
+ * Kept free of imports so it can be unit tested: the wider engine graph
15
+ * cannot be loaded under jest.
16
+ *
17
+ * @module
18
+ */
19
+ /** Columns an animated spinner draws for itself: one glyph and one space. */
20
+ export const SPINNER_GLYPH_WIDTH = 2;
21
+ /**
22
+ * Spaces a running announcement must emit before its label.
23
+ *
24
+ * @param statusWidth - Width of the host's status-tag column.
25
+ * @param animated - Whether a spinner glyph precedes the text.
26
+ * @returns Leading spaces, never negative.
27
+ */
28
+ export function announceIndent_get(statusWidth, animated) {
29
+ const target = statusWidth + 1;
30
+ return Math.max(target - (animated ? SPINNER_GLYPH_WIDTH : 0), 0);
31
+ }
32
+ //# sourceMappingURL=announceIndent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"announceIndent.js","sourceRoot":"","sources":["../../src/lib/announceIndent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,6EAA6E;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAW,CAAC,CAAC;AAE7C;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB,EAAE,QAAiB;IACvE,MAAM,MAAM,GAAW,WAAW,GAAG,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC"}
@@ -21,5 +21,7 @@ export declare function prefetch_path(target: string): Promise<PrefetchResult>;
21
21
  * @param message - Descriptive message shown next to the label.
22
22
  * @param isInteractive - Whether the session is interactive (controls spinner vs plain log).
23
23
  * @param action - Async work to run; returns a PrefetchResult.
24
+ * @param statusWidth - Width of the host's status-tag column, so a running
25
+ * row's label lines up with the finished row that replaces it.
24
26
  */
25
- export declare function prefetch_withSpinner(label: string, message: string, isInteractive: boolean, action: () => Promise<PrefetchResult>): Promise<PrefetchResult>;
27
+ export declare function prefetch_withSpinner(label: string, message: string, isInteractive: boolean, action: () => Promise<PrefetchResult>, statusWidth?: number): Promise<PrefetchResult>;
@@ -10,6 +10,14 @@ import { errorStack } from '@fnndsc/cumin';
10
10
  import { vfs } from './vfs/vfs.js';
11
11
  import { spinner } from './spinner.js';
12
12
  import { error_stripDebugPrefix } from '../builtins/index.js';
13
+ import { announceIndent_get } from './announceIndent.js';
14
+ /**
15
+ * Status-tag column assumed when a host does not declare its own.
16
+ *
17
+ * Hosts that render a status tag before the label pass their real width,
18
+ * so the spinner and the finished row agree on where the label starts.
19
+ */
20
+ const DEFAULT_STATUS_WIDTH = 7;
13
21
  /**
14
22
  * Prefetch a VFS path into the list cache.
15
23
  *
@@ -37,14 +45,19 @@ export async function prefetch_path(target) {
37
45
  * @param message - Descriptive message shown next to the label.
38
46
  * @param isInteractive - Whether the session is interactive (controls spinner vs plain log).
39
47
  * @param action - Async work to run; returns a PrefetchResult.
48
+ * @param statusWidth - Width of the host's status-tag column, so a running
49
+ * row's label lines up with the finished row that replaces it.
40
50
  */
41
- export async function prefetch_withSpinner(label, message, isInteractive, action) {
51
+ export async function prefetch_withSpinner(label, message, isInteractive, action, statusWidth = DEFAULT_STATUS_WIDTH) {
42
52
  const paddedLabel = label.padEnd(12);
43
- // Spinner adds its own glyph and a following space. Pad so the label column
44
- // aligns with the fixed-width status logs (e.g., "[ OK ] " = 7 chars).
45
- const spinnerPrefix = ' '.repeat(5); // 1 glyph + 1 space + 5 = 7
46
- const spinnerMessage = `${spinnerPrefix}${paddedLabel} ${message}`;
47
53
  const showSpinner = isInteractive && process.stdout.isTTY;
54
+ // A running row and the finished row that replaces it describe the same
55
+ // step, so their labels must start in the same column. The host writes
56
+ // its status tag then a space, which is the column to match. An animated
57
+ // spinner already writes a glyph and a space of its own and owes only the
58
+ // remainder; a plain log line writes nothing and owes the whole width.
59
+ const indent = announceIndent_get(statusWidth, showSpinner);
60
+ const spinnerMessage = `${' '.repeat(indent)}${paddedLabel} ${message}`;
48
61
  if (showSpinner) {
49
62
  spinner.start(spinnerMessage, true);
50
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prefetch.js","sourceRoot":"","sources":["../../src/lib/prefetch.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAY9D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClD,CAAC;QACD,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;QACnC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,uBAAuB,MAAM,EAAE,EAAE,CAAC;IAC7G,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,GAAG,GAAW,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IACrC,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAa,EACb,OAAe,EACf,aAAsB,EACtB,MAAqC;IAErC,MAAM,WAAW,GAAW,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7C,4EAA4E;IAC5E,uEAAuE;IACvE,MAAM,aAAa,GAAW,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B;IACzE,MAAM,cAAc,GAAW,GAAG,aAAa,GAAG,WAAW,IAAI,OAAO,EAAE,CAAC;IAC3E,MAAM,WAAW,GAAY,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IAEnE,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,EAAE,CAAC;IACxB,CAAC;YAAS,CAAC;QACT,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"prefetch.js","sourceRoot":"","sources":["../../src/lib/prefetch.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,oBAAoB,GAAW,CAAC,CAAC;AAYvC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClD,CAAC;QACD,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;QACnC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,uBAAuB,MAAM,EAAE,EAAE,CAAC;IAC7G,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,GAAG,GAAW,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IACrC,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAa,EACb,OAAe,EACf,aAAsB,EACtB,MAAqC,EACrC,cAAsB,oBAAoB;IAE1C,MAAM,WAAW,GAAW,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAY,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IACnE,wEAAwE;IACxE,uEAAuE;IACvE,yEAAyE;IACzE,0EAA0E;IAC1E,uEAAuE;IACvE,MAAM,MAAM,GAAW,kBAAkB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACpE,MAAM,cAAc,GAAW,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,WAAW,IAAI,OAAO,EAAE,CAAC;IAEhF,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,EAAE,CAAC;IACxB,CAAC;YAAS,CAAC;QACT,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -4,6 +4,19 @@ import { Result, type CommandEnvelope } from '@fnndsc/cumin';
4
4
  * Virtual File System Router.
5
5
  * Dispatches operations to Virtual or Native providers.
6
6
  */
7
+ /**
8
+ * A resolved directory listing with its freshness.
9
+ *
10
+ * @property path - The absolute path listed.
11
+ * @property items - The entries.
12
+ * @property fresh - True when current; false when served stale with a
13
+ * revalidation running behind it.
14
+ */
15
+ export interface VfsListing {
16
+ path: string;
17
+ items: ListingItem[];
18
+ fresh: boolean;
19
+ }
7
20
  export declare class VFS {
8
21
  /**
9
22
  * Gets data for a directory (Virtual or Native).
@@ -18,6 +31,33 @@ export declare class VFS {
18
31
  reverse?: boolean;
19
32
  directory?: boolean;
20
33
  }): Promise<Result<ListingItem[]>>;
34
+ /** Background revalidations in flight, one per path. */
35
+ private revalidating;
36
+ /**
37
+ * Re-fetches one listing behind a stale serve and publishes the fresh
38
+ * result as an ambient `fs.listing` envelope, so every surface showing
39
+ * that path repaints. One fetch per path at a time.
40
+ *
41
+ * @param effectivePath - The absolute path to refresh.
42
+ */
43
+ private listing_revalidate;
44
+ /**
45
+ * Resolves a directory listing with its freshness. A fresh cached
46
+ * listing is served as is. A stale one is served at once only when a
47
+ * host can carry the refresh (an ambient listener exists — the daemon),
48
+ * with the revalidation running behind it; at a plain console the stale
49
+ * entry is refetched in line, because nobody would deliver the refresh.
50
+ * `/proc` paths never touch this cache.
51
+ *
52
+ * @param targetPath - The path to list; the working directory when empty.
53
+ * @param options - Sort and `-d` options.
54
+ * @returns The listing, its absolute path, and whether it is current.
55
+ */
56
+ listing_get(targetPath?: string, options?: {
57
+ sort?: 'name' | 'size' | 'date' | 'owner';
58
+ reverse?: boolean;
59
+ directory?: boolean;
60
+ }): Promise<Result<VfsListing>>;
21
61
  /**
22
62
  * Returns the directory entry for `absolutePath` itself (not its contents).
23
63
  * Looks up the entry in the parent's listing — used to implement `ls -d`.
@@ -51,14 +91,6 @@ export declare class VFS {
51
91
  reverse?: boolean;
52
92
  directory?: boolean;
53
93
  }): Promise<CommandEnvelope>;
54
- /**
55
- * Refreshes cache in the background without blocking or updating display.
56
- * Used for optimistic rendering - fetch fresh data after serving stale cache.
57
- *
58
- * @param targetPath - The path to refresh.
59
- * @param options - Options including sort and reverse.
60
- */
61
- private refreshInBackground;
62
94
  }
63
95
  /**
64
96
  * Shared VFS singleton.
@@ -10,16 +10,13 @@ import { vfsDispatcher } from '@fnndsc/salsa';
10
10
  import { session } from '../../session/index.js';
11
11
  import chalk from 'chalk';
12
12
  import * as path from 'path';
13
+ import { ambient_publish, ambient_hasListeners } from '../../core/ambient.js';
13
14
  import { grid_render, long_render } from '@fnndsc/chili/views/ls.js';
14
15
  import { list_applySort } from '@fnndsc/chili/utils/sort.js';
15
16
  import { listCache_get, Ok, Err, errorStack, envelope_ok, envelope_error } from '@fnndsc/cumin';
16
17
  import { spinner } from '../spinner.js';
17
18
  import { error_stripDebugPrefix } from '../../builtins/utils.js';
18
19
  import { listingItemsFromVfs_make } from './listing.js';
19
- /**
20
- * Virtual File System Router.
21
- * Dispatches operations to Virtual or Native providers.
22
- */
23
20
  export class VFS {
24
21
  /**
25
22
  * Gets data for a directory (Virtual or Native).
@@ -30,6 +27,51 @@ export class VFS {
30
27
  * @returns Result<ListingItem[]> - Ok with items or Err with error message.
31
28
  */
32
29
  async data_get(targetPath, options = {}) {
30
+ const resolved = await this.listing_get(targetPath, options);
31
+ return resolved.ok ? Ok(resolved.value.items) : Err();
32
+ }
33
+ /** Background revalidations in flight, one per path. */
34
+ revalidating = new Map();
35
+ /**
36
+ * Re-fetches one listing behind a stale serve and publishes the fresh
37
+ * result as an ambient `fs.listing` envelope, so every surface showing
38
+ * that path repaints. One fetch per path at a time.
39
+ *
40
+ * @param effectivePath - The absolute path to refresh.
41
+ */
42
+ listing_revalidate(effectivePath) {
43
+ const inflight = this.revalidating.get(effectivePath);
44
+ if (inflight)
45
+ return inflight;
46
+ const run = (async () => {
47
+ const fetched = await vfsDispatcher.list(effectivePath, {});
48
+ if (!fetched.ok)
49
+ return;
50
+ const items = listingItemsFromVfs_make(fetched.value);
51
+ listCache_get().cache_set(effectivePath, items);
52
+ ambient_publish({
53
+ kind: 'envelope',
54
+ envelope: { status: 'ok', rendered: '', model: { kind: 'fs.listing', data: [{ path: effectivePath, items, fresh: true }] } },
55
+ });
56
+ })()
57
+ .catch(() => { })
58
+ .finally(() => { this.revalidating.delete(effectivePath); });
59
+ this.revalidating.set(effectivePath, run);
60
+ return run;
61
+ }
62
+ /**
63
+ * Resolves a directory listing with its freshness. A fresh cached
64
+ * listing is served as is. A stale one is served at once only when a
65
+ * host can carry the refresh (an ambient listener exists — the daemon),
66
+ * with the revalidation running behind it; at a plain console the stale
67
+ * entry is refetched in line, because nobody would deliver the refresh.
68
+ * `/proc` paths never touch this cache.
69
+ *
70
+ * @param targetPath - The path to list; the working directory when empty.
71
+ * @param options - Sort and `-d` options.
72
+ * @returns The listing, its absolute path, and whether it is current.
73
+ */
74
+ async listing_get(targetPath, options = {}) {
33
75
  try {
34
76
  const cwd = await session.getCWD();
35
77
  const effectivePath = targetPath
@@ -37,7 +79,8 @@ export class VFS {
37
79
  : cwd;
38
80
  // -d: show the target entry itself rather than descending into it
39
81
  if (options.directory && targetPath) {
40
- return this.directoryEntry_get(effectivePath, options);
82
+ const entry = await this.directoryEntry_get(effectivePath, options);
83
+ return entry.ok ? Ok({ path: effectivePath, items: entry.value, fresh: true }) : Err();
41
84
  }
42
85
  // /proc paths are backed by ProcCache which manages its own freshness —
43
86
  // skip listCache entirely so proc refresh and live status reads are visible.
@@ -46,17 +89,19 @@ export class VFS {
46
89
  const listCache = listCache_get();
47
90
  if (!isProcPath) {
48
91
  const cached = listCache.cache_get(effectivePath);
49
- if (cached) {
92
+ if (cached && (cached.fresh || ambient_hasListeners())) {
93
+ if (!cached.fresh)
94
+ void this.listing_revalidate(effectivePath);
50
95
  const sortField = options.sort || 'name';
51
96
  const sortedItems = list_applySort(cached.data, sortField, options.reverse);
52
- return Ok(sortedItems);
97
+ return Ok({ path: effectivePath, items: sortedItems, fresh: cached.fresh });
53
98
  }
54
99
  // Shell wildcard expansion reads and caches the parent directory before
55
100
  // passing each matched path to ls. Leaf entries are not directories to
56
101
  // descend into, so return the matching cached entry itself.
57
102
  const parentLeaf = this.leafFromParentCache_get(effectivePath);
58
103
  if (parentLeaf) {
59
- return Ok([parentLeaf]);
104
+ return Ok({ path: effectivePath, items: [parentLeaf], fresh: true });
60
105
  }
61
106
  }
62
107
  // Delegate path queries to the unified vfsDispatcher (which handles both virtual and native paths)
@@ -67,7 +112,7 @@ export class VFS {
67
112
  if (!isProcPath) {
68
113
  listCache.cache_set(effectivePath, items);
69
114
  }
70
- return Ok(items);
115
+ return Ok({ path: effectivePath, items, fresh: true });
71
116
  }
72
117
  return Err();
73
118
  }
@@ -150,11 +195,10 @@ export class VFS {
150
195
  const effectivePath = targetPath
151
196
  ? path.posix.resolve(cwd, targetPath)
152
197
  : cwd;
153
- // Check if we're serving from stale cache BEFORE fetching
154
- const listCache = listCache_get();
155
- const cached = listCache.cache_get(effectivePath);
156
- const wasStale = cached && !cached.fresh;
157
- const isCacheMiss = !cached;
198
+ // A cache miss will wait on the wire; a stale entry may be served at
199
+ // once (listing_get decides, and revalidates behind it where a host can
200
+ // carry the refresh).
201
+ const isCacheMiss = !listCache_get().cache_get(effectivePath);
158
202
  // For cache miss, show loading indicator after 500ms timeout
159
203
  let spinnerStarted = false; // Flag to track if spinner was actually started
160
204
  let spinnerDelayTimeout = null;
@@ -165,7 +209,8 @@ export class VFS {
165
209
  }, 500);
166
210
  }
167
211
  // Fetch data (may be from cache)
168
- const result = await this.data_get(targetPath, options);
212
+ const listing = await this.listing_get(targetPath, options);
213
+ const result = listing.ok ? Ok(listing.value.items) : Err();
169
214
  // Clear loading timeout and indicator
170
215
  if (spinnerDelayTimeout) {
171
216
  clearTimeout(spinnerDelayTimeout);
@@ -185,41 +230,13 @@ export class VFS {
185
230
  let rendered = options.long
186
231
  ? `${long_render(result.value, { human: !!options.human })}\n`
187
232
  : `${grid_render(result.value, { oneColumn: !!options.oneColumn })}\n`;
188
- // If we served stale cache, note it and refresh in background.
189
- if (wasStale) {
233
+ // Served stale: say so. The refresh is already running behind this
234
+ // answer and reaches every surface as an ambient listing.
235
+ if (listing.ok && !listing.value.fresh) {
190
236
  rendered += `${chalk.gray('(cached, refreshing...)')}\n`;
191
- // Trigger background refresh - don't await. Fenced in its own error-stack
192
- // scope so its pushes/pops cannot corrupt a concurrent foreground
193
- // command's error-drain window.
194
- errorStack.scope_run(() => {
195
- this.refreshInBackground(effectivePath, options).catch(() => {
196
- // Silently ignore refresh errors - user has moved on
197
- });
198
- });
199
237
  }
200
238
  return envelope_ok(rendered);
201
239
  }
202
- /**
203
- * Refreshes cache in the background without blocking or updating display.
204
- * Used for optimistic rendering - fetch fresh data after serving stale cache.
205
- *
206
- * @param targetPath - The path to refresh.
207
- * @param options - Options including sort and reverse.
208
- */
209
- async refreshInBackground(targetPath, options) {
210
- try {
211
- // Invalidate cache to force fresh fetch
212
- const listCache = listCache_get();
213
- listCache.cache_invalidate(targetPath);
214
- // Fetch fresh data - this will repopulate cache
215
- await this.data_get(targetPath, options);
216
- // Don't update display - user has moved on
217
- // Fresh data is now cached for next access
218
- }
219
- catch (_error) {
220
- // Silently fail - background refresh is best-effort
221
- }
222
- }
223
240
  }
224
241
  /**
225
242
  * Shared VFS singleton.
@@ -1 +1 @@
1
- {"version":3,"file":"vfs.js","sourceRoot":"","sources":["../../../src/lib/vfs/vfs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vfs.js","sourceRoot":"","sources":["../../../src/lib/vfs/vfs.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fnndsc/brasa",
3
- "version": "0.14.1",
3
+ "version": "0.16.0",
4
4
  "description": "BRASA Runs Abstracted Shell Actions - the hostable ChRIS shell engine (kernel)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -44,8 +44,8 @@
44
44
  "license": "MIT",
45
45
  "dependencies": {
46
46
  "@fnndsc/chili": "^3.6.5",
47
- "@fnndsc/cumin": "^3.15.1",
48
- "@fnndsc/salsa": "^3.10.1",
47
+ "@fnndsc/cumin": "^3.17.0",
48
+ "@fnndsc/salsa": "^3.12.1",
49
49
  "chalk": "^4.1.2",
50
50
  "cli-highlight": "^2.1.11",
51
51
  "js-yaml": "^4.1.0",