@tinyviber/a2h 0.1.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 (162) hide show
  1. package/README.md +229 -0
  2. package/bin/a2h.js +7 -0
  3. package/dist/actions/engine.d.ts +40 -0
  4. package/dist/actions/engine.d.ts.map +1 -0
  5. package/dist/actions/engine.js +227 -0
  6. package/dist/actions/engine.js.map +1 -0
  7. package/dist/actions/policy.d.ts +8 -0
  8. package/dist/actions/policy.d.ts.map +1 -0
  9. package/dist/actions/policy.js +55 -0
  10. package/dist/actions/policy.js.map +1 -0
  11. package/dist/cli/index.d.ts +2 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +258 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/init.d.ts +8 -0
  16. package/dist/cli/init.d.ts.map +1 -0
  17. package/dist/cli/init.js +69 -0
  18. package/dist/cli/init.js.map +1 -0
  19. package/dist/index.d.ts +26 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +66 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/ir/build.d.ts +8 -0
  24. package/dist/ir/build.d.ts.map +1 -0
  25. package/dist/ir/build.js +397 -0
  26. package/dist/ir/build.js.map +1 -0
  27. package/dist/ir/enrich.d.ts +21 -0
  28. package/dist/ir/enrich.d.ts.map +1 -0
  29. package/dist/ir/enrich.js +177 -0
  30. package/dist/ir/enrich.js.map +1 -0
  31. package/dist/ir/identity.d.ts +3 -0
  32. package/dist/ir/identity.d.ts.map +1 -0
  33. package/dist/ir/identity.js +91 -0
  34. package/dist/ir/identity.js.map +1 -0
  35. package/dist/ir/scoring.d.ts +7 -0
  36. package/dist/ir/scoring.d.ts.map +1 -0
  37. package/dist/ir/scoring.js +88 -0
  38. package/dist/ir/scoring.js.map +1 -0
  39. package/dist/parsers/code.d.ts +3 -0
  40. package/dist/parsers/code.d.ts.map +1 -0
  41. package/dist/parsers/code.js +17 -0
  42. package/dist/parsers/code.js.map +1 -0
  43. package/dist/parsers/diff.d.ts +11 -0
  44. package/dist/parsers/diff.d.ts.map +1 -0
  45. package/dist/parsers/diff.js +125 -0
  46. package/dist/parsers/diff.js.map +1 -0
  47. package/dist/parsers/json.d.ts +3 -0
  48. package/dist/parsers/json.d.ts.map +1 -0
  49. package/dist/parsers/json.js +16 -0
  50. package/dist/parsers/json.js.map +1 -0
  51. package/dist/parsers/log.d.ts +3 -0
  52. package/dist/parsers/log.d.ts.map +1 -0
  53. package/dist/parsers/log.js +105 -0
  54. package/dist/parsers/log.js.map +1 -0
  55. package/dist/parsers/markdown.d.ts +15 -0
  56. package/dist/parsers/markdown.d.ts.map +1 -0
  57. package/dist/parsers/markdown.js +89 -0
  58. package/dist/parsers/markdown.js.map +1 -0
  59. package/dist/parsers/text.d.ts +24 -0
  60. package/dist/parsers/text.d.ts.map +1 -0
  61. package/dist/parsers/text.js +98 -0
  62. package/dist/parsers/text.js.map +1 -0
  63. package/dist/presentation/blocks.d.ts +14 -0
  64. package/dist/presentation/blocks.d.ts.map +1 -0
  65. package/dist/presentation/blocks.js +87 -0
  66. package/dist/presentation/blocks.js.map +1 -0
  67. package/dist/presentation/present.d.ts +12 -0
  68. package/dist/presentation/present.d.ts.map +1 -0
  69. package/dist/presentation/present.js +115 -0
  70. package/dist/presentation/present.js.map +1 -0
  71. package/dist/providers/mock.d.ts +3 -0
  72. package/dist/providers/mock.d.ts.map +1 -0
  73. package/dist/providers/mock.js +171 -0
  74. package/dist/providers/mock.js.map +1 -0
  75. package/dist/providers/registry.d.ts +12 -0
  76. package/dist/providers/registry.d.ts.map +1 -0
  77. package/dist/providers/registry.js +20 -0
  78. package/dist/providers/registry.js.map +1 -0
  79. package/dist/providers/types.d.ts +64 -0
  80. package/dist/providers/types.d.ts.map +1 -0
  81. package/dist/providers/types.js +40 -0
  82. package/dist/providers/types.js.map +1 -0
  83. package/dist/renderer/assets/index.html +41 -0
  84. package/dist/renderer/assets/js/actions.js +205 -0
  85. package/dist/renderer/assets/js/api.js +75 -0
  86. package/dist/renderer/assets/js/artifacts.js +422 -0
  87. package/dist/renderer/assets/js/blocks.js +301 -0
  88. package/dist/renderer/assets/js/bus.js +21 -0
  89. package/dist/renderer/assets/js/cards.js +137 -0
  90. package/dist/renderer/assets/js/dom.js +61 -0
  91. package/dist/renderer/assets/js/format.js +118 -0
  92. package/dist/renderer/assets/js/main.js +125 -0
  93. package/dist/renderer/assets/js/nav.js +80 -0
  94. package/dist/renderer/assets/js/router.js +64 -0
  95. package/dist/renderer/assets/js/store.js +69 -0
  96. package/dist/renderer/assets/js/views.js +356 -0
  97. package/dist/renderer/assets/styles.css +856 -0
  98. package/dist/renderer/content.d.ts +11 -0
  99. package/dist/renderer/content.d.ts.map +1 -0
  100. package/dist/renderer/content.js +114 -0
  101. package/dist/renderer/content.js.map +1 -0
  102. package/dist/scanner/classify.d.ts +17 -0
  103. package/dist/scanner/classify.d.ts.map +1 -0
  104. package/dist/scanner/classify.js +117 -0
  105. package/dist/scanner/classify.js.map +1 -0
  106. package/dist/scanner/git.d.ts +3 -0
  107. package/dist/scanner/git.d.ts.map +1 -0
  108. package/dist/scanner/git.js +43 -0
  109. package/dist/scanner/git.js.map +1 -0
  110. package/dist/scanner/ignore.d.ts +22 -0
  111. package/dist/scanner/ignore.d.ts.map +1 -0
  112. package/dist/scanner/ignore.js +57 -0
  113. package/dist/scanner/ignore.js.map +1 -0
  114. package/dist/scanner/scan.d.ts +8 -0
  115. package/dist/scanner/scan.d.ts.map +1 -0
  116. package/dist/scanner/scan.js +108 -0
  117. package/dist/scanner/scan.js.map +1 -0
  118. package/dist/security/boundary.d.ts +19 -0
  119. package/dist/security/boundary.d.ts.map +1 -0
  120. package/dist/security/boundary.js +59 -0
  121. package/dist/security/boundary.js.map +1 -0
  122. package/dist/security/urlPolicy.d.ts +4 -0
  123. package/dist/security/urlPolicy.d.ts.map +1 -0
  124. package/dist/security/urlPolicy.js +56 -0
  125. package/dist/security/urlPolicy.js.map +1 -0
  126. package/dist/security/workspaceRead.d.ts +25 -0
  127. package/dist/security/workspaceRead.d.ts.map +1 -0
  128. package/dist/security/workspaceRead.js +103 -0
  129. package/dist/security/workspaceRead.js.map +1 -0
  130. package/dist/semantics/load.d.ts +11 -0
  131. package/dist/semantics/load.d.ts.map +1 -0
  132. package/dist/semantics/load.js +537 -0
  133. package/dist/semantics/load.js.map +1 -0
  134. package/dist/semantics/resolve.d.ts +37 -0
  135. package/dist/semantics/resolve.d.ts.map +1 -0
  136. package/dist/semantics/resolve.js +211 -0
  137. package/dist/semantics/resolve.js.map +1 -0
  138. package/dist/semantics/types.d.ts +158 -0
  139. package/dist/semantics/types.d.ts.map +1 -0
  140. package/dist/semantics/types.js +3 -0
  141. package/dist/semantics/types.js.map +1 -0
  142. package/dist/server/server.d.ts +17 -0
  143. package/dist/server/server.d.ts.map +1 -0
  144. package/dist/server/server.js +510 -0
  145. package/dist/server/server.js.map +1 -0
  146. package/dist/server/workspace.d.ts +53 -0
  147. package/dist/server/workspace.d.ts.map +1 -0
  148. package/dist/server/workspace.js +211 -0
  149. package/dist/server/workspace.js.map +1 -0
  150. package/dist/types.d.ts +570 -0
  151. package/dist/types.d.ts.map +1 -0
  152. package/dist/types.js +19 -0
  153. package/dist/types.js.map +1 -0
  154. package/dist/util/path.d.ts +11 -0
  155. package/dist/util/path.d.ts.map +1 -0
  156. package/dist/util/path.js +35 -0
  157. package/dist/util/path.js.map +1 -0
  158. package/dist/util/safeRead.d.ts +38 -0
  159. package/dist/util/safeRead.d.ts.map +1 -0
  160. package/dist/util/safeRead.js +117 -0
  161. package/dist/util/safeRead.js.map +1 -0
  162. package/package.json +40 -0
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deriveIdentity = deriveIdentity;
4
+ const node_path_1 = require("node:path");
5
+ const safeRead_1 = require("../util/safeRead");
6
+ // Derives a human-facing identity for the workspace without requiring a
7
+ // strict schema: name and one-line summary are sourced from whatever is
8
+ // actually present (README heading, package.json, directory name).
9
+ const README_NAMES = new Set([
10
+ 'readme.md', 'readme.markdown', 'readme.mdown', 'readme.txt',
11
+ 'readme.mdx', 'readme.rst', 'readme',
12
+ ]);
13
+ const MAX_READ_BYTES = 64 * 1024;
14
+ function findReadme(files) {
15
+ const candidates = files
16
+ .filter((f) => f.kind === 'markdown' || f.kind === 'other')
17
+ .filter((f) => README_NAMES.has(f.path.split('/').pop().toLowerCase()))
18
+ .sort((a, b) => a.depth - b.depth || a.path.length - b.path.length);
19
+ return candidates[0];
20
+ }
21
+ function readHead(absPath) {
22
+ return (0, safeRead_1.readHeadNoFollow)(absPath, MAX_READ_BYTES) ?? '';
23
+ }
24
+ function extractHeading(md) {
25
+ const lines = md.split(/\r?\n/);
26
+ let title;
27
+ let summary;
28
+ let inTitle = false;
29
+ for (const raw of lines) {
30
+ const line = raw.trim();
31
+ if (!title) {
32
+ const h1 = line.match(/^#\s+(.+)$/);
33
+ if (h1) {
34
+ title = h1[1].replace(/[`*_~]/g, '').trim();
35
+ inTitle = true;
36
+ continue;
37
+ }
38
+ // Skip frontmatter delimiters and html comments before a title.
39
+ if (line === '---' || line === '+++' || line.startsWith('<!--') || line === '')
40
+ continue;
41
+ }
42
+ else if (inTitle) {
43
+ // Find the first prose paragraph after the title.
44
+ if (line.startsWith('#') || line.startsWith('```') || line.startsWith('>') || line.startsWith('|')) {
45
+ continue;
46
+ }
47
+ if (line === '')
48
+ continue;
49
+ if (line.startsWith('- ') || line.startsWith('* ') || line.startsWith('1. '))
50
+ break;
51
+ summary = line.replace(/[`*_]/g, '').trim();
52
+ break;
53
+ }
54
+ }
55
+ if (summary && summary.length > 200)
56
+ summary = summary.slice(0, 197) + '…';
57
+ return { title, summary };
58
+ }
59
+ /** Enough for any real package.json; enough to stop a pathological one. */
60
+ const MAX_PACKAGE_JSON_BYTES = 256 * 1024;
61
+ function readPackageJson(rootDir) {
62
+ // A workspace file like any other: read through the no-follow primitive, so
63
+ // a `package.json` that is a link to something outside contributes nothing,
64
+ // and a huge one cannot be used to make startup expensive.
65
+ const read = (0, safeRead_1.readFileNoFollow)(`${rootDir}/package.json`, MAX_PACKAGE_JSON_BYTES);
66
+ if (!read)
67
+ return {};
68
+ try {
69
+ const pkg = JSON.parse(read.text);
70
+ return {
71
+ name: typeof pkg.name === 'string' ? pkg.name : undefined,
72
+ description: typeof pkg.description === 'string' ? pkg.description : undefined,
73
+ };
74
+ }
75
+ catch {
76
+ return {};
77
+ }
78
+ }
79
+ function deriveIdentity(rootDir, files) {
80
+ const readme = findReadme(files);
81
+ const heading = readme ? extractHeading(readHead(readme.absolutePath)) : {};
82
+ const pkg = readPackageJson(rootDir);
83
+ const name = heading.title || pkg.name || prettifyDirName((0, node_path_1.basename)(rootDir));
84
+ const summary = heading.summary || pkg.description;
85
+ return { name, summary };
86
+ }
87
+ function prettifyDirName(dirName) {
88
+ // "my-cool-repo" -> "my cool repo"
89
+ return dirName.replace(/[-_]+/g, ' ').trim();
90
+ }
91
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/ir/identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { FileEntry, Role } from '../types';
2
+ export interface Score {
3
+ priority: number;
4
+ tags: string[];
5
+ }
6
+ export declare function scoreArtifact(kind: Role, entry: FileEntry, nowMs: number): Score;
7
+ //# sourceMappingURL=scoring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../src/ir/scoring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,SAAS,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAiD9D,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAoChF"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scoreArtifact = scoreArtifact;
4
+ // Heuristic scoring: turns a file into a presentation priority plus a few
5
+ // human tags. Deterministic — no model involved. The idea is to surface what
6
+ // a human should read *first* in a messy agent workspace.
7
+ //
8
+ // This is the *fallback* path: a producer-declared priority always wins.
9
+ const KIND_BASE = {
10
+ readme: 1000,
11
+ report: 500,
12
+ diff: 450,
13
+ markdown: 320,
14
+ image: 260,
15
+ log: 210,
16
+ json: 190,
17
+ code: 110,
18
+ file: 60,
19
+ };
20
+ /**
21
+ * Producer-defined roles have no built-in base score. They are treated as
22
+ * "worth reading" — slightly above a plain note, well below an explicit
23
+ * report — and producers can always override with an explicit priority.
24
+ */
25
+ const UNKNOWN_ROLE_BASE = 300;
26
+ const HIGH_SIGNAL = [
27
+ { re: /final/i, delta: 80 },
28
+ { re: /latest/i, delta: 60 },
29
+ { re: /summary/i, delta: 50 },
30
+ { re: /report/i, delta: 40 },
31
+ { re: /result/i, delta: 30 },
32
+ { re: /conclusion/i, delta: 30 },
33
+ { re: /decision/i, delta: 30 },
34
+ { re: /answer/i, delta: 20 },
35
+ ];
36
+ const LOW_SIGNAL = [
37
+ { re: /(^|\/|[-_])tmp($|\/|[-_])/i, delta: -120 },
38
+ { re: /(^|\/|[-_])scratch($|\/|[-_])/i, delta: -100 },
39
+ { re: /draft/i, delta: -80 },
40
+ { re: /wip/i, delta: -80 },
41
+ { re: /backup/i, delta: -70 },
42
+ { re: /\.bak/i, delta: -70 },
43
+ { re: /old/i, delta: -50 },
44
+ { re: /deprecated/i, delta: -50 },
45
+ ];
46
+ function scoreArtifact(kind, entry, nowMs) {
47
+ let priority = KIND_BASE[kind] ?? UNKNOWN_ROLE_BASE;
48
+ const tags = [];
49
+ const name = entry.path.split('/').pop() ?? entry.path;
50
+ const dirPath = entry.path.includes('/') ? entry.path.slice(0, entry.path.lastIndexOf('/')) : '';
51
+ for (const { re, delta } of HIGH_SIGNAL) {
52
+ if (re.test(name))
53
+ priority += delta;
54
+ }
55
+ for (const { re, delta } of LOW_SIGNAL) {
56
+ if (re.test(entry.path))
57
+ priority += delta;
58
+ }
59
+ // Directory conventions.
60
+ if (/(^|\/)(outputs|reports|results|artifacts|deliverables|docs)(\/|$)/i.test(dirPath))
61
+ priority += 30;
62
+ if (/(^|\/)(notes|radar|daily|summaries)(\/|$)/i.test(dirPath))
63
+ priority += 15;
64
+ // Recency: what's new deserves a small lift.
65
+ const ageMs = nowMs - entry.mtimeMs;
66
+ if (ageMs >= 0) {
67
+ if (ageMs < 24 * 3600 * 1000)
68
+ priority += 25;
69
+ else if (ageMs < 7 * 24 * 3600 * 1000)
70
+ priority += 12;
71
+ }
72
+ // Tiny files are usually trivial.
73
+ if (entry.size < 24)
74
+ priority -= 8;
75
+ // Tags.
76
+ if (/final/i.test(name))
77
+ tags.push('final');
78
+ if (/latest/i.test(name) || /-new/i.test(name))
79
+ tags.push('latest');
80
+ if (/(backup|\.bak|old)/i.test(name))
81
+ tags.push('stale');
82
+ if (/(draft|wip)/i.test(name))
83
+ tags.push('draft');
84
+ if (/(^|\/|[-_])tmp($|\/|[-_])/i.test(entry.path))
85
+ tags.push('tmp');
86
+ return { priority, tags };
87
+ }
88
+ //# sourceMappingURL=scoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/ir/scoring.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CodeContent } from '../types';
2
+ export declare function parseCode(path: string, language: string): CodeContent;
3
+ //# sourceMappingURL=code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../../src/parsers/code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAK5C,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAUrE"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseCode = parseCode;
4
+ const text_1 = require("./text");
5
+ const MAX_CODE_BYTES = 512 * 1024;
6
+ function parseCode(path, language) {
7
+ const { text, truncated } = (0, text_1.readFileText)(path, MAX_CODE_BYTES);
8
+ const lines = (0, text_1.splitLines)(text);
9
+ return {
10
+ type: 'code',
11
+ language: language || 'text',
12
+ raw: text,
13
+ totalLines: lines.length,
14
+ truncated,
15
+ };
16
+ }
17
+ //# sourceMappingURL=code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/parsers/code.ts"],"names":[],"mappings":";;AAKA,8BAUC;AAdD,iCAAkD;AAElD,MAAM,cAAc,GAAG,GAAG,GAAG,IAAI,CAAC;AAElC,SAAgB,SAAS,CAAC,IAAY,EAAE,QAAgB;IACtD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAA,mBAAY,EAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,IAAA,iBAAU,EAAC,IAAI,CAAC,CAAC;IAC/B,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,QAAQ,IAAI,MAAM;QAC5B,GAAG,EAAE,IAAI;QACT,UAAU,EAAE,KAAK,CAAC,MAAM;QACxB,SAAS;KACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { DiffContent } from '../types';
2
+ /**
3
+ * Parses a unified diff into structured hunks.
4
+ *
5
+ * Robustness matters more than fidelity here: agent-produced patches are
6
+ * frequently malformed (wrong hunk counts, truncated output, pasted fragments).
7
+ * Anything the parser rejects degrades to a plain line listing rather than
8
+ * failing the request.
9
+ */
10
+ export declare function parseDiff(text: string): DiffContent;
11
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/parsers/diff.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAgC,MAAM,UAAU,CAAC;AAQ1E;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAqBnD"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseDiff = parseDiff;
4
+ const diff_1 = require("diff");
5
+ // Converts a unified diff / patch into a structured form the renderer can lay
6
+ // out for review. Uses the `diff` package's battle-tested patch parser, then
7
+ // reshapes it into our own IR (so renderers never depend on `diff` types).
8
+ const MAX_DIFF_LINES = 6000;
9
+ /**
10
+ * Parses a unified diff into structured hunks.
11
+ *
12
+ * Robustness matters more than fidelity here: agent-produced patches are
13
+ * frequently malformed (wrong hunk counts, truncated output, pasted fragments).
14
+ * Anything the parser rejects degrades to a plain line listing rather than
15
+ * failing the request.
16
+ */
17
+ function parseDiff(text) {
18
+ let files;
19
+ try {
20
+ const parsed = (0, diff_1.parsePatch)(text);
21
+ files = parsed.length === 0 ? [rawFallback(text)] : parsed.map(convertFile);
22
+ }
23
+ catch {
24
+ files = [rawFallback(text)];
25
+ }
26
+ let totalLines = 0;
27
+ let truncated = false;
28
+ for (const f of files) {
29
+ for (const h of f.hunks)
30
+ totalLines += h.lines.length;
31
+ }
32
+ if (totalLines > MAX_DIFF_LINES) {
33
+ truncated = true;
34
+ files = truncateFiles(files, MAX_DIFF_LINES);
35
+ totalLines = MAX_DIFF_LINES;
36
+ }
37
+ return { type: 'diff', files, totalLines, truncated };
38
+ }
39
+ function convertFile(p) {
40
+ const oldName = stripGitPrefix(p.oldFileName ?? '');
41
+ const newName = stripGitPrefix(p.newFileName ?? '');
42
+ const path = newName || oldName || '(unknown)';
43
+ let status = 'modified';
44
+ if (!p.oldFileName || p.oldFileName === '/dev/null')
45
+ status = 'added';
46
+ else if (!p.newFileName || p.newFileName === '/dev/null')
47
+ status = 'removed';
48
+ else if (oldName !== newName)
49
+ status = 'renamed';
50
+ let added = 0;
51
+ let removed = 0;
52
+ const hunks = p.hunks.map((h) => {
53
+ const lines = [];
54
+ let oldNo = h.oldStart;
55
+ let newNo = h.newStart;
56
+ for (const raw of h.lines) {
57
+ const text = raw.replace(/\n$/, '');
58
+ if (text === '\') {
59
+ lines.push({ type: 'context', text });
60
+ continue;
61
+ }
62
+ const ch = raw[0];
63
+ if (ch === '+') {
64
+ added++;
65
+ lines.push({ type: 'add', text: raw.slice(1), newNo });
66
+ newNo++;
67
+ }
68
+ else if (ch === '-') {
69
+ removed++;
70
+ lines.push({ type: 'del', text: raw.slice(1), oldNo });
71
+ oldNo++;
72
+ }
73
+ else {
74
+ const body = ch === ' ' ? raw.slice(1) : raw;
75
+ lines.push({ type: 'context', text: body, oldNo, newNo });
76
+ oldNo++;
77
+ newNo++;
78
+ }
79
+ }
80
+ return { header: `@@ -${h.oldStart},${h.oldLines} +${h.newStart},${h.newLines} @@`, lines };
81
+ });
82
+ return {
83
+ path,
84
+ from: p.oldFileName ? stripGitPrefix(p.oldFileName) : undefined,
85
+ to: p.newFileName ? stripGitPrefix(p.newFileName) : undefined,
86
+ status,
87
+ added,
88
+ removed,
89
+ hunks,
90
+ };
91
+ }
92
+ function stripGitPrefix(name) {
93
+ return name.replace(/^[ab]\//, '');
94
+ }
95
+ function rawFallback(text) {
96
+ const lines = text
97
+ .split(/\r?\n/)
98
+ .map((line) => ({ type: 'context', text: line }));
99
+ return {
100
+ path: '(patch)',
101
+ status: 'modified',
102
+ added: 0,
103
+ removed: 0,
104
+ hunks: [{ header: '', lines }],
105
+ };
106
+ }
107
+ function truncateFiles(files, maxLines) {
108
+ const out = [];
109
+ let budget = maxLines;
110
+ for (const f of files) {
111
+ if (budget <= 0)
112
+ break;
113
+ const copy = { ...f, hunks: [] };
114
+ for (const h of f.hunks) {
115
+ if (budget <= 0)
116
+ break;
117
+ const take = h.lines.slice(0, budget);
118
+ copy.hunks.push({ header: h.header, lines: take });
119
+ budget -= take.length;
120
+ }
121
+ out.push(copy);
122
+ }
123
+ return out;
124
+ }
125
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/parsers/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { JsonContent } from '../types';
2
+ export declare function parseJson(path: string): JsonContent;
3
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/parsers/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAK5C,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAQnD"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseJson = parseJson;
4
+ const text_1 = require("./text");
5
+ const MAX_JSON_BYTES = 2 * 1024 * 1024;
6
+ function parseJson(path) {
7
+ const { text, truncated } = (0, text_1.readFileText)(path, MAX_JSON_BYTES);
8
+ try {
9
+ const data = JSON.parse(text);
10
+ return { type: 'json', data, valid: true, raw: text, truncated };
11
+ }
12
+ catch {
13
+ return { type: 'json', data: undefined, valid: false, raw: text, truncated };
14
+ }
15
+ }
16
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/parsers/json.ts"],"names":[],"mappings":";;AAKA,8BAQC;AAZD,iCAAsC;AAEtC,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvC,SAAgB,SAAS,CAAC,IAAY;IACpC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAA,mBAAY,EAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC/D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC/E,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { LogContent } from '../types';
2
+ export declare function parseLog(path: string, full?: boolean): LogContent;
3
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/parsers/log.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAU3C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,UAAQ,GAAG,UAAU,CAG/D"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseLog = parseLog;
4
+ const node_fs_1 = require("node:fs");
5
+ const safeRead_1 = require("../util/safeRead");
6
+ const text_1 = require("./text");
7
+ const ignore_1 = require("../scanner/ignore");
8
+ const ERROR_RE = /\b(error|fatal|exception|panic|traceback|crashed|failed)\b/i;
9
+ const WARN_RE = /\b(warn|warning|deprecated)\b/i;
10
+ const MAX_FULL_BYTES = 512 * 1024;
11
+ const MAX_SCAN_BYTES = 8 * 1024 * 1024;
12
+ function parseLog(path, full = false) {
13
+ if (full)
14
+ return parseFull(path);
15
+ return parseTail(path);
16
+ }
17
+ function parseTail(path) {
18
+ const { lines: tail, truncated } = (0, text_1.readTailLines)(path, ignore_1.LOG_TAIL_LINES);
19
+ const counted = (0, text_1.countLinesFull)(path, MAX_SCAN_BYTES);
20
+ const totalLines = counted.lines[0] ? Number(counted.lines[0]) : tail.length;
21
+ // Error/warning detection scans the whole file (capped), so errors buried
22
+ // far from the tail are still surfaced as flags with their line numbers.
23
+ const { hasErrors, hasWarnings, errorLines } = scanErrors(path, MAX_SCAN_BYTES);
24
+ return { type: 'log', tail, totalLines, truncated, hasErrors, hasWarnings, errorLines };
25
+ }
26
+ function parseFull(path) {
27
+ const { text, truncated } = (0, text_1.readFileText)(path, MAX_FULL_BYTES);
28
+ const lines = (0, text_1.splitLines)(text);
29
+ const totalLines = lines.length;
30
+ const { hasErrors, hasWarnings, errorLines } = scanLines(lines, 0);
31
+ return { type: 'log', tail: lines, totalLines, truncated, hasErrors, hasWarnings, errorLines };
32
+ }
33
+ function scanLines(lines, offset) {
34
+ let hasErrors = false;
35
+ let hasWarnings = false;
36
+ const errorLines = [];
37
+ lines.forEach((line, i) => {
38
+ if (ERROR_RE.test(line)) {
39
+ hasErrors = true;
40
+ errorLines.push(offset + i);
41
+ }
42
+ else if (WARN_RE.test(line)) {
43
+ hasWarnings = true;
44
+ }
45
+ });
46
+ return { hasErrors, hasWarnings, errorLines };
47
+ }
48
+ /** Streams the file (capped at maxBytes) and reports error/warning lines. */
49
+ function scanErrors(path, maxBytes) {
50
+ let fd;
51
+ try {
52
+ fd = (0, safeRead_1.openNoFollow)(path);
53
+ const stat = (0, node_fs_1.fstatSync)(fd);
54
+ const toScan = Math.min(stat.size, maxBytes);
55
+ const chunk = 256 * 1024;
56
+ const buf = Buffer.alloc(chunk);
57
+ let offset = 0;
58
+ let lineNo = 0;
59
+ let line = '';
60
+ let hasErrors = false;
61
+ let hasWarnings = false;
62
+ const errorLines = [];
63
+ while (offset < toScan) {
64
+ const want = Math.min(chunk, toScan - offset);
65
+ const n = (0, node_fs_1.readSync)(fd, buf, 0, want, offset);
66
+ if (n <= 0)
67
+ break;
68
+ const s = buf.slice(0, n).toString('utf8');
69
+ for (let i = 0; i < s.length; i++) {
70
+ const ch = s[i];
71
+ if (ch === '\n') {
72
+ if (ERROR_RE.test(line)) {
73
+ hasErrors = true;
74
+ errorLines.push(lineNo);
75
+ }
76
+ else if (WARN_RE.test(line))
77
+ hasWarnings = true;
78
+ line = '';
79
+ lineNo++;
80
+ }
81
+ else if (ch !== '\r') {
82
+ line += ch;
83
+ }
84
+ }
85
+ offset += n;
86
+ }
87
+ if (line.length > 0) {
88
+ if (ERROR_RE.test(line)) {
89
+ hasErrors = true;
90
+ errorLines.push(lineNo);
91
+ }
92
+ else if (WARN_RE.test(line))
93
+ hasWarnings = true;
94
+ }
95
+ return { hasErrors, hasWarnings, errorLines };
96
+ }
97
+ catch {
98
+ return { hasErrors: false, hasWarnings: false, errorLines: [] };
99
+ }
100
+ finally {
101
+ if (fd !== undefined)
102
+ (0, node_fs_1.closeSync)(fd);
103
+ }
104
+ }
105
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/parsers/log.ts"],"names":[],"mappings":";;AAYA,4BAGC;AAfD,qCAAyD;AACzD,+CAAgD;AAEhD,iCAAiF;AACjF,8CAAmD;AAEnD,MAAM,QAAQ,GAAG,6DAA6D,CAAC;AAC/E,MAAM,OAAO,GAAG,gCAAgC,CAAC;AAEjD,MAAM,cAAc,GAAG,GAAG,GAAG,IAAI,CAAC;AAClC,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvC,SAAgB,QAAQ,CAAC,IAAY,EAAE,IAAI,GAAG,KAAK;IACjD,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAA,oBAAa,EAAC,IAAI,EAAE,uBAAc,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,IAAA,qBAAc,EAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAE7E,0EAA0E;IAC1E,yEAAyE;IACzE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAEhF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AAC1F,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAA,mBAAY,EAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,IAAA,iBAAU,EAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAChC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACnE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AACjG,CAAC;AAED,SAAS,SAAS,CAAC,KAAe,EAAE,MAAc;IAChD,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACxB,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,SAAS,GAAG,IAAI,CAAC;YACjB,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AAChD,CAAC;AAED,6EAA6E;AAC7E,SAAS,UAAU,CAAC,IAAY,EAAE,QAAgB;IAChD,IAAI,EAAE,CAAC;IACP,IAAI,CAAC;QACH,EAAE,GAAG,IAAA,uBAAY,EAAC,IAAI,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,IAAA,mBAAS,EAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,OAAO,MAAM,GAAG,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;YAC9C,MAAM,CAAC,GAAG,IAAA,kBAAQ,EAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC;gBAAE,MAAM;YAClB,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;gBACjB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;oBAChB,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBAAC,SAAS,GAAG,IAAI,CAAC;wBAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAAC,CAAC;yBAClE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;wBAAE,WAAW,GAAG,IAAI,CAAC;oBAChD,IAAI,GAAG,EAAE,CAAC;oBACV,MAAM,EAAE,CAAC;gBACX,CAAC;qBAAM,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;oBACvB,IAAI,IAAI,EAAE,CAAC;gBACb,CAAC;YACH,CAAC;YACD,MAAM,IAAI,CAAC,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAC,SAAS,GAAG,IAAI,CAAC;gBAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAAC,CAAC;iBAClE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,WAAW,GAAG,IAAI,CAAC;QAClD,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,EAAc,EAAE,CAAC;IAC9E,CAAC;YAAS,CAAC;QACT,IAAI,EAAE,KAAK,SAAS;YAAE,IAAA,mBAAS,EAAC,EAAE,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { isSafeLinkHref } from '../security/urlPolicy';
2
+ /**
3
+ * The workspace's single URL policy, shared with the block renderer so a
4
+ * producer cannot get a laxer answer out of one path than the other.
5
+ */
6
+ export declare const isSafeUrl: typeof isSafeLinkHref;
7
+ export type ImageResolver = (src: string) => string | undefined;
8
+ export declare function renderMarkdown(mdText: string, resolveImage?: ImageResolver): string;
9
+ export interface FrontmatterResult {
10
+ frontmatter?: Record<string, unknown>;
11
+ body: string;
12
+ }
13
+ /** Extracts simple YAML-style frontmatter (key: value) from the top of a doc. */
14
+ export declare function splitFrontmatter(text: string): FrontmatterResult;
15
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/parsers/markdown.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAuB,MAAM,uBAAuB,CAAC;AAS5E;;;GAGG;AACH,eAAO,MAAM,SAAS,uBAAiB,CAAC;AAExC,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAEhE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,aAAa,GAAG,MAAM,CAoCnF;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CA0BhE"}