helloruntime 0.0.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.
Files changed (78) hide show
  1. package/dist/cli/config.d.ts +17 -0
  2. package/dist/cli/config.d.ts.map +1 -0
  3. package/dist/cli/config.js +22 -0
  4. package/dist/cli/config.js.map +1 -0
  5. package/dist/cli/deploy.d.ts +4 -0
  6. package/dist/cli/deploy.d.ts.map +1 -0
  7. package/dist/cli/deploy.js +69 -0
  8. package/dist/cli/deploy.js.map +1 -0
  9. package/dist/cli/destroy.d.ts +5 -0
  10. package/dist/cli/destroy.d.ts.map +1 -0
  11. package/dist/cli/destroy.js +41 -0
  12. package/dist/cli/destroy.js.map +1 -0
  13. package/dist/cli/http.d.ts +3 -0
  14. package/dist/cli/http.d.ts.map +1 -0
  15. package/dist/cli/http.js +26 -0
  16. package/dist/cli/http.js.map +1 -0
  17. package/dist/cli/index.d.ts +3 -0
  18. package/dist/cli/index.d.ts.map +1 -0
  19. package/dist/cli/index.js +76 -0
  20. package/dist/cli/index.js.map +1 -0
  21. package/dist/cli/packager.d.ts +7 -0
  22. package/dist/cli/packager.d.ts.map +1 -0
  23. package/dist/cli/packager.js +49 -0
  24. package/dist/cli/packager.js.map +1 -0
  25. package/dist/cli/project-config.d.ts +3 -0
  26. package/dist/cli/project-config.d.ts.map +1 -0
  27. package/dist/cli/project-config.js +20 -0
  28. package/dist/cli/project-config.js.map +1 -0
  29. package/dist/cli/triggers.d.ts +15 -0
  30. package/dist/cli/triggers.d.ts.map +1 -0
  31. package/dist/cli/triggers.js +68 -0
  32. package/dist/cli/triggers.js.map +1 -0
  33. package/dist/sdk/cron.d.ts +12 -0
  34. package/dist/sdk/cron.d.ts.map +1 -0
  35. package/dist/sdk/cron.js +10 -0
  36. package/dist/sdk/cron.js.map +1 -0
  37. package/dist/sdk/db.d.ts +14 -0
  38. package/dist/sdk/db.d.ts.map +1 -0
  39. package/dist/sdk/db.js +44 -0
  40. package/dist/sdk/db.js.map +1 -0
  41. package/dist/sdk/index.d.ts +10 -0
  42. package/dist/sdk/index.d.ts.map +1 -0
  43. package/dist/sdk/index.js +11 -0
  44. package/dist/sdk/index.js.map +1 -0
  45. package/dist/sdk/jobs.d.ts +12 -0
  46. package/dist/sdk/jobs.d.ts.map +1 -0
  47. package/dist/sdk/jobs.js +11 -0
  48. package/dist/sdk/jobs.js.map +1 -0
  49. package/dist/sdk/registry.d.ts +2 -0
  50. package/dist/sdk/registry.d.ts.map +1 -0
  51. package/dist/sdk/registry.js +5 -0
  52. package/dist/sdk/registry.js.map +1 -0
  53. package/dist/sdk/runtime/express.d.ts +6 -0
  54. package/dist/sdk/runtime/express.d.ts.map +1 -0
  55. package/dist/sdk/runtime/express.js +56 -0
  56. package/dist/sdk/runtime/express.js.map +1 -0
  57. package/dist/sdk/runtime/handler.d.ts +13 -0
  58. package/dist/sdk/runtime/handler.d.ts.map +1 -0
  59. package/dist/sdk/runtime/handler.js +85 -0
  60. package/dist/sdk/runtime/handler.js.map +1 -0
  61. package/dist/sdk/runtime/hono.d.ts +10 -0
  62. package/dist/sdk/runtime/hono.d.ts.map +1 -0
  63. package/dist/sdk/runtime/hono.js +16 -0
  64. package/dist/sdk/runtime/hono.js.map +1 -0
  65. package/dist/sdk/runtime/register.d.ts +9 -0
  66. package/dist/sdk/runtime/register.d.ts.map +1 -0
  67. package/dist/sdk/runtime/register.js +32 -0
  68. package/dist/sdk/runtime/register.js.map +1 -0
  69. package/dist/sdk/runtime/verify.d.ts +20 -0
  70. package/dist/sdk/runtime/verify.d.ts.map +1 -0
  71. package/dist/sdk/runtime/verify.js +29 -0
  72. package/dist/sdk/runtime/verify.js.map +1 -0
  73. package/dist/sdk/send-job.d.ts +15 -0
  74. package/dist/sdk/send-job.d.ts.map +1 -0
  75. package/dist/sdk/send-job.js +36 -0
  76. package/dist/sdk/send-job.js.map +1 -0
  77. package/helloruntime.schema.json +48 -0
  78. package/package.json +50 -0
@@ -0,0 +1,17 @@
1
+ import { z } from "zod";
2
+ declare const configSchema: z.ZodObject<{
3
+ apiUrl: z.ZodString;
4
+ token: z.ZodString;
5
+ }, "strip", z.ZodTypeAny, {
6
+ apiUrl: string;
7
+ token: string;
8
+ }, {
9
+ apiUrl: string;
10
+ token: string;
11
+ }>;
12
+ export type CliConfig = z.infer<typeof configSchema>;
13
+ export declare function configPath(): string;
14
+ export declare function readConfig(): Promise<CliConfig>;
15
+ export declare function writeConfig(config: CliConfig): Promise<void>;
16
+ export {};
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,22 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { z } from "zod";
5
+ const configSchema = z.object({
6
+ apiUrl: z.string().url(),
7
+ token: z.string()
8
+ });
9
+ export function configPath() {
10
+ return join(homedir(), ".helloruntime", "config.json");
11
+ }
12
+ export async function readConfig() {
13
+ const raw = await readFile(configPath(), "utf8").catch(() => null);
14
+ if (!raw)
15
+ throw new Error("Not logged in. Run `helloruntime login` first.");
16
+ return configSchema.parse(JSON.parse(raw));
17
+ }
18
+ export async function writeConfig(config) {
19
+ await mkdir(join(homedir(), ".helloruntime"), { recursive: true, mode: 0o700 });
20
+ await writeFile(configPath(), `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 });
21
+ }
22
+ //# sourceMappingURL=config.js.map
@@ -0,0 +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"}
@@ -0,0 +1,4 @@
1
+ export declare function deployCommand(options: {
2
+ app?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/cli/deploy.ts"],"names":[],"mappings":"AAkCA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D5E"}
@@ -0,0 +1,69 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { basename, join } from "node:path";
3
+ import { readConfig } from "./config.js";
4
+ import { helloruntimeRequest } from "./http.js";
5
+ import { packageSource } from "./packager.js";
6
+ import { readProjectConfig } from "./project-config.js";
7
+ const TERMINAL = new Set(["active", "failed"]);
8
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
9
+ function formatDuration(ms) {
10
+ const seconds = ms / 1000;
11
+ if (seconds < 60)
12
+ return `${seconds.toFixed(1)}s`;
13
+ const mins = Math.floor(seconds / 60);
14
+ return `${mins}m ${String(Math.round(seconds % 60)).padStart(2, "0")}s`;
15
+ }
16
+ export async function deployCommand(options) {
17
+ const cwd = process.cwd();
18
+ const config = await readConfig();
19
+ const projectConfig = await readProjectConfig(cwd);
20
+ const pkg = await readFile(join(cwd, "package.json"), "utf8")
21
+ .then((raw) => JSON.parse(raw))
22
+ .catch(() => ({}));
23
+ const appName = options.app ?? pkg.name ?? basename(cwd);
24
+ process.stdout.write("Packaging source… ");
25
+ const { tarPath, sourceHash, entries } = await packageSource(cwd);
26
+ console.log(`${entries.length} files (${sourceHash.slice(0, 12)})`);
27
+ process.stdout.write("Uploading… ");
28
+ const tarball = await readFile(tarPath);
29
+ const uploaded = await helloruntimeRequest(config, `/v1/artifacts?sourceHash=${encodeURIComponent(sourceHash)}`, { method: "POST", headers: { "content-type": "application/gzip" }, body: tarball });
30
+ console.log(`${(uploaded.artifactSizeBytes / 1024).toFixed(0)} KiB`);
31
+ const created = await helloruntimeRequest(config, "/v1/deployments", {
32
+ method: "POST",
33
+ body: JSON.stringify({
34
+ appName,
35
+ appSlug: appName,
36
+ sourceHash,
37
+ artifactKey: uploaded.artifactKey,
38
+ artifactSizeBytes: uploaded.artifactSizeBytes,
39
+ manifest: projectConfig
40
+ })
41
+ });
42
+ console.log(`Deploying v${created.version}…`);
43
+ let phase = "";
44
+ let phaseStart = Date.now();
45
+ for (;;) {
46
+ const status = await helloruntimeRequest(config, `/v1/deployments/${created.deploymentId}`);
47
+ if (status.status !== phase) {
48
+ // Close the previous phase's line with how long it took, then open the new
49
+ // one (its duration is appended once it ends). Nothing else writes to stdout
50
+ // between these, so the duration lands on the same line.
51
+ if (phase !== "")
52
+ process.stdout.write(` (${formatDuration(Date.now() - phaseStart)})\n`);
53
+ process.stdout.write(` → ${status.status}`);
54
+ phase = status.status;
55
+ phaseStart = Date.now();
56
+ }
57
+ if (TERMINAL.has(status.status)) {
58
+ process.stdout.write("\n");
59
+ if (status.status === "failed") {
60
+ throw new Error(`Deploy failed: ${status.error ?? "unknown error"}`);
61
+ }
62
+ console.log(`\n✓ Deployed v${status.version}`);
63
+ console.log(` ${status.url}`);
64
+ return;
65
+ }
66
+ await sleep(2000);
67
+ }
68
+ }
69
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/cli/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function destroyCommand(options: {
2
+ app?: string;
3
+ yes?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=destroy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destroy.d.ts","sourceRoot":"","sources":["../../src/cli/destroy.ts"],"names":[],"mappings":"AAuBA,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B5F"}
@@ -0,0 +1,41 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { basename, join } from "node:path";
3
+ import { createInterface } from "node:readline/promises";
4
+ import { readConfig } from "./config.js";
5
+ import { helloruntimeRequest } from "./http.js";
6
+ async function confirm(question) {
7
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
8
+ try {
9
+ const answer = (await rl.question(question)).trim().toLowerCase();
10
+ return answer === "y" || answer === "yes";
11
+ }
12
+ finally {
13
+ rl.close();
14
+ }
15
+ }
16
+ export async function destroyCommand(options) {
17
+ const config = await readConfig();
18
+ let appName = options.app;
19
+ if (!appName) {
20
+ const pkg = (await readFile(join(process.cwd(), "package.json"), "utf8")
21
+ .then(JSON.parse)
22
+ .catch(() => ({})));
23
+ appName = pkg.name ?? basename(process.cwd());
24
+ }
25
+ if (!options.yes) {
26
+ const ok = await confirm(`Permanently destroy "${appName}" — its workload, all versions, and (if it is the last app) the project database. This cannot be undone. Continue? [y/N] `);
27
+ if (!ok) {
28
+ console.log("Aborted.");
29
+ return;
30
+ }
31
+ }
32
+ const result = await helloruntimeRequest(config, `/v1/apps/${encodeURIComponent(appName)}`, {
33
+ method: "DELETE"
34
+ });
35
+ console.log(`✓ Destroyed ${result.app}`);
36
+ if (result.destroyedNamespace)
37
+ console.log(` namespace ${result.destroyedNamespace} removed`);
38
+ if (result.destroyedDatabase)
39
+ console.log(` database dropped`);
40
+ }
41
+ //# sourceMappingURL=destroy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../src/cli/destroy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAQhD,KAAK,UAAU,OAAO,CAAC,QAAgB;IACrC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAClE,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,CAAC;IAC5C,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAwC;IAC3E,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC;aACrE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;aAChB,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAsB,CAAC;QAC3C,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,wBAAwB,OAAO,2HAA2H,CAC3J,CAAC;QACF,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAgB,MAAM,EAAE,YAAY,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE;QACzG,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,kBAAkB;QAAE,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,kBAAkB,UAAU,CAAC,CAAC;IAC/F,IAAI,MAAM,CAAC,iBAAiB;QAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliConfig } from "./config.js";
2
+ export declare function helloruntimeRequest<T>(config: CliConfig, path: string, init?: RequestInit): Promise<T>;
3
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/cli/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,CAAC,CAAC,CAiBZ"}
@@ -0,0 +1,26 @@
1
+ export async function helloruntimeRequest(config, path, init = {}) {
2
+ const headers = {
3
+ authorization: `Bearer ${config.token}`,
4
+ ...init.headers
5
+ };
6
+ if (typeof init.body === "string" && !headers["content-type"]) {
7
+ headers["content-type"] = "application/json";
8
+ }
9
+ const response = await fetch(new URL(path, config.apiUrl), { ...init, headers });
10
+ const text = await response.text();
11
+ const body = text ? safeJson(text) : null;
12
+ if (!response.ok) {
13
+ const detail = body && typeof body === "object" ? JSON.stringify(body) : text;
14
+ throw new Error(`${path} failed (${response.status}): ${detail}`);
15
+ }
16
+ return body;
17
+ }
18
+ function safeJson(text) {
19
+ try {
20
+ return JSON.parse(text);
21
+ }
22
+ catch {
23
+ return text;
24
+ }
25
+ }
26
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/cli/http.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAiB,EACjB,IAAY,EACZ,OAAoB,EAAE;IAEtB,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;QACvC,GAAI,IAAI,CAAC,OAA8C;KACxD,CAAC;IACF,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9D,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,YAAY,QAAQ,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,IAAS,CAAC;AACnB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { writeConfig } from "./config.js";
4
+ import { deployCommand } from "./deploy.js";
5
+ import { destroyCommand } from "./destroy.js";
6
+ import { cronList, cronTrigger, jobsList, jobsTrigger } from "./triggers.js";
7
+ const program = new Command();
8
+ program.name("helloruntime").description("Deploy server-rendered JS/TS apps to Helloruntime").version("0.0.1");
9
+ program
10
+ .command("login")
11
+ .option("--api-url <url>", "Helloruntime API URL", process.env.HELLORUNTIME_API_URL ?? "http://localhost:3000")
12
+ .option("--email <email>", "Dev login email", "dev@helloruntime.local")
13
+ .option("--dev", "Use the dev-login fallback (no real IdP yet)")
14
+ .action(async (options) => {
15
+ const response = await fetch(new URL("/v1/auth/dev-login", options.apiUrl), {
16
+ method: "POST",
17
+ headers: { "content-type": "application/json" },
18
+ body: JSON.stringify({ email: options.email })
19
+ });
20
+ const body = (await response.json().catch(() => null));
21
+ if (!response.ok || !body) {
22
+ throw new Error(`Login failed (${response.status})`);
23
+ }
24
+ await writeConfig({ apiUrl: options.apiUrl, token: body.token });
25
+ console.log(`Logged in to ${options.apiUrl} as ${body.user.email}`);
26
+ });
27
+ program
28
+ .command("deploy")
29
+ .description("Build + deploy the app in the current directory")
30
+ .option("--app <name>", "App name")
31
+ .action(deployCommand);
32
+ program
33
+ .command("destroy")
34
+ .description("Destroy an app (and the project database if it is the last app)")
35
+ .option("--app <name>", "App name")
36
+ .option("-y, --yes", "Skip the confirmation prompt")
37
+ .action(destroyCommand);
38
+ // ─── Jobs ─────────────────────────────────────────────────────────────────────
39
+ const jobs = program.command("jobs").description("Inspect and trigger background jobs");
40
+ jobs
41
+ .command("trigger <name>")
42
+ .description("Enqueue a job on demand")
43
+ .option("--payload <json>", "JSON payload, @file.json, or a bare string")
44
+ .option("--app <name>", "App name (defaults to package.json name / dir)")
45
+ .action(jobsTrigger);
46
+ jobs
47
+ .command("list")
48
+ .description("List recent jobs")
49
+ .option("--status <status>", "Filter by status (pending|leased|succeeded|dead)")
50
+ .option("--app <name>", "App name")
51
+ .action(jobsList);
52
+ // ─── Cron ─────────────────────────────────────────────────────────────────────
53
+ const cron = program.command("cron").description("Inspect and trigger cron schedules");
54
+ cron
55
+ .command("trigger <name>")
56
+ .description("Fire a cron out-of-schedule")
57
+ .option("--app <name>", "App name")
58
+ .action(cronTrigger);
59
+ cron
60
+ .command("list")
61
+ .description("List registered crons")
62
+ .option("--app <name>", "App name")
63
+ .action(cronList);
64
+ const notYet = (command) => () => {
65
+ console.error(`helloruntime ${command}: not implemented yet`);
66
+ process.exitCode = 1;
67
+ };
68
+ program.command("apps").description("List deployed apps").action(notYet("apps"));
69
+ program.command("app").option("--app <name>").action(notYet("app"));
70
+ program.command("rollback").argument("[version]").option("--app <name>").action(notYet("rollback"));
71
+ program.command("logs").option("--app <name>").action(notYet("logs"));
72
+ program.parseAsync().catch((error) => {
73
+ console.error(error instanceof Error ? error.message : error);
74
+ process.exitCode = 1;
75
+ });
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface PackagedSource {
2
+ tarPath: string;
3
+ sourceHash: string;
4
+ entries: string[];
5
+ }
6
+ export declare function packageSource(cwd: string): Promise<PackagedSource>;
7
+ //# sourceMappingURL=packager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packager.d.ts","sourceRoot":"","sources":["../../src/cli/packager.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAGD,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoBxE"}
@@ -0,0 +1,49 @@
1
+ import { createHash } from "node:crypto";
2
+ import { mkdir, readdir, readFile } from "node:fs/promises";
3
+ import { join, relative, sep } from "node:path";
4
+ import * as tar from "tar";
5
+ // Directories never uploaded: build outputs + vcs + deps. node_modules is installed
6
+ // server-side; .output/dist are rebuilt; excluding them keeps the source hash stable.
7
+ const DENY_DIRS = new Set([
8
+ "node_modules",
9
+ ".git",
10
+ "dist",
11
+ ".output",
12
+ ".helloruntime",
13
+ ".turbo",
14
+ "coverage",
15
+ ".next",
16
+ ".vite"
17
+ ]);
18
+ const DENY_FILES = new Set([".DS_Store", ".env", ".env.local"]);
19
+ async function walk(dir, out) {
20
+ for (const entry of await readdir(dir, { withFileTypes: true })) {
21
+ if (entry.isDirectory()) {
22
+ if (!DENY_DIRS.has(entry.name))
23
+ await walk(join(dir, entry.name), out);
24
+ }
25
+ else if (entry.isFile() && !DENY_FILES.has(entry.name)) {
26
+ out.push(join(dir, entry.name));
27
+ }
28
+ }
29
+ }
30
+ // Tar SOURCE ONLY (sorted, deterministic), hash over relative path + content.
31
+ export async function packageSource(cwd) {
32
+ const absFiles = [];
33
+ await walk(cwd, absFiles);
34
+ absFiles.sort();
35
+ const entries = absFiles.map((f) => relative(cwd, f).split(sep).join("/"));
36
+ const hash = createHash("sha256");
37
+ for (let i = 0; i < absFiles.length; i++) {
38
+ hash.update(entries[i]);
39
+ hash.update("\0");
40
+ hash.update(await readFile(absFiles[i]));
41
+ }
42
+ const sourceHash = hash.digest("hex");
43
+ const outDir = join(cwd, ".helloruntime", "artifacts");
44
+ await mkdir(outDir, { recursive: true });
45
+ const tarPath = join(outDir, `${sourceHash}.tgz`);
46
+ await tar.c({ gzip: true, file: tarPath, cwd, portable: true }, entries);
47
+ return { tarPath, sourceHash, entries };
48
+ }
49
+ //# sourceMappingURL=packager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packager.js","sourceRoot":"","sources":["../../src/cli/packager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type HelloruntimeConfig } from "@helloruntime/protocol";
2
+ export declare function readProjectConfig(cwd: string): Promise<HelloruntimeConfig>;
3
+ //# sourceMappingURL=project-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/cli/project-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAK3F,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAUhF"}
@@ -0,0 +1,20 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { helloruntimeConfigSchema } from "@helloruntime/protocol";
4
+ // Load the optional helloruntime.json (infra knobs). Absent → empty config (zero-config
5
+ // deploys still work). Distinct from ~/.helloruntime/config.json, which holds auth. The
6
+ // editor-only "$schema" field is stripped by the validator.
7
+ export async function readProjectConfig(cwd) {
8
+ const raw = await readFile(join(cwd, "helloruntime.json"), "utf8").catch(() => null);
9
+ if (!raw)
10
+ return helloruntimeConfigSchema.parse({});
11
+ let parsed;
12
+ try {
13
+ parsed = JSON.parse(raw);
14
+ }
15
+ catch (error) {
16
+ throw new Error(`Invalid helloruntime.json: ${error instanceof Error ? error.message : String(error)}`);
17
+ }
18
+ return helloruntimeConfigSchema.parse(parsed);
19
+ }
20
+ //# sourceMappingURL=project-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/cli/project-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,wBAAwB,EAA2B,MAAM,wBAAwB,CAAC;AAE3F,wFAAwF;AACxF,wFAAwF;AACxF,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACrF,IAAI,CAAC,GAAG;QAAE,OAAO,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,15 @@
1
+ export declare function jobsTrigger(name: string, options: {
2
+ payload?: string;
3
+ app?: string;
4
+ }): Promise<void>;
5
+ export declare function cronTrigger(name: string, options: {
6
+ app?: string;
7
+ }): Promise<void>;
8
+ export declare function jobsList(options: {
9
+ status?: string;
10
+ app?: string;
11
+ }): Promise<void>;
12
+ export declare function cronList(options: {
13
+ app?: string;
14
+ }): Promise<void>;
15
+ //# sourceMappingURL=triggers.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,68 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { basename } from "node:path";
3
+ import { readConfig } from "./config.js";
4
+ 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
+ export async function jobsTrigger(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)}/jobs`, {
30
+ method: "POST",
31
+ body: JSON.stringify({ name, payload })
32
+ });
33
+ console.log(`Enqueued job "${name}" → ${res.jobId}`);
34
+ }
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
+ export async function jobsList(options) {
42
+ const config = await readConfig();
43
+ const slug = await resolveAppSlug(options.app);
44
+ const query = options.status ? `?status=${encodeURIComponent(options.status)}` : "";
45
+ const { jobs } = await helloruntimeRequest(config, `/v1/apps/${encodeURIComponent(slug)}/jobs${query}`);
46
+ if (!jobs.length) {
47
+ console.log("No jobs.");
48
+ return;
49
+ }
50
+ for (const j of jobs) {
51
+ const err = j.lastError ? ` — ${j.lastError.split("\n")[0].slice(0, 80)}` : "";
52
+ console.log(`${j.status.padEnd(10)} ${j.kind.padEnd(5)} ${j.name.padEnd(20)} attempt=${j.attempt} ${j.id}${err}`);
53
+ }
54
+ }
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
+ //# sourceMappingURL=triggers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../src/cli/triggers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type CronHandler } from "@helloruntime/protocol";
2
+ export interface CronDefinition {
3
+ name: string;
4
+ schedule: string;
5
+ handler: CronHandler;
6
+ }
7
+ /**
8
+ * Register a cron handler on a schedule (5-field cron expression). The platform
9
+ * invokes `_helloruntime/cron/<name>` on schedule; the user never runs setInterval.
10
+ */
11
+ export declare function defineCron(name: string, schedule: string, handler: CronHandler): CronDefinition;
12
+ //# sourceMappingURL=cron.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../src/sdk/cron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAExE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,WAAW,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,cAAc,CAG/F"}
@@ -0,0 +1,10 @@
1
+ import { registerCron } from "@helloruntime/protocol";
2
+ /**
3
+ * Register a cron handler on a schedule (5-field cron expression). The platform
4
+ * invokes `_helloruntime/cron/<name>` on schedule; the user never runs setInterval.
5
+ */
6
+ export function defineCron(name, schedule, handler) {
7
+ registerCron(name, schedule, handler);
8
+ return { name, schedule, handler };
9
+ }
10
+ //# sourceMappingURL=cron.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/sdk/cron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,wBAAwB,CAAC;AAQxE;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,QAAgB,EAAE,OAAoB;IAC7E,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type NodePgDatabase } from "drizzle-orm/node-postgres";
2
+ export declare function getDb(): NodePgDatabase;
3
+ /** Lazily-initialized Drizzle handle. Use with your own schema: `db.select().from(table)`. */
4
+ export declare const db: NodePgDatabase;
5
+ /**
6
+ * Create a Drizzle database bound to your schema, over the injected pooled
7
+ * DATABASE_URL. The recommended entry point:
8
+ *
9
+ * import { createDatabase } from "helloruntime";
10
+ * import * as schema from "./schema";
11
+ * export const db = createDatabase(schema);
12
+ */
13
+ export declare function createDatabase<TSchema extends Record<string, unknown>>(schema: TSchema): NodePgDatabase<TSchema>;
14
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +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"}