@agent-relay/cloud 2.0.23 → 6.0.4
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/dist/api-client.d.ts +33 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +123 -0
- package/dist/api-client.js.map +1 -0
- package/dist/auth.d.ts +13 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +299 -0
- package/dist/auth.js.map +1 -0
- package/dist/connect.d.ts +45 -0
- package/dist/connect.d.ts.map +1 -0
- package/dist/connect.js +166 -0
- package/dist/connect.js.map +1 -0
- package/dist/index.d.ts +7 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -37
- package/dist/index.js.map +1 -1
- package/dist/lib/ssh-interactive.d.ts +70 -0
- package/dist/lib/ssh-interactive.d.ts.map +1 -0
- package/dist/lib/ssh-interactive.js +440 -0
- package/dist/lib/ssh-interactive.js.map +1 -0
- package/dist/lib/ssh-runtime.d.ts +35 -0
- package/dist/lib/ssh-runtime.d.ts.map +1 -0
- package/dist/lib/ssh-runtime.js +52 -0
- package/dist/lib/ssh-runtime.js.map +1 -0
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/workflows.d.ts +49 -0
- package/dist/workflows.d.ts.map +1 -0
- package/dist/workflows.js +473 -0
- package/dist/workflows.js.map +1 -0
- package/package.json +12 -25
- package/dist/api/admin.d.ts +0 -8
- package/dist/api/admin.d.ts.map +0 -1
- package/dist/api/admin.js +0 -225
- package/dist/api/admin.js.map +0 -1
- package/dist/api/auth.d.ts +0 -20
- package/dist/api/auth.d.ts.map +0 -1
- package/dist/api/auth.js +0 -138
- package/dist/api/auth.js.map +0 -1
- package/dist/api/billing.d.ts +0 -7
- package/dist/api/billing.d.ts.map +0 -1
- package/dist/api/billing.js +0 -564
- package/dist/api/billing.js.map +0 -1
- package/dist/api/cli-pty-runner.d.ts +0 -53
- package/dist/api/cli-pty-runner.d.ts.map +0 -1
- package/dist/api/cli-pty-runner.js +0 -175
- package/dist/api/cli-pty-runner.js.map +0 -1
- package/dist/api/codex-auth-helper.d.ts +0 -21
- package/dist/api/codex-auth-helper.d.ts.map +0 -1
- package/dist/api/codex-auth-helper.js +0 -327
- package/dist/api/codex-auth-helper.js.map +0 -1
- package/dist/api/consensus.d.ts +0 -13
- package/dist/api/consensus.d.ts.map +0 -1
- package/dist/api/consensus.js +0 -261
- package/dist/api/consensus.js.map +0 -1
- package/dist/api/coordinators.d.ts +0 -8
- package/dist/api/coordinators.d.ts.map +0 -1
- package/dist/api/coordinators.js +0 -750
- package/dist/api/coordinators.js.map +0 -1
- package/dist/api/daemons.d.ts +0 -12
- package/dist/api/daemons.d.ts.map +0 -1
- package/dist/api/daemons.js +0 -535
- package/dist/api/daemons.js.map +0 -1
- package/dist/api/email-auth.d.ts +0 -11
- package/dist/api/email-auth.d.ts.map +0 -1
- package/dist/api/email-auth.js +0 -347
- package/dist/api/email-auth.js.map +0 -1
- package/dist/api/generic-webhooks.d.ts +0 -8
- package/dist/api/generic-webhooks.d.ts.map +0 -1
- package/dist/api/generic-webhooks.js +0 -129
- package/dist/api/generic-webhooks.js.map +0 -1
- package/dist/api/git.d.ts +0 -8
- package/dist/api/git.d.ts.map +0 -1
- package/dist/api/git.js +0 -269
- package/dist/api/git.js.map +0 -1
- package/dist/api/github-app.d.ts +0 -11
- package/dist/api/github-app.d.ts.map +0 -1
- package/dist/api/github-app.js +0 -223
- package/dist/api/github-app.js.map +0 -1
- package/dist/api/middleware/planLimits.d.ts +0 -43
- package/dist/api/middleware/planLimits.d.ts.map +0 -1
- package/dist/api/middleware/planLimits.js +0 -202
- package/dist/api/middleware/planLimits.js.map +0 -1
- package/dist/api/monitoring.d.ts +0 -11
- package/dist/api/monitoring.d.ts.map +0 -1
- package/dist/api/monitoring.js +0 -578
- package/dist/api/monitoring.js.map +0 -1
- package/dist/api/nango-auth.d.ts +0 -9
- package/dist/api/nango-auth.d.ts.map +0 -1
- package/dist/api/nango-auth.js +0 -741
- package/dist/api/nango-auth.js.map +0 -1
- package/dist/api/onboarding.d.ts +0 -15
- package/dist/api/onboarding.d.ts.map +0 -1
- package/dist/api/onboarding.js +0 -679
- package/dist/api/onboarding.js.map +0 -1
- package/dist/api/policy.d.ts +0 -8
- package/dist/api/policy.d.ts.map +0 -1
- package/dist/api/policy.js +0 -229
- package/dist/api/policy.js.map +0 -1
- package/dist/api/provider-env.d.ts +0 -26
- package/dist/api/provider-env.d.ts.map +0 -1
- package/dist/api/provider-env.js +0 -141
- package/dist/api/provider-env.js.map +0 -1
- package/dist/api/providers.d.ts +0 -7
- package/dist/api/providers.d.ts.map +0 -1
- package/dist/api/providers.js +0 -574
- package/dist/api/providers.js.map +0 -1
- package/dist/api/repos.d.ts +0 -8
- package/dist/api/repos.d.ts.map +0 -1
- package/dist/api/repos.js +0 -577
- package/dist/api/repos.js.map +0 -1
- package/dist/api/sessions.d.ts +0 -11
- package/dist/api/sessions.d.ts.map +0 -1
- package/dist/api/sessions.js +0 -302
- package/dist/api/sessions.js.map +0 -1
- package/dist/api/teams.d.ts +0 -7
- package/dist/api/teams.d.ts.map +0 -1
- package/dist/api/teams.js +0 -281
- package/dist/api/teams.js.map +0 -1
- package/dist/api/test-helpers.d.ts +0 -10
- package/dist/api/test-helpers.d.ts.map +0 -1
- package/dist/api/test-helpers.js +0 -745
- package/dist/api/test-helpers.js.map +0 -1
- package/dist/api/usage.d.ts +0 -7
- package/dist/api/usage.d.ts.map +0 -1
- package/dist/api/usage.js +0 -111
- package/dist/api/usage.js.map +0 -1
- package/dist/api/webhooks.d.ts +0 -8
- package/dist/api/webhooks.d.ts.map +0 -1
- package/dist/api/webhooks.js +0 -645
- package/dist/api/webhooks.js.map +0 -1
- package/dist/api/workspaces.d.ts +0 -25
- package/dist/api/workspaces.d.ts.map +0 -1
- package/dist/api/workspaces.js +0 -1799
- package/dist/api/workspaces.js.map +0 -1
- package/dist/billing/index.d.ts +0 -9
- package/dist/billing/index.d.ts.map +0 -1
- package/dist/billing/index.js +0 -9
- package/dist/billing/index.js.map +0 -1
- package/dist/billing/plans.d.ts +0 -39
- package/dist/billing/plans.d.ts.map +0 -1
- package/dist/billing/plans.js +0 -245
- package/dist/billing/plans.js.map +0 -1
- package/dist/billing/service.d.ts +0 -80
- package/dist/billing/service.d.ts.map +0 -1
- package/dist/billing/service.js +0 -388
- package/dist/billing/service.js.map +0 -1
- package/dist/billing/types.d.ts +0 -141
- package/dist/billing/types.d.ts.map +0 -1
- package/dist/billing/types.js +0 -7
- package/dist/billing/types.js.map +0 -1
- package/dist/config.d.ts +0 -5
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -5
- package/dist/config.js.map +0 -1
- package/dist/db/bulk-ingest.d.ts +0 -89
- package/dist/db/bulk-ingest.d.ts.map +0 -1
- package/dist/db/bulk-ingest.js +0 -268
- package/dist/db/bulk-ingest.js.map +0 -1
- package/dist/db/drizzle.d.ts +0 -290
- package/dist/db/drizzle.d.ts.map +0 -1
- package/dist/db/drizzle.js +0 -1422
- package/dist/db/drizzle.js.map +0 -1
- package/dist/db/index.d.ts +0 -56
- package/dist/db/index.d.ts.map +0 -1
- package/dist/db/index.js +0 -70
- package/dist/db/index.js.map +0 -1
- package/dist/db/schema.d.ts +0 -5117
- package/dist/db/schema.d.ts.map +0 -1
- package/dist/db/schema.js +0 -656
- package/dist/db/schema.js.map +0 -1
- package/dist/provisioner/index.d.ts +0 -207
- package/dist/provisioner/index.d.ts.map +0 -1
- package/dist/provisioner/index.js +0 -2118
- package/dist/provisioner/index.js.map +0 -1
- package/dist/server.d.ts +0 -17
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -2055
- package/dist/server.js.map +0 -1
- package/dist/services/auto-scaler.d.ts +0 -152
- package/dist/services/auto-scaler.d.ts.map +0 -1
- package/dist/services/auto-scaler.js +0 -439
- package/dist/services/auto-scaler.js.map +0 -1
- package/dist/services/capacity-manager.d.ts +0 -148
- package/dist/services/capacity-manager.d.ts.map +0 -1
- package/dist/services/capacity-manager.js +0 -449
- package/dist/services/capacity-manager.js.map +0 -1
- package/dist/services/ci-agent-spawner.d.ts +0 -49
- package/dist/services/ci-agent-spawner.d.ts.map +0 -1
- package/dist/services/ci-agent-spawner.js +0 -373
- package/dist/services/ci-agent-spawner.js.map +0 -1
- package/dist/services/cloud-message-bus.d.ts +0 -28
- package/dist/services/cloud-message-bus.d.ts.map +0 -1
- package/dist/services/cloud-message-bus.js +0 -19
- package/dist/services/cloud-message-bus.js.map +0 -1
- package/dist/services/compute-enforcement.d.ts +0 -57
- package/dist/services/compute-enforcement.d.ts.map +0 -1
- package/dist/services/compute-enforcement.js +0 -175
- package/dist/services/compute-enforcement.js.map +0 -1
- package/dist/services/coordinator.d.ts +0 -62
- package/dist/services/coordinator.d.ts.map +0 -1
- package/dist/services/coordinator.js +0 -389
- package/dist/services/coordinator.js.map +0 -1
- package/dist/services/index.d.ts +0 -17
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/index.js +0 -25
- package/dist/services/index.js.map +0 -1
- package/dist/services/intro-expiration.d.ts +0 -60
- package/dist/services/intro-expiration.d.ts.map +0 -1
- package/dist/services/intro-expiration.js +0 -252
- package/dist/services/intro-expiration.js.map +0 -1
- package/dist/services/mention-handler.d.ts +0 -65
- package/dist/services/mention-handler.d.ts.map +0 -1
- package/dist/services/mention-handler.js +0 -405
- package/dist/services/mention-handler.js.map +0 -1
- package/dist/services/nango.d.ts +0 -219
- package/dist/services/nango.d.ts.map +0 -1
- package/dist/services/nango.js +0 -424
- package/dist/services/nango.js.map +0 -1
- package/dist/services/persistence.d.ts +0 -131
- package/dist/services/persistence.d.ts.map +0 -1
- package/dist/services/persistence.js +0 -200
- package/dist/services/persistence.js.map +0 -1
- package/dist/services/planLimits.d.ts +0 -147
- package/dist/services/planLimits.d.ts.map +0 -1
- package/dist/services/planLimits.js +0 -335
- package/dist/services/planLimits.js.map +0 -1
- package/dist/services/presence-registry.d.ts +0 -56
- package/dist/services/presence-registry.d.ts.map +0 -1
- package/dist/services/presence-registry.js +0 -91
- package/dist/services/presence-registry.js.map +0 -1
- package/dist/services/scaling-orchestrator.d.ts +0 -159
- package/dist/services/scaling-orchestrator.d.ts.map +0 -1
- package/dist/services/scaling-orchestrator.js +0 -502
- package/dist/services/scaling-orchestrator.js.map +0 -1
- package/dist/services/scaling-policy.d.ts +0 -121
- package/dist/services/scaling-policy.d.ts.map +0 -1
- package/dist/services/scaling-policy.js +0 -415
- package/dist/services/scaling-policy.js.map +0 -1
- package/dist/services/ssh-security.d.ts +0 -31
- package/dist/services/ssh-security.d.ts.map +0 -1
- package/dist/services/ssh-security.js +0 -63
- package/dist/services/ssh-security.js.map +0 -1
- package/dist/services/workspace-keepalive.d.ts +0 -76
- package/dist/services/workspace-keepalive.d.ts.map +0 -1
- package/dist/services/workspace-keepalive.js +0 -234
- package/dist/services/workspace-keepalive.js.map +0 -1
- package/dist/shims/consensus.d.ts +0 -23
- package/dist/shims/consensus.d.ts.map +0 -1
- package/dist/shims/consensus.js +0 -5
- package/dist/shims/consensus.js.map +0 -1
- package/dist/webhooks/index.d.ts +0 -24
- package/dist/webhooks/index.d.ts.map +0 -1
- package/dist/webhooks/index.js +0 -29
- package/dist/webhooks/index.js.map +0 -1
- package/dist/webhooks/parsers/github.d.ts +0 -8
- package/dist/webhooks/parsers/github.d.ts.map +0 -1
- package/dist/webhooks/parsers/github.js +0 -234
- package/dist/webhooks/parsers/github.js.map +0 -1
- package/dist/webhooks/parsers/index.d.ts +0 -23
- package/dist/webhooks/parsers/index.d.ts.map +0 -1
- package/dist/webhooks/parsers/index.js +0 -30
- package/dist/webhooks/parsers/index.js.map +0 -1
- package/dist/webhooks/parsers/linear.d.ts +0 -9
- package/dist/webhooks/parsers/linear.d.ts.map +0 -1
- package/dist/webhooks/parsers/linear.js +0 -258
- package/dist/webhooks/parsers/linear.js.map +0 -1
- package/dist/webhooks/parsers/slack.d.ts +0 -9
- package/dist/webhooks/parsers/slack.d.ts.map +0 -1
- package/dist/webhooks/parsers/slack.js +0 -214
- package/dist/webhooks/parsers/slack.js.map +0 -1
- package/dist/webhooks/responders/github.d.ts +0 -8
- package/dist/webhooks/responders/github.d.ts.map +0 -1
- package/dist/webhooks/responders/github.js +0 -73
- package/dist/webhooks/responders/github.js.map +0 -1
- package/dist/webhooks/responders/index.d.ts +0 -23
- package/dist/webhooks/responders/index.d.ts.map +0 -1
- package/dist/webhooks/responders/index.js +0 -30
- package/dist/webhooks/responders/index.js.map +0 -1
- package/dist/webhooks/responders/linear.d.ts +0 -9
- package/dist/webhooks/responders/linear.d.ts.map +0 -1
- package/dist/webhooks/responders/linear.js +0 -149
- package/dist/webhooks/responders/linear.js.map +0 -1
- package/dist/webhooks/responders/slack.d.ts +0 -20
- package/dist/webhooks/responders/slack.d.ts.map +0 -1
- package/dist/webhooks/responders/slack.js +0 -178
- package/dist/webhooks/responders/slack.js.map +0 -1
- package/dist/webhooks/router.d.ts +0 -25
- package/dist/webhooks/router.d.ts.map +0 -1
- package/dist/webhooks/router.js +0 -504
- package/dist/webhooks/router.js.map +0 -1
- package/dist/webhooks/rules-engine.d.ts +0 -24
- package/dist/webhooks/rules-engine.d.ts.map +0 -1
- package/dist/webhooks/rules-engine.js +0 -287
- package/dist/webhooks/rules-engine.js.map +0 -1
- package/dist/webhooks/types.d.ts +0 -186
- package/dist/webhooks/types.d.ts.map +0 -1
- package/dist/webhooks/types.js +0 -8
- package/dist/webhooks/types.js.map +0 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type CloudApiClientOptions = {
|
|
2
|
+
apiUrl: string;
|
|
3
|
+
accessToken: string;
|
|
4
|
+
refreshToken: string;
|
|
5
|
+
accessTokenExpiresAt: string;
|
|
6
|
+
refreshTokenExpiresAt?: string;
|
|
7
|
+
};
|
|
8
|
+
export type CloudApiClientSnapshot = {
|
|
9
|
+
apiUrl: string;
|
|
10
|
+
accessToken: string;
|
|
11
|
+
refreshToken: string;
|
|
12
|
+
accessTokenExpiresAt: string;
|
|
13
|
+
refreshTokenExpiresAt?: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function buildApiUrl(apiUrl: string, p: string): URL;
|
|
16
|
+
export declare class CloudApiClient {
|
|
17
|
+
private readonly options;
|
|
18
|
+
private accessToken;
|
|
19
|
+
private refreshToken;
|
|
20
|
+
private accessTokenExpiresAt;
|
|
21
|
+
private refreshTokenExpiresAt?;
|
|
22
|
+
private refreshPromise;
|
|
23
|
+
constructor(options: CloudApiClientOptions);
|
|
24
|
+
static fromEnv(env: NodeJS.ProcessEnv): CloudApiClient | null;
|
|
25
|
+
snapshot(): CloudApiClientSnapshot;
|
|
26
|
+
fetch(p: string, init?: RequestInit): Promise<Response>;
|
|
27
|
+
revoke(): Promise<void>;
|
|
28
|
+
private refresh;
|
|
29
|
+
private doRefresh;
|
|
30
|
+
private buildHeaders;
|
|
31
|
+
private shouldRefresh;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAUF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,GAAG,CAE1D;AAED,qBAAa,cAAc;IAOb,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,qBAAqB,CAAC,CAAS;IACvC,OAAO,CAAC,cAAc,CAA8B;gBAEvB,OAAO,EAAE,qBAAqB;IAO3D,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,cAAc,GAAG,IAAI;IAoB7D,QAAQ,IAAI,sBAAsB;IAU5B,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAoB3D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAcf,OAAO;YAgBP,SAAS;IA8BvB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,aAAa;CAQtB"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { REFRESH_WINDOW_MS } from "./types.js";
|
|
2
|
+
function trimLeadingSlash(p) {
|
|
3
|
+
return p.replace(/^\/+/, "");
|
|
4
|
+
}
|
|
5
|
+
function withTrailingSlash(p) {
|
|
6
|
+
return p.endsWith("/") ? p : `${p}/`;
|
|
7
|
+
}
|
|
8
|
+
export function buildApiUrl(apiUrl, p) {
|
|
9
|
+
return new URL(trimLeadingSlash(p), withTrailingSlash(apiUrl));
|
|
10
|
+
}
|
|
11
|
+
export class CloudApiClient {
|
|
12
|
+
options;
|
|
13
|
+
accessToken;
|
|
14
|
+
refreshToken;
|
|
15
|
+
accessTokenExpiresAt;
|
|
16
|
+
refreshTokenExpiresAt;
|
|
17
|
+
refreshPromise = null;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
this.options = options;
|
|
20
|
+
this.accessToken = options.accessToken;
|
|
21
|
+
this.refreshToken = options.refreshToken;
|
|
22
|
+
this.accessTokenExpiresAt = options.accessTokenExpiresAt;
|
|
23
|
+
this.refreshTokenExpiresAt = options.refreshTokenExpiresAt;
|
|
24
|
+
}
|
|
25
|
+
static fromEnv(env) {
|
|
26
|
+
const apiUrl = env.CLOUD_API_URL?.trim();
|
|
27
|
+
const accessToken = env.CLOUD_API_ACCESS_TOKEN?.trim();
|
|
28
|
+
const refreshToken = env.CLOUD_API_REFRESH_TOKEN?.trim();
|
|
29
|
+
const accessTokenExpiresAt = env.CLOUD_API_ACCESS_TOKEN_EXPIRES_AT?.trim();
|
|
30
|
+
const refreshTokenExpiresAt = env.CLOUD_API_REFRESH_TOKEN_EXPIRES_AT?.trim();
|
|
31
|
+
if (!apiUrl || !accessToken || !refreshToken || !accessTokenExpiresAt) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return new CloudApiClient({
|
|
35
|
+
apiUrl,
|
|
36
|
+
accessToken,
|
|
37
|
+
refreshToken,
|
|
38
|
+
accessTokenExpiresAt,
|
|
39
|
+
refreshTokenExpiresAt,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
snapshot() {
|
|
43
|
+
return {
|
|
44
|
+
apiUrl: this.options.apiUrl,
|
|
45
|
+
accessToken: this.accessToken,
|
|
46
|
+
refreshToken: this.refreshToken,
|
|
47
|
+
accessTokenExpiresAt: this.accessTokenExpiresAt,
|
|
48
|
+
...(this.refreshTokenExpiresAt ? { refreshTokenExpiresAt: this.refreshTokenExpiresAt } : {}),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async fetch(p, init = {}) {
|
|
52
|
+
await this.refresh();
|
|
53
|
+
const response = await fetch(buildApiUrl(this.options.apiUrl, p), {
|
|
54
|
+
...init,
|
|
55
|
+
headers: this.buildHeaders(init.headers),
|
|
56
|
+
});
|
|
57
|
+
if (response.status !== 401) {
|
|
58
|
+
return response;
|
|
59
|
+
}
|
|
60
|
+
await this.refresh(true);
|
|
61
|
+
return fetch(buildApiUrl(this.options.apiUrl, p), {
|
|
62
|
+
...init,
|
|
63
|
+
headers: this.buildHeaders(init.headers),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
async revoke() {
|
|
67
|
+
const response = await fetch(buildApiUrl(this.options.apiUrl, "/api/v1/auth/token/revoke"), {
|
|
68
|
+
method: "POST",
|
|
69
|
+
headers: {
|
|
70
|
+
"Content-Type": "application/json",
|
|
71
|
+
},
|
|
72
|
+
body: JSON.stringify({ token: this.refreshToken }),
|
|
73
|
+
});
|
|
74
|
+
if (!response.ok && response.status !== 404) {
|
|
75
|
+
throw new Error(`Failed to revoke API token: ${response.status} ${response.statusText}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async refresh(force = false) {
|
|
79
|
+
if (this.refreshPromise) {
|
|
80
|
+
return this.refreshPromise;
|
|
81
|
+
}
|
|
82
|
+
if (!force && !this.shouldRefresh()) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.refreshPromise = this.doRefresh().finally(() => {
|
|
86
|
+
this.refreshPromise = null;
|
|
87
|
+
});
|
|
88
|
+
return this.refreshPromise;
|
|
89
|
+
}
|
|
90
|
+
async doRefresh() {
|
|
91
|
+
const response = await fetch(buildApiUrl(this.options.apiUrl, "/api/v1/auth/token/refresh"), {
|
|
92
|
+
method: "POST",
|
|
93
|
+
headers: {
|
|
94
|
+
"Content-Type": "application/json",
|
|
95
|
+
},
|
|
96
|
+
body: JSON.stringify({ refreshToken: this.refreshToken }),
|
|
97
|
+
});
|
|
98
|
+
if (!response.ok) {
|
|
99
|
+
throw new Error(`Failed to refresh API token: ${response.status} ${response.statusText}`);
|
|
100
|
+
}
|
|
101
|
+
const payload = (await response.json());
|
|
102
|
+
if (!payload.accessToken || !payload.accessTokenExpiresAt || !payload.refreshToken) {
|
|
103
|
+
throw new Error("Refresh response missing token fields");
|
|
104
|
+
}
|
|
105
|
+
this.accessToken = payload.accessToken;
|
|
106
|
+
this.accessTokenExpiresAt = payload.accessTokenExpiresAt;
|
|
107
|
+
this.refreshToken = payload.refreshToken;
|
|
108
|
+
this.refreshTokenExpiresAt = payload.refreshTokenExpiresAt;
|
|
109
|
+
}
|
|
110
|
+
buildHeaders(headers) {
|
|
111
|
+
const merged = new Headers(headers);
|
|
112
|
+
merged.set("Authorization", `Bearer ${this.accessToken}`);
|
|
113
|
+
return merged;
|
|
114
|
+
}
|
|
115
|
+
shouldRefresh() {
|
|
116
|
+
const expiresAt = Date.parse(this.accessTokenExpiresAt);
|
|
117
|
+
if (Number.isNaN(expiresAt)) {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
return expiresAt - Date.now() <= REFRESH_WINDOW_MS;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type StoredAuth } from './types.js';
|
|
2
|
+
export declare function readStoredAuth(env?: NodeJS.ProcessEnv): Promise<StoredAuth | null>;
|
|
3
|
+
export declare function writeStoredAuth(auth: StoredAuth): Promise<void>;
|
|
4
|
+
export declare function clearStoredAuth(): Promise<void>;
|
|
5
|
+
export declare function refreshStoredAuth(auth: StoredAuth): Promise<StoredAuth>;
|
|
6
|
+
export declare function ensureAuthenticated(apiUrl: string, options?: {
|
|
7
|
+
force?: boolean;
|
|
8
|
+
}): Promise<StoredAuth>;
|
|
9
|
+
export declare function authorizedApiFetch(auth: StoredAuth, requestPath: string, init: RequestInit): Promise<{
|
|
10
|
+
response: Response;
|
|
11
|
+
auth: StoredAuth;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAOA,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAgEhF,wBAAsB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAarG;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CASrE;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAErD;AAyKD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAgC7E;AASD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,OAAO,CAAC,UAAU,CAAC,CA0BrB;AAkBD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAoBnD"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import http from 'node:http';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { spawn } from 'node:child_process';
|
|
6
|
+
import { buildApiUrl } from './api-client.js';
|
|
7
|
+
import { AUTH_FILE_PATH, REFRESH_WINDOW_MS } from './types.js';
|
|
8
|
+
const envBackedAuth = new WeakSet();
|
|
9
|
+
function markEnvBackedAuth(auth) {
|
|
10
|
+
envBackedAuth.add(auth);
|
|
11
|
+
return auth;
|
|
12
|
+
}
|
|
13
|
+
function isEnvBackedAuth(auth) {
|
|
14
|
+
return envBackedAuth.has(auth);
|
|
15
|
+
}
|
|
16
|
+
function readEnvAuth(env = process.env) {
|
|
17
|
+
const apiUrl = env.CLOUD_API_URL?.trim();
|
|
18
|
+
const accessToken = env.CLOUD_API_ACCESS_TOKEN?.trim();
|
|
19
|
+
const refreshToken = env.CLOUD_API_REFRESH_TOKEN?.trim();
|
|
20
|
+
const accessTokenExpiresAt = env.CLOUD_API_ACCESS_TOKEN_EXPIRES_AT?.trim();
|
|
21
|
+
if (!apiUrl || !accessToken || !refreshToken || !accessTokenExpiresAt) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
new URL(apiUrl);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
if (Number.isNaN(Date.parse(accessTokenExpiresAt))) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return markEnvBackedAuth({
|
|
34
|
+
apiUrl,
|
|
35
|
+
accessToken,
|
|
36
|
+
refreshToken,
|
|
37
|
+
accessTokenExpiresAt,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function toEnvAuthRefreshError(error) {
|
|
41
|
+
const message = error instanceof Error && error.message ? `${error.message}. ` : '';
|
|
42
|
+
return new Error(`${message}Env-backed cloud auth could not be refreshed interactively; re-provision CLOUD_API_URL, CLOUD_API_ACCESS_TOKEN, CLOUD_API_REFRESH_TOKEN, and CLOUD_API_ACCESS_TOKEN_EXPIRES_AT.`, error instanceof Error ? { cause: error } : undefined);
|
|
43
|
+
}
|
|
44
|
+
function isValidStoredAuth(value) {
|
|
45
|
+
if (!value || typeof value !== 'object') {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
const auth = value;
|
|
49
|
+
return (typeof auth.accessToken === 'string' &&
|
|
50
|
+
typeof auth.refreshToken === 'string' &&
|
|
51
|
+
typeof auth.accessTokenExpiresAt === 'string' &&
|
|
52
|
+
typeof auth.apiUrl === 'string');
|
|
53
|
+
}
|
|
54
|
+
export async function readStoredAuth(env = process.env) {
|
|
55
|
+
const envAuth = readEnvAuth(env);
|
|
56
|
+
if (envAuth) {
|
|
57
|
+
return envAuth;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const file = await fs.readFile(AUTH_FILE_PATH, 'utf8');
|
|
61
|
+
const parsed = JSON.parse(file);
|
|
62
|
+
return isValidStoredAuth(parsed) ? parsed : null;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export async function writeStoredAuth(auth) {
|
|
69
|
+
await fs.mkdir(path.dirname(AUTH_FILE_PATH), {
|
|
70
|
+
recursive: true,
|
|
71
|
+
mode: 0o700,
|
|
72
|
+
});
|
|
73
|
+
await fs.writeFile(AUTH_FILE_PATH, `${JSON.stringify(auth, null, 2)}\n`, {
|
|
74
|
+
encoding: 'utf8',
|
|
75
|
+
mode: 0o600,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
export async function clearStoredAuth() {
|
|
79
|
+
await fs.rm(AUTH_FILE_PATH, { force: true });
|
|
80
|
+
}
|
|
81
|
+
function shouldRefresh(accessTokenExpiresAt) {
|
|
82
|
+
const expiresAt = Date.parse(accessTokenExpiresAt);
|
|
83
|
+
if (Number.isNaN(expiresAt)) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
return expiresAt - Date.now() <= REFRESH_WINDOW_MS;
|
|
87
|
+
}
|
|
88
|
+
function openBrowser(url) {
|
|
89
|
+
const platform = os.platform();
|
|
90
|
+
if (platform === 'darwin') {
|
|
91
|
+
return spawn('open', [url], { stdio: 'ignore', detached: true });
|
|
92
|
+
}
|
|
93
|
+
if (platform === 'win32') {
|
|
94
|
+
return spawn('cmd', ['/c', 'start', '', url], { stdio: 'ignore', detached: true });
|
|
95
|
+
}
|
|
96
|
+
return spawn('xdg-open', [url], { stdio: 'ignore', detached: true });
|
|
97
|
+
}
|
|
98
|
+
function redirectToHostedCliAuthPage(response, apiUrl, options) {
|
|
99
|
+
const resultUrl = buildApiUrl(apiUrl, '/cli/auth-result');
|
|
100
|
+
resultUrl.searchParams.set('status', options.status);
|
|
101
|
+
if (options.detail) {
|
|
102
|
+
resultUrl.searchParams.set('detail', options.detail);
|
|
103
|
+
}
|
|
104
|
+
response.statusCode = 302;
|
|
105
|
+
response.setHeader('location', resultUrl.toString());
|
|
106
|
+
response.end();
|
|
107
|
+
}
|
|
108
|
+
async function beginBrowserLogin(apiUrl) {
|
|
109
|
+
const state = crypto.randomUUID();
|
|
110
|
+
return new Promise((resolve, reject) => {
|
|
111
|
+
let settled = false;
|
|
112
|
+
const server = http.createServer((request, response) => {
|
|
113
|
+
const requestUrl = new URL(request.url || '/', 'http://127.0.0.1');
|
|
114
|
+
if (requestUrl.pathname !== '/callback') {
|
|
115
|
+
response.statusCode = 404;
|
|
116
|
+
response.end('Not found');
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const returnedState = requestUrl.searchParams.get('state');
|
|
120
|
+
// Validate state parameter first (CSRF protection) — this check
|
|
121
|
+
// must run unconditionally, before any user-controlled values.
|
|
122
|
+
if (returnedState !== state) {
|
|
123
|
+
redirectToHostedCliAuthPage(response, apiUrl, {
|
|
124
|
+
status: 'error',
|
|
125
|
+
detail: 'Invalid state parameter',
|
|
126
|
+
});
|
|
127
|
+
if (!settled) {
|
|
128
|
+
settled = true;
|
|
129
|
+
server.close();
|
|
130
|
+
reject(new Error('Invalid state parameter in CLI login callback'));
|
|
131
|
+
}
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const error = requestUrl.searchParams.get('error');
|
|
135
|
+
if (error) {
|
|
136
|
+
redirectToHostedCliAuthPage(response, apiUrl, {
|
|
137
|
+
status: 'error',
|
|
138
|
+
detail: error,
|
|
139
|
+
});
|
|
140
|
+
if (!settled) {
|
|
141
|
+
settled = true;
|
|
142
|
+
server.close();
|
|
143
|
+
reject(new Error(error));
|
|
144
|
+
}
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const accessToken = requestUrl.searchParams.get('access_token');
|
|
148
|
+
const refreshToken = requestUrl.searchParams.get('refresh_token');
|
|
149
|
+
const accessTokenExpiresAt = requestUrl.searchParams.get('access_token_expires_at');
|
|
150
|
+
const returnedApiUrl = requestUrl.searchParams.get('api_url');
|
|
151
|
+
if (!accessToken || !refreshToken || !accessTokenExpiresAt || !returnedApiUrl) {
|
|
152
|
+
redirectToHostedCliAuthPage(response, apiUrl, {
|
|
153
|
+
status: 'error',
|
|
154
|
+
detail: 'Expected access token, refresh token, API URL, and expiration timestamp.',
|
|
155
|
+
});
|
|
156
|
+
if (!settled) {
|
|
157
|
+
settled = true;
|
|
158
|
+
server.close();
|
|
159
|
+
reject(new Error('CLI login callback was missing required fields'));
|
|
160
|
+
}
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
redirectToHostedCliAuthPage(response, returnedApiUrl, {
|
|
164
|
+
status: 'success',
|
|
165
|
+
detail: `API endpoint: ${returnedApiUrl}`,
|
|
166
|
+
});
|
|
167
|
+
if (!settled) {
|
|
168
|
+
settled = true;
|
|
169
|
+
server.close();
|
|
170
|
+
resolve({
|
|
171
|
+
accessToken,
|
|
172
|
+
refreshToken,
|
|
173
|
+
accessTokenExpiresAt,
|
|
174
|
+
apiUrl: returnedApiUrl,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
server.listen(0, '127.0.0.1', () => {
|
|
179
|
+
const address = server.address();
|
|
180
|
+
if (!address || typeof address === 'string') {
|
|
181
|
+
if (!settled) {
|
|
182
|
+
settled = true;
|
|
183
|
+
server.close();
|
|
184
|
+
reject(new Error('Failed to start local callback server'));
|
|
185
|
+
}
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const callbackUrl = new URL('/callback', `http://127.0.0.1:${address.port}`);
|
|
189
|
+
const loginUrl = buildApiUrl(apiUrl, '/api/v1/cli/login');
|
|
190
|
+
loginUrl.searchParams.set('redirect_uri', callbackUrl.toString());
|
|
191
|
+
loginUrl.searchParams.set('state', state);
|
|
192
|
+
console.log(`Opening browser for cloud login: ${loginUrl.toString()}`);
|
|
193
|
+
console.log('If the browser does not open, paste this URL into your browser.');
|
|
194
|
+
try {
|
|
195
|
+
const child = openBrowser(loginUrl.toString());
|
|
196
|
+
child.unref();
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
// Browser open failure is non-fatal; user still has the URL.
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
server.on('error', (error) => {
|
|
203
|
+
if (!settled) {
|
|
204
|
+
settled = true;
|
|
205
|
+
reject(error);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
setTimeout(() => {
|
|
209
|
+
if (!settled) {
|
|
210
|
+
settled = true;
|
|
211
|
+
server.close();
|
|
212
|
+
reject(new Error('Timed out waiting for browser login'));
|
|
213
|
+
}
|
|
214
|
+
}, 5 * 60_000).unref();
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
export async function refreshStoredAuth(auth) {
|
|
218
|
+
const response = await fetch(buildApiUrl(auth.apiUrl, '/api/v1/auth/token/refresh'), {
|
|
219
|
+
method: 'POST',
|
|
220
|
+
headers: {
|
|
221
|
+
'content-type': 'application/json',
|
|
222
|
+
},
|
|
223
|
+
body: JSON.stringify({ refreshToken: auth.refreshToken }),
|
|
224
|
+
});
|
|
225
|
+
const payload = (await response.json().catch(() => null));
|
|
226
|
+
if (!response.ok || !payload?.accessToken || !payload?.refreshToken || !payload?.accessTokenExpiresAt) {
|
|
227
|
+
throw new Error('Stored cloud login has expired');
|
|
228
|
+
}
|
|
229
|
+
const nextAuth = {
|
|
230
|
+
apiUrl: auth.apiUrl,
|
|
231
|
+
accessToken: payload.accessToken,
|
|
232
|
+
refreshToken: payload.refreshToken,
|
|
233
|
+
accessTokenExpiresAt: payload.accessTokenExpiresAt,
|
|
234
|
+
};
|
|
235
|
+
if (isEnvBackedAuth(auth)) {
|
|
236
|
+
return markEnvBackedAuth(nextAuth);
|
|
237
|
+
}
|
|
238
|
+
await writeStoredAuth(nextAuth);
|
|
239
|
+
return nextAuth;
|
|
240
|
+
}
|
|
241
|
+
async function loginWithBrowser(apiUrl) {
|
|
242
|
+
const auth = await beginBrowserLogin(apiUrl);
|
|
243
|
+
await writeStoredAuth(auth);
|
|
244
|
+
console.log(`Logged in to ${auth.apiUrl}`);
|
|
245
|
+
return auth;
|
|
246
|
+
}
|
|
247
|
+
export async function ensureAuthenticated(apiUrl, options) {
|
|
248
|
+
const force = options?.force === true;
|
|
249
|
+
const stored = !force ? await readStoredAuth() : null;
|
|
250
|
+
// Stored auth is authoritative on its own host. A host mismatch between
|
|
251
|
+
// `apiUrl` (typically defaultApiUrl()) and `stored.apiUrl` is NOT a reason
|
|
252
|
+
// to force a fresh browser login — the user already linked, and the default
|
|
253
|
+
// may have drifted (e.g. CLOUD_API_URL env set/unset between sessions).
|
|
254
|
+
// Only `--force` re-links to a different host.
|
|
255
|
+
if (!stored) {
|
|
256
|
+
return loginWithBrowser(apiUrl);
|
|
257
|
+
}
|
|
258
|
+
if (!shouldRefresh(stored.accessTokenExpiresAt)) {
|
|
259
|
+
return stored;
|
|
260
|
+
}
|
|
261
|
+
try {
|
|
262
|
+
return await refreshStoredAuth(stored);
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
if (isEnvBackedAuth(stored)) {
|
|
266
|
+
throw toEnvAuthRefreshError(error);
|
|
267
|
+
}
|
|
268
|
+
return loginWithBrowser(stored.apiUrl);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
function apiFetch(apiUrl, accessToken, requestPath, init) {
|
|
272
|
+
return fetch(buildApiUrl(apiUrl, requestPath), {
|
|
273
|
+
...init,
|
|
274
|
+
headers: {
|
|
275
|
+
'content-type': 'application/json',
|
|
276
|
+
authorization: `Bearer ${accessToken}`,
|
|
277
|
+
...(init.headers ?? {}),
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
export async function authorizedApiFetch(auth, requestPath, init) {
|
|
282
|
+
let activeAuth = auth;
|
|
283
|
+
let response = await apiFetch(activeAuth.apiUrl, activeAuth.accessToken, requestPath, init);
|
|
284
|
+
if (response.status !== 401) {
|
|
285
|
+
return { response, auth: activeAuth };
|
|
286
|
+
}
|
|
287
|
+
try {
|
|
288
|
+
activeAuth = await refreshStoredAuth(activeAuth);
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
if (isEnvBackedAuth(activeAuth)) {
|
|
292
|
+
throw toEnvAuthRefreshError(error);
|
|
293
|
+
}
|
|
294
|
+
activeAuth = await loginWithBrowser(activeAuth.apiUrl);
|
|
295
|
+
}
|
|
296
|
+
response = await apiFetch(activeAuth.apiUrl, activeAuth.accessToken, requestPath, init);
|
|
297
|
+
return { response, auth: activeAuth };
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider connect orchestration — provisions a Daytona sandbox via the
|
|
3
|
+
* Cloud API, opens an interactive SSH session that runs the provider CLI,
|
|
4
|
+
* and finalizes the auth state with Cloud.
|
|
5
|
+
*
|
|
6
|
+
* The CLI command in `agent-relay cloud connect <provider>` is a thin wrapper
|
|
7
|
+
* around this function; other tools (e.g. `ricky connect <provider>`) can
|
|
8
|
+
* import it directly and drive the same flow.
|
|
9
|
+
*/
|
|
10
|
+
import type { AuthSshRuntime } from './lib/ssh-runtime.js';
|
|
11
|
+
export declare function getProviderHelpText(): string;
|
|
12
|
+
export declare function normalizeProvider(providerArg: string): string;
|
|
13
|
+
export interface ConnectProviderIo {
|
|
14
|
+
log: (...args: unknown[]) => void;
|
|
15
|
+
error: (...args: unknown[]) => void;
|
|
16
|
+
}
|
|
17
|
+
export interface ConnectProviderOptions {
|
|
18
|
+
/** Provider id or alias (`anthropic`/`claude`, `openai`/`codex`, `google`/`gemini`, …). */
|
|
19
|
+
provider: string;
|
|
20
|
+
/** Override the Cloud API URL. Defaults to `defaultApiUrl()`. */
|
|
21
|
+
apiUrl?: string;
|
|
22
|
+
/** Sandbox language/image. Defaults to `'typescript'`. */
|
|
23
|
+
language?: string;
|
|
24
|
+
/** Auth timeout in milliseconds. Defaults to 5 minutes. */
|
|
25
|
+
timeoutMs?: number;
|
|
26
|
+
/** Logger sink. Defaults to `console.log` / `console.error`. */
|
|
27
|
+
io?: ConnectProviderIo;
|
|
28
|
+
/** Override SSH/network runtime hooks (used in tests). */
|
|
29
|
+
runtime?: Partial<AuthSshRuntime>;
|
|
30
|
+
}
|
|
31
|
+
export interface ConnectProviderResult {
|
|
32
|
+
/** Normalized provider id used for the request. */
|
|
33
|
+
provider: string;
|
|
34
|
+
/** Whether the interactive session reported a positive auth pattern match. */
|
|
35
|
+
success: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Connect a provider via interactive SSH session.
|
|
39
|
+
*
|
|
40
|
+
* Throws on any failure. Returns `{ provider, success }` when the auth flow
|
|
41
|
+
* completed successfully — `success` is always `true` on resolved promises;
|
|
42
|
+
* an unsuccessful auth attempt rejects with a descriptive Error.
|
|
43
|
+
*/
|
|
44
|
+
export declare function connectProvider(options: ConnectProviderOptions): Promise<ConnectProviderResult>;
|
|
45
|
+
//# sourceMappingURL=connect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAQ3D,wBAAgB,mBAAmB,IAAI,MAAM,CAQ5C;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,sBAAsB;IACrC,2FAA2F;IAC3F,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,EAAE,CAAC,EAAE,iBAAiB,CAAC;IACvB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,OAAO,EAAE,OAAO,CAAC;CAClB;AA+BD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA4HrG"}
|