@nylorun/runtime 0.8.0-beta → 0.10.0-beta

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 (130) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +96 -25
  3. package/dist/adapters/media.d.ts +2 -2
  4. package/dist/adapters/media.js +2 -2
  5. package/dist/adapters/observe.d.ts +2 -1
  6. package/dist/adapters/observe.js +2 -3
  7. package/dist/assets.d.ts +2 -2
  8. package/dist/assets.js +5 -3
  9. package/dist/core/executors.d.ts +11 -2
  10. package/dist/core/executors.js +20 -4
  11. package/dist/core/flow-host.d.ts +264 -0
  12. package/dist/core/flow-host.js +783 -0
  13. package/dist/core/limits.d.ts +40 -0
  14. package/dist/core/limits.js +76 -0
  15. package/dist/core/runtime.d.ts +5 -90
  16. package/dist/core/runtime.js +3 -1418
  17. package/dist/core/sandbox-routes.d.ts +35 -0
  18. package/dist/core/sandbox-routes.js +106 -0
  19. package/dist/core/store.d.ts +5 -2
  20. package/dist/core/store.js +20 -72
  21. package/dist/core/turn-manifest.d.ts +50 -0
  22. package/dist/core/turn-manifest.js +66 -0
  23. package/dist/host/config-for.d.ts +16 -0
  24. package/dist/host/config-for.js +45 -0
  25. package/dist/host/config.d.ts +24 -0
  26. package/dist/host/create-host.d.ts +21 -0
  27. package/dist/host/create-host.js +396 -0
  28. package/dist/host/environment.d.ts +13 -0
  29. package/dist/host/environment.js +53 -0
  30. package/dist/host/http.d.ts +35 -0
  31. package/dist/host/http.js +136 -0
  32. package/dist/host/index.d.ts +6 -0
  33. package/dist/host/index.js +5 -0
  34. package/dist/host/logger.d.ts +3 -0
  35. package/dist/host/logger.js +18 -0
  36. package/dist/host/main.d.ts +3 -0
  37. package/dist/host/main.js +142 -0
  38. package/dist/index.d.ts +7 -2
  39. package/dist/index.js +4 -2
  40. package/dist/launcher/commands.d.ts +24 -0
  41. package/dist/launcher/commands.js +260 -0
  42. package/dist/launcher/ensure-config.d.ts +16 -0
  43. package/dist/launcher/ensure-config.js +79 -0
  44. package/dist/launcher/errors.d.ts +12 -0
  45. package/dist/launcher/errors.js +22 -0
  46. package/dist/launcher/host-config.d.ts +17 -0
  47. package/dist/launcher/host-config.js +64 -0
  48. package/dist/launcher/host-state.d.ts +17 -0
  49. package/dist/launcher/host-state.js +61 -0
  50. package/dist/launcher/lifecycle.d.ts +66 -0
  51. package/dist/launcher/lifecycle.js +407 -0
  52. package/dist/launcher/locks.d.ts +26 -0
  53. package/dist/launcher/locks.js +117 -0
  54. package/dist/launcher/logs.d.ts +18 -0
  55. package/dist/launcher/logs.js +117 -0
  56. package/dist/launcher/main.d.ts +2 -0
  57. package/dist/launcher/main.js +66 -0
  58. package/dist/launcher/output.d.ts +11 -0
  59. package/dist/launcher/output.js +68 -0
  60. package/dist/launcher/paths.d.ts +20 -0
  61. package/dist/launcher/paths.js +36 -0
  62. package/dist/launcher/probe.d.ts +23 -0
  63. package/dist/launcher/probe.js +72 -0
  64. package/dist/launcher/protocol.d.ts +62 -0
  65. package/dist/launcher/protocol.js +1 -0
  66. package/dist/launcher/schema-guard.d.ts +6 -0
  67. package/dist/launcher/schema-guard.js +36 -0
  68. package/dist/launcher/spawn.d.ts +22 -0
  69. package/dist/launcher/spawn.js +85 -0
  70. package/dist/launcher/status.d.ts +6 -0
  71. package/dist/launcher/status.js +65 -0
  72. package/dist/mcp/connect.d.ts +1 -0
  73. package/dist/mcp/connect.js +2 -0
  74. package/dist/mcp/pool.d.ts +16 -2
  75. package/dist/mcp/pool.js +54 -19
  76. package/dist/mcp/snapshot.d.ts +4 -0
  77. package/dist/mcp/stdio.d.ts +2 -0
  78. package/dist/mcp/stdio.js +3 -1
  79. package/dist/model/auth-store.d.ts +1 -1
  80. package/dist/model/auth-store.js +2 -2
  81. package/dist/model/models.d.ts +4 -0
  82. package/dist/model/models.js +22 -26
  83. package/dist/model/pi-model.js +1 -1
  84. package/dist/model/settings.d.ts +5 -1
  85. package/dist/model/settings.js +6 -2
  86. package/dist/sandbox/select.d.ts +4 -3
  87. package/dist/sandbox/select.js +15 -9
  88. package/dist/sandbox/share.d.ts +23 -0
  89. package/dist/sandbox/share.js +58 -0
  90. package/dist/tenant/envelope.d.ts +10 -0
  91. package/dist/tenant/envelope.js +54 -0
  92. package/dist/tenant/ephemeral.d.ts +31 -0
  93. package/dist/tenant/ephemeral.js +156 -0
  94. package/dist/tenant/logger.d.ts +9 -0
  95. package/dist/tenant/logger.js +25 -0
  96. package/dist/tenant/migration.d.ts +16 -0
  97. package/dist/tenant/migration.js +116 -0
  98. package/dist/tenant/module.d.ts +17 -0
  99. package/dist/tenant/module.js +315 -0
  100. package/dist/tenant/paths.d.ts +24 -0
  101. package/dist/tenant/paths.js +65 -0
  102. package/dist/tenant/pool.d.ts +10 -0
  103. package/dist/tenant/pool.js +54 -0
  104. package/dist/tenant/principals.d.ts +17 -0
  105. package/dist/tenant/principals.js +44 -0
  106. package/dist/tenant/quarantine-error.d.ts +6 -0
  107. package/dist/tenant/quarantine-error.js +15 -0
  108. package/dist/tenant/quarantine.d.ts +35 -0
  109. package/dist/tenant/quarantine.js +94 -0
  110. package/dist/tenant/reset.d.ts +21 -0
  111. package/dist/tenant/reset.js +125 -0
  112. package/dist/tenant/runtime.d.ts +80 -0
  113. package/dist/tenant/runtime.js +2256 -0
  114. package/dist/tenant/schema.d.ts +23 -0
  115. package/dist/tenant/schema.js +151 -0
  116. package/dist/tenant/status.d.ts +28 -0
  117. package/dist/tenant/status.js +95 -0
  118. package/dist/tenant/store-fs.d.ts +16 -0
  119. package/dist/tenant/store-fs.js +205 -0
  120. package/dist/tenant/store-memory.d.ts +19 -0
  121. package/dist/tenant/store-memory.js +100 -0
  122. package/dist/tenant/types.d.ts +125 -0
  123. package/dist/tenant/types.js +1 -0
  124. package/dist/vault/kek.d.ts +5 -2
  125. package/dist/vault/kek.js +7 -10
  126. package/dist/version.d.ts +1 -1
  127. package/dist/version.js +1 -1
  128. package/package.json +9 -6
  129. package/dist/core/main.js +0 -35
  130. /package/dist/{core/main.d.ts → host/config.js} +0 -0
@@ -0,0 +1,125 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { AdminTenant, AdminTenantStatus, HostAggregate, TenantEnvelope } from "@nylorun/core/contracts";
3
+ import type { FlowLimits } from "../core/limits.js";
4
+ import type { SandboxBackend } from "../sandbox/types.js";
5
+ export type TenantMode = "shared" | "ephemeral" | "test";
6
+ export interface TenantPaths {
7
+ root: string;
8
+ envelope: string;
9
+ database: string;
10
+ lock: string;
11
+ kek: string;
12
+ home: string;
13
+ tmp: string;
14
+ migration: string;
15
+ sandboxes: string;
16
+ pluginData: string;
17
+ logs: string;
18
+ log: string;
19
+ }
20
+ export type TenantModelConfig = {
21
+ kind: "vault";
22
+ } | {
23
+ kind: "gateway";
24
+ url: string;
25
+ model: string;
26
+ } | {
27
+ kind: "fixture";
28
+ } | {
29
+ kind: "scripted";
30
+ output?: string;
31
+ };
32
+ export interface TenantConfig {
33
+ tenantId: string;
34
+ mode: TenantMode;
35
+ paths: TenantPaths;
36
+ sandbox: {
37
+ backend: "auto" | "microsandbox" | "virtual";
38
+ backends?: readonly SandboxBackend[];
39
+ };
40
+ model: TenantModelConfig;
41
+ childEnv: Readonly<Record<string, string>>;
42
+ leaseMs?: number;
43
+ /** Operator flow limits (`RuntimeOptions.flow` / `workflows.md` §13). */
44
+ flow?: Partial<FlowLimits>;
45
+ /**
46
+ * Optional env snapshot for `NYLORUN_FLOW_*`. Host passes this; the Runtime
47
+ * never reads ambient process environment for flow limits.
48
+ */
49
+ flowEnv?: Readonly<Record<string, string | undefined>>;
50
+ vaultFetch?: typeof fetch;
51
+ logger: Logger;
52
+ }
53
+ export interface Logger {
54
+ info(message: string, fields?: Record<string, unknown>): void;
55
+ warn(message: string, fields?: Record<string, unknown>): void;
56
+ error(message: string, fields?: Record<string, unknown>): void;
57
+ }
58
+ export interface TenantSummary {
59
+ ready: boolean;
60
+ runningSessions: number;
61
+ connectedExecutors: number;
62
+ pendingActions: number;
63
+ uncertainEffects: number;
64
+ }
65
+ /** An open Tenant Runtime. Created only by the Tenant module. */
66
+ export interface TenantHandle {
67
+ readonly envelope: TenantEnvelope;
68
+ /** Headers already validated by the Host. Authenticates, authorizes, dispatches. */
69
+ handle(request: IncomingMessage, response: ServerResponse, url: URL): Promise<void>;
70
+ summary(): TenantSummary;
71
+ /** Stop scheduling; wait for or cancel active turns. */
72
+ drain(activeWork: "drain" | "cancel", timeoutMs?: number): Promise<void>;
73
+ close(): Promise<void>;
74
+ }
75
+ export type TenantResolution = {
76
+ kind: "open";
77
+ handle: TenantHandle;
78
+ } | {
79
+ kind: "not-found";
80
+ } | {
81
+ kind: "quarantined";
82
+ quarantine: Quarantine;
83
+ };
84
+ export interface Quarantine {
85
+ code: "locked" | "kek-missing" | "corrupt" | "schema-too-new" | "migration-failed" | "envelope-invalid" | "open-timeout" | "open-failed";
86
+ message: string;
87
+ repair: string;
88
+ lockPath?: string;
89
+ lockPid?: number;
90
+ }
91
+ export interface BootstrapPrincipal {
92
+ principalId: string;
93
+ credentialHash: string;
94
+ idempotencyKey: string;
95
+ }
96
+ /** The deep module (§8). HTTP, CLI and tests use only this. */
97
+ export interface TenantModule {
98
+ start(): Promise<void>;
99
+ readonly started: boolean;
100
+ resolve(id: string): TenantResolution;
101
+ create(input: {
102
+ tenantId: string;
103
+ name: string;
104
+ } & BootstrapPrincipal): Promise<{
105
+ envelope: TenantEnvelope;
106
+ created: boolean;
107
+ }>;
108
+ list(): Promise<readonly AdminTenant[]>;
109
+ status(id: string): Promise<AdminTenantStatus | undefined>;
110
+ delete(id: string, activeWork: "refuse" | "drain" | "cancel"): Promise<void>;
111
+ summarize(): HostAggregate;
112
+ close(): Promise<void>;
113
+ }
114
+ /** Storage adapter behind the module (§8): OSS directory+SQLite, and in-memory for tests. */
115
+ export interface TenantStore {
116
+ enumerate(): Promise<readonly string[]>;
117
+ readEnvelope(id: string): Promise<TenantEnvelope>;
118
+ create(envelope: TenantEnvelope, bootstrap: BootstrapPrincipal): Promise<"created" | "exists">;
119
+ bootstrapMatches(id: string, bootstrap: BootstrapPrincipal): Promise<boolean>;
120
+ open(id: string): Promise<TenantHandle>;
121
+ trash(id: string, now: Date): Promise<void>;
122
+ removePartial(id: string): Promise<void>;
123
+ }
124
+ /** Injected into the store so WS-B can test without WS-A. */
125
+ export type OpenTenantRuntime = (config: TenantConfig) => Promise<TenantHandle>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,9 @@
1
- export declare function defaultKekPath(): string;
1
+ /**
2
+ * Read the Tenant vault KEK from an explicit value or file path.
3
+ * No environment override (A7).
4
+ */
2
5
  export declare function readVaultKek(options: {
3
6
  vaultKek?: Buffer | string | null;
4
- vaultKekPath?: string;
7
+ vaultKekPath: string;
5
8
  }): Buffer | undefined;
6
9
  export declare function createKekFile(path: string): Buffer;
package/dist/vault/kek.js CHANGED
@@ -1,22 +1,19 @@
1
1
  import { randomBytes } from "node:crypto";
2
2
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
- import { dirname, join } from "node:path";
3
+ import { dirname } from "node:path";
4
4
  import { parseKek } from "./crypto.js";
5
- export function defaultKekPath() {
6
- return join(process.cwd(), ".nylorun", "vault-kek");
7
- }
5
+ /**
6
+ * Read the Tenant vault KEK from an explicit value or file path.
7
+ * No environment override (A7).
8
+ */
8
9
  export function readVaultKek(options) {
9
10
  if (options.vaultKek === null)
10
11
  return undefined;
11
12
  if (options.vaultKek !== undefined)
12
13
  return parseKek(options.vaultKek);
13
- const fromEnv = process.env.NYLORUN_VAULT_KEK;
14
- if (fromEnv)
15
- return parseKek(fromEnv);
16
- const path = options.vaultKekPath ?? defaultKekPath();
17
- if (!existsSync(path))
14
+ if (!existsSync(options.vaultKekPath))
18
15
  return undefined;
19
- return parseKek(readFileSync(path, "utf8"));
16
+ return parseKek(readFileSync(options.vaultKekPath, "utf8"));
20
17
  }
21
18
  export function createKekFile(path) {
22
19
  const bytes = randomBytes(32);
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const RUNTIME_VERSION = "0.8.0-beta";
1
+ export declare const RUNTIME_VERSION = "0.10.0-beta";
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Kept in step with package.json by runtime/scripts/check-package.mjs, which runs in npm run check.
2
2
  // release:prepare also rewrites this when it bumps @nylorun/runtime.
3
- export const RUNTIME_VERSION = "0.8.0-beta";
3
+ export const RUNTIME_VERSION = "0.10.0-beta";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nylorun/runtime",
3
- "version": "0.8.0-beta",
3
+ "version": "0.10.0-beta",
4
4
  "description": "SQLite agent execution host and model providers.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -12,6 +12,9 @@
12
12
  "engines": {
13
13
  "node": ">=24.0.0"
14
14
  },
15
+ "bin": {
16
+ "nylorun-runtime": "dist/launcher/main.js"
17
+ },
15
18
  "exports": {
16
19
  ".": {
17
20
  "types": "./dist/index.d.ts",
@@ -25,7 +28,7 @@
25
28
  "types": "./dist/core/runtime.d.ts",
26
29
  "import": "./dist/core/runtime.js"
27
30
  },
28
- "./server": "./dist/core/main.js",
31
+ "./server": "./dist/host/main.js",
29
32
  "./configuration": {
30
33
  "types": "./dist/configuration.d.ts",
31
34
  "import": "./dist/configuration.js"
@@ -43,20 +46,20 @@
43
46
  "provenance": true
44
47
  },
45
48
  "scripts": {
46
- "build": "npm run clean && node ../scripts/check-typescript-version.mjs && tsc -p tsconfig.json",
49
+ "build": "npm run clean && node ../scripts/check-typescript-version.mjs && tsc -p tsconfig.json && node -e \"require('node:fs').chmodSync('dist/launcher/main.js', 0o755)\"",
47
50
  "check": "npm run build && npm test && node scripts/check-package.mjs",
48
51
  "typecheck": "node ../scripts/check-typescript-version.mjs && tsc -p tsconfig.json --noEmit",
49
52
  "test": "vitest run",
50
53
  "prepack": "npm run build",
51
54
  "clean": "node -e \"import('node:fs').then(({rmSync})=>rmSync('dist',{recursive:true,force:true}))\"",
52
- "start": "node dist/core/main.js"
55
+ "start": "node dist/host/main.js"
53
56
  },
54
57
  "dependencies": {
55
58
  "@modelcontextprotocol/sdk": "^1.30.0",
56
59
  "@earendil-works/pi-ai": "0.85.1",
57
60
  "@hono/node-server": "^2.1.1",
58
- "@nylorun/harness": "0.17.0-beta",
59
- "@nylorun/core": "0.3.0-beta",
61
+ "@nylorun/harness": "0.19.0-beta",
62
+ "@nylorun/core": "0.5.0-beta",
60
63
  "just-bash": "3.4.2"
61
64
  },
62
65
  "optionalDependencies": {
package/dist/core/main.js DELETED
@@ -1,35 +0,0 @@
1
- import { startRuntime } from "./runtime.js";
2
- import { gatewayModel, scriptedModel, toolFixtureModel } from "./provider.js";
3
- const serverToken = process.env.NYLORUN_SERVER_KEY;
4
- if (!serverToken)
5
- throw new Error("Set NYLORUN_SERVER_KEY (at least 16 characters)");
6
- const executors = JSON.parse(process.env.NYLORUN_EXECUTORS_JSON ?? "[]");
7
- const useHostModel = process.env.NYLORUN_DEV_MODEL !== "fixture" &&
8
- process.env.NYLORUN_PROJECT_PROVIDER === "1";
9
- const model = useHostModel
10
- ? undefined
11
- : process.env.NYLORUN_DEV_MODEL === "fixture"
12
- ? toolFixtureModel()
13
- : process.env.NYLORUN_MODEL_GATEWAY_URL
14
- ? gatewayModel({
15
- url: process.env.NYLORUN_MODEL_GATEWAY_URL,
16
- token: process.env.NYLORUN_MODEL_GATEWAY_KEY ?? "",
17
- model: process.env.NYLORUN_MODEL ?? "",
18
- })
19
- : scriptedModel(process.env.NYLORUN_SCRIPTED_OUTPUT);
20
- const runtime = await startRuntime({
21
- sqlitePath: process.env.NYLORUN_SQLITE_PATH ?? "./nylorun.sqlite",
22
- serverToken,
23
- executors,
24
- model,
25
- useHostModel,
26
- port: Number(process.env.PORT ?? 8787),
27
- hostname: process.env.HOST ?? "127.0.0.1",
28
- });
29
- console.log(`Nylorun Runtime listening at ${runtime.url}`);
30
- process.send?.({ type: "ready", url: runtime.url });
31
- let closing;
32
- for (const signal of ["SIGINT", "SIGTERM"])
33
- process.on(signal, () => {
34
- closing ??= runtime.close().then(() => { process.exit(0); });
35
- });
File without changes