@cloud-cli/on 1.62.1 → 1.63.1

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.
@@ -1,4 +1,4 @@
1
- export declare const API_KEY_SCOPES: readonly ["workflows:read", "workflows:write", "logs:read", "artifacts:read", "runs:control", "runs:dispatch", "workers:read"];
1
+ export declare const API_KEY_SCOPES: readonly ["workflows:read", "workflows:write", "logs:read", "artifacts:read", "runs:control", "runs:dispatch", "workers:read", "secrets:read", "secrets:write"];
2
2
  export type ApiKeyScope = (typeof API_KEY_SCOPES)[number];
3
3
  export declare class ApiKeyRepository {
4
4
  init(): Promise<void>;
@@ -6,7 +6,7 @@ export declare class ApiKeyRepository {
6
6
  issue(name: string, scopes: string[]): Promise<{
7
7
  id: `${string}-${string}-${string}-${string}-${string}`;
8
8
  name: string;
9
- scopes: ("workflows:read" | "workflows:write" | "logs:read" | "artifacts:read" | "runs:control" | "runs:dispatch" | "workers:read")[];
9
+ scopes: ("workflows:read" | "workflows:write" | "logs:read" | "artifacts:read" | "runs:control" | "runs:dispatch" | "workers:read" | "secrets:read" | "secrets:write")[];
10
10
  token: string;
11
11
  }>;
12
12
  scopesForToken(token: string): Promise<string[] | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"api-key-repository.d.ts","sourceRoot":"","sources":["../src/api-key-repository.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc,gIAAiI,CAAC;AAC7J,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,qBAAa,gBAAgB;IACrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAYrB,IAAI;IAKJ,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;;;;;;IAUpC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAQvD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAI3C"}
1
+ {"version":3,"file":"api-key-repository.d.ts","sourceRoot":"","sources":["../src/api-key-repository.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc,iKAAkK,CAAC;AAC9L,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,qBAAa,gBAAgB;IACrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAYrB,IAAI;IAKJ,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;;;;;;IAUpC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAQvD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAI3C"}
package/dist/config.d.ts CHANGED
@@ -5,5 +5,6 @@ export declare function printHelp(): void;
5
5
  export declare function loadFromArgs(): Promise<{
6
6
  config: RunnerConfig | null;
7
7
  command: string;
8
+ subject?: string;
8
9
  }>;
9
10
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGjE,wBAAsB,UAAU,CAAC,MAAM,KAAA,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAuBrE;AAED,wBAAgB,aAAa,CAAC,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,GAAG,YAAY,CAqC7G;AAED,wBAAgB,SAAS,SAuBxB;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAuB9F"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGjE,wBAAsB,UAAU,CAAC,MAAM,KAAA,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAuBrE;AAED,wBAAgB,aAAa,CAAC,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,GAAG,YAAY,CAqC7G;AAED,wBAAgB,SAAS,SAwBxB;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyBhH"}
@@ -0,0 +1,2 @@
1
+ import { t as e } from "./oidc-user-repository-CiprwzOj.js";
2
+ export { e as OidcUserRepository };
@@ -0,0 +1,24 @@
1
+ import { t as e } from "./db-client-BvMkK1lx.js";
2
+ //#region src/oidc-user-repository.ts
3
+ var t = class {
4
+ async init() {
5
+ await e.exec("CREATE TABLE IF NOT EXISTS oidc_users (\n subject TEXT PRIMARY KEY, email TEXT, name TEXT, photo TEXT,\n role TEXT NOT NULL DEFAULT 'user',\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\n )");
6
+ }
7
+ async upsert(t) {
8
+ await e.run("INSERT INTO oidc_users (subject, email, name, photo) VALUES (?, ?, ?, ?)\n ON CONFLICT(subject) DO UPDATE SET email = excluded.email, name = excluded.name, photo = excluded.photo, updated_at = CURRENT_TIMESTAMP", [
9
+ t.id,
10
+ t.email || null,
11
+ t.name || null,
12
+ t.photo || null
13
+ ]);
14
+ }
15
+ async role(t) {
16
+ return (await e.get("SELECT role FROM oidc_users WHERE subject = ?", [t]))?.role === "admin" ? "admin" : "user";
17
+ }
18
+ async promote(t) {
19
+ let n = await e.run("UPDATE oidc_users SET role = 'admin', updated_at = CURRENT_TIMESTAMP WHERE subject = ?", [t]);
20
+ return Number(n?.changes || 0) > 0;
21
+ }
22
+ };
23
+ //#endregion
24
+ export { t };
@@ -0,0 +1,9 @@
1
+ import type { OidcUser } from './oidc.js';
2
+ export type OidcRole = 'user' | 'admin';
3
+ export declare class OidcUserRepository {
4
+ init(): Promise<void>;
5
+ upsert(user: OidcUser): Promise<void>;
6
+ role(subject: string): Promise<OidcRole>;
7
+ promote(subject: string): Promise<boolean>;
8
+ }
9
+ //# sourceMappingURL=oidc-user-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc-user-repository.d.ts","sourceRoot":"","sources":["../src/oidc-user-repository.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAExC,qBAAa,kBAAkB;IACvB,IAAI;IASJ,MAAM,CAAC,IAAI,EAAE,QAAQ;IAMrB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAKxC,OAAO,CAAC,OAAO,EAAE,MAAM;CAI9B"}
package/dist/oidc.d.ts CHANGED
@@ -24,6 +24,8 @@ export declare class OidcClient {
24
24
  cookie: string;
25
25
  }>;
26
26
  userFromCookie(cookieHeader: string | undefined): OidcUser | undefined;
27
+ setRole(cookieHeader: string, role: 'user' | 'admin'): void;
28
+ roleFromCookie(cookieHeader: string | undefined): "user" | "admin" | undefined;
27
29
  accessTokenFromCookie(cookieHeader: string | undefined): {
28
30
  accessToken: string;
29
31
  expiresAt: number;
@@ -1 +1 @@
1
- {"version":3,"file":"oidc.d.ts","sourceRoot":"","sources":["../src/oidc.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAmBD,qBAAa,UAAU;IACrB,OAAO,CAAC,qBAAqB,CAAC,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;gBAE3C,MAAM,EAAE,UAAU;IAI9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IAEpC,IAAI,OAAO,YAEV;IAED,IAAI,QAAQ,WAEX;IAEK,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYhE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAgCpH,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS;IAKtE,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS;;;;IAMhD,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAUvD,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,EAAE,WAAW,CAAC,EAAE,MAAM;IAUlH,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS;IAM5C,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,WAAW;YAOL,cAAc;IAa5B,OAAO,CAAC,KAAK;CAKd"}
1
+ {"version":3,"file":"oidc.d.ts","sourceRoot":"","sources":["../src/oidc.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAoBD,qBAAa,UAAU;IACrB,OAAO,CAAC,qBAAqB,CAAC,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;gBAE3C,MAAM,EAAE,UAAU;IAI9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IAEpC,IAAI,OAAO,YAEV;IAED,IAAI,QAAQ,WAEX;IAEK,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYhE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAgCpH,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS;IAKtE,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAMpD,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS;IAI/C,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS;;;;IAMhD,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAUvD,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,EAAE,WAAW,CAAC,EAAE,MAAM;IAUlH,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS;IAM5C,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,WAAW;YAOL,cAAc;IAa5B,OAAO,CAAC,KAAK;CAKd"}
package/dist/on.js CHANGED
@@ -41,7 +41,7 @@ function u(e, t) {
41
41
  };
42
42
  }
43
43
  function d() {
44
- console.log("\nšŸƒ Runner CLI šŸƒ\n\nUsage:\n npx -y @cloud-cli/on <command> [options]\n pnpm dlx -y @cloud-cli/on <command> [options]\n\nCommands:\n start-server Runs Webhook Ingress Server only (API Gateway mode)\n start-scheduler Runs cron and solar workflow triggers\n start-workers Runs event-driven workers (Scalable Worker mode)\n\nOptions:\n -c, --config Path to runner.config.mjs (default: ./runner.config.mjs, env: RUNNER_CONFIG_PATH)\n -d, --database Node.js database module URL (env: DATABASE_URL)\n -p, --port Port for Webhook Ingress Server (default: 11235, env: PORT)\n -k, --workers Maximum concurrent jobs (default: 5, env: RUNNER_WORKERS)\n Worker tags (comma-separated env: RUNNER_TAGS)\n Webhook server URL (env: RUNNER_SERVER_URL)\n OIDC settings (env: RUNNER_OIDC_PROVIDER_URL, RUNNER_OIDC_CLIENT_ID, RUNNER_OIDC_CLIENT_SECRET)\n -h, --help Show this help message\n ");
44
+ console.log("\nšŸƒ Runner CLI šŸƒ\n\nUsage:\n npx -y @cloud-cli/on <command> [options]\n pnpm dlx -y @cloud-cli/on <command> [options]\n\nCommands:\n start-server Runs Webhook Ingress Server only (API Gateway mode)\n start-scheduler Runs cron and solar workflow triggers\n start-workers Runs event-driven workers (Scalable Worker mode)\n promote-admin Promote an existing OIDC user (requires --subject)\n\nOptions:\n -c, --config Path to runner.config.mjs (default: ./runner.config.mjs, env: RUNNER_CONFIG_PATH)\n -d, --database Node.js database module URL (env: DATABASE_URL)\n -p, --port Port for Webhook Ingress Server (default: 11235, env: PORT)\n -k, --workers Maximum concurrent jobs (default: 5, env: RUNNER_WORKERS)\n Worker tags (comma-separated env: RUNNER_TAGS)\n Webhook server URL (env: RUNNER_SERVER_URL)\n OIDC settings (env: RUNNER_OIDC_PROVIDER_URL, RUNNER_OIDC_CLIENT_ID, RUNNER_OIDC_CLIENT_SECRET)\n -h, --help Show this help message\n ");
45
45
  }
46
46
  async function f() {
47
47
  let { values: e, positionals: t } = c({
@@ -64,6 +64,7 @@ async function f() {
64
64
  type: "string",
65
65
  short: "k"
66
66
  },
67
+ subject: { type: "string" },
67
68
  help: {
68
69
  type: "boolean",
69
70
  short: "h"
@@ -72,7 +73,8 @@ async function f() {
72
73
  });
73
74
  return e.help && (d(), process.exit(0)), {
74
75
  config: await l(e),
75
- command: t[0] || "start"
76
+ command: t[0] || "start",
77
+ subject: e.subject
76
78
  };
77
79
  }
78
80
  //#endregion
@@ -94,37 +96,46 @@ function p() {
94
96
  //#region src/index.ts
95
97
  async function m() {
96
98
  p();
97
- let { config: e, command: t } = await f();
99
+ let { config: e, command: t, subject: n } = await f();
98
100
  if (!e) {
99
101
  process.exitCode = 1;
100
102
  return;
101
103
  }
102
- let [{ QueueManager: n }, { SecretStore: r }, { WebhookServer: i }, { startWorkers: a }, { WorkflowRepository: o }, { WorkflowScheduler: s }] = await Promise.all([
104
+ let [{ QueueManager: r }, { SecretStore: i }, { WebhookServer: a }, { startWorkers: o }, { WorkflowRepository: s }, { WorkflowScheduler: c }, { OidcUserRepository: l }] = await Promise.all([
103
105
  import("./queue-DhXXzxm3.js"),
104
106
  import("./secrets-DhkqmawU.js"),
105
- import("./server-Bsv8pJk2.js"),
107
+ import("./server-DwdQsiqw.js"),
106
108
  import("./worker-BwNyfSpp.js"),
107
109
  import("./workflows-DQQIVH7c.js"),
108
- import("./scheduler-2d1UPcxM.js")
109
- ]), c = new r(), l = new n(process.env.WORKER_NAME || "cli");
110
+ import("./scheduler-2d1UPcxM.js"),
111
+ import("./oidc-user-repository-BNQF3qnb.js")
112
+ ]);
113
+ if (t === "promote-admin") {
114
+ if (!n) throw Error("Usage: on promote-admin --subject <oidc-subject>");
115
+ let e = new l();
116
+ if (await e.init(), !await e.promote(n)) throw Error(`OIDC user not found: ${n}`);
117
+ console.log(`Promoted OIDC user ${n} to admin.`);
118
+ return;
119
+ }
120
+ let u = new i(), m = new r(process.env.WORKER_NAME || "cli");
110
121
  switch (t) {
111
122
  case "start-server":
112
- console.log("🌐 Starting Ingress Gateway..."), await l.init(), await i.withPort({
123
+ console.log("🌐 Starting Ingress Gateway..."), await m.init(), await a.withPort({
113
124
  config: e,
114
- queue: l,
115
- secrets: c,
125
+ queue: m,
126
+ secrets: u,
116
127
  adminToken: e.adminToken,
117
128
  port: e.port
118
129
  });
119
130
  break;
120
131
  case "start-workers":
121
- console.log(`āš™ļø Starting worker scheduler with ${e.workers} concurrent slot(s)...`), await l.init(), a(e.workers, l, c, e);
132
+ console.log(`āš™ļø Starting worker scheduler with ${e.workers} concurrent slot(s)...`), await m.init(), o(e.workers, m, u, e);
122
133
  break;
123
134
  case "start-scheduler": {
124
- console.log("Starting workflow scheduler..."), await l.init();
125
- let t = new o();
135
+ console.log("Starting workflow scheduler..."), await m.init();
136
+ let t = new s();
126
137
  await t.init();
127
- let n = new s(l, t, e);
138
+ let n = new c(m, t, e);
128
139
  n.start();
129
140
  let r = () => {
130
141
  n.stop(), process.exit(0);