@tacuchi/agent-workflow-cli 21.4.0 → 21.5.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/dist/adapters/git-cli.js +64 -0
- package/dist/adapters/git-cli.js.map +1 -1
- package/dist/adapters/node-file-system.js +14 -1
- package/dist/adapters/node-file-system.js.map +1 -1
- package/dist/application/branch-resolver.js +18 -3
- package/dist/application/branch-resolver.js.map +1 -1
- package/dist/application/check-branch-service.js +137 -19
- package/dist/application/check-branch-service.js.map +1 -1
- package/dist/application/dev-only-services.js +50 -3
- package/dist/application/dev-only-services.js.map +1 -1
- package/dist/application/export-service.js +2 -2
- package/dist/application/export-service.js.map +1 -1
- package/dist/application/hook-branch-check.js +71 -58
- package/dist/application/hook-branch-check.js.map +1 -1
- package/dist/application/lock-service.js +54 -15
- package/dist/application/lock-service.js.map +1 -1
- package/dist/application/paths-service.js +10 -0
- package/dist/application/paths-service.js.map +1 -1
- package/dist/application/persist-service.js +2 -2
- package/dist/application/persist-service.js.map +1 -1
- package/dist/application/process-registry-service.js +94 -25
- package/dist/application/process-registry-service.js.map +1 -1
- package/dist/application/project-tab-data.js +1 -1
- package/dist/application/project-tab-data.js.map +1 -1
- package/dist/application/resume-service.js +2 -0
- package/dist/application/resume-service.js.map +1 -1
- package/dist/application/session-close-service.js +23 -1
- package/dist/application/session-close-service.js.map +1 -1
- package/dist/application/source-launch-service.js +39 -4
- package/dist/application/source-launch-service.js.map +1 -1
- package/dist/application/source-remove-service.js +1 -1
- package/dist/application/source-remove-service.js.map +1 -1
- package/dist/application/status-service.js +2 -0
- package/dist/application/status-service.js.map +1 -1
- package/dist/application/workline-index-service.js +35 -0
- package/dist/application/workline-index-service.js.map +1 -1
- package/dist/application/worktree-service.js +357 -0
- package/dist/application/worktree-service.js.map +1 -0
- package/dist/cli/commands/check-branch.js +4 -0
- package/dist/cli/commands/check-branch.js.map +1 -1
- package/dist/cli/commands/dev-only.js +9 -3
- package/dist/cli/commands/dev-only.js.map +1 -1
- package/dist/cli/commands/index.js +2 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/resume.js +1 -1
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/session-close.js +7 -1
- package/dist/cli/commands/session-close.js.map +1 -1
- package/dist/cli/commands/status.js +1 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/worktree.js +39 -0
- package/dist/cli/commands/worktree.js.map +1 -0
- package/dist/cli/help-groups.js +3 -0
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/tui/tabs/project-tab.js +23 -6
- package/dist/cli/tui/tabs/project-tab.js.map +1 -1
- package/dist/domain/flow/authority.js +15 -1
- package/dist/domain/flow/authority.js.map +1 -1
- package/dist/domain/isolation-unit.js +85 -0
- package/dist/domain/isolation-unit.js.map +1 -0
- package/package.json +1 -1
- package/skills/w/commands/spec-new.md +1 -1
- package/skills/w/hooks/README.md +1 -1
- package/skills/w/loops/CODE-POLICIES.md +6 -4
- package/skills/w/loops/plan-new-loop/LOOP.md +1 -1
- package/skills/w/loops/quick-loop/LOOP.md +1 -1
- package/skills/w/modules/PLAN-INPUT.md +1 -1
- package/skills/w/roles/git/ROLE.md +1 -1
|
@@ -1,68 +1,45 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { runCheckBranch } from "./check-branch-service.js";
|
|
2
2
|
import { parseHookPayload } from "./hook-common.js";
|
|
3
|
-
import { readWorkspaceBlock } from "./parsers/project-block.js";
|
|
4
3
|
const TOOLS_OF_INTEREST = new Set(["Edit", "Write", "MultiEdit", "NotebookEdit"]);
|
|
5
4
|
const REFERENCE_DOC = "skills/session/references/branch-verification.md";
|
|
5
|
+
/**
|
|
6
|
+
* The git-safe invariant at the moment of the edit.
|
|
7
|
+
*
|
|
8
|
+
* The verdict is NOT computed here: it is `aw check-branch`'s, so the hook and
|
|
9
|
+
* the command can never drift into two different answers about the same file.
|
|
10
|
+
* What lives here is the hook's own half — which tools to watch, how to read the
|
|
11
|
+
* payload, and how to say "no" in a way whoever is blocked can act on.
|
|
12
|
+
*/
|
|
6
13
|
export async function runBranchCheckHook(input) {
|
|
7
|
-
const target = await resolveBranchCheckTarget(input);
|
|
8
|
-
if (!target)
|
|
9
|
-
return { exitCode: 0 };
|
|
10
|
-
return verifyBranch(input, target);
|
|
11
|
-
}
|
|
12
|
-
async function resolveBranchCheckTarget(input) {
|
|
13
14
|
const payload = parseHookPayload(input.stdin);
|
|
14
15
|
if (!payload)
|
|
15
|
-
return
|
|
16
|
+
return { exitCode: 0 };
|
|
16
17
|
const toolName = typeof payload.tool_name === "string" ? payload.tool_name : "";
|
|
17
18
|
if (!TOOLS_OF_INTEREST.has(toolName))
|
|
18
|
-
return
|
|
19
|
+
return { exitCode: 0 };
|
|
19
20
|
const filePath = extractFilePath(payload.tool_input);
|
|
20
21
|
if (!filePath)
|
|
21
|
-
return null;
|
|
22
|
-
const block = await readWorkspaceBlock(input.fs, input.env.cwd(), input.paths.blockMarkers());
|
|
23
|
-
if (!block)
|
|
24
|
-
return null;
|
|
25
|
-
const source = findOwningSource(block.fuentes, filePath);
|
|
26
|
-
if (!source)
|
|
27
|
-
return null;
|
|
28
|
-
// Expected = the source's declared WORKING branch (from the WORKSPACE block).
|
|
29
|
-
// No declared working branch → no expectation → no-op (allow).
|
|
30
|
-
const expected = expectedWorkBranch(source, block.working_branches);
|
|
31
|
-
if (expected === null)
|
|
32
|
-
return null;
|
|
33
|
-
return { source, expected };
|
|
34
|
-
}
|
|
35
|
-
async function verifyBranch(input, target) {
|
|
36
|
-
const { source, expected } = target;
|
|
37
|
-
if (!(await input.fs.exists(source.path)))
|
|
38
22
|
return { exitCode: 0 };
|
|
39
|
-
|
|
23
|
+
// The conversation's own identity travels in the SAME payload the tool call
|
|
24
|
+
// arrives in, so reading it costs nothing extra — and it is what tells one
|
|
25
|
+
// concurrent flow's unit from another's.
|
|
26
|
+
const contextId = typeof payload.session_id === "string" ? payload.session_id : undefined;
|
|
27
|
+
const verdict = await runCheckBranch(input.fs, input.env, input.git, input.paths, {
|
|
28
|
+
fileArg: filePath,
|
|
29
|
+
...(contextId !== undefined && contextId.length > 0 ? { contextId } : {}),
|
|
30
|
+
});
|
|
31
|
+
if (verdict.match)
|
|
40
32
|
return { exitCode: 0 };
|
|
41
|
-
|
|
42
|
-
|
|
33
|
+
// A source that is missing or is not a repo is not something an edit can fix,
|
|
34
|
+
// and blocking on it would make an unrelated misconfiguration look like a
|
|
35
|
+
// branch violation. That case stayed permissive before this feature; it stays.
|
|
36
|
+
if (verdict.is_repo === false)
|
|
43
37
|
return { exitCode: 0 };
|
|
44
|
-
const changedFiles = await safeChangedFiles(input.git, source.path);
|
|
45
38
|
return {
|
|
46
39
|
exitCode: 2,
|
|
47
|
-
stderr: formatBlockMessage(
|
|
48
|
-
alias: source.alias,
|
|
49
|
-
path: source.path,
|
|
50
|
-
current,
|
|
51
|
-
expected,
|
|
52
|
-
dirty: changedFiles.length > 0,
|
|
53
|
-
changedFiles,
|
|
54
|
-
displayName: input.displayName ?? "agent-workflow",
|
|
55
|
-
}),
|
|
40
|
+
stderr: formatBlockMessage(verdict, input.displayName ?? "agent-workflow"),
|
|
56
41
|
};
|
|
57
42
|
}
|
|
58
|
-
async function safeChangedFiles(git, repoPath) {
|
|
59
|
-
try {
|
|
60
|
-
return await git.changedFiles(repoPath);
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
return [];
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
43
|
function extractFilePath(toolInput) {
|
|
67
44
|
if (typeof toolInput !== "object" || toolInput === null)
|
|
68
45
|
return null;
|
|
@@ -74,18 +51,54 @@ function extractFilePath(toolInput) {
|
|
|
74
51
|
}
|
|
75
52
|
return null;
|
|
76
53
|
}
|
|
77
|
-
|
|
54
|
+
/**
|
|
55
|
+
* Why the edit is refused and what unblocks it.
|
|
56
|
+
*
|
|
57
|
+
* Every branch here ends in an action, because a hook that only says "no" makes
|
|
58
|
+
* the invariant hostile: the agent that is blocked has to be handed the exact
|
|
59
|
+
* command, not a rule to go and look up.
|
|
60
|
+
*/
|
|
61
|
+
function formatBlockMessage(verdict, displayName) {
|
|
62
|
+
const head = `[${displayName}]`;
|
|
63
|
+
const source = ` Fuente: ${verdict.alias} (${verdict.path})`;
|
|
64
|
+
if (verdict.reason === "outside_unit") {
|
|
65
|
+
return [
|
|
66
|
+
`${head} Esta fuente se está editando por unidad de aislamiento, y este archivo queda fuera.`,
|
|
67
|
+
source,
|
|
68
|
+
` Unidad esperada: ${verdict.expected_unit?.path ?? "(la de tu sesión)"}`,
|
|
69
|
+
` Rama: ${verdict.expected_unit?.branch ?? "aw/<sesión>"}`,
|
|
70
|
+
"",
|
|
71
|
+
`Obtené tu unidad y volvé a editar dentro de ella:\n ${verdict.remedy}`,
|
|
72
|
+
"",
|
|
73
|
+
`Referencia: ${REFERENCE_DOC}`,
|
|
74
|
+
"",
|
|
75
|
+
].join("\n");
|
|
76
|
+
}
|
|
77
|
+
if (verdict.reason === "other_session_unit") {
|
|
78
|
+
return [
|
|
79
|
+
`${head} Ese árbol es la unidad de aislamiento de OTRA sesión.`,
|
|
80
|
+
source,
|
|
81
|
+
` Unidad ajena: ${verdict.actual_unit?.path} (sesión ${verdict.actual_unit?.session})`,
|
|
82
|
+
` Tu unidad: ${verdict.expected_unit?.path ?? "(todavía no existe)"}`,
|
|
83
|
+
"",
|
|
84
|
+
`Editá en la tuya:\n ${verdict.remedy}`,
|
|
85
|
+
"",
|
|
86
|
+
`Referencia: ${REFERENCE_DOC}`,
|
|
87
|
+
"",
|
|
88
|
+
].join("\n");
|
|
89
|
+
}
|
|
78
90
|
const lines = [
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
` Rama actual: ${
|
|
82
|
-
` Rama esperada: ${
|
|
91
|
+
`${head} Rama de trabajo incorrecta para esta fuente.`,
|
|
92
|
+
source,
|
|
93
|
+
` Rama actual: ${verdict.current_branch}`,
|
|
94
|
+
` Rama esperada: ${verdict.expected_work_branch}`,
|
|
83
95
|
];
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
96
|
+
const changed = verdict.changed_files ?? [];
|
|
97
|
+
if (changed.length > 0) {
|
|
98
|
+
let preview = changed.slice(0, 5).join(", ");
|
|
99
|
+
if (changed.length > 5)
|
|
87
100
|
preview += ", ...";
|
|
88
|
-
lines.push(` Cambios sin commit (${
|
|
101
|
+
lines.push(` Cambios sin commit (${changed.length} archivo(s)): ${preview}`);
|
|
89
102
|
lines.push("");
|
|
90
103
|
lines.push("Pausar y avisar al usuario. NO ejecutar git stash/reset/clean/checkout. " +
|
|
91
104
|
"Esperar a que el usuario resuelva manualmente (commit / stash / discard) " +
|
|
@@ -93,7 +106,7 @@ function formatBlockMessage(info) {
|
|
|
93
106
|
}
|
|
94
107
|
else {
|
|
95
108
|
lines.push("");
|
|
96
|
-
lines.push(`Pedir confirmacion al usuario para ejecutar \`git checkout ${
|
|
109
|
+
lines.push(`Pedir confirmacion al usuario para ejecutar \`git checkout ${verdict.expected_work_branch}\` en esta fuente y luego reintentar la edicion.`);
|
|
97
110
|
}
|
|
98
111
|
lines.push("");
|
|
99
112
|
lines.push(`Referencia: ${REFERENCE_DOC}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-branch-check.js","sourceRoot":"","sources":["../../src/application/hook-branch-check.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"hook-branch-check.js","sourceRoot":"","sources":["../../src/application/hook-branch-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,40 +12,79 @@ export class LockBusyError extends Error {
|
|
|
12
12
|
export const DEFAULT_LOCK_TTL_MS = 5 * 60 * 1000;
|
|
13
13
|
const RELEASED_MARKER = "";
|
|
14
14
|
const MAX_CLAIM_RETRIES = 3;
|
|
15
|
+
const DEFAULT_WAIT_STEP_MS = 15;
|
|
15
16
|
export async function acquireLock(lockPath, fs, options = {}) {
|
|
16
17
|
const ttlMs = options.ttlMs ?? DEFAULT_LOCK_TTL_MS;
|
|
17
18
|
const pid = options.pid ?? process.pid;
|
|
18
19
|
const now = options.now ?? Date.now;
|
|
19
20
|
const ts = now();
|
|
21
|
+
const waitMs = options.waitMs ?? 0;
|
|
22
|
+
const waitStepMs = options.waitStepMs ?? DEFAULT_WAIT_STEP_MS;
|
|
23
|
+
const deadline = ts + waitMs;
|
|
20
24
|
await fs.mkdirp(dirname(lockPath));
|
|
21
25
|
const content = { pid, ts: new Date(ts).toISOString() };
|
|
22
26
|
const serialized = JSON.stringify(content);
|
|
23
27
|
let lastSeen = null;
|
|
24
|
-
|
|
28
|
+
// Two budgets, and conflating them breaks either one. `steals` bounds how often
|
|
29
|
+
// a competing claimer may take the slot we just cleared — the fail-fast caller's
|
|
30
|
+
// only bound. `deadline` bounds how long a WAITING caller sits on a holder that
|
|
31
|
+
// is alive and working, and while there is clock left, contention is not a steal:
|
|
32
|
+
// N claimers queueing on one released marker would otherwise burn three attempts
|
|
33
|
+
// each and all report "busy" over a lock nobody holds.
|
|
34
|
+
let steals = 0;
|
|
35
|
+
while (steals < MAX_CLAIM_RETRIES) {
|
|
25
36
|
const result = await fs.writeTextExclusive(lockPath, serialized);
|
|
26
37
|
if (result.created) {
|
|
27
38
|
return makeHandle(fs, lockPath, pid, ts);
|
|
28
39
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
40
|
+
const slot = await readSlot(fs, lockPath, now(), ttlMs);
|
|
41
|
+
if (slot.holder !== null)
|
|
42
|
+
lastSeen = slot.holder;
|
|
43
|
+
if (slot.held) {
|
|
44
|
+
if (await keepWaiting(now, deadline, waitStepMs))
|
|
45
|
+
continue;
|
|
46
|
+
throw new LockBusyError(lockPath, slot.holder);
|
|
33
47
|
}
|
|
34
|
-
|
|
35
|
-
// Race: file removed between EEXIST and read. Loop will retry.
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
const existing = parseLock(raw);
|
|
39
|
-
lastSeen = existing;
|
|
40
|
-
if (existing && !isExpired(existing, ts, ttlMs)) {
|
|
41
|
-
throw new LockBusyError(lockPath, existing);
|
|
42
|
-
}
|
|
43
|
-
// Stale, release marker, or corrupted — try to remove and retry.
|
|
48
|
+
// Stale, release marker, corrupted or already gone: clear it and race again.
|
|
44
49
|
await fs.remove(lockPath);
|
|
50
|
+
if (await keepWaiting(now, deadline, 0))
|
|
51
|
+
continue;
|
|
52
|
+
steals++;
|
|
45
53
|
}
|
|
46
54
|
// Exceeded retries — another claimer kept stealing the slot. Surface as busy.
|
|
47
55
|
throw new LockBusyError(lockPath, lastSeen ?? { pid: 0, ts: new Date(ts).toISOString() });
|
|
48
56
|
}
|
|
57
|
+
async function readSlot(fs, lockPath, nowMs, ttlMs) {
|
|
58
|
+
let raw;
|
|
59
|
+
try {
|
|
60
|
+
raw = await fs.readText(lockPath);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Removed between the EEXIST and this read: the slot is free again.
|
|
64
|
+
return { held: false, holder: null };
|
|
65
|
+
}
|
|
66
|
+
const existing = parseLock(raw);
|
|
67
|
+
if (existing !== null && !isExpired(existing, nowMs, ttlMs)) {
|
|
68
|
+
return { held: true, holder: existing };
|
|
69
|
+
}
|
|
70
|
+
return { held: false, holder: existing };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Whether there is still wait budget, sleeping `stepMs` before the next attempt.
|
|
74
|
+
*
|
|
75
|
+
* `stepMs: 0` still yields to the event loop, which is what lets the in-process
|
|
76
|
+
* holder actually reach its `release()` instead of being starved by a tight
|
|
77
|
+
* retry loop in the same tick.
|
|
78
|
+
*/
|
|
79
|
+
async function keepWaiting(now, deadline, stepMs) {
|
|
80
|
+
if (now() >= deadline)
|
|
81
|
+
return false;
|
|
82
|
+
await sleep(stepMs);
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
function sleep(ms) {
|
|
86
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
87
|
+
}
|
|
49
88
|
function makeHandle(fs, lockPath, pid, ts) {
|
|
50
89
|
let released = false;
|
|
51
90
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock-service.js","sourceRoot":"","sources":["../../src/application/lock-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"lock-service.js","sourceRoot":"","sources":["../../src/application/lock-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { dirname, join } from "node:path";
|
|
2
|
+
import { unitsRoot } from "../domain/isolation-unit.js";
|
|
2
3
|
import { localDateIso } from "./dates.js";
|
|
3
4
|
export class PathsService {
|
|
4
5
|
ns;
|
|
@@ -56,6 +57,15 @@ export class PathsService {
|
|
|
56
57
|
userCoreLibMarker() {
|
|
57
58
|
return join(this.userRoot(), "lib", `.${this.ns}-core-version`);
|
|
58
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Root of every flow's isolation units, across every workspace.
|
|
62
|
+
*
|
|
63
|
+
* Deliberately OUTSIDE any repository: a worktree nested inside its own source
|
|
64
|
+
* would show up in that source's status, its ignores and its own scans.
|
|
65
|
+
*/
|
|
66
|
+
userUnitsDir() {
|
|
67
|
+
return unitsRoot(this.userRoot());
|
|
68
|
+
}
|
|
59
69
|
// cwd-level (.${ns}/... in current workspace)
|
|
60
70
|
cwdRoot() {
|
|
61
71
|
return join(this.cwd, `.${this.ns}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths-service.js","sourceRoot":"","sources":["../../src/application/paths-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"paths-service.js","sourceRoot":"","sources":["../../src/application/paths-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,7 +38,7 @@ export async function preparePersist(fs, env, paths) {
|
|
|
38
38
|
const readSet = [];
|
|
39
39
|
let readSetBytes = 0;
|
|
40
40
|
for (const [name, category] of Object.entries(CATEGORIES)) {
|
|
41
|
-
const next = await runNextNumber(fs, env, { directory: category.dir, dryRun: true });
|
|
41
|
+
const next = await runNextNumber(fs, env, paths, { directory: category.dir, dryRun: true });
|
|
42
42
|
const docs = await readCategory(fs, join(cwd, category.dir), category.dir, category.infix);
|
|
43
43
|
for (const doc of docs) {
|
|
44
44
|
readSet.push(doc.file);
|
|
@@ -234,7 +234,7 @@ export async function applyPersist(fs, env, paths, input) {
|
|
|
234
234
|
}
|
|
235
235
|
const path = preview.mode === "update" && preview.target !== null
|
|
236
236
|
? preview.target
|
|
237
|
-
: `${category.dir}/${(await runNextNumber(fs, env, { directory: category.dir })).next}-${category.infix}-${slugOf(artifact.path, category.infix)}.md`;
|
|
237
|
+
: `${category.dir}/${(await runNextNumber(fs, env, paths, { directory: category.dir })).next}-${category.infix}-${slugOf(artifact.path, category.infix)}.md`;
|
|
238
238
|
return await publishArtifacts(fs, paths.workspaceDir(), [{ path, content: artifact.content }], {
|
|
239
239
|
overwrite: preview.mode === "update",
|
|
240
240
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persist-service.js","sourceRoot":"","sources":["../../src/application/persist-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"persist-service.js","sourceRoot":"","sources":["../../src/application/persist-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import { dirname } from "node:path";
|
|
2
|
+
import { LockBusyError, acquireLock } from "./lock-service.js";
|
|
2
3
|
function recordId(alias, profile, pid) {
|
|
3
4
|
return `${alias}__${profile ?? "default"}__${pid}`;
|
|
4
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* How long a registry mutation waits for the workspace lock.
|
|
8
|
+
*
|
|
9
|
+
* `register` runs AFTER the process is already spawned, so failing fast would
|
|
10
|
+
* leave a live process nobody tracks. The critical section is a small JSON
|
|
11
|
+
* rewrite, so waiting absorbs the concurrency of two flows launching at once.
|
|
12
|
+
*/
|
|
13
|
+
const REGISTRY_LOCK_WAIT_MS = 5_000;
|
|
5
14
|
/**
|
|
6
15
|
* Persistent registry of detached source processes, backed by a JSON array on
|
|
7
16
|
* disk (`.workflow/processes.json`). `list()` reconciles each record against
|
|
@@ -15,10 +24,18 @@ export class ProcessRegistryService {
|
|
|
15
24
|
fs;
|
|
16
25
|
proc;
|
|
17
26
|
filePath;
|
|
18
|
-
|
|
27
|
+
lockPath;
|
|
28
|
+
constructor(fs, proc, filePath,
|
|
29
|
+
/**
|
|
30
|
+
* Workspace lock that serializes the read-modify-write. `null` leaves the
|
|
31
|
+
* registry unserialized — only for callers that own no workspace (tests over
|
|
32
|
+
* a bare temp dir).
|
|
33
|
+
*/
|
|
34
|
+
lockPath = null) {
|
|
19
35
|
this.fs = fs;
|
|
20
36
|
this.proc = proc;
|
|
21
37
|
this.filePath = filePath;
|
|
38
|
+
this.lockPath = lockPath;
|
|
22
39
|
}
|
|
23
40
|
async read() {
|
|
24
41
|
if (!(await this.fs.exists(this.filePath)))
|
|
@@ -37,59 +54,111 @@ export class ProcessRegistryService {
|
|
|
37
54
|
await this.fs.mkdirp(dirname(this.filePath));
|
|
38
55
|
await this.fs.writeText(this.filePath, `${JSON.stringify(records, null, 2)}\n`);
|
|
39
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Read-modify-write serialized by the workspace lock.
|
|
59
|
+
*
|
|
60
|
+
* The read has to happen INSIDE the lock, which is why `apply` receives the
|
|
61
|
+
* records instead of the caller reading them first: two flows launching at the
|
|
62
|
+
* same moment used to read the same array and write back their own copy of it,
|
|
63
|
+
* so whoever wrote second erased the other's process — the registry then showed
|
|
64
|
+
* one launch and the machine ran two.
|
|
65
|
+
*
|
|
66
|
+
* `apply` returning `null` means "nothing to write" and skips the write.
|
|
67
|
+
*/
|
|
68
|
+
async mutate(apply) {
|
|
69
|
+
const run = async () => {
|
|
70
|
+
const records = await this.read();
|
|
71
|
+
const next = await apply(records);
|
|
72
|
+
if (next === null)
|
|
73
|
+
return records;
|
|
74
|
+
await this.write(next);
|
|
75
|
+
return next;
|
|
76
|
+
};
|
|
77
|
+
if (this.lockPath === null)
|
|
78
|
+
return run();
|
|
79
|
+
let lock;
|
|
80
|
+
try {
|
|
81
|
+
lock = await acquireLock(this.lockPath, this.fs, { waitMs: REGISTRY_LOCK_WAIT_MS });
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
// ONLY a busy lock becomes this message. Catching everything here would
|
|
85
|
+
// report "another flow is holding it" for a broken filesystem or a bad
|
|
86
|
+
// path — a diagnosis nobody could act on, about a flow that never existed.
|
|
87
|
+
if (!(err instanceof LockBusyError))
|
|
88
|
+
throw err;
|
|
89
|
+
// The holder is alive and still working past the budget. Writing anyway is
|
|
90
|
+
// exactly the lost update the lock exists to prevent, so the caller hears
|
|
91
|
+
// about it instead of getting a registry that quietly dropped a process.
|
|
92
|
+
throw new Error(`el registro de procesos está bloqueado por otro flujo (${this.lockPath}); reintentá en unos segundos`);
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
return await run();
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
await lock.release();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
40
101
|
/** Register a freshly launched process as `running`. Returns the stored record. */
|
|
41
102
|
async register(reg) {
|
|
42
|
-
const records = await this.read();
|
|
43
103
|
const record = {
|
|
44
104
|
...reg,
|
|
45
105
|
id: recordId(reg.sourceAlias, reg.profile, reg.pid),
|
|
46
106
|
state: "running",
|
|
47
107
|
};
|
|
48
108
|
// A recycled pid could collide with a stale record id — replace it.
|
|
49
|
-
|
|
50
|
-
next.push(record);
|
|
51
|
-
await this.write(next);
|
|
109
|
+
await this.mutate(async (records) => [...records.filter((r) => r.id !== record.id), record]);
|
|
52
110
|
return record;
|
|
53
111
|
}
|
|
54
112
|
/**
|
|
55
113
|
* Return all records with their state reconciled against live OS state:
|
|
56
114
|
* `running` records whose pid is no longer alive become `exited`; `stopped`
|
|
57
115
|
* and `exited` records are sticky. Persists the reconciled snapshot.
|
|
116
|
+
*
|
|
117
|
+
* The lock is taken only when the reconciliation actually has something to
|
|
118
|
+
* write: `list()` is the TUI's refresh path and the steady state is a no-op.
|
|
58
119
|
*/
|
|
59
120
|
async list() {
|
|
60
121
|
const records = await this.read();
|
|
61
|
-
const reconciled = await
|
|
122
|
+
const reconciled = await this.reconcile(records);
|
|
123
|
+
if (!differs(records, reconciled))
|
|
124
|
+
return reconciled;
|
|
125
|
+
return this.mutate(async (fresh) => {
|
|
126
|
+
const next = await this.reconcile(fresh);
|
|
127
|
+
return differs(fresh, next) ? next : null;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
async reconcile(records) {
|
|
131
|
+
return Promise.all(records.map(async (r) => {
|
|
62
132
|
if (r.state !== "running")
|
|
63
133
|
return r;
|
|
64
134
|
const alive = await this.proc.isAlive(r.pid);
|
|
65
135
|
return alive ? r : { ...r, state: "exited" };
|
|
66
136
|
}));
|
|
67
|
-
// Only rewrite when the reconciliation actually changed something.
|
|
68
|
-
const changed = reconciled.some((r, i) => r.state !== records[i]?.state);
|
|
69
|
-
if (changed)
|
|
70
|
-
await this.write(reconciled);
|
|
71
|
-
return reconciled;
|
|
72
137
|
}
|
|
73
138
|
/** Mark a record as deliberately stopped (sticky; survives reconciliation). */
|
|
74
139
|
async markStopped(id) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
140
|
+
await this.mutate(async (records) => {
|
|
141
|
+
let touched = false;
|
|
142
|
+
const next = records.map((r) => {
|
|
143
|
+
if (r.id === id && r.state !== "stopped") {
|
|
144
|
+
touched = true;
|
|
145
|
+
return { ...r, state: "stopped" };
|
|
146
|
+
}
|
|
147
|
+
return r;
|
|
148
|
+
});
|
|
149
|
+
return touched ? next : null;
|
|
83
150
|
});
|
|
84
|
-
if (touched)
|
|
85
|
-
await this.write(next);
|
|
86
151
|
}
|
|
87
152
|
/** Drop a record from the registry entirely. */
|
|
88
153
|
async remove(id) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
154
|
+
await this.mutate(async (records) => {
|
|
155
|
+
const next = records.filter((r) => r.id !== id);
|
|
156
|
+
return next.length !== records.length ? next : null;
|
|
157
|
+
});
|
|
93
158
|
}
|
|
94
159
|
}
|
|
160
|
+
/** Whether the reconciliation changed any record's state. */
|
|
161
|
+
function differs(before, after) {
|
|
162
|
+
return after.some((r, i) => r.state !== before[i]?.state);
|
|
163
|
+
}
|
|
95
164
|
//# sourceMappingURL=process-registry-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-registry-service.js","sourceRoot":"","sources":["../../src/application/process-registry-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"process-registry-service.js","sourceRoot":"","sources":["../../src/application/process-registry-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,7 +57,7 @@ export async function buildProjectTabData(deps) {
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
// Background processes — the registry reconciles liveness in list().
|
|
60
|
-
const registry = new ProcessRegistryService(fs, proc, paths.cwdProcessesFile());
|
|
60
|
+
const registry = new ProcessRegistryService(fs, proc, paths.cwdProcessesFile(), paths.cwdLockFile());
|
|
61
61
|
const processes = await safeRun("processes", () => registry.list(), warnings, []);
|
|
62
62
|
return {
|
|
63
63
|
workspaceName,
|