agentenkit 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -14
- package/dist/adapters/inline.d.ts +19 -5
- package/dist/adapters/inline.d.ts.map +1 -1
- package/dist/adapters/inline.js +87 -14
- package/dist/adapters/inline.js.map +1 -1
- package/dist/adapters/memory.d.ts +65 -3
- package/dist/adapters/memory.d.ts.map +1 -1
- package/dist/adapters/memory.js +267 -3
- package/dist/adapters/memory.js.map +1 -1
- package/dist/adapters/prisma.d.ts +125 -18
- package/dist/adapters/prisma.d.ts.map +1 -1
- package/dist/adapters/prisma.js +308 -67
- package/dist/adapters/prisma.js.map +1 -1
- package/dist/adapters/qstash.d.ts +15 -2
- package/dist/adapters/qstash.d.ts.map +1 -1
- package/dist/adapters/qstash.js +31 -14
- package/dist/adapters/qstash.js.map +1 -1
- package/dist/adapters/redis.d.ts +40 -4
- package/dist/adapters/redis.d.ts.map +1 -1
- package/dist/adapters/redis.js +265 -20
- package/dist/adapters/redis.js.map +1 -1
- package/dist/adapters/sqlite.d.ts +52 -2
- package/dist/adapters/sqlite.d.ts.map +1 -1
- package/dist/adapters/sqlite.js +342 -35
- package/dist/adapters/sqlite.js.map +1 -1
- package/dist/adapters/stream-scripts.d.ts +49 -0
- package/dist/adapters/stream-scripts.d.ts.map +1 -0
- package/dist/adapters/stream-scripts.js +150 -0
- package/dist/adapters/stream-scripts.js.map +1 -0
- package/dist/adapters/upstash.d.ts +20 -0
- package/dist/adapters/upstash.d.ts.map +1 -1
- package/dist/adapters/upstash.js +29 -0
- package/dist/adapters/upstash.js.map +1 -1
- package/dist/admin/memory.d.ts +11 -1
- package/dist/admin/memory.d.ts.map +1 -1
- package/dist/admin/memory.js +83 -14
- package/dist/admin/memory.js.map +1 -1
- package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts +5 -0
- package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts.map +1 -0
- package/dist/admin/migrations/postgres/0002-run-settled-at.js +11 -0
- package/dist/admin/migrations/postgres/0002-run-settled-at.js.map +1 -0
- package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts +5 -0
- package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts.map +1 -0
- package/dist/admin/migrations/postgres/0003-run-enqueued-at.js +15 -0
- package/dist/admin/migrations/postgres/0003-run-enqueued-at.js.map +1 -0
- package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts +5 -0
- package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts.map +1 -0
- package/dist/admin/migrations/postgres/0004-run-settle-claim.js +15 -0
- package/dist/admin/migrations/postgres/0004-run-settle-claim.js.map +1 -0
- package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts +5 -0
- package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts.map +1 -0
- package/dist/admin/migrations/postgres/0005-bigint-counters.js +12 -0
- package/dist/admin/migrations/postgres/0005-bigint-counters.js.map +1 -0
- package/dist/admin/migrations/postgres/index.d.ts.map +1 -1
- package/dist/admin/migrations/postgres/index.js +16 -1
- package/dist/admin/migrations/postgres/index.js.map +1 -1
- package/dist/admin/migrations/runner.d.ts +21 -1
- package/dist/admin/migrations/runner.d.ts.map +1 -1
- package/dist/admin/migrations/runner.js +41 -4
- package/dist/admin/migrations/runner.js.map +1 -1
- package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts +5 -0
- package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts.map +1 -0
- package/dist/admin/migrations/sqlite/0002-run-settled-at.js +11 -0
- package/dist/admin/migrations/sqlite/0002-run-settled-at.js.map +1 -0
- package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts +5 -0
- package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts.map +1 -0
- package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js +15 -0
- package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js.map +1 -0
- package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts +5 -0
- package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts.map +1 -0
- package/dist/admin/migrations/sqlite/0004-run-settle-claim.js +15 -0
- package/dist/admin/migrations/sqlite/0004-run-settle-claim.js.map +1 -0
- package/dist/admin/migrations/sqlite/index.d.ts +2 -2
- package/dist/admin/migrations/sqlite/index.d.ts.map +1 -1
- package/dist/admin/migrations/sqlite/index.js +17 -3
- package/dist/admin/migrations/sqlite/index.js.map +1 -1
- package/dist/admin/postgres.d.ts +14 -4
- package/dist/admin/postgres.d.ts.map +1 -1
- package/dist/admin/postgres.js +131 -36
- package/dist/admin/postgres.js.map +1 -1
- package/dist/admin/shared.d.ts +19 -0
- package/dist/admin/shared.d.ts.map +1 -0
- package/dist/admin/shared.js +28 -0
- package/dist/admin/shared.js.map +1 -0
- package/dist/admin/sqlite.d.ts +9 -1
- package/dist/admin/sqlite.d.ts.map +1 -1
- package/dist/admin/sqlite.js +112 -29
- package/dist/admin/sqlite.js.map +1 -1
- package/dist/core/admin.d.ts +28 -6
- package/dist/core/admin.d.ts.map +1 -1
- package/dist/core/admin.js +92 -23
- package/dist/core/admin.js.map +1 -1
- package/dist/core/agent.d.ts +7 -4
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +15 -11
- package/dist/core/agent.js.map +1 -1
- package/dist/core/agui.d.ts +17 -0
- package/dist/core/agui.d.ts.map +1 -0
- package/dist/core/agui.js +69 -0
- package/dist/core/agui.js.map +1 -0
- package/dist/core/context.d.ts +13 -1
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +70 -19
- package/dist/core/context.js.map +1 -1
- package/dist/core/deleteThread.d.ts.map +1 -1
- package/dist/core/deleteThread.js +33 -4
- package/dist/core/deleteThread.js.map +1 -1
- package/dist/core/engine.d.ts +41 -11
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +855 -352
- package/dist/core/engine.js.map +1 -1
- package/dist/core/follow.d.ts +63 -1
- package/dist/core/follow.d.ts.map +1 -1
- package/dist/core/follow.js +293 -16
- package/dist/core/follow.js.map +1 -1
- package/dist/core/hitl.d.ts +43 -0
- package/dist/core/hitl.d.ts.map +1 -1
- package/dist/core/hitl.js +163 -35
- package/dist/core/hitl.js.map +1 -1
- package/dist/core/keys.d.ts +22 -4
- package/dist/core/keys.d.ts.map +1 -1
- package/dist/core/keys.js +23 -5
- package/dist/core/keys.js.map +1 -1
- package/dist/core/lease.d.ts +46 -0
- package/dist/core/lease.d.ts.map +1 -0
- package/dist/core/lease.js +142 -0
- package/dist/core/lease.js.map +1 -0
- package/dist/core/loop.d.ts +27 -7
- package/dist/core/loop.d.ts.map +1 -1
- package/dist/core/loop.js +140 -55
- package/dist/core/loop.js.map +1 -1
- package/dist/core/messages.d.ts +21 -2
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +61 -2
- package/dist/core/messages.js.map +1 -1
- package/dist/core/prune.d.ts +24 -0
- package/dist/core/prune.d.ts.map +1 -0
- package/dist/core/prune.js +43 -0
- package/dist/core/prune.js.map +1 -0
- package/dist/core/publish.d.ts +38 -10
- package/dist/core/publish.d.ts.map +1 -1
- package/dist/core/publish.js +126 -12
- package/dist/core/publish.js.map +1 -1
- package/dist/core/reclaim.d.ts +8 -1
- package/dist/core/reclaim.d.ts.map +1 -1
- package/dist/core/reclaim.js +149 -18
- package/dist/core/reclaim.js.map +1 -1
- package/dist/core/run.d.ts +7 -3
- package/dist/core/run.d.ts.map +1 -1
- package/dist/core/run.js +95 -35
- package/dist/core/run.js.map +1 -1
- package/dist/core/segment.d.ts +62 -0
- package/dist/core/segment.d.ts.map +1 -0
- package/dist/core/segment.js +318 -0
- package/dist/core/segment.js.map +1 -0
- package/dist/core/settle.d.ts +57 -0
- package/dist/core/settle.d.ts.map +1 -0
- package/dist/core/settle.js +181 -0
- package/dist/core/settle.js.map +1 -0
- package/dist/core/snapshot.d.ts +36 -0
- package/dist/core/snapshot.d.ts.map +1 -0
- package/dist/core/snapshot.js +87 -0
- package/dist/core/snapshot.js.map +1 -0
- package/dist/core/stop.d.ts +16 -1
- package/dist/core/stop.d.ts.map +1 -1
- package/dist/core/stop.js +69 -15
- package/dist/core/stop.js.map +1 -1
- package/dist/core/stream-events.d.ts +184 -0
- package/dist/core/stream-events.d.ts.map +1 -0
- package/dist/core/stream-events.js +26 -0
- package/dist/core/stream-events.js.map +1 -0
- package/dist/core/stream.d.ts +29 -0
- package/dist/core/stream.d.ts.map +1 -1
- package/dist/core/stream.js +79 -0
- package/dist/core/stream.js.map +1 -1
- package/dist/core/subagent.d.ts +36 -5
- package/dist/core/subagent.d.ts.map +1 -1
- package/dist/core/subagent.js +117 -22
- package/dist/core/subagent.js.map +1 -1
- package/dist/core/types.d.ts +195 -12
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +26 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/usage.d.ts +53 -5
- package/dist/core/usage.d.ts.map +1 -1
- package/dist/core/usage.js +170 -47
- package/dist/core/usage.js.map +1 -1
- package/dist/index.d.ts +16 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -7
- package/dist/index.js.map +1 -1
- package/dist/ports/admin.d.ts +59 -0
- package/dist/ports/admin.d.ts.map +1 -1
- package/dist/ports/kv.d.ts +17 -0
- package/dist/ports/kv.d.ts.map +1 -1
- package/dist/ports/queue.d.ts +87 -7
- package/dist/ports/queue.d.ts.map +1 -1
- package/dist/ports/queue.js +36 -1
- package/dist/ports/queue.js.map +1 -1
- package/dist/ports/runtime.d.ts +171 -20
- package/dist/ports/runtime.d.ts.map +1 -1
- package/dist/ports/storage.d.ts +26 -5
- package/dist/ports/storage.d.ts.map +1 -1
- package/dist/ports/streams.d.ts +60 -0
- package/dist/ports/streams.d.ts.map +1 -0
- package/dist/ports/streams.js +20 -0
- package/dist/ports/streams.js.map +1 -0
- package/dist/pricing.d.ts +5 -0
- package/dist/pricing.d.ts.map +1 -1
- package/dist/pricing.js +35 -10
- package/dist/pricing.js.map +1 -1
- package/dist/runtime.d.ts +6 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +144 -46
- package/dist/runtime.js.map +1 -1
- package/package.json +1 -1
package/dist/core/messages.d.ts
CHANGED
|
@@ -29,6 +29,23 @@ export declare function promptMessage(m: {
|
|
|
29
29
|
role: string;
|
|
30
30
|
content: unknown;
|
|
31
31
|
};
|
|
32
|
+
/** Reads a stored message as a compaction summary: whether it is one, and the
|
|
33
|
+
* last message it covers (null on one written before the mark). */
|
|
34
|
+
export declare function summaryOf(m: {
|
|
35
|
+
content: unknown;
|
|
36
|
+
}): {
|
|
37
|
+
coversUpTo: string | null;
|
|
38
|
+
} | null;
|
|
39
|
+
/** The part of a stored history that goes to the model (§2.6): the latest
|
|
40
|
+
* compaction summary, then only the messages after the last one it covers.
|
|
41
|
+
* Everything before is in the summary already, and sending it again would
|
|
42
|
+
* undo the compaction. A summary written before the cover mark existed covers
|
|
43
|
+
* nothing known, so every summary is left out and the whole history goes; the
|
|
44
|
+
* next compaction writes a proper one. */
|
|
45
|
+
export declare function promptHistory<T extends {
|
|
46
|
+
id: string;
|
|
47
|
+
content: unknown;
|
|
48
|
+
}>(history: T[]): T[];
|
|
32
49
|
/** `promptMessage` over a whole history. */
|
|
33
50
|
export declare const promptMessages: (messages: Array<{
|
|
34
51
|
role: string;
|
|
@@ -42,7 +59,9 @@ export declare const DANGLING_CALL_RESULT: {
|
|
|
42
59
|
reason: string;
|
|
43
60
|
};
|
|
44
61
|
/** Close every assistant tool call that has no tool result before the next
|
|
45
|
-
* turn
|
|
46
|
-
|
|
62
|
+
* turn, and drop every tool result whose call is not in the history before
|
|
63
|
+
* it (an orphan: its call was cut away, or the result was written first).
|
|
64
|
+
* Strict providers reject both. Idempotent. */
|
|
65
|
+
export declare function repairDanglingToolCalls<T extends MessageLike>(input: T[]): T[];
|
|
47
66
|
export {};
|
|
48
67
|
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;iDAOiD;AASjD,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID;;;;;;;;;;iDAUiD;AACjD,wBAAgB,aAAa,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CASvG;AAED,4CAA4C;AAC5C,eAAO,MAAM,cAAc,GAAI,UAAU,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;iDAOiD;AASjD,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID;;;;;;;;;;iDAUiD;AACjD,wBAAgB,aAAa,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CASvG;AAID;oEACoE;AACpE,wBAAgB,SAAS,CAAC,CAAC,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAIvF;AAED;;;;;2CAK2C;AAC3C,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAc3F;AAED,4CAA4C;AAC5C,eAAO,MAAM,cAAc,GAAI,UAAU,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;UA5CJ,MAAM;aAAW,OAAO;GA6CzE,CAAC;AAE9B,eAAO,MAAM,oBAAoB;;;CAGhC,CAAC;AAEF;;;gDAGgD;AAChD,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAiC9E"}
|
package/dist/core/messages.js
CHANGED
|
@@ -28,6 +28,37 @@ export function promptMessage(m) {
|
|
|
28
28
|
}
|
|
29
29
|
return { role: m.role, content: c };
|
|
30
30
|
}
|
|
31
|
+
const CONTEXT_SUMMARY = 'CONTEXT_SUMMARY';
|
|
32
|
+
/** Reads a stored message as a compaction summary: whether it is one, and the
|
|
33
|
+
* last message it covers (null on one written before the mark). */
|
|
34
|
+
export function summaryOf(m) {
|
|
35
|
+
const c = m.content;
|
|
36
|
+
if (!c || typeof c !== 'object' || Array.isArray(c) || c.type !== CONTEXT_SUMMARY)
|
|
37
|
+
return null;
|
|
38
|
+
return { coversUpTo: typeof c.coversUpTo === 'string' ? c.coversUpTo : null };
|
|
39
|
+
}
|
|
40
|
+
/** The part of a stored history that goes to the model (§2.6): the latest
|
|
41
|
+
* compaction summary, then only the messages after the last one it covers.
|
|
42
|
+
* Everything before is in the summary already, and sending it again would
|
|
43
|
+
* undo the compaction. A summary written before the cover mark existed covers
|
|
44
|
+
* nothing known, so every summary is left out and the whole history goes; the
|
|
45
|
+
* next compaction writes a proper one. */
|
|
46
|
+
export function promptHistory(history) {
|
|
47
|
+
let latest = -1;
|
|
48
|
+
let covers = null;
|
|
49
|
+
history.forEach((m, i) => {
|
|
50
|
+
const s = summaryOf(m);
|
|
51
|
+
if (s) {
|
|
52
|
+
latest = i;
|
|
53
|
+
covers = s.coversUpTo;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
if (latest < 0)
|
|
57
|
+
return history;
|
|
58
|
+
const coveredAt = covers === null ? -1 : history.findIndex((m) => m.id === covers);
|
|
59
|
+
const rest = history.slice(coveredAt + 1).filter((m) => !summaryOf(m));
|
|
60
|
+
return coveredAt >= 0 ? [history[latest], ...rest] : rest;
|
|
61
|
+
}
|
|
31
62
|
/** `promptMessage` over a whole history. */
|
|
32
63
|
export const promptMessages = (messages) => messages.map(promptMessage);
|
|
33
64
|
export const DANGLING_CALL_RESULT = {
|
|
@@ -35,8 +66,11 @@ export const DANGLING_CALL_RESULT = {
|
|
|
35
66
|
reason: 'no result was recorded for this call',
|
|
36
67
|
};
|
|
37
68
|
/** Close every assistant tool call that has no tool result before the next
|
|
38
|
-
* turn
|
|
39
|
-
|
|
69
|
+
* turn, and drop every tool result whose call is not in the history before
|
|
70
|
+
* it (an orphan: its call was cut away, or the result was written first).
|
|
71
|
+
* Strict providers reject both. Idempotent. */
|
|
72
|
+
export function repairDanglingToolCalls(input) {
|
|
73
|
+
const messages = dropOrphanResults(input);
|
|
40
74
|
const out = [];
|
|
41
75
|
for (let i = 0; i < messages.length; i += 1) {
|
|
42
76
|
const m = messages[i];
|
|
@@ -71,4 +105,29 @@ export function repairDanglingToolCalls(messages) {
|
|
|
71
105
|
}
|
|
72
106
|
return out;
|
|
73
107
|
}
|
|
108
|
+
/** Tool results whose call has not appeared yet are dropped; a tool message
|
|
109
|
+
* left with no parts goes with them. */
|
|
110
|
+
function dropOrphanResults(messages) {
|
|
111
|
+
const called = new Set();
|
|
112
|
+
const out = [];
|
|
113
|
+
for (const m of messages) {
|
|
114
|
+
if (m.role === 'assistant') {
|
|
115
|
+
for (const p of parts(m.content)) {
|
|
116
|
+
if (p.type === 'tool-call' && p.toolCallId)
|
|
117
|
+
called.add(p.toolCallId);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (m.role !== 'tool' || !Array.isArray(m.content)) {
|
|
121
|
+
out.push(m);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const all = parts(m.content);
|
|
125
|
+
const kept = all.filter((p) => p.type !== 'tool-result' || !p.toolCallId || called.has(p.toolCallId));
|
|
126
|
+
if (kept.length === all.length)
|
|
127
|
+
out.push(m);
|
|
128
|
+
else if (kept.length > 0)
|
|
129
|
+
out.push({ ...m, content: kept });
|
|
130
|
+
}
|
|
131
|
+
return out;
|
|
132
|
+
}
|
|
74
133
|
//# sourceMappingURL=messages.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;iDAOiD;AAejD,MAAM,KAAK,GAAG,CAAC,OAAgB,EAAc,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,OAAsB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAExG;;;;;;;;;;iDAUiD;AACjD,MAAM,UAAU,aAAa,CAAC,CAAqC;IACjE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;IACpB,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,CAAuC,CAAC;QACzD,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3E,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AACtC,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAmD,EAAE,EAAE,CACpF,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAE9B,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,sCAAsC;CAC/C,CAAC;AAEF;
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;iDAOiD;AAejD,MAAM,KAAK,GAAG,CAAC,OAAgB,EAAc,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,OAAsB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAExG;;;;;;;;;;iDAUiD;AACjD,MAAM,UAAU,aAAa,CAAC,CAAqC;IACjE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;IACpB,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,CAAuC,CAAC;QACzD,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3E,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAE1C;oEACoE;AACpE,MAAM,UAAU,SAAS,CAAC,CAAuB;IAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,OAA0D,CAAC;IACvE,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IAC/F,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAChF,CAAC;AAED;;;;;2CAK2C;AAC3C,MAAM,UAAU,aAAa,CAA6C,OAAY;IACpF,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;IAChB,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,GAAG,CAAC,CAAC;YACX,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/B,MAAM,SAAS,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,OAAO,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAmD,EAAE,EAAE,CACpF,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAE9B,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,sCAAsC;CAC/C,CAAC;AAEF;;;gDAGgD;AAChD,MAAM,UAAU,uBAAuB,CAAwB,KAAU;IACvE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACZ,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;QACrF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEjC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACnE,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,UAAU;oBAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,KAAK;aAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,UAAW,CAAC,CAAC;aAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,MAAM,EAAE,oBAAoB;SAC7B,CAAC,CAAC,CAAC;QACN,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEnC,0EAA0E;QAC1E,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAO,CAAC,CAAC;QAClD,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;yCACyC;AACzC,SAAS,iBAAiB,CAAwB,QAAa;IAC7D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,UAAU;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACZ,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QACtG,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACvC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAO,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { RuntimePorts } from '../ports/runtime.js';
|
|
2
|
+
/** The types older releases kept in the event log that now live only on a
|
|
3
|
+
* run stream or the bus. Nothing reads them from the table any more, so
|
|
4
|
+
* they can go. An app's own types are never among them: there is no
|
|
5
|
+
* telling whether the app wanted one kept. */
|
|
6
|
+
export declare const STREAM_ONLY_TYPES: readonly string[];
|
|
7
|
+
export interface PruneOptions {
|
|
8
|
+
/** Count what would go, and delete nothing. */
|
|
9
|
+
dryRun?: boolean;
|
|
10
|
+
/** Rows per batch; each batch is its own short delete. Default 10,000. */
|
|
11
|
+
batchSize?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface PruneReport {
|
|
14
|
+
/** Rows deleted (or, on a dry run, found) per type. */
|
|
15
|
+
byType: Record<string, number>;
|
|
16
|
+
total: number;
|
|
17
|
+
batches: number;
|
|
18
|
+
}
|
|
19
|
+
/** Delete the stream-only rows older releases left in the event log (see
|
|
20
|
+
* STREAM_ONLY_TYPES), a batch at a time, so a large table never holds one
|
|
21
|
+
* long lock. Safe to stop and run again: each batch stands on its own.
|
|
22
|
+
* Needs a storage whose events port can prune; one that cannot throws. */
|
|
23
|
+
export declare function pruneEvents(deps: RuntimePorts, opts?: PruneOptions): Promise<PruneReport>;
|
|
24
|
+
//# sourceMappingURL=prune.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune.d.ts","sourceRoot":"","sources":["../../src/core/prune.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;+CAG+C;AAC/C,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAY9C,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;2EAG2E;AAC3E,wBAAsB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAkBnG"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** The types older releases kept in the event log that now live only on a
|
|
2
|
+
* run stream or the bus. Nothing reads them from the table any more, so
|
|
3
|
+
* they can go. An app's own types are never among them: there is no
|
|
4
|
+
* telling whether the app wanted one kept. */
|
|
5
|
+
export const STREAM_ONLY_TYPES = [
|
|
6
|
+
'CHUNK',
|
|
7
|
+
'SUBAGENT_CHUNK',
|
|
8
|
+
'STEP_COMMITTED',
|
|
9
|
+
'STEP_FINISHED',
|
|
10
|
+
'TEXT_RESULT',
|
|
11
|
+
'SUBAGENT_STARTED',
|
|
12
|
+
'SUBAGENT_COMPLETED',
|
|
13
|
+
'SUBAGENT_FAILED',
|
|
14
|
+
'MESSAGE_APPENDED',
|
|
15
|
+
'STATE_CHANGE',
|
|
16
|
+
'HEARTBEAT',
|
|
17
|
+
];
|
|
18
|
+
/** Delete the stream-only rows older releases left in the event log (see
|
|
19
|
+
* STREAM_ONLY_TYPES), a batch at a time, so a large table never holds one
|
|
20
|
+
* long lock. Safe to stop and run again: each batch stands on its own.
|
|
21
|
+
* Needs a storage whose events port can prune; one that cannot throws. */
|
|
22
|
+
export async function pruneEvents(deps, opts = {}) {
|
|
23
|
+
const prune = deps.storage.events.prune;
|
|
24
|
+
if (!prune)
|
|
25
|
+
throw new Error('pruneEvents: this storage cannot prune its events');
|
|
26
|
+
const limit = opts.batchSize ?? 10_000;
|
|
27
|
+
const report = { byType: {}, total: 0, batches: 0 };
|
|
28
|
+
for (;;) {
|
|
29
|
+
const counts = await prune([...STREAM_ONLY_TYPES], { limit, dryRun: opts.dryRun });
|
|
30
|
+
report.batches++;
|
|
31
|
+
let n = 0;
|
|
32
|
+
for (const [type, count] of Object.entries(counts)) {
|
|
33
|
+
report.byType[type] = (report.byType[type] ?? 0) + count;
|
|
34
|
+
n += count;
|
|
35
|
+
}
|
|
36
|
+
report.total += n;
|
|
37
|
+
// A dry run counts everything in one pass; a batch smaller than the
|
|
38
|
+
// limit was the last one.
|
|
39
|
+
if (opts.dryRun || n < limit)
|
|
40
|
+
return report;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=prune.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune.js","sourceRoot":"","sources":["../../src/core/prune.ts"],"names":[],"mappings":"AAEA;;;+CAG+C;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD,OAAO;IACP,gBAAgB;IAChB,gBAAgB;IAChB,eAAe;IACf,aAAa;IACb,kBAAkB;IAClB,oBAAoB;IACpB,iBAAiB;IACjB,kBAAkB;IAClB,cAAc;IACd,WAAW;CACZ,CAAC;AAgBF;;;2EAG2E;AAC3E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAkB,EAAE,OAAqB,EAAE;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACjF,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC;IACvC,MAAM,MAAM,GAAgB,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACjE,SAAS,CAAC;QACR,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC,GAAG,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACnF,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;YACzD,CAAC,IAAI,KAAK,CAAC;QACb,CAAC;QACD,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QAClB,oEAAoE;QACpE,0BAA0B;QAC1B,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,KAAK;YAAE,OAAO,MAAM,CAAC;IAC9C,CAAC;AACH,CAAC"}
|
package/dist/core/publish.d.ts
CHANGED
|
@@ -1,23 +1,34 @@
|
|
|
1
1
|
import type { RuntimePorts } from '../ports/runtime.js';
|
|
2
|
-
import type { ExecutionState } from './types.js';
|
|
2
|
+
import type { ExecutionState, ThreadTransition } from './types.js';
|
|
3
3
|
import type { AgentEvent } from './types.js';
|
|
4
|
-
/**
|
|
5
|
-
* (
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
/** The platform's types that go in the thread record: what must outlive a
|
|
5
|
+
* run (see Storage.events). Every other platform type is live only: a
|
|
6
|
+
* notice on the bus, and an event on the run stream when one is open. */
|
|
7
|
+
export declare const RECORD_EVENT_TYPES: ReadonlySet<string>;
|
|
8
|
+
/** Publish a platform event (§2.2). A record type is stored first (the
|
|
9
|
+
* store mints its seq) and then sent; any other type is sent as a notice.
|
|
10
|
+
* Either way it reaches the run stream this process has open on the
|
|
11
|
+
* thread. */
|
|
12
|
+
export declare function publish(deps: RuntimePorts, threadId: string, type: string, payload: unknown, runId?: string): Promise<AgentEvent>;
|
|
13
|
+
/** Publish a live-only event (never stored). While this process has a
|
|
14
|
+
* segment open on the thread, stream content and an app's own events go to
|
|
15
|
+
* the run stream alone; everything else goes on the bus, and to the stream
|
|
16
|
+
* when the stream has a shape for it (a step's end). */
|
|
8
17
|
export declare function publishNotice(deps: RuntimePorts, threadId: string, type: string, payload: unknown): Promise<AgentEvent>;
|
|
9
18
|
/** Event types the platform itself emits. An app cannot publish these: a
|
|
10
19
|
* client's reducer trusts them to mean what the engine meant. */
|
|
11
20
|
export declare const RESERVED_EVENT_TYPES: ReadonlySet<string>;
|
|
12
21
|
export interface PublishEventOptions {
|
|
13
|
-
/** `true`
|
|
14
|
-
*
|
|
15
|
-
*
|
|
22
|
+
/** `true` also keeps the event in the thread record, so a tab that opens
|
|
23
|
+
* the thread next week still sees it. Otherwise (the default) it is live
|
|
24
|
+
* only: it goes out on the bus and, during a run, on the run's stream,
|
|
25
|
+
* which a tab that reconnects within the grace window replays. */
|
|
16
26
|
durable?: boolean;
|
|
17
27
|
}
|
|
18
28
|
/** Publish an event of your own on a thread, through the same pipeline the
|
|
19
|
-
* platform's events take: the
|
|
20
|
-
*
|
|
29
|
+
* platform's events take (§2.2): the live bus, the run stream during a run
|
|
30
|
+
* (as CUSTOM), and the thread record when it is durable. A client sees it
|
|
31
|
+
* in `onEvent`, exactly like a built-in one. */
|
|
21
32
|
export declare function publishEvent(deps: RuntimePorts, threadId: string, type: string, payload: unknown, options?: PublishEventOptions): Promise<AgentEvent>;
|
|
22
33
|
/** What a tool calls to publish: `publishEvent(type, payload, options?)`,
|
|
23
34
|
* already bound to the thread the tool is acting on. */
|
|
@@ -26,6 +37,23 @@ export type ToolPublishEvent = (type: string, payload: unknown, options?: Publis
|
|
|
26
37
|
* the thread it runs on — main agent, nested run, or a segment resumed after
|
|
27
38
|
* an approval alike. */
|
|
28
39
|
export declare function withPublishEvent(deps: RuntimePorts, threadId: string, tools: Record<string, any>): Record<string, any>;
|
|
40
|
+
/** A non-terminal STATE_CHANGE: the state, the run it belongs to, and when
|
|
41
|
+
* that run started, read off its record. Every STATE_CHANGE names its run,
|
|
42
|
+
* so a client keeps one timer per run and never refetches history to find
|
|
43
|
+
* its start. */
|
|
44
|
+
export declare function runStatePayload(deps: RuntimePorts, state: ExecutionState, runId?: string): Promise<Record<string, unknown>>;
|
|
45
|
+
/** The states a run is still going in: the ones a stop or a failure can end. */
|
|
46
|
+
export declare const ACTIVE_STATES: ExecutionState[];
|
|
47
|
+
/** The one way a run moves its thread's state (§3.4). A compare-and-set on
|
|
48
|
+
* the durable row, on the state AND the run that owns the thread, and only
|
|
49
|
+
* the caller that wins it writes the hot cache and the admin view. So a stop
|
|
50
|
+
* is never overwritten by a finish, and a stopped or replaced run can never
|
|
51
|
+
* move the thread again: its change simply loses. Returns whether this
|
|
52
|
+
* caller made the change. Publishing the STATE_CHANGE is left to the caller,
|
|
53
|
+
* whose payload differs per change. */
|
|
54
|
+
export declare function transition(deps: RuntimePorts, threadId: string, change: ThreadTransition & {
|
|
55
|
+
model?: string;
|
|
56
|
+
}): Promise<boolean>;
|
|
29
57
|
/** Move a thread to a new state on BOTH the caller's storage and the
|
|
30
58
|
* platform's own operational view (§2.9).
|
|
31
59
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/core/publish.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/core/publish.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;0EAE0E;AAC1E,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAWjD,CAAC;AAYH;;;cAGc;AACd,wBAAsB,OAAO,CAC3B,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,CAGrB;AAsCD;;;yDAGyD;AACzD,wBAAsB,aAAa,CACjC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,UAAU,CAAC,CAWrB;AAED;kEACkE;AAClE,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAyBnD,CAAC;AAEH,MAAM,WAAW,mBAAmB;IAClC;;;uEAGmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;iDAGiD;AACjD,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,UAAU,CAAC,CAUrB;AAED;yDACyD;AACzD,MAAM,MAAM,gBAAgB,GAAG,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,KAC1B,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB;;yBAEyB;AACzB,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACzB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAerB;AAED;;;iBAGiB;AACjB,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,cAAc,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAWlC;AAED,gFAAgF;AAChF,eAAO,MAAM,aAAa,EAAE,cAAc,EAA+C,CAAC;AAE1F;;;;;;wCAMwC;AACxC,wBAAsB,UAAU,CAC9B,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,gBAAgB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C,OAAO,CAAC,OAAO,CAAC,CAMlB;AAED;;;;;;;mBAOmB;AACnB,wBAAsB,cAAc,CAClC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,cAAc,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
package/dist/core/publish.js
CHANGED
|
@@ -1,16 +1,85 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { THREAD_KEY_TTL_SECONDS } from './keys.js';
|
|
2
|
+
import { activeSegment } from './segment.js';
|
|
3
|
+
/** The platform's types that go in the thread record: what must outlive a
|
|
4
|
+
* run (see Storage.events). Every other platform type is live only: a
|
|
5
|
+
* notice on the bus, and an event on the run stream when one is open. */
|
|
6
|
+
export const RECORD_EVENT_TYPES = new Set([
|
|
7
|
+
'INPUT_REQUIRED',
|
|
8
|
+
'INPUT_EXPIRED',
|
|
9
|
+
'HITL_RESPONSE',
|
|
10
|
+
'RUN_REFUSED',
|
|
11
|
+
'TOKEN_BUDGET_EXHAUSTED',
|
|
12
|
+
'COST_BUDGET_EXHAUSTED',
|
|
13
|
+
'CONTEXT_COMPACTED',
|
|
14
|
+
'MESSAGES_DROPPED',
|
|
15
|
+
'RUN_STARTED',
|
|
16
|
+
'RUN_ENDED',
|
|
17
|
+
]);
|
|
18
|
+
/** The run an entry belongs to: the one given, else the one its payload
|
|
19
|
+
* names. */
|
|
20
|
+
function runOf(payload, runId) {
|
|
21
|
+
if (runId)
|
|
22
|
+
return runId;
|
|
23
|
+
const p = payload;
|
|
24
|
+
if (typeof p?.runId === 'string')
|
|
25
|
+
return p.runId;
|
|
26
|
+
if (typeof p?.resume?.runId === 'string')
|
|
27
|
+
return p.resume.runId;
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
/** Publish a platform event (§2.2). A record type is stored first (the
|
|
31
|
+
* store mints its seq) and then sent; any other type is sent as a notice.
|
|
32
|
+
* Either way it reaches the run stream this process has open on the
|
|
33
|
+
* thread. */
|
|
34
|
+
export async function publish(deps, threadId, type, payload, runId) {
|
|
35
|
+
if (!RECORD_EVENT_TYPES.has(type))
|
|
36
|
+
return publishNotice(deps, threadId, type, payload);
|
|
37
|
+
return record(deps, threadId, type, payload, runOf(payload, runId));
|
|
38
|
+
}
|
|
39
|
+
/** Store an entry in the thread record, then send it. */
|
|
40
|
+
async function record(deps, threadId, type, payload, runId) {
|
|
41
|
+
const event = await deps.storage.events.append(threadId, { type, payload, runId });
|
|
7
42
|
await deps.bus.publish(threadId, event);
|
|
43
|
+
// A platform entry the stream shows too (a park). An app's durable event
|
|
44
|
+
// is delivered as this entry alone, so a tab never sees it twice.
|
|
45
|
+
if (RESERVED_EVENT_TYPES.has(type))
|
|
46
|
+
await toSegment(deps, threadId, type, payload);
|
|
8
47
|
return event;
|
|
9
48
|
}
|
|
10
|
-
/**
|
|
49
|
+
/** What a run stream carries in place of the bus while a segment is open:
|
|
50
|
+
* a tab reads these from the stream, so the bus sending them too would
|
|
51
|
+
* show them twice. */
|
|
52
|
+
const STREAM_CONTENT = new Set([
|
|
53
|
+
'CHUNK',
|
|
54
|
+
'SUBAGENT_CHUNK',
|
|
55
|
+
'TEXT_RESULT',
|
|
56
|
+
'STEP_COMMITTED',
|
|
57
|
+
'SUBAGENT_STARTED',
|
|
58
|
+
'SUBAGENT_COMPLETED',
|
|
59
|
+
'SUBAGENT_FAILED',
|
|
60
|
+
]);
|
|
61
|
+
/** Hands an event to the run stream this process has open on the thread,
|
|
62
|
+
* if any; the segment keeps what belongs in a stream (see SegmentStream). */
|
|
63
|
+
async function toSegment(deps, threadId, type, payload) {
|
|
64
|
+
const seg = activeSegment(deps, threadId);
|
|
65
|
+
if (seg)
|
|
66
|
+
await seg.forward(type, payload, RESERVED_EVENT_TYPES.has(type));
|
|
67
|
+
}
|
|
68
|
+
/** Publish a live-only event (never stored). While this process has a
|
|
69
|
+
* segment open on the thread, stream content and an app's own events go to
|
|
70
|
+
* the run stream alone; everything else goes on the bus, and to the stream
|
|
71
|
+
* when the stream has a shape for it (a step's end). */
|
|
11
72
|
export async function publishNotice(deps, threadId, type, payload) {
|
|
12
73
|
const event = { threadId, seq: 0, type, payload, createdAt: new Date() };
|
|
74
|
+
const seg = activeSegment(deps, threadId);
|
|
75
|
+
const custom = !RESERVED_EVENT_TYPES.has(type);
|
|
76
|
+
if (seg && (custom || STREAM_CONTENT.has(type))) {
|
|
77
|
+
await seg.forward(type, payload, !custom);
|
|
78
|
+
return event;
|
|
79
|
+
}
|
|
13
80
|
await deps.bus.publish(threadId, event);
|
|
81
|
+
if (seg)
|
|
82
|
+
await seg.forward(type, payload, true);
|
|
14
83
|
return event;
|
|
15
84
|
}
|
|
16
85
|
/** Event types the platform itself emits. An app cannot publish these: a
|
|
@@ -35,10 +104,16 @@ export const RESERVED_EVENT_TYPES = new Set([
|
|
|
35
104
|
'HEARTBEAT',
|
|
36
105
|
'RUN_REFUSED',
|
|
37
106
|
'TOKEN_BUDGET_EXHAUSTED',
|
|
107
|
+
'COST_BUDGET_EXHAUSTED',
|
|
108
|
+
'RUN_STARTED',
|
|
109
|
+
'RUN_ENDED',
|
|
110
|
+
'RECORD_CHANGED',
|
|
111
|
+
'SNAPSHOT',
|
|
38
112
|
]);
|
|
39
113
|
/** Publish an event of your own on a thread, through the same pipeline the
|
|
40
|
-
* platform's events take: the
|
|
41
|
-
*
|
|
114
|
+
* platform's events take (§2.2): the live bus, the run stream during a run
|
|
115
|
+
* (as CUSTOM), and the thread record when it is durable. A client sees it
|
|
116
|
+
* in `onEvent`, exactly like a built-in one. */
|
|
42
117
|
export async function publishEvent(deps, threadId, type, payload, options = {}) {
|
|
43
118
|
if (!type || typeof type !== 'string') {
|
|
44
119
|
throw new Error('publishEvent: an event type is required');
|
|
@@ -46,9 +121,9 @@ export async function publishEvent(deps, threadId, type, payload, options = {})
|
|
|
46
121
|
if (RESERVED_EVENT_TYPES.has(type)) {
|
|
47
122
|
throw new Error(`publishEvent: ${type} is a platform event type — pick your own`);
|
|
48
123
|
}
|
|
49
|
-
return options.durable
|
|
50
|
-
?
|
|
51
|
-
:
|
|
124
|
+
return options.durable
|
|
125
|
+
? record(deps, threadId, type, payload, runOf(payload))
|
|
126
|
+
: publishNotice(deps, threadId, type, payload);
|
|
52
127
|
}
|
|
53
128
|
/** Give every tool `publishEvent` alongside the SDK's own options, bound to
|
|
54
129
|
* the thread it runs on — main agent, nested run, or a segment resumed after
|
|
@@ -67,6 +142,42 @@ export function withPublishEvent(deps, threadId, tools) {
|
|
|
67
142
|
}
|
|
68
143
|
return out;
|
|
69
144
|
}
|
|
145
|
+
/** A non-terminal STATE_CHANGE: the state, the run it belongs to, and when
|
|
146
|
+
* that run started, read off its record. Every STATE_CHANGE names its run,
|
|
147
|
+
* so a client keeps one timer per run and never refetches history to find
|
|
148
|
+
* its start. */
|
|
149
|
+
export async function runStatePayload(deps, state, runId) {
|
|
150
|
+
const p = { state };
|
|
151
|
+
if (!runId)
|
|
152
|
+
return p;
|
|
153
|
+
p.runId = runId;
|
|
154
|
+
try {
|
|
155
|
+
const rec = await deps.admin.runs.get(runId);
|
|
156
|
+
if (rec)
|
|
157
|
+
p.startedAt = rec.startedAt;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// The timer is a nicety; a missing record never fails a transition.
|
|
161
|
+
}
|
|
162
|
+
return p;
|
|
163
|
+
}
|
|
164
|
+
/** The states a run is still going in: the ones a stop or a failure can end. */
|
|
165
|
+
export const ACTIVE_STATES = ['QUEUED', 'RUNNING', 'WAITING_FOR_INPUT'];
|
|
166
|
+
/** The one way a run moves its thread's state (§3.4). A compare-and-set on
|
|
167
|
+
* the durable row, on the state AND the run that owns the thread, and only
|
|
168
|
+
* the caller that wins it writes the hot cache and the admin view. So a stop
|
|
169
|
+
* is never overwritten by a finish, and a stopped or replaced run can never
|
|
170
|
+
* move the thread again: its change simply loses. Returns whether this
|
|
171
|
+
* caller made the change. Publishing the STATE_CHANGE is left to the caller,
|
|
172
|
+
* whose payload differs per change. */
|
|
173
|
+
export async function transition(deps, threadId, change) {
|
|
174
|
+
const { model, ...t } = change;
|
|
175
|
+
if (!(await deps.storage.threads.transition(threadId, t)))
|
|
176
|
+
return false;
|
|
177
|
+
await deps.kv.set(`agent:state:${threadId}`, t.to, { exSeconds: THREAD_KEY_TTL_SECONDS });
|
|
178
|
+
await upsertAdminThread(deps, threadId, t.to, model);
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
70
181
|
/** Move a thread to a new state on BOTH the caller's storage and the
|
|
71
182
|
* platform's own operational view (§2.9).
|
|
72
183
|
*
|
|
@@ -77,6 +188,9 @@ export function withPublishEvent(deps, threadId, tools) {
|
|
|
77
188
|
* skip a read. */
|
|
78
189
|
export async function setThreadState(deps, threadId, state, model) {
|
|
79
190
|
await deps.storage.threads.setState(threadId, state);
|
|
191
|
+
await upsertAdminThread(deps, threadId, state, model);
|
|
192
|
+
}
|
|
193
|
+
async function upsertAdminThread(deps, threadId, state, model) {
|
|
80
194
|
try {
|
|
81
195
|
const resolved = model ?? (await deps.storage.threads.get(threadId))?.model ?? 'unknown';
|
|
82
196
|
await deps.admin.threads.upsert({ id: threadId, state, model: resolved });
|
package/dist/core/publish.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/core/publish.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/core/publish.ts"],"names":[],"mappings":"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"}
|
package/dist/core/reclaim.d.ts
CHANGED
|
@@ -8,6 +8,13 @@ export declare function reclaimGraceAfterMs(deps: RuntimePorts): number;
|
|
|
8
8
|
* delay. Callers are first-touch checks in run() and respond(), plus any
|
|
9
9
|
* listener that wants the denial to land live in front of a user.
|
|
10
10
|
*
|
|
11
|
+
* It also covers a run the queue lost: a thread QUEUED or RUNNING whose run
|
|
12
|
+
* lock nobody holds and whose job the queue no longer has. A worker that died
|
|
13
|
+
* leaves exactly that behind once its lock lapses, and so does a job dropped
|
|
14
|
+
* as dead. The run is re-dispatched and resumes from its last persisted
|
|
15
|
+
* step, unless its record already ended, in which case the thread is moved
|
|
16
|
+
* to match the record.
|
|
17
|
+
*
|
|
11
18
|
* It no longer heals inline. It re-dispatches the run and lets the engine
|
|
12
19
|
* resolve the park, so there is exactly ONE definition of what an expired
|
|
13
20
|
* approval becomes — and so a thread holding several open approvals (§2.7)
|
|
@@ -15,6 +22,6 @@ export declare function reclaimGraceAfterMs(deps: RuntimePorts): number;
|
|
|
15
22
|
* same run twice is safe: the run lock and the engine's readiness check make
|
|
16
23
|
* the duplicate a no-op (§2.8).
|
|
17
24
|
*
|
|
18
|
-
* Returns true iff a re-dispatch was enqueued. */
|
|
25
|
+
* Returns true iff a re-dispatch was enqueued or the thread was healed. */
|
|
19
26
|
export declare function reclaimIfOrphaned(deps: RuntimePorts, threadId: string): Promise<boolean>;
|
|
20
27
|
//# sourceMappingURL=reclaim.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reclaim.d.ts","sourceRoot":"","sources":["../../src/core/reclaim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"reclaim.d.ts","sourceRoot":"","sources":["../../src/core/reclaim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAaxD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAE9D;AAED;;;;;;;;;;;;;;;;;;;;;;4EAsB4E;AAC5E,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoD9F"}
|