@slopus/happy-agent-client 0.0.20 → 0.0.22

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.
package/README.md CHANGED
@@ -12,19 +12,33 @@ emits ordered `connected`, `state_lost`, `disconnected`, and `event` items. A st
12
12
  carries the fresh cursor from which authoritative snapshots can be reloaded. Resource caching,
13
13
  version reconciliation, and optimistic mutations remain decisions for the live view built on top.
14
14
 
15
- `HappyReducer` is the small stateful layer over that feed. Construct it with a client, register
16
- update listeners, and start it when the application wants live synchronization. `getState()` and
17
- `subscribe()` expose a read-only Zustand-style external store suitable for
18
- `useSyncExternalStore`: the snapshot reference changes only when state changes. Every update
19
- listener registered with `subscribeUpdates()` receives every original ordered SSE item—connection
20
- changes, state loss, and ordinary events—after it has been reduced, together with that immutable
21
- snapshot. The initial state contains only `connection`, with `"connecting"`,
22
- `"connected"`, and `"disconnected"` values. Stopping is synchronous, immediately makes the
23
- reducer disconnected, and ignores any late update while stream cleanup finishes internally. A
24
- later start resumes from the last cursor the reducer observed.
15
+ `HappyReducer` is the stateful layer over that feed. Construct it with a client, register update
16
+ listeners, and start it when the application wants live synchronization. `getState()` and
17
+ `subscribe()` expose a read-only Zustand-style external store suitable for `useSyncExternalStore`:
18
+ the snapshot reference changes only when state changes, and unchanged agent children retain their
19
+ references. Every listener registered with `subscribeUpdates()` receives every original ordered
20
+ SSE item—connection changes, state loss, and ordinary events—after reduction, together with the
21
+ current snapshot.
22
+
23
+ State contains `connection` and an `agents` record keyed by Agent ID. Calling `agentVisible(id)`
24
+ registers visible interest and returns an idempotent cleanup that lowers the agent to background
25
+ priority. One agent bootstrap supplies its draft, last-used provider/model, context occupancy,
26
+ pending input, current activity phase, processes, and direct subagents. The reducer also reads the
27
+ focused question endpoint, and calls the separate activity endpoint only when an older compatible
28
+ daemon omits the additive activity fields. Pending messages leave state when a run accepts them;
29
+ the question becomes `null` when it is answered or canceled. At most three agents sync at once;
30
+ visible agents are selected before tracked background agents. The reducer opens SSE first, retains
31
+ a bounded 60-second event window, and reconciles each field against its private cursor before
32
+ reapplying events received during snapshot loading. A stream gap or broken resource-version chain
33
+ marks affected agents dirty and queues an authoritative refresh. Failed reads retry with
34
+ exponential backoff.
35
+
36
+ Stopping is synchronous: it immediately makes the reducer disconnected, aborts snapshot reads,
37
+ and ignores late results. A later start resumes the SSE cursor and refreshes every tracked agent.
25
38
 
26
39
  ```ts
27
40
  const reducer = new HappyReducer(client);
41
+ const hideAgent = reducer.agentVisible(agentId);
28
42
  const removeUpdateSubscription = reducer.subscribeUpdates((update, state) => {
29
43
  console.log(update.kind, state.connection);
30
44
  });
@@ -35,6 +49,7 @@ const removeStateSubscription = reducer.subscribe((state, previousState) => {
35
49
  reducer.start();
36
50
  console.log(reducer.getState());
37
51
  reducer.stop();
52
+ hideAgent();
38
53
  removeUpdateSubscription();
39
54
  removeStateSubscription();
40
55
  ```
@@ -188,7 +188,7 @@ export declare class HappyAgentClient {
188
188
  getAgent(agentId: Cuid2, options?: RequestOptions): Promise<AgentResponse>;
189
189
  /** `GET /v0/agents/:agentId/mode` — the last submitted message mode. */
190
190
  getAgentMode(agentId: Cuid2, options?: RequestOptions): Promise<AgentModeResponse>;
191
- /** `GET /v0/agents/:agentId/bootstrap` — mode, usage, pending messages, and cursor. */
191
+ /** `GET /v0/agents/:agentId/bootstrap` — current agent state, activity, and cursor. */
192
192
  getAgentBootstrap(agentId: Cuid2, options?: RequestOptions): Promise<AgentBootstrapResponse>;
193
193
  /**
194
194
  * `POST /v0/agents/:agentId/send` — queues a message, or steers the run.
@@ -488,7 +488,7 @@ export class HappyAgentClient {
488
488
  signal: options.signal,
489
489
  });
490
490
  }
491
- /** `GET /v0/agents/:agentId/bootstrap` — mode, usage, pending messages, and cursor. */
491
+ /** `GET /v0/agents/:agentId/bootstrap` — current agent state, activity, and cursor. */
492
492
  async getAgentBootstrap(agentId, options = {}) {
493
493
  return await this.#json({
494
494
  method: "GET",
@@ -1,6 +1,6 @@
1
1
  import type { HappyAgentClient } from "./HappyAgentClient.js";
2
2
  import type { HappyReducerState } from "./HappyReducerState.js";
3
- import type { EventCursor } from "./protocol/common.js";
3
+ import type { Cuid2, EventCursor } from "./protocol/common.js";
4
4
  import type { HappyAgentUpdate } from "./updates.js";
5
5
  /** Initial synchronization options for a reducer. */
6
6
  export interface HappyReducerOptions {
@@ -16,12 +16,12 @@ export type HappyReducerUnsubscribe = () => void;
16
16
  /**
17
17
  * The stateful layer over `HappyAgentClient.updates()`.
18
18
  *
19
- * This first reducer owns only connection state. It keeps the last observed
20
- * cursor privately so stopping and starting the same reducer resumes rather
21
- * than silently skipping changes. `getState` and `subscribe` form a read-only,
22
- * React-compatible external store: a snapshot is replaced only when state
23
- * changes, and unchanged children retain their references as the state grows.
24
- * Every SSE update is reduced before update listeners receive it.
19
+ * It keeps connection state and visibility-selected agent replicas. The SSE
20
+ * feed opens before queued agent snapshots, recent events rebase snapshots
21
+ * that race the stream, and dirty replicas refresh through a bounded queue.
22
+ * `getState` and `subscribe` form a read-only, React-compatible external store:
23
+ * a snapshot is replaced only when state changes, and unchanged children keep
24
+ * their references. Every SSE update is reduced before update listeners see it.
25
25
  */
26
26
  export declare class HappyReducer {
27
27
  #private;
@@ -35,6 +35,12 @@ export declare class HappyReducer {
35
35
  readonly subscribe: (listener: HappyReducerStateListener) => HappyReducerUnsubscribe;
36
36
  /** Subscribes to every ordered update from the SSE feed without starting the reducer. */
37
37
  readonly subscribeUpdates: (listener: HappyReducerUpdateListener) => HappyReducerUnsubscribe;
38
+ /**
39
+ * Marks an agent visible and queues an authoritative sync at visible priority.
40
+ * The returned idempotent cleanup lowers it to background priority; the reducer
41
+ * keeps the agent synchronized while it remains tracked.
42
+ */
43
+ readonly agentVisible: (agentId: Cuid2) => HappyReducerUnsubscribe;
38
44
  /** Starts following updates. Starting an already-running reducer does nothing. */
39
45
  start(): void;
40
46
  /** Stops synchronously. Any late updates from the old stream are ignored. */
@@ -1 +1 @@
1
- {"version":3,"file":"HappyReducer.d.ts","sourceRoot":"","sources":["../sources/HappyReducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAA0B,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAChC,iDAAiD;IACjD,KAAK,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CACnC;AAED,4EAA4E;AAC5E,MAAM,MAAM,0BAA0B,GAAG,CACrC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,iBAAiB,KACvB,IAAI,CAAC;AAEV,4EAA4E;AAC5E,MAAM,MAAM,yBAAyB,GAAG,CACpC,KAAK,EAAE,iBAAiB,EACxB,aAAa,EAAE,iBAAiB,KAC/B,IAAI,CAAC;AAEV,gFAAgF;AAChF,MAAM,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC;AAMjD;;;;;;;;;GASG;AACH,qBAAa,YAAY;;IAQrB,YAAY,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAE,mBAAwB,EAGtE;IAED,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,QAAO,iBAAiB,CAAgB;IAEzD;;;OAGG;IACH,QAAQ,CAAC,SAAS,aAAc,yBAAyB,KAAG,uBAAuB,CAKjF;IAEF,yFAAyF;IACzF,QAAQ,CAAC,gBAAgB,aAAc,0BAA0B,KAAG,uBAAuB,CAMzF;IAEF,kFAAkF;IAClF,KAAK,IAAI,IAAI,CAUZ;IAED,6EAA6E;IAC7E,IAAI,IAAI,IAAI,CAUX;CA0DJ"}
1
+ {"version":3,"file":"HappyReducer.d.ts","sourceRoot":"","sources":["../sources/HappyReducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAO9D,OAAO,KAAK,EAGR,iBAAiB,EACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAMrD,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAChC,iDAAiD;IACjD,KAAK,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CACnC;AAED,4EAA4E;AAC5E,MAAM,MAAM,0BAA0B,GAAG,CACrC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,iBAAiB,KACvB,IAAI,CAAC;AAEV,4EAA4E;AAC5E,MAAM,MAAM,yBAAyB,GAAG,CACpC,KAAK,EAAE,iBAAiB,EACxB,aAAa,EAAE,iBAAiB,KAC/B,IAAI,CAAC;AAEV,gFAAgF;AAChF,MAAM,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC;AAMjD;;;;;;;;;GASG;AACH,qBAAa,YAAY;;IAkBrB,YAAY,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAE,mBAAwB,EAGtE;IAED,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,QAAO,iBAAiB,CAAgB;IAEzD;;;OAGG;IACH,QAAQ,CAAC,SAAS,aAAc,yBAAyB,KAAG,uBAAuB,CAKjF;IAEF,yFAAyF;IACzF,QAAQ,CAAC,gBAAgB,aAAc,0BAA0B,KAAG,uBAAuB,CAMzF;IAEF;;;;OAIG;IACH,QAAQ,CAAC,YAAY,YAAa,KAAK,KAAG,uBAAuB,CAc/D;IAEF,kFAAkF;IAClF,KAAK,IAAI,IAAI,CAcZ;IAED,6EAA6E;IAC7E,IAAI,IAAI,IAAI,CAeX;CAuPJ"}
@@ -1,20 +1,35 @@
1
+ import { createHappyReducerAgentReplica, reduceHappyReducerAgentEvent, } from "./HappyReducerAgentReplica.js";
2
+ import { HappyReducerRecentEvents } from "./HappyReducerRecentEvents.js";
3
+ const MAX_CONCURRENT_AGENT_SYNCS = 3;
4
+ const INITIAL_AGENT_SYNC_RETRY_MS = 100;
5
+ const MAX_AGENT_SYNC_RETRY_MS = 10_000;
1
6
  /**
2
7
  * The stateful layer over `HappyAgentClient.updates()`.
3
8
  *
4
- * This first reducer owns only connection state. It keeps the last observed
5
- * cursor privately so stopping and starting the same reducer resumes rather
6
- * than silently skipping changes. `getState` and `subscribe` form a read-only,
7
- * React-compatible external store: a snapshot is replaced only when state
8
- * changes, and unchanged children retain their references as the state grows.
9
- * Every SSE update is reduced before update listeners receive it.
9
+ * It keeps connection state and visibility-selected agent replicas. The SSE
10
+ * feed opens before queued agent snapshots, recent events rebase snapshots
11
+ * that race the stream, and dirty replicas refresh through a bounded queue.
12
+ * `getState` and `subscribe` form a read-only, React-compatible external store:
13
+ * a snapshot is replaced only when state changes, and unchanged children keep
14
+ * their references. Every SSE update is reduced before update listeners see it.
10
15
  */
11
16
  export class HappyReducer {
12
17
  #client;
13
18
  #updateListeners = new Set();
14
19
  #stateListeners = new Set();
20
+ #trackedAgentIds = new Set();
21
+ #visibleAgentCounts = new Map();
22
+ #dirtyAgentIds = new Set();
23
+ #agentReplicas = new Map();
24
+ #agentSyncs = new Map();
25
+ #agentSyncRetryDelays = new Map();
26
+ #agentSyncRetryTimers = new Map();
27
+ #recentEvents = new HappyReducerRecentEvents();
15
28
  #connectionController;
29
+ #agentSyncEnabled = false;
30
+ #agentSyncConnected = false;
16
31
  #cursor;
17
- #state = Object.freeze({ connection: "disconnected" });
32
+ #state = { agents: {}, connection: "disconnected" };
18
33
  constructor(client, options = {}) {
19
34
  this.#client = client;
20
35
  this.#cursor = options.after;
@@ -39,6 +54,29 @@ export class HappyReducer {
39
54
  this.#updateListeners.delete(registration);
40
55
  };
41
56
  };
57
+ /**
58
+ * Marks an agent visible and queues an authoritative sync at visible priority.
59
+ * The returned idempotent cleanup lowers it to background priority; the reducer
60
+ * keeps the agent synchronized while it remains tracked.
61
+ */
62
+ agentVisible = (agentId) => {
63
+ this.#trackedAgentIds.add(agentId);
64
+ const previousCount = this.#visibleAgentCounts.get(agentId) ?? 0;
65
+ this.#visibleAgentCounts.set(agentId, previousCount + 1);
66
+ if (previousCount === 0)
67
+ this.#markAgentDirty(agentId);
68
+ let visible = true;
69
+ return () => {
70
+ if (!visible)
71
+ return;
72
+ visible = false;
73
+ const count = this.#visibleAgentCounts.get(agentId);
74
+ if (count === undefined || count <= 1)
75
+ this.#visibleAgentCounts.delete(agentId);
76
+ else
77
+ this.#visibleAgentCounts.set(agentId, count - 1);
78
+ };
79
+ };
42
80
  /** Starts following updates. Starting an already-running reducer does nothing. */
43
81
  start() {
44
82
  if (this.#connectionController !== undefined)
@@ -50,6 +88,10 @@ export class HappyReducer {
50
88
  if (this.#connectionController !== controller)
51
89
  return;
52
90
  void this.#follow(controller);
91
+ if (this.#connectionController !== controller)
92
+ return;
93
+ this.#agentSyncEnabled = true;
94
+ this.#markAllAgentsDirty();
53
95
  }
54
96
  /** Stops synchronously. Any late updates from the old stream are ignored. */
55
97
  stop() {
@@ -59,7 +101,13 @@ export class HappyReducer {
59
101
  return;
60
102
  }
61
103
  this.#connectionController = undefined;
104
+ this.#agentSyncEnabled = false;
105
+ this.#agentSyncConnected = false;
62
106
  controller.abort();
107
+ this.#stopAgentSyncs();
108
+ this.#recentEvents.invalidate();
109
+ for (const agentId of this.#trackedAgentIds)
110
+ this.#dirtyAgentIds.add(agentId);
63
111
  this.#setConnection("disconnected");
64
112
  }
65
113
  async #follow(controller) {
@@ -81,6 +129,12 @@ export class HappyReducer {
81
129
  finally {
82
130
  if (this.#connectionController === controller) {
83
131
  this.#connectionController = undefined;
132
+ this.#agentSyncEnabled = false;
133
+ this.#agentSyncConnected = false;
134
+ this.#stopAgentSyncs();
135
+ this.#recentEvents.invalidate();
136
+ for (const agentId of this.#trackedAgentIds)
137
+ this.#dirtyAgentIds.add(agentId);
84
138
  this.#setConnection("disconnected");
85
139
  }
86
140
  }
@@ -88,10 +142,23 @@ export class HappyReducer {
88
142
  #apply(update) {
89
143
  if (update.cursor !== undefined)
90
144
  this.#cursor = update.cursor;
91
- if (update.kind === "connected")
145
+ if (update.kind === "connected") {
146
+ this.#agentSyncConnected = true;
92
147
  this.#setConnection("connected");
93
- else if (update.kind === "disconnected")
148
+ this.#drainAgentSyncQueue();
149
+ }
150
+ else if (update.kind === "disconnected") {
151
+ this.#agentSyncConnected = false;
94
152
  this.#setConnection("disconnected");
153
+ }
154
+ else if (update.kind === "state_lost") {
155
+ this.#recentEvents.invalidate();
156
+ this.#markAllAgentsDirty();
157
+ }
158
+ else {
159
+ this.#recentEvents.remember(update.event, Date.now());
160
+ this.#applyAgentEvent(update.event);
161
+ }
95
162
  const state = this.#state;
96
163
  for (const { listener } of Array.from(this.#updateListeners)) {
97
164
  try {
@@ -107,9 +174,31 @@ export class HappyReducer {
107
174
  const previousState = this.#state;
108
175
  if (previousState.connection === connection)
109
176
  return;
110
- // Copy only the changed path. Future state branches remain referentially
111
- // stable when an unrelated branch changes.
112
- const state = Object.freeze({ ...previousState, connection });
177
+ const state = { ...previousState, connection };
178
+ this.#publishState(state, previousState);
179
+ }
180
+ #applyAgentEvent(event) {
181
+ for (const [agentId, replica] of Array.from(this.#agentReplicas)) {
182
+ const result = reduceHappyReducerAgentEvent(replica, event);
183
+ if (result.replica !== replica)
184
+ this.#commitAgentReplica(agentId, result.replica);
185
+ if (result.dirty)
186
+ this.#markAgentDirty(agentId);
187
+ }
188
+ }
189
+ #commitAgentReplica(agentId, replica) {
190
+ const previousReplica = this.#agentReplicas.get(agentId);
191
+ this.#agentReplicas.set(agentId, replica);
192
+ if (previousReplica?.state === replica.state)
193
+ return;
194
+ const previousState = this.#state;
195
+ const agents = {
196
+ ...previousState.agents,
197
+ [agentId]: replica.state,
198
+ };
199
+ this.#publishState({ ...previousState, agents }, previousState);
200
+ }
201
+ #publishState(state, previousState) {
113
202
  this.#state = state;
114
203
  for (const listener of Array.from(this.#stateListeners)) {
115
204
  try {
@@ -121,5 +210,142 @@ export class HappyReducer {
121
210
  }
122
211
  }
123
212
  }
213
+ #markAllAgentsDirty() {
214
+ for (const agentId of this.#trackedAgentIds)
215
+ this.#dirtyAgentIds.add(agentId);
216
+ this.#drainAgentSyncQueue();
217
+ }
218
+ #markAgentDirty(agentId) {
219
+ this.#dirtyAgentIds.add(agentId);
220
+ this.#drainAgentSyncQueue();
221
+ }
222
+ #drainAgentSyncQueue() {
223
+ if (!this.#agentSyncEnabled ||
224
+ !this.#agentSyncConnected ||
225
+ this.#connectionController === undefined) {
226
+ return;
227
+ }
228
+ while (this.#agentSyncs.size < MAX_CONCURRENT_AGENT_SYNCS) {
229
+ const agentId = this.#nextDirtyAgent();
230
+ if (agentId === undefined)
231
+ return;
232
+ this.#dirtyAgentIds.delete(agentId);
233
+ const controller = new AbortController();
234
+ this.#agentSyncs.set(agentId, controller);
235
+ void this.#syncAgent(agentId, controller);
236
+ }
237
+ }
238
+ #nextDirtyAgent() {
239
+ let background;
240
+ for (const agentId of this.#dirtyAgentIds) {
241
+ if (this.#agentSyncs.has(agentId) || this.#agentSyncRetryTimers.has(agentId)) {
242
+ continue;
243
+ }
244
+ if ((this.#visibleAgentCounts.get(agentId) ?? 0) > 0)
245
+ return agentId;
246
+ background ??= agentId;
247
+ }
248
+ return background;
249
+ }
250
+ async #syncAgent(agentId, controller) {
251
+ const startedAt = Date.now();
252
+ const recentEventsEpoch = this.#recentEvents.epoch;
253
+ const recentEventsCheckpoint = this.#recentEvents.checkpoint();
254
+ try {
255
+ const bootstrap = await this.#client.getAgentBootstrap(agentId, {
256
+ signal: controller.signal,
257
+ });
258
+ if (controller.signal.aborted || this.#agentSyncs.get(agentId) !== controller)
259
+ return;
260
+ let activity;
261
+ let activityCursors = {
262
+ processes: bootstrap.cursor,
263
+ subagents: bootstrap.cursor,
264
+ };
265
+ if (bootstrap.processes !== undefined && bootstrap.subagents !== undefined) {
266
+ activity = {
267
+ processes: bootstrap.processes,
268
+ subagents: bootstrap.subagents,
269
+ };
270
+ }
271
+ else {
272
+ const streamCursor = this.#cursor;
273
+ const fallbackCursor = streamCursor !== undefined && streamCursor > bootstrap.cursor
274
+ ? streamCursor
275
+ : bootstrap.cursor;
276
+ const fallback = await this.#client.getAgentActivity(agentId, {
277
+ signal: controller.signal,
278
+ });
279
+ if (controller.signal.aborted || this.#agentSyncs.get(agentId) !== controller) {
280
+ return;
281
+ }
282
+ activity = {
283
+ processes: bootstrap.processes ?? fallback.processes,
284
+ subagents: bootstrap.subagents ?? fallback.subagents,
285
+ };
286
+ activityCursors = {
287
+ processes: bootstrap.processes === undefined ? fallbackCursor : bootstrap.cursor,
288
+ subagents: bootstrap.subagents === undefined ? fallbackCursor : bootstrap.cursor,
289
+ };
290
+ }
291
+ const streamCursor = this.#cursor;
292
+ const questionCursor = streamCursor !== undefined && streamCursor > bootstrap.cursor
293
+ ? streamCursor
294
+ : bootstrap.cursor;
295
+ const { question } = await this.#client.getPendingQuestion(agentId, {
296
+ signal: controller.signal,
297
+ });
298
+ if (controller.signal.aborted || this.#agentSyncs.get(agentId) !== controller)
299
+ return;
300
+ let replica = createHappyReducerAgentReplica(bootstrap, activity, activityCursors, question, questionCursor, this.#agentReplicas.get(agentId));
301
+ let dirty = false;
302
+ const now = Date.now();
303
+ for (const event of this.#recentEvents.since(recentEventsCheckpoint, now)) {
304
+ const result = reduceHappyReducerAgentEvent(replica, event);
305
+ replica = result.replica;
306
+ dirty ||= result.dirty;
307
+ }
308
+ this.#commitAgentReplica(agentId, replica);
309
+ this.#agentSyncRetryDelays.delete(agentId);
310
+ if (dirty || !this.#recentEvents.isCompleteSince(recentEventsEpoch, startedAt, now)) {
311
+ this.#dirtyAgentIds.add(agentId);
312
+ }
313
+ }
314
+ catch {
315
+ const shouldRetry = !controller.signal.aborted && this.#agentSyncs.get(agentId) === controller;
316
+ controller.abort();
317
+ if (shouldRetry) {
318
+ this.#dirtyAgentIds.add(agentId);
319
+ this.#scheduleAgentSyncRetry(agentId);
320
+ }
321
+ }
322
+ finally {
323
+ if (this.#agentSyncs.get(agentId) === controller)
324
+ this.#agentSyncs.delete(agentId);
325
+ this.#drainAgentSyncQueue();
326
+ }
327
+ }
328
+ #scheduleAgentSyncRetry(agentId) {
329
+ if (this.#agentSyncRetryTimers.has(agentId) || !this.#agentSyncEnabled)
330
+ return;
331
+ const delay = this.#agentSyncRetryDelays.get(agentId) ?? INITIAL_AGENT_SYNC_RETRY_MS;
332
+ this.#agentSyncRetryDelays.set(agentId, Math.min(delay * 2, MAX_AGENT_SYNC_RETRY_MS));
333
+ const timer = setTimeout(() => {
334
+ if (this.#agentSyncRetryTimers.get(agentId) !== timer)
335
+ return;
336
+ this.#agentSyncRetryTimers.delete(agentId);
337
+ this.#drainAgentSyncQueue();
338
+ }, delay);
339
+ this.#agentSyncRetryTimers.set(agentId, timer);
340
+ }
341
+ #stopAgentSyncs() {
342
+ for (const controller of this.#agentSyncs.values())
343
+ controller.abort();
344
+ this.#agentSyncs.clear();
345
+ for (const timer of this.#agentSyncRetryTimers.values())
346
+ clearTimeout(timer);
347
+ this.#agentSyncRetryTimers.clear();
348
+ this.#agentSyncRetryDelays.clear();
349
+ }
124
350
  }
125
351
  //# sourceMappingURL=HappyReducer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HappyReducer.js","sourceRoot":"","sources":["../sources/HappyReducer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HappyReducer.js","sourceRoot":"","sources":["../sources/HappyReducer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { Agent, AgentActivityResponse } from "./protocol/agents.js";
2
+ import type { AgentBootstrapResponse } from "./protocol/bootstrap.js";
3
+ import type { EventCursor } from "./protocol/common.js";
4
+ import type { HappyAgentEvent } from "./protocol/events.js";
5
+ import type { Question } from "./protocol/questions.js";
6
+ import type { HappyReducerAgentState } from "./HappyReducerState.js";
7
+ export interface HappyReducerAgentReplica {
8
+ readonly agent: Agent;
9
+ readonly fieldCursors: HappyReducerAgentFieldCursors;
10
+ readonly state: HappyReducerAgentState;
11
+ }
12
+ interface HappyReducerAgentFieldCursors {
13
+ readonly context: EventCursor;
14
+ readonly draft: EventCursor;
15
+ readonly lastUsedModel: EventCursor;
16
+ readonly pending: EventCursor;
17
+ readonly processes: EventCursor;
18
+ readonly question: EventCursor;
19
+ readonly subagents: EventCursor;
20
+ }
21
+ export interface HappyReducerAgentEventResult {
22
+ readonly dirty: boolean;
23
+ readonly replica: HappyReducerAgentReplica;
24
+ }
25
+ interface HappyReducerAgentActivityCursors {
26
+ readonly processes: EventCursor;
27
+ readonly subagents: EventCursor;
28
+ }
29
+ /** Builds an authoritative snapshot while preserving unchanged public child references. */
30
+ export declare function createHappyReducerAgentReplica(bootstrap: AgentBootstrapResponse, activity: AgentActivityResponse, activityCursors: HappyReducerAgentActivityCursors, focusedQuestion: Question | null, questionCursor: EventCursor, previous: HappyReducerAgentReplica | undefined): HappyReducerAgentReplica;
31
+ /** Applies one SSE event to one agent replica, or marks it dirty on a broken version chain. */
32
+ export declare function reduceHappyReducerAgentEvent(current: HappyReducerAgentReplica, event: HappyAgentEvent): HappyReducerAgentEventResult;
33
+ export {};
34
+ //# sourceMappingURL=HappyReducerAgentReplica.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HappyReducerAgentReplica.d.ts","sourceRoot":"","sources":["../sources/HappyReducerAgentReplica.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAsB,MAAM,sBAAsB,CAAC;AAC7F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAgC,MAAM,sBAAsB,CAAC;AACtF,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,sBAAsB,CAAC;AAG5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAA0B,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAE7F,MAAM,WAAW,wBAAwB;IACrC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,6BAA6B,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAC;CAC1C;AAED,UAAU,6BAA6B;IACnC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;CACnC;AAED,MAAM,WAAW,4BAA4B;IACzC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;CAC9C;AAED,UAAU,gCAAgC;IACtC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;CACnC;AAED,2FAA2F;AAC3F,wBAAgB,8BAA8B,CAC1C,SAAS,EAAE,sBAAsB,EACjC,QAAQ,EAAE,qBAAqB,EAC/B,eAAe,EAAE,gCAAgC,EACjD,eAAe,EAAE,QAAQ,GAAG,IAAI,EAChC,cAAc,EAAE,WAAW,EAC3B,QAAQ,EAAE,wBAAwB,GAAG,SAAS,GAC/C,wBAAwB,CAkG1B;AAED,+FAA+F;AAC/F,wBAAgB,4BAA4B,CACxC,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,eAAe,GACvB,4BAA4B,CAsK9B"}
@@ -0,0 +1,404 @@
1
+ /** Builds an authoritative snapshot while preserving unchanged public child references. */
2
+ export function createHappyReducerAgentReplica(bootstrap, activity, activityCursors, focusedQuestion, questionCursor, previous) {
3
+ const previousState = previous?.state;
4
+ const previousFieldCursors = previous?.fieldCursors;
5
+ const rootAgent = previous !== undefined && previous.agent.version >= bootstrap.agent.version
6
+ ? previous.agent
7
+ : bootstrap.agent;
8
+ const keepPreviousDraft = isNewer(previousFieldCursors?.draft, bootstrap.cursor);
9
+ const draft = previousState !== undefined &&
10
+ (keepPreviousDraft || draftsEqual(previousState.draft, bootstrap.draft))
11
+ ? previousState.draft
12
+ : bootstrap.draft;
13
+ const model = modelFromMode(bootstrap.mode);
14
+ const keepPreviousLastUsedModel = isNewer(previousFieldCursors?.lastUsedModel, bootstrap.cursor);
15
+ const lastUsedModel = previousState !== undefined &&
16
+ (keepPreviousLastUsedModel || modelsEqual(previousState.lastUsedModel, model))
17
+ ? previousState.lastUsedModel
18
+ : model;
19
+ const keepPreviousContext = isNewer(previousFieldCursors?.context, bootstrap.cursor);
20
+ const context = previousState !== undefined &&
21
+ (keepPreviousContext || contextsEqual(previousState.context, bootstrap.context))
22
+ ? previousState.context
23
+ : bootstrap.context;
24
+ const keepPreviousPending = isNewer(previousFieldCursors?.pending, bootstrap.cursor);
25
+ const pending = keepPreviousPending
26
+ ? (previousState?.pending ?? bootstrap.pending)
27
+ : reconcilePending(previousState?.pending, bootstrap.pending);
28
+ const keepPreviousProcesses = isNewer(previousFieldCursors?.processes, activityCursors.processes);
29
+ const processes = keepPreviousProcesses
30
+ ? (previousState?.processes ?? activity.processes)
31
+ : reconcileVersionedList(previousState?.processes, activity.processes);
32
+ const keepPreviousSubagents = isNewer(previousFieldCursors?.subagents, activityCursors.subagents);
33
+ const subagents = keepPreviousSubagents
34
+ ? (previousState?.subagents ?? activity.subagents)
35
+ : reconcileVersionedList(previousState?.subagents, activity.subagents);
36
+ const keepPreviousQuestion = isNewer(previousFieldCursors?.question, questionCursor);
37
+ const question = keepPreviousQuestion
38
+ ? (previousState?.question ?? normalizeQuestion(focusedQuestion))
39
+ : reconcileQuestion(previousState?.question, focusedQuestion);
40
+ const state = previousState !== undefined &&
41
+ previousState.draft === draft &&
42
+ previousState.lastUsedModel === lastUsedModel &&
43
+ previousState.context === context &&
44
+ previousState.pending === pending &&
45
+ previousState.processes === processes &&
46
+ previousState.question === question &&
47
+ previousState.status === rootAgent.status &&
48
+ previousState.subagents === subagents
49
+ ? previousState
50
+ : {
51
+ context,
52
+ draft,
53
+ lastUsedModel,
54
+ pending,
55
+ processes,
56
+ question,
57
+ status: rootAgent.status,
58
+ subagents,
59
+ };
60
+ const nextFieldCursors = {
61
+ context: keepPreviousContext ? previousFieldCursors.context : bootstrap.cursor,
62
+ draft: keepPreviousDraft ? previousFieldCursors.draft : bootstrap.cursor,
63
+ lastUsedModel: keepPreviousLastUsedModel
64
+ ? previousFieldCursors.lastUsedModel
65
+ : bootstrap.cursor,
66
+ pending: keepPreviousPending ? previousFieldCursors.pending : bootstrap.cursor,
67
+ processes: keepPreviousProcesses
68
+ ? previousFieldCursors.processes
69
+ : activityCursors.processes,
70
+ question: keepPreviousQuestion ? previousFieldCursors.question : questionCursor,
71
+ subagents: keepPreviousSubagents
72
+ ? previousFieldCursors.subagents
73
+ : activityCursors.subagents,
74
+ };
75
+ const fieldCursors = fieldCursorsEqual(previousFieldCursors, nextFieldCursors)
76
+ ? previousFieldCursors
77
+ : nextFieldCursors;
78
+ if (previous?.agent === rootAgent &&
79
+ previous.fieldCursors === fieldCursors &&
80
+ previous.state === state) {
81
+ return previous;
82
+ }
83
+ return { agent: rootAgent, fieldCursors, state };
84
+ }
85
+ /** Applies one SSE event to one agent replica, or marks it dirty on a broken version chain. */
86
+ export function reduceHappyReducerAgentEvent(current, event) {
87
+ let agent = current.agent;
88
+ let fieldCursors = current.fieldCursors;
89
+ let state = current.state;
90
+ let dirty = false;
91
+ if (event.type === "agent.created") {
92
+ if (event.payload.agent.id === agent.id && event.payload.agent.version > agent.version) {
93
+ agent = event.payload.agent;
94
+ state = withStatus(state, agent.status);
95
+ if (event.cursor > fieldCursors.question) {
96
+ if (agent.pendingQuestionId === null) {
97
+ state = withQuestion(state, null);
98
+ fieldCursors = withFieldCursor(fieldCursors, "question", event.cursor);
99
+ }
100
+ else if (state.question?.id === agent.pendingQuestionId) {
101
+ fieldCursors = withFieldCursor(fieldCursors, "question", event.cursor);
102
+ }
103
+ else {
104
+ dirty = true;
105
+ }
106
+ }
107
+ }
108
+ if (event.payload.agent.parentAgentId === agent.id &&
109
+ event.cursor > fieldCursors.subagents) {
110
+ state = withSubagents(state, upsertNewest(state.subagents, event.payload.agent));
111
+ fieldCursors = withFieldCursor(fieldCursors, "subagents", event.cursor);
112
+ }
113
+ }
114
+ else if (event.type === "agent.updated") {
115
+ if (event.payload.agentId === agent.id) {
116
+ const previousAgent = agent;
117
+ const result = applyResourceUpdate(agent, event.payload);
118
+ agent = result.value;
119
+ dirty ||= result.dirty;
120
+ if (!result.dirty && agent !== previousAgent) {
121
+ state = withStatus(state, agent.status);
122
+ if (Object.hasOwn(event.payload.changes, "pendingQuestionId") &&
123
+ event.cursor > fieldCursors.question) {
124
+ if (agent.pendingQuestionId === null) {
125
+ state = withQuestion(state, null);
126
+ fieldCursors = withFieldCursor(fieldCursors, "question", event.cursor);
127
+ }
128
+ else if (state.question?.id === agent.pendingQuestionId) {
129
+ fieldCursors = withFieldCursor(fieldCursors, "question", event.cursor);
130
+ }
131
+ else {
132
+ dirty = true;
133
+ }
134
+ }
135
+ }
136
+ }
137
+ const subagentIndex = state.subagents.findIndex((subagent) => subagent.id === event.payload.agentId);
138
+ if (subagentIndex >= 0 && event.cursor > fieldCursors.subagents) {
139
+ const subagent = state.subagents[subagentIndex];
140
+ if (subagent !== undefined) {
141
+ const result = applyResourceUpdate(subagent, event.payload);
142
+ dirty ||= result.dirty;
143
+ if (result.value !== subagent) {
144
+ state = withSubagents(state, replaceAt(state.subagents, subagentIndex, result.value));
145
+ }
146
+ if (!result.dirty) {
147
+ fieldCursors = withFieldCursor(fieldCursors, "subagents", event.cursor);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ else if (event.type === "agent.context.updated" &&
153
+ event.payload.agentId === agent.id &&
154
+ event.cursor > fieldCursors.context) {
155
+ state = withContext(state, event.payload.context);
156
+ fieldCursors = withFieldCursor(fieldCursors, "context", event.cursor);
157
+ }
158
+ else if (event.type === "agent.draft.updated" &&
159
+ event.payload.agentId === agent.id &&
160
+ event.cursor > fieldCursors.draft) {
161
+ state = withDraft(state, event.payload.draft);
162
+ fieldCursors = withFieldCursor(fieldCursors, "draft", event.cursor);
163
+ }
164
+ else if (event.type === "message.created" &&
165
+ event.payload.agentId === agent.id &&
166
+ event.payload.message.role === "user") {
167
+ if (event.cursor > fieldCursors.lastUsedModel) {
168
+ state = withLastUsedModel(state, modelFromMode(event.payload.message.mode));
169
+ fieldCursors = withFieldCursor(fieldCursors, "lastUsedModel", event.cursor);
170
+ }
171
+ if (event.payload.message.status === "pending" && event.cursor > fieldCursors.pending) {
172
+ state = withPending(state, appendPending(state.pending, event.payload.message));
173
+ fieldCursors = withFieldCursor(fieldCursors, "pending", event.cursor);
174
+ }
175
+ }
176
+ else if ((event.type === "run.started" || event.type === "run.boundary") &&
177
+ event.payload.agentId === agent.id &&
178
+ event.cursor > fieldCursors.pending) {
179
+ state = withPending(state, removePending(state.pending, event.payload.acceptedMessageIds));
180
+ fieldCursors = withFieldCursor(fieldCursors, "pending", event.cursor);
181
+ }
182
+ else if (event.type === "question.created" &&
183
+ event.payload.question.agentId === agent.id &&
184
+ event.cursor > fieldCursors.question) {
185
+ state = withQuestion(state, reconcileQuestion(state.question, event.payload.question));
186
+ fieldCursors = withFieldCursor(fieldCursors, "question", event.cursor);
187
+ }
188
+ else if (event.type === "question.updated" &&
189
+ event.cursor > fieldCursors.question &&
190
+ (state.question?.id === event.payload.questionId ||
191
+ agent.pendingQuestionId === event.payload.questionId)) {
192
+ const question = state.question;
193
+ if (question === null || question.id !== event.payload.questionId) {
194
+ dirty = true;
195
+ }
196
+ else {
197
+ const result = applyResourceUpdate(question, event.payload);
198
+ dirty ||= result.dirty;
199
+ if (!result.dirty) {
200
+ state = withQuestion(state, normalizeQuestion(result.value));
201
+ fieldCursors = withFieldCursor(fieldCursors, "question", event.cursor);
202
+ }
203
+ }
204
+ }
205
+ else if (event.type === "process.started" &&
206
+ event.payload.process.agentId === agent.id &&
207
+ event.cursor > fieldCursors.processes) {
208
+ state = withProcesses(state, upsertNewest(state.processes, event.payload.process));
209
+ fieldCursors = withFieldCursor(fieldCursors, "processes", event.cursor);
210
+ }
211
+ else if (event.type === "process.updated" || event.type === "process.exited") {
212
+ const processIndex = state.processes.findIndex((process) => process.id === event.payload.processId);
213
+ if (processIndex >= 0 && event.cursor > fieldCursors.processes) {
214
+ const process = state.processes[processIndex];
215
+ if (process !== undefined) {
216
+ const result = applyResourceUpdate(process, event.payload);
217
+ dirty ||= result.dirty;
218
+ if (result.value !== process) {
219
+ state = withProcesses(state, replaceAt(state.processes, processIndex, result.value));
220
+ }
221
+ if (!result.dirty) {
222
+ fieldCursors = withFieldCursor(fieldCursors, "processes", event.cursor);
223
+ }
224
+ }
225
+ }
226
+ }
227
+ return {
228
+ dirty,
229
+ replica: agent === current.agent &&
230
+ fieldCursors === current.fieldCursors &&
231
+ state === current.state
232
+ ? current
233
+ : { agent, fieldCursors, state },
234
+ };
235
+ }
236
+ function isNewer(cursor, baseline) {
237
+ return cursor !== undefined && cursor > baseline;
238
+ }
239
+ function fieldCursorsEqual(left, right) {
240
+ return (left !== undefined &&
241
+ left.context === right.context &&
242
+ left.draft === right.draft &&
243
+ left.lastUsedModel === right.lastUsedModel &&
244
+ left.pending === right.pending &&
245
+ left.processes === right.processes &&
246
+ left.question === right.question &&
247
+ left.subagents === right.subagents);
248
+ }
249
+ function withFieldCursor(cursors, field, cursor) {
250
+ if (cursors[field] === cursor)
251
+ return cursors;
252
+ return { ...cursors, [field]: cursor };
253
+ }
254
+ function applyResourceUpdate(current, update) {
255
+ if (current.version >= update.version)
256
+ return { dirty: false, value: current };
257
+ if (current.version !== update.previousVersion)
258
+ return { dirty: true, value: current };
259
+ return {
260
+ dirty: false,
261
+ value: { ...current, ...update.changes, version: update.version },
262
+ };
263
+ }
264
+ function reconcileVersionedList(previous, incoming) {
265
+ if (previous === undefined)
266
+ return incoming;
267
+ const previousById = new Map(previous.map((resource) => [resource.id, resource]));
268
+ let changed = previous.length !== incoming.length;
269
+ const reconciled = incoming.map((resource, index) => {
270
+ const existing = previousById.get(resource.id);
271
+ const selected = existing !== undefined && existing.version >= resource.version ? existing : resource;
272
+ if (selected !== previous[index])
273
+ changed = true;
274
+ return selected;
275
+ });
276
+ return changed ? reconciled : previous;
277
+ }
278
+ function reconcilePending(previous, incoming) {
279
+ if (previous === undefined)
280
+ return incoming;
281
+ const previousById = new Map(previous.map((message) => [message.id, message]));
282
+ let changed = previous.length !== incoming.length;
283
+ const reconciled = incoming.map((message, index) => {
284
+ const selected = previousById.get(message.id) ?? message;
285
+ if (selected !== previous[index])
286
+ changed = true;
287
+ return selected;
288
+ });
289
+ return changed ? reconciled : previous;
290
+ }
291
+ function reconcileQuestion(previous, incoming) {
292
+ const normalized = normalizeQuestion(incoming);
293
+ if (previous === undefined || previous === null || normalized === null)
294
+ return normalized;
295
+ if (previous.id !== normalized.id)
296
+ return normalized;
297
+ return previous.version >= normalized.version ? previous : normalized;
298
+ }
299
+ function normalizeQuestion(question) {
300
+ return question?.status === "pending" ? question : null;
301
+ }
302
+ function upsertNewest(resources, incoming) {
303
+ const index = resources.findIndex((resource) => resource.id === incoming.id);
304
+ if (index < 0)
305
+ return [incoming, ...resources];
306
+ const current = resources[index];
307
+ if (current === undefined || current.version >= incoming.version)
308
+ return resources;
309
+ return replaceAt(resources, index, incoming);
310
+ }
311
+ function replaceAt(values, index, value) {
312
+ const next = values.slice();
313
+ next[index] = value;
314
+ return next;
315
+ }
316
+ function appendPending(pending, message) {
317
+ return pending.some((candidate) => candidate.id === message.id)
318
+ ? pending
319
+ : [...pending, message];
320
+ }
321
+ function removePending(pending, acceptedMessageIds) {
322
+ if (pending.length === 0 || acceptedMessageIds.length === 0)
323
+ return pending;
324
+ const accepted = new Set(acceptedMessageIds);
325
+ const remaining = pending.filter((message) => !accepted.has(message.id));
326
+ return remaining.length === pending.length ? pending : remaining;
327
+ }
328
+ function withContext(state, context) {
329
+ if (contextsEqual(state.context, context))
330
+ return state;
331
+ return { ...state, context };
332
+ }
333
+ function withDraft(state, draft) {
334
+ if (draftsEqual(state.draft, draft))
335
+ return state;
336
+ return { ...state, draft };
337
+ }
338
+ function withLastUsedModel(state, lastUsedModel) {
339
+ if (modelsEqual(state.lastUsedModel, lastUsedModel))
340
+ return state;
341
+ return { ...state, lastUsedModel };
342
+ }
343
+ function withPending(state, pending) {
344
+ if (state.pending === pending)
345
+ return state;
346
+ return { ...state, pending };
347
+ }
348
+ function withProcesses(state, processes) {
349
+ if (state.processes === processes)
350
+ return state;
351
+ return { ...state, processes };
352
+ }
353
+ function withQuestion(state, question) {
354
+ if (state.question === question)
355
+ return state;
356
+ return { ...state, question };
357
+ }
358
+ function withStatus(state, status) {
359
+ if (state.status === status)
360
+ return state;
361
+ return { ...state, status };
362
+ }
363
+ function withSubagents(state, subagents) {
364
+ if (state.subagents === subagents)
365
+ return state;
366
+ return { ...state, subagents };
367
+ }
368
+ function modelFromMode(mode) {
369
+ return mode === null ? null : { modelId: mode.modelId, providerId: mode.providerId };
370
+ }
371
+ function modelsEqual(left, right) {
372
+ return (left === right ||
373
+ (left !== null &&
374
+ right !== null &&
375
+ left.modelId === right.modelId &&
376
+ left.providerId === right.providerId));
377
+ }
378
+ function contextsEqual(left, right) {
379
+ return (left === right ||
380
+ (left !== null &&
381
+ right !== null &&
382
+ left.approximate === right.approximate &&
383
+ left.contextTokens === right.contextTokens &&
384
+ left.contextWindow === right.contextWindow &&
385
+ left.modelId === right.modelId &&
386
+ left.providerId === right.providerId));
387
+ }
388
+ function draftsEqual(left, right) {
389
+ if (left === right)
390
+ return true;
391
+ if (left.updatedAt !== right.updatedAt)
392
+ return false;
393
+ if (left.value === right.value)
394
+ return true;
395
+ if (left.value === null || right.value === null)
396
+ return false;
397
+ return (left.value.text === right.value.text &&
398
+ left.value.effort === right.value.effort &&
399
+ left.value.modelId === right.value.modelId &&
400
+ left.value.permissionMode === right.value.permissionMode &&
401
+ left.value.providerId === right.value.providerId &&
402
+ left.value.serviceTier === right.value.serviceTier);
403
+ }
404
+ //# sourceMappingURL=HappyReducerAgentReplica.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HappyReducerAgentReplica.js","sourceRoot":"","sources":["../sources/HappyReducerAgentReplica.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { HappyAgentEvent } from "./protocol/events.js";
2
+ /** A bounded race window used to rebase snapshots loaded after the SSE stream opened. */
3
+ export declare class HappyReducerRecentEvents {
4
+ #private;
5
+ get epoch(): number;
6
+ checkpoint(): number;
7
+ remember(event: HappyAgentEvent, now: number): void;
8
+ since(checkpoint: number, now: number): HappyAgentEvent[];
9
+ isCompleteSince(epoch: number, startedAt: number, now: number): boolean;
10
+ invalidate(): void;
11
+ }
12
+ //# sourceMappingURL=HappyReducerRecentEvents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HappyReducerRecentEvents.d.ts","sourceRoot":"","sources":["../sources/HappyReducerRecentEvents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAW5D,yFAAyF;AACzF,qBAAa,wBAAwB;;IAKjC,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,UAAU,IAAI,MAAM,CAEnB;IAED,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAOlD;IAED,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAKxD;IAED,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAGtE;IAED,UAAU,IAAI,IAAI,CAGjB;CAWJ"}
@@ -0,0 +1,48 @@
1
+ const RETENTION_MS = 60_000;
2
+ const MAX_EVENTS = 10_000;
3
+ /** A bounded race window used to rebase snapshots loaded after the SSE stream opened. */
4
+ export class HappyReducerRecentEvents {
5
+ #events = [];
6
+ #epoch = 0;
7
+ #nextSequence = 0;
8
+ get epoch() {
9
+ return this.#epoch;
10
+ }
11
+ checkpoint() {
12
+ return this.#nextSequence;
13
+ }
14
+ remember(event, now) {
15
+ this.#prune(now);
16
+ this.#events.push({ event, receivedAt: now, sequence: this.#nextSequence });
17
+ this.#nextSequence += 1;
18
+ if (this.#events.length <= MAX_EVENTS)
19
+ return;
20
+ this.#events.splice(0, this.#events.length - MAX_EVENTS);
21
+ this.#epoch += 1;
22
+ }
23
+ since(checkpoint, now) {
24
+ this.#prune(now);
25
+ return this.#events
26
+ .filter(({ sequence }) => sequence >= checkpoint)
27
+ .map(({ event }) => event);
28
+ }
29
+ isCompleteSince(epoch, startedAt, now) {
30
+ this.#prune(now);
31
+ return this.#epoch === epoch && now - startedAt <= RETENTION_MS;
32
+ }
33
+ invalidate() {
34
+ this.#events = [];
35
+ this.#epoch += 1;
36
+ }
37
+ #prune(now) {
38
+ const firstRetained = this.#events.findIndex(({ receivedAt }) => now - receivedAt <= RETENTION_MS);
39
+ if (firstRetained === 0 || this.#events.length === 0)
40
+ return;
41
+ if (firstRetained < 0)
42
+ this.#events = [];
43
+ else
44
+ this.#events.splice(0, firstRetained);
45
+ this.#epoch += 1;
46
+ }
47
+ }
48
+ //# sourceMappingURL=HappyReducerRecentEvents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HappyReducerRecentEvents.js","sourceRoot":"","sources":["../sources/HappyReducerRecentEvents.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,UAAU,GAAG,MAAM,CAAC;AAQ1B,yFAAyF;AACzF,MAAM,OAAO,wBAAwB;IACjC,OAAO,GAAkB,EAAE,CAAC;IAC5B,MAAM,GAAG,CAAC,CAAC;IACX,aAAa,GAAG,CAAC,CAAC;IAElB,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,QAAQ,CAAC,KAAsB,EAAE,GAAW;QACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,UAAU;YAAE,OAAO;QAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAkB,EAAE,GAAW;QACjC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC,OAAO;aACd,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,IAAI,UAAU,CAAC;aAChD,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,eAAe,CAAC,KAAa,EAAE,SAAiB,EAAE,GAAW;QACzD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,GAAG,SAAS,IAAI,YAAY,CAAC;IACpE,CAAC;IAED,UAAU;QACN,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,GAAW;QACd,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CACxC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,UAAU,IAAI,YAAY,CACvD,CAAC;QACF,IAAI,aAAa,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC7D,IAAI,aAAa,GAAG,CAAC;YAAE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;;YACpC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IACrB,CAAC;CACJ"}
@@ -1,7 +1,36 @@
1
+ import type { Agent, AgentDraftSnapshot, AgentStatus } from "./protocol/agents.js";
2
+ import type { Cuid2 } from "./protocol/common.js";
3
+ import type { UserMessage } from "./protocol/messages.js";
4
+ import type { BackgroundProcess } from "./protocol/processes.js";
5
+ import type { Question } from "./protocol/questions.js";
6
+ import type { AgentContextUsage } from "./protocol/usage.js";
1
7
  /** The reducer's current relationship to the daemon update stream. */
2
8
  export type HappyReducerConnection = "connecting" | "connected" | "disconnected";
9
+ /** The provider and model used by the agent's most recently submitted message. */
10
+ export interface HappyReducerAgentModel {
11
+ readonly modelId: string;
12
+ readonly providerId: string;
13
+ }
14
+ /** The synchronized current facts for one tracked agent. */
15
+ export interface HappyReducerAgentState {
16
+ readonly draft: AgentDraftSnapshot;
17
+ readonly lastUsedModel: HappyReducerAgentModel | null;
18
+ readonly context: AgentContextUsage | null;
19
+ /** Queued and steering input not yet accepted into a run, oldest first. */
20
+ readonly pending: readonly UserMessage[];
21
+ /** The one question currently waiting for this person, if any. */
22
+ readonly question: Question | null;
23
+ /** The agent's current inference or tool-execution phase. */
24
+ readonly status: AgentStatus;
25
+ /** Full process objects, newest first, including exited processes. */
26
+ readonly processes: readonly BackgroundProcess[];
27
+ /** Full direct subagent objects, newest first, including finished subagents. */
28
+ readonly subagents: readonly Agent[];
29
+ }
3
30
  /** The complete state currently maintained by `HappyReducer`. */
4
31
  export interface HappyReducerState {
5
32
  readonly connection: HappyReducerConnection;
33
+ /** Synchronized agents keyed by their stable Agent ID. */
34
+ readonly agents: Readonly<Record<Cuid2, HappyReducerAgentState>>;
6
35
  }
7
36
  //# sourceMappingURL=HappyReducerState.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"HappyReducerState.d.ts","sourceRoot":"","sources":["../sources/HappyReducerState.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;AAEjF,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;CAC/C"}
1
+ {"version":3,"file":"HappyReducerState.d.ts","sourceRoot":"","sources":["../sources/HappyReducerState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,sEAAsE;AACtE,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;AAEjF,kFAAkF;AAClF,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC/B;AAED,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACtD,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC3C,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACnC,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACjD,gFAAgF;IAChF,QAAQ,CAAC,SAAS,EAAE,SAAS,KAAK,EAAE,CAAC;CACxC;AAED,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC,CAAC;CACpE"}
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ export { HappyAgentClient } from "./HappyAgentClient.js";
2
2
  export type { HappyAgentClientOptions } from "./HappyAgentClient.js";
3
3
  export { HappyReducer } from "./HappyReducer.js";
4
4
  export type { HappyReducerOptions, HappyReducerStateListener, HappyReducerUnsubscribe, HappyReducerUpdateListener, } from "./HappyReducer.js";
5
- export type { HappyReducerConnection, HappyReducerState } from "./HappyReducerState.js";
5
+ export type { HappyReducerAgentModel, HappyReducerAgentState, HappyReducerConnection, HappyReducerState, } from "./HappyReducerState.js";
6
6
  export { HappyAgentApiError } from "./HappyAgentApiError.js";
7
7
  export type { ApiErrorBody } from "./HappyAgentApiError.js";
8
8
  export { EventStreamProtocolError, readEventStream } from "./readEventStream.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EACR,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,GAC7B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,cAAc,qBAAqB,CAAC;AAEpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EACR,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,GAC7B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACR,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,cAAc,qBAAqB,CAAC;AAEpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAQjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,cAAc,qBAAqB,CAAC;AAEpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAajD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,cAAc,qBAAqB,CAAC;AAEpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC"}
@@ -1,8 +1,9 @@
1
1
  /** Bootstrap: one request that gets a desktop client on screen instantly. */
2
- import type { AgentDraftResponse, AgentModeResponse, AgentResponse } from "./agents.js";
2
+ import type { Agent, AgentDraftResponse, AgentModeResponse, AgentResponse } from "./agents.js";
3
3
  import type { EventCursor } from "./common.js";
4
4
  import type { DaemonConfig, OnboardingState } from "./daemon.js";
5
5
  import type { UserMessage } from "./messages.js";
6
+ import type { BackgroundProcess } from "./processes.js";
6
7
  import type { Profile } from "./profile.js";
7
8
  import type { Project } from "./projects.js";
8
9
  import type { AgentUsageResponse } from "./usage.js";
@@ -17,6 +18,10 @@ import type { Workspace } from "./workspaces.js";
17
18
  export interface AgentBootstrapResponse extends AgentDraftResponse, AgentModeResponse, AgentResponse, AgentUsageResponse {
18
19
  /** Queued and steering messages not yet accepted by inference, oldest first. */
19
20
  pending: UserMessage[];
21
+ /** Full background-process activity, newest first. Absent on older compatible daemons. */
22
+ processes?: BackgroundProcess[];
23
+ /** Full child-agent activity, newest first. Absent on older compatible daemons. */
24
+ subagents?: Agent[];
20
25
  cursor: EventCursor;
21
26
  }
22
27
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../sources/protocol/bootstrap.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACxF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,WAAW,sBACb,SAAQ,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,kBAAkB;IAChF,gFAAgF;IAChF,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;CACvB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,wBAAwB;IACrC,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,eAAe,CAAC;IAC5B,8CAA8C;IAC9C,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,0EAA0E;IAC1E,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB;;;OAGG;IACH,MAAM,EAAE,WAAW,CAAC;CACvB"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../sources/protocol/bootstrap.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,WAAW,sBACb,SAAQ,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,kBAAkB;IAChF,gFAAgF;IAChF,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAChC,mFAAmF;IACnF,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;CACvB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,wBAAwB;IACrC,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,eAAe,CAAC;IAC5B,8CAA8C;IAC9C,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,0EAA0E;IAC1E,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB;;;OAGG;IACH,MAAM,EAAE,WAAW,CAAC;CACvB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slopus/happy-agent-client",
3
- "version": "0.0.20",
3
+ "version": "0.0.22",
4
4
  "description": "Typed client for the Happy agent HTTP API.",
5
5
  "license": "MIT",
6
6
  "repository": {