@open-multi-agent/core 1.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.
Files changed (207) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +373 -0
  3. package/dist/agent/agent.d.ts +153 -0
  4. package/dist/agent/agent.d.ts.map +1 -0
  5. package/dist/agent/agent.js +559 -0
  6. package/dist/agent/agent.js.map +1 -0
  7. package/dist/agent/loop-detector.d.ts +39 -0
  8. package/dist/agent/loop-detector.d.ts.map +1 -0
  9. package/dist/agent/loop-detector.js +122 -0
  10. package/dist/agent/loop-detector.js.map +1 -0
  11. package/dist/agent/pool.d.ts +158 -0
  12. package/dist/agent/pool.d.ts.map +1 -0
  13. package/dist/agent/pool.js +320 -0
  14. package/dist/agent/pool.js.map +1 -0
  15. package/dist/agent/runner.d.ts +242 -0
  16. package/dist/agent/runner.d.ts.map +1 -0
  17. package/dist/agent/runner.js +943 -0
  18. package/dist/agent/runner.js.map +1 -0
  19. package/dist/agent/structured-output.d.ts +33 -0
  20. package/dist/agent/structured-output.d.ts.map +1 -0
  21. package/dist/agent/structured-output.js +116 -0
  22. package/dist/agent/structured-output.js.map +1 -0
  23. package/dist/cli/oma.d.ts +30 -0
  24. package/dist/cli/oma.d.ts.map +1 -0
  25. package/dist/cli/oma.js +433 -0
  26. package/dist/cli/oma.js.map +1 -0
  27. package/dist/dashboard/layout-tasks.d.ts +23 -0
  28. package/dist/dashboard/layout-tasks.d.ts.map +1 -0
  29. package/dist/dashboard/layout-tasks.js +79 -0
  30. package/dist/dashboard/layout-tasks.js.map +1 -0
  31. package/dist/dashboard/render-team-run-dashboard.d.ts +11 -0
  32. package/dist/dashboard/render-team-run-dashboard.d.ts.map +1 -0
  33. package/dist/dashboard/render-team-run-dashboard.js +456 -0
  34. package/dist/dashboard/render-team-run-dashboard.js.map +1 -0
  35. package/dist/errors.d.ts +14 -0
  36. package/dist/errors.d.ts.map +1 -0
  37. package/dist/errors.js +20 -0
  38. package/dist/errors.js.map +1 -0
  39. package/dist/index.d.ts +79 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +92 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/llm/adapter.d.ts +54 -0
  44. package/dist/llm/adapter.d.ts.map +1 -0
  45. package/dist/llm/adapter.js +101 -0
  46. package/dist/llm/adapter.js.map +1 -0
  47. package/dist/llm/anthropic.d.ts +57 -0
  48. package/dist/llm/anthropic.d.ts.map +1 -0
  49. package/dist/llm/anthropic.js +432 -0
  50. package/dist/llm/anthropic.js.map +1 -0
  51. package/dist/llm/azure-openai.d.ts +74 -0
  52. package/dist/llm/azure-openai.d.ts.map +1 -0
  53. package/dist/llm/azure-openai.js +267 -0
  54. package/dist/llm/azure-openai.js.map +1 -0
  55. package/dist/llm/bedrock.d.ts +41 -0
  56. package/dist/llm/bedrock.d.ts.map +1 -0
  57. package/dist/llm/bedrock.js +345 -0
  58. package/dist/llm/bedrock.js.map +1 -0
  59. package/dist/llm/copilot.d.ts +92 -0
  60. package/dist/llm/copilot.d.ts.map +1 -0
  61. package/dist/llm/copilot.js +433 -0
  62. package/dist/llm/copilot.js.map +1 -0
  63. package/dist/llm/deepseek.d.ts +21 -0
  64. package/dist/llm/deepseek.d.ts.map +1 -0
  65. package/dist/llm/deepseek.js +24 -0
  66. package/dist/llm/deepseek.js.map +1 -0
  67. package/dist/llm/gemini.d.ts +65 -0
  68. package/dist/llm/gemini.d.ts.map +1 -0
  69. package/dist/llm/gemini.js +427 -0
  70. package/dist/llm/gemini.js.map +1 -0
  71. package/dist/llm/grok.d.ts +21 -0
  72. package/dist/llm/grok.d.ts.map +1 -0
  73. package/dist/llm/grok.js +24 -0
  74. package/dist/llm/grok.js.map +1 -0
  75. package/dist/llm/minimax.d.ts +21 -0
  76. package/dist/llm/minimax.d.ts.map +1 -0
  77. package/dist/llm/minimax.js +24 -0
  78. package/dist/llm/minimax.js.map +1 -0
  79. package/dist/llm/openai-common.d.ts +65 -0
  80. package/dist/llm/openai-common.d.ts.map +1 -0
  81. package/dist/llm/openai-common.js +286 -0
  82. package/dist/llm/openai-common.js.map +1 -0
  83. package/dist/llm/openai.d.ts +63 -0
  84. package/dist/llm/openai.d.ts.map +1 -0
  85. package/dist/llm/openai.js +256 -0
  86. package/dist/llm/openai.js.map +1 -0
  87. package/dist/llm/qiniu.d.ts +21 -0
  88. package/dist/llm/qiniu.d.ts.map +1 -0
  89. package/dist/llm/qiniu.js +24 -0
  90. package/dist/llm/qiniu.js.map +1 -0
  91. package/dist/mcp.d.ts +3 -0
  92. package/dist/mcp.d.ts.map +1 -0
  93. package/dist/mcp.js +2 -0
  94. package/dist/mcp.js.map +1 -0
  95. package/dist/memory/shared.d.ts +162 -0
  96. package/dist/memory/shared.d.ts.map +1 -0
  97. package/dist/memory/shared.js +294 -0
  98. package/dist/memory/shared.js.map +1 -0
  99. package/dist/memory/store.d.ts +72 -0
  100. package/dist/memory/store.d.ts.map +1 -0
  101. package/dist/memory/store.js +121 -0
  102. package/dist/memory/store.js.map +1 -0
  103. package/dist/orchestrator/orchestrator.d.ts +245 -0
  104. package/dist/orchestrator/orchestrator.d.ts.map +1 -0
  105. package/dist/orchestrator/orchestrator.js +1400 -0
  106. package/dist/orchestrator/orchestrator.js.map +1 -0
  107. package/dist/orchestrator/scheduler.d.ts +112 -0
  108. package/dist/orchestrator/scheduler.d.ts.map +1 -0
  109. package/dist/orchestrator/scheduler.js +256 -0
  110. package/dist/orchestrator/scheduler.js.map +1 -0
  111. package/dist/task/queue.d.ts +191 -0
  112. package/dist/task/queue.d.ts.map +1 -0
  113. package/dist/task/queue.js +408 -0
  114. package/dist/task/queue.js.map +1 -0
  115. package/dist/task/task.d.ts +90 -0
  116. package/dist/task/task.d.ts.map +1 -0
  117. package/dist/task/task.js +206 -0
  118. package/dist/task/task.js.map +1 -0
  119. package/dist/team/messaging.d.ts +106 -0
  120. package/dist/team/messaging.d.ts.map +1 -0
  121. package/dist/team/messaging.js +183 -0
  122. package/dist/team/messaging.js.map +1 -0
  123. package/dist/team/team.d.ts +141 -0
  124. package/dist/team/team.d.ts.map +1 -0
  125. package/dist/team/team.js +293 -0
  126. package/dist/team/team.js.map +1 -0
  127. package/dist/tool/built-in/bash.d.ts +12 -0
  128. package/dist/tool/built-in/bash.d.ts.map +1 -0
  129. package/dist/tool/built-in/bash.js +133 -0
  130. package/dist/tool/built-in/bash.js.map +1 -0
  131. package/dist/tool/built-in/delegate.d.ts +29 -0
  132. package/dist/tool/built-in/delegate.d.ts.map +1 -0
  133. package/dist/tool/built-in/delegate.js +92 -0
  134. package/dist/tool/built-in/delegate.js.map +1 -0
  135. package/dist/tool/built-in/file-edit.d.ts +14 -0
  136. package/dist/tool/built-in/file-edit.d.ts.map +1 -0
  137. package/dist/tool/built-in/file-edit.js +130 -0
  138. package/dist/tool/built-in/file-edit.js.map +1 -0
  139. package/dist/tool/built-in/file-read.d.ts +12 -0
  140. package/dist/tool/built-in/file-read.d.ts.map +1 -0
  141. package/dist/tool/built-in/file-read.js +82 -0
  142. package/dist/tool/built-in/file-read.js.map +1 -0
  143. package/dist/tool/built-in/file-write.d.ts +11 -0
  144. package/dist/tool/built-in/file-write.d.ts.map +1 -0
  145. package/dist/tool/built-in/file-write.js +70 -0
  146. package/dist/tool/built-in/file-write.js.map +1 -0
  147. package/dist/tool/built-in/fs-walk.d.ts +23 -0
  148. package/dist/tool/built-in/fs-walk.d.ts.map +1 -0
  149. package/dist/tool/built-in/fs-walk.js +78 -0
  150. package/dist/tool/built-in/fs-walk.js.map +1 -0
  151. package/dist/tool/built-in/glob.d.ts +12 -0
  152. package/dist/tool/built-in/glob.d.ts.map +1 -0
  153. package/dist/tool/built-in/glob.js +82 -0
  154. package/dist/tool/built-in/glob.js.map +1 -0
  155. package/dist/tool/built-in/grep.d.ts +15 -0
  156. package/dist/tool/built-in/grep.d.ts.map +1 -0
  157. package/dist/tool/built-in/grep.js +218 -0
  158. package/dist/tool/built-in/grep.js.map +1 -0
  159. package/dist/tool/built-in/index.d.ts +48 -0
  160. package/dist/tool/built-in/index.d.ts.map +1 -0
  161. package/dist/tool/built-in/index.js +56 -0
  162. package/dist/tool/built-in/index.js.map +1 -0
  163. package/dist/tool/executor.d.ts +100 -0
  164. package/dist/tool/executor.d.ts.map +1 -0
  165. package/dist/tool/executor.js +184 -0
  166. package/dist/tool/executor.js.map +1 -0
  167. package/dist/tool/framework.d.ts +167 -0
  168. package/dist/tool/framework.d.ts.map +1 -0
  169. package/dist/tool/framework.js +402 -0
  170. package/dist/tool/framework.js.map +1 -0
  171. package/dist/tool/mcp.d.ts +31 -0
  172. package/dist/tool/mcp.d.ts.map +1 -0
  173. package/dist/tool/mcp.js +175 -0
  174. package/dist/tool/mcp.js.map +1 -0
  175. package/dist/tool/text-tool-extractor.d.ts +32 -0
  176. package/dist/tool/text-tool-extractor.d.ts.map +1 -0
  177. package/dist/tool/text-tool-extractor.js +195 -0
  178. package/dist/tool/text-tool-extractor.js.map +1 -0
  179. package/dist/types.d.ts +916 -0
  180. package/dist/types.d.ts.map +1 -0
  181. package/dist/types.js +8 -0
  182. package/dist/types.js.map +1 -0
  183. package/dist/utils/keywords.d.ts +18 -0
  184. package/dist/utils/keywords.d.ts.map +1 -0
  185. package/dist/utils/keywords.js +32 -0
  186. package/dist/utils/keywords.js.map +1 -0
  187. package/dist/utils/semaphore.d.ts +49 -0
  188. package/dist/utils/semaphore.d.ts.map +1 -0
  189. package/dist/utils/semaphore.js +89 -0
  190. package/dist/utils/semaphore.js.map +1 -0
  191. package/dist/utils/tokens.d.ts +7 -0
  192. package/dist/utils/tokens.d.ts.map +1 -0
  193. package/dist/utils/tokens.js +30 -0
  194. package/dist/utils/tokens.js.map +1 -0
  195. package/dist/utils/trace.d.ts +12 -0
  196. package/dist/utils/trace.d.ts.map +1 -0
  197. package/dist/utils/trace.js +30 -0
  198. package/dist/utils/trace.js.map +1 -0
  199. package/docs/DECISIONS.md +49 -0
  200. package/docs/cli.md +265 -0
  201. package/docs/context-management.md +24 -0
  202. package/docs/featured-partner.md +28 -0
  203. package/docs/observability.md +56 -0
  204. package/docs/providers.md +78 -0
  205. package/docs/shared-memory.md +27 -0
  206. package/docs/tool-configuration.md +152 -0
  207. package/package.json +96 -0
@@ -0,0 +1,175 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from './framework.js';
3
+ const DEFAULT_MCP_REQUEST_TIMEOUT_MS = 60_000;
4
+ async function loadMCPModules() {
5
+ const [{ Client }, { StdioClientTransport }] = await Promise.all([
6
+ import('@modelcontextprotocol/sdk/client/index.js'),
7
+ import('@modelcontextprotocol/sdk/client/stdio.js'),
8
+ ]);
9
+ return { Client, StdioClientTransport };
10
+ }
11
+ /**
12
+ * Build an LLM-safe tool name: MCP and prior examples used `prefix/name`, but
13
+ * Anthropic and other providers reject `/` in tool names.
14
+ */
15
+ function normalizeToolName(rawName, namePrefix) {
16
+ const trimmedPrefix = namePrefix?.trim();
17
+ const base = trimmedPrefix !== undefined && trimmedPrefix !== ''
18
+ ? `${trimmedPrefix}_${rawName}`
19
+ : rawName;
20
+ return base.replace(/\//g, '_');
21
+ }
22
+ /** MCP `tools/list` JSON Schema; forwarded to the LLM as-is (runtime validation stays `z.any()`). */
23
+ function mcpLlmInputSchema(schema) {
24
+ if (schema !== undefined && typeof schema === 'object' && !Array.isArray(schema)) {
25
+ return schema;
26
+ }
27
+ return { type: 'object' };
28
+ }
29
+ function contentBlockToText(block) {
30
+ const typ = block.type;
31
+ if (typ === 'text' && typeof block.text === 'string') {
32
+ return block.text;
33
+ }
34
+ if (typ === 'image' && typeof block.data === 'string') {
35
+ const mime = typeof block.mimeType === 'string' ? block.mimeType : 'image/*';
36
+ return `[image ${mime}; base64 length=${block.data.length}]`;
37
+ }
38
+ if (typ === 'audio' && typeof block.data === 'string') {
39
+ const mime = typeof block.mimeType === 'string' ? block.mimeType : 'audio/*';
40
+ return `[audio ${mime}; base64 length=${block.data.length}]`;
41
+ }
42
+ if (typ === 'resource' &&
43
+ block.resource !== null &&
44
+ typeof block.resource === 'object') {
45
+ const r = block.resource;
46
+ const uri = typeof r.uri === 'string' ? r.uri : '';
47
+ if (typeof r.text === 'string') {
48
+ return `[resource ${uri}]\n${r.text}`;
49
+ }
50
+ if (typeof r.blob === 'string') {
51
+ const mime = typeof r.mimeType === 'string' ? r.mimeType : '';
52
+ return `[resource ${uri}; mimeType=${mime}; blob base64 length=${r.blob.length}]`;
53
+ }
54
+ return `[resource ${uri}]`;
55
+ }
56
+ if (typ === 'resource_link') {
57
+ const uri = typeof block.uri === 'string' ? block.uri : '';
58
+ const name = typeof block.name === 'string' ? block.name : '';
59
+ const desc = typeof block.description === 'string' ? block.description : '';
60
+ const head = `[resource_link name=${JSON.stringify(name)} uri=${JSON.stringify(uri)}]`;
61
+ return desc === '' ? head : `${head}\n${desc}`;
62
+ }
63
+ return undefined;
64
+ }
65
+ function toToolResultData(result) {
66
+ if ('toolResult' in result && result.toolResult !== undefined) {
67
+ try {
68
+ return JSON.stringify(result.toolResult, null, 2);
69
+ }
70
+ catch {
71
+ return String(result.toolResult);
72
+ }
73
+ }
74
+ const lines = [];
75
+ for (const block of result.content ?? []) {
76
+ if (block === null || typeof block !== 'object')
77
+ continue;
78
+ const rec = block;
79
+ const line = contentBlockToText(rec);
80
+ if (line !== undefined) {
81
+ lines.push(line);
82
+ continue;
83
+ }
84
+ try {
85
+ lines.push(`[${String(rec.type ?? 'unknown')}]\n${JSON.stringify(rec, null, 2)}`);
86
+ }
87
+ catch {
88
+ lines.push('[mcp content block]');
89
+ }
90
+ }
91
+ if (lines.length > 0) {
92
+ return lines.join('\n');
93
+ }
94
+ if (result.structuredContent !== undefined) {
95
+ try {
96
+ return JSON.stringify(result.structuredContent, null, 2);
97
+ }
98
+ catch {
99
+ return String(result.structuredContent);
100
+ }
101
+ }
102
+ try {
103
+ return JSON.stringify(result);
104
+ }
105
+ catch {
106
+ return 'MCP tool completed with non-text output.';
107
+ }
108
+ }
109
+ async function listAllMcpTools(client, requestOpts) {
110
+ const acc = [];
111
+ let cursor;
112
+ do {
113
+ const page = await client.listTools(cursor !== undefined ? { cursor } : {}, requestOpts);
114
+ acc.push(...(page.tools ?? []));
115
+ cursor =
116
+ typeof page.nextCursor === 'string' && page.nextCursor !== ''
117
+ ? page.nextCursor
118
+ : undefined;
119
+ } while (cursor !== undefined);
120
+ return acc;
121
+ }
122
+ /**
123
+ * Connect to an MCP server over stdio and convert exposed MCP tools into
124
+ * open-multi-agent ToolDefinitions.
125
+ */
126
+ export async function connectMCPTools(config) {
127
+ const { Client, StdioClientTransport } = await loadMCPModules();
128
+ const transport = new StdioClientTransport({
129
+ command: config.command,
130
+ args: config.args ?? [],
131
+ env: config.env,
132
+ cwd: config.cwd,
133
+ });
134
+ const client = new Client({
135
+ name: config.clientName ?? 'open-multi-agent',
136
+ version: config.clientVersion ?? '0.0.0',
137
+ }, { capabilities: {} });
138
+ const requestOpts = {
139
+ timeout: config.requestTimeoutMs ?? DEFAULT_MCP_REQUEST_TIMEOUT_MS,
140
+ };
141
+ await client.connect(transport, requestOpts);
142
+ const mcpTools = await listAllMcpTools(client, requestOpts);
143
+ const tools = mcpTools.map((tool) => defineTool({
144
+ name: normalizeToolName(tool.name, config.namePrefix),
145
+ description: tool.description ?? `MCP tool: ${tool.name}`,
146
+ inputSchema: z.any(),
147
+ llmInputSchema: mcpLlmInputSchema(tool.inputSchema),
148
+ execute: async (input) => {
149
+ try {
150
+ const result = await client.callTool({
151
+ name: tool.name,
152
+ arguments: input,
153
+ }, undefined, requestOpts);
154
+ return {
155
+ data: toToolResultData(result),
156
+ isError: result.isError === true,
157
+ };
158
+ }
159
+ catch (error) {
160
+ const message = error instanceof Error ? error.message : String(error);
161
+ return {
162
+ data: `MCP tool "${tool.name}" failed: ${message}`,
163
+ isError: true,
164
+ };
165
+ }
166
+ },
167
+ }));
168
+ return {
169
+ tools,
170
+ disconnect: async () => {
171
+ await client.close?.();
172
+ },
173
+ };
174
+ }
175
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/tool/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAqD3C,MAAM,8BAA8B,GAAG,MAAM,CAAA;AAE7C,KAAK,UAAU,cAAc;IAC3B,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,oBAAoB,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/D,MAAM,CAAC,2CAA2C,CAEhD;QACF,MAAM,CAAC,2CAA2C,CAEhD;KACH,CAAC,CAAA;IACF,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAA;AACzC,CAAC;AA4BD;;;GAGG;AACH,SAAS,iBAAiB,CAAC,OAAe,EAAE,UAAmB;IAC7D,MAAM,aAAa,GAAG,UAAU,EAAE,IAAI,EAAE,CAAA;IACxC,MAAM,IAAI,GACR,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,EAAE;QACjD,CAAC,CAAC,GAAG,aAAa,IAAI,OAAO,EAAE;QAC/B,CAAC,CAAC,OAAO,CAAA;IACb,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AACjC,CAAC;AAED,qGAAqG;AACrG,SAAS,iBAAiB,CACxB,MAA2C;IAE3C,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACjF,OAAO,MAAM,CAAA;IACf,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;AAC3B,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA8B;IACxD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAA;IACtB,IAAI,GAAG,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrD,OAAO,KAAK,CAAC,IAAI,CAAA;IACnB,CAAC;IACD,IAAI,GAAG,KAAK,OAAO,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtD,MAAM,IAAI,GACR,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;QACjE,OAAO,UAAU,IAAI,mBAAmB,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAA;IAC9D,CAAC;IACD,IAAI,GAAG,KAAK,OAAO,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtD,MAAM,IAAI,GACR,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;QACjE,OAAO,UAAU,IAAI,mBAAmB,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAA;IAC9D,CAAC;IACD,IACE,GAAG,KAAK,UAAU;QAClB,KAAK,CAAC,QAAQ,KAAK,IAAI;QACvB,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAClC,CAAC;QACD,MAAM,CAAC,GAAG,KAAK,CAAC,QAAmC,CAAA;QACnD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;QAClD,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,aAAa,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;QACvC,CAAC;QACD,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;YAC7D,OAAO,aAAa,GAAG,cAAc,IAAI,wBAAwB,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAA;QACnF,CAAC;QACD,OAAO,aAAa,GAAG,GAAG,CAAA;IAC5B,CAAC;IACD,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;QAC1D,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QAC7D,MAAM,IAAI,GACR,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAA;QAChE,MAAM,IAAI,GAAG,uBAAuB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAA;QACtF,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,EAAE,CAAA;IAChD,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,MAA2B;IACnD,IAAI,YAAY,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QAC9D,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAQ;QACzD,MAAM,GAAG,GAAG,KAAgC,CAAA;QAC5C,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;QACpC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChB,SAAQ;QACV,CAAC;QACD,IAAI,CAAC;YACH,KAAK,CAAC,IAAI,CACR,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CACtE,CAAA;QACH,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;QACnC,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,0CAA0C,CAAA;IACnD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,MAAqB,EACrB,WAAgC;IAEhC,MAAM,GAAG,GAAwB,EAAE,CAAA;IACnC,IAAI,MAA0B,CAAA;IAC9B,GAAG,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,SAAS,CACjC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EACtC,WAAW,CACZ,CAAA;QACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAA;QAC/B,MAAM;YACJ,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,KAAK,EAAE;gBAC3D,CAAC,CAAC,IAAI,CAAC,UAAU;gBACjB,CAAC,CAAC,SAAS,CAAA;IACjB,CAAC,QAAQ,MAAM,KAAK,SAAS,EAAC;IAC9B,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAA6B;IAE7B,MAAM,EAAE,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,cAAc,EAAE,CAAA;IAE/D,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC;QACzC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;QACvB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,EAAE,MAAM,CAAC,GAAG;KAChB,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,MAAM,CAAC,UAAU,IAAI,kBAAkB;QAC7C,OAAO,EAAE,MAAM,CAAC,aAAa,IAAI,OAAO;KACzC,EACD,EAAE,YAAY,EAAE,EAAE,EAAE,CACrB,CAAA;IAED,MAAM,WAAW,GAAG;QAClB,OAAO,EAAE,MAAM,CAAC,gBAAgB,IAAI,8BAA8B;KACnE,CAAA;IAED,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAE5C,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAE3D,MAAM,KAAK,GAAqB,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACpD,UAAU,CAAC;QACT,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC;QACrD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,aAAa,IAAI,CAAC,IAAI,EAAE;QACzD,WAAW,EAAE,CAAC,CAAC,GAAG,EAAE;QACpB,cAAc,EAAE,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;QACnD,OAAO,EAAE,KAAK,EAAE,KAA8B,EAAE,EAAE;YAChD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAClC;oBACE,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,SAAS,EAAE,KAAK;iBACjB,EACD,SAAS,EACT,WAAW,CACZ,CAAA;gBACD,OAAO;oBACL,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC;oBAC9B,OAAO,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI;iBACjC,CAAA;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBACxD,OAAO;oBACL,IAAI,EAAE,aAAa,IAAI,CAAC,IAAI,aAAa,OAAO,EAAE;oBAClD,OAAO,EAAE,IAAI;iBACd,CAAA;YACH,CAAC;QACH,CAAC;KACF,CAAC,CACH,CAAA;IAED,OAAO;QACL,KAAK;QACL,UAAU,EAAE,KAAK,IAAI,EAAE;YACrB,MAAM,MAAM,CAAC,KAAK,EAAE,EAAE,CAAA;QACxB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @fileoverview Fallback tool-call extractor for local models.
3
+ *
4
+ * When a local model (Ollama, vLLM, LM Studio) returns tool calls as plain
5
+ * text instead of using the OpenAI `tool_calls` wire format, this module
6
+ * attempts to extract them from the text output.
7
+ *
8
+ * Common scenarios:
9
+ * - Ollama thinking-model bug: tool call JSON ends up inside unclosed `<think>` tags
10
+ * - Model outputs raw JSON tool calls without the server parsing them
11
+ * - Model wraps tool calls in markdown code fences
12
+ * - Hermes-format `<tool_call>` tags
13
+ *
14
+ * This is a **safety net**, not the primary path. Native `tool_calls` from
15
+ * the server are always preferred.
16
+ */
17
+ import type { ToolUseBlock } from '../types.js';
18
+ /**
19
+ * Attempt to extract tool calls from a model's text output.
20
+ *
21
+ * Tries multiple strategies in order:
22
+ * 1. Hermes `<tool_call>` tags
23
+ * 2. JSON objects in text (bare or inside code fences)
24
+ *
25
+ * @param text - The model's text output.
26
+ * @param knownToolNames - Whitelist of registered tool names. When non-empty,
27
+ * only JSON objects whose `name` matches a known tool
28
+ * are treated as tool calls.
29
+ * @returns Extracted {@link ToolUseBlock}s, or an empty array if none found.
30
+ */
31
+ export declare function extractToolCallsFromText(text: string, knownToolNames: string[]): ToolUseBlock[];
32
+ //# sourceMappingURL=text-tool-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-tool-extractor.d.ts","sourceRoot":"","sources":["../../src/tool/text-tool-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AA4K/C;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EAAE,GACvB,YAAY,EAAE,CAoBhB"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * @fileoverview Fallback tool-call extractor for local models.
3
+ *
4
+ * When a local model (Ollama, vLLM, LM Studio) returns tool calls as plain
5
+ * text instead of using the OpenAI `tool_calls` wire format, this module
6
+ * attempts to extract them from the text output.
7
+ *
8
+ * Common scenarios:
9
+ * - Ollama thinking-model bug: tool call JSON ends up inside unclosed `<think>` tags
10
+ * - Model outputs raw JSON tool calls without the server parsing them
11
+ * - Model wraps tool calls in markdown code fences
12
+ * - Hermes-format `<tool_call>` tags
13
+ *
14
+ * This is a **safety net**, not the primary path. Native `tool_calls` from
15
+ * the server are always preferred.
16
+ */
17
+ // ---------------------------------------------------------------------------
18
+ // ID generation
19
+ // ---------------------------------------------------------------------------
20
+ let callCounter = 0;
21
+ /** Generate a unique tool-call ID for extracted calls. */
22
+ function generateToolCallId() {
23
+ return `extracted_call_${Date.now()}_${++callCounter}`;
24
+ }
25
+ // ---------------------------------------------------------------------------
26
+ // Internal parsers
27
+ // ---------------------------------------------------------------------------
28
+ /**
29
+ * Try to parse a single JSON object as a tool call.
30
+ *
31
+ * Accepted shapes:
32
+ * ```json
33
+ * { "name": "bash", "arguments": { "command": "ls" } }
34
+ * { "name": "bash", "parameters": { "command": "ls" } }
35
+ * { "function": { "name": "bash", "arguments": { "command": "ls" } } }
36
+ * ```
37
+ */
38
+ function parseToolCallJSON(json, knownToolNames) {
39
+ if (json === null || typeof json !== 'object' || Array.isArray(json)) {
40
+ return null;
41
+ }
42
+ const obj = json;
43
+ // Shape: { function: { name, arguments } }
44
+ if (typeof obj['function'] === 'object' && obj['function'] !== null) {
45
+ const fn = obj['function'];
46
+ return parseFlat(fn, knownToolNames);
47
+ }
48
+ // Shape: { name, arguments|parameters }
49
+ return parseFlat(obj, knownToolNames);
50
+ }
51
+ function parseFlat(obj, knownToolNames) {
52
+ const name = obj['name'];
53
+ if (typeof name !== 'string' || name.length === 0)
54
+ return null;
55
+ // Whitelist check — don't treat arbitrary JSON as a tool call
56
+ if (knownToolNames.size > 0 && !knownToolNames.has(name))
57
+ return null;
58
+ let input = {};
59
+ const args = obj['arguments'] ?? obj['parameters'] ?? obj['input'];
60
+ if (args !== null && args !== undefined) {
61
+ if (typeof args === 'string') {
62
+ try {
63
+ const parsed = JSON.parse(args);
64
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
65
+ input = parsed;
66
+ }
67
+ }
68
+ catch {
69
+ // Malformed — use empty input
70
+ }
71
+ }
72
+ else if (typeof args === 'object' && !Array.isArray(args)) {
73
+ input = args;
74
+ }
75
+ }
76
+ return {
77
+ type: 'tool_use',
78
+ id: generateToolCallId(),
79
+ name,
80
+ input,
81
+ };
82
+ }
83
+ // ---------------------------------------------------------------------------
84
+ // JSON extraction from text
85
+ // ---------------------------------------------------------------------------
86
+ /**
87
+ * Find all top-level JSON objects in a string by tracking brace depth.
88
+ * Returns the parsed objects (not sub-objects).
89
+ */
90
+ function extractJSONObjects(text) {
91
+ const results = [];
92
+ let depth = 0;
93
+ let start = -1;
94
+ let inString = false;
95
+ let escape = false;
96
+ for (let i = 0; i < text.length; i++) {
97
+ const ch = text[i];
98
+ if (escape) {
99
+ escape = false;
100
+ continue;
101
+ }
102
+ if (ch === '\\' && inString) {
103
+ escape = true;
104
+ continue;
105
+ }
106
+ if (ch === '"') {
107
+ inString = !inString;
108
+ continue;
109
+ }
110
+ if (inString)
111
+ continue;
112
+ if (ch === '{') {
113
+ if (depth === 0)
114
+ start = i;
115
+ depth++;
116
+ }
117
+ else if (ch === '}') {
118
+ // Stray `}` outside any open object (e.g. prose like "use ${var}" where
119
+ // the `${` was prefix-truncated, or a model quoting unbalanced text).
120
+ // Ignoring it keeps depth non-negative — otherwise the `depth === 0`
121
+ // anchor for the next `{` would never re-fire, and any later valid JSON
122
+ // tool calls would be skipped (or the inner sub-object extracted in
123
+ // their place, which has no `name` field and is silently rejected).
124
+ if (depth === 0)
125
+ continue;
126
+ depth--;
127
+ if (depth === 0 && start !== -1) {
128
+ const candidate = text.slice(start, i + 1);
129
+ try {
130
+ results.push(JSON.parse(candidate));
131
+ }
132
+ catch {
133
+ // Not valid JSON — skip
134
+ }
135
+ start = -1;
136
+ }
137
+ }
138
+ }
139
+ return results;
140
+ }
141
+ // ---------------------------------------------------------------------------
142
+ // Hermes format: <tool_call>...</tool_call>
143
+ // ---------------------------------------------------------------------------
144
+ function extractHermesToolCalls(text, knownToolNames) {
145
+ const results = [];
146
+ for (const match of text.matchAll(/<tool_call>\s*([\s\S]*?)\s*<\/tool_call>/g)) {
147
+ const inner = match[1].trim();
148
+ try {
149
+ const parsed = JSON.parse(inner);
150
+ const block = parseToolCallJSON(parsed, knownToolNames);
151
+ if (block !== null)
152
+ results.push(block);
153
+ }
154
+ catch {
155
+ // Malformed hermes content — skip
156
+ }
157
+ }
158
+ return results;
159
+ }
160
+ // ---------------------------------------------------------------------------
161
+ // Public API
162
+ // ---------------------------------------------------------------------------
163
+ /**
164
+ * Attempt to extract tool calls from a model's text output.
165
+ *
166
+ * Tries multiple strategies in order:
167
+ * 1. Hermes `<tool_call>` tags
168
+ * 2. JSON objects in text (bare or inside code fences)
169
+ *
170
+ * @param text - The model's text output.
171
+ * @param knownToolNames - Whitelist of registered tool names. When non-empty,
172
+ * only JSON objects whose `name` matches a known tool
173
+ * are treated as tool calls.
174
+ * @returns Extracted {@link ToolUseBlock}s, or an empty array if none found.
175
+ */
176
+ export function extractToolCallsFromText(text, knownToolNames) {
177
+ if (text.length === 0)
178
+ return [];
179
+ const nameSet = new Set(knownToolNames);
180
+ // Strategy 1: Hermes format
181
+ const hermesResults = extractHermesToolCalls(text, nameSet);
182
+ if (hermesResults.length > 0)
183
+ return hermesResults;
184
+ // Strategy 2: Strip code fences, then extract JSON objects
185
+ const stripped = text.replace(/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/g, '$1');
186
+ const jsonObjects = extractJSONObjects(stripped);
187
+ const results = [];
188
+ for (const obj of jsonObjects) {
189
+ const block = parseToolCallJSON(obj, nameSet);
190
+ if (block !== null)
191
+ results.push(block);
192
+ }
193
+ return results;
194
+ }
195
+ //# sourceMappingURL=text-tool-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-tool-extractor.js","sourceRoot":"","sources":["../../src/tool/text-tool-extractor.ts"],"names":[],"mappings":"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"}