@noodleseed/one 0.89.0 → 0.90.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 (180) hide show
  1. package/README.md +193 -0
  2. package/dist/commands/billing-enforcement-activation-ops.js +1 -11
  3. package/dist/commands/billing-enforcement-activation-ops.js.map +1 -1
  4. package/dist/commands/billing-enforcement-ops.js +1 -11
  5. package/dist/commands/billing-enforcement-ops.js.map +1 -1
  6. package/dist/commands/billing-metering-ops.js +1 -11
  7. package/dist/commands/billing-metering-ops.js.map +1 -1
  8. package/dist/commands/billing-metering-validation-ops.js +1 -11
  9. package/dist/commands/billing-metering-validation-ops.js.map +1 -1
  10. package/dist/commands/billing-read-ops.js +1 -11
  11. package/dist/commands/billing-read-ops.js.map +1 -1
  12. package/dist/commands/billing-stripe-ops.js +1 -11
  13. package/dist/commands/billing-stripe-ops.js.map +1 -1
  14. package/dist/commands/org-admin.d.ts +6 -0
  15. package/dist/commands/org-admin.d.ts.map +1 -1
  16. package/dist/commands/org-admin.js +1 -29
  17. package/dist/commands/org-admin.js.map +1 -1
  18. package/dist/commands/org-domains.js +1 -22
  19. package/dist/commands/org-domains.js.map +1 -1
  20. package/dist/commands/org-member-args.d.ts +1 -1
  21. package/dist/commands/org-member-args.d.ts.map +1 -1
  22. package/dist/commands/org-member-args.js +1 -10
  23. package/dist/commands/org-member-args.js.map +1 -1
  24. package/dist/commands/org-openai-challenge.js +1 -22
  25. package/dist/commands/org-openai-challenge.js.map +1 -1
  26. package/dist/commands/platform-account-reset-args.d.ts.map +1 -1
  27. package/dist/commands/platform-account-reset-args.js +1 -6
  28. package/dist/commands/platform-account-reset-args.js.map +1 -1
  29. package/dist/commands/platform-account-reset-ops.js +1 -11
  30. package/dist/commands/platform-account-reset-ops.js.map +1 -1
  31. package/dist/commands/platform-auth-migration-args.d.ts +2 -0
  32. package/dist/commands/platform-auth-migration-args.d.ts.map +1 -1
  33. package/dist/commands/platform-auth-migration-args.js +2 -1
  34. package/dist/commands/platform-auth-migration-args.js.map +1 -1
  35. package/dist/commands/platform-auth-migration-ops.js +1 -11
  36. package/dist/commands/platform-auth-migration-ops.js.map +1 -1
  37. package/dist/commands/shared.d.ts +6 -0
  38. package/dist/commands/shared.d.ts.map +1 -1
  39. package/dist/commands/shared.js +34 -0
  40. package/dist/commands/shared.js.map +1 -1
  41. package/dist/deploy.d.ts +2 -0
  42. package/dist/deploy.d.ts.map +1 -1
  43. package/dist/deploy.js +4 -4
  44. package/dist/deploy.js.map +1 -1
  45. package/dist/dev.d.ts.map +1 -1
  46. package/dist/dev.js +1 -7
  47. package/dist/dev.js.map +1 -1
  48. package/dist/devtools-brand.d.ts +14 -0
  49. package/dist/devtools-brand.d.ts.map +1 -0
  50. package/dist/devtools-brand.js +98 -0
  51. package/dist/devtools-brand.js.map +1 -0
  52. package/dist/devtools-chat-anthropic.d.ts +3 -0
  53. package/dist/devtools-chat-anthropic.d.ts.map +1 -0
  54. package/dist/devtools-chat-anthropic.js +75 -0
  55. package/dist/devtools-chat-anthropic.js.map +1 -0
  56. package/dist/devtools-chat-gemini.d.ts +3 -0
  57. package/dist/devtools-chat-gemini.d.ts.map +1 -0
  58. package/dist/devtools-chat-gemini.js +82 -0
  59. package/dist/devtools-chat-gemini.js.map +1 -0
  60. package/dist/devtools-chat-types.d.ts +64 -0
  61. package/dist/devtools-chat-types.d.ts.map +1 -0
  62. package/dist/devtools-chat-types.js +64 -0
  63. package/dist/devtools-chat-types.js.map +1 -0
  64. package/dist/devtools-chat.d.ts +7 -39
  65. package/dist/devtools-chat.d.ts.map +1 -1
  66. package/dist/devtools-chat.js +33 -48
  67. package/dist/devtools-chat.js.map +1 -1
  68. package/dist/devtools-copy-styles.d.ts +3 -0
  69. package/dist/devtools-copy-styles.d.ts.map +1 -0
  70. package/dist/devtools-copy-styles.js +54 -0
  71. package/dist/devtools-copy-styles.js.map +1 -0
  72. package/dist/devtools-design.d.ts +5 -0
  73. package/dist/devtools-design.d.ts.map +1 -0
  74. package/dist/devtools-design.js +62 -0
  75. package/dist/devtools-design.js.map +1 -0
  76. package/dist/devtools-harness.d.ts +2 -2
  77. package/dist/devtools-harness.d.ts.map +1 -1
  78. package/dist/devtools-harness.js +130 -216
  79. package/dist/devtools-harness.js.map +1 -1
  80. package/dist/devtools-json.d.ts +10 -0
  81. package/dist/devtools-json.d.ts.map +1 -0
  82. package/dist/devtools-json.js +23 -0
  83. package/dist/devtools-json.js.map +1 -0
  84. package/dist/devtools-preview-control-styles.d.ts +3 -0
  85. package/dist/devtools-preview-control-styles.d.ts.map +1 -0
  86. package/dist/devtools-preview-control-styles.js +207 -0
  87. package/dist/devtools-preview-control-styles.js.map +1 -0
  88. package/dist/devtools-preview.d.ts +7 -3
  89. package/dist/devtools-preview.d.ts.map +1 -1
  90. package/dist/devtools-preview.js +189 -43
  91. package/dist/devtools-preview.js.map +1 -1
  92. package/dist/devtools-provider-logos.d.ts +5 -0
  93. package/dist/devtools-provider-logos.d.ts.map +1 -0
  94. package/dist/devtools-provider-logos.js +5 -0
  95. package/dist/devtools-provider-logos.js.map +1 -0
  96. package/dist/devtools-responsive-styles.d.ts +3 -0
  97. package/dist/devtools-responsive-styles.d.ts.map +1 -0
  98. package/dist/devtools-responsive-styles.js +75 -0
  99. package/dist/devtools-responsive-styles.js.map +1 -0
  100. package/dist/devtools-styles.d.ts +3 -0
  101. package/dist/devtools-styles.d.ts.map +1 -0
  102. package/dist/devtools-styles.js +694 -0
  103. package/dist/devtools-styles.js.map +1 -0
  104. package/dist/local-target.d.ts.map +1 -1
  105. package/dist/local-target.js +1 -6
  106. package/dist/local-target.js.map +1 -1
  107. package/dist/plugin-mode/build-readiness-server.d.ts +4 -10
  108. package/dist/plugin-mode/build-readiness-server.d.ts.map +1 -1
  109. package/dist/plugin-mode/build-readiness-server.js +68 -67
  110. package/dist/plugin-mode/build-readiness-server.js.map +1 -1
  111. package/dist/plugin-mode/plugin-command-runner.d.ts +41 -0
  112. package/dist/plugin-mode/plugin-command-runner.d.ts.map +1 -0
  113. package/dist/plugin-mode/plugin-command-runner.js +122 -0
  114. package/dist/plugin-mode/plugin-command-runner.js.map +1 -0
  115. package/dist/plugin-mode/plugin-operation-contract.d.ts +237 -0
  116. package/dist/plugin-mode/plugin-operation-contract.d.ts.map +1 -0
  117. package/dist/plugin-mode/plugin-operation-contract.js +164 -0
  118. package/dist/plugin-mode/plugin-operation-contract.js.map +1 -0
  119. package/dist/plugin-mode/plugin-operation-tools.d.ts +20 -0
  120. package/dist/plugin-mode/plugin-operation-tools.d.ts.map +1 -0
  121. package/dist/plugin-mode/plugin-operation-tools.js +289 -0
  122. package/dist/plugin-mode/plugin-operation-tools.js.map +1 -0
  123. package/dist/preview-session.d.ts.map +1 -1
  124. package/dist/preview-session.js +22 -5
  125. package/dist/preview-session.js.map +1 -1
  126. package/dist/project.d.ts.map +1 -1
  127. package/dist/project.js +1 -7
  128. package/dist/project.js.map +1 -1
  129. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +1 -1
  130. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js.map +1 -1
  131. package/node_modules/@noodle-borg/agent-kit/dist/plugin-bundle.d.ts.map +1 -1
  132. package/node_modules/@noodle-borg/agent-kit/dist/plugin-bundle.js +16 -12
  133. package/node_modules/@noodle-borg/agent-kit/dist/plugin-bundle.js.map +1 -1
  134. package/node_modules/@noodle-borg/agent-kit/dist/plugin-marketplace-docs.js +9 -9
  135. package/node_modules/@noodle-borg/agent-kit/dist/skill-feedback-ref.js +4 -4
  136. package/node_modules/@noodle-borg/agent-kit/dist/skill-feedback-ref.js.map +1 -1
  137. package/node_modules/@noodle-borg/agent-kit/dist/skill-router.d.ts.map +1 -1
  138. package/node_modules/@noodle-borg/agent-kit/dist/skill-router.js +6 -3
  139. package/node_modules/@noodle-borg/agent-kit/dist/skill-router.js.map +1 -1
  140. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  141. package/node_modules/@noodle-borg/connector-defs/dist/index.d.ts +1 -1
  142. package/node_modules/@noodle-borg/connector-defs/dist/index.d.ts.map +1 -1
  143. package/node_modules/@noodle-borg/connector-defs/dist/index.js.map +1 -1
  144. package/node_modules/@noodle-borg/module-audit/dist/route.d.ts +0 -2
  145. package/node_modules/@noodle-borg/module-audit/dist/route.d.ts.map +1 -1
  146. package/node_modules/@noodle-borg/module-audit/dist/route.js +0 -4
  147. package/node_modules/@noodle-borg/module-audit/dist/route.js.map +1 -1
  148. package/node_modules/@noodle-borg/protocol/dist/input-validation.d.ts +0 -2
  149. package/node_modules/@noodle-borg/protocol/dist/input-validation.d.ts.map +1 -1
  150. package/node_modules/@noodle-borg/protocol/dist/input-validation.js +1 -5
  151. package/node_modules/@noodle-borg/protocol/dist/input-validation.js.map +1 -1
  152. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts +0 -2
  153. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts.map +1 -1
  154. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js +0 -7
  155. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js.map +1 -1
  156. package/node_modules/@noodle-borg/service/dist/credential-binding-index.d.ts +1 -3
  157. package/node_modules/@noodle-borg/service/dist/credential-binding-index.d.ts.map +1 -1
  158. package/node_modules/@noodle-borg/service/dist/credential-binding-index.js +1 -14
  159. package/node_modules/@noodle-borg/service/dist/credential-binding-index.js.map +1 -1
  160. package/node_modules/@noodle-borg/service/dist/index.d.ts +5 -5
  161. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  162. package/node_modules/@noodle-borg/service/dist/index.js +1 -1
  163. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  164. package/node_modules/@noodle-borg/service/dist/mcp-public-routing.d.ts +0 -2
  165. package/node_modules/@noodle-borg/service/dist/mcp-public-routing.d.ts.map +1 -1
  166. package/node_modules/@noodle-borg/service/dist/mcp-public-routing.js +0 -6
  167. package/node_modules/@noodle-borg/service/dist/mcp-public-routing.js.map +1 -1
  168. package/node_modules/@noodle-borg/service/dist/oauth/console-url.d.ts +2 -0
  169. package/node_modules/@noodle-borg/service/dist/oauth/console-url.d.ts.map +1 -0
  170. package/node_modules/@noodle-borg/service/dist/oauth/console-url.js +4 -0
  171. package/node_modules/@noodle-borg/service/dist/oauth/console-url.js.map +1 -0
  172. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.d.ts.map +1 -1
  173. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js +2 -1
  174. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js.map +1 -1
  175. package/node_modules/@noodle-borg/service/dist/registry-targets.d.ts +1 -3
  176. package/node_modules/@noodle-borg/service/dist/registry-targets.d.ts.map +1 -1
  177. package/node_modules/@noodle-borg/service/dist/registry-targets.js +0 -17
  178. package/node_modules/@noodle-borg/service/dist/registry-targets.js.map +1 -1
  179. package/node_modules/@noodle-borg/service/package.json +0 -1
  180. package/package.json +23 -1
@@ -0,0 +1,75 @@
1
+ import { completeTurn, DEFAULT_MAX_ITERATIONS, DEFAULT_REQUEST_TIMEOUT_MS, EMPTY_OBJECT_SCHEMA, limitTurn, providerFetch, requireDeclaredTool, resultText, validateToolArguments, visibleMessages, } from './devtools-chat-types.js';
2
+ const ANTHROPIC_DEFAULT_BASE = 'https://api.anthropic.com';
3
+ export async function runAnthropicChatTurn(input) {
4
+ const fetchImpl = input.fetchImpl ?? fetch;
5
+ const base = (input.baseUrl ?? ANTHROPIC_DEFAULT_BASE).replace(/\/+$/, '');
6
+ const maxIterations = input.maxIterations ?? DEFAULT_MAX_ITERATIONS;
7
+ const timeoutMs = input.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
8
+ const system = visibleMessages(input.messages)
9
+ .filter((message) => message.role === 'system')
10
+ .map((message) => message.content ?? '')
11
+ .join('\n\n');
12
+ const messages = visibleMessages(input.messages)
13
+ .filter((message) => message.role === 'user' || message.role === 'assistant')
14
+ .map((message) => ({ role: message.role, content: message.content ?? '' }));
15
+ const tools = input.tools.map((tool) => ({
16
+ name: tool.name,
17
+ ...(tool.description ? { description: tool.description } : {}),
18
+ input_schema: tool.inputSchema ?? EMPTY_OBJECT_SCHEMA,
19
+ }));
20
+ const byName = new Map(input.tools.map((tool) => [tool.name, tool]));
21
+ const toolCalls = [];
22
+ for (let iteration = 0; iteration < maxIterations; iteration += 1) {
23
+ const response = await providerFetch('Claude', fetchImpl, `${base}/v1/messages`, {
24
+ method: 'POST',
25
+ headers: {
26
+ 'content-type': 'application/json',
27
+ 'x-api-key': input.apiKey,
28
+ 'anthropic-version': '2023-06-01',
29
+ },
30
+ body: JSON.stringify({
31
+ model: input.model,
32
+ max_tokens: 4096,
33
+ ...(system ? { system } : {}),
34
+ messages,
35
+ ...(tools.length > 0 ? { tools } : {}),
36
+ }),
37
+ }, timeoutMs);
38
+ const data = (await response.json());
39
+ const content = data.content;
40
+ if (!Array.isArray(content))
41
+ throw new Error('Claude returned no content.');
42
+ const calls = content.filter((block) => block.type === 'tool_use' && typeof block.id === 'string' && typeof block.name === 'string');
43
+ if (calls.length === 0) {
44
+ const text = content
45
+ .filter((block) => block.type === 'text')
46
+ .map((block) => block.text ?? '')
47
+ .join('');
48
+ return completeTurn(input, text, toolCalls);
49
+ }
50
+ messages.push({ role: 'assistant', content });
51
+ const results = [];
52
+ for (const call of calls) {
53
+ const definition = requireDeclaredTool(byName, call.name);
54
+ const args = validateToolArguments(call.input ?? {});
55
+ const executed = await input.callTool(call.name, args);
56
+ toolCalls.push({
57
+ id: call.id,
58
+ name: call.name,
59
+ arguments: args,
60
+ result: executed.result,
61
+ isError: executed.isError,
62
+ ...(definition.resourceUri ? { resourceUri: definition.resourceUri } : {}),
63
+ });
64
+ results.push({
65
+ type: 'tool_result',
66
+ tool_use_id: call.id,
67
+ content: resultText(executed.result),
68
+ ...(executed.isError ? { is_error: true } : {}),
69
+ });
70
+ }
71
+ messages.push({ role: 'user', content: results });
72
+ }
73
+ return limitTurn(input, toolCalls);
74
+ }
75
+ //# sourceMappingURL=devtools-chat-anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-chat-anthropic.js","sourceRoot":"","sources":["../src/devtools-chat-anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type RunProviderChatTurnInput } from './devtools-chat-types.js';
2
+ export declare function runGeminiChatTurn(input: RunProviderChatTurnInput): Promise<import("./devtools-chat-types.js").ChatTurnResult>;
3
+ //# sourceMappingURL=devtools-chat-gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-chat-gemini.d.ts","sourceRoot":"","sources":["../src/devtools-chat-gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,wBAAwB,EAI9B,MAAM,0BAA0B,CAAC;AAyBlC,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,wBAAwB,8DA0FtE"}
@@ -0,0 +1,82 @@
1
+ import { completeTurn, DEFAULT_MAX_ITERATIONS, DEFAULT_REQUEST_TIMEOUT_MS, EMPTY_OBJECT_SCHEMA, limitTurn, providerFetch, requireDeclaredTool, validateToolArguments, visibleMessages, } from './devtools-chat-types.js';
2
+ const GEMINI_DEFAULT_BASE = 'https://generativelanguage.googleapis.com/v1beta';
3
+ export async function runGeminiChatTurn(input) {
4
+ const fetchImpl = input.fetchImpl ?? fetch;
5
+ const base = (input.baseUrl ?? GEMINI_DEFAULT_BASE).replace(/\/+$/, '');
6
+ const maxIterations = input.maxIterations ?? DEFAULT_MAX_ITERATIONS;
7
+ const timeoutMs = input.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
8
+ const systemText = visibleMessages(input.messages)
9
+ .filter((message) => message.role === 'system')
10
+ .map((message) => message.content ?? '')
11
+ .join('\n\n');
12
+ const contents = visibleMessages(input.messages)
13
+ .filter((message) => message.role === 'user' || message.role === 'assistant')
14
+ .map((message) => ({
15
+ role: message.role === 'assistant' ? 'model' : 'user',
16
+ parts: [{ text: message.content ?? '' }],
17
+ }));
18
+ const tools = input.tools.length > 0
19
+ ? [
20
+ {
21
+ functionDeclarations: input.tools.map((tool) => ({
22
+ name: tool.name,
23
+ ...(tool.description ? { description: tool.description } : {}),
24
+ parameters: tool.inputSchema ?? EMPTY_OBJECT_SCHEMA,
25
+ })),
26
+ },
27
+ ]
28
+ : [];
29
+ const byName = new Map(input.tools.map((tool) => [tool.name, tool]));
30
+ const toolCalls = [];
31
+ for (let iteration = 0; iteration < maxIterations; iteration += 1) {
32
+ const response = await providerFetch('Gemini', fetchImpl, `${base}/models/${encodeURIComponent(input.model)}:generateContent`, {
33
+ method: 'POST',
34
+ headers: { 'content-type': 'application/json', 'x-goog-api-key': input.apiKey },
35
+ body: JSON.stringify({
36
+ ...(systemText ? { systemInstruction: { parts: [{ text: systemText }] } } : {}),
37
+ contents,
38
+ ...(tools.length > 0 ? { tools } : {}),
39
+ }),
40
+ }, timeoutMs);
41
+ const data = (await response.json());
42
+ const content = data.candidates?.[0]?.content;
43
+ const parts = content?.parts;
44
+ if (!content || !Array.isArray(parts))
45
+ throw new Error('Gemini returned no content.');
46
+ const calls = parts
47
+ .map((part) => part.functionCall)
48
+ .filter((call) => call !== undefined && typeof call.name === 'string');
49
+ if (calls.length === 0) {
50
+ const text = parts.map((part) => part.text ?? '').join('');
51
+ return completeTurn(input, text, toolCalls);
52
+ }
53
+ contents.push(content);
54
+ const resultParts = [];
55
+ for (const call of calls) {
56
+ if (typeof call.id !== 'string' || call.id === '') {
57
+ throw new Error('Gemini returned a tool call without an id.');
58
+ }
59
+ const definition = requireDeclaredTool(byName, call.name);
60
+ const args = validateToolArguments(call.args ?? {});
61
+ const executed = await input.callTool(call.name, args);
62
+ toolCalls.push({
63
+ id: call.id,
64
+ name: call.name,
65
+ arguments: args,
66
+ result: executed.result,
67
+ isError: executed.isError,
68
+ ...(definition.resourceUri ? { resourceUri: definition.resourceUri } : {}),
69
+ });
70
+ resultParts.push({
71
+ functionResponse: {
72
+ id: call.id,
73
+ name: call.name,
74
+ response: { result: executed.result, isError: executed.isError },
75
+ },
76
+ });
77
+ }
78
+ contents.push({ role: 'user', parts: resultParts });
79
+ }
80
+ return limitTurn(input, toolCalls);
81
+ }
82
+ //# sourceMappingURL=devtools-chat-gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-chat-gemini.js","sourceRoot":"","sources":["../src/devtools-chat-gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EACZ,sBAAsB,EACtB,0BAA0B,EAC1B,mBAAmB,EACnB,SAAS,EACT,aAAa,EAEb,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAElC,MAAM,mBAAmB,GAAG,kDAAkD,CAAC;AAuB/E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA+B;IACrE,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC;IAC3C,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,mBAAmB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,sBAAsB,CAAC;IACpE,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,0BAA0B,CAAC;IAChE,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC;SAC/C,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC;SAC9C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;SACvC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,MAAM,QAAQ,GAAmC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC;SAC7E,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC;SAC5E,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACjB,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QACrD,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;KACzC,CAAC,CAAC,CAAC;IACN,MAAM,KAAK,GACT,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QACpB,CAAC,CAAC;YACE;gBACE,oBAAoB,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC/C,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9D,UAAU,EAAE,IAAI,CAAC,WAAW,IAAI,mBAAmB;iBACpD,CAAC,CAAC;aACJ;SACF;QACH,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,SAAS,GAAyB,EAAE,CAAC;IAE3C,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,aAAa,EAAE,SAAS,IAAI,CAAC,EAAE,CAAC;QAClE,MAAM,QAAQ,GAAG,MAAM,aAAa,CAClC,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,WAAW,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,EACnE;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,KAAK,CAAC,MAAM,EAAE;YAC/E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/E,QAAQ;gBACR,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvC,CAAC;SACH,EACD,SAAS,CACV,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAC;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;QAC9C,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;QAC7B,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACtF,MAAM,KAAK,GAAG,KAAK;aAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC;aAChC,MAAM,CACL,CAAC,IAAI,EAAiD,EAAE,CACtD,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CACtD,CAAC;QACJ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3D,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAC9C,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,OAAkC,CAAC,CAAC;QAClD,MAAM,WAAW,GAAmC,EAAE,CAAC;QACvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACvD,SAAS,CAAC,IAAI,CAAC;gBACb,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3E,CAAC,CAAC;YACH,WAAW,CAAC,IAAI,CAAC;gBACf,gBAAgB,EAAE;oBAChB,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE;iBACjE;aACF,CAAC,CAAC;QACL,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,64 @@
1
+ export type ChatProviderId = 'openai' | 'anthropic' | 'gemini';
2
+ /** Browser-facing conversation message plus the OpenAI-only fields used inside its adapter. */
3
+ export interface ChatMessage {
4
+ readonly role: 'system' | 'user' | 'assistant' | 'tool';
5
+ readonly content?: string | null;
6
+ readonly tool_calls?: ReadonlyArray<{
7
+ readonly id: string;
8
+ readonly type: 'function';
9
+ readonly function: {
10
+ readonly name: string;
11
+ readonly arguments: string;
12
+ };
13
+ }>;
14
+ readonly tool_call_id?: string;
15
+ }
16
+ /** A tool projected from MCP `tools/list`. */
17
+ export interface ChatToolDef {
18
+ readonly name: string;
19
+ readonly description?: string;
20
+ readonly inputSchema?: Record<string, unknown>;
21
+ readonly resourceUri?: string;
22
+ }
23
+ export type ChatToolArguments = Record<string, unknown>;
24
+ /** A tool call executed during one provider turn. */
25
+ export interface ChatToolInvocation {
26
+ readonly id: string;
27
+ readonly name: string;
28
+ readonly arguments: ChatToolArguments;
29
+ readonly result: unknown;
30
+ readonly isError: boolean;
31
+ readonly resourceUri?: string;
32
+ }
33
+ export interface ChatTurnResult {
34
+ readonly messages: ChatMessage[];
35
+ readonly toolCalls: ChatToolInvocation[];
36
+ readonly text: string;
37
+ }
38
+ export interface RunProviderChatTurnInput {
39
+ readonly provider: ChatProviderId;
40
+ readonly messages: readonly ChatMessage[];
41
+ readonly tools: readonly ChatToolDef[];
42
+ readonly apiKey: string;
43
+ readonly model: string;
44
+ readonly callTool: (name: string, args: ChatToolArguments) => Promise<{
45
+ result: unknown;
46
+ isError: boolean;
47
+ }>;
48
+ readonly fetchImpl?: typeof fetch;
49
+ readonly baseUrl?: string;
50
+ readonly maxIterations?: number;
51
+ readonly timeoutMs?: number;
52
+ }
53
+ export declare const DEFAULT_MAX_ITERATIONS = 8;
54
+ export declare const DEFAULT_REQUEST_TIMEOUT_MS = 60000;
55
+ export declare const EMPTY_OBJECT_SCHEMA: Record<string, unknown>;
56
+ export declare function visibleMessages(messages: readonly ChatMessage[]): ChatMessage[];
57
+ export declare function resultText(value: unknown): string;
58
+ export declare function validateToolArguments(value: unknown): ChatToolArguments;
59
+ export declare function parseToolArguments(value: string): ChatToolArguments;
60
+ export declare function requireDeclaredTool(byName: ReadonlyMap<string, ChatToolDef>, name: string): ChatToolDef;
61
+ export declare function completeTurn(input: RunProviderChatTurnInput, text: string, toolCalls: ChatToolInvocation[]): ChatTurnResult;
62
+ export declare function limitTurn(input: RunProviderChatTurnInput, toolCalls: ChatToolInvocation[]): ChatTurnResult;
63
+ export declare function providerFetch(providerName: string, fetchImpl: typeof fetch, url: string, init: RequestInit, timeoutMs: number): Promise<Response>;
64
+ //# sourceMappingURL=devtools-chat-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-chat-types.d.ts","sourceRoot":"","sources":["../src/devtools-chat-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ export const DEFAULT_MAX_ITERATIONS = 8;
2
+ export const DEFAULT_REQUEST_TIMEOUT_MS = 60_000;
3
+ export const EMPTY_OBJECT_SCHEMA = { type: 'object', properties: {} };
4
+ export function visibleMessages(messages) {
5
+ return messages
6
+ .filter((message) => message.role !== 'tool' &&
7
+ (message.role === 'system' || message.role === 'user' || message.role === 'assistant'))
8
+ .map((message) => ({ role: message.role, content: message.content ?? '' }));
9
+ }
10
+ export function resultText(value) {
11
+ return typeof value === 'string' ? value : JSON.stringify(value ?? null);
12
+ }
13
+ export function validateToolArguments(value) {
14
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
15
+ throw new Error('Tool arguments must be a JSON object.');
16
+ }
17
+ return value;
18
+ }
19
+ export function parseToolArguments(value) {
20
+ let parsed;
21
+ try {
22
+ parsed = value ? JSON.parse(value) : {};
23
+ }
24
+ catch {
25
+ throw new Error('Tool arguments must be a JSON object.');
26
+ }
27
+ return validateToolArguments(parsed);
28
+ }
29
+ export function requireDeclaredTool(byName, name) {
30
+ const definition = byName.get(name);
31
+ if (!definition)
32
+ throw new Error(`Model requested undeclared tool "${name}".`);
33
+ return definition;
34
+ }
35
+ export function completeTurn(input, text, toolCalls) {
36
+ return {
37
+ messages: [...visibleMessages(input.messages), { role: 'assistant', content: text }],
38
+ toolCalls,
39
+ text,
40
+ };
41
+ }
42
+ export function limitTurn(input, toolCalls) {
43
+ return completeTurn(input, 'Stopped after reaching the tool-call limit for this turn. Ask a follow-up to continue.', toolCalls);
44
+ }
45
+ export async function providerFetch(providerName, fetchImpl, url, init, timeoutMs) {
46
+ const controller = new AbortController();
47
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
48
+ try {
49
+ const response = await fetchImpl(url, { ...init, signal: controller.signal });
50
+ if (!response.ok)
51
+ throw new Error(`${providerName} request failed (${response.status}).`);
52
+ return response;
53
+ }
54
+ catch (error) {
55
+ if (controller.signal.aborted) {
56
+ throw new Error(`${providerName} request timed out after ${Math.round(timeoutMs / 1000)}s.`);
57
+ }
58
+ throw error;
59
+ }
60
+ finally {
61
+ clearTimeout(timer);
62
+ }
63
+ }
64
+ //# sourceMappingURL=devtools-chat-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-chat-types.js","sourceRoot":"","sources":["../src/devtools-chat-types.ts"],"names":[],"mappings":"AAwDA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AACjD,MAAM,CAAC,MAAM,mBAAmB,GAA4B,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AAE/F,MAAM,UAAU,eAAe,CAAC,QAAgC;IAC9D,OAAO,QAAQ;SACZ,MAAM,CACL,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,IAAI,KAAK,MAAM;QACvB,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CACzF;SACA,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,KAA0B,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,MAAwC,EACxC,IAAY;IAEZ,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,IAAI,CAAC,CAAC;IAC/E,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,KAA+B,EAC/B,IAAY,EACZ,SAA+B;IAE/B,OAAO;QACL,QAAQ,EAAE,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACpF,SAAS;QACT,IAAI;KACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,KAA+B,EAC/B,SAA+B;IAE/B,OAAO,YAAY,CACjB,KAAK,EACL,wFAAwF,EACxF,SAAS,CACV,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,YAAoB,EACpB,SAAuB,EACvB,GAAW,EACX,IAAiB,EACjB,SAAiB;IAEjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,YAAY,oBAAoB,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;QAC1F,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,GAAG,YAAY,4BAA4B,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -7,30 +7,11 @@
7
7
  * This is an extension of `dev`'s local, loopback-only tool exercise, not a general MCP client (ADR 0043):
8
8
  * the agent can only reach the tools of the local server the devtools session is already previewing.
9
9
  */
10
- /** The default model overridable per session via `--model` or `OPENAI_MODEL`. */
11
- export declare const DEFAULT_CHAT_MODEL = "gpt-5.5";
12
- /** An OpenAI chat-completions message (subset we produce/consume). */
13
- export interface ChatMessage {
14
- readonly role: 'system' | 'user' | 'assistant' | 'tool';
15
- readonly content?: string | null;
16
- readonly tool_calls?: ReadonlyArray<{
17
- readonly id: string;
18
- readonly type: 'function';
19
- readonly function: {
20
- readonly name: string;
21
- readonly arguments: string;
22
- };
23
- }>;
24
- readonly tool_call_id?: string;
25
- }
26
- /** A tool the agent may call, projected from the MCP `tools/list` entry. */
27
- export interface ChatToolDef {
28
- readonly name: string;
29
- readonly description?: string;
30
- readonly inputSchema?: Record<string, unknown>;
31
- /** `ui://` resource URI when the tool renders a widget — carried through for inline rendering. */
32
- readonly resourceUri?: string;
33
- }
10
+ import { type ChatMessage, type ChatProviderId, type ChatToolDef, type ChatTurnResult, type RunProviderChatTurnInput } from './devtools-chat-types.js';
11
+ export type { ChatMessage, ChatProviderId, ChatToolDef, ChatToolInvocation, ChatTurnResult, RunProviderChatTurnInput, } from './devtools-chat-types.js';
12
+ export declare const DEFAULT_CHAT_MODELS: Readonly<Record<ChatProviderId, string>>;
13
+ /** Existing CLI option default. Provider-aware routes use {@link DEFAULT_CHAT_MODELS}. */
14
+ export declare const DEFAULT_CHAT_MODEL: string;
34
15
  export interface OpenAiFunctionTool {
35
16
  readonly type: 'function';
36
17
  readonly function: {
@@ -39,20 +20,6 @@ export interface OpenAiFunctionTool {
39
20
  readonly parameters: Record<string, unknown>;
40
21
  };
41
22
  }
42
- /** A tool the agent actually called this turn, with its inputs/outputs, for inline rendering. */
43
- export interface ChatToolInvocation {
44
- readonly name: string;
45
- readonly arguments: unknown;
46
- readonly result: unknown;
47
- readonly isError: boolean;
48
- readonly resourceUri?: string;
49
- }
50
- export interface ChatTurnResult {
51
- /** The full conversation including the new assistant/tool messages — the browser resends it next turn. */
52
- readonly messages: ChatMessage[];
53
- readonly toolCalls: ChatToolInvocation[];
54
- readonly text: string;
55
- }
56
23
  /** Project MCP tool defs into OpenAI function-tool schema. */
57
24
  export declare function toOpenAiTools(tools: readonly ChatToolDef[]): OpenAiFunctionTool[];
58
25
  /**
@@ -64,7 +31,7 @@ export declare function runChatTurn(opts: {
64
31
  readonly tools: readonly ChatToolDef[];
65
32
  readonly apiKey: string;
66
33
  readonly model: string;
67
- readonly callTool: (name: string, args: unknown) => Promise<{
34
+ readonly callTool: (name: string, args: Record<string, unknown>) => Promise<{
68
35
  result: unknown;
69
36
  isError: boolean;
70
37
  }>;
@@ -73,4 +40,5 @@ export declare function runChatTurn(opts: {
73
40
  readonly maxIterations?: number;
74
41
  readonly timeoutMs?: number;
75
42
  }): Promise<ChatTurnResult>;
43
+ export declare function runProviderChatTurn(input: RunProviderChatTurnInput): Promise<ChatTurnResult>;
76
44
  //# sourceMappingURL=devtools-chat.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"devtools-chat.d.ts","sourceRoot":"","sources":["../src/devtools-chat.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,mFAAmF;AACnF,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAO5C,sEAAsE;AACtE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;QAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;QAC1B,QAAQ,CAAC,QAAQ,EAAE;YAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1E,CAAC,CAAC;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,4EAA4E;AAC5E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,kGAAkG;IAClG,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC9C,CAAC;CACH;AAED,iGAAiG;AACjG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,0GAA0G;IAC1G,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,kBAAkB,EAAE,CASjF;AAMD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,CACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,KACV,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,OAAO,CAAC,cAAc,CAAC,CAkF1B"}
1
+ {"version":3,"file":"devtools-chat.d.ts","sourceRoot":"","sources":["../src/devtools-chat.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,WAAW,EAEhB,KAAK,cAAc,EAQnB,KAAK,wBAAwB,EAE9B,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAElC,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAIxE,CAAC;AAEF,0FAA0F;AAC1F,eAAO,MAAM,kBAAkB,QAA6B,CAAC;AAI7D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC9C,CAAC;CACH;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,kBAAkB,EAAE,CASjF;AAMD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,CACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,OAAO,CAAC,cAAc,CAAC,CA+D1B;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAKzB"}
@@ -7,12 +7,17 @@
7
7
  * This is an extension of `dev`'s local, loopback-only tool exercise, not a general MCP client (ADR 0043):
8
8
  * the agent can only reach the tools of the local server the devtools session is already previewing.
9
9
  */
10
- /** The default model overridable per session via `--model` or `OPENAI_MODEL`. */
11
- export const DEFAULT_CHAT_MODEL = 'gpt-5.5';
10
+ import { runAnthropicChatTurn } from './devtools-chat-anthropic.js';
11
+ import { runGeminiChatTurn } from './devtools-chat-gemini.js';
12
+ import { completeTurn, DEFAULT_MAX_ITERATIONS, DEFAULT_REQUEST_TIMEOUT_MS, EMPTY_OBJECT_SCHEMA, limitTurn, parseToolArguments, providerFetch, requireDeclaredTool, } from './devtools-chat-types.js';
13
+ export const DEFAULT_CHAT_MODELS = {
14
+ openai: 'gpt-5.5',
15
+ anthropic: 'claude-opus-5',
16
+ gemini: 'gemini-3.6-flash',
17
+ };
18
+ /** Existing CLI option default. Provider-aware routes use {@link DEFAULT_CHAT_MODELS}. */
19
+ export const DEFAULT_CHAT_MODEL = DEFAULT_CHAT_MODELS.openai;
12
20
  const OPENAI_DEFAULT_BASE = 'https://api.openai.com/v1';
13
- const DEFAULT_MAX_ITERATIONS = 8;
14
- /** Per-request timeout so a hung/slow OpenAI-compatible endpoint can't block the /chat route forever. */
15
- const DEFAULT_REQUEST_TIMEOUT_MS = 60_000;
16
21
  /** Project MCP tool defs into OpenAI function-tool schema. */
17
22
  export function toOpenAiTools(tools) {
18
23
  return tools.map((t) => ({
@@ -20,7 +25,7 @@ export function toOpenAiTools(tools) {
20
25
  function: {
21
26
  name: t.name,
22
27
  ...(t.description ? { description: t.description } : {}),
23
- parameters: t.inputSchema ?? { type: 'object', properties: {} },
28
+ parameters: t.inputSchema ?? EMPTY_OBJECT_SCHEMA,
24
29
  },
25
30
  }));
26
31
  }
@@ -40,34 +45,15 @@ export async function runChatTurn(opts) {
40
45
  for (let iteration = 0; iteration < maxIterations; iteration += 1) {
41
46
  // Bound each request: a hung OpenAI-compatible endpoint (BYO baseUrl/key) must not block the /chat
42
47
  // route forever. Abort after timeoutMs and surface it as a clear timeout error, not a raw AbortError.
43
- const controller = new AbortController();
44
- const timer = setTimeout(() => controller.abort(), timeoutMs);
45
- let res;
46
- try {
47
- res = await doFetch(`${base}/chat/completions`, {
48
- method: 'POST',
49
- headers: { 'content-type': 'application/json', authorization: `Bearer ${opts.apiKey}` },
50
- body: JSON.stringify({
51
- model: opts.model,
52
- messages,
53
- ...(openAiTools.length > 0 ? { tools: openAiTools, tool_choice: 'auto' } : {}),
54
- }),
55
- signal: controller.signal,
56
- });
57
- }
58
- catch (error) {
59
- if (controller.signal.aborted) {
60
- throw new Error(`OpenAI request timed out after ${Math.round(timeoutMs / 1000)}s`);
61
- }
62
- throw error;
63
- }
64
- finally {
65
- clearTimeout(timer);
66
- }
67
- if (!res.ok) {
68
- const detail = await res.text().catch(() => '');
69
- throw new Error(`OpenAI request failed (${res.status}): ${detail.slice(0, 500)}`);
70
- }
48
+ const res = await providerFetch('OpenAI', doFetch, `${base}/chat/completions`, {
49
+ method: 'POST',
50
+ headers: { 'content-type': 'application/json', authorization: `Bearer ${opts.apiKey}` },
51
+ body: JSON.stringify({
52
+ model: opts.model,
53
+ messages,
54
+ ...(openAiTools.length > 0 ? { tools: openAiTools, tool_choice: 'auto' } : {}),
55
+ }),
56
+ }, timeoutMs);
71
57
  const data = (await res.json());
72
58
  const message = data.choices?.[0]?.message;
73
59
  if (!message)
@@ -82,21 +68,16 @@ export async function runChatTurn(opts) {
82
68
  };
83
69
  }
84
70
  for (const call of calls) {
85
- let args = {};
86
- try {
87
- args = call.function.arguments ? JSON.parse(call.function.arguments) : {};
88
- }
89
- catch {
90
- args = {};
91
- }
92
- const def = byName.get(call.function.name);
71
+ const def = requireDeclaredTool(byName, call.function.name);
72
+ const args = parseToolArguments(call.function.arguments);
93
73
  const { result, isError } = await opts.callTool(call.function.name, args);
94
74
  toolCalls.push({
75
+ id: call.id,
95
76
  name: call.function.name,
96
77
  arguments: args,
97
78
  result,
98
79
  isError,
99
- ...(def?.resourceUri ? { resourceUri: def.resourceUri } : {}),
80
+ ...(def.resourceUri ? { resourceUri: def.resourceUri } : {}),
100
81
  });
101
82
  messages.push({
102
83
  role: 'tool',
@@ -105,10 +86,14 @@ export async function runChatTurn(opts) {
105
86
  });
106
87
  }
107
88
  }
108
- return {
109
- messages,
110
- toolCalls,
111
- text: 'Stopped after reaching the tool-call limit for this turn. Ask a follow-up to continue.',
112
- };
89
+ return limitTurn({ ...opts, provider: 'openai' }, toolCalls);
90
+ }
91
+ export async function runProviderChatTurn(input) {
92
+ if (input.provider === 'anthropic')
93
+ return runAnthropicChatTurn(input);
94
+ if (input.provider === 'gemini')
95
+ return runGeminiChatTurn(input);
96
+ const result = await runChatTurn(input);
97
+ return completeTurn(input, result.text, result.toolCalls);
113
98
  }
114
99
  //# sourceMappingURL=devtools-chat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"devtools-chat.js","sourceRoot":"","sources":["../src/devtools-chat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"devtools-chat.js","sourceRoot":"","sources":["../src/devtools-chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Sticky response actions and copy-to-check feedback for developer output. */
2
+ export declare const DEVTOOLS_COPY_STYLES = "\n.result__bar{\n position:sticky;\n top:0;\n z-index:2;\n display:flex;\n align-items:center;\n justify-content:space-between;\n gap:12px;\n min-height:42px;\n padding:0 2px 10px;\n background:linear-gradient(180deg,rgba(8,8,10,.99) 74%,rgba(8,8,10,0));\n}\n.copy-action{\n display:inline-flex;\n min-height:30px;\n align-items:center;\n gap:7px;\n padding:6px 10px;\n border:0;\n border-radius:999px;\n background:rgba(255,255,255,.055);\n color:var(--nd-muted);\n font-size:10.5px;\n font-weight:620;\n cursor:pointer;\n transition:background .18s ease,color .18s ease,transform .18s ease;\n}\n.copy-action:hover{background:rgba(255,255,255,.09);color:var(--nd-text);transform:translateY(-1px)}\n.copy-action__icons{position:relative;display:block;width:14px;height:14px}\n.copy-action svg{\n position:absolute;\n inset:0;\n width:14px;\n height:14px;\n transition:opacity .16s ease,transform .16s ease;\n}\n.copy-action__check{opacity:0;transform:scale(.72) rotate(-12deg)}\n.copy-action.is-copied{color:var(--nd-success)}\n.copy-action.is-copied .copy-action__copy{opacity:0;transform:scale(.72) rotate(12deg)}\n.copy-action.is-copied .copy-action__check{opacity:1;transform:scale(1) rotate(0)}\n.sr-only{\n position:absolute!important;\n width:1px!important;\n height:1px!important;\n padding:0!important;\n overflow:hidden!important;\n clip:rect(0,0,0,0)!important;\n white-space:nowrap!important;\n border:0!important;\n}\n";
3
+ //# sourceMappingURL=devtools-copy-styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-copy-styles.d.ts","sourceRoot":"","sources":["../src/devtools-copy-styles.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAO,MAAM,oBAAoB,g8CAmDhC,CAAC"}
@@ -0,0 +1,54 @@
1
+ /** Sticky response actions and copy-to-check feedback for developer output. */
2
+ export const DEVTOOLS_COPY_STYLES = `
3
+ .result__bar{
4
+ position:sticky;
5
+ top:0;
6
+ z-index:2;
7
+ display:flex;
8
+ align-items:center;
9
+ justify-content:space-between;
10
+ gap:12px;
11
+ min-height:42px;
12
+ padding:0 2px 10px;
13
+ background:linear-gradient(180deg,rgba(8,8,10,.99) 74%,rgba(8,8,10,0));
14
+ }
15
+ .copy-action{
16
+ display:inline-flex;
17
+ min-height:30px;
18
+ align-items:center;
19
+ gap:7px;
20
+ padding:6px 10px;
21
+ border:0;
22
+ border-radius:999px;
23
+ background:rgba(255,255,255,.055);
24
+ color:var(--nd-muted);
25
+ font-size:10.5px;
26
+ font-weight:620;
27
+ cursor:pointer;
28
+ transition:background .18s ease,color .18s ease,transform .18s ease;
29
+ }
30
+ .copy-action:hover{background:rgba(255,255,255,.09);color:var(--nd-text);transform:translateY(-1px)}
31
+ .copy-action__icons{position:relative;display:block;width:14px;height:14px}
32
+ .copy-action svg{
33
+ position:absolute;
34
+ inset:0;
35
+ width:14px;
36
+ height:14px;
37
+ transition:opacity .16s ease,transform .16s ease;
38
+ }
39
+ .copy-action__check{opacity:0;transform:scale(.72) rotate(-12deg)}
40
+ .copy-action.is-copied{color:var(--nd-success)}
41
+ .copy-action.is-copied .copy-action__copy{opacity:0;transform:scale(.72) rotate(12deg)}
42
+ .copy-action.is-copied .copy-action__check{opacity:1;transform:scale(1) rotate(0)}
43
+ .sr-only{
44
+ position:absolute!important;
45
+ width:1px!important;
46
+ height:1px!important;
47
+ padding:0!important;
48
+ overflow:hidden!important;
49
+ clip:rect(0,0,0,0)!important;
50
+ white-space:nowrap!important;
51
+ border:0!important;
52
+ }
53
+ `;
54
+ //# sourceMappingURL=devtools-copy-styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-copy-styles.js","sourceRoot":"","sources":["../src/devtools-copy-styles.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDnC,CAAC"}