@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,130 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { posix } from 'node:path';
3
+ /** A private copy of one complete input set, including declared dependencies. */
4
+ export class DevelopmentContents {
5
+ revision;
6
+ byteLength;
7
+ #files;
8
+ constructor(files, limits) {
9
+ if (!Number.isSafeInteger(limits.maximumFiles) || limits.maximumFiles < 1
10
+ || !Number.isSafeInteger(limits.maximumBytes) || limits.maximumBytes < 1) {
11
+ throw new Error('development.contents.invalid_limits');
12
+ }
13
+ if (!files.length || files.length > limits.maximumFiles) {
14
+ throw new Error('development.contents.file_count');
15
+ }
16
+ const names = new Set();
17
+ let total = 0;
18
+ const captured = files.map(file => {
19
+ const name = file.path;
20
+ if (!name || name.length > 1024 || name.includes('\\') || name.includes('\0')
21
+ || posix.isAbsolute(name) || posix.normalize(name) !== name
22
+ || name.split('/').some(part => part === '.' || part === '..' || !part)
23
+ || names.has(name)) {
24
+ throw new Error('development.contents.invalid_path');
25
+ }
26
+ names.add(name);
27
+ if (!(file.bytes instanceof Uint8Array) || file.bytes.byteLength > limits.maximumBytes - total) {
28
+ throw new Error('development.contents.byte_limit');
29
+ }
30
+ total += file.bytes.byteLength;
31
+ // Copy now: a caller's Buffer must not change what was checked later.
32
+ return { path: name, bytes: Buffer.from(file.bytes) };
33
+ }).sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0);
34
+ const hash = createHash('sha256').update('promptframe-development-contents/v1\0');
35
+ this.#files = Object.freeze(captured.map(file => {
36
+ hash.update(`${Buffer.byteLength(file.path)}:`).update(file.path)
37
+ .update(`${file.bytes.length}:`).update(file.bytes);
38
+ return Object.freeze({ path: file.path, base64: file.bytes.toString('base64') });
39
+ }));
40
+ this.revision = `sha256:${hash.digest('hex')}`;
41
+ this.byteLength = total;
42
+ Object.freeze(this);
43
+ }
44
+ /** Consumers receive independent bytes; the checked capture remains immutable. */
45
+ readFiles() {
46
+ return this.#files.map(file => ({ path: file.path, bytes: Buffer.from(file.base64, 'base64') }));
47
+ }
48
+ }
49
+ /**
50
+ * Adoption only. The caller captures dependencies, runs the common checks/build,
51
+ * and recaptures current inputs before publish/reject. Watcher events alone do
52
+ * not authorize a revision. This helper never executes component code.
53
+ */
54
+ export class DevelopmentRevisionGate {
55
+ #states = new Map();
56
+ #checkerKey;
57
+ #maximumModules;
58
+ #sequence = 0;
59
+ constructor(options) {
60
+ if (!options.checkerKey.trim() || options.checkerKey.length > 512
61
+ || !Number.isSafeInteger(options.maximumModules) || options.maximumModules < 1) {
62
+ throw new Error('development.registry.invalid_options');
63
+ }
64
+ this.#checkerKey = options.checkerKey;
65
+ this.#maximumModules = options.maximumModules;
66
+ }
67
+ begin(moduleId, source) {
68
+ this.assertIdentity(moduleId);
69
+ const previous = this.#states.get(moduleId);
70
+ const check = Object.freeze({ moduleId, sourceRevision: source.revision, sequence: ++this.#sequence });
71
+ this.#states.set(moduleId, { check, state: Object.freeze({
72
+ moduleId, sourceRevision: source.revision, status: 'checking',
73
+ ...(previous?.state.lastChecked ? { lastChecked: previous.state.lastChecked } : {}),
74
+ }) });
75
+ return check;
76
+ }
77
+ invalidate(moduleId, diagnostic) {
78
+ this.assertIdentity(moduleId);
79
+ const previous = this.#states.get(moduleId);
80
+ this.#states.set(moduleId, { state: Object.freeze({ moduleId, status: 'failed',
81
+ diagnostic: diagnostic.slice(0, 1024) || 'development.capture.failed',
82
+ ...(previous?.state.lastChecked ? { lastChecked: previous.state.lastChecked } : {}),
83
+ }) });
84
+ }
85
+ assertIdentity(moduleId) {
86
+ if (!moduleId.trim() || moduleId.length > 256 || /[\u0000-\u001f]/.test(moduleId)) {
87
+ throw new Error('development.module.invalid_identity');
88
+ }
89
+ if (!this.#states.has(moduleId) && this.#states.size >= this.#maximumModules) {
90
+ throw new Error('development.registry.module_limit');
91
+ }
92
+ }
93
+ publish(check, current, artifacts) {
94
+ const entry = this.currentCheck(check, current);
95
+ if (!entry)
96
+ return false;
97
+ const lastChecked = Object.freeze({ moduleId: check.moduleId,
98
+ sourceRevision: check.sourceRevision, checkerKey: this.#checkerKey, artifacts });
99
+ entry.state = Object.freeze({ moduleId: check.moduleId,
100
+ sourceRevision: check.sourceRevision, status: 'checked', lastChecked });
101
+ return true;
102
+ }
103
+ reject(check, current, diagnostic) {
104
+ const entry = this.currentCheck(check, current);
105
+ if (!entry)
106
+ return false;
107
+ entry.state = Object.freeze({ ...entry.state, status: 'failed',
108
+ diagnostic: diagnostic.slice(0, 1024) || 'development.check.failed' });
109
+ return true;
110
+ }
111
+ state(moduleId) {
112
+ return this.#states.get(moduleId)?.state;
113
+ }
114
+ remove(moduleId) {
115
+ // A late completion retains its old token and cannot recreate this entry.
116
+ this.#states.delete(moduleId);
117
+ }
118
+ currentCheck(check, current) {
119
+ const entry = this.#states.get(check.moduleId);
120
+ if (!entry || entry.check !== check || entry.state.status !== 'checking')
121
+ return undefined;
122
+ if (current.revision !== check.sourceRevision) {
123
+ // Even a missed final filesystem notification cannot publish old bytes.
124
+ this.begin(check.moduleId, current);
125
+ return undefined;
126
+ }
127
+ return entry;
128
+ }
129
+ }
130
+ //# sourceMappingURL=development-revisions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-revisions.js","sourceRoot":"","sources":["../src/development-revisions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAYlC,iFAAiF;AACjF,MAAM,OAAO,mBAAmB;IACrB,QAAQ,CAAS;IACjB,UAAU,CAAS;IACnB,MAAM,CAA4D;IAE3E,YAAY,KAAiC,EAAE,MAAyB;QACtE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,YAAY,GAAG,CAAC;eACpE,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;mBACxE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI;mBACxD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC;mBACpE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvD,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChB,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,YAAY,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,YAAY,GAAG,KAAK,EAAE,CAAC;gBAC/F,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACrD,CAAC;YACD,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YAC/B,sEAAsE;YACtE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC;QAClF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;iBAC9D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,QAAQ,GAAG,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,kFAAkF;IAClF,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACnG,CAAC;CACF;AAyBD;;;;GAIG;AACH,MAAM,OAAO,uBAAuB;IACzB,OAAO,GAAG,IAAI,GAAG,EAAuE,CAAC;IACzF,WAAW,CAAS;IACpB,eAAe,CAAS;IACjC,SAAS,GAAG,CAAC,CAAC;IAEd,YAAY,OAAuD;QACjE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG;eAC5D,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;YACjF,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,QAAgB,EAAE,MAA2B;QACjD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACvG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;gBACvD,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU;gBAC7D,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpF,CAAC,EAAE,CAAC,CAAC;QACN,OAAO,KAAK,CAAC;IACf,CAAC;IAED,UAAU,CAAC,QAAgB,EAAE,UAAkB;QAC7C,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ;gBAC5E,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,4BAA4B;gBACrE,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpF,CAAC,EAAE,CAAC,CAAC;IACR,CAAC;IAEO,cAAc,CAAC,QAAgB;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7E,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,KAAuB,EAAE,OAA4B,EAAE,SAA8B;QAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ;YAC1D,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;QACnF,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACpD,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,KAAuB,EAAE,OAA4B,EAAE,UAAkB;QAC9E,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ;YAC5D,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,0BAA0B,EAAE,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,QAAgB;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,QAAgB;QACrB,0EAA0E;QAC1E,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAEO,YAAY,CAAC,KAAuB,EAAE,OAA4B;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU;YAAE,OAAO,SAAS,CAAC;QAC3F,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC,cAAc,EAAE,CAAC;YAC9C,wEAAwE;YACxE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import type { DevelopmentContents } from './development-revisions.js';
2
+ export interface DevelopmentValidationReceipt {
3
+ readonly sourceRevision: string;
4
+ readonly securityPolicyVersion: string;
5
+ readonly securityPolicyDigest: string;
6
+ readonly securityEvaluatorMode: 'ast';
7
+ readonly checkedRuleIds: readonly string[];
8
+ }
9
+ export declare class DevelopmentValidationError extends Error {
10
+ readonly code: string;
11
+ readonly diagnosticCode?: string | undefined;
12
+ constructor(code: string, diagnosticCode?: string | undefined);
13
+ }
14
+ /** The ordinary CLI validates a private materialization of the capture. It
15
+ * never reopens the live workspace, runs package scripts, or grants a platform
16
+ * admission. The caller must still build these bytes, recapture and publish. */
17
+ export declare function validateDevelopmentContents(contents: DevelopmentContents, options?: {
18
+ temporaryParent?: string;
19
+ timeoutMs?: number;
20
+ signal?: AbortSignal;
21
+ }): Promise<DevelopmentValidationReceipt>;
22
+ //# sourceMappingURL=development-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-validation.d.ts","sourceRoot":"","sources":["../src/development-validation.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,qBAAqB,EAAE,KAAK,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED,qBAAa,0BAA2B,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM;gBAA9C,IAAI,EAAE,MAAM,EAAW,cAAc,CAAC,EAAE,MAAM,YAAA;CAGpE;AAED;;gFAEgF;AAChF,wBAAsB,2BAA2B,CAC/C,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,4BAA4B,CAAC,CA0CvC"}
@@ -0,0 +1,122 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { dirname, join } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ export class DevelopmentValidationError extends Error {
7
+ code;
8
+ diagnosticCode;
9
+ constructor(code, diagnosticCode) {
10
+ super(code);
11
+ this.code = code;
12
+ this.diagnosticCode = diagnosticCode;
13
+ this.name = 'DevelopmentValidationError';
14
+ }
15
+ }
16
+ /** The ordinary CLI validates a private materialization of the capture. It
17
+ * never reopens the live workspace, runs package scripts, or grants a platform
18
+ * admission. The caller must still build these bytes, recapture and publish. */
19
+ export async function validateDevelopmentContents(contents, options = {}) {
20
+ const timeoutMs = options.timeoutMs ?? 30_000;
21
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 120_000) {
22
+ throw new DevelopmentValidationError('development.validation.invalid_timeout');
23
+ }
24
+ options.signal?.throwIfAborted();
25
+ const files = contents.readFiles();
26
+ for (const file of files) {
27
+ if (file.path.split('/').some(part => ['node_modules', 'dist', '.git', '.component-packages', '.promptframe'].includes(part))) {
28
+ throw new DevelopmentValidationError('development.validation.excluded_input');
29
+ }
30
+ }
31
+ const directory = await mkdtemp(join(options.temporaryParent ?? tmpdir(), 'promptframe-check-'));
32
+ let hadFailure = false;
33
+ try {
34
+ for (const file of files) {
35
+ options.signal?.throwIfAborted();
36
+ const path = join(directory, ...file.path.split('/'));
37
+ await mkdir(dirname(path), { recursive: true });
38
+ await writeFile(path, file.bytes, { flag: 'wx', mode: 0o400 });
39
+ }
40
+ const result = await runCapturedValidation(directory, timeoutMs, options.signal);
41
+ const output = JSON.parse(result);
42
+ if (output.command !== 'validate' || output.securityEvaluatorMode !== 'ast'
43
+ || typeof output.securityPolicyVersion !== 'string' || typeof output.securityPolicyDigest !== 'string'
44
+ || !Array.isArray(output.checkedRuleIds) || !output.checkedRuleIds.every(rule => typeof rule === 'string')) {
45
+ throw new DevelopmentValidationError('development.validation.invalid_receipt');
46
+ }
47
+ return Object.freeze({ sourceRevision: contents.revision,
48
+ securityPolicyVersion: output.securityPolicyVersion, securityPolicyDigest: output.securityPolicyDigest,
49
+ securityEvaluatorMode: 'ast', checkedRuleIds: Object.freeze([...output.checkedRuleIds]) });
50
+ }
51
+ catch (error) {
52
+ hadFailure = true;
53
+ throw error;
54
+ }
55
+ finally {
56
+ // runCapturedValidation waits for actual child close, also after abort or
57
+ // timeout. Its reader cannot outlive this private input directory.
58
+ try {
59
+ await rm(directory, { recursive: true, force: true });
60
+ }
61
+ catch (error) {
62
+ if (!hadFailure)
63
+ throw error;
64
+ process.stderr.write(JSON.stringify({ code: 'development.validation.cleanup_failed', directory }) + '\n');
65
+ }
66
+ }
67
+ }
68
+ function runCapturedValidation(directory, timeoutMs, signal) {
69
+ signal?.throwIfAborted();
70
+ return new Promise((resolve, reject) => {
71
+ const child = spawn(process.execPath, [fileURLToPath(new URL('./index.js', import.meta.url)), 'validate', directory, '--json'], {
72
+ cwd: directory, stdio: ['ignore', 'pipe', 'pipe'],
73
+ // Validation is local. Neither endpoint/auth configuration nor arbitrary
74
+ // Node preload options from the host belong in this subprocess.
75
+ env: { NO_COLOR: '1', ...(process.platform === 'win32' && process.env.SystemRoot ? { SystemRoot: process.env.SystemRoot } : {}) },
76
+ });
77
+ let firstError, failed = false, total = 0;
78
+ const stdout = [], stderr = [];
79
+ const fail = (error) => {
80
+ if (!failed) {
81
+ failed = true;
82
+ firstError = error;
83
+ }
84
+ child.kill('SIGKILL');
85
+ };
86
+ const receive = (target, chunk) => {
87
+ total += chunk.length;
88
+ if (total > 512 * 1024)
89
+ return fail(new DevelopmentValidationError('development.validation.output_limit'));
90
+ target.push(chunk);
91
+ };
92
+ child.stdout.on('data', chunk => receive(stdout, chunk));
93
+ child.stderr.on('data', chunk => receive(stderr, chunk));
94
+ const abort = () => fail(signal.reason);
95
+ signal?.addEventListener('abort', abort, { once: true });
96
+ const timeout = setTimeout(() => fail(new DevelopmentValidationError('development.validation.timeout')), timeoutMs);
97
+ child.once('error', error => { if (!failed) {
98
+ failed = true;
99
+ firstError = error;
100
+ } });
101
+ child.once('close', code => {
102
+ clearTimeout(timeout);
103
+ signal?.removeEventListener('abort', abort);
104
+ if (failed)
105
+ return reject(firstError);
106
+ if (code === 0)
107
+ return resolve(Buffer.concat(stdout).toString('utf8'));
108
+ let diagnosticCode;
109
+ try {
110
+ const output = JSON.parse(Buffer.concat(stderr).toString('utf8'));
111
+ const candidate = output.diagnostic?.code;
112
+ if (typeof candidate === 'string' && /^[a-z0-9_]+(?:\.[a-z0-9_]+)+$/u.test(candidate) && candidate.length <= 256)
113
+ diagnosticCode = candidate;
114
+ }
115
+ catch { /* Unstructured child output is not a diagnostic contract. */ }
116
+ reject(new DevelopmentValidationError('development.validation.rejected', diagnosticCode));
117
+ });
118
+ if (signal?.aborted)
119
+ abort();
120
+ });
121
+ }
122
+ //# sourceMappingURL=development-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-validation.js","sourceRoot":"","sources":["../src/development-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { DevelopmentContents } from './development-revisions.js';
2
+ export interface DevelopmentWorkspaceModule {
3
+ id: string;
4
+ path: string;
5
+ }
6
+ /** One capture includes the module and its real shared pnpm lock bytes. Source
7
+ * aliases/parent imports remain explicitly unsupported by the common policy. */
8
+ export declare function captureDevelopmentModule(root: string, module: DevelopmentWorkspaceModule): DevelopmentContents;
9
+ /** A single root Vite watcher plus a closed HTTP surface. Vite's raw-source,
10
+ * HTML, /@fs, HMR and plugin/config serving middleware is never attached. */
11
+ export declare function startDevelopmentWorkspace(options: {
12
+ root: string;
13
+ modules: readonly DevelopmentWorkspaceModule[];
14
+ studioOrigin: string;
15
+ host?: '127.0.0.1' | '::1';
16
+ port?: number;
17
+ connectionId?: string;
18
+ portFallback?: boolean;
19
+ idleTimeoutMs?: number;
20
+ heartbeatMs?: number;
21
+ }): Promise<Readonly<{
22
+ connectionId: string;
23
+ url: `http://${string}`;
24
+ studioOrigin: string;
25
+ credential: string;
26
+ lifecycle: {
27
+ mode: "until_stopped";
28
+ idleTimeoutSeconds: number;
29
+ heartbeatSeconds: number;
30
+ };
31
+ closed: Promise<{
32
+ reason: string;
33
+ failed: boolean;
34
+ }>;
35
+ close: (reason?: string) => Promise<void>;
36
+ }>>;
37
+ //# sourceMappingURL=development-workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-workspace.d.ts","sourceRoot":"","sources":["../src/development-workspace.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAKjE,MAAM,WAAW,0BAA0B;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAExE;gFACgF;AAChF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,0BAA0B,GAAG,mBAAmB,CAuD9G;AAED;6EAC6E;AAC7E,wBAAsB,yBAAyB,CAAC,OAAO,EAAE;IACvD,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IACnF,IAAI,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAC,MAAM,CAAC;IAAC,YAAY,CAAC,EAAC,OAAO,CAAC;IACvF,aAAa,CAAC,EAAC,MAAM,CAAC;IAAC,WAAW,CAAC,EAAC,MAAM,CAAC;CAC5C;;;;;;;;;;;gBA+LwC,MAAM;gBAAQ,OAAO;;;IAuB7D"}