@tacuchi/agent-workflow-cli 21.12.0 → 21.13.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 (37) hide show
  1. package/dist/application/checkpoint/markdown.js +38 -2
  2. package/dist/application/checkpoint/markdown.js.map +1 -1
  3. package/dist/application/checkpoint-service.js +10 -3
  4. package/dist/application/checkpoint-service.js.map +1 -1
  5. package/dist/application/checkpoint-write-service.js +52 -27
  6. package/dist/application/checkpoint-write-service.js.map +1 -1
  7. package/dist/application/history-table.js +253 -56
  8. package/dist/application/history-table.js.map +1 -1
  9. package/dist/application/history-update-service.js +85 -14
  10. package/dist/application/history-update-service.js.map +1 -1
  11. package/dist/application/lifecycle-target.js +2 -2
  12. package/dist/application/lifecycle-target.js.map +1 -1
  13. package/dist/application/resume-service.js +2 -9
  14. package/dist/application/resume-service.js.map +1 -1
  15. package/dist/application/session-close-service.js +13 -2
  16. package/dist/application/session-close-service.js.map +1 -1
  17. package/dist/application/session-create-service.js +4 -25
  18. package/dist/application/session-create-service.js.map +1 -1
  19. package/dist/application/session-resolver.js +112 -15
  20. package/dist/application/session-resolver.js.map +1 -1
  21. package/dist/application/sessions-service.js +7 -6
  22. package/dist/application/sessions-service.js.map +1 -1
  23. package/dist/cli/commands/checkpoint-write.js +1 -0
  24. package/dist/cli/commands/checkpoint-write.js.map +1 -1
  25. package/dist/cli/commands/history-update.js +25 -4
  26. package/dist/cli/commands/history-update.js.map +1 -1
  27. package/dist/cli/commands/index.js +4 -0
  28. package/dist/cli/commands/index.js.map +1 -1
  29. package/dist/cli/commands/session-close.js +12 -0
  30. package/dist/cli/commands/session-close.js.map +1 -1
  31. package/dist/cli/help-groups.js +4 -0
  32. package/dist/cli/help-groups.js.map +1 -1
  33. package/dist/cli/parser.js +5 -0
  34. package/dist/cli/parser.js.map +1 -1
  35. package/dist/domain/flow/authority.js +4 -0
  36. package/dist/domain/flow/authority.js.map +1 -1
  37. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  // The history file path itself is resolved by callers via
2
2
  // `PathsService.cwdHistoryFile()` and passed in.
3
3
  import { join } from "node:path";
4
+ import { localDateIso } from "./dates.js";
4
5
  // Slim 4-column table: `Sesión` (row key — the `NNN-<slug>-<flow>` folder
5
6
  // identity), `Fecha`, `Estado`, `Refs`. The legacy `#`/`Flujo`/`Resumen`
6
7
  // columns were derivable or dead ("#" = the Sesión prefix, "Flujo" always "—",
@@ -9,6 +10,18 @@ import { join } from "node:path";
9
10
  const HISTORY_TEMPLATE = "# Session History\n\n" +
10
11
  "| Sesión | Fecha | Estado | Refs |\n" +
11
12
  "|--------|-------|--------|------|\n";
13
+ /** How many data cells a row of the current shape has. */
14
+ const SLIM_COLUMNS = 4;
15
+ /**
16
+ * Where a rewrite parks the bytes it cannot carry into the current shape.
17
+ *
18
+ * The slim table has no column for `Flujo` or `Resumen`, and the render of
19
+ * `HISTORY.md` is a frozen contract — so a legacy row whose dropped columns
20
+ * carried real prose has nowhere to go INSIDE the record. Copying the file
21
+ * verbatim beside it is the only preservation that changes not one emitted
22
+ * byte, and the name is its own explanation to whoever finds it.
23
+ */
24
+ const LEGACY_SNAPSHOT = "HISTORY.legacy.md";
12
25
  export async function ensureHistoryFile(fs, path) {
13
26
  if (await fs.exists(path))
14
27
  return;
@@ -35,6 +48,15 @@ function headerCells(text) {
35
48
  function isLegacyHeader(cells) {
36
49
  return cells.includes("#") || cells.includes("flujo") || cells.includes("resumen");
37
50
  }
51
+ /** The data cells of a markdown row, with the outer pipes removed. */
52
+ function dataCells(line) {
53
+ const inner = line.trim().replace(/^\|/, "").replace(/\|$/, "");
54
+ return inner.split("|").map((c) => c.trim());
55
+ }
56
+ /** A cell nobody wrote anything into: the migration may drop it without loss. */
57
+ function isEmptyCell(value) {
58
+ return value === "" || value === "—" || value === "-";
59
+ }
38
60
  /**
39
61
  * Rewrite a legacy table (7-col `# | Flujo | Sesión | …` or 6-col without
40
62
  * Flujo) into the slim 4-col shape, mapping every data row by header index:
@@ -48,22 +70,21 @@ function isLegacyHeader(cells) {
48
70
  * separator row, or the Sesión column is missing) — the caller then leaves the
49
71
  * file as-is and falls back to append-only. HISTORY.md is the workspace's
50
72
  * durable git-tracked record: never rewrite what we cannot parse.
73
+ *
74
+ * `lossy` is the second half of that promise: the dropped columns are reported
75
+ * when they carried content, so the caller can preserve the previous bytes
76
+ * before the rewrite lands.
51
77
  */
52
78
  function migrateLegacyTable(text, cells) {
53
- const idx = (name) => cells.indexOf(name);
54
- const iCode = idx("#");
55
- const iSesion = idx("sesión") !== -1 ? idx("sesión") : idx("sesion");
56
- const iFecha = idx("fecha");
57
- const iEstado = idx("estado");
58
- const iRefs = idx("refs");
59
- if (iSesion === -1 && iCode === -1)
79
+ const columns = legacyColumns(cells);
80
+ if (columns === null)
60
81
  return null; // no row key → unmappable
61
82
  const out = [];
62
83
  let headerDone = false;
63
84
  let tableClosed = false;
85
+ let lossy = false;
64
86
  for (const line of text.split("\n")) {
65
- const trimmed = line.trim();
66
- const isPipeLine = trimmed.startsWith("|");
87
+ const isPipeLine = line.trim().startsWith("|");
67
88
  if (headerDone && !tableClosed && !isPipeLine) {
68
89
  tableClosed = true; // the history table ended — everything below is verbatim
69
90
  }
@@ -73,29 +94,59 @@ function migrateLegacyTable(text, cells) {
73
94
  }
74
95
  if (!headerDone) {
75
96
  // Header + separator collapse into the slim template's pair.
76
- if (/^\|[\s|:-]+\|?$/.test(trimmed)) {
97
+ if (isSeparator(line)) {
77
98
  headerDone = true;
78
99
  out.push("| Sesión | Fecha | Estado | Refs |");
79
100
  out.push("|--------|-------|--------|------|");
80
101
  }
81
102
  continue;
82
103
  }
83
- const parts = line.split("|").map((c) => c.trim());
84
- // `| a | b |` splits into ["", "a", "b", ""] — data cells start at 1.
85
- const cell = (i) => (i >= 0 ? (parts[i + 1] ?? "") : "");
86
- const code = cell(iCode);
87
- const sesion = cell(iSesion);
88
- out.push(buildRow({
89
- code: code || sesion,
90
- sesionName: sesion || code,
91
- date: cell(iFecha),
92
- state: cell(iEstado),
93
- refs: cell(iRefs) || "—",
94
- }));
104
+ const mapped = migrateLegacyRow(line, columns);
105
+ if (mapped.lossy)
106
+ lossy = true;
107
+ out.push(mapped.row);
95
108
  }
96
109
  if (!headerDone)
97
110
  return null; // separator never matched → do not touch the file
98
- return out.join("\n");
111
+ return { text: out.join("\n"), lossy };
112
+ }
113
+ /** Where each legacy column sits, or `null` when the table carries no row key. */
114
+ function legacyColumns(cells) {
115
+ const idx = (name) => cells.indexOf(name);
116
+ const code = idx("#");
117
+ const sesion = idx("sesión") !== -1 ? idx("sesión") : idx("sesion");
118
+ if (sesion === -1 && code === -1)
119
+ return null;
120
+ return {
121
+ code,
122
+ sesion,
123
+ fecha: idx("fecha"),
124
+ estado: idx("estado"),
125
+ refs: idx("refs"),
126
+ flujo: idx("flujo"),
127
+ resumen: idx("resumen"),
128
+ };
129
+ }
130
+ function isSeparator(line) {
131
+ return /^\|[\s|:-]+\|?$/.test(line.trim());
132
+ }
133
+ /** One legacy row in the current shape, and whether mapping it dropped content. */
134
+ function migrateLegacyRow(line, columns) {
135
+ const parts = line.split("|").map((c) => c.trim());
136
+ // `| a | b |` splits into ["", "a", "b", ""] — data cells start at 1.
137
+ const cell = (i) => (i >= 0 ? (parts[i + 1] ?? "") : "");
138
+ const code = cell(columns.code);
139
+ const sesion = cell(columns.sesion);
140
+ return {
141
+ row: buildRow({
142
+ code: code || sesion,
143
+ sesionName: sesion || code,
144
+ date: cell(columns.fecha),
145
+ state: cell(columns.estado),
146
+ refs: cell(columns.refs) || "—",
147
+ }),
148
+ lossy: !isEmptyCell(cell(columns.flujo)) || !isEmptyCell(cell(columns.resumen)),
149
+ };
99
150
  }
100
151
  /**
101
152
  * Highest session number the table has ever mentioned, or 0 when it mentions
@@ -134,46 +185,192 @@ export async function maxHistoryNumber(fs, historyFile) {
134
185
  }
135
186
  return max;
136
187
  }
137
- export async function upsertRow(fs, historyFile, code, buildNewRow) {
188
+ /**
189
+ * Every session the record remembers, whichever table shape holds it.
190
+ *
191
+ * Reading all the rows is not the same question as finding ONE of them, so it
192
+ * is not `findRow` — but it is the same table, so it goes through the same
193
+ * header mapping the migration uses: a legacy 7-column table answers here
194
+ * exactly as the slim one does, and no caller has to know which shape it got.
195
+ *
196
+ * Scoped to the FIRST table in the file, and for the same reason the rewrite is:
197
+ * a second markdown table further down is not the history.
198
+ */
199
+ export function readHistoryRows(text) {
200
+ const columns = legacyColumns(headerCells(text));
201
+ if (columns === null)
202
+ return [];
203
+ const rows = [];
204
+ let headerSeen = false;
205
+ for (const line of text.split("\n")) {
206
+ if (!line.trim().startsWith("|")) {
207
+ if (headerSeen)
208
+ break;
209
+ continue;
210
+ }
211
+ if (isSeparator(line))
212
+ continue;
213
+ if (!headerSeen) {
214
+ headerSeen = true; // the header row itself carries no session
215
+ continue;
216
+ }
217
+ rows.push(rowFrom(line, columns));
218
+ }
219
+ return rows;
220
+ }
221
+ function rowFrom(line, columns) {
222
+ const parts = line.split("|").map((c) => c.trim());
223
+ // `| a | b |` splits into ["", "a", "b", ""] — data cells start at 1.
224
+ const cell = (i) => (i >= 0 ? (parts[i + 1] ?? "") : "");
225
+ const code = cell(columns.code);
226
+ const sesion = cell(columns.sesion);
227
+ return {
228
+ key: rowKey(code || sesion, sesion || code),
229
+ date: cell(columns.fecha),
230
+ state: cell(columns.estado),
231
+ refs: cell(columns.refs),
232
+ };
233
+ }
234
+ /** The numeric identity a row key or a `--code` carries; `null` when it has none. */
235
+ function identityNumber(value) {
236
+ const m = value.match(/^(?:session)?(\d+)(?:-|$)/);
237
+ return m?.[1] === undefined ? null : Number.parseInt(m[1], 10);
238
+ }
239
+ /**
240
+ * Whether a row belongs to the session a caller named.
241
+ *
242
+ * Numeric identity first, and that is the whole point: one number is one
243
+ * session, so `047` names the same row as `047-algo-quick` AND as the legacy
244
+ * `session047-algo` — which is how closing a legacy folder used to APPEND a
245
+ * second row keyed differently instead of updating the one already there.
246
+ * Comparing as numbers rather than as strings keeps `100` off `1000-…`.
247
+ */
248
+ function rowMatches(firstCell, code) {
249
+ if (firstCell === code)
250
+ return true;
251
+ const wanted = identityNumber(code);
252
+ if (wanted !== null) {
253
+ const found = identityNumber(firstCell);
254
+ return found !== null && found === wanted;
255
+ }
256
+ return firstCell.startsWith(`${code}-`);
257
+ }
258
+ function findRow(lines, code) {
259
+ for (let index = 0; index < lines.length; index += 1) {
260
+ const line = lines[index] ?? "";
261
+ if (!line.trim().startsWith("|"))
262
+ continue;
263
+ const cells = dataCells(line);
264
+ if (!rowMatches(cells[0] ?? "", code))
265
+ continue;
266
+ return { index, line, cells };
267
+ }
268
+ return null;
269
+ }
270
+ /**
271
+ * The row to write: what the caller named, over what the table already says.
272
+ *
273
+ * The merge is the point. `session-close` without `--refs` names no references,
274
+ * and a row rebuilt from the caller alone wrote "—" over the ones a human had
275
+ * put there — an update of the state silently deleting a cell nobody mentioned.
276
+ * A cell is only ever rewritten by somebody who named it.
277
+ *
278
+ * Defaults apply to a row being BORN, never to one being updated: a session with
279
+ * no declared date gets today (the day its record was written) once, and every
280
+ * later upsert preserves it instead of re-dating it.
281
+ */
282
+ function mergeRow(row, existing) {
283
+ const previous = existing !== null && existing.cells.length === SLIM_COLUMNS ? existing.cells : [];
284
+ const key = row.sesionName !== undefined
285
+ ? rowKey(row.code, row.sesionName)
286
+ : (previous[0] ?? rowKey(row.code, undefined));
287
+ return `| ${key} | ${row.date ?? previous[1] ?? localDateIso(new Date())} | ${row.state} | ${row.refs ?? previous[3] ?? "—"} |`;
288
+ }
289
+ /**
290
+ * Put a new row INSIDE the table, right after its last row.
291
+ *
292
+ * Appending at the end of the FILE looked equivalent while HISTORY.md held
293
+ * nothing but its table; with any prose under it, every new session landed
294
+ * below that prose — orphan rows that still matched the row lookup, so the
295
+ * table stayed split in two forever. Falls back to the end of the file only
296
+ * when there is no table to insert into.
297
+ */
298
+ function insertIntoTable(lines, newRow) {
299
+ const out = [...lines];
300
+ const separator = out.findIndex((line) => /^\|[\s|:-]+\|?$/.test(line.trim()));
301
+ if (separator === -1) {
302
+ const tail = out[out.length - 1] === "" ? out.length - 1 : out.length;
303
+ out.splice(tail, 0, newRow);
304
+ if (out[out.length - 1] !== "")
305
+ out.push("");
306
+ return out.join("\n");
307
+ }
308
+ let end = separator;
309
+ while (end + 1 < out.length && (out[end + 1] ?? "").trim().startsWith("|"))
310
+ end += 1;
311
+ out.splice(end + 1, 0, newRow);
312
+ return out.join("\n");
313
+ }
314
+ /**
315
+ * Copy the record's previous bytes beside it, once.
316
+ *
317
+ * Only the FIRST snapshot holds the shape the current one no longer has room
318
+ * for, so an existing one is never overwritten — a second lossy rewrite would
319
+ * otherwise replace the original columns with an already-slimmed copy.
320
+ */
321
+ async function snapshotLegacy(fs, historyFile, previous) {
322
+ await fs.writeTextExclusive(join(historyFile, "..", LEGACY_SNAPSHOT), previous);
323
+ }
324
+ export async function upsertRow(fs, historyFile, row) {
325
+ // An empty code would make the identity match the separator row and rewrite
326
+ // the table's own header. Callers validate it upstream; this is the guard that
327
+ // says so instead of producing a corrupt file.
328
+ if (row.code.trim() === "")
329
+ throw new Error("upsertRow: code must not be empty");
138
330
  await ensureHistoryFile(fs, historyFile);
139
- let text = await fs.readText(historyFile);
140
- const cells = headerCells(text);
331
+ const previous = await fs.readText(historyFile);
332
+ let text = previous;
141
333
  let migrated = false;
334
+ let lossy = false;
335
+ const cells = headerCells(previous);
142
336
  if (isLegacyHeader(cells)) {
143
- const rewritten = migrateLegacyTable(text, cells);
337
+ const rewritten = migrateLegacyTable(previous, cells);
338
+ // Unmappable legacy table (hand-edited, no separator): leave it verbatim and
339
+ // append below it — losing rows would be worse than a mixed-shape table.
144
340
  if (rewritten !== null) {
145
- text = rewritten;
341
+ text = rewritten.text;
146
342
  migrated = true;
343
+ lossy = rewritten.lossy;
147
344
  }
148
- // Unmappable legacy table (hand-edited, no separator): leave it verbatim and
149
- // append below it — losing rows would be worse than a mixed-shape table.
150
345
  }
151
- const newRow = buildNewRow();
152
- // Match by the first cell: exactly the code, or the `NNN-<slug>-<flow>` key.
153
- // `code` is never empty (validated upstream); an empty one would let the
154
- // optional `-…` branch match the separator row.
155
- if (code.trim() === "")
156
- throw new Error("upsertRow: code must not be empty");
157
- const rowRegex = new RegExp(`^\\|\\s*${escapeRegex(code)}(-[^|]*)?\\s*\\|.*$`, "m");
158
- const existing = text.match(rowRegex);
159
- if (existing) {
160
- if (existing[0] === newRow) {
161
- if (migrated)
162
- await fs.writeText(historyFile, text); // persist the migration even when the row is unchanged
163
- return "unchanged";
164
- }
165
- const updated = text.replace(rowRegex, newRow);
166
- await fs.writeText(historyFile, updated);
167
- return "updated";
346
+ const lines = text.split("\n");
347
+ const existing = findRow(lines, row.code);
348
+ const merged = mergeRow(row, existing);
349
+ if (existing === null) {
350
+ if (lossy)
351
+ await snapshotLegacy(fs, historyFile, previous);
352
+ await fs.writeText(historyFile, insertIntoTable(lines, merged));
353
+ return "added";
354
+ }
355
+ if (existing.line === merged) {
356
+ if (migrated)
357
+ await persistMigration(fs, historyFile, previous, text, lossy);
358
+ return "unchanged";
168
359
  }
169
- let appended = text;
170
- if (!appended.endsWith("\n"))
171
- appended += "\n";
172
- appended += `${newRow}\n`;
173
- await fs.writeText(historyFile, appended);
174
- return "added";
175
- }
176
- function escapeRegex(s) {
177
- return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
360
+ // A matched row of a foreign shape (a legacy table nobody could migrate) is
361
+ // about to be replaced by a slim one: whatever its extra columns held is not
362
+ // representable here either.
363
+ if (lossy || existing.cells.length !== SLIM_COLUMNS) {
364
+ await snapshotLegacy(fs, historyFile, previous);
365
+ }
366
+ lines[existing.index] = merged;
367
+ await fs.writeText(historyFile, lines.join("\n"));
368
+ return "updated";
369
+ }
370
+ /** The migration still has to hit disk when the upserted row itself did not change. */
371
+ async function persistMigration(fs, historyFile, previous, migrated, lossy) {
372
+ if (lossy)
373
+ await snapshotLegacy(fs, historyFile, previous);
374
+ await fs.writeText(historyFile, migrated);
178
375
  }
179
376
  //# sourceMappingURL=history-table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"history-table.js","sourceRoot":"","sources":["../../src/application/history-table.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,iDAAiD;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,0EAA0E;AAC1E,yEAAyE;AACzE,+EAA+E;AAC/E,8EAA8E;AAC9E,gCAAgC;AAChC,MAAM,gBAAgB,GACpB,uBAAuB;IACvB,sCAAsC;IACtC,sCAAsC,CAAC;AAIzC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAkB,EAAE,IAAY;IACtE,IAAI,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO;IAClC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAClC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;AAC7C,CAAC;AAED,uFAAuF;AACvF,SAAS,MAAM,CAAC,IAAY,EAAE,UAA8B;IAC1D,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACpD,OAAO,UAAU,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,UAAU,EAAE,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAMxB;IACC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IACnD,OAAO,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,IAAI,IAAI,CAAC;AAC1E,CAAC;AAED,6EAA6E;AAC7E,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC3C,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,cAAc,CAAC,KAAe;IACrC,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACrF,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,kBAAkB,CAAC,IAAY,EAAE,KAAe;IACvD,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,0BAA0B;IAE3E,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,UAAU,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9C,WAAW,GAAG,IAAI,CAAC,CAAC,yDAAyD;QAC/E,CAAC;QACD,IAAI,WAAW,IAAI,CAAC,UAAU,EAAE,CAAC;YAC/B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,SAAS;QACX,CAAC;QACD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,6DAA6D;YAC7D,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpC,UAAU,GAAG,IAAI,CAAC;gBAClB,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;gBAC/C,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACjD,CAAC;YACD,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,sEAAsE;QACtE,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,GAAG,CAAC,IAAI,CACN,QAAQ,CAAC;YACP,IAAI,EAAE,IAAI,IAAI,MAAM;YACpB,UAAU,EAAE,MAAM,IAAI,IAAI;YAC1B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;YAClB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;YACpB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG;SACzB,CAAC,CACH,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC,CAAC,kDAAkD;IAChF,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAkB,EAAE,WAAmB;IAC5E,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAClD,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACtD,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAkB,EAClB,WAAmB,EACnB,IAAY,EACZ,WAAyB;IAEzB,MAAM,iBAAiB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IACzC,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,SAAS,CAAC;YACjB,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;QACD,6EAA6E;QAC7E,yEAAyE;IAC3E,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAE7B,6EAA6E;IAC7E,yEAAyE;IACzE,gDAAgD;IAChD,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,WAAW,WAAW,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;IACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,QAAQ;gBAAE,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,uDAAuD;YAC5G,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,QAAQ,IAAI,IAAI,CAAC;IAC/C,QAAQ,IAAI,GAAG,MAAM,IAAI,CAAC;IAC1B,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"history-table.js","sourceRoot":"","sources":["../../src/application/history-table.ts"],"names":[],"mappings":"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"}
@@ -1,43 +1,114 @@
1
- import { localDateIso } from "./dates.js";
2
- import { buildRow, upsertRow } from "./history-table.js";
1
+ import { readHistoryRows, upsertRow } from "./history-table.js";
3
2
  import { withCwdLock } from "./lock-service.js";
4
3
  import { renderRefs } from "./render/history-row.js";
5
- import { resolveSessionTarget } from "./session-resolver.js";
4
+ import { resolveSessionTarget, sessionNumericCode, sessionsSharingNumber, } from "./session-resolver.js";
6
5
  export async function runHistoryUpdate(fs, paths, input) {
7
6
  const validation = validate(input);
8
7
  if (validation)
9
8
  return validation;
10
9
  const code = input.code ?? "";
11
- // HISTORY is infrastructure: it records a row for a code even when the folder
12
- // is gone, and it NEVER establishes a conversation association (`bind` off).
10
+ // HISTORY is infrastructure and never establishes a conversation association
11
+ // (`bind` off) but it does need to know WHOSE row it is writing. An
12
+ // unresolved `--code 047` used to degrade the row key to `047` and invent a
13
+ // name from it, which rewrote the row of `047-algo-quick` — a different
14
+ // session — dropping its date and its references on the way.
15
+ //
16
+ // A live session answers that question; so does a row named whole, which is
17
+ // the only way left once the folder is gone. Anything else does not write.
13
18
  const resolution = await resolveSessionTarget(fs, paths, { code, allowClosed: true });
19
+ if (resolution.outcome !== "resolved" && !(await namesAnExistingRow(fs, paths, code))) {
20
+ return { sessionError: resolution };
21
+ }
14
22
  const session = resolution.outcome === "resolved" ? resolution.session : null;
15
- return withCwdLock(fs, paths, () => upsertHistoryRow(fs, paths, historyFields(input, session, code)));
23
+ // Asked here as well as inside the primitive, and on purpose: the primitive
24
+ // can only throw (its other caller holds the lock and reports the failure as
25
+ // its own), while a command has a result to return and a reader to inform.
26
+ const fields = historyFields(input, session, code);
27
+ const sharing = await sessionsSharingNumber(fs, paths, fields.code);
28
+ if (sharing.length > 1)
29
+ return { sessionError: sharedNumberError(fields.code, sharing) };
30
+ return withCwdLock(fs, paths, () => upsertHistoryRow(fs, paths, fields));
31
+ }
32
+ /**
33
+ * Whether `code` is, verbatim, the key of a row the record already holds.
34
+ *
35
+ * A session's FOLDER can be gone while its row is not, and repairing that row is
36
+ * exactly what this command is for: the close path tells its caller to re-run it
37
+ * after a `history_error`, and `discard` retires folders by design. Refusing
38
+ * every unresolved identity froze those rows with no way back.
39
+ *
40
+ * The test is EXACT and nothing weaker. A bare `047` matching `047-algo-quick`
41
+ * is how an update used to rewrite another session's row, degrading its key and
42
+ * dropping its date and references on the way; and a key the row-writer would
43
+ * rename on its way through is not the key being repaired either. Reaching a row
44
+ * whose folder is gone costs naming it whole — which the caller can read off the
45
+ * record it is repairing.
46
+ */
47
+ async function namesAnExistingRow(fs, paths, code) {
48
+ if (normalizeCode(code) !== code)
49
+ return false;
50
+ const historyFile = paths.cwdHistoryFile();
51
+ if (!(await fs.exists(historyFile)))
52
+ return false;
53
+ const rows = readHistoryRows(await fs.readText(historyFile));
54
+ return rows.some((row) => row.key === code);
55
+ }
56
+ /** The refusal a number two sessions answer to deserves, with both of them named. */
57
+ export function sharedNumberError(code, sharing) {
58
+ const folders = sharing.map((candidate) => candidate.folder);
59
+ return {
60
+ outcome: "error",
61
+ code: "SESSION_AMBIGUOUS",
62
+ message: `el número ${sessionNumericCode(code) ?? code} lo comparten ${sharing.length} carpetas y el registro se indexa por número: escribir la fila de una pisaría la de la otra`,
63
+ candidates: sharing,
64
+ action: `renombrá la carpeta legacy al modelo actual (\`NNN-<slug>\`) antes de registrar su fila: ${folders.join(", ")}`,
65
+ };
16
66
  }
17
67
  /**
18
68
  * Upsert the HISTORY.md row WITHOUT acquiring the workspace lock — for callers
19
69
  * that already hold it. `session-close` mutates the `.closed` marker, the
20
70
  * bindings registry and this row inside ONE lock boundary; going through the
21
71
  * public command instead would nest the acquisition.
72
+ *
73
+ * The shared-number guard lives HERE and not only in the command, because this
74
+ * is the primitive both write paths reach: a close whose number two folders
75
+ * answer to would otherwise rewrite the other session's row, and its caller
76
+ * reports the refusal as `history_error` instead of recording a lie.
22
77
  */
23
78
  export async function upsertHistoryRow(fs, paths, fields) {
24
- const action = await upsertRow(fs, paths.cwdHistoryFile(), fields.code, () => buildRow({
79
+ const sharing = await sessionsSharingNumber(fs, paths, fields.code);
80
+ if (sharing.length > 1)
81
+ throw new Error(sharedNumberError(fields.code, sharing).message);
82
+ const action = await upsertRow(fs, paths.cwdHistoryFile(), {
25
83
  code: fields.code,
26
- sesionName: fields.sesionName,
27
- date: fields.date,
84
+ ...(fields.sesionName !== undefined ? { sesionName: fields.sesionName } : {}),
85
+ ...(fields.date !== undefined ? { date: fields.date } : {}),
28
86
  state: fields.state,
29
- refs: renderRefs(fields.refs),
30
- }));
87
+ // Rendered only when the caller named it: `renderRefs(undefined)` is "—",
88
+ // and writing that over references somebody put there by hand is the very
89
+ // deletion this merge exists to stop.
90
+ ...(fields.refs !== undefined ? { refs: renderRefs(fields.refs) } : {}),
91
+ });
31
92
  // `flow` stays in the output shape for consumer compat; sessions carry no
32
93
  // flow segment anymore, so it is always null.
33
94
  return { code: fields.code, flow: null, action, state: fields.state };
34
95
  }
35
- /** Merge the caller's overrides with what the resolved session already knows. */
96
+ /**
97
+ * Merge the caller's overrides with what the resolved session already knows.
98
+ *
99
+ * What neither of them knows stays UNSAID rather than being filled in here: a
100
+ * name derived from the code alone becomes a row key, and a date defaulted to
101
+ * today becomes the session's recorded date — both of them facts about the
102
+ * command that ran, not about the session. Downstream, an unsaid cell keeps
103
+ * whatever the record already holds.
104
+ */
36
105
  export function historyFields(input, session, code) {
106
+ const sesionName = input.sesionName || session?.name;
107
+ const date = input.date || session?.date;
37
108
  return {
38
109
  code: normalizeCode(code),
39
- sesionName: input.sesionName || session?.name || code,
40
- date: input.date || session?.date || localDateIso(new Date()),
110
+ ...(sesionName !== undefined ? { sesionName } : {}),
111
+ ...(date !== undefined ? { date } : {}),
41
112
  state: input.state ?? "active",
42
113
  ...(input.refs !== undefined ? { refs: input.refs } : {}),
43
114
  };
@@ -1 +1 @@
1
- {"version":3,"file":"history-update-service.js","sourceRoot":"","sources":["../../src/application/history-update-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"history-update-service.js","sourceRoot":"","sources":["../../src/application/history-update-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAIL,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AA0B/B,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAkB,EAClB,KAAmB,EACnB,KAAyB;IAEzB,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAE9B,6EAA6E;IAC7E,sEAAsE;IACtE,4EAA4E;IAC5E,wEAAwE;IACxE,6DAA6D;IAC7D,EAAE;IACF,4EAA4E;IAC5E,2EAA2E;IAC3E,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACtF,IAAI,UAAU,CAAC,OAAO,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,kBAAkB,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;QACtF,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;IACtC,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9E,4EAA4E;IAC5E,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACpE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;IAEzF,OAAO,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,kBAAkB,CAC/B,EAAkB,EAClB,KAAmB,EACnB,IAAY;IAEZ,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;IAC3C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,OAA2B;IAE3B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7D,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,aAAa,kBAAkB,CAAC,IAAI,CAAC,IAAI,IAAI,iBAAiB,OAAO,CAAC,MAAM,6FAA6F;QAClL,UAAU,EAAE,OAAO;QACnB,MAAM,EAAE,4FAA4F,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACzH,CAAC;AACJ,CAAC;AAcD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAkB,EAClB,KAAmB,EACnB,MAAwB;IAExB,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACpE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;IAEzF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,cAAc,EAAE,EAAE;QACzD,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,0EAA0E;QAC1E,0EAA0E;QAC1E,sCAAsC;QACtC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxE,CAAC,CAAC;IACH,0EAA0E;IAC1E,8CAA8C;IAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AACxE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAyB,EACzB,OAA4B,EAC5B,IAAY;IAEZ,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,OAAO,EAAE,IAAI,CAAC;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,OAAO,EAAE,IAAI,CAAC;IACzC,OAAO;QACL,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC;QACzB,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,QAAQ;QAC9B,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAyB;IACzC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC;IACvF,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACzD,OAAO,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/F,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import { resolveSessionTarget, } from "./session-resolver.js";
2
- export async function resolveLifecycleTarget(fs, paths, options) {
2
+ export async function resolveLifecycleTarget(fs, paths, options, binding) {
3
3
  // `allowClosed` stays off: a lifecycle surface writes or restores state, and
4
4
  // a closed line is not a valid destination for either.
5
5
  const resolution = await resolveSessionTarget(fs, paths, {
6
6
  ...(options.code !== undefined ? { code: options.code } : {}),
7
7
  ...(options.contextId !== undefined ? { contextId: options.contextId } : {}),
8
- bind: true,
8
+ bind: binding === "bind",
9
9
  });
10
10
  if (resolution.outcome === "resolved") {
11
11
  return { outcome: "resolved", session: resolution.session };
@@ -1 +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"}
1
+ {"version":3,"file":"lifecycle-target.js","sourceRoot":"","sources":["../../src/application/lifecycle-target.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AA6C/B,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,EAAkB,EAClB,KAAmB,EACnB,OAAyB,EACzB,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,OAAO,KAAK,MAAM;KACzB,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"}
@@ -1,6 +1,6 @@
1
1
  import { projectRun } from "./flow/run-projection.js";
2
2
  import { buildSessionNarrative } from "./session-narrative.js";
3
- import { resolveSessionTarget } from "./session-resolver.js";
3
+ import { resolveSessionTarget, sessionReadRequest } from "./session-resolver.js";
4
4
  import { buildWorklineIndex, } from "./workline-index-service.js";
5
5
  export async function runResume(fs, env, paths, input = {}) {
6
6
  const index = await buildWorklineIndex(fs, env, paths, {
@@ -46,14 +46,7 @@ function resumeTarget(index, target) {
46
46
  return { status: "proposal", via: "explicit", proposal: first };
47
47
  }
48
48
  async function resumeSession(fs, paths, index, input) {
49
- // `bind: false` on purpose: this is a read. `sessionReadRequest` would record
50
- // the conversation→session association, and `resume` must not write.
51
- const resolution = await resolveSessionTarget(fs, paths, {
52
- ...(input.code !== undefined ? { code: input.code } : {}),
53
- ...(input.contextId !== undefined ? { contextId: input.contextId } : {}),
54
- allowClosed: true,
55
- bind: false,
56
- });
49
+ const resolution = await resolveSessionTarget(fs, paths, sessionReadRequest(input));
57
50
  if (resolution.outcome !== "resolved") {
58
51
  return {
59
52
  status: "invalid_target",