@synergenius/flow-weaver-pack-weaver 0.9.46 → 0.9.47
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval-gate.d.ts","sourceRoot":"","sources":["../../src/node-types/approval-gate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"approval-gate.d.ts","sourceRoot":"","sources":["../../src/node-types/approval-gate.ts"],"names":[],"mappings":"AAoDA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,kBAAkB,CACtC,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,CAwFD"}
|
|
@@ -1,5 +1,41 @@
|
|
|
1
1
|
import { auditEmit } from '../bot/audit-logger.js';
|
|
2
|
-
|
|
2
|
+
const REGISTRY_KEY = '__fw_approval_registry__';
|
|
3
|
+
function getOrCreateRegistry() {
|
|
4
|
+
let map = globalThis[REGISTRY_KEY];
|
|
5
|
+
if (!map) {
|
|
6
|
+
map = new Map();
|
|
7
|
+
globalThis[REGISTRY_KEY] = map;
|
|
8
|
+
}
|
|
9
|
+
return map;
|
|
10
|
+
}
|
|
11
|
+
const approvalRegistryLocal = {
|
|
12
|
+
wait(key, timeoutMs) {
|
|
13
|
+
const pending = getOrCreateRegistry();
|
|
14
|
+
const existing = pending.get(key);
|
|
15
|
+
if (existing) {
|
|
16
|
+
clearTimeout(existing.timer);
|
|
17
|
+
existing.resolve({ approved: true, mode: 'timeout' });
|
|
18
|
+
pending.delete(key);
|
|
19
|
+
}
|
|
20
|
+
return new Promise((resolve) => {
|
|
21
|
+
const timer = setTimeout(() => {
|
|
22
|
+
pending.delete(key);
|
|
23
|
+
resolve({ approved: true, mode: 'timeout' });
|
|
24
|
+
}, timeoutMs);
|
|
25
|
+
pending.set(key, { resolve, timer });
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
resolve(key, decision) {
|
|
29
|
+
const pending = getOrCreateRegistry();
|
|
30
|
+
const entry = pending.get(key);
|
|
31
|
+
if (!entry)
|
|
32
|
+
return false;
|
|
33
|
+
clearTimeout(entry.timer);
|
|
34
|
+
pending.delete(key);
|
|
35
|
+
entry.resolve(decision);
|
|
36
|
+
return true;
|
|
37
|
+
},
|
|
38
|
+
};
|
|
3
39
|
/**
|
|
4
40
|
* Presents the plan to the user for approval. Branching:
|
|
5
41
|
* onSuccess = approved, onFailure = rejected.
|
|
@@ -69,7 +105,7 @@ export async function weaverApprovalGate(execute, ctx) {
|
|
|
69
105
|
prompt: `Review and approve/reject this plan with ${(plan.steps || []).length} steps.`,
|
|
70
106
|
}).then((result) => {
|
|
71
107
|
const approved = result.approved !== false;
|
|
72
|
-
|
|
108
|
+
approvalRegistryLocal.resolve(approvalKey, {
|
|
73
109
|
approved,
|
|
74
110
|
reason: approved ? undefined : (result.reason || 'rejected by agent'),
|
|
75
111
|
mode: 'agent',
|
|
@@ -78,7 +114,7 @@ export async function weaverApprovalGate(execute, ctx) {
|
|
|
78
114
|
// Agent failed — let timeout or UI resolve it
|
|
79
115
|
});
|
|
80
116
|
}
|
|
81
|
-
const decision = await
|
|
117
|
+
const decision = await approvalRegistryLocal.wait(approvalKey, timeoutMs);
|
|
82
118
|
// Log the decision
|
|
83
119
|
const mode = decision.mode ?? 'unknown';
|
|
84
120
|
if (decision.approved) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval-gate.js","sourceRoot":"","sources":["../../src/node-types/approval-gate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"approval-gate.js","sourceRoot":"","sources":["../../src/node-types/approval-gate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,54 @@
|
|
|
1
1
|
import type { WeaverContext } from '../bot/types.js';
|
|
2
2
|
import { auditEmit } from '../bot/audit-logger.js';
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
// Access the approval registry directly from globalThis because this node type
|
|
5
|
+
// runs inside a compiled workflow (temp file) where relative imports don't resolve
|
|
6
|
+
// back to the pack's module graph. globalThis is the only shared state.
|
|
7
|
+
interface ApprovalDecision {
|
|
8
|
+
approved: boolean;
|
|
9
|
+
reason?: string;
|
|
10
|
+
mode?: string;
|
|
11
|
+
}
|
|
12
|
+
interface PendingApproval {
|
|
13
|
+
resolve: (d: ApprovalDecision) => void;
|
|
14
|
+
timer: ReturnType<typeof setTimeout>;
|
|
15
|
+
}
|
|
16
|
+
const REGISTRY_KEY = '__fw_approval_registry__';
|
|
17
|
+
function getOrCreateRegistry(): Map<string, PendingApproval> {
|
|
18
|
+
let map = (globalThis as Record<string, unknown>)[REGISTRY_KEY] as Map<string, PendingApproval> | undefined;
|
|
19
|
+
if (!map) {
|
|
20
|
+
map = new Map();
|
|
21
|
+
(globalThis as Record<string, unknown>)[REGISTRY_KEY] = map;
|
|
22
|
+
}
|
|
23
|
+
return map;
|
|
24
|
+
}
|
|
25
|
+
const approvalRegistryLocal = {
|
|
26
|
+
wait(key: string, timeoutMs: number): Promise<ApprovalDecision> {
|
|
27
|
+
const pending = getOrCreateRegistry();
|
|
28
|
+
const existing = pending.get(key);
|
|
29
|
+
if (existing) {
|
|
30
|
+
clearTimeout(existing.timer);
|
|
31
|
+
existing.resolve({ approved: true, mode: 'timeout' });
|
|
32
|
+
pending.delete(key);
|
|
33
|
+
}
|
|
34
|
+
return new Promise<ApprovalDecision>((resolve) => {
|
|
35
|
+
const timer = setTimeout(() => {
|
|
36
|
+
pending.delete(key);
|
|
37
|
+
resolve({ approved: true, mode: 'timeout' });
|
|
38
|
+
}, timeoutMs);
|
|
39
|
+
pending.set(key, { resolve, timer });
|
|
40
|
+
});
|
|
41
|
+
},
|
|
42
|
+
resolve(key: string, decision: ApprovalDecision): boolean {
|
|
43
|
+
const pending = getOrCreateRegistry();
|
|
44
|
+
const entry = pending.get(key);
|
|
45
|
+
if (!entry) return false;
|
|
46
|
+
clearTimeout(entry.timer);
|
|
47
|
+
pending.delete(key);
|
|
48
|
+
entry.resolve(decision);
|
|
49
|
+
return true;
|
|
50
|
+
},
|
|
51
|
+
};
|
|
4
52
|
|
|
5
53
|
/**
|
|
6
54
|
* Presents the plan to the user for approval. Branching:
|
|
@@ -89,7 +137,7 @@ export async function weaverApprovalGate(
|
|
|
89
137
|
prompt: `Review and approve/reject this plan with ${(plan.steps || []).length} steps.`,
|
|
90
138
|
}).then((result: Record<string, unknown>) => {
|
|
91
139
|
const approved = result.approved !== false;
|
|
92
|
-
|
|
140
|
+
approvalRegistryLocal.resolve(approvalKey, {
|
|
93
141
|
approved,
|
|
94
142
|
reason: approved ? undefined : ((result.reason as string) || 'rejected by agent'),
|
|
95
143
|
mode: 'agent',
|
|
@@ -99,7 +147,7 @@ export async function weaverApprovalGate(
|
|
|
99
147
|
});
|
|
100
148
|
}
|
|
101
149
|
|
|
102
|
-
const decision: ApprovalDecision = await
|
|
150
|
+
const decision: ApprovalDecision = await approvalRegistryLocal.wait(approvalKey, timeoutMs);
|
|
103
151
|
|
|
104
152
|
// Log the decision
|
|
105
153
|
const mode = decision.mode ?? 'unknown';
|