@elizaos/plugin-elizacloud 2.0.0-alpha.7 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +220 -0
- package/auto-enable.ts +17 -0
- package/dist/browser/index.browser.js +2 -21
- package/dist/browser/index.browser.js.map +5 -37
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.node.cjs +12173 -2271
- package/dist/cjs/index.node.js.map +135 -27
- package/dist/cloud/auth.d.ts +19 -0
- package/dist/cloud/auth.d.ts.map +1 -0
- package/dist/cloud/auth.js +330 -0
- package/dist/cloud/auth.js.map +12 -0
- package/dist/cloud/backup.d.ts +18 -0
- package/dist/cloud/backup.d.ts.map +1 -0
- package/dist/cloud/backup.js +63 -0
- package/dist/cloud/backup.js.map +10 -0
- package/dist/cloud/base-url.d.ts +3 -0
- package/dist/cloud/base-url.d.ts.map +1 -0
- package/dist/cloud/base-url.js +77 -0
- package/dist/cloud/base-url.js.map +10 -0
- package/dist/cloud/bridge-client.d.ts +126 -0
- package/dist/cloud/bridge-client.d.ts.map +1 -0
- package/dist/cloud/bridge-client.js +432 -0
- package/dist/cloud/bridge-client.js.map +11 -0
- package/dist/cloud/cloud-api-key.d.ts +26 -0
- package/dist/cloud/cloud-api-key.d.ts.map +1 -0
- package/dist/cloud/cloud-api-key.js +60 -0
- package/dist/cloud/cloud-api-key.js.map +10 -0
- package/dist/cloud/cloud-manager.d.ts +33 -0
- package/dist/cloud/cloud-manager.d.ts.map +1 -0
- package/dist/cloud/cloud-manager.js +853 -0
- package/dist/cloud/cloud-manager.js.map +16 -0
- package/dist/cloud/cloud-proxy.d.ts +20 -0
- package/dist/cloud/cloud-proxy.d.ts.map +1 -0
- package/dist/cloud/cloud-proxy.js +54 -0
- package/dist/cloud/cloud-proxy.js.map +10 -0
- package/dist/cloud/cloud-wallet.d.ts +94 -0
- package/dist/cloud/cloud-wallet.d.ts.map +1 -0
- package/dist/cloud/cloud-wallet.js +5195 -0
- package/dist/cloud/cloud-wallet.js.map +92 -0
- package/dist/cloud/index.d.ts +9 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +30 -0
- package/dist/cloud/index.js.map +9 -0
- package/dist/cloud/reconnect.d.ts +26 -0
- package/dist/cloud/reconnect.d.ts.map +1 -0
- package/dist/cloud/reconnect.js +104 -0
- package/dist/cloud/reconnect.js.map +10 -0
- package/dist/cloud/validate-url.d.ts +2 -0
- package/dist/cloud/validate-url.d.ts.map +1 -0
- package/dist/cloud/validate-url.js +174 -0
- package/dist/cloud/validate-url.js.map +10 -0
- package/dist/cloud-providers/cloud-status.d.ts.map +1 -1
- package/dist/cloud-providers/cloud-status.js +78 -0
- package/dist/cloud-providers/cloud-status.js.map +10 -0
- package/dist/cloud-providers/container-health.d.ts.map +1 -1
- package/dist/cloud-providers/container-health.js +74 -0
- package/dist/cloud-providers/container-health.js.map +10 -0
- package/dist/cloud-providers/credit-balance.d.ts.map +1 -1
- package/dist/cloud-providers/credit-balance.js +85 -0
- package/dist/cloud-providers/credit-balance.js.map +10 -0
- package/dist/cloud-providers/index.d.ts.map +1 -1
- package/dist/cloud-providers/index.js +24 -0
- package/dist/cloud-providers/index.js.map +9 -0
- package/dist/cloud-providers/model-registry.d.ts.map +1 -1
- package/dist/cloud-providers/model-registry.js +71 -0
- package/dist/cloud-providers/model-registry.js.map +10 -0
- package/dist/index.browser.d.ts +4 -2
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12851 -0
- package/dist/index.js.map +145 -0
- package/dist/index.node.d.ts +15 -2
- package/dist/index.node.d.ts.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +169 -0
- package/dist/init.js.map +12 -0
- package/dist/lib/cloud-connection.d.ts +78 -0
- package/dist/lib/cloud-connection.d.ts.map +1 -0
- package/dist/lib/cloud-connection.js +731 -0
- package/dist/lib/cloud-connection.js.map +14 -0
- package/dist/lib/cloud-secrets.d.ts +23 -0
- package/dist/lib/cloud-secrets.d.ts.map +1 -0
- package/dist/lib/cloud-secrets.js +64 -0
- package/dist/lib/cloud-secrets.js.map +10 -0
- package/dist/lib/config-env.d.ts +5 -0
- package/dist/lib/config-env.d.ts.map +1 -0
- package/dist/lib/config-env.js +191 -0
- package/dist/lib/config-env.js.map +11 -0
- package/dist/lib/config-like.d.ts +40 -0
- package/dist/lib/config-like.d.ts.map +1 -0
- package/dist/lib/config-like.js +103 -0
- package/dist/lib/config-like.js.map +10 -0
- package/dist/lib/credential-type-map.d.ts +53 -0
- package/dist/lib/credential-type-map.d.ts.map +1 -0
- package/dist/lib/credential-type-map.js +88 -0
- package/dist/lib/credential-type-map.js.map +10 -0
- package/dist/lib/feature-flags.d.ts +2 -0
- package/dist/lib/feature-flags.d.ts.map +1 -0
- package/dist/lib/feature-flags.js +40 -0
- package/dist/lib/feature-flags.js.map +10 -0
- package/dist/lib/http.d.ts +22 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +107 -0
- package/dist/lib/http.js.map +10 -0
- package/dist/lib/server-cloud-tts.d.ts +34 -0
- package/dist/lib/server-cloud-tts.d.ts.map +1 -0
- package/dist/lib/server-cloud-tts.js +549 -0
- package/dist/lib/server-cloud-tts.js.map +13 -0
- package/dist/lib/state-paths.d.ts +4 -0
- package/dist/lib/state-paths.d.ts.map +1 -0
- package/dist/lib/state-paths.js +52 -0
- package/dist/lib/state-paths.js.map +10 -0
- package/dist/lib/tts-debug.d.ts +4 -0
- package/dist/lib/tts-debug.d.ts.map +1 -0
- package/dist/lib/tts-debug.js +57 -0
- package/dist/lib/tts-debug.js.map +10 -0
- package/dist/models/embeddings.d.ts.map +1 -1
- package/dist/models/embeddings.js +319 -0
- package/dist/models/embeddings.js.map +13 -0
- package/dist/models/image.d.ts.map +1 -1
- package/dist/models/image.js +374 -0
- package/dist/models/image.js.map +14 -0
- package/dist/models/index.d.ts +1 -2
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +1386 -0
- package/dist/models/index.js.map +20 -0
- package/dist/models/research.d.ts.map +1 -1
- package/dist/models/research.js +324 -0
- package/dist/models/research.js.map +13 -0
- package/dist/models/speech.d.ts.map +1 -1
- package/dist/models/speech.js +273 -0
- package/dist/models/speech.js.map +13 -0
- package/dist/models/text.d.ts +5 -2
- package/dist/models/text.d.ts.map +1 -1
- package/dist/models/text.js +803 -0
- package/dist/models/text.js.map +15 -0
- package/dist/models/tokenization.d.ts.map +1 -1
- package/dist/models/tokenization.js +65 -0
- package/dist/models/tokenization.js.map +10 -0
- package/dist/models/transcription.d.ts.map +1 -1
- package/dist/models/transcription.js +283 -0
- package/dist/models/transcription.js.map +13 -0
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.node.js +12171 -2266
- package/dist/node/index.node.js.map +135 -27
- package/dist/onboarding.d.ts +35 -0
- package/dist/onboarding.d.ts.map +1 -0
- package/dist/onboarding.js +883 -0
- package/dist/onboarding.js.map +14 -0
- package/dist/plugin.d.ts +20 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +7611 -0
- package/dist/plugin.js.map +104 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +127 -0
- package/dist/providers/openai.js.map +11 -0
- package/dist/register-routes.d.ts +2 -0
- package/dist/register-routes.d.ts.map +1 -0
- package/dist/register-routes.js +7612 -0
- package/dist/register-routes.js.map +105 -0
- package/dist/routes/cloud-billing-routes.d.ts +9 -0
- package/dist/routes/cloud-billing-routes.d.ts.map +1 -0
- package/dist/routes/cloud-billing-routes.js +807 -0
- package/dist/routes/cloud-billing-routes.js.map +14 -0
- package/dist/routes/cloud-compat-routes.d.ts +10 -0
- package/dist/routes/cloud-compat-routes.d.ts.map +1 -0
- package/dist/routes/cloud-compat-routes.js +538 -0
- package/dist/routes/cloud-compat-routes.js.map +14 -0
- package/dist/routes/cloud-features-routes.d.ts +9 -0
- package/dist/routes/cloud-features-routes.d.ts.map +1 -0
- package/dist/routes/cloud-features-routes.js +124 -0
- package/dist/routes/cloud-features-routes.js.map +11 -0
- package/dist/routes/cloud-provisioning.d.ts +14 -0
- package/dist/routes/cloud-provisioning.d.ts.map +1 -0
- package/dist/routes/cloud-provisioning.js +37 -0
- package/dist/routes/cloud-provisioning.js.map +10 -0
- package/dist/routes/cloud-relay-routes.d.ts +22 -0
- package/dist/routes/cloud-relay-routes.d.ts.map +1 -0
- package/dist/routes/cloud-relay-routes.js +60 -0
- package/dist/routes/cloud-relay-routes.js.map +10 -0
- package/dist/routes/cloud-routes-autonomous.d.ts +83 -0
- package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -0
- package/dist/routes/cloud-routes-autonomous.js +6134 -0
- package/dist/routes/cloud-routes-autonomous.js.map +97 -0
- package/dist/routes/cloud-routes.d.ts +35 -0
- package/dist/routes/cloud-routes.d.ts.map +1 -0
- package/dist/routes/cloud-routes.js +6888 -0
- package/dist/routes/cloud-routes.js.map +100 -0
- package/dist/routes/cloud-status-routes-autonomous.d.ts +15 -0
- package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -0
- package/dist/routes/cloud-status-routes-autonomous.js +396 -0
- package/dist/routes/cloud-status-routes-autonomous.js.map +13 -0
- package/dist/routes/cloud-status-routes.d.ts +4 -0
- package/dist/routes/cloud-status-routes.d.ts.map +1 -0
- package/dist/routes/cloud-status-routes.js +771 -0
- package/dist/routes/cloud-status-routes.js.map +15 -0
- package/dist/services/cloud-auth.d.ts +140 -5
- package/dist/services/cloud-auth.d.ts.map +1 -1
- package/dist/services/cloud-auth.js +363 -0
- package/dist/services/cloud-auth.js.map +12 -0
- package/dist/services/cloud-backup.d.ts.map +1 -1
- package/dist/services/cloud-backup.js +176 -0
- package/dist/services/cloud-backup.js.map +11 -0
- package/dist/services/cloud-bootstrap.d.ts +38 -0
- package/dist/services/cloud-bootstrap.d.ts.map +1 -0
- package/dist/services/cloud-bootstrap.js +84 -0
- package/dist/services/cloud-bootstrap.js.map +10 -0
- package/dist/services/cloud-bridge.d.ts +1 -1
- package/dist/services/cloud-bridge.d.ts.map +1 -1
- package/dist/services/cloud-bridge.js +308 -0
- package/dist/services/cloud-bridge.js.map +11 -0
- package/dist/services/cloud-container.d.ts.map +1 -1
- package/dist/services/cloud-container.js +241 -0
- package/dist/services/cloud-container.js.map +11 -0
- package/dist/services/cloud-credential-provider.d.ts +55 -0
- package/dist/services/cloud-credential-provider.d.ts.map +1 -0
- package/dist/services/cloud-credential-provider.js +190 -0
- package/dist/services/cloud-credential-provider.js.map +11 -0
- package/dist/services/cloud-managed-gateway-relay.d.ts +38 -0
- package/dist/services/cloud-managed-gateway-relay.d.ts.map +1 -0
- package/dist/services/cloud-managed-gateway-relay.js +479 -0
- package/dist/services/cloud-managed-gateway-relay.js.map +10 -0
- package/dist/services/cloud-model-registry.d.ts.map +1 -1
- package/dist/services/cloud-model-registry.js +175 -0
- package/dist/services/cloud-model-registry.js.map +10 -0
- package/dist/services/index.d.ts +3 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +29 -0
- package/dist/services/index.js.map +9 -0
- package/dist/types/cloud.d.ts +41 -19
- package/dist/types/cloud.d.ts.map +1 -1
- package/dist/types/cloud.js +52 -0
- package/dist/types/cloud.js.map +10 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +24 -0
- package/dist/types/index.js.map +9 -0
- package/dist/utils/cloud-api.d.ts +2 -27
- package/dist/utils/cloud-api.d.ts.map +1 -1
- package/dist/utils/cloud-api.js +33 -0
- package/dist/utils/cloud-api.js.map +10 -0
- package/dist/utils/cloud-sdk/client.d.ts +133 -0
- package/dist/utils/cloud-sdk/client.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/client.js +3561 -0
- package/dist/utils/cloud-sdk/client.js.map +13 -0
- package/dist/utils/cloud-sdk/http.d.ts +37 -0
- package/dist/utils/cloud-sdk/http.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/http.js +237 -0
- package/dist/utils/cloud-sdk/http.js.map +11 -0
- package/dist/utils/cloud-sdk/index.d.ts +6 -0
- package/dist/utils/cloud-sdk/index.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/index.js +29 -0
- package/dist/utils/cloud-sdk/index.js.map +9 -0
- package/dist/utils/cloud-sdk/public-routes.d.ts +5377 -0
- package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/public-routes.js +2950 -0
- package/dist/utils/cloud-sdk/public-routes.js.map +10 -0
- package/dist/utils/cloud-sdk/types.cloud-api.d.ts +101 -0
- package/dist/utils/cloud-sdk/types.cloud-api.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/types.cloud-api.js +2 -0
- package/dist/utils/cloud-sdk/types.cloud-api.js.map +9 -0
- package/dist/utils/cloud-sdk/types.d.ts +655 -0
- package/dist/utils/cloud-sdk/types.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/types.js +29 -0
- package/dist/utils/cloud-sdk/types.js.map +10 -0
- package/dist/utils/config.d.ts +7 -3
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +137 -0
- package/dist/utils/config.js.map +10 -0
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/events.js +43 -0
- package/dist/utils/events.js.map +10 -0
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +103 -0
- package/dist/utils/helpers.js.map +10 -0
- package/dist/utils/responses-output.d.ts +13 -0
- package/dist/utils/responses-output.d.ts.map +1 -0
- package/dist/utils/responses-output.js +102 -0
- package/dist/utils/responses-output.js.map +10 -0
- package/dist/utils/sdk-client.d.ts +5 -0
- package/dist/utils/sdk-client.d.ts.map +1 -0
- package/dist/utils/sdk-client.js +144 -0
- package/dist/utils/sdk-client.js.map +11 -0
- package/package.json +108 -19
- package/src/cloud/auth.ts +175 -0
- package/src/cloud/backup.ts +46 -0
- package/src/cloud/base-url.ts +62 -0
- package/src/cloud/bridge-client.ts +602 -0
- package/src/cloud/cloud-api-key.ts +80 -0
- package/src/cloud/cloud-manager.ts +163 -0
- package/src/cloud/cloud-proxy.ts +52 -0
- package/src/cloud/cloud-wallet.ts +341 -0
- package/src/cloud/index.ts +28 -0
- package/src/cloud/reconnect.ts +111 -0
- package/src/cloud/validate-url.ts +181 -0
- package/src/cloud-providers/cloud-status.ts +75 -0
- package/src/cloud-providers/container-health.ts +68 -0
- package/src/cloud-providers/credit-balance.ts +70 -0
- package/src/cloud-providers/index.ts +3 -0
- package/src/cloud-providers/model-registry.ts +74 -0
- package/src/index.browser.ts +10 -0
- package/src/index.node.ts +39 -0
- package/src/index.ts +347 -0
- package/src/init.ts +39 -0
- package/src/lib/cloud-connection.ts +663 -0
- package/src/lib/cloud-secrets.ts +58 -0
- package/src/lib/config-env.ts +168 -0
- package/src/lib/config-like.ts +149 -0
- package/src/lib/credential-type-map.ts +130 -0
- package/src/lib/feature-flags.ts +26 -0
- package/src/lib/http.ts +139 -0
- package/src/lib/server-cloud-tts.ts +609 -0
- package/src/lib/state-paths.ts +28 -0
- package/src/lib/tts-debug.ts +34 -0
- package/src/models/embeddings.ts +234 -0
- package/src/models/image.ts +219 -0
- package/src/models/index.ts +16 -0
- package/src/models/research.ts +265 -0
- package/src/models/speech.ts +78 -0
- package/src/models/text.ts +899 -0
- package/src/models/tokenization.ts +67 -0
- package/src/models/transcription.ts +97 -0
- package/src/onboarding.ts +396 -0
- package/src/plugin.ts +243 -0
- package/src/providers/openai.ts +16 -0
- package/src/register-routes.ts +6 -0
- package/src/routes/cloud-billing-routes.ts +754 -0
- package/src/routes/cloud-compat-routes.ts +314 -0
- package/src/routes/cloud-features-routes.ts +57 -0
- package/src/routes/cloud-provisioning.ts +37 -0
- package/src/routes/cloud-relay-routes.ts +89 -0
- package/src/routes/cloud-routes-autonomous.ts +996 -0
- package/src/routes/cloud-routes.ts +576 -0
- package/src/routes/cloud-status-routes-autonomous.ts +234 -0
- package/src/routes/cloud-status-routes.ts +73 -0
- package/src/services/cloud-auth.ts +567 -0
- package/src/services/cloud-backup.ts +208 -0
- package/src/services/cloud-bootstrap.ts +108 -0
- package/src/services/cloud-bridge.ts +386 -0
- package/src/services/cloud-container.ts +297 -0
- package/src/services/cloud-credential-provider.ts +210 -0
- package/src/services/cloud-managed-gateway-relay.ts +663 -0
- package/src/services/cloud-model-registry.ts +202 -0
- package/src/services/index.ts +17 -0
- package/{types → src/types}/cloud.ts +52 -29
- package/{types → src/types}/index.ts +6 -0
- package/src/utils/cloud-api.ts +10 -0
- package/src/utils/cloud-sdk/client.ts +735 -0
- package/src/utils/cloud-sdk/http.ts +291 -0
- package/src/utils/cloud-sdk/index.ts +23 -0
- package/src/utils/cloud-sdk/public-routes.ts +5070 -0
- package/src/utils/cloud-sdk/types.cloud-api.ts +120 -0
- package/src/utils/cloud-sdk/types.ts +762 -0
- package/src/utils/config.ts +174 -0
- package/src/utils/events.ts +37 -0
- package/src/utils/helpers.ts +107 -0
- package/src/utils/responses-output.ts +115 -0
- package/src/utils/sdk-client.ts +37 -0
- package/dist/actions/check-credits.d.ts +0 -6
- package/dist/actions/check-credits.d.ts.map +0 -1
- package/dist/actions/freeze-agent.d.ts +0 -9
- package/dist/actions/freeze-agent.d.ts.map +0 -1
- package/dist/actions/index.d.ts +0 -5
- package/dist/actions/index.d.ts.map +0 -1
- package/dist/actions/provision-agent.d.ts +0 -8
- package/dist/actions/provision-agent.d.ts.map +0 -1
- package/dist/actions/resume-agent.d.ts +0 -9
- package/dist/actions/resume-agent.d.ts.map +0 -1
- package/dist/build.d.ts +0 -3
- package/dist/build.d.ts.map +0 -1
- package/dist/generated/specs/specs.d.ts +0 -55
- package/dist/generated/specs/specs.d.ts.map +0 -1
- package/dist/models/object.d.ts +0 -4
- package/dist/models/object.d.ts.map +0 -1
- package/dist/utils/forwarded-settings.d.ts +0 -8
- package/dist/utils/forwarded-settings.d.ts.map +0 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
DetokenizeTextParams,
|
|
3
|
+
IAgentRuntime,
|
|
4
|
+
ModelTypeName,
|
|
5
|
+
TokenizeTextParams,
|
|
6
|
+
} from "@elizaos/core";
|
|
7
|
+
import { ModelType } from "@elizaos/core";
|
|
8
|
+
import { DEFAULT_ELIZA_CLOUD_TEXT_MODEL } from "@elizaos/core";
|
|
9
|
+
import { encodingForModel, type TiktokenModel } from "js-tiktoken";
|
|
10
|
+
|
|
11
|
+
type ProcessEnvLike = Record<string, string | undefined>;
|
|
12
|
+
|
|
13
|
+
function getProcessEnv(): ProcessEnvLike {
|
|
14
|
+
if (typeof process === "undefined") {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
return process.env as ProcessEnvLike;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const env = getProcessEnv();
|
|
21
|
+
|
|
22
|
+
function getConfiguredTokenizerModel(model: ModelTypeName): string {
|
|
23
|
+
return model === ModelType.TEXT_SMALL
|
|
24
|
+
? (env.ELIZAOS_CLOUD_SMALL_MODEL ?? env.SMALL_MODEL ?? DEFAULT_ELIZA_CLOUD_TEXT_MODEL)
|
|
25
|
+
: (env.ELIZAOS_CLOUD_LARGE_MODEL ?? env.LARGE_MODEL ?? DEFAULT_ELIZA_CLOUD_TEXT_MODEL);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function tiktokenCandidates(modelName: string): string[] {
|
|
29
|
+
const slashIndex = modelName.indexOf("/");
|
|
30
|
+
const providerless = slashIndex >= 0 ? modelName.slice(slashIndex + 1) : modelName;
|
|
31
|
+
const baseVariant = providerless.split(":")[0] || providerless;
|
|
32
|
+
return [modelName, providerless, baseVariant, "gpt-4o"];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function getEncodingForConfiguredModel(modelName: string) {
|
|
36
|
+
for (const candidate of tiktokenCandidates(modelName)) {
|
|
37
|
+
try {
|
|
38
|
+
return encodingForModel(candidate as TiktokenModel);
|
|
39
|
+
} catch {
|
|
40
|
+
// Try the next compatible tokenizer name.
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return encodingForModel("gpt-4o" as TiktokenModel);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function tokenizeText(model: ModelTypeName, prompt: string): Promise<number[]> {
|
|
47
|
+
const tokens = getEncodingForConfiguredModel(getConfiguredTokenizerModel(model)).encode(prompt);
|
|
48
|
+
return tokens;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function detokenizeText(model: ModelTypeName, tokens: number[]): Promise<string> {
|
|
52
|
+
return getEncodingForConfiguredModel(getConfiguredTokenizerModel(model)).decode(tokens);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export async function handleTokenizerEncode(
|
|
56
|
+
_runtime: IAgentRuntime,
|
|
57
|
+
{ prompt, modelType = ModelType.TEXT_LARGE }: TokenizeTextParams
|
|
58
|
+
): Promise<number[]> {
|
|
59
|
+
return await tokenizeText(modelType ?? ModelType.TEXT_LARGE, prompt);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export async function handleTokenizerDecode(
|
|
63
|
+
_runtime: IAgentRuntime,
|
|
64
|
+
{ tokens, modelType = ModelType.TEXT_LARGE }: DetokenizeTextParams
|
|
65
|
+
): Promise<string> {
|
|
66
|
+
return await detokenizeText(modelType ?? ModelType.TEXT_LARGE, tokens);
|
|
67
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { IAgentRuntime } from "@elizaos/core";
|
|
2
|
+
import { logger } from "@elizaos/core";
|
|
3
|
+
import type { OpenAITranscriptionParams } from "../types";
|
|
4
|
+
import { getSetting } from "../utils/config";
|
|
5
|
+
import { detectAudioMimeType } from "../utils/helpers";
|
|
6
|
+
import { createElizaCloudClient } from "../utils/sdk-client";
|
|
7
|
+
|
|
8
|
+
export async function handleTranscription(
|
|
9
|
+
runtime: IAgentRuntime,
|
|
10
|
+
input: Blob | File | Buffer | OpenAITranscriptionParams
|
|
11
|
+
): Promise<string> {
|
|
12
|
+
let modelName = getSetting(runtime, "ELIZAOS_CLOUD_TRANSCRIPTION_MODEL", "gpt-5-mini-transcribe");
|
|
13
|
+
logger.log(`[ELIZAOS_CLOUD] Using TRANSCRIPTION model: ${modelName}`);
|
|
14
|
+
|
|
15
|
+
let blob: Blob;
|
|
16
|
+
let extraParams: OpenAITranscriptionParams | null = null;
|
|
17
|
+
|
|
18
|
+
if (input instanceof Blob || input instanceof File) {
|
|
19
|
+
blob = input as Blob;
|
|
20
|
+
} else if (Buffer.isBuffer(input)) {
|
|
21
|
+
const detectedMimeType = detectAudioMimeType(input);
|
|
22
|
+
logger.debug(`Auto-detected audio MIME type: ${detectedMimeType}`);
|
|
23
|
+
blob = new Blob([input] as never, { type: detectedMimeType });
|
|
24
|
+
} else if (
|
|
25
|
+
typeof input === "object" &&
|
|
26
|
+
input !== null &&
|
|
27
|
+
"audio" in input &&
|
|
28
|
+
input.audio != null
|
|
29
|
+
) {
|
|
30
|
+
const params = input as OpenAITranscriptionParams;
|
|
31
|
+
if (
|
|
32
|
+
!(params.audio instanceof Blob) &&
|
|
33
|
+
!(params.audio instanceof File) &&
|
|
34
|
+
!Buffer.isBuffer(params.audio)
|
|
35
|
+
) {
|
|
36
|
+
throw new Error("TRANSCRIPTION param 'audio' must be a Blob/File/Buffer.");
|
|
37
|
+
}
|
|
38
|
+
if (Buffer.isBuffer(params.audio)) {
|
|
39
|
+
let mimeType = params.mimeType;
|
|
40
|
+
if (!mimeType) {
|
|
41
|
+
mimeType = detectAudioMimeType(params.audio);
|
|
42
|
+
logger.debug(`Auto-detected audio MIME type: ${mimeType}`);
|
|
43
|
+
} else {
|
|
44
|
+
logger.debug(`Using provided MIME type: ${mimeType}`);
|
|
45
|
+
}
|
|
46
|
+
blob = new Blob([params.audio] as never, { type: mimeType });
|
|
47
|
+
} else {
|
|
48
|
+
blob = params.audio as Blob;
|
|
49
|
+
}
|
|
50
|
+
extraParams = params;
|
|
51
|
+
if (typeof params.model === "string" && params.model) {
|
|
52
|
+
modelName = params.model;
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
throw new Error(
|
|
56
|
+
"TRANSCRIPTION expects a Blob/File/Buffer or an object { audio: Blob/File/Buffer, mimeType?, language?, response_format?, timestampGranularities?, prompt?, temperature?, model? }"
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const mime = (blob as File).type || "audio/webm";
|
|
61
|
+
const filename =
|
|
62
|
+
(blob as File).name ||
|
|
63
|
+
(mime.includes("mp3") || mime.includes("mpeg")
|
|
64
|
+
? "recording.mp3"
|
|
65
|
+
: mime.includes("ogg")
|
|
66
|
+
? "recording.ogg"
|
|
67
|
+
: mime.includes("wav")
|
|
68
|
+
? "recording.wav"
|
|
69
|
+
: mime.includes("webm")
|
|
70
|
+
? "recording.webm"
|
|
71
|
+
: "recording.bin");
|
|
72
|
+
|
|
73
|
+
const formData = new FormData();
|
|
74
|
+
formData.append("audio", blob, filename);
|
|
75
|
+
if (extraParams) {
|
|
76
|
+
if (typeof extraParams.language === "string") {
|
|
77
|
+
formData.append("languageCode", String(extraParams.language));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
try {
|
|
82
|
+
const response = await createElizaCloudClient(runtime).routes.postApiV1VoiceSttRaw({
|
|
83
|
+
body: formData,
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
if (!response.ok) {
|
|
87
|
+
throw new Error(`Failed to transcribe audio: ${response.status} ${response.statusText}`);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const data = (await response.json()) as { text: string };
|
|
91
|
+
return data.text || "";
|
|
92
|
+
} catch (error) {
|
|
93
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
94
|
+
logger.error(`TRANSCRIPTION error: ${message}`);
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud onboarding flow for Eliza Cloud integration.
|
|
3
|
+
*
|
|
4
|
+
* Handles availability check → browser-based auth → agent provisioning
|
|
5
|
+
* during `runFirstTimeSetup()`. Extracted to keep `eliza.ts` manageable.
|
|
6
|
+
*
|
|
7
|
+
* @module cloud-onboarding
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { logger } from "@elizaos/core";
|
|
11
|
+
import type { StylePreset } from "@elizaos/core";
|
|
12
|
+
import { type CloudLoginResult, cloudLogin } from "./cloud/auth.js";
|
|
13
|
+
import { normalizeCloudSiteUrl } from "./cloud/base-url.js";
|
|
14
|
+
import {
|
|
15
|
+
type CloudAgentCreateParams,
|
|
16
|
+
ElizaCloudClient,
|
|
17
|
+
} from "./cloud/bridge-client.js";
|
|
18
|
+
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Types
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
|
|
23
|
+
/** Lazy-loaded @clack/prompts module type (matches eliza.ts pattern). */
|
|
24
|
+
type ClackModule = typeof import("@clack/prompts");
|
|
25
|
+
|
|
26
|
+
/** Result of a successful cloud onboarding flow. */
|
|
27
|
+
export interface CloudOnboardingResult {
|
|
28
|
+
apiKey: string;
|
|
29
|
+
agentId: string | undefined;
|
|
30
|
+
baseUrl: string;
|
|
31
|
+
bridgeUrl?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Constants
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
|
|
38
|
+
const DEFAULT_CLOUD_BASE_URL = "https://www.elizacloud.ai";
|
|
39
|
+
const PROVISION_TIMEOUT_MS = 120_000; // 2 minutes
|
|
40
|
+
const PROVISION_POLL_INTERVAL_MS = 3_000;
|
|
41
|
+
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Availability check
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Quick pre-flight check: is Eliza Cloud accepting new agents?
|
|
48
|
+
* Returns null if available, or an error message string if not.
|
|
49
|
+
*/
|
|
50
|
+
export async function checkCloudAvailability(
|
|
51
|
+
baseUrl: string,
|
|
52
|
+
): Promise<string | null> {
|
|
53
|
+
try {
|
|
54
|
+
const url = `${normalizeCloudSiteUrl(baseUrl)}/api/compat/availability`;
|
|
55
|
+
const res = await fetch(url, {
|
|
56
|
+
method: "GET",
|
|
57
|
+
headers: { Accept: "application/json" },
|
|
58
|
+
signal: AbortSignal.timeout(10_000),
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
if (!res.ok) {
|
|
62
|
+
return `Cloud returned HTTP ${res.status}. It may be temporarily unavailable.`;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const body = (await res.json()) as {
|
|
66
|
+
success?: boolean;
|
|
67
|
+
data?: { acceptingNewAgents?: boolean; availableSlots?: number };
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
if (!body.success || !body.data?.acceptingNewAgents) {
|
|
71
|
+
return "Eliza Cloud is currently at capacity. Try again later or run locally.";
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return null; // Available!
|
|
75
|
+
} catch (err) {
|
|
76
|
+
const msg = String(err);
|
|
77
|
+
if (msg.includes("timed out") || msg.includes("timeout")) {
|
|
78
|
+
return "Could not reach Eliza Cloud (request timed out). Check your internet connection.";
|
|
79
|
+
}
|
|
80
|
+
return `Could not reach Eliza Cloud: ${msg}`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// Cloud auth wrapper (with clack UI)
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Run the Eliza Cloud browser-based login, wrapped with clack spinners.
|
|
90
|
+
* Returns the API key/result or null if the user wants to fall back.
|
|
91
|
+
*/
|
|
92
|
+
async function runCloudAuth(
|
|
93
|
+
clack: ClackModule,
|
|
94
|
+
baseUrl: string,
|
|
95
|
+
): Promise<CloudLoginResult | null> {
|
|
96
|
+
const spinner = clack.spinner();
|
|
97
|
+
spinner.start("Connecting to Eliza Cloud...");
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
const result = await cloudLogin({
|
|
101
|
+
baseUrl,
|
|
102
|
+
timeoutMs: 300_000, // 5 minutes
|
|
103
|
+
onBrowserUrl: (url: string) => {
|
|
104
|
+
spinner.stop("Opening your browser to log in...");
|
|
105
|
+
clack.log.info(`If the browser didn't open, visit:\n ${url}`);
|
|
106
|
+
|
|
107
|
+
// Try to open the browser
|
|
108
|
+
openBrowser(url).catch(() => {
|
|
109
|
+
// Fallback: user can manually navigate
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// Restart spinner for polling
|
|
113
|
+
spinner.start("Waiting for login in browser...");
|
|
114
|
+
},
|
|
115
|
+
onPollStatus: (status: string) => {
|
|
116
|
+
if (status === "pending") {
|
|
117
|
+
spinner.message("Waiting for login in browser...");
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
spinner.stop("✓ Logged in to Eliza Cloud!");
|
|
123
|
+
return result;
|
|
124
|
+
} catch (err) {
|
|
125
|
+
const msg = String(err);
|
|
126
|
+
spinner.stop(`Login failed: ${msg}`);
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
// Agent provisioning
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Create and provision a cloud agent, polling until it's running.
|
|
137
|
+
* Returns the agent ID or null if provisioning fails.
|
|
138
|
+
*/
|
|
139
|
+
async function provisionCloudAgent(
|
|
140
|
+
clack: ClackModule,
|
|
141
|
+
client: ElizaCloudClient,
|
|
142
|
+
agentName: string,
|
|
143
|
+
preset?: StylePreset,
|
|
144
|
+
): Promise<{ agentId: string; bridgeUrl?: string } | null> {
|
|
145
|
+
const spinner = clack.spinner();
|
|
146
|
+
spinner.start("Creating your cloud agent...");
|
|
147
|
+
|
|
148
|
+
try {
|
|
149
|
+
// Build the agent config from the chosen style preset
|
|
150
|
+
const agentConfig: Record<string, unknown> = {};
|
|
151
|
+
if (preset) {
|
|
152
|
+
agentConfig.bio = preset.bio;
|
|
153
|
+
agentConfig.system = preset.system;
|
|
154
|
+
agentConfig.style = preset.style;
|
|
155
|
+
agentConfig.adjectives = preset.adjectives;
|
|
156
|
+
agentConfig.topics = preset.topics;
|
|
157
|
+
agentConfig.postExamples = preset.postExamples;
|
|
158
|
+
agentConfig.messageExamples = preset.messageExamples;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const params: CloudAgentCreateParams = {
|
|
162
|
+
agentName,
|
|
163
|
+
agentConfig,
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
const agent = await client.createAgent(params);
|
|
167
|
+
const agentId = agent.id;
|
|
168
|
+
|
|
169
|
+
spinner.message("Agent created! Provisioning cloud environment...");
|
|
170
|
+
|
|
171
|
+
// Poll for running status
|
|
172
|
+
const deadline = Date.now() + PROVISION_TIMEOUT_MS;
|
|
173
|
+
let lastStatus = agent.status;
|
|
174
|
+
|
|
175
|
+
while (Date.now() < deadline) {
|
|
176
|
+
await sleep(PROVISION_POLL_INTERVAL_MS);
|
|
177
|
+
|
|
178
|
+
try {
|
|
179
|
+
const current = await client.getAgent(agentId);
|
|
180
|
+
lastStatus = current.status;
|
|
181
|
+
|
|
182
|
+
switch (lastStatus) {
|
|
183
|
+
case "running":
|
|
184
|
+
case "completed":
|
|
185
|
+
spinner.stop(`☁️ Cloud agent "${agentName}" is running!`);
|
|
186
|
+
return { agentId, bridgeUrl: current.bridgeUrl };
|
|
187
|
+
|
|
188
|
+
case "failed":
|
|
189
|
+
case "error":
|
|
190
|
+
spinner.stop(
|
|
191
|
+
`Provisioning failed: ${current.errorMessage ?? "unknown error"}`,
|
|
192
|
+
);
|
|
193
|
+
return null;
|
|
194
|
+
|
|
195
|
+
case "queued":
|
|
196
|
+
spinner.message("Queued — waiting for available slot...");
|
|
197
|
+
break;
|
|
198
|
+
|
|
199
|
+
case "provisioning":
|
|
200
|
+
spinner.message("Provisioning cloud environment...");
|
|
201
|
+
break;
|
|
202
|
+
|
|
203
|
+
default:
|
|
204
|
+
spinner.message(`Status: ${lastStatus}...`);
|
|
205
|
+
}
|
|
206
|
+
} catch (pollErr) {
|
|
207
|
+
// Transient polling error — keep trying
|
|
208
|
+
logger.debug(`[cloud-onboarding] Poll error: ${String(pollErr)}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Timed out
|
|
213
|
+
spinner.stop(
|
|
214
|
+
`Provisioning timed out (last status: ${lastStatus}). The agent may still be starting up.`,
|
|
215
|
+
);
|
|
216
|
+
// Return the ID anyway — user can reconnect later
|
|
217
|
+
return { agentId };
|
|
218
|
+
} catch (err) {
|
|
219
|
+
const msg = String(err);
|
|
220
|
+
spinner.stop(`Failed to create cloud agent: ${msg}`);
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// ---------------------------------------------------------------------------
|
|
226
|
+
// Main orchestrator
|
|
227
|
+
// ---------------------------------------------------------------------------
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Run the full cloud onboarding flow:
|
|
231
|
+
* 1. Check availability
|
|
232
|
+
* 2. Authenticate via browser
|
|
233
|
+
* 3. Create + provision agent
|
|
234
|
+
*
|
|
235
|
+
* Returns the result or null if the user cancels / an error occurs.
|
|
236
|
+
* On failure, the caller should fall back to local mode.
|
|
237
|
+
*/
|
|
238
|
+
export async function runCloudOnboarding(
|
|
239
|
+
clack: ClackModule,
|
|
240
|
+
agentName: string,
|
|
241
|
+
preset?: StylePreset,
|
|
242
|
+
baseUrl?: string,
|
|
243
|
+
): Promise<CloudOnboardingResult | null> {
|
|
244
|
+
const resolvedBaseUrl = normalizeCloudSiteUrl(
|
|
245
|
+
baseUrl ?? DEFAULT_CLOUD_BASE_URL,
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
// ── Step 1: Availability check ──────────────────────────────────────
|
|
249
|
+
const unavailableReason = await checkCloudAvailability(resolvedBaseUrl);
|
|
250
|
+
if (unavailableReason) {
|
|
251
|
+
clack.log.warn(unavailableReason);
|
|
252
|
+
|
|
253
|
+
const fallback = await clack.confirm({
|
|
254
|
+
message: "Run locally instead?",
|
|
255
|
+
initialValue: true,
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
if (clack.isCancel(fallback) || fallback) {
|
|
259
|
+
return null; // Fall back to local
|
|
260
|
+
}
|
|
261
|
+
// User said "no" to fallback — try auth anyway (maybe availability is
|
|
262
|
+
// temporarily wrong).
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// ── Step 2: Browser-based auth ──────────────────────────────────────
|
|
266
|
+
const authResult = await runCloudAuth(clack, resolvedBaseUrl);
|
|
267
|
+
if (!authResult) {
|
|
268
|
+
clack.log.warn("Cloud login was not completed.");
|
|
269
|
+
|
|
270
|
+
const retry = await clack.confirm({
|
|
271
|
+
message: "Try again, or run locally?",
|
|
272
|
+
active: "Try again",
|
|
273
|
+
inactive: "Run locally",
|
|
274
|
+
initialValue: false,
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
if (clack.isCancel(retry) || !retry) {
|
|
278
|
+
return null; // Fall back to local
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Retry auth once
|
|
282
|
+
const retryResult = await runCloudAuth(clack, resolvedBaseUrl);
|
|
283
|
+
if (!retryResult) {
|
|
284
|
+
clack.log.warn("Login was not completed. Falling back to local mode.");
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Use retry result
|
|
289
|
+
return await finishProvisioning(
|
|
290
|
+
clack,
|
|
291
|
+
resolvedBaseUrl,
|
|
292
|
+
retryResult,
|
|
293
|
+
agentName,
|
|
294
|
+
preset,
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
return await finishProvisioning(
|
|
299
|
+
clack,
|
|
300
|
+
resolvedBaseUrl,
|
|
301
|
+
authResult,
|
|
302
|
+
agentName,
|
|
303
|
+
preset,
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Complete provisioning after successful auth.
|
|
309
|
+
*/
|
|
310
|
+
async function finishProvisioning(
|
|
311
|
+
clack: ClackModule,
|
|
312
|
+
baseUrl: string,
|
|
313
|
+
authResult: CloudLoginResult,
|
|
314
|
+
agentName: string,
|
|
315
|
+
preset?: StylePreset,
|
|
316
|
+
): Promise<CloudOnboardingResult | null> {
|
|
317
|
+
// ── Step 3: Create + provision agent ──────────────────────────────
|
|
318
|
+
const client = new ElizaCloudClient(baseUrl, authResult.apiKey);
|
|
319
|
+
const provisionResult = await provisionCloudAgent(
|
|
320
|
+
clack,
|
|
321
|
+
client,
|
|
322
|
+
agentName,
|
|
323
|
+
preset,
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
if (!provisionResult) {
|
|
327
|
+
clack.log.warn(
|
|
328
|
+
"Cloud provisioning did not complete. You can try `eliza cloud connect` later.",
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
const runLocal = await clack.confirm({
|
|
332
|
+
message: "Continue with local setup instead?",
|
|
333
|
+
initialValue: true,
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
if (clack.isCancel(runLocal) || runLocal) {
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// User doesn't want local either — just return the auth result
|
|
341
|
+
// so config is saved (they can reconnect later)
|
|
342
|
+
return {
|
|
343
|
+
apiKey: authResult.apiKey,
|
|
344
|
+
agentId: undefined, // No agent provisioned yet
|
|
345
|
+
baseUrl,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
return {
|
|
350
|
+
apiKey: authResult.apiKey,
|
|
351
|
+
agentId: provisionResult.agentId,
|
|
352
|
+
baseUrl,
|
|
353
|
+
bridgeUrl: provisionResult.bridgeUrl,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// ---------------------------------------------------------------------------
|
|
358
|
+
// Helpers
|
|
359
|
+
// ---------------------------------------------------------------------------
|
|
360
|
+
|
|
361
|
+
function sleep(ms: number): Promise<void> {
|
|
362
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Try to open a URL in the user's default browser.
|
|
367
|
+
* Falls back silently — the URL is also printed to the terminal.
|
|
368
|
+
*
|
|
369
|
+
* Uses execFile with an args array (not exec with string interpolation)
|
|
370
|
+
* to avoid shell injection via crafted URLs.
|
|
371
|
+
*/
|
|
372
|
+
async function openBrowser(url: string): Promise<void> {
|
|
373
|
+
const { execFile } = await import("node:child_process");
|
|
374
|
+
const { platform } = await import("node:os");
|
|
375
|
+
|
|
376
|
+
const p = platform();
|
|
377
|
+
|
|
378
|
+
return new Promise((resolve) => {
|
|
379
|
+
const onError = (err: Error | null) => {
|
|
380
|
+
if (err) {
|
|
381
|
+
logger.debug(
|
|
382
|
+
`[cloud-onboarding] Failed to open browser: ${err.message}`,
|
|
383
|
+
);
|
|
384
|
+
}
|
|
385
|
+
resolve();
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
if (p === "darwin") {
|
|
389
|
+
execFile("open", [url], onError);
|
|
390
|
+
} else if (p === "win32") {
|
|
391
|
+
execFile("cmd.exe", ["/c", "start", "", url], onError);
|
|
392
|
+
} else {
|
|
393
|
+
execFile("xdg-open", [url], onError);
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
}
|