@tacuchi/agent-workflow-cli 20.22.0 → 20.23.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 (109) hide show
  1. package/dist/adapters/git-cli.js +42 -0
  2. package/dist/adapters/git-cli.js.map +1 -1
  3. package/dist/application/artifacts-service.js +5 -5
  4. package/dist/application/artifacts-service.js.map +1 -1
  5. package/dist/application/checkpoint-service.js +60 -55
  6. package/dist/application/checkpoint-service.js.map +1 -1
  7. package/dist/application/checkpoint-write-service.js +61 -66
  8. package/dist/application/checkpoint-write-service.js.map +1 -1
  9. package/dist/application/decisiones-service.js +5 -5
  10. package/dist/application/decisiones-service.js.map +1 -1
  11. package/dist/application/export-service.js +250 -0
  12. package/dist/application/export-service.js.map +1 -0
  13. package/dist/application/fix-git-service.js +244 -0
  14. package/dist/application/fix-git-service.js.map +1 -0
  15. package/dist/application/history-update-service.js +35 -24
  16. package/dist/application/history-update-service.js.map +1 -1
  17. package/dist/application/lifecycle-target.js +39 -0
  18. package/dist/application/lifecycle-target.js.map +1 -0
  19. package/dist/application/parsers/spec-relation.js +80 -0
  20. package/dist/application/parsers/spec-relation.js.map +1 -0
  21. package/dist/application/paths-service.js +8 -0
  22. package/dist/application/paths-service.js.map +1 -1
  23. package/dist/application/persist-service.js +285 -0
  24. package/dist/application/persist-service.js.map +1 -0
  25. package/dist/application/release-data/artifacts.js +17 -21
  26. package/dist/application/release-data/artifacts.js.map +1 -1
  27. package/dist/application/resume-service.js +184 -0
  28. package/dist/application/resume-service.js.map +1 -0
  29. package/dist/application/semantic-operation/protocol.js +247 -0
  30. package/dist/application/semantic-operation/protocol.js.map +1 -0
  31. package/dist/application/semantic-operation/publish.js +80 -0
  32. package/dist/application/semantic-operation/publish.js.map +1 -0
  33. package/dist/application/session-binding-service.js +125 -0
  34. package/dist/application/session-binding-service.js.map +1 -0
  35. package/dist/application/session-close-service.js +60 -39
  36. package/dist/application/session-close-service.js.map +1 -1
  37. package/dist/application/session-create-service.js +45 -19
  38. package/dist/application/session-create-service.js.map +1 -1
  39. package/dist/application/session-resolver.js +180 -44
  40. package/dist/application/session-resolver.js.map +1 -1
  41. package/dist/application/session-resume-service.js +39 -9
  42. package/dist/application/session-resume-service.js.map +1 -1
  43. package/dist/application/sessions-service.js +0 -2
  44. package/dist/application/sessions-service.js.map +1 -1
  45. package/dist/application/status-service.js +24 -388
  46. package/dist/application/status-service.js.map +1 -1
  47. package/dist/application/tasks-service.js +5 -5
  48. package/dist/application/tasks-service.js.map +1 -1
  49. package/dist/application/workline-index-service.js +510 -0
  50. package/dist/application/workline-index-service.js.map +1 -0
  51. package/dist/cli/commands/checkpoint-read.js +10 -6
  52. package/dist/cli/commands/checkpoint-read.js.map +1 -1
  53. package/dist/cli/commands/checkpoint-write.js +38 -11
  54. package/dist/cli/commands/checkpoint-write.js.map +1 -1
  55. package/dist/cli/commands/export.js +117 -0
  56. package/dist/cli/commands/export.js.map +1 -0
  57. package/dist/cli/commands/fix-git.js +109 -0
  58. package/dist/cli/commands/fix-git.js.map +1 -0
  59. package/dist/cli/commands/generate-launch.js +35 -3
  60. package/dist/cli/commands/generate-launch.js.map +1 -1
  61. package/dist/cli/commands/history-update.js +1 -1
  62. package/dist/cli/commands/history-update.js.map +1 -1
  63. package/dist/cli/commands/index.js +11 -0
  64. package/dist/cli/commands/index.js.map +1 -1
  65. package/dist/cli/commands/persist.js +67 -0
  66. package/dist/cli/commands/persist.js.map +1 -0
  67. package/dist/cli/commands/resume-summary.js +14 -3
  68. package/dist/cli/commands/resume-summary.js.map +1 -1
  69. package/dist/cli/commands/resume.js +73 -0
  70. package/dist/cli/commands/resume.js.map +1 -0
  71. package/dist/cli/commands/session-artifacts.js +12 -11
  72. package/dist/cli/commands/session-artifacts.js.map +1 -1
  73. package/dist/cli/commands/session-close.js +8 -7
  74. package/dist/cli/commands/session-close.js.map +1 -1
  75. package/dist/cli/commands/session-create.js +5 -1
  76. package/dist/cli/commands/session-create.js.map +1 -1
  77. package/dist/cli/commands/session-resume.js +16 -10
  78. package/dist/cli/commands/session-resume.js.map +1 -1
  79. package/dist/cli/commands/status.js +66 -2
  80. package/dist/cli/commands/status.js.map +1 -1
  81. package/dist/cli/commands/workspace-init.js +21 -2
  82. package/dist/cli/commands/workspace-init.js.map +1 -1
  83. package/dist/cli/context-id.js +133 -0
  84. package/dist/cli/context-id.js.map +1 -0
  85. package/dist/cli/help-groups.js +16 -1
  86. package/dist/cli/help-groups.js.map +1 -1
  87. package/dist/cli/main.js +44 -16
  88. package/dist/cli/main.js.map +1 -1
  89. package/dist/cli/output-mode.js +41 -0
  90. package/dist/cli/output-mode.js.map +1 -0
  91. package/dist/cli/parser.js +6 -0
  92. package/dist/cli/parser.js.map +1 -1
  93. package/dist/cli/registry.js.map +1 -1
  94. package/dist/cli/render.js +53 -0
  95. package/dist/cli/render.js.map +1 -1
  96. package/package.json +1 -1
  97. package/skills/w/commands/export-diagrams.md +19 -10
  98. package/skills/w/commands/export-manuals.md +20 -10
  99. package/skills/w/commands/export-reports.md +20 -11
  100. package/skills/w/commands/export-scripts.md +20 -10
  101. package/skills/w/commands/fix-git.md +31 -12
  102. package/skills/w/commands/generate-launch.md +1 -1
  103. package/skills/w/commands/persist.md +33 -68
  104. package/skills/w/commands/resume.md +25 -46
  105. package/skills/w/commands/status.md +12 -48
  106. package/skills/w/commands/workspace-init.md +3 -3
  107. package/skills/w/hooks/README.md +21 -2
  108. package/skills/w/hooks/hooks.template.json +2 -2
  109. package/skills/w/roles/git/ROLE.md +7 -8
@@ -0,0 +1,39 @@
1
+ import { resolveSessionTarget, } from "./session-resolver.js";
2
+ export async function resolveLifecycleTarget(fs, paths, options) {
3
+ // `allowClosed` stays off: a lifecycle surface writes or restores state, and
4
+ // a closed line is not a valid destination for either.
5
+ const resolution = await resolveSessionTarget(fs, paths, {
6
+ ...(options.code !== undefined ? { code: options.code } : {}),
7
+ ...(options.contextId !== undefined ? { contextId: options.contextId } : {}),
8
+ bind: true,
9
+ });
10
+ if (resolution.outcome === "resolved") {
11
+ return { outcome: "resolved", session: resolution.session };
12
+ }
13
+ // Holding the host's compaction is only worth it when a SELECTION actually
14
+ // resolves the situation — that is ambiguity, and the spec scopes pausable
15
+ // blocking to exactly that ("Si una compactación AMBIGUA puede pausarse").
16
+ // Every other outcome has nothing to pick from: a workspace with no active
17
+ // session is the normal state between runs, and blocking there would fail
18
+ // every single compaction with an empty candidate list.
19
+ if (options.canPauseCompaction === true && resolution.code === "SESSION_AMBIGUOUS") {
20
+ return { outcome: "blocked", error: resolution };
21
+ }
22
+ return {
23
+ outcome: "degraded",
24
+ reason: resolution.message,
25
+ candidates: resolution.candidates,
26
+ action: resolution.action,
27
+ };
28
+ }
29
+ /** Why the target could not be resolved, in whichever form the outcome took. */
30
+ export function unresolvedDetail(target) {
31
+ return target.outcome === "blocked"
32
+ ? {
33
+ reason: target.error.message,
34
+ candidates: target.error.candidates,
35
+ action: target.error.action,
36
+ }
37
+ : { reason: target.reason, candidates: target.candidates, action: target.action };
38
+ }
39
+ //# sourceMappingURL=lifecycle-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle-target.js","sourceRoot":"","sources":["../../src/application/lifecycle-target.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAiC/B,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,EAAkB,EAClB,KAAmB,EACnB,OAAyB;IAEzB,6EAA6E;IAC7E,uDAAuD;IACvD,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE;QACvD,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;IACH,IAAI,UAAU,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACtC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC;IAC9D,CAAC;IACD,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,0EAA0E;IAC1E,wDAAwD;IACxD,IAAI,OAAO,CAAC,kBAAkB,KAAK,IAAI,IAAI,UAAU,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACnF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IACnD,CAAC;IACD,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,UAAU,CAAC,OAAO;QAC1B,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,MAAM,EAAE,UAAU,CAAC,MAAM;KAC1B,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAC9B,MAAqE;IAErE,OAAO,MAAM,CAAC,OAAO,KAAK,SAAS;QACjC,CAAC,CAAC;YACE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;YAC5B,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;YACnC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;SAC5B;QACH,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACtF,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { parseMdSectionBilingual, scanMarkdown } from "../markdown.js";
2
+ // Spec documents are `docs/specs/NNN-spec-<slug>.md`; the trailing character
3
+ // class stops at the punctuation that surrounds a path in prose (backticks,
4
+ // parens, quotes) so a Markdown link or an inline-code path still matches.
5
+ const SPEC_PATH_RE = /docs\/specs\/(\d{3})-spec[^\s`)"']*\.md/g;
6
+ // `Spec 011` / `spec 011` — a bare number is NOT evidence: `sesión 047` and
7
+ // `baseline 044` would match it, and the whole point is to never guess.
8
+ const SPEC_REFERENCE_RE = /\bspec\s+(\d{3})\b/gi;
9
+ const DERIVED_FROM_RE = /derived from/i;
10
+ /**
11
+ * The spec a plan declares as its source, by NUMBER — resolving the number
12
+ * against the real spec inventory belongs to the caller.
13
+ *
14
+ * Evidence is read in a fixed order and the FIRST level that says anything is
15
+ * final; levels never merge. Slug similarity, file dates and document age are
16
+ * deliberately absent: they are what made the old association guess wrong.
17
+ *
18
+ * 1. `Derived from docs/specs/NNN-…` in the header blockquote — what
19
+ * `plan-new` writes today.
20
+ * 2. An explicit spec path inside `## Origin` — what plans written before that
21
+ * header carried.
22
+ * 3. An unambiguous `Spec NNN` reference inside `## Origin` — the weakest
23
+ * accepted form, scoped to that section so a mention in `## Dependencies`
24
+ * ("la spec 009 consumirá…") is never mistaken for provenance.
25
+ *
26
+ * Two different specs at the same level is `ambiguous`, not a coin flip:
27
+ * a human wrote something contradictory and only a human should settle it.
28
+ */
29
+ export function parseSpecRelation(text) {
30
+ const origin = parseMdSectionBilingual(text, "Origin") ?? "";
31
+ const levels = [
32
+ { evidence: "derived-from", numbers: derivedFromNumbers(text) },
33
+ { evidence: "origin-path", numbers: matchNumbers(origin, SPEC_PATH_RE) },
34
+ { evidence: "spec-reference", numbers: matchNumbers(origin, SPEC_REFERENCE_RE) },
35
+ ];
36
+ for (const { evidence, numbers } of levels) {
37
+ const [first] = numbers;
38
+ if (first === undefined)
39
+ continue;
40
+ if (numbers.length === 1)
41
+ return { status: "declared", number: first, evidence };
42
+ return { status: "ambiguous", numbers, evidence };
43
+ }
44
+ return { status: "absent" };
45
+ }
46
+ /**
47
+ * Spec paths on the `Derived from` lines of the header blockquote — the block
48
+ * between the title and the first `##` section. Bounded there so a plan that
49
+ * quotes the marker inside its own prose does not re-declare its origin.
50
+ */
51
+ function derivedFromNumbers(text) {
52
+ const { lines, fenced, headings } = scanMarkdown(text);
53
+ const firstSection = headings.find((h) => h.level >= 2);
54
+ const end = firstSection?.line ?? lines.length;
55
+ const found = [];
56
+ for (let i = 0; i < end; i++) {
57
+ const line = lines[i];
58
+ if (line === undefined || fenced[i] === true)
59
+ continue;
60
+ if (!DERIVED_FROM_RE.test(line))
61
+ continue;
62
+ found.push(...matchNumbers(line, SPEC_PATH_RE));
63
+ }
64
+ return dedupe(found);
65
+ }
66
+ function matchNumbers(text, pattern) {
67
+ const found = [];
68
+ // Fresh instance per call: the module-level literals carry /g, whose lastIndex
69
+ // would otherwise leak between documents.
70
+ for (const match of text.matchAll(new RegExp(pattern.source, pattern.flags))) {
71
+ const number = match[1];
72
+ if (number !== undefined)
73
+ found.push(number);
74
+ }
75
+ return dedupe(found);
76
+ }
77
+ function dedupe(numbers) {
78
+ return [...new Set(numbers)].sort();
79
+ }
80
+ //# sourceMappingURL=spec-relation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-relation.js","sourceRoot":"","sources":["../../../src/application/parsers/spec-relation.ts"],"names":[],"mappings":"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"}
@@ -63,6 +63,14 @@ export class PathsService {
63
63
  cwdSessionsDir() {
64
64
  return join(this.cwdRoot(), "sessions");
65
65
  }
66
+ /**
67
+ * Durable conversation→session association registry. Lives inside the
68
+ * sessions dir (machine-local, gitignored) and is skipped by
69
+ * `listSessionFolders`, which ignores dot-prefixed entries.
70
+ */
71
+ cwdSessionBindingsFile() {
72
+ return join(this.cwdSessionsDir(), ".bindings.json");
73
+ }
66
74
  cwdHistoryFile() {
67
75
  return join(this.cwdRoot(), "HISTORY.md");
68
76
  }
@@ -1 +1 @@
1
- {"version":3,"file":"paths-service.js","sourceRoot":"","sources":["../../src/application/paths-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paths-service.js","sourceRoot":"","sources":["../../src/application/paths-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,285 @@
1
+ import { join } from "node:path";
2
+ import { runNextNumber } from "./dev-only-services.js";
3
+ import { withCwdLock } from "./lock-service.js";
4
+ import { firstNonEmptyLine, parseMdSectionBilingual } from "./markdown.js";
5
+ import { approvalDigest, buildSemanticRequest, parseSemanticResponse, semanticDigest, } from "./semantic-operation/protocol.js";
6
+ import { publishArtifacts } from "./semantic-operation/publish.js";
7
+ /**
8
+ * `persist` — adopt finished conversation work into `docs/` in one pass.
9
+ *
10
+ * The AI owns exactly one step: deciding the shape (analysis / requirement /
11
+ * plan) and writing the document. Everything that can silently do damage —
12
+ * the inventory, the duplicate check, the number, the destination, whether an
13
+ * existing file may be replaced, and the write itself — stays here.
14
+ *
15
+ * It never creates a session: sessions belong to loops.
16
+ */
17
+ const CATEGORIES = {
18
+ research: { dir: "docs/research", infix: "research" },
19
+ spec: { dir: "docs/specs", infix: "spec" },
20
+ plan: { dir: "docs/plans", infix: "plan" },
21
+ };
22
+ const OPERATION = "persist";
23
+ const LIMITS = { max_artifacts: 1, max_artifact_bytes: 256 * 1024 };
24
+ const SLUG_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
25
+ const CONTRACT = [
26
+ "Respondé UN objeto JSON con: version, operation, input_digest (los tres copiados del request),",
27
+ "state ('proposed' | 'ambiguous' | 'unsupported'),",
28
+ "decisions { category: 'research'|'spec'|'plan', slug: kebab-case, mode: 'new'|'update',",
29
+ "target?: ruta existente cuando mode='update', target_digest?: su digest del inventario },",
30
+ "y artifacts: exactamente UN { path, content }. El path va dentro del destino de la categoría",
31
+ "y su NNN es consultivo: el CLI reasigna el número dentro del lock.",
32
+ "Si el contenido ya existe como documento, respondé state='ambiguous' con reason.",
33
+ ].join(" ");
34
+ // ── prepare ──────────────────────────────────────────────────────────────────
35
+ export async function preparePersist(fs, env, paths) {
36
+ const cwd = paths.workspaceDir();
37
+ const inventory = { categories: emptyCategories() };
38
+ const readSet = [];
39
+ let readSetBytes = 0;
40
+ for (const [name, category] of Object.entries(CATEGORIES)) {
41
+ const next = await runNextNumber(fs, env, { directory: category.dir, dryRun: true });
42
+ const docs = await readCategory(fs, join(cwd, category.dir), category.dir, category.infix);
43
+ for (const doc of docs) {
44
+ readSet.push(doc.file);
45
+ readSetBytes += doc.summary.length;
46
+ }
47
+ inventory.categories[name] = { destination: category.dir, next: next.next, docs };
48
+ }
49
+ return buildSemanticRequest({
50
+ operation: OPERATION,
51
+ // The seal covers the whole inventory: a document appearing anywhere in
52
+ // docs/ between prepare and apply invalidates the duplicate check AND the
53
+ // consultative numbering the answer reasoned over.
54
+ inputs: inventory,
55
+ contract: CONTRACT,
56
+ inventory,
57
+ allowedDestinations: Object.values(CATEGORIES).map((c) => c.dir),
58
+ limits: LIMITS,
59
+ readSet,
60
+ readSetBytes,
61
+ });
62
+ }
63
+ async function readCategory(fs, dir, relative, infix) {
64
+ if (!(await safeExists(fs, dir)))
65
+ return [];
66
+ const pattern = new RegExp(`^(\\d{3})-${infix}(?:-(.+))?\\.md$`, "i");
67
+ const out = [];
68
+ let entries;
69
+ try {
70
+ entries = await fs.list(dir);
71
+ }
72
+ catch {
73
+ return [];
74
+ }
75
+ for (const entry of entries) {
76
+ const match = pattern.exec(entry.name);
77
+ if (entry.type !== "file" || !match?.[1])
78
+ continue;
79
+ try {
80
+ const text = await fs.readText(entry.path);
81
+ out.push({
82
+ file: `${relative}/${entry.name}`,
83
+ number: match[1],
84
+ slug: match[2] ?? "",
85
+ summary: summarize(text),
86
+ digest: semanticDigest(text),
87
+ });
88
+ }
89
+ catch {
90
+ // skip unreadable doc
91
+ }
92
+ }
93
+ return out.sort((a, b) => a.number.localeCompare(b.number));
94
+ }
95
+ function summarize(text) {
96
+ for (const heading of ["Objective", "Origin", "Requirement"]) {
97
+ const section = parseMdSectionBilingual(text, heading);
98
+ const line = section === undefined ? undefined : firstNonEmptyLine(section);
99
+ if (line !== undefined)
100
+ return line.slice(0, 200);
101
+ }
102
+ return (firstNonEmptyLine(text) ?? "").slice(0, 200);
103
+ }
104
+ // ── validate ─────────────────────────────────────────────────────────────────
105
+ export function validatePersist(raw, request) {
106
+ const parsed = parseSemanticResponse(raw, request);
107
+ if (!parsed.ok)
108
+ return parsed;
109
+ const decisions = readDecisions(parsed.value, request);
110
+ if (!decisions.ok)
111
+ return decisions;
112
+ const artifact = parsed.value.artifacts?.[0];
113
+ if (artifact === undefined) {
114
+ return { ok: false, failure: reject("la respuesta no trae ningún artefacto") };
115
+ }
116
+ const category = CATEGORIES[decisions.value.category];
117
+ const shape = checkFilename(artifact.path, category.dir, category.infix, decisions.value.slug);
118
+ if (shape !== null)
119
+ return { ok: false, failure: shape };
120
+ return {
121
+ ok: true,
122
+ value: {
123
+ preview: {
124
+ category: decisions.value.category,
125
+ mode: decisions.value.mode,
126
+ destination: category.dir,
127
+ bytes: Buffer.byteLength(artifact.content, "utf8"),
128
+ target: decisions.value.mode === "update" ? (decisions.value.target ?? null) : null,
129
+ },
130
+ approval_digest: approvalDigest(parsed.value),
131
+ },
132
+ };
133
+ }
134
+ function readDecisions(response, request) {
135
+ const raw = response.decisions;
136
+ if (raw === undefined)
137
+ return { ok: false, failure: reject("faltan las decisions") };
138
+ const category = raw.category;
139
+ if (typeof category !== "string" || !(category in CATEGORIES)) {
140
+ return { ok: false, failure: reject(`categoría desconocida: ${String(category)}`) };
141
+ }
142
+ const slug = raw.slug;
143
+ if (typeof slug !== "string" || !SLUG_RE.test(slug)) {
144
+ return { ok: false, failure: reject(`slug inválido: ${String(slug)} (kebab-case, a-z0-9)`) };
145
+ }
146
+ const mode = raw.mode;
147
+ if (mode !== "new" && mode !== "update") {
148
+ return { ok: false, failure: reject(`modo desconocido: ${String(mode)}`) };
149
+ }
150
+ if (mode === "new") {
151
+ return { ok: true, value: { category: category, slug, mode } };
152
+ }
153
+ // Replacing an existing document needs more than intent: it must name the
154
+ // target AND prove it is the same bytes prepare inventoried.
155
+ const target = raw.target;
156
+ const targetDigest = raw.target_digest;
157
+ if (typeof target !== "string" || typeof targetDigest !== "string") {
158
+ return { ok: false, failure: reject("mode 'update' exige 'target' y 'target_digest'") };
159
+ }
160
+ const inventory = request.inventory;
161
+ const known = inventory.categories[category].docs.find((d) => d.file === target);
162
+ if (known === undefined) {
163
+ return { ok: false, failure: reject(`'${target}' no está en el inventario de la categoría`) };
164
+ }
165
+ if (known.digest !== targetDigest) {
166
+ return {
167
+ ok: false,
168
+ failure: {
169
+ code: "SEMANTIC_STALE",
170
+ message: `'${target}' cambió desde el prepare`,
171
+ action: "volvé a correr prepare y revisá el documento antes de reemplazarlo",
172
+ },
173
+ };
174
+ }
175
+ return {
176
+ ok: true,
177
+ value: {
178
+ category: category,
179
+ slug,
180
+ mode,
181
+ target,
182
+ target_digest: targetDigest,
183
+ },
184
+ };
185
+ }
186
+ function checkFilename(path, dir, infix, slug) {
187
+ const expected = new RegExp(`^${dir}/\\d{3}-${infix}-${slug}\\.md$`);
188
+ if (expected.test(path))
189
+ return null;
190
+ return reject(`'${path}' no respeta ${dir}/NNN-${infix}-${slug}.md`);
191
+ }
192
+ /**
193
+ * Publishes, and only publishes, what was validated and approved.
194
+ *
195
+ * Everything that can change between validate and here is rechecked INSIDE the
196
+ * lock: the inventory seal, the approval digest, and the number — which is
197
+ * minted here and overwrites the consultative one the answer carried, so two
198
+ * concurrent runs cannot both claim `007`.
199
+ */
200
+ export async function applyPersist(fs, env, paths, input) {
201
+ const validated = validatePersist(input.raw, input.request);
202
+ if (!validated.ok)
203
+ return validated;
204
+ if (validated.value.approval_digest !== input.approval) {
205
+ return {
206
+ ok: false,
207
+ failure: {
208
+ code: "APPROVAL_MISMATCH",
209
+ message: "el approval digest no corresponde a esta propuesta",
210
+ action: "volvé a correr validate y aprobá el digest que devuelve",
211
+ },
212
+ };
213
+ }
214
+ const parsed = parseSemanticResponse(input.raw, input.request);
215
+ if (!parsed.ok)
216
+ return parsed;
217
+ const artifact = parsed.value.artifacts?.[0];
218
+ if (artifact === undefined) {
219
+ return { ok: false, failure: reject("la respuesta no trae ningún artefacto") };
220
+ }
221
+ const preview = validated.value.preview;
222
+ const category = CATEGORIES[preview.category];
223
+ const result = await withCwdLock(fs, paths, async () => {
224
+ const fresh = await preparePersist(fs, env, paths);
225
+ if (fresh.input_digest !== input.request.input_digest) {
226
+ return {
227
+ ok: false,
228
+ failure: {
229
+ code: "SEMANTIC_STALE",
230
+ message: "docs/ cambió entre la aprobación y la escritura",
231
+ action: "volvé a correr prepare: el inventario y la numeración ya no son los aprobados",
232
+ },
233
+ };
234
+ }
235
+ const path = preview.mode === "update" && preview.target !== null
236
+ ? preview.target
237
+ : `${category.dir}/${(await runNextNumber(fs, env, { directory: category.dir })).next}-${category.infix}-${slugOf(artifact.path, category.infix)}.md`;
238
+ return await publishArtifacts(fs, paths.workspaceDir(), [{ path, content: artifact.content }], {
239
+ overwrite: preview.mode === "update",
240
+ });
241
+ });
242
+ if ("error" in result) {
243
+ return {
244
+ ok: false,
245
+ failure: {
246
+ code: "LOCK_BUSY",
247
+ message: result.error,
248
+ action: "esperá a que termine la otra operación y volvé a aplicar",
249
+ },
250
+ };
251
+ }
252
+ if (!result.ok)
253
+ return result;
254
+ return {
255
+ ok: true,
256
+ value: { written: result.value.written, category: preview.category, mode: preview.mode },
257
+ };
258
+ }
259
+ function slugOf(path, infix) {
260
+ return new RegExp(`\\d{3}-${infix}-(.+)\\.md$`).exec(path)?.[1] ?? "sin-slug";
261
+ }
262
+ // ── helpers ──────────────────────────────────────────────────────────────────
263
+ function emptyCategories() {
264
+ return {
265
+ research: { destination: CATEGORIES.research.dir, next: "001", docs: [] },
266
+ spec: { destination: CATEGORIES.spec.dir, next: "001", docs: [] },
267
+ plan: { destination: CATEGORIES.plan.dir, next: "001", docs: [] },
268
+ };
269
+ }
270
+ function reject(message) {
271
+ return {
272
+ code: "SEMANTIC_RESPONSE_INVALID",
273
+ message,
274
+ action: "corregí la respuesta según el 'contract' del request y reenviala",
275
+ };
276
+ }
277
+ async function safeExists(fs, path) {
278
+ try {
279
+ return await fs.exists(path);
280
+ }
281
+ catch {
282
+ return false;
283
+ }
284
+ }
285
+ //# sourceMappingURL=persist-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persist-service.js","sourceRoot":"","sources":["../../src/application/persist-service.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { join } from "node:path";
2
2
  import { findArtifact } from "../session-artifacts.js";
3
- import { buildSessionEntry, parseSessionFolder } from "../session-resolver.js";
4
- import { collectFilesByExt, sessionCodeInt } from "./common.js";
3
+ import { resolveSessionTarget } from "../session-resolver.js";
4
+ import { collectFilesByExt } from "./common.js";
5
5
  // Each request-kind maps to an ordered list of on-disk ArtifactKinds tried in
6
6
  // turn (first match wins). The descriptor request-kind `objetivo` reads the new
7
7
  // SESSION.md, then the legacy OBJECTIVE.md/OBJETIVO.md. The result key stays
@@ -16,16 +16,24 @@ const KIND_TO_ARTIFACT = {
16
16
  backlog: ["backlog"],
17
17
  };
18
18
  const SCRIPTS_SUBDIR = "scripts";
19
- export async function readSessionArtifacts(fs, env, paths, sessionCode, kinds, runtime) {
20
- void env;
21
- const found = await findSessionFolder(fs, paths.cwdSessionsDir(), sessionCode);
22
- if (!found)
23
- return { error: `session_not_found:${sessionCode}` };
24
- const { sessionPath, folderName } = found;
19
+ export async function readSessionArtifacts(fs, paths, sessionCode, kinds, runtime) {
20
+ // This is a session-scoped READ reached by `aw session-artifacts --dump --code`.
21
+ // It used to carry its own folder matcher (`sessionCodeInt` over a filtered
22
+ // listing) — the last resolver besides the canonical one. `allowClosed` is on
23
+ // (dumping a finished session's artifacts is the normal case) and `bind` is
24
+ // off: a release/inspection dump is not how a conversation picks its line.
25
+ const resolution = await resolveSessionTarget(fs, paths, {
26
+ code: sessionCode,
27
+ allowClosed: true,
28
+ });
29
+ if (resolution.outcome !== "resolved")
30
+ return { sessionError: resolution };
31
+ const sessionPath = resolution.session.path;
32
+ const folderName = resolution.session.folder;
25
33
  const legacyCheck = await detectLegacyFormat(fs, sessionPath, folderName, runtime);
26
34
  if (legacyCheck)
27
35
  return legacyCheck;
28
- const entry = await buildSessionEntry(fs, sessionPath, folderName);
36
+ const entry = resolution.session;
29
37
  const result = {
30
38
  session: entry.folder,
31
39
  path: entry.path,
@@ -43,18 +51,6 @@ export async function readSessionArtifacts(fs, env, paths, sessionCode, kinds, r
43
51
  }
44
52
  return result;
45
53
  }
46
- async function findSessionFolder(fs, sessionsDir, sessionCode) {
47
- const targetInt = sessionCodeInt(sessionCode);
48
- if (!(await fs.exists(sessionsDir)) || targetInt === null)
49
- return null;
50
- // Accept both the current naming (NNN-<slug>-<flow>) and the legacy one
51
- // (sessionNNN-…): a legacy-only filter would never find current sessions.
52
- const folders = (await fs.list(sessionsDir)).filter((e) => e.type === "dir" && /^(session)?\d{3}-/.test(e.name));
53
- const match = folders.find((f) => sessionCodeInt(parseSessionFolder(f.name).code) === targetInt);
54
- if (!match)
55
- return null;
56
- return { sessionPath: match.path, folderName: match.name };
57
- }
58
54
  async function detectLegacyFormat(fs, sessionPath, folderName, runtime) {
59
55
  // REQUIREMENTS.md is a pre-0.9 format marker (no longer a tracked kind):
60
56
  // probe the filename directly. SESSION.md / OBJECTIVE.md mark the current format.
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../src/application/release-data/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKjC,OAAO,EAAqB,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhE,8EAA8E;AAC9E,gFAAgF;AAChF,6EAA6E;AAC7E,6EAA6E;AAC7E,8BAA8B;AAC9B,MAAM,gBAAgB,GAA4C;IAChE,QAAQ,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC;IAClC,UAAU,EAAE,CAAC,WAAW,CAAC;IACzB,YAAY,EAAE,CAAC,aAAa,CAAC;IAC7B,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,UAAU,EAAE,CAAC,YAAY,CAAC;IAC1B,OAAO,EAAE,CAAC,SAAS,CAAC;CACrB,CAAC;AACF,MAAM,cAAc,GAAG,SAAS,CAAC;AAkBjC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAkB,EAClB,GAAY,EACZ,KAAmB,EACnB,WAAmB,EACnB,KAAgB,EAChB,OAAyB;IAEzB,KAAK,GAAG,CAAC;IACT,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,cAAc,EAAE,EAAE,WAAW,CAAC,CAAC;IAC/E,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,WAAW,EAAE,EAAE,CAAC;IAEjE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAE1C,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACnF,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACnE,MAAM,MAAM,GAA2B;QACrC,OAAO,EAAE,KAAK,CAAC,MAAM;QACrB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC,CAAC;IAC3E,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,CAAC,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACL,MAAkC,CAAC,IAAI,CAAC,GAAG,MAAM,gBAAgB,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,EAAkB,EAClB,WAAmB,EACnB,WAAmB;IAEnB,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACvE,wEAAwE;IACxE,0EAA0E;IAC1E,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAC5D,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;IACjG,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,EAAkB,EAClB,WAAmB,EACnB,UAAkB,EAClB,OAAoC;IAEpC,yEAAyE;IACzE,kFAAkF;IAClF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACrE,MAAM,MAAM,GACV,CAAC,MAAM,YAAY,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI;QACzD,CAAC,MAAM,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;IAC9D,IAAI,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,UAAU,GAAG,OAAO,EAAE,aAAa,EAAE,OAAO,IAAI,0CAA0C,CAAC;IACjG,OAAO;QACL,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,+DAA+D,UAAU,gDAAgD;KAChI,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,EAAkB,EAClB,WAAmB;IAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACrD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,KAAK,GAAgF,EAAE,CAAC;IAC9F,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,IAAI,GAAkB,IAAI,CAAC;QAC/B,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC;YAC7B,IAAI,EAAE,CAAC;YACP,IAAI;YACJ,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;SACzC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,EAAkB,EAClB,WAAmB,EACnB,IAAY;IAEZ,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,IAAI,EAAE,EAAE,CAAC;IAC7D,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,YAAY,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;QACjE,IAAI,YAAY;YAAE,MAAM;IAC1B,CAAC;IACD,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC/C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC;IAC7D,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../src/application/release-data/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAqB,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAA+B,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,8EAA8E;AAC9E,gFAAgF;AAChF,6EAA6E;AAC7E,6EAA6E;AAC7E,8BAA8B;AAC9B,MAAM,gBAAgB,GAA4C;IAChE,QAAQ,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC;IAClC,UAAU,EAAE,CAAC,WAAW,CAAC;IACzB,YAAY,EAAE,CAAC,aAAa,CAAC;IAC7B,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,UAAU,EAAE,CAAC,YAAY,CAAC;IAC1B,OAAO,EAAE,CAAC,SAAS,CAAC;CACrB,CAAC;AACF,MAAM,cAAc,GAAG,SAAS,CAAC;AAoBjC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAkB,EAClB,KAAmB,EACnB,WAAmB,EACnB,KAAgB,EAChB,OAAyB;IAEzB,iFAAiF;IACjF,4EAA4E;IAC5E,8EAA8E;IAC9E,4EAA4E;IAC5E,2EAA2E;IAC3E,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE;QACvD,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IACH,IAAI,UAAU,CAAC,OAAO,KAAK,UAAU;QAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;IAE3E,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;IAC5C,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;IAE7C,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACnF,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC;IACjC,MAAM,MAAM,GAA2B;QACrC,OAAO,EAAE,KAAK,CAAC,MAAM;QACrB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC,CAAC;IAC3E,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,CAAC,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACL,MAAkC,CAAC,IAAI,CAAC,GAAG,MAAM,gBAAgB,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,EAAkB,EAClB,WAAmB,EACnB,UAAkB,EAClB,OAAoC;IAEpC,yEAAyE;IACzE,kFAAkF;IAClF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACrE,MAAM,MAAM,GACV,CAAC,MAAM,YAAY,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI;QACzD,CAAC,MAAM,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;IAC9D,IAAI,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,UAAU,GAAG,OAAO,EAAE,aAAa,EAAE,OAAO,IAAI,0CAA0C,CAAC;IACjG,OAAO;QACL,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,+DAA+D,UAAU,gDAAgD;KAChI,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,EAAkB,EAClB,WAAmB;IAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACrD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,KAAK,GAAgF,EAAE,CAAC;IAC9F,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,IAAI,GAAkB,IAAI,CAAC;QAC/B,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC;YAC7B,IAAI,EAAE,CAAC;YACP,IAAI;YACJ,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;SACzC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,EAAkB,EAClB,WAAmB,EACnB,IAAY;IAEZ,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,IAAI,EAAE,EAAE,CAAC;IAC7D,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,YAAY,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;QACjE,IAAI,YAAY;YAAE,MAAM;IAC1B,CAAC;IACD,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC/C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC;IAC7D,CAAC;AACH,CAAC"}