@mono-agent/session-web 0.4.1

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 (120) hide show
  1. package/README.md +92 -0
  2. package/dist/aggregator.d.ts +123 -0
  3. package/dist/aggregator.d.ts.map +1 -0
  4. package/dist/aggregator.js +1155 -0
  5. package/dist/aggregator.js.map +1 -0
  6. package/dist/discovery.d.ts +48 -0
  7. package/dist/discovery.d.ts.map +1 -0
  8. package/dist/discovery.js +177 -0
  9. package/dist/discovery.js.map +1 -0
  10. package/dist/history.d.ts +47 -0
  11. package/dist/history.d.ts.map +1 -0
  12. package/dist/history.js +149 -0
  13. package/dist/history.js.map +1 -0
  14. package/dist/index.d.ts +17 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +13 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/live-client.d.ts +50 -0
  19. package/dist/live-client.d.ts.map +1 -0
  20. package/dist/live-client.js +159 -0
  21. package/dist/live-client.js.map +1 -0
  22. package/dist/server.d.ts +30 -0
  23. package/dist/server.d.ts.map +1 -0
  24. package/dist/server.js +359 -0
  25. package/dist/server.js.map +1 -0
  26. package/dist/session-model.d.ts +54 -0
  27. package/dist/session-model.d.ts.map +1 -0
  28. package/dist/session-model.js +10 -0
  29. package/dist/session-model.js.map +1 -0
  30. package/package.json +39 -0
  31. package/webapp/dist/apple-touch-icon.png +0 -0
  32. package/webapp/dist/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
  33. package/webapp/dist/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
  34. package/webapp/dist/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
  35. package/webapp/dist/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
  36. package/webapp/dist/assets/ibm-plex-mono-cyrillic-600-normal-CTOM6hUh.woff2 +0 -0
  37. package/webapp/dist/assets/ibm-plex-mono-cyrillic-600-normal-fLZuRloM.woff +0 -0
  38. package/webapp/dist/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
  39. package/webapp/dist/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
  40. package/webapp/dist/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
  41. package/webapp/dist/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
  42. package/webapp/dist/assets/ibm-plex-mono-cyrillic-ext-600-normal-9HEixskS.woff +0 -0
  43. package/webapp/dist/assets/ibm-plex-mono-cyrillic-ext-600-normal-V-xxqcpd.woff2 +0 -0
  44. package/webapp/dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  45. package/webapp/dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  46. package/webapp/dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  47. package/webapp/dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  48. package/webapp/dist/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  49. package/webapp/dist/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  50. package/webapp/dist/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
  51. package/webapp/dist/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
  52. package/webapp/dist/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
  53. package/webapp/dist/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
  54. package/webapp/dist/assets/ibm-plex-mono-latin-ext-600-normal-D38SheWl.woff2 +0 -0
  55. package/webapp/dist/assets/ibm-plex-mono-latin-ext-600-normal-DmB0ttJJ.woff +0 -0
  56. package/webapp/dist/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
  57. package/webapp/dist/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
  58. package/webapp/dist/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
  59. package/webapp/dist/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
  60. package/webapp/dist/assets/ibm-plex-mono-vietnamese-600-normal-D2EvbN8M.woff2 +0 -0
  61. package/webapp/dist/assets/ibm-plex-mono-vietnamese-600-normal-iLQfcSjf.woff +0 -0
  62. package/webapp/dist/assets/index-ByXpmZqx.js +138 -0
  63. package/webapp/dist/assets/index-D-V-lq0B.css +1 -0
  64. package/webapp/dist/assets/newsreader-latin-400-italic-CEihAR-f.woff2 +0 -0
  65. package/webapp/dist/assets/newsreader-latin-400-italic-CNZoH1hn.woff +0 -0
  66. package/webapp/dist/assets/newsreader-latin-400-normal-BFBkh4jY.woff2 +0 -0
  67. package/webapp/dist/assets/newsreader-latin-400-normal-gRTjlS2D.woff +0 -0
  68. package/webapp/dist/assets/newsreader-latin-500-italic-Bsgye1qA.woff2 +0 -0
  69. package/webapp/dist/assets/newsreader-latin-500-italic-m-xI0GeS.woff +0 -0
  70. package/webapp/dist/assets/newsreader-latin-500-normal-B66TYsaK.woff2 +0 -0
  71. package/webapp/dist/assets/newsreader-latin-500-normal-DFwuUcdu.woff +0 -0
  72. package/webapp/dist/assets/newsreader-latin-ext-400-italic-BMTE_bNQ.woff2 +0 -0
  73. package/webapp/dist/assets/newsreader-latin-ext-400-italic-qdgKLcPG.woff +0 -0
  74. package/webapp/dist/assets/newsreader-latin-ext-400-normal-DYA1XoQK.woff +0 -0
  75. package/webapp/dist/assets/newsreader-latin-ext-400-normal-svq1FPys.woff2 +0 -0
  76. package/webapp/dist/assets/newsreader-latin-ext-500-italic-B83LgwQp.woff2 +0 -0
  77. package/webapp/dist/assets/newsreader-latin-ext-500-italic-Bz3NsAdg.woff +0 -0
  78. package/webapp/dist/assets/newsreader-latin-ext-500-normal-BNHmvKvI.woff2 +0 -0
  79. package/webapp/dist/assets/newsreader-latin-ext-500-normal-CZruMFou.woff +0 -0
  80. package/webapp/dist/assets/newsreader-vietnamese-400-italic-QbB8kb5s.woff +0 -0
  81. package/webapp/dist/assets/newsreader-vietnamese-400-italic-bZegYFuM.woff2 +0 -0
  82. package/webapp/dist/assets/newsreader-vietnamese-400-normal-BekUZro8.woff +0 -0
  83. package/webapp/dist/assets/newsreader-vietnamese-400-normal-DdKr49mV.woff2 +0 -0
  84. package/webapp/dist/assets/newsreader-vietnamese-500-italic-BsTGSz8L.woff +0 -0
  85. package/webapp/dist/assets/newsreader-vietnamese-500-italic-D26NjlyL.woff2 +0 -0
  86. package/webapp/dist/assets/newsreader-vietnamese-500-normal-BEAbKU8A.woff +0 -0
  87. package/webapp/dist/assets/newsreader-vietnamese-500-normal-CL6a8tp2.woff2 +0 -0
  88. package/webapp/dist/assets/space-grotesk-latin-400-normal-BnQMeOim.woff +0 -0
  89. package/webapp/dist/assets/space-grotesk-latin-400-normal-CJ-V5oYT.woff2 +0 -0
  90. package/webapp/dist/assets/space-grotesk-latin-500-normal-CNSSEhBt.woff +0 -0
  91. package/webapp/dist/assets/space-grotesk-latin-500-normal-lFbtlQH6.woff2 +0 -0
  92. package/webapp/dist/assets/space-grotesk-latin-600-normal-BflQw4A9.woff +0 -0
  93. package/webapp/dist/assets/space-grotesk-latin-600-normal-DjKNqYRj.woff2 +0 -0
  94. package/webapp/dist/assets/space-grotesk-latin-700-normal-CwsQ-cCU.woff +0 -0
  95. package/webapp/dist/assets/space-grotesk-latin-700-normal-RjhwGPKo.woff2 +0 -0
  96. package/webapp/dist/assets/space-grotesk-latin-ext-400-normal-CfP_5XZW.woff2 +0 -0
  97. package/webapp/dist/assets/space-grotesk-latin-ext-400-normal-DRPE3kg4.woff +0 -0
  98. package/webapp/dist/assets/space-grotesk-latin-ext-500-normal-3dgZTiw9.woff +0 -0
  99. package/webapp/dist/assets/space-grotesk-latin-ext-500-normal-DUe3BAxM.woff2 +0 -0
  100. package/webapp/dist/assets/space-grotesk-latin-ext-600-normal-DxxdqCpr.woff2 +0 -0
  101. package/webapp/dist/assets/space-grotesk-latin-ext-600-normal-VcznFIpX.woff +0 -0
  102. package/webapp/dist/assets/space-grotesk-latin-ext-700-normal-BQnZhY3m.woff2 +0 -0
  103. package/webapp/dist/assets/space-grotesk-latin-ext-700-normal-HVCqSBdx.woff +0 -0
  104. package/webapp/dist/assets/space-grotesk-vietnamese-400-normal-B7xT_GF5.woff2 +0 -0
  105. package/webapp/dist/assets/space-grotesk-vietnamese-400-normal-BIWiOVfw.woff +0 -0
  106. package/webapp/dist/assets/space-grotesk-vietnamese-500-normal-BTqKIpxg.woff +0 -0
  107. package/webapp/dist/assets/space-grotesk-vietnamese-500-normal-BmEvtly_.woff2 +0 -0
  108. package/webapp/dist/assets/space-grotesk-vietnamese-600-normal-D6zpsUhD.woff +0 -0
  109. package/webapp/dist/assets/space-grotesk-vietnamese-600-normal-DUi7WF5p.woff2 +0 -0
  110. package/webapp/dist/assets/space-grotesk-vietnamese-700-normal-DMty7AZE.woff2 +0 -0
  111. package/webapp/dist/assets/space-grotesk-vietnamese-700-normal-Duxec5Rn.woff +0 -0
  112. package/webapp/dist/favicon.ico +0 -0
  113. package/webapp/dist/icon-192.png +0 -0
  114. package/webapp/dist/icon-512.png +0 -0
  115. package/webapp/dist/icon.svg +31 -0
  116. package/webapp/dist/index.html +25 -0
  117. package/webapp/dist/manifest.webmanifest +1 -0
  118. package/webapp/dist/registerSW.js +1 -0
  119. package/webapp/dist/sw.js +1 -0
  120. package/webapp/dist/workbox-9c191d2f.js +1 -0
package/README.md ADDED
@@ -0,0 +1,92 @@
1
+ # @mono-agent/session-web
2
+
3
+ Discovers local mono-agent instances and serves a read-only **web PWA** that
4
+ visualises their runs in real time — the browser counterpart to the TUI. It is
5
+ the single backend the browser talks to: it aggregates recorded-run history (from
6
+ each instance's artifact dir) with live sub-run streams (from each running
7
+ agent's operator-adapter live endpoint), and never drives an agent.
8
+
9
+ ## Category
10
+
11
+ Category: `operator-surface`
12
+
13
+ A drop-in operator surface, like `@mono-agent/tui`: launched separately, it
14
+ discovers everything on the machine via the trace-source registry.
15
+
16
+ ## Responsibility
17
+
18
+ - Discover instances (registry `listTraceSources`/`mergeTraceSources`), exposing
19
+ name, cwd, `artifactDir`, health, and the optional `live` SSE endpoint.
20
+ - Read recorded runs per instance and map them to the UI `Session` model
21
+ (`mapRunToSession`, from `@mono-agent/observability`).
22
+ - Watch artifact dirs (run-level) and connect to operator-adapter live SSE (sub-run);
23
+ fold both into one live session model.
24
+ - Serve the built PWA (`express.static`), a JSON API, and a browser SSE stream.
25
+
26
+ ## Install / Usage
27
+
28
+ ```ts
29
+ import { startSessionWebServer } from "@mono-agent/session-web";
30
+
31
+ const server = await startSessionWebServer({
32
+ registryDirs: ["/Users/me/.mono-agent/trace-sources"],
33
+ host: "127.0.0.1",
34
+ port: 4599,
35
+ // Defaults to agent runs only. Uncomment to include memory-maintenance runs.
36
+ // includeMemory: true,
37
+ });
38
+ console.log(server.url);
39
+ await server.stop();
40
+ ```
41
+
42
+ The `mono-agent web` CLI command wraps this with registry resolution + browser open.
43
+ Loopback on port `4599` is the default. Startup prints the exact URL to target
44
+ from reverse proxies. A non-loopback bind requires `allowNonLoopback: true`
45
+ and an `authToken`; `/api/*` and `/api/stream` require `Authorization: Bearer
46
+ <token>` (or `?token=<token>` for browser `EventSource`).
47
+
48
+ Run lists and the initial browser SSE snapshot are summary-only and step-less.
49
+ Full run timelines are read lazily from `/api/sessions/:sourceId/:runId` when a
50
+ detail view opens.
51
+ `/api/sessions` supports `instance`, `limit`, and `offset` query parameters and
52
+ returns page metadata (`total`, `offset`, `limit`, `hasMore`) so the browser can
53
+ load older history without replaying already-loaded rows. Stale `running`
54
+ summaries are projected as `stalled` in the web surface instead of being treated
55
+ as live.
56
+ Instance metadata includes the source timezone when it is discoverable; the PWA
57
+ uses that timezone for per-instance run lists and details, and falls back to the
58
+ viewer locale/timezone for mixed-instance views. Failure summaries preserve
59
+ `failureKind`, error text, and provider failover attempts so failed runs are
60
+ inspectable from the list and detail views.
61
+ Memory-maintenance runs are hidden by default across disk history, watched
62
+ updates, API responses, browser SSE frames, and live folds; pass
63
+ `includeMemory: true` to opt them back in.
64
+
65
+ ## Public API
66
+
67
+ - `startSessionWebServer(options)` → `{ url, stop() }` (`includeMemory` defaults
68
+ to `false`; `true` includes memory-maintenance runs in history/API/SSE/live
69
+ frames).
70
+ - `discoverWebInstances(options)` and the `Session`/`SessionStep`/`WebInstance` types.
71
+
72
+ ## Dependency Boundary
73
+
74
+ Depends only on `core` + `observability`: `@mono-agent/agent-contracts`,
75
+ `@mono-agent/observability`. Plus `express`. It reaches
76
+ operator-adapter live endpoints **over HTTP only** — it does not (and, per the
77
+ architecture rule, may not) depend on that `communication` package. The browser
78
+ SPA lives in the isolated `webapp/` sub-project (its own lockfile), built to
79
+ `webapp/dist` and served statically.
80
+
81
+ ## What This Package Does Not Own
82
+
83
+ - The agent-side broadcast tap or the `live` channel driver.
84
+ - Turn-driving / any write path to an agent (read-only by construction).
85
+ - The recorder, the trace-source registry writer, or run persistence.
86
+
87
+ ## Verification
88
+
89
+ ```sh
90
+ pnpm --filter @mono-agent/session-web... run build
91
+ pnpm --filter @mono-agent/session-web run test
92
+ ```
@@ -0,0 +1,123 @@
1
+ import type { SourceStampedSession } from "./history.js";
2
+ import type { BrowserStreamFrame, WebInstance } from "./session-model.js";
3
+ export interface SessionAggregatorLogger {
4
+ info?(message: string, metadata?: unknown): void;
5
+ warn?(message: string, metadata?: unknown): void;
6
+ error?(message: string, metadata?: unknown): void;
7
+ }
8
+ export interface SessionAggregatorOptions {
9
+ readonly registryDirs: readonly string[];
10
+ readonly maxRunsPerInstance: number;
11
+ readonly staleAfterMs?: number;
12
+ readonly env?: Record<string, string | undefined>;
13
+ readonly logger?: SessionAggregatorLogger;
14
+ /** Periodic registry reconcile interval (source of truth for membership). Default 5000. */
15
+ readonly reconcileIntervalMs?: number;
16
+ /** Debounce for `fs.watch`-triggered registry reconciles. Default 300. */
17
+ readonly registryDebounceMs?: number;
18
+ /** Debounce for `fs.watch`-triggered artifact re-reads (per run). Default 300. */
19
+ readonly artifactDebounceMs?: number;
20
+ /** Debounce for live-fold recomputes (per run). Default 150. */
21
+ readonly liveFoldDebounceMs?: number;
22
+ /** Coalescing window for `instances` frame emissions. Default 100. */
23
+ readonly instancesDebounceMs?: number;
24
+ /** Injectable fetch, threaded to the live client (tests point it at a local SSE server). */
25
+ readonly fetchImpl?: typeof fetch;
26
+ /** Include memory-maintenance runs in disk history and live frames. Default false. */
27
+ readonly includeMemory?: boolean;
28
+ /** Injectable clock for stale-running projection. Defaults to Date.now. */
29
+ readonly clock?: () => number;
30
+ }
31
+ export declare class SessionAggregator {
32
+ private readonly registryDirs;
33
+ private readonly maxRunsPerInstance;
34
+ private readonly staleAfterMs;
35
+ private readonly env;
36
+ private readonly logger;
37
+ private readonly reconcileIntervalMs;
38
+ private readonly registryDebounceMs;
39
+ private readonly artifactDebounceMs;
40
+ private readonly liveFoldDebounceMs;
41
+ private readonly instancesDebounceMs;
42
+ private readonly fetchImpl;
43
+ private readonly includeMemory;
44
+ private readonly clock;
45
+ private readonly states;
46
+ private readonly subscribers;
47
+ private readonly registryWatchers;
48
+ private reconcileTimer;
49
+ private reconcileDebounceTimer;
50
+ private instancesEmitTimer;
51
+ private lifecycleGeneration;
52
+ private stopped;
53
+ constructor(options: SessionAggregatorOptions);
54
+ /** Discover instances, seed history, open live connections, and start watching. */
55
+ start(): Promise<void>;
56
+ getInstances(): WebInstance[];
57
+ /** Sessions for one instance (by sourceId) or all ("all"), newest-first by `startTs`. */
58
+ getSessions(filter: string): SourceStampedSession[];
59
+ /** Step-less list projection for `/api/sessions` and browser SSE snapshots. */
60
+ getSessionSummaries(filter: string): SourceStampedSession[];
61
+ getSessionSummariesPage(filter: string, page: {
62
+ readonly offset: number;
63
+ readonly limit: number;
64
+ }): Promise<{
65
+ readonly sessions: readonly SourceStampedSession[];
66
+ readonly total: number;
67
+ readonly offset: number;
68
+ readonly limit: number;
69
+ readonly hasMore: boolean;
70
+ }>;
71
+ private collectSessions;
72
+ /** One session, reading it from disk on demand when it isn't already held. */
73
+ getSession(sourceId: string, runId: string): Promise<SourceStampedSession | undefined>;
74
+ /** Subscribe to the browser frame fan-out. Returns an unsubscribe function. */
75
+ subscribe(listener: (frame: BrowserStreamFrame) => void): () => void;
76
+ /** Close every live connection, watcher, and timer, and drop all subscribers. */
77
+ stop(): Promise<void>;
78
+ private discover;
79
+ private addInstance;
80
+ private connectLive;
81
+ private disconnectLive;
82
+ private handleLiveStatus;
83
+ private handleLiveFrame;
84
+ private scheduleLiveRecompute;
85
+ private recomputeLiveRun;
86
+ private insertDiskSession;
87
+ private insertDiskSummarySession;
88
+ private insertSession;
89
+ /**
90
+ * Bound `state.sessions` to the per-instance cap, evicting the oldest *completed*
91
+ * sessions by `startTs`. A still-running session is never evicted (its live fold
92
+ * is in flight); each drop emits a `session_removed` so browser subscribers stay
93
+ * in sync with the server-side map.
94
+ */
95
+ private evictSessionOverflow;
96
+ private watchArtifacts;
97
+ private watchMemoryArtifacts;
98
+ private scheduleArtifactReread;
99
+ private rereadArtifactSummaryFile;
100
+ private setupRegistryWatchers;
101
+ private scheduleReconcile;
102
+ private reconcile;
103
+ private updateInstance;
104
+ private removeInstance;
105
+ /** Close connections/watchers/timers for an instance without emitting any frames. */
106
+ private teardownState;
107
+ private scheduleInstancesEmit;
108
+ private emit;
109
+ private projectInstance;
110
+ private seedHistory;
111
+ private refreshDiskState;
112
+ private isActive;
113
+ private filteredStates;
114
+ private refreshStaleRunningSessions;
115
+ private refreshStaleRunningSessionsForState;
116
+ private countPagedSessions;
117
+ private now;
118
+ private isCurrentState;
119
+ private mapOptions;
120
+ private shouldDropMemoryLiveFrame;
121
+ private suppressMemoryLiveRun;
122
+ }
123
+ //# sourceMappingURL=aggregator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregator.d.ts","sourceRoot":"","sources":["../src/aggregator.ts"],"names":[],"mappings":"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"}