@librechat/agents 3.6.2 → 3.6.4

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 (66) hide show
  1. package/dist/cjs/graphs/Graph.cjs +35 -20
  2. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  3. package/dist/cjs/hooks/HookRegistry.cjs +7 -1
  4. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  5. package/dist/cjs/hooks/index.cjs +1 -1
  6. package/dist/cjs/llm/openai/index.cjs +36 -0
  7. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  8. package/dist/cjs/main.cjs +4 -1
  9. package/dist/cjs/messages/core.cjs +3 -0
  10. package/dist/cjs/messages/core.cjs.map +1 -1
  11. package/dist/cjs/run.cjs +11 -5
  12. package/dist/cjs/run.cjs.map +1 -1
  13. package/dist/cjs/tools/SubagentTool.cjs +8 -3
  14. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  15. package/dist/cjs/tools/ToolNode.cjs +1 -1
  16. package/dist/cjs/tools/subagent/InMemorySubagentTaskStore.cjs +399 -0
  17. package/dist/cjs/tools/subagent/InMemorySubagentTaskStore.cjs.map +1 -0
  18. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +168 -60
  19. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  20. package/dist/cjs/tools/subagent/index.cjs +1 -0
  21. package/dist/esm/graphs/Graph.mjs +35 -20
  22. package/dist/esm/graphs/Graph.mjs.map +1 -1
  23. package/dist/esm/hooks/HookRegistry.mjs +7 -1
  24. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  25. package/dist/esm/hooks/index.mjs +1 -1
  26. package/dist/esm/llm/openai/index.mjs +37 -1
  27. package/dist/esm/llm/openai/index.mjs.map +1 -1
  28. package/dist/esm/main.mjs +4 -3
  29. package/dist/esm/messages/core.mjs +3 -1
  30. package/dist/esm/messages/core.mjs.map +1 -1
  31. package/dist/esm/run.mjs +11 -5
  32. package/dist/esm/run.mjs.map +1 -1
  33. package/dist/esm/tools/SubagentTool.mjs +8 -3
  34. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  35. package/dist/esm/tools/ToolNode.mjs +1 -1
  36. package/dist/esm/tools/subagent/InMemorySubagentTaskStore.mjs +399 -0
  37. package/dist/esm/tools/subagent/InMemorySubagentTaskStore.mjs.map +1 -0
  38. package/dist/esm/tools/subagent/SubagentExecutor.mjs +168 -60
  39. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  40. package/dist/esm/tools/subagent/index.mjs +1 -0
  41. package/dist/types/graphs/Graph.d.ts +6 -3
  42. package/dist/types/hooks/HookRegistry.d.ts +8 -0
  43. package/dist/types/messages/core.d.ts +2 -0
  44. package/dist/types/run.d.ts +1 -0
  45. package/dist/types/tools/SubagentTool.d.ts +3 -1
  46. package/dist/types/tools/subagent/InMemorySubagentTaskStore.d.ts +45 -0
  47. package/dist/types/tools/subagent/SubagentExecutor.d.ts +26 -3
  48. package/dist/types/tools/subagent/index.d.ts +2 -0
  49. package/dist/types/types/graph.d.ts +11 -4
  50. package/dist/types/types/index.d.ts +1 -0
  51. package/dist/types/types/run.d.ts +6 -0
  52. package/dist/types/types/subagentTasks.d.ts +140 -0
  53. package/package.json +4 -4
  54. package/src/graphs/Graph.ts +84 -36
  55. package/src/hooks/HookRegistry.ts +18 -0
  56. package/src/llm/openai/index.ts +96 -0
  57. package/src/messages/core.ts +5 -0
  58. package/src/run.ts +20 -5
  59. package/src/tools/SubagentTool.ts +20 -2
  60. package/src/tools/subagent/InMemorySubagentTaskStore.ts +624 -0
  61. package/src/tools/subagent/SubagentExecutor.ts +341 -74
  62. package/src/tools/subagent/index.ts +2 -0
  63. package/src/types/graph.ts +11 -4
  64. package/src/types/index.ts +1 -0
  65. package/src/types/run.ts +6 -0
  66. package/src/types/subagentTasks.ts +129 -0
@@ -20,6 +20,7 @@ CONSTRAINTS:
20
20
  - The subagent cannot see your conversation history.`;
21
21
  const DESCRIPTION_PROP_DESCRIPTION = "Complete task description for the subagent. This is the ONLY information it receives — include all necessary context, requirements, and constraints.";
22
22
  const SUBAGENT_TYPE_PROP_DESCRIPTION = "Which subagent type to delegate to. Must be one of the available types.";
23
+ const RUN_IN_BACKGROUND_PROP_DESCRIPTION = "Set true to start the subagent as a detached process-local task and return a background_task_id immediately. Poll the host background-task tool to collect its result. The task can outlive this turn but does not survive a process restart.";
23
24
  const SubagentToolSchema = {
24
25
  type: "object",
25
26
  properties: {
@@ -40,7 +41,7 @@ const SubagentToolDefinition = {
40
41
  description: SubagentToolDescription,
41
42
  parameters: SubagentToolSchema
42
43
  };
43
- function buildSubagentToolParams(configs) {
44
+ function buildSubagentToolParams(configs, options = {}) {
44
45
  const types = configs.map((c) => c.type);
45
46
  const typeDescriptions = configs.map((c) => `- "${c.type}" (${c.name}): ${c.description}`).join("\n");
46
47
  return {
@@ -57,11 +58,15 @@ function buildSubagentToolParams(configs) {
57
58
  type: "string",
58
59
  enum: types,
59
60
  description: `${SUBAGENT_TYPE_PROP_DESCRIPTION} Available: ${types.join(", ")}.`
60
- }
61
+ },
62
+ ...options.background === true ? { run_in_background: {
63
+ type: "boolean",
64
+ description: RUN_IN_BACKGROUND_PROP_DESCRIPTION
65
+ } } : {}
61
66
  },
62
67
  required: ["description", "subagent_type"]
63
68
  },
64
- description: `${SubagentToolDescription}\n\nAvailable types:\n${typeDescriptions}`
69
+ description: `${SubagentToolDescription}${options.background === true ? "\n\nBACKGROUND EXECUTION:\n- Set run_in_background to true when you do not need the result immediately. The call returns a background_task_id; use the host background-task tools to poll, steer, queue, interrupt, or cancel it." : ""}\n\nAvailable types:\n${typeDescriptions}`
65
70
  };
66
71
  }
67
72
  function createSubagentToolDefinition(configs) {
@@ -1 +1 @@
1
- {"version":3,"file":"SubagentTool.cjs","names":["INTENT_PROPERTY"],"sources":["../../../src/tools/SubagentTool.ts"],"mappings":";;;;AAKA,MAAa,mBAAA;AAEb,MAAa,0BAA0B;;;;;;;;;;;;;;;AAgBvC,MAAM,+BACJ;AAEF,MAAM,iCACJ;AAEF,MAAa,qBAAqB;CAChC,MAAM;CACN,YAAY;EACV,QAAQ,EAAE,GAAGA,kBAAAA,gBAAgB;EAC7B,aAAa;GACX,MAAM;GACN,aAAa;EACf;EACA,eAAe;GACb,MAAM;GACN,aAAa;EACf;CACF;CACA,UAAU,CAAC,eAAe,eAAe;AAC3C;AAEA,MAAa,yBAAiC;CAC5C,MAAM;CACN,aAAa;CACb,YAAY;AACd;AAOA,SAAgB,wBAAwB,SAItC;CACA,MAAM,QAAQ,QAAQ,KAAK,MAAM,EAAE,IAAI;CACvC,MAAM,mBAAmB,QACtB,KAAK,MAAM,MAAM,EAAE,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,aAAa,CAAC,CACzD,KAAK,IAAI;CAEZ,OAAO;EACL,MAAM;EACN,QAAQ;GACN,MAAM;GACN,YAAY;IACV,QAAQ,EAAE,GAAGA,kBAAAA,gBAAgB;IAC7B,aAAa;KACX,MAAM;KACN,aAAa;IACf;IACA,eAAe;KACb,MAAM;KACN,MAAM;KACN,aAAa,GAAG,+BAA+B,cAAc,MAAM,KAAK,IAAI,EAAE;IAChF;GACF;GACA,UAAU,CAAC,eAAe,eAAe;EAC3C;EACA,aAAa,GAAG,wBAAwB,wBAAwB;CAClE;AACF;AAOA,SAAgB,6BACd,SACQ;CACR,MAAM,SAAS,wBAAwB,OAAO;CAC9C,OAAO;EACL,MAAM,OAAO;EACb,aAAa,OAAO;EACpB,YAAY,OAAO;CACrB;AACF"}
1
+ {"version":3,"file":"SubagentTool.cjs","names":["INTENT_PROPERTY"],"sources":["../../../src/tools/SubagentTool.ts"],"mappings":";;;;AAKA,MAAa,mBAAA;AAEb,MAAa,0BAA0B;;;;;;;;;;;;;;;AAgBvC,MAAM,+BACJ;AAEF,MAAM,iCACJ;AAEF,MAAM,qCACJ;AAEF,MAAa,qBAAqB;CAChC,MAAM;CACN,YAAY;EACV,QAAQ,EAAE,GAAGA,kBAAAA,gBAAgB;EAC7B,aAAa;GACX,MAAM;GACN,aAAa;EACf;EACA,eAAe;GACb,MAAM;GACN,aAAa;EACf;CACF;CACA,UAAU,CAAC,eAAe,eAAe;AAC3C;AAEA,MAAa,yBAAiC;CAC5C,MAAM;CACN,aAAa;CACb,YAAY;AACd;AAOA,SAAgB,wBACd,SACA,UAAoC,CAAC,GAKrC;CACA,MAAM,QAAQ,QAAQ,KAAK,MAAM,EAAE,IAAI;CACvC,MAAM,mBAAmB,QACtB,KAAK,MAAM,MAAM,EAAE,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,aAAa,CAAC,CACzD,KAAK,IAAI;CAEZ,OAAO;EACL,MAAM;EACN,QAAQ;GACN,MAAM;GACN,YAAY;IACV,QAAQ,EAAE,GAAGA,kBAAAA,gBAAgB;IAC7B,aAAa;KACX,MAAM;KACN,aAAa;IACf;IACA,eAAe;KACb,MAAM;KACN,MAAM;KACN,aAAa,GAAG,+BAA+B,cAAc,MAAM,KAAK,IAAI,EAAE;IAChF;IACA,GAAI,QAAQ,eAAe,OACvB,EACA,mBAAmB;KACjB,MAAM;KACN,aAAa;IACf,EACF,IACE,CAAC;GACP;GACA,UAAU,CAAC,eAAe,eAAe;EAC3C;EACA,aAAa,GAAG,0BACd,QAAQ,eAAe,OACnB,sOACA,GACL,wBAAwB;CAC3B;AACF;AAOA,SAAgB,6BACd,SACQ;CACR,MAAM,SAAS,wBAAwB,OAAO;CAC9C,OAAO;EACL,MAAM,OAAO;EACb,aAAa,OAAO;EACpB,YAAY,OAAO;CACrB;AACF"}
@@ -14,8 +14,8 @@ const require_intentArg = require("./intentArg.cjs");
14
14
  const require_toolOutputReferences = require("./toolOutputReferences.cjs");
15
15
  const require_run = require("../utils/run.cjs");
16
16
  require("../utils/index.cjs");
17
- const require_executeHooks = require("../hooks/executeHooks.cjs");
18
17
  const require_types = require("../hooks/types.cjs");
18
+ const require_executeHooks = require("../hooks/executeHooks.cjs");
19
19
  require("../hooks/index.cjs");
20
20
  const require_CodeSessionFileSummary = require("./CodeSessionFileSummary.cjs");
21
21
  const require_resolveLocalExecutionTools = require("./local/resolveLocalExecutionTools.cjs");
@@ -0,0 +1,399 @@
1
+ let nanoid = require("nanoid");
2
+ //#region src/tools/subagent/InMemorySubagentTaskStore.ts
3
+ const DEFAULT_COMPLETED_TTL_MS = 3600 * 1e3;
4
+ const DEFAULT_MAX_ERROR_CHARS = 4 * 1024;
5
+ const DEFAULT_MAX_MESSAGE_CHARS = 64 * 1024;
6
+ const DEFAULT_TASK_TIMEOUT_MS = 1800 * 1e3;
7
+ const DEFAULT_MAX_CONTROLS = 32;
8
+ const DEFAULT_MAX_RESULT_CHARS = 1e5;
9
+ const DEFAULT_MAX_RUNNING_PER_SCOPE = 10;
10
+ const DEFAULT_MAX_RUNNING_TOTAL = 100;
11
+ const DEFAULT_MAX_TASKS_PER_SCOPE = 200;
12
+ const DEFAULT_MAX_TASKS_TOTAL = 2e3;
13
+ function resolvePositiveInteger(value, fallback) {
14
+ return Number.isSafeInteger(value) && value != null && value > 0 ? value : fallback;
15
+ }
16
+ function resolveOptions(options) {
17
+ const maxTasksPerScope = resolvePositiveInteger(options.maxTasksPerScope, DEFAULT_MAX_TASKS_PER_SCOPE);
18
+ const maxTasksTotal = resolvePositiveInteger(options.maxTasksTotal, DEFAULT_MAX_TASKS_TOTAL);
19
+ return {
20
+ completedTtlMs: resolvePositiveInteger(options.completedTtlMs, DEFAULT_COMPLETED_TTL_MS),
21
+ maxControlMessageChars: resolvePositiveInteger(options.maxControlMessageChars, DEFAULT_MAX_MESSAGE_CHARS),
22
+ maxControlsPerTask: resolvePositiveInteger(options.maxControlsPerTask, DEFAULT_MAX_CONTROLS),
23
+ maxErrorChars: resolvePositiveInteger(options.maxErrorChars, DEFAULT_MAX_ERROR_CHARS),
24
+ maxResultChars: resolvePositiveInteger(options.maxResultChars, DEFAULT_MAX_RESULT_CHARS),
25
+ maxRunningPerScope: Math.min(resolvePositiveInteger(options.maxRunningPerScope, DEFAULT_MAX_RUNNING_PER_SCOPE), maxTasksPerScope),
26
+ maxRunningTotal: Math.min(resolvePositiveInteger(options.maxRunningTotal, DEFAULT_MAX_RUNNING_TOTAL), maxTasksTotal),
27
+ maxTasksPerScope,
28
+ maxTasksTotal,
29
+ taskTimeoutMs: resolvePositiveInteger(options.taskTimeoutMs, DEFAULT_TASK_TIMEOUT_MS)
30
+ };
31
+ }
32
+ function toErrorMessage(error) {
33
+ if (error instanceof Error && error.message.trim() !== "") return error.message;
34
+ return "Detached subagent task failed.";
35
+ }
36
+ function truncateMiddle(value, maxChars) {
37
+ if (value.length <= maxChars) return value;
38
+ const marker = "\n…[truncated]…\n";
39
+ const available = Math.max(0, maxChars - 15);
40
+ const head = Math.ceil(available / 2);
41
+ return `${value.slice(0, head)}${marker}${value.slice(value.length - (available - head))}`;
42
+ }
43
+ function toInjectedMessage(control) {
44
+ return {
45
+ role: "user",
46
+ content: control.message,
47
+ source: "steer"
48
+ };
49
+ }
50
+ function snapshot(task) {
51
+ return {
52
+ taskId: task.id,
53
+ subagentType: task.subagentType,
54
+ status: task.status,
55
+ createdAt: task.createdAt,
56
+ updatedAt: task.updatedAt,
57
+ resultAvailable: task.status === "completed" && task.result != null && !task.resultClaimed,
58
+ resultClaimed: task.resultClaimed,
59
+ pendingControls: task.controls.length,
60
+ ...task.progress == null ? {} : { progress: { ...task.progress } },
61
+ ...task.error == null ? {} : { error: task.error }
62
+ };
63
+ }
64
+ function abortReason(signal) {
65
+ return signal.reason instanceof Error ? signal.reason : /* @__PURE__ */ new Error("Detached subagent task cancelled.");
66
+ }
67
+ var InMemorySubagentTaskStore = class {
68
+ buckets = /* @__PURE__ */ new Map();
69
+ options;
70
+ runningTasks = 0;
71
+ totalTasks = 0;
72
+ constructor(options = {}) {
73
+ this.options = resolveOptions(options);
74
+ }
75
+ start(request) {
76
+ const scopeId = request.scopeId.trim();
77
+ const idempotencyKey = request.idempotencyKey.trim();
78
+ const requestFingerprint = request.requestFingerprint?.trim();
79
+ if (scopeId === "" || idempotencyKey === "") throw new Error("Subagent task scope and idempotency key are required.");
80
+ const now = Date.now();
81
+ const bucket = this.getBucket(scopeId);
82
+ this.sweepBucket(bucket, now);
83
+ const existingId = bucket.taskIdByIdempotencyKey.get(idempotencyKey);
84
+ if (existingId != null) {
85
+ const existing = bucket.tasks.get(existingId);
86
+ if (existing != null) {
87
+ if (requestFingerprint != null && requestFingerprint !== "" && existing.requestFingerprint != null && existing.requestFingerprint !== requestFingerprint) return {
88
+ accepted: false,
89
+ reason: "conflict",
90
+ task: snapshot(existing)
91
+ };
92
+ return {
93
+ accepted: true,
94
+ isNew: false,
95
+ task: snapshot(existing)
96
+ };
97
+ }
98
+ bucket.taskIdByIdempotencyKey.delete(idempotencyKey);
99
+ }
100
+ let running = 0;
101
+ for (const task of bucket.tasks.values()) if (task.status === "running") running += 1;
102
+ if (running >= this.options.maxRunningPerScope || this.runningTasks >= this.options.maxRunningTotal) {
103
+ this.dropEmptyBucket(scopeId, bucket);
104
+ return {
105
+ accepted: false,
106
+ reason: "capacity"
107
+ };
108
+ }
109
+ if (!this.makeRoom(bucket) || !this.makeGlobalRoom()) {
110
+ this.dropEmptyBucket(scopeId, bucket);
111
+ return {
112
+ accepted: false,
113
+ reason: "capacity"
114
+ };
115
+ }
116
+ const task = {
117
+ id: (0, nanoid.nanoid)(),
118
+ idempotencyKey,
119
+ ...requestFingerprint == null || requestFingerprint === "" ? {} : { requestFingerprint },
120
+ scopeId,
121
+ subagentType: request.subagentType,
122
+ status: "running",
123
+ createdAt: now,
124
+ updatedAt: now,
125
+ controller: new AbortController(),
126
+ controls: [],
127
+ progressEvents: 0,
128
+ resultClaimed: false,
129
+ acceptingControls: true
130
+ };
131
+ this.buckets.set(scopeId, bucket);
132
+ bucket.tasks.set(task.id, task);
133
+ bucket.taskIdByIdempotencyKey.set(idempotencyKey, task.id);
134
+ this.runningTasks += 1;
135
+ this.totalTasks += 1;
136
+ task.timeout = setTimeout(() => {
137
+ this.finishWithError(task, "error", /* @__PURE__ */ new Error("Detached subagent task timed out."));
138
+ }, this.options.taskTimeoutMs);
139
+ task.timeout.unref();
140
+ const runtime = this.createRuntime(task);
141
+ Promise.resolve().then(() => {
142
+ if (task.status !== "running" || task.controller.signal.aborted) return;
143
+ return request.run(runtime);
144
+ }).then((result) => {
145
+ if (task.status !== "running" || result == null) return;
146
+ if (task.controller.signal.aborted) {
147
+ this.finishWithError(task, "cancelled", abortReason(task.controller.signal));
148
+ return;
149
+ }
150
+ task.status = "completed";
151
+ task.acceptingControls = false;
152
+ task.controls.length = 0;
153
+ task.result = truncateMiddle(result.content, this.options.maxResultChars);
154
+ task.updatedAt = Date.now();
155
+ this.runningTasks -= 1;
156
+ this.scheduleExpiry(task);
157
+ }, (error) => {
158
+ const status = task.controller.signal.aborted ? "cancelled" : "error";
159
+ this.finishWithError(task, status, error);
160
+ });
161
+ return {
162
+ accepted: true,
163
+ isNew: true,
164
+ task: snapshot(task)
165
+ };
166
+ }
167
+ get(scopeId, taskId) {
168
+ const task = this.find(scopeId, taskId);
169
+ return task == null ? void 0 : snapshot(task);
170
+ }
171
+ list(scopeId) {
172
+ const bucket = this.buckets.get(scopeId.trim());
173
+ if (bucket == null) return [];
174
+ this.sweepBucket(bucket, Date.now());
175
+ return [...bucket.tasks.values()].sort((left, right) => left.createdAt - right.createdAt).map(snapshot);
176
+ }
177
+ claim(scopeId, taskId) {
178
+ const task = this.find(scopeId, taskId);
179
+ if (task == null) return { status: "not_found" };
180
+ if (task.status === "running") return {
181
+ status: "running",
182
+ task: snapshot(task)
183
+ };
184
+ if (task.resultClaimed) return {
185
+ status: "claimed",
186
+ task: snapshot(task)
187
+ };
188
+ task.resultClaimed = true;
189
+ task.updatedAt = Date.now();
190
+ const taskSnapshot = snapshot(task);
191
+ this.scheduleExpiry(task);
192
+ if (task.status === "completed") {
193
+ const result = task.result ?? "";
194
+ task.result = void 0;
195
+ return {
196
+ status: "completed",
197
+ task: taskSnapshot,
198
+ result
199
+ };
200
+ }
201
+ const error = task.error ?? "Detached subagent task did not complete.";
202
+ return {
203
+ status: task.status,
204
+ task: taskSnapshot,
205
+ error
206
+ };
207
+ }
208
+ control(scopeId, taskId, command) {
209
+ const task = this.find(scopeId, taskId);
210
+ if (task == null) return { status: "not_found" };
211
+ if (command.action === "cancel") {
212
+ if (task.status !== "running") return {
213
+ status: "not_running",
214
+ task: snapshot(task)
215
+ };
216
+ this.finishWithError(task, "cancelled", /* @__PURE__ */ new Error("Detached subagent task cancelled by its parent."));
217
+ return {
218
+ status: "cancelled",
219
+ task: snapshot(task)
220
+ };
221
+ }
222
+ if (task.status !== "running" || !task.acceptingControls) return {
223
+ status: "not_running",
224
+ task: snapshot(task)
225
+ };
226
+ if (command.action === "cancel_message") {
227
+ const index = task.controls.findIndex((control) => control.id === command.controlId);
228
+ if (index < 0) return {
229
+ status: "control_not_found",
230
+ task: snapshot(task)
231
+ };
232
+ task.controls.splice(index, 1);
233
+ task.updatedAt = Date.now();
234
+ return {
235
+ status: "accepted",
236
+ task: snapshot(task)
237
+ };
238
+ }
239
+ const message = command.message.trim();
240
+ if (message === "") return {
241
+ status: "invalid",
242
+ message: "A non-empty message is required."
243
+ };
244
+ if (message.length > this.options.maxControlMessageChars) return {
245
+ status: "invalid",
246
+ message: `Message exceeds ${this.options.maxControlMessageChars} characters.`
247
+ };
248
+ if (task.controls.length >= this.options.maxControlsPerTask) return {
249
+ status: "invalid",
250
+ message: `Task already has ${this.options.maxControlsPerTask} pending messages.`
251
+ };
252
+ const control = {
253
+ id: (0, nanoid.nanoid)(),
254
+ action: command.action,
255
+ message
256
+ };
257
+ task.controls.push(control);
258
+ task.updatedAt = Date.now();
259
+ return {
260
+ status: "accepted",
261
+ task: snapshot(task),
262
+ controlId: control.id
263
+ };
264
+ }
265
+ getBucket(scopeId) {
266
+ let bucket = this.buckets.get(scopeId);
267
+ if (bucket == null) {
268
+ bucket = {
269
+ tasks: /* @__PURE__ */ new Map(),
270
+ taskIdByIdempotencyKey: /* @__PURE__ */ new Map()
271
+ };
272
+ this.buckets.set(scopeId, bucket);
273
+ }
274
+ return bucket;
275
+ }
276
+ find(scopeId, taskId) {
277
+ const bucket = this.buckets.get(scopeId.trim());
278
+ if (bucket == null) return;
279
+ this.sweepBucket(bucket, Date.now());
280
+ return bucket.tasks.get(taskId);
281
+ }
282
+ makeRoom(bucket) {
283
+ if (bucket.tasks.size < this.options.maxTasksPerScope) return true;
284
+ const terminal = [...bucket.tasks.values()].filter((task) => task.status !== "running").sort((left, right) => left.updatedAt - right.updatedAt);
285
+ let removeCount = bucket.tasks.size - this.options.maxTasksPerScope + 1;
286
+ for (const task of terminal) {
287
+ if (removeCount <= 0) break;
288
+ this.removeTask(task);
289
+ removeCount -= 1;
290
+ }
291
+ return bucket.tasks.size < this.options.maxTasksPerScope;
292
+ }
293
+ makeGlobalRoom() {
294
+ if (this.totalTasks < this.options.maxTasksTotal) return true;
295
+ const terminal = [...this.buckets.values()].flatMap((bucket) => [...bucket.tasks.values()]).filter((task) => task.status !== "running").sort((left, right) => left.updatedAt - right.updatedAt);
296
+ let removeCount = this.totalTasks - this.options.maxTasksTotal + 1;
297
+ for (const task of terminal) {
298
+ if (removeCount <= 0) break;
299
+ this.removeTask(task);
300
+ removeCount -= 1;
301
+ }
302
+ return this.totalTasks < this.options.maxTasksTotal;
303
+ }
304
+ sweepBucket(bucket, now) {
305
+ for (const task of bucket.tasks.values()) if (task.status !== "running" && now - task.updatedAt > this.options.completedTtlMs) this.removeTask(task);
306
+ }
307
+ removeTask(task) {
308
+ const bucket = this.buckets.get(task.scopeId);
309
+ if (bucket?.tasks.get(task.id) !== task) return;
310
+ bucket.tasks.delete(task.id);
311
+ this.totalTasks -= 1;
312
+ if (bucket.taskIdByIdempotencyKey.get(task.idempotencyKey) === task.id) bucket.taskIdByIdempotencyKey.delete(task.idempotencyKey);
313
+ if (bucket.tasks.size === 0) this.buckets.delete(task.scopeId);
314
+ this.clearTaskExpiry(task);
315
+ this.clearTaskTimeout(task);
316
+ }
317
+ dropEmptyBucket(scopeId, bucket) {
318
+ if (bucket.tasks.size === 0 && this.buckets.get(scopeId) === bucket) this.buckets.delete(scopeId);
319
+ }
320
+ scheduleExpiry(task) {
321
+ this.clearTaskTimeout(task);
322
+ this.clearTaskExpiry(task);
323
+ task.expiry = setTimeout(() => {
324
+ this.removeTask(task);
325
+ }, this.options.completedTtlMs);
326
+ task.expiry.unref();
327
+ }
328
+ clearTaskExpiry(task) {
329
+ if (task.expiry == null) return;
330
+ clearTimeout(task.expiry);
331
+ task.expiry = void 0;
332
+ }
333
+ clearTaskTimeout(task) {
334
+ if (task.timeout == null) return;
335
+ clearTimeout(task.timeout);
336
+ task.timeout = void 0;
337
+ }
338
+ finishWithError(task, status, error) {
339
+ if (task.status !== "running") return;
340
+ const message = truncateMiddle(toErrorMessage(error), this.options.maxErrorChars);
341
+ const resolved = new Error(message);
342
+ task.status = status;
343
+ this.runningTasks -= 1;
344
+ task.acceptingControls = false;
345
+ task.controls.length = 0;
346
+ task.error = message;
347
+ task.updatedAt = Date.now();
348
+ this.scheduleExpiry(task);
349
+ task.controller.abort(resolved);
350
+ }
351
+ createRuntime(task) {
352
+ const take = (accept) => {
353
+ if (task.status !== "running") return [];
354
+ const selected = [];
355
+ const retained = [];
356
+ for (const control of task.controls) (accept(control) ? selected : retained).push(control);
357
+ task.controls = retained;
358
+ if (selected.length > 0) task.updatedAt = Date.now();
359
+ return selected.map(toInjectedMessage);
360
+ };
361
+ return {
362
+ taskId: task.id,
363
+ signal: task.controller.signal,
364
+ shouldPreempt: () => task.status === "running" && task.controls.some((control) => control.action === "interrupt"),
365
+ drain: (boundary) => {
366
+ if (boundary === "preempt") return take((control) => control.action === "interrupt");
367
+ if (boundary === "tool") return take((control) => control.action !== "queue");
368
+ return take(() => true);
369
+ },
370
+ closeTurn: () => {
371
+ const messages = take(() => true);
372
+ if (messages.length > 0) return {
373
+ closed: false,
374
+ messages
375
+ };
376
+ task.acceptingControls = false;
377
+ return {
378
+ closed: true,
379
+ messages: []
380
+ };
381
+ },
382
+ reportProgress: (event) => {
383
+ if (task.status !== "running") return;
384
+ task.progressEvents += 1;
385
+ task.updatedAt = Date.now();
386
+ task.progress = {
387
+ phase: event.phase,
388
+ at: task.updatedAt,
389
+ eventCount: task.progressEvents,
390
+ ...event.label == null ? {} : { label: event.label }
391
+ };
392
+ }
393
+ };
394
+ }
395
+ };
396
+ //#endregion
397
+ exports.InMemorySubagentTaskStore = InMemorySubagentTaskStore;
398
+
399
+ //# sourceMappingURL=InMemorySubagentTaskStore.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemorySubagentTaskStore.cjs","names":[],"sources":["../../../../src/tools/subagent/InMemorySubagentTaskStore.ts"],"mappings":"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"}