@ouispec/agent-worker 0.1.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 (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +175 -0
  3. package/dist/approvals/client.d.ts +29 -0
  4. package/dist/approvals/client.d.ts.map +1 -0
  5. package/dist/approvals/client.js +50 -0
  6. package/dist/approvals/client.js.map +1 -0
  7. package/dist/approvals/continuation.d.ts +28 -0
  8. package/dist/approvals/continuation.d.ts.map +1 -0
  9. package/dist/approvals/continuation.js +43 -0
  10. package/dist/approvals/continuation.js.map +1 -0
  11. package/dist/approvals/preview.d.ts +15 -0
  12. package/dist/approvals/preview.d.ts.map +1 -0
  13. package/dist/approvals/preview.js +33 -0
  14. package/dist/approvals/preview.js.map +1 -0
  15. package/dist/approvals/requirement.d.ts +15 -0
  16. package/dist/approvals/requirement.d.ts.map +1 -0
  17. package/dist/approvals/requirement.js +26 -0
  18. package/dist/approvals/requirement.js.map +1 -0
  19. package/dist/authz/tool-policy.d.ts +63 -0
  20. package/dist/authz/tool-policy.d.ts.map +1 -0
  21. package/dist/authz/tool-policy.js +23 -0
  22. package/dist/authz/tool-policy.js.map +1 -0
  23. package/dist/container/server.d.ts +24 -0
  24. package/dist/container/server.d.ts.map +1 -0
  25. package/dist/container/server.js +119 -0
  26. package/dist/container/server.js.map +1 -0
  27. package/dist/emit/http-adapter.d.ts +15 -0
  28. package/dist/emit/http-adapter.d.ts.map +1 -0
  29. package/dist/emit/http-adapter.js +35 -0
  30. package/dist/emit/http-adapter.js.map +1 -0
  31. package/dist/emit/types.d.ts +9 -0
  32. package/dist/emit/types.d.ts.map +1 -0
  33. package/dist/emit/types.js +7 -0
  34. package/dist/emit/types.js.map +1 -0
  35. package/dist/events/http-waiter.d.ts +19 -0
  36. package/dist/events/http-waiter.d.ts.map +1 -0
  37. package/dist/events/http-waiter.js +20 -0
  38. package/dist/events/http-waiter.js.map +1 -0
  39. package/dist/index.d.ts +60 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +45 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/lambda/handler.d.ts +38 -0
  44. package/dist/lambda/handler.d.ts.map +1 -0
  45. package/dist/lambda/handler.js +26 -0
  46. package/dist/lambda/handler.js.map +1 -0
  47. package/dist/model.d.ts +33 -0
  48. package/dist/model.d.ts.map +1 -0
  49. package/dist/model.js +15 -0
  50. package/dist/model.js.map +1 -0
  51. package/dist/openapi/document.d.ts +87 -0
  52. package/dist/openapi/document.d.ts.map +1 -0
  53. package/dist/openapi/document.js +117 -0
  54. package/dist/openapi/document.js.map +1 -0
  55. package/dist/openapi/executor.d.ts +51 -0
  56. package/dist/openapi/executor.d.ts.map +1 -0
  57. package/dist/openapi/executor.js +140 -0
  58. package/dist/openapi/executor.js.map +1 -0
  59. package/dist/openapi/index.d.ts +14 -0
  60. package/dist/openapi/index.d.ts.map +1 -0
  61. package/dist/openapi/index.js +9 -0
  62. package/dist/openapi/index.js.map +1 -0
  63. package/dist/openapi/loader.d.ts +81 -0
  64. package/dist/openapi/loader.d.ts.map +1 -0
  65. package/dist/openapi/loader.js +361 -0
  66. package/dist/openapi/loader.js.map +1 -0
  67. package/dist/openapi/x-agent.d.ts +34 -0
  68. package/dist/openapi/x-agent.d.ts.map +1 -0
  69. package/dist/openapi/x-agent.js +102 -0
  70. package/dist/openapi/x-agent.js.map +1 -0
  71. package/dist/orchestrator.d.ts +12 -0
  72. package/dist/orchestrator.d.ts.map +1 -0
  73. package/dist/orchestrator.js +1019 -0
  74. package/dist/orchestrator.js.map +1 -0
  75. package/dist/prompt/builder.d.ts +29 -0
  76. package/dist/prompt/builder.d.ts.map +1 -0
  77. package/dist/prompt/builder.js +129 -0
  78. package/dist/prompt/builder.js.map +1 -0
  79. package/dist/prompt/index.d.ts +15 -0
  80. package/dist/prompt/index.d.ts.map +1 -0
  81. package/dist/prompt/index.js +13 -0
  82. package/dist/prompt/index.js.map +1 -0
  83. package/dist/prompt/rules/base.d.ts +6 -0
  84. package/dist/prompt/rules/base.d.ts.map +1 -0
  85. package/dist/prompt/rules/base.js +38 -0
  86. package/dist/prompt/rules/base.js.map +1 -0
  87. package/dist/prompt/rules/communication.d.ts +7 -0
  88. package/dist/prompt/rules/communication.d.ts.map +1 -0
  89. package/dist/prompt/rules/communication.js +53 -0
  90. package/dist/prompt/rules/communication.js.map +1 -0
  91. package/dist/prompt/rules/tool-strategy.d.ts +6 -0
  92. package/dist/prompt/rules/tool-strategy.d.ts.map +1 -0
  93. package/dist/prompt/rules/tool-strategy.js +42 -0
  94. package/dist/prompt/rules/tool-strategy.js.map +1 -0
  95. package/dist/prompt/rules/ui-control.d.ts +10 -0
  96. package/dist/prompt/rules/ui-control.d.ts.map +1 -0
  97. package/dist/prompt/rules/ui-control.js +44 -0
  98. package/dist/prompt/rules/ui-control.js.map +1 -0
  99. package/dist/prompt/types.d.ts +85 -0
  100. package/dist/prompt/types.d.ts.map +1 -0
  101. package/dist/prompt/types.js +10 -0
  102. package/dist/prompt/types.js.map +1 -0
  103. package/dist/realtime/long-poll.d.ts +21 -0
  104. package/dist/realtime/long-poll.d.ts.map +1 -0
  105. package/dist/realtime/long-poll.js +36 -0
  106. package/dist/realtime/long-poll.js.map +1 -0
  107. package/dist/runtime/config.d.ts +4 -0
  108. package/dist/runtime/config.d.ts.map +1 -0
  109. package/dist/runtime/config.js +29 -0
  110. package/dist/runtime/config.js.map +1 -0
  111. package/dist/runtime/turn-runner.d.ts +32 -0
  112. package/dist/runtime/turn-runner.d.ts.map +1 -0
  113. package/dist/runtime/turn-runner.js +216 -0
  114. package/dist/runtime/turn-runner.js.map +1 -0
  115. package/dist/runtime/types.d.ts +244 -0
  116. package/dist/runtime/types.d.ts.map +1 -0
  117. package/dist/runtime/types.js +2 -0
  118. package/dist/runtime/types.js.map +1 -0
  119. package/dist/testing/desk-events.d.ts +12 -0
  120. package/dist/testing/desk-events.d.ts.map +1 -0
  121. package/dist/testing/desk-events.js +62 -0
  122. package/dist/testing/desk-events.js.map +1 -0
  123. package/dist/testing/index.d.ts +8 -0
  124. package/dist/testing/index.d.ts.map +1 -0
  125. package/dist/testing/index.js +7 -0
  126. package/dist/testing/index.js.map +1 -0
  127. package/dist/testing/openapi-fixture.d.ts +47 -0
  128. package/dist/testing/openapi-fixture.d.ts.map +1 -0
  129. package/dist/testing/openapi-fixture.js +370 -0
  130. package/dist/testing/openapi-fixture.js.map +1 -0
  131. package/dist/tools/async-binding.d.ts +71 -0
  132. package/dist/tools/async-binding.d.ts.map +1 -0
  133. package/dist/tools/async-binding.js +104 -0
  134. package/dist/tools/async-binding.js.map +1 -0
  135. package/dist/tools/builtin-tools.d.ts +20 -0
  136. package/dist/tools/builtin-tools.d.ts.map +1 -0
  137. package/dist/tools/builtin-tools.js +108 -0
  138. package/dist/tools/builtin-tools.js.map +1 -0
  139. package/dist/tools/entity-tools.d.ts +6 -0
  140. package/dist/tools/entity-tools.d.ts.map +1 -0
  141. package/dist/tools/entity-tools.js +227 -0
  142. package/dist/tools/entity-tools.js.map +1 -0
  143. package/dist/tools/input-validation.d.ts +16 -0
  144. package/dist/tools/input-validation.d.ts.map +1 -0
  145. package/dist/tools/input-validation.js +75 -0
  146. package/dist/tools/input-validation.js.map +1 -0
  147. package/dist/tools/load-all-tools.d.ts +12 -0
  148. package/dist/tools/load-all-tools.d.ts.map +1 -0
  149. package/dist/tools/load-all-tools.js +42 -0
  150. package/dist/tools/load-all-tools.js.map +1 -0
  151. package/dist/tools/schema-loader.d.ts +24 -0
  152. package/dist/tools/schema-loader.d.ts.map +1 -0
  153. package/dist/tools/schema-loader.js +267 -0
  154. package/dist/tools/schema-loader.js.map +1 -0
  155. package/dist/tools/types.d.ts +85 -0
  156. package/dist/tools/types.d.ts.map +1 -0
  157. package/dist/tools/types.js +22 -0
  158. package/dist/tools/types.js.map +1 -0
  159. package/dist/turn-policy.d.ts +68 -0
  160. package/dist/turn-policy.d.ts.map +1 -0
  161. package/dist/turn-policy.js +21 -0
  162. package/dist/turn-policy.js.map +1 -0
  163. package/dist/types.d.ts +151 -0
  164. package/dist/types.d.ts.map +1 -0
  165. package/dist/types.js +2 -0
  166. package/dist/types.js.map +1 -0
  167. package/dist/ui/channel.d.ts +64 -0
  168. package/dist/ui/channel.d.ts.map +1 -0
  169. package/dist/ui/channel.js +81 -0
  170. package/dist/ui/channel.js.map +1 -0
  171. package/dist/ui/knowledge.d.ts +30 -0
  172. package/dist/ui/knowledge.d.ts.map +1 -0
  173. package/dist/ui/knowledge.js +66 -0
  174. package/dist/ui/knowledge.js.map +1 -0
  175. package/dist/ui/observations.d.ts +41 -0
  176. package/dist/ui/observations.d.ts.map +1 -0
  177. package/dist/ui/observations.js +236 -0
  178. package/dist/ui/observations.js.map +1 -0
  179. package/dist/ui/snapshot.d.ts +33 -0
  180. package/dist/ui/snapshot.d.ts.map +1 -0
  181. package/dist/ui/snapshot.js +75 -0
  182. package/dist/ui/snapshot.js.map +1 -0
  183. package/dist/ui/ui-sequence.d.ts +75 -0
  184. package/dist/ui/ui-sequence.d.ts.map +1 -0
  185. package/dist/ui/ui-sequence.js +73 -0
  186. package/dist/ui/ui-sequence.js.map +1 -0
  187. package/dist/ui/ui-tools.d.ts +59 -0
  188. package/dist/ui/ui-tools.d.ts.map +1 -0
  189. package/dist/ui/ui-tools.js +244 -0
  190. package/dist/ui/ui-tools.js.map +1 -0
  191. package/package.json +78 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prompt/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IAEb;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB,mEAAmE;IACnE,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAElC,mEAAmE;IACnE,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;IAE5B,wEAAwE;IACxE,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAExC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhC;;;OAGG;IACH,SAAS,CAAC,EAAE,qBAAqB,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,0DAA0D;IAC1D,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,0DAA0D;IAC1D,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,iDAAiD;IACjD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,qEAAqE;IACrE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,0CAA0C;IAC1C,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,SAAS,GAAG,gBAAgB,GAAG,QAAQ,CAAC;CAC9D;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC1C"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * AgentPersonaConfig — the platform-specific configuration that integrators
3
+ * provide to define their agent's identity, knowledge, and behavior.
4
+ *
5
+ * The SDK's buildAgentSystemPrompt() combines this with generic behavioral
6
+ * rules (anti-hallucination, communication style, tool strategy, UI control)
7
+ * so platforms never re-invent the wheel.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/prompt/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Asking the realtime server for something it holds until it arrives: a UI
3
+ * action's answer, a job's settlement. Each request waits server-side for at
4
+ * most `maxPollMs`; the caller asks again until its own deadline.
5
+ *
6
+ * 200 is the answer; 204 is "not yet", so ask again; a dropped request or a
7
+ * 5xx is retried after a short pause, since the server keeps what it holds; a
8
+ * 4xx is configuration, not timing, and throws rather than wait it out.
9
+ */
10
+ export interface LongPollOptions {
11
+ /** The URL for one request that waits server-side up to `waitMs`. */
12
+ url: (waitMs: number) => string;
13
+ apiKey: string;
14
+ timeoutMs: number;
15
+ maxPollMs: number;
16
+ signal?: AbortSignal;
17
+ /** What is being collected, for the error a 4xx throws. */
18
+ describe: string;
19
+ }
20
+ export declare function longPoll<T>(options: LongPollOptions): Promise<T | null>;
21
+ //# sourceMappingURL=long-poll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"long-poll.d.ts","sourceRoot":"","sources":["../../src/realtime/long-poll.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CA6B7E"}
@@ -0,0 +1,36 @@
1
+ export async function longPoll(options) {
2
+ const { apiKey, maxPollMs, signal } = options;
3
+ const deadline = Date.now() + options.timeoutMs;
4
+ while (Date.now() < deadline) {
5
+ if (signal?.aborted)
6
+ return null;
7
+ const waitMs = Math.max(0, Math.min(maxPollMs, deadline - Date.now()));
8
+ let res;
9
+ try {
10
+ res = await fetch(options.url(waitMs), {
11
+ headers: { 'X-Api-Key': apiKey },
12
+ signal: signal ? AbortSignal.any([signal, AbortSignal.timeout(waitMs + 5_000)]) : AbortSignal.timeout(waitMs + 5_000),
13
+ });
14
+ }
15
+ catch {
16
+ if (signal?.aborted)
17
+ return null;
18
+ await sleep(Math.min(500, Math.max(0, deadline - Date.now())));
19
+ continue;
20
+ }
21
+ if (res.status === 200)
22
+ return (await res.json());
23
+ if (res.status === 204)
24
+ continue;
25
+ if (res.status >= 500) {
26
+ await sleep(Math.min(500, Math.max(0, deadline - Date.now())));
27
+ continue;
28
+ }
29
+ throw new Error(`[agent-sdk] Collecting ${options.describe} failed: HTTP ${res.status}`);
30
+ }
31
+ return null;
32
+ }
33
+ function sleep(ms) {
34
+ return new Promise((resolve) => setTimeout(resolve, ms));
35
+ }
36
+ //# sourceMappingURL=long-poll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"long-poll.js","sourceRoot":"","sources":["../../src/realtime/long-poll.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,OAAwB;IACxD,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAEhD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAEvE,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;gBACrC,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE;gBAChC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;aACtH,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,MAAM,EAAE,OAAO;gBAAE,OAAO,IAAI,CAAC;YACjC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/D,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;QACvD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,SAAS;QACjC,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACtB,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/D,SAAS;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,CAAC,QAAQ,iBAAiB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { AgentRuntimeConfig } from './types.js';
2
+ /** Throws, naming every missing or malformed value, unless the configuration is complete. */
3
+ export declare function assertAgentRuntimeConfig<TDb>(config: Partial<AgentRuntimeConfig<TDb>>): asserts config is AgentRuntimeConfig<TDb>;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/runtime/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAwBrD,6FAA6F;AAC7F,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAOjI"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Every value the runtime cannot run without, and what it is for. A missing
3
+ * one fails start-up — when the adapter is created, before any turn — with
4
+ * this text. Nothing falls back to an environment variable or an empty
5
+ * string: a fallback is how a worker once ran with no realtime URL and
6
+ * streamed every turn to nobody (ADR-0227 §2.2).
7
+ */
8
+ const REQUIRED = [
9
+ ['model', (c) => !!c.model, 'an `ai` library model'],
10
+ ['realtime.url', (c) => typeof c.realtime?.url === 'string' && /^https?:\/\//.test(c.realtime.url), 'the realtime server URL (http or https)'],
11
+ ['realtime.apiKey', (c) => typeof c.realtime?.apiKey === 'string' && c.realtime.apiKey.length > 0, "the realtime server's internal key"],
12
+ [
13
+ 'persona or systemPrompt',
14
+ (c) => !!c.persona !== (typeof c.systemPrompt === 'function'),
15
+ 'exactly one: the assistant’s identity comes only from the host',
16
+ ],
17
+ ['tools', (c) => Array.isArray(c.tools) || typeof c.tools === 'function', 'a tool list or a per-turn resolver ([] for UI actions only)'],
18
+ ['getDb', (c) => typeof c.getDb === 'function', 'returns the handle passed to the callbacks'],
19
+ ['getHistory', (c) => typeof c.getHistory === 'function', "loads the conversation's earlier messages"],
20
+ ['persistMessages', (c) => typeof c.persistMessages === 'function', "keeps the turn's new messages"],
21
+ ];
22
+ /** Throws, naming every missing or malformed value, unless the configuration is complete. */
23
+ export function assertAgentRuntimeConfig(config) {
24
+ const missing = REQUIRED.filter(([, ok]) => !ok((config ?? {}))).map(([name, , what]) => `${name} (${what})`);
25
+ if (missing.length > 0) {
26
+ throw new Error(`[agent-sdk] Missing required configuration: ${missing.join('; ')}`);
27
+ }
28
+ }
29
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/runtime/config.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,QAAQ,GAA0F;IACtG,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,uBAAuB,CAAC;IACpD,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,yCAAyC,CAAC;IAC9I,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,oCAAoC,CAAC;IACxI;QACE,yBAAyB;QACzB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,YAAY,KAAK,UAAU,CAAC;QAC7D,gEAAgE;KACjE;IACD,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,UAAU,EAAE,6DAA6D,CAAC;IACxI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,UAAU,EAAE,4CAA4C,CAAC;IAC7F,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,UAAU,KAAK,UAAU,EAAE,2CAA2C,CAAC;IACtG,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,eAAe,KAAK,UAAU,EAAE,+BAA+B,CAAC;CACrG,CAAC;AAEF,6FAA6F;AAC7F,MAAM,UAAU,wBAAwB,CAAM,MAAwC;IACpF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,CAAyC,CAAC,CAAC,CAAC,GAAG,CAC1G,CAAC,CAAC,IAAI,EAAE,AAAD,EAAG,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,GAAG,CACxC,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,+CAA+C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;AACH,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { AgentRuntimeConfig, AgentTurnPayload } from './types.js';
2
+ export interface CategorizedError {
3
+ code: string;
4
+ message: string;
5
+ recoverable: boolean;
6
+ }
7
+ export type TurnOutcome = {
8
+ status: 'completed';
9
+ turnId: string;
10
+ rounds: number;
11
+ } | {
12
+ status: 'failed';
13
+ turnId: string;
14
+ error: CategorizedError;
15
+ cause: unknown;
16
+ };
17
+ export interface AgentTurnRunner {
18
+ /** Runs one turn to its end. Never throws for a turn's own failure: it reports it. */
19
+ run(payload: AgentTurnPayload): Promise<TurnOutcome>;
20
+ /** The model, as logs name it. */
21
+ readonly model: string;
22
+ /** The host's logger, or the default one. */
23
+ readonly logger: RuntimeLogger;
24
+ }
25
+ type RuntimeLogger = NonNullable<AgentRuntimeConfig['logger']>;
26
+ /** Why a payload is not a turn, or null when it is one. */
27
+ export declare function payloadRefusal(payload: unknown): string | null;
28
+ export declare function createAgentTurnRunner<TDb>(config: AgentRuntimeConfig<TDb>): AgentTurnRunner;
29
+ /** Sorts a failure into what the client is told, and whether trying again could help. */
30
+ export declare function categorizeError(err: unknown): CategorizedError;
31
+ export {};
32
+ //# sourceMappingURL=turn-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-runner.d.ts","sourceRoot":"","sources":["../../src/runtime/turn-runner.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGvE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAElF,MAAM,WAAW,eAAe;IAC9B,sFAAsF;IACtF,GAAG,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACrD,kCAAkC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC;AAED,KAAK,aAAa,GAAG,WAAW,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAa/D,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAiB9D;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,kBAAkB,CAAC,GAAG,CAAC,GAAG,eAAe,CA4J3F;AAMD,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAkB9D"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * The agent runtime's core: one turn, from payload to persisted messages.
3
+ *
4
+ * Both host adapters wrap it — the Lambda + SQS handler and the container
5
+ * server — so a turn runs the same way wherever it is hosted. The adapter only
6
+ * decides how a turn arrives and what a failure means to its transport.
7
+ */
8
+ import { APICallError, RetryError } from 'ai';
9
+ import { AGENT_SOCKET_EVENTS } from '@ouispec/agent-core';
10
+ import { runAgentTurn } from '../orchestrator.js';
11
+ import { createHttpEmitAdapter } from '../emit/http-adapter.js';
12
+ import { createHttpUIActionChannel } from '../ui/channel.js';
13
+ import { createHttpApprovalStoreClient } from '../approvals/client.js';
14
+ import { withoutClientUI } from '../ui/snapshot.js';
15
+ import { createToolRegistry } from '../tools/types.js';
16
+ import { buildAgentSystemPrompt } from '../prompt/index.js';
17
+ import { describeModel } from '../model.js';
18
+ import { assertAgentRuntimeConfig } from './config.js';
19
+ const DEFAULT_LOGGER = {
20
+ info: (msg, data) => console.log(JSON.stringify({ level: 'info', msg, ...data })),
21
+ warn: (msg, data) => console.warn(JSON.stringify({ level: 'warn', msg, ...data })),
22
+ error: (msg, data) => console.error(JSON.stringify({ level: 'error', msg, ...data })),
23
+ debug: (msg, data) => {
24
+ if (process.env.LOG_LEVEL === 'debug')
25
+ console.log(JSON.stringify({ level: 'debug', msg, ...data }));
26
+ },
27
+ };
28
+ const PAYLOAD_FIELDS = ['turnId', 'conversationId', 'userId', 'accountId', 'socketRoom', 'content'];
29
+ /** Why a payload is not a turn, or null when it is one. */
30
+ export function payloadRefusal(payload) {
31
+ if (!payload || typeof payload !== 'object')
32
+ return 'the turn payload must be an object';
33
+ const p = payload;
34
+ const missing = PAYLOAD_FIELDS.filter((f) => typeof p[f] !== 'string' || (f !== 'content' && !p[f]));
35
+ if (missing.length > 0)
36
+ return `the turn payload is missing ${missing.join(', ')}`;
37
+ if (p.context !== undefined && p.context !== null && typeof p.context !== 'object')
38
+ return 'context must be an object';
39
+ if (p.userToken !== undefined && typeof p.userToken !== 'string')
40
+ return 'userToken must be a string';
41
+ if (p.approval !== undefined) {
42
+ const a = p.approval;
43
+ if (!a || typeof a !== 'object' || typeof a.approvalId !== 'string' || !a.approvalId)
44
+ return 'approval needs an approvalId';
45
+ if (a.decision === 'approve') {
46
+ if (typeof a.token !== 'string' || !a.token)
47
+ return 'an approval to redeem needs its token';
48
+ }
49
+ else if (a.decision !== 'decline') {
50
+ return "approval.decision must be 'approve' or 'decline'";
51
+ }
52
+ }
53
+ return null;
54
+ }
55
+ export function createAgentTurnRunner(config) {
56
+ assertAgentRuntimeConfig(config);
57
+ const logger = config.logger ?? DEFAULT_LOGGER;
58
+ const model = describeModel(config.model);
59
+ const maxRounds = config.maxRounds ?? 12;
60
+ const maxTokens = config.maxTokens ?? 4096;
61
+ const temperature = config.temperature ?? 0.3;
62
+ const toolTimeoutMs = config.toolTimeoutMs ?? 30_000;
63
+ const turnDeadlineMs = config.turnDeadlineMs ?? 840_000;
64
+ const retries = config.retries ?? 3;
65
+ const emit = createHttpEmitAdapter({ url: config.realtime.url, apiKey: config.realtime.apiKey });
66
+ // UI actions reach the client through the same realtime server, and its
67
+ // answers come back through it (ADR-0209).
68
+ const uiChannel = config.uiActions?.channel ?? createHttpUIActionChannel({ url: config.realtime.url, apiKey: config.realtime.apiKey });
69
+ // Approvals are kept by the same realtime server (ADR-0228 §2.4).
70
+ const approvals = config.approvals?.store ?? createHttpApprovalStoreClient({ url: config.realtime.url, apiKey: config.realtime.apiKey });
71
+ const resolveTools = async (ctx) => createToolRegistry(typeof config.tools === 'function' ? await config.tools(ctx) : config.tools);
72
+ logger.info('[agent-sdk] Runtime ready', { model, maxRounds, maxTokens, turnDeadlineMs });
73
+ return {
74
+ model,
75
+ logger,
76
+ async run(payload) {
77
+ const { turnId, conversationId, userId, accountId, socketRoom, content, context, userToken, approval } = payload;
78
+ logger.info('[agent-sdk] Processing turn', { turnId, conversationId, userId });
79
+ let db;
80
+ try {
81
+ db = await config.getDb();
82
+ }
83
+ catch (error) {
84
+ // No handle, so nothing can be recorded; the client is still told.
85
+ return fail(payload, error);
86
+ }
87
+ if (config.recordTurnStart) {
88
+ try {
89
+ await config.recordTurnStart({ turnId, conversationId, userId, accountId, model, db });
90
+ }
91
+ catch (err) {
92
+ logger.warn('[agent-sdk] recordTurnStart failed', { error: messageOf(err) });
93
+ }
94
+ }
95
+ try {
96
+ const history = await config.getHistory(conversationId, db);
97
+ // What the client's UI sent for the worker is not the host's prompt
98
+ // text: its snapshot becomes the turn's UI tools, and its knowledge is
99
+ // rendered after the host's prompt (orchestrator).
100
+ const promptContext = { userId, accountId, context: withoutClientUI(context) };
101
+ const systemPrompt = config.systemPrompt
102
+ ? config.systemPrompt(promptContext)
103
+ : buildAgentSystemPrompt(config.persona, promptContext);
104
+ const turnInput = {
105
+ turnId,
106
+ conversationId,
107
+ userId,
108
+ accountId,
109
+ socketRoom,
110
+ content,
111
+ context,
112
+ history,
113
+ userToken,
114
+ ...(approval ? { approval } : {}),
115
+ };
116
+ const tools = await resolveTools({ userId, accountId, turnId });
117
+ const result = await runAgentTurn({
118
+ tools,
119
+ emit,
120
+ apiSurface: config.apiSurfaceFactory ? config.apiSurfaceFactory({ userId, accountId, userToken }) : config.apiSurface,
121
+ systemPrompt,
122
+ model: config.model,
123
+ promptCacheBreakpoint: config.promptCacheBreakpoint,
124
+ maxToolRounds: maxRounds,
125
+ maxTokens,
126
+ temperature,
127
+ toolTimeoutMs,
128
+ turnDeadlineMs,
129
+ retries,
130
+ turnPolicy: config.turnPolicy,
131
+ toolPolicy: config.toolPolicy,
132
+ approvals,
133
+ ui: {
134
+ channel: uiChannel,
135
+ resultTimeoutMs: config.uiActions?.resultTimeoutMs,
136
+ maxObservationChars: config.uiActions?.maxObservationChars,
137
+ },
138
+ }, turnInput);
139
+ logger.info('[agent-sdk] Turn completed', {
140
+ turnId,
141
+ rounds: result.rounds,
142
+ maxRoundsReached: result.maxRoundsReached,
143
+ usage: result.usage,
144
+ });
145
+ if (config.recordTurnComplete) {
146
+ try {
147
+ await config.recordTurnComplete({ turnId, conversationId, rounds: result.rounds, usage: result.usage, db });
148
+ }
149
+ catch (err) {
150
+ logger.warn('[agent-sdk] recordTurnComplete failed', { error: messageOf(err) });
151
+ }
152
+ }
153
+ try {
154
+ await config.persistMessages({ turnId, conversationId, messages: result.newMessages, usage: result.usage, db });
155
+ }
156
+ catch (err) {
157
+ logger.error('[agent-sdk] persistMessages failed', { turnId, error: messageOf(err) });
158
+ }
159
+ return { status: 'completed', turnId, rounds: result.rounds };
160
+ }
161
+ catch (error) {
162
+ return fail(payload, error, async (categorized) => {
163
+ if (!config.recordTurnFailure)
164
+ return;
165
+ try {
166
+ await config.recordTurnFailure({ turnId, conversationId, error: categorized, db });
167
+ }
168
+ catch (err) {
169
+ logger.warn('[agent-sdk] recordTurnFailure failed', { error: messageOf(err) });
170
+ }
171
+ });
172
+ }
173
+ },
174
+ };
175
+ /** Reports a failed turn to the client first, so the UI stops streaming, then to the host. */
176
+ async function fail(payload, error, record) {
177
+ const { turnId, socketRoom } = payload;
178
+ const categorized = categorizeError(error);
179
+ logger.error('[agent-sdk] Turn failed', { turnId, ...categorized });
180
+ try {
181
+ await emit.emit(socketRoom, AGENT_SOCKET_EVENTS.TURN_ERROR, {
182
+ turnId,
183
+ error: { code: categorized.code, message: categorized.message },
184
+ timestamp: Date.now(),
185
+ });
186
+ }
187
+ catch (emitErr) {
188
+ logger.warn('[agent-sdk] Failed to emit turn_error to client', { turnId, error: messageOf(emitErr) });
189
+ }
190
+ await record?.(categorized);
191
+ return { status: 'failed', turnId, error: categorized, cause: error };
192
+ }
193
+ }
194
+ function messageOf(err) {
195
+ return err instanceof Error ? err.message : String(err);
196
+ }
197
+ /** Sorts a failure into what the client is told, and whether trying again could help. */
198
+ export function categorizeError(err) {
199
+ const cause = RetryError.isInstance(err) ? err.lastError : err;
200
+ const msg = messageOf(err);
201
+ const status = APICallError.isInstance(cause) ? cause.statusCode : undefined;
202
+ if (status === 429 || /throttl|rate limit|too many requests/i.test(msg)) {
203
+ return { code: 'RATE_LIMIT', message: 'The model provider is rate-limiting requests', recoverable: true };
204
+ }
205
+ if (status === 503 || status === 529 || /service ?unavailable|overloaded/i.test(msg)) {
206
+ return { code: 'SERVICE_UNAVAILABLE', message: 'The model provider is unavailable', recoverable: true };
207
+ }
208
+ if (/ModelTimeout|model timeout/i.test(msg)) {
209
+ return { code: 'MODEL_TIMEOUT', message: 'The model timed out', recoverable: true };
210
+ }
211
+ if (/timed out|deadline/i.test(msg)) {
212
+ return { code: 'TURN_TIMEOUT', message: msg, recoverable: false };
213
+ }
214
+ return { code: 'WORKER_ERROR', message: msg, recoverable: false };
215
+ }
216
+ //# sourceMappingURL=turn-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-runner.js","sourceRoot":"","sources":["../../src/runtime/turn-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,244 @@
1
+ /**
2
+ * The agent runtime's configuration: what the host supplies, for either host
3
+ * adapter (Lambda + SQS, or a container). Every seam without a `?` is
4
+ * required, and a missing one fails at start-up, naming it (ADR-0227 §2.2).
5
+ *
6
+ * Integrators provide these callbacks so the SDK can interact with their
7
+ * platform without knowing anything about their database schema, API, or
8
+ * realtime infrastructure.
9
+ */
10
+ import type { RegisteredTool } from '../tools/types.js';
11
+ import type { AgentPersonaConfig } from '../prompt/index.js';
12
+ import type { AgentApiSurface } from '@ouispec/agent-core';
13
+ import type { TurnMessage, TurnHistoryMessage } from '../types.js';
14
+ import type { TurnPolicy } from '../turn-policy.js';
15
+ import type { ToolPolicy } from '../authz/tool-policy.js';
16
+ import type { UIActionChannel } from '../ui/channel.js';
17
+ import type { LanguageModel, ProviderOptions } from '../model.js';
18
+ import type { ApprovalStoreClient } from '../approvals/client.js';
19
+ import type { ApprovalContinuation } from '@ouispec/agent-core';
20
+ /**
21
+ * Database handle — opaque to the SDK. The integrator's callbacks receive
22
+ * whatever they return from `getDb` so they can use it directly.
23
+ */
24
+ export type IntegratorDb = unknown;
25
+ /**
26
+ * One turn, as the host's API hands it to the worker: the SQS message body
27
+ * for the Lambda adapter, the request body for the container adapter.
28
+ */
29
+ export interface AgentTurnPayload {
30
+ turnId: string;
31
+ conversationId: string;
32
+ userId: string;
33
+ accountId: string;
34
+ socketRoom: string;
35
+ content: string;
36
+ context?: Record<string, unknown> | null;
37
+ callbackUrl?: string;
38
+ userToken?: string;
39
+ /**
40
+ * On the turn that follows the user's decision on an approval card: the
41
+ * token to redeem, or that they declined (ADR-0228 §2.2.5).
42
+ */
43
+ approval?: ApprovalContinuation;
44
+ }
45
+ /**
46
+ * Configuration for the agent runtime, whichever adapter hosts it.
47
+ *
48
+ * The integrator provides the model, the realtime server, the persona or
49
+ * system prompt, tools, and a handful of callbacks. The SDK handles
50
+ * everything else: orchestration, streaming, tool execution, UI actions,
51
+ * error handling, and persistence.
52
+ */
53
+ export interface AgentRuntimeConfig<TDb = IntegratorDb> {
54
+ /**
55
+ * The tools the agent can call. Each tool receives its input and a
56
+ * ToolExecutionContext (userId, accountId, userToken, etc.).
57
+ *
58
+ * UI tools are not listed here. They come from the client's surface snapshot
59
+ * on the turn (`context.oui`, ADR-0209), and the SDK builds them itself.
60
+ *
61
+ * Tools can be a static array, or a per-turn resolver function.
62
+ * The resolver receives the turn context and returns tools for that specific turn.
63
+ * Use this when tools vary per-user (e.g. OUI surface tools).
64
+ */
65
+ tools: RegisteredTool[] | ((ctx: {
66
+ userId: string;
67
+ accountId: string;
68
+ turnId: string;
69
+ }) => Promise<RegisteredTool[]> | RegisteredTool[]);
70
+ /**
71
+ * The host's AgentApiSurface binding. Required when tools are loaded from
72
+ * schema (loadToolsFromSchema) — generated tool execute bodies call
73
+ * `apiSurface.executeIntent(intentId, params)`. Optional for hand-authored
74
+ * tools that don't need host API access.
75
+ *
76
+ * Use `apiSurfaceFactory` instead if the surface needs per-turn context
77
+ * (userId, accountId) — which is the common case.
78
+ */
79
+ apiSurface?: AgentApiSurface;
80
+ /**
81
+ * Factory that creates a per-turn AgentApiSurface with the turn's
82
+ * userId/accountId. Preferred over the static `apiSurface` when the
83
+ * surface needs per-turn context.
84
+ */
85
+ apiSurfaceFactory?: (payload: {
86
+ userId: string;
87
+ accountId: string;
88
+ userToken?: string;
89
+ }) => AgentApiSurface;
90
+ /**
91
+ * The assistant's identity and voice, through the SDK's prompt framework.
92
+ * The shipped prompts carry no identity of their own: it comes only from
93
+ * here. Exactly one of `persona` and `systemPrompt` is required.
94
+ */
95
+ persona?: AgentPersonaConfig;
96
+ /**
97
+ * A system prompt builder, for full control instead of `persona`. Receives
98
+ * the same context the persona would. Exactly one of the two is required.
99
+ */
100
+ systemPrompt?: (context: {
101
+ userId: string;
102
+ accountId: string;
103
+ context?: Record<string, unknown> | null;
104
+ }) => string;
105
+ /** The model, from any `ai` library provider (ADR-0227 §2.2, D5). Required. */
106
+ model: LanguageModel;
107
+ /**
108
+ * Provider options that mark a prompt-cache breakpoint (see
109
+ * PROMPT_CACHE_BREAKPOINTS). Omit for a provider that caches on its own.
110
+ */
111
+ promptCacheBreakpoint?: ProviderOptions;
112
+ /** Max tool-use rounds per turn. Default: 12 */
113
+ maxRounds?: number;
114
+ /** Max tokens per model response. Default: 4096 */
115
+ maxTokens?: number;
116
+ /** Temperature. Default: 0.3 */
117
+ temperature?: number;
118
+ /** Per-tool execution timeout in ms. Default: 30000 */
119
+ toolTimeoutMs?: number;
120
+ /** Total turn deadline in ms. Default: 840000 (14 min). Keep it below the host's own limit. */
121
+ turnDeadlineMs?: number;
122
+ /** Retries of a transient model error. Default: 3 */
123
+ retries?: number;
124
+ /**
125
+ * Optional turn policy for product-specific step control.
126
+ * Controls turn classification and per-step tool selection constraints.
127
+ * If not provided, the default policy applies no constraints.
128
+ */
129
+ turnPolicy?: TurnPolicy;
130
+ /**
131
+ * Per-tool authorization policy. Evaluated before every tool execution.
132
+ * If omitted, the default policy allows all tools.
133
+ * Policy errors are fail-closed (treated as deny).
134
+ */
135
+ toolPolicy?: ToolPolicy;
136
+ /**
137
+ * The realtime server (agent-sdk-realtime) and its internal key, one per
138
+ * environment, from the host's secret store. Required. Turn events go to
139
+ * `POST {url}/api/emit`.
140
+ */
141
+ realtime: {
142
+ url: string;
143
+ apiKey: string;
144
+ };
145
+ /**
146
+ * How UI actions reach the client and how its answers come back. Defaults
147
+ * to the realtime server: requests are emitted to the turn's room and
148
+ * answers collected from `GET /internal/oui/action-results/{requestId}`.
149
+ */
150
+ uiActions?: {
151
+ channel?: UIActionChannel;
152
+ /** How long a UI tool waits for the client's answer. Default 20 s. */
153
+ resultTimeoutMs?: number;
154
+ /** Largest page-state payload given to the model, in characters. Default 6000. */
155
+ maxObservationChars?: number;
156
+ };
157
+ /**
158
+ * The approval store (ADR-0228). Defaults to the realtime server's
159
+ * (`/internal/approvals`), where it lives beside the UI action results.
160
+ */
161
+ approvals?: {
162
+ store?: ApprovalStoreClient;
163
+ };
164
+ /**
165
+ * Returns a database client/handle. Called once per invocation.
166
+ * The returned value is passed to `getHistory` and `persistMessages`.
167
+ *
168
+ * Example: `async () => prisma`
169
+ */
170
+ getDb: () => Promise<TDb>;
171
+ /**
172
+ * Loads conversation history for context. Called once per turn.
173
+ * Return prior user/assistant/tool messages in chronological order.
174
+ *
175
+ * The SDK handles appending the current user message — don't include it.
176
+ */
177
+ getHistory: (conversationId: string, db: TDb) => Promise<TurnHistoryMessage[]>;
178
+ /**
179
+ * Persists the new messages generated during this turn.
180
+ * Called after the turn completes successfully.
181
+ */
182
+ persistMessages: (input: {
183
+ turnId: string;
184
+ conversationId: string;
185
+ messages: TurnMessage[];
186
+ usage: {
187
+ promptTokens: number;
188
+ completionTokens: number;
189
+ totalTokens: number;
190
+ };
191
+ db: TDb;
192
+ }) => Promise<void>;
193
+ /**
194
+ * Optional: record turn start in your database. Receives the db handle.
195
+ * Default: no-op (the SDK still emits `agent:turn_started` to realtime).
196
+ */
197
+ recordTurnStart?: (input: {
198
+ turnId: string;
199
+ conversationId: string;
200
+ userId: string;
201
+ accountId: string;
202
+ model: string;
203
+ db: TDb;
204
+ }) => Promise<void>;
205
+ /**
206
+ * Optional: record turn completion. Default: no-op.
207
+ */
208
+ recordTurnComplete?: (input: {
209
+ turnId: string;
210
+ conversationId: string;
211
+ rounds: number;
212
+ usage: {
213
+ promptTokens: number;
214
+ completionTokens: number;
215
+ totalTokens: number;
216
+ };
217
+ db: TDb;
218
+ }) => Promise<void>;
219
+ /**
220
+ * Optional: record turn failure. Default: no-op.
221
+ */
222
+ recordTurnFailure?: (input: {
223
+ turnId: string;
224
+ conversationId: string;
225
+ error: {
226
+ code: string;
227
+ message: string;
228
+ recoverable: boolean;
229
+ };
230
+ db: TDb;
231
+ }) => Promise<void>;
232
+ /**
233
+ * Optional: custom logger. Default: structured console logger.
234
+ */
235
+ logger?: {
236
+ info: (msg: string, data?: Record<string, unknown>) => void;
237
+ warn: (msg: string, data?: Record<string, unknown>) => void;
238
+ error: (msg: string, data?: Record<string, unknown>) => void;
239
+ debug: (msg: string, data?: Record<string, unknown>) => void;
240
+ };
241
+ }
242
+ /** The Lambda adapter's configuration: the runtime's, unchanged. */
243
+ export type LambdaAgentConfig<TDb = IntegratorDb> = AgentRuntimeConfig<TDb>;
244
+ //# sourceMappingURL=types.d.ts.map