@alpic-ai/sdk 0.0.0-dev.gedf39fe → 0.0.0-dev.geeda9b5

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/client.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { type AlpicApi } from "./api/client.js";
2
2
  import { AlpicAuth } from "./auth/index.js";
3
3
  import { Deployments } from "./deploy/deployments.js";
4
+ import { Projects } from "./project/projects.js";
4
5
  import { Tunnel } from "./tunnel/tunnel.js";
5
6
  import { type WhoamiInfo } from "./whoami.js";
6
7
  export declare class Alpic {
@@ -8,6 +9,7 @@ export declare class Alpic {
8
9
  readonly api: AlpicApi;
9
10
  readonly tunnel: Tunnel;
10
11
  readonly deployments: Deployments;
12
+ readonly projects: Projects;
11
13
  constructor();
12
14
  whoami(): Promise<WhoamiInfo>;
13
15
  }
package/dist/client.js CHANGED
@@ -2,6 +2,7 @@ import { createApiClient } from "./api/client.js";
2
2
  import { AlpicAuth } from "./auth/index.js";
3
3
  import { Deployments } from "./deploy/deployments.js";
4
4
  import { env } from "./env.js";
5
+ import { Projects } from "./project/projects.js";
5
6
  import { Tunnel } from "./tunnel/tunnel.js";
6
7
  import { whoami } from "./whoami.js";
7
8
  export class Alpic {
@@ -9,6 +10,7 @@ export class Alpic {
9
10
  api;
10
11
  tunnel;
11
12
  deployments;
13
+ projects;
12
14
  constructor() {
13
15
  this.auth = new AlpicAuth();
14
16
  this.api = createApiClient({
@@ -17,6 +19,7 @@ export class Alpic {
17
19
  });
18
20
  this.tunnel = new Tunnel({ api: this.api });
19
21
  this.deployments = new Deployments({ api: this.api });
22
+ this.projects = new Projects({ api: this.api });
20
23
  }
21
24
  whoami() {
22
25
  return whoami(this.auth, this.api);
@@ -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,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,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;IAElC;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;IACxD,CAAC;IAED,MAAM;QACJ,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,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"}
@@ -1,3 +1,4 @@
1
+ export declare function isExcluded(file: string): boolean;
1
2
  export declare function ensureGitAvailable(): void;
2
3
  export declare function getGitFiles(): string[];
3
4
  export declare function getFilesToPack(): string[];
@@ -4,6 +4,10 @@ import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
5
  import { create as tarCreate } from "tar";
6
6
  const GIT_FILES_MAX_BUFFER = 10 * 1024 * 1024;
7
+ const EXCLUDED_DIRS = new Set(["node_modules", ".venv", "venv", "__pycache__", ".git", "dist"]);
8
+ export function isExcluded(file) {
9
+ return file.split("/").some((segment) => EXCLUDED_DIRS.has(segment));
10
+ }
7
11
  function isGitRepository() {
8
12
  return existsSync(join(process.cwd(), ".git"));
9
13
  }
@@ -20,7 +24,10 @@ export function getGitFiles() {
20
24
  encoding: "utf8",
21
25
  maxBuffer: GIT_FILES_MAX_BUFFER,
22
26
  });
23
- const files = output.split("\0").filter(Boolean);
27
+ const files = output
28
+ .split("\0")
29
+ .filter(Boolean)
30
+ .filter((file) => !isExcluded(file));
24
31
  if (files.length === 0) {
25
32
  throw new Error("No tracked or untracked files found. Ensure you are in a git repository with files to deploy.");
26
33
  }
@@ -1 +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"}
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/deploy/archive.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -5,5 +5,7 @@ export { getOAuthClient } from "./auth/oauth-client.js";
5
5
  export { GlobalStore, globalStore } from "./auth/store.js";
6
6
  export { Alpic } from "./client.js";
7
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";
8
10
  export type { OpenTunnelOptions, TunnelCloseInfo, TunnelHandle, TunnelRequest } from "./tunnel/tunnel.js";
9
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.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/Tunnel.js
16588
+ // ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=09c4ab8ce9e1d77e9c735905927fa4bc2790e673c18d6cf3a62fd19ba4d9b576/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.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/TunnelCluster.js
16592
+ // ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=09c4ab8ce9e1d77e9c735905927fa4bc2790e673c18d6cf3a62fd19ba4d9b576/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.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/HeaderHostTransformer.js
16599
+ // ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=09c4ab8ce9e1d77e9c735905927fa4bc2790e673c18d6cf3a62fd19ba4d9b576/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.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/TunnelCluster.js
16617
+ // ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=09c4ab8ce9e1d77e9c735905927fa4bc2790e673c18d6cf3a62fd19ba4d9b576/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;
@@ -16714,7 +16714,7 @@ var TunnelCluster = class extends EventEmitter2 {
16714
16714
  }
16715
16715
  };
16716
16716
 
16717
- // ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/Tunnel.js
16717
+ // ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=09c4ab8ce9e1d77e9c735905927fa4bc2790e673c18d6cf3a62fd19ba4d9b576/node_modules/pipenet/dist/Tunnel.js
16718
16718
  var log2 = (0, import_debug2.default)("pipenet:client");
16719
16719
  var Tunnel = class extends EventEmitter3 {
16720
16720
  cachedUrl;
@@ -16862,7 +16862,7 @@ var Tunnel = class extends EventEmitter3 {
16862
16862
  }
16863
16863
  };
16864
16864
 
16865
- // ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=4a969c2edb33b7885d9a25490aa8b87f86e8fd86455a95c8e3c8aa4bdac720b9/node_modules/pipenet/dist/pipenet.js
16865
+ // ../../node_modules/.pnpm/pipenet@1.4.2_patch_hash=09c4ab8ce9e1d77e9c735905927fa4bc2790e673c18d6cf3a62fd19ba4d9b576/node_modules/pipenet/dist/pipenet.js
16866
16866
  function pipenet(arg1, arg2, arg3) {
16867
16867
  const options = typeof arg1 === "object" ? arg1 : { ...arg2, port: arg1 };
16868
16868
  const callback = typeof arg1 === "object" ? arg2 : arg3;