@promptframe/cli 0.1.57 → 0.1.63

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 (42) hide show
  1. package/README.md +19 -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-process.d.ts +15 -0
  23. package/dist/development-process.d.ts.map +1 -0
  24. package/dist/development-process.js +65 -0
  25. package/dist/development-process.js.map +1 -0
  26. package/dist/development-revisions.d.ts +58 -0
  27. package/dist/development-revisions.d.ts.map +1 -0
  28. package/dist/development-revisions.js +130 -0
  29. package/dist/development-revisions.js.map +1 -0
  30. package/dist/development-validation.d.ts +22 -0
  31. package/dist/development-validation.d.ts.map +1 -0
  32. package/dist/development-validation.js +122 -0
  33. package/dist/development-validation.js.map +1 -0
  34. package/dist/development-workspace.d.ts +25 -0
  35. package/dist/development-workspace.d.ts.map +1 -0
  36. package/dist/development-workspace.js +352 -0
  37. package/dist/development-workspace.js.map +1 -0
  38. package/dist/index.js +72 -203
  39. package/dist/index.js.map +1 -1
  40. package/dist/lifecycle.js +4 -4
  41. package/dist/lifecycle.js.map +1 -1
  42. package/package.json +10 -4
package/README.md CHANGED
@@ -4,7 +4,7 @@ PromptFrame component authoring CLI.
4
4
 
5
5
  Use it to inspect the public component standard, check component folders, validate manifests, inspect the local preview envelope, package source archives, upload components, check build status, rebuild evidence indexes, and rerun layout/security probes.
6
6
 
7
- Current source baseline is `@promptframe/cli@0.1.57`, `@promptframe/contracts@0.1.25`, `@promptframe/component-kit@0.1.19`, and `create-promptframe-component@0.1.47`. The published CLI consumes the contracts AST-aware public security policy evaluator, reports `securityPolicyDigest` / `securityEvaluatorMode` in JSON output, rejects red-team browser capability vectors such as Image/Audio beacons, Worker/SharedWorker, `window.open`, `postMessage`, dynamic script/iframe creation, browser fingerprinting, storage/cookie access, and dangerous HTML, reports `publicResources` for component-level public assets, keeps native `<img>` / `<video>` source checks case-sensitive so Remotion `<Img>` / `<Video>` remain valid, validates preview props against statically declared `propsSchema` fields and requires readable public prop descriptions, enforces strict Slot-first layout/source diagnostics, supports endpoint discovery, project list/current diagnostics, self-service CI token create/list/revoke, single-component and workspace GitHub workflow setup with `promptframe-workflow-version: 2`, `setup-ci --upgrade` stale-template repair, dynamic workspace matrix discovery, `RUNNER_LABELS` and pnpm 10 workflow support, pnpm workspace root lockfile evidence without component symlinks, `promptframe-workspace.json` validation, workspace root `check .` / `upload .` auto-detection, explicit `workspace:*` shared-package diagnostics, workspace upload source metadata headers, packages sanitized lockfile evidence for platform admission, release notes forwarding to upload, stderr NDJSON upload progress for `--json`, human-readable token kind/expiry summaries for `login`, `whoami`, and authenticated `upload`, server version auto-bump notes, and supports `status --fail-on-build-failed` for CI build-status gating.
7
+ Current source baseline is `@promptframe/cli@0.1.63`, `@promptframe/contracts@0.1.31`, `@promptframe/component-kit@0.1.25`, and `create-promptframe-component@0.1.53`. The published CLI consumes the contracts AST-aware public security policy evaluator, reports `securityPolicyDigest` / `securityEvaluatorMode` in JSON output, rejects red-team browser capability vectors such as Image/Audio beacons, Worker/SharedWorker, `window.open`, `postMessage`, dynamic script/iframe creation, browser fingerprinting, storage/cookie access, and dangerous HTML, reports `publicResources` for component-level public assets, keeps native `<img>` / `<video>` source checks case-sensitive so Remotion `<Img>` / `<Video>` remain valid, validates preview props against statically declared `propsSchema` fields and requires readable public prop descriptions, enforces strict Slot-first layout/source diagnostics, supports endpoint discovery, project list/current diagnostics, self-service CI token create/list/revoke, single-component and workspace GitHub workflow setup with `promptframe-workflow-version: 2`, `setup-ci --upgrade` stale-template repair, dynamic workspace matrix discovery, `RUNNER_LABELS` and pnpm 10 workflow support, pnpm workspace root lockfile evidence without component symlinks, `promptframe-workspace.json` validation, workspace root `check .` / `upload .` auto-detection, explicit `workspace:*` shared-package diagnostics, workspace upload source metadata headers, packages sanitized lockfile evidence for platform admission, release notes forwarding to upload, stderr NDJSON upload progress for `--json`, human-readable token kind/expiry summaries for `login`, `whoami`, and authenticated `upload`, server version auto-bump notes, and supports `status --fail-on-build-failed` for CI build-status gating.
8
8
 
9
9
  ```bash
10
10
  npm install -D @promptframe/cli
@@ -88,6 +88,24 @@ The upload-to-publish lifecycle has multiple gates. `upload` returning success m
88
88
 
89
89
  ### Repository layouts and monorepos
90
90
 
91
+ #### 根开发服务(源码入口)
92
+
93
+ 工作区根目录声明 `promptframe-workspace.json` 后,源码中的根开发入口使用一个 Vite watcher 管理全部模块:
94
+
95
+ ```bash
96
+ promptframe dev . --studio-origin https://studio.example
97
+ ```
98
+
99
+ 入口监听一个 loopback 地址,端口 `0` 由系统选择一个实际端口,也可用 `--port` 指定。成功监听后输出实际 URL、连接 ID、精确 Studio Origin 和十分钟连接凭据。凭据只用于本机显式连接,不是平台登录或上传 Token;不要提交或放进组件代码。远程浏览器、SSH/WSL 和 HTTPS 到本机的访问仍需真实桥接及浏览器许可,不能根据命令启动推断可达。
100
+
101
+ `/__promptframe/registry` 和 `events` 以精确 Host/Origin/Authorization 返回模块的当前捕获版本、checking/checked/failed、固定诊断及明确的 lastChecked。精确版本的 bundle 接口一次返回 Component/schema/index ESM、共享 chunk 和已捕获 public 资源;输出不附原包锁或连接凭据。原始 Vite 文件、`/@fs`、默认 HTML/HMR、子配置和 npm 脚本入口关闭。
102
+
103
+ 每个模块先捕获自身文件、实际 workspace pnpm 锁和声明,再运行普通 CLI validate、固定 Vite 闭合图构建和当前内容重捕获。漏通知、快速保存或旧构建晚回不能授权旧字节覆盖新版;失败保留明确标记的 lastChecked。检查状态是构建/规则事实,Player 必须在隔离执行后另报实际加载版本。根服务本身尚未提供 Studio 消费端或 Player 加载 ACK,也不代替平台正式 upload/admission。
104
+
105
+ 构建采用 Vite 8.0.10 和自动 JSX,支持捕获内的 JS/TS/JSON 静态图与 `.module.css`。CSS Modules 的类名按捕获版本和文件路径隔离,样式随实际组件挂载和卸载;默认脚手架的 `propsSchema`、命名 index 与 manifest 指定的组件导出会对齐 Player 原有入口。样式只支持本模块类选择器和纯布局、颜色表达式,不解析 CSS import、URL、composition、全局选择器或独立动画时钟;资源仍使用原公共资源 helper。React/ReactDOM/Remotion、zod 及 PromptFrame 公共 runtime 作为明确列出的共享 external,由消费端按兼容合同提供;不从作者 `node_modules` 偷读依赖。其它 npm/本机 alias、父目录源码、普通全局 CSS、`import.meta` 和非字面动态 import 尚不支持,返回确定诊断。锁文件捕获证明实际输入,不冒依赖安装或解析完整性;正式各模块独立包仍走原检查和上传。
106
+
107
+ 默认界为 32 模块、每模块 2048 文件/16MiB 输入、512 文件/8MiB 输出;检查/构建串行并有超时,受检产物保留总量 64MiB,HTTP 传输另有有界预留,最多八个通知连接。关闭时停止 watcher/HTTP,abort 并 join 实际检查/构建子进程后回收自身临时目录。这些本机进程和内容预算不构成 OS/网络或网页执行沙箱,也不声称全进程 heap/RSS 上限。
108
+
91
109
  The default CLI workflow assumes a single component repository: the current directory is the component package and contains `manifest.json`, `package.json`, `src/`, and optional `public/`.
92
110
 
93
111
  Monorepos are allowed only when component mapping is explicit. `promptframe-workspace.json` is the supported workspace SSOT; it lists each component `id` and relative `path`. `workspace validate` confirms every path exists and every selected directory's `manifest.json` declares the same id before upload. `PROMPTFRAME_CI_TOKEN` authorizes the upload; it does not map a repository, commit, or tag to a component for you.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=development-build-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-build-worker.d.ts","sourceRoot":"","sources":["../src/development-build-worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,184 @@
1
+ import { posix } from 'node:path';
2
+ import ts from 'typescript';
3
+ import { build, version } from 'vite';
4
+ import { DevelopmentContents } from './development-revisions.js';
5
+ import { compileDevelopmentCssModule } from './development-css.js';
6
+ const prefix = '\0promptframe-captured:';
7
+ const entryPrefix = '\0promptframe-entry:';
8
+ const cssPrefix = '\0promptframe-css:';
9
+ const externals = new Set(['react', 'react/jsx-runtime', 'react/jsx-dev-runtime',
10
+ 'react-dom', 'react-dom/client', 'remotion', 'zod', '@promptframe/component-kit', '@promptframe/contracts',
11
+ '@promptframe/component-kit/layout', '@promptframe/component-kit/timing',
12
+ '@promptframe/component-kit/style', '@promptframe/component-kit/standard']);
13
+ let diagnosticCode = 'development.build.failed';
14
+ function fail(code) { diagnosticCode = code; throw new Error(code); }
15
+ async function main() {
16
+ let total = 0;
17
+ const input = [];
18
+ for await (const chunk of process.stdin) {
19
+ total += chunk.length;
20
+ if (total > 24 * 1024 * 1024)
21
+ fail('development.build.input_limit');
22
+ input.push(chunk);
23
+ }
24
+ const request = JSON.parse(Buffer.concat(input).toString('utf8'));
25
+ const captured = new DevelopmentContents(request.files.map(file => ({
26
+ path: file.path, bytes: Buffer.from(file.base64, 'base64'),
27
+ })), { maximumFiles: 2048, maximumBytes: 16 * 1024 * 1024 });
28
+ if (captured.revision !== request.sourceRevision || version !== '8.0.10')
29
+ fail('development.build.input_mismatch');
30
+ const files = new Map(captured.readFiles().map(file => [file.path, file.bytes]));
31
+ const manifestBytes = files.get('manifest.json');
32
+ if (!manifestBytes)
33
+ fail('development.build.manifest_missing');
34
+ const manifest = JSON.parse(Buffer.from(manifestBytes).toString('utf8'));
35
+ const entries = { component: manifest.entry.sourcePath, schema: manifest.entry.propsSchemaPath, index: 'src/index.ts' };
36
+ const cssPlaceholder = `__PROMPTFRAME_CAPTURED_CSS_${captured.revision}__`;
37
+ const styles = new Map();
38
+ // Normalize the manifest's real component export and both supported schema
39
+ // spellings to the Player's existing three-entry identity contract. Original
40
+ // index exports remain available; no second manifest authority is created.
41
+ const generated = new Map([
42
+ ['component', `import * as Source from ${JSON.stringify(prefix + entries.component)};
43
+ import { Fragment, createElement } from 'react';
44
+ const Component = Source[${JSON.stringify(manifest.entry.componentExport ?? 'default')}];
45
+ export default function CapturedComponent(props) {
46
+ return createElement(Fragment, null, createElement('style', null, ${JSON.stringify(cssPlaceholder)}), createElement(Component, props));
47
+ }`],
48
+ ['schema', `import * as Source from ${JSON.stringify(prefix + entries.schema)};
49
+ export * from ${JSON.stringify(prefix + entries.schema)};
50
+ export const PropsSchema = Source.PropsSchema ?? Source.propsSchema;`],
51
+ ['index', `export * from ${JSON.stringify(prefix + entries.index)};
52
+ export { default } from ${JSON.stringify(entryPrefix + 'component')};
53
+ export { PropsSchema } from ${JSON.stringify(entryPrefix + 'schema')};`],
54
+ ]);
55
+ const importedRuntimes = new Set();
56
+ const source = (path) => {
57
+ const bytes = files.get(path);
58
+ if (!bytes)
59
+ fail('development.build.uncaptured_import');
60
+ if (!/\.(?:[cm]?[jt]sx?|json)$/u.test(path) && !path.endsWith('.module.css'))
61
+ fail('development.build.unsupported_source_type');
62
+ const text = Buffer.from(bytes).toString('utf8');
63
+ if (!path.endsWith('.json') && !path.endsWith('.module.css')) {
64
+ const parsed = ts.createSourceFile(path, text, ts.ScriptTarget.Latest, true);
65
+ const visit = (node) => {
66
+ // These Vite features would discover files outside the closed import
67
+ // graph. They need an explicit captured-resource contract first.
68
+ if (ts.isMetaProperty(node) && node.keywordToken === ts.SyntaxKind.ImportKeyword) {
69
+ fail('development.build.import_meta_unsupported');
70
+ }
71
+ if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword
72
+ && (node.arguments.length !== 1 || !(ts.isStringLiteral(node.arguments[0]) || ts.isNoSubstitutionTemplateLiteral(node.arguments[0])))) {
73
+ fail('development.build.dynamic_import_unsupported');
74
+ }
75
+ ts.forEachChild(node, visit);
76
+ };
77
+ visit(parsed);
78
+ }
79
+ return text;
80
+ };
81
+ const plugin = {
82
+ name: 'promptframe-captured-sources', enforce: 'pre',
83
+ resolveId(id, importer) {
84
+ if (id.startsWith(entryPrefix)) {
85
+ if (importer && !importer.startsWith(entryPrefix))
86
+ return fail('development.build.uncaptured_import');
87
+ if (!generated.has(id.slice(entryPrefix.length)))
88
+ return fail('development.build.uncaptured_import');
89
+ return id;
90
+ }
91
+ if (id.startsWith(prefix)) {
92
+ if (!importer?.startsWith(entryPrefix))
93
+ return fail('development.build.uncaptured_import');
94
+ source(id.slice(prefix.length));
95
+ return id;
96
+ }
97
+ if (!importer?.startsWith(prefix) && !importer?.startsWith(entryPrefix))
98
+ return fail('development.build.uncaptured_import');
99
+ if (externals.has(id)) {
100
+ importedRuntimes.add(id);
101
+ return { id, external: true };
102
+ }
103
+ if (!importer.startsWith(prefix))
104
+ return fail('development.build.uncaptured_import');
105
+ if (!id.startsWith('.') || /[\\?#\0]/u.test(id))
106
+ return fail('development.build.unsupported_dependency');
107
+ const path = posix.normalize(posix.join(posix.dirname(importer.slice(prefix.length)), id));
108
+ if (path === '..' || path.startsWith('../') || posix.isAbsolute(path))
109
+ return fail('development.build.uncaptured_import');
110
+ const resolved = [path, ...['.ts', '.tsx', '.js', '.jsx', '.mjs', '.mts', '.json', '/index.ts', '/index.tsx', '/index.js'].map(ext => path + ext)]
111
+ .find(candidate => files.has(candidate));
112
+ if (!resolved)
113
+ return fail('development.build.uncaptured_import');
114
+ source(resolved);
115
+ // This loader already compiled the CSS Module to JS. A JS virtual ID
116
+ // keeps Vite's later CSS plugin from parsing that mapping as a stylesheet.
117
+ return resolved.endsWith('.module.css') ? cssPrefix + resolved + '.mjs' : prefix + resolved;
118
+ },
119
+ async load(id) {
120
+ if (id.startsWith(entryPrefix))
121
+ return generated.get(id.slice(entryPrefix.length));
122
+ if (!id.startsWith(prefix) && !id.startsWith(cssPrefix))
123
+ return fail('development.build.uncaptured_import');
124
+ const path = id.startsWith(cssPrefix) ? id.slice(cssPrefix.length, -4) : id.slice(prefix.length), text = source(path);
125
+ if (path.endsWith('.module.css')) {
126
+ let compiled;
127
+ try {
128
+ compiled = await compileDevelopmentCssModule({ path, text, sourceRevision: captured.revision });
129
+ }
130
+ catch {
131
+ return fail('development.build.unsupported_css');
132
+ }
133
+ styles.set(path, compiled.css);
134
+ return `export default ${JSON.stringify(compiled.classes)};`;
135
+ }
136
+ return text;
137
+ },
138
+ };
139
+ const result = await build({ root: process.cwd(), configFile: false, envFile: false,
140
+ mode: 'development', publicDir: false, logLevel: 'silent', plugins: [plugin],
141
+ css: { postcss: { plugins: [] } }, resolve: { tsconfigPaths: false },
142
+ oxc: { jsx: { runtime: 'automatic', importSource: 'react' } },
143
+ build: { write: false, target: 'es2022', minify: false, sourcemap: false, modulePreload: false,
144
+ lib: { entry: Object.fromEntries(Object.keys(entries).map(key => [key, entryPrefix + key])), formats: ['es'] },
145
+ rolldownOptions: { input: Object.fromEntries(Object.keys(entries).map(key => [key, entryPrefix + key])),
146
+ output: { entryFileNames: '[name].mjs', chunkFileNames: 'chunks/[name]-[hash].mjs',
147
+ assetFileNames: 'assets/[name]-[hash][extname]' } },
148
+ },
149
+ });
150
+ const built = Array.isArray(result) && result.length === 1 ? result[0] : result;
151
+ if (!built || !('output' in built))
152
+ fail('development.build.invalid_output');
153
+ const css = [...styles].sort(([a], [b]) => a.localeCompare(b, 'en')).map(([, text]) => text).join('\n');
154
+ let replacements = 0;
155
+ const output = built.output.map(file => {
156
+ if (file.type !== 'chunk')
157
+ return { path: file.fileName, bytes: Buffer.from(file.source) };
158
+ const code = file.code.replaceAll(JSON.stringify(cssPlaceholder), () => { replacements++; return JSON.stringify(css); });
159
+ return { path: file.fileName, bytes: Buffer.from(code) };
160
+ });
161
+ if (replacements !== 1)
162
+ fail('development.build.invalid_output');
163
+ output.push({ path: 'manifest.json', bytes: Buffer.from(manifestBytes) });
164
+ for (const [path, bytes] of files) {
165
+ if (path.startsWith('public/'))
166
+ output.push({ path: 'resources/public/' + path.slice(7), bytes: Buffer.from(bytes) });
167
+ if (path === 'src/preview-props.json')
168
+ output.push({ path: 'preview.json', bytes: Buffer.from(bytes) });
169
+ }
170
+ const artifacts = new DevelopmentContents(output, { maximumFiles: 512, maximumBytes: 8 * 1024 * 1024 });
171
+ process.stdout.write(JSON.stringify({ sourceRevision: captured.revision, builder: `vite/${version}/captured-v1`,
172
+ entries: Object.fromEntries(Object.keys(entries).map(key => [key, `${key}.mjs`])),
173
+ runtimeImports: [...importedRuntimes].sort(),
174
+ files: artifacts.readFiles().map(file => ({ path: file.path, base64: Buffer.from(file.bytes).toString('base64') })),
175
+ }));
176
+ }
177
+ try {
178
+ await main();
179
+ }
180
+ catch {
181
+ process.stderr.write(JSON.stringify({ code: diagnosticCode }));
182
+ process.exitCode = 1;
183
+ }
184
+ //# sourceMappingURL=development-build-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-build-worker.js","sourceRoot":"","sources":["../src/development-build-worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { DevelopmentContents } from './development-revisions.js';
2
+ export interface DevelopmentBuildReceipt {
3
+ readonly sourceRevision: string;
4
+ readonly builder: string;
5
+ readonly artifacts: DevelopmentContents;
6
+ readonly entries: Readonly<{
7
+ component: string;
8
+ schema: string;
9
+ index: string;
10
+ }>;
11
+ /** Only explicitly shared host runtimes are external, never arbitrary npm imports. */
12
+ readonly runtimeImports: readonly string[];
13
+ }
14
+ /** Compile the capture through a fixed Vite config and a closed virtual source
15
+ * graph. No workspace files, child vite.config, scripts or node_modules are
16
+ * resolved by the build. A build receipt alone does not assert a safety check. */
17
+ export declare function buildDevelopmentContents(contents: DevelopmentContents, options?: {
18
+ temporaryParent?: string;
19
+ timeoutMs?: number;
20
+ signal?: AbortSignal;
21
+ }): Promise<DevelopmentBuildReceipt>;
22
+ //# sourceMappingURL=development-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-build.d.ts","sourceRoot":"","sources":["../src/development-build.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAIjE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjF,sFAAsF;IACtF,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED;;kFAEkF;AAClF,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,GAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GACnF,OAAO,CAAC,uBAAuB,CAAC,CAiDlC"}
@@ -0,0 +1,66 @@
1
+ import { mkdtemp, rm } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { DevelopmentContents } from './development-revisions.js';
6
+ import { DevelopmentProcessError, runDevelopmentProcess } from './development-process.js';
7
+ const outputLimits = Object.freeze({ maximumFiles: 512, maximumBytes: 8 * 1024 * 1024 });
8
+ /** Compile the capture through a fixed Vite config and a closed virtual source
9
+ * graph. No workspace files, child vite.config, scripts or node_modules are
10
+ * resolved by the build. A build receipt alone does not assert a safety check. */
11
+ export async function buildDevelopmentContents(contents, options = {}) {
12
+ const timeoutMs = options.timeoutMs ?? 30_000;
13
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 120_000) {
14
+ throw new DevelopmentProcessError('development.build.invalid_timeout');
15
+ }
16
+ options.signal?.throwIfAborted();
17
+ if (contents.byteLength > 16 * 1024 * 1024)
18
+ throw new DevelopmentProcessError('development.build.input_limit');
19
+ const files = contents.readFiles();
20
+ if (files.length > 2048)
21
+ throw new DevelopmentProcessError('development.build.input_limit');
22
+ const input = JSON.stringify({ sourceRevision: contents.revision,
23
+ files: files.map(file => ({ path: file.path, base64: Buffer.from(file.bytes).toString('base64') })) });
24
+ const directory = await mkdtemp(join(options.temporaryParent ?? tmpdir(), 'promptframe-build-'));
25
+ let hadFailure = false;
26
+ try {
27
+ const raw = await runDevelopmentProcess({
28
+ worker: fileURLToPath(new URL('./development-build-worker.js', import.meta.url)),
29
+ cwd: directory, input, timeoutMs, maximumOutputBytes: 20 * 1024 * 1024, signal: options.signal,
30
+ });
31
+ const result = JSON.parse(raw);
32
+ if (result.sourceRevision !== contents.revision || result.builder !== 'vite/8.0.10/captured-v1'
33
+ || !Array.isArray(result.files) || !Array.isArray(result.runtimeImports)
34
+ || !result.runtimeImports.every(id => typeof id === 'string') || !result.entries) {
35
+ throw new DevelopmentProcessError('development.build.invalid_receipt');
36
+ }
37
+ const artifacts = new DevelopmentContents(result.files.map(file => ({
38
+ path: file.path, bytes: Buffer.from(file.base64, 'base64'),
39
+ })), outputLimits);
40
+ const paths = new Set(artifacts.readFiles().map(file => file.path));
41
+ if (!['component', 'schema', 'index'].every(key => paths.has(result.entries[key]))) {
42
+ throw new DevelopmentProcessError('development.build.invalid_entries');
43
+ }
44
+ return Object.freeze({ sourceRevision: contents.revision, builder: result.builder, artifacts,
45
+ entries: Object.freeze({ ...result.entries }), runtimeImports: Object.freeze([...result.runtimeImports]) });
46
+ }
47
+ catch (error) {
48
+ hadFailure = true;
49
+ throw error;
50
+ }
51
+ finally {
52
+ // The worker has actually closed before returning/throwing above. A cleanup
53
+ // failure must not replace the original abort/compiler cause.
54
+ try {
55
+ await rm(directory, { recursive: true, force: true });
56
+ }
57
+ catch (error) {
58
+ if (!hadFailure)
59
+ throw error;
60
+ // Keep the first failure and make any retained private directory
61
+ // actionable to its local owner; never print source/error bodies.
62
+ process.stderr.write(JSON.stringify({ code: 'development.build.cleanup_failed', directory }) + '\n');
63
+ }
64
+ }
65
+ }
66
+ //# sourceMappingURL=development-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-build.js","sourceRoot":"","sources":["../src/development-build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type DevelopmentBuildReceipt } from './development-build.js';
2
+ import { type DevelopmentValidationReceipt } from './development-validation.js';
3
+ import { DevelopmentContents } from './development-revisions.js';
4
+ interface CompilerOptions {
5
+ signal?: AbortSignal;
6
+ }
7
+ interface DevelopmentCoordinatorOptions {
8
+ maximumModules: number;
9
+ capture(moduleId: string): DevelopmentContents | Promise<DevelopmentContents>;
10
+ maximumAttempts?: number;
11
+ /** Trusted composition ports, never supplied by component configs or HTTP. */
12
+ validate?: (source: DevelopmentContents, options: CompilerOptions) => Promise<DevelopmentValidationReceipt>;
13
+ build?: (source: DevelopmentContents, options: CompilerOptions) => Promise<DevelopmentBuildReceipt>;
14
+ }
15
+ /** Joins capture -> common checks -> captured Vite build -> current recapture.
16
+ * It exposes checked bytes, never a claim that a Player has loaded them. */
17
+ export declare class DevelopmentModuleCoordinator {
18
+ #private;
19
+ constructor(options: DevelopmentCoordinatorOptions);
20
+ state(moduleId: string): import("./development-revisions.js").DevelopmentModuleState | undefined;
21
+ buildReceipt(moduleId: string): DevelopmentBuildReceipt | undefined;
22
+ refresh(moduleId: string, options?: CompilerOptions): Promise<boolean>;
23
+ remove(moduleId: string): void;
24
+ }
25
+ export {};
26
+ //# sourceMappingURL=development-coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-coordinator.d.ts","sourceRoot":"","sources":["../src/development-coordinator.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAChG,OAAO,EAA+B,KAAK,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC7G,OAAO,EAAE,mBAAmB,EAA0D,MAAM,4BAA4B,CAAC;AAEzH,UAAU,eAAe;IAAG,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE;AAClD,UAAU,6BAA6B;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC9E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC5G,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;CACrG;AAED;4EAC4E;AAC5E,qBAAa,4BAA4B;;gBAS3B,OAAO,EAAE,6BAA6B;IAYlD,KAAK,CAAC,QAAQ,EAAE,MAAM;IACtB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS;IAK7D,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAmDhF,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;CAI/B"}
@@ -0,0 +1,114 @@
1
+ import { PROMPTFRAME_PUBLIC_SECURITY_POLICY_DIGEST } from '@promptframe/contracts';
2
+ import { buildDevelopmentContents } from './development-build.js';
3
+ import { validateDevelopmentContents } from './development-validation.js';
4
+ import { DevelopmentRevisionGate } from './development-revisions.js';
5
+ /** Joins capture -> common checks -> captured Vite build -> current recapture.
6
+ * It exposes checked bytes, never a claim that a Player has loaded them. */
7
+ export class DevelopmentModuleCoordinator {
8
+ #gate;
9
+ #active = new Map();
10
+ #receipts = new WeakMap();
11
+ #attempts;
12
+ #capture;
13
+ #validate;
14
+ #build;
15
+ constructor(options) {
16
+ this.#capture = options.capture;
17
+ this.#validate = options.validate ?? validateDevelopmentContents;
18
+ this.#build = options.build ?? buildDevelopmentContents;
19
+ this.#attempts = options.maximumAttempts ?? 3;
20
+ if (!Number.isSafeInteger(this.#attempts) || this.#attempts < 1 || this.#attempts > 8) {
21
+ throw new Error('development.check.invalid_attempts');
22
+ }
23
+ this.#gate = new DevelopmentRevisionGate({ maximumModules: options.maximumModules,
24
+ checkerKey: `captured-v1:${PROMPTFRAME_PUBLIC_SECURITY_POLICY_DIGEST}:vite/8.0.10` });
25
+ }
26
+ state(moduleId) { return this.#gate.state(moduleId); }
27
+ buildReceipt(moduleId) {
28
+ const checked = this.#gate.state(moduleId)?.lastChecked;
29
+ return checked ? this.#receipts.get(checked) : undefined;
30
+ }
31
+ async refresh(moduleId, options = {}) {
32
+ this.#active.get(moduleId)?.abort(new Error('development.check.superseded'));
33
+ const controller = new AbortController();
34
+ this.#active.set(moduleId, controller);
35
+ const signal = options.signal ? AbortSignal.any([controller.signal, options.signal]) : controller.signal;
36
+ const currentRequest = () => this.#active.get(moduleId) === controller;
37
+ try {
38
+ let source = await this.#capture(moduleId);
39
+ for (let attempt = 0; attempt < this.#attempts; attempt++) {
40
+ if (!currentRequest())
41
+ return false;
42
+ signal.throwIfAborted();
43
+ const check = this.#gate.begin(moduleId, source);
44
+ let build;
45
+ try {
46
+ const validation = await this.#validate(source, { signal });
47
+ if (!currentRequest())
48
+ return false;
49
+ signal.throwIfAborted();
50
+ if (validation.sourceRevision !== source.revision)
51
+ throw new Error('development.check.source_mismatch');
52
+ build = await this.#build(source, { signal });
53
+ if (build.sourceRevision !== source.revision)
54
+ throw new Error('development.check.source_mismatch');
55
+ }
56
+ catch (error) {
57
+ if (!currentRequest())
58
+ return false;
59
+ signal.throwIfAborted();
60
+ const current = await this.#capture(moduleId);
61
+ if (!currentRequest())
62
+ return false;
63
+ if (current.revision !== source.revision) {
64
+ source = current;
65
+ this.#gate.begin(moduleId, current);
66
+ continue;
67
+ }
68
+ this.#gate.reject(check, current, diagnostic(error));
69
+ return false;
70
+ }
71
+ if (!currentRequest())
72
+ return false;
73
+ signal.throwIfAborted();
74
+ const current = await this.#capture(moduleId);
75
+ if (!currentRequest())
76
+ return false;
77
+ if (this.#gate.publish(check, current, build.artifacts)) {
78
+ this.#receipts.set(this.#gate.state(moduleId).lastChecked, build);
79
+ return true;
80
+ }
81
+ source = current;
82
+ }
83
+ // Continuous changes remain visibly checking with explicit lastChecked.
84
+ // The next event/manual refresh retries; no quiet-period sleep authorizes.
85
+ return false;
86
+ }
87
+ catch (error) {
88
+ if (currentRequest())
89
+ this.#gate.invalidate(moduleId, signal.aborted ? 'development.check.aborted' : diagnostic(error));
90
+ return false;
91
+ }
92
+ finally {
93
+ if (currentRequest())
94
+ this.#active.delete(moduleId);
95
+ }
96
+ }
97
+ remove(moduleId) {
98
+ this.#active.get(moduleId)?.abort(new Error('development.check.removed'));
99
+ this.#active.delete(moduleId);
100
+ this.#gate.remove(moduleId);
101
+ }
102
+ }
103
+ function diagnostic(error) {
104
+ if (error && typeof error === 'object') {
105
+ for (const key of ['diagnosticCode', 'code', 'message']) {
106
+ const descriptor = Object.getOwnPropertyDescriptor(error, key);
107
+ if (typeof descriptor?.value === 'string' && /^[a-z0-9_]+(?:\.[a-z0-9_]+)+$/u.test(descriptor.value)
108
+ && descriptor.value.length <= 256)
109
+ return descriptor.value;
110
+ }
111
+ }
112
+ return 'development.check.failed';
113
+ }
114
+ //# sourceMappingURL=development-coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-coordinator.js","sourceRoot":"","sources":["../src/development-coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** The local Player accepts captured, module-scoped styles, with no CSS I/O. */
2
+ export declare function compileDevelopmentCssModule(input: {
3
+ path: string;
4
+ text: string;
5
+ sourceRevision: string;
6
+ }): Promise<{
7
+ css: string;
8
+ classes: Record<string, string>;
9
+ }>;
10
+ //# sourceMappingURL=development-css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-css.d.ts","sourceRoot":"","sources":["../src/development-css.ts"],"names":[],"mappings":"AAKA,gFAAgF;AAChF,wBAAsB,2BAA2B,CAAC,KAAK,EAAE;IACvD,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;CACpD,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,CAiD5D"}
@@ -0,0 +1,65 @@
1
+ import { createHash } from 'node:crypto';
2
+ import postcss from 'postcss';
3
+ import selectorParser from 'postcss-selector-parser';
4
+ import { preprocessCSS, resolveConfig } from 'vite';
5
+ /** The local Player accepts captured, module-scoped styles, with no CSS I/O. */
6
+ export async function compileDevelopmentCssModule(input) {
7
+ const reject = () => { throw new Error('development.build.unsupported_css'); };
8
+ // Escaped identifiers/URLs, imports, composition and ambient selectors need
9
+ // a captured dependency contract. Do not delegate their resolution to Vite.
10
+ if (!input.path.endsWith('.module.css') || input.text.includes('\\')
11
+ || /[#@]\s*sourceMappingURL\s*=/iu.test(input.text))
12
+ reject();
13
+ const root = postcss.parse(input.text, { from: input.path });
14
+ root.walkAtRules(rule => {
15
+ if (!['media', 'supports', 'container'].includes(rule.name.toLowerCase()))
16
+ reject();
17
+ });
18
+ root.walkRules(rule => {
19
+ if (rule.parent?.type === 'rule')
20
+ reject();
21
+ selectorParser(selectors => {
22
+ selectors.each(selector => {
23
+ const first = selector.nodes.find(node => node.type !== 'comment');
24
+ if (first?.type !== 'class')
25
+ reject();
26
+ });
27
+ selectors.walkPseudos(pseudo => {
28
+ if ([':global', ':local', ':root', ':host', ':host-context', '::slotted'].includes(pseudo.value.toLowerCase()))
29
+ reject();
30
+ });
31
+ selectors.walkCombinators(combinator => {
32
+ if (!['', '>'].includes(combinator.value.trim()))
33
+ reject();
34
+ });
35
+ }).processSync(rule.selector);
36
+ });
37
+ root.walkDecls(declaration => {
38
+ if (/^(?:composes|compose-with|behavior|-moz-binding|(?:-\w+-)?animation|(?:-\w+-)?transition)(?:-|$)/iu.test(declaration.prop))
39
+ reject();
40
+ });
41
+ // These functions are pure layout/color expressions. In particular url(),
42
+ // image-set(), expression() and file/font loaders cannot acquire resources.
43
+ const functions = new Set(['var', 'calc', 'clamp', 'min', 'max', 'rgb', 'rgba', 'hsl', 'hsla',
44
+ 'hwb', 'lab', 'lch', 'oklab', 'oklch', 'color', 'color-mix', 'linear-gradient',
45
+ 'radial-gradient', 'conic-gradient', 'repeating-linear-gradient', 'repeating-radial-gradient',
46
+ 'translate', 'translatex', 'translatey', 'translatez', 'translate3d', 'scale', 'scalex', 'scaley',
47
+ 'scalez', 'scale3d', 'rotate', 'rotatex', 'rotatey', 'rotatez', 'rotate3d', 'skew', 'skewx',
48
+ 'skewy', 'matrix', 'matrix3d', 'perspective', 'blur', 'brightness', 'contrast', 'grayscale',
49
+ 'hue-rotate', 'invert', 'opacity', 'saturate', 'sepia', 'drop-shadow', 'repeat', 'minmax', 'fit-content',
50
+ 'selector', 'style']);
51
+ for (const match of input.text.matchAll(/([a-z_-][\w-]*)\s*\(/giu)) {
52
+ if (!functions.has(match[1].toLowerCase()))
53
+ reject();
54
+ }
55
+ const namespace = createHash('sha256').update(input.sourceRevision).update('\0').update(input.path).digest('hex').slice(0, 20);
56
+ const config = await resolveConfig({
57
+ root: process.cwd(), configFile: false, envFile: false, publicDir: false, logLevel: 'silent',
58
+ css: { postcss: { plugins: [], map: false }, modules: { generateScopedName: name => `pf_${namespace}_${name}` } },
59
+ }, 'build');
60
+ const result = await preprocessCSS(input.text, `/promptframe-captured/${input.path}`, config);
61
+ if (!result.modules || result.deps?.size)
62
+ reject();
63
+ return { css: result.code, classes: result.modules };
64
+ }
65
+ //# sourceMappingURL=development-css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-css.js","sourceRoot":"","sources":["../src/development-css.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { DevelopmentContents, type DevelopmentLimits } from './development-revisions.js';
2
+ /** Capture declared workspace inputs, never a live path for a compiler to reopen.
3
+ * Generated output and node_modules are not discovered by this reader. The
4
+ * workspace consumer supplies the complete, bounded source/dependency list. */
5
+ export declare function captureDevelopmentFiles(root: string, paths: readonly string[], limits: DevelopmentLimits): DevelopmentContents;
6
+ //# sourceMappingURL=development-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-files.d.ts","sourceRoot":"","sources":["../src/development-files.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEzF;;+EAE+E;AAC/E,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,EAAE,iBAAiB,GACxB,mBAAmB,CAqDrB"}