@cjhyy/code-shell-core 0.7.1 → 0.8.1
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.
- package/README.md +36 -23
- package/dist/agent/agent-definition-registry.d.ts +2 -2
- package/dist/agent/agent-definition-registry.js +47 -10
- package/dist/agent/agent-definition.d.ts +5 -0
- package/dist/agent/agent-definition.js +14 -0
- package/dist/automation/index.d.ts +7 -4
- package/dist/automation/index.js +4 -2
- package/dist/automation/runner.js +3 -1
- package/dist/automation/scheduler.d.ts +57 -1
- package/dist/automation/scheduler.js +123 -23
- package/dist/automation/store.d.ts +6 -2
- package/dist/automation/store.js +7 -3
- package/dist/capabilities/index.d.ts +109 -0
- package/dist/capabilities/index.js +80 -0
- package/dist/capability-control/disabled-lists.d.ts +2 -1
- package/dist/capability-control/disabled-lists.js +3 -5
- package/dist/capability-control/overlay.d.ts +14 -1
- package/dist/capability-control/overlay.js +40 -0
- package/dist/capability-control/service.js +6 -4
- package/dist/cli/agent-server-stdio.d.ts +1 -1
- package/dist/cli/agent-server-stdio.js +66 -6
- package/dist/cli/agent-server-tcp.js +7 -3
- package/dist/context/compaction.d.ts +39 -3
- package/dist/context/compaction.js +151 -39
- package/dist/context/manager.d.ts +17 -1
- package/dist/context/manager.js +36 -1
- package/dist/credentials/access.d.ts +3 -1
- package/dist/credentials/access.js +24 -3
- package/dist/credentials/index.d.ts +1 -1
- package/dist/credentials/index.js +1 -1
- package/dist/credentials/oauth.d.ts +4 -1
- package/dist/credentials/oauth.js +14 -0
- package/dist/credentials/store.d.ts +15 -1
- package/dist/credentials/store.js +17 -4
- package/dist/credentials/types.d.ts +24 -0
- package/dist/credentials/use-credential-tool.js +15 -1
- package/dist/engine/auxiliary-pipeline.d.ts +40 -0
- package/dist/engine/auxiliary-pipeline.js +181 -0
- package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
- package/dist/{settings → engine}/disk-defaults.js +5 -2
- package/dist/engine/dynamic-tool-defs.d.ts +4 -0
- package/dist/engine/dynamic-tool-defs.js +4 -0
- package/dist/engine/engine.d.ts +254 -195
- package/dist/engine/engine.js +1812 -2041
- package/dist/engine/file-history-hook.d.ts +11 -0
- package/dist/engine/file-history-hook.js +31 -0
- package/dist/engine/goal-judge-context.d.ts +9 -0
- package/dist/engine/goal-judge-context.js +234 -0
- package/dist/engine/injected-context-cache.d.ts +6 -0
- package/dist/engine/injected-context-cache.js +13 -0
- package/dist/engine/input-attachments.d.ts +1 -1
- package/dist/engine/model-facade.d.ts +3 -3
- package/dist/engine/model-facade.js +15 -14
- package/dist/engine/permission-controller.d.ts +55 -0
- package/dist/engine/permission-controller.js +148 -0
- package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
- package/dist/engine/prompt-cache-diagnostics.js +178 -0
- package/dist/engine/run-accounting.d.ts +41 -0
- package/dist/engine/run-accounting.js +126 -0
- package/dist/engine/run-context.d.ts +44 -0
- package/dist/engine/run-context.js +88 -0
- package/dist/engine/run-environment.d.ts +30 -0
- package/dist/engine/run-environment.js +77 -0
- package/dist/engine/run-finalize.d.ts +58 -0
- package/dist/engine/run-finalize.js +245 -0
- package/dist/engine/run-goal.d.ts +58 -0
- package/dist/engine/run-goal.js +188 -0
- package/dist/engine/run-image-input.d.ts +1 -1
- package/dist/engine/run-image-input.js +5 -3
- package/dist/engine/run-session-open.d.ts +41 -0
- package/dist/engine/run-session-open.js +186 -0
- package/dist/engine/run-setup.d.ts +42 -0
- package/dist/engine/run-setup.js +58 -0
- package/dist/engine/run-tooling.d.ts +125 -0
- package/dist/engine/run-tooling.js +283 -0
- package/dist/engine/run-types.d.ts +139 -0
- package/dist/engine/run-types.js +12 -0
- package/dist/engine/run-workspace.d.ts +50 -0
- package/dist/engine/run-workspace.js +114 -0
- package/dist/engine/steer-queue.d.ts +1 -1
- package/dist/engine/subagent-spawner.d.ts +32 -0
- package/dist/engine/subagent-spawner.js +287 -0
- package/dist/engine/tool-summary.d.ts +2 -2
- package/dist/engine/tool-summary.js +2 -2
- package/dist/engine/turn-loop.d.ts +49 -10
- package/dist/engine/turn-loop.js +370 -104
- package/dist/engine/types.d.ts +30 -3
- package/dist/engine/types.js +1 -1
- package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
- package/dist/goal/lifecycle.js +482 -0
- package/dist/hooks/events.d.ts +24 -10
- package/dist/hooks/goal-stop-hook.d.ts +17 -28
- package/dist/hooks/goal-stop-hook.js +110 -465
- package/dist/hooks/registry.js +1 -1
- package/dist/index.d.ts +48 -108
- package/dist/index.extension.d.ts +51 -0
- package/dist/index.extension.js +39 -0
- package/dist/index.internal.d.ts +86 -0
- package/dist/index.internal.js +92 -0
- package/dist/index.js +34 -123
- package/dist/links/cli.d.ts +48 -0
- package/dist/links/cli.js +617 -0
- package/dist/links/http.d.ts +40 -0
- package/dist/links/http.js +166 -0
- package/dist/links/index.d.ts +4 -0
- package/dist/links/index.js +3 -0
- package/dist/links/link-action-tool.d.ts +5 -0
- package/dist/links/link-action-tool.js +241 -0
- package/dist/links/providers.d.ts +8 -0
- package/dist/links/providers.js +665 -0
- package/dist/links/types.d.ts +44 -0
- package/dist/llm/client-base.d.ts +7 -0
- package/dist/llm/client-base.js +60 -0
- package/dist/llm/model-pool.d.ts +1 -1
- package/dist/llm/model-pool.js +1 -1
- package/dist/llm/providers/anthropic.d.ts +1 -0
- package/dist/llm/providers/anthropic.js +9 -0
- package/dist/llm/providers/openai.d.ts +1 -0
- package/dist/llm/providers/openai.js +17 -0
- package/dist/model-catalog/index.js +15 -2
- package/dist/model-catalog/resolve.d.ts +13 -1
- package/dist/model-catalog/resolve.js +37 -2
- package/dist/model-catalog/types.d.ts +74 -48
- package/dist/model-catalog/types.js +16 -5
- package/dist/model-catalog/upsert.d.ts +3 -1
- package/dist/model-catalog/upsert.js +9 -0
- package/dist/onboarding.d.ts +0 -1
- package/dist/onboarding.js +1 -22
- package/dist/panel-apps/bindings.d.ts +24 -0
- package/dist/panel-apps/bindings.js +69 -0
- package/dist/panel-apps/github-archive.d.ts +21 -0
- package/dist/panel-apps/github-archive.js +98 -0
- package/dist/panel-apps/index.d.ts +4 -0
- package/dist/panel-apps/index.js +4 -0
- package/dist/panel-apps/installer.d.ts +68 -0
- package/dist/panel-apps/installer.js +622 -0
- package/dist/panel-apps/manifest.d.ts +364 -0
- package/dist/panel-apps/manifest.js +189 -0
- package/dist/panel-apps/paths.d.ts +13 -0
- package/dist/panel-apps/paths.js +38 -0
- package/dist/panel-apps/registry.d.ts +51 -0
- package/dist/panel-apps/registry.js +99 -0
- package/dist/panel-apps/runtime.d.ts +80 -0
- package/dist/panel-apps/runtime.js +154 -0
- package/dist/plugins/gitOps.js +8 -1
- package/dist/plugins/installedPlugins.d.ts +2 -1
- package/dist/plugins/installedPlugins.js +146 -8
- package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
- package/dist/plugins/installer/codex/convertAgents.js +62 -8
- package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
- package/dist/plugins/installer/codex/convertCommands.js +35 -12
- package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
- package/dist/plugins/installer/codex/convertHooks.js +82 -0
- package/dist/plugins/installer/codex/convertSkills.js +41 -6
- package/dist/plugins/installer/install.d.ts +7 -1
- package/dist/plugins/installer/install.js +21 -87
- package/dist/plugins/installer/installFromArchive.d.ts +26 -4
- package/dist/plugins/installer/installFromArchive.js +44 -27
- package/dist/plugins/installer/installFromNpm.d.ts +31 -0
- package/dist/plugins/installer/installFromNpm.js +273 -0
- package/dist/plugins/installer/loadPluginAgents.js +17 -4
- package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
- package/dist/plugins/installer/loadPluginMcp.js +245 -35
- package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
- package/dist/plugins/installer/normalizeManifest.js +306 -0
- package/dist/plugins/installer/npmTar.d.ts +13 -0
- package/dist/plugins/installer/npmTar.js +321 -0
- package/dist/plugins/installer/parseSource.d.ts +11 -0
- package/dist/plugins/installer/parseSource.js +48 -0
- package/dist/plugins/installer/preview.d.ts +101 -0
- package/dist/plugins/installer/preview.js +336 -0
- package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
- package/dist/plugins/installer/projectPluginSource.js +140 -0
- package/dist/plugins/installer/types.d.ts +775 -0
- package/dist/plugins/installer/types.js +100 -0
- package/dist/plugins/installer/unzip.d.ts +11 -0
- package/dist/plugins/installer/unzip.js +123 -9
- package/dist/plugins/installer/update.d.ts +2 -2
- package/dist/plugins/installer/update.js +43 -4
- package/dist/plugins/loadPluginHooks.d.ts +19 -2
- package/dist/plugins/loadPluginHooks.js +97 -86
- package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
- package/dist/plugins/pluginAutomationTemplates.js +50 -0
- package/dist/plugins/pluginCatalog.d.ts +45 -0
- package/dist/plugins/pluginCatalog.js +87 -0
- package/dist/plugins/pluginCommandHook.d.ts +6 -0
- package/dist/plugins/pluginCommandHook.js +25 -8
- package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
- package/dist/plugins/pluginCommandsLoader.js +181 -7
- package/dist/plugins/pluginContent.d.ts +10 -1
- package/dist/plugins/pluginContent.js +87 -30
- package/dist/plugins/pluginHookApproval.d.ts +30 -0
- package/dist/plugins/pluginHookApproval.js +160 -0
- package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
- package/dist/plugins/pluginHookIntegrity.js +361 -0
- package/dist/plugins/pluginInstaller.js +71 -12
- package/dist/plugins/pluginMcpApproval.d.ts +19 -0
- package/dist/plugins/pluginMcpApproval.js +110 -0
- package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
- package/dist/plugins/pluginMcpIntegrity.js +74 -0
- package/dist/plugins/types.d.ts +30 -0
- package/dist/plugins/varRewrite.d.ts +9 -5
- package/dist/plugins/varRewrite.js +26 -17
- package/dist/preset/index.d.ts +11 -8
- package/dist/preset/index.js +62 -203
- package/dist/product/define.js +9 -3
- package/dist/product/types.d.ts +0 -2
- package/dist/profile/activation.d.ts +36 -0
- package/dist/profile/activation.js +57 -0
- package/dist/profile/catalog-store.d.ts +77 -0
- package/dist/profile/catalog-store.js +346 -0
- package/dist/profile/catalog.d.ts +54 -0
- package/dist/profile/catalog.js +152 -0
- package/dist/profile/index.d.ts +7 -0
- package/dist/profile/index.js +7 -0
- package/dist/profile/requirements.d.ts +76 -0
- package/dist/profile/requirements.js +117 -0
- package/dist/profile/resolve.d.ts +11 -0
- package/dist/profile/resolve.js +41 -0
- package/dist/profile/store.d.ts +17 -0
- package/dist/profile/store.js +167 -0
- package/dist/profile/types.d.ts +321 -0
- package/dist/profile/types.js +104 -0
- package/dist/prompt/composer.d.ts +46 -7
- package/dist/prompt/composer.js +78 -48
- package/dist/prompt/instruction-scanner.d.ts +6 -5
- package/dist/prompt/instruction-scanner.js +8 -23
- package/dist/prompt/section-loader.d.ts +2 -2
- package/dist/prompt/section-loader.js +7 -4
- package/dist/prompt/sections/browser.md +10 -9
- package/dist/prompt/sections/harness-base.md +9 -0
- package/dist/protocol/chat-session-manager.d.ts +64 -1
- package/dist/protocol/chat-session-manager.js +104 -0
- package/dist/protocol/chat-session.d.ts +61 -10
- package/dist/protocol/chat-session.js +135 -25
- package/dist/protocol/client.d.ts +33 -3
- package/dist/protocol/client.js +96 -5
- package/dist/protocol/index.d.ts +2 -2
- package/dist/protocol/index.js +2 -2
- package/dist/protocol/mobile-remote-types.d.ts +406 -0
- package/dist/protocol/mobile-remote-types.js +1 -0
- package/dist/protocol/server.d.ts +127 -3
- package/dist/protocol/server.js +1309 -182
- package/dist/protocol/types.d.ts +152 -34
- package/dist/protocol/types.js +16 -0
- package/dist/run/ArtifactTracker.d.ts +6 -1
- package/dist/run/ArtifactTracker.js +29 -21
- package/dist/run/EngineRunner.d.ts +2 -0
- package/dist/run/EngineRunner.js +1 -0
- package/dist/run/RunManager.d.ts +26 -0
- package/dist/run/RunManager.js +82 -11
- package/dist/run/factory.d.ts +3 -0
- package/dist/run/factory.js +2 -0
- package/dist/runtime/safe-spawn.d.ts +6 -0
- package/dist/runtime/safe-spawn.js +8 -13
- package/dist/services/auto-dream.d.ts +13 -1
- package/dist/services/auto-dream.js +56 -8
- package/dist/services/dream-consolidation.js +10 -1
- package/dist/services/memory-orchestrator.js +6 -2
- package/dist/services/oauth.js +4 -1
- package/dist/services/session-memory.d.ts +4 -4
- package/dist/services/session-memory.js +13 -10
- package/dist/session/memory.d.ts +26 -7
- package/dist/session/memory.js +79 -21
- package/dist/session/session-manager.d.ts +182 -28
- package/dist/session/session-manager.js +910 -130
- package/dist/session/session-message.d.ts +22 -0
- package/dist/session/session-message.js +1 -0
- package/dist/session/transcript.d.ts +46 -5
- package/dist/session/transcript.js +159 -3
- package/dist/settings/feature-flags.d.ts +40 -0
- package/dist/settings/feature-flags.js +40 -0
- package/dist/settings/manager.d.ts +39 -1
- package/dist/settings/manager.js +102 -41
- package/dist/settings/migrate-config.js +4 -2
- package/dist/settings/schema.d.ts +511 -177
- package/dist/settings/schema.js +98 -25
- package/dist/skills/scanner.d.ts +6 -2
- package/dist/skills/scanner.js +160 -9
- package/dist/sources/adapter.d.ts +14 -0
- package/dist/sources/adapter.js +7 -0
- package/dist/sources/adapters/local-files.d.ts +10 -0
- package/dist/sources/adapters/local-files.js +127 -0
- package/dist/sources/adapters/mcp-resource.d.ts +17 -0
- package/dist/sources/adapters/mcp-resource.js +41 -0
- package/dist/sources/adapters/mock.d.ts +3 -0
- package/dist/sources/adapters/mock.js +29 -0
- package/dist/sources/binding.d.ts +6 -0
- package/dist/sources/binding.js +24 -0
- package/dist/sources/catalog.d.ts +6 -0
- package/dist/sources/catalog.js +64 -0
- package/dist/sources/context-summary.d.ts +8 -0
- package/dist/sources/context-summary.js +13 -0
- package/dist/sources/credential-status.d.ts +2 -0
- package/dist/sources/credential-status.js +13 -0
- package/dist/sources/index.d.ts +10 -0
- package/dist/sources/index.js +10 -0
- package/dist/sources/resolve.d.ts +28 -0
- package/dist/sources/resolve.js +47 -0
- package/dist/sources/truncate-utf8.d.ts +7 -0
- package/dist/sources/truncate-utf8.js +18 -0
- package/dist/sources/types.d.ts +71 -0
- package/dist/sources/types.js +26 -0
- package/dist/testing/fetch-stub.d.ts +32 -0
- package/dist/testing/fetch-stub.js +24 -0
- package/dist/themes/image.d.ts +18 -0
- package/dist/themes/image.js +117 -0
- package/dist/themes/index.d.ts +4 -0
- package/dist/themes/index.js +4 -0
- package/dist/themes/installer.d.ts +50 -0
- package/dist/themes/installer.js +290 -0
- package/dist/themes/manifest.d.ts +102 -0
- package/dist/themes/manifest.js +86 -0
- package/dist/themes/paths.d.ts +14 -0
- package/dist/themes/paths.js +33 -0
- package/dist/tool-system/browser-bridge.d.ts +53 -11
- package/dist/tool-system/browser-bridge.js +8 -9
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
- package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
- package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
- package/dist/tool-system/builtin/agent-notifications.js +291 -101
- package/dist/tool-system/builtin/agent-output-file.js +1 -3
- package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
- package/dist/tool-system/builtin/agent-progress.js +83 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
- package/dist/tool-system/builtin/agent-registry.js +178 -9
- package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
- package/dist/tool-system/builtin/agent.d.ts +2 -0
- package/dist/tool-system/builtin/agent.js +274 -33
- package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
- package/dist/tool-system/builtin/background-jobs.js +96 -4
- package/dist/tool-system/builtin/background-work.d.ts +6 -0
- package/dist/tool-system/builtin/background-work.js +8 -1
- package/dist/tool-system/builtin/bash.js +5 -2
- package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
- package/dist/tool-system/builtin/browser-tools.js +89 -23
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
- package/dist/tool-system/builtin/edit.js +2 -6
- package/dist/tool-system/builtin/file-cache.d.ts +2 -0
- package/dist/tool-system/builtin/file-cache.js +4 -0
- package/dist/tool-system/builtin/generate-image.js +17 -10
- package/dist/tool-system/builtin/generate-video.js +26 -7
- package/dist/tool-system/builtin/grep.js +2 -2
- package/dist/tool-system/builtin/image-uploader.js +7 -1
- package/dist/tool-system/builtin/index.d.ts +32 -7
- package/dist/tool-system/builtin/index.js +237 -167
- package/dist/tool-system/builtin/memory.d.ts +6 -0
- package/dist/tool-system/builtin/memory.js +36 -15
- package/dist/tool-system/builtin/panel.d.ts +9 -0
- package/dist/tool-system/builtin/panel.js +314 -0
- package/dist/tool-system/builtin/read.js +5 -1
- package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
- package/dist/tool-system/builtin/send-message-to-session.js +67 -0
- package/dist/tool-system/builtin/sources.d.ts +8 -0
- package/dist/tool-system/builtin/sources.js +137 -0
- package/dist/tool-system/builtin/tool-search.js +7 -2
- package/dist/tool-system/builtin/update-automation-memory.js +2 -0
- package/dist/tool-system/builtin/web-fetch.js +17 -13
- package/dist/tool-system/builtin/web-search.js +1 -3
- package/dist/tool-system/capability-module.d.ts +93 -0
- package/dist/tool-system/capability-module.js +53 -0
- package/dist/tool-system/context.d.ts +77 -19
- package/dist/tool-system/executor.js +75 -50
- package/dist/tool-system/external-tool-exposure.d.ts +60 -0
- package/dist/tool-system/external-tool-exposure.js +304 -0
- package/dist/tool-system/mcp-manager.d.ts +11 -1
- package/dist/tool-system/mcp-manager.js +19 -4
- package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
- package/dist/tool-system/mcp-tool-policy.js +34 -0
- package/dist/tool-system/panel-bridge.d.ts +53 -0
- package/dist/tool-system/panel-bridge.js +1 -0
- package/dist/tool-system/path-policy.js +99 -2
- package/dist/tool-system/permission.d.ts +26 -0
- package/dist/tool-system/permission.js +46 -0
- package/dist/tool-system/registry.d.ts +12 -1
- package/dist/tool-system/registry.js +31 -7
- package/dist/tool-system/sandbox/index.js +3 -8
- package/dist/tool-system/sandbox/seatbelt.js +2 -6
- package/dist/tool-system/session-tool-host.d.ts +139 -0
- package/dist/tool-system/session-tool-host.js +167 -0
- package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
- package/dist/tool-system/testing/tool-registry-harness.js +51 -0
- package/dist/tool-system/validation.d.ts +14 -7
- package/dist/tool-system/validation.js +701 -7
- package/dist/types.d.ts +186 -20
- package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
- package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
- package/dist/utils/file-mutex.d.ts +65 -0
- package/dist/utils/file-mutex.js +145 -0
- package/dist/utils/json.d.ts +2 -4
- package/dist/utils/json.js +2 -4
- package/dist/utils/lockfile.d.ts +30 -1
- package/dist/utils/lockfile.js +2 -2
- package/dist/utils/secret-scrubber.d.ts +8 -0
- package/dist/utils/secret-scrubber.js +227 -0
- package/dist/utils/toolDisplay.js +1 -1
- package/package.json +20 -5
- package/THIRD_PARTY_NOTICES.md +0 -206
- package/dist/arena/arena.d.ts +0 -45
- package/dist/arena/arena.js +0 -362
- package/dist/arena/context/context-tools.d.ts +0 -16
- package/dist/arena/context/context-tools.js +0 -272
- package/dist/arena/context/within-root.d.ts +0 -7
- package/dist/arena/context/within-root.js +0 -15
- package/dist/arena/detect-mode.d.ts +0 -20
- package/dist/arena/detect-mode.js +0 -78
- package/dist/arena/digest-builder.d.ts +0 -25
- package/dist/arena/digest-builder.js +0 -120
- package/dist/arena/index.d.ts +0 -29
- package/dist/arena/index.js +0 -29
- package/dist/arena/iterate/convergence.d.ts +0 -25
- package/dist/arena/iterate/convergence.js +0 -103
- package/dist/arena/iterate/formats/index.d.ts +0 -22
- package/dist/arena/iterate/formats/index.js +0 -283
- package/dist/arena/iterate/index.d.ts +0 -11
- package/dist/arena/iterate/index.js +0 -9
- package/dist/arena/iterate/iterative-arena.d.ts +0 -23
- package/dist/arena/iterate/iterative-arena.js +0 -237
- package/dist/arena/iterate/parse.d.ts +0 -42
- package/dist/arena/iterate/parse.js +0 -123
- package/dist/arena/iterate/phases/argue.d.ts +0 -22
- package/dist/arena/iterate/phases/argue.js +0 -165
- package/dist/arena/iterate/phases/revise.d.ts +0 -16
- package/dist/arena/iterate/phases/revise.js +0 -62
- package/dist/arena/iterate/phases/tournament.d.ts +0 -34
- package/dist/arena/iterate/phases/tournament.js +0 -113
- package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
- package/dist/arena/iterate/tools/web-tools.js +0 -54
- package/dist/arena/iterate/types.d.ts +0 -152
- package/dist/arena/iterate/types.js +0 -8
- package/dist/arena/ledger.d.ts +0 -47
- package/dist/arena/ledger.js +0 -159
- package/dist/arena/lenses/architecture.d.ts +0 -5
- package/dist/arena/lenses/architecture.js +0 -22
- package/dist/arena/lenses/engineering.d.ts +0 -5
- package/dist/arena/lenses/engineering.js +0 -22
- package/dist/arena/lenses/general.d.ts +0 -5
- package/dist/arena/lenses/general.js +0 -20
- package/dist/arena/lenses/index.d.ts +0 -16
- package/dist/arena/lenses/index.js +0 -47
- package/dist/arena/lenses/product.d.ts +0 -5
- package/dist/arena/lenses/product.js +0 -22
- package/dist/arena/model-presets.d.ts +0 -23
- package/dist/arena/model-presets.js +0 -44
- package/dist/arena/phases/adjudication.d.ts +0 -25
- package/dist/arena/phases/adjudication.js +0 -142
- package/dist/arena/phases/build-consensus.d.ts +0 -30
- package/dist/arena/phases/build-consensus.js +0 -85
- package/dist/arena/phases/claim-registry.d.ts +0 -26
- package/dist/arena/phases/claim-registry.js +0 -60
- package/dist/arena/phases/cross-review.d.ts +0 -47
- package/dist/arena/phases/cross-review.js +0 -224
- package/dist/arena/phases/debate-rounds.d.ts +0 -28
- package/dist/arena/phases/debate-rounds.js +0 -161
- package/dist/arena/phases/participant-research.d.ts +0 -39
- package/dist/arena/phases/participant-research.js +0 -316
- package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
- package/dist/arena/phases/planning-detail-expansion.js +0 -120
- package/dist/arena/planner.d.ts +0 -28
- package/dist/arena/planner.js +0 -312
- package/dist/arena/providers/docs.d.ts +0 -7
- package/dist/arena/providers/docs.js +0 -111
- package/dist/arena/providers/git.d.ts +0 -8
- package/dist/arena/providers/git.js +0 -174
- package/dist/arena/providers/index.d.ts +0 -32
- package/dist/arena/providers/index.js +0 -132
- package/dist/arena/providers/none.d.ts +0 -7
- package/dist/arena/providers/none.js +0 -11
- package/dist/arena/providers/repo.d.ts +0 -7
- package/dist/arena/providers/repo.js +0 -258
- package/dist/arena/render/session.d.ts +0 -17
- package/dist/arena/render/session.js +0 -190
- package/dist/arena/render/terminal.d.ts +0 -34
- package/dist/arena/render/terminal.js +0 -286
- package/dist/arena/strategies/discussion.d.ts +0 -25
- package/dist/arena/strategies/discussion.js +0 -143
- package/dist/arena/strategies/index.d.ts +0 -15
- package/dist/arena/strategies/index.js +0 -28
- package/dist/arena/strategies/language-wrapper.d.ts +0 -17
- package/dist/arena/strategies/language-wrapper.js +0 -102
- package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
- package/dist/arena/strategies/lens-wrapper.js +0 -236
- package/dist/arena/strategies/planning.d.ts +0 -30
- package/dist/arena/strategies/planning.js +0 -225
- package/dist/arena/strategies/review.d.ts +0 -26
- package/dist/arena/strategies/review.js +0 -168
- package/dist/arena/strategies/utils.d.ts +0 -36
- package/dist/arena/strategies/utils.js +0 -603
- package/dist/arena/tools/selector.d.ts +0 -17
- package/dist/arena/tools/selector.js +0 -61
- package/dist/arena/transitions.d.ts +0 -53
- package/dist/arena/transitions.js +0 -97
- package/dist/arena/types.d.ts +0 -518
- package/dist/arena/types.js +0 -27
- package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
- package/dist/cc-orchestrator/agent-adapter.js +0 -143
- package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
- package/dist/cc-orchestrator/cc-capability.js +0 -53
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
- package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
- package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
- package/dist/cc-orchestrator/codex-session-history.js +0 -247
- package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
- package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
- package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-changes.js +0 -231
- package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-driver.js +0 -284
- package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
- package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
- package/dist/cc-orchestrator/index.d.ts +0 -8
- package/dist/cc-orchestrator/index.js +0 -8
- package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
- package/dist/cc-orchestrator/relevance-judge.js +0 -29
- package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
- package/dist/cc-orchestrator/session-discovery.js +0 -125
- package/dist/cc-orchestrator/session-history.d.ts +0 -54
- package/dist/cc-orchestrator/session-history.js +0 -150
- package/dist/cron/cron-runtime.d.ts +0 -2
- package/dist/cron/cron-runtime.js +0 -2
- package/dist/cron/cron-store.d.ts +0 -2
- package/dist/cron/cron-store.js +0 -2
- package/dist/cron/scheduler.d.ts +0 -7
- package/dist/cron/scheduler.js +0 -7
- package/dist/engine/goal.js +0 -206
- package/dist/external-agents/config.d.ts +0 -2
- package/dist/external-agents/config.js +0 -15
- package/dist/external-agents/types.d.ts +0 -31
- package/dist/git/parse-log.d.ts +0 -13
- package/dist/git/parse-log.js +0 -21
- package/dist/git/utils.d.ts +0 -49
- package/dist/git/utils.js +0 -161
- package/dist/git/worktree/crud.d.ts +0 -72
- package/dist/git/worktree/crud.js +0 -235
- package/dist/git/worktree/diff.d.ts +0 -14
- package/dist/git/worktree/diff.js +0 -82
- package/dist/git/worktree/git-exec.d.ts +0 -7
- package/dist/git/worktree/git-exec.js +0 -87
- package/dist/git/worktree/index.d.ts +0 -5
- package/dist/git/worktree/index.js +0 -5
- package/dist/git/worktree/query.d.ts +0 -43
- package/dist/git/worktree/query.js +0 -128
- package/dist/git/worktree/slug.d.ts +0 -11
- package/dist/git/worktree/slug.js +0 -58
- package/dist/git/worktree.d.ts +0 -1
- package/dist/git/worktree.js +0 -5
- package/dist/lsp/client.d.ts +0 -41
- package/dist/lsp/client.js +0 -186
- package/dist/lsp/manager.d.ts +0 -40
- package/dist/lsp/manager.js +0 -155
- package/dist/lsp/root-path.d.ts +0 -9
- package/dist/lsp/root-path.js +0 -12
- package/dist/lsp/servers.d.ts +0 -16
- package/dist/lsp/servers.js +0 -60
- package/dist/prompt/sections/coding.md +0 -35
- package/dist/quota/credentials.d.ts +0 -3
- package/dist/quota/credentials.js +0 -80
- package/dist/quota/index.d.ts +0 -36
- package/dist/quota/index.js +0 -155
- package/dist/quota/types.d.ts +0 -48
- package/dist/quota/types.js +0 -13
- package/dist/review/review-prompt.d.ts +0 -28
- package/dist/review/review-prompt.js +0 -81
- package/dist/state.d.ts +0 -160
- package/dist/state.js +0 -267
- package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
- package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
- package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
- package/dist/tool-system/builtin/apply-patch/index.js +0 -105
- package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
- package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
- package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
- package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
- package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
- package/dist/tool-system/builtin/apply-patch/types.js +0 -13
- package/dist/tool-system/builtin/arena.d.ts +0 -31
- package/dist/tool-system/builtin/arena.js +0 -416
- package/dist/tool-system/builtin/brief.d.ts +0 -6
- package/dist/tool-system/builtin/brief.js +0 -41
- package/dist/tool-system/builtin/check-quota.d.ts +0 -15
- package/dist/tool-system/builtin/check-quota.js +0 -34
- package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
- package/dist/tool-system/builtin/drive-claude-code.js +0 -698
- package/dist/tool-system/builtin/lsp.d.ts +0 -7
- package/dist/tool-system/builtin/lsp.js +0 -144
- package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
- package/dist/tool-system/builtin/notebook-edit.js +0 -127
- package/dist/tool-system/builtin/worktree.d.ts +0 -11
- package/dist/tool-system/builtin/worktree.js +0 -363
- /package/dist/{external-agents → links}/types.js +0 -0
- /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
- /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
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
|
-
*
|
|
5
|
-
*
|
|
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
|
+
}
|