@kb-labs/agent-cli 0.5.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 (136) hide show
  1. package/README.md +56 -0
  2. package/dist/cli/commands/diff.d.ts +17 -0
  3. package/dist/cli/commands/diff.js +182 -0
  4. package/dist/cli/commands/diff.js.map +1 -0
  5. package/dist/cli/commands/history.d.ts +16 -0
  6. package/dist/cli/commands/history.js +216 -0
  7. package/dist/cli/commands/history.js.map +1 -0
  8. package/dist/cli/commands/quality-report.d.ts +21 -0
  9. package/dist/cli/commands/quality-report.js +457 -0
  10. package/dist/cli/commands/quality-report.js.map +1 -0
  11. package/dist/cli/commands/rollback.d.ts +27 -0
  12. package/dist/cli/commands/rollback.js +109 -0
  13. package/dist/cli/commands/rollback.js.map +1 -0
  14. package/dist/cli/commands/run.d.ts +42 -0
  15. package/dist/cli/commands/run.js +923 -0
  16. package/dist/cli/commands/run.js.map +1 -0
  17. package/dist/cli/commands/trace-context.d.ts +22 -0
  18. package/dist/cli/commands/trace-context.js +131 -0
  19. package/dist/cli/commands/trace-context.js.map +1 -0
  20. package/dist/cli/commands/trace-diagnose.d.ts +20 -0
  21. package/dist/cli/commands/trace-diagnose.js +434 -0
  22. package/dist/cli/commands/trace-diagnose.js.map +1 -0
  23. package/dist/cli/commands/trace-event-normalizer.d.ts +13 -0
  24. package/dist/cli/commands/trace-event-normalizer.js +39 -0
  25. package/dist/cli/commands/trace-event-normalizer.js.map +1 -0
  26. package/dist/cli/commands/trace-filter.d.ts +19 -0
  27. package/dist/cli/commands/trace-filter.js +153 -0
  28. package/dist/cli/commands/trace-filter.js.map +1 -0
  29. package/dist/cli/commands/trace-iteration.d.ts +18 -0
  30. package/dist/cli/commands/trace-iteration.js +192 -0
  31. package/dist/cli/commands/trace-iteration.js.map +1 -0
  32. package/dist/cli/commands/trace-stats.d.ts +17 -0
  33. package/dist/cli/commands/trace-stats.js +247 -0
  34. package/dist/cli/commands/trace-stats.js.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.js +473 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/manifest.d.ts +184 -0
  39. package/dist/manifest.js +473 -0
  40. package/dist/manifest.js.map +1 -0
  41. package/dist/rest/handlers/approve-handler.d.ts +15 -0
  42. package/dist/rest/handlers/approve-handler.js +60 -0
  43. package/dist/rest/handlers/approve-handler.js.map +1 -0
  44. package/dist/rest/handlers/approve-session-plan-handler.d.ts +10 -0
  45. package/dist/rest/handlers/approve-session-plan-handler.js +52 -0
  46. package/dist/rest/handlers/approve-session-plan-handler.js.map +1 -0
  47. package/dist/rest/handlers/correct-handler.d.ts +7 -0
  48. package/dist/rest/handlers/correct-handler.js +326 -0
  49. package/dist/rest/handlers/correct-handler.js.map +1 -0
  50. package/dist/rest/handlers/create-session-handler.d.ts +7 -0
  51. package/dist/rest/handlers/create-session-handler.js +25 -0
  52. package/dist/rest/handlers/create-session-handler.js.map +1 -0
  53. package/dist/rest/handlers/execute-session-plan-handler.d.ts +10 -0
  54. package/dist/rest/handlers/execute-session-plan-handler.js +635 -0
  55. package/dist/rest/handlers/execute-session-plan-handler.js.map +1 -0
  56. package/dist/rest/handlers/generate-spec-handler.d.ts +10 -0
  57. package/dist/rest/handlers/generate-spec-handler.js +389 -0
  58. package/dist/rest/handlers/generate-spec-handler.js.map +1 -0
  59. package/dist/rest/handlers/get-file-diff-handler.d.ts +24 -0
  60. package/dist/rest/handlers/get-file-diff-handler.js +44 -0
  61. package/dist/rest/handlers/get-file-diff-handler.js.map +1 -0
  62. package/dist/rest/handlers/get-session-handler.d.ts +10 -0
  63. package/dist/rest/handlers/get-session-handler.js +23 -0
  64. package/dist/rest/handlers/get-session-handler.js.map +1 -0
  65. package/dist/rest/handlers/get-session-plan-handler.d.ts +10 -0
  66. package/dist/rest/handlers/get-session-plan-handler.js +53 -0
  67. package/dist/rest/handlers/get-session-plan-handler.js.map +1 -0
  68. package/dist/rest/handlers/get-session-turns-handler.d.ts +16 -0
  69. package/dist/rest/handlers/get-session-turns-handler.js +35 -0
  70. package/dist/rest/handlers/get-session-turns-handler.js.map +1 -0
  71. package/dist/rest/handlers/get-spec-handler.d.ts +10 -0
  72. package/dist/rest/handlers/get-spec-handler.js +39 -0
  73. package/dist/rest/handlers/get-spec-handler.js.map +1 -0
  74. package/dist/rest/handlers/list-file-changes-handler.d.ts +13 -0
  75. package/dist/rest/handlers/list-file-changes-handler.js +34 -0
  76. package/dist/rest/handlers/list-file-changes-handler.js.map +1 -0
  77. package/dist/rest/handlers/list-sessions-handler.d.ts +7 -0
  78. package/dist/rest/handlers/list-sessions-handler.js +23 -0
  79. package/dist/rest/handlers/list-sessions-handler.js.map +1 -0
  80. package/dist/rest/handlers/rollback-handler.d.ts +22 -0
  81. package/dist/rest/handlers/rollback-handler.js +91 -0
  82. package/dist/rest/handlers/rollback-handler.js.map +1 -0
  83. package/dist/rest/handlers/run-handler.d.ts +7 -0
  84. package/dist/rest/handlers/run-handler.js +516 -0
  85. package/dist/rest/handlers/run-handler.js.map +1 -0
  86. package/dist/rest/handlers/sessions-handler.d.ts +18 -0
  87. package/dist/rest/handlers/sessions-handler.js +56 -0
  88. package/dist/rest/handlers/sessions-handler.js.map +1 -0
  89. package/dist/rest/handlers/status-handler.d.ts +7 -0
  90. package/dist/rest/handlers/status-handler.js +313 -0
  91. package/dist/rest/handlers/status-handler.js.map +1 -0
  92. package/dist/rest/handlers/stop-handler.d.ts +7 -0
  93. package/dist/rest/handlers/stop-handler.js +317 -0
  94. package/dist/rest/handlers/stop-handler.js.map +1 -0
  95. package/dist/widgets/220.js +446 -0
  96. package/dist/widgets/220.js.map +1 -0
  97. package/dist/widgets/331.js +2 -0
  98. package/dist/widgets/331.js.map +1 -0
  99. package/dist/widgets/403.js +2 -0
  100. package/dist/widgets/403.js.map +1 -0
  101. package/dist/widgets/406.js +35 -0
  102. package/dist/widgets/406.js.map +1 -0
  103. package/dist/widgets/455.js +2 -0
  104. package/dist/widgets/455.js.map +1 -0
  105. package/dist/widgets/482.js +2 -0
  106. package/dist/widgets/482.js.map +1 -0
  107. package/dist/widgets/485.js +2 -0
  108. package/dist/widgets/485.js.map +1 -0
  109. package/dist/widgets/527.js +2 -0
  110. package/dist/widgets/527.js.map +1 -0
  111. package/dist/widgets/628.js +2 -0
  112. package/dist/widgets/628.js.map +1 -0
  113. package/dist/widgets/694.js +2 -0
  114. package/dist/widgets/694.js.map +1 -0
  115. package/dist/widgets/712.js +2 -0
  116. package/dist/widgets/712.js.map +1 -0
  117. package/dist/widgets/866.js +2 -0
  118. package/dist/widgets/866.js.map +1 -0
  119. package/dist/widgets/915.js +39 -0
  120. package/dist/widgets/915.js.map +1 -0
  121. package/dist/widgets/957.js +10 -0
  122. package/dist/widgets/957.js.map +1 -0
  123. package/dist/widgets/983.js +2 -0
  124. package/dist/widgets/983.js.map +1 -0
  125. package/dist/widgets/@mf-types.d.ts +3 -0
  126. package/dist/widgets/@mf-types.zip +0 -0
  127. package/dist/widgets/__federation_expose_AgentsPage.js +2 -0
  128. package/dist/widgets/__federation_expose_AgentsPage.js.map +1 -0
  129. package/dist/widgets/mf-manifest.json +260 -0
  130. package/dist/widgets/mf-stats.json +305 -0
  131. package/dist/widgets/remoteEntry.js +7 -0
  132. package/dist/widgets/remoteEntry.js.map +1 -0
  133. package/dist/ws/session-stream-handler.d.ts +8 -0
  134. package/dist/ws/session-stream-handler.js +409 -0
  135. package/dist/ws/session-stream-handler.js.map +1 -0
  136. package/package.json +83 -0
@@ -0,0 +1,8 @@
1
+ import * as _kb_labs_plugin_contracts from '@kb-labs/plugin-contracts';
2
+ import { PluginContextV3 } from '@kb-labs/sdk';
3
+
4
+ declare const _default: {
5
+ execute(context: PluginContextV3<unknown>, input: _kb_labs_plugin_contracts.WSInput): Promise<_kb_labs_plugin_contracts.CommandResult | void>;
6
+ };
7
+
8
+ export { _default as default };
@@ -0,0 +1,409 @@
1
+ import { defineWebSocket, useCache, usePlatform } from '@kb-labs/sdk';
2
+ import { SessionManager } from '@kb-labs/agent-core';
3
+
4
+ // src/ws/session-stream-handler.ts
5
+ var CACHE_PREFIX = "agent:run:";
6
+ var EVENT_TOPIC_PREFIX = "agent:events:";
7
+ var CACHE_TTL = 36e5;
8
+ var RunManagerImpl = class {
9
+ /** Live agents and listeners (not cacheable) */
10
+ activeRuns = /* @__PURE__ */ new Map();
11
+ /** Session-level listeners: sessionId → Set<callback> — receive events from ALL runs in session */
12
+ sessionListeners = /* @__PURE__ */ new Map();
13
+ /** sessionId per runId — set when run is registered */
14
+ runSessionMap = /* @__PURE__ */ new Map();
15
+ /**
16
+ * Generate unique run ID
17
+ */
18
+ generateRunId() {
19
+ return `run-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
20
+ }
21
+ /**
22
+ * Register a new run
23
+ */
24
+ async register(runId, task, agent, sessionManager, sessionId) {
25
+ const now = (/* @__PURE__ */ new Date()).toISOString();
26
+ const run = {
27
+ runId,
28
+ task,
29
+ status: "pending",
30
+ agent,
31
+ sessionManager,
32
+ startedAt: now,
33
+ listeners: /* @__PURE__ */ new Set(),
34
+ lastSeq: 0,
35
+ eventBuffer: []
36
+ };
37
+ this.activeRuns.set(runId, run);
38
+ if (sessionId) {
39
+ this.runSessionMap.set(runId, sessionId);
40
+ }
41
+ await this.saveToCache(run);
42
+ return run;
43
+ }
44
+ /**
45
+ * Get run by ID (from memory first, then cache for state)
46
+ */
47
+ get(runId) {
48
+ return this.activeRuns.get(runId);
49
+ }
50
+ /**
51
+ * Check if run exists (in memory or cache)
52
+ */
53
+ async exists(runId) {
54
+ if (this.activeRuns.has(runId)) {
55
+ return true;
56
+ }
57
+ const state = await this.getState(runId);
58
+ return state !== null;
59
+ }
60
+ /**
61
+ * Get run state from cache (for completed runs or cross-process access)
62
+ */
63
+ async getState(runId) {
64
+ const cache = useCache();
65
+ if (!cache) {
66
+ return null;
67
+ }
68
+ return cache.get(`${CACHE_PREFIX}${runId}`);
69
+ }
70
+ /**
71
+ * Update run status
72
+ */
73
+ async updateStatus(runId, status, extra) {
74
+ const run = this.activeRuns.get(runId);
75
+ if (run) {
76
+ run.status = status;
77
+ if (extra) {
78
+ Object.assign(run, extra);
79
+ }
80
+ await this.saveToCache(run);
81
+ }
82
+ }
83
+ /**
84
+ * Save run state to cache
85
+ */
86
+ async saveToCache(run) {
87
+ const cache = useCache();
88
+ if (!cache) {
89
+ return;
90
+ }
91
+ const state = {
92
+ runId: run.runId,
93
+ task: run.task,
94
+ status: run.status,
95
+ startedAt: run.startedAt,
96
+ completedAt: run.completedAt,
97
+ durationMs: run.durationMs,
98
+ summary: run.summary,
99
+ error: run.error
100
+ };
101
+ await cache.set(`${CACHE_PREFIX}${run.runId}`, state, CACHE_TTL);
102
+ }
103
+ /** Track subscriptions for cleanup */
104
+ subscriptions = /* @__PURE__ */ new Map();
105
+ /**
106
+ * Add event listener to run (uses eventBus for cross-process)
107
+ */
108
+ addListener(runId, callback) {
109
+ const platform = usePlatform();
110
+ if (!platform?.eventBus) {
111
+ const run2 = this.activeRuns.get(runId);
112
+ if (run2) {
113
+ run2.listeners.add(callback);
114
+ return true;
115
+ }
116
+ return false;
117
+ }
118
+ const topic = `${EVENT_TOPIC_PREFIX}${runId}`;
119
+ const unsubscribe = platform.eventBus.subscribe(topic, async (event) => {
120
+ try {
121
+ callback(event);
122
+ } catch {
123
+ }
124
+ });
125
+ if (!this.subscriptions.has(runId)) {
126
+ this.subscriptions.set(runId, /* @__PURE__ */ new Map());
127
+ }
128
+ this.subscriptions.get(runId).set(callback, unsubscribe);
129
+ const run = this.activeRuns.get(runId);
130
+ if (run) {
131
+ run.listeners.add(callback);
132
+ }
133
+ return true;
134
+ }
135
+ /**
136
+ * Remove event listener from run
137
+ */
138
+ removeListener(runId, callback) {
139
+ const runSubs = this.subscriptions.get(runId);
140
+ if (runSubs) {
141
+ const unsubscribe = runSubs.get(callback);
142
+ if (unsubscribe) {
143
+ unsubscribe();
144
+ runSubs.delete(callback);
145
+ }
146
+ if (runSubs.size === 0) {
147
+ this.subscriptions.delete(runId);
148
+ }
149
+ }
150
+ const run = this.activeRuns.get(runId);
151
+ if (run) {
152
+ run.listeners.delete(callback);
153
+ }
154
+ }
155
+ /**
156
+ * Broadcast event to all listeners of a run (uses eventBus for cross-process)
157
+ * Assigns monotonic sequence number for reliable ordering
158
+ * @returns The event with seq assigned (for persistence)
159
+ */
160
+ broadcast(runId, event) {
161
+ const platform = usePlatform();
162
+ const run = this.activeRuns.get(runId);
163
+ let seqEvent = event;
164
+ if (run) {
165
+ run.lastSeq++;
166
+ seqEvent = { ...event, seq: run.lastSeq, runId };
167
+ run.eventBuffer.push(seqEvent);
168
+ }
169
+ if (platform?.eventBus) {
170
+ const topic = `${EVENT_TOPIC_PREFIX}${runId}`;
171
+ platform.eventBus.publish(topic, seqEvent).catch(() => {
172
+ });
173
+ }
174
+ if (run) {
175
+ for (const listener of run.listeners) {
176
+ try {
177
+ listener(seqEvent);
178
+ } catch {
179
+ }
180
+ }
181
+ }
182
+ const sessionId = this.runSessionMap.get(runId);
183
+ if (sessionId) {
184
+ const sListeners = this.sessionListeners.get(sessionId);
185
+ if (sListeners) {
186
+ for (const listener of sListeners) {
187
+ try {
188
+ listener(seqEvent);
189
+ } catch {
190
+ }
191
+ }
192
+ }
193
+ }
194
+ return seqEvent;
195
+ }
196
+ /**
197
+ * Add a session-level listener — receives events from ALL runs in this session.
198
+ */
199
+ addSessionListener(sessionId, callback) {
200
+ if (!this.sessionListeners.has(sessionId)) {
201
+ this.sessionListeners.set(sessionId, /* @__PURE__ */ new Set());
202
+ }
203
+ this.sessionListeners.get(sessionId).add(callback);
204
+ }
205
+ /**
206
+ * Remove a session-level listener.
207
+ */
208
+ removeSessionListener(sessionId, callback) {
209
+ const listeners = this.sessionListeners.get(sessionId);
210
+ if (listeners) {
211
+ listeners.delete(callback);
212
+ if (listeners.size === 0) {
213
+ this.sessionListeners.delete(sessionId);
214
+ }
215
+ }
216
+ }
217
+ /**
218
+ * Get replay buffer for a run (all events emitted since start).
219
+ * Used by WS handler to send missed events on late connection.
220
+ * Optionally filter by afterSeq to only get events the client hasn't seen.
221
+ */
222
+ getEventBuffer(runId, afterSeq) {
223
+ const run = this.activeRuns.get(runId);
224
+ if (!run) {
225
+ return [];
226
+ }
227
+ if (afterSeq != null) {
228
+ return run.eventBuffer.filter((e) => e.seq != null && e.seq > afterSeq);
229
+ }
230
+ return [...run.eventBuffer];
231
+ }
232
+ /**
233
+ * List all active runs
234
+ */
235
+ listActive() {
236
+ return Array.from(this.activeRuns.values()).map((r) => ({
237
+ runId: r.runId,
238
+ task: r.task,
239
+ status: r.status,
240
+ startedAt: r.startedAt
241
+ }));
242
+ }
243
+ /**
244
+ * Request graceful stop of a running agent (and its child agents via propagated AbortSignal).
245
+ * Agent finishes its current tool call then exits at the next iteration boundary.
246
+ */
247
+ requestStop(runId) {
248
+ const run = this.activeRuns.get(runId);
249
+ if (!run || run.status !== "running" || !run.agent) {
250
+ return false;
251
+ }
252
+ run.agent.requestStop();
253
+ return true;
254
+ }
255
+ /**
256
+ * Clean up completed runs from memory (cache handles its own TTL)
257
+ */
258
+ cleanup() {
259
+ for (const [runId, run] of this.activeRuns) {
260
+ if (run.status === "completed" || run.status === "failed" || run.status === "stopped") {
261
+ this.activeRuns.delete(runId);
262
+ }
263
+ }
264
+ }
265
+ };
266
+ var GLOBAL_KEY = "__kb_agent_run_manager__";
267
+ if (!globalThis[GLOBAL_KEY]) {
268
+ globalThis[GLOBAL_KEY] = new RunManagerImpl();
269
+ }
270
+ var RunManager = globalThis[GLOBAL_KEY];
271
+ function getTurnIdFromEvent(event) {
272
+ if ((event.type === "agent:start" || event.type === "agent:end" || event.type === "agent:error") && !event.parentAgentId && event.agentId) {
273
+ return `turn-${event.agentId}`;
274
+ }
275
+ return null;
276
+ }
277
+ function getTurnSignature(turn) {
278
+ return `${turn.id}:${turn.status}:${turn.completedAt || ""}:${turn.steps.length}`;
279
+ }
280
+ async function resolveTurnForEvent(sessionManager, sessionId, event) {
281
+ const turns = await sessionManager.getTurns(sessionId);
282
+ if (turns.length === 0) {
283
+ return null;
284
+ }
285
+ const explicitTurnId = getTurnIdFromEvent(event);
286
+ if (explicitTurnId) {
287
+ const explicit = turns.find((turn) => turn.id === explicitTurnId);
288
+ if (explicit) {
289
+ return explicit;
290
+ }
291
+ }
292
+ const assistantTurns = turns.filter((turn) => turn.type === "assistant").sort((a, b) => b.sequence - a.sequence);
293
+ return assistantTurns[0] || null;
294
+ }
295
+ var connectionState = /* @__PURE__ */ new WeakMap();
296
+ var session_stream_handler_default = defineWebSocket({
297
+ path: "/session/:sessionId",
298
+ description: "Persistent session event stream (all runs)",
299
+ handler: {
300
+ async onConnect(ctx, sender) {
301
+ const sessionId = ctx.hostContext.params?.sessionId;
302
+ if (!sessionId) {
303
+ await sender.send({
304
+ type: "error",
305
+ payload: { code: "MISSING_SESSION_ID", message: "Session ID is required" },
306
+ timestamp: Date.now()
307
+ });
308
+ sender.close(4e3, "Missing session ID");
309
+ return;
310
+ }
311
+ ctx.platform.logger.info(`[session-ws] Client connected to session ${sessionId}`);
312
+ const sessionManager = new SessionManager(ctx.cwd);
313
+ const lastTurnSignatures = /* @__PURE__ */ new Map();
314
+ await sender.send({
315
+ type: "connection:ready",
316
+ payload: { runId: sessionId, connectedAt: (/* @__PURE__ */ new Date()).toISOString() },
317
+ timestamp: Date.now()
318
+ });
319
+ try {
320
+ const snapshot = await sessionManager.getConversationSnapshot(sessionId);
321
+ await sender.send({
322
+ type: "conversation:snapshot",
323
+ payload: {
324
+ sessionId,
325
+ completedTurns: snapshot.completedTurns,
326
+ activeTurns: snapshot.activeTurns,
327
+ totalTurns: snapshot.totalTurns,
328
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
329
+ },
330
+ timestamp: Date.now()
331
+ });
332
+ ctx.platform.logger.info(
333
+ `[session-ws] Sent snapshot: ${snapshot.completedTurns.length} completed + ${snapshot.activeTurns.length} active turns`
334
+ );
335
+ } catch (err) {
336
+ ctx.platform.logger.error(`[session-ws] Failed to send snapshot: ${err}`);
337
+ }
338
+ const eventCallback = async (event) => {
339
+ const evtSessionId = event.sessionId || event.metadata?.sessionId;
340
+ if (evtSessionId && evtSessionId !== sessionId) {
341
+ return;
342
+ }
343
+ const targetSessionId = evtSessionId || sessionId;
344
+ try {
345
+ const turn = await resolveTurnForEvent(sessionManager, targetSessionId, event);
346
+ if (turn) {
347
+ const signature = getTurnSignature(turn);
348
+ const previousSignature = lastTurnSignatures.get(turn.id);
349
+ if (previousSignature !== signature) {
350
+ lastTurnSignatures.set(turn.id, signature);
351
+ await sender.send({
352
+ type: "turn:snapshot",
353
+ payload: { sessionId: targetSessionId, turn, sequenceNumber: turn.sequence },
354
+ timestamp: Date.now()
355
+ });
356
+ }
357
+ }
358
+ } catch (err) {
359
+ ctx.platform.logger.error(`[session-ws] Failed to process turn snapshot: ${err}`);
360
+ }
361
+ if (event.type === "agent:end" && !event.parentAgentId) {
362
+ const runId = event.runId || event.metadata?.runId;
363
+ await sender.send({
364
+ type: "run:completed",
365
+ payload: {
366
+ runId: runId ?? "unknown",
367
+ success: event.data.success,
368
+ summary: event.data.summary,
369
+ durationMs: event.data.durationMs
370
+ },
371
+ timestamp: Date.now()
372
+ });
373
+ }
374
+ };
375
+ connectionState.set(ctx, { sessionId, callback: eventCallback });
376
+ RunManager.addSessionListener(sessionId, eventCallback);
377
+ },
378
+ async onMessage(ctx, message, sender) {
379
+ if (message.type === "ping") {
380
+ const sessionId = connectionState.get(ctx)?.sessionId ?? "";
381
+ await sender.send({
382
+ type: "connection:ready",
383
+ payload: { runId: sessionId ?? "", connectedAt: (/* @__PURE__ */ new Date()).toISOString() },
384
+ timestamp: Date.now()
385
+ });
386
+ }
387
+ },
388
+ async onDisconnect(ctx) {
389
+ const state = connectionState.get(ctx);
390
+ if (state) {
391
+ RunManager.removeSessionListener(state.sessionId, state.callback);
392
+ connectionState.delete(ctx);
393
+ }
394
+ ctx.platform.logger.info(`[session-ws] Client disconnected from session ${state?.sessionId}`);
395
+ },
396
+ async onError(ctx, error, sender) {
397
+ ctx.platform.logger.error(`[session-ws] WebSocket error: ${error.message}`);
398
+ await sender.send({
399
+ type: "error",
400
+ payload: { code: "INTERNAL_ERROR", message: error.message },
401
+ timestamp: Date.now()
402
+ });
403
+ }
404
+ }
405
+ });
406
+
407
+ export { session_stream_handler_default as default };
408
+ //# sourceMappingURL=session-stream-handler.js.map
409
+ //# sourceMappingURL=session-stream-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/rest/run-manager.ts","../../src/ws/session-stream-handler.ts"],"names":["run"],"mappings":"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","file":"session-stream-handler.js","sourcesContent":["/**\n * Run Manager - tracks active agent runs for REST/WS API\n *\n * Uses platform cache for persistence and in-memory Map for active agents.\n * Cache stores serializable run state, Map stores live agent references.\n * Uses platform eventBus for cross-process event broadcasting.\n */\n\nimport type { IAgentRunner } from '@kb-labs/agent-sdk';\nimport type { SessionManager } from '@kb-labs/agent-core';\nimport type { AgentEvent, AgentEventCallback } from '@kb-labs/agent-contracts';\nimport { useCache, usePlatform } from '@kb-labs/sdk';\n\nconst CACHE_PREFIX = 'agent:run:';\nconst EVENT_TOPIC_PREFIX = 'agent:events:';\nconst CACHE_TTL = 3600000; // 1 hour\n\n/**\n * Run status\n */\nexport type RunStatus = 'pending' | 'running' | 'completed' | 'failed' | 'stopped';\n\n/**\n * Serializable run state (stored in cache)\n */\nexport interface RunState {\n runId: string;\n task: string;\n status: RunStatus;\n startedAt: string;\n completedAt?: string;\n durationMs?: number;\n summary?: string;\n error?: string;\n}\n\n/**\n * Active run with live agent (in-memory only)\n */\nexport interface ActiveRun extends RunState {\n agent?: IAgentRunner;\n sessionManager: SessionManager;\n listeners: Set<AgentEventCallback>;\n /** Monotonic sequence counter for event ordering */\n lastSeq: number;\n /** Replay buffer: all events emitted since run start (for late WS connections) */\n eventBuffer: AgentEvent[];\n}\n\n/**\n * Run Manager implementation\n */\nclass RunManagerImpl {\n /** Live agents and listeners (not cacheable) */\n private activeRuns: Map<string, ActiveRun> = new Map();\n\n /** Session-level listeners: sessionId → Set<callback> — receive events from ALL runs in session */\n private sessionListeners: Map<string, Set<AgentEventCallback>> = new Map();\n\n /** sessionId per runId — set when run is registered */\n private runSessionMap: Map<string, string> = new Map();\n\n /**\n * Generate unique run ID\n */\n generateRunId(): string {\n return `run-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n }\n\n /**\n * Register a new run\n */\n async register(\n runId: string,\n task: string,\n agent: IAgentRunner | undefined,\n sessionManager: SessionManager,\n sessionId?: string\n ): Promise<ActiveRun> {\n const now = new Date().toISOString();\n\n const run: ActiveRun = {\n runId,\n task,\n status: 'pending',\n agent,\n sessionManager,\n startedAt: now,\n listeners: new Set(),\n lastSeq: 0,\n eventBuffer: [],\n };\n\n // Store in memory (for live agent)\n this.activeRuns.set(runId, run);\n\n // Track sessionId → runId mapping for session-level listeners\n if (sessionId) {\n this.runSessionMap.set(runId, sessionId);\n }\n\n // Store serializable state in cache\n await this.saveToCache(run);\n\n return run;\n }\n\n /**\n * Get run by ID (from memory first, then cache for state)\n */\n get(runId: string): ActiveRun | undefined {\n return this.activeRuns.get(runId);\n }\n\n /**\n * Check if run exists (in memory or cache)\n */\n async exists(runId: string): Promise<boolean> {\n // Check memory first\n if (this.activeRuns.has(runId)) {\n return true;\n }\n // Fallback to cache\n const state = await this.getState(runId);\n return state !== null;\n }\n\n /**\n * Get run state from cache (for completed runs or cross-process access)\n */\n async getState(runId: string): Promise<RunState | null> {\n const cache = useCache();\n if (!cache) {return null;}\n\n return cache.get<RunState>(`${CACHE_PREFIX}${runId}`);\n }\n\n /**\n * Update run status\n */\n async updateStatus(runId: string, status: RunStatus, extra?: Partial<RunState>): Promise<void> {\n const run = this.activeRuns.get(runId);\n if (run) {\n run.status = status;\n if (extra) {\n Object.assign(run, extra);\n }\n await this.saveToCache(run);\n }\n }\n\n /**\n * Save run state to cache\n */\n private async saveToCache(run: ActiveRun): Promise<void> {\n const cache = useCache();\n if (!cache) {return;}\n\n const state: RunState = {\n runId: run.runId,\n task: run.task,\n status: run.status,\n startedAt: run.startedAt,\n completedAt: run.completedAt,\n durationMs: run.durationMs,\n summary: run.summary,\n error: run.error,\n };\n\n await cache.set(`${CACHE_PREFIX}${run.runId}`, state, CACHE_TTL);\n }\n\n /** Track subscriptions for cleanup */\n private subscriptions: Map<string, Map<AgentEventCallback, () => void>> = new Map();\n\n /**\n * Add event listener to run (uses eventBus for cross-process)\n */\n addListener(runId: string, callback: AgentEventCallback): boolean {\n const platform = usePlatform();\n if (!platform?.eventBus) {\n // Fallback to in-memory only\n const run = this.activeRuns.get(runId);\n if (run) {\n run.listeners.add(callback);\n return true;\n }\n return false;\n }\n\n // Subscribe to eventBus topic for this run\n const topic = `${EVENT_TOPIC_PREFIX}${runId}`;\n const unsubscribe = platform.eventBus.subscribe<AgentEvent>(topic, async (event) => {\n try {\n callback(event);\n } catch {\n // Ignore callback errors\n }\n });\n\n // Track subscription for cleanup\n if (!this.subscriptions.has(runId)) {\n this.subscriptions.set(runId, new Map());\n }\n this.subscriptions.get(runId)!.set(callback, unsubscribe);\n\n // Also add to in-memory if run exists locally\n const run = this.activeRuns.get(runId);\n if (run) {\n run.listeners.add(callback);\n }\n\n return true;\n }\n\n /**\n * Remove event listener from run\n */\n removeListener(runId: string, callback: AgentEventCallback): void {\n // Unsubscribe from eventBus\n const runSubs = this.subscriptions.get(runId);\n if (runSubs) {\n const unsubscribe = runSubs.get(callback);\n if (unsubscribe) {\n unsubscribe();\n runSubs.delete(callback);\n }\n if (runSubs.size === 0) {\n this.subscriptions.delete(runId);\n }\n }\n\n // Also remove from in-memory\n const run = this.activeRuns.get(runId);\n if (run) {\n run.listeners.delete(callback);\n }\n }\n\n /**\n * Broadcast event to all listeners of a run (uses eventBus for cross-process)\n * Assigns monotonic sequence number for reliable ordering\n * @returns The event with seq assigned (for persistence)\n */\n broadcast(runId: string, event: AgentEvent): AgentEvent {\n const platform = usePlatform();\n const run = this.activeRuns.get(runId);\n\n // Assign sequence number for ordering\n let seqEvent = event;\n if (run) {\n run.lastSeq++;\n seqEvent = { ...event, seq: run.lastSeq, runId };\n\n // Store in replay buffer (for late WS connections)\n run.eventBuffer.push(seqEvent);\n }\n\n // Publish to eventBus for cross-process delivery\n if (platform?.eventBus) {\n const topic = `${EVENT_TOPIC_PREFIX}${runId}`;\n platform.eventBus.publish(topic, seqEvent).catch(() => {\n // Ignore publish errors\n });\n }\n\n // Also notify local in-memory listeners (for same-process)\n if (run) {\n for (const listener of run.listeners) {\n try {\n listener(seqEvent);\n } catch {\n // Ignore listener errors\n }\n }\n }\n\n // Notify session-level listeners (persistent connections)\n const sessionId = this.runSessionMap.get(runId);\n if (sessionId) {\n const sListeners = this.sessionListeners.get(sessionId);\n if (sListeners) {\n for (const listener of sListeners) {\n try {\n listener(seqEvent);\n } catch {\n // Ignore listener errors\n }\n }\n }\n }\n\n return seqEvent;\n }\n\n /**\n * Add a session-level listener — receives events from ALL runs in this session.\n */\n addSessionListener(sessionId: string, callback: AgentEventCallback): void {\n if (!this.sessionListeners.has(sessionId)) {\n this.sessionListeners.set(sessionId, new Set());\n }\n this.sessionListeners.get(sessionId)!.add(callback);\n }\n\n /**\n * Remove a session-level listener.\n */\n removeSessionListener(sessionId: string, callback: AgentEventCallback): void {\n const listeners = this.sessionListeners.get(sessionId);\n if (listeners) {\n listeners.delete(callback);\n if (listeners.size === 0) {\n this.sessionListeners.delete(sessionId);\n }\n }\n }\n\n /**\n * Get replay buffer for a run (all events emitted since start).\n * Used by WS handler to send missed events on late connection.\n * Optionally filter by afterSeq to only get events the client hasn't seen.\n */\n getEventBuffer(runId: string, afterSeq?: number): AgentEvent[] {\n const run = this.activeRuns.get(runId);\n if (!run) {return [];}\n\n if (afterSeq != null) {\n return run.eventBuffer.filter((e) => e.seq != null && e.seq > afterSeq);\n }\n return [...run.eventBuffer];\n }\n\n /**\n * List all active runs\n */\n listActive(): Array<{ runId: string; task: string; status: RunStatus; startedAt: string }> {\n return Array.from(this.activeRuns.values()).map(r => ({\n runId: r.runId,\n task: r.task,\n status: r.status,\n startedAt: r.startedAt,\n }));\n }\n\n /**\n * Request graceful stop of a running agent (and its child agents via propagated AbortSignal).\n * Agent finishes its current tool call then exits at the next iteration boundary.\n */\n requestStop(runId: string): boolean {\n const run = this.activeRuns.get(runId);\n if (!run || run.status !== 'running' || !run.agent) {\n return false;\n }\n run.agent.requestStop();\n return true;\n }\n\n /**\n * Clean up completed runs from memory (cache handles its own TTL)\n */\n cleanup(): void {\n for (const [runId, run] of this.activeRuns) {\n if (run.status === 'completed' || run.status === 'failed' || run.status === 'stopped') {\n // Remove from memory but keep in cache\n this.activeRuns.delete(runId);\n }\n }\n }\n}\n\n/**\n * Singleton instance — stored on globalThis so all bundled modules share one instance.\n * When tsup compiles multiple entry points, each gets its own module scope,\n * so a plain `export const RunManager = new RunManagerImpl()` creates separate instances.\n * Using globalThis ensures run-handler.js and session-stream-handler.js share one RunManager.\n */\nconst GLOBAL_KEY = '__kb_agent_run_manager__';\nif (!(globalThis as Record<string, unknown>)[GLOBAL_KEY]) {\n (globalThis as Record<string, unknown>)[GLOBAL_KEY] = new RunManagerImpl();\n}\nexport const RunManager = (globalThis as Record<string, unknown>)[GLOBAL_KEY] as RunManagerImpl;\n","/**\n * WebSocket handler for session-level event streaming\n *\n * Path: /session/:sessionId\n * Single persistent connection per session — streams turn:snapshot for ALL runs in the session.\n * Unlike /events/:runId which closes when a run ends, this stays open for the entire session.\n */\n\n/* eslint-disable @typescript-eslint/consistent-type-imports */\n\nimport {\n defineWebSocket,\n type PluginContextV3,\n type TypedSender,\n} from '@kb-labs/sdk';\nimport type {\n ServerMessage,\n ClientMessage,\n ConnectionReadyMessage,\n RunCompletedMessage,\n ErrorMessage,\n TurnSnapshotMessage,\n ConversationSnapshotMessage,\n AgentEvent,\n Turn,\n} from '@kb-labs/agent-contracts';\nimport { RunManager } from '../rest/run-manager.js';\nimport { SessionManager } from '@kb-labs/agent-core';\n\nfunction getTurnIdFromEvent(event: AgentEvent): string | null {\n if ((event.type === 'agent:start' || event.type === 'agent:end' || event.type === 'agent:error') && !event.parentAgentId && event.agentId) {\n return `turn-${event.agentId}`;\n }\n return null;\n}\n\nfunction getTurnSignature(turn: Turn): string {\n return `${turn.id}:${turn.status}:${turn.completedAt || ''}:${turn.steps.length}`;\n}\n\nasync function resolveTurnForEvent(\n sessionManager: SessionManager,\n sessionId: string,\n event: AgentEvent\n): Promise<Turn | null> {\n const turns = await sessionManager.getTurns(sessionId);\n if (turns.length === 0) {\n return null;\n }\n\n const explicitTurnId = getTurnIdFromEvent(event);\n if (explicitTurnId) {\n const explicit = turns.find((turn: Turn) => turn.id === explicitTurnId);\n if (explicit) {\n return explicit;\n }\n }\n\n // For tool/llm/status events, send latest assistant turn snapshot.\n const assistantTurns = turns\n .filter((turn: Turn) => turn.type === 'assistant')\n .sort((a: Turn, b: Turn) => b.sequence - a.sequence);\n return assistantTurns[0] || null;\n}\n\ninterface SessionConnectionState {\n sessionId: string;\n callback: import('@kb-labs/agent-contracts').AgentEventCallback;\n}\n\n/** Per-connection state keyed by the opaque ctx object — avoids mutating ctx */\nconst connectionState = new WeakMap<object, SessionConnectionState>();\n\nexport default defineWebSocket<unknown, ClientMessage, ServerMessage>({\n path: '/session/:sessionId',\n description: 'Persistent session event stream (all runs)',\n\n handler: {\n async onConnect(ctx: PluginContextV3, sender: TypedSender<ServerMessage>) {\n const sessionId = (ctx.hostContext as { params?: { sessionId?: string } }).params?.sessionId;\n\n if (!sessionId) {\n await sender.send({\n type: 'error',\n payload: { code: 'MISSING_SESSION_ID', message: 'Session ID is required' },\n timestamp: Date.now(),\n } satisfies ErrorMessage);\n sender.close(4000, 'Missing session ID');\n return;\n }\n\n ctx.platform.logger.info(`[session-ws] Client connected to session ${sessionId}`);\n\n const sessionManager = new SessionManager(ctx.cwd);\n const lastTurnSignatures = new Map<string, string>();\n\n // Send connection:ready immediately\n await sender.send({\n type: 'connection:ready',\n payload: { runId: sessionId, connectedAt: new Date().toISOString() },\n timestamp: Date.now(),\n } satisfies ConnectionReadyMessage);\n\n // Send conversation:snapshot (history)\n try {\n const snapshot = await sessionManager.getConversationSnapshot(sessionId);\n await sender.send({\n type: 'conversation:snapshot',\n payload: {\n sessionId,\n completedTurns: snapshot.completedTurns,\n activeTurns: snapshot.activeTurns,\n totalTurns: snapshot.totalTurns,\n timestamp: new Date().toISOString(),\n },\n timestamp: Date.now(),\n } satisfies ConversationSnapshotMessage);\n ctx.platform.logger.info(\n `[session-ws] Sent snapshot: ${snapshot.completedTurns.length} completed + ${snapshot.activeTurns.length} active turns`\n );\n } catch (err) {\n ctx.platform.logger.error(`[session-ws] Failed to send snapshot: ${err}`);\n }\n\n // Session-level event callback — registered on ALL active runs in this session\n const eventCallback = async (event: import('@kb-labs/agent-contracts').AgentEvent) => {\n // Resolve sessionId from event\n const evtSessionId = (event as { sessionId?: string }).sessionId\n || (event.metadata?.sessionId as string | undefined);\n\n // Only forward events belonging to this session\n if (evtSessionId && evtSessionId !== sessionId) {\n return;\n }\n\n const targetSessionId = evtSessionId || sessionId;\n\n try {\n const turn = await resolveTurnForEvent(sessionManager, targetSessionId, event);\n if (turn) {\n const signature = getTurnSignature(turn);\n const previousSignature = lastTurnSignatures.get(turn.id);\n if (previousSignature !== signature) {\n lastTurnSignatures.set(turn.id, signature);\n\n await sender.send({\n type: 'turn:snapshot',\n payload: { sessionId: targetSessionId, turn, sequenceNumber: turn.sequence },\n timestamp: Date.now(),\n } satisfies TurnSnapshotMessage);\n }\n }\n } catch (err) {\n ctx.platform.logger.error(`[session-ws] Failed to process turn snapshot: ${err}`);\n }\n\n // Notify run completion\n if (event.type === 'agent:end' && !event.parentAgentId) {\n const runId = (event as { runId?: string }).runId || (event.metadata?.runId as string | undefined);\n await sender.send({\n type: 'run:completed',\n payload: {\n runId: runId ?? 'unknown',\n success: event.data.success,\n summary: event.data.summary,\n durationMs: event.data.durationMs,\n },\n timestamp: Date.now(),\n } satisfies RunCompletedMessage);\n }\n };\n\n // Store callback for cleanup in a WeakMap keyed by ctx — no ctx mutation\n connectionState.set(ctx as object, { sessionId, callback: eventCallback });\n\n // Register on all currently active runs in this session\n RunManager.addSessionListener(sessionId, eventCallback);\n },\n\n async onMessage(ctx: PluginContextV3, message: ClientMessage, sender: TypedSender<ServerMessage>) {\n // Handle ping or corrections here if needed\n if (message.type === 'ping') {\n const sessionId = connectionState.get(ctx as object)?.sessionId ?? '';\n await sender.send({\n type: 'connection:ready',\n payload: { runId: sessionId ?? '', connectedAt: new Date().toISOString() },\n timestamp: Date.now(),\n });\n }\n },\n\n async onDisconnect(ctx: PluginContextV3) {\n const state = connectionState.get(ctx as object);\n if (state) {\n RunManager.removeSessionListener(state.sessionId, state.callback);\n connectionState.delete(ctx as object);\n }\n\n ctx.platform.logger.info(`[session-ws] Client disconnected from session ${state?.sessionId}`);\n },\n\n async onError(ctx: PluginContextV3, error: Error, sender: TypedSender<ServerMessage>) {\n ctx.platform.logger.error(`[session-ws] WebSocket error: ${error.message}`);\n await sender.send({\n type: 'error',\n payload: { code: 'INTERNAL_ERROR', message: error.message },\n timestamp: Date.now(),\n } satisfies ErrorMessage);\n },\n },\n});\n"]}
package/package.json ADDED
@@ -0,0 +1,83 @@
1
+ {
2
+ "name": "@kb-labs/agent-cli",
3
+ "version": "0.5.0",
4
+ "type": "module",
5
+ "description": "CLI commands for KB Labs Agents V2. Provides agent:run-v2 command.",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ },
13
+ "./plugin-manifest": {
14
+ "import": "./dist/manifest.js",
15
+ "types": "./dist/manifest.d.ts"
16
+ },
17
+ "./dist/*": "./dist/*"
18
+ },
19
+ "kb": {
20
+ "manifest": "./dist/manifest.js"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "README.md",
25
+ "LICENSE"
26
+ ],
27
+ "sideEffects": false,
28
+ "scripts": {
29
+ "pretype-check": "pnpm --filter @kb-labs/agent-cli build",
30
+ "clean": "rimraf dist",
31
+ "build": "tsup --config tsup.config.ts && pnpm run build:studio",
32
+ "build:cli": "tsup --config tsup.config.ts",
33
+ "build:studio": "rspack build --config rspack.studio.config.mjs",
34
+ "dev": "tsup --config tsup.config.ts --watch",
35
+ "dev:studio": "rspack serve --config rspack.studio.config.mjs",
36
+ "lint": "eslint src --ext .ts,.tsx",
37
+ "lint:fix": "eslint . --fix",
38
+ "type-check": "tsc --noEmit",
39
+ "test": "vitest run --passWithNoTests",
40
+ "test:watch": "vitest"
41
+ },
42
+ "dependencies": {
43
+ "@kb-labs/agent-contracts": "^0.1.0",
44
+ "@kb-labs/agent-core": "^0.1.0",
45
+ "@kb-labs/agent-history": "^0.5.0",
46
+ "@kb-labs/agent-kernel": "^0.1.0",
47
+ "@kb-labs/agent-runtime": "^0.1.0",
48
+ "@kb-labs/agent-sdk": "^0.1.0",
49
+ "@kb-labs/agent-store": "^0.1.0",
50
+ "@kb-labs/agent-tools": "^0.5.0",
51
+ "@kb-labs/agent-tracing": "^0.5.0",
52
+ "@kb-labs/sdk": "^1.4.0",
53
+ "zod": "^3.23.8"
54
+ },
55
+ "peerDependencies": {
56
+ "@ant-design/icons": "^5.0.0",
57
+ "@tanstack/react-query": "^5.0.0",
58
+ "antd": "^5.0.0",
59
+ "react": ">=18.0.0",
60
+ "react-dom": ">=18.0.0",
61
+ "react-router-dom": ">=6.0.0"
62
+ },
63
+ "devDependencies": {
64
+ "@kb-labs/devkit": "link:../../../../infra/kb-labs-devkit",
65
+ "@kb-labs/plugin-runtime": "link:../../../../infra/kb-labs-plugin/packages/plugin-runtime",
66
+ "@kb-labs/studio-plugin-tools": "link:../../../../platform/kb-labs-studio/packages/studio-plugin-tools",
67
+ "@rspack/cli": "latest",
68
+ "@rspack/core": "latest",
69
+ "@types/node": "^24.3.3",
70
+ "@types/react": "^18.3.18",
71
+ "@types/react-dom": "^18.3.5",
72
+ "react": "^18.3.1",
73
+ "react-dom": "^18.3.1",
74
+ "rimraf": "^6.0.1",
75
+ "tsup": "^8.5.0",
76
+ "typescript": "^5.6.3",
77
+ "vitest": "^3.2.4"
78
+ },
79
+ "engines": {
80
+ "node": ">=20.0.0",
81
+ "pnpm": ">=9.0.0"
82
+ }
83
+ }