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/context.js
CHANGED
|
@@ -2,6 +2,7 @@ import { generateText } from 'ai';
|
|
|
2
2
|
import { publish } from './publish.js';
|
|
3
3
|
import { fillTokens, providerMeta, recordCall } from './usage.js';
|
|
4
4
|
import { wireId } from './types.js';
|
|
5
|
+
import { promptHistory, summaryOf } from './messages.js';
|
|
5
6
|
/** Universal context ceiling across all models (§2.6) */
|
|
6
7
|
export const CONTEXT_TOKEN_CEILING = 265_000;
|
|
7
8
|
const DEFAULT_NATIVE_WINDOWS = {
|
|
@@ -37,7 +38,7 @@ export const estimateTokens = (content) => Math.ceil(JSON.stringify(content).len
|
|
|
37
38
|
export async function contextUsage(deps, threadId, model) {
|
|
38
39
|
const budgetTokens = contextBudget(deps, model) - deps.config.contextOutputReserveTokens;
|
|
39
40
|
// The main agent's stream only — a nested run's turns are its own (§2.7)
|
|
40
|
-
const history = await deps.storage.messages.list(threadId, { agentId: null });
|
|
41
|
+
const history = promptHistory(await deps.storage.messages.list(threadId, { agentId: null }));
|
|
41
42
|
return {
|
|
42
43
|
usedTokens: history.reduce((sum, m) => sum + estimateTokens(m.content), 0),
|
|
43
44
|
budgetTokens,
|
|
@@ -48,31 +49,47 @@ export async function contextUsage(deps, threadId, model) {
|
|
|
48
49
|
// Returns a history array guaranteed to fit the model's budget. Compaction is
|
|
49
50
|
// durable: the summary is persisted as a Message, so every client and every
|
|
50
51
|
// reconnect replay (§2.2) reconstructs the exact same context.
|
|
51
|
-
|
|
52
|
+
//
|
|
53
|
+
// The summary records the last message it covers, and the prompt carries the
|
|
54
|
+
// summary and only what came after (see promptHistory), so a thread compacts
|
|
55
|
+
// once each time it grows past the trigger, not on every run.
|
|
56
|
+
export async function compactContext(deps, threadId, model, opts = {}) {
|
|
52
57
|
const budget = contextBudget(deps, model) - deps.config.contextOutputReserveTokens;
|
|
53
58
|
// Scoped to the main agent: unscoped, delegated turns would be compacted
|
|
54
59
|
// into — and then fed back through — the parent's prompt (§2.7)
|
|
55
|
-
const history = await deps.storage.messages.list(threadId, { agentId: null });
|
|
60
|
+
const history = promptHistory(await deps.storage.messages.list(threadId, { agentId: null }));
|
|
56
61
|
const total = history.reduce((sum, m) => sum + estimateTokens(m.content), 0);
|
|
57
62
|
if (total <= budget * deps.config.compactionTrigger)
|
|
58
63
|
return history;
|
|
59
64
|
// Keep the most recent tail verbatim ...
|
|
60
|
-
|
|
65
|
+
let tailStart = history.length;
|
|
61
66
|
let tailTokens = 0;
|
|
62
|
-
for (
|
|
63
|
-
|
|
67
|
+
for (let i = history.length - 1; i >= 0; i -= 1) {
|
|
68
|
+
const t = estimateTokens(history[i].content);
|
|
69
|
+
if (tailTokens + t > budget * deps.config.contextTailShare)
|
|
64
70
|
break;
|
|
65
|
-
|
|
66
|
-
tailTokens +=
|
|
71
|
+
tailStart = i;
|
|
72
|
+
tailTokens += t;
|
|
73
|
+
}
|
|
74
|
+
// ... starting at a user turn. Cut anywhere else and the tail can open on a
|
|
75
|
+
// tool result whose call went into the summary, which no provider accepts.
|
|
76
|
+
// The first user turn inside the budget, or failing that the last one before.
|
|
77
|
+
tailStart = userTurnAtOrAfter(history, tailStart);
|
|
78
|
+
const older = history.slice(0, tailStart);
|
|
79
|
+
const tail = history.slice(tailStart);
|
|
80
|
+
const coversUpTo = [...older].reverse().find((m) => !summaryOf(m))?.id;
|
|
81
|
+
if (!coversUpTo) {
|
|
82
|
+
// Nothing new to summarize: one turn is larger than the tail's share. It
|
|
83
|
+
// goes as it is; the estimate is rough, and the provider decides.
|
|
84
|
+
warnOverBudget(deps, threadId, total, budget);
|
|
85
|
+
return history;
|
|
67
86
|
}
|
|
68
|
-
const older = history.slice(0, history.length - tail.length);
|
|
69
|
-
if (older.length === 0)
|
|
70
|
-
return history; // single oversized turn — blocked by the input guards above
|
|
71
87
|
// ... and summarize everything before it with a cheap model, named in config
|
|
72
88
|
// so a registry that has never heard of 'gpt-4o-mini' can point this at its
|
|
73
|
-
// own (§2.6)
|
|
74
|
-
//
|
|
75
|
-
//
|
|
89
|
+
// own (§2.6): the last summary and the turns since, never the whole history
|
|
90
|
+
// again. Naming the key in the error matters: resolveModel throws from deep
|
|
91
|
+
// inside compaction, on a run that never mentioned this model, so the bare
|
|
92
|
+
// "Unknown model" says nothing about where it came from.
|
|
76
93
|
const compactionModel = deps.config.compactionModel;
|
|
77
94
|
let compactor;
|
|
78
95
|
try {
|
|
@@ -87,20 +104,23 @@ export async function compactContext(deps, threadId, model) {
|
|
|
87
104
|
prompt: 'Summarize the following conversation history into a dense context brief ' +
|
|
88
105
|
'(decisions, open threads, key facts) for an AI agent:\n\n' +
|
|
89
106
|
older.map((m) => `${m.role}: ${JSON.stringify(m.content)}`).join('\n'),
|
|
107
|
+
...(opts.abortSignal ? { abortSignal: opts.abortSignal } : {}),
|
|
90
108
|
});
|
|
91
109
|
const summary = await deps.storage.messages.append(threadId, {
|
|
92
110
|
role: 'system',
|
|
93
|
-
content: { type: 'CONTEXT_SUMMARY', text },
|
|
111
|
+
content: { type: 'CONTEXT_SUMMARY', text, coversUpTo },
|
|
94
112
|
});
|
|
95
113
|
// Compaction is a model call the platform made on its own account (§2.6),
|
|
96
114
|
// so it gets its own priced row like any other (§4). Kind 'compaction' keeps
|
|
97
115
|
// it separable: nobody asked for this call, and it is worth being able to
|
|
98
|
-
// see what the platform's own housekeeping costs.
|
|
116
|
+
// see what the platform's own housekeeping costs. It is billed to the run it
|
|
117
|
+
// served, so it is on that run's bill and under its cap.
|
|
99
118
|
//
|
|
100
119
|
// The cache hit is reported in provider metadata, never in `usage` —
|
|
101
120
|
// attributing without it books every cached prompt at the full input price.
|
|
102
121
|
const meta = rest.providerMetadata ?? rest.experimental_providerMetadata;
|
|
103
|
-
|
|
122
|
+
const usageRow = {
|
|
123
|
+
...(opts.runId ? { runId: opts.runId } : {}),
|
|
104
124
|
agentId: null,
|
|
105
125
|
kind: 'compaction',
|
|
106
126
|
step: 0,
|
|
@@ -109,8 +129,39 @@ export async function compactContext(deps, threadId, model) {
|
|
|
109
129
|
outcome: 'finished',
|
|
110
130
|
providerMetadata: providerMeta(meta, rest.response),
|
|
111
131
|
...fillTokens(usage, meta),
|
|
112
|
-
}
|
|
132
|
+
};
|
|
133
|
+
if (opts.ledger)
|
|
134
|
+
await opts.ledger.record(deps, threadId, usageRow);
|
|
135
|
+
else
|
|
136
|
+
await recordCall(deps, threadId, usageRow);
|
|
113
137
|
await publish(deps, threadId, 'CONTEXT_COMPACTED', { summarizedMessages: older.length });
|
|
114
|
-
|
|
138
|
+
const out = [summary, ...tail];
|
|
139
|
+
// Still over the window: a tail turn alone is larger than it. The next run
|
|
140
|
+
// compacts from this summary on, so this never loops; the call goes as it is
|
|
141
|
+
// and the provider decides, but it is worth saying.
|
|
142
|
+
warnOverBudget(deps, threadId, out.reduce((sum, m) => sum + estimateTokens(m.content), 0), budget);
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
/** Move a tail start onto a user turn: the first one at or after `start`, or
|
|
146
|
+
* failing that the last one before it. With no user turn at all, the tail is
|
|
147
|
+
* empty. */
|
|
148
|
+
function userTurnAtOrAfter(history, start) {
|
|
149
|
+
for (let i = start; i < history.length; i += 1)
|
|
150
|
+
if (history[i].role === 'user')
|
|
151
|
+
return i;
|
|
152
|
+
for (let i = Math.min(start, history.length) - 1; i >= 0; i -= 1) {
|
|
153
|
+
if (history[i].role === 'user')
|
|
154
|
+
return i;
|
|
155
|
+
}
|
|
156
|
+
return history.length;
|
|
157
|
+
}
|
|
158
|
+
/** Log a prompt estimated past the whole window. */
|
|
159
|
+
function warnOverBudget(deps, threadId, used, budget) {
|
|
160
|
+
if (used <= budget)
|
|
161
|
+
return;
|
|
162
|
+
const log = (deps.log ?? console);
|
|
163
|
+
log.warn?.('prompt larger than the context window after compaction', {
|
|
164
|
+
threadId, estimatedTokens: used, budgetTokens: budget,
|
|
165
|
+
});
|
|
115
166
|
}
|
|
116
167
|
//# sourceMappingURL=context.js.map
|
package/dist/core/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAGlC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteThread.d.ts","sourceRoot":"","sources":["../../src/core/deleteThread.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"deleteThread.d.ts","sourceRoot":"","sources":["../../src/core/deleteThread.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAM9D;;;;;;;;;sEASsE;AACtE,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,CAAC,CAoD7B"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { publishNotice } from './publish.js';
|
|
2
|
-
import {
|
|
2
|
+
import { segmentKey } from './segment.js';
|
|
3
|
+
import { attemptsKey, redriveKey, runIdKey } from './keys.js';
|
|
4
|
+
import { closeIfOpen } from './engine.js';
|
|
3
5
|
/** The §3.2 deletion behavior: one call removes the thread and everything
|
|
4
6
|
* that follows it — messages, events, usage rows, subagent runs — plus the
|
|
5
7
|
* thread's hot kv keys (state cache, run lock, event seq, retry counter).
|
|
@@ -14,21 +16,48 @@ export async function deleteThread(deps, threadId) {
|
|
|
14
16
|
const thread = await deps.storage.threads.get(threadId);
|
|
15
17
|
if (!thread)
|
|
16
18
|
return { accepted: false, error: 'Thread not found' };
|
|
17
|
-
if (thread.state === 'RUNNING') {
|
|
19
|
+
if (thread.state === 'RUNNING' || thread.state === 'QUEUED') {
|
|
18
20
|
return { accepted: false, error: 'Thread has an active run — stop it before deleting' };
|
|
19
21
|
}
|
|
22
|
+
// The platform's own records for the thread close first (§2.9): a run still
|
|
23
|
+
// open here can never be worked on again once the thread is gone.
|
|
24
|
+
const runs = await deps.admin.runs.listByThread(threadId).catch(() => []);
|
|
25
|
+
for (const run of runs) {
|
|
26
|
+
if (!run.endedAt)
|
|
27
|
+
await closeIfOpen(deps, run.id, 'deleted');
|
|
28
|
+
}
|
|
29
|
+
// Its run streams go now rather than at their grace window's end. The
|
|
30
|
+
// record says which it had, so it is read before the cascade takes it.
|
|
31
|
+
const segments = await deps.storage.events.list(threadId, { types: ['RUN_STARTED'] }).catch(() => []);
|
|
20
32
|
// Cascade: messages, events, usage, runs follow the thread (§3.2)
|
|
21
33
|
await deps.storage.threads.delete(threadId);
|
|
34
|
+
for (const e of segments) {
|
|
35
|
+
const { streamId } = e.payload;
|
|
36
|
+
if (streamId)
|
|
37
|
+
await deps.streams?.delete(streamId).catch(() => undefined);
|
|
38
|
+
}
|
|
39
|
+
// The platform's own history of the thread goes with it: a deleted thread
|
|
40
|
+
// must not live on in operational views. Best effort, like every admin
|
|
41
|
+
// write; the caller's data is already gone.
|
|
42
|
+
await deps.admin.threads.delete(threadId).catch((err) => {
|
|
43
|
+
(deps.log ?? console).error('admin history of a deleted thread not removed', { threadId, err });
|
|
44
|
+
});
|
|
22
45
|
// Live UIs subscribed to the thread channel learn it ceased to exist —
|
|
23
46
|
// bus-only notice (seq 0, never persisted: the event log is gone with it)
|
|
24
47
|
await publishNotice(deps, threadId, 'THREAD_DELETED', { threadId });
|
|
25
48
|
// Hot cache cleanup — a deleted thread must not resurrect from kv
|
|
26
49
|
await deps.kv.del(`agent:state:${threadId}`);
|
|
27
50
|
await deps.kv.del(`agent:lock:${threadId}`);
|
|
28
|
-
await deps.kv.del(`agent:seq:${threadId}`);
|
|
29
|
-
await deps.kv.del(
|
|
51
|
+
await deps.kv.del(`agent:seq:${threadId}`); // the counter older releases kept
|
|
52
|
+
await deps.kv.del(attemptsKey(threadId));
|
|
30
53
|
await deps.kv.del(runIdKey(threadId));
|
|
31
54
|
await deps.kv.del(redriveKey(threadId));
|
|
55
|
+
// The retry counters are per run, so every run the thread had is swept.
|
|
56
|
+
for (const run of runs) {
|
|
57
|
+
await deps.kv.del(attemptsKey(run.id));
|
|
58
|
+
await deps.kv.del(redriveKey(run.id));
|
|
59
|
+
await deps.kv.del(segmentKey(run.id));
|
|
60
|
+
}
|
|
32
61
|
return { accepted: true };
|
|
33
62
|
}
|
|
34
63
|
//# sourceMappingURL=deleteThread.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteThread.js","sourceRoot":"","sources":["../../src/core/deleteThread.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"deleteThread.js","sourceRoot":"","sources":["../../src/core/deleteThread.ts"],"names":[],"mappings":"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"}
|
package/dist/core/engine.d.ts
CHANGED
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
import type { RuntimePorts } from '../ports/runtime.js';
|
|
2
|
-
import type { ExecutionState, ProviderOptions } from './types.js';
|
|
2
|
+
import type { ExecutionState, JobKind, ProviderOptions } from './types.js';
|
|
3
3
|
import type { TokenAttribution } from './usage.js';
|
|
4
4
|
import type { RegisteredAgent } from './agent.js';
|
|
5
5
|
import { type AgentRunState } from './state.js';
|
|
6
6
|
export { countTokens } from './usage.js';
|
|
7
7
|
export { executeStep, isParked, runLoop, type LoopInput, type LoopOutcome, type RunLedger, type StepResult } from './loop.js';
|
|
8
|
-
/**
|
|
9
|
-
*
|
|
10
|
-
* the
|
|
8
|
+
/** A cap (§2.1, §4) is absent, 0 (no cap from this level: the next level's
|
|
9
|
+
* applies), or a positive number. A negative or non-finite one is a bug in
|
|
10
|
+
* the caller and is refused, never read as "no cap". The same rule as the Go
|
|
11
|
+
* runtime, whose zero value can only mean "not set". */
|
|
11
12
|
export declare function validateTokenBudget(value: number | undefined, label: string): void;
|
|
12
13
|
/** Tools the engine treats as destructive: parked behind parkForApproval
|
|
13
14
|
* (§2.5) instead of executing directly. Purely a marker — see withHitl. */
|
|
14
15
|
export declare function markRequiresConfirmation<T extends object>(t: T): T;
|
|
16
|
+
/** Close a run record that can never be worked on again (§2.9): the thread is
|
|
17
|
+
* gone, or a newer run replaced this one. Without this the record stays
|
|
18
|
+
* open for ever and every "in flight" count carries it. */
|
|
19
|
+
export declare function closeIfOpen(deps: RuntimePorts, runId: string | undefined, stopReason: FinalizeInput['stopReason']): Promise<void>;
|
|
15
20
|
/** The engine (§2.1, §5.6). Worker-side only — runs are dispatched via the
|
|
16
21
|
* queue (§2.8) and may outlive any HTTP response.
|
|
17
22
|
*
|
|
@@ -23,16 +28,20 @@ export declare function markRequiresConfirmation<T extends object>(t: T): T;
|
|
|
23
28
|
* the SDK.
|
|
24
29
|
*
|
|
25
30
|
* Concurrency: acquires the per-thread run lock (`agent:lock:{threadId}`,
|
|
26
|
-
* SET NX + lease) before any work
|
|
27
|
-
* and a crashed worker's lock expires
|
|
28
|
-
* Returns 'lock-conflict' when the lock
|
|
29
|
-
* genuine no-op apart from a completed run
|
|
31
|
+
* SET NX + lease) before any work, and renews it while it works — two
|
|
32
|
+
* workers can never run one thread, and a crashed worker's lock expires
|
|
33
|
+
* instead of blocking forever (§3.4). Returns 'lock-conflict' when the lock
|
|
34
|
+
* is held, so callers can tell a genuine no-op apart from a completed run,
|
|
35
|
+
* and 'lock-lost' when the lock could not be kept. */
|
|
30
36
|
export interface ExecuteInput {
|
|
31
37
|
threadId: string;
|
|
32
38
|
model: string;
|
|
33
39
|
/** This dispatch's run id (§2.1). A job without one keeps the old
|
|
34
40
|
* behavior: no staleness check, and no redrive on a lock conflict. */
|
|
35
41
|
runId?: string;
|
|
42
|
+
/** The job's delivery id (see `RunJob.dispatchId`). Absent on a call that
|
|
43
|
+
* did not come off the queue; the lock then makes one up. */
|
|
44
|
+
dispatchId?: string;
|
|
36
45
|
/** Epoch ms at enqueue, for the queue-wait measurement (§2.9). */
|
|
37
46
|
enqueuedAt?: number;
|
|
38
47
|
/** The run's state (§2.10) — carried so a redrive keeps it. */
|
|
@@ -42,15 +51,32 @@ export interface ExecuteInput {
|
|
|
42
51
|
* what the caller asked for. */
|
|
43
52
|
costBudgetMicros?: number;
|
|
44
53
|
providerOptions?: ProviderOptions;
|
|
54
|
+
/** The run's own step cap (§2.1); 0 or absent keeps the config's. */
|
|
55
|
+
maxSteps?: number;
|
|
56
|
+
/** Epoch ms of the run's first dispatch (see RunJob.dispatchedAt). */
|
|
57
|
+
dispatchedAt?: number;
|
|
58
|
+
/** The caller's tenant (see RunJob.partitionKey). */
|
|
59
|
+
partitionKey?: string;
|
|
60
|
+
/** Why the job exists (see RunJob.kind). */
|
|
61
|
+
kind?: JobKind;
|
|
62
|
+
/** Aborted when the worker is shutting down. The segment stops at once and
|
|
63
|
+
* the job goes back on the queue without spending an attempt: a shutdown
|
|
64
|
+
* is not the run's fault. */
|
|
65
|
+
signal?: AbortSignal;
|
|
45
66
|
}
|
|
46
67
|
/** 'executed' — this worker ran the segment (or it was a legitimate no-op).
|
|
47
68
|
* 'lock-conflict' — someone else holds the thread's run lock; nothing ran.
|
|
48
|
-
* 'stale' — a NEWER run owns the thread; this job must do nothing.
|
|
49
|
-
|
|
69
|
+
* 'stale' — a NEWER run owns the thread; this job must do nothing.
|
|
70
|
+
* 'lock-lost' — this worker held the lock and could not keep it; the
|
|
71
|
+
* segment ended early and the job should come back once
|
|
72
|
+
* the lock is free. Every step it finished is persisted. */
|
|
73
|
+
export type ExecuteOutcome = 'executed' | 'lock-conflict' | 'stale' | 'lock-lost';
|
|
50
74
|
export declare function execute(deps: RuntimePorts, agent: RegisteredAgent, input: ExecuteInput): Promise<ExecuteOutcome>;
|
|
51
75
|
export interface FinalizeInput {
|
|
52
76
|
state: ExecutionState;
|
|
53
|
-
|
|
77
|
+
/** Why the run ended. 'failed' for a failure; 'replaced', 'orphaned' and
|
|
78
|
+
* 'deleted' close a record that can never be worked on again. */
|
|
79
|
+
stopReason: 'completed' | 'token_budget' | 'cost_budget' | 'max_steps' | 'cancelled' | 'failed' | 'timeout' | 'replaced' | 'orphaned' | 'deleted';
|
|
54
80
|
tokensUsed: number;
|
|
55
81
|
attribution: TokenAttribution;
|
|
56
82
|
/** generate-text flavor only: publish the final text as one TEXT_RESULT. */
|
|
@@ -71,6 +97,10 @@ export interface FinalizeInput {
|
|
|
71
97
|
* A budget break is NOT a user stop: the run completes with stopReason
|
|
72
98
|
* 'token_budget' and the usage it actually spent. */
|
|
73
99
|
export declare function finalize(deps: RuntimePorts, agent: RegisteredAgent, threadId: string, f: FinalizeInput): Promise<void>;
|
|
100
|
+
/** Fail a run the queue gave up on (§2.8), when it is still the thread's
|
|
101
|
+
* current run and the thread is still waiting on it. False when the run had
|
|
102
|
+
* already moved on. Runs under the run lock like every other terminal write. */
|
|
103
|
+
export declare function failLostRun(deps: RuntimePorts, agent: RegisteredAgent, threadId: string, runId: string | undefined, reason: string): Promise<boolean>;
|
|
74
104
|
/** §2.8 failure policy: transient errors redrive through the queue; exhausted
|
|
75
105
|
* attempts finalize FAILED (hot cache + durable). A user stop is never
|
|
76
106
|
* retried, and a successful run resets the attempt counter.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,EAAqC,MAAM,YAAY,CAAC;AAG9G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAelD,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAS9D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAG9H;;;yDAGyD;AACzD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIlF;AAQD;4EAC4E;AAC5E,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAElE;AAkPD;;4DAE4D;AAC5D,wBAAsB,WAAW,CAC/B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,UAAU,EAAE,aAAa,CAAC,YAAY,CAAC,iBAYxC;AA8HD;;;;;;;;;;;;;;;uDAeuD;AACvD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd;2EACuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;kEAC8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;qCACiC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;kCAE8B;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;+EAK+E;AAC/E,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,eAAe,GAAG,OAAO,GAAG,WAAW,CAAC;AAElF,wBAAsB,OAAO,CAC3B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,cAAc,CAAC,CAyezB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,cAAc,CAAC;IACtB;sEACkE;IAClE,UAAU,EACN,WAAW,GAAG,cAAc,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,GACxE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;sDACkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;sDAMsD;AACtD,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,MAAM,EAChB,CAAC,EAAE,aAAa,GACf,OAAO,CAAC,IAAI,CAAC,CAkCf;AAED;;iFAEiF;AACjF,wBAAsB,WAAW,CAC/B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAkBlB;AA0FD;;;;yEAIyE;AACzE,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,YAAY,EACnB,MAAM,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACjC,IAAI,GAAE,OAAO,OAAiB,GAC7B,OAAO,CAAC,IAAI,CAAC,CA2Df"}
|