@flowdesk/opencode-plugin 0.1.12 → 0.1.14
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/README.md +1 -1
- package/dist/agent-task-output.d.ts +17 -0
- package/dist/agent-task-output.d.ts.map +1 -0
- package/dist/agent-task-output.js +119 -0
- package/dist/agent-task-output.js.map +1 -0
- package/dist/agent-task-runner.d.ts +24 -0
- package/dist/agent-task-runner.d.ts.map +1 -1
- package/dist/agent-task-runner.js +536 -61
- package/dist/agent-task-runner.js.map +1 -1
- package/dist/auto-continue-preview-tool.d.ts +36 -0
- package/dist/auto-continue-preview-tool.d.ts.map +1 -0
- package/dist/auto-continue-preview-tool.js +119 -0
- package/dist/auto-continue-preview-tool.js.map +1 -0
- package/dist/completion-ui-cache.d.ts +6 -0
- package/dist/completion-ui-cache.d.ts.map +1 -0
- package/dist/completion-ui-cache.js +260 -0
- package/dist/completion-ui-cache.js.map +1 -0
- package/dist/controlled-write-tool.d.ts +49 -0
- package/dist/controlled-write-tool.d.ts.map +1 -0
- package/dist/controlled-write-tool.js +296 -0
- package/dist/controlled-write-tool.js.map +1 -0
- package/dist/event-hook-observer.d.ts +14 -0
- package/dist/event-hook-observer.d.ts.map +1 -0
- package/dist/event-hook-observer.js +193 -0
- package/dist/event-hook-observer.js.map +1 -0
- package/dist/managed-dispatch-adapter.d.ts +1 -0
- package/dist/managed-dispatch-adapter.d.ts.map +1 -1
- package/dist/managed-dispatch-adapter.js +100 -29
- package/dist/managed-dispatch-adapter.js.map +1 -1
- package/dist/model-selection-engine.d.ts +47 -0
- package/dist/model-selection-engine.d.ts.map +1 -0
- package/dist/model-selection-engine.js +175 -0
- package/dist/model-selection-engine.js.map +1 -0
- package/dist/provider-usage-live-tool.d.ts +27 -0
- package/dist/provider-usage-live-tool.d.ts.map +1 -1
- package/dist/provider-usage-live-tool.js +443 -4
- package/dist/provider-usage-live-tool.js.map +1 -1
- package/dist/quick-reviewer-run.d.ts +3 -0
- package/dist/quick-reviewer-run.d.ts.map +1 -1
- package/dist/quick-reviewer-run.js +20 -8
- package/dist/quick-reviewer-run.js.map +1 -1
- package/dist/runtime-reviewer-execution-bridge.d.ts +21 -0
- package/dist/runtime-reviewer-execution-bridge.d.ts.map +1 -1
- package/dist/runtime-reviewer-execution-bridge.js +238 -0
- package/dist/runtime-reviewer-execution-bridge.js.map +1 -1
- package/dist/server.d.ts +60 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +800 -41
- package/dist/server.js.map +1 -1
- package/dist/stall-recovery.d.ts +60 -0
- package/dist/stall-recovery.d.ts.map +1 -1
- package/dist/stall-recovery.js +763 -11
- package/dist/stall-recovery.js.map +1 -1
- package/dist/status-live-tool.d.ts +81 -0
- package/dist/status-live-tool.d.ts.map +1 -1
- package/dist/status-live-tool.js +620 -38
- package/dist/status-live-tool.js.map +1 -1
- package/dist/tui-subtask-activity.d.ts +69 -0
- package/dist/tui-subtask-activity.d.ts.map +1 -0
- package/dist/tui-subtask-activity.js +266 -0
- package/dist/tui-subtask-activity.js.map +1 -0
- package/dist/tui-usage-snapshot.d.ts +44 -0
- package/dist/tui-usage-snapshot.d.ts.map +1 -0
- package/dist/tui-usage-snapshot.js +397 -0
- package/dist/tui-usage-snapshot.js.map +1 -0
- package/dist/tui.d.ts +7 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +134 -0
- package/dist/tui.js.map +1 -0
- package/dist/workflow-assign-tool.d.ts +23 -0
- package/dist/workflow-assign-tool.d.ts.map +1 -0
- package/dist/workflow-assign-tool.js +117 -0
- package/dist/workflow-assign-tool.js.map +1 -0
- package/dist/workflow-author-tool.d.ts +29 -0
- package/dist/workflow-author-tool.d.ts.map +1 -0
- package/dist/workflow-author-tool.js +227 -0
- package/dist/workflow-author-tool.js.map +1 -0
- package/dist/workflow-dispatch-plan-tool.d.ts +47 -0
- package/dist/workflow-dispatch-plan-tool.d.ts.map +1 -0
- package/dist/workflow-dispatch-plan-tool.js +251 -0
- package/dist/workflow-dispatch-plan-tool.js.map +1 -0
- package/dist/workflow-dispatch-tool.d.ts +56 -0
- package/dist/workflow-dispatch-tool.d.ts.map +1 -0
- package/dist/workflow-dispatch-tool.js +306 -0
- package/dist/workflow-dispatch-tool.js.map +1 -0
- package/dist/workflow-orchestrator.d.ts +31 -0
- package/dist/workflow-orchestrator.d.ts.map +1 -0
- package/dist/workflow-orchestrator.js +160 -0
- package/dist/workflow-orchestrator.js.map +1 -0
- package/dist/workflow-scheduler.d.ts +19 -0
- package/dist/workflow-scheduler.d.ts.map +1 -0
- package/dist/workflow-scheduler.js +45 -0
- package/dist/workflow-scheduler.js.map +1 -0
- package/dist/workflow-synthesis-tool.d.ts +31 -0
- package/dist/workflow-synthesis-tool.d.ts.map +1 -0
- package/dist/workflow-synthesis-tool.js +194 -0
- package/dist/workflow-synthesis-tool.js.map +1 -0
- package/package.json +10 -2
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { chmodSync, existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import { dirname, resolve, sep } from "node:path";
|
|
4
|
+
import { applyFlowDeskSessionEvidenceWriteIntentsV1, prepareFlowDeskSessionEvidenceWriteIntentV1, reloadFlowDeskSessionEvidenceV1, } from "@flowdesk/core";
|
|
5
|
+
const maxReplacementTextLength = 200_000;
|
|
6
|
+
function sha256Ref(content) {
|
|
7
|
+
return `sha256-${createHash("sha256").update(content).digest("hex")}`;
|
|
8
|
+
}
|
|
9
|
+
function safeNextActions() {
|
|
10
|
+
return ["/flowdesk-status", "/flowdesk-export-debug", "/flowdesk-doctor"];
|
|
11
|
+
}
|
|
12
|
+
function authority(input) {
|
|
13
|
+
return {
|
|
14
|
+
realOpenCodeDispatch: false,
|
|
15
|
+
providerCall: false,
|
|
16
|
+
runtimeExecution: false,
|
|
17
|
+
actualLaneLaunch: false,
|
|
18
|
+
fallbackAuthority: false,
|
|
19
|
+
hardCancelOrNoReplyAuthority: false,
|
|
20
|
+
toolAuthority: false,
|
|
21
|
+
dispatchAuthorityEnabled: false,
|
|
22
|
+
defaultRelease1WriteAuthority: false,
|
|
23
|
+
controlledExternalWriteAuthorized: input.writeAuthorized,
|
|
24
|
+
developerModeAcknowledged: input.developerModeAcknowledged,
|
|
25
|
+
allowControlledWrite: input.allowControlledWrite,
|
|
26
|
+
ledgerEvidenceReloaded: input.ledgerEvidenceReloaded,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function blocked(input) {
|
|
30
|
+
return {
|
|
31
|
+
status: "blocked_before_controlled_write",
|
|
32
|
+
...(input.request.workflowId === undefined ? {} : { workflowId: input.request.workflowId }),
|
|
33
|
+
...(input.request.targetFilePath === undefined ? {} : { targetFilePath: input.request.targetFilePath }),
|
|
34
|
+
redactedBlockReason: input.reason,
|
|
35
|
+
summaryForUser: `FlowDesk controlled write blocked: ${input.reason}.`,
|
|
36
|
+
safeNextActions: safeNextActions(),
|
|
37
|
+
authority: authority({
|
|
38
|
+
developerModeAcknowledged: input.request.developerModeAcknowledged === true,
|
|
39
|
+
allowControlledWrite: input.request.allowControlledWrite === true,
|
|
40
|
+
ledgerEvidenceReloaded: input.ledgerEvidenceReloaded === true,
|
|
41
|
+
writeAuthorized: false,
|
|
42
|
+
}),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function isRecord(value) {
|
|
46
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
47
|
+
}
|
|
48
|
+
function normalizeRequest(value) {
|
|
49
|
+
if (!isRecord(value))
|
|
50
|
+
return {};
|
|
51
|
+
return {
|
|
52
|
+
...(typeof value.workflowId === "string" ? { workflowId: value.workflowId } : {}),
|
|
53
|
+
...(typeof value.targetFilePath === "string" ? { targetFilePath: value.targetFilePath } : {}),
|
|
54
|
+
...(typeof value.expectedSha256 === "string" ? { expectedSha256: value.expectedSha256 } : {}),
|
|
55
|
+
...(typeof value.expectedContentSha256 === "string" ? { expectedContentSha256: value.expectedContentSha256 } : {}),
|
|
56
|
+
allowMissingExpectedHashForDevMode: value.allowMissingExpectedHashForDevMode === true,
|
|
57
|
+
...(typeof value.replacementText === "string" ? { replacementText: value.replacementText } : {}),
|
|
58
|
+
...(typeof value.reasonSummary === "string" ? { reasonSummary: value.reasonSummary } : {}),
|
|
59
|
+
developerModeAcknowledged: value.developerModeAcknowledged === true,
|
|
60
|
+
...(typeof value.userApprovalRef === "string" ? { userApprovalRef: value.userApprovalRef } : {}),
|
|
61
|
+
allowControlledWrite: value.allowControlledWrite === true,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function stableToken(value, fallback) {
|
|
65
|
+
const token = value.replaceAll(/[^A-Za-z0-9_.:-]/g, "-").slice(0, 96);
|
|
66
|
+
return token.length >= 3 ? token : fallback;
|
|
67
|
+
}
|
|
68
|
+
function validateRelativeTarget(value) {
|
|
69
|
+
if (typeof value !== "string" || value.trim().length === 0)
|
|
70
|
+
return "targetFilePath is required";
|
|
71
|
+
if (value.length > 500)
|
|
72
|
+
return "targetFilePath exceeds max length 500";
|
|
73
|
+
if (value.startsWith("/") ||
|
|
74
|
+
/^[A-Za-z]:[\\/]/.test(value) ||
|
|
75
|
+
value.startsWith("~") ||
|
|
76
|
+
value.includes("\\") ||
|
|
77
|
+
value.includes("//") ||
|
|
78
|
+
value === "." ||
|
|
79
|
+
value === ".." ||
|
|
80
|
+
value.startsWith("../") ||
|
|
81
|
+
value.includes("/../") ||
|
|
82
|
+
value.endsWith("/..") ||
|
|
83
|
+
value.startsWith("./") ||
|
|
84
|
+
value.includes("/./") ||
|
|
85
|
+
value.endsWith("/"))
|
|
86
|
+
return "targetFilePath must be a relative workspace file path without traversal";
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
function validateText(value, label, maxLength) {
|
|
90
|
+
if (typeof value !== "string" || value.length === 0)
|
|
91
|
+
return `${label} is required`;
|
|
92
|
+
if (value.length > maxLength)
|
|
93
|
+
return `${label} exceeds max length ${maxLength}`;
|
|
94
|
+
if (value.includes("\u0000"))
|
|
95
|
+
return `${label} contains a binary NUL marker`;
|
|
96
|
+
if (/\b(system prompt|developer message|transcript|provider payload|provider response|api[_-]?key|bearer\s+[A-Za-z0-9]|token[:=]|credential|secret)\b/i.test(value))
|
|
97
|
+
return `${label} contains forbidden raw or credential-shaped marker`;
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
function safeJoinUnderRoot(rootDir, relativePath) {
|
|
101
|
+
const root = realpathSync.native(resolve(rootDir));
|
|
102
|
+
const target = resolve(root, relativePath);
|
|
103
|
+
const rootPrefix = root.endsWith(sep) ? root : `${root}${sep}`;
|
|
104
|
+
if (target !== root && !target.startsWith(rootPrefix))
|
|
105
|
+
throw new Error("controlled write target escapes workspace root");
|
|
106
|
+
return target;
|
|
107
|
+
}
|
|
108
|
+
function ensureNoSymlinkEscape(rootDir, relativePath) {
|
|
109
|
+
const root = resolve(rootDir);
|
|
110
|
+
if (!existsSync(root))
|
|
111
|
+
throw new Error("workspace root does not exist");
|
|
112
|
+
if (lstatSync(root).isSymbolicLink())
|
|
113
|
+
throw new Error("workspace root must not be a symlink");
|
|
114
|
+
const parts = dirname(relativePath).split("/").filter(Boolean);
|
|
115
|
+
let current = root;
|
|
116
|
+
for (const part of parts) {
|
|
117
|
+
current = resolve(current, part);
|
|
118
|
+
if (existsSync(current) && lstatSync(current).isSymbolicLink())
|
|
119
|
+
throw new Error("controlled write parent directory must not be a symlink");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function readUtf8IfSafe(target) {
|
|
123
|
+
if (!existsSync(target))
|
|
124
|
+
return { ok: false, reason: "target file does not exist" };
|
|
125
|
+
const stat = lstatSync(target);
|
|
126
|
+
if (stat.isSymbolicLink())
|
|
127
|
+
return { ok: false, reason: "target file must not be a symlink" };
|
|
128
|
+
if (!stat.isFile())
|
|
129
|
+
return { ok: false, reason: "target path must be a regular file" };
|
|
130
|
+
if (stat.size > maxReplacementTextLength)
|
|
131
|
+
return { ok: false, reason: "target file exceeds controlled write size limit" };
|
|
132
|
+
const bytes = readFileSync(target);
|
|
133
|
+
if (bytes.includes(0))
|
|
134
|
+
return { ok: false, reason: "target file appears binary" };
|
|
135
|
+
return { ok: true, content: bytes.toString("utf8"), mode: stat.mode };
|
|
136
|
+
}
|
|
137
|
+
function rollbackTarget(target, previousContent, mode) {
|
|
138
|
+
const rollbackTemp = `${target}.tmp-flowdesk-controlled-write-rollback-${process.pid}`;
|
|
139
|
+
writeFileSync(rollbackTemp, previousContent, "utf8");
|
|
140
|
+
if (mode !== undefined)
|
|
141
|
+
chmodSync(rollbackTemp, mode);
|
|
142
|
+
renameSync(rollbackTemp, target);
|
|
143
|
+
}
|
|
144
|
+
export function executeFlowDeskControlledWriteApplyToolV1(input) {
|
|
145
|
+
const request = input.request ?? normalizeRequest(input.rawInput);
|
|
146
|
+
if (typeof input.config.durableStateRoot !== "string" || input.config.durableStateRoot.trim().length === 0)
|
|
147
|
+
return blocked({ request, reason: "controlled write requires a durable state root directory" });
|
|
148
|
+
if (typeof input.config.workspaceRoot !== "string" || input.config.workspaceRoot.trim().length === 0)
|
|
149
|
+
return blocked({ request, reason: "controlled write requires a workspace root directory" });
|
|
150
|
+
if (request.developerModeAcknowledged !== true)
|
|
151
|
+
return blocked({ request, reason: "developerModeAcknowledged=true is required" });
|
|
152
|
+
if (request.allowControlledWrite !== true)
|
|
153
|
+
return blocked({ request, reason: "allowControlledWrite=true is required" });
|
|
154
|
+
if (typeof request.userApprovalRef !== "string" || request.userApprovalRef.trim().length === 0 || request.userApprovalRef.length > 128)
|
|
155
|
+
return blocked({ request, reason: "bounded userApprovalRef is required" });
|
|
156
|
+
if (typeof request.workflowId !== "string" || request.workflowId.trim().length === 0)
|
|
157
|
+
return blocked({ request, reason: "workflowId is required" });
|
|
158
|
+
const targetError = validateRelativeTarget(request.targetFilePath);
|
|
159
|
+
if (targetError !== undefined)
|
|
160
|
+
return blocked({ request, reason: targetError });
|
|
161
|
+
const replacementError = validateText(request.replacementText, "replacementText", maxReplacementTextLength);
|
|
162
|
+
if (replacementError !== undefined)
|
|
163
|
+
return blocked({ request, reason: replacementError });
|
|
164
|
+
const reasonError = validateText(request.reasonSummary, "reasonSummary", 500);
|
|
165
|
+
if (reasonError !== undefined)
|
|
166
|
+
return blocked({ request, reason: reasonError });
|
|
167
|
+
const expectedHash = request.expectedContentSha256 ?? request.expectedSha256;
|
|
168
|
+
if (expectedHash === undefined && request.allowMissingExpectedHashForDevMode !== true)
|
|
169
|
+
return blocked({ request, reason: "expectedSha256 or expectedContentSha256 is required unless allowMissingExpectedHashForDevMode=true" });
|
|
170
|
+
if (expectedHash !== undefined && !/^sha256-[a-f0-9]{64}$/.test(expectedHash))
|
|
171
|
+
return blocked({ request, reason: "expected content hash must be sha256-<64 lowercase hex>" });
|
|
172
|
+
const targetFilePath = request.targetFilePath;
|
|
173
|
+
const replacementText = request.replacementText;
|
|
174
|
+
const workflowId = stableToken(request.workflowId, "workflow-controlled-write");
|
|
175
|
+
const observed = input.now ? input.now() : new Date();
|
|
176
|
+
const stamp = observed.toISOString().replaceAll(/[-:.]/g, "").replace("Z", "Z");
|
|
177
|
+
const ledgerEntryId = stableToken(`controlled-write-${workflowId}-${stamp}`, `controlled-write-${stamp}`);
|
|
178
|
+
let target;
|
|
179
|
+
try {
|
|
180
|
+
ensureNoSymlinkEscape(input.config.workspaceRoot, targetFilePath);
|
|
181
|
+
target = safeJoinUnderRoot(input.config.workspaceRoot, targetFilePath);
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
return blocked({ request, reason: error instanceof Error ? error.message : "controlled write path resolution failed" });
|
|
185
|
+
}
|
|
186
|
+
const current = readUtf8IfSafe(target);
|
|
187
|
+
if (!current.ok)
|
|
188
|
+
return blocked({ request, reason: current.reason });
|
|
189
|
+
const previousContentSha256Ref = sha256Ref(current.content);
|
|
190
|
+
if (expectedHash !== undefined && previousContentSha256Ref !== expectedHash)
|
|
191
|
+
return blocked({ request, reason: "expected content hash mismatch" });
|
|
192
|
+
const replacementContentSha256Ref = sha256Ref(replacementText);
|
|
193
|
+
const record = {
|
|
194
|
+
schema_version: "flowdesk.controlled_workspace_file_write.v1",
|
|
195
|
+
ledger_entry_id: ledgerEntryId,
|
|
196
|
+
workflow_id: workflowId,
|
|
197
|
+
user_approval_ref: request.userApprovalRef,
|
|
198
|
+
target_file_path: targetFilePath,
|
|
199
|
+
...(expectedHash === undefined ? {} : { expected_content_sha256_ref: expectedHash }),
|
|
200
|
+
previous_content_sha256_ref: previousContentSha256Ref,
|
|
201
|
+
replacement_content_sha256_ref: replacementContentSha256Ref,
|
|
202
|
+
reason_summary: request.reasonSummary.trim().slice(0, 500),
|
|
203
|
+
materialized_at: observed.toISOString(),
|
|
204
|
+
dev_beta_explicit_opt_in: true,
|
|
205
|
+
developer_mode_acknowledged: true,
|
|
206
|
+
allow_controlled_write: true,
|
|
207
|
+
local_only: true,
|
|
208
|
+
writeAttempted: true,
|
|
209
|
+
remoteWriteAttempted: false,
|
|
210
|
+
githubWriteAttempted: false,
|
|
211
|
+
connectorWriteAttempted: false,
|
|
212
|
+
storageWriteAttempted: false,
|
|
213
|
+
databaseWriteAttempted: false,
|
|
214
|
+
urlWriteAttempted: false,
|
|
215
|
+
rawPathWriteAttempted: false,
|
|
216
|
+
dispatch_authority_enabled: false,
|
|
217
|
+
realOpenCodeDispatch: false,
|
|
218
|
+
providerCall: false,
|
|
219
|
+
actualLaneLaunch: false,
|
|
220
|
+
runtimeExecution: false,
|
|
221
|
+
fallbackAuthority: false,
|
|
222
|
+
toolAuthority: false,
|
|
223
|
+
hardCancelOrNoReplyAuthority: false,
|
|
224
|
+
};
|
|
225
|
+
const prepared = prepareFlowDeskSessionEvidenceWriteIntentV1({
|
|
226
|
+
workflowId,
|
|
227
|
+
evidenceId: ledgerEntryId,
|
|
228
|
+
record,
|
|
229
|
+
});
|
|
230
|
+
if (!prepared.ok || prepared.writeIntent === undefined)
|
|
231
|
+
return blocked({ request, reason: prepared.errors.join(", ") || "controlled write ledger evidence is invalid" });
|
|
232
|
+
const preReload = reloadFlowDeskSessionEvidenceV1({ workflowId, rootDir: input.config.durableStateRoot });
|
|
233
|
+
if (!preReload.ok || preReload.blocked.length > 0)
|
|
234
|
+
return blocked({ request, reason: "controlled write pre-write evidence reload failed" });
|
|
235
|
+
const temp = `${target}.tmp-flowdesk-controlled-write-${process.pid}-${stamp}`;
|
|
236
|
+
try {
|
|
237
|
+
if (dirname(target) !== dirname(temp))
|
|
238
|
+
return blocked({ request, reason: "controlled write temp path must stay beside target" });
|
|
239
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
240
|
+
writeFileSync(temp, replacementText, "utf8");
|
|
241
|
+
if (current.mode !== undefined)
|
|
242
|
+
chmodSync(temp, current.mode);
|
|
243
|
+
renameSync(temp, target);
|
|
244
|
+
const written = readFileSync(target, "utf8");
|
|
245
|
+
if (sha256Ref(written) !== replacementContentSha256Ref) {
|
|
246
|
+
rollbackTarget(target, current.content, current.mode);
|
|
247
|
+
return blocked({ request, reason: "controlled write replacement hash verification failed" });
|
|
248
|
+
}
|
|
249
|
+
const applied = applyFlowDeskSessionEvidenceWriteIntentsV1(input.config.durableStateRoot, [prepared.writeIntent]);
|
|
250
|
+
if (!applied.ok) {
|
|
251
|
+
rollbackTarget(target, current.content, current.mode);
|
|
252
|
+
return blocked({ request, reason: applied.errors.join(", ") || "controlled write ledger write failed" });
|
|
253
|
+
}
|
|
254
|
+
const reloaded = reloadFlowDeskSessionEvidenceV1({ workflowId, rootDir: input.config.durableStateRoot });
|
|
255
|
+
const ledgerReloaded = reloaded.ok &&
|
|
256
|
+
reloaded.blocked.length === 0 &&
|
|
257
|
+
reloaded.entries.some((entry) => entry.evidenceClass === "controlled_workspace_file_write" &&
|
|
258
|
+
entry.evidenceId === ledgerEntryId &&
|
|
259
|
+
entry.record.replacement_content_sha256_ref === replacementContentSha256Ref);
|
|
260
|
+
if (!ledgerReloaded) {
|
|
261
|
+
rollbackTarget(target, current.content, current.mode);
|
|
262
|
+
return blocked({ request, reason: "controlled write ledger reload failed" });
|
|
263
|
+
}
|
|
264
|
+
const finalStat = statSync(target);
|
|
265
|
+
if (!finalStat.isFile()) {
|
|
266
|
+
rollbackTarget(target, current.content, current.mode);
|
|
267
|
+
return blocked({ request, reason: "controlled write final target is not a regular file" });
|
|
268
|
+
}
|
|
269
|
+
return {
|
|
270
|
+
status: "controlled_write_applied",
|
|
271
|
+
workflowId,
|
|
272
|
+
targetFilePath,
|
|
273
|
+
ledgerEntryId,
|
|
274
|
+
previousContentSha256Ref,
|
|
275
|
+
replacementContentSha256Ref,
|
|
276
|
+
summaryForUser: `FlowDesk dev-mode controlled write applied to ${targetFilePath} and recorded durable ledger evidence ${ledgerEntryId}.`,
|
|
277
|
+
safeNextActions: safeNextActions(),
|
|
278
|
+
authority: authority({
|
|
279
|
+
developerModeAcknowledged: true,
|
|
280
|
+
allowControlledWrite: true,
|
|
281
|
+
ledgerEvidenceReloaded: true,
|
|
282
|
+
writeAuthorized: true,
|
|
283
|
+
}),
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
try {
|
|
288
|
+
rmSync(temp, { force: true });
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
// Best-effort cleanup only; result remains blocked.
|
|
292
|
+
}
|
|
293
|
+
return blocked({ request, reason: error instanceof Error ? error.message : "controlled write failed" });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=controlled-write-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controlled-write-tool.js","sourceRoot":"","sources":["../src/controlled-write-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACN,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,MAAM,EACN,QAAQ,EACR,aAAa,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EACN,0CAA0C,EAC1C,2CAA2C,EAC3C,+BAA+B,GAE/B,MAAM,gBAAgB,CAAC;AA+CxB,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAEzC,SAAS,SAAS,CAAC,OAAwB;IAC1C,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,eAAe;IACvB,OAAO,CAAC,kBAAkB,EAAE,wBAAwB,EAAE,kBAAkB,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,SAAS,CAAC,KAKlB;IACA,OAAO;QACN,oBAAoB,EAAE,KAAK;QAC3B,YAAY,EAAE,KAAK;QACnB,gBAAgB,EAAE,KAAK;QACvB,gBAAgB,EAAE,KAAK;QACvB,iBAAiB,EAAE,KAAK;QACxB,4BAA4B,EAAE,KAAK;QACnC,aAAa,EAAE,KAAK;QACpB,wBAAwB,EAAE,KAAK;QAC/B,6BAA6B,EAAE,KAAK;QACpC,iCAAiC,EAAE,KAAK,CAAC,eAAe;QACxD,yBAAyB,EAAE,KAAK,CAAC,yBAAyB;QAC1D,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;QAChD,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;KACpD,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAIhB;IACA,OAAO;QACN,MAAM,EAAE,iCAAiC;QACzC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3F,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QACvG,mBAAmB,EAAE,KAAK,CAAC,MAAM;QACjC,cAAc,EAAE,sCAAsC,KAAK,CAAC,MAAM,GAAG;QACrE,eAAe,EAAE,eAAe,EAAE;QAClC,SAAS,EAAE,SAAS,CAAC;YACpB,yBAAyB,EAAE,KAAK,CAAC,OAAO,CAAC,yBAAyB,KAAK,IAAI;YAC3E,oBAAoB,EAAE,KAAK,CAAC,OAAO,CAAC,oBAAoB,KAAK,IAAI;YACjE,sBAAsB,EAAE,KAAK,CAAC,sBAAsB,KAAK,IAAI;YAC7D,eAAe,EAAE,KAAK;SACtB,CAAC;KACF,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO;QACN,GAAG,CAAC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,GAAG,CAAC,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,GAAG,CAAC,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,GAAG,CAAC,OAAO,KAAK,CAAC,qBAAqB,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClH,kCAAkC,EAAE,KAAK,CAAC,kCAAkC,KAAK,IAAI;QACrF,GAAG,CAAC,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,GAAG,CAAC,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,yBAAyB,EAAE,KAAK,CAAC,yBAAyB,KAAK,IAAI;QACnE,GAAG,CAAC,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,oBAAoB,EAAE,KAAK,CAAC,oBAAoB,KAAK,IAAI;KACzD,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,QAAgB;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtE,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7C,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAyB;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,4BAA4B,CAAC;IAChG,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;QAAE,OAAO,uCAAuC,CAAC;IACvE,IACC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QACrB,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC7B,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QACrB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpB,KAAK,KAAK,GAAG;QACb,KAAK,KAAK,IAAI;QACd,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;QACvB,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QACtB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QACrB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QACtB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QACrB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAEnB,OAAO,yEAAyE,CAAC;IAClF,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,KAAyB,EAAE,KAAa,EAAE,SAAiB;IAChF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,KAAK,cAAc,CAAC;IACnF,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS;QAAE,OAAO,GAAG,KAAK,uBAAuB,SAAS,EAAE,CAAC;IAChF,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,GAAG,KAAK,+BAA+B,CAAC;IAC7E,IAAI,mJAAmJ,CAAC,IAAI,CAAC,KAAK,CAAC;QAClK,OAAO,GAAG,KAAK,qDAAqD,CAAC;IACtE,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,YAAoB;IAC/D,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC;IAC/D,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACnE,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe,EAAE,YAAoB;IACnE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACxE,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC9F,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACjC,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE;YAC7D,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;AACF,CAAC;AAED,SAAS,cAAc,CAAC,MAAc;IACrC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;IACpF,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mCAAmC,EAAE,CAAC;IAC7F,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,oCAAoC,EAAE,CAAC;IACvF,IAAI,IAAI,CAAC,IAAI,GAAG,wBAAwB;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iDAAiD,EAAE,CAAC;IAC1H,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;IAClF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,eAAuB,EAAE,IAAwB;IACxF,MAAM,YAAY,GAAG,GAAG,MAAM,2CAA2C,OAAO,CAAC,GAAG,EAAE,CAAC;IACvF,aAAa,CAAC,YAAY,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IACrD,IAAI,IAAI,KAAK,SAAS;QAAE,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACtD,UAAU,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,yCAAyC,CAAC,KAKzD;IACA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClE,IAAI,OAAO,KAAK,CAAC,MAAM,CAAC,gBAAgB,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QACzG,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,0DAA0D,EAAE,CAAC,CAAC;IACjG,IAAI,OAAO,KAAK,CAAC,MAAM,CAAC,aAAa,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QACnG,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,sDAAsD,EAAE,CAAC,CAAC;IAC7F,IAAI,OAAO,CAAC,yBAAyB,KAAK,IAAI;QAC7C,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,4CAA4C,EAAE,CAAC,CAAC;IACnF,IAAI,OAAO,CAAC,oBAAoB,KAAK,IAAI;QACxC,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,uCAAuC,EAAE,CAAC,CAAC;IAC9E,IAAI,OAAO,OAAO,CAAC,eAAe,KAAK,QAAQ,IAAI,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,GAAG;QACrI,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC,CAAC;IAC5E,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QACnF,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACnE,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAChF,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,iBAAiB,EAAE,wBAAwB,CAAC,CAAC;IAC5G,IAAI,gBAAgB,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC1F,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;IAC9E,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAChF,MAAM,YAAY,GAAG,OAAO,CAAC,qBAAqB,IAAI,OAAO,CAAC,cAAc,CAAC;IAC7E,IAAI,YAAY,KAAK,SAAS,IAAI,OAAO,CAAC,kCAAkC,KAAK,IAAI;QACpF,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,oGAAoG,EAAE,CAAC,CAAC;IAC3I,IAAI,YAAY,KAAK,SAAS,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,YAAY,CAAC;QAC5E,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,yDAAyD,EAAE,CAAC,CAAC;IAEhG,MAAM,cAAc,GAAG,OAAO,CAAC,cAAwB,CAAC;IACxD,MAAM,eAAe,GAAG,OAAO,CAAC,eAAyB,CAAC;IAC1D,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;IAChF,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAChF,MAAM,aAAa,GAAG,WAAW,CAAC,oBAAoB,UAAU,IAAI,KAAK,EAAE,EAAE,oBAAoB,KAAK,EAAE,CAAC,CAAC;IAC1G,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACJ,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAClE,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yCAAyC,EAAE,CAAC,CAAC;IACzH,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,MAAM,wBAAwB,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,IAAI,YAAY,KAAK,SAAS,IAAI,wBAAwB,KAAK,YAAY;QAC1E,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAC,CAAC;IACvE,MAAM,2BAA2B,GAAG,SAAS,CAAC,eAAe,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAiD;QAC5D,cAAc,EAAE,6CAA6C;QAC7D,eAAe,EAAE,aAAa;QAC9B,WAAW,EAAE,UAAU;QACvB,iBAAiB,EAAE,OAAO,CAAC,eAAyB;QACpD,gBAAgB,EAAE,cAAc;QAChC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,2BAA2B,EAAE,YAAY,EAAE,CAAC;QACpF,2BAA2B,EAAE,wBAAwB;QACrD,8BAA8B,EAAE,2BAA2B;QAC3D,cAAc,EAAG,OAAO,CAAC,aAAwB,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QACtE,eAAe,EAAE,QAAQ,CAAC,WAAW,EAAE;QACvC,wBAAwB,EAAE,IAAI;QAC9B,2BAA2B,EAAE,IAAI;QACjC,sBAAsB,EAAE,IAAI;QAC5B,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,IAAI;QACpB,oBAAoB,EAAE,KAAK;QAC3B,oBAAoB,EAAE,KAAK;QAC3B,uBAAuB,EAAE,KAAK;QAC9B,qBAAqB,EAAE,KAAK;QAC5B,sBAAsB,EAAE,KAAK;QAC7B,iBAAiB,EAAE,KAAK;QACxB,qBAAqB,EAAE,KAAK;QAC5B,0BAA0B,EAAE,KAAK;QACjC,oBAAoB,EAAE,KAAK;QAC3B,YAAY,EAAE,KAAK;QACnB,gBAAgB,EAAE,KAAK;QACvB,gBAAgB,EAAE,KAAK;QACvB,iBAAiB,EAAE,KAAK;QACxB,aAAa,EAAE,KAAK;QACpB,4BAA4B,EAAE,KAAK;KACnC,CAAC;IACF,MAAM,QAAQ,GAAG,2CAA2C,CAAC;QAC5D,UAAU;QACV,UAAU,EAAE,aAAa;QACzB,MAAM;KACN,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS;QACrD,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,6CAA6C,EAAE,CAAC,CAAC;IAClH,MAAM,SAAS,GAAG,+BAA+B,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC1G,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAChD,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,mDAAmD,EAAE,CAAC,CAAC;IAE1F,MAAM,IAAI,GAAG,GAAG,MAAM,kCAAkC,OAAO,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC;IAC/E,IAAI,CAAC;QACJ,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC;YACpC,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,oDAAoD,EAAE,CAAC,CAAC;QAC3F,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,aAAa,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9D,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,2BAA2B,EAAE,CAAC;YACxD,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACtD,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,uDAAuD,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,OAAO,GAAG,0CAA0C,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;QAClH,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YACjB,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACtD,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sCAAsC,EAAE,CAAC,CAAC;QAC1G,CAAC;QACD,MAAM,QAAQ,GAAG,+BAA+B,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACzG,MAAM,cAAc,GACnB,QAAQ,CAAC,EAAE;YACX,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAC7B,QAAQ,CAAC,OAAO,CAAC,IAAI,CACpB,CAAC,KAAK,EAAE,EAAE,CACT,KAAK,CAAC,aAAa,KAAK,iCAAiC;gBACzD,KAAK,CAAC,UAAU,KAAK,aAAa;gBAClC,KAAK,CAAC,MAAM,CAAC,8BAA8B,KAAK,2BAA2B,CAC5E,CAAC;QACH,IAAI,CAAC,cAAc,EAAE,CAAC;YACrB,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACtD,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,uCAAuC,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YACzB,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACtD,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,qDAAqD,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO;YACN,MAAM,EAAE,0BAA0B;YAClC,UAAU;YACV,cAAc;YACd,aAAa;YACb,wBAAwB;YACxB,2BAA2B;YAC3B,cAAc,EAAE,iDAAiD,cAAc,yCAAyC,aAAa,GAAG;YACxI,eAAe,EAAE,eAAe,EAAE;YAClC,SAAS,EAAE,SAAS,CAAC;gBACpB,yBAAyB,EAAE,IAAI;gBAC/B,oBAAoB,EAAE,IAAI;gBAC1B,sBAAsB,EAAE,IAAI;gBAC5B,eAAe,EAAE,IAAI;aACrB,CAAC;SACF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC;YACJ,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACR,oDAAoD;QACrD,CAAC;QACD,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,EAAE,CAAC,CAAC;IACzG,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface FlowDeskEventHookObservationResultV1 {
|
|
2
|
+
matched: boolean;
|
|
3
|
+
eventType?: string;
|
|
4
|
+
sessionId?: string;
|
|
5
|
+
workflowId?: string;
|
|
6
|
+
laneId?: string;
|
|
7
|
+
taskId?: string;
|
|
8
|
+
evidenceWritten: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function observeFlowDeskOpenCodeEventV1(input: {
|
|
11
|
+
rootDir: string;
|
|
12
|
+
event: unknown;
|
|
13
|
+
}): Promise<FlowDeskEventHookObservationResultV1>;
|
|
14
|
+
//# sourceMappingURL=event-hook-observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-hook-observer.d.ts","sourceRoot":"","sources":["../src/event-hook-observer.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,oCAAoC;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;CACxB;AA2KD,wBAAsB,8BAA8B,CAAC,KAAK,EAAE;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CACf,GAAG,OAAO,CAAC,oCAAoC,CAAC,CAkBhD"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { applyFlowDeskSessionEvidenceWriteIntentsV1, prepareFlowDeskSessionEvidenceWriteIntentV1, } from "@flowdesk/core";
|
|
5
|
+
function isRecord(value) {
|
|
6
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
function safeString(value) {
|
|
9
|
+
return typeof value === "string" && value.trim().length > 0 ? value : undefined;
|
|
10
|
+
}
|
|
11
|
+
function shortHash(value) {
|
|
12
|
+
return createHash("sha256").update(JSON.stringify(value)).digest("hex").slice(0, 12);
|
|
13
|
+
}
|
|
14
|
+
function compactLabel(value) {
|
|
15
|
+
const compact = value.replace(/\s+/g, " ").trim();
|
|
16
|
+
return compact.length > 120 ? `${compact.slice(0, 119)}…` : compact;
|
|
17
|
+
}
|
|
18
|
+
function eventProperties(event) {
|
|
19
|
+
const record = isRecord(event) ? event : undefined;
|
|
20
|
+
return isRecord(record?.properties) ? record.properties : undefined;
|
|
21
|
+
}
|
|
22
|
+
function eventType(event) {
|
|
23
|
+
return safeString(isRecord(event) ? event.type : undefined);
|
|
24
|
+
}
|
|
25
|
+
function eventSessionId(event) {
|
|
26
|
+
const properties = eventProperties(event);
|
|
27
|
+
const direct = safeString(properties?.sessionID);
|
|
28
|
+
if (direct !== undefined)
|
|
29
|
+
return direct;
|
|
30
|
+
const part = isRecord(properties?.part) ? properties.part : undefined;
|
|
31
|
+
const partSession = safeString(part?.sessionID);
|
|
32
|
+
if (partSession !== undefined)
|
|
33
|
+
return partSession;
|
|
34
|
+
const info = isRecord(properties?.info) ? properties.info : undefined;
|
|
35
|
+
return safeString(info?.sessionID);
|
|
36
|
+
}
|
|
37
|
+
function readJson(path) {
|
|
38
|
+
try {
|
|
39
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
40
|
+
return isRecord(parsed) ? parsed : undefined;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function findChildSessionBinding(rootDir, childSessionId) {
|
|
47
|
+
const sessionsDir = join(rootDir, ".flowdesk", "sessions");
|
|
48
|
+
if (!existsSync(sessionsDir))
|
|
49
|
+
return undefined;
|
|
50
|
+
for (const workflowId of readdirSync(sessionsDir)) {
|
|
51
|
+
const evidenceDir = join(sessionsDir, workflowId, "evidence", "agent-task-child-session");
|
|
52
|
+
if (!existsSync(evidenceDir))
|
|
53
|
+
continue;
|
|
54
|
+
for (const file of readdirSync(evidenceDir)) {
|
|
55
|
+
if (!file.endsWith(".json"))
|
|
56
|
+
continue;
|
|
57
|
+
const record = readJson(join(evidenceDir, file));
|
|
58
|
+
if (record?.child_session_id !== childSessionId)
|
|
59
|
+
continue;
|
|
60
|
+
const laneId = safeString(record.lane_id);
|
|
61
|
+
const taskId = safeString(record.task_id);
|
|
62
|
+
const agentRef = safeString(record.agent_ref);
|
|
63
|
+
const providerQualifiedModelId = safeString(record.provider_qualified_model_id);
|
|
64
|
+
const parentSessionRef = safeString(record.parent_session_ref);
|
|
65
|
+
if (laneId === undefined || taskId === undefined || agentRef === undefined || providerQualifiedModelId === undefined || parentSessionRef === undefined)
|
|
66
|
+
continue;
|
|
67
|
+
return { workflowId, laneId, taskId, childSessionId, parentSessionRef, agentRef, providerQualifiedModelId };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
function writeEvidence(rootDir, workflowId, evidenceId, record) {
|
|
73
|
+
const prepared = prepareFlowDeskSessionEvidenceWriteIntentV1({ workflowId, evidenceId, record });
|
|
74
|
+
if (!prepared.ok || prepared.writeIntent === undefined)
|
|
75
|
+
return false;
|
|
76
|
+
const applied = applyFlowDeskSessionEvidenceWriteIntentsV1(rootDir, [prepared.writeIntent]);
|
|
77
|
+
return applied.ok && applied.writtenPaths.length > 0;
|
|
78
|
+
}
|
|
79
|
+
function writeProgress(rootDir, binding, event, phase, label) {
|
|
80
|
+
const digest = shortHash(event);
|
|
81
|
+
const record = {
|
|
82
|
+
schema_version: "flowdesk.agent_task_progress.v1",
|
|
83
|
+
workflow_id: binding.workflowId,
|
|
84
|
+
lane_id: binding.laneId,
|
|
85
|
+
task_id: binding.taskId,
|
|
86
|
+
agent_ref: binding.agentRef,
|
|
87
|
+
provider_qualified_model_id: binding.providerQualifiedModelId,
|
|
88
|
+
progress_seq: Number.parseInt(digest.slice(0, 6), 16) + 1,
|
|
89
|
+
observed_at: new Date().toISOString(),
|
|
90
|
+
phase,
|
|
91
|
+
progress_label: compactLabel(label),
|
|
92
|
+
progress_ref: `progress-${binding.laneId}-event-${digest}`,
|
|
93
|
+
redaction_version: "v1",
|
|
94
|
+
dispatch_authority_enabled: false,
|
|
95
|
+
};
|
|
96
|
+
return writeEvidence(rootDir, binding.workflowId, `agent-task-progress-${binding.laneId}-event-${digest}`, record);
|
|
97
|
+
}
|
|
98
|
+
function writeSessionErrorTerminal(rootDir, binding, event) {
|
|
99
|
+
const digest = shortHash(event);
|
|
100
|
+
const observedAt = new Date().toISOString();
|
|
101
|
+
let written = 0;
|
|
102
|
+
if (writeEvidence(rootDir, binding.workflowId, `task-failed-${binding.taskId}-event-session-error-${digest}`, {
|
|
103
|
+
schema_version: "flowdesk.task_failed.v1",
|
|
104
|
+
workflow_id: binding.workflowId,
|
|
105
|
+
lane_id: binding.laneId,
|
|
106
|
+
task_id: binding.taskId,
|
|
107
|
+
agent_ref: binding.agentRef,
|
|
108
|
+
provider_qualified_model_id: binding.providerQualifiedModelId,
|
|
109
|
+
failure_category: "unknown",
|
|
110
|
+
redacted_reason: "OpenCode session.error event observed for FlowDesk child session",
|
|
111
|
+
created_at: observedAt,
|
|
112
|
+
dispatch_authority_enabled: false,
|
|
113
|
+
}))
|
|
114
|
+
written++;
|
|
115
|
+
if (writeEvidence(rootDir, binding.workflowId, `lifecycle-agent-task-event-session-error-${binding.laneId}-${digest}`, {
|
|
116
|
+
schema_version: "flowdesk.lane_lifecycle_record.v1",
|
|
117
|
+
lane_id: binding.laneId,
|
|
118
|
+
workflow_id: binding.workflowId,
|
|
119
|
+
attempt_id: `attempt-${binding.laneId}-event-${digest}`,
|
|
120
|
+
parent_session_ref: binding.parentSessionRef,
|
|
121
|
+
child_session_ref: `ses-${binding.childSessionId}`,
|
|
122
|
+
agent_ref: binding.agentRef,
|
|
123
|
+
provider_qualified_model_id: binding.providerQualifiedModelId,
|
|
124
|
+
state: "invocation_failed",
|
|
125
|
+
timeout_ms: 60_000,
|
|
126
|
+
orphan_max_age_ms: 600_000,
|
|
127
|
+
retry_count: 0,
|
|
128
|
+
created_at: observedAt,
|
|
129
|
+
updated_at: observedAt,
|
|
130
|
+
spawned_by: "flowdesk",
|
|
131
|
+
durability: "best_effort_no_dir_fsync",
|
|
132
|
+
dispatch_authority_enabled: false,
|
|
133
|
+
providerCall: false,
|
|
134
|
+
actualLaneLaunch: false,
|
|
135
|
+
runtimeExecution: false,
|
|
136
|
+
}))
|
|
137
|
+
written++;
|
|
138
|
+
return written;
|
|
139
|
+
}
|
|
140
|
+
function eventProgress(event) {
|
|
141
|
+
const type = eventType(event);
|
|
142
|
+
const properties = eventProperties(event);
|
|
143
|
+
if (type === "permission.updated")
|
|
144
|
+
return { phase: "awaiting_permission", label: "agent task awaiting OpenCode permission response" };
|
|
145
|
+
if (type === "permission.replied")
|
|
146
|
+
return { phase: "waiting", label: "agent task OpenCode permission response observed" };
|
|
147
|
+
if (type === "session.error")
|
|
148
|
+
return { phase: "failed", label: "agent task session error observed" };
|
|
149
|
+
if (type === "session.idle")
|
|
150
|
+
return { phase: "finalizing", label: "agent task session idle event observed" };
|
|
151
|
+
if (type === "session.status") {
|
|
152
|
+
const status = isRecord(properties?.status) ? properties.status : undefined;
|
|
153
|
+
if (status?.type === "retry")
|
|
154
|
+
return { phase: "retrying", label: "agent task session retry event observed" };
|
|
155
|
+
if (status?.type === "idle")
|
|
156
|
+
return { phase: "finalizing", label: "agent task session idle status observed" };
|
|
157
|
+
if (status?.type === "busy")
|
|
158
|
+
return { phase: "waiting", label: "agent task session busy event observed" };
|
|
159
|
+
}
|
|
160
|
+
if (type === "message.part.updated") {
|
|
161
|
+
const part = isRecord(properties?.part) ? properties.part : undefined;
|
|
162
|
+
if (part?.type === "step-finish")
|
|
163
|
+
return { phase: "finalizing", label: "agent task terminal step event observed" };
|
|
164
|
+
if (part?.type === "tool" && isRecord(part.state) && part.state.status === "error")
|
|
165
|
+
return { phase: "waiting", label: "agent task tool error event observed" };
|
|
166
|
+
return { phase: "waiting", label: "agent task message part event observed" };
|
|
167
|
+
}
|
|
168
|
+
if (type === "message.updated" || type === "session.updated" || type === "session.diff")
|
|
169
|
+
return { phase: "waiting", label: `agent task ${type} event observed` };
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
export async function observeFlowDeskOpenCodeEventV1(input) {
|
|
173
|
+
const type = eventType(input.event);
|
|
174
|
+
const sessionId = eventSessionId(input.event);
|
|
175
|
+
if (type === undefined || sessionId === undefined)
|
|
176
|
+
return { matched: false, eventType: type, sessionId, evidenceWritten: 0 };
|
|
177
|
+
const binding = findChildSessionBinding(input.rootDir, sessionId);
|
|
178
|
+
if (binding === undefined)
|
|
179
|
+
return { matched: false, eventType: type, sessionId, evidenceWritten: 0 };
|
|
180
|
+
const progress = eventProgress(input.event);
|
|
181
|
+
const progressWritten = progress === undefined ? false : writeProgress(input.rootDir, binding, input.event, progress.phase, progress.label);
|
|
182
|
+
const terminalWritten = type === "session.error" ? writeSessionErrorTerminal(input.rootDir, binding, input.event) : 0;
|
|
183
|
+
return {
|
|
184
|
+
matched: true,
|
|
185
|
+
eventType: type,
|
|
186
|
+
sessionId,
|
|
187
|
+
workflowId: binding.workflowId,
|
|
188
|
+
laneId: binding.laneId,
|
|
189
|
+
taskId: binding.taskId,
|
|
190
|
+
evidenceWritten: (progressWritten ? 1 : 0) + terminalWritten,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=event-hook-observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-hook-observer.js","sourceRoot":"","sources":["../src/event-hook-observer.ts"],"names":[],"mappings":"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"}
|
|
@@ -489,6 +489,7 @@ export interface FlowDeskInjectedSdkReviewerVerdictObservationRequestV1 {
|
|
|
489
489
|
bindingRef: string;
|
|
490
490
|
perspective: FlowDeskTopTierReviewPerspective;
|
|
491
491
|
directory?: string;
|
|
492
|
+
messagesResponse?: unknown;
|
|
492
493
|
}
|
|
493
494
|
export interface FlowDeskInjectedSdkReviewerVerdictObservationResultV1 {
|
|
494
495
|
adapterProfile: "injected_sdk_reviewer_verdict_observation";
|