@alpic-ai/sdk 0.0.0-dev.g22f10d7 → 0.0.0-dev.g22fdcbb

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.
@@ -14,6 +14,10 @@ export declare class AlpicAuth {
14
14
  isAuthenticated(): Promise<boolean>;
15
15
  getToken(): Promise<string | undefined>;
16
16
  getUserAccessToken(): Promise<string | undefined>;
17
+ getUserInfo(): Promise<{
18
+ email: string | undefined;
19
+ name: string | undefined;
20
+ } | null>;
17
21
  login(opts?: LoginOptions): Promise<{
18
22
  sub: string;
19
23
  }>;
@@ -22,6 +22,17 @@ export class AlpicAuth {
22
22
  async getUserAccessToken() {
23
23
  return (await getOAuthClient().getValidAccessToken())?.access_token;
24
24
  }
25
+ async getUserInfo() {
26
+ const credentials = await getOAuthClient().getValidAccessToken();
27
+ if (!credentials) {
28
+ return null;
29
+ }
30
+ const userInfo = await getOAuthClient().fetchUserInfo(credentials);
31
+ if (!userInfo) {
32
+ return null;
33
+ }
34
+ return { email: userInfo.email, name: userInfo.name };
35
+ }
25
36
  async login(opts) {
26
37
  const result = await oauthLogin(opts);
27
38
  this.events.emit("authenticated", { sub: result.sub });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAqB,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAoB,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ3D,MAAM,OAAO,SAAS;IACH,MAAM,GAAG,IAAI,iBAAiB,EAAc,CAAC;IAE9D,EAAE,CAA6B,KAAQ,EAAE,QAA0C;QACjF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,CAA6B,KAAQ,EAAE,QAA0C;QAClF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,OAAO,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,SAAS,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,YAAY,CAAC;IACnG,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,OAAO,CAAC,MAAM,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,YAAY,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAmB;QAC7B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,WAAW,CAAC,gBAAgB,EAAE,CAAC;IACjC,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAqB,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAoB,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ3D,MAAM,OAAO,SAAS;IACH,MAAM,GAAG,IAAI,iBAAiB,EAAc,CAAC;IAE9D,EAAE,CAA6B,KAAQ,EAAE,QAA0C;QACjF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,CAA6B,KAAQ,EAAE,QAA0C;QAClF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,OAAO,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,SAAS,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,YAAY,CAAC;IACnG,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,OAAO,CAAC,MAAM,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,YAAY,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC;QACjE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAmB;QAC7B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,WAAW,CAAC,gBAAgB,EAAE,CAAC;IACjC,CAAC;CACF"}
package/dist/client.d.ts CHANGED
@@ -1,9 +1,15 @@
1
1
  import { type AlpicApi } from "./api/client.js";
2
2
  import { AlpicAuth } from "./auth/index.js";
3
+ import { Deployments } from "./deploy/deployments.js";
4
+ import { Projects } from "./project/projects.js";
3
5
  import { Tunnel } from "./tunnel/tunnel.js";
6
+ import { type WhoamiInfo } from "./whoami.js";
4
7
  export declare class Alpic {
5
8
  readonly auth: AlpicAuth;
6
9
  readonly api: AlpicApi;
7
10
  readonly tunnel: Tunnel;
11
+ readonly deployments: Deployments;
12
+ readonly projects: Projects;
8
13
  constructor();
14
+ whoami(): Promise<WhoamiInfo>;
9
15
  }
package/dist/client.js CHANGED
@@ -1,11 +1,16 @@
1
1
  import { createApiClient } from "./api/client.js";
2
2
  import { AlpicAuth } from "./auth/index.js";
3
+ import { Deployments } from "./deploy/deployments.js";
3
4
  import { env } from "./env.js";
5
+ import { Projects } from "./project/projects.js";
4
6
  import { Tunnel } from "./tunnel/tunnel.js";
7
+ import { whoami } from "./whoami.js";
5
8
  export class Alpic {
6
9
  auth;
7
10
  api;
8
11
  tunnel;
12
+ deployments;
13
+ projects;
9
14
  constructor() {
10
15
  this.auth = new AlpicAuth();
11
16
  this.api = createApiClient({
@@ -13,6 +18,11 @@ export class Alpic {
13
18
  auth: this.auth,
14
19
  });
15
20
  this.tunnel = new Tunnel({ api: this.api });
21
+ this.deployments = new Deployments({ api: this.api });
22
+ this.projects = new Projects({ api: this.api });
23
+ }
24
+ whoami() {
25
+ return whoami(this.auth, this.api);
16
26
  }
17
27
  }
18
28
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,KAAK;IACP,IAAI,CAAY;IAChB,GAAG,CAAW;IACd,MAAM,CAAS;IAExB;QACE,IAAI,CAAC,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC;YACzB,UAAU,EAAE,GAAG,CAAC,kBAAkB;YAClC,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC;CACF"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAmB,MAAM,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,OAAO,KAAK;IACP,IAAI,CAAY;IAChB,GAAG,CAAW;IACd,MAAM,CAAS;IACf,WAAW,CAAc;IACzB,QAAQ,CAAW;IAE5B;QACE,IAAI,CAAC,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC;YACzB,UAAU,EAAE,GAAG,CAAC,kBAAkB;YAClC,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM;QACJ,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ export declare function ensureGitAvailable(): void;
2
+ export declare function getGitFiles(): string[];
3
+ export declare function getFilesToPack(): string[];
4
+ export declare function createTarArchive(files: string[]): Promise<{
5
+ tmpDir: string;
6
+ archivePath: string;
7
+ }>;
@@ -0,0 +1,54 @@
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync, mkdtempSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { create as tarCreate } from "tar";
6
+ const GIT_FILES_MAX_BUFFER = 10 * 1024 * 1024;
7
+ function isGitRepository() {
8
+ return existsSync(join(process.cwd(), ".git"));
9
+ }
10
+ export function ensureGitAvailable() {
11
+ try {
12
+ execSync("git --version", { stdio: "ignore" });
13
+ }
14
+ catch {
15
+ throw new Error("Git is required to deploy. Please install git and ensure it is available in your PATH.");
16
+ }
17
+ }
18
+ export function getGitFiles() {
19
+ const output = execSync("git ls-files -z --cached --others --exclude-standard -- .", {
20
+ encoding: "utf8",
21
+ maxBuffer: GIT_FILES_MAX_BUFFER,
22
+ });
23
+ const files = output.split("\0").filter(Boolean);
24
+ if (files.length === 0) {
25
+ throw new Error("No tracked or untracked files found. Ensure you are in a git repository with files to deploy.");
26
+ }
27
+ return files;
28
+ }
29
+ export function getFilesToPack() {
30
+ if (isGitRepository()) {
31
+ return getGitFiles();
32
+ }
33
+ ensureGitAvailable();
34
+ execSync("git init", { stdio: "ignore" });
35
+ try {
36
+ return getGitFiles();
37
+ }
38
+ finally {
39
+ rmSync(join(process.cwd(), ".git"), { recursive: true, force: true });
40
+ }
41
+ }
42
+ export async function createTarArchive(files) {
43
+ const tmpDir = mkdtempSync(join(tmpdir(), "alpic-deploy-"));
44
+ const archivePath = join(tmpDir, "source.tar.gz");
45
+ try {
46
+ await tarCreate({ gzip: true, file: archivePath }, files);
47
+ }
48
+ catch (error) {
49
+ rmSync(tmpDir, { recursive: true, force: true });
50
+ throw error;
51
+ }
52
+ return { tmpDir, archivePath };
53
+ }
54
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/deploy/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,KAAK,CAAC;AAE1C,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,SAAS,eAAe;IACtB,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC;QACH,QAAQ,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;IAC5G,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,2DAA2D,EAAE;QACnF,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,oBAAoB;KAChC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,+FAA+F,CAAC,CAAC;IACnH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,eAAe,EAAE,EAAE,CAAC;QACtB,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;IACD,kBAAkB,EAAE,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAe;IACpD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { RouterOutput } from "@alpic-ai/api";
2
+ import type { AlpicApi } from "../api/client.js";
3
+ export type Deployment = RouterOutput["deployments"]["get"]["v1"];
4
+ export type DeploymentStatus = Deployment["status"];
5
+ export type DeployOptions = {
6
+ environmentId: string;
7
+ teamId: string;
8
+ onProgress?: (event: DeployEvent) => void;
9
+ };
10
+ export type DeployResult = {
11
+ deploymentId: string;
12
+ status: DeploymentStatus;
13
+ mcpServerUrl: string;
14
+ domains: string[];
15
+ deploymentPageUrl: string | null;
16
+ elapsedMs: number;
17
+ };
18
+ export type DeployEvent = {
19
+ type: "collecting";
20
+ } | {
21
+ type: "collected";
22
+ fileCount: number;
23
+ } | {
24
+ type: "uploading";
25
+ } | {
26
+ type: "triggering";
27
+ } | {
28
+ type: "deploying";
29
+ status: DeploymentStatus;
30
+ elapsedMs: number;
31
+ deploymentPageUrl: string | null;
32
+ };
33
+ export type DeploymentsDeps = {
34
+ api: AlpicApi;
35
+ };
36
+ export declare class Deployments {
37
+ private readonly api;
38
+ constructor(deps: DeploymentsDeps);
39
+ getLatestForEnvironment(environmentId: string): Promise<Deployment>;
40
+ watch(deploymentId: string): Promise<Deployment>;
41
+ private pollUntilFinal;
42
+ deploy({ environmentId, teamId, onProgress }: DeployOptions): Promise<DeployResult>;
43
+ }
@@ -0,0 +1,89 @@
1
+ import { readFileSync, rmSync } from "node:fs";
2
+ import { createTarArchive, getFilesToPack } from "./archive.js";
3
+ import { pollIntervalMs, sleep } from "./poll.js";
4
+ import { uploadToPresignedUrl } from "./upload.js";
5
+ const FINAL_STATUSES = new Set(["deployed", "failed", "canceled"]);
6
+ const TIMEOUT_MS = 15 * 60 * 1000;
7
+ const DEPLOY_POLL_MS = 10_000;
8
+ const WATCH_POLL_MS = 3_000;
9
+ export class Deployments {
10
+ api;
11
+ constructor(deps) {
12
+ this.api = deps.api;
13
+ }
14
+ async getLatestForEnvironment(environmentId) {
15
+ const environment = await this.api.environments.get.v1({ environmentId });
16
+ const deployments = await this.api.deployments.list.v1({
17
+ projectId: environment.projectId,
18
+ environmentId,
19
+ });
20
+ const latest = deployments[0];
21
+ if (!latest) {
22
+ throw new Error(`No deployments found for environment ${environmentId}.`);
23
+ }
24
+ return latest;
25
+ }
26
+ watch(deploymentId) {
27
+ return this.pollUntilFinal(deploymentId, WATCH_POLL_MS);
28
+ }
29
+ async pollUntilFinal(deploymentId, intervalMs) {
30
+ const startedAt = Date.now();
31
+ let current = await this.api.deployments.get.v1({ deploymentId });
32
+ while (!FINAL_STATUSES.has(current.status)) {
33
+ if (Date.now() - startedAt >= TIMEOUT_MS) {
34
+ throw new Error("Deployment did not reach a final state within 15 minutes.");
35
+ }
36
+ await sleep(pollIntervalMs(intervalMs));
37
+ current = await this.api.deployments.get.v1({ deploymentId });
38
+ }
39
+ return current;
40
+ }
41
+ async deploy({ environmentId, teamId, onProgress }) {
42
+ const emit = onProgress ?? (() => { });
43
+ let tmpDir;
44
+ const startedAt = Date.now();
45
+ try {
46
+ emit({ type: "collecting" });
47
+ const files = getFilesToPack();
48
+ emit({ type: "collected", fileCount: files.length });
49
+ const archive = await createTarArchive(files);
50
+ tmpDir = archive.tmpDir;
51
+ const { uploadUrl, token } = await this.api.deployments.uploadArtifact.v1({ teamId });
52
+ emit({ type: "uploading" });
53
+ await uploadToPresignedUrl(uploadUrl, readFileSync(archive.archivePath));
54
+ emit({ type: "triggering" });
55
+ const initial = await this.api.environments.deploy.v1({ environmentId, token });
56
+ let deployment = initial;
57
+ const deploymentPageUrl = deployment.deploymentPageUrl ?? null;
58
+ const emitDeploying = () => emit({ type: "deploying", status: deployment.status, elapsedMs: Date.now() - startedAt, deploymentPageUrl });
59
+ emitDeploying();
60
+ while (deployment.status === "ongoing") {
61
+ if (Date.now() - startedAt >= TIMEOUT_MS) {
62
+ throw new Error(deploymentPageUrl
63
+ ? `Deployment aborted after 15 minutes. View status: ${deploymentPageUrl}`
64
+ : "Deployment aborted after 15 minutes.");
65
+ }
66
+ deployment = await this.api.deployments.get.v1({ deploymentId: deployment.id });
67
+ emitDeploying();
68
+ if (deployment.status === "ongoing") {
69
+ await sleep(pollIntervalMs(DEPLOY_POLL_MS));
70
+ }
71
+ }
72
+ const environment = await this.api.environments.get.v1({ environmentId });
73
+ return {
74
+ deploymentId: deployment.id,
75
+ status: deployment.status,
76
+ mcpServerUrl: environment.mcpServerUrl,
77
+ domains: environment.domains,
78
+ deploymentPageUrl: deployment.deploymentPageUrl ?? null,
79
+ elapsedMs: Date.now() - startedAt,
80
+ };
81
+ }
82
+ finally {
83
+ if (tmpDir) {
84
+ rmSync(tmpDir, { recursive: true, force: true });
85
+ }
86
+ }
87
+ }
88
+ }
89
+ //# sourceMappingURL=deployments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployments.js","sourceRoot":"","sources":["../../src/deploy/deployments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function pollIntervalMs(defaultMs: number): number;
2
+ export declare const sleep: (ms: number) => Promise<void>;
@@ -0,0 +1,10 @@
1
+ export function pollIntervalMs(defaultMs) {
2
+ const override = process.env.ALPIC_POLL_INTERVAL_MS;
3
+ if (override !== undefined) {
4
+ const parsed = Number.parseInt(override, 10);
5
+ return Number.isNaN(parsed) ? defaultMs : parsed;
6
+ }
7
+ return defaultMs;
8
+ }
9
+ export const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
10
+ //# sourceMappingURL=poll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poll.js","sourceRoot":"","sources":["../../src/deploy/poll.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACpD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IACnD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function uploadToPresignedUrl(uploadUrl: string, buffer: Buffer): Promise<void>;
@@ -0,0 +1,13 @@
1
+ export async function uploadToPresignedUrl(uploadUrl, buffer) {
2
+ const res = await fetch(uploadUrl, {
3
+ method: "PUT",
4
+ headers: {
5
+ "Content-Type": "application/gzip",
6
+ },
7
+ body: new Uint8Array(buffer),
8
+ });
9
+ if (!res.ok) {
10
+ throw new Error(`Upload failed: ${res.status} ${res.statusText}`);
11
+ }
12
+ }
13
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/deploy/upload.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,SAAiB,EAAE,MAAc;IAC1E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;QACjC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC;KAC7B,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -4,4 +4,8 @@ export { AlpicAuth } from "./auth/index.js";
4
4
  export { getOAuthClient } from "./auth/oauth-client.js";
5
5
  export { GlobalStore, globalStore } from "./auth/store.js";
6
6
  export { Alpic } from "./client.js";
7
+ export type { DeployEvent, Deployment, DeploymentStatus, DeployOptions, DeployResult } from "./deploy/deployments.js";
8
+ export type { ProjectConfig } from "./project/config.js";
9
+ export type { CreateLinkedProjectOptions, LinkedProjectConfig } from "./project/projects.js";
7
10
  export type { OpenTunnelOptions, TunnelCloseInfo, TunnelHandle, TunnelRequest } from "./tunnel/tunnel.js";
11
+ export type { Team, WhoamiInfo } from "./whoami.js";
@@ -0,0 +1,10 @@
1
+ export type ProjectConfig = {
2
+ projectId: string;
3
+ teamId: string;
4
+ teamName?: string;
5
+ projectName: string;
6
+ environmentId?: string;
7
+ environmentName?: string;
8
+ };
9
+ export declare function loadProjectConfig(): ProjectConfig | null;
10
+ export declare function saveProjectConfig(projectConfig: ProjectConfig): void;
@@ -0,0 +1,29 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ const getProjectJsonPath = () => join(process.cwd(), ".alpic", "project.json");
4
+ export function loadProjectConfig() {
5
+ const path = getProjectJsonPath();
6
+ if (!existsSync(path)) {
7
+ return null;
8
+ }
9
+ let raw;
10
+ try {
11
+ raw = JSON.parse(readFileSync(path, "utf8"));
12
+ }
13
+ catch (error) {
14
+ throw new Error(`Failed to load project config: ${error.message}`);
15
+ }
16
+ return {
17
+ projectId: raw.projectId,
18
+ teamId: raw.teamId,
19
+ teamName: raw.teamName,
20
+ projectName: raw.projectName ?? raw.projectId,
21
+ environmentId: raw.environmentId,
22
+ environmentName: raw.environmentName,
23
+ };
24
+ }
25
+ export function saveProjectConfig(projectConfig) {
26
+ mkdirSync(join(process.cwd(), ".alpic"), { recursive: true });
27
+ writeFileSync(getProjectJsonPath(), JSON.stringify(projectConfig, null, 2));
28
+ }
29
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/project/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAWjC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AAE/E,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,GAAmE,CAAC;IACxE,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAG1C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kCAAmC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS;QAC7C,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,eAAe,EAAE,GAAG,CAAC,eAAe;KACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,aAA4B;IAC5D,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,aAAa,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Runtime } from "@alpic-ai/api";
2
+ export declare function detectRuntime(): Runtime | null;
@@ -0,0 +1,25 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ export function detectRuntime() {
3
+ const has = (file) => existsSync(file);
4
+ const read = (file) => {
5
+ try {
6
+ return readFileSync(file, "utf8");
7
+ }
8
+ catch {
9
+ return "";
10
+ }
11
+ };
12
+ if (has("pyproject.toml") || has("requirements.txt") || has("setup.py") || has(".python-version")) {
13
+ return "python3.13";
14
+ }
15
+ if (has("package.json")) {
16
+ const nvmrc = has(".nvmrc") ? (read(".nvmrc").trim().split(/\s/)[0] ?? "") : "";
17
+ const major = nvmrc.replace(/^v/i, "").match(/^(\d+)/)?.[1];
18
+ if (major === "22") {
19
+ return "node22";
20
+ }
21
+ return "node24";
22
+ }
23
+ return null;
24
+ }
25
+ //# sourceMappingURL=detect-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-runtime.js","sourceRoot":"","sources":["../../src/project/detect-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGnD,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,CAAC,IAAY,EAAU,EAAE;QACpC,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClG,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { RouterInput, Runtime } from "@alpic-ai/api";
2
+ import type { AlpicApi } from "../api/client.js";
3
+ import { type ProjectConfig } from "./config.js";
4
+ export type CreateLinkedProjectOptions = RouterInput["projects"]["create"]["v1"] & {
5
+ teamName?: string;
6
+ };
7
+ export type LinkedProjectConfig = ProjectConfig & {
8
+ environmentId: string;
9
+ };
10
+ export type ProjectsDeps = {
11
+ api: AlpicApi;
12
+ };
13
+ export declare class Projects {
14
+ private readonly api;
15
+ constructor(deps: ProjectsDeps);
16
+ loadConfig(): ProjectConfig | null;
17
+ saveConfig(projectConfig: ProjectConfig): void;
18
+ detectRuntime(): Runtime | null;
19
+ validateLink(projectConfig: ProjectConfig): Promise<ProjectConfig | null>;
20
+ createLinked({ teamName, ...input }: CreateLinkedProjectOptions): Promise<LinkedProjectConfig>;
21
+ }
@@ -0,0 +1,52 @@
1
+ import { ORPCError } from "@orpc/client";
2
+ import { loadProjectConfig, saveProjectConfig } from "./config.js";
3
+ import { detectRuntime } from "./detect-runtime.js";
4
+ export class Projects {
5
+ api;
6
+ constructor(deps) {
7
+ this.api = deps.api;
8
+ }
9
+ loadConfig() {
10
+ return loadProjectConfig();
11
+ }
12
+ saveConfig(projectConfig) {
13
+ saveProjectConfig(projectConfig);
14
+ }
15
+ detectRuntime() {
16
+ return detectRuntime();
17
+ }
18
+ async validateLink(projectConfig) {
19
+ let project;
20
+ try {
21
+ project = await this.api.projects.get.v1({ projectId: projectConfig.projectId });
22
+ }
23
+ catch (error) {
24
+ if (error instanceof ORPCError && error.code === "NOT_FOUND") {
25
+ return null;
26
+ }
27
+ throw error;
28
+ }
29
+ if (projectConfig.environmentId && !project.environments?.some((env) => env.id === projectConfig.environmentId)) {
30
+ return { ...projectConfig, environmentId: undefined, environmentName: undefined };
31
+ }
32
+ return projectConfig;
33
+ }
34
+ async createLinked({ teamName, ...input }) {
35
+ const created = await this.api.projects.create.v1(input);
36
+ const productionEnv = created.productionEnvironment;
37
+ if (!productionEnv) {
38
+ throw new Error("Project was created but has no Production environment.");
39
+ }
40
+ const projectConfig = {
41
+ projectId: created.id,
42
+ teamId: created.teamId,
43
+ teamName,
44
+ projectName: created.name,
45
+ environmentId: productionEnv.id,
46
+ environmentName: productionEnv.name,
47
+ };
48
+ saveProjectConfig(projectConfig);
49
+ return projectConfig;
50
+ }
51
+ }
52
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/project/projects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAsB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAYpD,MAAM,OAAO,QAAQ;IACF,GAAG,CAAW;IAE/B,YAAY,IAAkB;QAC5B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACtB,CAAC;IAED,UAAU;QACR,OAAO,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAED,UAAU,CAAC,aAA4B;QACrC,iBAAiB,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;IAED,aAAa;QACX,OAAO,aAAa,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,aAA4B;QAC7C,IAAI,OAAgB,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC;QACnF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC7D,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,aAAa,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;YAChH,OAAO,EAAE,GAAG,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;QACpF,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAA8B;QACnE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,OAAO,CAAC,qBAAqB,CAAC;QACpD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,aAAa,GAAwB;YACzC,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ;YACR,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,aAAa,EAAE,aAAa,CAAC,EAAE;YAC/B,eAAe,EAAE,aAAa,CAAC,IAAI;SACpC,CAAC;QACF,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACjC,OAAO,aAAa,CAAC;IACvB,CAAC;CACF"}
@@ -16585,18 +16585,18 @@ var {
16585
16585
  create
16586
16586
  } = axios_default;
16587
16587
 
16588
- // ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=24bd89f8b5bea6a63243b7a7d4ad888dcf7049e36eac19b10006403b29758c35/node_modules/pipenet/dist/Tunnel.js
16588
+ // ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/Tunnel.js
16589
16589
  var import_debug2 = __toESM(require_src(), 1);
16590
16590
  import { EventEmitter as EventEmitter3 } from "events";
16591
16591
 
16592
- // ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=24bd89f8b5bea6a63243b7a7d4ad888dcf7049e36eac19b10006403b29758c35/node_modules/pipenet/dist/TunnelCluster.js
16592
+ // ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/TunnelCluster.js
16593
16593
  var import_debug = __toESM(require_src(), 1);
16594
16594
  import { EventEmitter as EventEmitter2 } from "events";
16595
16595
  import fs from "fs";
16596
16596
  import net from "net";
16597
16597
  import tls from "tls";
16598
16598
 
16599
- // ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=24bd89f8b5bea6a63243b7a7d4ad888dcf7049e36eac19b10006403b29758c35/node_modules/pipenet/dist/HeaderHostTransformer.js
16599
+ // ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/HeaderHostTransformer.js
16600
16600
  import { Transform } from "stream";
16601
16601
  var HeaderHostTransformer = class extends Transform {
16602
16602
  host;
@@ -16614,7 +16614,7 @@ var HeaderHostTransformer = class extends Transform {
16614
16614
  }
16615
16615
  };
16616
16616
 
16617
- // ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=24bd89f8b5bea6a63243b7a7d4ad888dcf7049e36eac19b10006403b29758c35/node_modules/pipenet/dist/TunnelCluster.js
16617
+ // ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/TunnelCluster.js
16618
16618
  var log = (0, import_debug.default)("pipenet:client");
16619
16619
  var TunnelCluster = class extends EventEmitter2 {
16620
16620
  opts;
@@ -16647,18 +16647,10 @@ var TunnelCluster = class extends EventEmitter2 {
16647
16647
  }
16648
16648
  remote.end();
16649
16649
  });
16650
- let deadEmitted = false;
16651
- const emitDead = () => {
16652
- if (deadEmitted) {
16653
- return;
16654
- }
16655
- deadEmitted = true;
16656
- this.emit("dead", remote);
16657
- };
16658
16650
  const connLocal = () => {
16659
16651
  if (remote.destroyed) {
16660
16652
  log("remote destroyed");
16661
- emitDead();
16653
+ this.emit("dead", remote);
16662
16654
  return;
16663
16655
  }
16664
16656
  log("connecting locally to %s://%s:%d", localProtocol, localHost, localPort);
@@ -16674,7 +16666,7 @@ var TunnelCluster = class extends EventEmitter2 {
16674
16666
  const local = opt.localHttps ? tls.connect({ host: localHost, port: localPort, ...getLocalCertOpts() }) : net.connect({ host: localHost, port: localPort });
16675
16667
  const remoteClose = () => {
16676
16668
  log("remote close");
16677
- emitDead();
16669
+ this.emit("dead", remote);
16678
16670
  local.end();
16679
16671
  };
16680
16672
  remote.once("close", remoteClose);
@@ -16722,7 +16714,7 @@ var TunnelCluster = class extends EventEmitter2 {
16722
16714
  }
16723
16715
  };
16724
16716
 
16725
- // ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=24bd89f8b5bea6a63243b7a7d4ad888dcf7049e36eac19b10006403b29758c35/node_modules/pipenet/dist/Tunnel.js
16717
+ // ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/Tunnel.js
16726
16718
  var log2 = (0, import_debug2.default)("pipenet:client");
16727
16719
  var Tunnel = class extends EventEmitter3 {
16728
16720
  cachedUrl;
@@ -16870,7 +16862,7 @@ var Tunnel = class extends EventEmitter3 {
16870
16862
  }
16871
16863
  };
16872
16864
 
16873
- // ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=24bd89f8b5bea6a63243b7a7d4ad888dcf7049e36eac19b10006403b29758c35/node_modules/pipenet/dist/pipenet.js
16865
+ // ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/pipenet.js
16874
16866
  function pipenet(arg1, arg2, arg3) {
16875
16867
  const options = typeof arg1 === "object" ? arg1 : { ...arg2, port: arg1 };
16876
16868
  const callback = typeof arg1 === "object" ? arg2 : arg3;