@cjhyy/code-shell-core 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +20 -5
- package/dist/context/compaction.d.ts +39 -3
- package/dist/context/compaction.js +151 -39
- package/dist/context/manager.d.ts +20 -4
- package/dist/context/manager.js +42 -7
- package/dist/context/token-counter.js +5 -3
- package/dist/context/tool-result-storage.d.ts +6 -0
- package/dist/context/tool-result-storage.js +25 -4
- package/dist/credentials/access.d.ts +13 -2
- package/dist/credentials/access.js +99 -4
- package/dist/credentials/index.d.ts +3 -2
- package/dist/credentials/index.js +2 -1
- package/dist/credentials/oauth.d.ts +9 -1
- package/dist/credentials/oauth.js +80 -1
- package/dist/credentials/store.d.ts +16 -2
- package/dist/credentials/store.js +33 -11
- package/dist/credentials/types.d.ts +62 -1
- package/dist/credentials/types.js +16 -1
- 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 +272 -184
- package/dist/engine/engine.js +1869 -1864
- 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/session-title.d.ts +2 -1
- package/dist/engine/session-title.js +4 -1
- 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 +67 -10
- package/dist/engine/turn-loop.js +538 -97
- package/dist/engine/types.d.ts +35 -4
- package/dist/engine/types.js +1 -1
- package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
- package/dist/goal/lifecycle.js +482 -0
- package/dist/hooks/events.d.ts +26 -9
- package/dist/hooks/events.js +0 -3
- package/dist/hooks/goal-stop-hook.d.ts +28 -29
- package/dist/hooks/goal-stop-hook.js +344 -144
- package/dist/hooks/registry.js +4 -1
- package/dist/hooks/shell-runner.d.ts +12 -1
- package/dist/hooks/shell-runner.js +160 -9
- package/dist/index.d.ts +51 -110
- 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 +37 -125
- 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 +72 -10
- 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/llm/types.d.ts +12 -5
- 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 +10 -4
- package/dist/plugins/pluginCommandHook.js +133 -18
- 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 +77 -3
- package/dist/protocol/chat-session-manager.js +194 -18
- package/dist/protocol/chat-session.d.ts +72 -9
- package/dist/protocol/chat-session.js +151 -16
- package/dist/protocol/client.d.ts +37 -4
- package/dist/protocol/client.js +118 -6
- 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 +152 -14
- package/dist/protocol/server.js +1574 -229
- package/dist/protocol/types.d.ts +182 -32
- package/dist/protocol/types.js +18 -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.d.ts +3 -0
- package/dist/services/dream-consolidation.js +14 -2
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.js +1 -1
- package/dist/services/memory-orchestrator.js +6 -2
- package/dist/services/oauth.d.ts +34 -10
- package/dist/services/oauth.js +236 -98
- 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 +208 -25
- package/dist/session/session-manager.js +1232 -116
- package/dist/session/session-message.d.ts +22 -0
- package/dist/session/session-message.js +1 -0
- package/dist/session/transcript.d.ts +76 -6
- package/dist/session/transcript.js +278 -7
- 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 +279 -34
- package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
- package/dist/tool-system/builtin/background-jobs.js +111 -15
- package/dist/tool-system/builtin/background-work.d.ts +12 -1
- package/dist/tool-system/builtin/background-work.js +12 -1
- package/dist/tool-system/builtin/bash.d.ts +3 -5
- package/dist/tool-system/builtin/bash.js +14 -6
- package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
- 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.d.ts +2 -1
- package/dist/tool-system/builtin/edit.js +14 -10
- 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.d.ts +4 -0
- package/dist/tool-system/builtin/generate-video.js +164 -28
- package/dist/tool-system/builtin/glob.d.ts +2 -1
- package/dist/tool-system/builtin/glob.js +28 -3
- package/dist/tool-system/builtin/grep.d.ts +1 -0
- package/dist/tool-system/builtin/grep.js +82 -17
- package/dist/tool-system/builtin/image-uploader.js +7 -1
- package/dist/tool-system/builtin/index.d.ts +57 -18
- package/dist/tool-system/builtin/index.js +280 -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/video-providers.d.ts +12 -15
- package/dist/tool-system/builtin/video-providers.js +1 -0
- package/dist/tool-system/builtin/view-image.d.ts +2 -2
- package/dist/tool-system/builtin/web-fetch.js +60 -15
- package/dist/tool-system/builtin/web-search.js +1 -3
- package/dist/tool-system/builtin/write.d.ts +2 -1
- package/dist/tool-system/builtin/write.js +14 -4
- 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 +94 -24
- package/dist/tool-system/executor.js +99 -58
- 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 +17 -1
- package/dist/tool-system/mcp-manager.js +72 -7
- 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.d.ts +19 -0
- package/dist/tool-system/path-policy.js +62 -1
- package/dist/tool-system/permission.d.ts +69 -3
- package/dist/tool-system/permission.js +429 -30
- package/dist/tool-system/registry.d.ts +15 -3
- package/dist/tool-system/registry.js +82 -40
- 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 +201 -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 -43
- package/dist/arena/arena.js +0 -333
- 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 -24
- package/dist/arena/phases/adjudication.js +0 -141
- package/dist/arena/phases/build-consensus.d.ts +0 -29
- package/dist/arena/phases/build-consensus.js +0 -83
- 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 -45
- package/dist/arena/phases/cross-review.js +0 -218
- package/dist/arena/phases/debate-rounds.d.ts +0 -27
- package/dist/arena/phases/debate-rounds.js +0 -159
- package/dist/arena/phases/participant-research.d.ts +0 -38
- package/dist/arena/phases/participant-research.js +0 -314
- package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
- package/dist/arena/phases/planning-detail-expansion.js +0 -119
- package/dist/arena/planner.d.ts +0 -27
- package/dist/arena/planner.js +0 -311
- 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 -514
- 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 -69
- package/dist/git/worktree/crud.js +0 -206
- 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 -51
- 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 -42
- package/dist/git/worktree/query.js +0 -121
- 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 -415
- 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 -345
- /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
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { truncateUtf8Text } from "../truncate-utf8.js";
|
|
2
|
+
function serverOf(definition) {
|
|
3
|
+
const configured = definition.adapterConfig["server"];
|
|
4
|
+
if (typeof configured !== "string" || configured.trim() === "") {
|
|
5
|
+
throw new Error(`mcp-resource source "${definition.id}" requires adapterConfig.server`);
|
|
6
|
+
}
|
|
7
|
+
return configured.trim();
|
|
8
|
+
}
|
|
9
|
+
export function createMcpResourceAdapter(getManager) {
|
|
10
|
+
return {
|
|
11
|
+
kind: "mcp-resource",
|
|
12
|
+
async listScopes() {
|
|
13
|
+
return [{ id: "resources", label: "Resources" }];
|
|
14
|
+
},
|
|
15
|
+
async listResources(definition, scopeId) {
|
|
16
|
+
if (scopeId !== "resources")
|
|
17
|
+
return [];
|
|
18
|
+
const resources = await (await getManager()).listResources(serverOf(definition));
|
|
19
|
+
return resources.map((resource) => ({
|
|
20
|
+
id: resource.uri,
|
|
21
|
+
scopeId: "resources",
|
|
22
|
+
name: resource.name ?? resource.uri,
|
|
23
|
+
}));
|
|
24
|
+
},
|
|
25
|
+
async read(definition, resourceId, options) {
|
|
26
|
+
const text = await (await getManager()).readResource(serverOf(definition), resourceId, options.signal);
|
|
27
|
+
const truncated = truncateUtf8Text(text, options.maxBytes);
|
|
28
|
+
return {
|
|
29
|
+
resourceId,
|
|
30
|
+
...truncated,
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** 生产默认:方法首次执行时才加载真 MCPManager,避免静态模块环。 */
|
|
36
|
+
export function defaultMcpResourceAdapter() {
|
|
37
|
+
return createMcpResourceAdapter(async () => {
|
|
38
|
+
const { MCPManager } = await import("../../tool-system/mcp-manager.js");
|
|
39
|
+
return MCPManager.getInstance();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { truncateUtf8Text } from "../truncate-utf8.js";
|
|
2
|
+
const RESOURCES = [
|
|
3
|
+
{ id: "alpha/doc-1", scopeId: "alpha", name: "doc-1", text: "alpha doc one 内容" },
|
|
4
|
+
{ id: "alpha/doc-2", scopeId: "alpha", name: "doc-2", text: "alpha doc two content" },
|
|
5
|
+
{ id: "beta/note-1", scopeId: "beta", name: "note-1", text: "beta note one content" },
|
|
6
|
+
];
|
|
7
|
+
export const mockAdapter = {
|
|
8
|
+
kind: "mock",
|
|
9
|
+
async listScopes() {
|
|
10
|
+
return [
|
|
11
|
+
{ id: "alpha", label: "Alpha" },
|
|
12
|
+
{ id: "beta", label: "Beta" },
|
|
13
|
+
];
|
|
14
|
+
},
|
|
15
|
+
async listResources(_definition, scopeId) {
|
|
16
|
+
return RESOURCES.filter((resource) => resource.scopeId === scopeId).map(({ text: _text, ...metadata }) => metadata);
|
|
17
|
+
},
|
|
18
|
+
async read(_definition, resourceId, options) {
|
|
19
|
+
const resource = RESOURCES.find((candidate) => candidate.id === resourceId);
|
|
20
|
+
if (!resource) {
|
|
21
|
+
throw new Error(`mock resource not found: ${resourceId}`);
|
|
22
|
+
}
|
|
23
|
+
const truncated = truncateUtf8Text(resource.text, options.maxBytes);
|
|
24
|
+
return {
|
|
25
|
+
resourceId,
|
|
26
|
+
...truncated,
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** WorkspaceSourceBinding 的项目 settings 读写(原子,经 SettingsManager)。 */
|
|
2
|
+
import type { SettingsManager } from "../settings/manager.js";
|
|
3
|
+
import { type WorkspaceSourceBinding } from "./types.js";
|
|
4
|
+
export declare function listBindings(sm: SettingsManager, cwd: string): WorkspaceSourceBinding[];
|
|
5
|
+
export declare function bindSource(sm: SettingsManager, cwd: string, binding: WorkspaceSourceBinding): void;
|
|
6
|
+
export declare function unbindSource(sm: SettingsManager, cwd: string, sourceId: string): void;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { WorkspaceSourceBindingSchema } from "./types.js";
|
|
2
|
+
export function listBindings(sm, cwd) {
|
|
3
|
+
try {
|
|
4
|
+
const raw = sm.getForScope("project", cwd).sources;
|
|
5
|
+
if (!Array.isArray(raw))
|
|
6
|
+
return [];
|
|
7
|
+
return raw
|
|
8
|
+
.map((binding) => WorkspaceSourceBindingSchema.safeParse(binding))
|
|
9
|
+
.filter((result) => result.success)
|
|
10
|
+
.map((result) => result.data);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function bindSource(sm, cwd, binding) {
|
|
17
|
+
const parsed = WorkspaceSourceBindingSchema.parse(binding);
|
|
18
|
+
const rest = listBindings(sm, cwd).filter((item) => item.sourceId !== parsed.sourceId);
|
|
19
|
+
sm.saveProjectSetting("sources", [...rest, parsed], cwd);
|
|
20
|
+
}
|
|
21
|
+
export function unbindSource(sm, cwd, sourceId) {
|
|
22
|
+
const bindings = listBindings(sm, cwd).filter((binding) => binding.sourceId !== sourceId);
|
|
23
|
+
sm.saveProjectSetting("sources", bindings, cwd);
|
|
24
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type SourceDefinition } from "./types.js";
|
|
2
|
+
export declare function sourceCatalogPath(): string;
|
|
3
|
+
export declare function listSourceDefinitions(): SourceDefinition[];
|
|
4
|
+
export declare function readSourceDefinition(id: string): SourceDefinition | undefined;
|
|
5
|
+
export declare function saveSourceDefinition(definition: SourceDefinition): void;
|
|
6
|
+
export declare function deleteSourceDefinition(id: string): void;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/** 全局数据源目录:codeShellHome()/sources.json。损坏条目隔离,原子写。 */
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { logger } from "../logging/logger.js";
|
|
5
|
+
import { codeShellHome } from "../session/session-manager.js";
|
|
6
|
+
import { SourceDefinitionSchema } from "./types.js";
|
|
7
|
+
export function sourceCatalogPath() {
|
|
8
|
+
return join(codeShellHome(), "sources.json");
|
|
9
|
+
}
|
|
10
|
+
function load() {
|
|
11
|
+
const path = sourceCatalogPath();
|
|
12
|
+
if (!existsSync(path))
|
|
13
|
+
return [];
|
|
14
|
+
try {
|
|
15
|
+
const raw = JSON.parse(readFileSync(path, "utf-8"));
|
|
16
|
+
if (raw.version !== 1 || !Array.isArray(raw.sources))
|
|
17
|
+
return [];
|
|
18
|
+
const sources = [];
|
|
19
|
+
for (const entry of raw.sources) {
|
|
20
|
+
const parsed = SourceDefinitionSchema.safeParse(entry);
|
|
21
|
+
if (parsed.success) {
|
|
22
|
+
sources.push(parsed.data);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
logger.warn("sources.catalog_entry_invalid", {
|
|
26
|
+
cat: "sources",
|
|
27
|
+
entry: JSON.stringify(entry).slice(0, 200),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return sources;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
logger.warn("sources.catalog_unreadable", {
|
|
35
|
+
cat: "sources",
|
|
36
|
+
error: error instanceof Error ? error.message : String(error),
|
|
37
|
+
});
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function persist(sources) {
|
|
42
|
+
const path = sourceCatalogPath();
|
|
43
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
44
|
+
const tmp = `${path}.${process.pid}.tmp`;
|
|
45
|
+
writeFileSync(tmp, `${JSON.stringify({ version: 1, sources }, null, 2)}\n`, {
|
|
46
|
+
encoding: "utf-8",
|
|
47
|
+
mode: 0o600,
|
|
48
|
+
});
|
|
49
|
+
renameSync(tmp, path);
|
|
50
|
+
}
|
|
51
|
+
export function listSourceDefinitions() {
|
|
52
|
+
return load().sort((a, b) => a.id.localeCompare(b.id));
|
|
53
|
+
}
|
|
54
|
+
export function readSourceDefinition(id) {
|
|
55
|
+
return load().find((source) => source.id === id);
|
|
56
|
+
}
|
|
57
|
+
export function saveSourceDefinition(definition) {
|
|
58
|
+
const parsed = SourceDefinitionSchema.parse(definition);
|
|
59
|
+
const rest = load().filter((source) => source.id !== parsed.id);
|
|
60
|
+
persist([...rest, parsed]);
|
|
61
|
+
}
|
|
62
|
+
export function deleteSourceDefinition(id) {
|
|
63
|
+
persist(load().filter((source) => source.id !== id));
|
|
64
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SettingsManager } from "../settings/manager.js";
|
|
2
|
+
import { type CredentialStatusFn } from "./resolve.js";
|
|
3
|
+
export interface BuildSourcesContextSummaryInput {
|
|
4
|
+
cwd: string;
|
|
5
|
+
settings: SettingsManager;
|
|
6
|
+
credentialStatus?: CredentialStatusFn;
|
|
7
|
+
}
|
|
8
|
+
export declare function buildSourcesContextSummary(input: BuildSourcesContextSummaryInput): string;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defaultCredentialStatus } from "./credential-status.js";
|
|
2
|
+
import { resolveEffectiveSourceAccess } from "./resolve.js";
|
|
3
|
+
export function buildSourcesContextSummary(input) {
|
|
4
|
+
const sources = resolveEffectiveSourceAccess({
|
|
5
|
+
cwd: input.cwd,
|
|
6
|
+
settings: input.settings,
|
|
7
|
+
credentialStatus: input.credentialStatus ?? defaultCredentialStatus,
|
|
8
|
+
});
|
|
9
|
+
if (sources.length === 0)
|
|
10
|
+
return "";
|
|
11
|
+
const lines = sources.map(({ label, kind, status, scopes }) => `- ${label} (${kind}, ${status}): ${scopes.join(", ") || "(no scopes)"}`);
|
|
12
|
+
return `## Bound data sources\n${lines.join("\n")}`;
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { getCredentialAccess } from "../credentials/access.js";
|
|
2
|
+
/** Probe global credential availability through renderer-safe metadata only. */
|
|
3
|
+
export function defaultCredentialStatus(ref) {
|
|
4
|
+
const credential = getCredentialAccess().resolveMeta(undefined, ref, "full");
|
|
5
|
+
if (!credential)
|
|
6
|
+
return "missing";
|
|
7
|
+
if (credential.type === "oauth" &&
|
|
8
|
+
credential.oauthStatus?.state === "expired" &&
|
|
9
|
+
!credential.oauthStatus.hasRefreshToken) {
|
|
10
|
+
return "expired";
|
|
11
|
+
}
|
|
12
|
+
return "ok";
|
|
13
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./catalog.js";
|
|
3
|
+
export * from "./adapter.js";
|
|
4
|
+
export * from "./adapters/mock.js";
|
|
5
|
+
export * from "./adapters/local-files.js";
|
|
6
|
+
export * from "./adapters/mcp-resource.js";
|
|
7
|
+
export * from "./binding.js";
|
|
8
|
+
export * from "./resolve.js";
|
|
9
|
+
export * from "./credential-status.js";
|
|
10
|
+
export * from "./context-summary.js";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./catalog.js";
|
|
3
|
+
export * from "./adapter.js";
|
|
4
|
+
export * from "./adapters/mock.js";
|
|
5
|
+
export * from "./adapters/local-files.js";
|
|
6
|
+
export * from "./adapters/mcp-resource.js";
|
|
7
|
+
export * from "./binding.js";
|
|
8
|
+
export * from "./resolve.js";
|
|
9
|
+
export * from "./credential-status.js";
|
|
10
|
+
export * from "./context-summary.js";
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EffectiveSourceAccess:binding × source.enabled × credential 状态求交,
|
|
3
|
+
* 默认 deny(ADR §1.3/§3)。`profile` 参数为 Profile 求交预留(ADR §6),
|
|
4
|
+
* 本期恒不传;接线时 effective = binding ∩ profile 声明,只能收窄。
|
|
5
|
+
*/
|
|
6
|
+
import type { SettingsManager } from "../settings/manager.js";
|
|
7
|
+
import type { SourceDefinition } from "./types.js";
|
|
8
|
+
export type SourceAccessStatus = "ok" | "dangling" | "unavailable";
|
|
9
|
+
export type CredentialStatusFn = (ref: string) => "ok" | "missing" | "expired";
|
|
10
|
+
export interface EffectiveSourceAccess {
|
|
11
|
+
sourceId: string;
|
|
12
|
+
label: string;
|
|
13
|
+
kind: string;
|
|
14
|
+
scopes: string[];
|
|
15
|
+
readPolicy: "ask" | "deny";
|
|
16
|
+
status: SourceAccessStatus;
|
|
17
|
+
definition?: SourceDefinition;
|
|
18
|
+
}
|
|
19
|
+
export interface ResolveSourceAccessInput {
|
|
20
|
+
cwd: string;
|
|
21
|
+
settings: SettingsManager;
|
|
22
|
+
credentialStatus: CredentialStatusFn;
|
|
23
|
+
/** Profile 求交预留(ADR §6);本期不实现。 */
|
|
24
|
+
profile?: {
|
|
25
|
+
requiredSources?: string[];
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export declare function resolveEffectiveSourceAccess(input: ResolveSourceAccessInput): EffectiveSourceAccess[];
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { LOCAL_FILES_SOURCE_ID, listLocalFiles, localFilesSourceFor, } from "./adapters/local-files.js";
|
|
2
|
+
import { listBindings } from "./binding.js";
|
|
3
|
+
import { readSourceDefinition } from "./catalog.js";
|
|
4
|
+
function statusOf(definition, credentialStatus) {
|
|
5
|
+
if (!definition)
|
|
6
|
+
return "dangling";
|
|
7
|
+
if (!definition.enabled)
|
|
8
|
+
return "unavailable";
|
|
9
|
+
if (definition.credentialRef && credentialStatus(definition.credentialRef) !== "ok") {
|
|
10
|
+
return "unavailable";
|
|
11
|
+
}
|
|
12
|
+
return "ok";
|
|
13
|
+
}
|
|
14
|
+
function definitionFor(binding, cwd) {
|
|
15
|
+
return binding.sourceId === LOCAL_FILES_SOURCE_ID
|
|
16
|
+
? localFilesSourceFor(cwd)
|
|
17
|
+
: readSourceDefinition(binding.sourceId);
|
|
18
|
+
}
|
|
19
|
+
export function resolveEffectiveSourceAccess(input) {
|
|
20
|
+
const bindings = listBindings(input.settings, input.cwd);
|
|
21
|
+
const access = bindings.map((binding) => {
|
|
22
|
+
const definition = definitionFor(binding, input.cwd);
|
|
23
|
+
return {
|
|
24
|
+
sourceId: binding.sourceId,
|
|
25
|
+
label: definition?.label ?? binding.sourceId,
|
|
26
|
+
kind: definition?.kind ?? "unknown",
|
|
27
|
+
scopes: binding.scopes,
|
|
28
|
+
readPolicy: binding.readPolicy,
|
|
29
|
+
status: statusOf(definition, input.credentialStatus),
|
|
30
|
+
...(definition ? { definition } : {}),
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
const hasImplicitLocalFiles = bindings.length > 0 || listLocalFiles(input.cwd).length > 0;
|
|
34
|
+
if (hasImplicitLocalFiles && !access.some((item) => item.sourceId === LOCAL_FILES_SOURCE_ID)) {
|
|
35
|
+
const definition = localFilesSourceFor(input.cwd);
|
|
36
|
+
access.push({
|
|
37
|
+
sourceId: definition.id,
|
|
38
|
+
label: definition.label,
|
|
39
|
+
kind: definition.kind,
|
|
40
|
+
scopes: ["uploads"],
|
|
41
|
+
readPolicy: "ask",
|
|
42
|
+
status: "ok",
|
|
43
|
+
definition,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return access;
|
|
47
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** UTF-8-safe byte truncation shared by source adapters and the source tool boundary. */
|
|
2
|
+
export interface TruncatedText {
|
|
3
|
+
text: string;
|
|
4
|
+
truncated: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function truncateUtf8Bytes(buffer: Buffer, maxBytes: number): TruncatedText;
|
|
7
|
+
export declare function truncateUtf8Text(text: string, maxBytes: number): TruncatedText;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
function normalizeByteLimit(maxBytes, byteLength) {
|
|
2
|
+
if (!Number.isFinite(maxBytes))
|
|
3
|
+
return 0;
|
|
4
|
+
return Math.max(0, Math.min(Math.trunc(maxBytes), byteLength));
|
|
5
|
+
}
|
|
6
|
+
export function truncateUtf8Bytes(buffer, maxBytes) {
|
|
7
|
+
const limit = normalizeByteLimit(maxBytes, buffer.byteLength);
|
|
8
|
+
if (buffer.byteLength <= limit) {
|
|
9
|
+
return { text: buffer.toString("utf8"), truncated: false };
|
|
10
|
+
}
|
|
11
|
+
let end = limit;
|
|
12
|
+
while (end > 0 && (buffer[end] & 0xc0) === 0x80)
|
|
13
|
+
end -= 1;
|
|
14
|
+
return { text: buffer.subarray(0, end).toString("utf8"), truncated: true };
|
|
15
|
+
}
|
|
16
|
+
export function truncateUtf8Text(text, maxBytes) {
|
|
17
|
+
return truncateUtf8Bytes(Buffer.from(text, "utf8"), maxBytes);
|
|
18
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace 数据源三层模型的数据定义。语义决策见
|
|
3
|
+
* docs/todo/workspace-datasource-binding-adr.md(ADR-1/2/4)。
|
|
4
|
+
* project settings 只存 binding(ref/scope/readPolicy),绝不存 secret。
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
export declare const SOURCE_ID_RE: RegExp;
|
|
8
|
+
export declare const SOURCE_KINDS: readonly ["mock", "mcp-resource", "local-files"];
|
|
9
|
+
export type SourceKind = (typeof SOURCE_KINDS)[number];
|
|
10
|
+
export declare const SourceDefinitionSchema: z.ZodObject<{
|
|
11
|
+
id: z.ZodString;
|
|
12
|
+
kind: z.ZodEnum<["mock", "mcp-resource", "local-files"]>;
|
|
13
|
+
label: z.ZodString;
|
|
14
|
+
description: z.ZodOptional<z.ZodString>;
|
|
15
|
+
/** 按 kind 的 adapter 配置(如 mcp-resource: { server })。 */
|
|
16
|
+
adapterConfig: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
17
|
+
/** 指向全局 CredentialStore 的 id;local-files/mock 不需要。 */
|
|
18
|
+
credentialRef: z.ZodOptional<z.ZodString>;
|
|
19
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
20
|
+
}, "strip", z.ZodTypeAny, {
|
|
21
|
+
id: string;
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
kind: "mock" | "mcp-resource" | "local-files";
|
|
24
|
+
label: string;
|
|
25
|
+
adapterConfig: Record<string, unknown>;
|
|
26
|
+
description?: string | undefined;
|
|
27
|
+
credentialRef?: string | undefined;
|
|
28
|
+
}, {
|
|
29
|
+
id: string;
|
|
30
|
+
kind: "mock" | "mcp-resource" | "local-files";
|
|
31
|
+
label: string;
|
|
32
|
+
enabled?: boolean | undefined;
|
|
33
|
+
description?: string | undefined;
|
|
34
|
+
adapterConfig?: Record<string, unknown> | undefined;
|
|
35
|
+
credentialRef?: string | undefined;
|
|
36
|
+
}>;
|
|
37
|
+
export type SourceDefinition = z.infer<typeof SourceDefinitionSchema>;
|
|
38
|
+
export declare const WorkspaceSourceBindingSchema: z.ZodObject<{
|
|
39
|
+
sourceId: z.ZodString;
|
|
40
|
+
/** 显式勾选的 scope id;空数组 = 什么都不可见(不是"全部")。 */
|
|
41
|
+
scopes: z.ZodArray<z.ZodString, "many">;
|
|
42
|
+
/** ask(默认,ReadSource 每次审批)| deny(只许 list metadata,禁读内容)。无 allow 档(ADR §1.2)。 */
|
|
43
|
+
readPolicy: z.ZodDefault<z.ZodEnum<["ask", "deny"]>>;
|
|
44
|
+
}, "strip", z.ZodTypeAny, {
|
|
45
|
+
sourceId: string;
|
|
46
|
+
scopes: string[];
|
|
47
|
+
readPolicy: "deny" | "ask";
|
|
48
|
+
}, {
|
|
49
|
+
sourceId: string;
|
|
50
|
+
scopes: string[];
|
|
51
|
+
readPolicy?: "deny" | "ask" | undefined;
|
|
52
|
+
}>;
|
|
53
|
+
export type WorkspaceSourceBinding = z.infer<typeof WorkspaceSourceBindingSchema>;
|
|
54
|
+
/** adapter 返回的 scope/resource/content 形状(运行时对象,不落盘)。 */
|
|
55
|
+
export interface SourceScope {
|
|
56
|
+
id: string;
|
|
57
|
+
label: string;
|
|
58
|
+
description?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface SourceResourceMeta {
|
|
61
|
+
id: string;
|
|
62
|
+
scopeId: string;
|
|
63
|
+
name: string;
|
|
64
|
+
sizeBytes?: number;
|
|
65
|
+
mimeType?: string;
|
|
66
|
+
}
|
|
67
|
+
export interface SourceContent {
|
|
68
|
+
resourceId: string;
|
|
69
|
+
text: string;
|
|
70
|
+
truncated: boolean;
|
|
71
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace 数据源三层模型的数据定义。语义决策见
|
|
3
|
+
* docs/todo/workspace-datasource-binding-adr.md(ADR-1/2/4)。
|
|
4
|
+
* project settings 只存 binding(ref/scope/readPolicy),绝不存 secret。
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
export const SOURCE_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/;
|
|
8
|
+
export const SOURCE_KINDS = ["mock", "mcp-resource", "local-files"];
|
|
9
|
+
export const SourceDefinitionSchema = z.object({
|
|
10
|
+
id: z.string().regex(SOURCE_ID_RE),
|
|
11
|
+
kind: z.enum(SOURCE_KINDS),
|
|
12
|
+
label: z.string().min(1),
|
|
13
|
+
description: z.string().optional(),
|
|
14
|
+
/** 按 kind 的 adapter 配置(如 mcp-resource: { server })。 */
|
|
15
|
+
adapterConfig: z.record(z.unknown()).default({}),
|
|
16
|
+
/** 指向全局 CredentialStore 的 id;local-files/mock 不需要。 */
|
|
17
|
+
credentialRef: z.string().optional(),
|
|
18
|
+
enabled: z.boolean().default(true),
|
|
19
|
+
});
|
|
20
|
+
export const WorkspaceSourceBindingSchema = z.object({
|
|
21
|
+
sourceId: z.string().regex(SOURCE_ID_RE),
|
|
22
|
+
/** 显式勾选的 scope id;空数组 = 什么都不可见(不是"全部")。 */
|
|
23
|
+
scopes: z.array(z.string()),
|
|
24
|
+
/** ask(默认,ReadSource 每次审批)| deny(只许 list metadata,禁读内容)。无 allow 档(ADR §1.2)。 */
|
|
25
|
+
readPolicy: z.enum(["ask", "deny"]).default("ask"),
|
|
26
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test helper: build a stub that satisfies the FULL `typeof globalThis.fetch`.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS
|
|
5
|
+
* ---------------
|
|
6
|
+
* Assigning a plain `async () => new Response(...)` to `globalThis.fetch` used
|
|
7
|
+
* to typecheck. Bun 1.3 added a static `fetch.preconnect(url)`, so the global's
|
|
8
|
+
* type now carries that property and every bare-function stub fails with:
|
|
9
|
+
* Property 'preconnect' is missing in type '() => Promise<Response>'
|
|
10
|
+
* but required in type 'typeof fetch'.
|
|
11
|
+
*
|
|
12
|
+
* The runtime behavior never changed — only the static surface. Rather than
|
|
13
|
+
* sprinkling `as unknown as typeof fetch` (which silences real mismatches too)
|
|
14
|
+
* at each site, attach the missing statics once, here. When a future runtime
|
|
15
|
+
* adds another property to `fetch`, this is the single place to update.
|
|
16
|
+
*
|
|
17
|
+
* Prefer narrowing the PRODUCTION type instead when the code under test only
|
|
18
|
+
* ever *calls* fetch — see `PanelAppArchiveFetch` in ../panel-apps/github-archive.ts.
|
|
19
|
+
* Use this helper only where the real global genuinely has to be replaced.
|
|
20
|
+
*/
|
|
21
|
+
export type FetchLike = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
22
|
+
/**
|
|
23
|
+
* Wrap a call-only fetch implementation so it is assignable to
|
|
24
|
+
* `globalThis.fetch`.
|
|
25
|
+
*
|
|
26
|
+
* ```ts
|
|
27
|
+
* const previous = globalThis.fetch;
|
|
28
|
+
* globalThis.fetch = asGlobalFetch(async () => new Response("ok"));
|
|
29
|
+
* try { … } finally { globalThis.fetch = previous; }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare function asGlobalFetch(impl: FetchLike): typeof globalThis.fetch;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrap a call-only fetch implementation so it is assignable to
|
|
3
|
+
* `globalThis.fetch`.
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* const previous = globalThis.fetch;
|
|
7
|
+
* globalThis.fetch = asGlobalFetch(async () => new Response("ok"));
|
|
8
|
+
* try { … } finally { globalThis.fetch = previous; }
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export function asGlobalFetch(impl) {
|
|
12
|
+
const stub = impl;
|
|
13
|
+
// `preconnect` is a no-op hint even in production; tests never assert on it.
|
|
14
|
+
if (typeof stub.preconnect !== "function") {
|
|
15
|
+
Object.defineProperty(stub, "preconnect", {
|
|
16
|
+
value: (_url) => {
|
|
17
|
+
/* no-op: connection warm-up is unobservable in tests */
|
|
18
|
+
},
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return stub;
|
|
24
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Magic-number image validation for theme-pack assets. Mirrors the desktop
|
|
3
|
+
* plugin-media detector (PNG IHDR / JPEG SOF / WebP dimensions) and adds GIF so
|
|
4
|
+
* theme sprites can be animated: a theme pack's "motion" comes from the image
|
|
5
|
+
* format itself (APNG / animated WebP / GIF), never from executable content.
|
|
6
|
+
*
|
|
7
|
+
* We validate the true format by bytes (not by extension), enforce sane bounds,
|
|
8
|
+
* and return the canonical media type + extension the installer renames to.
|
|
9
|
+
*/
|
|
10
|
+
export type ThemeImageType = "image/png" | "image/jpeg" | "image/webp" | "image/gif";
|
|
11
|
+
export interface ThemeImageInfo {
|
|
12
|
+
mediaType: ThemeImageType;
|
|
13
|
+
ext: "png" | "jpg" | "webp" | "gif";
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
}
|
|
17
|
+
/** Detect the true image type + dimensions from the first bytes, or null. */
|
|
18
|
+
export declare function detectThemeImage(bytes: Buffer): ThemeImageInfo | null;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Magic-number image validation for theme-pack assets. Mirrors the desktop
|
|
3
|
+
* plugin-media detector (PNG IHDR / JPEG SOF / WebP dimensions) and adds GIF so
|
|
4
|
+
* theme sprites can be animated: a theme pack's "motion" comes from the image
|
|
5
|
+
* format itself (APNG / animated WebP / GIF), never from executable content.
|
|
6
|
+
*
|
|
7
|
+
* We validate the true format by bytes (not by extension), enforce sane bounds,
|
|
8
|
+
* and return the canonical media type + extension the installer renames to.
|
|
9
|
+
*/
|
|
10
|
+
const MAX_DIMENSION = 8192;
|
|
11
|
+
const MAX_PIXELS = 40_000_000;
|
|
12
|
+
const EXT_BY_TYPE = {
|
|
13
|
+
"image/png": "png",
|
|
14
|
+
"image/jpeg": "jpg",
|
|
15
|
+
"image/webp": "webp",
|
|
16
|
+
"image/gif": "gif",
|
|
17
|
+
};
|
|
18
|
+
function jpegDimensions(bytes) {
|
|
19
|
+
if (bytes.length < 4 || bytes[0] !== 0xff || bytes[1] !== 0xd8)
|
|
20
|
+
return null;
|
|
21
|
+
let offset = 2;
|
|
22
|
+
while (offset + 4 <= bytes.length) {
|
|
23
|
+
while (offset < bytes.length && bytes[offset] === 0xff)
|
|
24
|
+
offset += 1;
|
|
25
|
+
if (offset >= bytes.length)
|
|
26
|
+
break;
|
|
27
|
+
const marker = bytes[offset];
|
|
28
|
+
offset += 1;
|
|
29
|
+
if (marker === 0xd8 ||
|
|
30
|
+
marker === 0xd9 ||
|
|
31
|
+
marker === 0x01 ||
|
|
32
|
+
(marker >= 0xd0 && marker <= 0xd7)) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (offset + 2 > bytes.length)
|
|
36
|
+
return null;
|
|
37
|
+
const length = bytes.readUInt16BE(offset);
|
|
38
|
+
if (length < 2 || offset + length > bytes.length)
|
|
39
|
+
return null;
|
|
40
|
+
const isStartOfFrame = marker >= 0xc0 && marker <= 0xcf && ![0xc4, 0xc8, 0xcc].includes(marker);
|
|
41
|
+
if (isStartOfFrame) {
|
|
42
|
+
if (length < 7)
|
|
43
|
+
return null;
|
|
44
|
+
return { width: bytes.readUInt16BE(offset + 5), height: bytes.readUInt16BE(offset + 3) };
|
|
45
|
+
}
|
|
46
|
+
offset += length;
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
function readUInt24LE(bytes, offset) {
|
|
51
|
+
return bytes[offset] | (bytes[offset + 1] << 8) | (bytes[offset + 2] << 16);
|
|
52
|
+
}
|
|
53
|
+
function webpDimensions(bytes) {
|
|
54
|
+
if (bytes.length < 30 ||
|
|
55
|
+
bytes.toString("ascii", 0, 4) !== "RIFF" ||
|
|
56
|
+
bytes.toString("ascii", 8, 12) !== "WEBP" ||
|
|
57
|
+
bytes.readUInt32LE(4) + 8 > bytes.length) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const chunk = bytes.toString("ascii", 12, 16);
|
|
61
|
+
if (chunk === "VP8X")
|
|
62
|
+
return { width: readUInt24LE(bytes, 24) + 1, height: readUInt24LE(bytes, 27) + 1 };
|
|
63
|
+
if (chunk === "VP8L" && bytes[20] === 0x2f) {
|
|
64
|
+
return {
|
|
65
|
+
width: 1 + (((bytes[22] & 0x3f) << 8) | bytes[21]),
|
|
66
|
+
height: 1 + (((bytes[24] & 0x0f) << 10) | (bytes[23] << 2) | (bytes[22] >> 6)),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
if (chunk === "VP8 " && bytes[23] === 0x9d && bytes[24] === 0x01 && bytes[25] === 0x2a) {
|
|
70
|
+
return { width: bytes.readUInt16LE(26) & 0x3fff, height: bytes.readUInt16LE(28) & 0x3fff };
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
/** Detect the true image type + dimensions from the first bytes, or null. */
|
|
75
|
+
export function detectThemeImage(bytes) {
|
|
76
|
+
let type = null;
|
|
77
|
+
let dims = null;
|
|
78
|
+
if (bytes.length >= 24 &&
|
|
79
|
+
bytes.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])) &&
|
|
80
|
+
bytes.readUInt32BE(8) === 13 &&
|
|
81
|
+
bytes.toString("ascii", 12, 16) === "IHDR") {
|
|
82
|
+
// PNG (and APNG, which shares the PNG signature — its acTL chunk just adds
|
|
83
|
+
// animation; we accept it as a valid PNG without needing to parse frames).
|
|
84
|
+
type = "image/png";
|
|
85
|
+
dims = { width: bytes.readUInt32BE(16), height: bytes.readUInt32BE(20) };
|
|
86
|
+
}
|
|
87
|
+
else if (bytes.length >= 10 &&
|
|
88
|
+
(bytes.toString("ascii", 0, 6) === "GIF87a" || bytes.toString("ascii", 0, 6) === "GIF89a")) {
|
|
89
|
+
// GIF (may be animated) — logical screen dimensions are LE at offset 6.
|
|
90
|
+
type = "image/gif";
|
|
91
|
+
dims = { width: bytes.readUInt16LE(6), height: bytes.readUInt16LE(8) };
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const jpeg = jpegDimensions(bytes);
|
|
95
|
+
if (jpeg) {
|
|
96
|
+
type = "image/jpeg";
|
|
97
|
+
dims = jpeg;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const webp = webpDimensions(bytes);
|
|
101
|
+
if (webp) {
|
|
102
|
+
type = "image/webp";
|
|
103
|
+
dims = webp;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (!type || !dims)
|
|
108
|
+
return null;
|
|
109
|
+
if (dims.width <= 0 ||
|
|
110
|
+
dims.height <= 0 ||
|
|
111
|
+
dims.width > MAX_DIMENSION ||
|
|
112
|
+
dims.height > MAX_DIMENSION ||
|
|
113
|
+
dims.width * dims.height > MAX_PIXELS) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
return { mediaType: type, ext: EXT_BY_TYPE[type], width: dims.width, height: dims.height };
|
|
117
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { previewLocalTheme, installReviewedLocalTheme, listInstalledThemes, uninstallTheme, type ThemePreview, type InstalledTheme, } from "./installer.js";
|
|
2
|
+
export { THEME_ASSET_DIR, ThemeInstallError, ThemeReviewChangedError, assertSafeThemeName, themeInstallDir, themesRoot, } from "./paths.js";
|
|
3
|
+
export { THEME_VAR_NAMES, THEME_ID, parseThemeManifest, type ThemeManifest } from "./manifest.js";
|
|
4
|
+
export { detectThemeImage, type ThemeImageInfo } from "./image.js";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { previewLocalTheme, installReviewedLocalTheme, listInstalledThemes, uninstallTheme, } from "./installer.js";
|
|
2
|
+
export { THEME_ASSET_DIR, ThemeInstallError, ThemeReviewChangedError, assertSafeThemeName, themeInstallDir, themesRoot, } from "./paths.js";
|
|
3
|
+
export { THEME_VAR_NAMES, THEME_ID, parseThemeManifest } from "./manifest.js";
|
|
4
|
+
export { detectThemeImage } from "./image.js";
|