@atoms-agent/core 0.3.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 (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -0
  3. package/dist/agent.d.ts +58 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +118 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/context.d.ts +33 -0
  8. package/dist/context.d.ts.map +1 -0
  9. package/dist/context.js +42 -0
  10. package/dist/context.js.map +1 -0
  11. package/dist/errors.d.ts +7 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +6 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/events.d.ts +68 -0
  16. package/dist/events.d.ts.map +1 -0
  17. package/dist/events.js +2 -0
  18. package/dist/events.js.map +1 -0
  19. package/dist/index.d.ts +17 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +7 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/internal/abort.d.ts +2 -0
  24. package/dist/internal/abort.d.ts.map +1 -0
  25. package/dist/internal/abort.js +34 -0
  26. package/dist/internal/abort.js.map +1 -0
  27. package/dist/internal/loop.d.ts +45 -0
  28. package/dist/internal/loop.d.ts.map +1 -0
  29. package/dist/internal/loop.js +509 -0
  30. package/dist/internal/loop.js.map +1 -0
  31. package/dist/limits.d.ts +16 -0
  32. package/dist/limits.d.ts.map +1 -0
  33. package/dist/limits.js +7 -0
  34. package/dist/limits.js.map +1 -0
  35. package/dist/registry.d.ts +20 -0
  36. package/dist/registry.d.ts.map +1 -0
  37. package/dist/registry.js +52 -0
  38. package/dist/registry.js.map +1 -0
  39. package/dist/spec.d.ts +29 -0
  40. package/dist/spec.d.ts.map +1 -0
  41. package/dist/spec.js +141 -0
  42. package/dist/spec.js.map +1 -0
  43. package/dist/state.d.ts +42 -0
  44. package/dist/state.d.ts.map +1 -0
  45. package/dist/state.js +263 -0
  46. package/dist/state.js.map +1 -0
  47. package/dist/structured-output.d.ts +41 -0
  48. package/dist/structured-output.d.ts.map +1 -0
  49. package/dist/structured-output.js +170 -0
  50. package/dist/structured-output.js.map +1 -0
  51. package/dist/tool.d.ts +75 -0
  52. package/dist/tool.d.ts.map +1 -0
  53. package/dist/tool.js +206 -0
  54. package/dist/tool.js.map +1 -0
  55. package/package.json +50 -0
@@ -0,0 +1,509 @@
1
+ import { assertModelRequestCapabilities, AtomsAgentError } from "@atoms-agent/llm";
2
+ import { assertAgentMessageHistory } from "../state.js";
3
+ import { createStructuredOutputFailure, StructuredOutputValidationError, } from "../structured-output.js";
4
+ import { executeToolCall, } from "../tool.js";
5
+ import { awaitWithAbort } from "./abort.js";
6
+ /** 任务 C104(Loop/Event)与 C105(取消/Limits/Retry)实现。 */
7
+ export async function* runLoop(input) {
8
+ const scope = createRunScope(input.signal, input.limits.timeoutMs);
9
+ const nativeStructuredOutput = input.structuredOutput !== undefined && input.model.capabilities.structuredOutput === "native"
10
+ ? input.structuredOutput.request
11
+ : undefined;
12
+ const effectiveSystemPrompt = input.structuredOutput === undefined || nativeStructuredOutput !== undefined
13
+ ? input.systemPrompt
14
+ : appendSystemInstruction(input.systemPrompt, input.structuredOutput.promptInstruction);
15
+ let turn = 0;
16
+ let turnOpen = false;
17
+ let repairPending = false;
18
+ let lastStructuredOutput;
19
+ try {
20
+ yield { type: "agent_start", runId: input.runId, agentId: input.agentId };
21
+ throwIfRunStopped(scope);
22
+ input.state.messages.push({
23
+ role: "user",
24
+ content: [{ type: "text", text: input.input }],
25
+ });
26
+ while (true) {
27
+ throwIfRunStopped(scope);
28
+ if (turn >= input.limits.maxTurns) {
29
+ throw new AtomsAgentError("MAX_TURNS_EXCEEDED", `Agent exceeded maxTurns (${input.limits.maxTurns}).`);
30
+ }
31
+ turn += 1;
32
+ const isRepairTurn = repairPending;
33
+ if (isRepairTurn && lastStructuredOutput !== undefined) {
34
+ lastStructuredOutput = { ...lastStructuredOutput, repairAttempted: true };
35
+ }
36
+ turnOpen = true;
37
+ yield { type: "turn_start", runId: input.runId, turn };
38
+ const prepared = await awaitWithAbort(() => input.context.prepare({
39
+ history: structuredClone(input.state.messages),
40
+ systemPrompt: effectiveSystemPrompt,
41
+ ...(input.contextConfig === undefined
42
+ ? {}
43
+ : { config: structuredClone(input.contextConfig) }),
44
+ signal: scope.signal,
45
+ }), scope.signal, "Context preparation was cancelled.");
46
+ const preparedMessages = assertAgentMessageHistory(prepared.messages, "ContextStrategy output.messages");
47
+ const request = {
48
+ system: effectiveSystemPrompt,
49
+ messages: preparedMessages,
50
+ tools: isRepairTurn
51
+ ? []
52
+ : [...input.tools.values()].map(({ tool }) => ({
53
+ name: tool.name,
54
+ description: tool.description,
55
+ inputSchema: tool.inputSchema,
56
+ })),
57
+ ...(nativeStructuredOutput === undefined
58
+ ? {}
59
+ : { structuredOutput: structuredClone(nativeStructuredOutput) }),
60
+ };
61
+ assertModelRequestCapabilities(input.model, request);
62
+ throwIfRunStopped(scope);
63
+ const completed = yield* streamAssistantWithRetry(input, request, turn, scope);
64
+ throwIfRunStopped(scope);
65
+ input.state.messages.push(structuredClone(completed.message));
66
+ const toolCalls = completed.message.content.filter((block) => block.type === "tool_call");
67
+ if (isRepairTurn && toolCalls.length > 0) {
68
+ input.state.messages.push({
69
+ role: "tool",
70
+ content: toolCalls.map((call) => ({
71
+ type: "tool_result",
72
+ toolCallId: call.toolCallId,
73
+ toolName: call.toolName,
74
+ content: "[OUTPUT_VALIDATION_ERROR] Tool Calls are not allowed during output repair.",
75
+ isError: true,
76
+ })),
77
+ });
78
+ lastStructuredOutput = createStructuredOutputFailure([
79
+ {
80
+ instancePath: "",
81
+ schemaPath: "",
82
+ keyword: "tool_calls",
83
+ message: "The repair response produced Tool Calls instead of a JSON value.",
84
+ },
85
+ ], true);
86
+ throw new StructuredOutputValidationError(lastStructuredOutput);
87
+ }
88
+ if (toolCalls.length === 0) {
89
+ let structuredOutput;
90
+ if (input.structuredOutput !== undefined) {
91
+ structuredOutput = input.structuredOutput.validate(messageText(completed.message), isRepairTurn);
92
+ if (!structuredOutput.valid) {
93
+ lastStructuredOutput = structuredOutput;
94
+ if (!isRepairTurn) {
95
+ input.state.messages.push({
96
+ role: "user",
97
+ content: [
98
+ {
99
+ type: "text",
100
+ text: input.structuredOutput.repairPrompt(structuredOutput.diagnostics),
101
+ },
102
+ ],
103
+ });
104
+ repairPending = true;
105
+ yield { type: "turn_end", runId: input.runId, turn };
106
+ turnOpen = false;
107
+ continue;
108
+ }
109
+ throw new StructuredOutputValidationError(structuredOutput);
110
+ }
111
+ }
112
+ scope.dispose();
113
+ yield { type: "turn_end", runId: input.runId, turn };
114
+ turnOpen = false;
115
+ yield {
116
+ type: "agent_end",
117
+ runId: input.runId,
118
+ stopReason: "completed",
119
+ finalText: messageText(completed.message),
120
+ ...(structuredOutput === undefined ? {} : { structuredOutput }),
121
+ };
122
+ return;
123
+ }
124
+ const toolResults = yield* executeToolCalls(input, toolCalls, turn, scope);
125
+ input.state.messages.push({ role: "tool", content: toolResults });
126
+ yield { type: "turn_end", runId: input.runId, turn };
127
+ turnOpen = false;
128
+ }
129
+ }
130
+ catch (cause) {
131
+ const structuredOutput = cause instanceof StructuredOutputValidationError ? cause.result : lastStructuredOutput;
132
+ const error = normalizeRunError(cause, scope);
133
+ const stopReason = stopReasonFor(error);
134
+ scope.dispose();
135
+ yield {
136
+ type: "error",
137
+ runId: input.runId,
138
+ code: error.code,
139
+ message: error.message,
140
+ };
141
+ if (turnOpen) {
142
+ yield { type: "turn_end", runId: input.runId, turn };
143
+ }
144
+ yield {
145
+ type: "agent_end",
146
+ runId: input.runId,
147
+ stopReason,
148
+ ...(structuredOutput === undefined ? {} : { structuredOutput }),
149
+ };
150
+ }
151
+ finally {
152
+ pairDanglingToolCalls(input.state);
153
+ scope.dispose();
154
+ }
155
+ }
156
+ const MAX_PROVIDER_RETRIES = 2;
157
+ const RETRY_BASE_DELAY_MS = 100;
158
+ const MAX_RETRY_ELAPSED_MS = 30_000;
159
+ async function* streamAssistantWithRetry(input, request, turn, scope) {
160
+ const retryStartedAt = Date.now();
161
+ let retries = 0;
162
+ while (true) {
163
+ let emitted = false;
164
+ try {
165
+ return yield* streamAssistantMessage(input, request, turn, scope.signal, () => {
166
+ emitted = true;
167
+ });
168
+ }
169
+ catch (cause) {
170
+ throwIfRunStopped(scope);
171
+ const error = normalizeProviderError(cause);
172
+ if (emitted ||
173
+ error.code !== "PROVIDER_ERROR" ||
174
+ !error.retryable ||
175
+ retries >= MAX_PROVIDER_RETRIES) {
176
+ throw error;
177
+ }
178
+ const delayMs = error.retryAfterMs ?? RETRY_BASE_DELAY_MS * 2 ** retries;
179
+ const now = Date.now();
180
+ if (!Number.isFinite(delayMs) ||
181
+ delayMs < 0 ||
182
+ now - retryStartedAt + delayMs > MAX_RETRY_ELAPSED_MS ||
183
+ now + delayMs >= scope.deadlineMs) {
184
+ throw error;
185
+ }
186
+ retries += 1;
187
+ await delayWithSignal(delayMs, scope.signal);
188
+ throwIfRunStopped(scope);
189
+ }
190
+ }
191
+ }
192
+ async function* streamAssistantMessage(input, request, turn, signal, onEvent) {
193
+ let started = false;
194
+ let completed;
195
+ let deltaText = "";
196
+ const streamedToolCalls = [];
197
+ let stream;
198
+ try {
199
+ stream = input.model.stream(request, { signal });
200
+ }
201
+ catch (cause) {
202
+ throw normalizeProviderError(cause);
203
+ }
204
+ try {
205
+ for await (const event of stream) {
206
+ if (completed !== undefined) {
207
+ throw providerProtocolError("Model emitted an event after message_end.");
208
+ }
209
+ if (event.type === "message_start") {
210
+ if (started) {
211
+ throw providerProtocolError("Model emitted message_start more than once.");
212
+ }
213
+ started = true;
214
+ onEvent();
215
+ yield { type: "message_start", runId: input.runId, turn };
216
+ continue;
217
+ }
218
+ if (!started) {
219
+ throw providerProtocolError(`Model emitted ${event.type} before message_start.`);
220
+ }
221
+ if (event.type === "text_delta") {
222
+ deltaText += event.delta;
223
+ onEvent();
224
+ yield {
225
+ type: "message_delta",
226
+ runId: input.runId,
227
+ turn,
228
+ delta: event.delta,
229
+ };
230
+ }
231
+ else if (event.type === "tool_call") {
232
+ streamedToolCalls.push({
233
+ type: "tool_call",
234
+ toolCallId: event.toolCallId,
235
+ toolName: event.toolName,
236
+ input: structuredClone(event.input),
237
+ });
238
+ }
239
+ else {
240
+ const message = structuredClone(event.message);
241
+ validateCompletedMessage(message, event.finishReason, deltaText, streamedToolCalls);
242
+ completed = {
243
+ ...event,
244
+ message,
245
+ usage: structuredClone(event.usage),
246
+ };
247
+ onEvent();
248
+ yield {
249
+ type: "message_end",
250
+ runId: input.runId,
251
+ turn,
252
+ message: structuredClone(message),
253
+ usage: structuredClone(event.usage),
254
+ };
255
+ }
256
+ }
257
+ }
258
+ catch (cause) {
259
+ throw normalizeProviderError(cause);
260
+ }
261
+ if (!started || completed === undefined) {
262
+ throw providerProtocolError("Model stream ended before a complete message was produced.");
263
+ }
264
+ return completed;
265
+ }
266
+ function validateCompletedMessage(message, finishReason, deltaText, streamedToolCalls) {
267
+ if (finishReason === "cancelled") {
268
+ throw new AtomsAgentError("CANCELLED", "Model request was cancelled.");
269
+ }
270
+ if (finishReason === "error") {
271
+ throw new AtomsAgentError("PROVIDER_ERROR", "Model reported an error finish reason.");
272
+ }
273
+ if (finishReason === "max_tokens") {
274
+ throw new AtomsAgentError("PROVIDER_ERROR", "Model output was truncated because the maximum output token limit was reached.");
275
+ }
276
+ const completedText = messageText(message);
277
+ if (deltaText.length > 0 && deltaText !== completedText) {
278
+ throw providerProtocolError("Text deltas do not match the completed assistant message.");
279
+ }
280
+ const completedToolCalls = message.content.filter((block) => block.type === "tool_call");
281
+ if (completedToolCalls.length !== streamedToolCalls.length) {
282
+ throw providerProtocolError("Streamed Tool Calls do not match the completed message.");
283
+ }
284
+ const ids = new Set();
285
+ for (const [index, call] of completedToolCalls.entries()) {
286
+ const streamed = streamedToolCalls[index];
287
+ if (streamed === undefined ||
288
+ call.toolCallId.length === 0 ||
289
+ ids.has(call.toolCallId) ||
290
+ call.toolCallId !== streamed.toolCallId ||
291
+ call.toolName !== streamed.toolName ||
292
+ JSON.stringify(call.input) !== JSON.stringify(streamed.input)) {
293
+ throw providerProtocolError("Tool Call stream data is inconsistent or has duplicate IDs.");
294
+ }
295
+ ids.add(call.toolCallId);
296
+ }
297
+ if ((completedToolCalls.length > 0 && finishReason !== "tool_calls") ||
298
+ (completedToolCalls.length === 0 && finishReason === "tool_calls")) {
299
+ throw providerProtocolError("Model finishReason is inconsistent with Tool Calls.");
300
+ }
301
+ }
302
+ function missingToolResult(call) {
303
+ return {
304
+ toolCallId: call.toolCallId,
305
+ toolName: call.toolName,
306
+ content: `[TOOL_EXECUTION_ERROR] Tool ${call.toolName} is not registered.`,
307
+ isError: true,
308
+ truncated: false,
309
+ errorCode: "TOOL_EXECUTION_ERROR",
310
+ };
311
+ }
312
+ async function* executeToolCalls(input, toolCalls, turn, scope) {
313
+ const results = [];
314
+ let currentStarted = false;
315
+ try {
316
+ for (const call of toolCalls) {
317
+ currentStarted = false;
318
+ throwIfRunStopped(scope);
319
+ yield {
320
+ type: "tool_start",
321
+ runId: input.runId,
322
+ turn,
323
+ toolCallId: call.toolCallId,
324
+ toolName: call.toolName,
325
+ input: structuredClone(call.input),
326
+ };
327
+ currentStarted = true;
328
+ const binding = input.tools.get(call.toolName);
329
+ const result = binding === undefined
330
+ ? missingToolResult(call)
331
+ : await executeToolCall(binding.tool, call, {
332
+ signal: scope.signal,
333
+ authorize: input.authorize,
334
+ ...(binding.config === undefined ? {} : { config: structuredClone(binding.config) }),
335
+ });
336
+ throwIfRunStopped(scope);
337
+ results.push(toToolResultBlock(call, result));
338
+ yield {
339
+ type: "tool_end",
340
+ runId: input.runId,
341
+ turn,
342
+ toolCallId: call.toolCallId,
343
+ toolName: call.toolName,
344
+ content: result.content,
345
+ isError: result.isError,
346
+ };
347
+ currentStarted = false;
348
+ }
349
+ return results;
350
+ }
351
+ catch (cause) {
352
+ const error = normalizeRunError(cause, scope);
353
+ const currentCall = toolCalls[results.length];
354
+ const interrupted = toolCalls.slice(results.length).map((call) => ({
355
+ type: "tool_result",
356
+ toolCallId: call.toolCallId,
357
+ toolName: call.toolName,
358
+ content: `[${error.code}] Tool call did not complete.`,
359
+ isError: true,
360
+ }));
361
+ results.push(...interrupted);
362
+ input.state.messages.push({ role: "tool", content: results });
363
+ if (currentStarted && currentCall !== undefined) {
364
+ yield {
365
+ type: "tool_end",
366
+ runId: input.runId,
367
+ turn,
368
+ toolCallId: currentCall.toolCallId,
369
+ toolName: currentCall.toolName,
370
+ content: `[${error.code}] Tool call did not complete.`,
371
+ isError: true,
372
+ };
373
+ }
374
+ throw error;
375
+ }
376
+ }
377
+ function toToolResultBlock(call, result) {
378
+ return {
379
+ type: "tool_result",
380
+ toolCallId: call.toolCallId,
381
+ toolName: call.toolName,
382
+ content: result.content,
383
+ isError: result.isError,
384
+ };
385
+ }
386
+ function pairDanglingToolCalls(state) {
387
+ const lastMessage = state.messages.at(-1);
388
+ if (lastMessage?.role !== "assistant") {
389
+ return;
390
+ }
391
+ const calls = lastMessage.content.filter((block) => block.type === "tool_call");
392
+ if (calls.length === 0) {
393
+ return;
394
+ }
395
+ state.messages.push({
396
+ role: "tool",
397
+ content: calls.map((call) => ({
398
+ type: "tool_result",
399
+ toolCallId: call.toolCallId,
400
+ toolName: call.toolName,
401
+ content: "[CANCELLED] Event iteration ended before Tool execution completed.",
402
+ isError: true,
403
+ })),
404
+ });
405
+ }
406
+ function messageText(message) {
407
+ return message.content
408
+ .filter((block) => block.type === "text")
409
+ .map((block) => block.text)
410
+ .join("");
411
+ }
412
+ function appendSystemInstruction(systemPrompt, instruction) {
413
+ return systemPrompt.length === 0 ? instruction : `${systemPrompt}\n\n${instruction}`;
414
+ }
415
+ function providerProtocolError(message) {
416
+ return new AtomsAgentError("PROVIDER_ERROR", message);
417
+ }
418
+ function normalizeProviderError(cause) {
419
+ if (cause instanceof AtomsAgentError) {
420
+ return cause;
421
+ }
422
+ return new AtomsAgentError("PROVIDER_ERROR", "Model request failed.", { cause });
423
+ }
424
+ function createRunScope(externalSignal, timeoutMs) {
425
+ const controller = new AbortController();
426
+ const deadlineMs = Date.now() + timeoutMs;
427
+ let kind;
428
+ let disposed = false;
429
+ const abort = (nextKind) => {
430
+ if (kind !== undefined) {
431
+ return;
432
+ }
433
+ kind = nextKind;
434
+ controller.abort();
435
+ };
436
+ const onExternalAbort = () => abort("cancelled");
437
+ if (externalSignal?.aborted === true) {
438
+ onExternalAbort();
439
+ }
440
+ else {
441
+ externalSignal?.addEventListener("abort", onExternalAbort, { once: true });
442
+ }
443
+ const timer = setTimeout(() => abort("timeout"), timeoutMs);
444
+ return {
445
+ signal: controller.signal,
446
+ deadlineMs,
447
+ abortKind: () => kind,
448
+ dispose() {
449
+ if (disposed) {
450
+ return;
451
+ }
452
+ disposed = true;
453
+ clearTimeout(timer);
454
+ externalSignal?.removeEventListener("abort", onExternalAbort);
455
+ },
456
+ };
457
+ }
458
+ function throwIfRunStopped(scope) {
459
+ if (!scope.signal.aborted) {
460
+ return;
461
+ }
462
+ if (scope.abortKind() === "timeout") {
463
+ throw new AtomsAgentError("TIMEOUT", "Agent run timed out.");
464
+ }
465
+ throw new AtomsAgentError("CANCELLED", "Agent run was cancelled.");
466
+ }
467
+ function normalizeRunError(cause, scope) {
468
+ if (scope.signal.aborted) {
469
+ try {
470
+ throwIfRunStopped(scope);
471
+ }
472
+ catch (error) {
473
+ return error;
474
+ }
475
+ }
476
+ if (cause instanceof AtomsAgentError) {
477
+ return cause;
478
+ }
479
+ return new AtomsAgentError("PROVIDER_ERROR", "Agent run failed.", { cause });
480
+ }
481
+ function stopReasonFor(error) {
482
+ if (error.code === "CANCELLED") {
483
+ return "cancelled";
484
+ }
485
+ if (error.code === "TIMEOUT") {
486
+ return "timeout";
487
+ }
488
+ if (error.code === "MAX_TURNS_EXCEEDED") {
489
+ return "max_turns";
490
+ }
491
+ return "error";
492
+ }
493
+ function delayWithSignal(delayMs, signal) {
494
+ if (signal.aborted) {
495
+ return Promise.reject(new AtomsAgentError("CANCELLED", "Provider retry was cancelled."));
496
+ }
497
+ return new Promise((resolve, reject) => {
498
+ const timer = setTimeout(() => {
499
+ signal.removeEventListener("abort", onAbort);
500
+ resolve();
501
+ }, delayMs);
502
+ const onAbort = () => {
503
+ clearTimeout(timer);
504
+ reject(new AtomsAgentError("CANCELLED", "Provider retry was cancelled."));
505
+ };
506
+ signal.addEventListener("abort", onAbort, { once: true });
507
+ });
508
+ }
509
+ //# sourceMappingURL=loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/internal/loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Run 级限制(PRD CORE-003)。
3
+ *
4
+ * 语义(AGENTS.md §12,任务 C105 实现):
5
+ * - `maxTurns`:每轮开始前检查,超出以 MAX_TURNS_EXCEEDED 终止。
6
+ * - `timeoutMs`:整个 Run 的 Deadline。到期通过 AbortSignal 取消在途
7
+ * Provider 请求和 Tool 执行,不得只在轮边界检查。
8
+ */
9
+ export type RunLimits = {
10
+ maxTurns?: number;
11
+ timeoutMs?: number;
12
+ };
13
+ /** Node.js 与浏览器 setTimeout 都能准确表示的最大单次延迟。 */
14
+ export declare const MAX_TIMEOUT_MS = 2147483647;
15
+ export declare const DEFAULT_LIMITS: Required<RunLimits>;
16
+ //# sourceMappingURL=limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,cAAc,aAAgB,CAAC;AAE5C,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,SAAS,CAG9C,CAAC"}
package/dist/limits.js ADDED
@@ -0,0 +1,7 @@
1
+ /** Node.js 与浏览器 setTimeout 都能准确表示的最大单次延迟。 */
2
+ export const MAX_TIMEOUT_MS = 2_147_483_647;
3
+ export const DEFAULT_LIMITS = {
4
+ maxTurns: 24,
5
+ timeoutMs: 300_000,
6
+ };
7
+ //# sourceMappingURL=limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"AAaA,6CAA6C;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,cAAc,GAAwB;IACjD,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,OAAO;CACnB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { ModelAdapter } from "@atoms-agent/llm";
2
+ import type { ContextStrategy } from "./context.js";
3
+ import type { ToolDefinition } from "./tool.js";
4
+ /**
5
+ * RuntimeRegistry —— 把 AgentSpec 中的 Ref 绑定到运行时实现(PRD §8.2)。
6
+ *
7
+ * Registry 是进程内代码绑定,不要求可序列化。
8
+ * 缺失的 Ref 必须在 Run 开始前报 CONFIG_ERROR(PRD CFG-002)。
9
+ */
10
+ export interface RuntimeRegistry {
11
+ model(ref: string, adapter: ModelAdapter): this;
12
+ tool(ref: string, definition: ToolDefinition): this;
13
+ context(ref: string, strategy: ContextStrategy): this;
14
+ resolveModel(ref: string): ModelAdapter;
15
+ resolveTool(ref: string): ToolDefinition;
16
+ resolveContext(ref: string): ContextStrategy;
17
+ }
18
+ /** 创建空 Registry(任务 C103)。 */
19
+ export declare function createRegistry(): RuntimeRegistry;
20
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAChD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IACpD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IAEtD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;IACxC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAC;IACzC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAC;CAC9C;AAED,6BAA6B;AAC7B,wBAAgB,cAAc,IAAI,eAAe,CAEhD"}
@@ -0,0 +1,52 @@
1
+ import { AtomsAgentError } from "@atoms-agent/llm";
2
+ /** 创建空 Registry(任务 C103)。 */
3
+ export function createRegistry() {
4
+ return new RuntimeRegistryImpl();
5
+ }
6
+ class RuntimeRegistryImpl {
7
+ #models = new Map();
8
+ #tools = new Map();
9
+ #contexts = new Map();
10
+ model(ref, adapter) {
11
+ register(this.#models, ref, adapter, "Model");
12
+ return this;
13
+ }
14
+ tool(ref, definition) {
15
+ register(this.#tools, ref, definition, "Tool");
16
+ return this;
17
+ }
18
+ context(ref, strategy) {
19
+ register(this.#contexts, ref, strategy, "Context");
20
+ return this;
21
+ }
22
+ resolveModel(ref) {
23
+ return resolve(this.#models, ref, "Model");
24
+ }
25
+ resolveTool(ref) {
26
+ return resolve(this.#tools, ref, "Tool");
27
+ }
28
+ resolveContext(ref) {
29
+ return resolve(this.#contexts, ref, "Context");
30
+ }
31
+ }
32
+ function register(bindings, ref, value, kind) {
33
+ assertRef(ref, kind);
34
+ if (bindings.has(ref)) {
35
+ throw new AtomsAgentError("CONFIG_ERROR", `${kind} ref ${ref} is already registered.`);
36
+ }
37
+ bindings.set(ref, value);
38
+ }
39
+ function resolve(bindings, ref, kind) {
40
+ assertRef(ref, kind);
41
+ const value = bindings.get(ref);
42
+ if (value === undefined) {
43
+ throw new AtomsAgentError("CONFIG_ERROR", `${kind} ref ${ref} is not registered.`);
44
+ }
45
+ return value;
46
+ }
47
+ function assertRef(ref, kind) {
48
+ if (ref.trim().length === 0) {
49
+ throw new AtomsAgentError("CONFIG_ERROR", `${kind} ref must not be empty.`);
50
+ }
51
+ }
52
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAqBnD,6BAA6B;AAC7B,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,mBAAmB,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,mBAAmB;IACd,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC1C,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC3C,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;IAExD,KAAK,CAAC,GAAW,EAAE,OAAqB;QACtC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,UAA0B;QAC1C,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,QAAyB;QAC5C,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,CAAC,GAAW;QACtB,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,WAAW,CAAC,GAAW;QACrB,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,cAAc,CAAC,GAAW;QACxB,OAAO,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;CACF;AAED,SAAS,QAAQ,CAAI,QAAwB,EAAE,GAAW,EAAE,KAAQ,EAAE,IAAY;IAChF,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACrB,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,eAAe,CAAC,cAAc,EAAE,GAAG,IAAI,QAAQ,GAAG,yBAAyB,CAAC,CAAC;IACzF,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,OAAO,CAAI,QAAgC,EAAE,GAAW,EAAE,IAAY;IAC7E,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,eAAe,CAAC,cAAc,EAAE,GAAG,IAAI,QAAQ,GAAG,qBAAqB,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,IAAY;IAC1C,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,eAAe,CAAC,cAAc,EAAE,GAAG,IAAI,yBAAyB,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}