@cjhyy/code-shell-core 0.7.1 → 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 (594) 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 +7 -3
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +17 -1
  26. package/dist/context/manager.js +36 -1
  27. package/dist/credentials/access.d.ts +3 -1
  28. package/dist/credentials/access.js +24 -3
  29. package/dist/credentials/index.d.ts +1 -1
  30. package/dist/credentials/index.js +1 -1
  31. package/dist/credentials/oauth.d.ts +4 -1
  32. package/dist/credentials/oauth.js +14 -0
  33. package/dist/credentials/store.d.ts +15 -1
  34. package/dist/credentials/store.js +17 -4
  35. package/dist/credentials/types.d.ts +24 -0
  36. package/dist/credentials/use-credential-tool.js +15 -1
  37. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  38. package/dist/engine/auxiliary-pipeline.js +181 -0
  39. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  40. package/dist/{settings → engine}/disk-defaults.js +5 -2
  41. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  42. package/dist/engine/dynamic-tool-defs.js +4 -0
  43. package/dist/engine/engine.d.ts +254 -195
  44. package/dist/engine/engine.js +1812 -2041
  45. package/dist/engine/file-history-hook.d.ts +11 -0
  46. package/dist/engine/file-history-hook.js +31 -0
  47. package/dist/engine/goal-judge-context.d.ts +9 -0
  48. package/dist/engine/goal-judge-context.js +234 -0
  49. package/dist/engine/injected-context-cache.d.ts +6 -0
  50. package/dist/engine/injected-context-cache.js +13 -0
  51. package/dist/engine/input-attachments.d.ts +1 -1
  52. package/dist/engine/model-facade.d.ts +3 -3
  53. package/dist/engine/model-facade.js +15 -14
  54. package/dist/engine/permission-controller.d.ts +55 -0
  55. package/dist/engine/permission-controller.js +148 -0
  56. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  57. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  58. package/dist/engine/run-accounting.d.ts +41 -0
  59. package/dist/engine/run-accounting.js +126 -0
  60. package/dist/engine/run-context.d.ts +44 -0
  61. package/dist/engine/run-context.js +88 -0
  62. package/dist/engine/run-environment.d.ts +30 -0
  63. package/dist/engine/run-environment.js +77 -0
  64. package/dist/engine/run-finalize.d.ts +58 -0
  65. package/dist/engine/run-finalize.js +245 -0
  66. package/dist/engine/run-goal.d.ts +58 -0
  67. package/dist/engine/run-goal.js +188 -0
  68. package/dist/engine/run-image-input.d.ts +1 -1
  69. package/dist/engine/run-image-input.js +5 -3
  70. package/dist/engine/run-session-open.d.ts +41 -0
  71. package/dist/engine/run-session-open.js +186 -0
  72. package/dist/engine/run-setup.d.ts +42 -0
  73. package/dist/engine/run-setup.js +58 -0
  74. package/dist/engine/run-tooling.d.ts +125 -0
  75. package/dist/engine/run-tooling.js +283 -0
  76. package/dist/engine/run-types.d.ts +139 -0
  77. package/dist/engine/run-types.js +12 -0
  78. package/dist/engine/run-workspace.d.ts +50 -0
  79. package/dist/engine/run-workspace.js +114 -0
  80. package/dist/engine/steer-queue.d.ts +1 -1
  81. package/dist/engine/subagent-spawner.d.ts +32 -0
  82. package/dist/engine/subagent-spawner.js +287 -0
  83. package/dist/engine/tool-summary.d.ts +2 -2
  84. package/dist/engine/tool-summary.js +2 -2
  85. package/dist/engine/turn-loop.d.ts +49 -10
  86. package/dist/engine/turn-loop.js +370 -104
  87. package/dist/engine/types.d.ts +30 -3
  88. package/dist/engine/types.js +1 -1
  89. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
  90. package/dist/goal/lifecycle.js +482 -0
  91. package/dist/hooks/events.d.ts +24 -10
  92. package/dist/hooks/goal-stop-hook.d.ts +17 -28
  93. package/dist/hooks/goal-stop-hook.js +110 -465
  94. package/dist/hooks/registry.js +1 -1
  95. package/dist/index.d.ts +48 -108
  96. package/dist/index.extension.d.ts +51 -0
  97. package/dist/index.extension.js +39 -0
  98. package/dist/index.internal.d.ts +86 -0
  99. package/dist/index.internal.js +92 -0
  100. package/dist/index.js +34 -123
  101. package/dist/links/cli.d.ts +48 -0
  102. package/dist/links/cli.js +617 -0
  103. package/dist/links/http.d.ts +40 -0
  104. package/dist/links/http.js +166 -0
  105. package/dist/links/index.d.ts +4 -0
  106. package/dist/links/index.js +3 -0
  107. package/dist/links/link-action-tool.d.ts +5 -0
  108. package/dist/links/link-action-tool.js +241 -0
  109. package/dist/links/providers.d.ts +8 -0
  110. package/dist/links/providers.js +665 -0
  111. package/dist/links/types.d.ts +44 -0
  112. package/dist/llm/client-base.d.ts +7 -0
  113. package/dist/llm/client-base.js +60 -0
  114. package/dist/llm/model-pool.d.ts +1 -1
  115. package/dist/llm/model-pool.js +1 -1
  116. package/dist/llm/providers/anthropic.d.ts +1 -0
  117. package/dist/llm/providers/anthropic.js +9 -0
  118. package/dist/llm/providers/openai.d.ts +1 -0
  119. package/dist/llm/providers/openai.js +17 -0
  120. package/dist/model-catalog/index.js +15 -2
  121. package/dist/model-catalog/resolve.d.ts +13 -1
  122. package/dist/model-catalog/resolve.js +37 -2
  123. package/dist/model-catalog/types.d.ts +74 -48
  124. package/dist/model-catalog/types.js +16 -5
  125. package/dist/model-catalog/upsert.d.ts +3 -1
  126. package/dist/model-catalog/upsert.js +9 -0
  127. package/dist/onboarding.d.ts +0 -1
  128. package/dist/onboarding.js +1 -22
  129. package/dist/panel-apps/bindings.d.ts +24 -0
  130. package/dist/panel-apps/bindings.js +69 -0
  131. package/dist/panel-apps/github-archive.d.ts +21 -0
  132. package/dist/panel-apps/github-archive.js +98 -0
  133. package/dist/panel-apps/index.d.ts +4 -0
  134. package/dist/panel-apps/index.js +4 -0
  135. package/dist/panel-apps/installer.d.ts +68 -0
  136. package/dist/panel-apps/installer.js +622 -0
  137. package/dist/panel-apps/manifest.d.ts +364 -0
  138. package/dist/panel-apps/manifest.js +189 -0
  139. package/dist/panel-apps/paths.d.ts +13 -0
  140. package/dist/panel-apps/paths.js +38 -0
  141. package/dist/panel-apps/registry.d.ts +51 -0
  142. package/dist/panel-apps/registry.js +99 -0
  143. package/dist/panel-apps/runtime.d.ts +80 -0
  144. package/dist/panel-apps/runtime.js +154 -0
  145. package/dist/plugins/gitOps.js +8 -1
  146. package/dist/plugins/installedPlugins.d.ts +2 -1
  147. package/dist/plugins/installedPlugins.js +146 -8
  148. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  149. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  150. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  151. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  152. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  153. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  154. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  155. package/dist/plugins/installer/install.d.ts +7 -1
  156. package/dist/plugins/installer/install.js +21 -87
  157. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  158. package/dist/plugins/installer/installFromArchive.js +44 -27
  159. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  160. package/dist/plugins/installer/installFromNpm.js +273 -0
  161. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  162. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  163. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  164. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  165. package/dist/plugins/installer/normalizeManifest.js +306 -0
  166. package/dist/plugins/installer/npmTar.d.ts +13 -0
  167. package/dist/plugins/installer/npmTar.js +321 -0
  168. package/dist/plugins/installer/parseSource.d.ts +11 -0
  169. package/dist/plugins/installer/parseSource.js +48 -0
  170. package/dist/plugins/installer/preview.d.ts +101 -0
  171. package/dist/plugins/installer/preview.js +336 -0
  172. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  173. package/dist/plugins/installer/projectPluginSource.js +140 -0
  174. package/dist/plugins/installer/types.d.ts +775 -0
  175. package/dist/plugins/installer/types.js +100 -0
  176. package/dist/plugins/installer/unzip.d.ts +11 -0
  177. package/dist/plugins/installer/unzip.js +123 -9
  178. package/dist/plugins/installer/update.d.ts +2 -2
  179. package/dist/plugins/installer/update.js +43 -4
  180. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  181. package/dist/plugins/loadPluginHooks.js +97 -86
  182. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  183. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  184. package/dist/plugins/pluginCatalog.d.ts +45 -0
  185. package/dist/plugins/pluginCatalog.js +87 -0
  186. package/dist/plugins/pluginCommandHook.d.ts +6 -0
  187. package/dist/plugins/pluginCommandHook.js +25 -8
  188. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  189. package/dist/plugins/pluginCommandsLoader.js +181 -7
  190. package/dist/plugins/pluginContent.d.ts +10 -1
  191. package/dist/plugins/pluginContent.js +87 -30
  192. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  193. package/dist/plugins/pluginHookApproval.js +160 -0
  194. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  195. package/dist/plugins/pluginHookIntegrity.js +361 -0
  196. package/dist/plugins/pluginInstaller.js +71 -12
  197. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  198. package/dist/plugins/pluginMcpApproval.js +110 -0
  199. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  200. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  201. package/dist/plugins/types.d.ts +30 -0
  202. package/dist/plugins/varRewrite.d.ts +9 -5
  203. package/dist/plugins/varRewrite.js +26 -17
  204. package/dist/preset/index.d.ts +11 -8
  205. package/dist/preset/index.js +62 -203
  206. package/dist/product/define.js +9 -3
  207. package/dist/product/types.d.ts +0 -2
  208. package/dist/profile/activation.d.ts +36 -0
  209. package/dist/profile/activation.js +57 -0
  210. package/dist/profile/catalog-store.d.ts +77 -0
  211. package/dist/profile/catalog-store.js +346 -0
  212. package/dist/profile/catalog.d.ts +54 -0
  213. package/dist/profile/catalog.js +152 -0
  214. package/dist/profile/index.d.ts +7 -0
  215. package/dist/profile/index.js +7 -0
  216. package/dist/profile/requirements.d.ts +76 -0
  217. package/dist/profile/requirements.js +117 -0
  218. package/dist/profile/resolve.d.ts +11 -0
  219. package/dist/profile/resolve.js +41 -0
  220. package/dist/profile/store.d.ts +17 -0
  221. package/dist/profile/store.js +167 -0
  222. package/dist/profile/types.d.ts +321 -0
  223. package/dist/profile/types.js +104 -0
  224. package/dist/prompt/composer.d.ts +46 -7
  225. package/dist/prompt/composer.js +78 -48
  226. package/dist/prompt/instruction-scanner.d.ts +6 -5
  227. package/dist/prompt/instruction-scanner.js +8 -23
  228. package/dist/prompt/section-loader.d.ts +2 -2
  229. package/dist/prompt/section-loader.js +7 -4
  230. package/dist/prompt/sections/browser.md +10 -9
  231. package/dist/prompt/sections/harness-base.md +9 -0
  232. package/dist/protocol/chat-session-manager.d.ts +64 -1
  233. package/dist/protocol/chat-session-manager.js +104 -0
  234. package/dist/protocol/chat-session.d.ts +61 -10
  235. package/dist/protocol/chat-session.js +135 -25
  236. package/dist/protocol/client.d.ts +33 -3
  237. package/dist/protocol/client.js +96 -5
  238. package/dist/protocol/index.d.ts +2 -2
  239. package/dist/protocol/index.js +2 -2
  240. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  241. package/dist/protocol/mobile-remote-types.js +1 -0
  242. package/dist/protocol/server.d.ts +127 -3
  243. package/dist/protocol/server.js +1309 -182
  244. package/dist/protocol/types.d.ts +152 -34
  245. package/dist/protocol/types.js +16 -0
  246. package/dist/run/ArtifactTracker.d.ts +6 -1
  247. package/dist/run/ArtifactTracker.js +29 -21
  248. package/dist/run/EngineRunner.d.ts +2 -0
  249. package/dist/run/EngineRunner.js +1 -0
  250. package/dist/run/RunManager.d.ts +26 -0
  251. package/dist/run/RunManager.js +82 -11
  252. package/dist/run/factory.d.ts +3 -0
  253. package/dist/run/factory.js +2 -0
  254. package/dist/runtime/safe-spawn.d.ts +6 -0
  255. package/dist/runtime/safe-spawn.js +8 -13
  256. package/dist/services/auto-dream.d.ts +13 -1
  257. package/dist/services/auto-dream.js +56 -8
  258. package/dist/services/dream-consolidation.js +10 -1
  259. package/dist/services/memory-orchestrator.js +6 -2
  260. package/dist/services/oauth.js +4 -1
  261. package/dist/services/session-memory.d.ts +4 -4
  262. package/dist/services/session-memory.js +13 -10
  263. package/dist/session/memory.d.ts +26 -7
  264. package/dist/session/memory.js +79 -21
  265. package/dist/session/session-manager.d.ts +182 -28
  266. package/dist/session/session-manager.js +910 -130
  267. package/dist/session/session-message.d.ts +22 -0
  268. package/dist/session/session-message.js +1 -0
  269. package/dist/session/transcript.d.ts +46 -5
  270. package/dist/session/transcript.js +159 -3
  271. package/dist/settings/feature-flags.d.ts +40 -0
  272. package/dist/settings/feature-flags.js +40 -0
  273. package/dist/settings/manager.d.ts +39 -1
  274. package/dist/settings/manager.js +102 -41
  275. package/dist/settings/migrate-config.js +4 -2
  276. package/dist/settings/schema.d.ts +511 -177
  277. package/dist/settings/schema.js +98 -25
  278. package/dist/skills/scanner.d.ts +6 -2
  279. package/dist/skills/scanner.js +160 -9
  280. package/dist/sources/adapter.d.ts +14 -0
  281. package/dist/sources/adapter.js +7 -0
  282. package/dist/sources/adapters/local-files.d.ts +10 -0
  283. package/dist/sources/adapters/local-files.js +127 -0
  284. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  285. package/dist/sources/adapters/mcp-resource.js +41 -0
  286. package/dist/sources/adapters/mock.d.ts +3 -0
  287. package/dist/sources/adapters/mock.js +29 -0
  288. package/dist/sources/binding.d.ts +6 -0
  289. package/dist/sources/binding.js +24 -0
  290. package/dist/sources/catalog.d.ts +6 -0
  291. package/dist/sources/catalog.js +64 -0
  292. package/dist/sources/context-summary.d.ts +8 -0
  293. package/dist/sources/context-summary.js +13 -0
  294. package/dist/sources/credential-status.d.ts +2 -0
  295. package/dist/sources/credential-status.js +13 -0
  296. package/dist/sources/index.d.ts +10 -0
  297. package/dist/sources/index.js +10 -0
  298. package/dist/sources/resolve.d.ts +28 -0
  299. package/dist/sources/resolve.js +47 -0
  300. package/dist/sources/truncate-utf8.d.ts +7 -0
  301. package/dist/sources/truncate-utf8.js +18 -0
  302. package/dist/sources/types.d.ts +71 -0
  303. package/dist/sources/types.js +26 -0
  304. package/dist/testing/fetch-stub.d.ts +32 -0
  305. package/dist/testing/fetch-stub.js +24 -0
  306. package/dist/themes/image.d.ts +18 -0
  307. package/dist/themes/image.js +117 -0
  308. package/dist/themes/index.d.ts +4 -0
  309. package/dist/themes/index.js +4 -0
  310. package/dist/themes/installer.d.ts +50 -0
  311. package/dist/themes/installer.js +290 -0
  312. package/dist/themes/manifest.d.ts +102 -0
  313. package/dist/themes/manifest.js +86 -0
  314. package/dist/themes/paths.d.ts +14 -0
  315. package/dist/themes/paths.js +33 -0
  316. package/dist/tool-system/browser-bridge.d.ts +53 -11
  317. package/dist/tool-system/browser-bridge.js +8 -9
  318. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  319. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  320. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  321. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  322. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  323. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  324. package/dist/tool-system/builtin/agent-progress.js +83 -0
  325. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  326. package/dist/tool-system/builtin/agent-registry.js +178 -9
  327. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  328. package/dist/tool-system/builtin/agent.d.ts +2 -0
  329. package/dist/tool-system/builtin/agent.js +274 -33
  330. package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
  331. package/dist/tool-system/builtin/background-jobs.js +96 -4
  332. package/dist/tool-system/builtin/background-work.d.ts +6 -0
  333. package/dist/tool-system/builtin/background-work.js +8 -1
  334. package/dist/tool-system/builtin/bash.js +5 -2
  335. package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
  336. package/dist/tool-system/builtin/browser-tools.js +89 -23
  337. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  338. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  339. package/dist/tool-system/builtin/edit.js +2 -6
  340. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  341. package/dist/tool-system/builtin/file-cache.js +4 -0
  342. package/dist/tool-system/builtin/generate-image.js +17 -10
  343. package/dist/tool-system/builtin/generate-video.js +26 -7
  344. package/dist/tool-system/builtin/grep.js +2 -2
  345. package/dist/tool-system/builtin/image-uploader.js +7 -1
  346. package/dist/tool-system/builtin/index.d.ts +32 -7
  347. package/dist/tool-system/builtin/index.js +237 -167
  348. package/dist/tool-system/builtin/memory.d.ts +6 -0
  349. package/dist/tool-system/builtin/memory.js +36 -15
  350. package/dist/tool-system/builtin/panel.d.ts +9 -0
  351. package/dist/tool-system/builtin/panel.js +314 -0
  352. package/dist/tool-system/builtin/read.js +5 -1
  353. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  354. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  355. package/dist/tool-system/builtin/sources.d.ts +8 -0
  356. package/dist/tool-system/builtin/sources.js +137 -0
  357. package/dist/tool-system/builtin/tool-search.js +7 -2
  358. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  359. package/dist/tool-system/builtin/web-fetch.js +17 -13
  360. package/dist/tool-system/builtin/web-search.js +1 -3
  361. package/dist/tool-system/capability-module.d.ts +93 -0
  362. package/dist/tool-system/capability-module.js +53 -0
  363. package/dist/tool-system/context.d.ts +77 -19
  364. package/dist/tool-system/executor.js +75 -50
  365. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  366. package/dist/tool-system/external-tool-exposure.js +304 -0
  367. package/dist/tool-system/mcp-manager.d.ts +11 -1
  368. package/dist/tool-system/mcp-manager.js +19 -4
  369. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  370. package/dist/tool-system/mcp-tool-policy.js +34 -0
  371. package/dist/tool-system/panel-bridge.d.ts +53 -0
  372. package/dist/tool-system/panel-bridge.js +1 -0
  373. package/dist/tool-system/permission.d.ts +26 -0
  374. package/dist/tool-system/permission.js +46 -0
  375. package/dist/tool-system/registry.d.ts +12 -1
  376. package/dist/tool-system/registry.js +31 -7
  377. package/dist/tool-system/sandbox/index.js +3 -8
  378. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  379. package/dist/tool-system/session-tool-host.d.ts +139 -0
  380. package/dist/tool-system/session-tool-host.js +167 -0
  381. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  382. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  383. package/dist/tool-system/validation.d.ts +14 -7
  384. package/dist/tool-system/validation.js +701 -7
  385. package/dist/types.d.ts +186 -20
  386. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  388. package/dist/utils/file-mutex.d.ts +65 -0
  389. package/dist/utils/file-mutex.js +145 -0
  390. package/dist/utils/json.d.ts +2 -4
  391. package/dist/utils/json.js +2 -4
  392. package/dist/utils/lockfile.d.ts +30 -1
  393. package/dist/utils/lockfile.js +2 -2
  394. package/dist/utils/secret-scrubber.d.ts +8 -0
  395. package/dist/utils/secret-scrubber.js +227 -0
  396. package/dist/utils/toolDisplay.js +1 -1
  397. package/package.json +20 -5
  398. package/THIRD_PARTY_NOTICES.md +0 -206
  399. package/dist/arena/arena.d.ts +0 -45
  400. package/dist/arena/arena.js +0 -362
  401. package/dist/arena/context/context-tools.d.ts +0 -16
  402. package/dist/arena/context/context-tools.js +0 -272
  403. package/dist/arena/context/within-root.d.ts +0 -7
  404. package/dist/arena/context/within-root.js +0 -15
  405. package/dist/arena/detect-mode.d.ts +0 -20
  406. package/dist/arena/detect-mode.js +0 -78
  407. package/dist/arena/digest-builder.d.ts +0 -25
  408. package/dist/arena/digest-builder.js +0 -120
  409. package/dist/arena/index.d.ts +0 -29
  410. package/dist/arena/index.js +0 -29
  411. package/dist/arena/iterate/convergence.d.ts +0 -25
  412. package/dist/arena/iterate/convergence.js +0 -103
  413. package/dist/arena/iterate/formats/index.d.ts +0 -22
  414. package/dist/arena/iterate/formats/index.js +0 -283
  415. package/dist/arena/iterate/index.d.ts +0 -11
  416. package/dist/arena/iterate/index.js +0 -9
  417. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  418. package/dist/arena/iterate/iterative-arena.js +0 -237
  419. package/dist/arena/iterate/parse.d.ts +0 -42
  420. package/dist/arena/iterate/parse.js +0 -123
  421. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  422. package/dist/arena/iterate/phases/argue.js +0 -165
  423. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  424. package/dist/arena/iterate/phases/revise.js +0 -62
  425. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  426. package/dist/arena/iterate/phases/tournament.js +0 -113
  427. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  428. package/dist/arena/iterate/tools/web-tools.js +0 -54
  429. package/dist/arena/iterate/types.d.ts +0 -152
  430. package/dist/arena/iterate/types.js +0 -8
  431. package/dist/arena/ledger.d.ts +0 -47
  432. package/dist/arena/ledger.js +0 -159
  433. package/dist/arena/lenses/architecture.d.ts +0 -5
  434. package/dist/arena/lenses/architecture.js +0 -22
  435. package/dist/arena/lenses/engineering.d.ts +0 -5
  436. package/dist/arena/lenses/engineering.js +0 -22
  437. package/dist/arena/lenses/general.d.ts +0 -5
  438. package/dist/arena/lenses/general.js +0 -20
  439. package/dist/arena/lenses/index.d.ts +0 -16
  440. package/dist/arena/lenses/index.js +0 -47
  441. package/dist/arena/lenses/product.d.ts +0 -5
  442. package/dist/arena/lenses/product.js +0 -22
  443. package/dist/arena/model-presets.d.ts +0 -23
  444. package/dist/arena/model-presets.js +0 -44
  445. package/dist/arena/phases/adjudication.d.ts +0 -25
  446. package/dist/arena/phases/adjudication.js +0 -142
  447. package/dist/arena/phases/build-consensus.d.ts +0 -30
  448. package/dist/arena/phases/build-consensus.js +0 -85
  449. package/dist/arena/phases/claim-registry.d.ts +0 -26
  450. package/dist/arena/phases/claim-registry.js +0 -60
  451. package/dist/arena/phases/cross-review.d.ts +0 -47
  452. package/dist/arena/phases/cross-review.js +0 -224
  453. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  454. package/dist/arena/phases/debate-rounds.js +0 -161
  455. package/dist/arena/phases/participant-research.d.ts +0 -39
  456. package/dist/arena/phases/participant-research.js +0 -316
  457. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  458. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  459. package/dist/arena/planner.d.ts +0 -28
  460. package/dist/arena/planner.js +0 -312
  461. package/dist/arena/providers/docs.d.ts +0 -7
  462. package/dist/arena/providers/docs.js +0 -111
  463. package/dist/arena/providers/git.d.ts +0 -8
  464. package/dist/arena/providers/git.js +0 -174
  465. package/dist/arena/providers/index.d.ts +0 -32
  466. package/dist/arena/providers/index.js +0 -132
  467. package/dist/arena/providers/none.d.ts +0 -7
  468. package/dist/arena/providers/none.js +0 -11
  469. package/dist/arena/providers/repo.d.ts +0 -7
  470. package/dist/arena/providers/repo.js +0 -258
  471. package/dist/arena/render/session.d.ts +0 -17
  472. package/dist/arena/render/session.js +0 -190
  473. package/dist/arena/render/terminal.d.ts +0 -34
  474. package/dist/arena/render/terminal.js +0 -286
  475. package/dist/arena/strategies/discussion.d.ts +0 -25
  476. package/dist/arena/strategies/discussion.js +0 -143
  477. package/dist/arena/strategies/index.d.ts +0 -15
  478. package/dist/arena/strategies/index.js +0 -28
  479. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  480. package/dist/arena/strategies/language-wrapper.js +0 -102
  481. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  482. package/dist/arena/strategies/lens-wrapper.js +0 -236
  483. package/dist/arena/strategies/planning.d.ts +0 -30
  484. package/dist/arena/strategies/planning.js +0 -225
  485. package/dist/arena/strategies/review.d.ts +0 -26
  486. package/dist/arena/strategies/review.js +0 -168
  487. package/dist/arena/strategies/utils.d.ts +0 -36
  488. package/dist/arena/strategies/utils.js +0 -603
  489. package/dist/arena/tools/selector.d.ts +0 -17
  490. package/dist/arena/tools/selector.js +0 -61
  491. package/dist/arena/transitions.d.ts +0 -53
  492. package/dist/arena/transitions.js +0 -97
  493. package/dist/arena/types.d.ts +0 -518
  494. package/dist/arena/types.js +0 -27
  495. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  496. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  497. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  498. package/dist/cc-orchestrator/cc-capability.js +0 -53
  499. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  500. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  501. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  502. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  503. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  504. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  505. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  506. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  507. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  508. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  509. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  510. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  511. package/dist/cc-orchestrator/index.d.ts +0 -8
  512. package/dist/cc-orchestrator/index.js +0 -8
  513. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  514. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  515. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  516. package/dist/cc-orchestrator/session-discovery.js +0 -125
  517. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  518. package/dist/cc-orchestrator/session-history.js +0 -150
  519. package/dist/cron/cron-runtime.d.ts +0 -2
  520. package/dist/cron/cron-runtime.js +0 -2
  521. package/dist/cron/cron-store.d.ts +0 -2
  522. package/dist/cron/cron-store.js +0 -2
  523. package/dist/cron/scheduler.d.ts +0 -7
  524. package/dist/cron/scheduler.js +0 -7
  525. package/dist/engine/goal.js +0 -206
  526. package/dist/external-agents/config.d.ts +0 -2
  527. package/dist/external-agents/config.js +0 -15
  528. package/dist/external-agents/types.d.ts +0 -31
  529. package/dist/git/parse-log.d.ts +0 -13
  530. package/dist/git/parse-log.js +0 -21
  531. package/dist/git/utils.d.ts +0 -49
  532. package/dist/git/utils.js +0 -161
  533. package/dist/git/worktree/crud.d.ts +0 -72
  534. package/dist/git/worktree/crud.js +0 -235
  535. package/dist/git/worktree/diff.d.ts +0 -14
  536. package/dist/git/worktree/diff.js +0 -82
  537. package/dist/git/worktree/git-exec.d.ts +0 -7
  538. package/dist/git/worktree/git-exec.js +0 -87
  539. package/dist/git/worktree/index.d.ts +0 -5
  540. package/dist/git/worktree/index.js +0 -5
  541. package/dist/git/worktree/query.d.ts +0 -43
  542. package/dist/git/worktree/query.js +0 -128
  543. package/dist/git/worktree/slug.d.ts +0 -11
  544. package/dist/git/worktree/slug.js +0 -58
  545. package/dist/git/worktree.d.ts +0 -1
  546. package/dist/git/worktree.js +0 -5
  547. package/dist/lsp/client.d.ts +0 -41
  548. package/dist/lsp/client.js +0 -186
  549. package/dist/lsp/manager.d.ts +0 -40
  550. package/dist/lsp/manager.js +0 -155
  551. package/dist/lsp/root-path.d.ts +0 -9
  552. package/dist/lsp/root-path.js +0 -12
  553. package/dist/lsp/servers.d.ts +0 -16
  554. package/dist/lsp/servers.js +0 -60
  555. package/dist/prompt/sections/coding.md +0 -35
  556. package/dist/quota/credentials.d.ts +0 -3
  557. package/dist/quota/credentials.js +0 -80
  558. package/dist/quota/index.d.ts +0 -36
  559. package/dist/quota/index.js +0 -155
  560. package/dist/quota/types.d.ts +0 -48
  561. package/dist/quota/types.js +0 -13
  562. package/dist/review/review-prompt.d.ts +0 -28
  563. package/dist/review/review-prompt.js +0 -81
  564. package/dist/state.d.ts +0 -160
  565. package/dist/state.js +0 -267
  566. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  567. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  568. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  570. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  571. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  572. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  573. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  574. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  576. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  577. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  578. package/dist/tool-system/builtin/arena.d.ts +0 -31
  579. package/dist/tool-system/builtin/arena.js +0 -416
  580. package/dist/tool-system/builtin/brief.d.ts +0 -6
  581. package/dist/tool-system/builtin/brief.js +0 -41
  582. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  583. package/dist/tool-system/builtin/check-quota.js +0 -34
  584. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  585. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  586. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  587. package/dist/tool-system/builtin/lsp.js +0 -144
  588. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  589. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  590. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  591. package/dist/tool-system/builtin/worktree.js +0 -363
  592. /package/dist/{external-agents → links}/types.js +0 -0
  593. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  594. /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
+ }