@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.
- package/README.md +229 -0
- package/bin/a2h.js +7 -0
- package/dist/actions/engine.d.ts +40 -0
- package/dist/actions/engine.d.ts.map +1 -0
- package/dist/actions/engine.js +227 -0
- package/dist/actions/engine.js.map +1 -0
- package/dist/actions/policy.d.ts +8 -0
- package/dist/actions/policy.d.ts.map +1 -0
- package/dist/actions/policy.js +55 -0
- package/dist/actions/policy.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +258 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +8 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +69 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/ir/build.d.ts +8 -0
- package/dist/ir/build.d.ts.map +1 -0
- package/dist/ir/build.js +397 -0
- package/dist/ir/build.js.map +1 -0
- package/dist/ir/enrich.d.ts +21 -0
- package/dist/ir/enrich.d.ts.map +1 -0
- package/dist/ir/enrich.js +177 -0
- package/dist/ir/enrich.js.map +1 -0
- package/dist/ir/identity.d.ts +3 -0
- package/dist/ir/identity.d.ts.map +1 -0
- package/dist/ir/identity.js +91 -0
- package/dist/ir/identity.js.map +1 -0
- package/dist/ir/scoring.d.ts +7 -0
- package/dist/ir/scoring.d.ts.map +1 -0
- package/dist/ir/scoring.js +88 -0
- package/dist/ir/scoring.js.map +1 -0
- package/dist/parsers/code.d.ts +3 -0
- package/dist/parsers/code.d.ts.map +1 -0
- package/dist/parsers/code.js +17 -0
- package/dist/parsers/code.js.map +1 -0
- package/dist/parsers/diff.d.ts +11 -0
- package/dist/parsers/diff.d.ts.map +1 -0
- package/dist/parsers/diff.js +125 -0
- package/dist/parsers/diff.js.map +1 -0
- package/dist/parsers/json.d.ts +3 -0
- package/dist/parsers/json.d.ts.map +1 -0
- package/dist/parsers/json.js +16 -0
- package/dist/parsers/json.js.map +1 -0
- package/dist/parsers/log.d.ts +3 -0
- package/dist/parsers/log.d.ts.map +1 -0
- package/dist/parsers/log.js +105 -0
- package/dist/parsers/log.js.map +1 -0
- package/dist/parsers/markdown.d.ts +15 -0
- package/dist/parsers/markdown.d.ts.map +1 -0
- package/dist/parsers/markdown.js +89 -0
- package/dist/parsers/markdown.js.map +1 -0
- package/dist/parsers/text.d.ts +24 -0
- package/dist/parsers/text.d.ts.map +1 -0
- package/dist/parsers/text.js +98 -0
- package/dist/parsers/text.js.map +1 -0
- package/dist/presentation/blocks.d.ts +14 -0
- package/dist/presentation/blocks.d.ts.map +1 -0
- package/dist/presentation/blocks.js +87 -0
- package/dist/presentation/blocks.js.map +1 -0
- package/dist/presentation/present.d.ts +12 -0
- package/dist/presentation/present.d.ts.map +1 -0
- package/dist/presentation/present.js +115 -0
- package/dist/presentation/present.js.map +1 -0
- package/dist/providers/mock.d.ts +3 -0
- package/dist/providers/mock.d.ts.map +1 -0
- package/dist/providers/mock.js +171 -0
- package/dist/providers/mock.js.map +1 -0
- package/dist/providers/registry.d.ts +12 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +20 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +64 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +40 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/renderer/assets/index.html +41 -0
- package/dist/renderer/assets/js/actions.js +205 -0
- package/dist/renderer/assets/js/api.js +75 -0
- package/dist/renderer/assets/js/artifacts.js +422 -0
- package/dist/renderer/assets/js/blocks.js +301 -0
- package/dist/renderer/assets/js/bus.js +21 -0
- package/dist/renderer/assets/js/cards.js +137 -0
- package/dist/renderer/assets/js/dom.js +61 -0
- package/dist/renderer/assets/js/format.js +118 -0
- package/dist/renderer/assets/js/main.js +125 -0
- package/dist/renderer/assets/js/nav.js +80 -0
- package/dist/renderer/assets/js/router.js +64 -0
- package/dist/renderer/assets/js/store.js +69 -0
- package/dist/renderer/assets/js/views.js +356 -0
- package/dist/renderer/assets/styles.css +856 -0
- package/dist/renderer/content.d.ts +11 -0
- package/dist/renderer/content.d.ts.map +1 -0
- package/dist/renderer/content.js +114 -0
- package/dist/renderer/content.js.map +1 -0
- package/dist/scanner/classify.d.ts +17 -0
- package/dist/scanner/classify.d.ts.map +1 -0
- package/dist/scanner/classify.js +117 -0
- package/dist/scanner/classify.js.map +1 -0
- package/dist/scanner/git.d.ts +3 -0
- package/dist/scanner/git.d.ts.map +1 -0
- package/dist/scanner/git.js +43 -0
- package/dist/scanner/git.js.map +1 -0
- package/dist/scanner/ignore.d.ts +22 -0
- package/dist/scanner/ignore.d.ts.map +1 -0
- package/dist/scanner/ignore.js +57 -0
- package/dist/scanner/ignore.js.map +1 -0
- package/dist/scanner/scan.d.ts +8 -0
- package/dist/scanner/scan.d.ts.map +1 -0
- package/dist/scanner/scan.js +108 -0
- package/dist/scanner/scan.js.map +1 -0
- package/dist/security/boundary.d.ts +19 -0
- package/dist/security/boundary.d.ts.map +1 -0
- package/dist/security/boundary.js +59 -0
- package/dist/security/boundary.js.map +1 -0
- package/dist/security/urlPolicy.d.ts +4 -0
- package/dist/security/urlPolicy.d.ts.map +1 -0
- package/dist/security/urlPolicy.js +56 -0
- package/dist/security/urlPolicy.js.map +1 -0
- package/dist/security/workspaceRead.d.ts +25 -0
- package/dist/security/workspaceRead.d.ts.map +1 -0
- package/dist/security/workspaceRead.js +103 -0
- package/dist/security/workspaceRead.js.map +1 -0
- package/dist/semantics/load.d.ts +11 -0
- package/dist/semantics/load.d.ts.map +1 -0
- package/dist/semantics/load.js +537 -0
- package/dist/semantics/load.js.map +1 -0
- package/dist/semantics/resolve.d.ts +37 -0
- package/dist/semantics/resolve.d.ts.map +1 -0
- package/dist/semantics/resolve.js +211 -0
- package/dist/semantics/resolve.js.map +1 -0
- package/dist/semantics/types.d.ts +158 -0
- package/dist/semantics/types.d.ts.map +1 -0
- package/dist/semantics/types.js +3 -0
- package/dist/semantics/types.js.map +1 -0
- package/dist/server/server.d.ts +17 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +510 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/workspace.d.ts +53 -0
- package/dist/server/workspace.d.ts.map +1 -0
- package/dist/server/workspace.js +211 -0
- package/dist/server/workspace.js.map +1 -0
- package/dist/types.d.ts +570 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/dist/util/path.d.ts +11 -0
- package/dist/util/path.d.ts.map +1 -0
- package/dist/util/path.js +35 -0
- package/dist/util/path.js.map +1 -0
- package/dist/util/safeRead.d.ts +38 -0
- package/dist/util/safeRead.d.ts.map +1 -0
- package/dist/util/safeRead.js +117 -0
- package/dist/util/safeRead.js.map +1 -0
- package/package.json +40 -0
package/dist/ir/build.js
ADDED
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildSemanticIR = buildSemanticIR;
|
|
4
|
+
exports.hash = hash;
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const classify_1 = require("../scanner/classify");
|
|
7
|
+
const scoring_1 = require("./scoring");
|
|
8
|
+
const enrich_1 = require("./enrich");
|
|
9
|
+
// The semantic IR builder turns a flat list of scanned files into a tree of
|
|
10
|
+
// sections + artifacts, using the strongest available signal for each node:
|
|
11
|
+
//
|
|
12
|
+
// explicit manifest > frontmatter > naming convention > heuristics
|
|
13
|
+
//
|
|
14
|
+
// When a producer declares groups, those groups *are* the information
|
|
15
|
+
// architecture and inferred sections only receive the leftovers. With no
|
|
16
|
+
// producer input at all this reduces to the original zero-config behaviour.
|
|
17
|
+
const SECTION_ORDER = [
|
|
18
|
+
'overview', 'reports', 'changes', 'visuals', 'logs', 'data', 'code', 'other',
|
|
19
|
+
];
|
|
20
|
+
const REPORT_DIRS = /(^|\/)(outputs|reports|results|artifacts|deliverables|notes|radar|daily|summaries|analysis|docs)(\/|$)/i;
|
|
21
|
+
const REPORT_NAMES = /(report|summary|final|result|analysis|conclusion|decision|answer|overview)/i;
|
|
22
|
+
const README_RE = /^readme(\.|$)/i;
|
|
23
|
+
function buildSemanticIR(scan, options = {}) {
|
|
24
|
+
const nowMs = Date.now();
|
|
25
|
+
const semantics = options.semantics;
|
|
26
|
+
const warnings = [...scan.warnings];
|
|
27
|
+
const claimed = new Set();
|
|
28
|
+
// ---- 1. Turn each file into a semantic node -----------------------------
|
|
29
|
+
const nodes = new Map();
|
|
30
|
+
const nodeOrder = [];
|
|
31
|
+
for (const entry of scan.files) {
|
|
32
|
+
const explicit = semantics?.items.get(entry.path);
|
|
33
|
+
if (explicit?.hidden) {
|
|
34
|
+
claimed.add(entry.path);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const inferred = inferKind(entry);
|
|
38
|
+
const kind = explicit?.role ?? inferred.kind;
|
|
39
|
+
const source = explicit
|
|
40
|
+
? explicit.source
|
|
41
|
+
: inferred.source;
|
|
42
|
+
const node = buildArtifactNode(entry, kind, source, nowMs);
|
|
43
|
+
if (explicit?.title)
|
|
44
|
+
node.title = explicit.title;
|
|
45
|
+
if (explicit?.summary)
|
|
46
|
+
node.summary = explicit.summary;
|
|
47
|
+
if (explicit?.group)
|
|
48
|
+
node.group = explicit.group;
|
|
49
|
+
if (explicit?.taskId)
|
|
50
|
+
node.taskId = explicit.taskId;
|
|
51
|
+
if (explicit?.priority !== undefined)
|
|
52
|
+
node.priority = explicit.priority;
|
|
53
|
+
if (explicit?.tags?.length)
|
|
54
|
+
node.tags = mergeTags(node.tags, explicit.tags);
|
|
55
|
+
if (explicit?.relations?.length)
|
|
56
|
+
node.relations = explicit.relations.map(resolveRelation);
|
|
57
|
+
if (explicit?.metrics)
|
|
58
|
+
node.metrics = explicit.metrics;
|
|
59
|
+
if (explicit?.blocks)
|
|
60
|
+
node.blocks = explicit.blocks;
|
|
61
|
+
claimed.add(entry.path);
|
|
62
|
+
nodes.set(entry.path, node);
|
|
63
|
+
nodeOrder.push(node);
|
|
64
|
+
}
|
|
65
|
+
// Warn about manifest items pointing at files that are not there — a common
|
|
66
|
+
// producer bug worth surfacing rather than silently dropping.
|
|
67
|
+
if (semantics) {
|
|
68
|
+
for (const [path, item] of semantics.items) {
|
|
69
|
+
if (item.hidden)
|
|
70
|
+
continue;
|
|
71
|
+
if (!nodes.has(path)) {
|
|
72
|
+
warnings.push(`manifest references "${path}" but no such file was found in the workspace`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ---- 2. Group into sections ---------------------------------------------
|
|
77
|
+
const explicitGroups = semantics?.groups ?? [];
|
|
78
|
+
const sectionNodes = [];
|
|
79
|
+
if (explicitGroups.length > 0) {
|
|
80
|
+
const byGroup = new Map();
|
|
81
|
+
for (const node of nodeOrder) {
|
|
82
|
+
if (!node.group)
|
|
83
|
+
continue;
|
|
84
|
+
if (!byGroup.has(node.group))
|
|
85
|
+
byGroup.set(node.group, []);
|
|
86
|
+
byGroup.get(node.group).push(node);
|
|
87
|
+
}
|
|
88
|
+
for (const group of explicitGroups) {
|
|
89
|
+
const children = byGroup.get(group.id);
|
|
90
|
+
if (!children || children.length === 0)
|
|
91
|
+
continue;
|
|
92
|
+
byGroup.delete(group.id);
|
|
93
|
+
sectionNodes.push({
|
|
94
|
+
id: group.id,
|
|
95
|
+
type: 'section',
|
|
96
|
+
title: group.title ?? prettifyName(group.id),
|
|
97
|
+
priority: 0,
|
|
98
|
+
group: group.id,
|
|
99
|
+
children: sortChildren(children),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// Group ids that were referenced but never declared still deserve a home.
|
|
103
|
+
for (const [groupId, children] of byGroup) {
|
|
104
|
+
sectionNodes.push({
|
|
105
|
+
id: groupId,
|
|
106
|
+
type: 'section',
|
|
107
|
+
title: prettifyName(groupId),
|
|
108
|
+
priority: 0,
|
|
109
|
+
group: groupId,
|
|
110
|
+
children: sortChildren(children),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
// Leftovers keep the inferred treatment so a partial manifest never hides
|
|
114
|
+
// an artifact from the human.
|
|
115
|
+
const ungrouped = nodeOrder.filter((n) => !n.group);
|
|
116
|
+
sectionNodes.push(...inferSections(ungrouped));
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
sectionNodes.push(...inferSections(nodeOrder));
|
|
120
|
+
}
|
|
121
|
+
// A producer group named `reports` and the inferred section of the same name
|
|
122
|
+
// are two nodes with one id. Duplicate ids make every `find()` downstream
|
|
123
|
+
// arbitrary — the router would reach one of them and never the other — so
|
|
124
|
+
// they are folded together here, keeping the producer's node.
|
|
125
|
+
const sections = mergeSectionsById(sectionNodes, warnings);
|
|
126
|
+
const bytes = scan.files.reduce((sum, f) => sum + f.size, 0);
|
|
127
|
+
const artifacts = [...nodes.values()].length;
|
|
128
|
+
// A producer that declares who this workspace is outranks anything inferred
|
|
129
|
+
// from a README heading or a directory name — explicit beats convention.
|
|
130
|
+
const identity = {
|
|
131
|
+
...scan.identity,
|
|
132
|
+
name: semantics?.name ?? scan.identity.name,
|
|
133
|
+
summary: semantics?.summary ?? scan.identity.summary,
|
|
134
|
+
};
|
|
135
|
+
const root = {
|
|
136
|
+
id: 'workspace',
|
|
137
|
+
type: 'workspace',
|
|
138
|
+
title: identity.name,
|
|
139
|
+
priority: 0,
|
|
140
|
+
children: sections,
|
|
141
|
+
};
|
|
142
|
+
return {
|
|
143
|
+
id: hash(scan.rootDir),
|
|
144
|
+
identity,
|
|
145
|
+
git: scan.git,
|
|
146
|
+
stats: {
|
|
147
|
+
files: scan.files.length,
|
|
148
|
+
artifacts,
|
|
149
|
+
ignored: scan.ignored.length,
|
|
150
|
+
bytes,
|
|
151
|
+
},
|
|
152
|
+
semantics: semantics?.origin ?? 'inferred',
|
|
153
|
+
root,
|
|
154
|
+
warnings,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
function inferKind(entry) {
|
|
158
|
+
const name = (0, node_path_1.basename)(entry.path);
|
|
159
|
+
if (entry.kind === 'markdown') {
|
|
160
|
+
if (README_RE.test(name))
|
|
161
|
+
return { kind: 'readme', source: 'convention' };
|
|
162
|
+
const dir = dirOf(entry.path);
|
|
163
|
+
if (REPORT_DIRS.test(dir) || REPORT_NAMES.test(name)) {
|
|
164
|
+
return { kind: 'report', source: 'convention' };
|
|
165
|
+
}
|
|
166
|
+
return { kind: 'markdown', source: 'heuristic' };
|
|
167
|
+
}
|
|
168
|
+
const map = {
|
|
169
|
+
markdown: 'markdown',
|
|
170
|
+
code: 'code',
|
|
171
|
+
json: 'json',
|
|
172
|
+
log: 'log',
|
|
173
|
+
diff: 'diff',
|
|
174
|
+
image: 'image',
|
|
175
|
+
binary: 'file',
|
|
176
|
+
other: 'file',
|
|
177
|
+
};
|
|
178
|
+
return { kind: map[entry.kind], source: 'heuristic' };
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Folds sections that ended up with the same id into one.
|
|
182
|
+
*
|
|
183
|
+
* The collision is not hypothetical: `inferSections` names its sections after
|
|
184
|
+
* the built-in kinds, while a producer may declare a group with any id at all
|
|
185
|
+
* — including `reports` or `code`. Both then exist, the router's `find()` can
|
|
186
|
+
* only ever reach the first, and the human sees a section they cannot open.
|
|
187
|
+
*
|
|
188
|
+
* The producer's node wins the id, the title and the position; the inferred
|
|
189
|
+
* artifacts are appended to it, which is where they were going to be read
|
|
190
|
+
* anyway. The merge is reported so a producer can rename the group if it meant
|
|
191
|
+
* something else.
|
|
192
|
+
*/
|
|
193
|
+
function mergeSectionsById(sections, warnings) {
|
|
194
|
+
const out = [];
|
|
195
|
+
const byId = new Map();
|
|
196
|
+
for (const section of sections) {
|
|
197
|
+
const existing = byId.get(section.id);
|
|
198
|
+
if (!existing) {
|
|
199
|
+
byId.set(section.id, section);
|
|
200
|
+
out.push(section);
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
existing.children = sortChildren([...existing.children, ...section.children]);
|
|
204
|
+
if (existing.group && !section.group) {
|
|
205
|
+
warnings.push(`group "${section.id}" has the same id as a built-in section; the inferred artifacts were merged into it`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return out;
|
|
209
|
+
}
|
|
210
|
+
function inferSections(nodes) {
|
|
211
|
+
const buckets = new Map();
|
|
212
|
+
for (const node of nodes) {
|
|
213
|
+
const section = node.fallbackSection ?? 'other';
|
|
214
|
+
if (!buckets.has(section))
|
|
215
|
+
buckets.set(section, []);
|
|
216
|
+
buckets.get(section).push(node);
|
|
217
|
+
}
|
|
218
|
+
const out = [];
|
|
219
|
+
for (const sk of SECTION_ORDER) {
|
|
220
|
+
const children = buckets.get(sk);
|
|
221
|
+
if (!children || children.length === 0)
|
|
222
|
+
continue;
|
|
223
|
+
out.push({
|
|
224
|
+
id: sk,
|
|
225
|
+
type: 'section',
|
|
226
|
+
title: SECTION_TITLES[sk],
|
|
227
|
+
priority: 0,
|
|
228
|
+
children: sortChildren(children),
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
return out;
|
|
232
|
+
}
|
|
233
|
+
/** The section a built-in role maps to. Producer roles return undefined. */
|
|
234
|
+
function sectionForRole(kind) {
|
|
235
|
+
switch (kind) {
|
|
236
|
+
case 'readme': return 'overview';
|
|
237
|
+
case 'report':
|
|
238
|
+
case 'markdown': return 'reports';
|
|
239
|
+
case 'diff': return 'changes';
|
|
240
|
+
case 'image': return 'visuals';
|
|
241
|
+
case 'log': return 'logs';
|
|
242
|
+
case 'json': return 'data';
|
|
243
|
+
case 'code': return 'code';
|
|
244
|
+
default: return undefined;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* The section a file's bytes map to, used when the role is producer-defined.
|
|
249
|
+
* A producer can name an artifact "chart" or "signal"; it should still land
|
|
250
|
+
* somewhere sensible rather than in "Other files".
|
|
251
|
+
*/
|
|
252
|
+
function sectionForFileKind(fileKind) {
|
|
253
|
+
switch (fileKind) {
|
|
254
|
+
case 'markdown': return 'reports';
|
|
255
|
+
case 'diff': return 'changes';
|
|
256
|
+
case 'image': return 'visuals';
|
|
257
|
+
case 'log': return 'logs';
|
|
258
|
+
case 'json': return 'data';
|
|
259
|
+
case 'code': return 'code';
|
|
260
|
+
default: return 'other';
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const SECTION_TITLES = {
|
|
264
|
+
overview: 'Overview',
|
|
265
|
+
reports: 'Reports',
|
|
266
|
+
changes: 'Changes',
|
|
267
|
+
visuals: 'Visuals',
|
|
268
|
+
logs: 'Logs',
|
|
269
|
+
data: 'Data',
|
|
270
|
+
code: 'Code',
|
|
271
|
+
other: 'Other files',
|
|
272
|
+
};
|
|
273
|
+
function sortChildren(children) {
|
|
274
|
+
return children.slice().sort((a, b) => b.priority - a.priority || (b.meta?.mtimeMs ?? 0) - (a.meta?.mtimeMs ?? 0));
|
|
275
|
+
}
|
|
276
|
+
// ---------------------------------------------------------------------------
|
|
277
|
+
// Artifact nodes
|
|
278
|
+
// ---------------------------------------------------------------------------
|
|
279
|
+
function buildArtifactNode(entry, kind, source, nowMs) {
|
|
280
|
+
const scored = (0, scoring_1.scoreArtifact)(kind, entry, nowMs);
|
|
281
|
+
const name = (0, node_path_1.basename)(entry.path);
|
|
282
|
+
const contentKind = (0, classify_1.contentKindOf)(entry.kind);
|
|
283
|
+
let title = prettifyName(name);
|
|
284
|
+
let summary;
|
|
285
|
+
const meta = (0, enrich_1.buildMeta)(entry.size, entry.mtimeMs);
|
|
286
|
+
// Enrichment follows the *content*, never the role. A producer is free to
|
|
287
|
+
// call a markdown file "spec" or a PNG "evidence" and still get a heading
|
|
288
|
+
// extracted and dimensions measured.
|
|
289
|
+
//
|
|
290
|
+
// Symlinks are skipped outright: nothing about them should reach the UI
|
|
291
|
+
// beyond the fact that the link exists.
|
|
292
|
+
if (entry.isSymlink) {
|
|
293
|
+
summary = 'symlink — not followed';
|
|
294
|
+
return finishArtifact(entry, kind, source, scored, title, summary, meta);
|
|
295
|
+
}
|
|
296
|
+
switch (contentKind) {
|
|
297
|
+
case 'markdown': {
|
|
298
|
+
const head = (0, enrich_1.extractMarkdownHeading)((0, enrich_1.readHead)(entry.absolutePath, 16 * 1024));
|
|
299
|
+
if (head.title)
|
|
300
|
+
title = head.title;
|
|
301
|
+
summary = head.summary;
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
case 'diff': {
|
|
305
|
+
const s = (0, enrich_1.diffStats)(entry.absolutePath);
|
|
306
|
+
// A diff's file count is not a line count. Keeping them in one field
|
|
307
|
+
// made a two-file patch report itself as "2 lines".
|
|
308
|
+
meta.fileCount = s.files;
|
|
309
|
+
if (s.files > 0)
|
|
310
|
+
summary = `${s.files} file${s.files === 1 ? '' : 's'} · +${s.added} −${s.removed}`;
|
|
311
|
+
break;
|
|
312
|
+
}
|
|
313
|
+
case 'log': {
|
|
314
|
+
const lines = (0, enrich_1.countLines)(entry.absolutePath, 2 * 1024 * 1024);
|
|
315
|
+
if (lines !== undefined)
|
|
316
|
+
meta.lineCount = lines;
|
|
317
|
+
summary = lines !== undefined ? `${lines} line${lines === 1 ? '' : 's'}` : undefined;
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
case 'code': {
|
|
321
|
+
summary = meta.language;
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
case 'json': {
|
|
325
|
+
summary = 'structured data';
|
|
326
|
+
break;
|
|
327
|
+
}
|
|
328
|
+
case 'image': {
|
|
329
|
+
const dims = (0, enrich_1.imageDimensions)(entry.absolutePath, entry.ext);
|
|
330
|
+
if (dims) {
|
|
331
|
+
meta.imageWidth = dims.width;
|
|
332
|
+
meta.imageHeight = dims.height;
|
|
333
|
+
summary = `${dims.width} × ${dims.height}`;
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
summary = 'image';
|
|
337
|
+
}
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
default: {
|
|
341
|
+
summary = entry.kind === 'binary' ? 'binary file' : dirOf(entry.path) || undefined;
|
|
342
|
+
break;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
if (entry.sensitive)
|
|
346
|
+
summary = 'sensitive — content withheld';
|
|
347
|
+
return finishArtifact(entry, kind, source, scored, title, summary, meta);
|
|
348
|
+
}
|
|
349
|
+
function finishArtifact(entry, kind, source, scored, title, summary, meta) {
|
|
350
|
+
return {
|
|
351
|
+
id: entry.path,
|
|
352
|
+
type: 'artifact',
|
|
353
|
+
title,
|
|
354
|
+
kind,
|
|
355
|
+
content: (0, classify_1.contentKindOf)(entry.kind),
|
|
356
|
+
path: entry.path,
|
|
357
|
+
summary,
|
|
358
|
+
priority: scored.priority,
|
|
359
|
+
meta,
|
|
360
|
+
tags: scored.tags.length ? scored.tags : undefined,
|
|
361
|
+
source,
|
|
362
|
+
relations: undefined,
|
|
363
|
+
fallbackSection: sectionForRole(kind) ?? sectionForFileKind(entry.kind),
|
|
364
|
+
children: [],
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
function resolveRelation(relation) {
|
|
368
|
+
const target = relation.target.replace(/\\/g, '/').replace(/^\.\//, '');
|
|
369
|
+
return { ...relation, target };
|
|
370
|
+
}
|
|
371
|
+
function mergeTags(a, b) {
|
|
372
|
+
const out = [...(a ?? [])];
|
|
373
|
+
for (const t of b)
|
|
374
|
+
if (!out.includes(t))
|
|
375
|
+
out.push(t);
|
|
376
|
+
return out;
|
|
377
|
+
}
|
|
378
|
+
function prettifyName(name) {
|
|
379
|
+
const dot = name.lastIndexOf('.');
|
|
380
|
+
// Keep dotfiles (".env", ".gitignore") intact — only strip a real extension.
|
|
381
|
+
const stem = dot > 0 ? name.slice(0, dot) : name;
|
|
382
|
+
const pretty = stem.replace(/[-_]+/g, ' ').trim();
|
|
383
|
+
return pretty || name;
|
|
384
|
+
}
|
|
385
|
+
function dirOf(path) {
|
|
386
|
+
return path.includes('/') ? path.slice(0, path.lastIndexOf('/')) : '';
|
|
387
|
+
}
|
|
388
|
+
// FNV-1a 32-bit hash — deterministic, dependency-free.
|
|
389
|
+
function hash(input) {
|
|
390
|
+
let h = 0x811c9dc5;
|
|
391
|
+
for (let i = 0; i < input.length; i++) {
|
|
392
|
+
h ^= input.charCodeAt(i);
|
|
393
|
+
h = Math.imul(h, 0x01000193);
|
|
394
|
+
}
|
|
395
|
+
return (h >>> 0).toString(16).padStart(8, '0');
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/ir/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ArtifactMeta } from '../types';
|
|
2
|
+
export declare function readHead(path: string, maxBytes: number): string;
|
|
3
|
+
export interface TitleSummary {
|
|
4
|
+
title?: string;
|
|
5
|
+
summary?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function extractMarkdownHeading(text: string): TitleSummary;
|
|
8
|
+
export interface DiffStats {
|
|
9
|
+
files: number;
|
|
10
|
+
added: number;
|
|
11
|
+
removed: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function diffStats(path: string): DiffStats;
|
|
14
|
+
export declare function countLines(path: string, maxBytes: number): number | undefined;
|
|
15
|
+
export interface Dims {
|
|
16
|
+
width: number;
|
|
17
|
+
height: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function imageDimensions(path: string, ext: string): Dims | undefined;
|
|
20
|
+
export declare function buildMeta(size: number, mtimeMs: number, language?: string): ArtifactMeta;
|
|
21
|
+
//# sourceMappingURL=enrich.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrich.d.ts","sourceRoot":"","sources":["../../src/ir/enrich.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAS7C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CA0BjE;AAMD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CA4BjD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM7E;AAED,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CA0C3E;AAkCD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,CAExF"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readHead = readHead;
|
|
4
|
+
exports.extractMarkdownHeading = extractMarkdownHeading;
|
|
5
|
+
exports.diffStats = diffStats;
|
|
6
|
+
exports.countLines = countLines;
|
|
7
|
+
exports.imageDimensions = imageDimensions;
|
|
8
|
+
exports.buildMeta = buildMeta;
|
|
9
|
+
const safeRead_1 = require("../util/safeRead");
|
|
10
|
+
// Lightweight enrichment: reads only what is needed to produce a useful
|
|
11
|
+
// title / summary / dimensions for a file, without parsing everything.
|
|
12
|
+
//
|
|
13
|
+
// All reads are symlink-safe (see util/safeRead). A link that points outside
|
|
14
|
+
// the workspace must not be able to contribute a title, a summary, or a line
|
|
15
|
+
// count to the UI.
|
|
16
|
+
function readHead(path, maxBytes) {
|
|
17
|
+
return (0, safeRead_1.readHeadNoFollow)(path, maxBytes) ?? '';
|
|
18
|
+
}
|
|
19
|
+
function extractMarkdownHeading(text) {
|
|
20
|
+
const lines = text.split(/\r?\n/);
|
|
21
|
+
let title;
|
|
22
|
+
let summary;
|
|
23
|
+
for (const raw of lines) {
|
|
24
|
+
const line = raw.trim();
|
|
25
|
+
if (!title) {
|
|
26
|
+
const h1 = line.match(/^#\s+(.+)$/);
|
|
27
|
+
if (h1) {
|
|
28
|
+
title = clean(h1[1]);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (line === '---' || line === '+++' || line.startsWith('<!--') || line === '')
|
|
32
|
+
continue;
|
|
33
|
+
// No title found and we hit real prose — don't keep scanning forever.
|
|
34
|
+
if (line && !line.startsWith('```'))
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
if (line === '')
|
|
39
|
+
continue;
|
|
40
|
+
if (line.startsWith('#') || line.startsWith('```') || line.startsWith('>') || line.startsWith('|'))
|
|
41
|
+
continue;
|
|
42
|
+
if (/^[-*]\s|^\d+\.\s/.test(line))
|
|
43
|
+
break;
|
|
44
|
+
summary = clean(line);
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (summary && summary.length > 160)
|
|
49
|
+
summary = summary.slice(0, 157) + '…';
|
|
50
|
+
return { title, summary };
|
|
51
|
+
}
|
|
52
|
+
function clean(s) {
|
|
53
|
+
return s.replace(/[`*_~]/g, '').replace(/\s+/g, ' ').trim();
|
|
54
|
+
}
|
|
55
|
+
function diffStats(path) {
|
|
56
|
+
const text = readHead(path, 256 * 1024);
|
|
57
|
+
const lines = text.split(/\r?\n/);
|
|
58
|
+
const fileSet = new Set();
|
|
59
|
+
let added = 0;
|
|
60
|
+
let removed = 0;
|
|
61
|
+
let inHunk = false;
|
|
62
|
+
for (const line of lines) {
|
|
63
|
+
if (line.startsWith('diff --git ')) {
|
|
64
|
+
const m = line.match(/diff --git a\/(.+?) b\/(.+)$/);
|
|
65
|
+
if (m)
|
|
66
|
+
fileSet.add(m[2] ?? m[1]);
|
|
67
|
+
inHunk = true;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (line.startsWith('+++ ') || line.startsWith('--- '))
|
|
71
|
+
continue;
|
|
72
|
+
if (line.startsWith('Index: ')) {
|
|
73
|
+
fileSet.add(line.slice('Index: '.length).trim());
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (line.startsWith('@@')) {
|
|
77
|
+
inHunk = true;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (inHunk) {
|
|
81
|
+
if (line.startsWith('+') && !line.startsWith('+++'))
|
|
82
|
+
added++;
|
|
83
|
+
else if (line.startsWith('-') && !line.startsWith('---'))
|
|
84
|
+
removed++;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return { files: fileSet.size, added, removed };
|
|
88
|
+
}
|
|
89
|
+
function countLines(path, maxBytes) {
|
|
90
|
+
const slice = (0, safeRead_1.readBytesNoFollow)(path, maxBytes);
|
|
91
|
+
if (!slice)
|
|
92
|
+
return undefined;
|
|
93
|
+
let count = 0;
|
|
94
|
+
for (const b of slice)
|
|
95
|
+
if (b === 0x0a)
|
|
96
|
+
count++;
|
|
97
|
+
return count;
|
|
98
|
+
}
|
|
99
|
+
function imageDimensions(path, ext) {
|
|
100
|
+
// A path with an image extension is not necessarily a readable file: it may
|
|
101
|
+
// be a directory, an unreadable symlink, or a file that simply has the wrong
|
|
102
|
+
// name. Every failure below degrades to "unknown dimensions".
|
|
103
|
+
if (ext === 'jpg' || ext === 'jpeg')
|
|
104
|
+
return jpegDimensions(path);
|
|
105
|
+
if (ext === 'svg')
|
|
106
|
+
return svgDimensions(path);
|
|
107
|
+
const b = (0, safeRead_1.readBytesNoFollow)(path, 64);
|
|
108
|
+
if (!b)
|
|
109
|
+
return undefined;
|
|
110
|
+
if (ext === 'png') {
|
|
111
|
+
if (b.length >= 24 && b[0] === 0x89 && b[1] === 0x50) {
|
|
112
|
+
return { width: b.readUInt32BE(16), height: b.readUInt32BE(20) };
|
|
113
|
+
}
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
if (ext === 'gif') {
|
|
117
|
+
if (b.length >= 10 && b.toString('ascii', 0, 3) === 'GIF') {
|
|
118
|
+
return { width: b.readUInt16LE(6), height: b.readUInt16LE(8) };
|
|
119
|
+
}
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
if (ext === 'webp') {
|
|
123
|
+
if (b.toString('ascii', 0, 4) === 'RIFF' && b.toString('ascii', 8, 12) === 'WEBP') {
|
|
124
|
+
if (b.toString('ascii', 12, 16) === 'VP8X') {
|
|
125
|
+
return { width: 1 + (b.readUIntLE(24, 3) & 0xffffff), height: 1 + (b.readUIntLE(27, 3) & 0xffffff) };
|
|
126
|
+
}
|
|
127
|
+
if (b.toString('ascii', 12, 16) === 'VP8L') {
|
|
128
|
+
const w = 1 + (((b[21] & 0x3f) << 8) | b[20]);
|
|
129
|
+
const h = 1 + (((b[23] & 0x0f) << 10) | (b[22] << 2) | ((b[21] & 0xc0) >> 6));
|
|
130
|
+
return { width: w, height: h };
|
|
131
|
+
}
|
|
132
|
+
if (b.toString('ascii', 12, 16) === 'VP8 ') {
|
|
133
|
+
return { width: b.readUInt16LE(26) & 0x3fff, height: b.readUInt16LE(28) & 0x3fff };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
function svgDimensions(path) {
|
|
141
|
+
const text = readHead(path, 4096);
|
|
142
|
+
const viewBox = text.match(/viewBox=["']([\d.\s-]+)["']/);
|
|
143
|
+
if (viewBox) {
|
|
144
|
+
const parts = viewBox[1].trim().split(/[\s,]+/).map(Number);
|
|
145
|
+
if (parts.length >= 4 && parts[2] > 0 && parts[3] > 0) {
|
|
146
|
+
return { width: Math.round(parts[2]), height: Math.round(parts[3]) };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const w = text.match(/<svg[^>]*\swidth=["']([\d.]+)/);
|
|
150
|
+
const h = text.match(/<svg[^>]*\sheight=["']([\d.]+)/);
|
|
151
|
+
if (w && h)
|
|
152
|
+
return { width: Math.round(Number(w[1])), height: Math.round(Number(h[1])) };
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
function jpegDimensions(path) {
|
|
156
|
+
const b = (0, safeRead_1.readBytesNoFollow)(path, 64 * 1024);
|
|
157
|
+
if (!b)
|
|
158
|
+
return undefined;
|
|
159
|
+
let i = 2;
|
|
160
|
+
while (i + 9 < b.length) {
|
|
161
|
+
if (b[i] !== 0xff) {
|
|
162
|
+
i++;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
const marker = b[i + 1];
|
|
166
|
+
if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {
|
|
167
|
+
return { height: b.readUInt16BE(i + 5), width: b.readUInt16BE(i + 7) };
|
|
168
|
+
}
|
|
169
|
+
const len = b.readUInt16BE(i + 2);
|
|
170
|
+
i += 2 + len;
|
|
171
|
+
}
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
function buildMeta(size, mtimeMs, language) {
|
|
175
|
+
return { size, mtimeMs, language };
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=enrich.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../src/ir/enrich.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/ir/identity.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAkF7D,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,iBAAiB,CASrF"}
|