@agent-relay/cloud 2.0.22 → 6.0.2
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/index.d.ts +4 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -37
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +73 -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 +46 -0
- package/dist/workflows.d.ts.map +1 -0
- package/dist/workflows.js +464 -0
- package/dist/workflows.js.map +1 -0
- package/package.json +8 -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 -2034
- 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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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*/
|
|
6
|
-
export { createServer } from './server.js';
|
|
7
|
-
export { getConfig, loadConfig, type CloudConfig } from './config.js';
|
|
8
|
-
export { WorkspaceProvisioner, type ProvisionConfig, type Workspace, type WorkspaceStatus, } from './provisioner/index.js';
|
|
9
|
-
export { ScalingPolicyService, type ScalingThresholds, type ScalingPolicy, type ScalingDecision, type WorkspaceMetrics, getScalingPolicyService, AutoScaler, type ScalingOperation, getAutoScaler, createAutoScaler, CapacityManager, type WorkspaceCapacity, type PlacementRecommendation, type CapacityForecast, getCapacityManager, createCapacityManager, ScalingOrchestrator, type ScalingEvent, getScalingOrchestrator, createScalingOrchestrator, } from './services/index.js';
|
|
10
|
-
export * from './billing/index.js';
|
|
1
|
+
export { readStoredAuth, writeStoredAuth, clearStoredAuth, refreshStoredAuth, ensureAuthenticated, authorizedApiFetch, } from "./auth.js";
|
|
2
|
+
export { CloudApiClient, buildApiUrl, type CloudApiClientOptions, type CloudApiClientSnapshot, } from "./api-client.js";
|
|
3
|
+
export { runWorkflow, getRunStatus, getRunLogs, cancelWorkflow, syncWorkflowPatch, resolveWorkflowInput, inferWorkflowFileType, shouldSyncCodeByDefault, } from "./workflows.js";
|
|
4
|
+
export { type StoredAuth, type WhoAmIResponse, type AuthSessionResponse, type WorkflowFileType, type RunWorkflowResponse, type WorkflowLogsResponse, type SyncPatchResponse, SUPPORTED_PROVIDERS, REFRESH_WINDOW_MS, AUTH_FILE_PATH, defaultApiUrl, isSupportedProvider, } from "./types.js";
|
|
11
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,cAAc,EACd,WAAW,EACX,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,38 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*/
|
|
6
|
-
import { fileURLToPath } from 'node:url';
|
|
7
|
-
export { createServer } from './server.js';
|
|
8
|
-
export { getConfig, loadConfig } from './config.js';
|
|
9
|
-
// Services
|
|
10
|
-
export { WorkspaceProvisioner, } from './provisioner/index.js';
|
|
11
|
-
// Scaling infrastructure
|
|
12
|
-
export { ScalingPolicyService, getScalingPolicyService, AutoScaler, getAutoScaler, createAutoScaler, CapacityManager, getCapacityManager, createCapacityManager, ScalingOrchestrator, getScalingOrchestrator, createScalingOrchestrator, } from './services/index.js';
|
|
13
|
-
// Billing
|
|
14
|
-
export * from './billing/index.js';
|
|
15
|
-
// Run if executed directly (ES module compatible check)
|
|
16
|
-
const isMain = process.argv[1] === fileURLToPath(import.meta.url);
|
|
17
|
-
if (isMain) {
|
|
18
|
-
(async () => {
|
|
19
|
-
try {
|
|
20
|
-
const { createServer } = await import('./server.js');
|
|
21
|
-
const server = await createServer();
|
|
22
|
-
await server.start();
|
|
23
|
-
// Graceful shutdown
|
|
24
|
-
const shutdown = async () => {
|
|
25
|
-
console.log('\nShutting down...');
|
|
26
|
-
await server.stop();
|
|
27
|
-
process.exit(0);
|
|
28
|
-
};
|
|
29
|
-
process.on('SIGINT', shutdown);
|
|
30
|
-
process.on('SIGTERM', shutdown);
|
|
31
|
-
}
|
|
32
|
-
catch (error) {
|
|
33
|
-
console.error('Failed to start server:', error);
|
|
34
|
-
process.exit(1);
|
|
35
|
-
}
|
|
36
|
-
})();
|
|
37
|
-
}
|
|
1
|
+
export { readStoredAuth, writeStoredAuth, clearStoredAuth, refreshStoredAuth, ensureAuthenticated, authorizedApiFetch, } from "./auth.js";
|
|
2
|
+
export { CloudApiClient, buildApiUrl, } from "./api-client.js";
|
|
3
|
+
export { runWorkflow, getRunStatus, getRunLogs, cancelWorkflow, syncWorkflowPatch, resolveWorkflowInput, inferWorkflowFileType, shouldSyncCodeByDefault, } from "./workflows.js";
|
|
4
|
+
export { SUPPORTED_PROVIDERS, REFRESH_WINDOW_MS, AUTH_FILE_PATH, defaultApiUrl, isSupportedProvider, } from "./types.js";
|
|
38
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,cAAc,EACd,WAAW,GAGZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAQL,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export type StoredAuth = {
|
|
2
|
+
accessToken: string;
|
|
3
|
+
refreshToken: string;
|
|
4
|
+
accessTokenExpiresAt: string;
|
|
5
|
+
apiUrl: string;
|
|
6
|
+
};
|
|
7
|
+
export type WhoAmIResponse = {
|
|
8
|
+
authenticated: boolean;
|
|
9
|
+
source: 'session' | 'token';
|
|
10
|
+
subjectType: string | null;
|
|
11
|
+
scopes: string[];
|
|
12
|
+
user: {
|
|
13
|
+
id: string;
|
|
14
|
+
email: string | null;
|
|
15
|
+
name: string | null;
|
|
16
|
+
avatarUrl: string | null;
|
|
17
|
+
};
|
|
18
|
+
currentOrganization: {
|
|
19
|
+
id: string;
|
|
20
|
+
slug: string;
|
|
21
|
+
name: string;
|
|
22
|
+
role: string;
|
|
23
|
+
status: string;
|
|
24
|
+
};
|
|
25
|
+
currentWorkspace: {
|
|
26
|
+
id: string;
|
|
27
|
+
organization_id: string;
|
|
28
|
+
slug: string;
|
|
29
|
+
name: string;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
export type AuthSessionResponse = {
|
|
33
|
+
sessionId: string;
|
|
34
|
+
ssh: {
|
|
35
|
+
host: string;
|
|
36
|
+
port: number;
|
|
37
|
+
user: string;
|
|
38
|
+
password: string;
|
|
39
|
+
};
|
|
40
|
+
remoteCommand: string;
|
|
41
|
+
provider: string;
|
|
42
|
+
expiresAt: string;
|
|
43
|
+
};
|
|
44
|
+
export type WorkflowFileType = 'yaml' | 'ts' | 'py';
|
|
45
|
+
export type RunWorkflowOptions = {
|
|
46
|
+
apiUrl?: string;
|
|
47
|
+
fileType?: WorkflowFileType;
|
|
48
|
+
syncCode?: boolean;
|
|
49
|
+
};
|
|
50
|
+
export type RunWorkflowResponse = {
|
|
51
|
+
runId: string;
|
|
52
|
+
sandboxId?: string;
|
|
53
|
+
status: string;
|
|
54
|
+
[key: string]: unknown;
|
|
55
|
+
};
|
|
56
|
+
export type WorkflowLogsResponse = {
|
|
57
|
+
content: string;
|
|
58
|
+
offset: number;
|
|
59
|
+
totalSize: number;
|
|
60
|
+
done: boolean;
|
|
61
|
+
[key: string]: unknown;
|
|
62
|
+
};
|
|
63
|
+
export type SyncPatchResponse = {
|
|
64
|
+
patch: string;
|
|
65
|
+
hasChanges: boolean;
|
|
66
|
+
[key: string]: unknown;
|
|
67
|
+
};
|
|
68
|
+
export declare const SUPPORTED_PROVIDERS: readonly ["anthropic", "openai", "google", "cursor", "opencode", "droid"];
|
|
69
|
+
export declare const REFRESH_WINDOW_MS = 60000;
|
|
70
|
+
export declare const AUTH_FILE_PATH: string;
|
|
71
|
+
export declare function defaultApiUrl(): string;
|
|
72
|
+
export declare function isSupportedProvider(provider: string): boolean;
|
|
73
|
+
//# sourceMappingURL=types.d.ts.map
|