@full-self-developing/fsd 1.0.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/.engine/engine-config.json +27 -0
- package/CODEBASE_CONTEXT.md +152 -0
- package/README.md +111 -0
- package/README_zh.md +111 -0
- package/UI_SPEC.md +57 -0
- package/agents/api-proxy.js +542 -0
- package/agents/base.js +280 -0
- package/agents/branch-manager.js +135 -0
- package/agents/cli-models.json +48 -0
- package/agents/coder.js +128 -0
- package/agents/core-request.js +174 -0
- package/agents/dispatcher.js +491 -0
- package/agents/drivers/.atomcode/graph.bin +0 -0
- package/agents/drivers/atomcode.js +143 -0
- package/agents/drivers/gemini-cli.js +195 -0
- package/agents/drivers/index.js +65 -0
- package/agents/drivers/openrouter.js +390 -0
- package/agents/engine-config.js +444 -0
- package/agents/log-fixer.js +72 -0
- package/agents/mcp-client-manager.js +159 -0
- package/agents/optimizer.js +54 -0
- package/agents/path-validator.js +43 -0
- package/agents/planner.js +81 -0
- package/agents/prompt-manager.js +170 -0
- package/agents/skeptic.js +79 -0
- package/agents/skills-manager.js +130 -0
- package/agents/summarizer.js +34 -0
- package/agents/test-runner.js +85 -0
- package/bin/cli.js +166 -0
- package/client/eslint.config.js +21 -0
- package/client/index.html +12 -0
- package/client/package-lock.json +3339 -0
- package/client/package.json +35 -0
- package/client/src/App.jsx +745 -0
- package/client/src/api.js +78 -0
- package/client/src/components/ChatPanel.jsx +277 -0
- package/client/src/components/ConfirmationModal.jsx +61 -0
- package/client/src/components/ErrorBoundary.jsx +66 -0
- package/client/src/components/FolderPicker.jsx +200 -0
- package/client/src/components/LoopPanel.jsx +863 -0
- package/client/src/components/NotFound.jsx +52 -0
- package/client/src/components/SettingsPanel.jsx +966 -0
- package/client/src/components/Sidebar.jsx +318 -0
- package/client/src/context/SettingsContext.jsx +353 -0
- package/client/src/i18n.js +462 -0
- package/client/src/index.css +31 -0
- package/client/src/main.jsx +17 -0
- package/client/vite.config.js +19 -0
- package/design.md +875 -0
- package/extensions/alibaba/index.ts +11 -0
- package/extensions/alibaba/openclaw.plugin.json +34 -0
- package/extensions/alibaba/package.json +15 -0
- package/extensions/alibaba/plugin-registration.contract.test.ts +7 -0
- package/extensions/alibaba/tsconfig.json +16 -0
- package/extensions/alibaba/video-generation-provider.test.ts +92 -0
- package/extensions/alibaba/video-generation-provider.ts +83 -0
- package/extensions/amazon-bedrock/api.ts +6 -0
- package/extensions/amazon-bedrock/aws-credential-refresh.ts +42 -0
- package/extensions/amazon-bedrock/config-api.ts +4 -0
- package/extensions/amazon-bedrock/config-compat.test.ts +81 -0
- package/extensions/amazon-bedrock/config-compat.ts +107 -0
- package/extensions/amazon-bedrock/discovery-shared.ts +28 -0
- package/extensions/amazon-bedrock/discovery.test.ts +608 -0
- package/extensions/amazon-bedrock/discovery.ts +616 -0
- package/extensions/amazon-bedrock/embedding-provider.test.ts +109 -0
- package/extensions/amazon-bedrock/embedding-provider.ts +470 -0
- package/extensions/amazon-bedrock/index.test.ts +1249 -0
- package/extensions/amazon-bedrock/index.ts +11 -0
- package/extensions/amazon-bedrock/lazy-import.test.ts +56 -0
- package/extensions/amazon-bedrock/memory-embedding-adapter.test.ts +105 -0
- package/extensions/amazon-bedrock/memory-embedding-adapter.ts +47 -0
- package/extensions/amazon-bedrock/npm-shrinkwrap.json +1241 -0
- package/extensions/amazon-bedrock/openclaw.plugin.json +80 -0
- package/extensions/amazon-bedrock/package.json +41 -0
- package/extensions/amazon-bedrock/provider-policy-api.test.ts +46 -0
- package/extensions/amazon-bedrock/provider-policy-api.ts +9 -0
- package/extensions/amazon-bedrock/register.sync.runtime.ts +659 -0
- package/extensions/amazon-bedrock/setup-api.ts +18 -0
- package/extensions/amazon-bedrock/thinking-policy.ts +32 -0
- package/extensions/amazon-bedrock/tsconfig.json +16 -0
- package/extensions/anthropic/api.ts +11 -0
- package/extensions/anthropic/claude-model-refs.ts +104 -0
- package/extensions/anthropic/cli-auth-seam.ts +13 -0
- package/extensions/anthropic/cli-backend-api.ts +6 -0
- package/extensions/anthropic/cli-backend.ts +83 -0
- package/extensions/anthropic/cli-catalog.ts +42 -0
- package/extensions/anthropic/cli-constants.ts +41 -0
- package/extensions/anthropic/cli-migration.test.ts +487 -0
- package/extensions/anthropic/cli-migration.ts +266 -0
- package/extensions/anthropic/cli-shared.test.ts +300 -0
- package/extensions/anthropic/cli-shared.ts +248 -0
- package/extensions/anthropic/config-defaults.ts +428 -0
- package/extensions/anthropic/contract-api.ts +9 -0
- package/extensions/anthropic/doctor-contract-api.ts +14 -0
- package/extensions/anthropic/index.test.ts +663 -0
- package/extensions/anthropic/index.ts +11 -0
- package/extensions/anthropic/media-understanding-provider.ts +15 -0
- package/extensions/anthropic/openclaw.plugin.json +112 -0
- package/extensions/anthropic/package.json +18 -0
- package/extensions/anthropic/provider-contract-api.ts +59 -0
- package/extensions/anthropic/provider-discovery.ts +35 -0
- package/extensions/anthropic/provider-policy-api.test.ts +135 -0
- package/extensions/anthropic/provider-policy-api.ts +24 -0
- package/extensions/anthropic/provider-runtime.contract.test.ts +3 -0
- package/extensions/anthropic/register.runtime.ts +668 -0
- package/extensions/anthropic/replay-policy.ts +9 -0
- package/extensions/anthropic/setup-api.ts +11 -0
- package/extensions/anthropic/stream-wrappers.test.ts +233 -0
- package/extensions/anthropic/stream-wrappers.ts +228 -0
- package/extensions/anthropic/test-api.ts +3 -0
- package/extensions/anthropic/tsconfig.json +16 -0
- package/extensions/arcee/api.ts +8 -0
- package/extensions/arcee/index.test.ts +195 -0
- package/extensions/arcee/index.ts +142 -0
- package/extensions/arcee/models.ts +68 -0
- package/extensions/arcee/onboard.ts +43 -0
- package/extensions/arcee/openclaw.plugin.json +46 -0
- package/extensions/arcee/package.json +15 -0
- package/extensions/arcee/provider-catalog.ts +54 -0
- package/extensions/arcee/tsconfig.json +16 -0
- package/extensions/azure-speech/azure-speech.live.test.ts +92 -0
- package/extensions/azure-speech/index.ts +11 -0
- package/extensions/azure-speech/openclaw.plugin.json +66 -0
- package/extensions/azure-speech/package.json +15 -0
- package/extensions/azure-speech/speech-provider.test.ts +242 -0
- package/extensions/azure-speech/speech-provider.ts +306 -0
- package/extensions/azure-speech/tsconfig.json +16 -0
- package/extensions/azure-speech/tts.test.ts +127 -0
- package/extensions/azure-speech/tts.ts +209 -0
- package/extensions/byteplus/api.ts +8 -0
- package/extensions/byteplus/index.test.ts +60 -0
- package/extensions/byteplus/index.ts +84 -0
- package/extensions/byteplus/live.test.ts +60 -0
- package/extensions/byteplus/models.ts +35 -0
- package/extensions/byteplus/openclaw.plugin.json +165 -0
- package/extensions/byteplus/package.json +15 -0
- package/extensions/byteplus/plugin-registration.contract.test.ts +8 -0
- package/extensions/byteplus/provider-catalog.ts +17 -0
- package/extensions/byteplus/provider-discovery.ts +31 -0
- package/extensions/byteplus/tsconfig.json +16 -0
- package/extensions/byteplus/video-generation-provider.test.ts +223 -0
- package/extensions/byteplus/video-generation-provider.ts +389 -0
- package/extensions/cerebras/api.ts +7 -0
- package/extensions/cerebras/index.ts +41 -0
- package/extensions/cerebras/models.ts +25 -0
- package/extensions/cerebras/onboard.ts +26 -0
- package/extensions/cerebras/openclaw.plugin.json +111 -0
- package/extensions/cerebras/package.json +15 -0
- package/extensions/cerebras/provider-catalog.ts +10 -0
- package/extensions/cerebras/tsconfig.json +16 -0
- package/extensions/chutes/api.ts +14 -0
- package/extensions/chutes/implicit-provider.test.ts +107 -0
- package/extensions/chutes/index.ts +194 -0
- package/extensions/chutes/model-discovery-env.ts +5 -0
- package/extensions/chutes/models.test.ts +289 -0
- package/extensions/chutes/models.ts +632 -0
- package/extensions/chutes/oauth.ts +235 -0
- package/extensions/chutes/onboard.ts +63 -0
- package/extensions/chutes/openclaw.plugin.json +726 -0
- package/extensions/chutes/package.json +15 -0
- package/extensions/chutes/provider-catalog.ts +29 -0
- package/extensions/chutes/tsconfig.json +16 -0
- package/extensions/cloudflare-ai-gateway/api.ts +14 -0
- package/extensions/cloudflare-ai-gateway/catalog-provider.ts +73 -0
- package/extensions/cloudflare-ai-gateway/index.test.ts +60 -0
- package/extensions/cloudflare-ai-gateway/index.ts +233 -0
- package/extensions/cloudflare-ai-gateway/models.ts +44 -0
- package/extensions/cloudflare-ai-gateway/onboard.ts +91 -0
- package/extensions/cloudflare-ai-gateway/openclaw.plugin.json +44 -0
- package/extensions/cloudflare-ai-gateway/package.json +15 -0
- package/extensions/cloudflare-ai-gateway/provider-discovery.contract.test.ts +3 -0
- package/extensions/cloudflare-ai-gateway/stream-wrappers.test.ts +160 -0
- package/extensions/cloudflare-ai-gateway/stream-wrappers.ts +32 -0
- package/extensions/cloudflare-ai-gateway/tsconfig.json +16 -0
- package/extensions/codex/doctor-contract-api.test.ts +44 -0
- package/extensions/codex/doctor-contract-api.ts +68 -0
- package/extensions/codex/harness.ts +85 -0
- package/extensions/codex/index.test.ts +230 -0
- package/extensions/codex/index.ts +125 -0
- package/extensions/codex/media-understanding-provider.test.ts +496 -0
- package/extensions/codex/media-understanding-provider.ts +524 -0
- package/extensions/codex/npm-shrinkwrap.json +1949 -0
- package/extensions/codex/openclaw.plugin.json +403 -0
- package/extensions/codex/package.json +41 -0
- package/extensions/codex/prompt-overlay-runtime-contract.test.ts +48 -0
- package/extensions/codex/prompt-overlay.ts +21 -0
- package/extensions/codex/provider-catalog.ts +83 -0
- package/extensions/codex/provider-discovery.ts +45 -0
- package/extensions/codex/provider.test.ts +384 -0
- package/extensions/codex/provider.ts +243 -0
- package/extensions/codex/src/app-server/app-inventory-cache.test.ts +176 -0
- package/extensions/codex/src/app-server/app-inventory-cache.ts +324 -0
- package/extensions/codex/src/app-server/approval-bridge.test.ts +1472 -0
- package/extensions/codex/src/app-server/approval-bridge.ts +1211 -0
- package/extensions/codex/src/app-server/auth-bridge.test.ts +1449 -0
- package/extensions/codex/src/app-server/auth-bridge.ts +614 -0
- package/extensions/codex/src/app-server/auth-profile-runtime-contract.test.ts +242 -0
- package/extensions/codex/src/app-server/capabilities.ts +27 -0
- package/extensions/codex/src/app-server/client-factory.ts +24 -0
- package/extensions/codex/src/app-server/client.test.ts +563 -0
- package/extensions/codex/src/app-server/client.ts +721 -0
- package/extensions/codex/src/app-server/compact.test.ts +1029 -0
- package/extensions/codex/src/app-server/compact.ts +662 -0
- package/extensions/codex/src/app-server/computer-use.test.ts +788 -0
- package/extensions/codex/src/app-server/computer-use.ts +683 -0
- package/extensions/codex/src/app-server/config.test.ts +948 -0
- package/extensions/codex/src/app-server/config.ts +1093 -0
- package/extensions/codex/src/app-server/context-engine-projection.test.ts +252 -0
- package/extensions/codex/src/app-server/context-engine-projection.ts +403 -0
- package/extensions/codex/src/app-server/delivery-no-reply-runtime-contract.test.ts +80 -0
- package/extensions/codex/src/app-server/dynamic-tool-diagnostics.ts +73 -0
- package/extensions/codex/src/app-server/dynamic-tool-profile.ts +70 -0
- package/extensions/codex/src/app-server/dynamic-tools.test.ts +1357 -0
- package/extensions/codex/src/app-server/dynamic-tools.ts +646 -0
- package/extensions/codex/src/app-server/elicitation-bridge.test.ts +1281 -0
- package/extensions/codex/src/app-server/elicitation-bridge.ts +828 -0
- package/extensions/codex/src/app-server/event-projector.test.ts +2885 -0
- package/extensions/codex/src/app-server/event-projector.ts +2047 -0
- package/extensions/codex/src/app-server/image-payload-sanitizer.test.ts +49 -0
- package/extensions/codex/src/app-server/image-payload-sanitizer.ts +195 -0
- package/extensions/codex/src/app-server/local-runtime-attribution.ts +39 -0
- package/extensions/codex/src/app-server/managed-binary.test.ts +141 -0
- package/extensions/codex/src/app-server/managed-binary.ts +193 -0
- package/extensions/codex/src/app-server/models.test.ts +246 -0
- package/extensions/codex/src/app-server/models.ts +172 -0
- package/extensions/codex/src/app-server/native-hook-relay.test.ts +274 -0
- package/extensions/codex/src/app-server/native-hook-relay.ts +150 -0
- package/extensions/codex/src/app-server/native-subagent-monitor.test.ts +1125 -0
- package/extensions/codex/src/app-server/native-subagent-monitor.ts +1061 -0
- package/extensions/codex/src/app-server/native-subagent-notification.test.ts +176 -0
- package/extensions/codex/src/app-server/native-subagent-notification.ts +222 -0
- package/extensions/codex/src/app-server/native-subagent-task-ids.ts +3 -0
- package/extensions/codex/src/app-server/native-subagent-task-mirror.test.ts +625 -0
- package/extensions/codex/src/app-server/native-subagent-task-mirror.ts +460 -0
- package/extensions/codex/src/app-server/notification-correlation.ts +91 -0
- package/extensions/codex/src/app-server/openclaw-owned-tool-runtime-contract.test.ts +456 -0
- package/extensions/codex/src/app-server/outcome-fallback-runtime-contract.test.ts +404 -0
- package/extensions/codex/src/app-server/plugin-activation.test.ts +336 -0
- package/extensions/codex/src/app-server/plugin-activation.ts +283 -0
- package/extensions/codex/src/app-server/plugin-app-cache-key.ts +74 -0
- package/extensions/codex/src/app-server/plugin-approval-roundtrip.ts +122 -0
- package/extensions/codex/src/app-server/plugin-inventory.test.ts +355 -0
- package/extensions/codex/src/app-server/plugin-inventory.ts +357 -0
- package/extensions/codex/src/app-server/plugin-thread-config.test.ts +865 -0
- package/extensions/codex/src/app-server/plugin-thread-config.ts +455 -0
- package/extensions/codex/src/app-server/protocol-generated/json/DynamicToolCallParams.json +33 -0
- package/extensions/codex/src/app-server/protocol-generated/json/v2/ErrorNotification.json +199 -0
- package/extensions/codex/src/app-server/protocol-generated/json/v2/GetAccountResponse.json +102 -0
- package/extensions/codex/src/app-server/protocol-generated/json/v2/ModelListResponse.json +227 -0
- package/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json +2630 -0
- package/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json +2630 -0
- package/extensions/codex/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json +1659 -0
- package/extensions/codex/src/app-server/protocol-generated/json/v2/TurnStartResponse.json +1655 -0
- package/extensions/codex/src/app-server/protocol-validators.test.ts +75 -0
- package/extensions/codex/src/app-server/protocol-validators.ts +203 -0
- package/extensions/codex/src/app-server/protocol.ts +537 -0
- package/extensions/codex/src/app-server/rate-limit-cache.ts +48 -0
- package/extensions/codex/src/app-server/rate-limits.test.ts +202 -0
- package/extensions/codex/src/app-server/rate-limits.ts +583 -0
- package/extensions/codex/src/app-server/request.test.ts +68 -0
- package/extensions/codex/src/app-server/request.ts +90 -0
- package/extensions/codex/src/app-server/run-attempt-thread-cleanup.test.ts +197 -0
- package/extensions/codex/src/app-server/run-attempt.context-engine.test.ts +1246 -0
- package/extensions/codex/src/app-server/run-attempt.test.ts +10799 -0
- package/extensions/codex/src/app-server/run-attempt.ts +5264 -0
- package/extensions/codex/src/app-server/run-attempt.vision-tools.test.ts +35 -0
- package/extensions/codex/src/app-server/sandbox-exec-server/filesystem.ts +261 -0
- package/extensions/codex/src/app-server/sandbox-exec-server/fs-policy.ts +346 -0
- package/extensions/codex/src/app-server/sandbox-exec-server/http.ts +312 -0
- package/extensions/codex/src/app-server/sandbox-exec-server/json-rpc.ts +93 -0
- package/extensions/codex/src/app-server/sandbox-exec-server/processes.ts +411 -0
- package/extensions/codex/src/app-server/sandbox-exec-server/runtime.ts +22 -0
- package/extensions/codex/src/app-server/sandbox-exec-server/types.ts +80 -0
- package/extensions/codex/src/app-server/sandbox-exec-server.fs.test.ts +527 -0
- package/extensions/codex/src/app-server/sandbox-exec-server.http.test.ts +210 -0
- package/extensions/codex/src/app-server/sandbox-exec-server.test-helpers.ts +236 -0
- package/extensions/codex/src/app-server/sandbox-exec-server.test.ts +460 -0
- package/extensions/codex/src/app-server/sandbox-exec-server.ts +355 -0
- package/extensions/codex/src/app-server/sandbox-guard.ts +153 -0
- package/extensions/codex/src/app-server/schema-normalization-runtime-contract.test.ts +206 -0
- package/extensions/codex/src/app-server/session-binding.test.ts +303 -0
- package/extensions/codex/src/app-server/session-binding.ts +407 -0
- package/extensions/codex/src/app-server/session-history.ts +44 -0
- package/extensions/codex/src/app-server/shared-client.test.ts +591 -0
- package/extensions/codex/src/app-server/shared-client.ts +289 -0
- package/extensions/codex/src/app-server/side-question.test.ts +1243 -0
- package/extensions/codex/src/app-server/side-question.ts +1019 -0
- package/extensions/codex/src/app-server/test-support.ts +48 -0
- package/extensions/codex/src/app-server/thread-lifecycle.test.ts +447 -0
- package/extensions/codex/src/app-server/thread-lifecycle.ts +1004 -0
- package/extensions/codex/src/app-server/thread-lifecycle.user-mcp-servers.test.ts +442 -0
- package/extensions/codex/src/app-server/timeout.ts +9 -0
- package/extensions/codex/src/app-server/tool-progress-normalization.ts +77 -0
- package/extensions/codex/src/app-server/trajectory.test.ts +205 -0
- package/extensions/codex/src/app-server/trajectory.ts +368 -0
- package/extensions/codex/src/app-server/transcript-mirror.test.ts +527 -0
- package/extensions/codex/src/app-server/transcript-mirror.ts +208 -0
- package/extensions/codex/src/app-server/transcript-repair-runtime-contract.test.ts +44 -0
- package/extensions/codex/src/app-server/transport-stdio.test.ts +184 -0
- package/extensions/codex/src/app-server/transport-stdio.ts +107 -0
- package/extensions/codex/src/app-server/transport-websocket.test.ts +71 -0
- package/extensions/codex/src/app-server/transport-websocket.ts +90 -0
- package/extensions/codex/src/app-server/transport.ts +117 -0
- package/extensions/codex/src/app-server/user-input-bridge.test.ts +249 -0
- package/extensions/codex/src/app-server/user-input-bridge.ts +316 -0
- package/extensions/codex/src/app-server/version.ts +5 -0
- package/extensions/codex/src/app-server/vision-tools.ts +12 -0
- package/extensions/codex/src/command-account.ts +589 -0
- package/extensions/codex/src/command-formatters.ts +426 -0
- package/extensions/codex/src/command-handlers.ts +2092 -0
- package/extensions/codex/src/command-plugins-management.test.ts +172 -0
- package/extensions/codex/src/command-plugins-management.ts +137 -0
- package/extensions/codex/src/command-rpc.test.ts +16 -0
- package/extensions/codex/src/command-rpc.ts +146 -0
- package/extensions/codex/src/commands.test.ts +3737 -0
- package/extensions/codex/src/commands.ts +65 -0
- package/extensions/codex/src/conversation-binding-data.ts +124 -0
- package/extensions/codex/src/conversation-binding.test.ts +697 -0
- package/extensions/codex/src/conversation-binding.ts +575 -0
- package/extensions/codex/src/conversation-control.test.ts +126 -0
- package/extensions/codex/src/conversation-control.ts +303 -0
- package/extensions/codex/src/conversation-turn-collector.test.ts +191 -0
- package/extensions/codex/src/conversation-turn-collector.ts +190 -0
- package/extensions/codex/src/conversation-turn-input.test.ts +141 -0
- package/extensions/codex/src/conversation-turn-input.ts +106 -0
- package/extensions/codex/src/manifest.test.ts +20 -0
- package/extensions/codex/src/migration/apply.ts +501 -0
- package/extensions/codex/src/migration/helpers.ts +55 -0
- package/extensions/codex/src/migration/plan.ts +461 -0
- package/extensions/codex/src/migration/provider.test.ts +1741 -0
- package/extensions/codex/src/migration/provider.ts +41 -0
- package/extensions/codex/src/migration/source.ts +643 -0
- package/extensions/codex/src/migration/targets.ts +25 -0
- package/extensions/codex/src/node-cli-sessions.test.ts +180 -0
- package/extensions/codex/src/node-cli-sessions.ts +711 -0
- package/extensions/codex/test-api.ts +95 -0
- package/extensions/codex/tsconfig.json +16 -0
- package/extensions/comfy/comfy.live.test.ts +128 -0
- package/extensions/comfy/image-generation-provider.test.ts +457 -0
- package/extensions/comfy/image-generation-provider.ts +79 -0
- package/extensions/comfy/index.test.ts +51 -0
- package/extensions/comfy/index.ts +45 -0
- package/extensions/comfy/music-generation-provider.test.ts +101 -0
- package/extensions/comfy/music-generation-provider.ts +88 -0
- package/extensions/comfy/openclaw.plugin.json +268 -0
- package/extensions/comfy/package.json +15 -0
- package/extensions/comfy/plugin-registration.contract.test.ts +11 -0
- package/extensions/comfy/test-helpers.ts +113 -0
- package/extensions/comfy/tsconfig.json +16 -0
- package/extensions/comfy/video-generation-provider.test.ts +184 -0
- package/extensions/comfy/video-generation-provider.ts +104 -0
- package/extensions/comfy/workflow-runtime.ts +827 -0
- package/extensions/deepgram/audio.live.test.ts +75 -0
- package/extensions/deepgram/audio.test.ts +146 -0
- package/extensions/deepgram/audio.ts +109 -0
- package/extensions/deepgram/index.ts +13 -0
- package/extensions/deepgram/media-understanding-provider.ts +10 -0
- package/extensions/deepgram/openclaw.plugin.json +30 -0
- package/extensions/deepgram/package.json +15 -0
- package/extensions/deepgram/realtime-transcription-provider.test.ts +69 -0
- package/extensions/deepgram/realtime-transcription-provider.ts +283 -0
- package/extensions/deepgram/test-api.ts +2 -0
- package/extensions/deepgram/tsconfig.json +16 -0
- package/extensions/deepinfra/api.ts +8 -0
- package/extensions/deepinfra/embedding-provider.ts +33 -0
- package/extensions/deepinfra/image-generation-provider.test.ts +224 -0
- package/extensions/deepinfra/image-generation-provider.ts +89 -0
- package/extensions/deepinfra/index.test.ts +113 -0
- package/extensions/deepinfra/index.ts +84 -0
- package/extensions/deepinfra/media-models.ts +50 -0
- package/extensions/deepinfra/media-understanding-provider.test.ts +73 -0
- package/extensions/deepinfra/media-understanding-provider.ts +37 -0
- package/extensions/deepinfra/memory-embedding-adapter.test.ts +31 -0
- package/extensions/deepinfra/memory-embedding-adapter.ts +35 -0
- package/extensions/deepinfra/onboard.test.ts +172 -0
- package/extensions/deepinfra/onboard.ts +36 -0
- package/extensions/deepinfra/openclaw.plugin.json +203 -0
- package/extensions/deepinfra/package.json +15 -0
- package/extensions/deepinfra/provider-catalog.ts +24 -0
- package/extensions/deepinfra/provider-models.test.ts +217 -0
- package/extensions/deepinfra/provider-models.ts +167 -0
- package/extensions/deepinfra/provider-policy-api.test.ts +41 -0
- package/extensions/deepinfra/provider-policy-api.ts +21 -0
- package/extensions/deepinfra/provider.contract.test.ts +3 -0
- package/extensions/deepinfra/speech-provider.test.ts +169 -0
- package/extensions/deepinfra/speech-provider.ts +41 -0
- package/extensions/deepinfra/tsconfig.json +16 -0
- package/extensions/deepinfra/video-generation-provider.test.ts +194 -0
- package/extensions/deepinfra/video-generation-provider.ts +262 -0
- package/extensions/deepseek/api.ts +7 -0
- package/extensions/deepseek/deepseek.live.test.ts +232 -0
- package/extensions/deepseek/index.test.ts +488 -0
- package/extensions/deepseek/index.ts +58 -0
- package/extensions/deepseek/models.ts +33 -0
- package/extensions/deepseek/onboard.ts +31 -0
- package/extensions/deepseek/openclaw.plugin.json +132 -0
- package/extensions/deepseek/package.json +15 -0
- package/extensions/deepseek/provider-catalog.ts +14 -0
- package/extensions/deepseek/provider-discovery.ts +17 -0
- package/extensions/deepseek/provider-policy-api.test.ts +264 -0
- package/extensions/deepseek/provider-policy-api.ts +104 -0
- package/extensions/deepseek/stream.ts +14 -0
- package/extensions/deepseek/thinking.ts +19 -0
- package/extensions/deepseek/tsconfig.json +16 -0
- package/extensions/elevenlabs/config-api.ts +8 -0
- package/extensions/elevenlabs/config-compat.test.ts +75 -0
- package/extensions/elevenlabs/config-compat.ts +181 -0
- package/extensions/elevenlabs/contract-api.ts +8 -0
- package/extensions/elevenlabs/doctor-contract.ts +34 -0
- package/extensions/elevenlabs/elevenlabs.live.test.ts +91 -0
- package/extensions/elevenlabs/index.ts +15 -0
- package/extensions/elevenlabs/media-understanding-provider.test.ts +95 -0
- package/extensions/elevenlabs/media-understanding-provider.ts +85 -0
- package/extensions/elevenlabs/openclaw.plugin.json +40 -0
- package/extensions/elevenlabs/package.json +15 -0
- package/extensions/elevenlabs/realtime-transcription-provider.test.ts +60 -0
- package/extensions/elevenlabs/realtime-transcription-provider.ts +284 -0
- package/extensions/elevenlabs/setup-api.ts +11 -0
- package/extensions/elevenlabs/shared.ts +10 -0
- package/extensions/elevenlabs/speech-provider.test.ts +124 -0
- package/extensions/elevenlabs/speech-provider.ts +594 -0
- package/extensions/elevenlabs/test-api.ts +6 -0
- package/extensions/elevenlabs/tsconfig.json +16 -0
- package/extensions/elevenlabs/tts.test.ts +212 -0
- package/extensions/elevenlabs/tts.ts +198 -0
- package/extensions/fal/image-generation-provider.test.ts +710 -0
- package/extensions/fal/image-generation-provider.ts +463 -0
- package/extensions/fal/index.ts +19 -0
- package/extensions/fal/music-generation-provider.test.ts +200 -0
- package/extensions/fal/music-generation-provider.ts +219 -0
- package/extensions/fal/onboard.ts +21 -0
- package/extensions/fal/openclaw.plugin.json +42 -0
- package/extensions/fal/package.json +15 -0
- package/extensions/fal/plugin-registration.contract.test.ts +11 -0
- package/extensions/fal/provider-contract-api.ts +31 -0
- package/extensions/fal/provider-registration.ts +38 -0
- package/extensions/fal/test-api.ts +3 -0
- package/extensions/fal/tsconfig.json +16 -0
- package/extensions/fal/video-generation-provider.test.ts +566 -0
- package/extensions/fal/video-generation-provider.ts +648 -0
- package/extensions/fireworks/index.test.ts +181 -0
- package/extensions/fireworks/index.ts +85 -0
- package/extensions/fireworks/model-id.ts +5 -0
- package/extensions/fireworks/onboard.ts +30 -0
- package/extensions/fireworks/openclaw.plugin.json +73 -0
- package/extensions/fireworks/package.json +18 -0
- package/extensions/fireworks/provider-catalog.ts +50 -0
- package/extensions/fireworks/provider-policy-api.ts +8 -0
- package/extensions/fireworks/stream.test.ts +184 -0
- package/extensions/fireworks/stream.ts +39 -0
- package/extensions/fireworks/thinking-policy.ts +17 -0
- package/extensions/fireworks/tsconfig.json +16 -0
- package/extensions/github-copilot/api.ts +1 -0
- package/extensions/github-copilot/auth.test.ts +109 -0
- package/extensions/github-copilot/auth.ts +65 -0
- package/extensions/github-copilot/connection-bound-ids.live.test.ts +231 -0
- package/extensions/github-copilot/connection-bound-ids.test.ts +96 -0
- package/extensions/github-copilot/connection-bound-ids.ts +81 -0
- package/extensions/github-copilot/embeddings.test.ts +287 -0
- package/extensions/github-copilot/embeddings.ts +342 -0
- package/extensions/github-copilot/index.test.ts +660 -0
- package/extensions/github-copilot/index.ts +492 -0
- package/extensions/github-copilot/login.ts +323 -0
- package/extensions/github-copilot/model-metadata.ts +51 -0
- package/extensions/github-copilot/models-defaults.ts +61 -0
- package/extensions/github-copilot/models.test.ts +695 -0
- package/extensions/github-copilot/models.ts +274 -0
- package/extensions/github-copilot/openclaw.plugin.json +270 -0
- package/extensions/github-copilot/package.json +19 -0
- package/extensions/github-copilot/provider-auth.contract.test.ts +3 -0
- package/extensions/github-copilot/provider-discovery.contract.test.ts +7 -0
- package/extensions/github-copilot/provider-runtime.contract.test.ts +3 -0
- package/extensions/github-copilot/register.runtime.ts +24 -0
- package/extensions/github-copilot/replay-policy.ts +9 -0
- package/extensions/github-copilot/stream.test.ts +282 -0
- package/extensions/github-copilot/stream.ts +157 -0
- package/extensions/github-copilot/token.ts +6 -0
- package/extensions/github-copilot/tsconfig.json +16 -0
- package/extensions/github-copilot/usage.ts +68 -0
- package/extensions/google/api.test.ts +249 -0
- package/extensions/google/api.ts +91 -0
- package/extensions/google/cli-backend.ts +58 -0
- package/extensions/google/default-model.test.ts +115 -0
- package/extensions/google/doctor-contract-api.ts +18 -0
- package/extensions/google/embedding-batch.ts +379 -0
- package/extensions/google/embedding-provider.test.ts +264 -0
- package/extensions/google/embedding-provider.ts +441 -0
- package/extensions/google/gemini-auth.ts +20 -0
- package/extensions/google/gemini-cli-provider.ts +145 -0
- package/extensions/google/generation-provider-metadata.ts +121 -0
- package/extensions/google/google-genai-runtime.ts +8 -0
- package/extensions/google/google-shared.test-helpers.ts +99 -0
- package/extensions/google/google-shared.test.ts +380 -0
- package/extensions/google/google.live.test.ts +179 -0
- package/extensions/google/image-generation-provider.test.ts +503 -0
- package/extensions/google/image-generation-provider.ts +272 -0
- package/extensions/google/index.test.ts +310 -0
- package/extensions/google/index.ts +354 -0
- package/extensions/google/manifest.test.ts +104 -0
- package/extensions/google/media-understanding-provider.ts +164 -0
- package/extensions/google/media-understanding-provider.video.test.ts +158 -0
- package/extensions/google/memory-embedding-adapter.ts +79 -0
- package/extensions/google/model-id.test.ts +42 -0
- package/extensions/google/model-id.ts +35 -0
- package/extensions/google/music-generation-provider.test.ts +278 -0
- package/extensions/google/music-generation-provider.ts +176 -0
- package/extensions/google/oauth-token-shared.test.ts +39 -0
- package/extensions/google/oauth-token-shared.ts +42 -0
- package/extensions/google/oauth.credentials.ts +273 -0
- package/extensions/google/oauth.flow.ts +61 -0
- package/extensions/google/oauth.http.ts +24 -0
- package/extensions/google/oauth.project.ts +232 -0
- package/extensions/google/oauth.runtime.ts +1 -0
- package/extensions/google/oauth.settings.ts +72 -0
- package/extensions/google/oauth.shared.ts +44 -0
- package/extensions/google/oauth.test.ts +922 -0
- package/extensions/google/oauth.token.ts +138 -0
- package/extensions/google/oauth.ts +104 -0
- package/extensions/google/onboard.ts +78 -0
- package/extensions/google/openclaw.plugin.json +706 -0
- package/extensions/google/package.json +19 -0
- package/extensions/google/plugin-registration.contract.test.ts +12 -0
- package/extensions/google/provider-contract-api.ts +77 -0
- package/extensions/google/provider-hooks.ts +18 -0
- package/extensions/google/provider-models.test.ts +513 -0
- package/extensions/google/provider-models.ts +237 -0
- package/extensions/google/provider-policy-api.test.ts +201 -0
- package/extensions/google/provider-policy-api.ts +11 -0
- package/extensions/google/provider-policy.ts +208 -0
- package/extensions/google/provider-registration.ts +72 -0
- package/extensions/google/provider-runtime.contract.test.ts +3 -0
- package/extensions/google/realtime-voice-provider.test.ts +857 -0
- package/extensions/google/realtime-voice-provider.ts +952 -0
- package/extensions/google/runtime-api.ts +19 -0
- package/extensions/google/setup-api.test.ts +23 -0
- package/extensions/google/setup-api.ts +13 -0
- package/extensions/google/speech-provider.test.ts +682 -0
- package/extensions/google/speech-provider.ts +683 -0
- package/extensions/google/src/gemini-web-search-provider.runtime.ts +367 -0
- package/extensions/google/src/gemini-web-search-provider.shared.ts +45 -0
- package/extensions/google/src/gemini-web-search-provider.ts +151 -0
- package/extensions/google/test-api.ts +6 -0
- package/extensions/google/thinking-api.ts +14 -0
- package/extensions/google/thinking.test.ts +153 -0
- package/extensions/google/thinking.ts +14 -0
- package/extensions/google/transport-stream.test.ts +1726 -0
- package/extensions/google/transport-stream.ts +1396 -0
- package/extensions/google/tsconfig.json +16 -0
- package/extensions/google/vertex-adc.ts +188 -0
- package/extensions/google/video-generation-provider.test.ts +573 -0
- package/extensions/google/video-generation-provider.ts +591 -0
- package/extensions/google/web-search-contract-api.ts +1 -0
- package/extensions/google/web-search-provider.test.ts +548 -0
- package/extensions/google/web-search-provider.ts +1 -0
- package/extensions/groq/api.ts +60 -0
- package/extensions/groq/index.test.ts +90 -0
- package/extensions/groq/index.ts +21 -0
- package/extensions/groq/media-understanding-provider.ts +21 -0
- package/extensions/groq/openclaw.plugin.json +314 -0
- package/extensions/groq/package.json +15 -0
- package/extensions/groq/test-api.ts +1 -0
- package/extensions/groq/tsconfig.json +16 -0
- package/extensions/huggingface/api.ts +10 -0
- package/extensions/huggingface/index.test.ts +81 -0
- package/extensions/huggingface/index.ts +60 -0
- package/extensions/huggingface/model-discovery-env.ts +5 -0
- package/extensions/huggingface/models.test.ts +98 -0
- package/extensions/huggingface/models.ts +218 -0
- package/extensions/huggingface/onboard.ts +26 -0
- package/extensions/huggingface/openclaw.plugin.json +57 -0
- package/extensions/huggingface/package.json +15 -0
- package/extensions/huggingface/provider-catalog.ts +22 -0
- package/extensions/huggingface/tsconfig.json +16 -0
- package/extensions/image-generation-core/api.ts +30 -0
- package/extensions/image-generation-core/package.json +10 -0
- package/extensions/image-generation-core/runtime-api.ts +6 -0
- package/extensions/image-generation-core/src/runtime.test.ts +29 -0
- package/extensions/image-generation-core/src/runtime.ts +6 -0
- package/extensions/image-generation-core/tsconfig.json +16 -0
- package/extensions/kimi-coding/api.ts +8 -0
- package/extensions/kimi-coding/implicit-provider.test.ts +116 -0
- package/extensions/kimi-coding/index.test.ts +45 -0
- package/extensions/kimi-coding/index.ts +113 -0
- package/extensions/kimi-coding/onboard.test.ts +44 -0
- package/extensions/kimi-coding/onboard.ts +42 -0
- package/extensions/kimi-coding/openclaw.plugin.json +64 -0
- package/extensions/kimi-coding/package.json +18 -0
- package/extensions/kimi-coding/provider-catalog.test.ts +23 -0
- package/extensions/kimi-coding/provider-catalog.ts +58 -0
- package/extensions/kimi-coding/replay-policy.test.ts +10 -0
- package/extensions/kimi-coding/replay-policy.ts +3 -0
- package/extensions/kimi-coding/stream.test.ts +603 -0
- package/extensions/kimi-coding/stream.ts +399 -0
- package/extensions/kimi-coding/tsconfig.json +16 -0
- package/extensions/litellm/api.ts +8 -0
- package/extensions/litellm/image-generation-provider.test.ts +348 -0
- package/extensions/litellm/image-generation-provider.ts +142 -0
- package/extensions/litellm/index.test.ts +107 -0
- package/extensions/litellm/index.ts +108 -0
- package/extensions/litellm/onboard.test.ts +21 -0
- package/extensions/litellm/onboard.ts +55 -0
- package/extensions/litellm/openclaw.plugin.json +35 -0
- package/extensions/litellm/package.json +15 -0
- package/extensions/litellm/provider-catalog.ts +10 -0
- package/extensions/litellm/tsconfig.json +16 -0
- package/extensions/lmstudio/README.md +3 -0
- package/extensions/lmstudio/api.ts +36 -0
- package/extensions/lmstudio/index.test.ts +207 -0
- package/extensions/lmstudio/index.ts +137 -0
- package/extensions/lmstudio/memory-embedding-adapter.ts +36 -0
- package/extensions/lmstudio/openclaw.plugin.json +53 -0
- package/extensions/lmstudio/package.json +15 -0
- package/extensions/lmstudio/plugin-registration.contract.test.ts +6 -0
- package/extensions/lmstudio/runtime-api.ts +35 -0
- package/extensions/lmstudio/src/api.ts +42 -0
- package/extensions/lmstudio/src/defaults.ts +14 -0
- package/extensions/lmstudio/src/embedding-provider.ts +147 -0
- package/extensions/lmstudio/src/models.fetch.ts +277 -0
- package/extensions/lmstudio/src/models.test.ts +491 -0
- package/extensions/lmstudio/src/models.ts +536 -0
- package/extensions/lmstudio/src/plain-text-tool-calls.ts +24 -0
- package/extensions/lmstudio/src/provider-auth.ts +59 -0
- package/extensions/lmstudio/src/runtime.test.ts +357 -0
- package/extensions/lmstudio/src/runtime.ts +276 -0
- package/extensions/lmstudio/src/setup.test.ts +1543 -0
- package/extensions/lmstudio/src/setup.ts +878 -0
- package/extensions/lmstudio/src/stream.test.ts +658 -0
- package/extensions/lmstudio/src/stream.ts +493 -0
- package/extensions/media-understanding-core/image-ops.ts +137 -0
- package/extensions/media-understanding-core/package.json +14 -0
- package/extensions/media-understanding-core/runtime-api.ts +9 -0
- package/extensions/media-understanding-core/src/runtime.ts +9 -0
- package/extensions/media-understanding-core/tsconfig.json +16 -0
- package/extensions/microsoft/index.ts +11 -0
- package/extensions/microsoft/microsoft.live.test.ts +14 -0
- package/extensions/microsoft/openclaw.plugin.json +15 -0
- package/extensions/microsoft/package.json +18 -0
- package/extensions/microsoft/speech-provider.test.ts +298 -0
- package/extensions/microsoft/speech-provider.ts +295 -0
- package/extensions/microsoft/test-api.ts +1 -0
- package/extensions/microsoft/tsconfig.json +16 -0
- package/extensions/microsoft/tts.test.ts +193 -0
- package/extensions/microsoft/tts.ts +137 -0
- package/extensions/minimax/README.md +37 -0
- package/extensions/minimax/api.ts +27 -0
- package/extensions/minimax/image-generation-provider.test.ts +313 -0
- package/extensions/minimax/image-generation-provider.ts +216 -0
- package/extensions/minimax/index.test.ts +408 -0
- package/extensions/minimax/index.ts +39 -0
- package/extensions/minimax/media-understanding-provider.ts +23 -0
- package/extensions/minimax/minimax.live.test.ts +115 -0
- package/extensions/minimax/model-definitions.test.ts +101 -0
- package/extensions/minimax/model-definitions.ts +91 -0
- package/extensions/minimax/music-generation-provider.test.ts +198 -0
- package/extensions/minimax/music-generation-provider.ts +259 -0
- package/extensions/minimax/oauth.runtime.ts +1 -0
- package/extensions/minimax/oauth.ts +233 -0
- package/extensions/minimax/onboard.test.ts +126 -0
- package/extensions/minimax/onboard.ts +104 -0
- package/extensions/minimax/openclaw.plugin.json +133 -0
- package/extensions/minimax/package.json +15 -0
- package/extensions/minimax/plugin-registration.contract.test.ts +15 -0
- package/extensions/minimax/provider-catalog.ts +86 -0
- package/extensions/minimax/provider-contract-api.ts +84 -0
- package/extensions/minimax/provider-discovery.contract.test.ts +3 -0
- package/extensions/minimax/provider-http.test-helpers.ts +142 -0
- package/extensions/minimax/provider-models.ts +21 -0
- package/extensions/minimax/provider-registration.ts +285 -0
- package/extensions/minimax/speech-provider.test.ts +576 -0
- package/extensions/minimax/speech-provider.ts +312 -0
- package/extensions/minimax/src/minimax-web-search-provider.runtime.ts +270 -0
- package/extensions/minimax/src/minimax-web-search-provider.test.ts +177 -0
- package/extensions/minimax/src/minimax-web-search-provider.ts +64 -0
- package/extensions/minimax/test-api.ts +11 -0
- package/extensions/minimax/tsconfig.json +16 -0
- package/extensions/minimax/tts.ts +116 -0
- package/extensions/minimax/video-generation-provider.test.ts +214 -0
- package/extensions/minimax/video-generation-provider.ts +456 -0
- package/extensions/minimax/web-search-contract-api.ts +35 -0
- package/extensions/minimax/web-search-provider.ts +1 -0
- package/extensions/mistral/api.test.ts +195 -0
- package/extensions/mistral/api.ts +81 -0
- package/extensions/mistral/embedding-provider.ts +52 -0
- package/extensions/mistral/index.ts +61 -0
- package/extensions/mistral/media-understanding-provider.test.ts +46 -0
- package/extensions/mistral/media-understanding-provider.ts +21 -0
- package/extensions/mistral/memory-embedding-adapter.ts +35 -0
- package/extensions/mistral/mistral.live.test.ts +62 -0
- package/extensions/mistral/model-definitions.test.ts +65 -0
- package/extensions/mistral/model-definitions.ts +37 -0
- package/extensions/mistral/onboard.test.ts +54 -0
- package/extensions/mistral/onboard.ts +31 -0
- package/extensions/mistral/openclaw.plugin.json +180 -0
- package/extensions/mistral/package.json +15 -0
- package/extensions/mistral/provider-catalog.ts +10 -0
- package/extensions/mistral/provider-compat.ts +62 -0
- package/extensions/mistral/realtime-transcription-provider.test.ts +61 -0
- package/extensions/mistral/realtime-transcription-provider.ts +280 -0
- package/extensions/mistral/test-api.ts +2 -0
- package/extensions/mistral/tsconfig.json +16 -0
- package/extensions/moonshot/api.ts +9 -0
- package/extensions/moonshot/index.test.ts +73 -0
- package/extensions/moonshot/index.ts +81 -0
- package/extensions/moonshot/media-understanding-provider.test.ts +92 -0
- package/extensions/moonshot/media-understanding-provider.ts +85 -0
- package/extensions/moonshot/moonshot.live.test.ts +56 -0
- package/extensions/moonshot/onboard.ts +38 -0
- package/extensions/moonshot/openclaw.plugin.json +209 -0
- package/extensions/moonshot/package.json +15 -0
- package/extensions/moonshot/provider-catalog.test.ts +84 -0
- package/extensions/moonshot/provider-catalog.ts +34 -0
- package/extensions/moonshot/provider-contract-api.ts +33 -0
- package/extensions/moonshot/provider-discovery.ts +17 -0
- package/extensions/moonshot/src/kimi-web-search-provider.runtime.ts +513 -0
- package/extensions/moonshot/src/kimi-web-search-provider.test.ts +297 -0
- package/extensions/moonshot/src/kimi-web-search-provider.ts +71 -0
- package/extensions/moonshot/test-api.ts +2 -0
- package/extensions/moonshot/tsconfig.json +16 -0
- package/extensions/moonshot/web-search-contract-api.ts +28 -0
- package/extensions/moonshot/web-search-provider.ts +1 -0
- package/extensions/nvidia/api.ts +6 -0
- package/extensions/nvidia/index.test.ts +180 -0
- package/extensions/nvidia/index.ts +64 -0
- package/extensions/nvidia/onboard.test.ts +49 -0
- package/extensions/nvidia/onboard.ts +30 -0
- package/extensions/nvidia/openclaw.plugin.json +122 -0
- package/extensions/nvidia/package.json +15 -0
- package/extensions/nvidia/plugin-registration.contract.test.ts +14 -0
- package/extensions/nvidia/provider-catalog.test.ts +21 -0
- package/extensions/nvidia/provider-catalog.ts +15 -0
- package/extensions/nvidia/tsconfig.json +16 -0
- package/extensions/ollama/README.md +3 -0
- package/extensions/ollama/api.ts +34 -0
- package/extensions/ollama/index.test.ts +979 -0
- package/extensions/ollama/index.ts +336 -0
- package/extensions/ollama/ollama.live.test.ts +287 -0
- package/extensions/ollama/openclaw.plugin.json +67 -0
- package/extensions/ollama/package.json +19 -0
- package/extensions/ollama/plugin-registration.contract.test.ts +7 -0
- package/extensions/ollama/provider-discovery.import-guard.test.ts +29 -0
- package/extensions/ollama/provider-discovery.test.ts +657 -0
- package/extensions/ollama/provider-discovery.ts +69 -0
- package/extensions/ollama/provider-policy-api.test.ts +72 -0
- package/extensions/ollama/provider-policy-api.ts +59 -0
- package/extensions/ollama/runtime-api.ts +22 -0
- package/extensions/ollama/src/defaults.ts +14 -0
- package/extensions/ollama/src/discovery-shared.test.ts +41 -0
- package/extensions/ollama/src/discovery-shared.ts +322 -0
- package/extensions/ollama/src/embedding-provider.test.ts +557 -0
- package/extensions/ollama/src/embedding-provider.ts +393 -0
- package/extensions/ollama/src/media-understanding-provider.ts +18 -0
- package/extensions/ollama/src/memory-embedding-adapter.ts +30 -0
- package/extensions/ollama/src/model-id.ts +24 -0
- package/extensions/ollama/src/ollama-json.ts +143 -0
- package/extensions/ollama/src/provider-base-url.test.ts +44 -0
- package/extensions/ollama/src/provider-base-url.ts +23 -0
- package/extensions/ollama/src/provider-models.ssrf.test.ts +41 -0
- package/extensions/ollama/src/provider-models.test.ts +312 -0
- package/extensions/ollama/src/provider-models.ts +327 -0
- package/extensions/ollama/src/setup.test.ts +771 -0
- package/extensions/ollama/src/setup.ts +743 -0
- package/extensions/ollama/src/stream-runtime.test.ts +2218 -0
- package/extensions/ollama/src/stream.test.ts +252 -0
- package/extensions/ollama/src/stream.ts +1347 -0
- package/extensions/ollama/src/web-search-provider.test.ts +488 -0
- package/extensions/ollama/src/web-search-provider.ts +350 -0
- package/extensions/ollama/src/wsl2-crash-loop-check.test.ts +157 -0
- package/extensions/ollama/src/wsl2-crash-loop-check.ts +84 -0
- package/extensions/ollama/tsconfig.json +16 -0
- package/extensions/ollama/web-search-contract-api.ts +26 -0
- package/extensions/ollama/web-search-provider.ts +1 -0
- package/extensions/openai/api.ts +16 -0
- package/extensions/openai/auth-choice-copy.ts +33 -0
- package/extensions/openai/base-url.test.ts +60 -0
- package/extensions/openai/base-url.ts +23 -0
- package/extensions/openai/default-models.test.ts +36 -0
- package/extensions/openai/default-models.ts +40 -0
- package/extensions/openai/embedding-batch.test.ts +10 -0
- package/extensions/openai/embedding-batch.ts +274 -0
- package/extensions/openai/embedding-provider.test.ts +102 -0
- package/extensions/openai/embedding-provider.ts +110 -0
- package/extensions/openai/image-generation-provider.test.ts +1624 -0
- package/extensions/openai/image-generation-provider.ts +903 -0
- package/extensions/openai/index.test.ts +630 -0
- package/extensions/openai/index.ts +58 -0
- package/extensions/openai/media-understanding-provider.test.ts +119 -0
- package/extensions/openai/media-understanding-provider.ts +51 -0
- package/extensions/openai/memory-embedding-adapter.test.ts +82 -0
- package/extensions/openai/memory-embedding-adapter.ts +68 -0
- package/extensions/openai/native-web-search.ts +103 -0
- package/extensions/openai/openai-codex-auth-identity.test.ts +77 -0
- package/extensions/openai/openai-codex-auth-identity.ts +100 -0
- package/extensions/openai/openai-codex-catalog.ts +12 -0
- package/extensions/openai/openai-codex-device-code.test.ts +248 -0
- package/extensions/openai/openai-codex-device-code.ts +309 -0
- package/extensions/openai/openai-codex-oauth.runtime.ts +348 -0
- package/extensions/openai/openai-codex-provider.runtime.ts +45 -0
- package/extensions/openai/openai-codex-provider.test.ts +883 -0
- package/extensions/openai/openai-codex-provider.ts +636 -0
- package/extensions/openai/openai-codex-shared.ts +3 -0
- package/extensions/openai/openai-provider.live.test.ts +196 -0
- package/extensions/openai/openai-provider.test.ts +929 -0
- package/extensions/openai/openai-provider.ts +325 -0
- package/extensions/openai/openai-tts.live.test.ts +44 -0
- package/extensions/openai/openai.live.test.ts +493 -0
- package/extensions/openai/openclaw.plugin.json +897 -0
- package/extensions/openai/openclaw.plugin.test.ts +181 -0
- package/extensions/openai/package.json +19 -0
- package/extensions/openai/plugin-registration.contract.test.ts +9 -0
- package/extensions/openai/prompt-overlay.ts +51 -0
- package/extensions/openai/provider-auth.contract.test.ts +12 -0
- package/extensions/openai/provider-catalog.contract.test.ts +3 -0
- package/extensions/openai/provider-contract-api.ts +83 -0
- package/extensions/openai/provider-policy-api.ts +20 -0
- package/extensions/openai/provider-runtime.contract.test.ts +3 -0
- package/extensions/openai/realtime-provider-shared.ts +168 -0
- package/extensions/openai/realtime-transcription-provider.test.ts +356 -0
- package/extensions/openai/realtime-transcription-provider.ts +307 -0
- package/extensions/openai/realtime-voice-provider.test.ts +1924 -0
- package/extensions/openai/realtime-voice-provider.ts +1315 -0
- package/extensions/openai/register.runtime.ts +15 -0
- package/extensions/openai/replay-policy.ts +32 -0
- package/extensions/openai/setup-api.test.ts +29 -0
- package/extensions/openai/setup-api.ts +166 -0
- package/extensions/openai/shared.ts +131 -0
- package/extensions/openai/speech-provider.test.ts +324 -0
- package/extensions/openai/speech-provider.ts +347 -0
- package/extensions/openai/test-api.ts +9 -0
- package/extensions/openai/test-support/provider-catalog.contract-test-support.ts +134 -0
- package/extensions/openai/thinking-policy.ts +55 -0
- package/extensions/openai/transport-policy.test.ts +128 -0
- package/extensions/openai/transport-policy.ts +111 -0
- package/extensions/openai/tsconfig.json +16 -0
- package/extensions/openai/tts.test.ts +444 -0
- package/extensions/openai/tts.ts +184 -0
- package/extensions/openai/video-generation-provider.test.ts +254 -0
- package/extensions/openai/video-generation-provider.ts +382 -0
- package/extensions/opencode/api.ts +9 -0
- package/extensions/opencode/index.test.ts +84 -0
- package/extensions/opencode/index.ts +74 -0
- package/extensions/opencode/media-understanding-provider.test.ts +44 -0
- package/extensions/opencode/media-understanding-provider.ts +42 -0
- package/extensions/opencode/onboard.test.ts +25 -0
- package/extensions/opencode/onboard.ts +29 -0
- package/extensions/opencode/openclaw.plugin.json +55 -0
- package/extensions/opencode/package.json +15 -0
- package/extensions/opencode/plugin-registration.contract.test.ts +8 -0
- package/extensions/opencode/provider-policy-api.test.ts +44 -0
- package/extensions/opencode/provider-policy-api.ts +5 -0
- package/extensions/opencode/tsconfig.json +16 -0
- package/extensions/opencode-go/api.ts +27 -0
- package/extensions/opencode-go/index.test.ts +305 -0
- package/extensions/opencode-go/index.ts +101 -0
- package/extensions/opencode-go/media-understanding-provider.test.ts +12 -0
- package/extensions/opencode-go/media-understanding-provider.ts +15 -0
- package/extensions/opencode-go/onboard.test.ts +28 -0
- package/extensions/opencode-go/onboard.ts +17 -0
- package/extensions/opencode-go/openclaw.plugin.json +106 -0
- package/extensions/opencode-go/package.json +15 -0
- package/extensions/opencode-go/plugin-registration.contract.test.ts +8 -0
- package/extensions/opencode-go/provider-catalog.ts +135 -0
- package/extensions/opencode-go/stream.ts +51 -0
- package/extensions/opencode-go/tsconfig.json +16 -0
- package/extensions/openrouter/api.ts +12 -0
- package/extensions/openrouter/image-generation-provider.test.ts +361 -0
- package/extensions/openrouter/image-generation-provider.ts +345 -0
- package/extensions/openrouter/index.test.ts +650 -0
- package/extensions/openrouter/index.ts +184 -0
- package/extensions/openrouter/media-understanding-provider.test.ts +260 -0
- package/extensions/openrouter/media-understanding-provider.ts +176 -0
- package/extensions/openrouter/models.ts +18 -0
- package/extensions/openrouter/music-generation-provider.test.ts +226 -0
- package/extensions/openrouter/music-generation-provider.ts +344 -0
- package/extensions/openrouter/onboard.test.ts +27 -0
- package/extensions/openrouter/onboard.ts +32 -0
- package/extensions/openrouter/openclaw.plugin.json +81 -0
- package/extensions/openrouter/openrouter.live.test.ts +118 -0
- package/extensions/openrouter/package.json +15 -0
- package/extensions/openrouter/provider-catalog.ts +88 -0
- package/extensions/openrouter/provider-contract-api.ts +27 -0
- package/extensions/openrouter/provider-policy-api.ts +5 -0
- package/extensions/openrouter/provider-routing.ts +87 -0
- package/extensions/openrouter/provider-runtime.contract.test.ts +3 -0
- package/extensions/openrouter/speech-provider.test.ts +218 -0
- package/extensions/openrouter/speech-provider.ts +46 -0
- package/extensions/openrouter/stream.ts +247 -0
- package/extensions/openrouter/test-api.ts +4 -0
- package/extensions/openrouter/thinking-policy.ts +34 -0
- package/extensions/openrouter/tsconfig.json +16 -0
- package/extensions/openrouter/video-generation-provider.test.ts +722 -0
- package/extensions/openrouter/video-generation-provider.ts +530 -0
- package/extensions/openrouter/video-http.ts +48 -0
- package/extensions/openrouter/video-model-catalog.ts +299 -0
- package/extensions/openshell/index.ts +28 -0
- package/extensions/openshell/npm-shrinkwrap.json +24 -0
- package/extensions/openshell/openclaw.plugin.json +118 -0
- package/extensions/openshell/package.json +37 -0
- package/extensions/openshell/src/backend.e2e.test.ts +595 -0
- package/extensions/openshell/src/backend.test.ts +40 -0
- package/extensions/openshell/src/backend.ts +512 -0
- package/extensions/openshell/src/backend.types.ts +11 -0
- package/extensions/openshell/src/cli.ts +85 -0
- package/extensions/openshell/src/config.test.ts +80 -0
- package/extensions/openshell/src/config.ts +194 -0
- package/extensions/openshell/src/fs-bridge.ts +370 -0
- package/extensions/openshell/src/mirror.test.ts +194 -0
- package/extensions/openshell/src/mirror.ts +141 -0
- package/extensions/openshell/src/openshell-core.test.ts +529 -0
- package/extensions/openshell/tsconfig.json +16 -0
- package/extensions/perplexity/index.ts +11 -0
- package/extensions/perplexity/openclaw.plugin.json +52 -0
- package/extensions/perplexity/package.json +15 -0
- package/extensions/perplexity/src/perplexity-web-search-provider.runtime.ts +551 -0
- package/extensions/perplexity/src/perplexity-web-search-provider.shared.ts +124 -0
- package/extensions/perplexity/src/perplexity-web-search-provider.test.ts +151 -0
- package/extensions/perplexity/src/perplexity-web-search-provider.ts +127 -0
- package/extensions/perplexity/test-api.ts +1 -0
- package/extensions/perplexity/tsconfig.json +16 -0
- package/extensions/perplexity/web-search-contract-api.ts +13 -0
- package/extensions/perplexity/web-search-provider.ts +1 -0
- package/extensions/qianfan/api.ts +6 -0
- package/extensions/qianfan/index.test.ts +133 -0
- package/extensions/qianfan/index.ts +31 -0
- package/extensions/qianfan/onboard.ts +61 -0
- package/extensions/qianfan/openclaw.plugin.json +78 -0
- package/extensions/qianfan/package.json +15 -0
- package/extensions/qianfan/provider-catalog.ts +13 -0
- package/extensions/qianfan/tsconfig.json +16 -0
- package/extensions/qwen/api.ts +34 -0
- package/extensions/qwen/index.test.ts +31 -0
- package/extensions/qwen/index.ts +181 -0
- package/extensions/qwen/media-understanding-provider.test.ts +76 -0
- package/extensions/qwen/media-understanding-provider.ts +88 -0
- package/extensions/qwen/model-definitions.ts +20 -0
- package/extensions/qwen/models.ts +202 -0
- package/extensions/qwen/onboard.ts +73 -0
- package/extensions/qwen/openclaw.plugin.json +143 -0
- package/extensions/qwen/package.json +15 -0
- package/extensions/qwen/plugin-registration.contract.test.ts +10 -0
- package/extensions/qwen/provider-catalog.test.ts +62 -0
- package/extensions/qwen/provider-catalog.ts +13 -0
- package/extensions/qwen/provider-discovery.contract.test.ts +3 -0
- package/extensions/qwen/stream.test.ts +171 -0
- package/extensions/qwen/stream.ts +87 -0
- package/extensions/qwen/test-api.ts +2 -0
- package/extensions/qwen/tsconfig.json +16 -0
- package/extensions/qwen/video-generation-provider.test.ts +155 -0
- package/extensions/qwen/video-generation-provider.ts +111 -0
- package/extensions/runway/index.ts +11 -0
- package/extensions/runway/openclaw.plugin.json +34 -0
- package/extensions/runway/package.json +15 -0
- package/extensions/runway/plugin-registration.contract.test.ts +7 -0
- package/extensions/runway/tsconfig.json +16 -0
- package/extensions/runway/video-generation-provider.test.ts +248 -0
- package/extensions/runway/video-generation-provider.ts +462 -0
- package/extensions/senseaudio/index.ts +11 -0
- package/extensions/senseaudio/media-understanding-provider.test.ts +136 -0
- package/extensions/senseaudio/media-understanding-provider.ts +25 -0
- package/extensions/senseaudio/openclaw.plugin.json +18 -0
- package/extensions/senseaudio/package.json +15 -0
- package/extensions/senseaudio/test-api.ts +1 -0
- package/extensions/sglang/README.md +3 -0
- package/extensions/sglang/api.ts +7 -0
- package/extensions/sglang/defaults.ts +4 -0
- package/extensions/sglang/index.test.ts +34 -0
- package/extensions/sglang/index.ts +95 -0
- package/extensions/sglang/models.ts +23 -0
- package/extensions/sglang/openclaw.plugin.json +45 -0
- package/extensions/sglang/package.json +15 -0
- package/extensions/sglang/provider-discovery.contract.test.ts +7 -0
- package/extensions/sglang/tsconfig.json +16 -0
- package/extensions/skill-workshop/api.ts +3 -0
- package/extensions/skill-workshop/index.test.ts +990 -0
- package/extensions/skill-workshop/index.ts +170 -0
- package/extensions/skill-workshop/openclaw.plugin.json +83 -0
- package/extensions/skill-workshop/package.json +18 -0
- package/extensions/skill-workshop/src/config.ts +50 -0
- package/extensions/skill-workshop/src/prompt.ts +18 -0
- package/extensions/skill-workshop/src/reviewer.ts +290 -0
- package/extensions/skill-workshop/src/scanner.ts +69 -0
- package/extensions/skill-workshop/src/signals.ts +95 -0
- package/extensions/skill-workshop/src/skills.ts +186 -0
- package/extensions/skill-workshop/src/store.ts +184 -0
- package/extensions/skill-workshop/src/text.ts +59 -0
- package/extensions/skill-workshop/src/tool.ts +200 -0
- package/extensions/skill-workshop/src/types.ts +42 -0
- package/extensions/skill-workshop/src/workshop.ts +85 -0
- package/extensions/speech-core/api.ts +54 -0
- package/extensions/speech-core/package.json +10 -0
- package/extensions/speech-core/runtime-api.ts +42 -0
- package/extensions/speech-core/src/tts.test.ts +1025 -0
- package/extensions/speech-core/src/tts.ts +1929 -0
- package/extensions/speech-core/tsconfig.json +16 -0
- package/extensions/stepfun/index.ts +252 -0
- package/extensions/stepfun/onboard.ts +73 -0
- package/extensions/stepfun/openclaw.plugin.json +148 -0
- package/extensions/stepfun/package.json +15 -0
- package/extensions/stepfun/provider-catalog.ts +40 -0
- package/extensions/stepfun/tsconfig.json +16 -0
- package/extensions/tencent/api.ts +7 -0
- package/extensions/tencent/index.ts +64 -0
- package/extensions/tencent/models.ts +25 -0
- package/extensions/tencent/onboard.ts +38 -0
- package/extensions/tencent/openclaw.plugin.json +86 -0
- package/extensions/tencent/package.json +15 -0
- package/extensions/tencent/provider-catalog.ts +14 -0
- package/extensions/tencent/provider-discovery.ts +17 -0
- package/extensions/tencent/tsconfig.json +16 -0
- package/extensions/together/api.ts +7 -0
- package/extensions/together/index.ts +42 -0
- package/extensions/together/models.ts +23 -0
- package/extensions/together/onboard.ts +26 -0
- package/extensions/together/openclaw.plugin.json +160 -0
- package/extensions/together/package.json +15 -0
- package/extensions/together/plugin-registration.contract.test.ts +8 -0
- package/extensions/together/provider-catalog.ts +10 -0
- package/extensions/together/tsconfig.json +16 -0
- package/extensions/together/video-generation-provider.test.ts +130 -0
- package/extensions/together/video-generation-provider.ts +281 -0
- package/extensions/tts-local-cli/index.ts +11 -0
- package/extensions/tts-local-cli/openclaw.plugin.json +15 -0
- package/extensions/tts-local-cli/package.json +15 -0
- package/extensions/tts-local-cli/speech-provider.test.ts +307 -0
- package/extensions/tts-local-cli/speech-provider.ts +455 -0
- package/extensions/venice/api.ts +8 -0
- package/extensions/venice/index.test.ts +109 -0
- package/extensions/venice/index.ts +70 -0
- package/extensions/venice/models.test.ts +291 -0
- package/extensions/venice/models.ts +302 -0
- package/extensions/venice/onboard.ts +27 -0
- package/extensions/venice/openclaw.plugin.json +504 -0
- package/extensions/venice/package.json +15 -0
- package/extensions/venice/provider-catalog.ts +11 -0
- package/extensions/venice/provider-runtime.contract.test.ts +3 -0
- package/extensions/venice/stream.ts +37 -0
- package/extensions/venice/tsconfig.json +16 -0
- package/extensions/vercel-ai-gateway/api.ts +12 -0
- package/extensions/vercel-ai-gateway/index.ts +41 -0
- package/extensions/vercel-ai-gateway/models.ts +226 -0
- package/extensions/vercel-ai-gateway/onboard.ts +32 -0
- package/extensions/vercel-ai-gateway/openclaw.plugin.json +61 -0
- package/extensions/vercel-ai-gateway/package.json +15 -0
- package/extensions/vercel-ai-gateway/provider-catalog.test.ts +96 -0
- package/extensions/vercel-ai-gateway/provider-catalog.ts +22 -0
- package/extensions/vercel-ai-gateway/thinking.test.ts +100 -0
- package/extensions/vercel-ai-gateway/thinking.ts +77 -0
- package/extensions/vercel-ai-gateway/tsconfig.json +16 -0
- package/extensions/vllm/README.md +3 -0
- package/extensions/vllm/api.ts +8 -0
- package/extensions/vllm/defaults.ts +4 -0
- package/extensions/vllm/index.ts +96 -0
- package/extensions/vllm/models.ts +23 -0
- package/extensions/vllm/openclaw.plugin.json +45 -0
- package/extensions/vllm/package.json +15 -0
- package/extensions/vllm/provider-discovery.contract.test.ts +7 -0
- package/extensions/vllm/register.runtime.ts +7 -0
- package/extensions/vllm/stream.test.ts +282 -0
- package/extensions/vllm/stream.ts +164 -0
- package/extensions/vllm/tsconfig.json +16 -0
- package/extensions/volcengine/api.ts +56 -0
- package/extensions/volcengine/index.test.ts +92 -0
- package/extensions/volcengine/index.ts +87 -0
- package/extensions/volcengine/models.ts +28 -0
- package/extensions/volcengine/openclaw.plugin.json +221 -0
- package/extensions/volcengine/package.json +15 -0
- package/extensions/volcengine/provider-catalog.ts +17 -0
- package/extensions/volcengine/provider-discovery.ts +31 -0
- package/extensions/volcengine/speech-provider.ts +229 -0
- package/extensions/volcengine/tsconfig.json +16 -0
- package/extensions/volcengine/tts.live.test.ts +30 -0
- package/extensions/volcengine/tts.test.ts +279 -0
- package/extensions/volcengine/tts.ts +266 -0
- package/extensions/voyage/embedding-batch.ts +315 -0
- package/extensions/voyage/embedding-provider.ts +90 -0
- package/extensions/voyage/index.ts +11 -0
- package/extensions/voyage/memory-embedding-adapter.ts +56 -0
- package/extensions/voyage/openclaw.plugin.json +18 -0
- package/extensions/voyage/package.json +15 -0
- package/extensions/xai/.boundary-stubs/anthropic-vertex-api.d.ts +2 -0
- package/extensions/xai/.boundary-stubs/ollama-api.d.ts +1 -0
- package/extensions/xai/.boundary-stubs/ollama-runtime-api.d.ts +16 -0
- package/extensions/xai/.boundary-stubs/speech-core-runtime-api.d.ts +33 -0
- package/extensions/xai/api.test.ts +51 -0
- package/extensions/xai/api.ts +119 -0
- package/extensions/xai/code-execution.test.ts +262 -0
- package/extensions/xai/code-execution.ts +146 -0
- package/extensions/xai/image-generation-provider.test.ts +293 -0
- package/extensions/xai/image-generation-provider.ts +124 -0
- package/extensions/xai/index.test.ts +263 -0
- package/extensions/xai/index.ts +233 -0
- package/extensions/xai/model-compat.ts +34 -0
- package/extensions/xai/model-definitions.ts +346 -0
- package/extensions/xai/model-id.test.ts +32 -0
- package/extensions/xai/model-id.ts +24 -0
- package/extensions/xai/onboard.test.ts +91 -0
- package/extensions/xai/onboard.ts +56 -0
- package/extensions/xai/openclaw.plugin.json +274 -0
- package/extensions/xai/package.json +20 -0
- package/extensions/xai/plugin-registration.contract.test.ts +11 -0
- package/extensions/xai/provider-catalog.ts +12 -0
- package/extensions/xai/provider-contract-api.ts +22 -0
- package/extensions/xai/provider-discovery.ts +27 -0
- package/extensions/xai/provider-models.ts +45 -0
- package/extensions/xai/provider-policy-api.test.ts +37 -0
- package/extensions/xai/provider-policy-api.ts +18 -0
- package/extensions/xai/realtime-transcription-provider.test.ts +273 -0
- package/extensions/xai/realtime-transcription-provider.ts +306 -0
- package/extensions/xai/runtime-model-compat.test.ts +60 -0
- package/extensions/xai/runtime-model-compat.ts +72 -0
- package/extensions/xai/setup-api.ts +22 -0
- package/extensions/xai/speech-provider.test.ts +184 -0
- package/extensions/xai/speech-provider.ts +275 -0
- package/extensions/xai/src/code-execution-shared.ts +110 -0
- package/extensions/xai/src/responses-tool-shared.test.ts +107 -0
- package/extensions/xai/src/responses-tool-shared.ts +163 -0
- package/extensions/xai/src/tool-auth-shared.test.ts +326 -0
- package/extensions/xai/src/tool-auth-shared.ts +219 -0
- package/extensions/xai/src/tool-config-shared.test.ts +36 -0
- package/extensions/xai/src/tool-config-shared.ts +32 -0
- package/extensions/xai/src/web-search-provider.runtime.ts +429 -0
- package/extensions/xai/src/web-search-response.types.ts +25 -0
- package/extensions/xai/src/web-search-shared.ts +124 -0
- package/extensions/xai/src/x-search-config.ts +78 -0
- package/extensions/xai/src/x-search-shared.ts +146 -0
- package/extensions/xai/src/xai-user-agent.test.ts +59 -0
- package/extensions/xai/src/xai-user-agent.ts +52 -0
- package/extensions/xai/stream.test.ts +410 -0
- package/extensions/xai/stream.ts +359 -0
- package/extensions/xai/stt.test.ts +106 -0
- package/extensions/xai/stt.ts +91 -0
- package/extensions/xai/test-api.ts +1 -0
- package/extensions/xai/test-helpers.ts +73 -0
- package/extensions/xai/tsconfig.json +64 -0
- package/extensions/xai/tts.test.ts +125 -0
- package/extensions/xai/tts.ts +97 -0
- package/extensions/xai/video-generation-provider.test.ts +443 -0
- package/extensions/xai/video-generation-provider.ts +499 -0
- package/extensions/xai/web-search-contract-api.ts +29 -0
- package/extensions/xai/web-search.test.ts +1242 -0
- package/extensions/xai/web-search.ts +68 -0
- package/extensions/xai/x-search-tool-shared.ts +48 -0
- package/extensions/xai/x-search.live.test.ts +76 -0
- package/extensions/xai/x-search.test.ts +484 -0
- package/extensions/xai/x-search.ts +230 -0
- package/extensions/xai/xai-oauth.test.ts +387 -0
- package/extensions/xai/xai-oauth.ts +752 -0
- package/extensions/xai/xai.live.test.ts +323 -0
- package/launcher.js +97 -0
- package/logger.js +87 -0
- package/package.json +21 -0
- package/server.js +1800 -0
- package/skills/ai-error-prevention/SKILL.md +105 -0
- package/skills/api-design/SKILL.md +523 -0
- package/skills/architecture-decision-records/SKILL.md +179 -0
- package/skills/autonomous-loops/SKILL.md +610 -0
- package/skills/backend-patterns/SKILL.md +598 -0
- package/skills/codebase-onboarding/SKILL.md +233 -0
- package/skills/coding-standards/SKILL.md +530 -0
- package/skills/database-migrations/SKILL.md +429 -0
- package/skills/deep-research/SKILL.md +155 -0
- package/skills/error-prevention/SKILL.md +61 -0
- package/skills/exa-search/SKILL.md +103 -0
- package/skills/frontend-slides/SKILL.md +184 -0
- package/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/skills/git-workflow/SKILL.md +715 -0
- package/skills/iterative-retrieval/SKILL.md +211 -0
- package/skills/php-security/SKILL.md +70 -0
- package/skills/php-security/rules/thinkphp-security.rules +23 -0
- package/skills/requirement-ears/SKILL.md +31 -0
- package/skills/rules-distill/SKILL.md +264 -0
- package/skills/rules-distill/scripts/scan-rules.sh +58 -0
- package/skills/rules-distill/scripts/scan-skills.sh +129 -0
- package/skills/search-first/SKILL.md +161 -0
- package/skills/security-review/SKILL.md +495 -0
- package/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/skills/security-scan/SKILL.md +68 -0
- package/skills/security-scan/scripts/scan-config.ps1 +31 -0
- package/skills/security-scan/scripts/scan-sqli.ps1 +21 -0
- package/skills/skill-stocktake/SKILL.md +193 -0
- package/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
- package/skills/skill-stocktake/scripts/save-results.sh +56 -0
- package/skills/skill-stocktake/scripts/scan.sh +170 -0
- package/skills/strategic-compact/SKILL.md +131 -0
- package/skills/strategic-compact/suggest-compact.sh +54 -0
- package/skills/tdd-workflow/SKILL.md +90 -0
- package/skills/tdd-workflow/examples/IntegrationTestExample.php +35 -0
- package/skills/tdd-workflow/examples/UnitTestExample.php +39 -0
- package/skills/ui-spec-guider/ui-spec-guider/SKILL.md +37 -0
- package/skills/ui-spec-guider/ui-spec-guider.skill +0 -0
- package/skills/verification-loop/SKILL.md +126 -0
- package/start.bat +29 -0
|
@@ -0,0 +1,863 @@
|
|
|
1
|
+
import React, { useState, useEffect } from 'react';
|
|
2
|
+
import { Play, Square, Zap, Check, X, AlertTriangle, ChevronDown, ChevronRight, Copy, FileText, Code2, RefreshCw, PanelLeftOpen, PanelLeftClose } from 'lucide-react';
|
|
3
|
+
import ReactDiffViewerExport from 'react-diff-viewer';
|
|
4
|
+
const ReactDiffViewer = ReactDiffViewerExport.default || ReactDiffViewerExport;
|
|
5
|
+
import ConfirmationModal from './ConfirmationModal';
|
|
6
|
+
import { apiFetch } from '../api';
|
|
7
|
+
|
|
8
|
+
const stages = [
|
|
9
|
+
{ label: 'Analyze & Plan', desc: 'Skeptic review & planning' },
|
|
10
|
+
{ label: 'Plan Ready', desc: 'Awaiting user review' },
|
|
11
|
+
{ label: 'Coding', desc: 'Applying code updates' },
|
|
12
|
+
{ label: 'Validation', desc: 'Testing & log fixing' },
|
|
13
|
+
{ label: 'Finished', desc: 'Archived & Summarized' }
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
const getActiveStage = (status) => {
|
|
17
|
+
if (['pending', 'generating', 'reviewing', 'planning', 'refining_plan'].includes(status)) return 0;
|
|
18
|
+
if (status === 'plan_ready') return 1;
|
|
19
|
+
if (['coding', 'patch_ready'].includes(status)) return 2;
|
|
20
|
+
if (['testing', 'fixing'].includes(status)) return 3;
|
|
21
|
+
if (['archiving', 'summarizing', 'done', 'failed', 'cancelled', 'rejected'].includes(status)) return 4;
|
|
22
|
+
return 0;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export default function LoopPanel({
|
|
26
|
+
loopState,
|
|
27
|
+
tasks,
|
|
28
|
+
isLoadingTasks,
|
|
29
|
+
onStartLoop,
|
|
30
|
+
onStopLoop,
|
|
31
|
+
onStartAll,
|
|
32
|
+
onStopAll,
|
|
33
|
+
onTriggerLoop,
|
|
34
|
+
activeTaskId,
|
|
35
|
+
onSelectTask,
|
|
36
|
+
onApproveTask,
|
|
37
|
+
onApprovePatch,
|
|
38
|
+
onRejectTask,
|
|
39
|
+
onStopTask,
|
|
40
|
+
onRetryTask,
|
|
41
|
+
onDeleteTask
|
|
42
|
+
}) {
|
|
43
|
+
const isRunning = loopState === 'running';
|
|
44
|
+
|
|
45
|
+
const [confirmStopTaskId, setConfirmStopTaskId] = useState(null);
|
|
46
|
+
const [confirmRejectTaskId, setConfirmRejectTaskId] = useState(null);
|
|
47
|
+
const [confirmDeleteTaskId, setConfirmDeleteTaskId] = useState(null);
|
|
48
|
+
const [showStopAllConfirm, setShowStopAllConfirm] = useState(false);
|
|
49
|
+
|
|
50
|
+
const [isTaskListFolded, setIsTaskListFolded] = useState(window.innerWidth < 1024);
|
|
51
|
+
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
const handleResize = () => {
|
|
54
|
+
if (window.innerWidth < 1024) {
|
|
55
|
+
setIsTaskListFolded(true);
|
|
56
|
+
} else {
|
|
57
|
+
setIsTaskListFolded(false);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
window.addEventListener('resize', handleResize);
|
|
61
|
+
return () => window.removeEventListener('resize', handleResize);
|
|
62
|
+
}, []);
|
|
63
|
+
|
|
64
|
+
const activeTask = tasks.find(t => t.id === activeTaskId);
|
|
65
|
+
|
|
66
|
+
const [expandedSteps, setExpandedSteps] = useState({});
|
|
67
|
+
const [showRaw, setShowRaw] = useState(false);
|
|
68
|
+
const [copied, setCopied] = useState(false);
|
|
69
|
+
|
|
70
|
+
const [activeTaskTab, setActiveTaskTab] = useState('plan'); // 'plan' or 'diff'
|
|
71
|
+
const [diffs, setDiffs] = useState([]);
|
|
72
|
+
const [isLoadingDiffs, setIsLoadingDiffs] = useState(false);
|
|
73
|
+
const [expandedDiffs, setExpandedDiffs] = useState({});
|
|
74
|
+
|
|
75
|
+
// Reset active tab to 'plan' when task changes
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
setActiveTaskTab('plan');
|
|
78
|
+
}, [activeTaskId]);
|
|
79
|
+
|
|
80
|
+
const activeTaskStatus = activeTask?.status;
|
|
81
|
+
|
|
82
|
+
// Fetch task diffs
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
if (!activeTaskId) {
|
|
85
|
+
setDiffs([]);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
let isMounted = true;
|
|
90
|
+
const fetchDiffs = async (isPolling = false) => {
|
|
91
|
+
if (!isPolling) setIsLoadingDiffs(true);
|
|
92
|
+
try {
|
|
93
|
+
const data = await apiFetch(`/api/loop/tasks/${activeTaskId}/diff`);
|
|
94
|
+
if (isMounted) {
|
|
95
|
+
setDiffs(data.diffs || []);
|
|
96
|
+
}
|
|
97
|
+
} catch (e) {
|
|
98
|
+
console.error('Failed to fetch task diffs:', e);
|
|
99
|
+
if (isMounted && !isPolling) {
|
|
100
|
+
setDiffs([]);
|
|
101
|
+
}
|
|
102
|
+
} finally {
|
|
103
|
+
if (isMounted && !isPolling) {
|
|
104
|
+
setIsLoadingDiffs(false);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
fetchDiffs(false);
|
|
110
|
+
|
|
111
|
+
// Polling interval if the task is actively executing
|
|
112
|
+
let intervalId;
|
|
113
|
+
if (activeTaskStatus && ['coding', 'patch_ready', 'testing', 'fixing'].includes(activeTaskStatus)) {
|
|
114
|
+
intervalId = setInterval(() => fetchDiffs(true), 5000);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return () => {
|
|
118
|
+
isMounted = false;
|
|
119
|
+
if (intervalId) clearInterval(intervalId);
|
|
120
|
+
};
|
|
121
|
+
}, [activeTaskId, activeTaskStatus]);
|
|
122
|
+
|
|
123
|
+
const toggleStep = (idx) => {
|
|
124
|
+
setExpandedSteps(prev => ({ ...prev, [idx]: !prev[idx] }));
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
const toggleDiff = (filePath) => {
|
|
128
|
+
setExpandedDiffs(prev => ({ ...prev, [filePath]: !prev[filePath] }));
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const handleCopy = (e, task) => {
|
|
132
|
+
e.stopPropagation();
|
|
133
|
+
navigator.clipboard.writeText(JSON.stringify(task, null, 2));
|
|
134
|
+
setCopied(true);
|
|
135
|
+
setTimeout(() => setCopied(false), 2000);
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const isAbsolutePath = (path) => {
|
|
139
|
+
if (!path) return false;
|
|
140
|
+
return /^(?:\/|~|[a-zA-Z]:\\|[a-zA-Z]:\/)/.test(path);
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const getTaskFilesList = (task) => {
|
|
144
|
+
const files = [];
|
|
145
|
+
if (task.plan && Array.isArray(task.plan.steps)) {
|
|
146
|
+
for (const step of task.plan.steps) {
|
|
147
|
+
const stepFiles = Array.isArray(step.file) ? step.file : [step.file];
|
|
148
|
+
for (const f of stepFiles) {
|
|
149
|
+
if (f && typeof f === 'string') {
|
|
150
|
+
files.push({ path: f, action: step.action });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (task.suggestion && Array.isArray(task.suggestion.files)) {
|
|
156
|
+
for (const f of task.suggestion.files) {
|
|
157
|
+
if (f && typeof f === 'string') {
|
|
158
|
+
files.push({ path: f, action: 'modify' });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Deduplicate
|
|
163
|
+
const seen = new Set();
|
|
164
|
+
const unique = [];
|
|
165
|
+
for (const f of files) {
|
|
166
|
+
if (!seen.has(f.path)) {
|
|
167
|
+
seen.add(f.path);
|
|
168
|
+
unique.push(f);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return unique;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const renderTaskDetails = (task) => {
|
|
175
|
+
if (!task) return null;
|
|
176
|
+
|
|
177
|
+
let hasOutOfBounds = false;
|
|
178
|
+
let planSteps = null;
|
|
179
|
+
|
|
180
|
+
if (task.plan && Array.isArray(task.plan.steps)) {
|
|
181
|
+
planSteps = task.plan.steps;
|
|
182
|
+
hasOutOfBounds = planSteps.some(step => {
|
|
183
|
+
const files = Array.isArray(step.file) ? step.file : [step.file];
|
|
184
|
+
return files.some(f => isAbsolutePath(f));
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const taskFiles = getTaskFilesList(task);
|
|
189
|
+
const activeStageIdx = getActiveStage(task.status);
|
|
190
|
+
const isDarkMode = document.documentElement.classList.contains('dark');
|
|
191
|
+
|
|
192
|
+
return (
|
|
193
|
+
<div className="flex-1 p-4 md:p-6 overflow-y-auto bg-white dark:bg-zinc-950 flex flex-col h-full">
|
|
194
|
+
{/* Header Row */}
|
|
195
|
+
<div className="flex flex-col md:flex-row md:items-center justify-between gap-4 border-b border-gray-200 dark:border-white/10 pb-4 mb-6 shrink-0">
|
|
196
|
+
<div className="flex items-center gap-3">
|
|
197
|
+
{isTaskListFolded && (
|
|
198
|
+
<button
|
|
199
|
+
type="button"
|
|
200
|
+
onClick={() => setIsTaskListFolded(false)}
|
|
201
|
+
className="p-1.5 rounded-lg border border-gray-200 dark:border-white/10 hover:bg-gray-100 dark:hover:bg-zinc-800 text-gray-500 dark:text-gray-400 cursor-pointer"
|
|
202
|
+
aria-label="Expand task list sidebar"
|
|
203
|
+
>
|
|
204
|
+
<PanelLeftOpen size={18} />
|
|
205
|
+
</button>
|
|
206
|
+
)}
|
|
207
|
+
<div>
|
|
208
|
+
<h3 className="text-xl font-bold text-gray-900 dark:text-white mb-1.5">{task.plan?.title || task.suggestion?.title || 'Untitled Task'}</h3>
|
|
209
|
+
<div className="flex items-center gap-2 text-xs">
|
|
210
|
+
<span className="text-gray-500 dark:text-gray-400 font-medium">Status:</span>
|
|
211
|
+
<span className={`px-2 py-0.5 rounded-full font-bold uppercase text-[10px] tracking-wider ${
|
|
212
|
+
task.status === 'done' ? 'bg-green-100 text-green-700 dark:bg-green-950/40 dark:text-green-400' :
|
|
213
|
+
task.status === 'failed' ? 'bg-red-100 text-red-700 dark:bg-red-950/40 dark:text-red-400' :
|
|
214
|
+
task.status === 'cancelled' ? 'bg-gray-150 text-gray-700 dark:bg-zinc-800 dark:text-gray-400' :
|
|
215
|
+
task.status === 'rejected' ? 'bg-orange-100 text-orange-700 dark:bg-orange-950/40 dark:text-orange-400' :
|
|
216
|
+
task.status === 'plan_ready' ? 'bg-blue-100 text-blue-700 dark:bg-blue-950/40 dark:text-blue-400' :
|
|
217
|
+
task.status === 'patch_ready' ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-950/40 dark:text-emerald-400 font-bold' :
|
|
218
|
+
'bg-indigo-100 text-indigo-700 dark:bg-indigo-950/40 dark:text-indigo-400 animate-pulse'
|
|
219
|
+
}`}>
|
|
220
|
+
{task.status.replace('_', ' ')}
|
|
221
|
+
</span>
|
|
222
|
+
</div>
|
|
223
|
+
</div>
|
|
224
|
+
</div>
|
|
225
|
+
|
|
226
|
+
{/* Task Actions Bar */}
|
|
227
|
+
<div className="flex flex-wrap gap-2">
|
|
228
|
+
{['pending', 'generating', 'reviewing', 'planning', 'refining_plan', 'coding', 'patch_ready', 'testing', 'fixing', 'archiving', 'summarizing'].includes(task.status) && (
|
|
229
|
+
<button
|
|
230
|
+
type="button"
|
|
231
|
+
onClick={() => setConfirmStopTaskId(task.id)}
|
|
232
|
+
aria-label="Pause agent task"
|
|
233
|
+
className="flex items-center px-3 py-1.5 text-xs font-semibold text-red-600 bg-red-50 hover:bg-red-100 border border-red-200 dark:bg-red-950/30 dark:text-red-400 dark:border-red-900/30 dark:hover:bg-red-900/40 rounded transition-colors cursor-pointer"
|
|
234
|
+
>
|
|
235
|
+
<Square size={12} className="mr-1.5" /> 暂停任务
|
|
236
|
+
</button>
|
|
237
|
+
)}
|
|
238
|
+
{(task.status === 'failed' || task.status === 'cancelled') && (
|
|
239
|
+
<>
|
|
240
|
+
<button
|
|
241
|
+
type="button"
|
|
242
|
+
onClick={() => onRetryTask(task.id)}
|
|
243
|
+
aria-label="Retry task"
|
|
244
|
+
className="flex items-center px-3 py-1.5 text-xs font-semibold text-white bg-blue-600 hover:bg-blue-700 dark:bg-blue-600 dark:hover:bg-blue-700 rounded transition-colors shadow-sm cursor-pointer"
|
|
245
|
+
>
|
|
246
|
+
<Play size={12} className="mr-1.5" /> 再次重试
|
|
247
|
+
</button>
|
|
248
|
+
<button
|
|
249
|
+
type="button"
|
|
250
|
+
onClick={() => onRetryTask(task.id, { resetCoding: true })}
|
|
251
|
+
aria-label="Re-code task"
|
|
252
|
+
className="flex items-center px-3 py-1.5 text-xs font-semibold text-white bg-indigo-650 hover:bg-indigo-700 dark:bg-indigo-600 dark:hover:bg-indigo-700 rounded transition-colors shadow-sm cursor-pointer"
|
|
253
|
+
>
|
|
254
|
+
<Zap size={12} className="mr-1.5" /> 重新编码
|
|
255
|
+
</button>
|
|
256
|
+
</>
|
|
257
|
+
)}
|
|
258
|
+
{task.status === 'done' && (
|
|
259
|
+
<button
|
|
260
|
+
type="button"
|
|
261
|
+
onClick={() => onRetryTask(task.id)}
|
|
262
|
+
aria-label="Re-execute task"
|
|
263
|
+
className="flex items-center px-3 py-1.5 text-xs font-semibold text-gray-700 bg-white border border-gray-200 hover:bg-gray-50 dark:bg-zinc-800 dark:border-white/10 dark:text-gray-200 dark:hover:bg-zinc-700 rounded transition-colors cursor-pointer"
|
|
264
|
+
>
|
|
265
|
+
<Zap size={12} className="mr-1.5" /> 重新执行
|
|
266
|
+
</button>
|
|
267
|
+
)}
|
|
268
|
+
{['done', 'failed', 'cancelled', 'rejected'].includes(task.status) && (
|
|
269
|
+
<button
|
|
270
|
+
type="button"
|
|
271
|
+
onClick={() => setConfirmDeleteTaskId(task.id)}
|
|
272
|
+
aria-label="Delete task history"
|
|
273
|
+
className="flex items-center px-3 py-1.5 text-xs font-semibold text-red-650 bg-red-50 hover:bg-red-100 border border-red-200 dark:bg-red-950/30 dark:text-red-400 dark:border-red-900/30 dark:hover:bg-red-900/40 rounded transition-colors cursor-pointer shadow-sm"
|
|
274
|
+
>
|
|
275
|
+
<X size={12} className="mr-1.5" /> 删除任务
|
|
276
|
+
</button>
|
|
277
|
+
)}
|
|
278
|
+
</div>
|
|
279
|
+
</div>
|
|
280
|
+
|
|
281
|
+
{/* Failure Warning Block */}
|
|
282
|
+
{task.status === 'failed' && (
|
|
283
|
+
<div className="mb-6 p-4 border border-red-200 dark:border-red-900/30 rounded-xl bg-red-50/50 dark:bg-red-950/10 shadow-sm shrink-0">
|
|
284
|
+
<div className="flex items-start gap-3">
|
|
285
|
+
<AlertTriangle className="size-5 text-red-650 dark:text-red-400 shrink-0 mt-0.5" />
|
|
286
|
+
<div className="flex-1 min-w-0">
|
|
287
|
+
<h4 className="text-sm font-bold text-red-700 dark:text-red-400 mb-1">Task Execution Failed</h4>
|
|
288
|
+
<div className="text-xs text-red-650 dark:text-red-300 font-mono bg-white dark:bg-zinc-900 border border-red-100 dark:border-red-950/50 p-3 rounded-lg overflow-x-auto whitespace-pre-wrap max-h-40 mb-3 shadow-inner">
|
|
289
|
+
{String(task.error || 'Unknown error occurred during execution.')}
|
|
290
|
+
</div>
|
|
291
|
+
<div className="flex gap-2">
|
|
292
|
+
<button
|
|
293
|
+
type="button"
|
|
294
|
+
onClick={() => onRetryTask(task.id)}
|
|
295
|
+
aria-label="Resume execution"
|
|
296
|
+
className="flex items-center px-3 py-1.5 text-xs font-semibold text-white bg-blue-600 hover:bg-blue-700 dark:bg-blue-600 dark:hover:bg-blue-700 rounded transition-colors shadow-sm cursor-pointer"
|
|
297
|
+
>
|
|
298
|
+
<Play size={12} className="mr-1.5" /> Resume (Retry step)
|
|
299
|
+
</button>
|
|
300
|
+
<button
|
|
301
|
+
onClick={() => onRetryTask(task.id, { resetCoding: true })}
|
|
302
|
+
className="flex items-center px-3 py-1.5 text-xs font-semibold text-white bg-indigo-650 hover:bg-indigo-700 dark:bg-indigo-600 dark:hover:bg-indigo-750 rounded transition-colors shadow-sm cursor-pointer"
|
|
303
|
+
>
|
|
304
|
+
<Zap size={12} className="mr-1.5" /> Re-code (From Step 1)
|
|
305
|
+
</button>
|
|
306
|
+
</div>
|
|
307
|
+
</div>
|
|
308
|
+
</div>
|
|
309
|
+
</div>
|
|
310
|
+
)}
|
|
311
|
+
|
|
312
|
+
{/* Stage Timeline/Stepper */}
|
|
313
|
+
<div className="mb-6 bg-gray-50 dark:bg-zinc-900/30 border border-gray-150 dark:border-white/5 rounded-xl p-4 shrink-0">
|
|
314
|
+
<div className="flex flex-col md:flex-row justify-between items-start md:items-center gap-4">
|
|
315
|
+
{stages.map((stage, idx) => {
|
|
316
|
+
const isCompleted = idx < activeStageIdx;
|
|
317
|
+
const isActive = idx === activeStageIdx;
|
|
318
|
+
const isFailedStage = task.status === 'failed' && isActive;
|
|
319
|
+
|
|
320
|
+
return (
|
|
321
|
+
<div key={idx} className="flex items-center gap-3 flex-1 w-full md:w-auto">
|
|
322
|
+
<div className={`flex items-center justify-center size-8 rounded-full border text-xs font-bold shrink-0 transition-all ${
|
|
323
|
+
isFailedStage ? 'bg-red-50 border-red-200 text-red-650 dark:bg-red-950/20 dark:border-red-900/30 dark:text-red-400' :
|
|
324
|
+
isCompleted ? 'bg-green-500 border-green-500 text-white' :
|
|
325
|
+
isActive ? 'bg-blue-600 border-blue-600 text-white shadow-sm shadow-blue-500/20 animate-pulse' :
|
|
326
|
+
'bg-white border-gray-200 text-gray-400 dark:bg-zinc-800 dark:border-white/10 dark:text-gray-500'
|
|
327
|
+
}`}>
|
|
328
|
+
{isCompleted ? <Check size={14} /> : (idx + 1)}
|
|
329
|
+
</div>
|
|
330
|
+
<div className="min-w-0">
|
|
331
|
+
<div className={`text-xs font-semibold truncate ${isActive ? 'text-blue-600 dark:text-blue-400' : isCompleted ? 'text-gray-900 dark:text-gray-250 font-medium' : 'text-gray-500 dark:text-gray-400'}`}>
|
|
332
|
+
{stage.label}
|
|
333
|
+
</div>
|
|
334
|
+
<div className="text-[10px] text-gray-400 dark:text-gray-500 truncate">
|
|
335
|
+
{stage.desc}
|
|
336
|
+
</div>
|
|
337
|
+
</div>
|
|
338
|
+
{idx < stages.length - 1 && (
|
|
339
|
+
<div className="hidden md:block flex-1 h-[2px] mx-4 bg-gray-200 dark:bg-white/10 min-w-[20px]" />
|
|
340
|
+
)}
|
|
341
|
+
</div>
|
|
342
|
+
);
|
|
343
|
+
})}
|
|
344
|
+
</div>
|
|
345
|
+
</div>
|
|
346
|
+
|
|
347
|
+
{/* Plan Ready Action Card */}
|
|
348
|
+
{task.status === 'plan_ready' && (
|
|
349
|
+
<div className="p-4 md:p-5 mb-6 border border-blue-200 dark:border-blue-800 rounded-xl bg-blue-50/50 dark:bg-blue-900/10 shadow-sm backdrop-blur-sm shrink-0">
|
|
350
|
+
<h4 className="text-sm font-semibold text-blue-600 dark:text-blue-400 mb-3">Plan Ready for Review</h4>
|
|
351
|
+
{hasOutOfBounds ? (
|
|
352
|
+
<div className="flex items-start gap-3 p-3 mb-4 rounded-lg bg-red-50 text-red-650 dark:bg-red-900/20 dark:text-red-400 border border-red-100 dark:border-red-900/30">
|
|
353
|
+
<AlertTriangle className="size-5 shrink-0 mt-0.5" />
|
|
354
|
+
<div>
|
|
355
|
+
<strong className="text-sm font-semibold block">Warning: Out-of-bounds (Absolute) path detected!</strong>
|
|
356
|
+
<div className="text-xs mt-1 opacity-90">Approval is disabled to protect system files. Reject this task to force AI to rethink.</div>
|
|
357
|
+
</div>
|
|
358
|
+
</div>
|
|
359
|
+
) : (
|
|
360
|
+
<div className="mb-4 text-sm text-gray-700 dark:text-gray-300">Please review the planned file modifications below.</div>
|
|
361
|
+
)}
|
|
362
|
+
|
|
363
|
+
<div className="flex gap-3">
|
|
364
|
+
<button
|
|
365
|
+
className={`flex items-center px-4 py-2 text-sm font-medium rounded-lg text-white transition-colors ${hasOutOfBounds ? 'bg-blue-400 cursor-not-allowed opacity-50 dark:bg-blue-800' : 'bg-blue-600 hover:bg-blue-700 shadow-sm cursor-pointer'}`}
|
|
366
|
+
disabled={hasOutOfBounds}
|
|
367
|
+
onClick={() => onApproveTask(task.id)}
|
|
368
|
+
>
|
|
369
|
+
<Check size={16} className="mr-2" /> Approve & Start Coding
|
|
370
|
+
</button>
|
|
371
|
+
<button
|
|
372
|
+
className="flex items-center px-4 py-2 text-sm font-medium rounded-lg bg-gray-100 text-gray-700 hover:bg-gray-200 dark:bg-zinc-800 dark:text-gray-300 dark:hover:bg-zinc-700 transition-colors cursor-pointer"
|
|
373
|
+
onClick={() => setConfirmRejectTaskId(task.id)}
|
|
374
|
+
>
|
|
375
|
+
<X size={16} className="mr-2" /> Reject & Redo
|
|
376
|
+
</button>
|
|
377
|
+
</div>
|
|
378
|
+
</div>
|
|
379
|
+
)}
|
|
380
|
+
|
|
381
|
+
{/* Patch Ready Action Card */}
|
|
382
|
+
{task.status === 'patch_ready' && (
|
|
383
|
+
<div className="p-4 md:p-5 mb-6 border border-emerald-200 dark:border-emerald-800 rounded-xl bg-emerald-50/50 dark:bg-emerald-950/10 shadow-sm backdrop-blur-sm shrink-0">
|
|
384
|
+
<h4 className="text-sm font-semibold text-emerald-600 dark:text-emerald-400 mb-3">Proposed Patch Ready</h4>
|
|
385
|
+
<div className="mb-4 text-sm text-gray-700 dark:text-gray-300">
|
|
386
|
+
The code changes have been generated in memory. Please review the diffs in the <strong>File Changes</strong> tab.
|
|
387
|
+
</div>
|
|
388
|
+
|
|
389
|
+
<div className="flex gap-3">
|
|
390
|
+
<button
|
|
391
|
+
className="flex items-center px-4 py-2 text-sm font-medium rounded-lg text-white bg-emerald-600 hover:bg-emerald-700 shadow-sm transition-colors cursor-pointer"
|
|
392
|
+
onClick={() => onApprovePatch(task.id)}
|
|
393
|
+
>
|
|
394
|
+
<Check size={16} className="mr-2" /> Approve & Write Patch to Disk
|
|
395
|
+
</button>
|
|
396
|
+
<button
|
|
397
|
+
className="flex items-center px-4 py-2 text-sm font-medium rounded-lg bg-gray-100 text-gray-700 hover:bg-gray-200 dark:bg-zinc-800 dark:text-gray-300 dark:hover:bg-zinc-700 transition-colors cursor-pointer"
|
|
398
|
+
onClick={() => setConfirmRejectTaskId(task.id)}
|
|
399
|
+
>
|
|
400
|
+
<X size={16} className="mr-2" /> Reject & Redo
|
|
401
|
+
</button>
|
|
402
|
+
</div>
|
|
403
|
+
</div>
|
|
404
|
+
)}
|
|
405
|
+
|
|
406
|
+
{/* Tab Navigation */}
|
|
407
|
+
<div className="flex border-b border-gray-200 dark:border-white/10 mb-6 shrink-0">
|
|
408
|
+
<button
|
|
409
|
+
type="button"
|
|
410
|
+
onClick={() => setActiveTaskTab('plan')}
|
|
411
|
+
className={`flex items-center gap-2 px-4 py-2.5 text-sm font-semibold border-b-2 transition-all cursor-pointer ${
|
|
412
|
+
activeTaskTab === 'plan'
|
|
413
|
+
? 'border-blue-500 text-blue-600 dark:text-blue-400 font-bold'
|
|
414
|
+
: 'border-transparent text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200'
|
|
415
|
+
}`}
|
|
416
|
+
>
|
|
417
|
+
<FileText size={16} />
|
|
418
|
+
Plan & Steps
|
|
419
|
+
</button>
|
|
420
|
+
<button
|
|
421
|
+
type="button"
|
|
422
|
+
onClick={() => setActiveTaskTab('diff')}
|
|
423
|
+
className={`flex items-center gap-2 px-4 py-2.5 text-sm font-semibold border-b-2 transition-all cursor-pointer ${
|
|
424
|
+
activeTaskTab === 'diff'
|
|
425
|
+
? 'border-blue-500 text-blue-600 dark:text-blue-400 font-bold'
|
|
426
|
+
: 'border-transparent text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200'
|
|
427
|
+
}`}
|
|
428
|
+
>
|
|
429
|
+
<Code2 size={16} />
|
|
430
|
+
File Changes
|
|
431
|
+
{diffs.length > 0 && (
|
|
432
|
+
<span className="px-1.5 py-0.25 text-[10px] font-bold bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-350 rounded-full">
|
|
433
|
+
{diffs.length}
|
|
434
|
+
</span>
|
|
435
|
+
)}
|
|
436
|
+
</button>
|
|
437
|
+
</div>
|
|
438
|
+
|
|
439
|
+
{/* Tab Contents */}
|
|
440
|
+
<div className="flex-1 min-h-0">
|
|
441
|
+
{activeTaskTab === 'plan' ? (
|
|
442
|
+
<div className="space-y-6">
|
|
443
|
+
{/* Modified Files List */}
|
|
444
|
+
{taskFiles.length > 0 && (
|
|
445
|
+
<div>
|
|
446
|
+
<h4 className="text-sm font-bold text-gray-900 dark:text-white mb-3">Modified Files List</h4>
|
|
447
|
+
<div className="grid grid-cols-1 sm:grid-cols-2 gap-2">
|
|
448
|
+
{taskFiles.map((fileObj, idx) => {
|
|
449
|
+
const isAbsolute = isAbsolutePath(fileObj.path);
|
|
450
|
+
const action = fileObj.action;
|
|
451
|
+
return (
|
|
452
|
+
<div
|
|
453
|
+
key={idx}
|
|
454
|
+
className={`flex items-center justify-between p-3 rounded-lg border bg-gray-50/50 dark:bg-zinc-900/40 ${
|
|
455
|
+
isAbsolute ? 'border-red-200 dark:border-red-900/30' : 'border-gray-200 dark:border-white/5'
|
|
456
|
+
}`}
|
|
457
|
+
>
|
|
458
|
+
<span className={`text-xs font-mono truncate mr-2 ${isAbsolute ? 'text-red-650 dark:text-red-400 font-semibold' : 'text-gray-800 dark:text-gray-300'}`}>
|
|
459
|
+
{fileObj.path}
|
|
460
|
+
</span>
|
|
461
|
+
<span className={`text-[10px] font-bold uppercase px-1.5 py-0.5 rounded shrink-0 ${
|
|
462
|
+
action === 'delete' ? 'bg-red-50 text-red-650 dark:bg-red-950/30 dark:text-red-400' :
|
|
463
|
+
action === 'create' ? 'bg-green-50 text-green-655 dark:bg-green-950/30 dark:text-green-400' :
|
|
464
|
+
'bg-blue-50 text-blue-650 dark:bg-blue-950/30 dark:text-blue-400'
|
|
465
|
+
}`}>
|
|
466
|
+
{action || 'modify'}
|
|
467
|
+
</span>
|
|
468
|
+
</div>
|
|
469
|
+
);
|
|
470
|
+
})}
|
|
471
|
+
</div>
|
|
472
|
+
</div>
|
|
473
|
+
)}
|
|
474
|
+
|
|
475
|
+
{/* Implementation Plan steps list */}
|
|
476
|
+
{planSteps ? (
|
|
477
|
+
<div>
|
|
478
|
+
<h4 className="text-sm font-bold text-gray-900 dark:text-white mb-4">Implementation Plan</h4>
|
|
479
|
+
<ul className="space-y-3">
|
|
480
|
+
{planSteps.map((step, idx) => {
|
|
481
|
+
const file = Array.isArray(step.file) ? step.file[0] : step.file;
|
|
482
|
+
const isAbsolute = isAbsolutePath(file);
|
|
483
|
+
const isDelete = step.action === 'delete';
|
|
484
|
+
const isCreate = step.action === 'create';
|
|
485
|
+
const isExpanded = !!expandedSteps[idx];
|
|
486
|
+
|
|
487
|
+
const log = task.coding_log?.find(l => l.step === step.step);
|
|
488
|
+
|
|
489
|
+
let stepStatus = 'waiting';
|
|
490
|
+
if (log) {
|
|
491
|
+
stepStatus = log.status || 'done';
|
|
492
|
+
} else if (task.status === 'coding' && task.failed_step_index === idx) {
|
|
493
|
+
stepStatus = 'failed';
|
|
494
|
+
} else if (task.status === 'coding' && idx < (task.failed_step_index || 0)) {
|
|
495
|
+
stepStatus = 'done';
|
|
496
|
+
} else if (['done', 'testing', 'fixing', 'archiving', 'summarizing'].includes(task.status)) {
|
|
497
|
+
stepStatus = 'done';
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
return (
|
|
501
|
+
<li key={idx}>
|
|
502
|
+
<button
|
|
503
|
+
type="button"
|
|
504
|
+
onClick={() => toggleStep(idx)}
|
|
505
|
+
className={`w-full text-left p-4 rounded-xl bg-gray-50 dark:bg-zinc-900 border transition-colors hover:border-gray-300 dark:hover:border-zinc-700 ${isAbsolute ? 'border-red-500 shadow-sm shadow-red-500/10' : 'border-gray-200 dark:border-white/5'}`}
|
|
506
|
+
aria-expanded={isExpanded}
|
|
507
|
+
aria-label={`Toggle Step ${step.step} details`}
|
|
508
|
+
>
|
|
509
|
+
<span className="block flex items-start justify-between gap-4 mb-2">
|
|
510
|
+
<span className="flex items-center font-semibold text-xs md:text-sm">
|
|
511
|
+
<span className="text-gray-500 dark:text-gray-400 mr-2 shrink-0">Step {step.step}</span>
|
|
512
|
+
<span className={`px-2 py-0.5 rounded text-[10px] md:text-xs font-bold uppercase mr-2 ${isDelete ? 'bg-red-100 text-red-650 dark:bg-red-950/30 dark:text-red-400' : isCreate ? 'bg-green-100 text-green-655 dark:bg-green-950/30 dark:text-green-400' : 'bg-blue-100 text-blue-650 dark:bg-blue-950/30 dark:text-blue-400'}`}>
|
|
513
|
+
{step.action}
|
|
514
|
+
</span>
|
|
515
|
+
<span className={`px-1.5 py-0.5 rounded text-[10px] md:text-xs font-semibold ${stepStatus === 'done' ? 'bg-green-50 text-green-700 dark:bg-green-950/30 dark:text-green-400' : stepStatus === 'failed' ? 'bg-red-50 text-red-700 dark:bg-red-950/30 dark:text-red-400' : 'bg-gray-100 text-gray-500 dark:bg-zinc-800 dark:text-gray-400'}`}>
|
|
516
|
+
{stepStatus === 'done' ? 'Completed' : stepStatus === 'failed' ? 'Failed' : 'Pending'}
|
|
517
|
+
</span>
|
|
518
|
+
</span>
|
|
519
|
+
<span className={`text-[10px] md:text-xs font-mono break-all text-right max-w-[50%] ${isAbsolute ? 'text-red-600 dark:text-red-400 font-bold' : 'text-gray-800 dark:text-gray-200'}`}>
|
|
520
|
+
{file}
|
|
521
|
+
</span>
|
|
522
|
+
</span>
|
|
523
|
+
<span className="block text-xs md:text-sm text-gray-650 dark:text-gray-405 leading-relaxed mt-2 flex items-center justify-between">
|
|
524
|
+
<span>{step.description}</span>
|
|
525
|
+
<span className="text-gray-400 dark:text-gray-500 shrink-0 ml-2">
|
|
526
|
+
{isExpanded ? <ChevronDown size={14} /> : <ChevronRight size={14} />}
|
|
527
|
+
</span>
|
|
528
|
+
</span>
|
|
529
|
+
|
|
530
|
+
{isExpanded && (
|
|
531
|
+
<span className="block mt-3 pt-3 border-t border-gray-200 dark:border-white/5 text-xs text-gray-500 dark:text-gray-400 space-y-2">
|
|
532
|
+
<span className="flex justify-between">
|
|
533
|
+
<span>Action: <span className="font-mono text-gray-700 dark:text-gray-300">{step.action}</span></span>
|
|
534
|
+
{log?.lines_changed && <span>Lines modified: <span className="font-mono text-gray-700 dark:text-gray-300">+{log.lines_changed}</span></span>}
|
|
535
|
+
</span>
|
|
536
|
+
{log?.timestamp && (
|
|
537
|
+
<span className="block">Completed at: <span className="font-mono text-gray-750 dark:text-gray-300">{new Date(log.timestamp).toLocaleString()}</span></span>
|
|
538
|
+
)}
|
|
539
|
+
{stepStatus === 'failed' && task.error && (
|
|
540
|
+
<span className="block p-2.5 mt-1 bg-red-50 text-red-700 dark:bg-red-950/20 dark:text-red-400 rounded border border-red-100 dark:border-red-900/30 font-mono text-[10px] whitespace-pre-wrap break-all">
|
|
541
|
+
<strong>Error log:</strong> {String(task.error)}
|
|
542
|
+
</span>
|
|
543
|
+
)}
|
|
544
|
+
</span>
|
|
545
|
+
)}
|
|
546
|
+
</button>
|
|
547
|
+
</li>
|
|
548
|
+
);
|
|
549
|
+
})}
|
|
550
|
+
</ul>
|
|
551
|
+
</div>
|
|
552
|
+
) : null}
|
|
553
|
+
</div>
|
|
554
|
+
) : (
|
|
555
|
+
/* Diff Tab */
|
|
556
|
+
<div className="space-y-6">
|
|
557
|
+
{isLoadingDiffs ? (
|
|
558
|
+
<div className="flex flex-col items-center justify-center py-12 text-gray-500 dark:text-gray-400">
|
|
559
|
+
<RefreshCw size={24} className="animate-spin mb-3 text-blue-500" />
|
|
560
|
+
<span className="text-xs font-semibold">Loading modified file diffs...</span>
|
|
561
|
+
</div>
|
|
562
|
+
) : diffs.length === 0 ? (
|
|
563
|
+
<div className="flex flex-col items-center justify-center py-16 border border-dashed border-gray-200 dark:border-white/10 rounded-xl bg-gray-50/50 dark:bg-zinc-900/10">
|
|
564
|
+
<Code2 size={36} className="text-gray-300 dark:text-gray-600 mb-3" />
|
|
565
|
+
<span className="text-sm font-semibold text-gray-600 dark:text-gray-400">No code changes recorded yet</span>
|
|
566
|
+
<span className="text-xs text-gray-400 dark:text-gray-500 mt-1 max-w-xs text-center leading-relaxed">
|
|
567
|
+
Changes will be generated dynamically once the coding process gets underway.
|
|
568
|
+
</span>
|
|
569
|
+
</div>
|
|
570
|
+
) : (
|
|
571
|
+
<div className="space-y-4">
|
|
572
|
+
{diffs.map((diff, index) => {
|
|
573
|
+
const isExpanded = expandedDiffs[diff.file] !== false;
|
|
574
|
+
const isNewFile = !diff.oldContent && diff.newContent;
|
|
575
|
+
const isDeletedFile = diff.oldContent && !diff.newContent;
|
|
576
|
+
|
|
577
|
+
return (
|
|
578
|
+
<div
|
|
579
|
+
key={index}
|
|
580
|
+
className="border border-gray-200 dark:border-white/10 rounded-xl overflow-hidden shadow-sm bg-white dark:bg-zinc-900"
|
|
581
|
+
>
|
|
582
|
+
{/* File Header */}
|
|
583
|
+
<button
|
|
584
|
+
type="button"
|
|
585
|
+
onClick={() => toggleDiff(diff.file)}
|
|
586
|
+
className="w-full text-left flex items-center justify-between px-4 py-3 bg-gray-50/80 dark:bg-zinc-900/80 border-b border-gray-200 dark:border-white/10 select-none cursor-pointer"
|
|
587
|
+
aria-expanded={isExpanded}
|
|
588
|
+
aria-label={`Toggle diff for ${diff.file}`}
|
|
589
|
+
>
|
|
590
|
+
<span className="flex items-center gap-2 min-w-0">
|
|
591
|
+
{isExpanded ? <ChevronDown size={14} className="text-gray-500" /> : <ChevronRight size={14} className="text-gray-500" />}
|
|
592
|
+
<span className="text-xs font-bold font-mono text-gray-800 dark:text-gray-250 truncate">
|
|
593
|
+
{diff.file}
|
|
594
|
+
</span>
|
|
595
|
+
{isNewFile && (
|
|
596
|
+
<span className="px-1.5 py-0.5 rounded text-[9px] font-bold bg-green-150 text-green-700 dark:bg-green-950/40 dark:text-green-400 uppercase tracking-wide shrink-0">
|
|
597
|
+
New File
|
|
598
|
+
</span>
|
|
599
|
+
)}
|
|
600
|
+
{isDeletedFile && (
|
|
601
|
+
<span className="px-1.5 py-0.5 rounded text-[9px] font-bold bg-red-100 text-red-750 dark:bg-red-950/40 dark:text-red-400 uppercase tracking-wide shrink-0">
|
|
602
|
+
Deleted
|
|
603
|
+
</span>
|
|
604
|
+
)}
|
|
605
|
+
</span>
|
|
606
|
+
<span className="text-[10px] text-gray-400 dark:text-gray-500 font-medium">
|
|
607
|
+
{isExpanded ? 'Collapse' : 'Expand'}
|
|
608
|
+
</span>
|
|
609
|
+
</button>
|
|
610
|
+
|
|
611
|
+
{/* ReactDiffViewer */}
|
|
612
|
+
{isExpanded && (
|
|
613
|
+
<div className="overflow-x-auto text-[12px] font-mono">
|
|
614
|
+
<ReactDiffViewer
|
|
615
|
+
oldValue={typeof diff.oldContent === 'string' ? diff.oldContent : String(diff.oldContent || '')}
|
|
616
|
+
newValue={typeof diff.newContent === 'string' ? diff.newContent : String(diff.newContent || '')}
|
|
617
|
+
splitView={true}
|
|
618
|
+
useDarkTheme={isDarkMode}
|
|
619
|
+
leftTitle="Original"
|
|
620
|
+
rightTitle="Modified"
|
|
621
|
+
styles={{
|
|
622
|
+
variables: {
|
|
623
|
+
dark: {
|
|
624
|
+
diffViewerBackground: '#09090b',
|
|
625
|
+
addedBackground: '#042f1a',
|
|
626
|
+
addedColor: '#4ade80',
|
|
627
|
+
removedBackground: '#4c0519',
|
|
628
|
+
removedColor: '#f43f5e',
|
|
629
|
+
wordAddedBackground: '#064e3b',
|
|
630
|
+
wordRemovedBackground: '#881337',
|
|
631
|
+
},
|
|
632
|
+
light: {
|
|
633
|
+
diffViewerBackground: '#ffffff',
|
|
634
|
+
addedBackground: '#e6ffec',
|
|
635
|
+
addedColor: '#24292e',
|
|
636
|
+
removedBackground: '#ffeef0',
|
|
637
|
+
removedColor: '#24292e',
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}}
|
|
641
|
+
/>
|
|
642
|
+
</div>
|
|
643
|
+
)}
|
|
644
|
+
</div>
|
|
645
|
+
);
|
|
646
|
+
})}
|
|
647
|
+
</div>
|
|
648
|
+
)}
|
|
649
|
+
</div>
|
|
650
|
+
)}
|
|
651
|
+
</div>
|
|
652
|
+
|
|
653
|
+
{/* Collapsible Developer Details */}
|
|
654
|
+
<div className="mt-8 border border-gray-200 dark:border-white/10 rounded-xl overflow-hidden bg-gray-50 dark:bg-zinc-900/20 shrink-0">
|
|
655
|
+
<div className="w-full flex items-center justify-between px-4 py-3 bg-transparent border-b border-gray-200 dark:border-white/5">
|
|
656
|
+
<button
|
|
657
|
+
type="button"
|
|
658
|
+
onClick={() => setShowRaw(!showRaw)}
|
|
659
|
+
className="flex items-center gap-2 text-sm font-semibold text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white transition-colors cursor-pointer"
|
|
660
|
+
aria-expanded={showRaw}
|
|
661
|
+
aria-label="Toggle developer details JSON"
|
|
662
|
+
>
|
|
663
|
+
{showRaw ? <ChevronDown size={14} /> : <ChevronRight size={14} />}
|
|
664
|
+
Developer Details
|
|
665
|
+
</button>
|
|
666
|
+
{showRaw && (
|
|
667
|
+
<button
|
|
668
|
+
type="button"
|
|
669
|
+
onClick={(e) => handleCopy(e, task)}
|
|
670
|
+
className="flex items-center gap-1.5 px-2.5 py-1 text-xs bg-white border border-gray-200 dark:bg-zinc-800 dark:border-white/10 rounded hover:bg-gray-50 dark:hover:bg-zinc-700 text-gray-600 dark:text-gray-300 shadow-sm transition-colors cursor-pointer"
|
|
671
|
+
aria-label="Copy developer details JSON"
|
|
672
|
+
>
|
|
673
|
+
<Copy size={12} />
|
|
674
|
+
{copied ? 'Copied!' : 'Copy JSON'}
|
|
675
|
+
</button>
|
|
676
|
+
)}
|
|
677
|
+
</div>
|
|
678
|
+
{showRaw && (
|
|
679
|
+
<pre className="text-[11px] whitespace-pre-wrap bg-gray-100 dark:bg-zinc-900 text-gray-800 dark:text-gray-350 p-4 overflow-x-auto border-t border-gray-200 dark:border-white/5 shadow-inner font-mono">
|
|
680
|
+
{JSON.stringify(task, null, 2)}
|
|
681
|
+
</pre>
|
|
682
|
+
)}
|
|
683
|
+
</div>
|
|
684
|
+
</div>
|
|
685
|
+
);
|
|
686
|
+
};
|
|
687
|
+
|
|
688
|
+
return (
|
|
689
|
+
<div className="flex h-full overflow-hidden bg-white dark:bg-zinc-950 w-full">
|
|
690
|
+
<div className={`transition-all duration-300 flex flex-col border-r border-gray-200 dark:border-white/10 bg-gray-50 dark:bg-zinc-900 overflow-hidden ${isTaskListFolded ? 'w-0 border-r-0' : 'w-[280px] md:w-[320px]'}`}>
|
|
691
|
+
<div className="p-4 border-b border-gray-200 dark:border-white/10 bg-white/50 dark:bg-zinc-950/50 backdrop-blur-sm">
|
|
692
|
+
<div className="flex items-center justify-between gap-2 mb-4">
|
|
693
|
+
<div className="flex items-center gap-2">
|
|
694
|
+
<span className={`relative flex h-2.5 w-2.5`}>
|
|
695
|
+
{isRunning && <span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75"></span>}
|
|
696
|
+
<span className={`relative inline-flex rounded-full h-2.5 w-2.5 ${isRunning ? 'bg-green-500' : 'bg-gray-400'}`}></span>
|
|
697
|
+
</span>
|
|
698
|
+
<span className="text-sm font-semibold text-gray-900 dark:text-white">{isRunning ? 'Loop is Running' : 'Loop is Idle'}</span>
|
|
699
|
+
</div>
|
|
700
|
+
<button
|
|
701
|
+
type="button"
|
|
702
|
+
onClick={() => setIsTaskListFolded(true)}
|
|
703
|
+
className="p-1 rounded hover:bg-gray-200 dark:hover:bg-zinc-800 text-gray-500 dark:text-gray-400 cursor-pointer"
|
|
704
|
+
aria-label="Collapse task list sidebar"
|
|
705
|
+
>
|
|
706
|
+
<PanelLeftClose size={16} />
|
|
707
|
+
</button>
|
|
708
|
+
</div>
|
|
709
|
+
<div className="grid grid-cols-2 gap-2 mb-2">
|
|
710
|
+
<button
|
|
711
|
+
type="button"
|
|
712
|
+
className={`flex justify-center items-center px-3 py-1.5 rounded-md text-sm font-medium transition-colors ${isRunning ? 'bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-zinc-800 dark:text-gray-600' : 'bg-white border border-gray-200 text-gray-700 hover:bg-gray-50 shadow-sm dark:bg-zinc-800 dark:border-white/10 dark:text-gray-200 dark:hover:bg-zinc-700'}`}
|
|
713
|
+
onClick={onStartAll}
|
|
714
|
+
disabled={isRunning}
|
|
715
|
+
aria-label="Start all task loops"
|
|
716
|
+
>
|
|
717
|
+
<Play size={14} className="mr-1.5 text-green-500" /> 全部开始
|
|
718
|
+
</button>
|
|
719
|
+
<button
|
|
720
|
+
type="button"
|
|
721
|
+
className={`flex justify-center items-center px-3 py-1.5 rounded-md text-sm font-medium transition-colors cursor-pointer ${!isRunning ? 'bg-gray-100 text-gray-400 cursor-not-allowed dark:bg-zinc-800 dark:text-gray-600' : 'bg-white border border-gray-200 text-red-650 hover:bg-red-50 shadow-sm dark:bg-zinc-800 dark:border-white/10 dark:text-red-400 dark:hover:bg-red-900/20'}`}
|
|
722
|
+
onClick={() => setShowStopAllConfirm(true)}
|
|
723
|
+
disabled={!isRunning}
|
|
724
|
+
aria-label="Stop all task loops"
|
|
725
|
+
>
|
|
726
|
+
<Square size={14} className="mr-1.5 text-red-500" /> 全部停止
|
|
727
|
+
</button>
|
|
728
|
+
</div>
|
|
729
|
+
<button
|
|
730
|
+
type="button"
|
|
731
|
+
className="flex w-full justify-center items-center px-3 py-1.5 rounded-md text-sm font-medium bg-gray-200 text-gray-800 hover:bg-gray-300 dark:bg-zinc-800 dark:text-gray-200 dark:hover:bg-zinc-700 transition-colors shadow-sm cursor-pointer"
|
|
732
|
+
onClick={onTriggerLoop}
|
|
733
|
+
aria-label="Trigger single loop execution"
|
|
734
|
+
>
|
|
735
|
+
<Zap size={14} className="mr-1.5" /> Trigger Once
|
|
736
|
+
</button>
|
|
737
|
+
</div>
|
|
738
|
+
|
|
739
|
+
<div className="flex-1 overflow-y-auto">
|
|
740
|
+
{isLoadingTasks ? (
|
|
741
|
+
<div className="p-4 space-y-3 animate-pulse">
|
|
742
|
+
{[1, 2, 3, 4].map(n => (
|
|
743
|
+
<div key={n} className="p-3 border border-gray-150 dark:border-white/5 rounded-lg bg-white/40 dark:bg-zinc-800/40">
|
|
744
|
+
<div className="h-4 bg-gray-250 dark:bg-zinc-700 rounded w-3/4 mb-2"></div>
|
|
745
|
+
<div className="h-3 bg-gray-200 dark:bg-zinc-750 rounded w-1/2"></div>
|
|
746
|
+
</div>
|
|
747
|
+
))}
|
|
748
|
+
</div>
|
|
749
|
+
) : tasks.length === 0 ? (
|
|
750
|
+
<div className="p-8 text-center text-gray-500 dark:text-gray-400">
|
|
751
|
+
<div className="text-sm font-medium mb-2 text-gray-700 dark:text-gray-300">No active tasks</div>
|
|
752
|
+
<div className="text-xs leading-relaxed">Click "Trigger Once" to spawn a new agent task.</div>
|
|
753
|
+
</div>
|
|
754
|
+
) : (
|
|
755
|
+
tasks.map(task => (
|
|
756
|
+
<button
|
|
757
|
+
key={task.id}
|
|
758
|
+
type="button"
|
|
759
|
+
onClick={() => onSelectTask(task.id)}
|
|
760
|
+
aria-label={`Select task: ${task.plan?.title || task.suggestion?.title || 'Untitled Task'}`}
|
|
761
|
+
className={`w-full text-left p-4 border-b border-gray-200 dark:border-white/10 cursor-pointer transition-colors ${activeTaskId === task.id ? 'bg-white dark:bg-zinc-950 border-l-4 border-l-blue-500' : 'hover:bg-gray-100 dark:hover:bg-zinc-800 border-l-4 border-l-transparent'}`}
|
|
762
|
+
>
|
|
763
|
+
<span className={`block text-sm mb-1.5 truncate ${activeTaskId === task.id ? 'font-semibold text-gray-900 dark:text-white' : 'font-medium text-gray-700 dark:text-gray-300'}`}>
|
|
764
|
+
{task.plan?.title || task.suggestion?.title || 'Untitled Task'}
|
|
765
|
+
</span>
|
|
766
|
+
<span className="flex items-center text-xs font-medium">
|
|
767
|
+
{task.status === 'plan_ready' ? (
|
|
768
|
+
<><span className="w-1.5 h-1.5 rounded-full bg-blue-500 mr-2"></span><span className="text-blue-600 dark:text-blue-400">Awaiting Review</span></>
|
|
769
|
+
) : task.status === 'patch_ready' ? (
|
|
770
|
+
<><span className="w-1.5 h-1.5 rounded-full bg-emerald-500 mr-2"></span><span className="text-emerald-600 dark:text-emerald-400 font-semibold">Patch Ready</span></>
|
|
771
|
+
) : task.status === 'coding' ? (
|
|
772
|
+
<><span className="w-1.5 h-1.5 rounded-full bg-indigo-500 mr-2 animate-pulse"></span><span className="text-indigo-600 dark:text-indigo-400">Coding...</span></>
|
|
773
|
+
) : task.status === 'failed' ? (
|
|
774
|
+
<><span className="w-1.5 h-1.5 rounded-full bg-red-500 mr-2"></span><span className="text-red-600 dark:text-red-400">Failed</span></>
|
|
775
|
+
) : task.status === 'done' ? (
|
|
776
|
+
<><span className="w-1.5 h-1.5 rounded-full bg-green-500 mr-2"></span><span className="text-green-600 dark:text-green-400">Completed</span></>
|
|
777
|
+
) : (
|
|
778
|
+
<><span className="w-1.5 h-1.5 rounded-full bg-gray-400 mr-2"></span><span className="text-gray-500 dark:text-gray-400 capitalize">{task.status.replace('_', ' ')}</span></>
|
|
779
|
+
)}
|
|
780
|
+
</span>
|
|
781
|
+
</button>
|
|
782
|
+
))
|
|
783
|
+
)}
|
|
784
|
+
</div>
|
|
785
|
+
</div>
|
|
786
|
+
|
|
787
|
+
{activeTask ? renderTaskDetails(activeTask) : (
|
|
788
|
+
<div className="flex-1 flex flex-col items-center justify-center bg-gray-50 dark:bg-zinc-950 text-gray-500 dark:text-gray-400 p-8 text-center relative">
|
|
789
|
+
{isTaskListFolded && (
|
|
790
|
+
<button
|
|
791
|
+
type="button"
|
|
792
|
+
onClick={() => setIsTaskListFolded(false)}
|
|
793
|
+
className="absolute top-4 left-4 p-1.5 rounded-lg border border-gray-200 dark:border-white/10 hover:bg-gray-100 dark:hover:bg-zinc-800 text-gray-500 dark:text-gray-400 cursor-pointer"
|
|
794
|
+
aria-label="Expand task list sidebar"
|
|
795
|
+
>
|
|
796
|
+
<PanelLeftOpen size={18} />
|
|
797
|
+
</button>
|
|
798
|
+
)}
|
|
799
|
+
<div className="p-6 bg-white dark:bg-zinc-900 rounded-full mb-6 shadow-sm border border-gray-100 dark:border-white/5">
|
|
800
|
+
<Zap size={32} className="text-gray-300 dark:text-gray-600" />
|
|
801
|
+
</div>
|
|
802
|
+
<h3 className="text-lg font-semibold text-gray-700 dark:text-gray-300 mb-2">Select a task</h3>
|
|
803
|
+
<p className="text-sm max-w-sm leading-relaxed">Click on a task from the left sidebar to view its plan and progress.</p>
|
|
804
|
+
</div>
|
|
805
|
+
)}
|
|
806
|
+
|
|
807
|
+
<ConfirmationModal
|
|
808
|
+
isOpen={confirmStopTaskId !== null}
|
|
809
|
+
title="Pause Agent Task"
|
|
810
|
+
message="Are you sure you want to pause execution for this active task? You can resume or retry it later."
|
|
811
|
+
confirmText="Pause Task"
|
|
812
|
+
cancelText="Cancel"
|
|
813
|
+
onConfirm={() => {
|
|
814
|
+
onStopTask(confirmStopTaskId);
|
|
815
|
+
setConfirmStopTaskId(null);
|
|
816
|
+
}}
|
|
817
|
+
onCancel={() => setConfirmStopTaskId(null)}
|
|
818
|
+
isDestructive={true}
|
|
819
|
+
/>
|
|
820
|
+
|
|
821
|
+
<ConfirmationModal
|
|
822
|
+
isOpen={confirmRejectTaskId !== null}
|
|
823
|
+
title="Reject Implementation Plan"
|
|
824
|
+
message="Are you sure you want to reject this plan? The agent will discard this plan and attempt to rethink/redo the implementation."
|
|
825
|
+
confirmText="Reject & Redo"
|
|
826
|
+
cancelText="Cancel"
|
|
827
|
+
onConfirm={() => {
|
|
828
|
+
onRejectTask(confirmRejectTaskId);
|
|
829
|
+
setConfirmRejectTaskId(null);
|
|
830
|
+
}}
|
|
831
|
+
onCancel={() => setConfirmRejectTaskId(null)}
|
|
832
|
+
isDestructive={true}
|
|
833
|
+
/>
|
|
834
|
+
|
|
835
|
+
<ConfirmationModal
|
|
836
|
+
isOpen={showStopAllConfirm}
|
|
837
|
+
title="Stop All Running Loops"
|
|
838
|
+
message="Are you sure you want to stop all active task loops? This will interrupt any running agent processes immediately."
|
|
839
|
+
confirmText="Stop All"
|
|
840
|
+
cancelText="Cancel"
|
|
841
|
+
onConfirm={() => {
|
|
842
|
+
onStopAll();
|
|
843
|
+
setShowStopAllConfirm(false);
|
|
844
|
+
}}
|
|
845
|
+
onCancel={() => setShowStopAllConfirm(false)}
|
|
846
|
+
isDestructive={true}
|
|
847
|
+
/>
|
|
848
|
+
<ConfirmationModal
|
|
849
|
+
isOpen={confirmDeleteTaskId !== null}
|
|
850
|
+
title="Delete Task History"
|
|
851
|
+
message="Are you sure you want to delete this task? This will remove it from the active list. You can restore it later if needed."
|
|
852
|
+
confirmText="Delete Task"
|
|
853
|
+
cancelText="Cancel"
|
|
854
|
+
onConfirm={() => {
|
|
855
|
+
onDeleteTask(confirmDeleteTaskId);
|
|
856
|
+
setConfirmDeleteTaskId(null);
|
|
857
|
+
}}
|
|
858
|
+
onCancel={() => setConfirmDeleteTaskId(null)}
|
|
859
|
+
isDestructive={true}
|
|
860
|
+
/>
|
|
861
|
+
</div>
|
|
862
|
+
);
|
|
863
|
+
}
|