@synergenius/flowweaver-pack-weaver 0.5.3 → 0.6.0
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.
- package/dist/bot/genesis-prompt-context.d.ts +31 -0
- package/dist/bot/genesis-prompt-context.d.ts.map +1 -0
- package/dist/bot/genesis-prompt-context.js +121 -0
- package/dist/bot/genesis-prompt-context.js.map +1 -0
- package/dist/bot/genesis-store.d.ts +11 -1
- package/dist/bot/genesis-store.d.ts.map +1 -1
- package/dist/bot/genesis-store.js +65 -0
- package/dist/bot/genesis-store.js.map +1 -1
- package/dist/bot/types.d.ts +41 -1
- package/dist/bot/types.d.ts.map +1 -1
- package/dist/node-types/genesis-apply-retry.d.ts +6 -3
- package/dist/node-types/genesis-apply-retry.d.ts.map +1 -1
- package/dist/node-types/genesis-apply-retry.js +18 -10
- package/dist/node-types/genesis-apply-retry.js.map +1 -1
- package/dist/node-types/genesis-approve.d.ts.map +1 -1
- package/dist/node-types/genesis-approve.js +6 -1
- package/dist/node-types/genesis-approve.js.map +1 -1
- package/dist/node-types/genesis-diff-workflow.d.ts.map +1 -1
- package/dist/node-types/genesis-diff-workflow.js +30 -2
- package/dist/node-types/genesis-diff-workflow.js.map +1 -1
- package/dist/node-types/genesis-escrow-grace.d.ts +15 -0
- package/dist/node-types/genesis-escrow-grace.d.ts.map +1 -0
- package/dist/node-types/genesis-escrow-grace.js +52 -0
- package/dist/node-types/genesis-escrow-grace.js.map +1 -0
- package/dist/node-types/genesis-escrow-migrate.d.ts +21 -0
- package/dist/node-types/genesis-escrow-migrate.d.ts.map +1 -0
- package/dist/node-types/genesis-escrow-migrate.js +116 -0
- package/dist/node-types/genesis-escrow-migrate.js.map +1 -0
- package/dist/node-types/genesis-escrow-recover.d.ts +15 -0
- package/dist/node-types/genesis-escrow-recover.d.ts.map +1 -0
- package/dist/node-types/genesis-escrow-recover.js +90 -0
- package/dist/node-types/genesis-escrow-recover.js.map +1 -0
- package/dist/node-types/genesis-escrow-stage.d.ts +17 -0
- package/dist/node-types/genesis-escrow-stage.d.ts.map +1 -0
- package/dist/node-types/genesis-escrow-stage.js +86 -0
- package/dist/node-types/genesis-escrow-stage.js.map +1 -0
- package/dist/node-types/genesis-escrow-validate.d.ts +17 -0
- package/dist/node-types/genesis-escrow-validate.d.ts.map +1 -0
- package/dist/node-types/genesis-escrow-validate.js +110 -0
- package/dist/node-types/genesis-escrow-validate.js.map +1 -0
- package/dist/node-types/genesis-load-config.d.ts.map +1 -1
- package/dist/node-types/genesis-load-config.js +1 -0
- package/dist/node-types/genesis-load-config.js.map +1 -1
- package/dist/node-types/genesis-observe.d.ts.map +1 -1
- package/dist/node-types/genesis-observe.js +2 -0
- package/dist/node-types/genesis-observe.js.map +1 -1
- package/dist/node-types/genesis-propose.d.ts.map +1 -1
- package/dist/node-types/genesis-propose.js +41 -33
- package/dist/node-types/genesis-propose.js.map +1 -1
- package/dist/node-types/genesis-report.d.ts +4 -2
- package/dist/node-types/genesis-report.d.ts.map +1 -1
- package/dist/node-types/genesis-report.js +43 -17
- package/dist/node-types/genesis-report.js.map +1 -1
- package/dist/node-types/genesis-try-apply.d.ts.map +1 -1
- package/dist/node-types/genesis-try-apply.js +33 -0
- package/dist/node-types/genesis-try-apply.js.map +1 -1
- package/dist/node-types/genesis-update-history.d.ts.map +1 -1
- package/dist/node-types/genesis-update-history.js +21 -8
- package/dist/node-types/genesis-update-history.js.map +1 -1
- package/dist/node-types/genesis-validate-proposal.d.ts.map +1 -1
- package/dist/node-types/genesis-validate-proposal.js +39 -5
- package/dist/node-types/genesis-validate-proposal.js.map +1 -1
- package/dist/workflows/genesis-task.d.ts +25 -17
- package/dist/workflows/genesis-task.d.ts.map +1 -1
- package/dist/workflows/genesis-task.js +25 -17
- package/dist/workflows/genesis-task.js.map +1 -1
- package/flowweaver.manifest.json +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"genesis-diff-workflow.js","sourceRoot":"","sources":["../../src/node-types/genesis-diff-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAkB,CAAC;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IAE/E,IAAI,UAAU,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"genesis-diff-workflow.js","sourceRoot":"","sources":["../../src/node-types/genesis-diff-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAkB,CAAC;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IAE/E,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,0CAA0C;IAC1C,IAAI,CAAC;QACH,UAAU,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,YAAa,EAAE,UAAU,CAAC,EAAE;YACpF,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;YAC3B,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;YACtD,UAAU,GAAG,MAAM,CAAE,GAA0B,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACjE,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACvE,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAE5D,IAAI,eAAe,KAAK,cAAc,EAAE,CAAC;gBACvC,UAAU,GAAG,cAAc,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE;oBACvG,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;oBAC3B,QAAQ,EAAE,OAAO;oBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;oBAC/B,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC,IAAI,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,qDAAqD;YACrD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;gBACtD,MAAM,MAAM,GAAG,MAAM,CAAE,GAA0B,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gBACjE,IAAI,MAAM;oBAAE,UAAU,GAAG,MAAM,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,oBAAoB,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,4BAA4B,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,eAAe,CAAC,CAAC;IAEtF,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAChE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handles escrow grace period tracking at the end of each cycle.
|
|
3
|
+
* Decrements grace on success, triggers rollback on failure, and
|
|
4
|
+
* clears escrow once the grace period completes.
|
|
5
|
+
*
|
|
6
|
+
* @flowWeaver nodeType
|
|
7
|
+
* @expression
|
|
8
|
+
* @label Genesis Escrow Grace
|
|
9
|
+
* @input ctx [order:0] - Genesis context (JSON)
|
|
10
|
+
* @output ctx [order:0] - Genesis context (JSON)
|
|
11
|
+
*/
|
|
12
|
+
export declare function genesisEscrowGrace(ctx: string): {
|
|
13
|
+
ctx: string;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=genesis-escrow-grace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genesis-escrow-grace.d.ts","sourceRoot":"","sources":["../../src/node-types/genesis-escrow-grace.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CA6C/D"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import { GenesisStore } from '../bot/genesis-store.js';
|
|
3
|
+
import { rollbackFromBackup } from './genesis-escrow-migrate.js';
|
|
4
|
+
/**
|
|
5
|
+
* Handles escrow grace period tracking at the end of each cycle.
|
|
6
|
+
* Decrements grace on success, triggers rollback on failure, and
|
|
7
|
+
* clears escrow once the grace period completes.
|
|
8
|
+
*
|
|
9
|
+
* @flowWeaver nodeType
|
|
10
|
+
* @expression
|
|
11
|
+
* @label Genesis Escrow Grace
|
|
12
|
+
* @input ctx [order:0] - Genesis context (JSON)
|
|
13
|
+
* @output ctx [order:0] - Genesis context (JSON)
|
|
14
|
+
*/
|
|
15
|
+
export function genesisEscrowGrace(ctx) {
|
|
16
|
+
const context = JSON.parse(ctx);
|
|
17
|
+
const { env } = context;
|
|
18
|
+
const config = JSON.parse(context.genesisConfigJson);
|
|
19
|
+
if (!config.selfEvolve) {
|
|
20
|
+
return { ctx: JSON.stringify(context) };
|
|
21
|
+
}
|
|
22
|
+
const store = new GenesisStore(env.projectDir);
|
|
23
|
+
const token = store.loadEscrowToken();
|
|
24
|
+
if (!token || token.phase !== 'migrated' || token.graceRemaining <= 0) {
|
|
25
|
+
return { ctx: JSON.stringify(context) };
|
|
26
|
+
}
|
|
27
|
+
const packRoot = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..', '..');
|
|
28
|
+
// Cycle failed during grace: rollback
|
|
29
|
+
if (context.error) {
|
|
30
|
+
rollbackFromBackup(store, token, packRoot, `Grace cycle failed: ${context.error}`);
|
|
31
|
+
return { ctx: JSON.stringify(context) };
|
|
32
|
+
}
|
|
33
|
+
// Cycle succeeded: decrement grace
|
|
34
|
+
token.graceRemaining--;
|
|
35
|
+
token.graceCycleIds.push(context.cycleId);
|
|
36
|
+
store.saveEscrowToken(token);
|
|
37
|
+
console.log(`\x1b[36m→ Grace period: ${token.graceRemaining} cycle(s) remaining\x1b[0m`);
|
|
38
|
+
if (token.graceRemaining <= 0) {
|
|
39
|
+
store.appendSelfMigration({
|
|
40
|
+
migrationId: token.migrationId,
|
|
41
|
+
cycleId: token.cycleId,
|
|
42
|
+
timestamp: new Date().toISOString(),
|
|
43
|
+
affectedFiles: token.affectedFiles,
|
|
44
|
+
outcome: 'grace-cleared',
|
|
45
|
+
graceCompleted: true,
|
|
46
|
+
});
|
|
47
|
+
store.clearEscrow();
|
|
48
|
+
console.log('\x1b[32m→ Grace period complete, self-modification accepted\x1b[0m');
|
|
49
|
+
}
|
|
50
|
+
return { ctx: JSON.stringify(context) };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=genesis-escrow-grace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genesis-escrow-grace.js","sourceRoot":"","sources":["../../src/node-types/genesis-escrow-grace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAClD,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAkB,CAAC;IAEtE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;IAEtC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;QACtE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAE3F,sCAAsC;IACtC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,uBAAuB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACnF,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1C,CAAC;IAED,mCAAmC;IACnC,KAAK,CAAC,cAAc,EAAE,CAAC;IACvB,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAE7B,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,CAAC,cAAc,4BAA4B,CAAC,CAAC;IAEzF,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,mBAAmB,CAAC;YACxB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,OAAO,EAAE,eAAe;YACxB,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;QACH,KAAK,CAAC,WAAW,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;IACpF,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { EscrowToken } from '../bot/types.js';
|
|
2
|
+
import { GenesisStore } from '../bot/genesis-store.js';
|
|
3
|
+
/**
|
|
4
|
+
* Copies staged files to their actual pack locations, completing the
|
|
5
|
+
* self-modification migration. Uses a file lock to prevent concurrent access.
|
|
6
|
+
*
|
|
7
|
+
* @flowWeaver nodeType
|
|
8
|
+
* @label Genesis Escrow Migrate
|
|
9
|
+
* @input ctx [order:0] - Genesis context (JSON)
|
|
10
|
+
* @output ctx [order:0] - Genesis context with migration result (JSON)
|
|
11
|
+
* @output onSuccess [order:-2] - On Success
|
|
12
|
+
* @output onFailure [order:-1] [hidden] - On Failure
|
|
13
|
+
*/
|
|
14
|
+
export declare function genesisEscrowMigrate(execute: boolean, ctx: string): Promise<{
|
|
15
|
+
onSuccess: boolean;
|
|
16
|
+
onFailure: boolean;
|
|
17
|
+
ctx: string;
|
|
18
|
+
}>;
|
|
19
|
+
/** Restore all affected files from backup, or delete newly-created files. */
|
|
20
|
+
export declare function rollbackFromBackup(store: GenesisStore, token: EscrowToken, packRoot: string, reason: string): void;
|
|
21
|
+
//# sourceMappingURL=genesis-escrow-migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genesis-escrow-migrate.d.ts","sourceRoot":"","sources":["../../src/node-types/genesis-escrow-migrate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IACT,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IACvC,GAAG,EAAE,MAAM,CAAC;CACb,CAAC,CA6DD;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,IAAI,CA6CN"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { GenesisStore } from '../bot/genesis-store.js';
|
|
4
|
+
import { withFileLock } from '../bot/file-lock.js';
|
|
5
|
+
/**
|
|
6
|
+
* Copies staged files to their actual pack locations, completing the
|
|
7
|
+
* self-modification migration. Uses a file lock to prevent concurrent access.
|
|
8
|
+
*
|
|
9
|
+
* @flowWeaver nodeType
|
|
10
|
+
* @label Genesis Escrow Migrate
|
|
11
|
+
* @input ctx [order:0] - Genesis context (JSON)
|
|
12
|
+
* @output ctx [order:0] - Genesis context with migration result (JSON)
|
|
13
|
+
* @output onSuccess [order:-2] - On Success
|
|
14
|
+
* @output onFailure [order:-1] [hidden] - On Failure
|
|
15
|
+
*/
|
|
16
|
+
export async function genesisEscrowMigrate(execute, ctx) {
|
|
17
|
+
const context = JSON.parse(ctx);
|
|
18
|
+
const { env } = context;
|
|
19
|
+
const store = new GenesisStore(env.projectDir);
|
|
20
|
+
const token = store.loadEscrowToken();
|
|
21
|
+
if (!execute) {
|
|
22
|
+
context.escrowResultJson = JSON.stringify({ migrated: false, reason: 'dry run' });
|
|
23
|
+
return { onSuccess: true, onFailure: false, ctx: JSON.stringify(context) };
|
|
24
|
+
}
|
|
25
|
+
if (!token || token.phase !== 'validated') {
|
|
26
|
+
// No validated escrow: pass through (not an error, just nothing to migrate)
|
|
27
|
+
return { onSuccess: true, onFailure: false, ctx: JSON.stringify(context) };
|
|
28
|
+
}
|
|
29
|
+
const packRoot = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..', '..');
|
|
30
|
+
const lockPath = path.join(env.projectDir, '.genesis', 'escrow', 'migrate');
|
|
31
|
+
try {
|
|
32
|
+
await withFileLock(lockPath, () => {
|
|
33
|
+
// Re-read token inside lock to confirm state
|
|
34
|
+
const lockedToken = store.loadEscrowToken();
|
|
35
|
+
if (!lockedToken || lockedToken.phase !== 'validated') {
|
|
36
|
+
throw new Error('Token state changed during lock acquisition');
|
|
37
|
+
}
|
|
38
|
+
lockedToken.phase = 'migrating';
|
|
39
|
+
store.saveEscrowToken(lockedToken);
|
|
40
|
+
// Copy each staged file to actual location
|
|
41
|
+
for (const relFile of lockedToken.affectedFiles) {
|
|
42
|
+
const stagedPath = store.getEscrowStagedPath(relFile);
|
|
43
|
+
const destPath = path.resolve(packRoot, relFile);
|
|
44
|
+
fs.mkdirSync(path.dirname(destPath), { recursive: true });
|
|
45
|
+
fs.copyFileSync(stagedPath, destPath);
|
|
46
|
+
}
|
|
47
|
+
lockedToken.phase = 'migrated';
|
|
48
|
+
lockedToken.migratedAt = new Date().toISOString();
|
|
49
|
+
store.saveEscrowToken(lockedToken);
|
|
50
|
+
});
|
|
51
|
+
console.log(`\x1b[32m→ Escrow migration complete: ${token.affectedFiles.length} file(s) swapped\x1b[0m`);
|
|
52
|
+
context.escrowResultJson = JSON.stringify({
|
|
53
|
+
migrated: true,
|
|
54
|
+
migrationId: token.migrationId,
|
|
55
|
+
files: token.affectedFiles,
|
|
56
|
+
});
|
|
57
|
+
return { onSuccess: true, onFailure: false, ctx: JSON.stringify(context) };
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
61
|
+
console.error(`\x1b[31m→ Escrow migration failed: ${msg}\x1b[0m`);
|
|
62
|
+
// Attempt rollback
|
|
63
|
+
rollbackFromBackup(store, token, packRoot, `Migration failed: ${msg}`);
|
|
64
|
+
context.error = `Escrow migration failed: ${msg}`;
|
|
65
|
+
return { onSuccess: false, onFailure: true, ctx: JSON.stringify(context) };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Restore all affected files from backup, or delete newly-created files. */
|
|
69
|
+
export function rollbackFromBackup(store, token, packRoot, reason) {
|
|
70
|
+
for (const relFile of token.affectedFiles) {
|
|
71
|
+
const backupPath = store.getEscrowBackupPath(relFile);
|
|
72
|
+
const destPath = path.resolve(packRoot, relFile);
|
|
73
|
+
if (fs.existsSync(backupPath)) {
|
|
74
|
+
// Verify backup integrity
|
|
75
|
+
try {
|
|
76
|
+
const actualHash = GenesisStore.hashFile(backupPath);
|
|
77
|
+
const expectedHash = token.backupFileHashes[relFile];
|
|
78
|
+
if (expectedHash && actualHash !== expectedHash) {
|
|
79
|
+
console.error(`\x1b[31m→ Backup integrity check failed for ${relFile}\x1b[0m`);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
console.error(`\x1b[31m→ Cannot read backup for ${relFile}\x1b[0m`);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
fs.mkdirSync(path.dirname(destPath), { recursive: true });
|
|
88
|
+
fs.copyFileSync(backupPath, destPath);
|
|
89
|
+
}
|
|
90
|
+
else if (fs.existsSync(destPath) && !token.backupFileHashes[relFile]) {
|
|
91
|
+
// File was newly created during migration (no backup), remove it
|
|
92
|
+
try {
|
|
93
|
+
fs.unlinkSync(destPath);
|
|
94
|
+
}
|
|
95
|
+
catch { /* ignore */ }
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Update token
|
|
99
|
+
const fullToken = store.loadEscrowToken();
|
|
100
|
+
if (fullToken) {
|
|
101
|
+
fullToken.phase = 'rolled-back';
|
|
102
|
+
fullToken.rollbackReason = reason;
|
|
103
|
+
store.saveEscrowToken(fullToken);
|
|
104
|
+
}
|
|
105
|
+
store.appendSelfMigration({
|
|
106
|
+
migrationId: token.migrationId,
|
|
107
|
+
cycleId: token.cycleId,
|
|
108
|
+
timestamp: new Date().toISOString(),
|
|
109
|
+
affectedFiles: token.affectedFiles,
|
|
110
|
+
outcome: 'rolled-back',
|
|
111
|
+
graceCompleted: false,
|
|
112
|
+
rollbackReason: reason,
|
|
113
|
+
});
|
|
114
|
+
console.log(`\x1b[33m→ Rolled back migration ${token.migrationId}: ${reason}\x1b[0m`);
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=genesis-escrow-migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genesis-escrow-migrate.js","sourceRoot":"","sources":["../../src/node-types/genesis-escrow-migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks for interrupted escrow migrations (crash recovery) and sets
|
|
3
|
+
* grace-period context flags for downstream nodes. Runs early in the
|
|
4
|
+
* workflow so propose and other nodes can see the escrow state.
|
|
5
|
+
*
|
|
6
|
+
* @flowWeaver nodeType
|
|
7
|
+
* @expression
|
|
8
|
+
* @label Genesis Escrow Recover
|
|
9
|
+
* @input ctx [order:0] - Genesis context (JSON)
|
|
10
|
+
* @output ctx [order:0] - Genesis context with escrow state flags (JSON)
|
|
11
|
+
*/
|
|
12
|
+
export declare function genesisEscrowRecover(ctx: string): {
|
|
13
|
+
ctx: string;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=genesis-escrow-recover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genesis-escrow-recover.d.ts","sourceRoot":"","sources":["../../src/node-types/genesis-escrow-recover.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAiFjE"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { GenesisStore } from '../bot/genesis-store.js';
|
|
4
|
+
import { rollbackFromBackup } from './genesis-escrow-migrate.js';
|
|
5
|
+
/**
|
|
6
|
+
* Checks for interrupted escrow migrations (crash recovery) and sets
|
|
7
|
+
* grace-period context flags for downstream nodes. Runs early in the
|
|
8
|
+
* workflow so propose and other nodes can see the escrow state.
|
|
9
|
+
*
|
|
10
|
+
* @flowWeaver nodeType
|
|
11
|
+
* @expression
|
|
12
|
+
* @label Genesis Escrow Recover
|
|
13
|
+
* @input ctx [order:0] - Genesis context (JSON)
|
|
14
|
+
* @output ctx [order:0] - Genesis context with escrow state flags (JSON)
|
|
15
|
+
*/
|
|
16
|
+
export function genesisEscrowRecover(ctx) {
|
|
17
|
+
const context = JSON.parse(ctx);
|
|
18
|
+
const { env } = context;
|
|
19
|
+
const config = JSON.parse(context.genesisConfigJson);
|
|
20
|
+
if (!config.selfEvolve) {
|
|
21
|
+
context.escrowGraceLocked = false;
|
|
22
|
+
return { ctx: JSON.stringify(context) };
|
|
23
|
+
}
|
|
24
|
+
const store = new GenesisStore(env.projectDir);
|
|
25
|
+
// Check if max failures exceeded (disables self-evolution for this cycle)
|
|
26
|
+
const maxFailures = config.selfEvolveMaxFailures ?? 3;
|
|
27
|
+
const failureCount = store.getSelfFailureCount();
|
|
28
|
+
if (failureCount >= maxFailures) {
|
|
29
|
+
console.log(`\x1b[33m→ Self-evolution disabled: ${failureCount} consecutive failures (max ${maxFailures})\x1b[0m`);
|
|
30
|
+
context.escrowGraceLocked = true;
|
|
31
|
+
context.escrowGraceRemaining = 0;
|
|
32
|
+
return { ctx: JSON.stringify(context) };
|
|
33
|
+
}
|
|
34
|
+
const token = store.loadEscrowToken();
|
|
35
|
+
if (!token) {
|
|
36
|
+
context.escrowGraceLocked = false;
|
|
37
|
+
return { ctx: JSON.stringify(context) };
|
|
38
|
+
}
|
|
39
|
+
const packRoot = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..', '..');
|
|
40
|
+
// Crash recovery: process died mid-swap
|
|
41
|
+
if (token.phase === 'migrating') {
|
|
42
|
+
console.log('\x1b[33m→ Detected interrupted migration, checking file integrity...\x1b[0m');
|
|
43
|
+
let needsRollback = false;
|
|
44
|
+
for (const relFile of token.affectedFiles) {
|
|
45
|
+
const absFile = path.resolve(packRoot, relFile);
|
|
46
|
+
if (!fs.existsSync(absFile)) {
|
|
47
|
+
needsRollback = true;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
const currentHash = GenesisStore.hashFile(absFile);
|
|
51
|
+
const stagedHash = token.stagedFileHashes[relFile];
|
|
52
|
+
const backupHash = token.backupFileHashes[relFile];
|
|
53
|
+
if (currentHash !== stagedHash && currentHash !== backupHash) {
|
|
54
|
+
needsRollback = true;
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (needsRollback) {
|
|
59
|
+
console.log('\x1b[33m→ Inconsistent state, rolling back...\x1b[0m');
|
|
60
|
+
rollbackFromBackup(store, token, packRoot, 'Crash recovery: inconsistent file state');
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Check if all files match staged (migration was actually complete)
|
|
64
|
+
const allStaged = token.affectedFiles.every(f => {
|
|
65
|
+
const absFile = path.resolve(packRoot, f);
|
|
66
|
+
return fs.existsSync(absFile) && GenesisStore.hashFile(absFile) === token.stagedFileHashes[f];
|
|
67
|
+
});
|
|
68
|
+
if (allStaged) {
|
|
69
|
+
token.phase = 'migrated';
|
|
70
|
+
token.migratedAt = new Date().toISOString();
|
|
71
|
+
store.saveEscrowToken(token);
|
|
72
|
+
console.log('\x1b[32m→ Migration was complete, advancing to grace period\x1b[0m');
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
rollbackFromBackup(store, token, packRoot, 'Crash recovery: partial migration');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Set grace state for downstream nodes
|
|
80
|
+
const current = store.loadEscrowToken();
|
|
81
|
+
if (current && current.phase === 'migrated' && current.graceRemaining > 0) {
|
|
82
|
+
context.escrowGraceLocked = true;
|
|
83
|
+
context.escrowGraceRemaining = current.graceRemaining;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
context.escrowGraceLocked = false;
|
|
87
|
+
}
|
|
88
|
+
return { ctx: JSON.stringify(context) };
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=genesis-escrow-recover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genesis-escrow-recover.js","sourceRoot":"","sources":["../../src/node-types/genesis-escrow-recover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Separates self-modify operations from the proposal, copies current files
|
|
3
|
+
* to backup, writes new content to staged, and creates the escrow token.
|
|
4
|
+
*
|
|
5
|
+
* @flowWeaver nodeType
|
|
6
|
+
* @label Genesis Escrow Stage
|
|
7
|
+
* @input ctx [order:0] - Genesis context (JSON)
|
|
8
|
+
* @output ctx [order:0] - Genesis context with escrow staging result (JSON)
|
|
9
|
+
* @output onSuccess [order:-2] - On Success
|
|
10
|
+
* @output onFailure [order:-1] [hidden] - On Failure
|
|
11
|
+
*/
|
|
12
|
+
export declare function genesisEscrowStage(ctx: string): {
|
|
13
|
+
onSuccess: boolean;
|
|
14
|
+
onFailure: boolean;
|
|
15
|
+
ctx: string;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=genesis-escrow-stage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genesis-escrow-stage.d.ts","sourceRoot":"","sources":["../../src/node-types/genesis-escrow-stage.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAC/C,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IACvC,GAAG,EAAE,MAAM,CAAC;CACb,CAmFA"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as crypto from 'node:crypto';
|
|
4
|
+
import { GenesisStore } from '../bot/genesis-store.js';
|
|
5
|
+
/**
|
|
6
|
+
* Separates self-modify operations from the proposal, copies current files
|
|
7
|
+
* to backup, writes new content to staged, and creates the escrow token.
|
|
8
|
+
*
|
|
9
|
+
* @flowWeaver nodeType
|
|
10
|
+
* @label Genesis Escrow Stage
|
|
11
|
+
* @input ctx [order:0] - Genesis context (JSON)
|
|
12
|
+
* @output ctx [order:0] - Genesis context with escrow staging result (JSON)
|
|
13
|
+
* @output onSuccess [order:-2] - On Success
|
|
14
|
+
* @output onFailure [order:-1] [hidden] - On Failure
|
|
15
|
+
*/
|
|
16
|
+
export function genesisEscrowStage(ctx) {
|
|
17
|
+
const context = JSON.parse(ctx);
|
|
18
|
+
const { env } = context;
|
|
19
|
+
const config = JSON.parse(context.genesisConfigJson);
|
|
20
|
+
const proposal = JSON.parse(context.proposalJson);
|
|
21
|
+
const selfModifyTypes = new Set(['selfModifyWorkflow', 'selfModifyNodeType', 'selfModifyModule']);
|
|
22
|
+
const selfOps = proposal.operations.filter(op => selfModifyTypes.has(op.type));
|
|
23
|
+
if (selfOps.length === 0) {
|
|
24
|
+
context.hasSelfModifyOps = false;
|
|
25
|
+
return { onSuccess: true, onFailure: false, ctx: JSON.stringify(context) };
|
|
26
|
+
}
|
|
27
|
+
// Resolve the pack root (parent of src/)
|
|
28
|
+
const packRoot = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..', '..');
|
|
29
|
+
const store = new GenesisStore(env.projectDir);
|
|
30
|
+
store.ensureEscrowDirs();
|
|
31
|
+
const affectedFiles = [];
|
|
32
|
+
const stagedHashes = {};
|
|
33
|
+
const backupHashes = {};
|
|
34
|
+
try {
|
|
35
|
+
for (const op of selfOps) {
|
|
36
|
+
const relFile = op.args.file;
|
|
37
|
+
// Path traversal protection
|
|
38
|
+
const normalized = path.normalize(relFile);
|
|
39
|
+
if (normalized.startsWith('..') || path.isAbsolute(normalized)) {
|
|
40
|
+
console.error(`\x1b[31m→ Rejected unsafe file path: ${relFile}\x1b[0m`);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const absFile = path.resolve(packRoot, relFile);
|
|
44
|
+
affectedFiles.push(relFile);
|
|
45
|
+
// Backup current file
|
|
46
|
+
if (fs.existsSync(absFile)) {
|
|
47
|
+
const backupDest = store.getEscrowBackupPath(relFile);
|
|
48
|
+
fs.mkdirSync(path.dirname(backupDest), { recursive: true });
|
|
49
|
+
fs.copyFileSync(absFile, backupDest);
|
|
50
|
+
backupHashes[relFile] = GenesisStore.hashFile(absFile);
|
|
51
|
+
}
|
|
52
|
+
// Write staged content then hash the file (consistent with GenesisStore.hashFile)
|
|
53
|
+
const stagedDest = store.getEscrowStagedPath(relFile);
|
|
54
|
+
fs.mkdirSync(path.dirname(stagedDest), { recursive: true });
|
|
55
|
+
fs.writeFileSync(stagedDest, op.args.content, 'utf-8');
|
|
56
|
+
stagedHashes[relFile] = GenesisStore.hashFile(stagedDest);
|
|
57
|
+
}
|
|
58
|
+
const gracePeriod = config.selfEvolveGracePeriod ?? 3;
|
|
59
|
+
const token = {
|
|
60
|
+
migrationId: crypto.randomUUID().slice(0, 12),
|
|
61
|
+
cycleId: context.cycleId,
|
|
62
|
+
stagedAt: new Date().toISOString(),
|
|
63
|
+
phase: 'staged',
|
|
64
|
+
affectedFiles,
|
|
65
|
+
stagedFileHashes: stagedHashes,
|
|
66
|
+
backupFileHashes: backupHashes,
|
|
67
|
+
ownerPid: process.pid,
|
|
68
|
+
graceRemaining: gracePeriod,
|
|
69
|
+
graceCycleIds: [],
|
|
70
|
+
};
|
|
71
|
+
store.saveEscrowToken(token);
|
|
72
|
+
context.hasSelfModifyOps = true;
|
|
73
|
+
context.selfModifyOpsJson = JSON.stringify(selfOps);
|
|
74
|
+
context.escrowResultJson = JSON.stringify({ staged: true, migrationId: token.migrationId, files: affectedFiles });
|
|
75
|
+
console.log(`\x1b[36m→ Escrow staged: ${affectedFiles.length} file(s), migration ${token.migrationId}\x1b[0m`);
|
|
76
|
+
return { onSuccess: true, onFailure: false, ctx: JSON.stringify(context) };
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
80
|
+
console.error(`\x1b[31m→ Escrow staging failed: ${msg}\x1b[0m`);
|
|
81
|
+
store.clearEscrow();
|
|
82
|
+
context.error = `Escrow staging failed: ${msg}`;
|
|
83
|
+
return { onSuccess: false, onFailure: true, ctx: JSON.stringify(context) };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=genesis-escrow-stage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genesis-escrow-stage.js","sourceRoot":"","sources":["../../src/node-types/genesis-escrow-stage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates staged escrow files. For workflows, runs flow-weaver compile+validate
|
|
3
|
+
* on a temp copy. For TypeScript modules, runs a transpile check.
|
|
4
|
+
*
|
|
5
|
+
* @flowWeaver nodeType
|
|
6
|
+
* @label Genesis Escrow Validate
|
|
7
|
+
* @input ctx [order:0] - Genesis context (JSON)
|
|
8
|
+
* @output ctx [order:0] - Genesis context with escrow validation result (JSON)
|
|
9
|
+
* @output onSuccess [order:-2] - On Success
|
|
10
|
+
* @output onFailure [order:-1] [hidden] - On Failure
|
|
11
|
+
*/
|
|
12
|
+
export declare function genesisEscrowValidate(ctx: string): {
|
|
13
|
+
onSuccess: boolean;
|
|
14
|
+
onFailure: boolean;
|
|
15
|
+
ctx: string;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=genesis-escrow-validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genesis-escrow-validate.d.ts","sourceRoot":"","sources":["../../src/node-types/genesis-escrow-validate.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG;IAClD,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IACvC,GAAG,EAAE,MAAM,CAAC;CACb,CAkGA"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import { execFileSync } from 'node:child_process';
|
|
5
|
+
import { GenesisStore } from '../bot/genesis-store.js';
|
|
6
|
+
/**
|
|
7
|
+
* Validates staged escrow files. For workflows, runs flow-weaver compile+validate
|
|
8
|
+
* on a temp copy. For TypeScript modules, runs a transpile check.
|
|
9
|
+
*
|
|
10
|
+
* @flowWeaver nodeType
|
|
11
|
+
* @label Genesis Escrow Validate
|
|
12
|
+
* @input ctx [order:0] - Genesis context (JSON)
|
|
13
|
+
* @output ctx [order:0] - Genesis context with escrow validation result (JSON)
|
|
14
|
+
* @output onSuccess [order:-2] - On Success
|
|
15
|
+
* @output onFailure [order:-1] [hidden] - On Failure
|
|
16
|
+
*/
|
|
17
|
+
export function genesisEscrowValidate(ctx) {
|
|
18
|
+
const context = JSON.parse(ctx);
|
|
19
|
+
const { env } = context;
|
|
20
|
+
const store = new GenesisStore(env.projectDir);
|
|
21
|
+
const token = store.loadEscrowToken();
|
|
22
|
+
if (!token || token.phase !== 'staged') {
|
|
23
|
+
// No staged escrow: pass through (not an error, just nothing to validate)
|
|
24
|
+
return { onSuccess: true, onFailure: false, ctx: JSON.stringify(context) };
|
|
25
|
+
}
|
|
26
|
+
const packRoot = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..', '..');
|
|
27
|
+
try {
|
|
28
|
+
for (const relFile of token.affectedFiles) {
|
|
29
|
+
const stagedPath = store.getEscrowStagedPath(relFile);
|
|
30
|
+
const content = fs.readFileSync(stagedPath, 'utf-8');
|
|
31
|
+
if (relFile.includes('workflows/')) {
|
|
32
|
+
// Workflow file: write to temp, run compile+validate
|
|
33
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'escrow-validate-'));
|
|
34
|
+
const tmpFile = path.join(tmpDir, path.basename(relFile));
|
|
35
|
+
fs.writeFileSync(tmpFile, content, 'utf-8');
|
|
36
|
+
try {
|
|
37
|
+
execFileSync('flow-weaver', ['compile', tmpFile], {
|
|
38
|
+
cwd: packRoot,
|
|
39
|
+
encoding: 'utf-8',
|
|
40
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
41
|
+
timeout: 30_000,
|
|
42
|
+
});
|
|
43
|
+
execFileSync('flow-weaver', ['validate', tmpFile], {
|
|
44
|
+
cwd: packRoot,
|
|
45
|
+
encoding: 'utf-8',
|
|
46
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
47
|
+
timeout: 30_000,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// TypeScript module: transpile check using tsc --noEmit on a temp file
|
|
56
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'escrow-tsc-'));
|
|
57
|
+
const tmpFile = path.join(tmpDir, path.basename(relFile));
|
|
58
|
+
fs.writeFileSync(tmpFile, content, 'utf-8');
|
|
59
|
+
// Write a minimal tsconfig for the check
|
|
60
|
+
const tsconfig = {
|
|
61
|
+
compilerOptions: {
|
|
62
|
+
target: 'ES2022',
|
|
63
|
+
module: 'Node16',
|
|
64
|
+
moduleResolution: 'Node16',
|
|
65
|
+
noEmit: true,
|
|
66
|
+
strict: true,
|
|
67
|
+
skipLibCheck: true,
|
|
68
|
+
esModuleInterop: true,
|
|
69
|
+
},
|
|
70
|
+
include: [path.basename(relFile)],
|
|
71
|
+
};
|
|
72
|
+
fs.writeFileSync(path.join(tmpDir, 'tsconfig.json'), JSON.stringify(tsconfig), 'utf-8');
|
|
73
|
+
try {
|
|
74
|
+
execFileSync('npx', ['tsc', '--project', path.join(tmpDir, 'tsconfig.json')], {
|
|
75
|
+
cwd: tmpDir,
|
|
76
|
+
encoding: 'utf-8',
|
|
77
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
78
|
+
timeout: 30_000,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
token.phase = 'validated';
|
|
87
|
+
token.validationResult = { compiled: true, validated: true };
|
|
88
|
+
store.saveEscrowToken(token);
|
|
89
|
+
console.log('\x1b[32m→ Escrow validation passed\x1b[0m');
|
|
90
|
+
return { onSuccess: true, onFailure: false, ctx: JSON.stringify(context) };
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
94
|
+
token.phase = 'rolled-back';
|
|
95
|
+
token.rollbackReason = `Validation failed: ${msg.slice(0, 500)}`;
|
|
96
|
+
token.validationResult = { compiled: false, validated: false, error: msg.slice(0, 500) };
|
|
97
|
+
store.saveEscrowToken(token);
|
|
98
|
+
// Clean up staged files
|
|
99
|
+
for (const relFile of token.affectedFiles) {
|
|
100
|
+
try {
|
|
101
|
+
fs.unlinkSync(store.getEscrowStagedPath(relFile));
|
|
102
|
+
}
|
|
103
|
+
catch { /* ignore */ }
|
|
104
|
+
}
|
|
105
|
+
console.error(`\x1b[31m→ Escrow validation failed: ${msg.slice(0, 200)}\x1b[0m`);
|
|
106
|
+
context.error = `Escrow validation failed: ${msg.slice(0, 200)}`;
|
|
107
|
+
return { onSuccess: false, onFailure: true, ctx: JSON.stringify(context) };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=genesis-escrow-validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genesis-escrow-validate.js","sourceRoot":"","sources":["../../src/node-types/genesis-escrow-validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"genesis-load-config.d.ts","sourceRoot":"","sources":["../../src/node-types/genesis-load-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAiC,MAAM,iBAAiB,CAAC;AAGhF;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,GAAG;IACjD,GAAG,EAAE,MAAM,CAAC;CACb,
|
|
1
|
+
{"version":3,"file":"genesis-load-config.d.ts","sourceRoot":"","sources":["../../src/node-types/genesis-load-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAiC,MAAM,iBAAiB,CAAC;AAGhF;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,GAAG;IACjD,GAAG,EAAE,MAAM,CAAC;CACb,CAwBA"}
|