vector-framework 1.2.2 → 1.2.3

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 (189) hide show
  1. package/README.md +18 -6
  2. package/dist/auth/protected.d.ts +4 -4
  3. package/dist/auth/protected.d.ts.map +1 -1
  4. package/dist/auth/protected.js +10 -7
  5. package/dist/auth/protected.js.map +1 -1
  6. package/dist/cache/manager.d.ts +2 -0
  7. package/dist/cache/manager.d.ts.map +1 -1
  8. package/dist/cache/manager.js +21 -4
  9. package/dist/cache/manager.js.map +1 -1
  10. package/dist/checkpoint/artifacts/compressor.d.ts +5 -0
  11. package/dist/checkpoint/artifacts/compressor.d.ts.map +1 -0
  12. package/dist/checkpoint/artifacts/compressor.js +24 -0
  13. package/dist/checkpoint/artifacts/compressor.js.map +1 -0
  14. package/dist/checkpoint/artifacts/decompress-worker.d.ts +2 -0
  15. package/dist/checkpoint/artifacts/decompress-worker.d.ts.map +1 -0
  16. package/dist/checkpoint/artifacts/decompress-worker.js +31 -0
  17. package/dist/checkpoint/artifacts/decompress-worker.js.map +1 -0
  18. package/dist/checkpoint/artifacts/hasher.d.ts +2 -0
  19. package/dist/checkpoint/artifacts/hasher.d.ts.map +1 -0
  20. package/dist/checkpoint/artifacts/hasher.js +7 -0
  21. package/dist/checkpoint/artifacts/hasher.js.map +1 -0
  22. package/dist/checkpoint/artifacts/manifest.d.ts +6 -0
  23. package/dist/checkpoint/artifacts/manifest.d.ts.map +1 -0
  24. package/dist/checkpoint/artifacts/manifest.js +55 -0
  25. package/dist/checkpoint/artifacts/manifest.js.map +1 -0
  26. package/dist/checkpoint/artifacts/materializer.d.ts +16 -0
  27. package/dist/checkpoint/artifacts/materializer.d.ts.map +1 -0
  28. package/dist/checkpoint/artifacts/materializer.js +168 -0
  29. package/dist/checkpoint/artifacts/materializer.js.map +1 -0
  30. package/dist/checkpoint/artifacts/packager.d.ts +12 -0
  31. package/dist/checkpoint/artifacts/packager.d.ts.map +1 -0
  32. package/dist/checkpoint/artifacts/packager.js +82 -0
  33. package/dist/checkpoint/artifacts/packager.js.map +1 -0
  34. package/dist/checkpoint/artifacts/repository.d.ts +11 -0
  35. package/dist/checkpoint/artifacts/repository.d.ts.map +1 -0
  36. package/dist/checkpoint/artifacts/repository.js +29 -0
  37. package/dist/checkpoint/artifacts/repository.js.map +1 -0
  38. package/dist/checkpoint/artifacts/store.d.ts +13 -0
  39. package/dist/checkpoint/artifacts/store.d.ts.map +1 -0
  40. package/dist/checkpoint/artifacts/store.js +85 -0
  41. package/dist/checkpoint/artifacts/store.js.map +1 -0
  42. package/dist/checkpoint/artifacts/types.d.ts +21 -0
  43. package/dist/checkpoint/artifacts/types.d.ts.map +1 -0
  44. package/dist/checkpoint/artifacts/types.js +2 -0
  45. package/dist/checkpoint/artifacts/types.js.map +1 -0
  46. package/dist/checkpoint/artifacts/worker-decompressor.d.ts +17 -0
  47. package/dist/checkpoint/artifacts/worker-decompressor.d.ts.map +1 -0
  48. package/dist/checkpoint/artifacts/worker-decompressor.js +148 -0
  49. package/dist/checkpoint/artifacts/worker-decompressor.js.map +1 -0
  50. package/dist/checkpoint/asset-store.d.ts +10 -0
  51. package/dist/checkpoint/asset-store.d.ts.map +1 -0
  52. package/dist/checkpoint/asset-store.js +46 -0
  53. package/dist/checkpoint/asset-store.js.map +1 -0
  54. package/dist/checkpoint/bundler.d.ts +15 -0
  55. package/dist/checkpoint/bundler.d.ts.map +1 -0
  56. package/dist/checkpoint/bundler.js +45 -0
  57. package/dist/checkpoint/bundler.js.map +1 -0
  58. package/dist/checkpoint/cli.d.ts +2 -0
  59. package/dist/checkpoint/cli.d.ts.map +1 -0
  60. package/dist/checkpoint/cli.js +157 -0
  61. package/dist/checkpoint/cli.js.map +1 -0
  62. package/dist/checkpoint/entrypoint-generator.d.ts +17 -0
  63. package/dist/checkpoint/entrypoint-generator.d.ts.map +1 -0
  64. package/dist/checkpoint/entrypoint-generator.js +251 -0
  65. package/dist/checkpoint/entrypoint-generator.js.map +1 -0
  66. package/dist/checkpoint/forwarder.d.ts +6 -0
  67. package/dist/checkpoint/forwarder.d.ts.map +1 -0
  68. package/dist/checkpoint/forwarder.js +74 -0
  69. package/dist/checkpoint/forwarder.js.map +1 -0
  70. package/dist/checkpoint/gateway.d.ts +11 -0
  71. package/dist/checkpoint/gateway.d.ts.map +1 -0
  72. package/dist/checkpoint/gateway.js +30 -0
  73. package/dist/checkpoint/gateway.js.map +1 -0
  74. package/dist/checkpoint/ipc.d.ts +12 -0
  75. package/dist/checkpoint/ipc.d.ts.map +1 -0
  76. package/dist/checkpoint/ipc.js +96 -0
  77. package/dist/checkpoint/ipc.js.map +1 -0
  78. package/dist/checkpoint/manager.d.ts +20 -0
  79. package/dist/checkpoint/manager.d.ts.map +1 -0
  80. package/dist/checkpoint/manager.js +214 -0
  81. package/dist/checkpoint/manager.js.map +1 -0
  82. package/dist/checkpoint/process-manager.d.ts +35 -0
  83. package/dist/checkpoint/process-manager.d.ts.map +1 -0
  84. package/dist/checkpoint/process-manager.js +203 -0
  85. package/dist/checkpoint/process-manager.js.map +1 -0
  86. package/dist/checkpoint/resolver.d.ts +25 -0
  87. package/dist/checkpoint/resolver.d.ts.map +1 -0
  88. package/dist/checkpoint/resolver.js +95 -0
  89. package/dist/checkpoint/resolver.js.map +1 -0
  90. package/dist/checkpoint/socket-path.d.ts +2 -0
  91. package/dist/checkpoint/socket-path.d.ts.map +1 -0
  92. package/dist/checkpoint/socket-path.js +51 -0
  93. package/dist/checkpoint/socket-path.js.map +1 -0
  94. package/dist/checkpoint/types.d.ts +54 -0
  95. package/dist/checkpoint/types.d.ts.map +1 -0
  96. package/dist/checkpoint/types.js +2 -0
  97. package/dist/checkpoint/types.js.map +1 -0
  98. package/dist/cli/index.js +10 -2
  99. package/dist/cli/index.js.map +1 -1
  100. package/dist/cli/option-resolution.d.ts +1 -1
  101. package/dist/cli/option-resolution.d.ts.map +1 -1
  102. package/dist/cli/option-resolution.js.map +1 -1
  103. package/dist/cli.js +3709 -328
  104. package/dist/core/config-loader.d.ts +1 -0
  105. package/dist/core/config-loader.d.ts.map +1 -1
  106. package/dist/core/config-loader.js +10 -2
  107. package/dist/core/config-loader.js.map +1 -1
  108. package/dist/core/router.d.ts +24 -3
  109. package/dist/core/router.d.ts.map +1 -1
  110. package/dist/core/router.js +398 -249
  111. package/dist/core/router.js.map +1 -1
  112. package/dist/core/server.d.ts +2 -0
  113. package/dist/core/server.d.ts.map +1 -1
  114. package/dist/core/server.js +22 -8
  115. package/dist/core/server.js.map +1 -1
  116. package/dist/core/vector.d.ts +3 -0
  117. package/dist/core/vector.d.ts.map +1 -1
  118. package/dist/core/vector.js +51 -1
  119. package/dist/core/vector.js.map +1 -1
  120. package/dist/dev/route-scanner.d.ts.map +1 -1
  121. package/dist/dev/route-scanner.js +2 -1
  122. package/dist/dev/route-scanner.js.map +1 -1
  123. package/dist/http.d.ts +32 -7
  124. package/dist/http.d.ts.map +1 -1
  125. package/dist/http.js +144 -13
  126. package/dist/http.js.map +1 -1
  127. package/dist/index.cjs +1297 -74
  128. package/dist/index.d.ts +3 -2
  129. package/dist/index.d.ts.map +1 -1
  130. package/dist/index.js +2 -2
  131. package/dist/index.js.map +1 -1
  132. package/dist/index.mjs +1296 -73
  133. package/dist/middleware/manager.d.ts +3 -3
  134. package/dist/middleware/manager.d.ts.map +1 -1
  135. package/dist/middleware/manager.js +9 -8
  136. package/dist/middleware/manager.js.map +1 -1
  137. package/dist/openapi/docs-ui.d.ts.map +1 -1
  138. package/dist/openapi/docs-ui.js +1097 -61
  139. package/dist/openapi/docs-ui.js.map +1 -1
  140. package/dist/openapi/generator.d.ts +2 -1
  141. package/dist/openapi/generator.d.ts.map +1 -1
  142. package/dist/openapi/generator.js +240 -7
  143. package/dist/openapi/generator.js.map +1 -1
  144. package/dist/types/index.d.ts +71 -28
  145. package/dist/types/index.d.ts.map +1 -1
  146. package/dist/types/index.js +24 -1
  147. package/dist/types/index.js.map +1 -1
  148. package/dist/utils/validation.d.ts.map +1 -1
  149. package/dist/utils/validation.js +3 -2
  150. package/dist/utils/validation.js.map +1 -1
  151. package/package.json +2 -1
  152. package/src/auth/protected.ts +11 -8
  153. package/src/cache/manager.ts +23 -4
  154. package/src/checkpoint/artifacts/compressor.ts +30 -0
  155. package/src/checkpoint/artifacts/decompress-worker.ts +49 -0
  156. package/src/checkpoint/artifacts/hasher.ts +6 -0
  157. package/src/checkpoint/artifacts/manifest.ts +72 -0
  158. package/src/checkpoint/artifacts/materializer.ts +211 -0
  159. package/src/checkpoint/artifacts/packager.ts +100 -0
  160. package/src/checkpoint/artifacts/repository.ts +36 -0
  161. package/src/checkpoint/artifacts/store.ts +102 -0
  162. package/src/checkpoint/artifacts/types.ts +24 -0
  163. package/src/checkpoint/artifacts/worker-decompressor.ts +192 -0
  164. package/src/checkpoint/asset-store.ts +61 -0
  165. package/src/checkpoint/bundler.ts +64 -0
  166. package/src/checkpoint/cli.ts +177 -0
  167. package/src/checkpoint/entrypoint-generator.ts +275 -0
  168. package/src/checkpoint/forwarder.ts +84 -0
  169. package/src/checkpoint/gateway.ts +40 -0
  170. package/src/checkpoint/ipc.ts +107 -0
  171. package/src/checkpoint/manager.ts +254 -0
  172. package/src/checkpoint/process-manager.ts +250 -0
  173. package/src/checkpoint/resolver.ts +124 -0
  174. package/src/checkpoint/socket-path.ts +61 -0
  175. package/src/checkpoint/types.ts +63 -0
  176. package/src/cli/index.ts +11 -2
  177. package/src/cli/option-resolution.ts +5 -1
  178. package/src/core/config-loader.ts +11 -2
  179. package/src/core/router.ts +505 -264
  180. package/src/core/server.ts +36 -9
  181. package/src/core/vector.ts +60 -1
  182. package/src/dev/route-scanner.ts +2 -1
  183. package/src/http.ts +219 -19
  184. package/src/index.ts +3 -2
  185. package/src/middleware/manager.ts +10 -10
  186. package/src/openapi/docs-ui.ts +1097 -61
  187. package/src/openapi/generator.ts +265 -6
  188. package/src/types/index.ts +83 -30
  189. package/src/utils/validation.ts +5 -3
@@ -0,0 +1,96 @@
1
+ const MAX_PENDING_STDOUT_CHARS = 1_048_576; // 1 MiB guard against unbounded startup log lines.
2
+ export function parseIpcLine(line) {
3
+ const trimmed = line.trim();
4
+ if (!trimmed)
5
+ return null;
6
+ if (trimmed === 'READY')
7
+ return { type: 'ready' };
8
+ try {
9
+ return JSON.parse(trimmed);
10
+ }
11
+ catch {
12
+ return null;
13
+ }
14
+ }
15
+ export async function waitForReady(stdout, timeoutMs = 10_000) {
16
+ return new Promise((resolve, reject) => {
17
+ let settled = false;
18
+ const reader = stdout.getReader();
19
+ const decoder = new TextDecoder();
20
+ let buffer = '';
21
+ function settle(fn) {
22
+ if (settled)
23
+ return;
24
+ settled = true;
25
+ clearTimeout(timer);
26
+ try {
27
+ reader.releaseLock();
28
+ }
29
+ catch {
30
+ // Ignore release failures when the reader is already detached.
31
+ }
32
+ fn();
33
+ }
34
+ const timer = setTimeout(() => {
35
+ settle(() => reject(new Error(`Checkpoint process did not become ready within ${timeoutMs}ms`)));
36
+ }, timeoutMs);
37
+ const processLine = (line) => {
38
+ const msg = parseIpcLine(line);
39
+ if (msg?.type === 'ready') {
40
+ settle(() => resolve());
41
+ return 'ready';
42
+ }
43
+ if (msg?.type === 'error') {
44
+ settle(() => reject(new Error(`Checkpoint process error: ${msg.message}`)));
45
+ return 'error';
46
+ }
47
+ return 'continue';
48
+ };
49
+ const processBufferLines = () => {
50
+ let lineEnd = buffer.indexOf('\n');
51
+ while (lineEnd !== -1) {
52
+ const line = buffer.slice(0, lineEnd);
53
+ buffer = buffer.slice(lineEnd + 1);
54
+ const result = processLine(line);
55
+ if (result !== 'continue') {
56
+ return result;
57
+ }
58
+ lineEnd = buffer.indexOf('\n');
59
+ }
60
+ return 'continue';
61
+ };
62
+ // Iterative read loop (not recursive) to avoid stack overflow on large stdout
63
+ (async () => {
64
+ try {
65
+ while (true) {
66
+ const { done, value } = await reader.read();
67
+ if (done) {
68
+ buffer += decoder.decode();
69
+ const lastLine = buffer.trim();
70
+ if (lastLine.length > 0) {
71
+ const result = processLine(lastLine);
72
+ if (result !== 'continue') {
73
+ return;
74
+ }
75
+ }
76
+ settle(() => reject(new Error('Checkpoint process stdout closed before READY signal')));
77
+ return;
78
+ }
79
+ buffer += decoder.decode(value, { stream: true });
80
+ if (buffer.length > MAX_PENDING_STDOUT_CHARS) {
81
+ settle(() => reject(new Error(`Checkpoint process stdout exceeded ${MAX_PENDING_STDOUT_CHARS} chars before READY`)));
82
+ return;
83
+ }
84
+ const result = processBufferLines();
85
+ if (result !== 'continue') {
86
+ return;
87
+ }
88
+ }
89
+ }
90
+ catch (err) {
91
+ settle(() => reject(err));
92
+ }
93
+ })();
94
+ });
95
+ }
96
+ //# sourceMappingURL=ipc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../src/checkpoint/ipc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ActivePointer, CheckpointConfig, CheckpointManifest, CheckpointPublishOptions } from './types';
2
+ export declare class CheckpointManager {
3
+ private storageDir;
4
+ private maxCheckpoints;
5
+ constructor(config?: CheckpointConfig);
6
+ getStorageDir(): string;
7
+ versionDir(version: string): string;
8
+ socketPath(version: string): string;
9
+ ensureStorageDir(): Promise<void>;
10
+ publish(options: CheckpointPublishOptions): Promise<CheckpointManifest>;
11
+ readManifest(version: string): Promise<CheckpointManifest>;
12
+ writeManifest(version: string, manifest: CheckpointManifest): Promise<void>;
13
+ listVersions(): Promise<CheckpointManifest[]>;
14
+ getActive(): Promise<ActivePointer | null>;
15
+ setActive(version: string): Promise<void>;
16
+ remove(version: string): Promise<void>;
17
+ pruneOld(): Promise<void>;
18
+ private normalizeManifest;
19
+ }
20
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/checkpoint/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAwB7G,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,GAAE,gBAAqB;IAKzC,aAAa,IAAI,MAAM;IAIvB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAInC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI7B,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC,OAAO,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAkEvE,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAM1D,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3E,YAAY,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAyB7C,SAAS,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAc1C,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBzC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAetC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB/B,OAAO,CAAC,iBAAiB;CA0B1B"}
@@ -0,0 +1,214 @@
1
+ import { existsSync, promises as fs } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { CHECKPOINT_FORMAT_VERSION } from './types';
4
+ import { AssetStore } from './asset-store';
5
+ import { CheckpointBundler } from './bundler';
6
+ import { CheckpointEntrypointGenerator } from './entrypoint-generator';
7
+ import { CheckpointPackager } from './artifacts/packager';
8
+ import { resolveCheckpointSocketPath } from './socket-path';
9
+ const DEFAULT_STORAGE_DIR = '.vector/checkpoints';
10
+ const ACTIVE_POINTER_FILE = 'active.json';
11
+ function inferLegacyAssetCodec(asset) {
12
+ if (asset.codec) {
13
+ return asset.codec;
14
+ }
15
+ const rawPath = (asset.blobPath ?? asset.storedPath ?? '').trim().toLowerCase();
16
+ return rawPath.endsWith('.gz') ? 'gzip' : 'none';
17
+ }
18
+ export class CheckpointManager {
19
+ storageDir;
20
+ maxCheckpoints;
21
+ constructor(config = {}) {
22
+ this.storageDir = resolve(process.cwd(), config.storageDir ?? DEFAULT_STORAGE_DIR);
23
+ this.maxCheckpoints = config.maxCheckpoints ?? 10;
24
+ }
25
+ getStorageDir() {
26
+ return this.storageDir;
27
+ }
28
+ versionDir(version) {
29
+ return join(this.storageDir, version);
30
+ }
31
+ socketPath(version) {
32
+ return resolveCheckpointSocketPath(this.storageDir, version);
33
+ }
34
+ async ensureStorageDir() {
35
+ await fs.mkdir(this.storageDir, { recursive: true });
36
+ }
37
+ async publish(options) {
38
+ await this.ensureStorageDir();
39
+ const versionDir = this.versionDir(options.version);
40
+ await fs.mkdir(versionDir, { recursive: true });
41
+ // Generate entrypoint
42
+ const generator = new CheckpointEntrypointGenerator();
43
+ const entrypointPath = await generator.generate({
44
+ version: options.version,
45
+ outputDir: versionDir,
46
+ routesDir: resolve(process.cwd(), options.routesDir),
47
+ socketPath: this.socketPath(options.version),
48
+ });
49
+ // Bundle
50
+ const bundler = new CheckpointBundler();
51
+ const bundleResult = await bundler.bundle({
52
+ entrypointPath,
53
+ outputDir: versionDir,
54
+ });
55
+ // Collect assets
56
+ const assetStore = new AssetStore(this.storageDir);
57
+ const assets = await assetStore.collect(options.embeddedAssetPaths ?? [], options.sidecarAssetPaths ?? []);
58
+ assetStore.validateBudgets(assets);
59
+ // Build manifest
60
+ const manifest = {
61
+ formatVersion: CHECKPOINT_FORMAT_VERSION,
62
+ version: options.version,
63
+ createdAt: new Date().toISOString(),
64
+ entrypoint: 'checkpoint.js',
65
+ routes: generator.getDiscoveredRoutes(),
66
+ assets,
67
+ bundleHash: bundleResult.hash,
68
+ bundleSize: bundleResult.size,
69
+ checkpointArchivePath: undefined,
70
+ checkpointArchiveHash: undefined,
71
+ checkpointArchiveSize: undefined,
72
+ checkpointArchiveCodec: undefined,
73
+ };
74
+ await this.writeManifest(options.version, manifest);
75
+ // Clean up entrypoint source (keep only the bundle)
76
+ try {
77
+ await fs.unlink(entrypointPath);
78
+ }
79
+ catch {
80
+ // Ignore cleanup failures
81
+ }
82
+ // Package checkpoint folder with compression for local transport workflows.
83
+ const packager = new CheckpointPackager(this.storageDir);
84
+ const archive = await packager.packageVersion(options.version);
85
+ manifest.checkpointArchivePath = archive.archivePath;
86
+ manifest.checkpointArchiveHash = archive.archiveHash;
87
+ manifest.checkpointArchiveSize = archive.archiveSize;
88
+ manifest.checkpointArchiveCodec = archive.codec;
89
+ await this.writeManifest(options.version, manifest);
90
+ await this.pruneOld();
91
+ return manifest;
92
+ }
93
+ async readManifest(version) {
94
+ const manifestPath = join(this.versionDir(version), 'manifest.json');
95
+ const content = await fs.readFile(manifestPath, 'utf-8');
96
+ return this.normalizeManifest(JSON.parse(content));
97
+ }
98
+ async writeManifest(version, manifest) {
99
+ const manifestPath = join(this.versionDir(version), 'manifest.json');
100
+ await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');
101
+ }
102
+ async listVersions() {
103
+ if (!existsSync(this.storageDir)) {
104
+ return [];
105
+ }
106
+ const entries = await fs.readdir(this.storageDir);
107
+ const manifests = [];
108
+ for (const entry of entries) {
109
+ const manifestPath = join(this.storageDir, entry, 'manifest.json');
110
+ if (existsSync(manifestPath)) {
111
+ try {
112
+ const content = await fs.readFile(manifestPath, 'utf-8');
113
+ manifests.push(this.normalizeManifest(JSON.parse(content)));
114
+ }
115
+ catch {
116
+ // Skip corrupted manifests
117
+ }
118
+ }
119
+ }
120
+ // Sort by createdAt descending (newest first)
121
+ manifests.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
122
+ return manifests;
123
+ }
124
+ async getActive() {
125
+ const pointerPath = join(this.storageDir, ACTIVE_POINTER_FILE);
126
+ if (!existsSync(pointerPath)) {
127
+ return null;
128
+ }
129
+ try {
130
+ const content = await fs.readFile(pointerPath, 'utf-8');
131
+ return JSON.parse(content);
132
+ }
133
+ catch {
134
+ return null;
135
+ }
136
+ }
137
+ async setActive(version) {
138
+ // Verify version exists
139
+ const versionDir = this.versionDir(version);
140
+ if (!existsSync(versionDir)) {
141
+ throw new Error(`Checkpoint version ${version} does not exist`);
142
+ }
143
+ const manifestPath = join(versionDir, 'manifest.json');
144
+ if (!existsSync(manifestPath)) {
145
+ throw new Error(`Checkpoint version ${version} has no manifest`);
146
+ }
147
+ await this.ensureStorageDir();
148
+ const pointer = {
149
+ version,
150
+ activatedAt: new Date().toISOString(),
151
+ };
152
+ const pointerPath = join(this.storageDir, ACTIVE_POINTER_FILE);
153
+ await fs.writeFile(pointerPath, JSON.stringify(pointer, null, 2), 'utf-8');
154
+ }
155
+ async remove(version) {
156
+ // Check if this is the active version
157
+ const active = await this.getActive();
158
+ if (active?.version === version) {
159
+ throw new Error(`Cannot remove active checkpoint version ${version}. Rollback to a different version first.`);
160
+ }
161
+ const versionDir = this.versionDir(version);
162
+ if (!existsSync(versionDir)) {
163
+ throw new Error(`Checkpoint version ${version} does not exist`);
164
+ }
165
+ await fs.rm(versionDir, { recursive: true, force: true });
166
+ }
167
+ async pruneOld() {
168
+ if (this.maxCheckpoints <= 0)
169
+ return;
170
+ const manifests = await this.listVersions();
171
+ if (manifests.length <= this.maxCheckpoints)
172
+ return;
173
+ const active = await this.getActive();
174
+ const toRemove = manifests.slice(this.maxCheckpoints);
175
+ for (const manifest of toRemove) {
176
+ // Never remove the active version
177
+ if (active?.version === manifest.version)
178
+ continue;
179
+ try {
180
+ const versionDir = this.versionDir(manifest.version);
181
+ await fs.rm(versionDir, { recursive: true, force: true });
182
+ }
183
+ catch {
184
+ // Ignore removal failures during pruning
185
+ }
186
+ }
187
+ }
188
+ normalizeManifest(manifest) {
189
+ const normalizedAssets = (manifest.assets ?? []).map((asset) => ({
190
+ ...asset,
191
+ contentHash: asset.contentHash ?? asset.hash,
192
+ contentSize: asset.contentSize ?? asset.size,
193
+ blobPath: asset.blobPath ?? asset.storedPath,
194
+ blobHash: asset.blobHash,
195
+ blobSize: asset.blobSize,
196
+ codec: inferLegacyAssetCodec(asset),
197
+ }));
198
+ return {
199
+ formatVersion: manifest.formatVersion ?? CHECKPOINT_FORMAT_VERSION,
200
+ version: manifest.version ?? 'unknown',
201
+ createdAt: manifest.createdAt ?? new Date(0).toISOString(),
202
+ entrypoint: manifest.entrypoint ?? 'checkpoint.js',
203
+ routes: manifest.routes ?? [],
204
+ assets: normalizedAssets,
205
+ bundleHash: manifest.bundleHash ?? '',
206
+ bundleSize: manifest.bundleSize ?? 0,
207
+ checkpointArchivePath: manifest.checkpointArchivePath,
208
+ checkpointArchiveHash: manifest.checkpointArchiveHash,
209
+ checkpointArchiveSize: manifest.checkpointArchiveSize,
210
+ checkpointArchiveCodec: manifest.checkpointArchiveCodec,
211
+ };
212
+ }
213
+ }
214
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/checkpoint/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { CheckpointManifest } from './types';
2
+ export interface SpawnedCheckpoint {
3
+ version: string;
4
+ socketPath: string;
5
+ process: ReturnType<typeof Bun.spawn>;
6
+ pid: number;
7
+ }
8
+ export interface CheckpointProcessManagerOptions {
9
+ readyTimeoutMs?: number;
10
+ idleTimeoutMs?: number;
11
+ }
12
+ export declare class CheckpointProcessManager {
13
+ private running;
14
+ private pending;
15
+ private readyTimeoutMs;
16
+ private idleTimeoutMs;
17
+ private idleTimers;
18
+ private lastUsedAt;
19
+ private materializer;
20
+ constructor(options?: number | CheckpointProcessManagerOptions);
21
+ spawn(manifest: CheckpointManifest, storageDir: string): Promise<SpawnedCheckpoint>;
22
+ private doSpawn;
23
+ markUsed(version: string): void;
24
+ stop(version: string): Promise<void>;
25
+ stopAll(): Promise<void>;
26
+ isRunning(version: string): boolean;
27
+ getRunning(version: string): SpawnedCheckpoint | undefined;
28
+ health(version: string): Promise<boolean>;
29
+ getRunningVersions(): string[];
30
+ private scheduleIdleCheck;
31
+ private handleIdleCheck;
32
+ private clearIdleTimer;
33
+ private tryUnlinkSocket;
34
+ }
35
+ //# sourceMappingURL=process-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-manager.d.ts","sourceRoot":"","sources":["../../src/checkpoint/process-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAKlD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,UAAU,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACtC,GAAG,EAAE,MAAM,CAAC;CACb;AAMD,MAAM,WAAW,+BAA+B;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,wBAAwB;IACnC,OAAO,CAAC,OAAO,CAA6C;IAC5D,OAAO,CAAC,OAAO,CAAsD;IACrE,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,UAAU,CAAyD;IAC3E,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,YAAY,CAAiC;gBAEzC,OAAO,GAAE,MAAM,GAAG,+BAA0D;IAYlF,KAAK,CAAC,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAsB3E,OAAO;IAsDrB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOzB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BpC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAInC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIpD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe/C,kBAAkB,IAAI,MAAM,EAAE;IAI9B,OAAO,CAAC,iBAAiB;YAoBX,eAAe;IAqB7B,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,eAAe;CASxB"}
@@ -0,0 +1,203 @@
1
+ import { existsSync, promises as fs, unlinkSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { waitForReady } from './ipc';
4
+ import { CheckpointArtifactMaterializer } from './artifacts/materializer';
5
+ import { resolveCheckpointSocketPath } from './socket-path';
6
+ const DEFAULT_READY_TIMEOUT_MS = 10_000;
7
+ const DEFAULT_IDLE_TIMEOUT_MS = 10 * 60 * 1000;
8
+ const STOP_TIMEOUT_MS = 5_000;
9
+ export class CheckpointProcessManager {
10
+ running = new Map();
11
+ pending = new Map();
12
+ readyTimeoutMs;
13
+ idleTimeoutMs;
14
+ idleTimers = new Map();
15
+ lastUsedAt = new Map();
16
+ materializer;
17
+ constructor(options = DEFAULT_READY_TIMEOUT_MS) {
18
+ if (typeof options === 'number') {
19
+ this.readyTimeoutMs = options;
20
+ this.idleTimeoutMs = DEFAULT_IDLE_TIMEOUT_MS;
21
+ }
22
+ else {
23
+ this.readyTimeoutMs = options.readyTimeoutMs ?? DEFAULT_READY_TIMEOUT_MS;
24
+ this.idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS;
25
+ }
26
+ this.materializer = new CheckpointArtifactMaterializer();
27
+ }
28
+ async spawn(manifest, storageDir) {
29
+ // Return already-running checkpoint
30
+ if (this.running.has(manifest.version)) {
31
+ return this.running.get(manifest.version);
32
+ }
33
+ // Return in-flight spawn to prevent duplicate processes for same version
34
+ if (this.pending.has(manifest.version)) {
35
+ return this.pending.get(manifest.version);
36
+ }
37
+ const promise = this.doSpawn(manifest, storageDir);
38
+ this.pending.set(manifest.version, promise);
39
+ try {
40
+ const result = await promise;
41
+ return result;
42
+ }
43
+ finally {
44
+ this.pending.delete(manifest.version);
45
+ }
46
+ }
47
+ async doSpawn(manifest, storageDir) {
48
+ const versionDir = join(storageDir, manifest.version);
49
+ const bundlePath = join(versionDir, manifest.entrypoint);
50
+ const socketPath = resolveCheckpointSocketPath(storageDir, manifest.version);
51
+ if (!existsSync(bundlePath)) {
52
+ throw new Error(`Checkpoint bundle not found: ${bundlePath}`);
53
+ }
54
+ // Materialize declared assets into the checkpoint version directory before boot.
55
+ await this.materializer.materialize(manifest, storageDir);
56
+ // Ensure socket parent exists when fallback roots are used.
57
+ await fs.mkdir(dirname(socketPath), { recursive: true });
58
+ // Clean up stale socket file if it exists
59
+ this.tryUnlinkSocket(socketPath);
60
+ const proc = Bun.spawn(['bun', 'run', bundlePath], {
61
+ env: {
62
+ ...process.env,
63
+ VECTOR_CHECKPOINT_SOCKET: socketPath,
64
+ VECTOR_CHECKPOINT_VERSION: manifest.version,
65
+ },
66
+ stdout: 'pipe',
67
+ stderr: 'inherit',
68
+ });
69
+ // Guard against null stdout (shouldn't happen with stdout: 'pipe' but be safe)
70
+ if (!proc.stdout) {
71
+ proc.kill('SIGTERM');
72
+ throw new Error(`Checkpoint process for ${manifest.version} did not provide stdout`);
73
+ }
74
+ try {
75
+ await waitForReady(proc.stdout, this.readyTimeoutMs);
76
+ }
77
+ catch (err) {
78
+ proc.kill('SIGTERM');
79
+ throw err;
80
+ }
81
+ const spawned = {
82
+ version: manifest.version,
83
+ socketPath,
84
+ process: proc,
85
+ pid: proc.pid,
86
+ };
87
+ this.running.set(manifest.version, spawned);
88
+ this.lastUsedAt.set(manifest.version, Date.now());
89
+ this.scheduleIdleCheck(manifest.version);
90
+ return spawned;
91
+ }
92
+ markUsed(version) {
93
+ if (!this.running.has(version)) {
94
+ return;
95
+ }
96
+ this.lastUsedAt.set(version, Date.now());
97
+ }
98
+ async stop(version) {
99
+ const snap = this.running.get(version);
100
+ if (!snap)
101
+ return;
102
+ this.running.delete(version);
103
+ this.clearIdleTimer(version);
104
+ this.lastUsedAt.delete(version);
105
+ snap.process.kill('SIGTERM');
106
+ // Wait for exit with a timeout
107
+ const exited = await Promise.race([
108
+ snap.process.exited.then(() => true),
109
+ new Promise((resolve) => setTimeout(() => resolve(false), STOP_TIMEOUT_MS)),
110
+ ]);
111
+ // Force kill if SIGTERM didn't work
112
+ if (!exited) {
113
+ try {
114
+ snap.process.kill('SIGKILL');
115
+ await snap.process.exited;
116
+ }
117
+ catch {
118
+ // Process may have already exited between the check and SIGKILL
119
+ }
120
+ }
121
+ this.tryUnlinkSocket(snap.socketPath);
122
+ }
123
+ async stopAll() {
124
+ const versions = [...this.running.keys()];
125
+ for (const version of versions) {
126
+ await this.stop(version);
127
+ }
128
+ }
129
+ isRunning(version) {
130
+ return this.running.has(version);
131
+ }
132
+ getRunning(version) {
133
+ return this.running.get(version);
134
+ }
135
+ async health(version) {
136
+ const snap = this.running.get(version);
137
+ if (!snap)
138
+ return false;
139
+ try {
140
+ const response = await fetch('http://localhost/_vector/health', {
141
+ unix: snap.socketPath,
142
+ signal: AbortSignal.timeout(2000),
143
+ });
144
+ return response.ok;
145
+ }
146
+ catch {
147
+ return false;
148
+ }
149
+ }
150
+ getRunningVersions() {
151
+ return [...this.running.keys()];
152
+ }
153
+ scheduleIdleCheck(version, delayMs = this.idleTimeoutMs) {
154
+ this.clearIdleTimer(version);
155
+ if (this.idleTimeoutMs <= 0) {
156
+ return;
157
+ }
158
+ const timer = setTimeout(() => {
159
+ void this.handleIdleCheck(version);
160
+ }, Math.max(1, delayMs));
161
+ if (typeof timer.unref === 'function') {
162
+ timer.unref();
163
+ }
164
+ this.idleTimers.set(version, timer);
165
+ }
166
+ async handleIdleCheck(version) {
167
+ if (!this.running.has(version)) {
168
+ return;
169
+ }
170
+ const lastUsedAt = this.lastUsedAt.get(version) ?? 0;
171
+ const idleForMs = Date.now() - lastUsedAt;
172
+ const remainingMs = this.idleTimeoutMs - idleForMs;
173
+ if (remainingMs > 0) {
174
+ this.scheduleIdleCheck(version, remainingMs);
175
+ return;
176
+ }
177
+ try {
178
+ await this.stop(version);
179
+ }
180
+ catch (error) {
181
+ console.error(`[CheckpointProcessManager] Failed to stop idle checkpoint ${version}:`, error);
182
+ }
183
+ }
184
+ clearIdleTimer(version) {
185
+ const timer = this.idleTimers.get(version);
186
+ if (!timer) {
187
+ return;
188
+ }
189
+ clearTimeout(timer);
190
+ this.idleTimers.delete(version);
191
+ }
192
+ tryUnlinkSocket(socketPath) {
193
+ try {
194
+ if (existsSync(socketPath)) {
195
+ unlinkSync(socketPath);
196
+ }
197
+ }
198
+ catch {
199
+ // Ignore cleanup failures
200
+ }
201
+ }
202
+ }
203
+ //# sourceMappingURL=process-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../../src/checkpoint/process-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { CheckpointManager } from './manager';
2
+ import type { CheckpointProcessManager } from './process-manager';
3
+ export interface CheckpointResolverOptions {
4
+ versionHeader?: string;
5
+ cacheKeyOverride?: boolean;
6
+ }
7
+ export declare class CheckpointResolver {
8
+ private manager;
9
+ private processManager;
10
+ private versionHeader;
11
+ private cacheKeyOverride;
12
+ private allowFallbackVersionHeader;
13
+ private pendingVersionResolves;
14
+ constructor(manager: CheckpointManager, processManager: CheckpointProcessManager, options?: CheckpointResolverOptions);
15
+ resolve(request: Request): Promise<string | null>;
16
+ getRequestedVersion(request: Request): string | null;
17
+ getCacheKeyOverrideValue(request: Request): string | null;
18
+ private getRequestedHeader;
19
+ private resolveVersion;
20
+ /**
21
+ * Legacy no-op retained for compatibility with tests and existing integrations.
22
+ */
23
+ invalidateCache(): void;
24
+ }
25
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/checkpoint/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAKlE,MAAM,WAAW,yBAAyB;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,gBAAgB,CAAU;IAClC,OAAO,CAAC,0BAA0B,CAAU;IAC5C,OAAO,CAAC,sBAAsB,CAAkD;gBAG9E,OAAO,EAAE,iBAAiB,EAC1B,cAAc,EAAE,wBAAwB,EACxC,OAAO,GAAE,yBAA8B;IASnC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQvD,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAIpD,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAazD,OAAO,CAAC,kBAAkB;YAgBZ,cAAc;IAwC5B;;OAEG;IACH,eAAe,IAAI,IAAI;CAGxB"}