@qwen-code/arena-agent 0.0.10-dev.8-test.0 → 0.0.10-test.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 (151) hide show
  1. package/.env.example +61 -10
  2. package/CHANGELOG.md +148 -17
  3. package/README.md +309 -46
  4. package/dist/agent.d.ts +20 -6
  5. package/dist/agent.js +353 -72
  6. package/dist/agent.js.map +1 -1
  7. package/dist/anthropic.d.ts +1 -1
  8. package/dist/anthropic.js +46 -57
  9. package/dist/anthropic.js.map +1 -1
  10. package/dist/arena-history.d.ts +12 -0
  11. package/dist/arena-history.js +119 -0
  12. package/dist/arena-history.js.map +1 -0
  13. package/dist/ask-user.js +44 -2
  14. package/dist/ask-user.js.map +1 -1
  15. package/dist/attachment-limits.d.ts +4 -0
  16. package/dist/attachment-limits.js +10 -0
  17. package/dist/attachment-limits.js.map +1 -0
  18. package/dist/attachments.d.ts +4 -2
  19. package/dist/attachments.js +9 -11
  20. package/dist/attachments.js.map +1 -1
  21. package/dist/brave-search.js +11 -7
  22. package/dist/brave-search.js.map +1 -1
  23. package/dist/canonical-data.d.ts +9 -0
  24. package/dist/canonical-data.js +12 -3
  25. package/dist/canonical-data.js.map +1 -1
  26. package/dist/cli.js +140 -40
  27. package/dist/cli.js.map +1 -1
  28. package/dist/code-tool-schema.d.ts +3 -0
  29. package/dist/code-tool-schema.js +92 -0
  30. package/dist/code-tool-schema.js.map +1 -0
  31. package/dist/code-tools.d.ts +2 -1
  32. package/dist/code-tools.js +103 -31
  33. package/dist/code-tools.js.map +1 -1
  34. package/dist/compaction-threshold.d.ts +3 -0
  35. package/dist/compaction-threshold.js +6 -0
  36. package/dist/compaction-threshold.js.map +1 -0
  37. package/dist/compaction.d.ts +24 -7
  38. package/dist/compaction.js +242 -66
  39. package/dist/compaction.js.map +1 -1
  40. package/dist/config.d.ts +17 -0
  41. package/dist/config.js +30 -5
  42. package/dist/config.js.map +1 -1
  43. package/dist/connector-errors.d.ts +16 -0
  44. package/dist/connector-errors.js +69 -0
  45. package/dist/connector-errors.js.map +1 -0
  46. package/dist/connector-files.d.ts +31 -0
  47. package/dist/connector-files.js +249 -0
  48. package/dist/connector-files.js.map +1 -0
  49. package/dist/connector-input.d.ts +10 -0
  50. package/dist/connector-input.js +79 -0
  51. package/dist/connector-input.js.map +1 -0
  52. package/dist/connector-mcp.d.ts +60 -0
  53. package/dist/connector-mcp.js +474 -0
  54. package/dist/connector-mcp.js.map +1 -0
  55. package/dist/connectors.d.ts +13 -0
  56. package/dist/connectors.js +69 -0
  57. package/dist/connectors.js.map +1 -0
  58. package/dist/fetch-page.js +2 -2
  59. package/dist/fetch-page.js.map +1 -1
  60. package/dist/history.d.ts +16 -5
  61. package/dist/history.js +73 -14
  62. package/dist/history.js.map +1 -1
  63. package/dist/image-choice.d.ts +23 -0
  64. package/dist/image-choice.js +190 -0
  65. package/dist/image-choice.js.map +1 -0
  66. package/dist/image-input-fallback.js +5 -0
  67. package/dist/image-input-fallback.js.map +1 -1
  68. package/dist/image-model.d.ts +6 -0
  69. package/dist/image-model.js +32 -0
  70. package/dist/image-model.js.map +1 -0
  71. package/dist/midturn-checkpoint-hook.d.ts +14 -1
  72. package/dist/midturn-checkpoint-hook.js.map +1 -1
  73. package/dist/mode.js +1 -1
  74. package/dist/mode.js.map +1 -1
  75. package/dist/model-capabilities.js +18 -8
  76. package/dist/model-capabilities.js.map +1 -1
  77. package/dist/model-router-media.js +55 -3
  78. package/dist/model-router-media.js.map +1 -1
  79. package/dist/model-stream.d.ts +16 -0
  80. package/dist/model-stream.js +129 -0
  81. package/dist/model-stream.js.map +1 -0
  82. package/dist/openai-responses.d.ts +2 -1
  83. package/dist/openai-responses.js +85 -88
  84. package/dist/openai-responses.js.map +1 -1
  85. package/dist/process-manager.js +9 -9
  86. package/dist/process-manager.js.map +1 -1
  87. package/dist/prompts.d.ts +0 -2
  88. package/dist/prompts.js +10 -60
  89. package/dist/prompts.js.map +1 -1
  90. package/dist/protocol.d.ts +5 -1
  91. package/dist/protocol.js +23 -2
  92. package/dist/protocol.js.map +1 -1
  93. package/dist/provider.d.ts +18 -0
  94. package/dist/provider.js +120 -51
  95. package/dist/provider.js.map +1 -1
  96. package/dist/repo.d.ts +1 -1
  97. package/dist/repo.js +26 -4
  98. package/dist/repo.js.map +1 -1
  99. package/dist/routify-web-fetch.js +2 -2
  100. package/dist/routify-web-fetch.js.map +1 -1
  101. package/dist/server.js +55 -27
  102. package/dist/server.js.map +1 -1
  103. package/dist/session-memory-prompts.d.ts +3 -1
  104. package/dist/session-memory-prompts.js +4 -2
  105. package/dist/session-memory-prompts.js.map +1 -1
  106. package/dist/side-query.js +5 -0
  107. package/dist/side-query.js.map +1 -1
  108. package/dist/spec.d.ts +5 -4
  109. package/dist/spec.js +31 -23
  110. package/dist/spec.js.map +1 -1
  111. package/dist/startup-config.d.ts +39 -0
  112. package/dist/startup-config.js +347 -0
  113. package/dist/startup-config.js.map +1 -0
  114. package/dist/startup-main-config.d.ts +63 -0
  115. package/dist/startup-main-config.js +94 -0
  116. package/dist/startup-main-config.js.map +1 -0
  117. package/dist/startup-tool-config.d.ts +8 -0
  118. package/dist/startup-tool-config.js +116 -0
  119. package/dist/startup-tool-config.js.map +1 -0
  120. package/dist/summary-compaction.d.ts +29 -0
  121. package/dist/{legacy-compaction.js → summary-compaction.js} +79 -14
  122. package/dist/summary-compaction.js.map +1 -0
  123. package/dist/tools.d.ts +5 -1
  124. package/dist/tools.js +195 -68
  125. package/dist/tools.js.map +1 -1
  126. package/dist/tui.js +26 -6
  127. package/dist/tui.js.map +1 -1
  128. package/dist/types.d.ts +21 -1
  129. package/dist/web/app.js +30 -5
  130. package/dist/web/app.js.map +1 -1
  131. package/dist/workspace.js +61 -13
  132. package/dist/workspace.js.map +1 -1
  133. package/docs/BINARY_DISTRIBUTION.md +44 -8
  134. package/docs/MODES_AND_RELEASES.md +79 -6
  135. package/docs/SDK.md +1 -0
  136. package/modes/code-arena/capture-provenance.json +57 -0
  137. package/modes/code-arena/full-stack/dependencies.lock.json +8670 -0
  138. package/modes/code-arena/full-stack/system-prompt.txt +1 -1
  139. package/modes/code-arena/full-stack/template/eslint.config.mjs +3 -4
  140. package/modes/code-arena/full-stack/template/postcss.config.mjs +2 -2
  141. package/modes/code-arena/full-stack/tools.json +186 -186
  142. package/modes/code-arena/html/system-prompt.txt +1 -1
  143. package/modes/code-arena/html/tools.json +123 -123
  144. package/modes/code-arena/react/dependencies.lock.json +2707 -0
  145. package/modes/code-arena/react/system-prompt.txt +4 -3
  146. package/modes/code-arena/react/tools.json +178 -184
  147. package/package.json +7 -2
  148. package/scripts/README.md +23 -4
  149. package/web/styles.css +22 -0
  150. package/dist/legacy-compaction.d.ts +0 -16
  151. package/dist/legacy-compaction.js.map +0 -1
@@ -15,7 +15,7 @@ You have access to 'web_search' and 'web_fetch' tools for researching informatio
15
15
 
16
16
  ## Task Planning
17
17
 
18
- You have a maximum of 50 sequential tool-calling steps to complete the task. Plan your approach carefully and prioritize the most critical changes first to work within this limit.
18
+ You have a maximum of 75 sequential tool-calling steps to complete the task. Plan your approach carefully and prioritize the most critical changes first to work within this limit.
19
19
 
20
20
  For each file you create or edit, you must first explain what you are about to do, then call the tool, then confirm the result.
21
21
 
@@ -1,9 +1,8 @@
1
1
  import { defineConfig, globalIgnores } from "eslint/config";
2
- import nextVitals from "eslint-config-next/core-web-vitals";
3
- import nextTs from "eslint-config-next/typescript";
2
+ import nextCoreWebVitals from "eslint-config-next/core-web-vitals";
4
3
 
5
4
  export default defineConfig([
6
- ...nextVitals,
7
- ...nextTs,
5
+ // Keep the starter on the flat config export that actually runs under the pinned ESLint/Next toolchain.
6
+ ...nextCoreWebVitals,
8
7
  globalIgnores([".next/**", "out/**", "build/**", "next-env.d.ts"]),
9
8
  ]);
@@ -1,7 +1,7 @@
1
- const config = {
1
+ const postcssConfig = {
2
2
  plugins: {
3
3
  "@tailwindcss/postcss": {},
4
4
  },
5
5
  };
6
6
 
7
- export default config;
7
+ export default postcssConfig;
@@ -1,25 +1,24 @@
1
1
  [
2
2
  {
3
- "type": "function",
4
3
  "function": {
4
+ "description": "Read the content of an existing file with line numbers. For large files, use `offset` (1-indexed start line) and `limit` (max lines, default 2000) to read specific ranges. If the path is a PNG or JPEG image, the tool returns the image so you can view it; a model without image input gets an error instead. Other binary files (fonts, audio, video, archives, etc.) are not supported.\n",
5
5
  "name": "read_file",
6
- "description": "Read the content of an existing file with line numbers. For large files, use `offset` (1-indexed start line) and `limit` (max lines, default 2000) to read specific ranges. Cannot read binary files (images, fonts, audio, video, archives, etc.) — only text files are supported.\n",
7
6
  "parameters": {
8
- "type": "object",
7
+ "additionalProperties": false,
9
8
  "properties": {
10
- "path": {
11
- "type": "string",
12
- "description": "File path relative to project root (for example, 'index.html')"
9
+ "limit": {
10
+ "description": "Maximum number of lines to read (default: 2000)",
11
+ "minimum": 1,
12
+ "type": "integer"
13
13
  },
14
14
  "offset": {
15
- "type": "integer",
15
+ "description": "Line number to start reading from (1-indexed, default: 1)",
16
16
  "minimum": 1,
17
- "description": "Line number to start reading from (1-indexed, default: 1)"
17
+ "type": "integer"
18
18
  },
19
- "limit": {
20
- "type": "integer",
21
- "minimum": 1,
22
- "description": "Maximum number of lines to read (default: 2000)"
19
+ "path": {
20
+ "description": "File path relative to project root (for example, 'index.html')",
21
+ "type": "string"
23
22
  }
24
23
  },
25
24
  "required": [
@@ -27,54 +26,54 @@
27
26
  "offset",
28
27
  "limit"
29
28
  ],
30
- "additionalProperties": false
29
+ "type": "object"
31
30
  }
32
- }
31
+ },
32
+ "type": "function"
33
33
  },
34
34
  {
35
- "type": "function",
36
35
  "function": {
37
- "name": "create_file",
38
36
  "description": "Create a new file or overwrite an existing file in the project with the provided content. The file extension should match the type of file you want to create (e.g., 'index.html' for HTML files). If the file already exists, its content will be completely replaced.\n",
37
+ "name": "create_file",
39
38
  "parameters": {
40
- "type": "object",
39
+ "additionalProperties": false,
41
40
  "properties": {
42
- "path": {
43
- "type": "string",
44
- "description": "File path relative to project root (for example, 'index.html')"
45
- },
46
41
  "content": {
47
- "type": "string",
48
- "description": "The complete content of the file"
42
+ "description": "The complete content of the file",
43
+ "type": "string"
44
+ },
45
+ "path": {
46
+ "description": "File path relative to project root (for example, 'index.html')",
47
+ "type": "string"
49
48
  }
50
49
  },
51
50
  "required": [
52
51
  "path",
53
52
  "content"
54
53
  ],
55
- "additionalProperties": false
54
+ "type": "object"
56
55
  }
57
- }
56
+ },
57
+ "type": "function"
58
58
  },
59
59
  {
60
- "type": "function",
61
60
  "function": {
62
- "name": "edit_file",
63
61
  "description": "Replace a section of content in a file. Uses fuzzy matching that ignores whitespace and indentation differences, so the context doesn't need to match exactly. This will fail if 'context' matches multiple sections in the file.\n",
62
+ "name": "edit_file",
64
63
  "parameters": {
65
- "type": "object",
64
+ "additionalProperties": false,
66
65
  "properties": {
67
- "path": {
68
- "type": "string",
69
- "description": "File path relative to project root (for example, 'index.html')"
70
- },
71
66
  "context": {
72
- "type": "string",
73
- "description": "The text in the file to replace. Uses fuzzy matching that ignores whitespace and indentation differences, so it doesn't need to match exactly. Only the first occurrence will be replaced."
67
+ "description": "The text in the file to replace. Uses fuzzy matching that ignores whitespace and indentation differences, so it doesn't need to match exactly. Only the first occurrence will be replaced.",
68
+ "type": "string"
69
+ },
70
+ "path": {
71
+ "description": "File path relative to project root (for example, 'index.html')",
72
+ "type": "string"
74
73
  },
75
74
  "replacement": {
76
- "type": "string",
77
- "description": "The new text to replace the matched context with. This will be inserted exactly where the context was found."
75
+ "description": "The new text to replace the matched context with. This will be inserted exactly where the context was found.",
76
+ "type": "string"
78
77
  }
79
78
  },
80
79
  "required": [
@@ -82,102 +81,102 @@
82
81
  "context",
83
82
  "replacement"
84
83
  ],
85
- "additionalProperties": false
84
+ "type": "object"
86
85
  }
87
- }
86
+ },
87
+ "type": "function"
88
88
  },
89
89
  {
90
- "type": "function",
91
90
  "function": {
92
- "name": "delete_file",
93
91
  "description": "Delete a file from the project.\n",
92
+ "name": "delete_file",
94
93
  "parameters": {
95
- "type": "object",
94
+ "additionalProperties": false,
96
95
  "properties": {
97
96
  "path": {
98
- "type": "string",
99
- "description": "File path relative to project root (for example, 'index.html')"
97
+ "description": "File path relative to project root (for example, 'index.html')",
98
+ "type": "string"
100
99
  }
101
100
  },
102
101
  "required": [
103
102
  "path"
104
103
  ],
105
- "additionalProperties": false
104
+ "type": "object"
106
105
  }
107
- }
106
+ },
107
+ "type": "function"
108
108
  },
109
109
  {
110
- "type": "function",
111
110
  "function": {
112
- "name": "list_files",
113
111
  "description": "List file paths in the project. If no path is provided, lists all files from the project root. You can optionally provide a relative path to list files within a specific directory. You should generally prefer the glob_files and grep_files tools if you know which directories or patterns to search for.\n",
112
+ "name": "list_files",
114
113
  "parameters": {
115
- "type": "object",
114
+ "additionalProperties": false,
116
115
  "properties": {
117
116
  "path": {
118
- "type": "string",
119
- "description": "The directory to list, relative to project root. Defaults to the project root."
117
+ "description": "The directory to list, relative to project root. Defaults to the project root.",
118
+ "type": "string"
120
119
  }
121
120
  },
122
- "additionalProperties": false,
123
121
  "required": [
124
122
  "path"
125
- ]
123
+ ],
124
+ "type": "object"
126
125
  }
127
- }
126
+ },
127
+ "type": "function"
128
128
  },
129
129
  {
130
- "type": "function",
131
130
  "function": {
132
- "name": "grep_files",
133
131
  "description": "Fast content search tool that searches file contents using regular expressions. Supports full regex syntax (e.g., \"log.*Error\", \"function\\s+\\w+\"). Filter files with the glob parameter (e.g., \"*.js\", \"*.{ts,tsx}\"). Returns matching lines with file paths and line numbers. Results are limited to 100 matches.",
132
+ "name": "grep_files",
134
133
  "parameters": {
135
- "type": "object",
134
+ "additionalProperties": false,
136
135
  "properties": {
137
- "pattern": {
138
- "type": "string",
139
- "description": "The regex pattern to search for in file contents"
136
+ "-A": {
137
+ "description": "Number of lines to show after each match",
138
+ "minimum": 0,
139
+ "type": "integer"
140
140
  },
141
- "path": {
142
- "type": "string",
143
- "description": "The directory to search in, relative to project root. Defaults to the project root."
141
+ "-B": {
142
+ "description": "Number of lines to show before each match",
143
+ "minimum": 0,
144
+ "type": "integer"
145
+ },
146
+ "-C": {
147
+ "description": "Number of lines to show before and after each match",
148
+ "minimum": 0,
149
+ "type": "integer"
150
+ },
151
+ "-i": {
152
+ "description": "Case insensitive search",
153
+ "type": "boolean"
154
+ },
155
+ "context": {
156
+ "description": "Alias for -C (context lines before and after)",
157
+ "minimum": 0,
158
+ "type": "integer"
144
159
  },
145
160
  "glob": {
146
- "type": "string",
147
- "description": "Glob pattern to filter files (e.g. \"*.js\", \"*.{ts,tsx}\")"
161
+ "description": "Glob pattern to filter files (e.g. \"*.js\", \"*.{ts,tsx}\")",
162
+ "type": "string"
148
163
  },
149
164
  "output_mode": {
150
- "type": "string",
165
+ "description": "Output mode: \"content\" shows matching lines (default), \"files_with_matches\" shows only file paths, \"count\" shows match counts per file.",
151
166
  "enum": [
152
167
  "content",
153
168
  "files_with_matches",
154
169
  "count"
155
170
  ],
156
- "description": "Output mode: \"content\" shows matching lines (default), \"files_with_matches\" shows only file paths, \"count\" shows match counts per file."
157
- },
158
- "-i": {
159
- "type": "boolean",
160
- "description": "Case insensitive search"
161
- },
162
- "-B": {
163
- "type": "integer",
164
- "minimum": 0,
165
- "description": "Number of lines to show before each match"
166
- },
167
- "-A": {
168
- "type": "integer",
169
- "minimum": 0,
170
- "description": "Number of lines to show after each match"
171
+ "type": "string"
171
172
  },
172
- "-C": {
173
- "type": "integer",
174
- "minimum": 0,
175
- "description": "Number of lines to show before and after each match"
173
+ "path": {
174
+ "description": "The directory to search in, relative to project root. Defaults to the project root.",
175
+ "type": "string"
176
176
  },
177
- "context": {
178
- "type": "integer",
179
- "minimum": 0,
180
- "description": "Alias for -C (context lines before and after)"
177
+ "pattern": {
178
+ "description": "The regex pattern to search for in file contents",
179
+ "type": "string"
181
180
  }
182
181
  },
183
182
  "required": [
@@ -191,77 +190,77 @@
191
190
  "-C",
192
191
  "context"
193
192
  ],
194
- "additionalProperties": false
193
+ "type": "object"
195
194
  }
196
- }
195
+ },
196
+ "type": "function"
197
197
  },
198
198
  {
199
- "type": "function",
200
199
  "function": {
201
- "name": "glob_files",
202
200
  "description": "Fast file pattern matching tool. Supports glob patterns like \"**/*.js\" or \"src/**/*.ts\". Returns matching file paths. Use this tool when you need to find files by name or extension patterns. Results are limited to 100 files.",
201
+ "name": "glob_files",
203
202
  "parameters": {
204
- "type": "object",
203
+ "additionalProperties": false,
205
204
  "properties": {
206
- "pattern": {
207
- "type": "string",
208
- "description": "The glob pattern to match files against"
209
- },
210
205
  "path": {
211
- "type": "string",
212
- "description": "The directory to search in, relative to project root. Defaults to the project root."
206
+ "description": "The directory to search in, relative to project root. Defaults to the project root.",
207
+ "type": "string"
208
+ },
209
+ "pattern": {
210
+ "description": "The glob pattern to match files against",
211
+ "type": "string"
213
212
  }
214
213
  },
215
214
  "required": [
216
215
  "pattern",
217
216
  "path"
218
217
  ],
219
- "additionalProperties": false
218
+ "type": "object"
220
219
  }
221
- }
220
+ },
221
+ "type": "function"
222
222
  },
223
223
  {
224
- "type": "function",
225
224
  "function": {
226
- "name": "install_npm_packages",
227
225
  "description": "Install npm packages as dependencies. Takes an array of package names and runs 'npm install -S' with those packages.\n",
226
+ "name": "install_npm_packages",
228
227
  "parameters": {
229
- "type": "object",
228
+ "additionalProperties": false,
230
229
  "properties": {
231
230
  "packages": {
232
- "type": "array",
233
231
  "items": {
234
- "type": "string",
235
- "description": "Package name (e.g., 'react', 'lodash', 'axios@1.0.0')"
236
- }
232
+ "description": "Package name (e.g., 'react', 'lodash', 'axios@1.0.0')",
233
+ "type": "string"
234
+ },
235
+ "type": "array"
237
236
  }
238
237
  },
239
238
  "required": [
240
239
  "packages"
241
240
  ],
242
- "additionalProperties": false
241
+ "type": "object"
243
242
  }
244
- }
243
+ },
244
+ "type": "function"
245
245
  },
246
246
  {
247
- "type": "function",
248
247
  "function": {
249
- "name": "bash",
250
248
  "description": "Execute a bash command in the sandbox. The command runs in a sandboxed environment with Node.js and common CLI tools available.\n\nGuidelines:\n- The working directory defaults to the project root. Only pass `workdir` for subdirectories within the project (e.g. `src/`). Never pass an absolute path.\n- Prefer specialized tools (create_file, edit_file, read_file) for file operations when possible.\n- Include a short `description` summarizing what the command does in 5-10 words.\n- The command runs with `/bin/bash -c` and captures both stdout and stderr.\n",
249
+ "name": "bash",
251
250
  "parameters": {
252
- "type": "object",
251
+ "additionalProperties": false,
253
252
  "properties": {
254
253
  "command": {
255
- "type": "string",
256
- "description": "The bash command to execute"
257
- },
258
- "workdir": {
259
- "type": "string",
260
- "description": "Working directory for the command (defaults to project root)"
254
+ "description": "The bash command to execute",
255
+ "type": "string"
261
256
  },
262
257
  "description": {
263
- "type": "string",
264
- "description": "Short (5-10 word) description of what the command does"
258
+ "description": "Short (5-10 word) description of what the command does",
259
+ "type": "string"
260
+ },
261
+ "workdir": {
262
+ "description": "Working directory for the command (defaults to project root)",
263
+ "type": "string"
265
264
  }
266
265
  },
267
266
  "required": [
@@ -269,141 +268,141 @@
269
268
  "workdir",
270
269
  "description"
271
270
  ],
272
- "additionalProperties": false
271
+ "type": "object"
273
272
  }
274
- }
273
+ },
274
+ "type": "function"
275
275
  },
276
276
  {
277
- "type": "function",
278
277
  "function": {
279
- "name": "build_and_start",
280
278
  "description": "Build and start the fullstack preview using the platform-managed runtime. Use this after you finish editing code to verify that the application bootstraps, builds, starts, and passes the healthcheck. If it fails, inspect the returned stage and log tail before deciding what to fix.\n",
279
+ "name": "build_and_start",
281
280
  "parameters": {
282
- "type": "object",
281
+ "additionalProperties": false,
283
282
  "properties": {
284
283
  "description": {
285
284
  "type": "string"
286
285
  }
287
286
  },
288
- "additionalProperties": false,
289
287
  "required": [
290
288
  "description"
291
- ]
289
+ ],
290
+ "type": "object"
292
291
  }
293
- }
292
+ },
293
+ "type": "function"
294
294
  },
295
295
  {
296
- "type": "function",
297
296
  "function": {
298
- "name": "web_search",
299
297
  "description": "Search the web for current information. Use when you need documentation, API references, examples, or facts beyond your training data. Returns results with titles, URLs, and content snippets. The current year is 2026 — use it when searching for recent information.",
298
+ "name": "web_search",
300
299
  "parameters": {
301
- "type": "object",
300
+ "additionalProperties": false,
302
301
  "properties": {
303
- "query": {
304
- "type": "string",
305
- "description": "The search query"
306
- },
307
302
  "depth": {
308
- "type": "string",
303
+ "description": "The search tool accepts a depth parameter (1, 2, or 3) that controls how many results are fetched and how much content is extracted from each. At depth 1, fewer results are retrieved with shorter excerpts. At depth 3, more results are retrieved with longer, more detailed excerpts per source. Depth 2 falls between the two. Higher depth consumes more of the context window.",
309
304
  "enum": [
310
305
  "1",
311
306
  "2",
312
307
  "3"
313
308
  ],
314
- "description": "The search tool accepts a depth parameter (1, 2, or 3) that controls how many results are fetched and how much content is extracted from each. At depth 1, fewer results are retrieved with shorter excerpts. At depth 3, more results are retrieved with longer, more detailed excerpts per source. Depth 2 falls between the two. Higher depth consumes more of the context window."
309
+ "type": "string"
310
+ },
311
+ "query": {
312
+ "description": "The search query",
313
+ "type": "string"
315
314
  }
316
315
  },
317
316
  "required": [
318
317
  "query",
319
318
  "depth"
320
319
  ],
321
- "additionalProperties": false
320
+ "type": "object"
322
321
  }
323
- }
322
+ },
323
+ "type": "function"
324
324
  },
325
325
  {
326
- "type": "function",
327
326
  "function": {
328
- "name": "web_fetch",
329
327
  "description": "Fetch and read the content of a web page. Use to read documentation, API references, or examples found via web_search. Returns content as markdown by default. Supports format options: \"markdown\" (default), \"text\", or \"html\".",
328
+ "name": "web_fetch",
330
329
  "parameters": {
331
- "type": "object",
330
+ "additionalProperties": false,
332
331
  "properties": {
333
- "url": {
334
- "type": "string",
335
- "description": "The URL to fetch content from"
336
- },
337
332
  "format": {
338
- "type": "string",
333
+ "description": "Output format: \"markdown\" (default), \"text\", or \"html\"",
339
334
  "enum": [
340
335
  "markdown",
341
336
  "text",
342
337
  "html"
343
338
  ],
344
- "description": "Output format: \"markdown\" (default), \"text\", or \"html\""
339
+ "type": "string"
340
+ },
341
+ "url": {
342
+ "description": "The URL to fetch content from",
343
+ "type": "string"
345
344
  }
346
345
  },
347
346
  "required": [
348
347
  "url",
349
348
  "format"
350
349
  ],
351
- "additionalProperties": false
350
+ "type": "object"
352
351
  }
353
- }
352
+ },
353
+ "type": "function"
354
354
  },
355
355
  {
356
- "type": "function",
357
356
  "function": {
358
- "name": "fetch_media",
359
357
  "description": "Search for stock photos and videos and return URL-based media assets. Use this when real photography or video is better than AI-generated imagery. Use `recommendedUrl`.\n",
358
+ "name": "fetch_media",
360
359
  "parameters": {
361
- "type": "object",
360
+ "additionalProperties": false,
362
361
  "properties": {
363
- "query": {
364
- "type": "string",
365
- "description": "Search query for stock media, such as 'modern office interior' or 'ocean waves'."
362
+ "count": {
363
+ "default": 6,
364
+ "description": "Number of assets to return (1-10). Defaults to 6.",
365
+ "type": "number"
366
+ },
367
+ "locale": {
368
+ "description": "Search locale, such as \"en-US\". Defaults to \"en-US\".",
369
+ "type": "string"
366
370
  },
367
371
  "media_type": {
368
- "type": "string",
372
+ "default": "both",
373
+ "description": "Type of media: \"image\", \"video\", or \"both\". Defaults to \"both\".",
369
374
  "enum": [
370
375
  "image",
371
376
  "video",
372
377
  "both"
373
378
  ],
374
- "default": "both",
375
- "description": "Type of media: \"image\", \"video\", or \"both\". Defaults to \"both\"."
376
- },
377
- "count": {
378
- "type": "number",
379
- "default": 6,
380
- "description": "Number of assets to return (1-10). Defaults to 6."
379
+ "type": "string"
381
380
  },
382
381
  "orientation": {
383
- "type": "string",
382
+ "default": "any",
383
+ "description": "Desired orientation. Defaults to \"any\".",
384
384
  "enum": [
385
385
  "any",
386
386
  "landscape",
387
387
  "portrait",
388
388
  "square"
389
389
  ],
390
- "default": "any",
391
- "description": "Desired orientation. Defaults to \"any\"."
390
+ "type": "string"
391
+ },
392
+ "query": {
393
+ "description": "Search query for stock media, such as 'modern office interior' or 'ocean waves'.",
394
+ "type": "string"
392
395
  },
393
396
  "size": {
394
- "type": "string",
397
+ "default": "any",
398
+ "description": "Minimum media size. Defaults to \"any\".",
395
399
  "enum": [
396
400
  "any",
397
401
  "large",
398
402
  "medium",
399
403
  "small"
400
404
  ],
401
- "default": "any",
402
- "description": "Minimum media size. Defaults to \"any\"."
403
- },
404
- "locale": {
405
- "type": "string",
406
- "description": "Search locale, such as \"en-US\". Defaults to \"en-US\"."
405
+ "type": "string"
407
406
  }
408
407
  },
409
408
  "required": [
@@ -414,33 +413,34 @@
414
413
  "size",
415
414
  "locale"
416
415
  ],
417
- "additionalProperties": false
416
+ "type": "object"
418
417
  }
419
- }
418
+ },
419
+ "type": "function"
420
420
  },
421
421
  {
422
- "type": "function",
423
422
  "function": {
424
- "name": "generate_image",
425
423
  "description": "Generate a custom image using AI and save it to the project. Use this tool when you need to create images for the website such as hero backgrounds, icons, illustrations, or any visual content. The image will be saved at the specified path. Place web-accessible images in the 'public/' directory (e.g., 'public/images/hero.jpg'). Provide a detailed, descriptive prompt for best results. Supported formats: JPG, JPEG, and PNG. You can generate at most 10 images per session — plan your image usage carefully and prefer CSS gradients, SVG, or emoji for decorative elements.\n",
424
+ "name": "generate_image",
426
425
  "parameters": {
427
- "type": "object",
426
+ "additionalProperties": false,
428
427
  "properties": {
429
428
  "file_path": {
430
- "type": "string",
431
- "description": "Relative path to save the generated image (e.g., 'public/images/hero.jpg'). Must end in .jpg, .jpeg, or .png."
429
+ "description": "Relative path to save the generated image (e.g., 'public/images/hero.jpg'). Must end in .jpg, .jpeg, or .png.",
430
+ "type": "string"
432
431
  },
433
432
  "prompt": {
434
- "type": "string",
435
- "description": "Text prompt describing the image to generate"
433
+ "description": "Text prompt describing the image to generate",
434
+ "type": "string"
436
435
  }
437
436
  },
438
437
  "required": [
439
438
  "file_path",
440
439
  "prompt"
441
440
  ],
442
- "additionalProperties": false
441
+ "type": "object"
443
442
  }
444
- }
443
+ },
444
+ "type": "function"
445
445
  }
446
446
  ]