@theokit/agents 9.2.1 → 9.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,138 +3,12 @@ import {
3
3
  inheritHooks
4
4
  } from "./chunk-RKWCXVYG.js";
5
5
  import {
6
- compileAgentDefinition,
7
- defineAgent,
8
- isAgentDefinition
6
+ compileAgentDefinition
9
7
  } from "./chunk-4VHCH6IZ.js";
10
8
  import {
11
9
  __name
12
10
  } from "./chunk-Z4QWC7IK.js";
13
11
 
14
- // src/errors.ts
15
- import { ConfigurationError } from "@theokit/sdk/errors";
16
-
17
- // src/bridge/compile-context-window.ts
18
- var STRATEGY_KNOBS = [
19
- "compactionStrategy",
20
- "preserveLastN",
21
- "preserveToolResults",
22
- "preserveSystemPrompt"
23
- ];
24
- function compileContextWindow(options) {
25
- const context = {};
26
- if (typeof options.maxTokens === "number") {
27
- context.maxTokens = options.maxTokens;
28
- }
29
- const opts = options;
30
- const metadataOnlyKnobs = STRATEGY_KNOBS.filter((knob) => opts[knob] !== void 0);
31
- return {
32
- context,
33
- metadataOnlyKnobs
34
- };
35
- }
36
- __name(compileContextWindow, "compileContextWindow");
37
-
38
- // src/bridge/compile-skills.ts
39
- function compileSkills(options) {
40
- if (options.autoDiscover) {
41
- return {
42
- autoInject: true
43
- };
44
- }
45
- return {
46
- enabled: options.include,
47
- autoInject: true
48
- };
49
- }
50
- __name(compileSkills, "compileSkills");
51
-
52
- // src/bridge/agent-compiler.ts
53
- var SDK_TOOL_NAME = /^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/;
54
- var SDK_TOOL_NAME_MAX_LENGTH = 64;
55
- var SDK_TOOL_NAME_CHARSET = /^[a-zA-Z][a-zA-Z0-9_-]*$/;
56
- var SDK_RESERVED_TOOL_NAMES = /* @__PURE__ */ new Set([
57
- "shell",
58
- "memory_search",
59
- "memory_get"
60
- ]);
61
- var SDK_RESERVED_TOOL_PREFIX = "mcp_";
62
- function toolRuntimeName(namespace, toolName) {
63
- if (toolName.trim().length === 0) {
64
- const where = namespace ? ` in namespace "${namespace}"` : "";
65
- throw new ConfigurationError(`tool: empty name${where} \u2014 declare a non-empty name for the tool`);
66
- }
67
- const name = namespace ? `${namespace}_${toolName}` : toolName;
68
- if (!SDK_TOOL_NAME.test(name)) {
69
- if (SDK_TOOL_NAME_CHARSET.test(name)) {
70
- throw new ConfigurationError(`tool: name "${name}" has length ${name.length} \u2014 the composition namespace + "_" + tool exceeds the maximum of ${SDK_TOOL_NAME_MAX_LENGTH} the SDK accepts`);
71
- }
72
- throw new ConfigurationError(`tool: invalid name "${name}" \u2014 it must match ${String(SDK_TOOL_NAME)} (the SDK rejects the rest; check the namespace and the tool name)`);
73
- }
74
- if (SDK_RESERVED_TOOL_NAMES.has(name) || name.startsWith(SDK_RESERVED_TOOL_PREFIX)) {
75
- throw new ConfigurationError(`tool: reserved name "${name}" \u2014 the SDK reserves ${[
76
- ...SDK_RESERVED_TOOL_NAMES
77
- ].join(", ")} and the prefix "${SDK_RESERVED_TOOL_PREFIX}"`);
78
- }
79
- return name;
80
- }
81
- __name(toolRuntimeName, "toolRuntimeName");
82
- function compileHitlGates(toolboxes) {
83
- const gates = /* @__PURE__ */ new Map();
84
- for (const tb of toolboxes) {
85
- for (const tool of tb.tools) {
86
- if (tool.hitl) {
87
- gates.set(toolRuntimeName(tb.namespace, tool.config.name), tool.hitl);
88
- }
89
- }
90
- }
91
- return gates;
92
- }
93
- __name(compileHitlGates, "compileHitlGates");
94
- function compileTools(toolboxes, toolboxInstances) {
95
- const tools = [];
96
- for (const tb of toolboxes) {
97
- const instance = toolboxInstances.get(tb.class);
98
- if (!instance) {
99
- throw new ConfigurationError(`toolbox: ${tb.class.name} was not instantiated \u2014 pass the instance in \`toolboxInstances\``);
100
- }
101
- for (const tool of tb.tools) {
102
- const handler = instance[tool.propertyKey];
103
- if (typeof handler !== "function") {
104
- throw new ConfigurationError(`toolbox: ${tb.class.name}.${String(tool.propertyKey)} is not a method (tool "${tool.config.name}")`);
105
- }
106
- const name = toolRuntimeName(tb.namespace, tool.config.name);
107
- tools.push({
108
- name,
109
- description: tool.config.description,
110
- inputSchema: tool.config.input,
111
- handler: /* @__PURE__ */ __name((input) => handler.call(instance, input), "handler")
112
- });
113
- }
114
- }
115
- return tools;
116
- }
117
- __name(compileTools, "compileTools");
118
-
119
- // src/bridge/agent-execution-context.ts
120
- function createAgentExecutionContext(base, agent, run, toolCall) {
121
- return {
122
- getRequest: /* @__PURE__ */ __name(() => base.getRequest(), "getRequest"),
123
- getUrl: /* @__PURE__ */ __name(() => base.getUrl(), "getUrl"),
124
- getClass: /* @__PURE__ */ __name(() => base.getClass(), "getClass"),
125
- getMethodName: /* @__PURE__ */ __name(() => base.getMethodName(), "getMethodName"),
126
- getAgent: /* @__PURE__ */ __name(() => agent, "getAgent"),
127
- getRun: /* @__PURE__ */ __name(() => run, "getRun"),
128
- getToolCall: /* @__PURE__ */ __name(() => toolCall ?? null, "getToolCall"),
129
- isAgentContext: /* @__PURE__ */ __name(() => true, "isAgentContext")
130
- };
131
- }
132
- __name(createAgentExecutionContext, "createAgentExecutionContext");
133
- function isAgentContext(ctx) {
134
- return "isAgentContext" in ctx && ctx.isAgentContext();
135
- }
136
- __name(isAgentContext, "isAgentContext");
137
-
138
12
  // src/bridge/compile-project-context.ts
139
13
  var UNMAPPED_KNOBS = [
140
14
  "indexStrategy",
@@ -177,157 +51,6 @@ function compileProjectContext(options, base) {
177
51
  }
178
52
  __name(compileProjectContext, "compileProjectContext");
179
53
 
180
- // src/bridge/agent-sse-handler.ts
181
- var encoder = new TextEncoder();
182
- function streamAgentResponse(eventStream) {
183
- const stream = new ReadableStream({
184
- async start(controller) {
185
- let closed = false;
186
- const safeEnqueue = /* @__PURE__ */ __name((chunk) => {
187
- if (closed) return;
188
- try {
189
- controller.enqueue(chunk);
190
- } catch {
191
- closed = true;
192
- }
193
- }, "safeEnqueue");
194
- try {
195
- for await (const event of eventStream) {
196
- if (closed) break;
197
- const data = JSON.stringify(event);
198
- const frame = `event: ${event.type}
199
- data: ${data}
200
-
201
- `;
202
- safeEnqueue(encoder.encode(frame));
203
- }
204
- } catch (err) {
205
- if (!closed) {
206
- const errorEvent = {
207
- type: "error",
208
- error: {
209
- message: err instanceof Error ? err.message : "Internal agent error"
210
- }
211
- };
212
- const frame = `event: error
213
- data: ${JSON.stringify(errorEvent)}
214
-
215
- `;
216
- safeEnqueue(encoder.encode(frame));
217
- }
218
- } finally {
219
- controller.close();
220
- }
221
- }
222
- });
223
- return new Response(stream, {
224
- status: 200,
225
- headers: {
226
- "content-type": "text/event-stream",
227
- "cache-control": "no-cache",
228
- connection: "keep-alive"
229
- }
230
- });
231
- }
232
- __name(streamAgentResponse, "streamAgentResponse");
233
-
234
- // src/bridge/agent-stream-events.ts
235
- function isTextDelta(e) {
236
- return e.type === "text_delta";
237
- }
238
- __name(isTextDelta, "isTextDelta");
239
- function isToolCall(e) {
240
- return e.type === "tool_call";
241
- }
242
- __name(isToolCall, "isToolCall");
243
- function isPartialToolCall(e) {
244
- return e.type === "partial_tool_call";
245
- }
246
- __name(isPartialToolCall, "isPartialToolCall");
247
- function isToolResult(e) {
248
- return e.type === "tool_result";
249
- }
250
- __name(isToolResult, "isToolResult");
251
- function isDone(e) {
252
- return e.type === "done";
253
- }
254
- __name(isDone, "isDone");
255
- function isError(e) {
256
- return e.type === "error";
257
- }
258
- __name(isError, "isError");
259
- function isApprovalRequired(e) {
260
- return e.type === "approval_required";
261
- }
262
- __name(isApprovalRequired, "isApprovalRequired");
263
-
264
- // src/bridge/agent-route-generator.ts
265
- function generateAgentRoutes(ctx) {
266
- const { walkResult, createRun, getRun } = ctx;
267
- const basePath = walkResult.route.replace(/\/$/, "");
268
- const routes = [];
269
- routes.push({
270
- method: "POST",
271
- path: `${basePath}/chat`,
272
- handler: /* @__PURE__ */ __name(async (request) => {
273
- let body = null;
274
- try {
275
- body = await request.json();
276
- } catch {
277
- }
278
- const message = body?.message;
279
- if (typeof message !== "string" || message.length === 0) {
280
- return new Response(JSON.stringify({
281
- error: {
282
- code: "BAD_REQUEST",
283
- message: "message field required"
284
- }
285
- }), {
286
- status: 400,
287
- headers: {
288
- "content-type": "application/json"
289
- }
290
- });
291
- }
292
- const rawSessionId = body?.sessionId;
293
- const sessionId = typeof rawSessionId === "string" ? rawSessionId : `session-${Date.now()}`;
294
- return streamAgentResponse(createRun(message, sessionId));
295
- }, "handler")
296
- });
297
- if (getRun) {
298
- routes.push({
299
- method: "GET",
300
- path: `${basePath}/runs/:runId`,
301
- handler: /* @__PURE__ */ __name(async (request) => {
302
- const url = new URL(request.url);
303
- const runId = url.pathname.split("/").pop() ?? "";
304
- const run = await getRun(runId);
305
- if (!run) {
306
- return new Response(JSON.stringify({
307
- error: {
308
- code: "NOT_FOUND",
309
- message: `Run ${runId} not found`
310
- }
311
- }), {
312
- status: 404,
313
- headers: {
314
- "content-type": "application/json"
315
- }
316
- });
317
- }
318
- return new Response(JSON.stringify(run), {
319
- status: 200,
320
- headers: {
321
- "content-type": "application/json"
322
- }
323
- });
324
- }, "handler")
325
- });
326
- }
327
- return routes;
328
- }
329
- __name(generateAgentRoutes, "generateAgentRoutes");
330
-
331
54
  // src/guardrails/types.ts
332
55
  import { TheokitAgentError } from "@theokit/sdk/errors";
333
56
  var GuardrailViolationError = class extends TheokitAgentError {
@@ -1627,431 +1350,6 @@ function withGuardrails(handle, guardrails) {
1627
1350
  }
1628
1351
  __name(withGuardrails, "withGuardrails");
1629
1352
 
1630
- // src/bridge/present-ui-message-stream.ts
1631
- import { UIMessageStreamPresenter } from "@theokit/presenter";
1632
- function toAgentOutputEvent(e) {
1633
- switch (e.type) {
1634
- case "text_delta":
1635
- return {
1636
- type: "text",
1637
- text: e.content
1638
- };
1639
- case "thinking":
1640
- return {
1641
- type: "reasoning",
1642
- text: e.content
1643
- };
1644
- case "tool_call":
1645
- return {
1646
- type: "tool-call",
1647
- callId: e.callId,
1648
- name: e.toolName,
1649
- input: e.input
1650
- };
1651
- case "tool_result":
1652
- return {
1653
- type: "tool-result",
1654
- callId: e.callId,
1655
- name: e.toolName,
1656
- result: e.output,
1657
- isError: e.isError
1658
- };
1659
- default:
1660
- return null;
1661
- }
1662
- }
1663
- __name(toAgentOutputEvent, "toAgentOutputEvent");
1664
- function doneToMetadata(event) {
1665
- return event.cost === void 0 ? {
1666
- usage: event.usage,
1667
- durationMs: event.durationMs
1668
- } : {
1669
- usage: event.usage,
1670
- durationMs: event.durationMs,
1671
- cost: event.cost
1672
- };
1673
- }
1674
- __name(doneToMetadata, "doneToMetadata");
1675
- var ERROR_CODE_DATA_PART = "data-error-code";
1676
- var INPUT_REQUESTED_DATA_PART = "data-input-requested";
1677
- var TASK_PROGRESS_DATA_PART = "data-task-progress";
1678
- var SHELL_OUTPUT_DATA_PART = "data-shell-output";
1679
- function dataPart(type, data) {
1680
- return {
1681
- type,
1682
- data,
1683
- transient: true
1684
- };
1685
- }
1686
- __name(dataPart, "dataPart");
1687
- function* errorChunks(errorText, code) {
1688
- if (code !== void 0) yield dataPart(ERROR_CODE_DATA_PART, {
1689
- code
1690
- });
1691
- yield {
1692
- type: "error",
1693
- errorText
1694
- };
1695
- }
1696
- __name(errorChunks, "errorChunks");
1697
- function diagnosticDataPart(event) {
1698
- switch (event.type) {
1699
- case "checkpoint_saved":
1700
- return dataPart("data-checkpoint", {
1701
- checkpointId: event.checkpointId,
1702
- resumeToken: event.resumeToken,
1703
- step: event.step
1704
- });
1705
- // theokit#141 — without these cases the three restored events would be dropped by the loop's
1706
- // catch-all, which is the reported defect one layer down: translating an event and never
1707
- // presenting it leaves the consumer just as blind, minus even the warning.
1708
- case "input_requested":
1709
- return dataPart(INPUT_REQUESTED_DATA_PART, {
1710
- requestId: event.requestId
1711
- });
1712
- case "task_progress":
1713
- return dataPart(TASK_PROGRESS_DATA_PART, {
1714
- ...event.status !== void 0 ? {
1715
- status: event.status
1716
- } : {},
1717
- ...event.text !== void 0 ? {
1718
- text: event.text
1719
- } : {}
1720
- });
1721
- case "shell_output":
1722
- return dataPart(SHELL_OUTPUT_DATA_PART, {
1723
- event: event.event
1724
- });
1725
- default:
1726
- return null;
1727
- }
1728
- }
1729
- __name(diagnosticDataPart, "diagnosticDataPart");
1730
- async function* presentUIMessageStream(events, opts) {
1731
- const presenter = new UIMessageStreamPresenter({
1732
- textId: opts.textId
1733
- });
1734
- yield {
1735
- type: "start"
1736
- };
1737
- let turnMetadata;
1738
- try {
1739
- for await (const event of events) {
1740
- const output = toAgentOutputEvent(event);
1741
- if (output !== null) {
1742
- yield* presenter.present(output);
1743
- continue;
1744
- }
1745
- if (event.type === "approval_required") {
1746
- yield* presenter.closeBlock();
1747
- if (!presenter.hasSeen(event.callId)) {
1748
- presenter.markSeen(event.callId);
1749
- yield {
1750
- type: "tool-input-available",
1751
- toolCallId: event.callId,
1752
- toolName: event.toolName,
1753
- input: event.input ?? {},
1754
- dynamic: true
1755
- };
1756
- }
1757
- yield {
1758
- type: "tool-approval-request",
1759
- approvalId: event.callId,
1760
- toolCallId: event.callId
1761
- };
1762
- continue;
1763
- }
1764
- const diagnostic = diagnosticDataPart(event);
1765
- if (diagnostic !== null) {
1766
- yield* presenter.closeBlock();
1767
- yield diagnostic;
1768
- continue;
1769
- }
1770
- if (event.type === "error") {
1771
- yield* errorChunks(event.message, event.code);
1772
- break;
1773
- }
1774
- if (event.type === "done") {
1775
- turnMetadata = doneToMetadata(event);
1776
- break;
1777
- }
1778
- }
1779
- } catch (err) {
1780
- const code = err.code;
1781
- yield* errorChunks(String(err), typeof code === "string" ? code : void 0);
1782
- }
1783
- yield* presenter.finish(turnMetadata);
1784
- }
1785
- __name(presentUIMessageStream, "presentUIMessageStream");
1786
-
1787
- // src/bridge/agent-builder.ts
1788
- var ContextualTool = {
1789
- /**
1790
- * Tag a {@link CustomTool} with a literal name (so `.tool()` can accumulate the tool-name union)
1791
- * and, optionally, a required run-context type. The `requiredContext` argument is a type-only
1792
- * witness — pass `undefined as C` or a sample value; it is never read at runtime.
1793
- */
1794
- of(tool, _requiredContext) {
1795
- return tool;
1796
- }
1797
- };
1798
- function makeBuilder(config) {
1799
- const runtime = {
1800
- input: /* @__PURE__ */ __name((schema) => makeBuilder({
1801
- ...config,
1802
- input: schema
1803
- }), "input"),
1804
- model: /* @__PURE__ */ __name((id) => makeBuilder({
1805
- ...config,
1806
- model: id
1807
- }), "model"),
1808
- system: /* @__PURE__ */ __name((prompt) => makeBuilder({
1809
- ...config,
1810
- system: prompt
1811
- }), "system"),
1812
- reasoningEffort: /* @__PURE__ */ __name((effort) => makeBuilder({
1813
- ...config,
1814
- reasoningEffort: effort
1815
- }), "reasoningEffort"),
1816
- context: /* @__PURE__ */ __name((value) => makeBuilder({
1817
- ...config,
1818
- context: value
1819
- }), "context"),
1820
- tool: /* @__PURE__ */ __name((tool) => makeBuilder({
1821
- ...config,
1822
- tools: [
1823
- ...config.tools ?? [],
1824
- tool
1825
- ]
1826
- }), "tool"),
1827
- tools: /* @__PURE__ */ __name((list) => makeBuilder({
1828
- ...config,
1829
- tools: [
1830
- ...config.tools ?? [],
1831
- ...list
1832
- ]
1833
- }), "tools"),
1834
- // `when` is deliberately not a conditional-typed return: the branch runs or it does not, and
1835
- // either way the caller gets a builder carrying the same accumulated state. Returning `builder`
1836
- // unchanged on `false` is what makes it a true no-op rather than a reset.
1837
- when: /* @__PURE__ */ __name((condition, apply) => {
1838
- const builder = makeBuilder(config);
1839
- return condition ? apply(builder) : builder;
1840
- }, "when"),
1841
- guardrail: /* @__PURE__ */ __name((g) => makeBuilder({
1842
- ...config,
1843
- guardrails: [
1844
- ...config.guardrails ?? [],
1845
- g
1846
- ]
1847
- }), "guardrail"),
1848
- guardrails: /* @__PURE__ */ __name((gs) => makeBuilder({
1849
- ...config,
1850
- guardrails: gs
1851
- }), "guardrails"),
1852
- approval: /* @__PURE__ */ __name((toolName, options) => makeBuilder({
1853
- ...config,
1854
- approvals: {
1855
- ...config.approvals ?? {},
1856
- [toolName]: options
1857
- }
1858
- }), "approval"),
1859
- approvals: /* @__PURE__ */ __name((map) => makeBuilder({
1860
- ...config,
1861
- approvals: map
1862
- }), "approvals"),
1863
- skills: /* @__PURE__ */ __name((selection) => makeBuilder({
1864
- ...config,
1865
- skills: selection
1866
- }), "skills"),
1867
- settingSources: /* @__PURE__ */ __name((selection) => makeBuilder({
1868
- ...config,
1869
- settingSources: selection
1870
- }), "settingSources"),
1871
- memory: /* @__PURE__ */ __name((settings) => makeBuilder({
1872
- ...config,
1873
- memory: settings
1874
- }), "memory"),
1875
- hooks: /* @__PURE__ */ __name((map) => makeBuilder({
1876
- ...config,
1877
- hooks: map
1878
- }), "hooks"),
1879
- plugins: /* @__PURE__ */ __name((list) => makeBuilder({
1880
- ...config,
1881
- plugins: list
1882
- }), "plugins"),
1883
- mcp: /* @__PURE__ */ __name((servers) => makeBuilder({
1884
- ...config,
1885
- mcpServers: servers
1886
- }), "mcp"),
1887
- use: /* @__PURE__ */ __name((preset) => preset(runtime), "use"),
1888
- build: /* @__PURE__ */ __name(() => defineAgent(config), "build")
1889
- };
1890
- return runtime;
1891
- }
1892
- __name(makeBuilder, "makeBuilder");
1893
- var AgentBuilder = {
1894
- /**
1895
- * Start a fluent agent definition. Chain `.model()` (required) + `.context()` / `.system()` /
1896
- * `.input()` / `.tool()` / `.use()`, then `.build()` to get the branded {@link AgentDefinition}.
1897
- */
1898
- create() {
1899
- return makeBuilder({});
1900
- }
1901
- };
1902
-
1903
- // src/bridge/agent-endpoint.ts
1904
- import { TheokitAgentError as TheokitAgentError2 } from "@theokit/sdk/errors";
1905
- var AgentDefinitionError = class extends TheokitAgentError2 {
1906
- static {
1907
- __name(this, "AgentDefinitionError");
1908
- }
1909
- name = "AgentDefinitionError";
1910
- constructor(source) {
1911
- super(`[@theokit/agents] ${source}: an agents/ file must default-export a defineAgent(...) value or an @Agent-decorated class.`, {
1912
- code: "AGENT_DEFINITION_INVALID",
1913
- // a malformed module does not become well-formed by being loaded twice.
1914
- isRetryable: false
1915
- });
1916
- }
1917
- };
1918
- function extractDefaultExport(mod) {
1919
- if (typeof mod === "object" && mod !== null && "default" in mod) {
1920
- return mod.default;
1921
- }
1922
- return mod;
1923
- }
1924
- __name(extractDefaultExport, "extractDefaultExport");
1925
- function isCompiledAgentOptions(value) {
1926
- if (typeof value !== "object" || value === null) return false;
1927
- const v = value;
1928
- return Array.isArray(v.tools) && typeof v.agents === "object" && v.agents !== null;
1929
- }
1930
- __name(isCompiledAgentOptions, "isCompiledAgentOptions");
1931
- function compileAgentModule(mod, source = "agent module") {
1932
- const def = extractDefaultExport(mod);
1933
- if (isAgentDefinition(def)) {
1934
- return compileAgentDefinition(def);
1935
- }
1936
- if (isCompiledAgentOptions(def)) return def;
1937
- throw new AgentDefinitionError(source);
1938
- }
1939
- __name(compileAgentModule, "compileAgentModule");
1940
- async function* asAgentStream(events) {
1941
- for await (const e of events) yield e;
1942
- }
1943
- __name(asAgentStream, "asAgentStream");
1944
- var EventQueue = class EventQueue2 {
1945
- static {
1946
- __name(this, "EventQueue");
1947
- }
1948
- #items = [];
1949
- #resolvers = [];
1950
- #closed = false;
1951
- push(item) {
1952
- if (this.#closed) return;
1953
- const r = this.#resolvers.shift();
1954
- if (r) r({
1955
- value: item,
1956
- done: false
1957
- });
1958
- else this.#items.push(item);
1959
- }
1960
- close() {
1961
- this.#closed = true;
1962
- for (const r of this.#resolvers.splice(0)) r({
1963
- value: void 0,
1964
- done: true
1965
- });
1966
- }
1967
- async *drain() {
1968
- for (; ; ) {
1969
- if (this.#items.length > 0) {
1970
- yield this.#items.shift();
1971
- continue;
1972
- }
1973
- if (this.#closed) return;
1974
- const next = await new Promise((resolve) => this.#resolvers.push(resolve));
1975
- if (next.done) return;
1976
- yield next.value;
1977
- }
1978
- }
1979
- };
1980
- async function* appendCheckpointSaved(source, sessionId) {
1981
- let emitted = false;
1982
- const checkpoint = /* @__PURE__ */ __name(() => ({
1983
- type: "checkpoint_saved",
1984
- checkpointId: crypto.randomUUID(),
1985
- step: 0,
1986
- resumeToken: sessionId
1987
- }), "checkpoint");
1988
- for await (const ev of source) {
1989
- if (ev.type === "done" && !emitted) {
1990
- emitted = true;
1991
- yield checkpoint();
1992
- }
1993
- yield ev;
1994
- }
1995
- if (!emitted) yield checkpoint();
1996
- }
1997
- __name(appendCheckpointSaved, "appendCheckpointSaved");
1998
- function streamAgentUIMessages(compiled, apiKey, input) {
1999
- const textId = crypto.randomUUID();
2000
- const overrides = {};
2001
- if (input.cwd !== void 0) overrides.cwd = input.cwd;
2002
- if (input.baseDir !== void 0) overrides.baseDir = input.baseDir;
2003
- if (input.images !== void 0) overrides.images = input.images;
2004
- if (input.onRunEvent !== void 0) overrides.onRunEvent = input.onRunEvent;
2005
- let source;
2006
- if (!input.hitl || input.hitl.gated.size === 0) {
2007
- const events2 = createSdkAgentStream(compiled, compiled.tools, apiKey, overrides)(input.message, input.sessionId);
2008
- source = asAgentStream(events2);
2009
- } else {
2010
- const queue = new EventQueue();
2011
- input.signal?.addEventListener("abort", () => {
2012
- queue.close();
2013
- }, {
2014
- once: true
2015
- });
2016
- const plugin = createHitlPlugin({
2017
- gated: input.hitl.gated,
2018
- emit: /* @__PURE__ */ __name((e) => {
2019
- queue.push(e);
2020
- }, "emit"),
2021
- awaitApproval: input.hitl.awaitApproval
2022
- });
2023
- const sdkStream = createSdkAgentStream(compiled, compiled.tools, apiKey, {
2024
- ...overrides,
2025
- // The HITL plugin is a structural @theokit/sdk Plugin (createHitlPlugin returns the
2026
- // { name, register } shape); the RuntimeOverrides.plugins union is widened at the SDK edge.
2027
- plugins: [
2028
- plugin
2029
- ]
2030
- })(input.message, input.sessionId);
2031
- void (async () => {
2032
- try {
2033
- for await (const e of sdkStream) queue.push(e);
2034
- } catch (err) {
2035
- queue.push({
2036
- type: "error",
2037
- code: "SDK_STREAM_ERROR",
2038
- message: err instanceof Error ? err.message : String(err),
2039
- retryable: false
2040
- });
2041
- } finally {
2042
- queue.close();
2043
- }
2044
- })();
2045
- source = queue.drain();
2046
- }
2047
- const durableCheckpoint = compiled.checkpoint?.storage === "filesystem";
2048
- const events = durableCheckpoint ? appendCheckpointSaved(source, input.sessionId) : source;
2049
- return presentUIMessageStream(events, {
2050
- textId
2051
- });
2052
- }
2053
- __name(streamAgentUIMessages, "streamAgentUIMessages");
2054
-
2055
1353
  // src/loop/compaction-strategy.ts
2056
1354
  import { compactTranscript } from "@theokit/sdk/compaction";
2057
1355
  import { z } from "zod";
@@ -2158,8 +1456,8 @@ var noopReflectionStrategy = {
2158
1456
  };
2159
1457
 
2160
1458
  // src/bridge/delegation-types.ts
2161
- import { TheokitAgentError as TheokitAgentError3 } from "@theokit/sdk/errors";
2162
- var DelegationBudgetExceededError = class extends TheokitAgentError3 {
1459
+ import { TheokitAgentError as TheokitAgentError2 } from "@theokit/sdk/errors";
1460
+ var DelegationBudgetExceededError = class extends TheokitAgentError2 {
2163
1461
  static {
2164
1462
  __name(this, "DelegationBudgetExceededError");
2165
1463
  }
@@ -2176,7 +1474,7 @@ var DelegationBudgetExceededError = class extends TheokitAgentError3 {
2176
1474
  }
2177
1475
  };
2178
1476
  var BudgetExceededError = DelegationBudgetExceededError;
2179
- var DelegationError = class extends TheokitAgentError3 {
1477
+ var DelegationError = class extends TheokitAgentError2 {
2180
1478
  static {
2181
1479
  __name(this, "DelegationError");
2182
1480
  }
@@ -2764,37 +2062,9 @@ async function delegate(spec, message, opts = {}) {
2764
2062
  }
2765
2063
  __name(delegate, "delegate");
2766
2064
 
2767
- // src/bridge/api-error-handler.ts
2768
- var DEFAULT_MAX_ATTEMPTS = 3;
2769
- async function runWithApiErrorHandling(thunk, policy) {
2770
- const maxAttempts = policy.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
2771
- let attempt = 0;
2772
- for (; ; ) {
2773
- attempt += 1;
2774
- try {
2775
- return await thunk();
2776
- } catch (error) {
2777
- const decision = await policy.processApiError({
2778
- error,
2779
- attempt
2780
- });
2781
- if (decision.retry && attempt < maxAttempts) continue;
2782
- if (!decision.retry && "fallback" in decision && decision.fallback !== void 0) {
2783
- return decision.fallback;
2784
- }
2785
- throw error;
2786
- }
2787
- }
2788
- }
2789
- __name(runWithApiErrorHandling, "runWithApiErrorHandling");
2790
- function createApiErrorHandler(policy) {
2791
- return (thunk) => runWithApiErrorHandling(thunk, policy);
2792
- }
2793
- __name(createApiErrorHandler, "createApiErrorHandler");
2794
-
2795
2065
  // src/bridge/delegation-lifecycle.ts
2796
- import { TheokitAgentError as TheokitAgentError4 } from "@theokit/sdk/errors";
2797
- var DelegationTimeoutError = class extends TheokitAgentError4 {
2066
+ import { TheokitAgentError as TheokitAgentError3 } from "@theokit/sdk/errors";
2067
+ var DelegationTimeoutError = class extends TheokitAgentError3 {
2798
2068
  static {
2799
2069
  __name(this, "DelegationTimeoutError");
2800
2070
  }
@@ -2841,7 +2111,7 @@ __name(withEphemeralAgent, "withEphemeralAgent");
2841
2111
 
2842
2112
  // src/bridge/delegation-scoring.ts
2843
2113
  function isPort(target) {
2844
- return typeof target.run === "function";
2114
+ return "run" in target;
2845
2115
  }
2846
2116
  __name(isPort, "isPort");
2847
2117
  async function runOnce(target, message, delegateFn, opts) {
@@ -2904,360 +2174,9 @@ async function delegateWithScoring(subAgent, message, opts) {
2904
2174
  }
2905
2175
  __name(delegateWithScoring, "delegateWithScoring");
2906
2176
 
2907
- // src/bridge/mcp-resolver.ts
2908
- async function resolveMcpServers(selection, ctx) {
2909
- if (selection === void 0) return void 0;
2910
- if (typeof selection !== "function") return selection;
2911
- const resolved = await selection(ctx);
2912
- if (typeof resolved !== "object" || resolved === null) {
2913
- throw new Error("[@theokit/agents] MCP resolver must return an McpServersMap object");
2914
- }
2915
- return resolved;
2916
- }
2917
- __name(resolveMcpServers, "resolveMcpServers");
2918
- function mcpRegistry(config) {
2919
- const registry = config.registry;
2920
- if (registry === "composio") {
2921
- const apps = config.apps ?? [];
2922
- return {
2923
- composio: {
2924
- command: "npx",
2925
- args: [
2926
- "-y",
2927
- "@composio/mcp",
2928
- ...apps.length > 0 ? [
2929
- "--apps",
2930
- apps.join(",")
2931
- ] : []
2932
- ],
2933
- env: {
2934
- COMPOSIO_API_KEY: config.apiKey
2935
- }
2936
- }
2937
- };
2938
- }
2939
- if (registry === "mcp.run") {
2940
- return {
2941
- "mcp.run": {
2942
- command: "npx",
2943
- args: [
2944
- "-y",
2945
- "@mcp.run/cli",
2946
- "serve",
2947
- ...config.profile ? [
2948
- "--profile",
2949
- config.profile
2950
- ] : []
2951
- ],
2952
- env: {
2953
- MCP_RUN_API_KEY: config.apiKey
2954
- }
2955
- }
2956
- };
2957
- }
2958
- throw new Error(`mcpRegistry: unknown registry ${JSON.stringify(registry)} (supported: 'composio', 'mcp.run').`);
2959
- }
2960
- __name(mcpRegistry, "mcpRegistry");
2961
- function mcpToolApprovals(specs) {
2962
- const out = {};
2963
- for (const [tool, spec] of Object.entries(specs)) {
2964
- out[tool] = typeof spec === "string" ? {
2965
- question: spec
2966
- } : spec;
2967
- }
2968
- return out;
2969
- }
2970
- __name(mcpToolApprovals, "mcpToolApprovals");
2971
-
2972
- // src/bridge/mcp-file.ts
2973
- import { existsSync, readFileSync } from "fs";
2974
- import { join } from "path";
2975
- import { TheokitAgentError as TheokitAgentError5 } from "@theokit/sdk/errors";
2976
- function warningChannel(opts) {
2977
- return opts.onWarn ?? ((warning) => {
2978
- process.stderr.write(`[@theokit/agents] ${warning}
2979
- `);
2980
- });
2981
- }
2982
- __name(warningChannel, "warningChannel");
2983
- var McpFileError = class extends TheokitAgentError5 {
2984
- static {
2985
- __name(this, "McpFileError");
2986
- }
2987
- name = "McpFileError";
2988
- constructor(message) {
2989
- super(`[@theokit/agents] ${message}`);
2990
- }
2991
- };
2992
- var MCP_FILENAME = ".mcp.json";
2993
- function loadMcpJson(cwd, opts = {}) {
2994
- const path = join(cwd, MCP_FILENAME);
2995
- if (!existsSync(path)) return {};
2996
- let text;
2997
- try {
2998
- text = readFileSync(path, "utf8");
2999
- } catch (err) {
3000
- throw new McpFileError(`failed to read ${path}: ${describeIt(err)}`);
3001
- }
3002
- let parsed;
3003
- try {
3004
- parsed = JSON.parse(text);
3005
- } catch (err) {
3006
- throw new McpFileError(`${path} is not valid JSON: ${describeIt(err)}`);
3007
- }
3008
- return parseMcpJson(parsed, path, warningChannel(opts));
3009
- }
3010
- __name(loadMcpJson, "loadMcpJson");
3011
- function parseMcpJson(raw, source, onWarn) {
3012
- if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
3013
- throw new McpFileError(`${source}: root must be a JSON object with an "mcpServers" key.`);
3014
- }
3015
- const serversRaw = raw.mcpServers;
3016
- if (serversRaw === void 0) return {};
3017
- if (typeof serversRaw !== "object" || serversRaw === null || Array.isArray(serversRaw)) {
3018
- throw new McpFileError(`${source}: "mcpServers" must be an object keyed by server name.`);
3019
- }
3020
- const out = {};
3021
- for (const [name, entryRaw] of Object.entries(serversRaw)) {
3022
- const reason = validateEntry(name, entryRaw);
3023
- if (reason !== void 0) {
3024
- onWarn(`${source}: server "${name}" ignored \u2014 ${reason}`);
3025
- continue;
3026
- }
3027
- out[name] = buildEntry(entryRaw);
3028
- }
3029
- return out;
3030
- }
3031
- __name(parseMcpJson, "parseMcpJson");
3032
- function validateEntry(name, entryRaw) {
3033
- if (typeof entryRaw !== "object" || entryRaw === null || Array.isArray(entryRaw)) {
3034
- return "the entry must be an object.";
3035
- }
3036
- const entry = entryRaw;
3037
- const hasUrl = entry.url !== void 0;
3038
- const hasCommand = entry.command !== void 0;
3039
- if (hasUrl && hasCommand) return 'declares both "command" and "url" \u2014 pick one transport.';
3040
- if (!hasUrl && !hasCommand) return 'requires "command" (stdio) or "url" (http/sse).';
3041
- return hasUrl ? validateRemote(entry) : validateStdio(entry);
3042
- }
3043
- __name(validateEntry, "validateEntry");
3044
- function validateStdio(entry) {
3045
- if (typeof entry.command !== "string" || entry.command.length === 0) {
3046
- return 'field "command" must be a non-empty string.';
3047
- }
3048
- if (entry.args !== void 0 && !isStringArray(entry.args)) return 'field "args" must be an array of strings.';
3049
- if (entry.env !== void 0 && !isStringRecord(entry.env)) return 'field "env" must be a map of strings.';
3050
- if (entry.cwd !== void 0 && typeof entry.cwd !== "string") return 'field "cwd" must be a string.';
3051
- return void 0;
3052
- }
3053
- __name(validateStdio, "validateStdio");
3054
- function validateRemote(entry) {
3055
- if (typeof entry.url !== "string" || entry.url.length === 0) {
3056
- return 'field "url" must be a non-empty string.';
3057
- }
3058
- try {
3059
- new URL(entry.url);
3060
- } catch {
3061
- return 'field "url" is not a valid URL.';
3062
- }
3063
- if (entry.type !== void 0 && entry.type !== "http" && entry.type !== "sse") {
3064
- return 'field "type" must be "http" or "sse".';
3065
- }
3066
- if (entry.headers !== void 0 && !isStringRecord(entry.headers)) {
3067
- return 'field "headers" must be a map of strings.';
3068
- }
3069
- if (entry.requestTimeoutMs !== void 0 && typeof entry.requestTimeoutMs !== "number") {
3070
- return 'field "requestTimeoutMs" must be a number.';
3071
- }
3072
- return void 0;
3073
- }
3074
- __name(validateRemote, "validateRemote");
3075
- function buildEntry(entry) {
3076
- if (entry.url !== void 0) {
3077
- const remote = {
3078
- url: entry.url
3079
- };
3080
- if (entry.type !== void 0) remote.type = entry.type;
3081
- if (entry.headers !== void 0) remote.headers = entry.headers;
3082
- if (entry.auth !== void 0) remote.auth = entry.auth;
3083
- if (entry.requestTimeoutMs !== void 0) remote.requestTimeoutMs = entry.requestTimeoutMs;
3084
- return remote;
3085
- }
3086
- const stdio = {
3087
- command: entry.command
3088
- };
3089
- if (entry.args !== void 0) stdio.args = entry.args;
3090
- if (entry.env !== void 0) stdio.env = entry.env;
3091
- if (entry.cwd !== void 0) stdio.cwd = entry.cwd;
3092
- return stdio;
3093
- }
3094
- __name(buildEntry, "buildEntry");
3095
- function describeIt(err) {
3096
- return err instanceof Error ? err.message : String(err);
3097
- }
3098
- __name(describeIt, "describeIt");
3099
- function isStringArray(v) {
3100
- return Array.isArray(v) && v.every((x) => typeof x === "string");
3101
- }
3102
- __name(isStringArray, "isStringArray");
3103
- function isStringRecord(v) {
3104
- return typeof v === "object" && v !== null && !Array.isArray(v) && Object.values(v).every((x) => typeof x === "string");
3105
- }
3106
- __name(isStringRecord, "isStringRecord");
3107
-
3108
- // src/manifest/agent-manifest.ts
3109
- function generateAgentManifest(sources) {
3110
- return {
3111
- version: "1.0",
3112
- generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
3113
- agents: sources.map((r) => ({
3114
- name: r.agentConfig.name,
3115
- route: r.route,
3116
- model: r.agentConfig.model,
3117
- stream: r.agentConfig.stream ?? true,
3118
- mainLoop: {
3119
- method: String(r.mainLoop.propertyKey),
3120
- strategy: r.mainLoop.strategy
3121
- },
3122
- guards: r.guards.map((g) => g.name),
3123
- interceptors: r.interceptors.map((i) => i.name),
3124
- tools: r.toolboxes.flatMap((tb) => tb.tools.map((t) => ({
3125
- name: tb.namespace ? `${tb.namespace}.${t.config.name}` : t.config.name,
3126
- description: t.config.description,
3127
- risk: t.config.risk,
3128
- approval: t.approval !== void 0,
3129
- capabilities: t.capabilities,
3130
- trace: t.trace,
3131
- audit: t.audit
3132
- }))),
3133
- gateway: r.gateway ? {
3134
- platforms: r.gateway.platforms,
3135
- sessionStrategy: r.gateway.sessionStrategy ?? "per-user"
3136
- } : void 0,
3137
- subAgents: r.subAgentClasses.map((cls) => cls.name),
3138
- memory: r.memory ? {
3139
- provider: r.memory.provider ?? "built-in",
3140
- embeddings: r.memory.embeddings ?? false,
3141
- fts: r.memory.fts ?? false,
3142
- scope: r.memory.scope ?? "per-user"
3143
- } : void 0,
3144
- skills: r.skills?.include,
3145
- mcpServers: r.mcpServers ? Object.keys(r.mcpServers) : void 0
3146
- }))
3147
- };
3148
- }
3149
- __name(generateAgentManifest, "generateAgentManifest");
3150
-
3151
- // src/theokit-plugin.ts
3152
- function validateUniqueRoutes(results) {
3153
- const seen = /* @__PURE__ */ new Map();
3154
- for (const r of results) {
3155
- const existing = seen.get(r.route);
3156
- if (existing !== void 0) {
3157
- throw new Error(`[@theokit/agents] Duplicate agent route '${r.route}': both '${existing}' and '${r.agentConfig.name}' declare it.`);
3158
- }
3159
- seen.set(r.route, r.agentConfig.name);
3160
- }
3161
- }
3162
- __name(validateUniqueRoutes, "validateUniqueRoutes");
3163
- function agentsPlugin(opts) {
3164
- let routes = null;
3165
- return {
3166
- name: "@theokit/agents",
3167
- register(app) {
3168
- app.addHook("onRequest", async (pluginCtx) => {
3169
- routes ??= initRoutes(opts);
3170
- const request = pluginCtx.request;
3171
- const url = new URL(request.url);
3172
- const method = request.method.toUpperCase();
3173
- const matched = matchRoute(routes, method, url.pathname);
3174
- if (!matched) return;
3175
- return matched.handler(request);
3176
- });
3177
- }
3178
- };
3179
- }
3180
- __name(agentsPlugin, "agentsPlugin");
3181
- function initRoutes(opts) {
3182
- const allRoutes = [];
3183
- const routeIdentities = [];
3184
- for (const entry of opts.agents) {
3185
- routeIdentities.push({
3186
- route: entry.route,
3187
- agentConfig: {
3188
- name: entry.name
3189
- }
3190
- });
3191
- const createRun = opts.createRunFactory ? opts.createRunFactory(entry.compiled) : defaultCreateRun(entry.compiled);
3192
- allRoutes.push(...generateAgentRoutes({
3193
- walkResult: {
3194
- route: entry.route
3195
- },
3196
- compiledOptions: entry.compiled,
3197
- createRun
3198
- }));
3199
- }
3200
- validateUniqueRoutes(routeIdentities);
3201
- return compileRoutePatterns(allRoutes);
3202
- }
3203
- __name(initRoutes, "initRoutes");
3204
- function defaultCreateRun(compiled) {
3205
- return async function* (_message, _sessionId) {
3206
- await Promise.resolve();
3207
- yield {
3208
- type: "run_started",
3209
- runId: `run-${Date.now()}`,
3210
- agentName: compiled.model ?? "unknown"
3211
- };
3212
- yield {
3213
- type: "error",
3214
- code: "SDK_NOT_WIRED",
3215
- message: "No createRunFactory provided \u2014 wire @theokit/sdk Agent.create() to enable real agent execution.",
3216
- retryable: false
3217
- };
3218
- };
3219
- }
3220
- __name(defaultCreateRun, "defaultCreateRun");
3221
- function compileRoutePatterns(routes) {
3222
- return routes.map((r) => {
3223
- if (!r.path.includes(":")) return r;
3224
- const regexSource = r.path.replace(/:[^/]+/g, "[^/]+");
3225
- return {
3226
- ...r,
3227
- regex: RegExp(`^${regexSource}$`)
3228
- };
3229
- });
3230
- }
3231
- __name(compileRoutePatterns, "compileRoutePatterns");
3232
- function matchRoute(routes, method, pathname) {
3233
- return routes.find((r) => {
3234
- if (r.method !== method) return false;
3235
- if (r.regex) return r.regex.test(pathname);
3236
- return r.path === pathname;
3237
- });
3238
- }
3239
- __name(matchRoute, "matchRoute");
3240
-
3241
2177
  export {
3242
- ConfigurationError,
3243
- compileContextWindow,
3244
- compileSkills,
3245
- toolRuntimeName,
3246
- compileHitlGates,
3247
- compileTools,
3248
- createAgentExecutionContext,
3249
- isAgentContext,
3250
2178
  projectContextMetadataOnlyKnobs,
3251
2179
  compileProjectContext,
3252
- streamAgentResponse,
3253
- isTextDelta,
3254
- isToolCall,
3255
- isPartialToolCall,
3256
- isToolResult,
3257
- isDone,
3258
- isError,
3259
- isApprovalRequired,
3260
- generateAgentRoutes,
3261
2180
  GuardrailViolationError,
3262
2181
  CostBudgetExceededError,
3263
2182
  estimateTokens,
@@ -3269,6 +2188,7 @@ export {
3269
2188
  runInputGuards,
3270
2189
  runOutputGuards,
3271
2190
  moderateOutputStream,
2191
+ createHitlPlugin,
3272
2192
  createToolHooksPlugin,
3273
2193
  buildModelSelection,
3274
2194
  reasoningEffortOf,
@@ -3277,12 +2197,6 @@ export {
3277
2197
  extractThinkTagStream,
3278
2198
  createSdkAgentStream,
3279
2199
  toAgentFactory,
3280
- presentUIMessageStream,
3281
- ContextualTool,
3282
- AgentBuilder,
3283
- AgentDefinitionError,
3284
- compileAgentModule,
3285
- streamAgentUIMessages,
3286
2200
  DEFAULT_KEEP_TOKENS,
3287
2201
  compactionStrategyConfigSchema,
3288
2202
  resolveCompactionStrategy,
@@ -3302,19 +2216,11 @@ export {
3302
2216
  JudgeCredentialError,
3303
2217
  formatGoalEvent,
3304
2218
  delegate,
3305
- runWithApiErrorHandling,
3306
- createApiErrorHandler,
3307
2219
  DelegationTimeoutError,
3308
2220
  withClockCap,
3309
2221
  withEphemeralAgent,
2222
+ isPort,
3310
2223
  delegateBackground,
3311
- delegateWithScoring,
3312
- resolveMcpServers,
3313
- mcpRegistry,
3314
- mcpToolApprovals,
3315
- McpFileError,
3316
- loadMcpJson,
3317
- generateAgentManifest,
3318
- agentsPlugin
2224
+ delegateWithScoring
3319
2225
  };
3320
- //# sourceMappingURL=chunk-RZCNKKOG.js.map
2226
+ //# sourceMappingURL=chunk-W6TABP2S.js.map