@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 +25 -10
- package/dist/HappyAgentClient.d.ts +1 -1
- package/dist/HappyAgentClient.js +1 -1
- package/dist/HappyReducer.d.ts +13 -7
- package/dist/HappyReducer.d.ts.map +1 -1
- package/dist/HappyReducer.js +238 -12
- package/dist/HappyReducer.js.map +1 -1
- package/dist/HappyReducerAgentReplica.d.ts +34 -0
- package/dist/HappyReducerAgentReplica.d.ts.map +1 -0
- package/dist/HappyReducerAgentReplica.js +404 -0
- package/dist/HappyReducerAgentReplica.js.map +1 -0
- package/dist/HappyReducerRecentEvents.d.ts +12 -0
- package/dist/HappyReducerRecentEvents.d.ts.map +1 -0
- package/dist/HappyReducerRecentEvents.js +48 -0
- package/dist/HappyReducerRecentEvents.js.map +1 -0
- package/dist/HappyReducerState.d.ts +29 -0
- package/dist/HappyReducerState.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/protocol/bootstrap.d.ts +6 -1
- package/dist/protocol/bootstrap.d.ts.map +1 -1
- package/package.json +1 -1
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
|
|
16
|
-
|
|
17
|
-
`subscribe()` expose a read-only Zustand-style external store suitable for
|
|
18
|
-
|
|
19
|
-
listener registered with `subscribeUpdates()` receives every original ordered
|
|
20
|
-
changes, state loss, and ordinary events—after
|
|
21
|
-
snapshot.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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` —
|
|
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.
|
package/dist/HappyAgentClient.js
CHANGED
|
@@ -488,7 +488,7 @@ export class HappyAgentClient {
|
|
|
488
488
|
signal: options.signal,
|
|
489
489
|
});
|
|
490
490
|
}
|
|
491
|
-
/** `GET /v0/agents/:agentId/bootstrap` —
|
|
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",
|
package/dist/HappyReducer.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* React-compatible external store:
|
|
23
|
-
*
|
|
24
|
-
* Every SSE update is reduced before update listeners
|
|
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;
|
|
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"}
|
package/dist/HappyReducer.js
CHANGED
|
@@ -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
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* React-compatible external store:
|
|
8
|
-
*
|
|
9
|
-
* Every SSE update is reduced before update listeners
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
package/dist/HappyReducer.js.map
CHANGED
|
@@ -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":"AACA,OAAO,EACH,8BAA8B,EAC9B,4BAA4B,GAE/B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAWzE,MAAM,0BAA0B,GAAG,CAAC,CAAC;AACrC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AACxC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AA2BvC;;;;;;;;;GASG;AACH,MAAM,OAAO,YAAY;IACZ,OAAO,CAAmB;IAC1B,gBAAgB,GAAG,IAAI,GAAG,EAA8B,CAAC;IACzD,eAAe,GAAG,IAAI,GAAG,EAA6B,CAAC;IACvD,gBAAgB,GAAG,IAAI,GAAG,EAAS,CAAC;IACpC,mBAAmB,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC/C,cAAc,GAAG,IAAI,GAAG,EAAS,CAAC;IAClC,cAAc,GAAG,IAAI,GAAG,EAAmC,CAAC;IAC5D,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;IAChD,qBAAqB,GAAG,IAAI,GAAG,EAAiB,CAAC;IACjD,qBAAqB,GAAG,IAAI,GAAG,EAAwC,CAAC;IACxE,aAAa,GAAG,IAAI,wBAAwB,EAAE,CAAC;IACxD,qBAAqB,CAA8B;IACnD,iBAAiB,GAAG,KAAK,CAAC;IAC1B,mBAAmB,GAAG,KAAK,CAAC;IAC5B,OAAO,CAA0B;IACjC,MAAM,GAAsB,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;IAEvE,YAAY,MAAwB,EAAE,OAAO,GAAwB,EAAE;QACnE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;IACjC,CAAC;IAED,0EAA0E;IACjE,QAAQ,GAAG,GAAsB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;IAEzD;;;OAGG;IACM,SAAS,GAAG,CAAC,QAAmC,EAA2B,EAAE;QAClF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE;YACR,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,yFAAyF;IAChF,gBAAgB,GAAG,CAAC,QAAoC,EAA2B,EAAE;QAC1F,MAAM,YAAY,GAAG,EAAE,QAAQ,EAAE,CAAC;QAClC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACR,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC/C,CAAC,CAAC;IACN,CAAC,CAAC;IAEF;;;;OAIG;IACM,YAAY,GAAG,CAAC,OAAc,EAA2B,EAAE;QAChE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjE,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;QACzD,IAAI,aAAa,KAAK,CAAC;YAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAEvD,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,OAAO,GAAG,EAAE;YACR,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,OAAO,GAAG,KAAK,CAAC;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACpD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,CAAC;gBAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;;gBAC3E,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,kFAAkF;IAClF,KAAK;QACD,IAAI,IAAI,CAAC,qBAAqB,KAAK,SAAS;YAAE,OAAO;QAErD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,qBAAqB,GAAG,UAAU,CAAC;QACxC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAElC,+DAA+D;QAC/D,IAAI,IAAI,CAAC,qBAAqB,KAAK,UAAU;YAAE,OAAO;QACtD,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,qBAAqB,KAAK,UAAU;YAAE,OAAO;QAEtD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC/B,CAAC;IAED,6EAA6E;IAC7E,IAAI;QACA,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAC9C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;YACpC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QACvC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QACjC,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAChC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB;YAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9E,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAA2B;QACrC,IAAI,CAAC;YACD,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;gBAC5C,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC9D,MAAM,EAAE,UAAU,CAAC,MAAM;aAC5B,CAAC,EAAE,CAAC;gBACD,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO;gBACtC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,mEAAmE;YACnE,kEAAkE;YAClE,mEAAmE;QACvE,CAAC;gBAAS,CAAC;YACP,IAAI,IAAI,CAAC,qBAAqB,KAAK,UAAU,EAAE,CAAC;gBAC5C,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;gBACvC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;gBAC/B,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;gBACjC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;gBAChC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB;oBAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC9E,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;YACxC,CAAC;QACL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,MAAwB;QAC3B,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9D,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC9B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YACjC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACxC,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;YACjC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACtC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;YAChC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC/B,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAE1B,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACD,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACL,8DAA8D;gBAC9D,8DAA8D;YAClE,CAAC;QACL,CAAC;IACL,CAAC;IAED,cAAc,CAAC,UAAkC;QAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;QAClC,IAAI,aAAa,CAAC,UAAU,KAAK,UAAU;YAAE,OAAO;QAEpD,MAAM,KAAK,GAAsB,EAAE,GAAG,aAAa,EAAE,UAAU,EAAE,CAAC;QAClE,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAC7C,CAAC;IAED,gBAAgB,CAAC,KAAsB;QACnC,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC/D,MAAM,MAAM,GAAG,4BAA4B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC5D,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO;gBAAE,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAClF,IAAI,MAAM,CAAC,KAAK;gBAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAED,mBAAmB,CAAC,OAAc,EAAE,OAAiC;QACjE,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,IAAI,eAAe,EAAE,KAAK,KAAK,OAAO,CAAC,KAAK;YAAE,OAAO;QAErD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;QAClC,MAAM,MAAM,GAAoD;YAC5D,GAAG,aAAa,CAAC,MAAM;YACvB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,KAAK;SAC3B,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,aAAa,EAAE,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC;IACpE,CAAC;IAED,aAAa,CAAC,KAAwB,EAAE,aAAgC;QACpE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC;gBACD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YACnC,CAAC;YAAC,MAAM,CAAC;gBACL,+DAA+D;gBAC/D,kCAAkC;YACtC,CAAC;QACL,CAAC;IACL,CAAC;IAED,mBAAmB;QACf,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB;YAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9E,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAED,eAAe,CAAC,OAAc;QAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAED,oBAAoB;QAChB,IACI,CAAC,IAAI,CAAC,iBAAiB;YACvB,CAAC,IAAI,CAAC,mBAAmB;YACzB,IAAI,CAAC,qBAAqB,KAAK,SAAS,EAC1C,CAAC;YACC,OAAO;QACX,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,0BAA0B,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACvC,IAAI,OAAO,KAAK,SAAS;gBAAE,OAAO;YAClC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAC1C,KAAK,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;IAED,eAAe;QACX,IAAI,UAA6B,CAAC;QAClC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3E,SAAS;YACb,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;gBAAE,OAAO,OAAO,CAAC;YACrE,UAAU,KAAK,OAAO,CAAC;QAC3B,CAAC;QACD,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAc,EAAE,UAA2B;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QACnD,MAAM,sBAAsB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAC/D,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE;gBAC5D,MAAM,EAAE,UAAU,CAAC,MAAM;aAC5B,CAAC,CAAC;YACH,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,UAAU;gBAAE,OAAO;YAEtF,IAAI,QAA+B,CAAC;YACpC,IAAI,eAAe,GAAG;gBAClB,SAAS,EAAE,SAAS,CAAC,MAAM;gBAC3B,SAAS,EAAE,SAAS,CAAC,MAAM;aAC9B,CAAC;YACF,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACzE,QAAQ,GAAG;oBACP,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,SAAS,EAAE,SAAS,CAAC,SAAS;iBACjC,CAAC;YACN,CAAC;iBAAM,CAAC;gBACJ,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC;gBAClC,MAAM,cAAc,GAChB,YAAY,KAAK,SAAS,IAAI,YAAY,GAAG,SAAS,CAAC,MAAM;oBACzD,CAAC,CAAC,YAAY;oBACd,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;gBAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE;oBAC1D,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC5B,CAAC,CAAC;gBACH,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,UAAU,EAAE,CAAC;oBAC5E,OAAO;gBACX,CAAC;gBACD,QAAQ,GAAG;oBACP,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS;oBACpD,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS;iBACvD,CAAC;gBACF,eAAe,GAAG;oBACd,SAAS,EACL,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM;oBACzE,SAAS,EACL,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM;iBAC5E,CAAC;YACN,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC;YAClC,MAAM,cAAc,GAChB,YAAY,KAAK,SAAS,IAAI,YAAY,GAAG,SAAS,CAAC,MAAM;gBACzD,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;YAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,EAAE;gBAChE,MAAM,EAAE,UAAU,CAAC,MAAM;aAC5B,CAAC,CAAC;YACH,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,UAAU;gBAAE,OAAO;YAEtF,IAAI,OAAO,GAAG,8BAA8B,CACxC,SAAS,EACT,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,cAAc,EACd,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CACnC,CAAC;YACF,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,EAAE,CAAC;gBACxE,MAAM,MAAM,GAAG,4BAA4B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC5D,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBACzB,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAE3C,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,iBAAiB,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;gBAClF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,MAAM,WAAW,GACb,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC;YAC/E,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,WAAW,EAAE,CAAC;gBACd,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACjC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;YAC1C,CAAC;QACL,CAAC;gBAAS,CAAC;YACP,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,UAAU;gBAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnF,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC;IACL,CAAC;IAED,uBAAuB,CAAC,OAAc;QAClC,IAAI,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,2BAA2B,CAAC;QACrF,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC;QACtF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,IAAI,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK;gBAAE,OAAO;YAC9D,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,eAAe;QACX,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAAE,UAAU,CAAC,KAAK,EAAE,CAAC;QACvE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7E,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;CACJ"}
|
|
@@ -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;
|
|
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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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;
|
|
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;
|
|
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"}
|