@tacuchi/agent-workflow-cli 21.5.0 → 21.7.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.
Files changed (101) hide show
  1. package/dist/application/artifacts-service.js +10 -0
  2. package/dist/application/artifacts-service.js.map +1 -1
  3. package/dist/application/capability/design-handler.js +224 -12
  4. package/dist/application/capability/design-handler.js.map +1 -1
  5. package/dist/application/capability/dispatcher.js +20 -6
  6. package/dist/application/capability/dispatcher.js.map +1 -1
  7. package/dist/application/capability/durable-effect.js +23 -157
  8. package/dist/application/capability/durable-effect.js.map +1 -1
  9. package/dist/application/checkpoint-service.js +49 -3
  10. package/dist/application/checkpoint-service.js.map +1 -1
  11. package/dist/application/checkpoint-write-service.js +5 -0
  12. package/dist/application/checkpoint-write-service.js.map +1 -1
  13. package/dist/application/design/design-gate-service.js +18 -0
  14. package/dist/application/design/design-gate-service.js.map +1 -1
  15. package/dist/application/design/design-index-service.js +2 -0
  16. package/dist/application/design/design-index-service.js.map +1 -1
  17. package/dist/application/design/design-resolver-service.js +18 -1
  18. package/dist/application/design/design-resolver-service.js.map +1 -1
  19. package/dist/application/design/design-simple-service.js +217 -0
  20. package/dist/application/design/design-simple-service.js.map +1 -0
  21. package/dist/application/flow/advance.js +96 -11
  22. package/dist/application/flow/advance.js.map +1 -1
  23. package/dist/application/flow/flow-service.js +12 -1
  24. package/dist/application/flow/flow-service.js.map +1 -1
  25. package/dist/application/flow/internal-actions.js +221 -0
  26. package/dist/application/flow/internal-actions.js.map +1 -0
  27. package/dist/application/flow/internal-drive.js +293 -0
  28. package/dist/application/flow/internal-drive.js.map +1 -0
  29. package/dist/application/flow/submit.js +242 -84
  30. package/dist/application/flow/submit.js.map +1 -1
  31. package/dist/application/local-proposal.js +171 -0
  32. package/dist/application/local-proposal.js.map +1 -0
  33. package/dist/application/parsers/decisiones.js +13 -0
  34. package/dist/application/parsers/decisiones.js.map +1 -1
  35. package/dist/application/paths-service.js +11 -1
  36. package/dist/application/paths-service.js.map +1 -1
  37. package/dist/application/resume-service.js +22 -26
  38. package/dist/application/resume-service.js.map +1 -1
  39. package/dist/application/semantic-operation/protocol.js +10 -2
  40. package/dist/application/semantic-operation/protocol.js.map +1 -1
  41. package/dist/application/session-artifacts.js +53 -0
  42. package/dist/application/session-artifacts.js.map +1 -1
  43. package/dist/application/session-close-service.js +5 -0
  44. package/dist/application/session-close-service.js.map +1 -1
  45. package/dist/application/session-narrative.js +294 -0
  46. package/dist/application/session-narrative.js.map +1 -0
  47. package/dist/application/status-service.js +1 -0
  48. package/dist/application/status-service.js.map +1 -1
  49. package/dist/application/workline-index-service.js +2 -0
  50. package/dist/application/workline-index-service.js.map +1 -1
  51. package/dist/cli/commands/capability.js +1 -1
  52. package/dist/cli/commands/capability.js.map +1 -1
  53. package/dist/cli/commands/designs.js +4 -1
  54. package/dist/cli/commands/designs.js.map +1 -1
  55. package/dist/cli/commands/flow.js +14 -0
  56. package/dist/cli/commands/flow.js.map +1 -1
  57. package/dist/cli/commands/session-artifacts.js +55 -2
  58. package/dist/cli/commands/session-artifacts.js.map +1 -1
  59. package/dist/cli/tui/components/git-flow-actions.js +233 -15
  60. package/dist/cli/tui/components/git-flow-actions.js.map +1 -1
  61. package/dist/cli/tui/tabs/project-tab.js +9 -10
  62. package/dist/cli/tui/tabs/project-tab.js.map +1 -1
  63. package/dist/domain/design/capability.js +35 -4
  64. package/dist/domain/design/capability.js.map +1 -1
  65. package/dist/domain/design/direct.js.map +1 -1
  66. package/dist/domain/design/expansion.js +137 -0
  67. package/dist/domain/design/expansion.js.map +1 -0
  68. package/dist/domain/design/manifest.js +61 -8
  69. package/dist/domain/design/manifest.js.map +1 -1
  70. package/dist/domain/design/reference.js +57 -10
  71. package/dist/domain/design/reference.js.map +1 -1
  72. package/dist/domain/design/simple.js +164 -0
  73. package/dist/domain/design/simple.js.map +1 -0
  74. package/dist/domain/flow/answer.js +90 -12
  75. package/dist/domain/flow/answer.js.map +1 -1
  76. package/dist/domain/flow/authority.js +266 -60
  77. package/dist/domain/flow/authority.js.map +1 -1
  78. package/dist/domain/flow/authorization.js +36 -15
  79. package/dist/domain/flow/authorization.js.map +1 -1
  80. package/dist/domain/flow/directive.js +10 -6
  81. package/dist/domain/flow/directive.js.map +1 -1
  82. package/dist/domain/flow/execution-result.js +72 -0
  83. package/dist/domain/flow/execution-result.js.map +1 -0
  84. package/dist/domain/flow/run-state.js +165 -13
  85. package/dist/domain/flow/run-state.js.map +1 -1
  86. package/dist/domain/host-verification.js +8 -8
  87. package/dist/domain/host-verification.js.map +1 -1
  88. package/dist/domain/proposal.js +91 -0
  89. package/dist/domain/proposal.js.map +1 -0
  90. package/dist/domain/session/narrative.js +126 -0
  91. package/dist/domain/session/narrative.js.map +1 -0
  92. package/package.json +1 -1
  93. package/skills/w/SKILL.md +1 -1
  94. package/skills/w/loops/CHASSIS.md +1 -1
  95. package/skills/w/loops/plan-new-loop/LOOP.md +5 -6
  96. package/skills/w/loops/plan-refine-loop/LOOP.md +7 -7
  97. package/skills/w/loops/spec-refine-loop/LOOP.md +6 -4
  98. package/skills/w/modules/DESIGN-REFERENCES.md +50 -56
  99. package/skills/w/roles/design/CONTRACT.md +73 -6
  100. package/skills/w/roles/design/ROLE.md +21 -3
  101. package/skills/w/schemas/design/design-manifest.v1.schema.json +4 -0
@@ -20,15 +20,23 @@
20
20
  * carrying its code, message and action — with `ok: false` the host never calls
21
21
  * `renderHuman`, and a boundary nobody can see is a boundary that did not happen.
22
22
  */
23
+ import { join } from "node:path";
24
+ import { authorizeEffects } from "../../domain/capability/effects.js";
23
25
  import { AttemptLedger } from "../../domain/capability/protocol.js";
24
26
  import { claimedSeal, parseFlowAnswer } from "../../domain/flow/answer.js";
25
- import { actionOf, effectsOf, journeyOfFlow, } from "../../domain/flow/authority.js";
27
+ import { actionOf, internalActionOf, journeyOfFlow, proposalContractOf, publishApprovalOf, } from "../../domain/flow/authority.js";
26
28
  import { effectApprovalDigest } from "../../domain/flow/authorization.js";
27
29
  import { PAUSE_LABEL, STOP_LABEL, stepOf, } from "../../domain/flow/directive.js";
28
- import { applyTransition, checkAgainstJourney, withApproval, withAttempt, withBoundary, withObservation, } from "../../domain/flow/run-state.js";
30
+ import { executionVerdict } from "../../domain/flow/execution-result.js";
31
+ import { applyTransition, checkAgainstJourney, withApproval, withAttempt, withBoundary, withObservation, withProposal, } from "../../domain/flow/run-state.js";
32
+ import { destinationsOf, sealProposal } from "../../domain/proposal.js";
33
+ import { baseDigest } from "../../domain/proposal.js";
34
+ import { checkSafeRelativePath } from "../../domain/safe-path.js";
35
+ import { resolveWorkspaceRootFrom } from "../paths-service.js";
29
36
  import { semanticDigest } from "../semantic-operation/protocol.js";
30
37
  import { resolveSessionTarget } from "../session-resolver.js";
31
- import { actionDigest, advanceFlowRun, directiveFor, resolveBoundary, } from "./advance.js";
38
+ import { actionDigest, advanceFlowRun, directiveFor, effectsOfTransition, resolveBoundary, } from "./advance.js";
39
+ import { driveInternalActions } from "./internal-drive.js";
32
40
  import { applyUnderLock, locateRun } from "./run-state-service.js";
33
41
  export async function submitFlow(fs, paths, input) {
34
42
  const resolution = await resolveSessionTarget(fs, paths, {
@@ -40,6 +48,11 @@ export async function submitFlow(fs, paths, input) {
40
48
  if (resolution.outcome !== "resolved")
41
49
  return { ok: false, session: resolution };
42
50
  const location = locateRun(paths, resolution.session.folder);
51
+ // Read the destinations BEFORE taking the lock, so the decision below stays
52
+ // pure. What this observation buys is the honest half of the preview — whether
53
+ // a write creates or replaces, and what it would replace — and the race it
54
+ // leaves open is exactly the one the compare-and-swap closes at publish time.
55
+ const snapshot = await observeDestinations(fs, paths, input.raw);
43
56
  const applied = await applyUnderLock(fs, location, (current) => {
44
57
  if (current === null) {
45
58
  return {
@@ -51,13 +64,82 @@ export async function submitFlow(fs, paths, input) {
51
64
  },
52
65
  };
53
66
  }
54
- return decide(current, input);
67
+ return decide(current, input, snapshot);
55
68
  });
56
69
  if (!applied.ok)
57
70
  return { ok: false, failure: applied.failure };
58
- return { ok: true, directive: applied.value };
71
+ // An answer that ADVANCED the run can leave it standing on an internal action —
72
+ // an approval of the close is exactly that — and stopping here would hand back a
73
+ // step this same process is about to be asked to run.
74
+ //
75
+ // A REFUSED answer never drives: the directive it produced is the refusal, and
76
+ // replacing it with whatever the CLI did next would tell the sender their answer
77
+ // was fine. The run stays where the refusal left it.
78
+ if (!applied.value.advanced)
79
+ return { ok: true, directive: applied.value.directive };
80
+ const driven = await driveInternalActions(fs, location, input.executor, {
81
+ ok: true,
82
+ state: applied.state,
83
+ value: applied.value.directive,
84
+ });
85
+ if (!driven.ok)
86
+ return { ok: false, failure: driven.failure };
87
+ return { ok: true, directive: driven.value };
88
+ }
89
+ /**
90
+ * Stat the destinations the payload names, without trusting anything else in it.
91
+ *
92
+ * The paths come from raw JSON and are used for nothing but deciding which files
93
+ * to look at; whether each one is a LEGAL destination is settled later by the
94
+ * boundary's own allowlist. Doing it here is what keeps the whole decision —
95
+ * including the seal — reproducible without a filesystem.
96
+ *
97
+ * The shape check is NOT redundant with that allowlist. Reading is an effect, and
98
+ * an absolute path or a `..` would have this function open a file outside the
99
+ * workspace before anybody decided the destination was admissible. Nothing would
100
+ * leak — the entry is discarded when validation rejects the path — but "read only
101
+ * what you were asked to read" is not a property to leave resting on what happens
102
+ * to the result afterwards.
103
+ */
104
+ async function observeDestinations(fs, paths, raw) {
105
+ const snapshot = new Map();
106
+ let parsed;
107
+ try {
108
+ parsed = JSON.parse(raw);
109
+ }
110
+ catch {
111
+ return snapshot;
112
+ }
113
+ const artifacts = parsed?.artifacts;
114
+ if (!Array.isArray(artifacts) || artifacts.length === 0)
115
+ return snapshot;
116
+ const root = await resolveWorkspaceRootFrom(fs, paths);
117
+ for (const entry of artifacts) {
118
+ const path = entry?.path;
119
+ if (typeof path !== "string")
120
+ continue;
121
+ const relative = path.trim();
122
+ if (relative.length === 0 || snapshot.has(relative))
123
+ continue;
124
+ if (!checkSafeRelativePath(relative).ok)
125
+ continue;
126
+ const absolute = join(root, relative);
127
+ if (!(await fs.exists(absolute))) {
128
+ snapshot.set(relative, { exists: false, digest: "" });
129
+ continue;
130
+ }
131
+ try {
132
+ snapshot.set(relative, { exists: true, digest: baseDigest(await fs.readText(absolute)) });
133
+ }
134
+ catch {
135
+ // Unreadable is not "absent": treating it as a fresh create would propose a
136
+ // silent overwrite of something nobody could show the person.
137
+ snapshot.set(relative, { exists: true, digest: "" });
138
+ }
139
+ }
140
+ return snapshot;
59
141
  }
60
- function decide(state, input) {
142
+ function decide(state, input, snapshot) {
61
143
  const journey = journeyOfFlow(state.flow);
62
144
  const incoherent = checkAgainstJourney(state, journey);
63
145
  if (incoherent !== null)
@@ -100,8 +182,20 @@ function decide(state, input) {
100
182
  const parsed = admissible;
101
183
  // 3 · Apply: the answer is the INPUT to the CLI's decision, so what advances is
102
184
  // the transition, never the sender's own verdict.
185
+ //
186
+ // Two things can happen here besides advancing, and both are approvals: the
187
+ // classic one over an effect class named by a boundary, and the one this phase
188
+ // added — a single `Aprobar y guardar` that grants over the exact proposal the
189
+ // preview showed. Neither ever applies the step by itself.
190
+ const sealed = sealFrom(state, resolved.stopped, parsed.answer, snapshot);
191
+ if ("failure" in sealed) {
192
+ return reject(state, resolved, sealed.failure.message, {
193
+ code: sealed.failure.code,
194
+ action: sealed.failure.action,
195
+ });
196
+ }
103
197
  const granted = resolved.kind === "authorization" ? (resolved.authorization?.planned ?? []) : [];
104
- const approved = granted.length > 0 ? withApproval(state, granted) : state;
198
+ const approved = grantOf(sealed.state, resolved, parsed.answer, granted);
105
199
  // An approval NEVER applies a step by itself. Two reasons it must hold, and the
106
200
  // second is the one this phase exists for: doctrine may still own the rule, or
107
201
  // the step may be delegated — and an approval that applied a delegated
@@ -113,6 +207,122 @@ function decide(state, input) {
113
207
  ? holdAfterApproval(approved, journey, identity)
114
208
  : applyAndAdvance(approved, journey, resolved.stopped, identity, parsed.answer);
115
209
  }
210
+ /**
211
+ * Seat the proposal an authoring answer just handed over — sealed, not believed.
212
+ *
213
+ * Three things are DERIVED here and none of them is taken from the sender: whether
214
+ * each destination already exists (so the preview says "replaces" only when it
215
+ * does), the compare-and-swap base of every destination that does, and the effect
216
+ * classes the write really exercises. The row's declared effects are the ceiling,
217
+ * and a proposal that would reach past it is refused rather than quietly widened —
218
+ * a save row that never declared `mutate_overwrite` may not overwrite because the
219
+ * bytes happened to land on an existing file.
220
+ */
221
+ function sealFrom(state, stopped, answer, snapshot) {
222
+ const contract = proposalContractOf(stopped);
223
+ if (contract === null || answer.artifacts.length === 0)
224
+ return { state };
225
+ // A destination nobody looked at cannot be previewed. Defaulting it to "creates"
226
+ // would be the one line of the preview a person most needs to trust, guessed —
227
+ // so an unobserved path is a refusal, not a default.
228
+ const unseen = answer.artifacts.filter((artifact) => !snapshot.has(artifact.path));
229
+ if (unseen.length > 0) {
230
+ return {
231
+ failure: {
232
+ code: "FLOW_PROPOSAL_DESTINATION_UNOBSERVED",
233
+ message: `no se pudo mirar el estado vigente de ${unseen.map((a) => a.path).join(", ")}`,
234
+ action: "volvé a enviar la propuesta con destinos relativos dentro del workspace",
235
+ },
236
+ };
237
+ }
238
+ const artifacts = answer.artifacts.map((artifact) => ({
239
+ path: artifact.path,
240
+ content: artifact.content,
241
+ overwrite: snapshot.get(artifact.path)?.exists === true,
242
+ }));
243
+ const effects = [];
244
+ if (artifacts.some((a) => !a.overwrite))
245
+ effects.push("local_additive");
246
+ if (artifacts.some((a) => a.overwrite))
247
+ effects.push("mutate_overwrite");
248
+ const beyond = effects.filter((effect) => !contract.effects.includes(effect));
249
+ if (beyond.length > 0) {
250
+ return {
251
+ failure: {
252
+ code: "FLOW_PROPOSAL_BEYOND_CONTRACT",
253
+ message: `la propuesta ejercería ${beyond.join(", ")} y esta frontera no lo declara`,
254
+ action: `proponé sólo efectos de: ${contract.effects.join(", ")}`,
255
+ },
256
+ };
257
+ }
258
+ const bases = artifacts
259
+ .filter((a) => a.overwrite)
260
+ .map((a) => ({ path: a.path, digest: snapshot.get(a.path)?.digest ?? "" }));
261
+ const unreadable = bases.filter((base) => base.digest.length === 0);
262
+ if (unreadable.length > 0) {
263
+ return {
264
+ failure: {
265
+ code: "FLOW_PROPOSAL_BASE_UNREADABLE",
266
+ message: `no se pudo leer el contenido vigente de ${unreadable.map((b) => b.path).join(", ")}`,
267
+ action: "no se propone sobrescribir lo que no se puede mostrar: revisá permisos",
268
+ },
269
+ };
270
+ }
271
+ const authorization = authorizeEffects(effects.map((effect) => ({
272
+ class: effect,
273
+ idempotent: true,
274
+ authorization: "invocation",
275
+ approval: "none",
276
+ })), { sensitiveSources: false, scopeExpanded: false });
277
+ return {
278
+ state: withProposal(state, sealProposal({
279
+ operation: `flow.${stopped.id}`,
280
+ artifacts,
281
+ bases,
282
+ // No flow row reads a sensitive source or reaches past what it shows
283
+ // today. The fields are sealed anyway: the day one does, the digest
284
+ // changes and every grant given under the old scope stops matching.
285
+ scope: { sensitive_sources: false, scope_expanded: false },
286
+ effects,
287
+ requiresApproval: authorization.needsPreflight,
288
+ })),
289
+ };
290
+ }
291
+ /**
292
+ * The grant this answer produced, scoped to what it was given over.
293
+ *
294
+ * `Aprobar y guardar` at a publishing row is one decision that covers the whole
295
+ * preview, and the seal is the proposal's own: a later boundary, or the same
296
+ * proposal after any material edit, does not match it. Choosing anything else —
297
+ * `Refinar`, `Compactar`, `Cerrar` — grants nothing, which is what makes
298
+ * "`Refinar` produces no effects" a property rather than a promise.
299
+ */
300
+ function grantOf(state, resolved, answer, granted) {
301
+ const stopped = resolved.stopped;
302
+ const proposal = state.proposal;
303
+ const approve = stopped === null ? null : publishApprovalOf(stopped);
304
+ if (approve !== null && proposal !== null) {
305
+ if (answer.choice === approve) {
306
+ return withApproval(state, {
307
+ digest: proposal.digest,
308
+ destinations: destinationsOf(proposal),
309
+ classes: [...proposal.requires_approval],
310
+ });
311
+ }
312
+ // Declining unseats the proposal, and that is what makes `Refinar` cost
313
+ // nothing: the publication downstream finds nothing to publish and is skipped
314
+ // saying so, instead of stopping to ask for an authorization over bytes the
315
+ // person just turned down.
316
+ return withProposal(state, null);
317
+ }
318
+ if (granted.length === 0 || resolved.authorization === null)
319
+ return state;
320
+ return withApproval(state, {
321
+ digest: resolved.authorization.seal,
322
+ destinations: [],
323
+ classes: [...granted],
324
+ });
325
+ }
116
326
  /**
117
327
  * Everything that decides whether this payload may become a transition.
118
328
  *
@@ -134,6 +344,7 @@ function admit(state, resolved, stopped, input, spent) {
134
344
  approval: input.approval,
135
345
  expectedApproval,
136
346
  action: resolved.action,
347
+ request: resolved.request,
137
348
  });
138
349
  if (!parsed.ok) {
139
350
  // An answer the boundary refused IS an attempt spent: it is the exact event
@@ -170,85 +381,16 @@ function admit(state, resolved, stopped, input, spent) {
170
381
  // run with its evidence and its whole effect keeps the boundary standing: the
171
382
  // work stays pending, with the recovery the action declared.
172
383
  if (resolved.kind === "execution") {
173
- const verdict = executionVerdict(parsed.answer, resolved.action, effectsOf(stopped));
384
+ // The row's `effects` are the ceiling and the sealed proposal is what really
385
+ // happens: demanding an overwrite from a publication that only creates files
386
+ // would leave the transition pending for an effect nobody could produce.
387
+ const verdict = executionVerdict(parsed.answer.result, resolved.action, effectsOfTransition(state, stopped));
174
388
  if (verdict !== null) {
175
389
  return { decision: reject(state, resolved, verdict.message, verdict.detail, spent) };
176
390
  }
177
391
  }
178
392
  return parsed;
179
393
  }
180
- /**
181
- * Why this execution result does not apply the transition — or `null` when it does.
182
- *
183
- * Three verdicts, and each one is the answer to a way a run could claim work that
184
- * never happened: an outcome that is not `completed` did not finish; evidence that
185
- * is missing, failed or empty means nothing came back from the tool; and an effect
186
- * ledger short of what the row declared means the invocation got partway. The
187
- * recovery the action declared travels in every one of them, because a run stopped
188
- * without a next step is the dead end this whole contract refuses.
189
- */
190
- function executionVerdict(answer, action, declared) {
191
- const result = answer.result;
192
- if (result === null || action === null) {
193
- return {
194
- message: "la respuesta no trae el resultado de la invocación",
195
- detail: {
196
- code: "FLOW_RESULT_INVALID",
197
- action: "devolvé el resultado real de la acción: outcome, invocación, validaciones y efectos",
198
- },
199
- };
200
- }
201
- if (result.outcome !== "completed") {
202
- return {
203
- message: `la invocación devolvió '${result.outcome}': la transición sigue pendiente`,
204
- detail: {
205
- code: "FLOW_EXECUTION_NOT_COMPLETED",
206
- action: action.recovery,
207
- outcome: result.outcome,
208
- },
209
- };
210
- }
211
- const missing = action.evidence.filter((id) => {
212
- const found = result.validations.find((validation) => validation.id === id);
213
- return found === undefined || !found.passed || (found.detail ?? "").trim().length === 0;
214
- });
215
- if (missing.length > 0) {
216
- return {
217
- message: `falta la evidencia real de ${missing.join(", ")}`,
218
- detail: {
219
- code: "FLOW_EVIDENCE_MISSING",
220
- action: `devolvé cada validación exigida con 'passed' y su 'detail' — la salida de la herramienta, no una afirmación. ${action.recovery}`,
221
- },
222
- };
223
- }
224
- const applied = new Set(result.effects.applied);
225
- const partial = declared.filter((effect) => !applied.has(effect));
226
- if (partial.length > 0) {
227
- return {
228
- message: `la invocación declara completa pero no aplicó ${partial.join(", ")}`,
229
- detail: {
230
- code: "FLOW_EFFECT_PARTIAL",
231
- action: action.recovery,
232
- outcome: "needs_input",
233
- },
234
- };
235
- }
236
- // Completeness is not an outcome — it answers "does what came back cover what
237
- // was asked?" — so an attempt that FINISHED can still hand back a partial
238
- // output. Ignoring that here would let the run credit a search that returned
239
- // half its matches as if it had returned all of them.
240
- if (result.output?.completeness === "partial") {
241
- return {
242
- message: "la invocación terminó pero su salida declara cobertura parcial",
243
- detail: {
244
- code: "FLOW_EFFECT_PARTIAL",
245
- action: action.recovery,
246
- outcome: "needs_input",
247
- },
248
- };
249
- }
250
- return null;
251
- }
252
394
  /**
253
395
  * Whether the sealed action changed underneath a run that is standing on it.
254
396
  *
@@ -285,7 +427,7 @@ function holdAfterApproval(approved, journey, identity) {
285
427
  const held = advanceFlowRun({ state: withAttempt(approved, identity), journey, applied: [] });
286
428
  if (!held.ok)
287
429
  return { ok: false, failure: held.failure };
288
- return { ok: true, state: held.state, value: held.directive };
430
+ return { ok: true, state: held.state, value: { directive: held.directive, advanced: true } };
289
431
  }
290
432
  /** The answer survived: the transition applies and the run keeps advancing. */
291
433
  function applyAndAdvance(approved, journey, stopped, identity, answer) {
@@ -295,7 +437,14 @@ function applyAndAdvance(approved, journey, stopped, identity, answer) {
295
437
  let next = answer.signals.length > 0
296
438
  ? withObservation(approved, { transition: stopped.id, signals: answer.signals })
297
439
  : approved;
298
- next = applyTransition(next, stopped.id, effectsOf(stopped));
440
+ next = applyTransition(next, stopped.id, effectsOfTransition(next, stopped));
441
+ // A published proposal is spent, whoever published it. This is the degraded
442
+ // path — no internal executor, so the caller ran the write and returned its
443
+ // result — and leaving the proposal seated would keep a preview of bytes that
444
+ // are already on disk standing in front of the next boundary.
445
+ if (internalActionOf(stopped)?.operation === "proposal.publish") {
446
+ next = withProposal(next, null);
447
+ }
299
448
  next = withAttempt(next, identity);
300
449
  // The boundary follows the position, always: handing the engine a state whose
301
450
  // boundary still names the transition just applied is exactly the incoherence
@@ -304,7 +453,11 @@ function applyAndAdvance(approved, journey, stopped, identity, answer) {
304
453
  const advanced = advanceFlowRun({ state: next, journey, applied: [stepOf(stopped)] });
305
454
  if (!advanced.ok)
306
455
  return { ok: false, failure: advanced.failure };
307
- return { ok: true, state: advanced.state, value: advanced.directive };
456
+ return {
457
+ ok: true,
458
+ state: advanced.state,
459
+ value: { directive: advanced.directive, advanced: true },
460
+ };
308
461
  }
309
462
  /**
310
463
  * Whether this submission is a resend, judged by the ledger that already knows
@@ -392,7 +545,12 @@ function reject(state, resolved, message, detail, spent) {
392
545
  ...built.directive,
393
546
  error: now.error ?? { code: detail.code, message, action: detail.action },
394
547
  };
395
- return { ok: true, state: after, value: directive, persist: spent !== undefined };
548
+ return {
549
+ ok: true,
550
+ state: after,
551
+ value: { directive, advanced: false },
552
+ persist: spent !== undefined,
553
+ };
396
554
  }
397
555
  /**
398
556
  * The attempt this submission is, in the terms `AttemptLedger` already validates.
@@ -1 +1 @@
1
- {"version":3,"file":"submit.js","sourceRoot":"","sources":["../../../src/application/flow/submit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"submit.js","sourceRoot":"","sources":["../../../src/application/flow/submit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Applying a sealed local proposal — the one path, for whoever proposed it.
3
+ *
4
+ * The capability dispatcher and the flow engine both reach here, and that is the
5
+ * point: two implementations of "check the approval, re-read the base, publish
6
+ * all-or-nothing" would be two answers to whether a publication was legitimate,
7
+ * and the weaker of the two would be the one that decides.
8
+ *
9
+ * What has to be true together before the first byte lands:
10
+ *
11
+ * - the approval was given over THIS proposal's seal, not a neighbouring one;
12
+ * - every class the taxonomy demands a preflight for was actually granted;
13
+ * - every base is still what the candidate output was computed from.
14
+ *
15
+ * Any of the three failing stops before `publishArtifacts` is called at all. And
16
+ * a base that moved is not automatically a refusal: a publication that already
17
+ * landed and whose confirmation never got written is the recoverable case F1
18
+ * introduced, so it is recognized as such instead of being reported as a
19
+ * conflict nobody can resolve.
20
+ */
21
+ import { join } from "node:path";
22
+ import { baseDigest } from "../domain/proposal.js";
23
+ import { withCwdLock } from "./lock-service.js";
24
+ import { publishArtifacts } from "./semantic-operation/publish.js";
25
+ export async function applyLocalProposal(fs, paths, input) {
26
+ const gate = checkApproval(input);
27
+ if (gate !== null)
28
+ return { ok: false, failure: gate, applied: [] };
29
+ const applied = appliedClasses(input);
30
+ if (await alreadyLanded(fs, input.root, input.proposal.artifacts)) {
31
+ return {
32
+ ok: true,
33
+ result: { written: [], applied, already_applied: true },
34
+ };
35
+ }
36
+ const stale = await checkBases(fs, input);
37
+ if (stale !== null)
38
+ return { ok: false, failure: stale, applied: [] };
39
+ const outcome = await withCwdLock(fs, paths, async () => publishArtifacts(fs, input.root, publishable(input.proposal.artifacts)));
40
+ if ("error" in outcome) {
41
+ return {
42
+ ok: false,
43
+ failure: {
44
+ code: "PROPOSAL_LOCKED",
45
+ message: outcome.error,
46
+ action: "esperá a que se libere el lock del workspace y volvé a aplicar",
47
+ },
48
+ applied: [],
49
+ };
50
+ }
51
+ if (!outcome.ok) {
52
+ // `publishArtifacts` is all-or-nothing and rolls back, so nothing landed —
53
+ // and saying so explicitly is what makes the empty list a claim rather than
54
+ // an omission.
55
+ return {
56
+ ok: false,
57
+ failure: {
58
+ code: outcome.failure.code,
59
+ message: outcome.failure.message,
60
+ action: outcome.failure.action,
61
+ },
62
+ applied: [],
63
+ };
64
+ }
65
+ return {
66
+ ok: true,
67
+ result: { written: outcome.value.written, applied, already_applied: false },
68
+ };
69
+ }
70
+ function publishable(artifacts) {
71
+ return artifacts.map((a) => ({ path: a.path, content: a.content, overwrite: a.overwrite }));
72
+ }
73
+ /** Only the durable classes, and only the ones somebody really authorized. */
74
+ function appliedClasses(input) {
75
+ return [...new Set([...input.selfAuthorized, ...input.approval.granted])].filter((c) => input.proposal.effects.includes(c));
76
+ }
77
+ function checkApproval(input) {
78
+ if (input.approval.digest !== input.proposal.digest) {
79
+ return {
80
+ code: "PROPOSAL_APPROVAL_MISMATCH",
81
+ message: "lo aprobado no es la propuesta que se va a escribir",
82
+ action: "volvé a preparar la propuesta y aprobá exactamente la vista previa que se muestra",
83
+ };
84
+ }
85
+ const missing = input.proposal.requires_approval.filter((c) => !input.approval.granted.includes(c));
86
+ if (missing.length > 0) {
87
+ return {
88
+ code: "PROPOSAL_APPROVAL_MISSING",
89
+ message: `falta aprobación visible para: ${missing.join(", ")}`,
90
+ action: "mostrá datos, destino y efecto, y pedí aprobación antes de aplicar",
91
+ };
92
+ }
93
+ return null;
94
+ }
95
+ /**
96
+ * Whether every destination already holds exactly these bytes.
97
+ *
98
+ * This is the re-entry case, not an optimization. A process that published and
99
+ * died before its confirmation was persisted comes back with the base moved — by
100
+ * its own write — and refusing it as stale would strand a run on a conflict that
101
+ * does not exist. Checked on the artifacts and never on the bases, because the
102
+ * question is "is the result already there", and only the exact bytes answer it:
103
+ * a destination holding anything else is not this publication.
104
+ */
105
+ async function alreadyLanded(fs, root, artifacts) {
106
+ for (const artifact of artifacts) {
107
+ const absolute = join(root, artifact.path);
108
+ if (!(await fs.exists(absolute)))
109
+ return false;
110
+ try {
111
+ if ((await fs.readText(absolute)) !== artifact.content)
112
+ return false;
113
+ }
114
+ catch {
115
+ return false;
116
+ }
117
+ }
118
+ return artifacts.length > 0;
119
+ }
120
+ /**
121
+ * Every base has to still be the base.
122
+ *
123
+ * A candidate output computed from revision N and published on top of revision
124
+ * N+1 is a silent overwrite of whatever happened in between — the reason the
125
+ * compare-and-swap exists at all. Re-read at apply, never trusted from prepare.
126
+ */
127
+ async function checkBases(fs, input) {
128
+ for (const base of input.proposal.bases) {
129
+ const absolute = join(input.root, base.path);
130
+ if (!(await fs.exists(absolute))) {
131
+ return {
132
+ code: "PROPOSAL_BASE_GONE",
133
+ message: `la base '${base.path}' ya no existe`,
134
+ action: "volvé a preparar la operación sobre la base vigente",
135
+ };
136
+ }
137
+ const current = baseDigest(await fs.readText(absolute));
138
+ if (current !== base.digest) {
139
+ return {
140
+ code: "PROPOSAL_BASE_STALE",
141
+ message: `'${base.path}' cambió después de preparar la propuesta`,
142
+ action: "volvé a preparar la operación sobre la base vigente y revisá el resultado",
143
+ };
144
+ }
145
+ }
146
+ return null;
147
+ }
148
+ /**
149
+ * What to say when something broke or was cancelled AFTER an effect landed.
150
+ *
151
+ * The failure mode this closes is the comfortable one: reporting a cancellation
152
+ * as if nothing had happened, because the operation "did not finish". An
153
+ * external step that already left the machine cannot be un-left, so the honest
154
+ * report enumerates it and hands back the reconciliation to run.
155
+ */
156
+ export function reconcileAfterFailure(outcome, partial) {
157
+ if (partial.length === 0) {
158
+ return {
159
+ applied: [],
160
+ next_action: outcome === "cancelled"
161
+ ? "no se aplicó ningún efecto: podés volver a intentar cuando quieras"
162
+ : "no se aplicó ningún efecto: corregí la causa del fallo y volvé a intentar",
163
+ };
164
+ }
165
+ const detail = partial.map((p) => `${p.class}: ${p.what}`).join("; ");
166
+ return {
167
+ applied: [...new Set(partial.map((p) => p.class))],
168
+ next_action: `quedaron efectos aplicados que hay que reconciliar a mano — ${detail}`,
169
+ };
170
+ }
171
+ //# sourceMappingURL=local-proposal.js.map