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.
Files changed (216) hide show
  1. package/README.md +34 -14
  2. package/dist/adapters/inline.d.ts +19 -5
  3. package/dist/adapters/inline.d.ts.map +1 -1
  4. package/dist/adapters/inline.js +87 -14
  5. package/dist/adapters/inline.js.map +1 -1
  6. package/dist/adapters/memory.d.ts +65 -3
  7. package/dist/adapters/memory.d.ts.map +1 -1
  8. package/dist/adapters/memory.js +267 -3
  9. package/dist/adapters/memory.js.map +1 -1
  10. package/dist/adapters/prisma.d.ts +125 -18
  11. package/dist/adapters/prisma.d.ts.map +1 -1
  12. package/dist/adapters/prisma.js +308 -67
  13. package/dist/adapters/prisma.js.map +1 -1
  14. package/dist/adapters/qstash.d.ts +15 -2
  15. package/dist/adapters/qstash.d.ts.map +1 -1
  16. package/dist/adapters/qstash.js +31 -14
  17. package/dist/adapters/qstash.js.map +1 -1
  18. package/dist/adapters/redis.d.ts +40 -4
  19. package/dist/adapters/redis.d.ts.map +1 -1
  20. package/dist/adapters/redis.js +265 -20
  21. package/dist/adapters/redis.js.map +1 -1
  22. package/dist/adapters/sqlite.d.ts +52 -2
  23. package/dist/adapters/sqlite.d.ts.map +1 -1
  24. package/dist/adapters/sqlite.js +342 -35
  25. package/dist/adapters/sqlite.js.map +1 -1
  26. package/dist/adapters/stream-scripts.d.ts +49 -0
  27. package/dist/adapters/stream-scripts.d.ts.map +1 -0
  28. package/dist/adapters/stream-scripts.js +150 -0
  29. package/dist/adapters/stream-scripts.js.map +1 -0
  30. package/dist/adapters/upstash.d.ts +20 -0
  31. package/dist/adapters/upstash.d.ts.map +1 -1
  32. package/dist/adapters/upstash.js +29 -0
  33. package/dist/adapters/upstash.js.map +1 -1
  34. package/dist/admin/memory.d.ts +11 -1
  35. package/dist/admin/memory.d.ts.map +1 -1
  36. package/dist/admin/memory.js +83 -14
  37. package/dist/admin/memory.js.map +1 -1
  38. package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts +5 -0
  39. package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts.map +1 -0
  40. package/dist/admin/migrations/postgres/0002-run-settled-at.js +11 -0
  41. package/dist/admin/migrations/postgres/0002-run-settled-at.js.map +1 -0
  42. package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts +5 -0
  43. package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts.map +1 -0
  44. package/dist/admin/migrations/postgres/0003-run-enqueued-at.js +15 -0
  45. package/dist/admin/migrations/postgres/0003-run-enqueued-at.js.map +1 -0
  46. package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts +5 -0
  47. package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts.map +1 -0
  48. package/dist/admin/migrations/postgres/0004-run-settle-claim.js +15 -0
  49. package/dist/admin/migrations/postgres/0004-run-settle-claim.js.map +1 -0
  50. package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts +5 -0
  51. package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts.map +1 -0
  52. package/dist/admin/migrations/postgres/0005-bigint-counters.js +12 -0
  53. package/dist/admin/migrations/postgres/0005-bigint-counters.js.map +1 -0
  54. package/dist/admin/migrations/postgres/index.d.ts.map +1 -1
  55. package/dist/admin/migrations/postgres/index.js +16 -1
  56. package/dist/admin/migrations/postgres/index.js.map +1 -1
  57. package/dist/admin/migrations/runner.d.ts +21 -1
  58. package/dist/admin/migrations/runner.d.ts.map +1 -1
  59. package/dist/admin/migrations/runner.js +41 -4
  60. package/dist/admin/migrations/runner.js.map +1 -1
  61. package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts +5 -0
  62. package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts.map +1 -0
  63. package/dist/admin/migrations/sqlite/0002-run-settled-at.js +11 -0
  64. package/dist/admin/migrations/sqlite/0002-run-settled-at.js.map +1 -0
  65. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts +5 -0
  66. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts.map +1 -0
  67. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js +15 -0
  68. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js.map +1 -0
  69. package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts +5 -0
  70. package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts.map +1 -0
  71. package/dist/admin/migrations/sqlite/0004-run-settle-claim.js +15 -0
  72. package/dist/admin/migrations/sqlite/0004-run-settle-claim.js.map +1 -0
  73. package/dist/admin/migrations/sqlite/index.d.ts +2 -2
  74. package/dist/admin/migrations/sqlite/index.d.ts.map +1 -1
  75. package/dist/admin/migrations/sqlite/index.js +17 -3
  76. package/dist/admin/migrations/sqlite/index.js.map +1 -1
  77. package/dist/admin/postgres.d.ts +14 -4
  78. package/dist/admin/postgres.d.ts.map +1 -1
  79. package/dist/admin/postgres.js +131 -36
  80. package/dist/admin/postgres.js.map +1 -1
  81. package/dist/admin/shared.d.ts +19 -0
  82. package/dist/admin/shared.d.ts.map +1 -0
  83. package/dist/admin/shared.js +28 -0
  84. package/dist/admin/shared.js.map +1 -0
  85. package/dist/admin/sqlite.d.ts +9 -1
  86. package/dist/admin/sqlite.d.ts.map +1 -1
  87. package/dist/admin/sqlite.js +112 -29
  88. package/dist/admin/sqlite.js.map +1 -1
  89. package/dist/core/admin.d.ts +28 -6
  90. package/dist/core/admin.d.ts.map +1 -1
  91. package/dist/core/admin.js +92 -23
  92. package/dist/core/admin.js.map +1 -1
  93. package/dist/core/agent.d.ts +7 -4
  94. package/dist/core/agent.d.ts.map +1 -1
  95. package/dist/core/agent.js +15 -11
  96. package/dist/core/agent.js.map +1 -1
  97. package/dist/core/agui.d.ts +17 -0
  98. package/dist/core/agui.d.ts.map +1 -0
  99. package/dist/core/agui.js +69 -0
  100. package/dist/core/agui.js.map +1 -0
  101. package/dist/core/context.d.ts +13 -1
  102. package/dist/core/context.d.ts.map +1 -1
  103. package/dist/core/context.js +70 -19
  104. package/dist/core/context.js.map +1 -1
  105. package/dist/core/deleteThread.d.ts.map +1 -1
  106. package/dist/core/deleteThread.js +33 -4
  107. package/dist/core/deleteThread.js.map +1 -1
  108. package/dist/core/engine.d.ts +41 -11
  109. package/dist/core/engine.d.ts.map +1 -1
  110. package/dist/core/engine.js +855 -352
  111. package/dist/core/engine.js.map +1 -1
  112. package/dist/core/follow.d.ts +63 -1
  113. package/dist/core/follow.d.ts.map +1 -1
  114. package/dist/core/follow.js +293 -16
  115. package/dist/core/follow.js.map +1 -1
  116. package/dist/core/hitl.d.ts +43 -0
  117. package/dist/core/hitl.d.ts.map +1 -1
  118. package/dist/core/hitl.js +163 -35
  119. package/dist/core/hitl.js.map +1 -1
  120. package/dist/core/keys.d.ts +22 -4
  121. package/dist/core/keys.d.ts.map +1 -1
  122. package/dist/core/keys.js +23 -5
  123. package/dist/core/keys.js.map +1 -1
  124. package/dist/core/lease.d.ts +46 -0
  125. package/dist/core/lease.d.ts.map +1 -0
  126. package/dist/core/lease.js +142 -0
  127. package/dist/core/lease.js.map +1 -0
  128. package/dist/core/loop.d.ts +27 -7
  129. package/dist/core/loop.d.ts.map +1 -1
  130. package/dist/core/loop.js +140 -55
  131. package/dist/core/loop.js.map +1 -1
  132. package/dist/core/messages.d.ts +21 -2
  133. package/dist/core/messages.d.ts.map +1 -1
  134. package/dist/core/messages.js +61 -2
  135. package/dist/core/messages.js.map +1 -1
  136. package/dist/core/prune.d.ts +24 -0
  137. package/dist/core/prune.d.ts.map +1 -0
  138. package/dist/core/prune.js +43 -0
  139. package/dist/core/prune.js.map +1 -0
  140. package/dist/core/publish.d.ts +38 -10
  141. package/dist/core/publish.d.ts.map +1 -1
  142. package/dist/core/publish.js +126 -12
  143. package/dist/core/publish.js.map +1 -1
  144. package/dist/core/reclaim.d.ts +8 -1
  145. package/dist/core/reclaim.d.ts.map +1 -1
  146. package/dist/core/reclaim.js +149 -18
  147. package/dist/core/reclaim.js.map +1 -1
  148. package/dist/core/run.d.ts +7 -3
  149. package/dist/core/run.d.ts.map +1 -1
  150. package/dist/core/run.js +95 -35
  151. package/dist/core/run.js.map +1 -1
  152. package/dist/core/segment.d.ts +62 -0
  153. package/dist/core/segment.d.ts.map +1 -0
  154. package/dist/core/segment.js +318 -0
  155. package/dist/core/segment.js.map +1 -0
  156. package/dist/core/settle.d.ts +57 -0
  157. package/dist/core/settle.d.ts.map +1 -0
  158. package/dist/core/settle.js +181 -0
  159. package/dist/core/settle.js.map +1 -0
  160. package/dist/core/snapshot.d.ts +36 -0
  161. package/dist/core/snapshot.d.ts.map +1 -0
  162. package/dist/core/snapshot.js +87 -0
  163. package/dist/core/snapshot.js.map +1 -0
  164. package/dist/core/stop.d.ts +16 -1
  165. package/dist/core/stop.d.ts.map +1 -1
  166. package/dist/core/stop.js +69 -15
  167. package/dist/core/stop.js.map +1 -1
  168. package/dist/core/stream-events.d.ts +184 -0
  169. package/dist/core/stream-events.d.ts.map +1 -0
  170. package/dist/core/stream-events.js +26 -0
  171. package/dist/core/stream-events.js.map +1 -0
  172. package/dist/core/stream.d.ts +29 -0
  173. package/dist/core/stream.d.ts.map +1 -1
  174. package/dist/core/stream.js +79 -0
  175. package/dist/core/stream.js.map +1 -1
  176. package/dist/core/subagent.d.ts +36 -5
  177. package/dist/core/subagent.d.ts.map +1 -1
  178. package/dist/core/subagent.js +117 -22
  179. package/dist/core/subagent.js.map +1 -1
  180. package/dist/core/types.d.ts +195 -12
  181. package/dist/core/types.d.ts.map +1 -1
  182. package/dist/core/types.js +26 -1
  183. package/dist/core/types.js.map +1 -1
  184. package/dist/core/usage.d.ts +53 -5
  185. package/dist/core/usage.d.ts.map +1 -1
  186. package/dist/core/usage.js +170 -47
  187. package/dist/core/usage.js.map +1 -1
  188. package/dist/index.d.ts +16 -11
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +12 -7
  191. package/dist/index.js.map +1 -1
  192. package/dist/ports/admin.d.ts +59 -0
  193. package/dist/ports/admin.d.ts.map +1 -1
  194. package/dist/ports/kv.d.ts +17 -0
  195. package/dist/ports/kv.d.ts.map +1 -1
  196. package/dist/ports/queue.d.ts +87 -7
  197. package/dist/ports/queue.d.ts.map +1 -1
  198. package/dist/ports/queue.js +36 -1
  199. package/dist/ports/queue.js.map +1 -1
  200. package/dist/ports/runtime.d.ts +171 -20
  201. package/dist/ports/runtime.d.ts.map +1 -1
  202. package/dist/ports/storage.d.ts +26 -5
  203. package/dist/ports/storage.d.ts.map +1 -1
  204. package/dist/ports/streams.d.ts +60 -0
  205. package/dist/ports/streams.d.ts.map +1 -0
  206. package/dist/ports/streams.js +20 -0
  207. package/dist/ports/streams.js.map +1 -0
  208. package/dist/pricing.d.ts +5 -0
  209. package/dist/pricing.d.ts.map +1 -1
  210. package/dist/pricing.js +35 -10
  211. package/dist/pricing.js.map +1 -1
  212. package/dist/runtime.d.ts +6 -0
  213. package/dist/runtime.d.ts.map +1 -1
  214. package/dist/runtime.js +144 -46
  215. package/dist/runtime.js.map +1 -1
  216. package/package.json +1 -1
@@ -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
- export async function compactContext(deps, threadId, model) {
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
- const tail = [];
65
+ let tailStart = history.length;
61
66
  let tailTokens = 0;
62
- for (const m of [...history].reverse()) {
63
- if (tailTokens + estimateTokens(m.content) > budget * deps.config.contextTailShare)
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
- tail.unshift(m);
66
- tailTokens += estimateTokens(m.content);
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). Naming the key in the error matters: resolveModel throws from
74
- // deep inside compaction, on a run that never mentioned this model, so the
75
- // bare "Unknown model" says nothing about where it came from.
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
- await recordCall(deps, threadId, {
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
- return [summary, ...tail];
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
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"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"}
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;AAI9D;;;;;;;;;sEASsE;AACtE,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,CAAC,CAuB7B"}
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 { redriveKey, runIdKey } from './keys.js';
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(`agent:attempts:${threadId}`);
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;AAEjD;;;;;;;;;sEASsE;AACtE,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAkB,EAClB,QAAgB;IAEhB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;IACnE,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC;IAC1F,CAAC;IAED,kEAAkE;IAClE,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE5C,uEAAuE;IACvE,0EAA0E;IAC1E,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAEpE,kEAAkE;IAClE,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC;IAC7C,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC;IAC5C,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;IAC3C,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;IAChD,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAExC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"deleteThread.js","sourceRoot":"","sources":["../../src/core/deleteThread.ts"],"names":[],"mappings":"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"}
@@ -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
- /** The safety cap (§2.1) must be either absent (unbounded apart from
9
- * maxSteps) or a positive number — `0`/negative/NaN would silently disable
10
- * the cap and let a run spend without bound. */
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 — two workers can never run one thread,
27
- * and a crashed worker's lock expires instead of blocking forever (§3.4).
28
- * Returns 'lock-conflict' when the lock is held, so callers can tell a
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
- export type ExecuteOutcome = 'executed' | 'lock-conflict' | 'stale';
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
- stopReason: 'completed' | 'token_budget' | 'cost_budget' | 'max_steps' | 'cancelled';
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":"AACA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAA2B,MAAM,YAAY,CAAC;AAG3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAWlD,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAG9D,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;AAI9H;;iDAEiD;AACjD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIlF;AAED;4EAC4E;AAC5E,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAElE;AA6ND;;;;;;;;;;;;;;gDAcgD;AAChD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd;2EACuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,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;CACnC;AAED;;+EAE+E;AAC/E,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,eAAe,GAAG,OAAO,CAAC;AAEpE,wBAAsB,OAAO,CAC3B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,cAAc,CAAC,CAgRzB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,cAAc,CAAC;IACtB,UAAU,EAAE,WAAW,GAAG,cAAc,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;IACrF,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;AA6CD;;;;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,CAmDf"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"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"}