@basilica/openclaw 0.1.0 → 0.3.0

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.
Files changed (71) hide show
  1. package/dist/gateway/status.d.ts +3 -6
  2. package/dist/gateway/status.d.ts.map +1 -1
  3. package/dist/gateway/status.js +12 -15
  4. package/dist/gateway/status.js.map +1 -1
  5. package/dist/gateway/webhook.d.ts +2 -1
  6. package/dist/gateway/webhook.d.ts.map +1 -1
  7. package/dist/gateway/webhook.js +28 -1
  8. package/dist/gateway/webhook.js.map +1 -1
  9. package/dist/hooks/index.d.ts.map +1 -1
  10. package/dist/hooks/index.js +0 -4
  11. package/dist/hooks/index.js.map +1 -1
  12. package/dist/tools/auth.d.ts +3 -0
  13. package/dist/tools/auth.d.ts.map +1 -0
  14. package/dist/tools/auth.js +170 -0
  15. package/dist/tools/auth.js.map +1 -0
  16. package/dist/tools/billing.d.ts +3 -0
  17. package/dist/tools/billing.d.ts.map +1 -0
  18. package/dist/tools/billing.js +37 -0
  19. package/dist/tools/billing.js.map +1 -0
  20. package/dist/tools/context.d.ts +7 -2
  21. package/dist/tools/context.d.ts.map +1 -1
  22. package/dist/tools/context.js +19 -10
  23. package/dist/tools/context.js.map +1 -1
  24. package/dist/tools/deployments.d.ts.map +1 -1
  25. package/dist/tools/deployments.js +97 -24
  26. package/dist/tools/deployments.js.map +1 -1
  27. package/dist/tools/index.js +10 -10
  28. package/dist/tools/index.js.map +1 -1
  29. package/dist/tools/jobs.d.ts.map +1 -1
  30. package/dist/tools/jobs.js +68 -22
  31. package/dist/tools/jobs.js.map +1 -1
  32. package/dist/tools/rentals.d.ts +3 -0
  33. package/dist/tools/rentals.d.ts.map +1 -0
  34. package/dist/tools/rentals.js +114 -0
  35. package/dist/tools/rentals.js.map +1 -0
  36. package/dist/tools/schemas.d.ts +25 -15
  37. package/dist/tools/schemas.d.ts.map +1 -1
  38. package/dist/tools/schemas.js +139 -69
  39. package/dist/tools/schemas.js.map +1 -1
  40. package/dist/tools/secure-cloud.d.ts +3 -0
  41. package/dist/tools/secure-cloud.d.ts.map +1 -0
  42. package/dist/tools/secure-cloud.js +41 -0
  43. package/dist/tools/secure-cloud.js.map +1 -0
  44. package/openclaw.plugin.json +3 -23
  45. package/package.json +3 -2
  46. package/skills/basilica-operator/index.md +43 -31
  47. package/skills/basilica-platform/index.md +87 -54
  48. package/dist/hooks/model-routing.d.ts +0 -3
  49. package/dist/hooks/model-routing.d.ts.map +0 -1
  50. package/dist/hooks/model-routing.js +0 -11
  51. package/dist/hooks/model-routing.js.map +0 -1
  52. package/dist/hooks/tool-policy.d.ts +0 -3
  53. package/dist/hooks/tool-policy.d.ts.map +0 -1
  54. package/dist/hooks/tool-policy.js +0 -44
  55. package/dist/hooks/tool-policy.js.map +0 -1
  56. package/dist/tools/datasets.d.ts +0 -3
  57. package/dist/tools/datasets.d.ts.map +0 -1
  58. package/dist/tools/datasets.js +0 -57
  59. package/dist/tools/datasets.js.map +0 -1
  60. package/dist/tools/gpu.d.ts +0 -3
  61. package/dist/tools/gpu.d.ts.map +0 -1
  62. package/dist/tools/gpu.js +0 -63
  63. package/dist/tools/gpu.js.map +0 -1
  64. package/dist/tools/inference.d.ts +0 -3
  65. package/dist/tools/inference.d.ts.map +0 -1
  66. package/dist/tools/inference.js +0 -42
  67. package/dist/tools/inference.js.map +0 -1
  68. package/dist/tools/logs.d.ts +0 -3
  69. package/dist/tools/logs.d.ts.map +0 -1
  70. package/dist/tools/logs.js +0 -44
  71. package/dist/tools/logs.js.map +0 -1
@@ -1,12 +1,9 @@
1
- import type { BasilicaCredential } from "@basilica/openclaw-sdk";
2
- export interface StatusParams {
3
- baseUrl?: string;
4
- credential?: BasilicaCredential;
5
- }
1
+ import type { HealthCheckResponse } from "@basilica/sdk";
6
2
  export interface PlatformStatus {
7
3
  healthy: boolean;
8
4
  timestamp: string;
9
- services: Record<string, "up" | "degraded" | "down">;
5
+ healthCheck?: HealthCheckResponse;
6
+ error?: string;
10
7
  }
11
8
  export declare function handleStatus(params: Record<string, unknown>): Promise<PlatformStatus>;
12
9
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/gateway/status.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAwB,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEvF,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,MAAM,CAAC,CAAC;CACtD;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAgC3F"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/gateway/status.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAwB,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAE/E,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CA8B3F"}
@@ -1,32 +1,29 @@
1
- import { BasilicaClient, BasilicaError } from "@basilica/openclaw-sdk";
1
+ import { BasilicaClient, BasilicaError } from "@basilica/sdk";
2
2
  export async function handleStatus(params) {
3
- const baseUrl = params.baseUrl ?? "https://api.basilica.cloud";
3
+ const baseUrl = params.baseUrl ?? "https://api.basilica.ai";
4
4
  const config = {
5
5
  baseUrl,
6
- credential: params.credential ?? { type: "token", token: "" },
6
+ token: params.token ?? "",
7
7
  };
8
8
  try {
9
9
  const client = new BasilicaClient(config);
10
- await client.request("GET", "/health");
10
+ const health = await client.healthCheck();
11
11
  return {
12
- healthy: true,
12
+ healthy: health.status === "ok" || health.status === "healthy",
13
13
  timestamp: new Date().toISOString(),
14
- services: {
15
- api: "up",
16
- inference: "up",
17
- compute: "up",
18
- },
14
+ healthCheck: health,
19
15
  };
20
16
  }
21
17
  catch (err) {
18
+ const message = err instanceof BasilicaError
19
+ ? `${err.code}: ${err.message}`
20
+ : err instanceof Error
21
+ ? err.message
22
+ : "Unknown error";
22
23
  return {
23
24
  healthy: false,
24
25
  timestamp: new Date().toISOString(),
25
- services: {
26
- api: err instanceof BasilicaError && err.code === "NETWORK_ERROR" ? "down" : "degraded",
27
- inference: "degraded",
28
- compute: "degraded",
29
- },
26
+ error: message,
30
27
  };
31
28
  }
32
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/gateway/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAcvE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAA+B;IAChE,MAAM,OAAO,GAAI,MAAM,CAAC,OAAkB,IAAI,4BAA4B,CAAC;IAE3E,MAAM,MAAM,GAAyB;QACnC,OAAO;QACP,UAAU,EAAE,MAAM,CAAC,UAAgC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;KACpF,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAEvC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,QAAQ,EAAE;gBACR,GAAG,EAAE,IAAI;gBACT,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,IAAI;aACd;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,QAAQ,EAAE;gBACR,GAAG,EAAE,GAAG,YAAY,aAAa,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU;gBACvF,SAAS,EAAE,UAAU;gBACrB,OAAO,EAAE,UAAU;aACpB;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/gateway/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAU9D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAA+B;IAChE,MAAM,OAAO,GAAI,MAAM,CAAC,OAAkB,IAAI,yBAAyB,CAAC;IAExE,MAAM,MAAM,GAAyB;QACnC,OAAO;QACP,KAAK,EAAG,MAAM,CAAC,KAAgB,IAAI,EAAE;KACtC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QAE1C,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAC9D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,WAAW,EAAE,MAAM;SACpB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,aAAa;YAC1C,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE;YAC/B,CAAC,CAAC,GAAG,YAAY,KAAK;gBACpB,CAAC,CAAC,GAAG,CAAC,OAAO;gBACb,CAAC,CAAC,eAAe,CAAC;QAEtB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,OAAO;SACf,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,11 +1,12 @@
1
1
  import type { HttpRequest, HttpResponse } from "openclaw-plugin-types";
2
- export type WebhookEventType = "job.completed" | "job.failed" | "deployment.status_changed" | "alert.triggered";
2
+ export type WebhookEventType = "rental.started" | "rental.stopped" | "rental.failed" | "deployment.status_changed" | "job.completed" | "job.failed" | "alert.triggered";
3
3
  export interface WebhookPayload {
4
4
  eventType: WebhookEventType;
5
5
  timestamp: string;
6
6
  data: Record<string, unknown>;
7
7
  }
8
8
  export type WebhookListener = (payload: WebhookPayload) => void;
9
+ export declare function setWebhookSecret(secret: string | undefined): void;
9
10
  export declare function addWebhookListener(listener: WebhookListener): void;
10
11
  export declare function removeWebhookListener(listener: WebhookListener): void;
11
12
  export declare function handleWebhook(req: HttpRequest): Promise<HttpResponse>;
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/gateway/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAEvE,MAAM,MAAM,gBAAgB,GAAG,eAAe,GAAG,YAAY,GAAG,2BAA2B,GAAG,iBAAiB,CAAC;AAEhH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;AAIhE,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAElE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAGrE;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAgB3E"}
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/gateway/webhook.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAEvE,MAAM,MAAM,gBAAgB,GACxB,gBAAgB,GAChB,gBAAgB,GAChB,eAAe,GACf,2BAA2B,GAC3B,eAAe,GACf,YAAY,GACZ,iBAAiB,CAAC;AAEtB,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;AAMhE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEjE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAElE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAGrE;AASD,wBAAsB,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CA+B3E"}
@@ -1,4 +1,9 @@
1
+ import { createHmac, timingSafeEqual } from "node:crypto";
1
2
  const listeners = [];
3
+ let webhookSecret;
4
+ export function setWebhookSecret(secret) {
5
+ webhookSecret = secret;
6
+ }
2
7
  export function addWebhookListener(listener) {
3
8
  listeners.push(listener);
4
9
  }
@@ -7,16 +12,38 @@ export function removeWebhookListener(listener) {
7
12
  if (idx >= 0)
8
13
  listeners.splice(idx, 1);
9
14
  }
15
+ function verifySignature(body, signature, secret) {
16
+ const expected = createHmac("sha256", secret).update(body).digest("hex");
17
+ const sigHex = signature.startsWith("sha256=") ? signature.slice(7) : signature;
18
+ if (expected.length !== sigHex.length)
19
+ return false;
20
+ return timingSafeEqual(Buffer.from(expected, "hex"), Buffer.from(sigHex, "hex"));
21
+ }
10
22
  export async function handleWebhook(req) {
11
23
  if (req.method !== "POST") {
12
24
  return { status: 405, body: { error: "Method not allowed" } };
13
25
  }
26
+ if (webhookSecret) {
27
+ const signature = req.headers?.["x-signature"] ?? req.headers?.["X-Signature"];
28
+ if (!signature) {
29
+ return { status: 401, body: { error: "Missing X-Signature header" } };
30
+ }
31
+ const rawBody = typeof req.body === "string" ? req.body : JSON.stringify(req.body);
32
+ if (!verifySignature(rawBody, signature, webhookSecret)) {
33
+ return { status: 401, body: { error: "Invalid webhook signature" } };
34
+ }
35
+ }
14
36
  const payload = req.body;
15
37
  if (!payload?.eventType || !payload?.timestamp) {
16
38
  return { status: 400, body: { error: "Invalid webhook payload: missing eventType or timestamp" } };
17
39
  }
18
40
  for (const listener of listeners) {
19
- listener(payload);
41
+ try {
42
+ listener(payload);
43
+ }
44
+ catch {
45
+ // listener errors must not break webhook acknowledgement
46
+ }
20
47
  }
21
48
  return { status: 200, body: { received: true } };
22
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/gateway/webhook.ts"],"names":[],"mappings":"AAYA,MAAM,SAAS,GAAsB,EAAE,CAAC;AAExC,MAAM,UAAU,kBAAkB,CAAC,QAAyB;IAC1D,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAyB;IAC7D,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,GAAG,IAAI,CAAC;QAAE,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAgB;IAClD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,CAAC;IAChE,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,IAAkC,CAAC;IAEvD,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QAC/C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,yDAAyD,EAAE,EAAE,CAAC;IACrG,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/gateway/webhook.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAI/D,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAMnE,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,iBAAiB,EACtB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACpC,YAAY,GAAE,YAAkC,GAC/C,IAAI,CAKN;AAED,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAMnE,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,iBAAiB,EACtB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACpC,YAAY,GAAE,YAAkC,GAC/C,IAAI,CAGN;AAED,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
@@ -1,14 +1,10 @@
1
- import { registerModelRouting } from "./model-routing.js";
2
1
  import { registerPromptContext } from "./prompt-context.js";
3
- import { registerToolPolicy } from "./tool-policy.js";
4
2
  import { registerAuditHooks } from "./audit.js";
5
3
  const defaultAuditEmitter = (_type, _data) => {
6
4
  // in production, this would forward to Basilica's audit API
7
5
  };
8
6
  export function registerBasilicaHooks(api, config = {}, auditEmitter = defaultAuditEmitter) {
9
- registerModelRouting(api, config);
10
7
  registerPromptContext(api, config);
11
- registerToolPolicy(api, config);
12
8
  registerAuditHooks(api, auditEmitter);
13
9
  }
14
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAqB,MAAM,YAAY,CAAC;AAEnE,MAAM,mBAAmB,GAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;IACzD,4DAA4D;AAC9D,CAAC,CAAC;AAEF,MAAM,UAAU,qBAAqB,CACnC,GAAsB,EACtB,SAAkC,EAAE,EACpC,eAA6B,mBAAmB;IAEhD,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClC,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnC,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAChC,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAqB,MAAM,YAAY,CAAC;AAEnE,MAAM,mBAAmB,GAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;IACzD,4DAA4D;AAC9D,CAAC,CAAC;AAEF,MAAM,UAAU,qBAAqB,CACnC,GAAsB,EACtB,SAAkC,EAAE,EACpC,eAA6B,mBAAmB;IAEhD,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnC,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { OpenClawPluginApi } from "openclaw-plugin-types";
2
+ export declare function registerAuthTools(api: OpenClawPluginApi): void;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAe,MAAM,uBAAuB,CAAC;AA4C5E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAkK9D"}
@@ -0,0 +1,170 @@
1
+ import { BasilicaClient } from "@basilica/sdk";
2
+ import { resolveBasilicaClient, formatToolError } from "./context.js";
3
+ import { deviceLoginSchema, pollAuthSchema, createApiKeySchema, listApiKeysSchema, } from "./schemas.js";
4
+ // Auth0 constants (mirrors packages/auth/src/auth0-config.ts)
5
+ const AUTH0_DOMAIN = process.env.BASILICA_AUTH0_DOMAIN ?? "auth.basilica.ai";
6
+ const AUTH0_CLIENT_ID = process.env.BASILICA_AUTH0_CLIENT_ID ?? "KXOhOXiQiLdD3JUfHWesdlNqBlXBDQ0E";
7
+ const AUTH0_AUDIENCE = process.env.BASILICA_AUTH0_AUDIENCE ?? "https://api.basilica.ai/";
8
+ const AUTH0_SCOPES = [
9
+ "openid", "profile", "email", "offline_access",
10
+ "rentals:*", "nodes:list", "keys:create", "keys:list", "keys:revoke", "secure_cloud",
11
+ ].join(" ");
12
+ const AUTH0_TOKEN_URL = `https://${AUTH0_DOMAIN}/oauth/token`;
13
+ const AUTH0_DEVICE_CODE_URL = `https://${AUTH0_DOMAIN}/oauth/device/code`;
14
+ const POLL_TIMEOUT_MS = 60_000;
15
+ function sleep(ms) {
16
+ return new Promise((resolve) => setTimeout(resolve, ms));
17
+ }
18
+ function resolveClientWithTokenOverride(ctx, tokenParam) {
19
+ const explicitToken = typeof tokenParam === "string" && tokenParam.length > 0
20
+ ? tokenParam
21
+ : undefined;
22
+ if (explicitToken) {
23
+ const config = {
24
+ baseUrl: ctx.config.baseUrl ?? "https://api.basilica.ai",
25
+ token: explicitToken,
26
+ };
27
+ return new BasilicaClient(config);
28
+ }
29
+ return resolveBasilicaClient(ctx);
30
+ }
31
+ export function registerAuthTools(api) {
32
+ api.registerTool((_ctx) => ({
33
+ name: "basilica_device_login",
34
+ label: "Basilica Login",
35
+ description: "Start a Basilica device authorization flow to obtain a JWT token. Returns a URL and code for the user to authorize in their browser.",
36
+ parameters: deviceLoginSchema,
37
+ async execute(_toolCallId, _params) {
38
+ try {
39
+ const res = await fetch(AUTH0_DEVICE_CODE_URL, {
40
+ method: "POST",
41
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
42
+ body: new URLSearchParams({
43
+ client_id: AUTH0_CLIENT_ID,
44
+ scope: AUTH0_SCOPES,
45
+ audience: AUTH0_AUDIENCE,
46
+ }),
47
+ });
48
+ if (!res.ok) {
49
+ const text = await res.text();
50
+ return { content: `Device code request failed (${res.status}): ${text}`, metadata: { error: true } };
51
+ }
52
+ const body = await res.json();
53
+ return {
54
+ content: JSON.stringify({
55
+ verification_url: body.verification_uri_complete,
56
+ user_code: body.user_code,
57
+ device_code: body.device_code,
58
+ expires_in_seconds: body.expires_in,
59
+ poll_interval_seconds: body.interval,
60
+ instructions: `Visit ${body.verification_uri_complete} and authorize. Then call basilica_poll_auth with the device_code to retrieve your JWT.`,
61
+ }, null, 2),
62
+ };
63
+ }
64
+ catch (err) {
65
+ return formatToolError(err);
66
+ }
67
+ },
68
+ }));
69
+ api.registerTool((_ctx) => ({
70
+ name: "basilica_poll_auth",
71
+ label: "Poll Basilica Auth",
72
+ description: "Poll for completion of a Basilica device authorization flow. Pass the device_code from basilica_device_login. Returns JWT access_token and refresh_token on success.",
73
+ parameters: pollAuthSchema,
74
+ async execute(_toolCallId, params) {
75
+ const deviceCode = params.device_code;
76
+ const intervalSec = params.interval ?? 5;
77
+ const pollInterval = intervalSec * 1000;
78
+ const deadline = Date.now() + POLL_TIMEOUT_MS;
79
+ try {
80
+ while (Date.now() < deadline) {
81
+ const res = await fetch(AUTH0_TOKEN_URL, {
82
+ method: "POST",
83
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
84
+ body: new URLSearchParams({
85
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
86
+ device_code: deviceCode,
87
+ client_id: AUTH0_CLIENT_ID,
88
+ }),
89
+ });
90
+ if (res.ok) {
91
+ const tokens = await res.json();
92
+ return {
93
+ content: JSON.stringify({
94
+ status: "authorized",
95
+ access_token: tokens.access_token,
96
+ refresh_token: tokens.refresh_token ?? null,
97
+ token_type: tokens.token_type,
98
+ expires_in_seconds: tokens.expires_in,
99
+ }, null, 2),
100
+ };
101
+ }
102
+ const body = await res.json();
103
+ if (body.error === "authorization_pending") {
104
+ await sleep(pollInterval);
105
+ continue;
106
+ }
107
+ if (body.error === "slow_down") {
108
+ await sleep(pollInterval + 5000);
109
+ continue;
110
+ }
111
+ if (body.error === "expired_token") {
112
+ return { content: "Device code expired. Please call basilica_device_login again.", metadata: { error: true } };
113
+ }
114
+ if (body.error === "access_denied") {
115
+ return { content: "Authorization denied by user.", metadata: { error: true } };
116
+ }
117
+ return {
118
+ content: `Auth failed: ${body.error} - ${body.error_description ?? "unknown"}`,
119
+ metadata: { error: true },
120
+ };
121
+ }
122
+ return {
123
+ content: JSON.stringify({
124
+ status: "pending",
125
+ message: "User has not yet authorized. Call basilica_poll_auth again after the user completes authorization.",
126
+ device_code: deviceCode,
127
+ }, null, 2),
128
+ };
129
+ }
130
+ catch (err) {
131
+ return formatToolError(err);
132
+ }
133
+ },
134
+ }));
135
+ api.registerTool((ctx) => ({
136
+ name: "basilica_create_api_key",
137
+ label: "Create API Key",
138
+ description: "Create a new Basilica API key. Pass the JWT access_token from basilica_poll_auth, or omit to use stored credentials.",
139
+ parameters: createApiKeySchema,
140
+ async execute(_toolCallId, params) {
141
+ try {
142
+ const client = resolveClientWithTokenOverride(ctx, params.token);
143
+ const keyName = params.name;
144
+ const scopes = params.scopes;
145
+ const result = await client.apiKeys.create(keyName, scopes);
146
+ return { content: JSON.stringify(result, null, 2) };
147
+ }
148
+ catch (err) {
149
+ return formatToolError(err);
150
+ }
151
+ },
152
+ }));
153
+ api.registerTool((ctx) => ({
154
+ name: "basilica_list_api_keys",
155
+ label: "List API Keys",
156
+ description: "List existing Basilica API keys. Pass the JWT access_token from basilica_poll_auth, or omit to use stored credentials.",
157
+ parameters: listApiKeysSchema,
158
+ async execute(_toolCallId, params) {
159
+ try {
160
+ const client = resolveClientWithTokenOverride(ctx, params.token);
161
+ const result = await client.apiKeys.list();
162
+ return { content: JSON.stringify(result, null, 2) };
163
+ }
164
+ catch (err) {
165
+ return formatToolError(err);
166
+ }
167
+ },
168
+ }));
169
+ }
170
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { OpenClawPluginApi } from "openclaw-plugin-types";
2
+ export declare function registerBillingTools(api: OpenClawPluginApi): void;
3
+ //# sourceMappingURL=billing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/tools/billing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAI/D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAgCjE"}
@@ -0,0 +1,37 @@
1
+ import { resolveBasilicaClient, formatToolError } from "./context.js";
2
+ import { getBalanceSchema, usageHistorySchema } from "./schemas.js";
3
+ export function registerBillingTools(api) {
4
+ api.registerTool((ctx) => ({
5
+ name: "basilica_get_balance",
6
+ label: "Get Account Balance",
7
+ description: "Get the current account balance on the Basilica platform",
8
+ parameters: getBalanceSchema,
9
+ async execute(_toolCallId, _params) {
10
+ try {
11
+ const client = resolveBasilicaClient(ctx);
12
+ const result = await client.billing.getBalance();
13
+ return { content: JSON.stringify(result, null, 2) };
14
+ }
15
+ catch (err) {
16
+ return formatToolError(err);
17
+ }
18
+ },
19
+ }));
20
+ api.registerTool((ctx) => ({
21
+ name: "basilica_usage_history",
22
+ label: "Usage History",
23
+ description: "Get billing usage history from the Basilica platform",
24
+ parameters: usageHistorySchema,
25
+ async execute(_toolCallId, params) {
26
+ try {
27
+ const client = resolveBasilicaClient(ctx);
28
+ const result = await client.billing.getUsageHistory(params.limit);
29
+ return { content: JSON.stringify(result, null, 2) };
30
+ }
31
+ catch (err) {
32
+ return formatToolError(err);
33
+ }
34
+ },
35
+ }));
36
+ }
37
+ //# sourceMappingURL=billing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/tools/billing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,UAAU,oBAAoB,CAAC,GAAsB;IACzD,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzB,IAAI,EAAE,sBAAsB;QAC5B,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,0DAA0D;QACvE,UAAU,EAAE,gBAAgB;QAC5B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO;YAChC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;gBACjD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACtD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;KACF,CAAC,CAAC,CAAC;IAEJ,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzB,IAAI,EAAE,wBAAwB;QAC9B,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,sDAAsD;QACnE,UAAU,EAAE,kBAAkB;QAC9B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM;YAC/B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,KAA2B,CAAC,CAAC;gBACxF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACtD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;KACF,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -1,6 +1,11 @@
1
- import { BasilicaClient } from "@basilica/openclaw-sdk";
1
+ import { BasilicaClient } from "@basilica/sdk";
2
2
  import type { ToolContext } from "openclaw-plugin-types";
3
3
  export declare function resolveBasilicaClient(ctx: ToolContext): BasilicaClient;
4
- export declare function resolveProjectId(ctx: ToolContext, params: Record<string, unknown>): string | undefined;
5
4
  export declare function formatError(err: unknown): string;
5
+ export declare function formatToolError(err: unknown): {
6
+ content: string;
7
+ metadata: {
8
+ error: true;
9
+ };
10
+ };
6
11
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,MAAM,wBAAwB,CAAC;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAmBtE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAEtG;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQhD"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,MAAM,eAAe,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAgBtE;AAkBD,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQhD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE;QAAE,KAAK,EAAE,IAAI,CAAA;KAAE,CAAA;CAAE,CAE5F"}
@@ -1,20 +1,26 @@
1
- import { BasilicaClient, BasilicaError } from "@basilica/openclaw-sdk";
1
+ import { BasilicaClient, BasilicaError } from "@basilica/sdk";
2
2
  export function resolveBasilicaClient(ctx) {
3
3
  if (!ctx.credential) {
4
- throw new BasilicaError("Basilica authentication required. Run: openclaw models auth login --provider basilica", "AUTH_MISSING");
4
+ throw new BasilicaError("Basilica authentication required. Set BASILICA_API_KEY or run auth login.", "MISSING_AUTHENTICATION");
5
5
  }
6
- const credential = ctx.credential;
6
+ const token = resolveToken(ctx.credential);
7
7
  const config = {
8
- baseUrl: ctx.config.baseUrl ?? "https://api.basilica.cloud",
9
- credential,
10
- org: ctx.orgId
11
- ? { orgId: ctx.orgId, projectId: ctx.projectId }
12
- : undefined,
8
+ baseUrl: ctx.config.baseUrl ?? "https://api.basilica.ai",
9
+ token,
13
10
  };
14
11
  return new BasilicaClient(config);
15
12
  }
16
- export function resolveProjectId(ctx, params) {
17
- return params.projectId ?? ctx.projectId ?? ctx.config.defaultProject;
13
+ function resolveToken(credential) {
14
+ if (typeof credential.access === "string" && credential.access.length > 0) {
15
+ return credential.access;
16
+ }
17
+ if (typeof credential.token === "string" && credential.token.length > 0) {
18
+ return credential.token;
19
+ }
20
+ if (typeof credential.api_key === "string" && credential.api_key.length > 0) {
21
+ return credential.api_key;
22
+ }
23
+ throw new BasilicaError("Credential does not contain a valid token, access, or api_key", "MISSING_AUTHENTICATION");
18
24
  }
19
25
  export function formatError(err) {
20
26
  if (err instanceof BasilicaError) {
@@ -25,4 +31,7 @@ export function formatError(err) {
25
31
  }
26
32
  return "An unknown error occurred";
27
33
  }
34
+ export function formatToolError(err) {
35
+ return { content: formatError(err), metadata: { error: true } };
36
+ }
28
37
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAIvE,MAAM,UAAU,qBAAqB,CAAC,GAAgB;IACpD,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,IAAI,aAAa,CACrB,uFAAuF,EACvF,cAAc,CACf,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,UAA2C,CAAC;IAEnE,MAAM,MAAM,GAAyB;QACnC,OAAO,EAAG,GAAG,CAAC,MAAM,CAAC,OAAkB,IAAI,4BAA4B;QACvE,UAAU;QACV,GAAG,EAAE,GAAG,CAAC,KAAK;YACZ,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE;YAChD,CAAC,CAAC,SAAS;KACd,CAAC;IAEF,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAgB,EAAE,MAA+B;IAChF,OAAQ,MAAM,CAAC,SAAoB,IAAI,GAAG,CAAC,SAAS,IAAK,GAAG,CAAC,MAAM,CAAC,cAAyB,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;QACjC,OAAO,mBAAmB,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,2BAA2B,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI9D,MAAM,UAAU,qBAAqB,CAAC,GAAgB;IACpD,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,IAAI,aAAa,CACrB,2EAA2E,EAC3E,wBAAwB,CACzB,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAyB;QACnC,OAAO,EAAG,GAAG,CAAC,MAAM,CAAC,OAAkB,IAAI,yBAAyB;QACpE,KAAK;KACN,CAAC;IAEF,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,YAAY,CAAC,UAAmC;IACvD,IAAI,OAAO,UAAU,CAAC,MAAM,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1E,OAAO,UAAU,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC1B,CAAC;IACD,IAAI,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5E,OAAO,UAAU,CAAC,OAAO,CAAC;IAC5B,CAAC;IACD,MAAM,IAAI,aAAa,CACrB,+DAA+D,EAC/D,wBAAwB,CACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;QACjC,OAAO,mBAAmB,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,2BAA2B,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;AAClE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"deployments.d.ts","sourceRoot":"","sources":["../../src/tools/deployments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAI/D,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAqDpE"}
1
+ {"version":3,"file":"deployments.d.ts","sourceRoot":"","sources":["../../src/tools/deployments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAa/D,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAoIpE"}