@promptframe/cli 0.1.60 → 0.1.64

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 (44) hide show
  1. package/README.md +38 -1
  2. package/dist/development-build-worker.d.ts +2 -0
  3. package/dist/development-build-worker.d.ts.map +1 -0
  4. package/dist/development-build-worker.js +184 -0
  5. package/dist/development-build-worker.js.map +1 -0
  6. package/dist/development-build.d.ts +22 -0
  7. package/dist/development-build.d.ts.map +1 -0
  8. package/dist/development-build.js +66 -0
  9. package/dist/development-build.js.map +1 -0
  10. package/dist/development-coordinator.d.ts +26 -0
  11. package/dist/development-coordinator.d.ts.map +1 -0
  12. package/dist/development-coordinator.js +114 -0
  13. package/dist/development-coordinator.js.map +1 -0
  14. package/dist/development-css.d.ts +10 -0
  15. package/dist/development-css.d.ts.map +1 -0
  16. package/dist/development-css.js +65 -0
  17. package/dist/development-css.js.map +1 -0
  18. package/dist/development-files.d.ts +6 -0
  19. package/dist/development-files.d.ts.map +1 -0
  20. package/dist/development-files.js +70 -0
  21. package/dist/development-files.js.map +1 -0
  22. package/dist/development-owner.d.ts +22 -0
  23. package/dist/development-owner.d.ts.map +1 -0
  24. package/dist/development-owner.js +253 -0
  25. package/dist/development-owner.js.map +1 -0
  26. package/dist/development-process.d.ts +15 -0
  27. package/dist/development-process.d.ts.map +1 -0
  28. package/dist/development-process.js +65 -0
  29. package/dist/development-process.js.map +1 -0
  30. package/dist/development-revisions.d.ts +58 -0
  31. package/dist/development-revisions.d.ts.map +1 -0
  32. package/dist/development-revisions.js +130 -0
  33. package/dist/development-revisions.js.map +1 -0
  34. package/dist/development-validation.d.ts +22 -0
  35. package/dist/development-validation.d.ts.map +1 -0
  36. package/dist/development-validation.js +122 -0
  37. package/dist/development-validation.js.map +1 -0
  38. package/dist/development-workspace.d.ts +37 -0
  39. package/dist/development-workspace.d.ts.map +1 -0
  40. package/dist/development-workspace.js +402 -0
  41. package/dist/development-workspace.js.map +1 -0
  42. package/dist/index.js +84 -1
  43. package/dist/index.js.map +1 -1
  44. package/package.json +10 -4
@@ -0,0 +1,402 @@
1
+ import { randomBytes, timingSafeEqual } from 'node:crypto';
2
+ import { existsSync, lstatSync, opendirSync, realpathSync } from 'node:fs';
3
+ import { createServer as createHttpServer } from 'node:http';
4
+ import { dirname, join, posix, relative, resolve, sep } from 'node:path';
5
+ import { createServer as createViteServer } from 'vite';
6
+ import { buildDevelopmentContents } from './development-build.js';
7
+ import { DevelopmentModuleCoordinator } from './development-coordinator.js';
8
+ import { captureDevelopmentFiles } from './development-files.js';
9
+ import { DevelopmentContents } from './development-revisions.js';
10
+ const excluded = new Set(['node_modules', 'dist', '.git', '.component-packages', '.promptframe']);
11
+ const limits = { maximumFiles: 2048, maximumBytes: 16 * 1024 * 1024 };
12
+ const lockfiles = ['package-lock.json', 'npm-shrinkwrap.json', 'pnpm-lock.yaml', 'yarn.lock', 'bun.lock', 'bun.lockb'];
13
+ /** One capture includes the module and its real shared pnpm lock bytes. Source
14
+ * aliases/parent imports remain explicitly unsupported by the common policy. */
15
+ export function captureDevelopmentModule(root, module) {
16
+ if (!module.path || module.path.includes('\\') || posix.isAbsolute(module.path)
17
+ || /^[A-Za-z]:/u.test(module.path)
18
+ || posix.normalize(module.path) !== module.path || module.path.split('/').some(part => !part || part === '.' || part === '..')) {
19
+ throw new Error('development.workspace.invalid_path');
20
+ }
21
+ const base = realpathSync(root), directory = resolve(base, module.path);
22
+ for (let path = directory; path !== base; path = dirname(path)) {
23
+ if (lstatSync(path).isSymbolicLink())
24
+ throw new Error('development.capture.symlink');
25
+ }
26
+ const names = [];
27
+ let entries = 0;
28
+ const walk = (directory, prefix, depth) => {
29
+ if (depth > 32)
30
+ throw new Error('development.capture.directory_limit');
31
+ const handle = opendirSync(directory);
32
+ try {
33
+ for (let entry = handle.readSync(); entry; entry = handle.readSync()) {
34
+ if (++entries > 8192)
35
+ throw new Error('development.capture.directory_limit');
36
+ if (excluded.has(entry.name))
37
+ continue;
38
+ const path = join(directory, entry.name), name = prefix + entry.name;
39
+ if (entry.isSymbolicLink())
40
+ throw new Error('development.capture.symlink');
41
+ if (entry.isDirectory())
42
+ walk(path, name + '/', depth + 1);
43
+ else if (entry.isFile()) {
44
+ names.push(name);
45
+ if (names.length > limits.maximumFiles)
46
+ throw new Error('development.contents.file_count');
47
+ }
48
+ else
49
+ throw new Error('development.capture.not_file');
50
+ }
51
+ }
52
+ finally {
53
+ handle.closeSync();
54
+ }
55
+ };
56
+ walk(directory, '', 0);
57
+ const sharedLock = !lockfiles.some(name => names.includes(name))
58
+ && existsSync(join(base, 'pnpm-workspace.yaml')) && existsSync(join(base, 'pnpm-lock.yaml'));
59
+ const prefix = module.path + '/';
60
+ const paths = names.map(name => prefix + name);
61
+ if (sharedLock)
62
+ paths.push('pnpm-workspace.yaml', 'pnpm-lock.yaml');
63
+ paths.push('promptframe-workspace.json');
64
+ const captured = captureDevelopmentFiles(base, paths, limits);
65
+ const normalized = new DevelopmentContents(captured.readFiles().map(file => ({
66
+ path: file.path.startsWith(prefix) ? file.path.slice(prefix.length)
67
+ : file.path === 'promptframe-workspace.json' ? 'promptframe-workspace.captured.json' : file.path,
68
+ bytes: file.bytes,
69
+ })), limits);
70
+ const manifest = normalized.readFiles().find(file => file.path === 'manifest.json');
71
+ if (!manifest || JSON.parse(Buffer.from(manifest.bytes).toString()).id !== module.id) {
72
+ throw new Error('development.workspace.manifest_id_mismatch');
73
+ }
74
+ const declaration = normalized.readFiles().find(file => file.path === 'promptframe-workspace.captured.json');
75
+ const workspace = JSON.parse(Buffer.from(declaration.bytes).toString());
76
+ if (workspace.schemaVersion !== 'promptframe-workspace.v0.1.0' || !Array.isArray(workspace.components)
77
+ || !workspace.components.some(entry => entry?.id === module.id && entry.path === module.path)) {
78
+ throw new Error('development.workspace.declaration_changed');
79
+ }
80
+ return normalized;
81
+ }
82
+ /** A single root Vite watcher plus a closed HTTP surface. Vite's raw-source,
83
+ * HTML, /@fs, HMR and plugin/config serving middleware is never attached. */
84
+ export async function startDevelopmentWorkspace(options) {
85
+ const root = realpathSync(options.root), origin = new URL(options.studioOrigin);
86
+ const host = options.host ?? '127.0.0.1', port = options.port ?? 0;
87
+ if (!['http:', 'https:'].includes(origin.protocol) || origin.username || origin.password
88
+ || origin.pathname !== '/' || origin.search || origin.hash || origin.origin === 'null') {
89
+ throw new Error('development.connection.invalid_origin');
90
+ }
91
+ if (!['127.0.0.1', '::1'].includes(host) || !Number.isSafeInteger(port) || port < 0 || port > 65535) {
92
+ throw new Error('development.connection.invalid_address');
93
+ }
94
+ if (!options.modules.length || options.modules.length > 32)
95
+ throw new Error('development.registry.module_limit');
96
+ const modules = new Map(options.modules.map(module => [module.id, Object.freeze({ ...module })]));
97
+ for (const module of modules.values()) {
98
+ if (typeof module.id !== 'string' || !module.id.trim() || module.id.length > 256 || /[\u0000-\u001f]/u.test(module.id)) {
99
+ throw new Error('development.module.invalid_identity');
100
+ }
101
+ }
102
+ if (modules.size !== options.modules.length || new Set([...modules.values()].map(module => module.path)).size !== modules.size) {
103
+ throw new Error('development.registry.duplicate_module');
104
+ }
105
+ const credential = randomBytes(32).toString('hex'), connectionId = options.connectionId ?? randomBytes(16).toString('hex');
106
+ const idleTimeoutMs = options.idleTimeoutMs ?? 30 * 60_000, heartbeatMs = options.heartbeatMs ?? 25_000;
107
+ if (!/^[a-f0-9]{32}$/u.test(connectionId) || !Number.isSafeInteger(idleTimeoutMs) || idleTimeoutMs < 0 || !Number.isSafeInteger(heartbeatMs) || heartbeatMs < 1)
108
+ throw Error('development.connection.invalid_lifecycle');
109
+ const lifecycle = { mode: 'until_stopped', idleTimeoutSeconds: idleTimeoutMs / 1000, heartbeatSeconds: heartbeatMs / 1000 };
110
+ let lastActivity = performance.now(), activeRequests = 0;
111
+ const controller = new AbortController(), listeners = new Set();
112
+ const pending = new Set(), resident = new Map();
113
+ let pumping, checkingId;
114
+ let closed = false, expectedHost = '', responseBytes = 0, watcherDiagnostic;
115
+ const coordinator = new DevelopmentModuleCoordinator({ maximumModules: 32,
116
+ capture(id) {
117
+ const module = modules.get(id);
118
+ if (!module)
119
+ throw new Error('development.workspace.module_missing');
120
+ return captureDevelopmentModule(root, module);
121
+ },
122
+ async build(source, compilerOptions) {
123
+ const built = await buildDevelopmentContents(source, compilerOptions);
124
+ // Include the old checked output while a replacement is still pending.
125
+ if ([...resident.values()].reduce((a, b) => a + b, 0) + built.artifacts.byteLength > 64 * 1024 * 1024) {
126
+ throw new Error('development.workspace.artifact_budget');
127
+ }
128
+ return built;
129
+ },
130
+ });
131
+ const registry = () => ({ contractVersion: 'promptframe-development.v2', connectionId,
132
+ lifecycle, watcherDiagnostic, modules: [...modules.keys()].map(id => {
133
+ const state = coordinator.state(id), receipt = coordinator.buildReceipt(id);
134
+ const checking = pending.has(id) || checkingId === id;
135
+ return { moduleId: id, status: checking ? 'checking' : state?.status ?? 'checking',
136
+ sourceRevision: !checking || state?.status === 'checking' ? state?.sourceRevision : undefined,
137
+ diagnostic: state?.diagnostic, ...(state?.lastChecked && receipt ? { lastChecked: {
138
+ sourceRevision: state.lastChecked.sourceRevision, artifactRevision: receipt.artifacts.revision,
139
+ checkerKey: state.lastChecked.checkerKey, entries: receipt.entries, runtimeImports: receipt.runtimeImports,
140
+ } } : {}) };
141
+ }) });
142
+ const notify = () => {
143
+ const data = `event: registry\ndata: ${JSON.stringify(registry())}\n\n`;
144
+ for (const listener of listeners) {
145
+ try {
146
+ if (!listener.write(data))
147
+ listener.destroy();
148
+ }
149
+ catch {
150
+ listener.destroy();
151
+ }
152
+ }
153
+ };
154
+ const enqueue = (id) => {
155
+ if (closed || !modules.has(id))
156
+ return;
157
+ pending.add(id);
158
+ if (pumping)
159
+ return;
160
+ // One compiler at a time; a failing module never removes another's output.
161
+ pumping = Promise.resolve().then(async () => {
162
+ while (pending.size && !closed) {
163
+ const id = pending.values().next().value;
164
+ pending.delete(id);
165
+ checkingId = id;
166
+ const job = coordinator.refresh(id, { signal: controller.signal });
167
+ notify();
168
+ if (await job)
169
+ resident.set(id, coordinator.buildReceipt(id).artifacts.byteLength);
170
+ checkingId = undefined;
171
+ notify();
172
+ }
173
+ }).catch(() => { void close('fatal').catch(() => undefined); }).finally(() => { pumping = undefined; });
174
+ };
175
+ // Explicit reads recapture too. Watch delivery/debounce is never authority.
176
+ const observe = (onlyId) => {
177
+ const revisions = new Map();
178
+ for (const [id, module] of modules) {
179
+ if (onlyId && onlyId !== id)
180
+ continue;
181
+ try {
182
+ const current = captureDevelopmentModule(root, module), state = coordinator.state(id);
183
+ revisions.set(id, current.revision);
184
+ if (state?.sourceRevision !== current.revision)
185
+ enqueue(id);
186
+ }
187
+ catch {
188
+ const state = coordinator.state(id);
189
+ if (state?.status !== 'failed' || state.sourceRevision !== undefined)
190
+ enqueue(id);
191
+ }
192
+ }
193
+ return revisions;
194
+ };
195
+ const json = (response, status, body) => {
196
+ response.writeHead(status, { 'Content-Type': 'application/json', 'Cache-Control': 'no-store', 'X-Content-Type-Options': 'nosniff' });
197
+ response.end(JSON.stringify(body));
198
+ };
199
+ const http = createHttpServer((request, response) => {
200
+ const reject = (status, code) => {
201
+ response.setHeader('Connection', 'close');
202
+ json(response, status, { success: false, code });
203
+ };
204
+ if (request.headers.host !== expectedHost)
205
+ return reject(403, 'development.connection.host_rejected');
206
+ if (request.headers.origin !== origin.origin)
207
+ return reject(403, 'development.connection.origin_rejected');
208
+ response.setHeader('Access-Control-Allow-Origin', origin.origin);
209
+ response.setHeader('Vary', 'Origin');
210
+ if (request.method === 'OPTIONS') {
211
+ if (request.headers['access-control-request-method'] !== 'GET'
212
+ || (request.headers['access-control-request-headers'] ?? '').toString().toLowerCase().split(',').some(header => header.trim() !== 'authorization')) {
213
+ return reject(403, 'development.connection.preflight_rejected');
214
+ }
215
+ response.writeHead(204, { 'Access-Control-Allow-Methods': 'GET', 'Access-Control-Allow-Headers': 'Authorization',
216
+ 'Access-Control-Allow-Private-Network': 'true', 'Access-Control-Max-Age': '60' });
217
+ return response.end();
218
+ }
219
+ if (request.method !== 'GET')
220
+ return reject(405, 'development.connection.read_only');
221
+ const bearer = request.headers.authorization;
222
+ if (typeof bearer !== 'string' || !/^Bearer [a-f0-9]{64}$/u.test(bearer)
223
+ || !timingSafeEqual(Buffer.from(bearer), Buffer.from('Bearer ' + credential))) {
224
+ return reject(401, 'development.connection.credential_rejected');
225
+ }
226
+ if (!request.url?.startsWith('/') || request.url.startsWith('//') || request.url.includes('?')) {
227
+ return reject(400, 'development.connection.invalid_path');
228
+ }
229
+ lastActivity = performance.now();
230
+ activeRequests++;
231
+ let releasedActivity = false;
232
+ const activityDone = () => { if (!releasedActivity) {
233
+ releasedActivity = true;
234
+ activeRequests--;
235
+ lastActivity = performance.now();
236
+ } };
237
+ response.once('finish', activityDone);
238
+ response.once('close', activityDone);
239
+ if (request.url === '/__promptframe/registry') {
240
+ observe();
241
+ return json(response, 200, registry());
242
+ }
243
+ if (request.url === '/__promptframe/events') {
244
+ if (listeners.size >= 8)
245
+ return reject(503, 'development.connection.observer_limit');
246
+ observe();
247
+ response.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-store' });
248
+ listeners.add(response);
249
+ response.on('close', () => { listeners.delete(response); lastActivity = performance.now(); });
250
+ response.on('error', () => response.destroy());
251
+ response.write(`event: registry\ndata: ${JSON.stringify(registry())}\n\n`);
252
+ return;
253
+ }
254
+ const match = /^\/__promptframe\/modules\/([^/]+)\/bundle\/([a-f0-9]{64})$/u.exec(request.url);
255
+ if (!match)
256
+ return reject(404, 'development.connection.route_missing');
257
+ let id;
258
+ try {
259
+ id = decodeURIComponent(match[1]);
260
+ }
261
+ catch {
262
+ return reject(400, 'development.connection.invalid_path');
263
+ }
264
+ if (!modules.has(id))
265
+ return reject(404, 'development.workspace.module_missing');
266
+ const revisions = observe(id);
267
+ const state = coordinator.state(id), receipt = coordinator.buildReceipt(id);
268
+ if (!state?.lastChecked || !receipt || revisions.get(id) !== receipt.sourceRevision
269
+ || receipt.artifacts.revision !== 'sha256:' + match[2]) {
270
+ return reject(409, 'development.workspace.bundle_not_current');
271
+ }
272
+ const reservation = receipt.artifacts.byteLength * 5 + 4 * 1024 * 1024;
273
+ if (responseBytes + reservation > 48 * 1024 * 1024)
274
+ return reject(503, 'development.connection.response_budget');
275
+ responseBytes += reservation;
276
+ let released = false;
277
+ const release = () => { if (!released) {
278
+ released = true;
279
+ responseBytes -= reservation;
280
+ } };
281
+ response.once('finish', release);
282
+ response.once('close', release);
283
+ try {
284
+ // A single exact bundle contains all chunks/resources: no live source or
285
+ // credential is passed into component ESM. The consumer still isolates it.
286
+ json(response, 200, { connectionId, moduleId: id, sourceRevision: receipt.sourceRevision,
287
+ artifactRevision: receipt.artifacts.revision, entries: receipt.entries, runtimeImports: receipt.runtimeImports,
288
+ files: receipt.artifacts.readFiles().map(file => ({ path: file.path, base64: Buffer.from(file.bytes).toString('base64') })) });
289
+ }
290
+ catch {
291
+ response.destroy();
292
+ }
293
+ });
294
+ http.maxConnections = 64;
295
+ http.headersTimeout = 5000;
296
+ http.requestTimeout = 5000;
297
+ http.keepAliveTimeout = 3000;
298
+ http.on('upgrade', (_request, socket) => socket.destroy());
299
+ const vite = await createViteServer({ root, configFile: false, envFile: false, publicDir: false,
300
+ mode: 'development', appType: 'custom', logLevel: 'silent',
301
+ server: { middlewareMode: true, hmr: false, ws: false,
302
+ watch: { followSymlinks: false, ignored: ['**/node_modules/**', '**/dist/**', '**/.git/**', '**/.promptframe/**', '**/.component-packages/**'] } },
303
+ });
304
+ const changed = (_event, path) => {
305
+ const local = relative(root, resolve(path)).split(sep).join('/');
306
+ for (const [id, module] of modules) {
307
+ if (local === module.path || local.startsWith(module.path + '/') || local === 'pnpm-lock.yaml'
308
+ || local === 'package.json' || local === 'pnpm-workspace.yaml' || local === 'promptframe-workspace.json')
309
+ enqueue(id);
310
+ }
311
+ };
312
+ vite.watcher.on('all', changed);
313
+ vite.watcher.on('error', () => { watcherDiagnostic = 'development.workspace.watch_failed'; notify(); });
314
+ try {
315
+ await new Promise((resolve, reject) => {
316
+ const listen = (candidate, remaining) => {
317
+ const failed = (error) => { http.removeListener('listening', ready); if (error.code === 'EADDRINUSE' && remaining > 0)
318
+ listen(24000 + (candidate - 24000 + 1) % 1000, remaining - 1);
319
+ else
320
+ reject(error); };
321
+ const ready = () => { http.removeListener('error', failed); resolve(); };
322
+ http.once('error', failed);
323
+ http.once('listening', ready);
324
+ http.listen(candidate, host);
325
+ };
326
+ listen(port, options.portFallback ? 999 : 0);
327
+ });
328
+ }
329
+ catch (error) {
330
+ await vite.close();
331
+ throw error;
332
+ }
333
+ const address = http.address();
334
+ if (!address || typeof address === 'string') {
335
+ await vite.close();
336
+ http.close();
337
+ throw new Error('development.connection.no_address');
338
+ }
339
+ expectedHost = `${host === '::1' ? '[::1]' : host}:${address.port}`;
340
+ for (const id of modules.keys())
341
+ enqueue(id);
342
+ let closePromise;
343
+ let resolveClosed;
344
+ const closedResult = new Promise(resolve => { resolveClosed = resolve; });
345
+ function close(reason = 'manual') {
346
+ return closePromise ??= (async () => {
347
+ closed = true;
348
+ clearInterval(heartbeat);
349
+ clearInterval(idle);
350
+ controller.abort(new Error('development.workspace.closed'));
351
+ pending.clear();
352
+ for (const response of listeners)
353
+ response.end();
354
+ listeners.clear();
355
+ const httpClosed = new Promise((resolve, reject) => http.close(error => error ? reject(error) : resolve()));
356
+ http.closeAllConnections();
357
+ let firstError;
358
+ try {
359
+ await pumping;
360
+ }
361
+ catch (error) {
362
+ firstError = error;
363
+ }
364
+ try {
365
+ await vite.close();
366
+ }
367
+ catch (error) {
368
+ firstError ??= error;
369
+ }
370
+ try {
371
+ await httpClosed;
372
+ }
373
+ catch (error) {
374
+ firstError ??= error;
375
+ }
376
+ resolveClosed({ reason, failed: !!firstError });
377
+ if (firstError)
378
+ throw firstError;
379
+ })();
380
+ }
381
+ const heartbeat = setInterval(() => {
382
+ for (const response of listeners) {
383
+ try {
384
+ if (!response.write(': heartbeat\n\n'))
385
+ response.destroy();
386
+ }
387
+ catch {
388
+ response.destroy();
389
+ }
390
+ }
391
+ }, heartbeatMs);
392
+ heartbeat.unref();
393
+ const idle = setInterval(() => {
394
+ if (idleTimeoutMs && !listeners.size && !activeRequests && performance.now() - lastActivity >= idleTimeoutMs)
395
+ void close('idle').catch(() => undefined);
396
+ }, Math.max(10, Math.min(1000, idleTimeoutMs || 1000)));
397
+ idle.unref();
398
+ http.on('error', () => { void close('fatal').catch(() => undefined); });
399
+ return Object.freeze({ connectionId, url: `http://${expectedHost}`, studioOrigin: origin.origin,
400
+ credential, lifecycle, closed: closedResult, close });
401
+ }
402
+ //# sourceMappingURL=development-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-workspace.js","sourceRoot":"","sources":["../src/development-workspace.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -471,6 +471,28 @@ function preview(argv) {
471
471
  console.log(`Run: npm run ${previewScript}`);
472
472
  }
473
473
  async function dev(argv) {
474
+ if (hasFlag(argv, '--help') || hasFlag(argv, '-h')) {
475
+ help();
476
+ return;
477
+ }
478
+ if (positionalArgs(argv)[0] === 'stop') {
479
+ const root = resolve(positionalArgs(argv)[1] ?? '.');
480
+ const { stopDevelopmentOwner } = await import('./development-owner.js');
481
+ printJson({ command: 'dev.stop', ...await stopDevelopmentOwner(root) });
482
+ return;
483
+ }
484
+ const workspaceRoot = autoWorkspaceRoot(argv);
485
+ if (workspaceRoot) {
486
+ await devWorkspace(workspaceRoot, argv);
487
+ return;
488
+ }
489
+ if (hasFlag(argv, '--replace') && !hasFlag(argv, '--dry-run')) {
490
+ const root = resolve(componentPathArg(argv) ?? '.');
491
+ if (existsSync(join(root, '.promptframe/dev/owner.json'))) {
492
+ const { stopDevelopmentOwner } = await import('./development-owner.js');
493
+ await stopDevelopmentOwner(root, 'replace');
494
+ }
495
+ }
474
496
  const input = resolveComponentInput(argv);
475
497
  const dir = input.dir;
476
498
  const target = resolveUploadTarget(argv);
@@ -519,6 +541,60 @@ async function dev(argv) {
519
541
  return;
520
542
  await runDevServer(dir, devCommand);
521
543
  }
544
+ async function devWorkspace(root, argv) {
545
+ const studioOrigin = valueAfter(argv, '--studio-origin')
546
+ ?? fail('Workspace dev requires --studio-origin <exact-origin>.', 'dev.workspace.origin_required', 2);
547
+ const host = valueAfter(argv, '--host') ?? '127.0.0.1', explicitPort = valueAfter(argv, '--port');
548
+ const port = explicitPort === undefined ? undefined : Number(explicitPort), idleMinutes = Number(valueAfter(argv, '--idle-timeout') ?? '30');
549
+ if ((host !== '127.0.0.1' && host !== '::1') || port !== undefined && (!Number.isSafeInteger(port) || port < 0 || port > 65535))
550
+ fail('Workspace dev requires a loopback host and a valid port.', 'dev.workspace.address_invalid', 2);
551
+ if (!Number.isFinite(idleMinutes) || idleMinutes < 0 || !Number.isSafeInteger(idleMinutes * 60_000))
552
+ fail('--idle-timeout must be non-negative minutes; 0 disables idle exit.', 'dev.workspace.idle_timeout_invalid', 2);
553
+ if (hasFlag(argv, '--replace') && !hasFlag(argv, '--dry-run')) {
554
+ const { stopDevelopmentOwner } = await import('./development-owner.js');
555
+ await stopDevelopmentOwner(root, 'replace');
556
+ }
557
+ const workspace = readWorkspaceConfig(root);
558
+ if (hasFlag(argv, '--json') && !hasFlag(argv, '--dry-run'))
559
+ fail('dev --json requires --dry-run.', 'dev.json_requires_dry_run');
560
+ if (hasFlag(argv, '--dry-run')) {
561
+ printJson({ command: 'dev.workspace', workspace: workspaceSummary(root), modules: workspace.components, host, port: port ?? '24000-24999',
562
+ studioOrigin, idleTimeoutMinutes: idleMinutes, status: 'declared', checked: false, playerLoaded: false });
563
+ return;
564
+ }
565
+ const { startDevelopmentWorkspace } = await import('./development-workspace.js');
566
+ const { acquireDevelopmentOwner } = await import('./development-owner.js');
567
+ let stop;
568
+ const stopped = new Promise(resolve => { stop = resolve; });
569
+ const signal = () => stop('signal');
570
+ process.once('SIGINT', signal);
571
+ process.once('SIGTERM', signal);
572
+ let owner;
573
+ try {
574
+ owner = await acquireDevelopmentOwner(root, stop);
575
+ const server = await startDevelopmentWorkspace({ root, modules: workspace.components, studioOrigin, host,
576
+ connectionId: owner.connectionId, port: port ?? owner.preferredPort, portFallback: port === undefined, idleTimeoutMs: idleMinutes * 60_000 });
577
+ try {
578
+ owner.recordPort(Number(new URL(server.url).port));
579
+ printJson({ command: 'dev.workspace', contractVersion: 'promptframe-development.v2', connectionId: server.connectionId, url: server.url,
580
+ studioOrigin: server.studioOrigin, credential: server.credential, lifecycle: server.lifecycle, playerLoaded: false });
581
+ const result = await Promise.race([stopped.then(reason => ({ reason, failed: false })), server.closed]);
582
+ await server.close(result.reason);
583
+ if (result.failed || result.reason === 'fatal')
584
+ throw Error('development.workspace.close_failed');
585
+ if (result.reason === 'idle')
586
+ console.error('Workspace dev stopped after the configured idle interval.');
587
+ }
588
+ finally {
589
+ await server.close();
590
+ }
591
+ }
592
+ finally {
593
+ await owner?.close();
594
+ process.removeListener('SIGINT', signal);
595
+ process.removeListener('SIGTERM', signal);
596
+ }
597
+ }
522
598
  function packageComponent(argv) {
523
599
  const input = resolveComponentInput(argv);
524
600
  const artifact = packageDirectory(input.dir, valueAfter(argv, '--out'));
@@ -1620,6 +1696,8 @@ const POSITIONAL_VALUE_FLAGS = new Set([
1620
1696
  '--endpoint',
1621
1697
  '--expires-at',
1622
1698
  '--host',
1699
+ '--studio-origin',
1700
+ '--idle-timeout',
1623
1701
  '--id',
1624
1702
  '--level',
1625
1703
  '--name',
@@ -4251,7 +4329,12 @@ Commands:
4251
4329
  sync <dir> Refresh PromptFrame-generated authoring shell files (--dry-run by default; use --apply)
4252
4330
  preview <dir> Validate and print local Remotion preview envelope
4253
4331
  --write-local-report Write .promptframe/local-previews/preview-report.json
4254
- dev <dir> Start the local Remotion Player preview server
4332
+ dev <dir> Start a local preview or workspace checked-module connection
4333
+ --studio-origin <origin> Required for a multi-component workspace
4334
+ --idle-timeout <minutes> Workspace idle exit (default 30; 0 disables)
4335
+ --port <port> Workspace default range 24000–24999; single component default 5173
4336
+ --replace Normally close this workspace's existing instance, then start
4337
+ dev stop [dir] Normally close this workspace's instance
4255
4338
  package <dir> --out <zip> Validate and package a component source zip
4256
4339
  upload <dir|zip> Upload component source package to PromptFrame
4257
4340
  --target <target> marketplace_authoring or project_private_generation