helloruntime 0.0.6 → 0.0.8

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.
@@ -0,0 +1,5 @@
1
+ /** Resolve the target app slug: explicit flag, else package.json name, else cwd basename. */
2
+ export declare function resolveAppSlug(explicit?: string): Promise<string>;
3
+ /** --payload accepts inline JSON, @file.json, or a bare string. */
4
+ export declare function loadPayload(raw?: string): Promise<unknown>;
5
+ //# sourceMappingURL=app-args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-args.d.ts","sourceRoot":"","sources":["../../src/cli/app-args.ts"],"names":[],"mappings":"AAGA,6FAA6F;AAC7F,wBAAsB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMvE;AAED,mEAAmE;AACnE,wBAAsB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQhE"}
@@ -0,0 +1,24 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { basename } from "node:path";
3
+ /** Resolve the target app slug: explicit flag, else package.json name, else cwd basename. */
4
+ export async function resolveAppSlug(explicit) {
5
+ if (explicit)
6
+ return explicit;
7
+ const pkg = await readFile("package.json", "utf8")
8
+ .then((raw) => JSON.parse(raw))
9
+ .catch(() => ({}));
10
+ return pkg.name ?? basename(process.cwd());
11
+ }
12
+ /** --payload accepts inline JSON, @file.json, or a bare string. */
13
+ export async function loadPayload(raw) {
14
+ if (raw == null)
15
+ return undefined;
16
+ const text = raw.startsWith("@") ? await readFile(raw.slice(1), "utf8") : raw;
17
+ try {
18
+ return JSON.parse(text);
19
+ }
20
+ catch {
21
+ return text;
22
+ }
23
+ }
24
+ //# sourceMappingURL=app-args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-args.js","sourceRoot":"","sources":["../../src/cli/app-args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,6FAA6F;AAC7F,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAiB;IACpD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;SAC/C,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;SACnD,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAsB,CAAC,CAAC;IAC1C,OAAO,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAY;IAC5C,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9E,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -13,5 +13,7 @@ export type CliConfig = z.infer<typeof configSchema>;
13
13
  export declare function configPath(): string;
14
14
  export declare function readConfig(): Promise<CliConfig>;
15
15
  export declare function writeConfig(config: CliConfig): Promise<void>;
16
+ /** Remove stored credentials. Returns false if there was nothing to clear. */
17
+ export declare function clearConfig(): Promise<boolean>;
16
18
  export {};
17
19
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,YAAY;;;;;;;;;EAGhB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAErD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAIrD;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,YAAY;;;;;;;;;EAGhB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAErD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAIrD;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlE;AAED,8EAA8E;AAC9E,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAQpD"}
@@ -1,4 +1,4 @@
1
- import { mkdir, readFile, writeFile } from "node:fs/promises";
1
+ import { mkdir, readFile, unlink, writeFile } from "node:fs/promises";
2
2
  import { homedir } from "node:os";
3
3
  import { join } from "node:path";
4
4
  import { z } from "zod";
@@ -19,4 +19,16 @@ export async function writeConfig(config) {
19
19
  await mkdir(join(homedir(), ".helloruntime"), { recursive: true, mode: 0o700 });
20
20
  await writeFile(configPath(), `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 });
21
21
  }
22
+ /** Remove stored credentials. Returns false if there was nothing to clear. */
23
+ export async function clearConfig() {
24
+ try {
25
+ await unlink(configPath());
26
+ return true;
27
+ }
28
+ catch (error) {
29
+ if (error.code === "ENOENT")
30
+ return false;
31
+ throw error;
32
+ }
33
+ }
22
34
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAIH,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACnE,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAC5E,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAiB;IACjD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,MAAM,SAAS,CAAC,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACzF,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAIH,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACnE,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAC5E,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAiB;IACjD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,MAAM,SAAS,CAAC,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA2B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACjE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
package/dist/cli/index.js CHANGED
@@ -3,14 +3,17 @@ import { Command } from "commander";
3
3
  import { deployCommand } from "./deploy.js";
4
4
  import { destroyCommand } from "./destroy.js";
5
5
  import { loginCommand } from "./login.js";
6
- import { cronList, cronTrigger, jobsList, jobsTrigger } from "./triggers.js";
6
+ import { logoutCommand } from "./logout.js";
7
+ import { taskList, taskRun } from "./tasks.js";
8
+ import { jobsList, jobsTrigger } from "./triggers.js";
7
9
  const program = new Command();
8
- program.name("helloruntime").description("Deploy server-rendered JS/TS apps to Helloruntime").version("0.0.5");
10
+ program.name("helloruntime").description("Deploy server-rendered JS/TS apps to Helloruntime").version("0.0.7");
9
11
  program
10
12
  .command("login")
11
13
  .description("Authenticate via the browser (device flow)")
12
14
  .option("--api-url <url>", "Helloruntime API URL", process.env.HELLORUNTIME_API_URL ?? "http://localhost:3000")
13
15
  .action(loginCommand);
16
+ program.command("logout").description("Remove stored credentials").action(logoutCommand);
14
17
  program
15
18
  .command("deploy")
16
19
  .description("Build + deploy the app in the current directory")
@@ -36,18 +39,19 @@ jobs
36
39
  .option("--status <status>", "Filter by status (pending|leased|succeeded|dead)")
37
40
  .option("--app <name>", "App name")
38
41
  .action(jobsList);
39
- // ─── Cron ─────────────────────────────────────────────────────────────────────
40
- const cron = program.command("cron").description("Inspect and trigger cron schedules");
41
- cron
42
- .command("trigger <name>")
43
- .description("Fire a cron out-of-schedule")
44
- .option("--app <name>", "App name")
45
- .action(cronTrigger);
46
- cron
42
+ // ─── Tasks (Nitro tasks: scheduledTasks + tasks/) ─────────────────────────────
43
+ const task = program.command("task").description("Inspect and run the app's tasks");
44
+ task
47
45
  .command("list")
48
- .description("List registered crons")
46
+ .description("List the app's tasks (scheduled ones show their cron + next run)")
49
47
  .option("--app <name>", "App name")
50
- .action(cronList);
48
+ .action(taskList);
49
+ task
50
+ .command("run <name>")
51
+ .description("Run a task once now (enqueued + dispatched; returns a job id)")
52
+ .option("--payload <json>", "JSON payload, @file.json, or a bare string")
53
+ .option("--app <name>", "App name (defaults to package.json name / dir)")
54
+ .action(taskRun);
51
55
  const notYet = (command) => () => {
52
56
  console.error(`helloruntime ${command}: not implemented yet`);
53
57
  process.exitCode = 1;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function logoutCommand(): Promise<void>;
2
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/cli/logout.ts"],"names":[],"mappings":"AAEA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAGnD"}
@@ -0,0 +1,6 @@
1
+ import { clearConfig, configPath } from "./config.js";
2
+ export async function logoutCommand() {
3
+ const cleared = await clearConfig();
4
+ console.log(cleared ? `Logged out (removed ${configPath()})` : "Not logged in.");
5
+ }
6
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/cli/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;AACnF,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function taskList(options: {
2
+ app?: string;
3
+ }): Promise<void>;
4
+ export declare function taskRun(name: string, options: {
5
+ payload?: string;
6
+ app?: string;
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/cli/tasks.ts"],"names":[],"mappings":"AAeA,wBAAsB,QAAQ,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBvE;AAKD,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAUtG"}
@@ -0,0 +1,32 @@
1
+ import { resolveAppSlug, loadPayload } from "./app-args.js";
2
+ import { readConfig } from "./config.js";
3
+ import { helloruntimeRequest } from "./http.js";
4
+ // `helloruntime task list` — every task the app defines (mirrors `nitro task list`),
5
+ // scheduled ones annotated with their cron expression + next run.
6
+ export async function taskList(options) {
7
+ const config = await readConfig();
8
+ const slug = await resolveAppSlug(options.app);
9
+ const { tasks } = await helloruntimeRequest(config, `/v1/apps/${encodeURIComponent(slug)}/tasks`);
10
+ if (!tasks.length) {
11
+ console.log("No tasks. (Define them in tasks/ and redeploy.)");
12
+ return;
13
+ }
14
+ for (const t of tasks) {
15
+ const sched = t.schedule
16
+ ? `${t.schedule}${t.nextRunAt ? ` next=${t.nextRunAt}` : ""}`
17
+ : "(on-demand)";
18
+ const desc = t.description ? ` — ${t.description}` : "";
19
+ console.log(`${t.name.padEnd(24)} ${sched}${desc}`);
20
+ }
21
+ }
22
+ // `helloruntime task run <name> --payload <json>` — run a task once now. Async: the
23
+ // platform enqueues + dispatches it to the (remote, scale-to-zero) app, so we return the
24
+ // jobId rather than the task result. Track it with `helloruntime jobs list`.
25
+ export async function taskRun(name, options) {
26
+ const config = await readConfig();
27
+ const slug = await resolveAppSlug(options.app);
28
+ const payload = await loadPayload(options.payload);
29
+ const res = await helloruntimeRequest(config, `/v1/apps/${encodeURIComponent(slug)}/tasks/${encodeURIComponent(name)}/run`, { method: "POST", body: JSON.stringify({ payload }) });
30
+ console.log(`Ran task "${name}" → ${res.jobId}`);
31
+ }
32
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/cli/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAWhD,qFAAqF;AACrF,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAyB;IACtD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,mBAAmB,CACzC,MAAM,EACN,YAAY,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAC7C,CAAC;IACF,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ;YACtB,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7D,CAAC,CAAC,aAAa,CAAC;QAClB,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,yFAAyF;AACzF,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,OAA2C;IACrF,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,mBAAmB,CACnC,MAAM,EACN,YAAY,kBAAkB,CAAC,IAAI,CAAC,UAAU,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAC5E,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CACtD,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;AACnD,CAAC"}
@@ -2,14 +2,8 @@ export declare function jobsTrigger(name: string, options: {
2
2
  payload?: string;
3
3
  app?: string;
4
4
  }): Promise<void>;
5
- export declare function cronTrigger(name: string, options: {
6
- app?: string;
7
- }): Promise<void>;
8
5
  export declare function jobsList(options: {
9
6
  status?: string;
10
7
  app?: string;
11
8
  }): Promise<void>;
12
- export declare function cronList(options: {
13
- app?: string;
14
- }): Promise<void>;
15
9
  //# sourceMappingURL=triggers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../src/cli/triggers.ts"],"names":[],"mappings":"AAyBA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAS1G;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CASxF;AAYD,wBAAsB,QAAQ,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBxF;AAUD,wBAAsB,QAAQ,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAYvE"}
1
+ {"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../src/cli/triggers.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAS1G;AAYD,wBAAsB,QAAQ,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBxF"}
@@ -1,27 +1,6 @@
1
- import { readFile } from "node:fs/promises";
2
- import { basename } from "node:path";
1
+ import { resolveAppSlug, loadPayload } from "./app-args.js";
3
2
  import { readConfig } from "./config.js";
4
3
  import { helloruntimeRequest } from "./http.js";
5
- async function resolveAppSlug(explicit) {
6
- if (explicit)
7
- return explicit;
8
- const pkg = await readFile("package.json", "utf8")
9
- .then((raw) => JSON.parse(raw))
10
- .catch(() => ({}));
11
- return pkg.name ?? basename(process.cwd());
12
- }
13
- // --payload accepts inline JSON, @file.json, or a bare string.
14
- async function loadPayload(raw) {
15
- if (raw == null)
16
- return undefined;
17
- const text = raw.startsWith("@") ? await readFile(raw.slice(1), "utf8") : raw;
18
- try {
19
- return JSON.parse(text);
20
- }
21
- catch {
22
- return text;
23
- }
24
- }
25
4
  export async function jobsTrigger(name, options) {
26
5
  const config = await readConfig();
27
6
  const slug = await resolveAppSlug(options.app);
@@ -32,12 +11,6 @@ export async function jobsTrigger(name, options) {
32
11
  });
33
12
  console.log(`Enqueued job "${name}" → ${res.jobId}`);
34
13
  }
35
- export async function cronTrigger(name, options) {
36
- const config = await readConfig();
37
- const slug = await resolveAppSlug(options.app);
38
- const res = await helloruntimeRequest(config, `/v1/apps/${encodeURIComponent(slug)}/crons/${encodeURIComponent(name)}/trigger`, { method: "POST", body: "{}" });
39
- console.log(`Triggered cron "${name}" → ${res.jobId}`);
40
- }
41
14
  export async function jobsList(options) {
42
15
  const config = await readConfig();
43
16
  const slug = await resolveAppSlug(options.app);
@@ -52,17 +25,4 @@ export async function jobsList(options) {
52
25
  console.log(`${j.status.padEnd(10)} ${j.kind.padEnd(5)} ${j.name.padEnd(20)} attempt=${j.attempt} ${j.id}${err}`);
53
26
  }
54
27
  }
55
- export async function cronList(options) {
56
- const config = await readConfig();
57
- const slug = await resolveAppSlug(options.app);
58
- const { crons } = await helloruntimeRequest(config, `/v1/apps/${encodeURIComponent(slug)}/crons`);
59
- if (!crons.length) {
60
- console.log("No crons registered.");
61
- return;
62
- }
63
- for (const c of crons) {
64
- const next = c.nextRunAt ? `next=${c.nextRunAt}` : "next=—";
65
- console.log(`${c.name.padEnd(20)} ${c.schedule.padEnd(16)} ${c.enabled ? "enabled " : "disabled"} ${next}`);
66
- }
67
- }
68
28
  //# sourceMappingURL=triggers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../src/cli/triggers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../src/cli/triggers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,OAA2C;IACzF,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAoB,MAAM,EAAE,YAAY,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE;QAC5G,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;KACxC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;AACvD,CAAC;AAYD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAA0C;IACvE,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,mBAAmB,CACxC,MAAM,EACN,YAAY,kBAAkB,CAAC,IAAI,CAAC,QAAQ,KAAK,EAAE,CACpD,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IACpH,CAAC;AACH,CAAC"}
package/dist/sdk/db.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { type NodePgDatabase } from "drizzle-orm/node-postgres";
2
- export declare function getDb(): NodePgDatabase;
1
+ import { type PostgresJsDatabase } from "drizzle-orm/postgres-js";
2
+ export declare function getDb(): PostgresJsDatabase;
3
3
  /** Lazily-initialized Drizzle handle. Use with your own schema: `db.select().from(table)`. */
4
- export declare const db: NodePgDatabase;
4
+ export declare const db: PostgresJsDatabase;
5
5
  /**
6
6
  * Create a Drizzle database bound to your schema, over the injected pooled
7
7
  * DATABASE_URL. The recommended entry point:
@@ -10,5 +10,5 @@ export declare const db: NodePgDatabase;
10
10
  * import * as schema from "./schema";
11
11
  * export const db = createDatabase(schema);
12
12
  */
13
- export declare function createDatabase<TSchema extends Record<string, unknown>>(schema: TSchema): NodePgDatabase<TSchema>;
13
+ export declare function createDatabase<TSchema extends Record<string, unknown>>(schema: TSchema): PostgresJsDatabase<TSchema>;
14
14
  //# sourceMappingURL=db.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/sdk/db.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AASzE,wBAAgB,KAAK,IAAI,cAAc,CAYtC;AAED,8FAA8F;AAC9F,eAAO,MAAM,EAAE,EAAE,cAIf,CAAC;AAEH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,MAAM,EAAE,OAAO,GACd,cAAc,CAAC,OAAO,CAAC,CAQzB"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/sdk/db.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAqB3E,wBAAgB,KAAK,IAAI,kBAAkB,CAK1C;AAED,8FAA8F;AAC9F,eAAO,MAAM,EAAE,EAAE,kBAIf,CAAC;AAEH;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,MAAM,EAAE,OAAO,GACd,kBAAkB,CAAC,OAAO,CAAC,CAG7B"}
package/dist/sdk/db.js CHANGED
@@ -1,21 +1,26 @@
1
1
  import { DEFAULT_DB_POOL_MAX, HELLORUNTIME_ENV } from "@helloruntime/protocol";
2
- import { drizzle } from "drizzle-orm/node-postgres";
3
- import pg from "pg";
4
- // Drizzle over node-postgres on the injected POOLED endpoint. Small pool (the app
5
- // runs at maxScale=1 with bounded concurrency). Do NOT use `.prepare()` the
6
- // pooled endpoint runs in transaction mode where persistent prepared statements
7
- // are unreliable.
2
+ import { drizzle } from "drizzle-orm/postgres-js";
3
+ import postgres from "postgres";
4
+ // Drizzle over postgres-js on the injected POOLED endpoint. Small pool (the app runs at
5
+ // maxScale=1 with bounded concurrency). prepare:false because the pooled endpoint runs in
6
+ // transaction mode (PgBouncer), where persistent prepared statements are unreliable.
8
7
  let instance = null;
9
- export function getDb() {
10
- if (instance)
11
- return instance;
8
+ function connectionUrl() {
12
9
  const url = process.env[HELLORUNTIME_ENV.DATABASE_URL];
13
10
  if (!url) {
14
11
  throw new Error(`${HELLORUNTIME_ENV.DATABASE_URL} is not set — is this running inside a Helloruntime app?`);
15
12
  }
13
+ return url;
14
+ }
15
+ function poolMax() {
16
16
  const max = Number(process.env[HELLORUNTIME_ENV.DB_POOL_MAX] ?? DEFAULT_DB_POOL_MAX);
17
- const pool = new pg.Pool({ connectionString: url, max: Number.isFinite(max) ? max : DEFAULT_DB_POOL_MAX });
18
- instance = drizzle(pool);
17
+ return Number.isFinite(max) ? max : DEFAULT_DB_POOL_MAX;
18
+ }
19
+ export function getDb() {
20
+ if (instance)
21
+ return instance;
22
+ const sql = postgres(connectionUrl(), { max: poolMax(), prepare: false });
23
+ instance = drizzle(sql);
19
24
  return instance;
20
25
  }
21
26
  /** Lazily-initialized Drizzle handle. Use with your own schema: `db.select().from(table)`. */
@@ -33,12 +38,7 @@ export const db = new Proxy({}, {
33
38
  * export const db = createDatabase(schema);
34
39
  */
35
40
  export function createDatabase(schema) {
36
- const url = process.env[HELLORUNTIME_ENV.DATABASE_URL];
37
- if (!url) {
38
- throw new Error(`${HELLORUNTIME_ENV.DATABASE_URL} is not set — is this running inside a Helloruntime app?`);
39
- }
40
- const max = Number(process.env[HELLORUNTIME_ENV.DB_POOL_MAX] ?? DEFAULT_DB_POOL_MAX);
41
- const pool = new pg.Pool({ connectionString: url, max: Number.isFinite(max) ? max : DEFAULT_DB_POOL_MAX });
42
- return drizzle(pool, { schema });
41
+ const sql = postgres(connectionUrl(), { max: poolMax(), prepare: false });
42
+ return drizzle(sql, { schema });
43
43
  }
44
44
  //# sourceMappingURL=db.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/sdk/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAuB,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,kFAAkF;AAClF,8EAA8E;AAC9E,gFAAgF;AAChF,kBAAkB;AAClB,IAAI,QAAQ,GAA0B,IAAI,CAAC;AAE3C,MAAM,UAAU,KAAK;IACnB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,GAAG,gBAAgB,CAAC,YAAY,0DAA0D,CAAC,CAAC;IAC9G,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,mBAAmB,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC3G,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,MAAM,EAAE,GAAmB,IAAI,KAAK,CAAC,EAAoB,EAAE;IAChE,GAAG,CAAC,OAAO,EAAE,QAAQ;QACnB,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAY,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;CACF,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAe;IAEf,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,GAAG,gBAAgB,CAAC,YAAY,0DAA0D,CAAC,CAAC;IAC9G,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,mBAAmB,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC3G,OAAO,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/sdk/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,OAAO,EAA2B,MAAM,yBAAyB,CAAC;AAC3E,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,wFAAwF;AACxF,0FAA0F;AAC1F,qFAAqF;AACrF,IAAI,QAAQ,GAA8B,IAAI,CAAC;AAE/C,SAAS,aAAa;IACpB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,GAAG,gBAAgB,CAAC,YAAY,0DAA0D,CAAC,CAAC;IAC9G,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,OAAO;IACd,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,mBAAmB,CAAC,CAAC;IACrF,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,KAAK;IACnB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1E,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,MAAM,EAAE,GAAuB,IAAI,KAAK,CAAC,EAAwB,EAAE;IACxE,GAAG,CAAC,OAAO,EAAE,QAAQ;QACnB,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAY,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;CACF,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAe;IAEf,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1E,OAAO,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AAClC,CAAC"}
@@ -2,7 +2,5 @@ export { db, getDb, createDatabase } from "./db.js";
2
2
  export { defineJob, type JobDefinition } from "./jobs.js";
3
3
  export { sendJob, type SendJobOptions, type SendJobResult } from "./send-job.js";
4
4
  export { createHelloruntimeHandler, type HelloruntimeHandlerOptions } from "./runtime/handler.js";
5
- export { helloruntimeExpress } from "./runtime/express.js";
6
- export { helloruntimeHono } from "./runtime/hono.js";
7
5
  export type { JobContext, JobHandler } from "@helloruntime/protocol";
8
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAIjF,OAAO,EAAE,yBAAyB,EAAE,KAAK,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAIjF,OAAO,EAAE,yBAAyB,EAAE,KAAK,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAElG,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/sdk/index.js CHANGED
@@ -4,9 +4,7 @@
4
4
  export { db, getDb, createDatabase } from "./db.js";
5
5
  export { defineJob } from "./jobs.js";
6
6
  export { sendJob } from "./send-job.js";
7
- // Runtime: serve platform job dispatch from inside the app's own HTTP server. Nitro apps
8
- // use the `helloruntime/nitro` build module instead (it injects the route automatically).
7
+ // Low-level dispatch handler. Tenant apps don't need this the `helloruntime/nitro`
8
+ // build module injects the dispatch route automatically. Exposed for custom runtimes.
9
9
  export { createHelloruntimeHandler } from "./runtime/handler.js";
10
- export { helloruntimeExpress } from "./runtime/express.js";
11
- export { helloruntimeHono } from "./runtime/hono.js";
12
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,+EAA+E;AAC/E,gEAAgE;AAChE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,SAAS,EAAsB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,OAAO,EAA2C,MAAM,eAAe,CAAC;AAEjF,yFAAyF;AACzF,0FAA0F;AAC1F,OAAO,EAAE,yBAAyB,EAAmC,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,+EAA+E;AAC/E,gEAAgE;AAChE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,SAAS,EAAsB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,OAAO,EAA2C,MAAM,eAAe,CAAC;AAEjF,qFAAqF;AACrF,sFAAsF;AACtF,OAAO,EAAE,yBAAyB,EAAmC,MAAM,sBAAsB,CAAC"}
@@ -5,8 +5,8 @@ export interface JobDefinition<T = unknown> {
5
5
  }
6
6
  /**
7
7
  * Register a job handler. The call is an import side-effect that fills the runtime
8
- * registry; mount the SDK handler (helloruntimeExpress / helloruntimeHono / createHelloruntimeHandler)
9
- * in your server to serve `_helloruntime/jobs/<name>`. Enqueue work with `sendJob(name, payload)`.
8
+ * registry; the `helloruntime/nitro` build module serves `_helloruntime/jobs/<name>`
9
+ * from it. Enqueue work with `sendJob(name, payload)`.
10
10
  */
11
11
  export declare function defineJob<T = unknown>(name: string, handler: JobHandler<T>): JobDefinition<T>;
12
12
  //# sourceMappingURL=jobs.d.ts.map
package/dist/sdk/jobs.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { registerJob } from "@helloruntime/protocol";
2
2
  /**
3
3
  * Register a job handler. The call is an import side-effect that fills the runtime
4
- * registry; mount the SDK handler (helloruntimeExpress / helloruntimeHono / createHelloruntimeHandler)
5
- * in your server to serve `_helloruntime/jobs/<name>`. Enqueue work with `sendJob(name, payload)`.
4
+ * registry; the `helloruntime/nitro` build module serves `_helloruntime/jobs/<name>`
5
+ * from it. Enqueue work with `sendJob(name, payload)`.
6
6
  */
7
7
  export function defineJob(name, handler) {
8
8
  registerJob(name, handler);
@@ -8,6 +8,10 @@ interface NitroLike {
8
8
  tasks?: boolean;
9
9
  };
10
10
  scheduledTasks?: Record<string, string | string[]>;
11
+ /** Merged task registry (file-scanned + config), populated by the time `compiled` runs. */
12
+ tasks?: Record<string, {
13
+ description?: string;
14
+ }>;
11
15
  handlers: Array<{
12
16
  route: string;
13
17
  handler: string;
@@ -1 +1 @@
1
- {"version":3,"file":"nitro-module.d.ts","sourceRoot":"","sources":["../../src/sdk/nitro-module.ts"],"names":[],"mappings":"AAMA,UAAU,SAAS;IACjB,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QACxB,YAAY,CAAC,EAAE;YAAE,KAAK,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;QACnC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;QACnD,QAAQ,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACrE,CAAC;IACF,KAAK,EAAE;QAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;KAAE,CAAC;CACrF;AASD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAsChE"}
1
+ {"version":3,"file":"nitro-module.d.ts","sourceRoot":"","sources":["../../src/sdk/nitro-module.ts"],"names":[],"mappings":"AAMA,UAAU,SAAS;IACjB,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QACxB,YAAY,CAAC,EAAE;YAAE,KAAK,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;QACnC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;QACnD,2FAA2F;QAC3F,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACjD,QAAQ,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACrE,CAAC;IACF,KAAK,EAAE;QAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;KAAE,CAAC;CACrF;AASD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CA4ChE"}
@@ -48,11 +48,17 @@ export default function helloruntimeNitro(nitro) {
48
48
  harvested = crons;
49
49
  instance.options.scheduledTasks = {};
50
50
  });
51
- // After the build: write the manifest the CLI ships in the deploy request.
51
+ // After the build: write the manifest the CLI ships in the deploy request. The full
52
+ // task registry is read here (not build:before) — file-scanned tasks aren't populated
53
+ // until after the scan phase. Mirrors what Nitro's `/_nitro/tasks` exposes.
52
54
  nitro.hooks.hook("compiled", (instance) => {
55
+ const tasks = Object.entries(instance.options.tasks ?? {}).map(([name, t]) => ({
56
+ name,
57
+ description: t?.description || undefined
58
+ }));
53
59
  const dir = join(instance.options.output.dir, "helloruntime");
54
60
  mkdirSync(dir, { recursive: true });
55
- writeFileSync(join(dir, "triggers.json"), JSON.stringify({ crons: harvested, jobs: [] }, null, 2));
61
+ writeFileSync(join(dir, "triggers.json"), JSON.stringify({ tasks, crons: harvested, jobs: [] }, null, 2));
56
62
  });
57
63
  }
58
64
  //# sourceMappingURL=nitro-module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nitro-module.js","sourceRoot":"","sources":["../../src/sdk/nitro-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAoBjC,MAAM,gBAAgB,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,6BAA6B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEhG;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,KAAgB;IACxD,2FAA2F;IAC3F,KAAK,CAAC,OAAO,CAAC,YAAY,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAE5E,kCAAkC;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,gBAAgB,CAAC,EAAE,CAAC;QACxE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,IAAI,SAAS,GAAoB,EAAE,CAAC;IAEpC,sFAAsF;IACtF,uFAAuF;IACvF,0DAA0D;IAC1D,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,EAAE;QAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC;QACxD,MAAM,KAAK,GAAoB,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1D,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,SAAS,CAAC,oDAAoD;gBAClF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,SAAS,GAAG,KAAK,CAAC;QAClB,QAAQ,CAAC,OAAO,CAAC,cAAc,GAAG,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,2EAA2E;IAC3E,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC9D,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,aAAa,CACX,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CACxD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"nitro-module.js","sourceRoot":"","sources":["../../src/sdk/nitro-module.ts"],"names":[],"mappings":"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"}
@@ -37,6 +37,18 @@
37
37
  "description": "Run Drizzle migrations from ./db/migrations against the managed database before cutover. The deploy fails if a migration errors. Set false to opt out."
38
38
  }
39
39
  }
40
+ },
41
+ "redis": {
42
+ "type": "object",
43
+ "additionalProperties": false,
44
+ "description": "Managed Redis (shared instance, per-app ACL user).",
45
+ "properties": {
46
+ "enabled": {
47
+ "type": "boolean",
48
+ "default": false,
49
+ "description": "Provision a per-app Redis user and inject REDIS_URL + HELLORUNTIME_REDIS_PREFIX (the key/channel prefix the ACL restricts you to). Opt-in."
50
+ }
51
+ }
40
52
  }
41
53
  }
42
54
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "helloruntime",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "description": "CLI + runtime SDK for Helloruntime — a small self-hostable PaaS for server-rendered JS/TS apps.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://helloruntime.com",
@@ -42,7 +42,7 @@
42
42
  "dependencies": {
43
43
  "commander": "^14.0.0",
44
44
  "drizzle-orm": "^0.44.7",
45
- "pg": "^8.16.2",
45
+ "postgres": "^3.4.9",
46
46
  "tar": "^7.4.3",
47
47
  "zod": "^3.25.67",
48
48
  "@helloruntime/protocol": "^0.0.5"
@@ -56,7 +56,6 @@
56
56
  }
57
57
  },
58
58
  "devDependencies": {
59
- "@types/pg": "^8.15.4",
60
59
  "@types/tar": "^6.1.13",
61
60
  "nitro": "^3.0.260311-beta"
62
61
  },