@tacuchi/agent-workflow-cli 25.6.1 → 25.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4398 -0
- package/README.md +1 -1
- package/dist/adapters/git-cli.js +160 -13
- package/dist/adapters/git-cli.js.map +1 -1
- package/dist/adapters/node-file-system.js +39 -2
- package/dist/adapters/node-file-system.js.map +1 -1
- package/dist/application/branch-resolver.js +34 -1
- package/dist/application/branch-resolver.js.map +1 -1
- package/dist/application/capability/readiness.js +26 -10
- package/dist/application/capability/readiness.js.map +1 -1
- package/dist/application/capability/wrapper.js +10 -3
- package/dist/application/capability/wrapper.js.map +1 -1
- package/dist/application/checkpoint-write-service.js +161 -39
- package/dist/application/checkpoint-write-service.js.map +1 -1
- package/dist/application/dates.js +12 -0
- package/dist/application/dates.js.map +1 -1
- package/dist/application/dev-only-services.js +5 -7
- package/dist/application/dev-only-services.js.map +1 -1
- package/dist/application/doctor/provider-mcps.js +1 -1
- package/dist/application/doctor/provider-mcps.js.map +1 -1
- package/dist/application/fix-git-service.js +83 -13
- package/dist/application/fix-git-service.js.map +1 -1
- package/dist/application/flow/advance.js +64 -9
- package/dist/application/flow/advance.js.map +1 -1
- package/dist/application/flow/annul-service.js +159 -0
- package/dist/application/flow/annul-service.js.map +1 -0
- package/dist/application/flow/checkout-observation.js +49 -0
- package/dist/application/flow/checkout-observation.js.map +1 -1
- package/dist/application/flow/close-at-boundary.js +144 -0
- package/dist/application/flow/close-at-boundary.js.map +1 -0
- package/dist/application/flow/flow-service.js +213 -49
- package/dist/application/flow/flow-service.js.map +1 -1
- package/dist/application/flow/internal-actions.js +87 -4
- package/dist/application/flow/internal-actions.js.map +1 -1
- package/dist/application/flow/internal-drive.js +70 -33
- package/dist/application/flow/internal-drive.js.map +1 -1
- package/dist/application/flow/reopen-run.js +152 -0
- package/dist/application/flow/reopen-run.js.map +1 -0
- package/dist/application/flow/run-journey.js +11 -8
- package/dist/application/flow/run-journey.js.map +1 -1
- package/dist/application/flow/run-projection.js +37 -10
- package/dist/application/flow/run-projection.js.map +1 -1
- package/dist/application/flow/run-state-service.js +109 -36
- package/dist/application/flow/run-state-service.js.map +1 -1
- package/dist/application/flow/submit.js +217 -188
- package/dist/application/flow/submit.js.map +1 -1
- package/dist/application/git-flow-service.js +325 -72
- package/dist/application/git-flow-service.js.map +1 -1
- package/dist/application/hook-sql-mutation-guard.js +290 -27
- package/dist/application/hook-sql-mutation-guard.js.map +1 -1
- package/dist/application/host-memory/claude-code.js +65 -0
- package/dist/application/host-memory/claude-code.js.map +1 -0
- package/dist/application/host-memory/codex.js +225 -0
- package/dist/application/host-memory/codex.js.map +1 -0
- package/dist/application/host-memory/destination.js +52 -0
- package/dist/application/host-memory/destination.js.map +1 -0
- package/dist/application/host-memory/reader.js +9 -0
- package/dist/application/host-memory/reader.js.map +1 -0
- package/dist/application/host-memory/report.js +136 -0
- package/dist/application/host-memory/report.js.map +1 -0
- package/dist/application/lifecycle-target.js +3 -1
- package/dist/application/lifecycle-target.js.map +1 -1
- package/dist/application/local-proposal.js +13 -3
- package/dist/application/local-proposal.js.map +1 -1
- package/dist/application/logging/log-events.js +22 -0
- package/dist/application/logging/log-events.js.map +1 -1
- package/dist/application/parsers/spec-relation.js +20 -7
- package/dist/application/parsers/spec-relation.js.map +1 -1
- package/dist/application/persist-service.js +45 -1
- package/dist/application/persist-service.js.map +1 -1
- package/dist/application/plan-exec-batch-service.js +47 -2
- package/dist/application/plan-exec-batch-service.js.map +1 -1
- package/dist/application/plan-lineage-seal.js +93 -0
- package/dist/application/plan-lineage-seal.js.map +1 -0
- package/dist/application/plan-lint-service.js +153 -0
- package/dist/application/plan-lint-service.js.map +1 -0
- package/dist/application/prod-consent.js +75 -0
- package/dist/application/prod-consent.js.map +1 -0
- package/dist/application/reseal-service.js +9 -3
- package/dist/application/reseal-service.js.map +1 -1
- package/dist/application/self/install-skill.js +40 -12
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/self/install-targets.js +73 -2
- package/dist/application/self/install-targets.js.map +1 -1
- package/dist/application/self/uninstall.js +21 -7
- package/dist/application/self/uninstall.js.map +1 -1
- package/dist/application/self/update-self.js +204 -8
- package/dist/application/self/update-self.js.map +1 -1
- package/dist/application/session-create-service.js +49 -0
- package/dist/application/session-create-service.js.map +1 -1
- package/dist/application/session-custody-recorder.js +4 -0
- package/dist/application/session-custody-recorder.js.map +1 -1
- package/dist/application/session-narrative.js +36 -0
- package/dist/application/session-narrative.js.map +1 -1
- package/dist/application/session-resolver.js +28 -9
- package/dist/application/session-resolver.js.map +1 -1
- package/dist/application/session-resume-service.js +65 -16
- package/dist/application/session-resume-service.js.map +1 -1
- package/dist/application/source-boundary-policy.js +168 -34
- package/dist/application/source-boundary-policy.js.map +1 -1
- package/dist/application/working-branch-service.js +68 -0
- package/dist/application/working-branch-service.js.map +1 -0
- package/dist/application/workline-graph.js +7 -2
- package/dist/application/workline-graph.js.map +1 -1
- package/dist/cli/ascii.js +84 -0
- package/dist/cli/ascii.js.map +1 -0
- package/dist/cli/commands/amend.js +1 -0
- package/dist/cli/commands/amend.js.map +1 -1
- package/dist/cli/commands/capability.js +15 -0
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/check-branch.js +1 -0
- package/dist/cli/commands/check-branch.js.map +1 -1
- package/dist/cli/commands/checkpoint-read.js +1 -0
- package/dist/cli/commands/checkpoint-read.js.map +1 -1
- package/dist/cli/commands/checkpoint-write.js +22 -9
- package/dist/cli/commands/checkpoint-write.js.map +1 -1
- package/dist/cli/commands/claims.js +1 -0
- package/dist/cli/commands/claims.js.map +1 -1
- package/dist/cli/commands/code-scan.js +1 -0
- package/dist/cli/commands/code-scan.js.map +1 -1
- package/dist/cli/commands/context-budget.js +1 -0
- package/dist/cli/commands/context-budget.js.map +1 -1
- package/dist/cli/commands/context-plan.js +1 -0
- package/dist/cli/commands/context-plan.js.map +1 -1
- package/dist/cli/commands/cut-intent.js +1 -0
- package/dist/cli/commands/cut-intent.js.map +1 -1
- package/dist/cli/commands/designs.js +1 -0
- package/dist/cli/commands/designs.js.map +1 -1
- package/dist/cli/commands/dev-only.js +4 -0
- package/dist/cli/commands/dev-only.js.map +1 -1
- package/dist/cli/commands/doctor.js +5 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/export.js +13 -0
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/fix-git.js +46 -6
- package/dist/cli/commands/fix-git.js.map +1 -1
- package/dist/cli/commands/flow.js +61 -5
- package/dist/cli/commands/flow.js.map +1 -1
- package/dist/cli/commands/generate-launch.js +1 -0
- package/dist/cli/commands/generate-launch.js.map +1 -1
- package/dist/cli/commands/git-flow.js +104 -29
- package/dist/cli/commands/git-flow.js.map +1 -1
- package/dist/cli/commands/history-update.js +7 -9
- package/dist/cli/commands/history-update.js.map +1 -1
- package/dist/cli/commands/hook.js +11 -3
- package/dist/cli/commands/hook.js.map +1 -1
- package/dist/cli/commands/host-doctor.js +1 -0
- package/dist/cli/commands/host-doctor.js.map +1 -1
- package/dist/cli/commands/host-memory.js +26 -0
- package/dist/cli/commands/host-memory.js.map +1 -0
- package/dist/cli/commands/index.js +6 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/mcp.js +30 -4
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/merge-state.js +1 -0
- package/dist/cli/commands/merge-state.js.map +1 -1
- package/dist/cli/commands/multiroot.js +16 -0
- package/dist/cli/commands/multiroot.js.map +1 -1
- package/dist/cli/commands/persist.js +6 -0
- package/dist/cli/commands/persist.js.map +1 -1
- package/dist/cli/commands/plan.js +51 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/plugin-cache.js +4 -0
- package/dist/cli/commands/plugin-cache.js.map +1 -1
- package/dist/cli/commands/plugin-doctor.js +3 -0
- package/dist/cli/commands/plugin-doctor.js.map +1 -1
- package/dist/cli/commands/project-md-upsert.js +3 -0
- package/dist/cli/commands/project-md-upsert.js.map +1 -1
- package/dist/cli/commands/release-data.js +12 -0
- package/dist/cli/commands/release-data.js.map +1 -1
- package/dist/cli/commands/release-pass.js +10 -0
- package/dist/cli/commands/release-pass.js.map +1 -1
- package/dist/cli/commands/remove-source.js +1 -0
- package/dist/cli/commands/remove-source.js.map +1 -1
- package/dist/cli/commands/reseal.js +1 -0
- package/dist/cli/commands/reseal.js.map +1 -1
- package/dist/cli/commands/resume-summary.js +9 -2
- package/dist/cli/commands/resume-summary.js.map +1 -1
- package/dist/cli/commands/resume.js +1 -0
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/retirement.js +1 -0
- package/dist/cli/commands/retirement.js.map +1 -1
- package/dist/cli/commands/self.js +33 -0
- package/dist/cli/commands/self.js.map +1 -1
- package/dist/cli/commands/session-artifacts.js +1 -0
- package/dist/cli/commands/session-artifacts.js.map +1 -1
- package/dist/cli/commands/session-close.js +129 -30
- package/dist/cli/commands/session-close.js.map +1 -1
- package/dist/cli/commands/session-create.js +1 -0
- package/dist/cli/commands/session-create.js.map +1 -1
- package/dist/cli/commands/session-resume.js +1 -0
- package/dist/cli/commands/session-resume.js.map +1 -1
- package/dist/cli/commands/sessions.js +1 -0
- package/dist/cli/commands/sessions.js.map +1 -1
- package/dist/cli/commands/set-branch.js +41 -6
- package/dist/cli/commands/set-branch.js.map +1 -1
- package/dist/cli/commands/settle.js +1 -0
- package/dist/cli/commands/settle.js.map +1 -1
- package/dist/cli/commands/skill-index.js +1 -0
- package/dist/cli/commands/skill-index.js.map +1 -1
- package/dist/cli/commands/skills.js +1 -0
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/sources.js +1 -0
- package/dist/cli/commands/sources.js.map +1 -1
- package/dist/cli/commands/stack.js +1 -0
- package/dist/cli/commands/stack.js.map +1 -1
- package/dist/cli/commands/status.js +1 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/tool.js +5 -21
- package/dist/cli/commands/tool.js.map +1 -1
- package/dist/cli/commands/unknown-flags.js +67 -16
- package/dist/cli/commands/unknown-flags.js.map +1 -1
- package/dist/cli/commands/visibility.js +1 -0
- package/dist/cli/commands/visibility.js.map +1 -1
- package/dist/cli/commands/workspace-init.js +12 -0
- package/dist/cli/commands/workspace-init.js.map +1 -1
- package/dist/cli/commands/workspace-migrate.js +2 -13
- package/dist/cli/commands/workspace-migrate.js.map +1 -1
- package/dist/cli/commands/worktree.js +1 -0
- package/dist/cli/commands/worktree.js.map +1 -1
- package/dist/cli/help-groups.js +41 -0
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/main.js +41 -58
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output-mode.js +11 -2
- package/dist/cli/output-mode.js.map +1 -1
- package/dist/cli/parser.js +14 -5
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli/render.js +30 -1
- package/dist/cli/render.js.map +1 -1
- package/dist/cli/tui/components/git-flow-actions.js +65 -20
- package/dist/cli/tui/components/git-flow-actions.js.map +1 -1
- package/dist/cli/tui/tabs/project-tab.js +101 -12
- package/dist/cli/tui/tabs/project-tab.js.map +1 -1
- package/dist/domain/changelog-contract.js +172 -0
- package/dist/domain/changelog-contract.js.map +1 -0
- package/dist/domain/database-tools.js +1 -189
- package/dist/domain/database-tools.js.map +1 -1
- package/dist/domain/flow/answer.js +11 -0
- package/dist/domain/flow/answer.js.map +1 -1
- package/dist/domain/flow/authority.js +153 -14
- package/dist/domain/flow/authority.js.map +1 -1
- package/dist/domain/flow/execution-result.js +78 -7
- package/dist/domain/flow/execution-result.js.map +1 -1
- package/dist/domain/flow/journey-baseline.js +131 -0
- package/dist/domain/flow/journey-baseline.js.map +1 -0
- package/dist/domain/flow/route.js.map +1 -1
- package/dist/domain/flow/rules.js +5 -6
- package/dist/domain/flow/rules.js.map +1 -1
- package/dist/domain/flow/run-state.js +440 -89
- package/dist/domain/flow/run-state.js.map +1 -1
- package/dist/domain/harnesses.js +8 -1
- package/dist/domain/harnesses.js.map +1 -1
- package/dist/domain/host-memory/model.js +2 -0
- package/dist/domain/host-memory/model.js.map +1 -0
- package/dist/domain/host-memory/provenance.js +43 -0
- package/dist/domain/host-memory/provenance.js.map +1 -0
- package/dist/domain/host-memory/topic.js +26 -0
- package/dist/domain/host-memory/topic.js.map +1 -0
- package/dist/domain/lineage.js +11 -3
- package/dist/domain/lineage.js.map +1 -1
- package/dist/domain/proposal.js +7 -0
- package/dist/domain/proposal.js.map +1 -1
- package/dist/domain/session/custody.js.map +1 -1
- package/dist/domain/sql-lexer.js +240 -0
- package/dist/domain/sql-lexer.js.map +1 -0
- package/package.json +2 -2
- package/skills/w/SKILL.md +9 -9
- package/skills/w/commands/README.md +2 -1
- package/skills/w/commands/recall.md +39 -0
- package/skills/w/context/MANIFEST.json +4 -0
- package/skills/w/harness/HARNESS.md +12 -6
- package/skills/w/hooks/README.md +27 -16
- package/skills/w/loops/CHASSIS.md +16 -12
- package/skills/w/loops/CODE-POLICIES.md +11 -6
- package/skills/w/loops/plan-exec-loop/LOOP.md +9 -9
- package/skills/w/modules/COMPACTION.md +1 -1
- package/skills/w/roles/design/CONTRACT.md +10 -3
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aw flow annul` — reopen a mis-accredited batch and every later one.
|
|
3
|
+
*
|
|
4
|
+
* Kept apart from the engine's own service because it reads the plan document
|
|
5
|
+
* from the workspace root, which needs the environment the engine modules never
|
|
6
|
+
* read. What it shares with `restart` — the session guard and the re-adoption —
|
|
7
|
+
* it takes from `flow-service`.
|
|
8
|
+
*/
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { legacyRunNeedsAdoption, restartInvocation } from "../../domain/flow/run-state.js";
|
|
11
|
+
import { sealProposal } from "../../domain/proposal.js";
|
|
12
|
+
import { applyLocalProposal } from "../local-proposal.js";
|
|
13
|
+
import { resolveWorkspaceRoot } from "../paths-service.js";
|
|
14
|
+
import { preparePlanExecAnnulment } from "../plan-exec-batch-service.js";
|
|
15
|
+
import { semanticDigest } from "../semantic-operation/protocol.js";
|
|
16
|
+
import { reseat, writableSession, } from "./flow-service.js";
|
|
17
|
+
import { locateRun, readRun } from "./run-state-service.js";
|
|
18
|
+
/**
|
|
19
|
+
* Preview an annulment, writing nothing.
|
|
20
|
+
*
|
|
21
|
+
* Read from the LIVE registry: its batches are where the phases and tasks each
|
|
22
|
+
* close credited are recorded, so the preview names exactly what those closes
|
|
23
|
+
* did — not what the plan happens to show now. A run the CLI cannot read has no
|
|
24
|
+
* batches to trust; its way out is `aw flow restart`, and its phases are fixed in
|
|
25
|
+
* the plan by hand.
|
|
26
|
+
*/
|
|
27
|
+
export async function prepareAnnulment(fs, paths, input) {
|
|
28
|
+
// Without binding the conversation: a preview writes nothing at all.
|
|
29
|
+
const target = await writableSession(fs, paths, input, "anular", false);
|
|
30
|
+
if (!target.ok)
|
|
31
|
+
return target.result;
|
|
32
|
+
const prepared = await annulmentOf(fs, paths, target.session.folder, input);
|
|
33
|
+
return prepared.ok ? { ok: true, preview: prepared.preview } : prepared;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Apply the annulment the approval names, or nothing.
|
|
37
|
+
*
|
|
38
|
+
* The preview is recomputed and must still carry the approved digest; the plan
|
|
39
|
+
* is rewritten through the workspace-lock publication with its current bytes as
|
|
40
|
+
* the compare-and-swap base; then the run leaves through the same re-adoption as
|
|
41
|
+
* `restart`, with the annulment in its trace. Git is never touched.
|
|
42
|
+
*/
|
|
43
|
+
export async function applyAnnulment(fs, paths, input) {
|
|
44
|
+
const target = await writableSession(fs, paths, input, "anular");
|
|
45
|
+
if (!target.ok)
|
|
46
|
+
return target.result;
|
|
47
|
+
const prepared = await annulmentOf(fs, paths, target.session.folder, input);
|
|
48
|
+
if (!prepared.ok)
|
|
49
|
+
return prepared;
|
|
50
|
+
const { preview, proposal, root } = prepared;
|
|
51
|
+
if (input.approval.trim() !== preview.digest) {
|
|
52
|
+
return annulRefusal("FLOW_ANNUL_APPROVAL_MISMATCH", "lo aprobado no es lo que se anularía: el plan o la corrida cambiaron desde la vista previa", `volvé a correr 'aw flow annul --session ${preview.session} --from ${input.from}', leé la vista previa vigente y aprobá ese digest`);
|
|
53
|
+
}
|
|
54
|
+
const applied = await applyLocalProposal(fs, paths, {
|
|
55
|
+
root,
|
|
56
|
+
proposal,
|
|
57
|
+
approval: { digest: proposal.digest, granted: ["mutate_overwrite"] },
|
|
58
|
+
selfAuthorized: [],
|
|
59
|
+
});
|
|
60
|
+
if (!applied.ok)
|
|
61
|
+
return { ok: false, failure: applied.failure };
|
|
62
|
+
const ids = preview.batches.map((batch) => batch.id);
|
|
63
|
+
// Past this point the plan is already reopened. If the re-adoption fails, the
|
|
64
|
+
// way out is the same two commands again: the rewrite is then a no-op and the
|
|
65
|
+
// run is re-adopted with the annulment in its trace.
|
|
66
|
+
return reseat(fs, paths, target.session, input, {
|
|
67
|
+
cause: async () => `FLOW_ANNULLED: se anularon ${ids.join(", ")}`,
|
|
68
|
+
events: () => [
|
|
69
|
+
{
|
|
70
|
+
kind: "annulled",
|
|
71
|
+
transition: ANNUL_OPERATION,
|
|
72
|
+
operation: ANNUL_OPERATION,
|
|
73
|
+
batches: ids,
|
|
74
|
+
phases: preview.phases,
|
|
75
|
+
tasks: preview.tasks,
|
|
76
|
+
digest: preview.digest,
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
const ANNUL_OPERATION = "flow.annul";
|
|
82
|
+
/** The preview and the sealed plan rewrite behind it, recomputed from live state. */
|
|
83
|
+
async function annulmentOf(fs, paths, session, input) {
|
|
84
|
+
const read = await readRun(fs, locateRun(paths, session));
|
|
85
|
+
if (!read.ok) {
|
|
86
|
+
return annulRefusal(read.failure.code, read.failure.message, read.failure.action);
|
|
87
|
+
}
|
|
88
|
+
const state = read.state;
|
|
89
|
+
if (legacyRunNeedsAdoption(state)) {
|
|
90
|
+
return annulRefusal("FLOW_ANNUL_NO_BATCHES", `la corrida v${state.version} de '${session}' no registra lotes que se puedan anular`, `anular sólo actúa sobre los lotes del registro vivo: sacá la corrida con '${restartInvocation(session)}' y corregí las fases del plan a mano`);
|
|
91
|
+
}
|
|
92
|
+
const closed = (state.batches ?? []).filter((batch) => batch.published_plan_digest !== undefined);
|
|
93
|
+
if (state.scope === null || closed.length === 0) {
|
|
94
|
+
return annulRefusal("FLOW_ANNUL_NO_BATCHES", `la corrida de '${session}' todavía no cerró ningún lote de un plan`, state.flow === "plan-exec"
|
|
95
|
+
? "no hay nada que anular: seguí la corrida con 'aw flow advance' y anulá después de cerrar el lote que haga falta"
|
|
96
|
+
: `'${state.flow}' no ejecuta lotes de un plan: anular es sólo para corridas de plan-exec`);
|
|
97
|
+
}
|
|
98
|
+
const iteration = /^(?:batch-)?([1-9][0-9]*)$/i.exec(input.from.trim())?.[1];
|
|
99
|
+
const first = closed.find((batch) => String(batch.iteration) === iteration);
|
|
100
|
+
if (first === undefined) {
|
|
101
|
+
return annulRefusal("FLOW_ANNUL_BATCH_UNKNOWN", `'${input.from}' no es un lote cerrado de esta corrida`, `elegí uno de: ${closed.map((batch) => batch.id).join(", ") || "(ninguno cerrado todavía)"}`);
|
|
102
|
+
}
|
|
103
|
+
const annulled = closed.filter((batch) => batch.iteration >= first.iteration);
|
|
104
|
+
const phases = [...new Set(annulled.flatMap((batch) => batch.phases))].sort((a, b) => a - b);
|
|
105
|
+
const tasks = [...new Set(annulled.flatMap((batch) => batch.tasks))];
|
|
106
|
+
const root = await resolveWorkspaceRoot(fs, input.env, paths);
|
|
107
|
+
const plan = state.scope.plan;
|
|
108
|
+
let text;
|
|
109
|
+
try {
|
|
110
|
+
text = await fs.readText(join(root, plan));
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return annulRefusal("FLOW_ANNUL_PLAN_UNREADABLE", `no se puede leer '${plan}'`, `restaurá '${plan}' antes de anular`);
|
|
114
|
+
}
|
|
115
|
+
const rewrite = preparePlanExecAnnulment(text, { plan, tasks, phases });
|
|
116
|
+
if (!rewrite.ok)
|
|
117
|
+
return { ok: false, failure: rewrite.failure };
|
|
118
|
+
const proposal = sealProposal({
|
|
119
|
+
operation: ANNUL_OPERATION,
|
|
120
|
+
artifacts: [{ path: plan, content: rewrite.prepared.content, overwrite: true }],
|
|
121
|
+
bases: [{ path: plan, digest: rewrite.prepared.before_digest }],
|
|
122
|
+
effects: ["mutate_overwrite"],
|
|
123
|
+
requiresApproval: ["mutate_overwrite"],
|
|
124
|
+
});
|
|
125
|
+
const digest = annulDigest(session, annulled.map((batch) => batch.id), proposal.digest);
|
|
126
|
+
return {
|
|
127
|
+
ok: true,
|
|
128
|
+
root,
|
|
129
|
+
proposal,
|
|
130
|
+
preview: {
|
|
131
|
+
session,
|
|
132
|
+
plan,
|
|
133
|
+
batches: annulled.map((batch) => ({
|
|
134
|
+
id: batch.id,
|
|
135
|
+
phases: batch.phases,
|
|
136
|
+
tasks: batch.tasks,
|
|
137
|
+
})),
|
|
138
|
+
phases,
|
|
139
|
+
tasks,
|
|
140
|
+
unseals_done: rewrite.prepared.unsealed,
|
|
141
|
+
digest,
|
|
142
|
+
next: `aw flow annul --session ${session} --from ${input.from} --approval ${digest}`,
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* What the person approves: this session, these batches, these plan bytes.
|
|
148
|
+
*
|
|
149
|
+
* The bytes alone would not do — two ranges can produce the same rewrite (every
|
|
150
|
+
* one is a no-op once the plan is already reopened), and a digest shown for
|
|
151
|
+
* `--from 4` must not apply `--from 3` and record batches nobody approved.
|
|
152
|
+
*/
|
|
153
|
+
function annulDigest(session, batches, proposal) {
|
|
154
|
+
return semanticDigest({ operation: ANNUL_OPERATION, session, batches, proposal });
|
|
155
|
+
}
|
|
156
|
+
function annulRefusal(code, message, action) {
|
|
157
|
+
return { ok: false, failure: { code, message, action } };
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=annul-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annul-service.js","sourceRoot":"","sources":["../../../src/application/flow/annul-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* publish the root where no git port is available; the expensive half lives in
|
|
11
11
|
* {@link observeCheckout}.
|
|
12
12
|
*/
|
|
13
|
+
import { isAbsolute, relative } from "node:path";
|
|
13
14
|
import { unitPath, workspaceKey } from "../../domain/isolation-unit.js";
|
|
14
15
|
import { SOURCE_BOUNDED_EVIDENCE } from "../../domain/source-boundary.js";
|
|
15
16
|
import { readWorkspaceBlock } from "../parsers/project-block.js";
|
|
@@ -102,6 +103,54 @@ export async function observeCheckout(fs, git, identity) {
|
|
|
102
103
|
return null;
|
|
103
104
|
}
|
|
104
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* The scoped fingerprint of every source a run declared, by alias — what a batch
|
|
108
|
+
* is compared against to know whether it changed anything of its own.
|
|
109
|
+
*
|
|
110
|
+
* Measured over the same roots the proofs are: the documentary root for
|
|
111
|
+
* `workspace`, this session's unit for every other alias. The CLI's own runtime
|
|
112
|
+
* folder is left out whether or not `.gitignore` covers it, so writing a
|
|
113
|
+
* CHECKPOINT, a lock or the run's state never counts as work. `null` is a source
|
|
114
|
+
* that is not an observable repository at all; a repository git fails to measure
|
|
115
|
+
* is a refusal instead, because sealing it as unobservable would keep that
|
|
116
|
+
* source from ever showing a change.
|
|
117
|
+
*/
|
|
118
|
+
export async function observeScopedFingerprints(fs, git, paths, session, sources) {
|
|
119
|
+
const candidates = await resolveCheckoutCandidates(fs, paths, session);
|
|
120
|
+
const runtime = paths.cwdRoot();
|
|
121
|
+
const base = {};
|
|
122
|
+
for (const source of sources) {
|
|
123
|
+
const root = candidates.find((candidate) => candidate.source === source)?.root;
|
|
124
|
+
if (root === undefined || !(await isObservableRepo(fs, git, root))) {
|
|
125
|
+
base[source] = null;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
const inside = relative(root, runtime);
|
|
129
|
+
const excluded = inside.length > 0 && !inside.startsWith("..") && !isAbsolute(inside) ? [inside] : [];
|
|
130
|
+
try {
|
|
131
|
+
base[source] = await git.scopedFingerprint(root, excluded);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
return {
|
|
135
|
+
ok: false,
|
|
136
|
+
failure: {
|
|
137
|
+
code: "WORKLINE_CHECKOUT_UNOBSERVABLE",
|
|
138
|
+
message: `no se pudo medir '${source}' en ${root}: ${error instanceof Error ? error.message : String(error)}`,
|
|
139
|
+
action: "resolvé lo que git reporta en ese checkout y volvé a correr 'aw flow advance'",
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return { ok: true, base };
|
|
145
|
+
}
|
|
146
|
+
async function isObservableRepo(fs, git, root) {
|
|
147
|
+
try {
|
|
148
|
+
return (await fs.exists(root)) && (await git.isGitRepo(root));
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
105
154
|
/**
|
|
106
155
|
* Publish the observed roots on a directive whose evidence demands a proof.
|
|
107
156
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout-observation.js","sourceRoot":"","sources":["../../../src/application/flow/checkout-observation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"checkout-observation.js","sourceRoot":"","sources":["../../../src/application/flow/checkout-observation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Closing a session whose run is still walking: the run ends in a `finalize`
|
|
3
|
+
* placed at the boundary it stood on (052 AC-13).
|
|
4
|
+
*
|
|
5
|
+
* Three steps, each its own call, because the driver never holds the run's lock
|
|
6
|
+
* across an operation: record the intention under the run lock, close the session
|
|
7
|
+
* without it, then settle the applied `finalize` under the lock again. A close
|
|
8
|
+
* that cannot happen takes the intention back, so a refusal leaves nothing half
|
|
9
|
+
* done.
|
|
10
|
+
*/
|
|
11
|
+
import { occurrenceAt } from "../../domain/flow/authority.js";
|
|
12
|
+
import { applyTransition, iterationOf, withBoundary, withEvent, withPendingAction, withReentry, withoutLastReentry, } from "../../domain/flow/run-state.js";
|
|
13
|
+
import { semanticDigest } from "../semantic-operation/protocol.js";
|
|
14
|
+
import { effectsOfTransition } from "./advance.js";
|
|
15
|
+
import { journeyForRun } from "./run-journey.js";
|
|
16
|
+
import { applyUnderLock, readRun } from "./run-state-service.js";
|
|
17
|
+
const FINALIZE = "chassis.finalize";
|
|
18
|
+
const EVIDENCE = "chassis.sesion-cerrada";
|
|
19
|
+
/** Unreachable while `allowAbsent` is off: the lock refuses a missing run first. */
|
|
20
|
+
const ABSENT = {
|
|
21
|
+
code: "FLOW_RUN_ABSENT",
|
|
22
|
+
message: "la sesión no tiene corrida",
|
|
23
|
+
action: "no hay corrida que cerrar en frontera",
|
|
24
|
+
};
|
|
25
|
+
/** Whether the run stands on a `finalize` — the one a close placed, or its own. */
|
|
26
|
+
function standingOnFinalize(state) {
|
|
27
|
+
return journeyForRun(state)[state.applied.length]?.id === FINALIZE;
|
|
28
|
+
}
|
|
29
|
+
/** Whether the run stands on the `finalize` a close intention placed. */
|
|
30
|
+
function standingOnClose(state) {
|
|
31
|
+
return state.reentries?.at(-1)?.kind === "close" && standingOnFinalize(state);
|
|
32
|
+
}
|
|
33
|
+
/** A finished journey or a live handoff: there is nothing left to close at. */
|
|
34
|
+
function finished(state) {
|
|
35
|
+
const handedOff = state.handoff !== null && state.handoff !== undefined;
|
|
36
|
+
return handedOff || journeyForRun(state)[state.applied.length] === undefined;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Step 1: record, under the run lock, the intention to close at the boundary in
|
|
40
|
+
* force. A run that is finished, handed off or absent is left alone — read first,
|
|
41
|
+
* without the lock, so a legacy registry that is already over closes as before.
|
|
42
|
+
* One standing on a `finalize` (its own, or a close's after a failed attempt)
|
|
43
|
+
* needs no intention: settling applies that very row, so re-running the close is
|
|
44
|
+
* the retry.
|
|
45
|
+
*/
|
|
46
|
+
export async function markCloseAtBoundary(fs, location) {
|
|
47
|
+
const read = await readRun(fs, location);
|
|
48
|
+
if (!read.ok) {
|
|
49
|
+
return read.failure.code === ABSENT.code
|
|
50
|
+
? { kind: "none" }
|
|
51
|
+
: { kind: "failed", failure: read.failure };
|
|
52
|
+
}
|
|
53
|
+
if (finished(read.state))
|
|
54
|
+
return { kind: "none" };
|
|
55
|
+
const marked = await applyUnderLock(fs, location, (state) => {
|
|
56
|
+
if (state === null)
|
|
57
|
+
return { ok: false, failure: ABSENT };
|
|
58
|
+
if (finished(state))
|
|
59
|
+
return { ok: true, state, value: { kind: "none" }, persist: false };
|
|
60
|
+
if (standingOnFinalize(state)) {
|
|
61
|
+
const boundary = standingOnClose(state) ? closedAt(state) : FINALIZE;
|
|
62
|
+
return { ok: true, state, value: { kind: "marked", boundary, wrote: false }, persist: false };
|
|
63
|
+
}
|
|
64
|
+
const journey = journeyForRun(state);
|
|
65
|
+
const position = state.applied.length;
|
|
66
|
+
const boundary = journey[position]?.id ?? FINALIZE;
|
|
67
|
+
const closing = withBoundary(withReentry(state, {
|
|
68
|
+
kind: "close",
|
|
69
|
+
transition: boundary,
|
|
70
|
+
occurrence: occurrenceAt(journey, position),
|
|
71
|
+
from: null,
|
|
72
|
+
}), FINALIZE);
|
|
73
|
+
// A close this journey cannot place would report a finalize nobody applied.
|
|
74
|
+
if (!standingOnClose(closing)) {
|
|
75
|
+
return { ok: false, failure: unplaceable(boundary, location.session) };
|
|
76
|
+
}
|
|
77
|
+
return { ok: true, state: closing, value: { kind: "marked", boundary, wrote: true } };
|
|
78
|
+
});
|
|
79
|
+
if (marked.ok)
|
|
80
|
+
return marked.value;
|
|
81
|
+
// The run vanished between the read and the lock: there is nothing to close.
|
|
82
|
+
if (marked.failure.code === ABSENT.code)
|
|
83
|
+
return { kind: "none" };
|
|
84
|
+
return { kind: "failed", failure: marked.failure };
|
|
85
|
+
}
|
|
86
|
+
function closedAt(state) {
|
|
87
|
+
return state.reentries?.at(-1)?.transition ?? FINALIZE;
|
|
88
|
+
}
|
|
89
|
+
function unplaceable(boundary, session) {
|
|
90
|
+
return {
|
|
91
|
+
code: "FLOW_CLOSE_UNPLACEABLE",
|
|
92
|
+
message: `el recorrido de la corrida no puede terminar en '${boundary}'`,
|
|
93
|
+
action: `avanzá la corrida con 'aw flow advance --session ${session}' y volvé a cerrar`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** Undo step 1 when the close itself did not happen; a no-op once anything moved. */
|
|
97
|
+
export async function withdrawCloseAtBoundary(fs, location) {
|
|
98
|
+
const withdrawn = await applyUnderLock(fs, location, (state) => {
|
|
99
|
+
if (state === null)
|
|
100
|
+
return { ok: false, failure: ABSENT };
|
|
101
|
+
if (!standingOnClose(state))
|
|
102
|
+
return { ok: true, state, value: null, persist: false };
|
|
103
|
+
const restored = withoutLastReentry(state);
|
|
104
|
+
const boundary = journeyForRun(restored)[restored.applied.length]?.id ?? null;
|
|
105
|
+
return { ok: true, state: withBoundary(restored, boundary), value: null };
|
|
106
|
+
});
|
|
107
|
+
return withdrawn.ok ? null : withdrawn.failure;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Step 3: settle the `finalize` the close just performed, under the run lock.
|
|
111
|
+
* It records what the close really did — the same material trace an internal
|
|
112
|
+
* `session.close` leaves — and ends the run's journey there. Already settled (a
|
|
113
|
+
* concurrent advance applied it) is fine; not standing on a finalize is not.
|
|
114
|
+
*/
|
|
115
|
+
export async function settleCloseAtBoundary(fs, location, closed) {
|
|
116
|
+
const settled = await applyUnderLock(fs, location, (state) => {
|
|
117
|
+
if (state === null)
|
|
118
|
+
return { ok: false, failure: ABSENT };
|
|
119
|
+
const row = journeyForRun(state)[state.applied.length];
|
|
120
|
+
if (row?.id !== FINALIZE) {
|
|
121
|
+
if (state.applied.at(-1) === FINALIZE) {
|
|
122
|
+
return { ok: true, state, value: null, persist: false };
|
|
123
|
+
}
|
|
124
|
+
return { ok: false, failure: unplaceable(closedAt(state), location.session) };
|
|
125
|
+
}
|
|
126
|
+
const traced = withEvent(withPendingAction(state, null), {
|
|
127
|
+
kind: "executed",
|
|
128
|
+
transition: FINALIZE,
|
|
129
|
+
...iterationOf(state, FINALIZE),
|
|
130
|
+
operation: "session.close",
|
|
131
|
+
summary: `sesión ${closed.folder} cerrada en la frontera '${closedAt(state)}'`,
|
|
132
|
+
output_digest: semanticDigest({ output: closed }),
|
|
133
|
+
// What the close really did; the transition applies the row's own effects,
|
|
134
|
+
// the same ones whichever path closes it.
|
|
135
|
+
effects: ["local_additive", "mutate_overwrite"],
|
|
136
|
+
evidence: [EVIDENCE],
|
|
137
|
+
});
|
|
138
|
+
const applied = applyTransition(traced, FINALIZE, effectsOfTransition(state, row));
|
|
139
|
+
const next = journeyForRun(applied)[applied.applied.length]?.id ?? null;
|
|
140
|
+
return { ok: true, state: withBoundary(applied, next), value: null };
|
|
141
|
+
});
|
|
142
|
+
return settled.ok ? null : settled.failure;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=close-at-boundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-at-boundary.js","sourceRoot":"","sources":["../../../src/application/flow/close-at-boundary.ts"],"names":[],"mappings":"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"}
|