taskflow-core 0.2.10 → 0.3.0-beta.1

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 (109) hide show
  1. package/README.md +139 -377
  2. package/dist/agents.d.ts.map +1 -1
  3. package/dist/agents.js +3 -10
  4. package/dist/agents.js.map +1 -1
  5. package/dist/atomic-rename.d.ts +14 -0
  6. package/dist/atomic-rename.d.ts.map +1 -0
  7. package/dist/atomic-rename.js +35 -0
  8. package/dist/atomic-rename.js.map +1 -0
  9. package/dist/build-info.json +2 -2
  10. package/dist/discovery-boundary.d.ts +20 -0
  11. package/dist/discovery-boundary.d.ts.map +1 -0
  12. package/dist/discovery-boundary.js +101 -0
  13. package/dist/discovery-boundary.js.map +1 -0
  14. package/dist/effects/index.d.ts +9 -0
  15. package/dist/effects/index.d.ts.map +1 -0
  16. package/dist/effects/index.js +9 -0
  17. package/dist/effects/index.js.map +1 -0
  18. package/dist/effects/runtime-apply.d.ts +66 -0
  19. package/dist/effects/runtime-apply.d.ts.map +1 -0
  20. package/dist/effects/runtime-apply.js +214 -0
  21. package/dist/effects/runtime-apply.js.map +1 -0
  22. package/dist/effects/schema.d.ts +8 -0
  23. package/dist/effects/schema.d.ts.map +1 -0
  24. package/dist/effects/schema.js +41 -0
  25. package/dist/effects/schema.js.map +1 -0
  26. package/dist/effects/types.d.ts +93 -0
  27. package/dist/effects/types.d.ts.map +1 -0
  28. package/dist/effects/types.js +37 -0
  29. package/dist/effects/types.js.map +1 -0
  30. package/dist/effects/validate.d.ts +103 -0
  31. package/dist/effects/validate.d.ts.map +1 -0
  32. package/dist/effects/validate.js +543 -0
  33. package/dist/effects/validate.js.map +1 -0
  34. package/dist/effects/why.d.ts +94 -0
  35. package/dist/effects/why.d.ts.map +1 -0
  36. package/dist/effects/why.js +365 -0
  37. package/dist/effects/why.js.map +1 -0
  38. package/dist/exec/kernel-policy.d.ts.map +1 -1
  39. package/dist/exec/kernel-policy.js +4 -0
  40. package/dist/exec/kernel-policy.js.map +1 -1
  41. package/dist/exec/step.d.ts.map +1 -1
  42. package/dist/exec/step.js +6 -0
  43. package/dist/exec/step.js.map +1 -1
  44. package/dist/flowir/canonical-hash.d.ts.map +1 -1
  45. package/dist/flowir/canonical-hash.js +6 -2
  46. package/dist/flowir/canonical-hash.js.map +1 -1
  47. package/dist/flowir/compile.d.ts.map +1 -1
  48. package/dist/flowir/compile.js +41 -2
  49. package/dist/flowir/compile.js.map +1 -1
  50. package/dist/flowir/index.js +1 -1
  51. package/dist/flowir/index.js.map +1 -1
  52. package/dist/flowir/meta.d.ts +6 -0
  53. package/dist/flowir/meta.d.ts.map +1 -1
  54. package/dist/flowir/schema.d.ts +9 -0
  55. package/dist/flowir/schema.d.ts.map +1 -1
  56. package/dist/flowir/schema.js +8 -0
  57. package/dist/flowir/schema.js.map +1 -1
  58. package/dist/flowir/translate.d.ts.map +1 -1
  59. package/dist/flowir/translate.js +32 -0
  60. package/dist/flowir/translate.js.map +1 -1
  61. package/dist/index.d.ts +1 -0
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +2 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/resources/execution.d.ts +9 -0
  66. package/dist/resources/execution.d.ts.map +1 -1
  67. package/dist/resources/execution.js +80 -0
  68. package/dist/resources/execution.js.map +1 -1
  69. package/dist/resources/file-transaction.d.ts +105 -0
  70. package/dist/resources/file-transaction.d.ts.map +1 -0
  71. package/dist/resources/file-transaction.js +781 -0
  72. package/dist/resources/file-transaction.js.map +1 -0
  73. package/dist/resources/journal.d.ts +39 -4
  74. package/dist/resources/journal.d.ts.map +1 -1
  75. package/dist/resources/journal.js +140 -11
  76. package/dist/resources/journal.js.map +1 -1
  77. package/dist/resources/types.d.ts +4 -0
  78. package/dist/resources/types.d.ts.map +1 -1
  79. package/dist/resources/types.js.map +1 -1
  80. package/dist/runtime/phases/script.d.ts +6 -0
  81. package/dist/runtime/phases/script.d.ts.map +1 -1
  82. package/dist/runtime/phases/script.js +6 -0
  83. package/dist/runtime/phases/script.js.map +1 -1
  84. package/dist/runtime.d.ts.map +1 -1
  85. package/dist/runtime.js +203 -14
  86. package/dist/runtime.js.map +1 -1
  87. package/dist/schema.d.ts +18 -0
  88. package/dist/schema.d.ts.map +1 -1
  89. package/dist/schema.js +30 -0
  90. package/dist/schema.js.map +1 -1
  91. package/dist/store.d.ts.map +1 -1
  92. package/dist/store.js +15 -37
  93. package/dist/store.js.map +1 -1
  94. package/dist/verifiers/discover.d.ts.map +1 -1
  95. package/dist/verifiers/discover.js +1 -17
  96. package/dist/verifiers/discover.js.map +1 -1
  97. package/dist/verifiers/effects-lint.d.ts +33 -0
  98. package/dist/verifiers/effects-lint.d.ts.map +1 -0
  99. package/dist/verifiers/effects-lint.js +77 -0
  100. package/dist/verifiers/effects-lint.js.map +1 -0
  101. package/dist/verifiers/index.d.ts +1 -0
  102. package/dist/verifiers/index.d.ts.map +1 -1
  103. package/dist/verifiers/index.js +3 -1
  104. package/dist/verifiers/index.js.map +1 -1
  105. package/dist/verify.d.ts +7 -1
  106. package/dist/verify.d.ts.map +1 -1
  107. package/dist/verify.js +3 -0
  108. package/dist/verify.js.map +1 -1
  109. package/package.json +1 -1
@@ -0,0 +1,543 @@
1
+ /**
2
+ * Static EffectIR validation: kinds, refs, labels, mutating-path overlap.
3
+ * Pure — no I/O.
4
+ */
5
+ import { normalizePortableRelativePath } from "../resources/schema.js";
6
+ import { Value } from "typebox/value";
7
+ import { EffectDeclSchema } from "./schema.js";
8
+ import { CONFIDENTIALITY_LABELS, CONFIDENTIALITY_RANK, EFFECT_KINDS, INTEGRITY_LABELS, INTEGRITY_RANK, } from "./types.js";
9
+ function isObject(v) {
10
+ return typeof v === "object" && v !== null && !Array.isArray(v);
11
+ }
12
+ function isConf(v) {
13
+ return typeof v === "string" && CONFIDENTIALITY_LABELS.includes(v);
14
+ }
15
+ function isInteg(v) {
16
+ return typeof v === "string" && INTEGRITY_LABELS.includes(v);
17
+ }
18
+ function isEffectKind(v) {
19
+ return typeof v === "string" && EFFECT_KINDS.includes(v);
20
+ }
21
+ const SOURCE_KINDS = new Set(["fs.read", "secret.read"]);
22
+ const SINK_KINDS = new Set(["fs.write", "service.call"]);
23
+ function confidentialityOf(item) {
24
+ return isConf(item.confidentiality) ? item.confidentiality : item.kind === "secret.read" ? "secret" : "internal";
25
+ }
26
+ function integrityOf(item) {
27
+ return isInteg(item.integrity) ? item.integrity : "project";
28
+ }
29
+ function labelFlowIssues(source, sink, sourceLabel = source.id, sinkLabel = sink.id) {
30
+ const issues = [];
31
+ // Two unresolved composition boundaries carry taint but do not create a
32
+ // concrete source→sink edge by themselves. Keep the taint flowing until it
33
+ // meets a declared effect; otherwise ordinary dynamic composition would
34
+ // reject solely because two unknown summaries are sequenced.
35
+ if (source.__unknownBoundary === true && sink.__unknownBoundary === true)
36
+ return issues;
37
+ // An unresolved saved `flow{use}` boundary seen by a static gate without a
38
+ // flow loader is advisory (the saved child may be perfectly benign); the
39
+ // runtime loader stays the authoritative admission gate. Dynamic inline
40
+ // `def` boundaries never carry this flag and stay hard-tainted.
41
+ const advisory = source.__unresolvedUseAdvisory === true || sink.__unresolvedUseAdvisory === true;
42
+ const code = (base) => (advisory ? "unresolved-flow-use-taint" : base);
43
+ const suffix = advisory ? " — unresolved flow{use} boundary; advisory only (runtime admission is authoritative)" : "";
44
+ const sourceConf = confidentialityOf(source);
45
+ const sinkConf = confidentialityOf(sink);
46
+ const sourceIntegrity = integrityOf(source);
47
+ const sinkIntegrity = integrityOf(sink);
48
+ if (CONFIDENTIALITY_RANK[sourceConf] > CONFIDENTIALITY_RANK[sinkConf]) {
49
+ issues.push({
50
+ severity: advisory ? "warning" : "error",
51
+ code: code("confidentiality-flow-violation"),
52
+ message: `source effect '${sourceLabel}' (${sourceConf}) cannot flow to sink '${sinkLabel}' (${sinkConf})${suffix}`,
53
+ effectId: sinkLabel,
54
+ });
55
+ }
56
+ if (INTEGRITY_RANK[sourceIntegrity] < INTEGRITY_RANK[sinkIntegrity]) {
57
+ issues.push({
58
+ severity: advisory ? "warning" : "error",
59
+ code: code("integrity-flow-violation"),
60
+ message: `source effect '${sourceLabel}' (${sourceIntegrity}) cannot satisfy sink '${sinkLabel}' integrity (${sinkIntegrity})${suffix}`,
61
+ effectId: sinkLabel,
62
+ });
63
+ }
64
+ return issues;
65
+ }
66
+ /** Extract portable relative path string from a PathRef for overlap checks. */
67
+ export function pathRefRelativeKey(pathRef) {
68
+ const sub = pathRef.subpath;
69
+ if (!sub)
70
+ return "";
71
+ if ("literalPath" in sub && typeof sub.literalPath === "string") {
72
+ const n = normalizePortableRelativePath(sub.literalPath);
73
+ return n.ok ? n.value : undefined;
74
+ }
75
+ // Dynamic arg/segments paths cannot be fully resolved statically.
76
+ return undefined;
77
+ }
78
+ /**
79
+ * True if path A is the same as, a parent of, or a child of path B
80
+ * (portable `/` paths, no `..`).
81
+ */
82
+ export function pathsOverlap(a, b) {
83
+ if (a === b)
84
+ return true;
85
+ if (a === "" || b === "")
86
+ return true; // whole workspace
87
+ const ap = a.endsWith("/") ? a.slice(0, -1) : a;
88
+ const bp = b.endsWith("/") ? b.slice(0, -1) : b;
89
+ return ap.startsWith(bp + "/") || bp.startsWith(ap + "/");
90
+ }
91
+ function validateSecretRef(s, effectId, issues) {
92
+ if (!isObject(s) || typeof s.secretId !== "string" || !s.secretId.trim()) {
93
+ issues.push({
94
+ severity: "error",
95
+ code: "invalid-secret-ref",
96
+ message: `effect '${effectId}': secret target requires non-empty secretId`,
97
+ effectId,
98
+ });
99
+ return;
100
+ }
101
+ if ("value" in s || "material" in s || "token" in s) {
102
+ issues.push({
103
+ severity: "error",
104
+ code: "secret-material-forbidden",
105
+ message: `effect '${effectId}': SecretRef must not carry secret material fields`,
106
+ effectId,
107
+ });
108
+ }
109
+ }
110
+ function validateServiceRef(s, effectId, issues) {
111
+ if (!isObject(s) || typeof s.serviceId !== "string" || !s.serviceId.trim()) {
112
+ issues.push({
113
+ severity: "error",
114
+ code: "invalid-service-ref",
115
+ message: `effect '${effectId}': service target requires non-empty serviceId`,
116
+ effectId,
117
+ });
118
+ }
119
+ }
120
+ function validatePathTarget(pathRef, effectId, issues) {
121
+ if (!isObject(pathRef)) {
122
+ issues.push({
123
+ severity: "error",
124
+ code: "invalid-path-ref",
125
+ message: `effect '${effectId}': path target must be a PathRef object`,
126
+ effectId,
127
+ });
128
+ return undefined;
129
+ }
130
+ const hasWorkspace = typeof pathRef.workspace === "string" && pathRef.workspace.length > 0;
131
+ const hasHandle = isObject(pathRef.handle);
132
+ if (hasWorkspace === hasHandle) {
133
+ issues.push({
134
+ severity: "error",
135
+ code: "invalid-path-ref",
136
+ message: `effect '${effectId}': PathRef needs exactly one of workspace or handle`,
137
+ effectId,
138
+ });
139
+ return undefined;
140
+ }
141
+ if (!pathRef.intent || typeof pathRef.intent !== "string") {
142
+ issues.push({
143
+ severity: "error",
144
+ code: "invalid-path-ref",
145
+ message: `effect '${effectId}': PathRef.intent is required`,
146
+ effectId,
147
+ });
148
+ return undefined;
149
+ }
150
+ return pathRef;
151
+ }
152
+ const MUTATING_KINDS = new Set(["fs.write", "fs.delete"]);
153
+ /**
154
+ * Validate an EffectIR bag: shape, labels, target/kind consistency, overlap.
155
+ */
156
+ export function validateEffectIR(ir) {
157
+ const issues = [];
158
+ const raw = ir?.effects;
159
+ if (raw === undefined)
160
+ return { ok: true, issues: [] };
161
+ if (!Array.isArray(raw)) {
162
+ return {
163
+ ok: false,
164
+ issues: [{ severity: "error", code: "effects-not-array", message: "effects must be an array" }],
165
+ };
166
+ }
167
+ const seenIds = new Set();
168
+ const mutating = [];
169
+ for (const item of raw) {
170
+ if (!isObject(item)) {
171
+ issues.push({ severity: "error", code: "effect-not-object", message: "each effect must be an object" });
172
+ continue;
173
+ }
174
+ if (!Value.Check(EffectDeclSchema, item)) {
175
+ issues.push({
176
+ severity: "error",
177
+ code: "invalid-effect-shape",
178
+ message: `effect '${typeof item.id === "string" ? item.id : "<unknown>"}': declaration is outside the closed EffectIR schema`,
179
+ effectId: typeof item.id === "string" ? item.id : undefined,
180
+ });
181
+ }
182
+ const id = item.id;
183
+ if (typeof id !== "string" || !id.trim()) {
184
+ issues.push({ severity: "error", code: "effect-id-required", message: "effect.id is required" });
185
+ continue;
186
+ }
187
+ if (seenIds.has(id)) {
188
+ issues.push({
189
+ severity: "error",
190
+ code: "duplicate-effect-id",
191
+ message: `duplicate effect id '${id}'`,
192
+ effectId: id,
193
+ });
194
+ }
195
+ seenIds.add(id);
196
+ if (!isEffectKind(item.kind)) {
197
+ issues.push({
198
+ severity: "error",
199
+ code: "unknown-effect-kind",
200
+ message: `effect '${id}': unknown kind ${String(item.kind)}`,
201
+ effectId: id,
202
+ });
203
+ continue;
204
+ }
205
+ const kind = item.kind;
206
+ if (item.confidentiality !== undefined && !isConf(item.confidentiality)) {
207
+ issues.push({
208
+ severity: "error",
209
+ code: "invalid-confidentiality",
210
+ message: `effect '${id}': invalid confidentiality label`,
211
+ effectId: id,
212
+ });
213
+ }
214
+ if (item.integrity !== undefined && !isInteg(item.integrity)) {
215
+ issues.push({
216
+ severity: "error",
217
+ code: "invalid-integrity",
218
+ message: `effect '${id}': invalid integrity label`,
219
+ effectId: id,
220
+ });
221
+ }
222
+ const target = item.target;
223
+ if (!isObject(target) || typeof target.kind !== "string") {
224
+ issues.push({
225
+ severity: "error",
226
+ code: "invalid-target",
227
+ message: `effect '${id}': target.kind is required`,
228
+ effectId: id,
229
+ });
230
+ continue;
231
+ }
232
+ if (kind.startsWith("fs.")) {
233
+ if (target.kind !== "path") {
234
+ issues.push({
235
+ severity: "error",
236
+ code: "target-kind-mismatch",
237
+ message: `effect '${id}': fs.* requires target.kind === "path"`,
238
+ effectId: id,
239
+ });
240
+ }
241
+ else {
242
+ const pref = validatePathTarget(target.path, id, issues);
243
+ if (pref && MUTATING_KINDS.has(kind)) {
244
+ const key = pathRefRelativeKey(pref);
245
+ if (key === undefined) {
246
+ issues.push({
247
+ severity: "warning",
248
+ code: "dynamic-path-overlap-unknown",
249
+ message: `effect '${id}': mutating path is dynamic; overlap cannot be proven statically`,
250
+ effectId: id,
251
+ });
252
+ }
253
+ else {
254
+ mutating.push({ effectId: id, pathKey: key });
255
+ }
256
+ }
257
+ }
258
+ }
259
+ else if (kind === "secret.read") {
260
+ if (target.kind !== "secret") {
261
+ issues.push({
262
+ severity: "error",
263
+ code: "target-kind-mismatch",
264
+ message: `effect '${id}': secret.read requires target.kind === "secret"`,
265
+ effectId: id,
266
+ });
267
+ }
268
+ else {
269
+ validateSecretRef(target.secret, id, issues);
270
+ }
271
+ }
272
+ else if (kind === "service.call") {
273
+ if (target.kind !== "service") {
274
+ issues.push({
275
+ severity: "error",
276
+ code: "target-kind-mismatch",
277
+ message: `effect '${id}': service.call requires target.kind === "service"`,
278
+ effectId: id,
279
+ });
280
+ }
281
+ else {
282
+ validateServiceRef(target.service, id, issues);
283
+ }
284
+ }
285
+ }
286
+ // Mutating path overlap (static)
287
+ for (let i = 0; i < mutating.length; i++) {
288
+ for (let j = i + 1; j < mutating.length; j++) {
289
+ const a = mutating[i];
290
+ const b = mutating[j];
291
+ if (pathsOverlap(a.pathKey, b.pathKey)) {
292
+ issues.push({
293
+ severity: "error",
294
+ code: "mutating-path-overlap",
295
+ message: `mutating effects '${a.effectId}' and '${b.effectId}' overlap on path ` +
296
+ `('${a.pathKey || "<workspace>"}' vs '${b.pathKey || "<workspace>"}')`,
297
+ effectId: a.effectId,
298
+ pathA: a.pathKey,
299
+ pathB: b.pathKey,
300
+ });
301
+ }
302
+ }
303
+ }
304
+ // Conservative information-flow check. Read declarations are sources;
305
+ // writes/calls are sinks. Without an explicit data-flow subgraph, every
306
+ // declared source may influence every declared sink in the same phase.
307
+ // Confidentiality may only flow upward (sink clearance >= source label),
308
+ // while integrity may only flow downward (source trust >= sink requirement).
309
+ const valid = raw.filter((item) => isObject(item) && typeof item.id === "string" && isEffectKind(item.kind));
310
+ const sources = valid.filter((item) => SOURCE_KINDS.has(item.kind));
311
+ const sinks = valid.filter((item) => SINK_KINDS.has(item.kind));
312
+ for (const source of sources) {
313
+ for (const sink of sinks) {
314
+ issues.push(...labelFlowIssues(source, sink));
315
+ }
316
+ }
317
+ const ok = !issues.some((i) => i.severity === "error");
318
+ return { ok, issues };
319
+ }
320
+ function directPhaseSummary(phase, phaseLabel) {
321
+ const sources = [];
322
+ const sinks = [];
323
+ for (const raw of Array.isArray(phase.effects) ? phase.effects : []) {
324
+ if (!isObject(raw) || typeof raw.id !== "string" || !isEffectKind(raw.kind))
325
+ continue;
326
+ const effect = raw;
327
+ const labeled = { label: `${phaseLabel}/${effect.id}`, effect };
328
+ if (SOURCE_KINDS.has(effect.kind))
329
+ sources.push(labeled);
330
+ if (SINK_KINDS.has(effect.kind))
331
+ sinks.push(labeled);
332
+ }
333
+ return { sources, sinks };
334
+ }
335
+ function unknownBoundarySummary(phaseLabel, advisory = false) {
336
+ const advisoryFlag = advisory ? { __unresolvedUseAdvisory: true } : {};
337
+ return {
338
+ sources: [{
339
+ label: `${phaseLabel}/<dynamic-source>`,
340
+ effect: {
341
+ id: "<dynamic-source>",
342
+ kind: "secret.read",
343
+ confidentiality: "secret",
344
+ integrity: "untrusted",
345
+ __unknownBoundary: true,
346
+ ...advisoryFlag,
347
+ target: { kind: "secret", secret: { secretId: "<dynamic>" } },
348
+ },
349
+ }],
350
+ sinks: [{
351
+ label: `${phaseLabel}/<dynamic-sink>`,
352
+ effect: {
353
+ id: "<dynamic-sink>",
354
+ kind: "service.call",
355
+ confidentiality: "public",
356
+ integrity: "verified",
357
+ __unknownBoundary: true,
358
+ ...advisoryFlag,
359
+ target: { kind: "service", service: { serviceId: "<dynamic>" } },
360
+ },
361
+ }],
362
+ };
363
+ }
364
+ function parseInlineFlow(raw) {
365
+ let value = raw;
366
+ if (typeof value === "string") {
367
+ try {
368
+ value = JSON.parse(value);
369
+ }
370
+ catch {
371
+ return undefined;
372
+ }
373
+ }
374
+ if (Array.isArray(value))
375
+ return { phases: value };
376
+ if (!isObject(value) || !Array.isArray(value.phases))
377
+ return undefined;
378
+ return { name: value.name, phases: value.phases };
379
+ }
380
+ /**
381
+ * Conservative DAG-wide label flow. Every source reachable through a phase's
382
+ * dependencies may influence that phase's sinks, including through unlabeled
383
+ * intermediate phases. This is a pure static check; conditional branches are
384
+ * intentionally not used to declassify data.
385
+ */
386
+ export function validateEffectFlow(phases, dependencyIds = (phase) => [
387
+ ...(Array.isArray(phase.dependsOn) ? phase.dependsOn.filter((id) => typeof id === "string") : []),
388
+ ...(Array.isArray(phase.from) ? phase.from.filter((id) => typeof id === "string") : []),
389
+ ], phaseSummaries) {
390
+ const issues = [];
391
+ const byId = new Map();
392
+ const ownSources = new Map();
393
+ const sinks = new Map();
394
+ for (const phase of phases) {
395
+ if (typeof phase.id !== "string" || !phase.id)
396
+ continue;
397
+ byId.set(phase.id, phase);
398
+ const summary = phaseSummaries?.get(phase.id) ?? directPhaseSummary(phase, phase.id);
399
+ ownSources.set(phase.id, new Map(summary.sources.map(({ label, effect }) => [label, effect])));
400
+ sinks.set(phase.id, summary.sinks);
401
+ }
402
+ const reachable = new Map([...ownSources].map(([id, sources]) => [id, new Map(sources)]));
403
+ for (let pass = 0; pass < byId.size; pass++) {
404
+ let changed = false;
405
+ for (const [phaseId, phase] of byId) {
406
+ const target = reachable.get(phaseId);
407
+ for (const depId of dependencyIds(phase)) {
408
+ for (const [sourceId, source] of reachable.get(depId) ?? []) {
409
+ if (!target.has(sourceId)) {
410
+ target.set(sourceId, source);
411
+ changed = true;
412
+ }
413
+ }
414
+ }
415
+ }
416
+ if (!changed)
417
+ break;
418
+ }
419
+ for (const phaseId of byId.keys()) {
420
+ const ownSourceIds = new Set(ownSources.get(phaseId)?.keys() ?? []);
421
+ const upstreamSources = [...(reachable.get(phaseId) ?? [])]
422
+ .filter(([sourceId]) => !ownSourceIds.has(sourceId));
423
+ if (upstreamSources.length === 0)
424
+ continue;
425
+ for (const { label: sinkLabel, effect: sink } of sinks.get(phaseId) ?? []) {
426
+ for (const [sourceId, source] of upstreamSources) {
427
+ issues.push(...labelFlowIssues(source, sink, sourceId, sinkLabel));
428
+ }
429
+ }
430
+ }
431
+ return { ok: !issues.some((issue) => issue.severity === "error"), issues };
432
+ }
433
+ function summarizeComposedEffectFlow(flow, options, prefix, seenUses) {
434
+ const phases = Array.isArray(flow.phases) ? flow.phases : [];
435
+ const issues = [];
436
+ const summaries = new Map();
437
+ // Static gates (no flow loader) downgrade unresolved `flow{use}` boundaries
438
+ // to advisory warnings; the runtime (with a loader) stays fail-closed.
439
+ const downgradeUse = options.downgradeUnresolvedUse === true;
440
+ for (const phase of phases) {
441
+ if (typeof phase.id !== "string" || !phase.id)
442
+ continue;
443
+ const phaseLabel = `${prefix}${phase.id}`;
444
+ if (prefix && phase.effects !== undefined) {
445
+ issues.push(...validateEffectIR({ effects: phase.effects }).issues.map((issue) => ({
446
+ ...issue,
447
+ effectId: issue.effectId ? `${phaseLabel}/${issue.effectId}` : phaseLabel,
448
+ message: issue.effectId
449
+ ? issue.message.replace(`'${issue.effectId}'`, `'${phaseLabel}/${issue.effectId}'`)
450
+ : `${phaseLabel}: ${issue.message}`,
451
+ })));
452
+ }
453
+ const summary = directPhaseSummary(phase, phaseLabel);
454
+ const type = phase.type ?? "agent";
455
+ if (type === "flow" || type === "expand") {
456
+ let child;
457
+ let childSeen = seenUses;
458
+ // Only a named saved `flow{use}` is a resolver-resolvable boundary;
459
+ // dynamic inline `def` strings (LLM-authored, unparseable) stay
460
+ // hard-tainted by design and never downgrade.
461
+ let unresolvedUse;
462
+ if (phase.def !== undefined) {
463
+ child = parseInlineFlow(phase.def);
464
+ }
465
+ else if (type === "flow" && typeof phase.use === "string" && phase.use) {
466
+ if (!seenUses.has(phase.use)) {
467
+ try {
468
+ child = options.resolveFlow?.(phase.use);
469
+ }
470
+ catch {
471
+ child = undefined;
472
+ }
473
+ childSeen = new Set([...seenUses, phase.use]);
474
+ }
475
+ unresolvedUse = child === undefined ? phase.use : undefined;
476
+ }
477
+ const advisory = unresolvedUse !== undefined && downgradeUse;
478
+ const childResult = child
479
+ ? summarizeComposedEffectFlow(child, options, `${phaseLabel}/`, childSeen)
480
+ : { ok: true, issues: [], summary: unknownBoundarySummary(phaseLabel, advisory) };
481
+ if (advisory) {
482
+ issues.push({
483
+ severity: "warning",
484
+ code: "unresolved-flow-use",
485
+ message: `phase '${phaseLabel}' uses saved flow '${unresolvedUse}' which cannot be resolved ` +
486
+ `statically; child effects are unknown and treated as an unknown boundary ` +
487
+ `(advisory). Runtime admission with the flow store is authoritative.`,
488
+ effectId: phaseLabel,
489
+ });
490
+ }
491
+ issues.push(...childResult.issues);
492
+ summary.sources.push(...childResult.summary.sources);
493
+ summary.sinks.push(...childResult.summary.sinks);
494
+ }
495
+ summaries.set(phase.id, summary);
496
+ }
497
+ const flowResult = validateEffectFlow(phases, undefined, summaries);
498
+ issues.push(...flowResult.issues);
499
+ return {
500
+ ok: !issues.some((issue) => issue.severity === "error"),
501
+ issues,
502
+ summary: {
503
+ sources: [...summaries.values()].flatMap((summary) => summary.sources),
504
+ sinks: [...summaries.values()].flatMap((summary) => summary.sinks),
505
+ },
506
+ };
507
+ }
508
+ /**
509
+ * Validate label flow across nested flow/expand boundaries. Child sources are
510
+ * summarized onto the parent node and child sinks receive the parent's
511
+ * dependency-reachable sources. Unresolved saved/dynamic children expose a
512
+ * maximally confidential source and public sink until runtime resolution.
513
+ * With {@link ComposedEffectFlowOptions.downgradeUnresolvedUse} set (static
514
+ * gates without a flow loader), unresolvable `flow{use}` boundaries report as
515
+ * advisory warnings instead of errors; runtime admission stays authoritative.
516
+ */
517
+ export function validateComposedEffectFlow(flow, options = {}) {
518
+ const result = summarizeComposedEffectFlow(flow, options, "", new Set());
519
+ return { ok: result.ok, issues: result.issues };
520
+ }
521
+ /** Type guard for a well-formed SecretRef (no material). */
522
+ export function isSecretRef(v) {
523
+ return isObject(v) && typeof v.secretId === "string" && v.secretId.length > 0 && !("value" in v) && !("material" in v);
524
+ }
525
+ /** Type guard for ServiceRef. */
526
+ export function isServiceRef(v) {
527
+ return isObject(v) && typeof v.serviceId === "string" && v.serviceId.length > 0;
528
+ }
529
+ /** Collect mutating path keys from effects (static literals only). */
530
+ export function collectMutatingPathKeys(effects) {
531
+ const out = [];
532
+ for (const e of effects) {
533
+ if (!MUTATING_KINDS.has(e.kind))
534
+ continue;
535
+ if (e.target.kind !== "path")
536
+ continue;
537
+ const key = pathRefRelativeKey(e.target.path);
538
+ if (key !== undefined)
539
+ out.push({ effectId: e.id, pathKey: key });
540
+ }
541
+ return out;
542
+ }
543
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/effects/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * why-authorized / why-context / why-effect — pure explainers over effect + auth records.
3
+ */
4
+ import type { ConfidentialityLabel, EffectDecl, IntegrityLabel, WhyAuthorized, WhyContext, WhyEffect } from "./types.ts";
5
+ import { type WriteIntentRecord } from "../resources/journal.ts";
6
+ export interface WhyInput {
7
+ effect: EffectDecl;
8
+ runId: string;
9
+ phaseId?: string;
10
+ principalId?: string;
11
+ /** Capability binding ids that covered this effect (if any). */
12
+ capabilityBindingIds?: string[];
13
+ /** Whether static/admit validation allowed the effect. */
14
+ allowed: boolean;
15
+ allowReasons: string[];
16
+ denyReasons?: string[];
17
+ intentId?: string;
18
+ journalStatus?: string;
19
+ status: WhyEffect["status"];
20
+ workspaceRoot?: string;
21
+ defaultConfidentiality?: ConfidentialityLabel;
22
+ defaultIntegrity?: IntegrityLabel;
23
+ }
24
+ export declare function whyAuthorized(input: WhyInput): WhyAuthorized;
25
+ export declare function whyContext(input: WhyInput): WhyContext;
26
+ export declare function whyEffect(input: WhyInput): WhyEffect;
27
+ /** Minimal flow shape for effect lookup (Taskflow / FlowIR phases). */
28
+ export interface WhyEffectFlowLike {
29
+ phases?: ReadonlyArray<{
30
+ id?: string;
31
+ effects?: unknown;
32
+ dependsOn?: unknown;
33
+ from?: unknown;
34
+ } | null | undefined>;
35
+ }
36
+ export interface WhyEffectFromFlowInput {
37
+ /** Flow definition that declares effects (typically RunState.def). */
38
+ flow: WhyEffectFlowLike;
39
+ runId: string;
40
+ /** Effect id as declared, or `phaseId/effectId` composite. */
41
+ effectId: string;
42
+ /** Disambiguate when the same effect id appears on multiple phases. */
43
+ phaseId?: string;
44
+ workspaceRoot?: string;
45
+ /** Runtime lifecycle status; MCP defaults to `declared` (read-only explain). */
46
+ status?: WhyEffect["status"];
47
+ intentId?: string;
48
+ principalId?: string;
49
+ capabilityBindingIds?: string[];
50
+ }
51
+ export type WhyEffectFromFlowResult = {
52
+ ok: true;
53
+ why: WhyEffect;
54
+ phaseId?: string;
55
+ } | {
56
+ ok: false;
57
+ error: string;
58
+ };
59
+ interface LocatedEffect {
60
+ effect: EffectDecl;
61
+ phaseId?: string;
62
+ /** Id used for bag validation (phase-prefixed when from a phase). */
63
+ bagId: string;
64
+ }
65
+ /** Collect declared effects from each phase (original ids preserved). */
66
+ export declare function collectDeclaredEffects(flow: WhyEffectFlowLike): LocatedEffect[];
67
+ /**
68
+ * Pure: resolve a declared effect from a flow and explain authorization + context.
69
+ *
70
+ * Fail-closed: if static validation reports any error for this effect (or the
71
+ * bag cannot be validated), `authorized.allowed` is false with deny reasons.
72
+ * Missing effect → `{ ok: false }` (MCP returns isError).
73
+ *
74
+ * Zero tokens / no I/O. Runtime commit status is optional (`status` defaults
75
+ * to `"declared"`). Use `whyEffectFromLedger` for authorization claims.
76
+ */
77
+ export declare function whyEffectFromFlow(input: WhyEffectFromFlowInput): WhyEffectFromFlowResult;
78
+ export interface WhyEffectFromLedgerInput extends Omit<WhyEffectFromFlowInput, "status" | "intentId" | "principalId" | "capabilityBindingIds"> {
79
+ intents: readonly WriteIntentRecord[];
80
+ ledgerError?: string;
81
+ }
82
+ /**
83
+ * Explain authority from the durable resource ledger, not from declaration
84
+ * alone. A statically valid effect without a matching write intent remains
85
+ * unauthorized because no mutation permit was durably admitted for it.
86
+ */
87
+ export declare function whyEffectFromLedger(input: WhyEffectFromLedgerInput): WhyEffectFromFlowResult;
88
+ export declare function whyEffectFromDurableJournal(input: Omit<WhyEffectFromLedgerInput, "intents" | "ledgerError"> & {
89
+ controlDirectory?: string;
90
+ }): Promise<WhyEffectFromFlowResult>;
91
+ /** Plain-text render for MCP / CLI (no markdown fences). */
92
+ export declare function formatWhyEffect(why: WhyEffect): string;
93
+ export {};
94
+ //# sourceMappingURL=why.d.ts.map