@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,258 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.main = main;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ const workspace_1 = require("../server/workspace");
7
+ const server_1 = require("../server/server");
8
+ const scan_1 = require("../scanner/scan");
9
+ const init_1 = require("./init");
10
+ const VERSION = '0.1.0';
11
+ const DEFAULT_PORT = 8420;
12
+ function main(argv) {
13
+ const args = parseArgs(argv);
14
+ if (args.help) {
15
+ printHelp();
16
+ return;
17
+ }
18
+ if (args.version) {
19
+ console.log(`a2h ${VERSION}`);
20
+ return;
21
+ }
22
+ const rootDir = (0, node_path_1.resolve)(args.path || '.');
23
+ if (args.command === 'init') {
24
+ runInit(rootDir, args.force);
25
+ return;
26
+ }
27
+ runRender(rootDir, args);
28
+ }
29
+ function runInit(rootDir, force) {
30
+ const scan = (0, scan_1.scanWorkspace)({ rootDir });
31
+ const result = (0, init_1.writeStarterManifest)(scan, force);
32
+ console.log('');
33
+ if (!result.created) {
34
+ console.log(` Manifest already present: ${result.path}`);
35
+ console.log(' Pass --force to overwrite it.');
36
+ console.log('');
37
+ return;
38
+ }
39
+ console.log(` Wrote ${result.path}`);
40
+ console.log('');
41
+ console.log(' It already reflects this workspace. Now make it meaningful:');
42
+ console.log(' - set "role" / "group" / "priority" on the items that matter');
43
+ console.log(' - add "tasks" for the work a human should judge');
44
+ console.log(' - add "actions" to give the human something to do about it');
45
+ console.log(' - add "panels" for composed blocks (metrics, tables, timelines)');
46
+ console.log('');
47
+ }
48
+ function runRender(rootDir, args) {
49
+ const workspace = new workspace_1.Workspace({ rootDir });
50
+ printSummary(workspace);
51
+ const { server, broadcast, host } = (0, server_1.createA2hServer)({
52
+ workspace,
53
+ assetsDir: (0, server_1.findAssetsDir)(),
54
+ });
55
+ server.on('error', (err) => {
56
+ if (err.code === 'EADDRINUSE') {
57
+ console.error(`a2h: port ${err.port} is already in use — try --port <other>`);
58
+ }
59
+ else {
60
+ console.error(`a2h: ${err.message}`);
61
+ }
62
+ process.exit(1);
63
+ });
64
+ server.listen(args.port ?? DEFAULT_PORT, host, () => {
65
+ const addr = server.address();
66
+ const port = typeof addr === 'object' && addr ? addr.port : args.port ?? DEFAULT_PORT;
67
+ const url = `http://localhost:${port}`;
68
+ console.log('');
69
+ console.log(' Local viewer:');
70
+ console.log(` ${url}`);
71
+ console.log('');
72
+ if (args.watch)
73
+ console.log(' Watching for changes… (Ctrl+C to stop)');
74
+ if (workspace.presentation.simulatedActions) {
75
+ console.log(' Actions are simulated: no external agent is connected.');
76
+ }
77
+ console.log('');
78
+ if (args.open)
79
+ openBrowser(url);
80
+ });
81
+ if (args.watch) {
82
+ setupWatch(rootDir, workspace, broadcast);
83
+ }
84
+ // Keep the process alive and exit cleanly on Ctrl+C.
85
+ process.on('SIGINT', () => {
86
+ console.log('\na2h: shutting down');
87
+ process.exit(0);
88
+ });
89
+ }
90
+ function setupWatch(rootDir, workspace, broadcast) {
91
+ let timer;
92
+ try {
93
+ const watcher = (0, node_fs_1.watch)(rootDir, { recursive: true }, (_event, filename) => {
94
+ if (!filename)
95
+ return;
96
+ if (timer)
97
+ clearTimeout(timer);
98
+ timer = setTimeout(() => {
99
+ try {
100
+ workspace.rescan();
101
+ broadcast('change');
102
+ }
103
+ catch (err) {
104
+ console.error('a2h: rescan failed:', err.message);
105
+ }
106
+ }, 300);
107
+ });
108
+ watcher.on('error', () => {
109
+ /* fall back to no-op; watch is best-effort */
110
+ });
111
+ }
112
+ catch {
113
+ console.error('a2h: watch mode unavailable on this platform');
114
+ }
115
+ }
116
+ function printSummary(workspace) {
117
+ const { presentation } = workspace;
118
+ console.log('');
119
+ console.log('A2H scanned this workspace');
120
+ console.log('');
121
+ if (presentation.semantics !== 'inferred') {
122
+ console.log(` semantics: ${presentation.semantics} (producer manifest)`);
123
+ }
124
+ else {
125
+ console.log(' semantics: inferred (no manifest — zero-config mode)');
126
+ }
127
+ for (const task of presentation.tasks) {
128
+ console.log(` task: ${task.title} [${String(task.status)}]`);
129
+ }
130
+ for (const section of presentation.sections) {
131
+ const n = section.artifacts.length;
132
+ const mark = section.explicit ? '•' : ' ';
133
+ console.log(` ${mark} ${section.title}${n ? ` (${n})` : ''}`);
134
+ }
135
+ if (presentation.actions.length > 0) {
136
+ console.log(` ${presentation.actions.length} action(s)` +
137
+ (presentation.simulatedActions ? ` — ${simulationSummary(presentation, true)}` : ''));
138
+ }
139
+ if (presentation.stats.ignored > 0) {
140
+ console.log(` ${presentation.stats.ignored} ignored entries`);
141
+ }
142
+ if (presentation.warnings.length > 0) {
143
+ console.log('');
144
+ console.log(` ${presentation.warnings.length} warning(s) — see the viewer for details`);
145
+ }
146
+ }
147
+ function openBrowser(url) {
148
+ const { exec } = require('node:child_process');
149
+ const platform = process.platform;
150
+ try {
151
+ if (platform === 'darwin')
152
+ exec(`open "${url}"`);
153
+ else if (platform === 'win32')
154
+ exec(`start "" "${url}"`);
155
+ else
156
+ exec(`xdg-open "${url}"`);
157
+ }
158
+ catch {
159
+ /* ignore */
160
+ }
161
+ }
162
+ function parseArgs(argv) {
163
+ const args = {
164
+ command: 'render',
165
+ path: '.',
166
+ watch: false,
167
+ open: false,
168
+ force: false,
169
+ help: false,
170
+ version: false,
171
+ };
172
+ for (let i = 0; i < argv.length; i++) {
173
+ const a = argv[i];
174
+ if (a === '--help' || a === '-h')
175
+ args.help = true;
176
+ else if (a === '--version' || a === '-v')
177
+ args.version = true;
178
+ else if (a === '--watch' || a === '-w')
179
+ args.watch = true;
180
+ else if (a === '--open' || a === '-o')
181
+ args.open = true;
182
+ else if (a === '--force' || a === '-f')
183
+ args.force = true;
184
+ else if (a === '--port' || a === '-p') {
185
+ const next = argv[i + 1];
186
+ if (next && /^\d+$/.test(next)) {
187
+ args.port = Number(next);
188
+ i++;
189
+ }
190
+ }
191
+ else if (a.startsWith('--port=')) {
192
+ const value = a.slice('--port='.length);
193
+ if (/^\d+$/.test(value))
194
+ args.port = Number(value);
195
+ }
196
+ else if (a === 'help')
197
+ args.help = true;
198
+ else if (a === 'init')
199
+ args.command = 'init';
200
+ else if (a === 'render')
201
+ args.command = 'render';
202
+ else if (!a.startsWith('-')) {
203
+ args.path = a;
204
+ }
205
+ }
206
+ return args;
207
+ }
208
+ function printHelp() {
209
+ console.log(`
210
+ a2h — Agent to Human
211
+
212
+ Turn an agent workspace into a structured, human-readable local web surface.
213
+
214
+ Usage:
215
+ a2h [render] [path] [options]
216
+ a2h init [path]
217
+
218
+ Commands:
219
+ render <path> Scan a workspace and start the local viewer (default)
220
+ init <path> Scaffold .a2h/manifest.json from the current workspace
221
+ help Show this help
222
+
223
+ Options:
224
+ -w, --watch Watch the workspace and live-update the viewer on changes
225
+ -p, --port <n> Port for the local viewer (default ${DEFAULT_PORT})
226
+ -o, --open Open the viewer in your default browser
227
+ -f, --force (init) overwrite an existing manifest
228
+ -v, --version Print the version
229
+
230
+ Producer protocol:
231
+ A workspace can teach A2H what its content means by shipping
232
+ .a2h/manifest.json (or a2h.json). With no manifest, A2H infers everything
233
+ from conventions and file content — zero-config still works.
234
+
235
+ Examples:
236
+ npx a2h render
237
+ npx a2h render ../a-coding-task --watch
238
+ npx a2h init . && npx a2h render .
239
+ `);
240
+ }
241
+ /**
242
+ * How to describe the simulation state, now that it is a per-action fact.
243
+ *
244
+ * Saying "actions are simulated" when only some of them are would be the exact
245
+ * misstatement the per-action provenance exists to prevent.
246
+ */
247
+ function simulationSummary(presentation, terse = false) {
248
+ const simulated = presentation.actions.filter((a) => a.simulated).length;
249
+ if (simulated === presentation.actions.length) {
250
+ return terse
251
+ ? 'simulated by the built-in executor, no external agent connected'
252
+ : 'Actions are simulated: no external agent is connected.';
253
+ }
254
+ return terse
255
+ ? `${simulated}/${presentation.actions.length} simulated by the built-in executor`
256
+ : `${simulated} of ${presentation.actions.length} actions are simulated: no external agent is connected for those.`;
257
+ }
258
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ScanResult } from '../types';
2
+ export interface InitResult {
3
+ path: string;
4
+ created: boolean;
5
+ reason?: string;
6
+ }
7
+ export declare function writeStarterManifest(scan: ScanResult, force?: boolean): InitResult;
8
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAS3C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,UAAQ,GAAG,UAAU,CAYhF"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.writeStarterManifest = writeStarterManifest;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ const load_1 = require("../semantics/load");
7
+ function writeStarterManifest(scan, force = false) {
8
+ const dir = (0, node_path_1.join)(scan.rootDir, load_1.MANIFEST_DIR);
9
+ const file = (0, node_path_1.join)(dir, 'manifest.json');
10
+ if ((0, node_fs_1.existsSync)(file) && !force) {
11
+ return { path: file, created: false, reason: 'already exists' };
12
+ }
13
+ const manifest = buildStarter(scan);
14
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
15
+ (0, node_fs_1.writeFileSync)(file, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8');
16
+ return { path: file, created: true };
17
+ }
18
+ function buildStarter(scan) {
19
+ // Surface the workspace's real top-level shape as groups, so the producer
20
+ // starts from a correct skeleton rather than a blank file.
21
+ const dirs = new Map();
22
+ for (const f of scan.files) {
23
+ const top = f.path.includes('/') ? f.path.slice(0, f.path.indexOf('/')) : '';
24
+ const key = top || '(root)';
25
+ dirs.set(key, (dirs.get(key) ?? 0) + 1);
26
+ }
27
+ const groups = [...dirs.entries()]
28
+ .sort((a, b) => b[1] - a[1])
29
+ .slice(0, 12)
30
+ .map(([id], i) => ({
31
+ id: slug(id),
32
+ title: prettify(id),
33
+ order: i,
34
+ }));
35
+ const items = scan.files
36
+ .slice()
37
+ .sort((a, b) => a.path.localeCompare(b.path))
38
+ .slice(0, 200)
39
+ .map((f) => ({
40
+ path: f.path,
41
+ role: f.kind === 'markdown' ? 'markdown' : f.kind,
42
+ group: slug(f.path.includes('/') ? f.path.slice(0, f.path.indexOf('/')) : '(root)'),
43
+ // No empty placeholders: a scaffold full of `[]` reads as noise and
44
+ // hides the fields that actually need a decision.
45
+ }));
46
+ return {
47
+ a2h: 1,
48
+ name: scan.identity.name,
49
+ // Omitted rather than written as "" when the workspace has no summary.
50
+ ...(scan.identity.summary ? { summary: scan.identity.summary } : {}),
51
+ groups,
52
+ tasks: [],
53
+ actions: [],
54
+ items,
55
+ panels: [],
56
+ };
57
+ }
58
+ function slug(s) {
59
+ return (s
60
+ .toLowerCase()
61
+ .replace(/[^a-z0-9]+/g, '-')
62
+ .replace(/^-+|-+$/g, '') || 'root');
63
+ }
64
+ function prettify(s) {
65
+ if (s === '(root)')
66
+ return 'Root';
67
+ return s.replace(/[-_]+/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase());
68
+ }
69
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export { scanWorkspace } from './scanner/scan';
2
+ export { classifyFile } from './scanner/classify';
3
+ export { loadSemantics, hasExplicitSemantics, readFrontmatterSemantics } from './semantics/load';
4
+ export { resolveSemantics } from './semantics/resolve';
5
+ export type { Manifest, ItemSpec, TaskSpec, RunSpec, ActionSpec, GroupSpec } from './semantics/types';
6
+ export { buildSemanticIR, hash } from './ir/build';
7
+ export { present } from './presentation/present';
8
+ export { resolveBlocks } from './presentation/blocks';
9
+ export { ActionEngine } from './actions/engine';
10
+ export { createDefaultRegistry, createMockExecutor } from './providers/registry';
11
+ export type { ActionExecutor, ProviderRegistry } from './providers/types';
12
+ export { Workspace } from './server/workspace';
13
+ export { createA2hServer, findAssetsDir } from './server/server';
14
+ export { resolveRelPath, resolveRealPath, isWithin } from './security/boundary';
15
+ export { createWorkspaceReader } from './security/workspaceRead';
16
+ export type { WorkspaceReader } from './security/workspaceRead';
17
+ export { isSafeLinkHref, isWorkspaceRelative } from './security/urlPolicy';
18
+ export { renderContent } from './renderer/content';
19
+ export { renderMarkdown, isSafeUrl, splitFrontmatter } from './parsers/markdown';
20
+ export { parseDiff } from './parsers/diff';
21
+ export { parseJson } from './parsers/json';
22
+ export { parseLog } from './parsers/log';
23
+ export { parseCode } from './parsers/code';
24
+ export { normalizeRel } from './util/path';
25
+ export type * from './types';
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGtG,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACjF,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1E,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,mBAAmB,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ // Public programmatic API. The CLI (bin/a2h.js) is the primary entry point,
3
+ // but these exports keep every layer testable and composable.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.normalizeRel = exports.parseCode = exports.parseLog = exports.parseJson = exports.parseDiff = exports.splitFrontmatter = exports.isSafeUrl = exports.renderMarkdown = exports.renderContent = exports.isWorkspaceRelative = exports.isSafeLinkHref = exports.createWorkspaceReader = exports.isWithin = exports.resolveRealPath = exports.resolveRelPath = exports.findAssetsDir = exports.createA2hServer = exports.Workspace = exports.createMockExecutor = exports.createDefaultRegistry = exports.ActionEngine = exports.resolveBlocks = exports.present = exports.hash = exports.buildSemanticIR = exports.resolveSemantics = exports.readFrontmatterSemantics = exports.hasExplicitSemantics = exports.loadSemantics = exports.classifyFile = exports.scanWorkspace = void 0;
6
+ // Scanner
7
+ var scan_1 = require("./scanner/scan");
8
+ Object.defineProperty(exports, "scanWorkspace", { enumerable: true, get: function () { return scan_1.scanWorkspace; } });
9
+ var classify_1 = require("./scanner/classify");
10
+ Object.defineProperty(exports, "classifyFile", { enumerable: true, get: function () { return classify_1.classifyFile; } });
11
+ // Semantics (the producer protocol)
12
+ var load_1 = require("./semantics/load");
13
+ Object.defineProperty(exports, "loadSemantics", { enumerable: true, get: function () { return load_1.loadSemantics; } });
14
+ Object.defineProperty(exports, "hasExplicitSemantics", { enumerable: true, get: function () { return load_1.hasExplicitSemantics; } });
15
+ Object.defineProperty(exports, "readFrontmatterSemantics", { enumerable: true, get: function () { return load_1.readFrontmatterSemantics; } });
16
+ var resolve_1 = require("./semantics/resolve");
17
+ Object.defineProperty(exports, "resolveSemantics", { enumerable: true, get: function () { return resolve_1.resolveSemantics; } });
18
+ // Semantic IR + presentation IR
19
+ var build_1 = require("./ir/build");
20
+ Object.defineProperty(exports, "buildSemanticIR", { enumerable: true, get: function () { return build_1.buildSemanticIR; } });
21
+ Object.defineProperty(exports, "hash", { enumerable: true, get: function () { return build_1.hash; } });
22
+ var present_1 = require("./presentation/present");
23
+ Object.defineProperty(exports, "present", { enumerable: true, get: function () { return present_1.present; } });
24
+ var blocks_1 = require("./presentation/blocks");
25
+ Object.defineProperty(exports, "resolveBlocks", { enumerable: true, get: function () { return blocks_1.resolveBlocks; } });
26
+ // Action layer
27
+ var engine_1 = require("./actions/engine");
28
+ Object.defineProperty(exports, "ActionEngine", { enumerable: true, get: function () { return engine_1.ActionEngine; } });
29
+ var registry_1 = require("./providers/registry");
30
+ Object.defineProperty(exports, "createDefaultRegistry", { enumerable: true, get: function () { return registry_1.createDefaultRegistry; } });
31
+ Object.defineProperty(exports, "createMockExecutor", { enumerable: true, get: function () { return registry_1.createMockExecutor; } });
32
+ // Server
33
+ var workspace_1 = require("./server/workspace");
34
+ Object.defineProperty(exports, "Workspace", { enumerable: true, get: function () { return workspace_1.Workspace; } });
35
+ var server_1 = require("./server/server");
36
+ Object.defineProperty(exports, "createA2hServer", { enumerable: true, get: function () { return server_1.createA2hServer; } });
37
+ Object.defineProperty(exports, "findAssetsDir", { enumerable: true, get: function () { return server_1.findAssetsDir; } });
38
+ // Security boundary
39
+ var boundary_1 = require("./security/boundary");
40
+ Object.defineProperty(exports, "resolveRelPath", { enumerable: true, get: function () { return boundary_1.resolveRelPath; } });
41
+ Object.defineProperty(exports, "resolveRealPath", { enumerable: true, get: function () { return boundary_1.resolveRealPath; } });
42
+ Object.defineProperty(exports, "isWithin", { enumerable: true, get: function () { return boundary_1.isWithin; } });
43
+ var workspaceRead_1 = require("./security/workspaceRead");
44
+ Object.defineProperty(exports, "createWorkspaceReader", { enumerable: true, get: function () { return workspaceRead_1.createWorkspaceReader; } });
45
+ // One URL policy for markdown, blocks and anything that becomes an href.
46
+ var urlPolicy_1 = require("./security/urlPolicy");
47
+ Object.defineProperty(exports, "isSafeLinkHref", { enumerable: true, get: function () { return urlPolicy_1.isSafeLinkHref; } });
48
+ Object.defineProperty(exports, "isWorkspaceRelative", { enumerable: true, get: function () { return urlPolicy_1.isWorkspaceRelative; } });
49
+ // Content
50
+ var content_1 = require("./renderer/content");
51
+ Object.defineProperty(exports, "renderContent", { enumerable: true, get: function () { return content_1.renderContent; } });
52
+ var markdown_1 = require("./parsers/markdown");
53
+ Object.defineProperty(exports, "renderMarkdown", { enumerable: true, get: function () { return markdown_1.renderMarkdown; } });
54
+ Object.defineProperty(exports, "isSafeUrl", { enumerable: true, get: function () { return markdown_1.isSafeUrl; } });
55
+ Object.defineProperty(exports, "splitFrontmatter", { enumerable: true, get: function () { return markdown_1.splitFrontmatter; } });
56
+ var diff_1 = require("./parsers/diff");
57
+ Object.defineProperty(exports, "parseDiff", { enumerable: true, get: function () { return diff_1.parseDiff; } });
58
+ var json_1 = require("./parsers/json");
59
+ Object.defineProperty(exports, "parseJson", { enumerable: true, get: function () { return json_1.parseJson; } });
60
+ var log_1 = require("./parsers/log");
61
+ Object.defineProperty(exports, "parseLog", { enumerable: true, get: function () { return log_1.parseLog; } });
62
+ var code_1 = require("./parsers/code");
63
+ Object.defineProperty(exports, "parseCode", { enumerable: true, get: function () { return code_1.parseCode; } });
64
+ var path_1 = require("./util/path");
65
+ Object.defineProperty(exports, "normalizeRel", { enumerable: true, get: function () { return path_1.normalizeRel; } });
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,4EAA4E;AAC5E,8DAA8D;;;AAE9D,UAAU;AACV,uCAA+C;AAAtC,qGAAA,aAAa,OAAA;AACtB,+CAAkD;AAAzC,wGAAA,YAAY,OAAA;AAErB,oCAAoC;AACpC,yCAAiG;AAAxF,qGAAA,aAAa,OAAA;AAAE,4GAAA,oBAAoB,OAAA;AAAE,gHAAA,wBAAwB,OAAA;AACtE,+CAAuD;AAA9C,2GAAA,gBAAgB,OAAA;AAGzB,gCAAgC;AAChC,oCAAmD;AAA1C,wGAAA,eAAe,OAAA;AAAE,6FAAA,IAAI,OAAA;AAC9B,kDAAiD;AAAxC,kGAAA,OAAO,OAAA;AAChB,gDAAsD;AAA7C,uGAAA,aAAa,OAAA;AAEtB,eAAe;AACf,2CAAgD;AAAvC,sGAAA,YAAY,OAAA;AACrB,iDAAiF;AAAxE,iHAAA,qBAAqB,OAAA;AAAE,8GAAA,kBAAkB,OAAA;AAGlD,SAAS;AACT,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,0CAAiE;AAAxD,yGAAA,eAAe,OAAA;AAAE,uGAAA,aAAa,OAAA;AACvC,oBAAoB;AACpB,gDAAgF;AAAvE,0GAAA,cAAc,OAAA;AAAE,2GAAA,eAAe,OAAA;AAAE,oGAAA,QAAQ,OAAA;AAClD,0DAAiE;AAAxD,sHAAA,qBAAqB,OAAA;AAE9B,yEAAyE;AACzE,kDAA2E;AAAlE,2GAAA,cAAc,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAE5C,UAAU;AACV,8CAAmD;AAA1C,wGAAA,aAAa,OAAA;AACtB,+CAAiF;AAAxE,0GAAA,cAAc,OAAA;AAAE,qGAAA,SAAS,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AACpD,uCAA2C;AAAlC,iGAAA,SAAS,OAAA;AAClB,uCAA2C;AAAlC,iGAAA,SAAS,OAAA;AAClB,qCAAyC;AAAhC,+FAAA,QAAQ,OAAA;AACjB,uCAA2C;AAAlC,iGAAA,SAAS,OAAA;AAElB,oCAA2C;AAAlC,oGAAA,YAAY,OAAA"}
@@ -0,0 +1,8 @@
1
+ import type { ScanResult, SemanticIR } from '../types';
2
+ import type { ResolvedSemantics } from '../semantics/resolve';
3
+ export interface BuildOptions {
4
+ semantics?: ResolvedSemantics;
5
+ }
6
+ export declare function buildSemanticIR(scan: ScanResult, options?: BuildOptions): SemanticIR;
7
+ export declare function hash(input: string): string;
8
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/ir/build.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAMV,UAAU,EAEV,UAAU,EAIX,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA+B9D,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,YAAiB,GAAG,UAAU,CAsIxF;AA+QD,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO1C"}