@cjhyy/code-shell-core 0.7.0 → 0.8.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 (621) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +20 -5
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +20 -4
  26. package/dist/context/manager.js +42 -7
  27. package/dist/context/token-counter.js +5 -3
  28. package/dist/context/tool-result-storage.d.ts +6 -0
  29. package/dist/context/tool-result-storage.js +25 -4
  30. package/dist/credentials/access.d.ts +13 -2
  31. package/dist/credentials/access.js +99 -4
  32. package/dist/credentials/index.d.ts +3 -2
  33. package/dist/credentials/index.js +2 -1
  34. package/dist/credentials/oauth.d.ts +9 -1
  35. package/dist/credentials/oauth.js +80 -1
  36. package/dist/credentials/store.d.ts +16 -2
  37. package/dist/credentials/store.js +33 -11
  38. package/dist/credentials/types.d.ts +62 -1
  39. package/dist/credentials/types.js +16 -1
  40. package/dist/credentials/use-credential-tool.js +15 -1
  41. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  42. package/dist/engine/auxiliary-pipeline.js +181 -0
  43. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  44. package/dist/{settings → engine}/disk-defaults.js +5 -2
  45. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  46. package/dist/engine/dynamic-tool-defs.js +4 -0
  47. package/dist/engine/engine.d.ts +272 -184
  48. package/dist/engine/engine.js +1869 -1864
  49. package/dist/engine/file-history-hook.d.ts +11 -0
  50. package/dist/engine/file-history-hook.js +31 -0
  51. package/dist/engine/goal-judge-context.d.ts +9 -0
  52. package/dist/engine/goal-judge-context.js +234 -0
  53. package/dist/engine/injected-context-cache.d.ts +6 -0
  54. package/dist/engine/injected-context-cache.js +13 -0
  55. package/dist/engine/input-attachments.d.ts +1 -1
  56. package/dist/engine/model-facade.d.ts +3 -3
  57. package/dist/engine/model-facade.js +15 -14
  58. package/dist/engine/permission-controller.d.ts +55 -0
  59. package/dist/engine/permission-controller.js +148 -0
  60. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  61. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  62. package/dist/engine/run-accounting.d.ts +41 -0
  63. package/dist/engine/run-accounting.js +126 -0
  64. package/dist/engine/run-context.d.ts +44 -0
  65. package/dist/engine/run-context.js +88 -0
  66. package/dist/engine/run-environment.d.ts +30 -0
  67. package/dist/engine/run-environment.js +77 -0
  68. package/dist/engine/run-finalize.d.ts +58 -0
  69. package/dist/engine/run-finalize.js +245 -0
  70. package/dist/engine/run-goal.d.ts +58 -0
  71. package/dist/engine/run-goal.js +188 -0
  72. package/dist/engine/run-image-input.d.ts +1 -1
  73. package/dist/engine/run-image-input.js +5 -3
  74. package/dist/engine/run-session-open.d.ts +41 -0
  75. package/dist/engine/run-session-open.js +186 -0
  76. package/dist/engine/run-setup.d.ts +42 -0
  77. package/dist/engine/run-setup.js +58 -0
  78. package/dist/engine/run-tooling.d.ts +125 -0
  79. package/dist/engine/run-tooling.js +283 -0
  80. package/dist/engine/run-types.d.ts +139 -0
  81. package/dist/engine/run-types.js +12 -0
  82. package/dist/engine/run-workspace.d.ts +50 -0
  83. package/dist/engine/run-workspace.js +114 -0
  84. package/dist/engine/session-title.d.ts +2 -1
  85. package/dist/engine/session-title.js +4 -1
  86. package/dist/engine/steer-queue.d.ts +1 -1
  87. package/dist/engine/subagent-spawner.d.ts +32 -0
  88. package/dist/engine/subagent-spawner.js +287 -0
  89. package/dist/engine/tool-summary.d.ts +2 -2
  90. package/dist/engine/tool-summary.js +2 -2
  91. package/dist/engine/turn-loop.d.ts +67 -10
  92. package/dist/engine/turn-loop.js +538 -97
  93. package/dist/engine/types.d.ts +35 -4
  94. package/dist/engine/types.js +1 -1
  95. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
  96. package/dist/goal/lifecycle.js +482 -0
  97. package/dist/hooks/events.d.ts +26 -9
  98. package/dist/hooks/events.js +0 -3
  99. package/dist/hooks/goal-stop-hook.d.ts +28 -29
  100. package/dist/hooks/goal-stop-hook.js +344 -144
  101. package/dist/hooks/registry.js +4 -1
  102. package/dist/hooks/shell-runner.d.ts +12 -1
  103. package/dist/hooks/shell-runner.js +160 -9
  104. package/dist/index.d.ts +51 -110
  105. package/dist/index.extension.d.ts +51 -0
  106. package/dist/index.extension.js +39 -0
  107. package/dist/index.internal.d.ts +86 -0
  108. package/dist/index.internal.js +92 -0
  109. package/dist/index.js +37 -125
  110. package/dist/links/cli.d.ts +48 -0
  111. package/dist/links/cli.js +617 -0
  112. package/dist/links/http.d.ts +40 -0
  113. package/dist/links/http.js +166 -0
  114. package/dist/links/index.d.ts +4 -0
  115. package/dist/links/index.js +3 -0
  116. package/dist/links/link-action-tool.d.ts +5 -0
  117. package/dist/links/link-action-tool.js +241 -0
  118. package/dist/links/providers.d.ts +8 -0
  119. package/dist/links/providers.js +665 -0
  120. package/dist/links/types.d.ts +44 -0
  121. package/dist/llm/client-base.d.ts +7 -0
  122. package/dist/llm/client-base.js +72 -10
  123. package/dist/llm/model-pool.d.ts +1 -1
  124. package/dist/llm/model-pool.js +1 -1
  125. package/dist/llm/providers/anthropic.d.ts +1 -0
  126. package/dist/llm/providers/anthropic.js +9 -0
  127. package/dist/llm/providers/openai.d.ts +1 -0
  128. package/dist/llm/providers/openai.js +17 -0
  129. package/dist/llm/types.d.ts +12 -5
  130. package/dist/model-catalog/index.js +15 -2
  131. package/dist/model-catalog/resolve.d.ts +13 -1
  132. package/dist/model-catalog/resolve.js +37 -2
  133. package/dist/model-catalog/types.d.ts +74 -48
  134. package/dist/model-catalog/types.js +16 -5
  135. package/dist/model-catalog/upsert.d.ts +3 -1
  136. package/dist/model-catalog/upsert.js +9 -0
  137. package/dist/onboarding.d.ts +0 -1
  138. package/dist/onboarding.js +1 -22
  139. package/dist/panel-apps/bindings.d.ts +24 -0
  140. package/dist/panel-apps/bindings.js +69 -0
  141. package/dist/panel-apps/github-archive.d.ts +21 -0
  142. package/dist/panel-apps/github-archive.js +98 -0
  143. package/dist/panel-apps/index.d.ts +4 -0
  144. package/dist/panel-apps/index.js +4 -0
  145. package/dist/panel-apps/installer.d.ts +68 -0
  146. package/dist/panel-apps/installer.js +622 -0
  147. package/dist/panel-apps/manifest.d.ts +364 -0
  148. package/dist/panel-apps/manifest.js +189 -0
  149. package/dist/panel-apps/paths.d.ts +13 -0
  150. package/dist/panel-apps/paths.js +38 -0
  151. package/dist/panel-apps/registry.d.ts +51 -0
  152. package/dist/panel-apps/registry.js +99 -0
  153. package/dist/panel-apps/runtime.d.ts +80 -0
  154. package/dist/panel-apps/runtime.js +154 -0
  155. package/dist/plugins/gitOps.js +8 -1
  156. package/dist/plugins/installedPlugins.d.ts +2 -1
  157. package/dist/plugins/installedPlugins.js +146 -8
  158. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  159. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  160. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  161. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  162. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  163. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  164. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  165. package/dist/plugins/installer/install.d.ts +7 -1
  166. package/dist/plugins/installer/install.js +21 -87
  167. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  168. package/dist/plugins/installer/installFromArchive.js +44 -27
  169. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  170. package/dist/plugins/installer/installFromNpm.js +273 -0
  171. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  172. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  173. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  174. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  175. package/dist/plugins/installer/normalizeManifest.js +306 -0
  176. package/dist/plugins/installer/npmTar.d.ts +13 -0
  177. package/dist/plugins/installer/npmTar.js +321 -0
  178. package/dist/plugins/installer/parseSource.d.ts +11 -0
  179. package/dist/plugins/installer/parseSource.js +48 -0
  180. package/dist/plugins/installer/preview.d.ts +101 -0
  181. package/dist/plugins/installer/preview.js +336 -0
  182. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  183. package/dist/plugins/installer/projectPluginSource.js +140 -0
  184. package/dist/plugins/installer/types.d.ts +775 -0
  185. package/dist/plugins/installer/types.js +100 -0
  186. package/dist/plugins/installer/unzip.d.ts +11 -0
  187. package/dist/plugins/installer/unzip.js +123 -9
  188. package/dist/plugins/installer/update.d.ts +2 -2
  189. package/dist/plugins/installer/update.js +43 -4
  190. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  191. package/dist/plugins/loadPluginHooks.js +97 -86
  192. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  193. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  194. package/dist/plugins/pluginCatalog.d.ts +45 -0
  195. package/dist/plugins/pluginCatalog.js +87 -0
  196. package/dist/plugins/pluginCommandHook.d.ts +10 -4
  197. package/dist/plugins/pluginCommandHook.js +133 -18
  198. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  199. package/dist/plugins/pluginCommandsLoader.js +181 -7
  200. package/dist/plugins/pluginContent.d.ts +10 -1
  201. package/dist/plugins/pluginContent.js +87 -30
  202. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  203. package/dist/plugins/pluginHookApproval.js +160 -0
  204. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  205. package/dist/plugins/pluginHookIntegrity.js +361 -0
  206. package/dist/plugins/pluginInstaller.js +71 -12
  207. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  208. package/dist/plugins/pluginMcpApproval.js +110 -0
  209. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  210. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  211. package/dist/plugins/types.d.ts +30 -0
  212. package/dist/plugins/varRewrite.d.ts +9 -5
  213. package/dist/plugins/varRewrite.js +26 -17
  214. package/dist/preset/index.d.ts +11 -8
  215. package/dist/preset/index.js +62 -203
  216. package/dist/product/define.js +9 -3
  217. package/dist/product/types.d.ts +0 -2
  218. package/dist/profile/activation.d.ts +36 -0
  219. package/dist/profile/activation.js +57 -0
  220. package/dist/profile/catalog-store.d.ts +77 -0
  221. package/dist/profile/catalog-store.js +346 -0
  222. package/dist/profile/catalog.d.ts +54 -0
  223. package/dist/profile/catalog.js +152 -0
  224. package/dist/profile/index.d.ts +7 -0
  225. package/dist/profile/index.js +7 -0
  226. package/dist/profile/requirements.d.ts +76 -0
  227. package/dist/profile/requirements.js +117 -0
  228. package/dist/profile/resolve.d.ts +11 -0
  229. package/dist/profile/resolve.js +41 -0
  230. package/dist/profile/store.d.ts +17 -0
  231. package/dist/profile/store.js +167 -0
  232. package/dist/profile/types.d.ts +321 -0
  233. package/dist/profile/types.js +104 -0
  234. package/dist/prompt/composer.d.ts +46 -7
  235. package/dist/prompt/composer.js +78 -48
  236. package/dist/prompt/instruction-scanner.d.ts +6 -5
  237. package/dist/prompt/instruction-scanner.js +8 -23
  238. package/dist/prompt/section-loader.d.ts +2 -2
  239. package/dist/prompt/section-loader.js +7 -4
  240. package/dist/prompt/sections/browser.md +10 -9
  241. package/dist/prompt/sections/harness-base.md +9 -0
  242. package/dist/protocol/chat-session-manager.d.ts +77 -3
  243. package/dist/protocol/chat-session-manager.js +194 -18
  244. package/dist/protocol/chat-session.d.ts +72 -9
  245. package/dist/protocol/chat-session.js +151 -16
  246. package/dist/protocol/client.d.ts +37 -4
  247. package/dist/protocol/client.js +118 -6
  248. package/dist/protocol/index.d.ts +2 -2
  249. package/dist/protocol/index.js +2 -2
  250. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  251. package/dist/protocol/mobile-remote-types.js +1 -0
  252. package/dist/protocol/server.d.ts +152 -14
  253. package/dist/protocol/server.js +1574 -229
  254. package/dist/protocol/types.d.ts +182 -32
  255. package/dist/protocol/types.js +18 -0
  256. package/dist/run/ArtifactTracker.d.ts +6 -1
  257. package/dist/run/ArtifactTracker.js +29 -21
  258. package/dist/run/EngineRunner.d.ts +2 -0
  259. package/dist/run/EngineRunner.js +1 -0
  260. package/dist/run/RunManager.d.ts +26 -0
  261. package/dist/run/RunManager.js +82 -11
  262. package/dist/run/factory.d.ts +3 -0
  263. package/dist/run/factory.js +2 -0
  264. package/dist/runtime/safe-spawn.d.ts +6 -0
  265. package/dist/runtime/safe-spawn.js +8 -13
  266. package/dist/services/auto-dream.d.ts +13 -1
  267. package/dist/services/auto-dream.js +56 -8
  268. package/dist/services/dream-consolidation.d.ts +3 -0
  269. package/dist/services/dream-consolidation.js +14 -2
  270. package/dist/services/index.d.ts +1 -1
  271. package/dist/services/index.js +1 -1
  272. package/dist/services/memory-orchestrator.js +6 -2
  273. package/dist/services/oauth.d.ts +34 -10
  274. package/dist/services/oauth.js +236 -98
  275. package/dist/services/session-memory.d.ts +4 -4
  276. package/dist/services/session-memory.js +13 -10
  277. package/dist/session/memory.d.ts +26 -7
  278. package/dist/session/memory.js +79 -21
  279. package/dist/session/session-manager.d.ts +208 -25
  280. package/dist/session/session-manager.js +1232 -116
  281. package/dist/session/session-message.d.ts +22 -0
  282. package/dist/session/session-message.js +1 -0
  283. package/dist/session/transcript.d.ts +76 -6
  284. package/dist/session/transcript.js +278 -7
  285. package/dist/settings/feature-flags.d.ts +40 -0
  286. package/dist/settings/feature-flags.js +40 -0
  287. package/dist/settings/manager.d.ts +39 -1
  288. package/dist/settings/manager.js +102 -41
  289. package/dist/settings/migrate-config.js +4 -2
  290. package/dist/settings/schema.d.ts +511 -177
  291. package/dist/settings/schema.js +98 -25
  292. package/dist/skills/scanner.d.ts +6 -2
  293. package/dist/skills/scanner.js +160 -9
  294. package/dist/sources/adapter.d.ts +14 -0
  295. package/dist/sources/adapter.js +7 -0
  296. package/dist/sources/adapters/local-files.d.ts +10 -0
  297. package/dist/sources/adapters/local-files.js +127 -0
  298. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  299. package/dist/sources/adapters/mcp-resource.js +41 -0
  300. package/dist/sources/adapters/mock.d.ts +3 -0
  301. package/dist/sources/adapters/mock.js +29 -0
  302. package/dist/sources/binding.d.ts +6 -0
  303. package/dist/sources/binding.js +24 -0
  304. package/dist/sources/catalog.d.ts +6 -0
  305. package/dist/sources/catalog.js +64 -0
  306. package/dist/sources/context-summary.d.ts +8 -0
  307. package/dist/sources/context-summary.js +13 -0
  308. package/dist/sources/credential-status.d.ts +2 -0
  309. package/dist/sources/credential-status.js +13 -0
  310. package/dist/sources/index.d.ts +10 -0
  311. package/dist/sources/index.js +10 -0
  312. package/dist/sources/resolve.d.ts +28 -0
  313. package/dist/sources/resolve.js +47 -0
  314. package/dist/sources/truncate-utf8.d.ts +7 -0
  315. package/dist/sources/truncate-utf8.js +18 -0
  316. package/dist/sources/types.d.ts +71 -0
  317. package/dist/sources/types.js +26 -0
  318. package/dist/testing/fetch-stub.d.ts +32 -0
  319. package/dist/testing/fetch-stub.js +24 -0
  320. package/dist/themes/image.d.ts +18 -0
  321. package/dist/themes/image.js +117 -0
  322. package/dist/themes/index.d.ts +4 -0
  323. package/dist/themes/index.js +4 -0
  324. package/dist/themes/installer.d.ts +50 -0
  325. package/dist/themes/installer.js +290 -0
  326. package/dist/themes/manifest.d.ts +102 -0
  327. package/dist/themes/manifest.js +86 -0
  328. package/dist/themes/paths.d.ts +14 -0
  329. package/dist/themes/paths.js +33 -0
  330. package/dist/tool-system/browser-bridge.d.ts +53 -11
  331. package/dist/tool-system/browser-bridge.js +8 -9
  332. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  333. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  334. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  335. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  336. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  337. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  338. package/dist/tool-system/builtin/agent-progress.js +83 -0
  339. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  340. package/dist/tool-system/builtin/agent-registry.js +178 -9
  341. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  342. package/dist/tool-system/builtin/agent.d.ts +2 -0
  343. package/dist/tool-system/builtin/agent.js +279 -34
  344. package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
  345. package/dist/tool-system/builtin/background-jobs.js +111 -15
  346. package/dist/tool-system/builtin/background-work.d.ts +12 -1
  347. package/dist/tool-system/builtin/background-work.js +12 -1
  348. package/dist/tool-system/builtin/bash.d.ts +3 -5
  349. package/dist/tool-system/builtin/bash.js +14 -6
  350. package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
  351. package/dist/tool-system/builtin/browser-tools.js +89 -23
  352. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  353. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  354. package/dist/tool-system/builtin/edit.d.ts +2 -1
  355. package/dist/tool-system/builtin/edit.js +14 -10
  356. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  357. package/dist/tool-system/builtin/file-cache.js +4 -0
  358. package/dist/tool-system/builtin/generate-image.js +17 -10
  359. package/dist/tool-system/builtin/generate-video.d.ts +4 -0
  360. package/dist/tool-system/builtin/generate-video.js +164 -28
  361. package/dist/tool-system/builtin/glob.d.ts +2 -1
  362. package/dist/tool-system/builtin/glob.js +28 -3
  363. package/dist/tool-system/builtin/grep.d.ts +1 -0
  364. package/dist/tool-system/builtin/grep.js +82 -17
  365. package/dist/tool-system/builtin/image-uploader.js +7 -1
  366. package/dist/tool-system/builtin/index.d.ts +57 -18
  367. package/dist/tool-system/builtin/index.js +280 -167
  368. package/dist/tool-system/builtin/memory.d.ts +6 -0
  369. package/dist/tool-system/builtin/memory.js +36 -15
  370. package/dist/tool-system/builtin/panel.d.ts +9 -0
  371. package/dist/tool-system/builtin/panel.js +314 -0
  372. package/dist/tool-system/builtin/read.js +5 -1
  373. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  374. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  375. package/dist/tool-system/builtin/sources.d.ts +8 -0
  376. package/dist/tool-system/builtin/sources.js +137 -0
  377. package/dist/tool-system/builtin/tool-search.js +7 -2
  378. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  379. package/dist/tool-system/builtin/video-providers.d.ts +12 -15
  380. package/dist/tool-system/builtin/video-providers.js +1 -0
  381. package/dist/tool-system/builtin/view-image.d.ts +2 -2
  382. package/dist/tool-system/builtin/web-fetch.js +60 -15
  383. package/dist/tool-system/builtin/web-search.js +1 -3
  384. package/dist/tool-system/builtin/write.d.ts +2 -1
  385. package/dist/tool-system/builtin/write.js +14 -4
  386. package/dist/tool-system/capability-module.d.ts +93 -0
  387. package/dist/tool-system/capability-module.js +53 -0
  388. package/dist/tool-system/context.d.ts +94 -24
  389. package/dist/tool-system/executor.js +99 -58
  390. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  391. package/dist/tool-system/external-tool-exposure.js +304 -0
  392. package/dist/tool-system/mcp-manager.d.ts +17 -1
  393. package/dist/tool-system/mcp-manager.js +72 -7
  394. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  395. package/dist/tool-system/mcp-tool-policy.js +34 -0
  396. package/dist/tool-system/panel-bridge.d.ts +53 -0
  397. package/dist/tool-system/panel-bridge.js +1 -0
  398. package/dist/tool-system/path-policy.d.ts +19 -0
  399. package/dist/tool-system/path-policy.js +62 -1
  400. package/dist/tool-system/permission.d.ts +69 -3
  401. package/dist/tool-system/permission.js +429 -30
  402. package/dist/tool-system/registry.d.ts +15 -3
  403. package/dist/tool-system/registry.js +82 -40
  404. package/dist/tool-system/sandbox/index.js +3 -8
  405. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  406. package/dist/tool-system/session-tool-host.d.ts +139 -0
  407. package/dist/tool-system/session-tool-host.js +167 -0
  408. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  409. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  410. package/dist/tool-system/validation.d.ts +14 -7
  411. package/dist/tool-system/validation.js +701 -7
  412. package/dist/types.d.ts +201 -20
  413. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  414. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  415. package/dist/utils/file-mutex.d.ts +65 -0
  416. package/dist/utils/file-mutex.js +145 -0
  417. package/dist/utils/json.d.ts +2 -4
  418. package/dist/utils/json.js +2 -4
  419. package/dist/utils/lockfile.d.ts +30 -1
  420. package/dist/utils/lockfile.js +2 -2
  421. package/dist/utils/secret-scrubber.d.ts +8 -0
  422. package/dist/utils/secret-scrubber.js +227 -0
  423. package/dist/utils/toolDisplay.js +1 -1
  424. package/package.json +20 -5
  425. package/THIRD_PARTY_NOTICES.md +0 -206
  426. package/dist/arena/arena.d.ts +0 -43
  427. package/dist/arena/arena.js +0 -333
  428. package/dist/arena/context/context-tools.d.ts +0 -16
  429. package/dist/arena/context/context-tools.js +0 -272
  430. package/dist/arena/context/within-root.d.ts +0 -7
  431. package/dist/arena/context/within-root.js +0 -15
  432. package/dist/arena/detect-mode.d.ts +0 -20
  433. package/dist/arena/detect-mode.js +0 -78
  434. package/dist/arena/digest-builder.d.ts +0 -25
  435. package/dist/arena/digest-builder.js +0 -120
  436. package/dist/arena/index.d.ts +0 -29
  437. package/dist/arena/index.js +0 -29
  438. package/dist/arena/iterate/convergence.d.ts +0 -25
  439. package/dist/arena/iterate/convergence.js +0 -103
  440. package/dist/arena/iterate/formats/index.d.ts +0 -22
  441. package/dist/arena/iterate/formats/index.js +0 -283
  442. package/dist/arena/iterate/index.d.ts +0 -11
  443. package/dist/arena/iterate/index.js +0 -9
  444. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  445. package/dist/arena/iterate/iterative-arena.js +0 -237
  446. package/dist/arena/iterate/parse.d.ts +0 -42
  447. package/dist/arena/iterate/parse.js +0 -123
  448. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  449. package/dist/arena/iterate/phases/argue.js +0 -165
  450. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  451. package/dist/arena/iterate/phases/revise.js +0 -62
  452. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  453. package/dist/arena/iterate/phases/tournament.js +0 -113
  454. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  455. package/dist/arena/iterate/tools/web-tools.js +0 -54
  456. package/dist/arena/iterate/types.d.ts +0 -152
  457. package/dist/arena/iterate/types.js +0 -8
  458. package/dist/arena/ledger.d.ts +0 -47
  459. package/dist/arena/ledger.js +0 -159
  460. package/dist/arena/lenses/architecture.d.ts +0 -5
  461. package/dist/arena/lenses/architecture.js +0 -22
  462. package/dist/arena/lenses/engineering.d.ts +0 -5
  463. package/dist/arena/lenses/engineering.js +0 -22
  464. package/dist/arena/lenses/general.d.ts +0 -5
  465. package/dist/arena/lenses/general.js +0 -20
  466. package/dist/arena/lenses/index.d.ts +0 -16
  467. package/dist/arena/lenses/index.js +0 -47
  468. package/dist/arena/lenses/product.d.ts +0 -5
  469. package/dist/arena/lenses/product.js +0 -22
  470. package/dist/arena/model-presets.d.ts +0 -23
  471. package/dist/arena/model-presets.js +0 -44
  472. package/dist/arena/phases/adjudication.d.ts +0 -24
  473. package/dist/arena/phases/adjudication.js +0 -141
  474. package/dist/arena/phases/build-consensus.d.ts +0 -29
  475. package/dist/arena/phases/build-consensus.js +0 -83
  476. package/dist/arena/phases/claim-registry.d.ts +0 -26
  477. package/dist/arena/phases/claim-registry.js +0 -60
  478. package/dist/arena/phases/cross-review.d.ts +0 -45
  479. package/dist/arena/phases/cross-review.js +0 -218
  480. package/dist/arena/phases/debate-rounds.d.ts +0 -27
  481. package/dist/arena/phases/debate-rounds.js +0 -159
  482. package/dist/arena/phases/participant-research.d.ts +0 -38
  483. package/dist/arena/phases/participant-research.js +0 -314
  484. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
  485. package/dist/arena/phases/planning-detail-expansion.js +0 -119
  486. package/dist/arena/planner.d.ts +0 -27
  487. package/dist/arena/planner.js +0 -311
  488. package/dist/arena/providers/docs.d.ts +0 -7
  489. package/dist/arena/providers/docs.js +0 -111
  490. package/dist/arena/providers/git.d.ts +0 -8
  491. package/dist/arena/providers/git.js +0 -174
  492. package/dist/arena/providers/index.d.ts +0 -32
  493. package/dist/arena/providers/index.js +0 -132
  494. package/dist/arena/providers/none.d.ts +0 -7
  495. package/dist/arena/providers/none.js +0 -11
  496. package/dist/arena/providers/repo.d.ts +0 -7
  497. package/dist/arena/providers/repo.js +0 -258
  498. package/dist/arena/render/session.d.ts +0 -17
  499. package/dist/arena/render/session.js +0 -190
  500. package/dist/arena/render/terminal.d.ts +0 -34
  501. package/dist/arena/render/terminal.js +0 -286
  502. package/dist/arena/strategies/discussion.d.ts +0 -25
  503. package/dist/arena/strategies/discussion.js +0 -143
  504. package/dist/arena/strategies/index.d.ts +0 -15
  505. package/dist/arena/strategies/index.js +0 -28
  506. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  507. package/dist/arena/strategies/language-wrapper.js +0 -102
  508. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  509. package/dist/arena/strategies/lens-wrapper.js +0 -236
  510. package/dist/arena/strategies/planning.d.ts +0 -30
  511. package/dist/arena/strategies/planning.js +0 -225
  512. package/dist/arena/strategies/review.d.ts +0 -26
  513. package/dist/arena/strategies/review.js +0 -168
  514. package/dist/arena/strategies/utils.d.ts +0 -36
  515. package/dist/arena/strategies/utils.js +0 -603
  516. package/dist/arena/tools/selector.d.ts +0 -17
  517. package/dist/arena/tools/selector.js +0 -61
  518. package/dist/arena/transitions.d.ts +0 -53
  519. package/dist/arena/transitions.js +0 -97
  520. package/dist/arena/types.d.ts +0 -514
  521. package/dist/arena/types.js +0 -27
  522. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  523. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  524. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  525. package/dist/cc-orchestrator/cc-capability.js +0 -53
  526. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  527. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  528. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  529. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  530. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  531. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  532. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  533. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  534. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  535. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  536. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  537. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  538. package/dist/cc-orchestrator/index.d.ts +0 -8
  539. package/dist/cc-orchestrator/index.js +0 -8
  540. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  541. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  542. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  543. package/dist/cc-orchestrator/session-discovery.js +0 -125
  544. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  545. package/dist/cc-orchestrator/session-history.js +0 -150
  546. package/dist/cron/cron-runtime.d.ts +0 -2
  547. package/dist/cron/cron-runtime.js +0 -2
  548. package/dist/cron/cron-store.d.ts +0 -2
  549. package/dist/cron/cron-store.js +0 -2
  550. package/dist/cron/scheduler.d.ts +0 -7
  551. package/dist/cron/scheduler.js +0 -7
  552. package/dist/engine/goal.js +0 -206
  553. package/dist/external-agents/config.d.ts +0 -2
  554. package/dist/external-agents/config.js +0 -15
  555. package/dist/external-agents/types.d.ts +0 -31
  556. package/dist/git/parse-log.d.ts +0 -13
  557. package/dist/git/parse-log.js +0 -21
  558. package/dist/git/utils.d.ts +0 -49
  559. package/dist/git/utils.js +0 -161
  560. package/dist/git/worktree/crud.d.ts +0 -69
  561. package/dist/git/worktree/crud.js +0 -206
  562. package/dist/git/worktree/diff.d.ts +0 -14
  563. package/dist/git/worktree/diff.js +0 -82
  564. package/dist/git/worktree/git-exec.d.ts +0 -7
  565. package/dist/git/worktree/git-exec.js +0 -51
  566. package/dist/git/worktree/index.d.ts +0 -5
  567. package/dist/git/worktree/index.js +0 -5
  568. package/dist/git/worktree/query.d.ts +0 -42
  569. package/dist/git/worktree/query.js +0 -121
  570. package/dist/git/worktree/slug.d.ts +0 -11
  571. package/dist/git/worktree/slug.js +0 -58
  572. package/dist/git/worktree.d.ts +0 -1
  573. package/dist/git/worktree.js +0 -5
  574. package/dist/lsp/client.d.ts +0 -41
  575. package/dist/lsp/client.js +0 -186
  576. package/dist/lsp/manager.d.ts +0 -40
  577. package/dist/lsp/manager.js +0 -155
  578. package/dist/lsp/root-path.d.ts +0 -9
  579. package/dist/lsp/root-path.js +0 -12
  580. package/dist/lsp/servers.d.ts +0 -16
  581. package/dist/lsp/servers.js +0 -60
  582. package/dist/prompt/sections/coding.md +0 -35
  583. package/dist/quota/credentials.d.ts +0 -3
  584. package/dist/quota/credentials.js +0 -80
  585. package/dist/quota/index.d.ts +0 -36
  586. package/dist/quota/index.js +0 -155
  587. package/dist/quota/types.d.ts +0 -48
  588. package/dist/quota/types.js +0 -13
  589. package/dist/review/review-prompt.d.ts +0 -28
  590. package/dist/review/review-prompt.js +0 -81
  591. package/dist/state.d.ts +0 -160
  592. package/dist/state.js +0 -267
  593. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  594. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  595. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  596. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  597. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  598. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  599. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  600. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  601. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  602. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  603. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  604. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  605. package/dist/tool-system/builtin/arena.d.ts +0 -31
  606. package/dist/tool-system/builtin/arena.js +0 -415
  607. package/dist/tool-system/builtin/brief.d.ts +0 -6
  608. package/dist/tool-system/builtin/brief.js +0 -41
  609. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  610. package/dist/tool-system/builtin/check-quota.js +0 -34
  611. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  612. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  613. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  614. package/dist/tool-system/builtin/lsp.js +0 -144
  615. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  616. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  617. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  618. package/dist/tool-system/builtin/worktree.js +0 -345
  619. /package/dist/{external-agents → links}/types.js +0 -0
  620. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  621. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -1,12 +1,10 @@
1
1
  /**
2
- * Lightweight tool input validation against a JSON Schema.
2
+ * Compatibility validator used by existing built-ins and third-party MCP
3
+ * schemas. It checks `required` presence and top-level primitive types only;
4
+ * changing that permissive contract would be a broad compatibility break.
3
5
  *
4
- * NOT a full JSON-Schema validator: it only checks `required` presence and
5
- * top-level primitive types (string/number/boolean). Arrays, objects, enums,
6
- * nested shapes, and formats are intentionally NOT validated — this is a
7
- * cheap pre-flight guard, not a substitute for the provider's own schema
8
- * enforcement. (Was previously labelled "Zod-based" and imported `z`, but
9
- * never used zod — corrected to avoid misleading readers.)
6
+ * Reviewed Panel App schemas use the fail-closed recursive validator exported
7
+ * later in this module (`validateToolArgsStrict`).
10
8
  */
11
9
  /**
12
10
  * Validate tool args against the tool's inputSchema.
@@ -50,3 +48,699 @@ export function validateToolArgs(toolName, args, schema) {
50
48
  return null; // Don't block on validation errors
51
49
  }
52
50
  }
51
+ function schemaObject(value) {
52
+ if (!value || typeof value !== "object" || Array.isArray(value))
53
+ return false;
54
+ const prototype = Object.getPrototypeOf(value);
55
+ return prototype === Object.prototype || prototype === null;
56
+ }
57
+ function schemaTypeMatches(value, type) {
58
+ if (type === "null")
59
+ return value === null;
60
+ if (type === "array")
61
+ return Array.isArray(value);
62
+ if (type === "object")
63
+ return schemaObject(value);
64
+ if (type === "integer")
65
+ return typeof value === "number" && Number.isFinite(value) && Number.isInteger(value);
66
+ if (type === "number")
67
+ return typeof value === "number" && Number.isFinite(value);
68
+ return typeof value === type;
69
+ }
70
+ function schemaTypeLabel(type) {
71
+ if (type === "integer")
72
+ return "an integer";
73
+ if (type === "array")
74
+ return "an array";
75
+ if (type === "object")
76
+ return "an object";
77
+ if (type === "number")
78
+ return "a finite number";
79
+ if (type === "boolean")
80
+ return "a boolean";
81
+ if (type === "null")
82
+ return "null";
83
+ return `a ${type}`;
84
+ }
85
+ function schemaPath(parent, key) {
86
+ if (typeof key === "number")
87
+ return `${parent}[${key}]`;
88
+ return parent ? `${parent}.${key}` : key;
89
+ }
90
+ function schemaValueKey(value, depth = 0) {
91
+ if (depth > 64)
92
+ return null;
93
+ if (value === null)
94
+ return "null";
95
+ if (typeof value === "string")
96
+ return `string:${JSON.stringify(value)}`;
97
+ if (typeof value === "boolean")
98
+ return `boolean:${value}`;
99
+ if (typeof value === "number") {
100
+ if (!Number.isFinite(value))
101
+ return null;
102
+ return `number:${value === 0 ? 0 : value}`;
103
+ }
104
+ if (Array.isArray(value)) {
105
+ const items = value.map((item) => schemaValueKey(item, depth + 1));
106
+ if (items.some((item) => item === null))
107
+ return null;
108
+ return `array:[${items.join(",")}]`;
109
+ }
110
+ if (!schemaObject(value))
111
+ return null;
112
+ const entries = Object.keys(value)
113
+ .sort()
114
+ .map((key) => {
115
+ const child = schemaValueKey(value[key], depth + 1);
116
+ return child === null ? null : `${JSON.stringify(key)}:${child}`;
117
+ });
118
+ if (entries.some((entry) => entry === null))
119
+ return null;
120
+ return `object:{${entries.join(",")}}`;
121
+ }
122
+ function schemaValueEqual(left, right) {
123
+ if (Object.is(left, right))
124
+ return true;
125
+ const leftKey = schemaValueKey(left);
126
+ const rightKey = schemaValueKey(right);
127
+ return leftKey !== null && rightKey !== null && leftKey === rightKey;
128
+ }
129
+ function branchRelevance(value, branch, root) {
130
+ if (!schemaObject(value) || !schemaObject(branch))
131
+ return 0;
132
+ let candidate = branch;
133
+ if (typeof candidate.$ref === "string") {
134
+ const referenced = resolveLocalSchemaReference(root, candidate.$ref);
135
+ if (referenced && schemaObject(referenced))
136
+ candidate = referenced;
137
+ }
138
+ const properties = schemaObject(candidate.properties) ? candidate.properties : {};
139
+ let score = 0;
140
+ for (const [key, property] of Object.entries(properties)) {
141
+ if (!Object.hasOwn(value, key) || !schemaObject(property))
142
+ continue;
143
+ if (Object.hasOwn(property, "const")) {
144
+ score += schemaValueEqual(value[key], property.const) ? 1_000 : -1_000;
145
+ }
146
+ else if (Array.isArray(property.enum)) {
147
+ score += property.enum.some((entry) => schemaValueEqual(value[key], entry)) ? 500 : -500;
148
+ }
149
+ }
150
+ if (Array.isArray(candidate.required)) {
151
+ for (const field of candidate.required) {
152
+ if (typeof field === "string")
153
+ score += Object.hasOwn(value, field) ? 1 : -1;
154
+ }
155
+ }
156
+ return score;
157
+ }
158
+ function relevantBranchError(value, branches, errors, root) {
159
+ let bestIndex = -1;
160
+ let bestScore = Number.NEGATIVE_INFINITY;
161
+ for (const [index, error] of errors.entries()) {
162
+ if (error === null)
163
+ continue;
164
+ const score = branchRelevance(value, branches[index], root);
165
+ if (score > bestScore) {
166
+ bestIndex = index;
167
+ bestScore = score;
168
+ }
169
+ }
170
+ return bestIndex >= 0 ? errors[bestIndex] : null;
171
+ }
172
+ function strictSchemaFailure(error) {
173
+ return Boolean(error?.startsWith("Invalid JSON Schema") ||
174
+ error?.startsWith("Unsupported or unresolved JSON Schema") ||
175
+ error?.includes("exceeds the schema evaluation limit") ||
176
+ error?.includes("exceeds the schema depth limit"));
177
+ }
178
+ function resolveLocalSchemaReference(root, reference) {
179
+ if (reference === "#")
180
+ return root;
181
+ if (!reference.startsWith("#/"))
182
+ return null;
183
+ let current = root;
184
+ for (const rawSegment of reference.slice(2).split("/")) {
185
+ const segment = rawSegment.replaceAll("~1", "/").replaceAll("~0", "~");
186
+ if (!schemaObject(current) || !Object.hasOwn(current, segment))
187
+ return null;
188
+ current = current[segment];
189
+ }
190
+ return typeof current === "boolean" || schemaObject(current) ? current : null;
191
+ }
192
+ const STRICT_SCHEMA_KEYWORDS = new Set([
193
+ "$schema",
194
+ "$id",
195
+ "$ref",
196
+ "$defs",
197
+ "$comment",
198
+ "title",
199
+ "description",
200
+ "default",
201
+ "examples",
202
+ "deprecated",
203
+ "readOnly",
204
+ "writeOnly",
205
+ "allOf",
206
+ "anyOf",
207
+ "oneOf",
208
+ "not",
209
+ "if",
210
+ "then",
211
+ "else",
212
+ "type",
213
+ "enum",
214
+ "const",
215
+ "multipleOf",
216
+ "maximum",
217
+ "exclusiveMaximum",
218
+ "minimum",
219
+ "exclusiveMinimum",
220
+ "maxLength",
221
+ "minLength",
222
+ "pattern",
223
+ "maxItems",
224
+ "minItems",
225
+ "uniqueItems",
226
+ "items",
227
+ "maxProperties",
228
+ "minProperties",
229
+ "required",
230
+ "properties",
231
+ "additionalProperties",
232
+ ]);
233
+ const MAX_STRICT_SCHEMA_PATTERN_LENGTH = 512;
234
+ const MAX_STRICT_PATTERN_INPUT_LENGTH = 10_000;
235
+ const MAX_STRICT_VALUE_NODES = 20_000;
236
+ const MAX_STRICT_SCHEMA_EVALUATIONS = 100_000;
237
+ function validateStrictJsonValue(value, path, depth, ancestors, budget) {
238
+ budget.remaining -= 1;
239
+ if (budget.remaining < 0) {
240
+ return `Parameter '${path || "arguments"}' exceeds the JSON value-size limit`;
241
+ }
242
+ if (depth > 64) {
243
+ return `Parameter '${path || "arguments"}' exceeds the JSON value depth limit`;
244
+ }
245
+ if (value === null || typeof value === "string" || typeof value === "boolean")
246
+ return null;
247
+ if (typeof value === "number") {
248
+ return Number.isFinite(value)
249
+ ? null
250
+ : `Parameter '${path || "arguments"}' must contain only finite JSON numbers`;
251
+ }
252
+ if (Array.isArray(value)) {
253
+ if (ancestors.has(value)) {
254
+ return `Parameter '${path || "arguments"}' contains a circular JSON value`;
255
+ }
256
+ ancestors.add(value);
257
+ for (const [index, child] of value.entries()) {
258
+ const error = validateStrictJsonValue(child, schemaPath(path, index), depth + 1, ancestors, budget);
259
+ if (error)
260
+ return error;
261
+ }
262
+ ancestors.delete(value);
263
+ return null;
264
+ }
265
+ if (schemaObject(value)) {
266
+ if (ancestors.has(value)) {
267
+ return `Parameter '${path || "arguments"}' contains a circular JSON value`;
268
+ }
269
+ ancestors.add(value);
270
+ for (const [key, child] of Object.entries(value)) {
271
+ const error = validateStrictJsonValue(child, schemaPath(path, key), depth + 1, ancestors, budget);
272
+ if (error)
273
+ return error;
274
+ }
275
+ ancestors.delete(value);
276
+ return null;
277
+ }
278
+ return `Parameter '${path || "arguments"}' must contain only JSON values`;
279
+ }
280
+ function supportedStrictSchemaPattern(pattern) {
281
+ if (pattern.length > MAX_STRICT_SCHEMA_PATTERN_LENGTH)
282
+ return false;
283
+ let escaped = false;
284
+ let inCharacterClass = false;
285
+ let variableQuantifiers = 0;
286
+ for (let index = 0; index < pattern.length; index += 1) {
287
+ const character = pattern[index];
288
+ if (escaped) {
289
+ if (!inCharacterClass && /[1-9k]/u.test(character))
290
+ return false;
291
+ escaped = false;
292
+ continue;
293
+ }
294
+ if (character === "\\") {
295
+ escaped = true;
296
+ continue;
297
+ }
298
+ if (character === "[" && !inCharacterClass) {
299
+ inCharacterClass = true;
300
+ continue;
301
+ }
302
+ if (character === "]" && inCharacterClass) {
303
+ inCharacterClass = false;
304
+ continue;
305
+ }
306
+ if (!inCharacterClass && ["(", ")", "|", "."].includes(character))
307
+ return false;
308
+ if (!inCharacterClass && ["*", "+", "?"].includes(character)) {
309
+ variableQuantifiers += 1;
310
+ continue;
311
+ }
312
+ if (!inCharacterClass && character === "{") {
313
+ const closingBrace = pattern.indexOf("}", index + 1);
314
+ if (closingBrace < 0)
315
+ return false;
316
+ const body = pattern.slice(index + 1, closingBrace);
317
+ const match = /^(\d+)(?:,(\d+))?$/u.exec(body);
318
+ if (!match)
319
+ return false;
320
+ const minimum = Number(match[1]);
321
+ const maximum = match[2] === undefined ? minimum : Number(match[2]);
322
+ if (!Number.isSafeInteger(minimum) ||
323
+ !Number.isSafeInteger(maximum) ||
324
+ minimum > maximum ||
325
+ maximum > MAX_STRICT_PATTERN_INPUT_LENGTH) {
326
+ return false;
327
+ }
328
+ if (minimum !== maximum)
329
+ variableQuantifiers += 1;
330
+ index = closingBrace;
331
+ continue;
332
+ }
333
+ if (!inCharacterClass && character === "}")
334
+ return false;
335
+ }
336
+ if (escaped || inCharacterClass || variableQuantifiers > 1)
337
+ return false;
338
+ try {
339
+ new RegExp(pattern, "u");
340
+ return true;
341
+ }
342
+ catch {
343
+ return false;
344
+ }
345
+ }
346
+ function validateStrictSchemaDefinition(schema, root, path, depth, seen) {
347
+ if (depth > 64)
348
+ return `Invalid JSON Schema: '${path}' exceeds the schema depth limit`;
349
+ if (typeof schema === "boolean")
350
+ return null;
351
+ if (!schemaObject(schema))
352
+ return `Invalid JSON Schema at '${path}'`;
353
+ if (seen.has(schema))
354
+ return null;
355
+ seen.add(schema);
356
+ const label = path || "arguments";
357
+ for (const keyword of Object.keys(schema)) {
358
+ if (!STRICT_SCHEMA_KEYWORDS.has(keyword)) {
359
+ return `Unsupported JSON Schema keyword '${keyword}' at '${label}'`;
360
+ }
361
+ }
362
+ for (const keyword of ["$schema", "$id", "$comment", "title", "description"]) {
363
+ if (schema[keyword] !== undefined && typeof schema[keyword] !== "string") {
364
+ return `Invalid JSON Schema ${keyword} at '${label}'`;
365
+ }
366
+ }
367
+ for (const keyword of ["deprecated", "readOnly", "writeOnly"]) {
368
+ if (schema[keyword] !== undefined && typeof schema[keyword] !== "boolean") {
369
+ return `Invalid JSON Schema ${keyword} at '${label}'`;
370
+ }
371
+ }
372
+ if (schema.examples !== undefined && !Array.isArray(schema.examples)) {
373
+ return `Invalid JSON Schema examples at '${label}'`;
374
+ }
375
+ if (schema.$ref !== undefined) {
376
+ if (typeof schema.$ref !== "string") {
377
+ return `Invalid JSON Schema reference at '${label}'`;
378
+ }
379
+ const referenced = resolveLocalSchemaReference(root, schema.$ref);
380
+ if (!referenced)
381
+ return `Unsupported or unresolved JSON Schema reference: ${schema.$ref}`;
382
+ const referenceError = validateStrictSchemaDefinition(referenced, root, `${label}.$ref`, depth + 1, seen);
383
+ if (referenceError)
384
+ return referenceError;
385
+ }
386
+ const declaredTypes = typeof schema.type === "string"
387
+ ? [schema.type]
388
+ : Array.isArray(schema.type) && schema.type.every((type) => typeof type === "string")
389
+ ? schema.type
390
+ : schema.type === undefined
391
+ ? []
392
+ : null;
393
+ if (declaredTypes === null ||
394
+ (schema.type !== undefined && declaredTypes.length === 0) ||
395
+ declaredTypes.length !== new Set(declaredTypes).size ||
396
+ declaredTypes.some((type) => !["null", "array", "object", "integer", "number", "string", "boolean"].includes(type))) {
397
+ return `Invalid JSON Schema type at '${label}'`;
398
+ }
399
+ if (schema.enum !== undefined) {
400
+ if (!Array.isArray(schema.enum) || schema.enum.length === 0) {
401
+ return `Invalid JSON Schema enum at '${label}'`;
402
+ }
403
+ const enumKeys = schema.enum.map((candidate) => schemaValueKey(candidate));
404
+ if (enumKeys.some((key) => key === null) ||
405
+ new Set(enumKeys).size !== enumKeys.length) {
406
+ return `Invalid JSON Schema enum at '${label}'`;
407
+ }
408
+ }
409
+ for (const keyword of ["minimum", "maximum", "exclusiveMinimum", "exclusiveMaximum"]) {
410
+ if (schema[keyword] !== undefined &&
411
+ (typeof schema[keyword] !== "number" || !Number.isFinite(schema[keyword]))) {
412
+ return `Invalid JSON Schema ${keyword} at '${label}'`;
413
+ }
414
+ }
415
+ if (schema.multipleOf !== undefined &&
416
+ (typeof schema.multipleOf !== "number" ||
417
+ !Number.isFinite(schema.multipleOf) ||
418
+ schema.multipleOf <= 0)) {
419
+ return `Invalid JSON Schema multipleOf at '${label}'`;
420
+ }
421
+ for (const keyword of [
422
+ "minLength",
423
+ "maxLength",
424
+ "minItems",
425
+ "maxItems",
426
+ "minProperties",
427
+ "maxProperties",
428
+ ]) {
429
+ const value = schema[keyword];
430
+ if (value !== undefined &&
431
+ (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0)) {
432
+ return `Invalid JSON Schema ${keyword} at '${label}'`;
433
+ }
434
+ }
435
+ if (schema.uniqueItems !== undefined && typeof schema.uniqueItems !== "boolean") {
436
+ return `Invalid JSON Schema uniqueItems at '${label}'`;
437
+ }
438
+ if (schema.pattern !== undefined) {
439
+ if (typeof schema.pattern !== "string" || !supportedStrictSchemaPattern(schema.pattern)) {
440
+ return `Invalid JSON Schema pattern at '${label}'`;
441
+ }
442
+ }
443
+ if (schema.required !== undefined &&
444
+ (!Array.isArray(schema.required) ||
445
+ schema.required.some((field) => typeof field !== "string") ||
446
+ schema.required.length !== new Set(schema.required).size)) {
447
+ return `Invalid JSON Schema required-list at '${label}'`;
448
+ }
449
+ if (schema.$defs !== undefined && !schemaObject(schema.$defs)) {
450
+ return `Invalid JSON Schema $defs at '${label}'`;
451
+ }
452
+ if (schema.properties !== undefined && !schemaObject(schema.properties)) {
453
+ return `Invalid JSON Schema properties at '${label}'`;
454
+ }
455
+ const nestedSchemas = [];
456
+ for (const keyword of ["$defs", "properties"]) {
457
+ if (!schemaObject(schema[keyword]))
458
+ continue;
459
+ for (const [key, child] of Object.entries(schema[keyword])) {
460
+ nestedSchemas.push([`${label}.${keyword}.${key}`, child]);
461
+ }
462
+ }
463
+ for (const keyword of ["allOf", "anyOf", "oneOf"]) {
464
+ const branches = schema[keyword];
465
+ if (branches === undefined)
466
+ continue;
467
+ if (!Array.isArray(branches) ||
468
+ branches.length === 0 ||
469
+ branches.some((branch) => typeof branch !== "boolean" && !schemaObject(branch))) {
470
+ return `Invalid JSON Schema ${keyword} at '${label}'`;
471
+ }
472
+ branches.forEach((branch, index) => nestedSchemas.push([`${label}.${keyword}[${index}]`, branch]));
473
+ }
474
+ for (const keyword of ["not", "if", "then", "else", "items", "additionalProperties"]) {
475
+ const child = schema[keyword];
476
+ if (child === undefined)
477
+ continue;
478
+ if (typeof child !== "boolean" && !schemaObject(child)) {
479
+ return `Invalid JSON Schema ${keyword} at '${label}'`;
480
+ }
481
+ nestedSchemas.push([`${label}.${keyword}`, child]);
482
+ }
483
+ for (const [childPath, child] of nestedSchemas) {
484
+ const childError = validateStrictSchemaDefinition(child, root, childPath, depth + 1, seen);
485
+ if (childError)
486
+ return childError;
487
+ }
488
+ return null;
489
+ }
490
+ function validateStrictSchemaValue(value, schema, root, path, depth, budget) {
491
+ budget.remaining -= 1;
492
+ if (budget.remaining < 0) {
493
+ return `Parameter '${path || "arguments"}' exceeds the schema evaluation limit`;
494
+ }
495
+ if (depth > 64)
496
+ return `Parameter '${path || "arguments"}' exceeds the schema depth limit`;
497
+ if (schema === true)
498
+ return null;
499
+ if (schema === false)
500
+ return `Parameter '${path || "arguments"}' is not allowed`;
501
+ if (!schemaObject(schema))
502
+ return `Invalid JSON Schema at '${path || "arguments"}'`;
503
+ if (typeof schema.$ref === "string") {
504
+ const referenced = resolveLocalSchemaReference(root, schema.$ref);
505
+ if (!referenced)
506
+ return `Unsupported or unresolved JSON Schema reference: ${schema.$ref}`;
507
+ const referenceError = validateStrictSchemaValue(value, referenced, root, path, depth + 1, budget);
508
+ if (referenceError)
509
+ return referenceError;
510
+ }
511
+ for (const keyword of ["allOf", "anyOf", "oneOf"]) {
512
+ const branches = schema[keyword];
513
+ if (branches === undefined)
514
+ continue;
515
+ if (!Array.isArray(branches) ||
516
+ branches.some((branch) => typeof branch !== "boolean" && !schemaObject(branch))) {
517
+ return `Invalid JSON Schema ${keyword} at '${path || "arguments"}'`;
518
+ }
519
+ const errors = branches.map((branch) => validateStrictSchemaValue(value, branch, root, path, depth + 1, budget));
520
+ const schemaFailure = errors.find(strictSchemaFailure);
521
+ if (schemaFailure)
522
+ return schemaFailure;
523
+ const matches = errors.filter((error) => error === null).length;
524
+ if (keyword === "allOf" && matches !== branches.length) {
525
+ return (errors.find((error) => error !== null) ?? `Parameter '${path}' is invalid`);
526
+ }
527
+ if (keyword === "anyOf" && matches === 0) {
528
+ return (relevantBranchError(value, branches, errors, root) ??
529
+ `Parameter '${path}' is invalid`);
530
+ }
531
+ if (keyword === "oneOf" && matches !== 1) {
532
+ return matches === 0
533
+ ? (relevantBranchError(value, branches, errors, root) ??
534
+ `Parameter '${path}' must match one allowed shape`)
535
+ : `Parameter '${path || "arguments"}' matches more than one oneOf branch`;
536
+ }
537
+ }
538
+ if (schema.not !== undefined) {
539
+ if (typeof schema.not !== "boolean" && !schemaObject(schema.not)) {
540
+ return `Invalid JSON Schema not-clause at '${path || "arguments"}'`;
541
+ }
542
+ const notError = validateStrictSchemaValue(value, schema.not, root, path, depth + 1, budget);
543
+ if (strictSchemaFailure(notError))
544
+ return notError;
545
+ if (notError === null) {
546
+ return `Parameter '${path || "arguments"}' matches a forbidden shape`;
547
+ }
548
+ }
549
+ if (schema.if !== undefined) {
550
+ if (typeof schema.if !== "boolean" && !schemaObject(schema.if)) {
551
+ return `Invalid JSON Schema if-clause at '${path || "arguments"}'`;
552
+ }
553
+ const conditionError = validateStrictSchemaValue(value, schema.if, root, path, depth + 1, budget);
554
+ if (strictSchemaFailure(conditionError))
555
+ return conditionError;
556
+ const conditionMatches = conditionError === null;
557
+ const selected = conditionMatches ? schema.then : schema.else;
558
+ if (selected !== undefined) {
559
+ if (typeof selected !== "boolean" && !schemaObject(selected)) {
560
+ return `Invalid JSON Schema conditional at '${path || "arguments"}'`;
561
+ }
562
+ const conditionalError = validateStrictSchemaValue(value, selected, root, path, depth + 1, budget);
563
+ if (conditionalError)
564
+ return conditionalError;
565
+ }
566
+ }
567
+ const declaredTypes = typeof schema.type === "string"
568
+ ? [schema.type]
569
+ : Array.isArray(schema.type) && schema.type.every((type) => typeof type === "string")
570
+ ? schema.type
571
+ : schema.type === undefined
572
+ ? []
573
+ : null;
574
+ if (declaredTypes === null ||
575
+ declaredTypes.some((type) => !["null", "array", "object", "integer", "number", "string", "boolean"].includes(type))) {
576
+ return `Invalid JSON Schema type at '${path || "arguments"}'`;
577
+ }
578
+ if (declaredTypes.length > 0 && !declaredTypes.some((type) => schemaTypeMatches(value, type))) {
579
+ const expected = declaredTypes.map(schemaTypeLabel).join(" or ");
580
+ return `Parameter '${path || "arguments"}' must be ${expected}`;
581
+ }
582
+ if (Object.hasOwn(schema, "const") && !schemaValueEqual(value, schema.const)) {
583
+ return `Parameter '${path || "arguments"}' must equal ${JSON.stringify(schema.const)}`;
584
+ }
585
+ if (schema.enum !== undefined && !Array.isArray(schema.enum)) {
586
+ return `Invalid JSON Schema enum at '${path || "arguments"}'`;
587
+ }
588
+ if (Array.isArray(schema.enum) &&
589
+ !schema.enum.some((candidate) => schemaValueEqual(value, candidate))) {
590
+ return `Parameter '${path || "arguments"}' must be one of the declared enum values`;
591
+ }
592
+ if (typeof value === "string") {
593
+ const characterLength = Array.from(value).length;
594
+ if (typeof schema.minLength === "number" && characterLength < schema.minLength) {
595
+ return `Parameter '${path}' must contain at least ${schema.minLength} characters`;
596
+ }
597
+ if (typeof schema.maxLength === "number" && characterLength > schema.maxLength) {
598
+ return `Parameter '${path}' must contain at most ${schema.maxLength} characters`;
599
+ }
600
+ if (typeof schema.pattern === "string") {
601
+ if (value.length > MAX_STRICT_PATTERN_INPUT_LENGTH) {
602
+ return `Parameter '${path}' is too long for pattern validation`;
603
+ }
604
+ try {
605
+ if (!new RegExp(schema.pattern, "u").test(value)) {
606
+ return `Parameter '${path}' does not match its required pattern`;
607
+ }
608
+ }
609
+ catch {
610
+ return `Invalid JSON Schema pattern at '${path}'`;
611
+ }
612
+ }
613
+ }
614
+ if (typeof value === "number" && Number.isFinite(value)) {
615
+ if (typeof schema.minimum === "number" && value < schema.minimum) {
616
+ return `Parameter '${path}' must be at least ${schema.minimum}`;
617
+ }
618
+ if (typeof schema.maximum === "number" && value > schema.maximum) {
619
+ return `Parameter '${path}' must be at most ${schema.maximum}`;
620
+ }
621
+ if (typeof schema.exclusiveMinimum === "number" && value <= schema.exclusiveMinimum) {
622
+ return `Parameter '${path}' must be greater than ${schema.exclusiveMinimum}`;
623
+ }
624
+ if (typeof schema.exclusiveMaximum === "number" && value >= schema.exclusiveMaximum) {
625
+ return `Parameter '${path}' must be less than ${schema.exclusiveMaximum}`;
626
+ }
627
+ if (typeof schema.multipleOf === "number" &&
628
+ schema.multipleOf > 0 &&
629
+ Math.abs(value / schema.multipleOf - Math.round(value / schema.multipleOf)) > 1e-9) {
630
+ return `Parameter '${path}' must be a multiple of ${schema.multipleOf}`;
631
+ }
632
+ }
633
+ if (Array.isArray(value)) {
634
+ if (typeof schema.minItems === "number" && value.length < schema.minItems) {
635
+ return `Parameter '${path}' must contain at least ${schema.minItems} item(s)`;
636
+ }
637
+ if (typeof schema.maxItems === "number" && value.length > schema.maxItems) {
638
+ return `Parameter '${path}' must contain at most ${schema.maxItems} item(s)`;
639
+ }
640
+ if (schema.uniqueItems === true &&
641
+ (() => {
642
+ const keys = value.map((item) => schemaValueKey(item));
643
+ return keys.some((key) => key === null) || new Set(keys).size !== keys.length;
644
+ })()) {
645
+ return `Parameter '${path}' must contain unique items`;
646
+ }
647
+ if (schema.items !== undefined) {
648
+ if (typeof schema.items !== "boolean" && !schemaObject(schema.items)) {
649
+ return `Invalid JSON Schema items at '${path}'`;
650
+ }
651
+ for (const [index, item] of value.entries()) {
652
+ const itemError = validateStrictSchemaValue(item, schema.items, root, schemaPath(path, index), depth + 1, budget);
653
+ if (itemError)
654
+ return itemError;
655
+ }
656
+ }
657
+ }
658
+ if (schemaObject(value)) {
659
+ if (schema.properties !== undefined && !schemaObject(schema.properties)) {
660
+ return `Invalid JSON Schema properties at '${path || "arguments"}'`;
661
+ }
662
+ const properties = schemaObject(schema.properties) ? schema.properties : {};
663
+ const required = schema.required;
664
+ if (required !== undefined &&
665
+ (!Array.isArray(required) || required.some((field) => typeof field !== "string"))) {
666
+ return `Invalid JSON Schema required-list at '${path || "arguments"}'`;
667
+ }
668
+ for (const field of required ?? []) {
669
+ if (!Object.hasOwn(value, field)) {
670
+ return `Missing required parameter: ${schemaPath(path, field)}`;
671
+ }
672
+ }
673
+ if (typeof schema.minProperties === "number" &&
674
+ Object.keys(value).length < schema.minProperties) {
675
+ return `Parameter '${path || "arguments"}' has too few properties`;
676
+ }
677
+ if (typeof schema.maxProperties === "number" &&
678
+ Object.keys(value).length > schema.maxProperties) {
679
+ return `Parameter '${path || "arguments"}' has too many properties`;
680
+ }
681
+ for (const [key, child] of Object.entries(value)) {
682
+ if (Object.hasOwn(properties, key)) {
683
+ const propertySchema = properties[key];
684
+ if (typeof propertySchema !== "boolean" && !schemaObject(propertySchema)) {
685
+ return `Invalid JSON Schema property '${schemaPath(path, key)}'`;
686
+ }
687
+ const propertyError = validateStrictSchemaValue(child, propertySchema, root, schemaPath(path, key), depth + 1, budget);
688
+ if (propertyError)
689
+ return propertyError;
690
+ continue;
691
+ }
692
+ if (schema.additionalProperties === false) {
693
+ return `Unexpected parameter: ${schemaPath(path, key)}`;
694
+ }
695
+ if (typeof schema.additionalProperties === "boolean" ||
696
+ schema.additionalProperties === undefined) {
697
+ continue;
698
+ }
699
+ if (!schemaObject(schema.additionalProperties)) {
700
+ return `Invalid JSON Schema additionalProperties at '${path || "arguments"}'`;
701
+ }
702
+ const additionalError = validateStrictSchemaValue(child, schema.additionalProperties, root, schemaPath(path, key), depth + 1, budget);
703
+ if (additionalError)
704
+ return additionalError;
705
+ }
706
+ }
707
+ return null;
708
+ }
709
+ /**
710
+ * Fail-closed recursive validation for reviewed Panel App Agent tools.
711
+ *
712
+ * This deliberately lives beside the lightweight validator instead of
713
+ * changing its permissive compatibility contract for existing built-ins and
714
+ * third-party MCP schemas.
715
+ */
716
+ export function validateToolInputSchemaStrict(schema) {
717
+ try {
718
+ const jsonError = validateStrictJsonValue(schema, "schema", 0, new WeakSet(), {
719
+ remaining: MAX_STRICT_VALUE_NODES,
720
+ });
721
+ if (jsonError)
722
+ return `Invalid JSON Schema: ${jsonError}`;
723
+ return validateStrictSchemaDefinition(schema, schema, "", 0, new WeakSet());
724
+ }
725
+ catch {
726
+ return "Invalid JSON Schema";
727
+ }
728
+ }
729
+ export function validateToolArgsStrict(toolName, args, schema) {
730
+ try {
731
+ const schemaError = validateToolInputSchemaStrict(schema);
732
+ if (schemaError)
733
+ return schemaError;
734
+ const jsonError = validateStrictJsonValue(args, "", 0, new WeakSet(), {
735
+ remaining: MAX_STRICT_VALUE_NODES,
736
+ });
737
+ if (jsonError)
738
+ return jsonError;
739
+ return validateStrictSchemaValue(args, schema, schema, "", 0, {
740
+ remaining: MAX_STRICT_SCHEMA_EVALUATIONS,
741
+ });
742
+ }
743
+ catch {
744
+ return `Invalid JSON Schema for tool '${toolName}'`;
745
+ }
746
+ }