agent-framework-js 0.1.1

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 (156) hide show
  1. package/AGENT_USAGE.md +207 -0
  2. package/LICENSE +21 -0
  3. package/README.md +99 -0
  4. package/dist/agents/index.cjs +35 -0
  5. package/dist/agents/index.cjs.map +1 -0
  6. package/dist/agents/index.d.cts +8 -0
  7. package/dist/agents/index.d.ts +8 -0
  8. package/dist/agents/index.js +10 -0
  9. package/dist/agents/index.js.map +1 -0
  10. package/dist/chunk-5M6ER4ZX.cjs +4 -0
  11. package/dist/chunk-5M6ER4ZX.cjs.map +1 -0
  12. package/dist/chunk-5PDJOBTD.js +38 -0
  13. package/dist/chunk-5PDJOBTD.js.map +1 -0
  14. package/dist/chunk-7ZXUIHLH.js +18 -0
  15. package/dist/chunk-7ZXUIHLH.js.map +1 -0
  16. package/dist/chunk-ACBIHS5H.js +30 -0
  17. package/dist/chunk-ACBIHS5H.js.map +1 -0
  18. package/dist/chunk-DEABART4.js +54 -0
  19. package/dist/chunk-DEABART4.js.map +1 -0
  20. package/dist/chunk-FOTCUNP5.cjs +34 -0
  21. package/dist/chunk-FOTCUNP5.cjs.map +1 -0
  22. package/dist/chunk-FSDMBWQV.cjs +20 -0
  23. package/dist/chunk-FSDMBWQV.cjs.map +1 -0
  24. package/dist/chunk-GYDY3KX5.cjs +72 -0
  25. package/dist/chunk-GYDY3KX5.cjs.map +1 -0
  26. package/dist/chunk-HGEPXJDG.js +129 -0
  27. package/dist/chunk-HGEPXJDG.js.map +1 -0
  28. package/dist/chunk-IJASUMIQ.cjs +57 -0
  29. package/dist/chunk-IJASUMIQ.cjs.map +1 -0
  30. package/dist/chunk-IU3LS5FC.cjs +10 -0
  31. package/dist/chunk-IU3LS5FC.cjs.map +1 -0
  32. package/dist/chunk-IUKD54F7.js +8 -0
  33. package/dist/chunk-IUKD54F7.js.map +1 -0
  34. package/dist/chunk-IXV4UIF5.js +79 -0
  35. package/dist/chunk-IXV4UIF5.js.map +1 -0
  36. package/dist/chunk-KEI3EALJ.cjs +10 -0
  37. package/dist/chunk-KEI3EALJ.cjs.map +1 -0
  38. package/dist/chunk-LMN75W3W.cjs +87 -0
  39. package/dist/chunk-LMN75W3W.cjs.map +1 -0
  40. package/dist/chunk-MCLVWCOB.js +3 -0
  41. package/dist/chunk-MCLVWCOB.js.map +1 -0
  42. package/dist/chunk-MQ2XTH3S.cjs +87 -0
  43. package/dist/chunk-MQ2XTH3S.cjs.map +1 -0
  44. package/dist/chunk-QJ5XHA6S.cjs +95 -0
  45. package/dist/chunk-QJ5XHA6S.cjs.map +1 -0
  46. package/dist/chunk-RD5YUB2E.js +190 -0
  47. package/dist/chunk-RD5YUB2E.js.map +1 -0
  48. package/dist/chunk-RZ43WNHR.js +8 -0
  49. package/dist/chunk-RZ43WNHR.js.map +1 -0
  50. package/dist/chunk-RZP2ZUUX.cjs +252 -0
  51. package/dist/chunk-RZP2ZUUX.cjs.map +1 -0
  52. package/dist/chunk-T2GHJ5R4.js +241 -0
  53. package/dist/chunk-T2GHJ5R4.js.map +1 -0
  54. package/dist/chunk-TAMJ5HSR.cjs +137 -0
  55. package/dist/chunk-TAMJ5HSR.cjs.map +1 -0
  56. package/dist/chunk-TLACSVEZ.cjs +201 -0
  57. package/dist/chunk-TLACSVEZ.cjs.map +1 -0
  58. package/dist/chunk-UVWQWOLO.js +196 -0
  59. package/dist/chunk-UVWQWOLO.js.map +1 -0
  60. package/dist/chunk-V472N2PK.js +91 -0
  61. package/dist/chunk-V472N2PK.js.map +1 -0
  62. package/dist/chunk-V6O6SYAN.cjs +43 -0
  63. package/dist/chunk-V6O6SYAN.cjs.map +1 -0
  64. package/dist/chunk-VLSVL5N2.js +48 -0
  65. package/dist/chunk-VLSVL5N2.js.map +1 -0
  66. package/dist/chunk-WSMYH2IN.cjs +86 -0
  67. package/dist/chunk-WSMYH2IN.cjs.map +1 -0
  68. package/dist/chunk-XPXTXOYQ.js +81 -0
  69. package/dist/chunk-XPXTXOYQ.js.map +1 -0
  70. package/dist/chunk-YBFLWRO5.cjs +194 -0
  71. package/dist/chunk-YBFLWRO5.cjs.map +1 -0
  72. package/dist/chunk-YCBDEEAV.js +82 -0
  73. package/dist/chunk-YCBDEEAV.js.map +1 -0
  74. package/dist/chunk-YH5746OF.js +69 -0
  75. package/dist/chunk-YH5746OF.js.map +1 -0
  76. package/dist/chunk-YKZJRE32.cjs +50 -0
  77. package/dist/chunk-YKZJRE32.cjs.map +1 -0
  78. package/dist/declarative/index.cjs +19 -0
  79. package/dist/declarative/index.cjs.map +1 -0
  80. package/dist/declarative/index.d.cts +60 -0
  81. package/dist/declarative/index.d.ts +60 -0
  82. package/dist/declarative/index.js +10 -0
  83. package/dist/declarative/index.js.map +1 -0
  84. package/dist/errors-CjVz4W_5.d.cts +68 -0
  85. package/dist/errors-CjVz4W_5.d.ts +68 -0
  86. package/dist/index-C2vzfbBz.d.cts +57 -0
  87. package/dist/index-C2vzfbBz.d.ts +57 -0
  88. package/dist/index-D7-znzrc.d.ts +153 -0
  89. package/dist/index-DdYZeNIu.d.cts +153 -0
  90. package/dist/index.cjs +236 -0
  91. package/dist/index.cjs.map +1 -0
  92. package/dist/index.d.cts +51 -0
  93. package/dist/index.d.ts +51 -0
  94. package/dist/index.js +19 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/mcp/index.cjs +19 -0
  97. package/dist/mcp/index.cjs.map +1 -0
  98. package/dist/mcp/index.d.cts +72 -0
  99. package/dist/mcp/index.d.ts +72 -0
  100. package/dist/mcp/index.js +6 -0
  101. package/dist/mcp/index.js.map +1 -0
  102. package/dist/middleware/index.cjs +17 -0
  103. package/dist/middleware/index.cjs.map +1 -0
  104. package/dist/middleware/index.d.cts +29 -0
  105. package/dist/middleware/index.d.ts +29 -0
  106. package/dist/middleware/index.js +4 -0
  107. package/dist/middleware/index.js.map +1 -0
  108. package/dist/observability/index.cjs +29 -0
  109. package/dist/observability/index.cjs.map +1 -0
  110. package/dist/observability/index.d.cts +1 -0
  111. package/dist/observability/index.d.ts +1 -0
  112. package/dist/observability/index.js +4 -0
  113. package/dist/observability/index.js.map +1 -0
  114. package/dist/persistence/index.cjs +24 -0
  115. package/dist/persistence/index.cjs.map +1 -0
  116. package/dist/persistence/index.d.cts +51 -0
  117. package/dist/persistence/index.d.ts +51 -0
  118. package/dist/persistence/index.js +7 -0
  119. package/dist/persistence/index.js.map +1 -0
  120. package/dist/provider-CMAymr1b.d.cts +82 -0
  121. package/dist/provider-osAtfZ7x.d.ts +82 -0
  122. package/dist/providers/index.cjs +26 -0
  123. package/dist/providers/index.cjs.map +1 -0
  124. package/dist/providers/index.d.cts +107 -0
  125. package/dist/providers/index.d.ts +107 -0
  126. package/dist/providers/index.js +5 -0
  127. package/dist/providers/index.js.map +1 -0
  128. package/dist/registry-CpO0yH5v.d.ts +57 -0
  129. package/dist/registry-D4fThGiN.d.cts +57 -0
  130. package/dist/skill-DfNChtJN.d.cts +45 -0
  131. package/dist/skill-DfNChtJN.d.ts +45 -0
  132. package/dist/skills/index.cjs +20 -0
  133. package/dist/skills/index.cjs.map +1 -0
  134. package/dist/skills/index.d.cts +30 -0
  135. package/dist/skills/index.d.ts +30 -0
  136. package/dist/skills/index.js +3 -0
  137. package/dist/skills/index.js.map +1 -0
  138. package/dist/thread-CWVzTyti.d.ts +51 -0
  139. package/dist/thread-Dfo9LLf7.d.cts +51 -0
  140. package/dist/tool-BZg_znMZ.d.cts +50 -0
  141. package/dist/tool-CSCC87OD.d.ts +50 -0
  142. package/dist/tools/index.cjs +27 -0
  143. package/dist/tools/index.cjs.map +1 -0
  144. package/dist/tools/index.d.cts +21 -0
  145. package/dist/tools/index.d.ts +21 -0
  146. package/dist/tools/index.js +6 -0
  147. package/dist/tools/index.js.map +1 -0
  148. package/dist/types-Cn1g9Tg4.d.cts +63 -0
  149. package/dist/types-Cn1g9Tg4.d.ts +63 -0
  150. package/dist/workflows/index.cjs +50 -0
  151. package/dist/workflows/index.cjs.map +1 -0
  152. package/dist/workflows/index.d.cts +182 -0
  153. package/dist/workflows/index.d.ts +182 -0
  154. package/dist/workflows/index.js +5 -0
  155. package/dist/workflows/index.js.map +1 -0
  156. package/package.json +145 -0
@@ -0,0 +1,87 @@
1
+ 'use strict';
2
+
3
+ var chunkIJASUMIQ_cjs = require('./chunk-IJASUMIQ.cjs');
4
+
5
+ // src/core/errors.ts
6
+ var FrameworkError = class extends Error {
7
+ /** Optional structured details (already redaction-safe at serialization time). */
8
+ details;
9
+ constructor(message, details) {
10
+ super(message);
11
+ this.name = new.target.name;
12
+ this.details = details;
13
+ }
14
+ /** Redaction-safe JSON form used by logs/traces. */
15
+ toJSON() {
16
+ return chunkIJASUMIQ_cjs.redact({
17
+ name: this.name,
18
+ kind: this.kind,
19
+ message: this.message,
20
+ details: this.details
21
+ });
22
+ }
23
+ };
24
+ var ProviderError = class extends FrameworkError {
25
+ kind = "provider";
26
+ reason;
27
+ status;
28
+ constructor(message, reason, opts) {
29
+ super(message, opts?.details);
30
+ this.reason = reason;
31
+ this.status = opts?.status;
32
+ }
33
+ /** Whether this error should be retried with backoff. */
34
+ get retryable() {
35
+ return this.reason === "transient";
36
+ }
37
+ };
38
+ var ToolError = class extends FrameworkError {
39
+ kind = "tool";
40
+ reason;
41
+ toolName;
42
+ constructor(message, reason, toolName, details) {
43
+ super(message, details);
44
+ this.reason = reason;
45
+ this.toolName = toolName;
46
+ }
47
+ };
48
+ var MCPError = class extends FrameworkError {
49
+ kind = "mcp";
50
+ serverId;
51
+ constructor(message, serverId, details) {
52
+ super(message, details);
53
+ this.serverId = serverId;
54
+ }
55
+ };
56
+ var CheckpointError = class extends FrameworkError {
57
+ kind = "checkpoint";
58
+ reason;
59
+ constructor(message, reason, details) {
60
+ super(message, details);
61
+ this.reason = reason;
62
+ }
63
+ };
64
+ var RuntimeUnsupportedError = class extends FrameworkError {
65
+ kind = "runtime-unsupported";
66
+ feature;
67
+ constructor(feature, details) {
68
+ super(`Feature "${feature}" is not supported in the current runtime`, details);
69
+ this.feature = feature;
70
+ }
71
+ };
72
+ var ValidationError = class extends FrameworkError {
73
+ kind = "validation";
74
+ constructor(message, details) {
75
+ super(message, details);
76
+ }
77
+ };
78
+
79
+ exports.CheckpointError = CheckpointError;
80
+ exports.FrameworkError = FrameworkError;
81
+ exports.MCPError = MCPError;
82
+ exports.ProviderError = ProviderError;
83
+ exports.RuntimeUnsupportedError = RuntimeUnsupportedError;
84
+ exports.ToolError = ToolError;
85
+ exports.ValidationError = ValidationError;
86
+ //# sourceMappingURL=chunk-MQ2XTH3S.cjs.map
87
+ //# sourceMappingURL=chunk-MQ2XTH3S.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/errors.ts"],"names":["redact"],"mappings":";;;;;AAoBO,IAAe,cAAA,GAAf,cAAsC,KAAA,CAAM;AAAA;AAAA,EAGzC,OAAA;AAAA,EAET,WAAA,CAAY,SAAiB,OAAA,EAAmC;AAC/D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,OAAO,GAAA,CAAA,MAAA,CAAW,IAAA;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EAChB;AAAA;AAAA,EAGA,MAAA,GAAkC;AACjC,IAAA,OAAOA,wBAAA,CAAO;AAAA,MACb,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,SAAS,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACF;AACD;AAUO,IAAM,aAAA,GAAN,cAA4B,cAAA,CAAe;AAAA,EACxC,IAAA,GAAO,UAAA;AAAA,EACP,MAAA;AAAA,EACA,MAAA;AAAA,EAET,WAAA,CACC,OAAA,EACA,MAAA,EACA,IAAA,EACC;AACD,IAAA,KAAA,CAAM,OAAA,EAAS,MAAM,OAAO,CAAA;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAS,IAAA,EAAM,MAAA;AAAA,EACrB;AAAA;AAAA,EAGA,IAAI,SAAA,GAAqB;AACxB,IAAA,OAAO,KAAK,MAAA,KAAW,WAAA;AAAA,EACxB;AACD;AAUO,IAAM,SAAA,GAAN,cAAwB,cAAA,CAAe;AAAA,EACpC,IAAA,GAAO,MAAA;AAAA,EACP,MAAA;AAAA,EACA,QAAA;AAAA,EAET,WAAA,CACC,OAAA,EACA,MAAA,EACA,QAAA,EACA,OAAA,EACC;AACD,IAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AACtB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EACjB;AACD;AAGO,IAAM,QAAA,GAAN,cAAuB,cAAA,CAAe;AAAA,EACnC,IAAA,GAAO,KAAA;AAAA,EACP,QAAA;AAAA,EAET,WAAA,CAAY,OAAA,EAAiB,QAAA,EAAkB,OAAA,EAAmC;AACjF,IAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AACtB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EACjB;AACD;AAMO,IAAM,eAAA,GAAN,cAA8B,cAAA,CAAe;AAAA,EAC1C,IAAA,GAAO,YAAA;AAAA,EACP,MAAA;AAAA,EAET,WAAA,CAAY,OAAA,EAAiB,MAAA,EAA+B,OAAA,EAAmC;AAC9F,IAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AACtB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EACf;AACD;AAGO,IAAM,uBAAA,GAAN,cAAsC,cAAA,CAAe;AAAA,EAClD,IAAA,GAAO,qBAAA;AAAA,EACP,OAAA;AAAA,EAET,WAAA,CAAY,SAAiB,OAAA,EAAmC;AAC/D,IAAA,KAAA,CAAM,CAAA,SAAA,EAAY,OAAO,CAAA,yCAAA,CAAA,EAA6C,OAAO,CAAA;AAC7E,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EAChB;AACD;AAGO,IAAM,eAAA,GAAN,cAA8B,cAAA,CAAe;AAAA,EAC1C,IAAA,GAAO,YAAA;AAAA,EAEhB,WAAA,CAAY,SAAiB,OAAA,EAAmC;AAC/D,IAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AAAA,EACvB;AACD","file":"chunk-MQ2XTH3S.cjs","sourcesContent":["/**\n * Typed error hierarchy. Every failure surfaced by the framework is one of these\n * typed errors so callers (and agents) can branch on `kind` rather than parsing\n * messages. All error serialization passes through redaction (see `redaction.ts`).\n *\n * @packageDocumentation\n */\n\nimport { redact } from \"./redaction.js\";\n\n/** Discriminator for {@link FrameworkError} subclasses. */\nexport type ErrorKind =\n\t| \"provider\"\n\t| \"tool\"\n\t| \"mcp\"\n\t| \"checkpoint\"\n\t| \"runtime-unsupported\"\n\t| \"validation\";\n\n/** Base class for all framework errors. */\nexport abstract class FrameworkError extends Error {\n\tabstract readonly kind: ErrorKind;\n\t/** Optional structured details (already redaction-safe at serialization time). */\n\treadonly details?: Record<string, unknown>;\n\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(message);\n\t\tthis.name = new.target.name;\n\t\tthis.details = details;\n\t}\n\n\t/** Redaction-safe JSON form used by logs/traces. */\n\ttoJSON(): Record<string, unknown> {\n\t\treturn redact({\n\t\t\tname: this.name,\n\t\t\tkind: this.kind,\n\t\t\tmessage: this.message,\n\t\t\tdetails: this.details,\n\t\t});\n\t}\n}\n\n/** Reason a provider call failed. Transient reasons are retryable. */\nexport type ProviderErrorReason =\n\t| \"transient\" // 429/5xx/network/timeout — retryable\n\t| \"auth\" // 401/403 — fail fast\n\t| \"client\" // other 4xx — fail fast\n\t| \"malformed\"; // unparseable/incomplete response\n\n/** LLM provider failure. (FR-008a) */\nexport class ProviderError extends FrameworkError {\n\treadonly kind = \"provider\" as const;\n\treadonly reason: ProviderErrorReason;\n\treadonly status?: number;\n\n\tconstructor(\n\t\tmessage: string,\n\t\treason: ProviderErrorReason,\n\t\topts?: { status?: number; details?: Record<string, unknown> },\n\t) {\n\t\tsuper(message, opts?.details);\n\t\tthis.reason = reason;\n\t\tthis.status = opts?.status;\n\t}\n\n\t/** Whether this error should be retried with backoff. */\n\tget retryable(): boolean {\n\t\treturn this.reason === \"transient\";\n\t}\n}\n\n/** Reason a tool invocation failed. */\nexport type ToolErrorReason =\n\t| \"not-found\"\n\t| \"invalid-arguments\"\n\t| \"timeout\"\n\t| \"run-failure\";\n\n/** Tool invocation failure. (FR-011a, FR-012c) */\nexport class ToolError extends FrameworkError {\n\treadonly kind = \"tool\" as const;\n\treadonly reason: ToolErrorReason;\n\treadonly toolName: string;\n\n\tconstructor(\n\t\tmessage: string,\n\t\treason: ToolErrorReason,\n\t\ttoolName: string,\n\t\tdetails?: Record<string, unknown>,\n\t) {\n\t\tsuper(message, details);\n\t\tthis.reason = reason;\n\t\tthis.toolName = toolName;\n\t}\n}\n\n/** MCP server failure (e.g., unavailable). (FR-015) */\nexport class MCPError extends FrameworkError {\n\treadonly kind = \"mcp\" as const;\n\treadonly serverId: string;\n\n\tconstructor(message: string, serverId: string, details?: Record<string, unknown>) {\n\t\tsuper(message, details);\n\t\tthis.serverId = serverId;\n\t}\n}\n\n/** Reason a checkpoint could not be restored. (FR-022a) */\nexport type CheckpointErrorReason = \"corrupt\" | \"version-mismatch\";\n\n/** Checkpoint restore failure. Fails closed — no partial restore. */\nexport class CheckpointError extends FrameworkError {\n\treadonly kind = \"checkpoint\" as const;\n\treadonly reason: CheckpointErrorReason;\n\n\tconstructor(message: string, reason: CheckpointErrorReason, details?: Record<string, unknown>) {\n\t\tsuper(message, details);\n\t\tthis.reason = reason;\n\t}\n}\n\n/** A feature was requested that the current runtime cannot support. (FR-030a) */\nexport class RuntimeUnsupportedError extends FrameworkError {\n\treadonly kind = \"runtime-unsupported\" as const;\n\treadonly feature: string;\n\n\tconstructor(feature: string, details?: Record<string, unknown>) {\n\t\tsuper(`Feature \"${feature}\" is not supported in the current runtime`, details);\n\t\tthis.feature = feature;\n\t}\n}\n\n/** Schema validation failure. (FR-011) */\nexport class ValidationError extends FrameworkError {\n\treadonly kind = \"validation\" as const;\n\n\tconstructor(message: string, details?: Record<string, unknown>) {\n\t\tsuper(message, details);\n\t}\n}\n"]}
@@ -0,0 +1,95 @@
1
+ 'use strict';
2
+
3
+ var chunkLMN75W3W_cjs = require('./chunk-LMN75W3W.cjs');
4
+ var chunkFOTCUNP5_cjs = require('./chunk-FOTCUNP5.cjs');
5
+
6
+ // src/persistence/store.ts
7
+ var ThreadPersistence = {
8
+ /** Persist a thread under the key `thread:<id>`. */
9
+ async save(store, thread) {
10
+ await store.set(`thread:${thread.id}`, thread.toJSON());
11
+ },
12
+ /** Load and rehydrate a thread, or undefined if absent. */
13
+ async load(store, id) {
14
+ const data = await store.get(`thread:${id}`);
15
+ return data ? chunkLMN75W3W_cjs.Thread.fromJSON(data) : void 0;
16
+ }
17
+ };
18
+
19
+ // src/persistence/memory.ts
20
+ function createMemoryStore() {
21
+ const map = /* @__PURE__ */ new Map();
22
+ return {
23
+ async get(key) {
24
+ return map.get(key);
25
+ },
26
+ async set(key, value) {
27
+ map.set(key, value);
28
+ },
29
+ async delete(key) {
30
+ map.delete(key);
31
+ }
32
+ };
33
+ }
34
+
35
+ // src/persistence/browser.ts
36
+ function createBrowserStore(options = {}) {
37
+ const backend = options.backend ?? "local";
38
+ const ns = options.namespace ?? "afjs";
39
+ return backend === "indexeddb" ? indexedDbStore(ns) : localStorageStore(ns);
40
+ }
41
+ function localStorageStore(ns) {
42
+ chunkFOTCUNP5_cjs.requireCapability("hasLocalStorage", "localStorage store");
43
+ const ls = globalThis.localStorage;
44
+ const k = (key) => `${ns}:${key}`;
45
+ return {
46
+ async get(key) {
47
+ const raw = ls.getItem(k(key));
48
+ return raw == null ? void 0 : JSON.parse(raw);
49
+ },
50
+ async set(key, value) {
51
+ ls.setItem(k(key), JSON.stringify(value));
52
+ },
53
+ async delete(key) {
54
+ ls.removeItem(k(key));
55
+ }
56
+ };
57
+ }
58
+ function indexedDbStore(ns) {
59
+ chunkFOTCUNP5_cjs.requireCapability("hasIndexedDB", "IndexedDB store");
60
+ const idb = globalThis.indexedDB;
61
+ function open() {
62
+ return new Promise((resolve, reject) => {
63
+ const req = idb.open(ns, 1);
64
+ req.onupgradeneeded = () => req.result.createObjectStore("kv");
65
+ req.onsuccess = () => resolve(req.result);
66
+ req.onerror = () => reject(req.error);
67
+ });
68
+ }
69
+ async function tx(mode, fn) {
70
+ const db = await open();
71
+ return new Promise((resolve, reject) => {
72
+ const store = db.transaction("kv", mode).objectStore("kv");
73
+ const req = fn(store);
74
+ req.onsuccess = () => resolve(req.result);
75
+ req.onerror = () => reject(req.error);
76
+ });
77
+ }
78
+ return {
79
+ async get(key) {
80
+ return tx("readonly", (s) => s.get(key));
81
+ },
82
+ async set(key, value) {
83
+ await tx("readwrite", (s) => s.put(value, key));
84
+ },
85
+ async delete(key) {
86
+ await tx("readwrite", (s) => s.delete(key));
87
+ }
88
+ };
89
+ }
90
+
91
+ exports.ThreadPersistence = ThreadPersistence;
92
+ exports.createBrowserStore = createBrowserStore;
93
+ exports.createMemoryStore = createMemoryStore;
94
+ //# sourceMappingURL=chunk-QJ5XHA6S.cjs.map
95
+ //# sourceMappingURL=chunk-QJ5XHA6S.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/persistence/store.ts","../src/persistence/memory.ts","../src/persistence/browser.ts"],"names":["Thread","requireCapability"],"mappings":"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","file":"chunk-QJ5XHA6S.cjs","sourcesContent":["/**\n * Pluggable storage abstraction for persisting conversation/thread state in a\n * no-backend environment. No database server is assumed. (FR-024)\n *\n * @packageDocumentation\n */\n\nimport type { Thread } from \"../agents/thread.js\";\nimport { Thread as ThreadClass } from \"../agents/thread.js\";\n\n/** A minimal key/value store. */\nexport interface Store {\n\tget(key: string): Promise<unknown | undefined>;\n\tset(key: string, value: unknown): Promise<void>;\n\tdelete(key: string): Promise<void>;\n}\n\n/** Save and load threads via a {@link Store}. */\nexport const ThreadPersistence = {\n\t/** Persist a thread under the key `thread:<id>`. */\n\tasync save(store: Store, thread: Thread): Promise<void> {\n\t\tawait store.set(`thread:${thread.id}`, thread.toJSON());\n\t},\n\t/** Load and rehydrate a thread, or undefined if absent. */\n\tasync load(store: Store, id: string): Promise<Thread | undefined> {\n\t\tconst data = (await store.get(`thread:${id}`)) as\n\t\t\t| { id: string; messages: never[]; compacted?: boolean }\n\t\t\t| undefined;\n\t\treturn data ? ThreadClass.fromJSON(data) : undefined;\n\t},\n};\n","/**\n * In-memory store adapter. Works in every runtime; ideal as a default and for tests.\n * @packageDocumentation\n */\n\nimport type { Store } from \"./store.js\";\n\n/** Create an in-memory {@link Store}. */\nexport function createMemoryStore(): Store {\n\tconst map = new Map<string, unknown>();\n\treturn {\n\t\tasync get(key) {\n\t\t\treturn map.get(key);\n\t\t},\n\t\tasync set(key, value) {\n\t\t\tmap.set(key, value);\n\t\t},\n\t\tasync delete(key) {\n\t\t\tmap.delete(key);\n\t\t},\n\t};\n}\n","/**\n * Browser store adapters backed by `localStorage` or `IndexedDB`. Capability-gated\n * so a clear typed error is thrown if used where unavailable. (FR-024, FR-030a)\n *\n * @packageDocumentation\n */\n\nimport type { Store } from \"./store.js\";\nimport { requireCapability } from \"../core/runtime.js\";\n\n/** Options for {@link createBrowserStore}. */\nexport interface BrowserStoreOptions {\n\t/** Storage backend. Default \"local\". */\n\tbackend?: \"local\" | \"indexeddb\";\n\t/** Key namespace/prefix. Default \"afjs\". */\n\tnamespace?: string;\n}\n\n/** Create a browser-backed {@link Store}. */\nexport function createBrowserStore(options: BrowserStoreOptions = {}): Store {\n\tconst backend = options.backend ?? \"local\";\n\tconst ns = options.namespace ?? \"afjs\";\n\treturn backend === \"indexeddb\" ? indexedDbStore(ns) : localStorageStore(ns);\n}\n\nfunction localStorageStore(ns: string): Store {\n\trequireCapability(\"hasLocalStorage\", \"localStorage store\");\n\tconst ls = (globalThis as unknown as { localStorage: Storage }).localStorage;\n\tconst k = (key: string) => `${ns}:${key}`;\n\treturn {\n\t\tasync get(key) {\n\t\t\tconst raw = ls.getItem(k(key));\n\t\t\treturn raw == null ? undefined : JSON.parse(raw);\n\t\t},\n\t\tasync set(key, value) {\n\t\t\tls.setItem(k(key), JSON.stringify(value));\n\t\t},\n\t\tasync delete(key) {\n\t\t\tls.removeItem(k(key));\n\t\t},\n\t};\n}\n\nfunction indexedDbStore(ns: string): Store {\n\trequireCapability(\"hasIndexedDB\", \"IndexedDB store\");\n\tconst idb = (globalThis as unknown as { indexedDB: IDBFactory }).indexedDB;\n\n\tfunction open(): Promise<IDBDatabase> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst req = idb.open(ns, 1);\n\t\t\treq.onupgradeneeded = () => req.result.createObjectStore(\"kv\");\n\t\t\treq.onsuccess = () => resolve(req.result);\n\t\t\treq.onerror = () => reject(req.error);\n\t\t});\n\t}\n\n\tasync function tx<T>(mode: IDBTransactionMode, fn: (s: IDBObjectStore) => IDBRequest): Promise<T> {\n\t\tconst db = await open();\n\t\treturn new Promise<T>((resolve, reject) => {\n\t\t\tconst store = db.transaction(\"kv\", mode).objectStore(\"kv\");\n\t\t\tconst req = fn(store);\n\t\t\treq.onsuccess = () => resolve(req.result as T);\n\t\t\treq.onerror = () => reject(req.error);\n\t\t});\n\t}\n\n\treturn {\n\t\tasync get(key) {\n\t\t\treturn tx<unknown>(\"readonly\", (s) => s.get(key));\n\t\t},\n\t\tasync set(key, value) {\n\t\t\tawait tx(\"readwrite\", (s) => s.put(value, key));\n\t\t},\n\t\tasync delete(key) {\n\t\t\tawait tx(\"readwrite\", (s) => s.delete(key));\n\t\t},\n\t};\n}\n"]}
@@ -0,0 +1,190 @@
1
+ import { SkillIndex } from './chunk-YCBDEEAV.js';
2
+ import { ToolRegistry } from './chunk-HGEPXJDG.js';
3
+ import { composeMiddleware } from './chunk-7ZXUIHLH.js';
4
+ import { textMessage, Thread, hasImage } from './chunk-XPXTXOYQ.js';
5
+ import { ProviderError } from './chunk-IXV4UIF5.js';
6
+
7
+ // src/agents/loop.ts
8
+ async function runLoop(generate, registry, messages, options) {
9
+ const maxIterations = options?.maxIterations ?? 10;
10
+ const working = [...messages];
11
+ let iteration = 0;
12
+ for (; ; ) {
13
+ if (maxIterations !== -1 && iteration >= maxIterations) {
14
+ return {
15
+ messages: working,
16
+ final: { text: "" },
17
+ status: "limit-exceeded"
18
+ };
19
+ }
20
+ iteration++;
21
+ const specs = registry.specs();
22
+ const response = await generate({
23
+ messages: working,
24
+ tools: specs.length > 0 ? specs : void 0,
25
+ signal: options?.signal
26
+ });
27
+ if (!response.toolCalls || response.toolCalls.length === 0) {
28
+ return { messages: working, final: response, status: "completed" };
29
+ }
30
+ working.push({
31
+ role: "assistant",
32
+ parts: response.text ? [{ type: "text", text: response.text }] : []
33
+ });
34
+ for (const call of response.toolCalls) {
35
+ const result = await registry.invoke(call.name, call.arguments, options?.toolTimeoutMs);
36
+ const payload = result.error ? `ERROR (${result.error.reason}): ${result.error.message}` : JSON.stringify(result.value ?? null);
37
+ working.push({
38
+ role: "tool",
39
+ name: call.name,
40
+ toolCallId: call.id,
41
+ parts: [{ type: "text", text: payload }]
42
+ });
43
+ }
44
+ }
45
+ }
46
+ function buildMessages(instructions, input) {
47
+ return [textMessage("system", instructions), ...input];
48
+ }
49
+
50
+ // src/agents/agent.ts
51
+ function normalizeInput(input) {
52
+ if (typeof input === "string") return [textMessage("user", input)];
53
+ return Array.isArray(input) ? input : [input];
54
+ }
55
+ function promptText(messages) {
56
+ return messages.flatMap((m) => m.parts).filter((p) => p.type === "text").map((p) => p.text).join(" ");
57
+ }
58
+ function createAgent(config) {
59
+ const registry = new ToolRegistry(config.tools ?? []);
60
+ const skillIndex = new SkillIndex(config.skills ?? []);
61
+ const middleware = config.middleware ?? [];
62
+ function gateVision(messages) {
63
+ if (!config.provider.capabilities.supportsVision && messages.some(hasImage)) {
64
+ throw new ProviderError(
65
+ "Image input was provided but the configured model does not support vision",
66
+ "client"
67
+ );
68
+ }
69
+ }
70
+ async function injectSkills(userMessages) {
71
+ if ((config.skills ?? []).length === 0) return userMessages;
72
+ const selected = skillIndex.select(promptText(userMessages));
73
+ if (selected.length === 0) return userMessages;
74
+ const contents = await Promise.all(selected.map((s) => skillIndex.load(s)));
75
+ const skillBlock = textMessage(
76
+ "system",
77
+ `Relevant skill knowledge:
78
+ ${contents.join("\n\n")}`
79
+ );
80
+ return [skillBlock, ...userMessages];
81
+ }
82
+ async function callProvider(req) {
83
+ const ctx = {
84
+ agentName: config.name,
85
+ request: req
86
+ };
87
+ const pipeline = composeMiddleware(middleware, (c) => config.provider.generate(c.request));
88
+ return pipeline(ctx);
89
+ }
90
+ async function prepare(input, opts) {
91
+ const userMessages = normalizeInput(input);
92
+ gateVision(userMessages);
93
+ const thread = opts?.thread ?? new Thread(void 0, [textMessage("system", config.instructions)]);
94
+ const withSkills = await injectSkills(userMessages);
95
+ for (const m of withSkills) thread.add(m);
96
+ await thread.maybeCompact(config.provider, {
97
+ compactionThreshold: config.compactionThreshold,
98
+ compactionModel: config.compactionModel
99
+ });
100
+ return thread;
101
+ }
102
+ async function run(input, opts) {
103
+ let thread;
104
+ try {
105
+ thread = await prepare(input, opts);
106
+ } catch (e) {
107
+ if (e instanceof ProviderError) {
108
+ return { output: "", status: "failed", partial: false, error: e, thread: opts?.thread ?? new Thread() };
109
+ }
110
+ throw e;
111
+ }
112
+ try {
113
+ const loop = await runLoop(callProvider, registry, thread.messages, {
114
+ maxIterations: config.maxIterations,
115
+ toolTimeoutMs: config.toolTimeoutMs,
116
+ signal: opts?.signal
117
+ });
118
+ if (loop.final.text) {
119
+ thread.add({ role: "assistant", parts: [{ type: "text", text: loop.final.text }] });
120
+ }
121
+ return {
122
+ output: loop.final.text,
123
+ reasoning: config.provider.capabilities.supportsReasoning ? loop.final.reasoning : void 0,
124
+ status: loop.status,
125
+ partial: loop.status === "incomplete",
126
+ thread
127
+ };
128
+ } catch (e) {
129
+ if (e instanceof ProviderError) {
130
+ return { output: "", status: "failed", partial: false, error: e, thread };
131
+ }
132
+ throw e;
133
+ }
134
+ }
135
+ async function* runStream(input, opts) {
136
+ let thread;
137
+ try {
138
+ thread = await prepare(input, opts);
139
+ } catch (e) {
140
+ if (e instanceof ProviderError) {
141
+ yield { type: "done", result: { output: "", status: "failed", partial: false, error: e, thread: opts?.thread ?? new Thread() } };
142
+ return;
143
+ }
144
+ throw e;
145
+ }
146
+ let text = "";
147
+ let reasoning = "";
148
+ try {
149
+ for await (const chunk of config.provider.generateStream({
150
+ messages: thread.messages,
151
+ tools: registry.specs(),
152
+ signal: opts?.signal
153
+ })) {
154
+ if (chunk.type === "text") {
155
+ text += chunk.text;
156
+ yield { type: "text", text: chunk.text };
157
+ } else if (chunk.type === "reasoning" && config.provider.capabilities.supportsReasoning) {
158
+ reasoning += chunk.text;
159
+ yield { type: "reasoning", text: chunk.text };
160
+ } else if (chunk.type === "done") {
161
+ text = chunk.response.text || text;
162
+ reasoning = chunk.response.reasoning || reasoning;
163
+ }
164
+ }
165
+ } catch (e) {
166
+ const error = e instanceof ProviderError ? e : new ProviderError(e.message, "transient");
167
+ yield {
168
+ type: "done",
169
+ result: { output: text, status: "incomplete", partial: true, error, thread }
170
+ };
171
+ return;
172
+ }
173
+ if (text) thread.add({ role: "assistant", parts: [{ type: "text", text }] });
174
+ yield {
175
+ type: "done",
176
+ result: {
177
+ output: text,
178
+ reasoning: config.provider.capabilities.supportsReasoning ? reasoning || void 0 : void 0,
179
+ status: "completed",
180
+ partial: false,
181
+ thread
182
+ }
183
+ };
184
+ }
185
+ return { name: config.name, run, runStream };
186
+ }
187
+
188
+ export { buildMessages, createAgent, runLoop };
189
+ //# sourceMappingURL=chunk-RD5YUB2E.js.map
190
+ //# sourceMappingURL=chunk-RD5YUB2E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agents/loop.ts","../src/agents/agent.ts"],"names":[],"mappings":"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","file":"chunk-RD5YUB2E.js","sourcesContent":["/**\n * The agent run loop: drives provider calls, executes requested tool calls,\n * feeds typed results (including errors, for self-correction) back to the model,\n * and stops on a final answer, the iteration cap, or an abort. (FR-011a, FR-012b)\n *\n * @packageDocumentation\n */\n\nimport type { Message } from \"../core/types.js\";\nimport { textMessage } from \"../core/types.js\";\nimport type { GenerateRequest, GenerateResponse } from \"../providers/provider.js\";\nimport type { ToolRegistry } from \"../tools/registry.js\";\n\n/** Outcome status of a run. */\nexport type RunStatus = \"completed\" | \"failed\" | \"incomplete\" | \"limit-exceeded\";\n\n/** A function that produces a model response (optionally through middleware). */\nexport type GenerateFn = (req: GenerateRequest) => Promise<GenerateResponse>;\n\n/** Settings controlling the loop. */\nexport interface LoopOptions {\n\t/** Maximum iterations; -1 means unlimited. Default 10. (FR-012b) */\n\tmaxIterations?: number;\n\t/** Per-tool-call timeout in ms. (FR-012c) */\n\ttoolTimeoutMs?: number;\n\t/** Abort signal. */\n\tsignal?: AbortSignal;\n}\n\n/** Result of running the loop. */\nexport interface LoopResult {\n\tmessages: Message[];\n\tfinal: GenerateResponse;\n\tstatus: RunStatus;\n}\n\n/**\n * Execute the tool-call loop against a generate function and tool registry.\n *\n * @param generate - Produces a model response (typically the middleware pipeline).\n * @param registry - Tools available to the agent (may be empty).\n * @param messages - Initial conversation (system + user, etc.).\n * @param options - Loop tuning.\n */\nexport async function runLoop(\n\tgenerate: GenerateFn,\n\tregistry: ToolRegistry,\n\tmessages: Message[],\n\toptions?: LoopOptions,\n): Promise<LoopResult> {\n\tconst maxIterations = options?.maxIterations ?? 10;\n\tconst working = [...messages];\n\tlet iteration = 0;\n\n\tfor (; ;) {\n\t\tif (maxIterations !== -1 && iteration >= maxIterations) {\n\t\t\treturn {\n\t\t\t\tmessages: working,\n\t\t\t\tfinal: { text: \"\" },\n\t\t\t\tstatus: \"limit-exceeded\",\n\t\t\t};\n\t\t}\n\t\titeration++;\n\n\t\tconst specs = registry.specs();\n\t\tconst response = await generate({\n\t\t\tmessages: working,\n\t\t\ttools: specs.length > 0 ? specs : undefined,\n\t\t\tsignal: options?.signal,\n\t\t});\n\n\t\tif (!response.toolCalls || response.toolCalls.length === 0) {\n\t\t\treturn { messages: working, final: response, status: \"completed\" };\n\t\t}\n\n\t\t// Record the assistant's tool-call turn.\n\t\tworking.push({\n\t\t\trole: \"assistant\",\n\t\t\tparts: response.text ? [{ type: \"text\", text: response.text }] : [],\n\t\t});\n\n\t\t// Execute each requested tool and feed results (or typed errors) back.\n\t\tfor (const call of response.toolCalls) {\n\t\t\tconst result = await registry.invoke(call.name, call.arguments, options?.toolTimeoutMs);\n\t\t\tconst payload = result.error\n\t\t\t\t? `ERROR (${result.error.reason}): ${result.error.message}`\n\t\t\t\t: JSON.stringify(result.value ?? null);\n\t\t\tworking.push({\n\t\t\t\trole: \"tool\",\n\t\t\t\tname: call.name,\n\t\t\t\ttoolCallId: call.id,\n\t\t\t\tparts: [{ type: \"text\", text: payload }],\n\t\t\t});\n\t\t}\n\t}\n}\n\n/** Build the initial message list from instructions + input. */\nexport function buildMessages(instructions: string, input: Message[]): Message[] {\n\treturn [textMessage(\"system\", instructions), ...input];\n}\n","/**\n * The agent: a configured actor that runs against a provider, optionally using\n * tools and skills, with streaming, reasoning output, multimodal input gating,\n * conversation threads with compaction, and a middleware pipeline.\n *\n * @packageDocumentation\n */\n\nimport type { Message, ContentPart } from \"../core/types.js\";\nimport { hasImage, textMessage } from \"../core/types.js\";\nimport { ProviderError } from \"../core/errors.js\";\nimport type { Provider, GenerateResponse, GenerateRequest } from \"../providers/provider.js\";\nimport { ToolRegistry } from \"../tools/registry.js\";\nimport type { Tool } from \"../tools/tool.js\";\nimport type { Skill } from \"../skills/skill.js\";\nimport { SkillIndex } from \"../skills/index.js\";\nimport type { Middleware, MiddlewareContext } from \"../middleware/middleware.js\";\nimport { composeMiddleware } from \"../middleware/middleware.js\";\nimport { Thread, type ThreadOptions } from \"./thread.js\";\nimport { runLoop, type RunStatus } from \"./loop.js\";\n\n/** Configuration for {@link createAgent}. */\nexport interface AgentConfig {\n\tname: string;\n\tinstructions: string;\n\tprovider: Provider;\n\ttools?: Tool[];\n\tskills?: Skill[];\n\t/** Max tool-call iterations per run; -1 = unlimited. Default 10. (FR-012b) */\n\tmaxIterations?: number;\n\t/** Per-tool-call timeout in ms. (FR-012c) */\n\ttoolTimeoutMs?: number;\n\t/** Compaction threshold as a fraction of maxInputTokens. Default 0.9. (FR-004a) */\n\tcompactionThreshold?: number;\n\t/** Optional override model for compaction summaries. (FR-004b) */\n\tcompactionModel?: Provider;\n\t/** Middleware applied around provider calls. (FR-023) */\n\tmiddleware?: Middleware[];\n}\n\n/** Options for a single run. */\nexport interface RunOptions {\n\t/** Continue an existing conversation. (FR-004) */\n\tthread?: Thread;\n\t/** Abort signal. */\n\tsignal?: AbortSignal;\n}\n\n/** The result of a non-streaming run. */\nexport interface RunResult {\n\toutput: string;\n\t/** Reasoning content — only for reasoning-capable models. (FR-003a) */\n\treasoning?: string;\n\tstatus: RunStatus;\n\t/** True when the run was interrupted before completing. (FR-003b) */\n\tpartial: boolean;\n\terror?: ProviderError;\n\t/** The thread used/updated by this run. */\n\tthread: Thread;\n}\n\n/** Streamed run chunk. */\nexport type RunChunk =\n\t| { type: \"text\"; text: string }\n\t| { type: \"reasoning\"; text: string }\n\t| { type: \"done\"; result: RunResult };\n\n/** Agent input: plain text or structured (multimodal) messages. (FR-002) */\nexport type AgentInput = string | Message | Message[];\n\n/** A runnable agent. */\nexport interface Agent {\n\treadonly name: string;\n\trun(input: AgentInput, opts?: RunOptions): Promise<RunResult>;\n\trunStream(input: AgentInput, opts?: RunOptions): AsyncIterable<RunChunk>;\n}\n\nfunction normalizeInput(input: AgentInput): Message[] {\n\tif (typeof input === \"string\") return [textMessage(\"user\", input)];\n\treturn Array.isArray(input) ? input : [input];\n}\n\nfunction promptText(messages: Message[]): string {\n\treturn messages\n\t\t.flatMap((m) => m.parts)\n\t\t.filter((p): p is { type: \"text\"; text: string } => p.type === \"text\")\n\t\t.map((p) => p.text)\n\t\t.join(\" \");\n}\n\n/**\n * Create an agent.\n *\n * @example\n * ```ts\n * const agent = createAgent({ name: \"Helper\", instructions: \"Be concise.\", provider });\n * const res = await agent.run(\"Say hello.\");\n * console.log(res.status, res.output);\n * ```\n */\nexport function createAgent(config: AgentConfig): Agent {\n\tconst registry = new ToolRegistry(config.tools ?? []);\n\tconst skillIndex = new SkillIndex(config.skills ?? []);\n\tconst middleware = config.middleware ?? [];\n\n\tfunction gateVision(messages: Message[]): void {\n\t\tif (!config.provider.capabilities.supportsVision && messages.some(hasImage)) {\n\t\t\tthrow new ProviderError(\n\t\t\t\t\"Image input was provided but the configured model does not support vision\",\n\t\t\t\t\"client\",\n\t\t\t);\n\t\t}\n\t}\n\n\tasync function injectSkills(userMessages: Message[]): Promise<Message[]> {\n\t\tif ((config.skills ?? []).length === 0) return userMessages;\n\t\tconst selected = skillIndex.select(promptText(userMessages));\n\t\tif (selected.length === 0) return userMessages;\n\t\tconst contents = await Promise.all(selected.map((s) => skillIndex.load(s)));\n\t\tconst skillBlock = textMessage(\n\t\t\t\"system\",\n\t\t\t`Relevant skill knowledge:\\n${contents.join(\"\\n\\n\")}`,\n\t\t);\n\t\treturn [skillBlock, ...userMessages];\n\t}\n\n\tasync function callProvider(req: GenerateRequest): Promise<GenerateResponse> {\n\t\tconst ctx: MiddlewareContext = {\n\t\t\tagentName: config.name,\n\t\t\trequest: req,\n\t\t};\n\t\tconst pipeline = composeMiddleware(middleware, (c) => config.provider.generate(c.request));\n\t\treturn pipeline(ctx);\n\t}\n\n\tasync function prepare(input: AgentInput, opts?: RunOptions): Promise<Thread> {\n\t\tconst userMessages = normalizeInput(input);\n\t\tgateVision(userMessages);\n\t\tconst thread =\n\t\t\topts?.thread ??\n\t\t\tnew Thread(undefined, [textMessage(\"system\", config.instructions)]);\n\t\tconst withSkills = await injectSkills(userMessages);\n\t\tfor (const m of withSkills) thread.add(m);\n\t\tawait thread.maybeCompact(config.provider, {\n\t\t\tcompactionThreshold: config.compactionThreshold,\n\t\t\tcompactionModel: config.compactionModel,\n\t\t} satisfies ThreadOptions);\n\t\treturn thread;\n\t}\n\n\tasync function run(input: AgentInput, opts?: RunOptions): Promise<RunResult> {\n\t\tlet thread: Thread;\n\t\ttry {\n\t\t\tthread = await prepare(input, opts);\n\t\t} catch (e) {\n\t\t\tif (e instanceof ProviderError) {\n\t\t\t\treturn { output: \"\", status: \"failed\", partial: false, error: e, thread: opts?.thread ?? new Thread() };\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\n\t\ttry {\n\t\t\tconst loop = await runLoop(callProvider, registry, thread.messages, {\n\t\t\t\tmaxIterations: config.maxIterations,\n\t\t\t\ttoolTimeoutMs: config.toolTimeoutMs,\n\t\t\t\tsignal: opts?.signal,\n\t\t\t});\n\t\t\tif (loop.final.text) {\n\t\t\t\tthread.add({ role: \"assistant\", parts: [{ type: \"text\", text: loop.final.text }] });\n\t\t\t}\n\t\t\treturn {\n\t\t\t\toutput: loop.final.text,\n\t\t\t\treasoning: config.provider.capabilities.supportsReasoning ? loop.final.reasoning : undefined,\n\t\t\t\tstatus: loop.status,\n\t\t\t\tpartial: loop.status === \"incomplete\",\n\t\t\t\tthread,\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tif (e instanceof ProviderError) {\n\t\t\t\treturn { output: \"\", status: \"failed\", partial: false, error: e, thread };\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\tasync function* runStream(input: AgentInput, opts?: RunOptions): AsyncIterable<RunChunk> {\n\t\t// Streaming path: single provider streaming call (tool loops use non-streaming\n\t\t// internally). Suitable for the common single-turn streaming case.\n\t\tlet thread: Thread;\n\t\ttry {\n\t\t\tthread = await prepare(input, opts);\n\t\t} catch (e) {\n\t\t\tif (e instanceof ProviderError) {\n\t\t\t\tyield { type: \"done\", result: { output: \"\", status: \"failed\", partial: false, error: e, thread: opts?.thread ?? new Thread() } };\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\n\t\tlet text = \"\";\n\t\tlet reasoning = \"\";\n\t\ttry {\n\t\t\tfor await (const chunk of config.provider.generateStream({\n\t\t\t\tmessages: thread.messages,\n\t\t\t\ttools: registry.specs(),\n\t\t\t\tsignal: opts?.signal,\n\t\t\t})) {\n\t\t\t\tif (chunk.type === \"text\") {\n\t\t\t\t\ttext += chunk.text;\n\t\t\t\t\tyield { type: \"text\", text: chunk.text };\n\t\t\t\t} else if (chunk.type === \"reasoning\" && config.provider.capabilities.supportsReasoning) {\n\t\t\t\t\treasoning += chunk.text;\n\t\t\t\t\tyield { type: \"reasoning\", text: chunk.text };\n\t\t\t\t} else if (chunk.type === \"done\") {\n\t\t\t\t\ttext = chunk.response.text || text;\n\t\t\t\t\treasoning = chunk.response.reasoning || reasoning;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconst error = e instanceof ProviderError ? e : new ProviderError((e as Error).message, \"transient\");\n\t\t\tyield {\n\t\t\t\ttype: \"done\",\n\t\t\t\tresult: { output: text, status: \"incomplete\", partial: true, error, thread },\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\n\t\tif (text) thread.add({ role: \"assistant\", parts: [{ type: \"text\", text }] });\n\t\tyield {\n\t\t\ttype: \"done\",\n\t\t\tresult: {\n\t\t\t\toutput: text,\n\t\t\t\treasoning: config.provider.capabilities.supportsReasoning ? reasoning || undefined : undefined,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\tpartial: false,\n\t\t\t\tthread,\n\t\t\t},\n\t\t};\n\t}\n\n\treturn { name: config.name, run, runStream };\n}\n\nexport type { ContentPart };\n"]}
@@ -0,0 +1,8 @@
1
+ // src/tools/tool.ts
2
+ function defineTool(tool) {
3
+ return { source: "local", enabled: true, ...tool };
4
+ }
5
+
6
+ export { defineTool };
7
+ //# sourceMappingURL=chunk-RZ43WNHR.js.map
8
+ //# sourceMappingURL=chunk-RZ43WNHR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/tool.ts"],"names":[],"mappings":";AA0CO,SAAS,WAAiB,IAAA,EAMlB;AACd,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,GAAG,IAAA,EAAK;AAClD","file":"chunk-RZ43WNHR.js","sourcesContent":["/**\n * The uniform tool contract. Every capability exposed to an agent — whether a\n * local function or an MCP-provided tool — implements this single interface, with\n * a JSON Schema (MCP-popularized) describing its inputs/outputs. The framework\n * ships no built-in tools. (FR-009, FR-012d, Constitution V)\n *\n * @packageDocumentation\n */\n\nimport type { JSONSchema } from \"../core/types.js\";\n\n/** A callable capability available to an agent. */\nexport interface Tool<I = unknown, O = unknown> {\n\t/** Unique name. When provided by an MCP server it is namespaced as `server.tool`. */\n\tname: string;\n\t/** Natural-language description used by the model to decide when to call it. */\n\tdescription: string;\n\t/** JSON Schema for the arguments; validated before invocation. */\n\tinputSchema: JSONSchema;\n\t/** Optional JSON Schema describing the result. */\n\toutputSchema?: JSONSchema;\n\t/** Origin: `\"local\"` for code tools, or an MCP server id. */\n\tsource?: \"local\" | string;\n\t/** Whether the tool is currently presented to the agent. Defaults to true. */\n\tenabled?: boolean;\n\t/** Execute the tool with validated arguments. */\n\trun(args: I): Promise<O>;\n}\n\n/**\n * Define a local function tool with full type inference.\n *\n * @example\n * ```ts\n * const add = defineTool({\n * name: \"add\",\n * description: \"Add two numbers.\",\n * inputSchema: { type: \"object\", properties: { a: { type: \"number\" }, b: { type: \"number\" } }, required: [\"a\", \"b\"] },\n * run: async ({ a, b }: { a: number; b: number }) => ({ sum: a + b }),\n * });\n * ```\n */\nexport function defineTool<I, O>(tool: {\n\tname: string;\n\tdescription: string;\n\tinputSchema: JSONSchema;\n\toutputSchema?: JSONSchema;\n\trun: (args: I) => Promise<O>;\n}): Tool<I, O> {\n\treturn { source: \"local\", enabled: true, ...tool };\n}\n"]}