@su-record/vibe 4.2.35 → 4.2.37

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 (222) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/dist/cli/common.js +4 -1
  5. package/dist/cli/common.js.map +1 -1
  6. package/dist/cli/heldout.js +10 -4
  7. package/dist/cli/heldout.js.map +1 -1
  8. package/dist/cli/human.js +8 -4
  9. package/dist/cli/human.js.map +1 -1
  10. package/dist/cli/internal.js +37 -24
  11. package/dist/cli/internal.js.map +1 -1
  12. package/dist/cli/ledger.js +67 -0
  13. package/dist/cli/ledger.js.map +1 -0
  14. package/dist/cli/map.js +5 -3
  15. package/dist/cli/map.js.map +1 -1
  16. package/dist/cli/memory.js +104 -74
  17. package/dist/cli/memory.js.map +1 -1
  18. package/dist/cli/mutate.js +20 -0
  19. package/dist/cli/mutate.js.map +1 -0
  20. package/dist/cli/risks.js +20 -3
  21. package/dist/cli/risks.js.map +1 -1
  22. package/dist/cli/session.js +4 -2
  23. package/dist/cli/session.js.map +1 -1
  24. package/dist/cli/setup.js +44 -13
  25. package/dist/cli/setup.js.map +1 -1
  26. package/dist/cli/work.js +73 -21
  27. package/dist/cli/work.js.map +1 -1
  28. package/dist/cli.js +19 -6
  29. package/dist/cli.js.map +1 -1
  30. package/dist/core/analyze.js +21 -7
  31. package/dist/core/analyze.js.map +1 -1
  32. package/dist/core/artifact-paths.js +14 -3
  33. package/dist/core/artifact-paths.js.map +1 -1
  34. package/dist/core/capabilities.js +69 -15
  35. package/dist/core/capabilities.js.map +1 -1
  36. package/dist/core/check-authorization.js +37 -0
  37. package/dist/core/check-authorization.js.map +1 -0
  38. package/dist/core/check-process.js +12 -4
  39. package/dist/core/check-process.js.map +1 -1
  40. package/dist/core/check-report.js +66 -0
  41. package/dist/core/check-report.js.map +1 -0
  42. package/dist/core/check.js +59 -71
  43. package/dist/core/check.js.map +1 -1
  44. package/dist/core/checks/changed.js +20 -6
  45. package/dist/core/checks/changed.js.map +1 -1
  46. package/dist/core/checks/eval.js +35 -10
  47. package/dist/core/checks/eval.js.map +1 -1
  48. package/dist/core/checks/file.js +26 -23
  49. package/dist/core/checks/file.js.map +1 -1
  50. package/dist/core/checks/fileRules.js +42 -16
  51. package/dist/core/checks/fileRules.js.map +1 -1
  52. package/dist/core/checks/http.js +35 -34
  53. package/dist/core/checks/http.js.map +1 -1
  54. package/dist/core/checks/packs.js +1 -1
  55. package/dist/core/checks/packs.js.map +1 -1
  56. package/dist/core/checks/review.js +75 -40
  57. package/dist/core/checks/review.js.map +1 -1
  58. package/dist/core/checks/run.js +5 -2
  59. package/dist/core/checks/run.js.map +1 -1
  60. package/dist/core/checks/schema.js +25 -0
  61. package/dist/core/checks/schema.js.map +1 -0
  62. package/dist/core/checks/source.js +11 -6
  63. package/dist/core/checks/source.js.map +1 -1
  64. package/dist/core/config.js +9 -2
  65. package/dist/core/config.js.map +1 -1
  66. package/dist/core/consent.js +24 -16
  67. package/dist/core/consent.js.map +1 -1
  68. package/dist/core/context-notes.js +15 -7
  69. package/dist/core/context-notes.js.map +1 -1
  70. package/dist/core/context.js +24 -12
  71. package/dist/core/context.js.map +1 -1
  72. package/dist/core/conventions.js +22 -9
  73. package/dist/core/conventions.js.map +1 -1
  74. package/dist/core/docs/cfb.js +81 -45
  75. package/dist/core/docs/cfb.js.map +1 -1
  76. package/dist/core/docs/html.js +14 -3
  77. package/dist/core/docs/html.js.map +1 -1
  78. package/dist/core/docs/hwp.js +44 -22
  79. package/dist/core/docs/hwp.js.map +1 -1
  80. package/dist/core/docs/office.js +20 -10
  81. package/dist/core/docs/office.js.map +1 -1
  82. package/dist/core/docs/pdf.js +10 -4
  83. package/dist/core/docs/pdf.js.map +1 -1
  84. package/dist/core/docs/read.js +32 -24
  85. package/dist/core/docs/read.js.map +1 -1
  86. package/dist/core/docs/zip.js +32 -15
  87. package/dist/core/docs/zip.js.map +1 -1
  88. package/dist/core/evidence.js +17 -7
  89. package/dist/core/evidence.js.map +1 -1
  90. package/dist/core/failure-message.js +35 -13
  91. package/dist/core/failure-message.js.map +1 -1
  92. package/dist/core/failure.js +49 -14
  93. package/dist/core/failure.js.map +1 -1
  94. package/dist/core/github.js +3 -1
  95. package/dist/core/github.js.map +1 -1
  96. package/dist/core/handoff.js +20 -7
  97. package/dist/core/handoff.js.map +1 -1
  98. package/dist/core/heldout-run.js +6 -3
  99. package/dist/core/heldout-run.js.map +1 -1
  100. package/dist/core/heldout.js +24 -13
  101. package/dist/core/heldout.js.map +1 -1
  102. package/dist/core/inbox.js +3 -1
  103. package/dist/core/inbox.js.map +1 -1
  104. package/dist/core/inputs.js +6 -3
  105. package/dist/core/inputs.js.map +1 -1
  106. package/dist/core/inspect.js +61 -20
  107. package/dist/core/inspect.js.map +1 -1
  108. package/dist/core/intent.js +35 -13
  109. package/dist/core/intent.js.map +1 -1
  110. package/dist/core/knowledge-find.js +31 -12
  111. package/dist/core/knowledge-find.js.map +1 -1
  112. package/dist/core/knowledge.js +22 -12
  113. package/dist/core/knowledge.js.map +1 -1
  114. package/dist/core/lang.js +5 -2
  115. package/dist/core/lang.js.map +1 -1
  116. package/dist/core/ledger.js +44 -20
  117. package/dist/core/ledger.js.map +1 -1
  118. package/dist/core/locations.js +12 -0
  119. package/dist/core/locations.js.map +1 -0
  120. package/dist/core/map/imports.js +20 -9
  121. package/dist/core/map/imports.js.map +1 -1
  122. package/dist/core/map/index.js +28 -13
  123. package/dist/core/map/index.js.map +1 -1
  124. package/dist/core/map/symbols.js +27 -12
  125. package/dist/core/map/symbols.js.map +1 -1
  126. package/dist/core/mutate.js +107 -0
  127. package/dist/core/mutate.js.map +1 -0
  128. package/dist/core/output-capture.js +7 -4
  129. package/dist/core/output-capture.js.map +1 -1
  130. package/dist/core/paths.js +2 -1
  131. package/dist/core/paths.js.map +1 -1
  132. package/dist/core/performance.js +43 -17
  133. package/dist/core/performance.js.map +1 -1
  134. package/dist/core/profile.js +6 -3
  135. package/dist/core/profile.js.map +1 -1
  136. package/dist/core/reader.js +32 -16
  137. package/dist/core/reader.js.map +1 -1
  138. package/dist/core/readerSession.js +34 -14
  139. package/dist/core/readerSession.js.map +1 -1
  140. package/dist/core/recent.js +20 -6
  141. package/dist/core/recent.js.map +1 -1
  142. package/dist/core/regress.js +21 -12
  143. package/dist/core/regress.js.map +1 -1
  144. package/dist/core/repair.js +22 -4
  145. package/dist/core/repair.js.map +1 -1
  146. package/dist/core/research-queries.js +85 -0
  147. package/dist/core/research-queries.js.map +1 -0
  148. package/dist/core/research.js +89 -88
  149. package/dist/core/research.js.map +1 -1
  150. package/dist/core/results.js +15 -6
  151. package/dist/core/results.js.map +1 -1
  152. package/dist/core/risk-signals.js +53 -15
  153. package/dist/core/risk-signals.js.map +1 -1
  154. package/dist/core/run-id.js +10 -6
  155. package/dist/core/run-id.js.map +1 -1
  156. package/dist/core/scenarios.js +91 -60
  157. package/dist/core/scenarios.js.map +1 -1
  158. package/dist/core/session.js +3 -2
  159. package/dist/core/session.js.map +1 -1
  160. package/dist/core/size.js +28 -8
  161. package/dist/core/size.js.map +1 -1
  162. package/dist/core/skills.js +66 -28
  163. package/dist/core/skills.js.map +1 -1
  164. package/dist/core/skillsmp.js +26 -12
  165. package/dist/core/skillsmp.js.map +1 -1
  166. package/dist/core/source-basis.js +21 -9
  167. package/dist/core/source-basis.js.map +1 -1
  168. package/dist/core/status.js +26 -13
  169. package/dist/core/status.js.map +1 -1
  170. package/dist/core/table.js +8 -1
  171. package/dist/core/table.js.map +1 -1
  172. package/dist/core/tokens.js +20 -10
  173. package/dist/core/tokens.js.map +1 -1
  174. package/dist/core/tree.js +26 -16
  175. package/dist/core/tree.js.map +1 -1
  176. package/dist/core/verification-plan.js +24 -8
  177. package/dist/core/verification-plan.js.map +1 -1
  178. package/dist/core/verification.js +14 -7
  179. package/dist/core/verification.js.map +1 -1
  180. package/dist/core/view.js +93 -44
  181. package/dist/core/view.js.map +1 -1
  182. package/dist/install/global.js +37 -18
  183. package/dist/install/global.js.map +1 -1
  184. package/dist/install/hooks.js +17 -8
  185. package/dist/install/hooks.js.map +1 -1
  186. package/dist/install/manifest.js +11 -0
  187. package/dist/install/manifest.js.map +1 -0
  188. package/dist/install/mcpb.js +52 -23
  189. package/dist/install/mcpb.js.map +1 -1
  190. package/dist/install/plugin.js +73 -33
  191. package/dist/install/plugin.js.map +1 -1
  192. package/dist/install/project.js +8 -7
  193. package/dist/install/project.js.map +1 -1
  194. package/dist/install/register.js +83 -48
  195. package/dist/install/register.js.map +1 -1
  196. package/dist/install/tree.js +27 -11
  197. package/dist/install/tree.js.map +1 -1
  198. package/dist/install/update.js +46 -20
  199. package/dist/install/update.js.map +1 -1
  200. package/hooks/code-map.cjs +22 -9
  201. package/hooks/journal.cjs +18 -16
  202. package/hooks/knowledge-auto.cjs +55 -21
  203. package/hooks/knowledge-journal.cjs +47 -20
  204. package/hooks/knowledge-projects.cjs +50 -21
  205. package/hooks/knowledge-recall.cjs +16 -6
  206. package/hooks/knowledge-upkeep.cjs +22 -5
  207. package/hooks/locations.cjs +35 -0
  208. package/hooks/notify.js +52 -24
  209. package/hooks/obsidian.cjs +17 -7
  210. package/hooks/private-store.cjs +25 -10
  211. package/hooks/retest.cjs +39 -16
  212. package/hooks/session-context.cjs +30 -13
  213. package/hooks/session-files.cjs +44 -21
  214. package/hooks/session-repair.cjs +26 -11
  215. package/hooks/session-state.cjs +78 -38
  216. package/hooks/session.js +19 -8
  217. package/hooks/slice-command.cjs +38 -17
  218. package/hooks/slice-guard.cjs +20 -6
  219. package/hooks/slice-store.cjs +25 -12
  220. package/internal/guides/code.md +2 -0
  221. package/mcpb/server/index.js +40 -12
  222. package/package.json +1 -1
@@ -1,10 +1,16 @@
1
1
  import { spawnSync } from 'node:child_process';
2
2
  import zlib from 'node:zlib';
3
+ const PDFTOTEXT_TIMEOUT_MS = 60_000;
4
+ /** How far before a stream the dictionary is searched for its /FlateDecode filter. */
5
+ const STREAM_DICT_LOOKBACK_CHARS = 400;
6
+ /** A TJ kerning adjustment below this (thousandths of an em) is a word space. */
7
+ const WORD_GAP_KERNING = -200;
8
+ const PAGE_BREAK = '\f';
3
9
  function viaPdftotext(file) {
4
- const r = spawnSync('pdftotext', ['-layout', file, '-'], { encoding: 'utf-8', timeout: 60_000 });
10
+ const r = spawnSync('pdftotext', ['-layout', file, '-'], { encoding: 'utf-8', timeout: PDFTOTEXT_TIMEOUT_MS });
5
11
  if (r.status !== 0)
6
12
  return null;
7
- return r.stdout.split('\f').map((p) => p.trimEnd()).filter((p, i, all) => p.trim() || i < all.length - 1);
13
+ return r.stdout.split(PAGE_BREAK).map((p) => p.trimEnd()).filter((p, i, all) => p.trim() || i < all.length - 1);
8
14
  }
9
15
  function pdfString(raw) {
10
16
  return raw.replace(/\\([nrtbf()\\]|[0-7]{1,3})/g, (_, e) => {
@@ -34,7 +40,7 @@ function textFromStream(content) {
34
40
  for (const s of m[2].matchAll(/\(((?:\\.|[^\\)])*)\)|(-?\d+(?:\.\d+)?)/g)) {
35
41
  if (s[1] !== undefined)
36
42
  out += pdfString(s[1]);
37
- else if (Number(s[2]) < -200)
43
+ else if (Number(s[2]) < WORD_GAP_KERNING)
38
44
  out += ' ';
39
45
  }
40
46
  }
@@ -49,7 +55,7 @@ function builtin(buf) {
49
55
  const re = /stream\r?\n([\s\S]*?)\r?\nendstream/g;
50
56
  let current = '';
51
57
  for (const m of latin.matchAll(re)) {
52
- const head = latin.slice(Math.max(0, m.index - 400), m.index);
58
+ const head = latin.slice(Math.max(0, m.index - STREAM_DICT_LOOKBACK_CHARS), m.index);
53
59
  let content;
54
60
  try {
55
61
  content = /\/FlateDecode/.test(head) ? zlib.inflateSync(Buffer.from(m[1], 'latin1')).toString('latin1') : m[1];
@@ -1 +1 @@
1
- {"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../../src/core/docs/pdf.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../../src/core/docs/pdf.ts"],"names":[],"mappings":"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"}
@@ -7,23 +7,21 @@ import { readHwp, readHwpx } from './hwp.js';
7
7
  import { readDocx, readPptx, readXlsx } from './office.js';
8
8
  import { readPdf } from './pdf.js';
9
9
  const DEFAULT_MAX_CHARS = 60_000;
10
+ const DEFAULT_TABLE_MAX_ROWS = 50;
11
+ const OFFICE_XML = 'office-xml';
12
+ const ERROR_EXIT_CODE_KEY = 'exitCode';
13
+ const EXTENSION_FORMAT = {
14
+ xlsx: 'xlsx', xlsm: 'xlsx', xltx: 'xlsx',
15
+ docx: 'docx', dotx: 'docx',
16
+ pptx: 'pptx', potx: 'pptx',
17
+ pdf: 'pdf',
18
+ hwpx: 'hwpx',
19
+ hwp: 'hwp',
20
+ html: 'html', htm: 'html',
21
+ };
10
22
  export function docFormatOf(file) {
11
23
  const ext = path.extname(file).toLowerCase().slice(1);
12
- if (ext === 'xlsx' || ext === 'xlsm' || ext === 'xltx')
13
- return 'xlsx';
14
- if (ext === 'docx' || ext === 'dotx')
15
- return 'docx';
16
- if (ext === 'pptx' || ext === 'potx')
17
- return 'pptx';
18
- if (ext === 'pdf')
19
- return 'pdf';
20
- if (ext === 'hwpx')
21
- return 'hwpx';
22
- if (ext === 'hwp')
23
- return 'hwp';
24
- if (ext === 'html' || ext === 'htm')
25
- return 'html';
26
- return formatOf(file) ?? 'text';
24
+ return EXTENSION_FORMAT[ext] ?? formatOf(file) ?? 'text';
27
25
  }
28
26
  function cellText(c) {
29
27
  return c === null ? '' : String(c);
@@ -31,12 +29,15 @@ function cellText(c) {
31
29
  export function sheetToTable(sheet) {
32
30
  const [head = [], ...rest] = sheet.rows;
33
31
  const columns = head.map((h, i) => (cellText(h).trim() || `col${i + 1}`));
34
- const rows = rest.filter((r) => r.some((c) => c !== null && c !== '')).map((r) => Object.fromEntries(columns.map((c, i) => [c, (r[i] ?? null)])));
32
+ const rows = rest
33
+ .filter((r) => r.some((c) => c !== null && c !== ''))
34
+ .map((r) => Object.fromEntries(columns.map((c, i) => [c, (r[i] ?? null)])));
35
35
  return { format: 'csv', columns, rows };
36
36
  }
37
- export function tableMarkdown(table, maxRows = 50) {
37
+ export function tableMarkdown(table, maxRows = DEFAULT_TABLE_MAX_ROWS) {
38
38
  const line = (cells) => `| ${cells.map((c) => c.replace(/\|/g, '\\|')).join(' | ')} |`;
39
- const out = [line(table.columns), line(table.columns.map(() => '---')), ...table.rows.slice(0, maxRows).map((r) => line(table.columns.map((c) => cellText(r[c] ?? null))))];
39
+ const body = table.rows.slice(0, maxRows).map((r) => line(table.columns.map((c) => cellText(r[c] ?? null))));
40
+ const out = [line(table.columns), line(table.columns.map(() => '---')), ...body];
40
41
  if (table.rows.length > maxRows)
41
42
  out.push(`| … ${table.rows.length - maxRows} more rows |`);
42
43
  return out.join('\n');
@@ -56,15 +57,22 @@ function sections(file, format, buf, options) {
56
57
  const sheets = readXlsx(buf).filter((s) => !options.sheet || s.name === options.sheet);
57
58
  if (options.sheet && sheets.length === 0)
58
59
  throw usage(`no sheet named ${options.sheet}`);
59
- return { method: 'office-xml', sections: sheets.map((s) => ({ title: s.name, table: sheetToTable(s), text: tableMarkdown(sheetToTable(s)) })) };
60
+ const sheetSections = sheets.map((s) => {
61
+ const table = sheetToTable(s);
62
+ return { title: s.name, table, text: tableMarkdown(table) };
63
+ });
64
+ return { method: OFFICE_XML, sections: sheetSections };
65
+ }
66
+ if (format === 'docx') {
67
+ const blocks = readDocx(buf).map((b, i) => ({ title: b.kind === 'table' ? `table ${i + 1}` : `¶${i + 1}`, text: b.text }));
68
+ return { method: OFFICE_XML, sections: blocks };
60
69
  }
61
- if (format === 'docx')
62
- return { method: 'office-xml', sections: readDocx(buf).map((b, i) => ({ title: b.kind === 'table' ? `table ${i + 1}` : `¶${i + 1}`, text: b.text })) };
63
70
  if (format === 'pptx')
64
- return { method: 'office-xml', sections: readPptx(buf).map((s) => ({ title: `slide ${s.slide}`, text: s.text })) };
71
+ return { method: OFFICE_XML, sections: readPptx(buf).map((s) => ({ title: `slide ${s.slide}`, text: s.text })) };
65
72
  if (format === 'pdf') {
66
73
  const pdf = readPdf(file, buf);
67
- return { method: pdf.method, sections: pageRange(options.pages, pdf.pages.length).map((i) => ({ title: `page ${i + 1}`, text: pdf.pages[i] ?? '' })) };
74
+ const pages = pageRange(options.pages, pdf.pages.length).map((i) => ({ title: `page ${i + 1}`, text: pdf.pages[i] ?? '' }));
75
+ return { method: pdf.method, sections: pages };
68
76
  }
69
77
  if (format === 'hwpx')
70
78
  return { method: 'owpml', sections: readHwpx(buf).map((t, i) => ({ title: `¶${i + 1}`, text: t })) };
@@ -94,7 +102,7 @@ export function readDocument(root, file, options = {}) {
94
102
  parsed = sections(target, format, buf, options);
95
103
  }
96
104
  catch (error) {
97
- if (error.exitCode)
105
+ if (error[ERROR_EXIT_CODE_KEY])
98
106
  throw error;
99
107
  throw usage(`cannot parse ${file} as ${format}: ${error.message}`);
100
108
  }
@@ -1 +1 @@
1
- {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/core/docs/read.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/core/docs/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAyB,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAc,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AA8BnC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACjC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAClC,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAEvC,MAAM,gBAAgB,GAA8B;IAClD,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IACxC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAC1B,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAC1B,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;CAC1B,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtD,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;AAC3D,CAAC;AAED,SAAS,QAAQ,CAAC,CAAO;IACvB,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,IAAI;SACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SACpD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAY,EAAE,OAAO,GAAG,sBAAsB;IAC1E,MAAM,IAAI,GAAG,CAAC,KAAe,EAAU,EAAE,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzG,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7G,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACjF,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO;QAAE,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,cAAc,CAAC,CAAC;IAC5F,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,SAAS,CAAC,IAAwB,EAAE,KAAa;IACxD,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,CAAC;QAAE,MAAM,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,MAAiB,EAAE,GAAW,EAAE,OAAoB;IAClF,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;QACvF,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,KAAK,CAAC,kBAAkB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzF,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9B,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3H,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;IACxI,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5H,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC5H,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACzH,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACpI,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;IAC3H,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IACxD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AAC5G,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAAY,EAAE,UAAuB,EAAE;IAChF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,MAAM,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,CAAC,eAAe,IAAI,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,MAA+C,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,mBAAmB,CAAC;YAAE,MAAM,KAAK,CAAC;QACvE,MAAM,KAAK,CAAC,gBAAgB,IAAI,OAAO,MAAM,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,iBAAiB,CAAC;IAClD,IAAI,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;IACpC,IAAI,SAAS;QAAE,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,oBAAoB,GAAG,sCAAsC,CAAC;IACzG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC7F,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,KAAc;IACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,MAAM;QAAE,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC;IAC3F,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
@@ -1,28 +1,45 @@
1
1
  import zlib from 'node:zlib';
2
+ /** Zip record signatures and the field offsets inside them (PKWARE APPNOTE 4.3). */
3
+ const EOCD_SIGNATURE = 0x06054b50;
4
+ const EOCD_MIN_BYTES = 22;
5
+ const EOCD_ENTRY_COUNT_AT = 10;
6
+ const EOCD_DIR_OFFSET_AT = 16;
7
+ const CENTRAL_SIGNATURE = 0x02014b50;
8
+ const CENTRAL_HEADER_BYTES = 46;
9
+ const CENTRAL_METHOD_AT = 10;
10
+ const CENTRAL_SIZE_AT = 20;
11
+ const CENTRAL_NAME_LEN_AT = 28;
12
+ const CENTRAL_EXTRA_LEN_AT = 30;
13
+ const CENTRAL_COMMENT_LEN_AT = 32;
14
+ const CENTRAL_LOCAL_OFFSET_AT = 42;
15
+ const LOCAL_HEADER_BYTES = 30;
16
+ const LOCAL_NAME_LEN_AT = 26;
17
+ const LOCAL_EXTRA_LEN_AT = 28;
18
+ const METHOD_DEFLATE = 8;
2
19
  /** Read a zip (Office files are zips): central directory → entries; store and deflate only. No dependency. */
3
20
  export function readZip(buf) {
4
21
  const out = new Map();
5
- let eocd = buf.length - 22;
6
- while (eocd >= 0 && buf.readUInt32LE(eocd) !== 0x06054b50)
22
+ let eocd = buf.length - EOCD_MIN_BYTES;
23
+ while (eocd >= 0 && buf.readUInt32LE(eocd) !== EOCD_SIGNATURE)
7
24
  eocd -= 1;
8
25
  if (eocd < 0)
9
26
  throw new Error('not a zip file');
10
- const count = buf.readUInt16LE(eocd + 10);
11
- let p = buf.readUInt32LE(eocd + 16);
27
+ const count = buf.readUInt16LE(eocd + EOCD_ENTRY_COUNT_AT);
28
+ let p = buf.readUInt32LE(eocd + EOCD_DIR_OFFSET_AT);
12
29
  for (let i = 0; i < count; i += 1) {
13
- if (buf.readUInt32LE(p) !== 0x02014b50)
30
+ if (buf.readUInt32LE(p) !== CENTRAL_SIGNATURE)
14
31
  break;
15
- const method = buf.readUInt16LE(p + 10);
16
- const size = buf.readUInt32LE(p + 20);
17
- const nameLen = buf.readUInt16LE(p + 28);
18
- const extraLen = buf.readUInt16LE(p + 30);
19
- const commentLen = buf.readUInt16LE(p + 32);
20
- const local = buf.readUInt32LE(p + 42);
21
- const name = buf.subarray(p + 46, p + 46 + nameLen).toString('utf-8');
22
- const dataStart = local + 30 + buf.readUInt16LE(local + 26) + buf.readUInt16LE(local + 28);
32
+ const method = buf.readUInt16LE(p + CENTRAL_METHOD_AT);
33
+ const size = buf.readUInt32LE(p + CENTRAL_SIZE_AT);
34
+ const nameLen = buf.readUInt16LE(p + CENTRAL_NAME_LEN_AT);
35
+ const extraLen = buf.readUInt16LE(p + CENTRAL_EXTRA_LEN_AT);
36
+ const commentLen = buf.readUInt16LE(p + CENTRAL_COMMENT_LEN_AT);
37
+ const local = buf.readUInt32LE(p + CENTRAL_LOCAL_OFFSET_AT);
38
+ const name = buf.subarray(p + CENTRAL_HEADER_BYTES, p + CENTRAL_HEADER_BYTES + nameLen).toString('utf-8');
39
+ const dataStart = local + LOCAL_HEADER_BYTES + buf.readUInt16LE(local + LOCAL_NAME_LEN_AT) + buf.readUInt16LE(local + LOCAL_EXTRA_LEN_AT);
23
40
  const raw = buf.subarray(dataStart, dataStart + size);
24
- out.set(name, method === 8 ? zlib.inflateRawSync(raw) : raw);
25
- p += 46 + nameLen + extraLen + commentLen;
41
+ out.set(name, method === METHOD_DEFLATE ? zlib.inflateRawSync(raw) : raw);
42
+ p += CENTRAL_HEADER_BYTES + nameLen + extraLen + commentLen;
26
43
  }
27
44
  return out;
28
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"zip.js","sourceRoot":"","sources":["../../../src/core/docs/zip.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,8GAA8G;AAC9G,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAC3B,OAAO,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,UAAU;QAAE,IAAI,IAAI,CAAC,CAAC;IACrE,IAAI,IAAI,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,UAAU;YAAE,MAAM;QAC9C,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtE,MAAM,SAAS,GAAG,KAAK,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAC3F,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC;QACtD,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7D,CAAC,IAAI,EAAE,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"zip.js","sourceRoot":"","sources":["../../../src/core/docs/zip.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,24 @@
1
1
  import { createHash, randomBytes } from 'node:crypto';
2
2
  import { CAPTURE_LIMIT } from './output-capture.js';
3
3
  import { writePrivate } from './private-store.js';
4
- export function safeText(value, limit = 12_000) {
5
- return value.slice(0, limit).replace(/[\u0000-\u0008\u000b-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/g, (char) => `\\u${char.charCodeAt(0).toString(16).padStart(4, '0')}`);
4
+ const SAFE_TEXT_LIMIT = 12_000;
5
+ const DIAGNOSTIC_SCHEMA_VERSION = 1;
6
+ /** A run's evidence lists at most this many results when rendered. */
7
+ const MAX_RENDERED_RESULTS = 1000;
8
+ const DIAGNOSTIC_RANDOM_BYTES = 8;
9
+ /** The result fields `renderEvidence` passes through; anything else is dropped. */
10
+ const RENDERED_FIELDS = [
11
+ 'id', 'type', 'status', 'exit', 'signal', 'ms', 'blockedBy', 'regression', 'failureCode', 'failure', 'capture',
12
+ 'artifacts', 'executionContext', 'evidenceId', 'sources', 'usage', 'cleanupUncertain',
13
+ ];
14
+ const CONTROL_CHARS = /[\u0000-\u0008\u000b-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/g;
15
+ export function safeText(value, limit = SAFE_TEXT_LIMIT) {
16
+ return value.slice(0, limit).replace(CONTROL_CHARS, (char) => `\\u${char.charCodeAt(0).toString(16).padStart(4, '0')}`);
6
17
  }
7
18
  export function diagnosticFile(root, run, id, result) {
8
19
  const raw = result.raw ?? { stdout: Buffer.from(result.tail), stderr: Buffer.alloc(0) };
9
- const name = `diagnostic-${run}-${id}-${randomBytes(8).toString('hex')}.json`;
10
- return writePrivate(root, name, JSON.stringify({ schemaVersion: 1, untrusted: true, run, scenario: id,
20
+ const name = `diagnostic-${run}-${id}-${randomBytes(DIAGNOSTIC_RANDOM_BYTES).toString('hex')}.json`;
21
+ return writePrivate(root, name, JSON.stringify({ schemaVersion: DIAGNOSTIC_SCHEMA_VERSION, untrusted: true, run, scenario: id,
11
22
  representation: result.raw ? 'original-bytes-base64' : 'adapter-diagnostic-text-base64',
12
23
  stdout: raw.stdout.subarray(0, CAPTURE_LIMIT).toString('base64'), stderr: raw.stderr.subarray(0, CAPTURE_LIMIT).toString('base64'),
13
24
  streams: Object.fromEntries(['stdout', 'stderr'].map((stream) => [stream, {
@@ -22,10 +33,9 @@ export function renderEvidence(value) {
22
33
  return { schema: 'invalid', results: [] };
23
34
  const evidence = value;
24
35
  const modern = evidence['schemaVersion'] === 2;
25
- const allowed = ['id', 'type', 'status', 'exit', 'signal', 'ms', 'blockedBy', 'regression', 'failureCode', 'failure', 'capture', 'artifacts', 'executionContext', 'evidenceId', 'sources', 'usage', 'cleanupUncertain'];
26
- const results = Array.isArray(evidence['results']) ? evidence['results'].slice(0, 1000).map((raw) => {
36
+ const results = Array.isArray(evidence['results']) ? evidence['results'].slice(0, MAX_RENDERED_RESULTS).map((raw) => {
27
37
  const result = { tail: '', output: modern ? 'raw output omitted' : 'legacy raw output hidden; not recollected' };
28
- for (const key of allowed)
38
+ for (const key of RENDERED_FIELDS)
29
39
  if (key in raw)
30
40
  result[key] = raw[key];
31
41
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/core/evidence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/core/evidence.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,45 @@
1
+ export const ANSI_ESCAPES = /\u001b\[[0-9;]*[a-zA-Z]/g;
2
+ /** The longest cause line kept. */
3
+ const MASKED_LINE_MAX = 200;
4
+ const SOURCE_LINE_GUTTER = /^(?:[>❯]\s*)?\d+\s*[|]/;
5
+ const SPECIFIC_LINE = /\bTS\d{4,5}\b|\berror\b|\w+Error:|\bfailed\b|\bFAIL\b|does not exist|\b(?:no-undef|no-unused-vars|@typescript-eslint\/[\w-]+)\b/i;
6
+ const COMPILER_OR_MISSING = /\bTS\d{4,5}\b|does not exist/i;
7
+ const ERROR_PREFIX = /^(?:[\w.]*Error|Error):/;
8
+ const TEST_SUMMARY_LINE = /^(?:Test Files|Tests|FAIL\s+\S+)\b/;
9
+ const CONTROL_CHARS = /[\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/g;
10
+ const EMAIL = /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi;
11
+ const URL_CREDENTIALS = /(https?:\/\/)[^\s/@]+:[^\s/@]+@/gi;
12
+ const URL_QUERY = /(https?:\/\/[^\s?"']+)\?[^\s"']*/gi;
13
+ const BEARER = /\b(Bearer)\s+[^\s"']+/gi;
14
+ const SECRET_KEY = String.raw `(["']?\b(?:api[_-]?key|access[_-]?token|token|secret|password|authorization)\b["']?\s*[:=]\s*)`;
15
+ const SECRET_VALUE = String.raw `(?:"(?:\\.|[^"\\])*(?:"|$)|'(?:\\.|[^'\\])*(?:'|$)|[^\s,;}"']+)`;
16
+ const SECRET_ASSIGNMENT = new RegExp(SECRET_KEY + SECRET_VALUE, 'gi');
17
+ const SECRET_PREFIX = /\b(?:sk-|gh[pousr]_|AKIA)[A-Za-z0-9_-]{8,}\b/g;
18
+ const ABSOLUTE_PATH = /(^|[\s("'])(?:[A-Za-z]:[\\/]|\/)[^\s"')]+/g;
19
+ const LONG_TOKEN = /\b[A-Za-z0-9+_=/-]{40,}\b/g;
1
20
  /** One explicitly retained diagnostic summary, not a transcript. Masking is best effort, not a secrecy guarantee. */
2
21
  export function failureMessage(text, root) {
3
- const lines = text.replace(/\u001b\[[0-9;]*[a-zA-Z]/g, '').split('\n').map((line) => line.trim()).filter(line => line && !/^(?:[>❯]\s*)?\d+\s*[|]/.test(line));
4
- const specific = lines.filter((line) => /\bTS\d{4,5}\b|\berror\b|\w+Error:|\bfailed\b|\bFAIL\b|does not exist|\b(?:no-undef|no-unused-vars|@typescript-eslint\/[\w-]+)\b/i.test(line));
5
- const selected = specific.find((line) => /\bTS\d{4,5}\b|does not exist/i.test(line)) ?? specific.find(line => /^(?:[\w.]*Error|Error):/.test(line)) ?? specific.filter((line) => !/^(?:Test Files|Tests|FAIL\s+\S+)\b/.test(line)).at(-1) ?? specific.at(-1);
22
+ const lines = text.replace(ANSI_ESCAPES, '').split('\n').map((line) => line.trim()).filter((line) => line && !SOURCE_LINE_GUTTER.test(line));
23
+ const specific = lines.filter((line) => SPECIFIC_LINE.test(line));
24
+ const selected = specific.find((line) => COMPILER_OR_MISSING.test(line))
25
+ ?? specific.find((line) => ERROR_PREFIX.test(line))
26
+ ?? specific.filter((line) => !TEST_SUMMARY_LINE.test(line)).at(-1)
27
+ ?? specific.at(-1);
6
28
  if (!selected)
7
29
  return null;
8
30
  return maskFailureLine(selected, root);
9
31
  }
10
32
  export function maskFailureLine(selected, root) {
11
33
  return selected.replaceAll(root + '/', '').replaceAll(root + '\\', '')
12
- .replace(/[\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/g, ' ')
13
- .replace(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi, '[email]')
14
- .replace(/(https?:\/\/)[^\s/@]+:[^\s/@]+@/gi, '$1[credentials]@')
15
- .replace(/(https?:\/\/[^\s?"']+)\?[^\s"']*/gi, '$1?[query]')
16
- .replace(/\b(Bearer)\s+[^\s"']+/gi, '$1 [redacted]')
17
- .replace(/(["']?\b(?:api[_-]?key|access[_-]?token|token|secret|password|authorization)\b["']?\s*[:=]\s*)(?:"(?:\\.|[^"\\])*(?:"|$)|'(?:\\.|[^'\\])*(?:'|$)|[^\s,;}"']+)/gi, '$1[redacted]')
18
- .replace(/\b(?:sk-|gh[pousr]_|AKIA)[A-Za-z0-9_-]{8,}\b/g, '[redacted]')
19
- .replace(/(^|[\s("'])(?:[A-Za-z]:[\\/]|\/)[^\s"')]+/g, '$1[path]')
20
- .replace(/\b[A-Za-z0-9+_=/-]{40,}\b/g, '[redacted]')
21
- .replace(/\s+/g, ' ').slice(0, 200);
34
+ .replace(CONTROL_CHARS, ' ')
35
+ .replace(EMAIL, '[email]')
36
+ .replace(URL_CREDENTIALS, '$1[credentials]@')
37
+ .replace(URL_QUERY, '$1?[query]')
38
+ .replace(BEARER, '$1 [redacted]')
39
+ .replace(SECRET_ASSIGNMENT, '$1[redacted]')
40
+ .replace(SECRET_PREFIX, '[redacted]')
41
+ .replace(ABSOLUTE_PATH, '$1[path]')
42
+ .replace(LONG_TOKEN, '[redacted]')
43
+ .replace(/\s+/g, ' ').slice(0, MASKED_LINE_MAX);
22
44
  }
23
45
  //# sourceMappingURL=failure-message.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"failure-message.js","sourceRoot":"","sources":["../../src/core/failure-message.ts"],"names":[],"mappings":"AAAA,qHAAqH;AACrH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAY;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/J,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kIAAkI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvL,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7P,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,IAAY;IAC5D,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC;SACnE,OAAO,CAAC,yDAAyD,EAAE,GAAG,CAAC;SACvE,OAAO,CAAC,6CAA6C,EAAE,SAAS,CAAC;SACjE,OAAO,CAAC,mCAAmC,EAAE,kBAAkB,CAAC;SAChE,OAAO,CAAC,oCAAoC,EAAE,YAAY,CAAC;SAC3D,OAAO,CAAC,yBAAyB,EAAE,eAAe,CAAC;SACnD,OAAO,CAAC,iKAAiK,EAAE,cAAc,CAAC;SAC1L,OAAO,CAAC,+CAA+C,EAAE,YAAY,CAAC;SACtE,OAAO,CAAC,4CAA4C,EAAE,UAAU,CAAC;SACjE,OAAO,CAAC,4BAA4B,EAAE,YAAY,CAAC;SACnD,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"failure-message.js","sourceRoot":"","sources":["../../src/core/failure-message.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,35 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { createHash } from 'node:crypto';
4
- import { failureMessage, maskFailureLine } from './failure-message.js';
4
+ import { ANSI_ESCAPES, failureMessage, maskFailureLine } from './failure-message.js';
5
5
  import { safeText } from './evidence.js';
6
- const code = (value) => value && /^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,63}$/.test(value) ? value : 'unclassified-failure';
6
+ const FAILURE_CODE = /^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,63}$/;
7
+ const UNCLASSIFIED = 'unclassified-failure';
8
+ const MAX_FILE_NAME = 240;
9
+ const MAX_TARGET = 240;
10
+ const MAX_LOCATIONS = 8;
11
+ const MAX_LOGS = 4;
12
+ /** The cause line is hashed from at most this many characters. */
13
+ const MAX_CAUSE_LINE = 1000;
14
+ const CAUSE_LINE = /\berror\b|\bfailed\b|\bTS\d{4,5}\b/i;
15
+ const DIAGNOSTIC_CODE = /\b(?:TS\d{4,5}|E(?:NOENT|ACCES|CONNREFUSED|TIMEDOUT))\b/;
16
+ const LOG_FILE = /[^\s"'<>]+\.log\b/g;
17
+ const SOURCE_EXTENSIONS = '[cm]?[jt]sx?|json|ya?ml|py|sh|cjs|md|sql';
18
+ /** `file:line[:col]` or the TypeScript `file(line,col)` form. */
19
+ const LOCATION = new RegExp(String.raw `((?:[A-Za-z]:)?[^\s"'()[\]<>]+?\.(?:${SOURCE_EXTENSIONS}))(?::(\d+)(?::\d+)?|\((\d+),\d+\))`, 'g');
20
+ const code = (value) => value && FAILURE_CODE.test(value) ? value : UNCLASSIFIED;
7
21
  export function checkTarget(scenario) {
8
22
  const check = scenario.check;
9
- return check.type === 'run' ? check.cmd : check.type === 'eval' ? check.runner : 'path' in check ? check.path : check.type === 'http' ? check.url : 'human confirmation';
23
+ if (check.type === 'run')
24
+ return check.cmd;
25
+ if (check.type === 'eval')
26
+ return check.runner;
27
+ if ('path' in check)
28
+ return check.path;
29
+ return check.type === 'http' ? check.url : 'human confirmation';
10
30
  }
11
31
  function projectFile(root, name) {
12
- if (name.length > 240 || /[\u0000-\u001f]/.test(name))
32
+ if (name.length > MAX_FILE_NAME || /[\u0000-\u001f]/.test(name))
13
33
  return null;
14
34
  const file = path.resolve(root, name), relative = path.relative(root, file);
15
35
  if (!relative || relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))
@@ -26,13 +46,12 @@ function projectFile(root, name) {
26
46
  }
27
47
  function locations(root, text) {
28
48
  const found = [];
29
- const pattern = /((?:[A-Za-z]:)?[^\s"'()[\]<>]+?\.(?:[cm]?[jt]sx?|json|ya?ml|py|sh|cjs|md|sql))(?::(\d+)(?::\d+)?|\((\d+),\d+\))/g;
30
- for (const match of text.matchAll(pattern)) {
49
+ for (const match of text.matchAll(LOCATION)) {
31
50
  const file = projectFile(root, match[1]);
32
51
  const line = Number(match[2] ?? match[3]);
33
52
  if (file && Number.isSafeInteger(line) && line > 0 && !found.some((item) => item.file === file))
34
53
  found.push({ file, line });
35
- if (found.length >= 8)
54
+ if (found.length >= MAX_LOCATIONS)
36
55
  break;
37
56
  }
38
57
  return found;
@@ -40,15 +59,31 @@ function locations(root, text) {
40
59
  /** Extract facts, fingerprints and one masked cause line. Process output never supplies procedure. */
41
60
  export function summarizeFailure(root, scenario, result) {
42
61
  const text = result.raw ? `${result.raw.stdout.toString('utf8')}\n${result.raw.stderr.toString('utf8')}` : result.tail;
43
- const clean = text.replace(/\u001b\[[0-9;]*[a-zA-Z]/g, '');
44
- const line = clean.split('\n').filter((item) => /\berror\b|\bfailed\b|\bTS\d{4,5}\b/i.test(item)).at(-1)?.trim().slice(0, 1000);
45
- const logs = [...new Set((clean.match(/[^\s"'<>]+\.log\b/g) ?? []).map((name) => projectFile(root, name)).filter((name) => name !== null))].slice(0, 4);
46
- return { id: scenario.id, target: safeText(maskFailureLine(checkTarget(scenario), root), 240), exit: result.exit, cause: code(result.failureCode),
47
- message: failureMessage(clean, root), diagnosticCode: clean.match(/\b(?:TS\d{4,5}|E(?:NOENT|ACCES|CONNREFUSED|TIMEDOUT))\b/)?.[0] ?? null,
48
- causeHash: line ? createHash('sha256').update(line).digest('hex') : null, locations: locations(root, clean), logs };
62
+ const clean = text.replace(ANSI_ESCAPES, '');
63
+ const line = clean.split('\n').filter((item) => CAUSE_LINE.test(item)).at(-1)?.trim().slice(0, MAX_CAUSE_LINE);
64
+ const logNames = (clean.match(LOG_FILE) ?? []).map((name) => projectFile(root, name));
65
+ const logs = [...new Set(logNames.filter((name) => name !== null))].slice(0, MAX_LOGS);
66
+ return {
67
+ id: scenario.id,
68
+ target: safeText(maskFailureLine(checkTarget(scenario), root), MAX_TARGET),
69
+ exit: result.exit,
70
+ cause: code(result.failureCode),
71
+ message: failureMessage(clean, root),
72
+ diagnosticCode: clean.match(DIAGNOSTIC_CODE)?.[0] ?? null,
73
+ causeHash: line ? createHash('sha256').update(line).digest('hex') : null,
74
+ locations: locations(root, clean),
75
+ logs,
76
+ };
49
77
  }
50
78
  export function failureLine(failure) {
51
79
  const at = failure.locations[0];
52
- return `${failure.id}: check=${JSON.stringify(failure.target)} exit=${failure.exit ?? 'none'} cause=${failure.cause}${failure.diagnosticCode ? `/${failure.diagnosticCode}` : ''}${failure.message ? ` message=${JSON.stringify(failure.message)}` : ''}${at ? ` at ${at.file}:${at.line}` : ''}${failure.logs.length ? ` logs=${failure.logs.join(',')}` : ''}`;
80
+ const parts = [
81
+ `${failure.id}: check=${JSON.stringify(failure.target)} exit=${failure.exit ?? 'none'}`,
82
+ ` cause=${failure.cause}${failure.diagnosticCode ? `/${failure.diagnosticCode}` : ''}`,
83
+ failure.message ? ` message=${JSON.stringify(failure.message)}` : '',
84
+ at ? ` at ${at.file}:${at.line}` : '',
85
+ failure.logs.length ? ` logs=${failure.logs.join(',')}` : '',
86
+ ];
87
+ return parts.join('');
53
88
  }
54
89
  //# sourceMappingURL=failure.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"failure.js","sourceRoot":"","sources":["../../src/core/failure.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"failure.js","sourceRoot":"","sources":["../../src/core/failure.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ import { spawnSync } from 'node:child_process';
2
2
  import { readJson } from './store.js';
3
3
  import { usage } from './errors.js';
4
4
  const API = 'https://api.github.com';
5
+ const ACCEPT = 'application/vnd.github+json';
6
+ const USER_AGENT = 'vibe-4';
5
7
  export function githubToken() {
6
8
  const env = process.env['GITHUB_TOKEN'] ?? process.env['GH_TOKEN'];
7
9
  if (env)
@@ -27,7 +29,7 @@ export function githubClient() {
27
29
  if (fixture)
28
30
  return fixtureClient(fixture);
29
31
  const token = githubToken();
30
- const headers = { accept: 'application/vnd.github+json', 'user-agent': 'vibe-4' };
32
+ const headers = { accept: ACCEPT, 'user-agent': USER_AGENT };
31
33
  if (token)
32
34
  headers['authorization'] = `Bearer ${token}`;
33
35
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/core/github.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAYpC,MAAM,GAAG,GAAG,wBAAwB,CAAC;AAErC,MAAM,UAAU,WAAW;IACzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACnE,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,QAAQ,CAA0B,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1D,OAAO;QACL,aAAa,EAAE,IAAI;QACnB,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE;YACf,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9F,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnD,IAAI,OAAO;QAAE,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,OAAO,GAA2B,EAAE,MAAM,EAAE,6BAA6B,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;IAC1G,IAAI,KAAK;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IACxD,OAAO;QACL,aAAa,EAAE,KAAK,KAAK,IAAI;QAC7B,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACrB,IAAI,QAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,GAAG,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,KAAK,CAAC,eAAgB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,KAAK,CAAC,UAAU,QAAQ,CAAC,MAAM,QAAQ,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxF,OAAO,QAAQ,CAAC,IAAI,EAAsB,CAAC;QAC7C,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/core/github.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAYpC,MAAM,GAAG,GAAG,wBAAwB,CAAC;AACrC,MAAM,MAAM,GAAG,6BAA6B,CAAC;AAC7C,MAAM,UAAU,GAAG,QAAQ,CAAC;AAE5B,MAAM,UAAU,WAAW;IACzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACnE,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,QAAQ,CAA0B,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1D,OAAO;QACL,aAAa,EAAE,IAAI;QACnB,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE;YACf,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9F,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnD,IAAI,OAAO;QAAE,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;IAC5B,MAAM,OAAO,GAA2B,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;IACrF,IAAI,KAAK;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IACxD,OAAO;QACL,aAAa,EAAE,KAAK,KAAK,IAAI;QAC7B,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACrB,IAAI,QAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,GAAG,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,KAAK,CAAC,eAAgB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,KAAK,CAAC,UAAU,QAAQ,CAAC,MAAM,QAAQ,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxF,OAAO,QAAQ,CAAC,IAAI,EAAsB,CAAC;QAC7C,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -5,8 +5,11 @@ import { readLedger, record } from './ledger.js';
5
5
  import { listRegressions } from './regress.js';
6
6
  import { readState, writeState } from './state.js';
7
7
  import { readJson } from './store.js';
8
- import { vibePath } from './paths.js';
8
+ import { resultsPath } from './results.js';
9
9
  const CATEGORIES = ['unavailable-input', 'environment', 'outside-authority', 'technical-limit', 'withdrawn'];
10
+ const MAX_TEXT_CHARS = 2000;
11
+ const MAX_OWNER_CHARS = 200;
12
+ const UNKNOWN_OWNER = 'unknown';
10
13
  export function readHandoffHistory(root) {
11
14
  const hash = readState(root).intentHash;
12
15
  const pending = {};
@@ -37,18 +40,28 @@ function validate(root, id, reason) {
37
40
  const state = readState(root);
38
41
  if (!state.intentHash || ![...loadScenarios(root), ...listRegressions(root)].some((s) => s.id === id))
39
42
  throw usage(`unknown scenario: ${id}`);
40
- if (!reason.trim() || reason.length > 2000)
41
- throw usage('handoff/reopen requires a nonblank reason of at most 2000 characters');
43
+ if (!reason.trim() || reason.length > MAX_TEXT_CHARS) {
44
+ throw usage(`handoff/reopen requires a nonblank reason of at most ${MAX_TEXT_CHARS} characters`);
45
+ }
42
46
  return state.intentHash;
43
47
  }
44
48
  export function handoffScenario(root, id, input) {
45
49
  const intentHash = validate(root, id, input.reason);
46
50
  if (!CATEGORIES.includes(input.category))
47
51
  throw usage(`handoff category must be ${CATEGORIES.join('|')}`);
48
- if (!input.nextAction.trim() || input.nextAction.length > 2000)
49
- throw usage('handoff requires a nonblank --next action of at most 2000 characters');
50
- const previous = readJson(vibePath(root, 'results.json'))?.[id];
51
- const handoff = { intentHash, scenario: id, reason: input.reason.trim(), category: input.category, owner: input.owner?.trim().slice(0, 200) || 'unknown', nextAction: input.nextAction.trim(), evidence: previous?.run ? `${previous.run}#${id}` : null };
52
+ if (!input.nextAction.trim() || input.nextAction.length > MAX_TEXT_CHARS) {
53
+ throw usage(`handoff requires a nonblank --next action of at most ${MAX_TEXT_CHARS} characters`);
54
+ }
55
+ const previous = readJson(resultsPath(root))?.[id];
56
+ const handoff = {
57
+ intentHash,
58
+ scenario: id,
59
+ reason: input.reason.trim(),
60
+ category: input.category,
61
+ owner: input.owner?.trim().slice(0, MAX_OWNER_CHARS) || UNKNOWN_OWNER,
62
+ nextAction: input.nextAction.trim(),
63
+ evidence: previous?.run ? `${previous.run}#${id}` : null,
64
+ };
52
65
  record(root, { event: 'handoff', client: detectClient(), model: detectModel(), handoff });
53
66
  const state = readState(root);
54
67
  if (state.state === 'DONE')