@xyit/wellspring 0.0.0-stage → 1.1.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/LICENSE +21 -0
- package/README.md +853 -2
- package/dist/agent/pending-asks.d.ts +20 -0
- package/dist/agent/pending-asks.js +70 -0
- package/dist/agent/pending-asks.js.map +1 -0
- package/dist/agent/task-registry.d.ts +14 -0
- package/dist/agent/task-registry.js +80 -0
- package/dist/agent/task-registry.js.map +1 -0
- package/dist/agent/tool-context.d.ts +30 -0
- package/dist/agent/tool-context.js +10 -0
- package/dist/agent/tool-context.js.map +1 -0
- package/dist/agent/usage.d.ts +40 -0
- package/dist/agent/usage.js +122 -0
- package/dist/agent/usage.js.map +1 -0
- package/dist/api/host/agent.d.ts +165 -0
- package/dist/api/host/agent.js +5 -0
- package/dist/api/host/agent.js.map +1 -0
- package/dist/api/host/events.d.ts +2 -0
- package/dist/api/host/events.js +6 -0
- package/dist/api/host/events.js.map +1 -0
- package/dist/api/host/exec.d.ts +36 -0
- package/dist/api/host/exec.js +10 -0
- package/dist/api/host/exec.js.map +1 -0
- package/dist/api/host/fs.d.ts +24 -0
- package/dist/api/host/fs.js +7 -0
- package/dist/api/host/fs.js.map +1 -0
- package/dist/api/host/hooks.d.ts +210 -0
- package/dist/api/host/hooks.js +401 -0
- package/dist/api/host/hooks.js.map +1 -0
- package/dist/api/host/host.d.ts +36 -0
- package/dist/api/host/host.js +53 -0
- package/dist/api/host/host.js.map +1 -0
- package/dist/api/host/http.d.ts +58 -0
- package/dist/api/host/http.js +6 -0
- package/dist/api/host/http.js.map +1 -0
- package/dist/api/host/index.d.ts +15 -0
- package/dist/api/host/index.js +20 -0
- package/dist/api/host/index.js.map +1 -0
- package/dist/api/host/models.d.ts +65 -0
- package/dist/api/host/models.js +8 -0
- package/dist/api/host/models.js.map +1 -0
- package/dist/api/host/network.d.ts +22 -0
- package/dist/api/host/network.js +7 -0
- package/dist/api/host/network.js.map +1 -0
- package/dist/api/host/plugin.d.ts +138 -0
- package/dist/api/host/plugin.js +6 -0
- package/dist/api/host/plugin.js.map +1 -0
- package/dist/api/host/plugins.d.ts +49 -0
- package/dist/api/host/plugins.js +6 -0
- package/dist/api/host/plugins.js.map +1 -0
- package/dist/api/host/pty.d.ts +55 -0
- package/dist/api/host/pty.js +21 -0
- package/dist/api/host/pty.js.map +1 -0
- package/dist/api/host/session.d.ts +5 -0
- package/dist/api/host/session.js +52 -0
- package/dist/api/host/session.js.map +1 -0
- package/dist/api/host/version.d.ts +2 -0
- package/dist/api/host/version.js +3 -0
- package/dist/api/host/version.js.map +1 -0
- package/dist/api/host/workspace.d.ts +38 -0
- package/dist/api/host/workspace.js +9 -0
- package/dist/api/host/workspace.js.map +1 -0
- package/dist/api/plugin/http-client.d.ts +42 -0
- package/dist/api/plugin/http-client.js +364 -0
- package/dist/api/plugin/http-client.js.map +1 -0
- package/dist/api/plugin/http-protocol.d.ts +152 -0
- package/dist/api/plugin/http-protocol.js +49 -0
- package/dist/api/plugin/http-protocol.js.map +1 -0
- package/dist/api/result/result.d.ts +16 -0
- package/dist/api/result/result.js +43 -0
- package/dist/api/result/result.js.map +1 -0
- package/dist/commands/agent-turn.d.ts +63 -0
- package/dist/commands/agent-turn.js +687 -0
- package/dist/commands/agent-turn.js.map +1 -0
- package/dist/commands/ask-prompt.d.ts +6 -0
- package/dist/commands/ask-prompt.js +49 -0
- package/dist/commands/ask-prompt.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.js +283 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/conversation.d.ts +51 -0
- package/dist/commands/conversation.js +630 -0
- package/dist/commands/conversation.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +77 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/exec-approval.d.ts +3 -0
- package/dist/commands/exec-approval.js +80 -0
- package/dist/commands/exec-approval.js.map +1 -0
- package/dist/commands/help.d.ts +2 -0
- package/dist/commands/help.js +35 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/key.d.ts +2 -0
- package/dist/commands/key.js +226 -0
- package/dist/commands/key.js.map +1 -0
- package/dist/commands/plugin.d.ts +2 -0
- package/dist/commands/plugin.js +190 -0
- package/dist/commands/plugin.js.map +1 -0
- package/dist/commands/session.d.ts +2 -0
- package/dist/commands/session.js +167 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/shared.d.ts +35 -0
- package/dist/commands/shared.js +66 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/start.d.ts +2 -0
- package/dist/commands/start.js +75 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/stop.d.ts +2 -0
- package/dist/commands/stop.js +24 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/version.d.ts +2 -0
- package/dist/commands/version.js +33 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/config/codes.d.ts +13 -0
- package/dist/config/codes.js +15 -0
- package/dist/config/codes.js.map +1 -0
- package/dist/config/credentials.d.ts +67 -0
- package/dist/config/credentials.js +214 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/config/defaults.d.ts +5 -0
- package/dist/config/defaults.js +31 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.js +10 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +10 -0
- package/dist/config/loader.js +68 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/providers.d.ts +30 -0
- package/dist/config/providers.js +97 -0
- package/dist/config/providers.js.map +1 -0
- package/dist/config/types.d.ts +75 -0
- package/dist/config/types.js +4 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validate.d.ts +4 -0
- package/dist/config/validate.js +391 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/display/markdown.d.ts +7 -0
- package/dist/display/markdown.js +116 -0
- package/dist/display/markdown.js.map +1 -0
- package/dist/display/tool-label.d.ts +6 -0
- package/dist/display/tool-label.js +81 -0
- package/dist/display/tool-label.js.map +1 -0
- package/dist/event/event.d.ts +27 -0
- package/dist/event/event.js +152 -0
- package/dist/event/event.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +308 -0
- package/dist/index.js.map +1 -0
- package/dist/input/codes.d.ts +15 -0
- package/dist/input/codes.js +20 -0
- package/dist/input/codes.js.map +1 -0
- package/dist/input/commands.d.ts +10 -0
- package/dist/input/commands.js +65 -0
- package/dist/input/commands.js.map +1 -0
- package/dist/input/help.d.ts +8 -0
- package/dist/input/help.js +51 -0
- package/dist/input/help.js.map +1 -0
- package/dist/input/index.d.ts +6 -0
- package/dist/input/index.js +10 -0
- package/dist/input/index.js.map +1 -0
- package/dist/input/parse-options.d.ts +11 -0
- package/dist/input/parse-options.js +51 -0
- package/dist/input/parse-options.js.map +1 -0
- package/dist/input/parse.d.ts +3 -0
- package/dist/input/parse.js +119 -0
- package/dist/input/parse.js.map +1 -0
- package/dist/input/types.d.ts +17 -0
- package/dist/input/types.js +2 -0
- package/dist/input/types.js.map +1 -0
- package/dist/logger/elog4js.d.ts +65 -0
- package/dist/logger/elog4js.js +305 -0
- package/dist/logger/elog4js.js.map +1 -0
- package/dist/logger/logger.d.ts +37 -0
- package/dist/logger/logger.js +196 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/network/index.d.ts +2 -0
- package/dist/network/index.js +6 -0
- package/dist/network/index.js.map +1 -0
- package/dist/network/openai.d.ts +117 -0
- package/dist/network/openai.js +443 -0
- package/dist/network/openai.js.map +1 -0
- package/dist/network/proxy.d.ts +9 -0
- package/dist/network/proxy.js +72 -0
- package/dist/network/proxy.js.map +1 -0
- package/dist/network/web.d.ts +34 -0
- package/dist/network/web.js +152 -0
- package/dist/network/web.js.map +1 -0
- package/dist/platform/clipboard.d.ts +15 -0
- package/dist/platform/clipboard.js +82 -0
- package/dist/platform/clipboard.js.map +1 -0
- package/dist/platform/exec.d.ts +28 -0
- package/dist/platform/exec.js +95 -0
- package/dist/platform/exec.js.map +1 -0
- package/dist/platform/file.d.ts +38 -0
- package/dist/platform/file.js +197 -0
- package/dist/platform/file.js.map +1 -0
- package/dist/platform/index.d.ts +7 -0
- package/dist/platform/index.js +12 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/notification.d.ts +14 -0
- package/dist/platform/notification.js +82 -0
- package/dist/platform/notification.js.map +1 -0
- package/dist/platform/open-external.d.ts +10 -0
- package/dist/platform/open-external.js +105 -0
- package/dist/platform/open-external.js.map +1 -0
- package/dist/platform/os.d.ts +20 -0
- package/dist/platform/os.js +86 -0
- package/dist/platform/os.js.map +1 -0
- package/dist/platform/path.d.ts +32 -0
- package/dist/platform/path.js +154 -0
- package/dist/platform/path.js.map +1 -0
- package/dist/plugin/access-guard.d.ts +1 -0
- package/dist/plugin/access-guard.js +40 -0
- package/dist/plugin/access-guard.js.map +1 -0
- package/dist/plugin/agent-service.d.ts +25 -0
- package/dist/plugin/agent-service.js +809 -0
- package/dist/plugin/agent-service.js.map +1 -0
- package/dist/plugin/agent-tools.d.ts +12 -0
- package/dist/plugin/agent-tools.js +31 -0
- package/dist/plugin/agent-tools.js.map +1 -0
- package/dist/plugin/capabilities.d.ts +26 -0
- package/dist/plugin/capabilities.js +192 -0
- package/dist/plugin/capabilities.js.map +1 -0
- package/dist/plugin/console-guard.d.ts +2 -0
- package/dist/plugin/console-guard.js +52 -0
- package/dist/plugin/console-guard.js.map +1 -0
- package/dist/plugin/data-access.d.ts +15 -0
- package/dist/plugin/data-access.js +57 -0
- package/dist/plugin/data-access.js.map +1 -0
- package/dist/plugin/fs.d.ts +3 -0
- package/dist/plugin/fs.js +93 -0
- package/dist/plugin/fs.js.map +1 -0
- package/dist/plugin/host-alias.d.ts +2 -0
- package/dist/plugin/host-alias.js +57 -0
- package/dist/plugin/host-alias.js.map +1 -0
- package/dist/plugin/index.d.ts +7 -0
- package/dist/plugin/index.js +11 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/install.d.ts +17 -0
- package/dist/plugin/install.js +163 -0
- package/dist/plugin/install.js.map +1 -0
- package/dist/plugin/loader.d.ts +45 -0
- package/dist/plugin/loader.js +739 -0
- package/dist/plugin/loader.js.map +1 -0
- package/dist/plugin/manage.d.ts +31 -0
- package/dist/plugin/manage.js +271 -0
- package/dist/plugin/manage.js.map +1 -0
- package/dist/plugin/models-service.d.ts +15 -0
- package/dist/plugin/models-service.js +317 -0
- package/dist/plugin/models-service.js.map +1 -0
- package/dist/plugin/network-service.d.ts +10 -0
- package/dist/plugin/network-service.js +87 -0
- package/dist/plugin/network-service.js.map +1 -0
- package/dist/plugin/package-manager.d.ts +46 -0
- package/dist/plugin/package-manager.js +148 -0
- package/dist/plugin/package-manager.js.map +1 -0
- package/dist/plugin/paths.d.ts +6 -0
- package/dist/plugin/paths.js +15 -0
- package/dist/plugin/paths.js.map +1 -0
- package/dist/plugin/registry.d.ts +17 -0
- package/dist/plugin/registry.js +82 -0
- package/dist/plugin/registry.js.map +1 -0
- package/dist/plugin/runtime.d.ts +9 -0
- package/dist/plugin/runtime.js +43 -0
- package/dist/plugin/runtime.js.map +1 -0
- package/dist/plugin/scaffold.d.ts +13 -0
- package/dist/plugin/scaffold.js +132 -0
- package/dist/plugin/scaffold.js.map +1 -0
- package/dist/plugin/state.d.ts +6 -0
- package/dist/plugin/state.js +38 -0
- package/dist/plugin/state.js.map +1 -0
- package/dist/plugin/zip.d.ts +7 -0
- package/dist/plugin/zip.js +138 -0
- package/dist/plugin/zip.js.map +1 -0
- package/dist/sandbox/audit.d.ts +12 -0
- package/dist/sandbox/audit.js +20 -0
- package/dist/sandbox/audit.js.map +1 -0
- package/dist/sandbox/backends/bwrap.d.ts +28 -0
- package/dist/sandbox/backends/bwrap.js +197 -0
- package/dist/sandbox/backends/bwrap.js.map +1 -0
- package/dist/sandbox/backends/direct.d.ts +7 -0
- package/dist/sandbox/backends/direct.js +32 -0
- package/dist/sandbox/backends/direct.js.map +1 -0
- package/dist/sandbox/bridge-state.d.ts +13 -0
- package/dist/sandbox/bridge-state.js +12 -0
- package/dist/sandbox/bridge-state.js.map +1 -0
- package/dist/sandbox/index.d.ts +5 -0
- package/dist/sandbox/index.js +6 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/manager.d.ts +8 -0
- package/dist/sandbox/manager.js +325 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/memory-limit.d.ts +44 -0
- package/dist/sandbox/memory-limit.js +193 -0
- package/dist/sandbox/memory-limit.js.map +1 -0
- package/dist/sandbox/plugin-client.d.ts +80 -0
- package/dist/sandbox/plugin-client.js +1601 -0
- package/dist/sandbox/plugin-client.js.map +1 -0
- package/dist/sandbox/plugin-host.d.ts +1 -0
- package/dist/sandbox/plugin-host.js +1001 -0
- package/dist/sandbox/plugin-host.js.map +1 -0
- package/dist/sandbox/protocol.d.ts +43 -0
- package/dist/sandbox/protocol.js +96 -0
- package/dist/sandbox/protocol.js.map +1 -0
- package/dist/sandbox/rpc-timeouts.d.ts +28 -0
- package/dist/sandbox/rpc-timeouts.js +15 -0
- package/dist/sandbox/rpc-timeouts.js.map +1 -0
- package/dist/sandbox/supervisor.d.ts +31 -0
- package/dist/sandbox/supervisor.js +114 -0
- package/dist/sandbox/supervisor.js.map +1 -0
- package/dist/sandbox/types.d.ts +124 -0
- package/dist/sandbox/types.js +17 -0
- package/dist/sandbox/types.js.map +1 -0
- package/dist/service/control.d.ts +32 -0
- package/dist/service/control.js +117 -0
- package/dist/service/control.js.map +1 -0
- package/dist/session/compress.d.ts +3 -0
- package/dist/session/compress.js +42 -0
- package/dist/session/compress.js.map +1 -0
- package/dist/session/index.d.ts +4 -0
- package/dist/session/index.js +8 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/registry.d.ts +4 -0
- package/dist/session/registry.js +12 -0
- package/dist/session/registry.js.map +1 -0
- package/dist/session/replay.d.ts +10 -0
- package/dist/session/replay.js +109 -0
- package/dist/session/replay.js.map +1 -0
- package/dist/session/session.d.ts +40 -0
- package/dist/session/session.js +108 -0
- package/dist/session/session.js.map +1 -0
- package/dist/session/store.d.ts +58 -0
- package/dist/session/store.js +382 -0
- package/dist/session/store.js.map +1 -0
- package/dist/session/types.d.ts +56 -0
- package/dist/session/types.js +3 -0
- package/dist/session/types.js.map +1 -0
- package/dist/workspace/index.d.ts +7 -0
- package/dist/workspace/index.js +17 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/registry.d.ts +25 -0
- package/dist/workspace/registry.js +293 -0
- package/dist/workspace/registry.js.map +1 -0
- package/package.json +73 -5
- package/scripts/build-node-pty.mjs +55 -0
- package/scripts/rewrite-dts.mjs +36 -0
- package/scripts/run-tests.mjs +41 -0
- package/scripts/verify-sandbox.ts +98 -0
- package/src/agent/pending-asks.ts +88 -0
- package/src/agent/task-registry.ts +108 -0
- package/src/agent/tool-context.ts +47 -0
- package/src/agent/usage.ts +170 -0
- package/src/api/host/agent.ts +162 -0
- package/src/api/host/events.ts +7 -0
- package/src/api/host/exec.ts +47 -0
- package/src/api/host/fs.ts +33 -0
- package/src/api/host/hooks.ts +635 -0
- package/src/api/host/host.ts +99 -0
- package/src/api/host/http.ts +79 -0
- package/src/api/host/index.ts +20 -0
- package/src/api/host/models.ts +81 -0
- package/src/api/host/network.ts +32 -0
- package/src/api/host/plugin.ts +158 -0
- package/src/api/host/plugins.ts +59 -0
- package/src/api/host/pty.ts +73 -0
- package/src/api/host/session.ts +61 -0
- package/src/api/host/version.ts +2 -0
- package/src/api/host/workspace.ts +51 -0
- package/src/api/plugin/http-client.ts +492 -0
- package/src/api/plugin/http-protocol.ts +231 -0
- package/src/api/result/result.ts +52 -0
- package/src/commands/agent-turn.ts +817 -0
- package/src/commands/ask-prompt.ts +52 -0
- package/src/commands/config.ts +306 -0
- package/src/commands/conversation.ts +777 -0
- package/src/commands/doctor.ts +92 -0
- package/src/commands/exec-approval.ts +91 -0
- package/src/commands/help.ts +41 -0
- package/src/commands/key.ts +281 -0
- package/src/commands/plugin.ts +222 -0
- package/src/commands/session.ts +179 -0
- package/src/commands/shared.ts +103 -0
- package/src/commands/start.ts +88 -0
- package/src/commands/stop.ts +24 -0
- package/src/commands/version.ts +40 -0
- package/src/config/codes.ts +17 -0
- package/src/config/credentials.ts +302 -0
- package/src/config/defaults.ts +32 -0
- package/src/config/index.ts +10 -0
- package/src/config/loader.ts +80 -0
- package/src/config/providers.ts +133 -0
- package/src/config/types.ts +88 -0
- package/src/config/validate.ts +458 -0
- package/src/display/markdown.ts +137 -0
- package/src/display/tool-label.ts +87 -0
- package/src/event/event.ts +171 -0
- package/src/index.ts +344 -0
- package/src/input/codes.ts +21 -0
- package/src/input/commands.ts +76 -0
- package/src/input/help.ts +60 -0
- package/src/input/index.ts +10 -0
- package/src/input/parse-options.ts +66 -0
- package/src/input/parse.ts +138 -0
- package/src/input/types.ts +19 -0
- package/src/logger/elog4js.ts +366 -0
- package/src/logger/logger.ts +251 -0
- package/src/network/index.ts +6 -0
- package/src/network/openai.ts +571 -0
- package/src/network/proxy.ts +80 -0
- package/src/network/web.ts +206 -0
- package/src/platform/clipboard.ts +107 -0
- package/src/platform/exec.ts +128 -0
- package/src/platform/file.ts +235 -0
- package/src/platform/index.ts +12 -0
- package/src/platform/notification.ts +108 -0
- package/src/platform/open-external.ts +132 -0
- package/src/platform/os.ts +101 -0
- package/src/platform/path.ts +214 -0
- package/src/plugin/access-guard.ts +46 -0
- package/src/plugin/agent-service.ts +969 -0
- package/src/plugin/agent-tools.ts +43 -0
- package/src/plugin/capabilities.ts +240 -0
- package/src/plugin/console-guard.ts +66 -0
- package/src/plugin/data-access.ts +70 -0
- package/src/plugin/fs.ts +109 -0
- package/src/plugin/host-alias.ts +61 -0
- package/src/plugin/index.ts +11 -0
- package/src/plugin/install.ts +213 -0
- package/src/plugin/loader.ts +952 -0
- package/src/plugin/manage.ts +338 -0
- package/src/plugin/models-service.ts +383 -0
- package/src/plugin/network-service.ts +102 -0
- package/src/plugin/package-manager.ts +214 -0
- package/src/plugin/paths.ts +19 -0
- package/src/plugin/registry.ts +103 -0
- package/src/plugin/runtime.ts +57 -0
- package/src/plugin/scaffold.ts +158 -0
- package/src/plugin/state.ts +52 -0
- package/src/plugin/zip.ts +156 -0
- package/src/sandbox/audit.ts +38 -0
- package/src/sandbox/backends/bwrap.ts +251 -0
- package/src/sandbox/backends/direct.ts +43 -0
- package/src/sandbox/bridge-state.ts +29 -0
- package/src/sandbox/index.ts +5 -0
- package/src/sandbox/manager.ts +406 -0
- package/src/sandbox/memory-limit.ts +245 -0
- package/src/sandbox/plugin-client.ts +1881 -0
- package/src/sandbox/plugin-host.ts +1282 -0
- package/src/sandbox/protocol.ts +142 -0
- package/src/sandbox/pty-bridge.py +154 -0
- package/src/sandbox/rpc-timeouts.ts +43 -0
- package/src/sandbox/supervisor.ts +172 -0
- package/src/sandbox/types.ts +149 -0
- package/src/service/control.ts +155 -0
- package/src/session/compress.ts +47 -0
- package/src/session/index.ts +8 -0
- package/src/session/registry.ts +17 -0
- package/src/session/replay.ts +132 -0
- package/src/session/session.ts +134 -0
- package/src/session/store.ts +468 -0
- package/src/session/types.ts +61 -0
- package/src/workspace/index.ts +21 -0
- package/src/workspace/registry.ts +356 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* API Key 凭据(支持多个模型供应商)。
|
|
3
|
+
*
|
|
4
|
+
* 与 app-setting.json 分开存放:配置文件可能被分享或进版本库,凭据单独放
|
|
5
|
+
* <configDir>/credentials.json,权限 0600。v2 结构按供应商分槽,v1 只有 openai 槽。
|
|
6
|
+
* 读取顺序:显式参数 > 供应商指定的环境变量(内置为 OPENAI_API_KEY)> 本地凭据。
|
|
7
|
+
* 明文只进请求,界面/日志一律用掩码。
|
|
8
|
+
*/
|
|
9
|
+
import { readFileSync } from "node:fs";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import { Result } from "../api/result/result.js";
|
|
12
|
+
import { CONFIG_CODES } from "./codes.js";
|
|
13
|
+
import { readJsonIfExists, writeJsonAtomic } from "../platform/file.js";
|
|
14
|
+
import { readEnv } from "../platform/os.js";
|
|
15
|
+
import { getPaths } from "../platform/path.js";
|
|
16
|
+
/** 凭据文件在 config 根目录下的文件名 */
|
|
17
|
+
export const CREDENTIALS_FILE_NAME = "credentials.json";
|
|
18
|
+
/** 凭据文件结构版本;v2 增加 providers 分槽,v1 只认 openai */
|
|
19
|
+
export const CREDENTIALS_VERSION = 2;
|
|
20
|
+
/** 单个 key 的长度上限,避免把异常输入写进文件 */
|
|
21
|
+
export const MAX_API_KEY_CHARS = 4096;
|
|
22
|
+
/** 内置供应商的 id;它的 key 放在 openai 槽,兼容 v1 与 OPENAI_API_KEY */
|
|
23
|
+
export const BUILTIN_PROVIDER_ID = "openai";
|
|
24
|
+
/** 默认凭据路径;测试/多环境时可显式传 configDir */
|
|
25
|
+
export function credentialsFile(configDir = getPaths().configDir) {
|
|
26
|
+
return join(configDir, CREDENTIALS_FILE_NAME);
|
|
27
|
+
}
|
|
28
|
+
/** 列表展示用的掩码;短 key 直接全遮 */
|
|
29
|
+
export function maskApiKey(apiKey) {
|
|
30
|
+
const trimmed = apiKey.trim();
|
|
31
|
+
if (trimmed.length <= 8) {
|
|
32
|
+
return "••••";
|
|
33
|
+
}
|
|
34
|
+
const head = trimmed.slice(0, 3);
|
|
35
|
+
return `${head}…${trimmed.slice(-4)}`;
|
|
36
|
+
}
|
|
37
|
+
/** 校验并规范化用户输入的 key;空白、含控制字符或超长都视为非法 */
|
|
38
|
+
export function normalizeApiKey(raw) {
|
|
39
|
+
if (typeof raw !== "string") {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const trimmed = raw.trim();
|
|
43
|
+
if (trimmed === "" || trimmed.length > MAX_API_KEY_CHARS) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
if (/[\s\u0000-\u001f\u007f]/.test(trimmed)) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
return trimmed;
|
|
50
|
+
}
|
|
51
|
+
function parseCredentials(value) {
|
|
52
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const record = value;
|
|
56
|
+
const openaiRaw = record["openai"];
|
|
57
|
+
const openai = typeof openaiRaw === "object" && openaiRaw !== null
|
|
58
|
+
? openaiRaw
|
|
59
|
+
: null;
|
|
60
|
+
const providersRaw = record["providers"];
|
|
61
|
+
const providers = {};
|
|
62
|
+
if (typeof providersRaw === "object" && providersRaw !== null) {
|
|
63
|
+
for (const [id, raw] of Object.entries(providersRaw)) {
|
|
64
|
+
providers[id] = normalizeApiKey(raw);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
version: typeof record["version"] === "number" ? record["version"] : 1,
|
|
69
|
+
openai: openai === null ? null : { apiKey: normalizeApiKey(openai["apiKey"]) },
|
|
70
|
+
providers,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function readFileValue(file) {
|
|
74
|
+
let text;
|
|
75
|
+
try {
|
|
76
|
+
text = readFileSync(file, "utf8");
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
return parseCredentials(JSON.parse(text));
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function readFileValueAsync(file) {
|
|
89
|
+
try {
|
|
90
|
+
return parseCredentials(await readJsonIfExists(file));
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function storedKey(value, providerId) {
|
|
97
|
+
if (value === null) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
if (providerId === BUILTIN_PROVIDER_ID) {
|
|
101
|
+
return normalizeApiKey(value.openai?.apiKey);
|
|
102
|
+
}
|
|
103
|
+
return normalizeApiKey(value.providers?.[providerId]);
|
|
104
|
+
}
|
|
105
|
+
function envKey(provider) {
|
|
106
|
+
const envVar = provider.apiKeyEnv ?? (provider.id === BUILTIN_PROVIDER_ID ? "OPENAI_API_KEY" : null);
|
|
107
|
+
if (envVar === null) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
const raw = normalizeApiKey(readEnv(envVar));
|
|
111
|
+
return raw === null ? null : { apiKey: raw, envVar };
|
|
112
|
+
}
|
|
113
|
+
/** 某个供应商本地保存的 key(同步) */
|
|
114
|
+
export function readProviderApiKeySync(providerId, file = credentialsFile()) {
|
|
115
|
+
return storedKey(readFileValue(file), providerId);
|
|
116
|
+
}
|
|
117
|
+
/** 某个供应商本地保存的 key(异步) */
|
|
118
|
+
export async function readProviderApiKey(providerId, file = credentialsFile()) {
|
|
119
|
+
return storedKey(await readFileValueAsync(file), providerId);
|
|
120
|
+
}
|
|
121
|
+
/** 默认(内置 openai)供应商本地保存的 key */
|
|
122
|
+
export function readStoredApiKeySync(file = credentialsFile()) {
|
|
123
|
+
return readProviderApiKeySync(BUILTIN_PROVIDER_ID, file);
|
|
124
|
+
}
|
|
125
|
+
export async function readStoredApiKey(file = credentialsFile()) {
|
|
126
|
+
return await readProviderApiKey(BUILTIN_PROVIDER_ID, file);
|
|
127
|
+
}
|
|
128
|
+
/** 解析某个供应商的 key:环境变量优先于本地凭据 */
|
|
129
|
+
export function resolveProviderApiKeySync(provider, file = credentialsFile()) {
|
|
130
|
+
const fromEnv = envKey(provider);
|
|
131
|
+
if (fromEnv !== null) {
|
|
132
|
+
return { apiKey: fromEnv.apiKey, source: "env" };
|
|
133
|
+
}
|
|
134
|
+
const stored = readProviderApiKeySync(provider.id, file);
|
|
135
|
+
return stored === null ? null : { apiKey: stored, source: "credentials" };
|
|
136
|
+
}
|
|
137
|
+
/** 解析默认供应商的 key:OPENAI_API_KEY 优先于本地凭据 */
|
|
138
|
+
export function resolveApiKeySync(file = credentialsFile()) {
|
|
139
|
+
return resolveProviderApiKeySync({ id: BUILTIN_PROVIDER_ID, apiKeyEnv: null }, file);
|
|
140
|
+
}
|
|
141
|
+
/** 默认供应商的状态(CLI 与 API Key 弹窗用) */
|
|
142
|
+
export function apiKeyStatusSync(file = credentialsFile()) {
|
|
143
|
+
return providerKeyStatusSync({ id: BUILTIN_PROVIDER_ID, apiKeyEnv: null }, file);
|
|
144
|
+
}
|
|
145
|
+
/** 指定供应商的 Key 状态(掩码) */
|
|
146
|
+
export function providerKeyStatusSync(provider, file = credentialsFile()) {
|
|
147
|
+
const resolved = resolveProviderApiKeySync(provider, file);
|
|
148
|
+
const envVar = provider.apiKeyEnv ?? (provider.id === BUILTIN_PROVIDER_ID ? "OPENAI_API_KEY" : null);
|
|
149
|
+
return {
|
|
150
|
+
configured: resolved !== null,
|
|
151
|
+
source: resolved?.source ?? null,
|
|
152
|
+
masked: resolved === null ? null : maskApiKey(resolved.apiKey),
|
|
153
|
+
file,
|
|
154
|
+
envOverride: envKey(provider) !== null,
|
|
155
|
+
stored: readProviderApiKeySync(provider.id, file) !== null,
|
|
156
|
+
envVar,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
async function writeCredentials(file, value) {
|
|
160
|
+
try {
|
|
161
|
+
await writeJsonAtomic(file, value, { mode: 0o600 });
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return Result.error(CONFIG_CODES.credentialsWriteFailed);
|
|
165
|
+
}
|
|
166
|
+
return Result.success();
|
|
167
|
+
}
|
|
168
|
+
/** 保存某个供应商的 key;providerId=openai 时写内置槽 */
|
|
169
|
+
export async function saveProviderApiKey(providerId, raw, file = credentialsFile()) {
|
|
170
|
+
const apiKey = normalizeApiKey(raw);
|
|
171
|
+
if (apiKey === null) {
|
|
172
|
+
return Result.error(CONFIG_CODES.invalidApiKey);
|
|
173
|
+
}
|
|
174
|
+
const current = readFileValue(file);
|
|
175
|
+
if (providerId === BUILTIN_PROVIDER_ID) {
|
|
176
|
+
return await writeCredentials(file, {
|
|
177
|
+
version: CREDENTIALS_VERSION,
|
|
178
|
+
openai: { apiKey },
|
|
179
|
+
providers: current?.providers ?? {},
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
return await writeCredentials(file, {
|
|
183
|
+
version: CREDENTIALS_VERSION,
|
|
184
|
+
openai: current?.openai ?? { apiKey: null },
|
|
185
|
+
providers: { ...(current?.providers ?? {}), [providerId]: apiKey },
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/** 清除某个供应商的 key;内置槽清除后 OPENAI_API_KEY 仍可能生效 */
|
|
189
|
+
export async function clearProviderApiKey(providerId, file = credentialsFile()) {
|
|
190
|
+
const current = readFileValue(file);
|
|
191
|
+
if (providerId === BUILTIN_PROVIDER_ID) {
|
|
192
|
+
return await writeCredentials(file, {
|
|
193
|
+
version: CREDENTIALS_VERSION,
|
|
194
|
+
openai: { apiKey: null },
|
|
195
|
+
providers: current?.providers ?? {},
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
const providers = { ...(current?.providers ?? {}) };
|
|
199
|
+
delete providers[providerId];
|
|
200
|
+
return await writeCredentials(file, {
|
|
201
|
+
version: CREDENTIALS_VERSION,
|
|
202
|
+
openai: current?.openai ?? { apiKey: null },
|
|
203
|
+
providers,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/** 保存默认供应商的 key(兼容旧调用) */
|
|
207
|
+
export async function saveStoredApiKey(raw, file = credentialsFile()) {
|
|
208
|
+
return await saveProviderApiKey(BUILTIN_PROVIDER_ID, raw, file);
|
|
209
|
+
}
|
|
210
|
+
/** 清除默认供应商的本地 key(兼容旧调用) */
|
|
211
|
+
export async function clearStoredApiKey(file = credentialsFile()) {
|
|
212
|
+
return await clearProviderApiKey(BUILTIN_PROVIDER_ID, file);
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/config/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { SETTING_VERSION } from "./types.js";
|
|
2
|
+
/** 单供应商时代的默认模型设置;旧配置缺 models 时用它兜底 */
|
|
3
|
+
export const DEFAULT_MODELS = Object.freeze({
|
|
4
|
+
providers: Object.freeze([]),
|
|
5
|
+
activeProvider: "openai",
|
|
6
|
+
activeModel: null,
|
|
7
|
+
activeReasoning: "off",
|
|
8
|
+
});
|
|
9
|
+
/** 缺省配置。缺文件或读取失败时作为回退 */
|
|
10
|
+
export const DEFAULT_SETTINGS = Object.freeze({
|
|
11
|
+
version: SETTING_VERSION,
|
|
12
|
+
logger: Object.freeze({ level: "info" }),
|
|
13
|
+
openai: Object.freeze({
|
|
14
|
+
baseUrl: null,
|
|
15
|
+
model: "gpt-4o-mini",
|
|
16
|
+
timeoutMs: 60_000,
|
|
17
|
+
maxRetries: 2,
|
|
18
|
+
}),
|
|
19
|
+
models: DEFAULT_MODELS,
|
|
20
|
+
network: Object.freeze({ proxy: null }),
|
|
21
|
+
sandbox: Object.freeze({
|
|
22
|
+
mode: "strict",
|
|
23
|
+
backend: "auto",
|
|
24
|
+
access: "read-only",
|
|
25
|
+
maxConcurrent: 2,
|
|
26
|
+
defaultTimeoutMs: 60_000,
|
|
27
|
+
defaultMemoryMB: 512,
|
|
28
|
+
outputLimitBytes: 16 * 1024 * 1024,
|
|
29
|
+
}),
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAuC,MAAM,YAAY,CAAA;AAEjF,sCAAsC;AACtC,MAAM,CAAC,MAAM,cAAc,GAAkB,MAAM,CAAC,MAAM,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAC5B,cAAc,EAAE,QAAQ;IACxB,WAAW,EAAE,IAAI;IACjB,eAAe,EAAE,KAAK;CACzB,CAAC,CAAA;AAEF,yBAAyB;AACzB,MAAM,CAAC,MAAM,gBAAgB,GAAe,MAAM,CAAC,MAAM,CAAC;IACtD,OAAO,EAAE,eAAe;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAe,EAAE,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QAClB,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE,MAAM;QACjB,UAAU,EAAE,CAAC;KAChB,CAAC;IACF,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,QAAiB;QACvB,OAAO,EAAE,MAAe;QACxB,MAAM,EAAE,WAAoB;QAC5B,aAAa,EAAE,CAAC;QAChB,gBAAgB,EAAE,MAAM;QACxB,eAAe,EAAE,GAAG;QACpB,gBAAgB,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KACrC,CAAC;CACL,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Result } from "../api/result/result.js";
|
|
2
|
+
import type { AppSetting } from "./types.js";
|
|
3
|
+
/** 配置文件在 config 根目录下的文件名 */
|
|
4
|
+
export declare const SETTING_FILE_NAME = "app-setting.json";
|
|
5
|
+
/** 默认配置路径 */
|
|
6
|
+
export declare function settingsFile(): string;
|
|
7
|
+
/** 读取配置。文件不存在时创建默认配置 */
|
|
8
|
+
export declare function loadSettings(file?: string): Promise<Result<AppSetting>>;
|
|
9
|
+
/** 校验后原子写回;字段不合法时不落盘 */
|
|
10
|
+
export declare function saveSettings(settings: AppSetting, file?: string): Promise<Result<void>>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* 配置读写。
|
|
3
|
+
* 默认路径为用户配置目录下的 app-setting.json;缺文件时写入默认值。
|
|
4
|
+
* 失败时 Result 的 code 说明原因,getData() 回退默认配置,供调用方决定是否继续启动。
|
|
5
|
+
*/
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { Result } from "../api/result/result.js";
|
|
8
|
+
import { readTextIfExists, writeJsonAtomic } from "../platform/file.js";
|
|
9
|
+
import { getPaths } from "../platform/path.js";
|
|
10
|
+
import { CONFIG_CODES } from "./codes.js";
|
|
11
|
+
import { DEFAULT_SETTINGS } from "./defaults.js";
|
|
12
|
+
import { validateSettings } from "./validate.js";
|
|
13
|
+
/** 配置文件在 config 根目录下的文件名 */
|
|
14
|
+
export const SETTING_FILE_NAME = "app-setting.json";
|
|
15
|
+
/** 默认配置路径 */
|
|
16
|
+
export function settingsFile() {
|
|
17
|
+
return join(getPaths().configDir, SETTING_FILE_NAME);
|
|
18
|
+
}
|
|
19
|
+
/** 读取配置。文件不存在时创建默认配置 */
|
|
20
|
+
export async function loadSettings(file = settingsFile()) {
|
|
21
|
+
let text;
|
|
22
|
+
try {
|
|
23
|
+
text = await readTextIfExists(file);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return Result.errorWithData(DEFAULT_SETTINGS, CONFIG_CODES.readFailed);
|
|
27
|
+
}
|
|
28
|
+
if (text === null) {
|
|
29
|
+
return await writeDefaults(file);
|
|
30
|
+
}
|
|
31
|
+
let parsed;
|
|
32
|
+
try {
|
|
33
|
+
parsed = JSON.parse(text);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// 损坏文件不覆盖,留给调用方决定是否备份
|
|
37
|
+
return Result.errorWithData(DEFAULT_SETTINGS, CONFIG_CODES.parseFailed);
|
|
38
|
+
}
|
|
39
|
+
const validated = validateSettings(parsed);
|
|
40
|
+
if (!validated.isSuccess()) {
|
|
41
|
+
return Result.errorWithData(DEFAULT_SETTINGS, validated.getCode() ?? CONFIG_CODES.invalid);
|
|
42
|
+
}
|
|
43
|
+
return validated;
|
|
44
|
+
}
|
|
45
|
+
/** 校验后原子写回;字段不合法时不落盘 */
|
|
46
|
+
export async function saveSettings(settings, file = settingsFile()) {
|
|
47
|
+
const validated = validateSettings(settings);
|
|
48
|
+
if (!validated.isSuccess()) {
|
|
49
|
+
return Result.error(validated.getCode() ?? CONFIG_CODES.invalid);
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
await writeJsonAtomic(file, validated.getData());
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return Result.error(CONFIG_CODES.writeFailed);
|
|
56
|
+
}
|
|
57
|
+
return Result.success();
|
|
58
|
+
}
|
|
59
|
+
async function writeDefaults(file) {
|
|
60
|
+
try {
|
|
61
|
+
await writeJsonAtomic(file, DEFAULT_SETTINGS);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return Result.errorWithData(DEFAULT_SETTINGS, CONFIG_CODES.writeFailed);
|
|
65
|
+
}
|
|
66
|
+
return Result.successWithData(DEFAULT_SETTINGS);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEhD,4BAA4B;AAC5B,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAA;AAEnD,aAAa;AACb,MAAM,UAAU,YAAY;IACxB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAA;AACxD,CAAC;AAED,wBAAwB;AACxB,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAI,GAAW,YAAY,EAAE;IAC5D,IAAI,IAAmB,CAAA;IACvB,IAAI,CAAC;QACD,IAAI,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,MAAM,CAAC,aAAa,CAAa,gBAAgB,EAAE,YAAY,CAAC,UAAU,CAAC,CAAA;IACtF,CAAC;IAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAChB,OAAO,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;IACpC,CAAC;IAED,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACL,sBAAsB;QACtB,OAAO,MAAM,CAAC,aAAa,CAAa,gBAAgB,EAAE,YAAY,CAAC,WAAW,CAAC,CAAA;IACvF,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC1C,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,aAAa,CACvB,gBAAgB,EAChB,SAAS,CAAC,OAAO,EAAE,IAAI,YAAY,CAAC,OAAO,CAC9C,CAAA;IACL,CAAC;IACD,OAAO,SAAS,CAAA;AACpB,CAAC;AAED,wBAAwB;AACxB,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,QAAoB,EACpB,IAAI,GAAW,YAAY,EAAE;IAE7B,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IAC5C,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,YAAY,CAAC,OAAO,CAAC,CAAA;IACpE,CAAC;IACD,IAAI,CAAC;QACD,MAAM,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;IACpD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,CAAA;IACjD,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,EAAE,CAAA;AAC3B,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY;IACrC,IAAI,CAAC;QACD,MAAM,eAAe,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,MAAM,CAAC,aAAa,CAAa,gBAAgB,EAAE,YAAY,CAAC,WAAW,CAAC,CAAA;IACvF,CAAC;IACD,OAAO,MAAM,CAAC,eAAe,CAAa,gBAAgB,CAAC,CAAA;AAC/D,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { BUILTIN_PROVIDER_ID } from "./credentials.js";
|
|
2
|
+
import type { AppSetting, ModelProviderSetting, ModelsSetting } from "./types.js";
|
|
3
|
+
export { BUILTIN_PROVIDER_ID };
|
|
4
|
+
/** 解析后的供应商:内置项同样带 builtin 标记与可用的模型列表 */
|
|
5
|
+
export interface ResolvedModelProvider extends ModelProviderSetting {
|
|
6
|
+
readonly builtin: boolean;
|
|
7
|
+
}
|
|
8
|
+
/** 旧配置没有 models 节时用默认值 */
|
|
9
|
+
export declare function modelsSetting(settings: AppSetting): ModelsSetting;
|
|
10
|
+
/** 供应商列表:内置 openai 永远排第一,自定义按配置顺序 */
|
|
11
|
+
export declare function listModelProviders(settings: AppSetting): readonly ResolvedModelProvider[];
|
|
12
|
+
export declare function findModelProvider(settings: AppSetting, id: string): ResolvedModelProvider | null;
|
|
13
|
+
/** 当前生效的供应商;配置里的 id 失效时退回内置 openai */
|
|
14
|
+
export declare function activeModelProvider(settings: AppSetting): ResolvedModelProvider;
|
|
15
|
+
/**
|
|
16
|
+
* 某次请求实际使用的模型:
|
|
17
|
+
* 显式覆盖 > 全局 activeModel(仅当前供应商)> 供应商 defaultModel > 模型列表第一个 > 全局 openai.model
|
|
18
|
+
*/
|
|
19
|
+
export declare function effectiveModel(settings: AppSetting, provider: ResolvedModelProvider, override?: string | null): string;
|
|
20
|
+
/** 某次请求使用的供应商:请求里带了就用它,否则用全局当前供应商 */
|
|
21
|
+
export declare function requestProvider(settings: AppSetting, providerId?: string | null): ResolvedModelProvider;
|
|
22
|
+
/**
|
|
23
|
+
* 某次请求的推理强度:
|
|
24
|
+
* 显式覆盖 > 全局 activeReasoning(仅当前供应商)> off
|
|
25
|
+
*/
|
|
26
|
+
export declare function effectiveReasoning(settings: AppSetting, provider: ResolvedModelProvider, override?: string | null): string;
|
|
27
|
+
/** 供应商对应的 OpenAI 设置(baseUrl + 实际模型) */
|
|
28
|
+
export declare function providerOpenAISettings(settings: AppSetting, provider: ResolvedModelProvider, model?: string | null): AppSetting["openai"];
|
|
29
|
+
/** 供应商的 key:环境变量优先,然后本地凭据;没有返回 null */
|
|
30
|
+
export declare function providerApiKey(provider: ResolvedModelProvider, configDir: string): string | null;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* 模型供应商与模型解析。
|
|
3
|
+
*
|
|
4
|
+
* 内置供应商 id 为 openai,由 app-setting.json 的 openai.* 描述;
|
|
5
|
+
* 自定义供应商来自 models.providers,接口都按 OpenAI 兼容处理(baseUrl + key)。
|
|
6
|
+
*/
|
|
7
|
+
import { BUILTIN_PROVIDER_ID, credentialsFile, resolveProviderApiKeySync } from "./credentials.js";
|
|
8
|
+
import { DEFAULT_MODELS } from "./defaults.js";
|
|
9
|
+
export { BUILTIN_PROVIDER_ID };
|
|
10
|
+
/** 旧配置没有 models 节时用默认值 */
|
|
11
|
+
export function modelsSetting(settings) {
|
|
12
|
+
return settings.models ?? DEFAULT_MODELS;
|
|
13
|
+
}
|
|
14
|
+
/** 供应商列表:内置 openai 永远排第一,自定义按配置顺序 */
|
|
15
|
+
export function listModelProviders(settings) {
|
|
16
|
+
const builtin = {
|
|
17
|
+
id: BUILTIN_PROVIDER_ID,
|
|
18
|
+
name: settings.openai.baseUrl === null ? "OpenAI(默认)" : "默认供应商",
|
|
19
|
+
baseUrl: settings.openai.baseUrl,
|
|
20
|
+
models: [settings.openai.model],
|
|
21
|
+
defaultModel: settings.openai.model,
|
|
22
|
+
apiKeyEnv: "OPENAI_API_KEY",
|
|
23
|
+
builtin: true,
|
|
24
|
+
};
|
|
25
|
+
return [
|
|
26
|
+
builtin,
|
|
27
|
+
...modelsSetting(settings).providers.map((provider) => ({ ...provider, builtin: false })),
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
export function findModelProvider(settings, id) {
|
|
31
|
+
return listModelProviders(settings).find((provider) => provider.id === id) ?? null;
|
|
32
|
+
}
|
|
33
|
+
/** 当前生效的供应商;配置里的 id 失效时退回内置 openai */
|
|
34
|
+
export function activeModelProvider(settings) {
|
|
35
|
+
const active = findModelProvider(settings, modelsSetting(settings).activeProvider);
|
|
36
|
+
return active ?? listModelProviders(settings)[0];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 某次请求实际使用的模型:
|
|
40
|
+
* 显式覆盖 > 全局 activeModel(仅当前供应商)> 供应商 defaultModel > 模型列表第一个 > 全局 openai.model
|
|
41
|
+
*/
|
|
42
|
+
export function effectiveModel(settings, provider, override) {
|
|
43
|
+
const explicit = typeof override === "string" ? override.trim() : "";
|
|
44
|
+
if (explicit !== "") {
|
|
45
|
+
return explicit;
|
|
46
|
+
}
|
|
47
|
+
const models = modelsSetting(settings);
|
|
48
|
+
if (provider.id === models.activeProvider && models.activeModel !== null) {
|
|
49
|
+
return models.activeModel;
|
|
50
|
+
}
|
|
51
|
+
if (provider.defaultModel !== null && provider.defaultModel !== "") {
|
|
52
|
+
return provider.defaultModel;
|
|
53
|
+
}
|
|
54
|
+
if (provider.models.length > 0) {
|
|
55
|
+
return provider.models[0];
|
|
56
|
+
}
|
|
57
|
+
return settings.openai.model;
|
|
58
|
+
}
|
|
59
|
+
/** 某次请求使用的供应商:请求里带了就用它,否则用全局当前供应商 */
|
|
60
|
+
export function requestProvider(settings, providerId) {
|
|
61
|
+
const requested = typeof providerId === "string" ? providerId.trim() : "";
|
|
62
|
+
if (requested !== "") {
|
|
63
|
+
const found = findModelProvider(settings, requested);
|
|
64
|
+
if (found !== null) {
|
|
65
|
+
return found;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return activeModelProvider(settings);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 某次请求的推理强度:
|
|
72
|
+
* 显式覆盖 > 全局 activeReasoning(仅当前供应商)> off
|
|
73
|
+
*/
|
|
74
|
+
export function effectiveReasoning(settings, provider, override) {
|
|
75
|
+
const explicit = typeof override === "string" ? override.trim() : "";
|
|
76
|
+
if (explicit !== "") {
|
|
77
|
+
return explicit;
|
|
78
|
+
}
|
|
79
|
+
const models = modelsSetting(settings);
|
|
80
|
+
if (provider.id === models.activeProvider) {
|
|
81
|
+
return models.activeReasoning;
|
|
82
|
+
}
|
|
83
|
+
return "off";
|
|
84
|
+
}
|
|
85
|
+
/** 供应商对应的 OpenAI 设置(baseUrl + 实际模型) */
|
|
86
|
+
export function providerOpenAISettings(settings, provider, model) {
|
|
87
|
+
return {
|
|
88
|
+
...settings.openai,
|
|
89
|
+
baseUrl: provider.baseUrl,
|
|
90
|
+
model: effectiveModel(settings, provider, model),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** 供应商的 key:环境变量优先,然后本地凭据;没有返回 null */
|
|
94
|
+
export function providerApiKey(provider, configDir) {
|
|
95
|
+
return (resolveProviderApiKeySync({ id: provider.id, apiKeyEnv: provider.apiKeyEnv }, credentialsFile(configDir))?.apiKey ?? null);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/config/providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { LevelWithSilent } from "pino";
|
|
2
|
+
/** 配置文件结构版本,字段变更时递增并在 loader 中迁移 */
|
|
3
|
+
export declare const SETTING_VERSION = 1;
|
|
4
|
+
export interface LoggerSetting {
|
|
5
|
+
readonly level: LevelWithSilent;
|
|
6
|
+
}
|
|
7
|
+
export interface OpenAISetting {
|
|
8
|
+
/** 兼容网关地址;null 表示使用 SDK 默认值或 OPENAI_BASE_URL */
|
|
9
|
+
readonly baseUrl: string | null;
|
|
10
|
+
readonly model: string;
|
|
11
|
+
readonly timeoutMs: number;
|
|
12
|
+
readonly maxRetries: number;
|
|
13
|
+
}
|
|
14
|
+
/** 自定义模型供应商(OpenAI 兼容接口);内置供应商 openai 由 openai.* 字段描述 */
|
|
15
|
+
export interface ModelProviderSetting {
|
|
16
|
+
/** 供应商标识,1-32 位 [a-z0-9-_.];不能叫 openai */
|
|
17
|
+
readonly id: string;
|
|
18
|
+
readonly name: string;
|
|
19
|
+
/** null 表示使用 SDK 默认地址 */
|
|
20
|
+
readonly baseUrl: string | null;
|
|
21
|
+
/** 预置模型列表;可手动维护,也可从供应商接口拉取 */
|
|
22
|
+
readonly models: readonly string[];
|
|
23
|
+
/** 该供应商缺省模型;null 时取列表第一个或全局 openai.model */
|
|
24
|
+
readonly defaultModel: string | null;
|
|
25
|
+
/** 可选:用这个环境变量提供该供应商的 API Key(优先级高于本地凭据) */
|
|
26
|
+
readonly apiKeyEnv: string | null;
|
|
27
|
+
}
|
|
28
|
+
/** 推理强度;参考 Harness:off / low / high / max */
|
|
29
|
+
export type ReasoningLevel = "off" | "low" | "high" | "max";
|
|
30
|
+
export declare const REASONING_LEVELS: readonly ReasoningLevel[];
|
|
31
|
+
export interface ModelsSetting {
|
|
32
|
+
/** 自定义供应商;内置 openai 不在列表里 */
|
|
33
|
+
readonly providers: readonly ModelProviderSetting[];
|
|
34
|
+
/** 当前使用的供应商 id;openai 表示内置 */
|
|
35
|
+
readonly activeProvider: string;
|
|
36
|
+
/** 当前使用的模型;null 表示用供应商缺省模型 */
|
|
37
|
+
readonly activeModel: string | null;
|
|
38
|
+
/** 当前推理强度;off 表示不发推理参数 */
|
|
39
|
+
readonly activeReasoning: ReasoningLevel;
|
|
40
|
+
}
|
|
41
|
+
/** 代理类型,一期只支持 http/https 代理 */
|
|
42
|
+
export type ProxyType = "http";
|
|
43
|
+
export interface ProxySetting {
|
|
44
|
+
readonly type: ProxyType;
|
|
45
|
+
/** 代理地址,认证信息可写在 URL 里 */
|
|
46
|
+
readonly url: string;
|
|
47
|
+
/** 不走代理的主机后缀,例如 example.com、.internal */
|
|
48
|
+
readonly noProxy: readonly string[];
|
|
49
|
+
}
|
|
50
|
+
export interface NetworkSetting {
|
|
51
|
+
/** null 表示直连 */
|
|
52
|
+
readonly proxy: ProxySetting | null;
|
|
53
|
+
}
|
|
54
|
+
export type SandboxMode = "off" | "strict" | "best-effort";
|
|
55
|
+
export type SandboxBackend = "auto" | "bwrap" | "nsjail";
|
|
56
|
+
export type SandboxAccess = "read-only" | "workspace-write" | "danger-full-access";
|
|
57
|
+
/** OS 级 sandbox 配置 */
|
|
58
|
+
export interface SandboxSetting {
|
|
59
|
+
readonly mode: SandboxMode;
|
|
60
|
+
readonly backend: SandboxBackend;
|
|
61
|
+
readonly access: SandboxAccess;
|
|
62
|
+
readonly maxConcurrent: number;
|
|
63
|
+
readonly defaultTimeoutMs: number;
|
|
64
|
+
readonly defaultMemoryMB: number;
|
|
65
|
+
readonly outputLimitBytes: number;
|
|
66
|
+
}
|
|
67
|
+
export interface AppSetting {
|
|
68
|
+
readonly version: number;
|
|
69
|
+
readonly logger: LoggerSetting;
|
|
70
|
+
readonly openai: OpenAISetting;
|
|
71
|
+
/** 多供应商/模型设置;旧配置没有这一节时按默认值处理 */
|
|
72
|
+
readonly models?: ModelsSetting;
|
|
73
|
+
readonly network: NetworkSetting;
|
|
74
|
+
readonly sandbox: SandboxSetting;
|
|
75
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAEA,oCAAoC;AACpC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAA;AAgChC,MAAM,CAAC,MAAM,gBAAgB,GAA8B,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA"}
|