@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,38 @@
1
+ /** Opens a file read-only, refusing to follow a final-component symlink. */
2
+ export declare function openNoFollow(path: string): number;
3
+ /**
4
+ * Reads up to `maxBytes` from the head of a file.
5
+ * Returns undefined when the file cannot be read, or is a symlink.
6
+ */
7
+ export declare function readHeadNoFollow(path: string, maxBytes: number): string | undefined;
8
+ /** Reads up to `maxBytes` as raw bytes, with the same symlink guarantee. */
9
+ export declare function readBytesNoFollow(path: string, maxBytes: number): Buffer | undefined;
10
+ export interface BoundedRead {
11
+ text: string;
12
+ /** True when the file was longer than the cap and got cut. */
13
+ truncated: boolean;
14
+ totalBytes: number;
15
+ }
16
+ /**
17
+ * Reads a whole file, capped at `maxBytes`.
18
+ *
19
+ * Unlike `readFileText`, an unreadable file is reported as `undefined` rather
20
+ * than an empty string — the difference between "no content" and "refused to
21
+ * read" matters at a security boundary.
22
+ */
23
+ export declare function readFileNoFollow(path: string, maxBytes: number): BoundedRead | undefined;
24
+ export interface NoFollowStat {
25
+ isFile: boolean;
26
+ isDirectory: boolean;
27
+ isSymbolicLink: boolean;
28
+ size: number;
29
+ }
30
+ /**
31
+ * Metadata for a path, without following a final-component symlink.
32
+ *
33
+ * `statSync` would follow the link, so a link named `manifest.json` would look
34
+ * like a perfectly ordinary file of the target's size. `lstatSync` describes
35
+ * the link itself, which is what a caller deciding whether to read must know.
36
+ */
37
+ export declare function statNoFollow(path: string): NoFollowStat | undefined;
38
+ //# sourceMappingURL=safeRead.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeRead.d.ts","sourceRoot":"","sources":["../../src/util/safeRead.ts"],"names":[],"mappings":"AAqBA,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAYnF;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAYpF;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAmBxF;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAYnE"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openNoFollow = openNoFollow;
4
+ exports.readHeadNoFollow = readHeadNoFollow;
5
+ exports.readBytesNoFollow = readBytesNoFollow;
6
+ exports.readFileNoFollow = readFileNoFollow;
7
+ exports.statNoFollow = statNoFollow;
8
+ const node_fs_1 = require("node:fs");
9
+ // A2H reads files it did not create, in a directory tree it does not own. The
10
+ // only thing standing between a workspace and the rest of the machine is that
11
+ // A2H never follows a symlink out of it.
12
+ //
13
+ // Every read of workspace content goes through here. `O_NOFOLLOW` fails the
14
+ // open if the final path component is a symlink, so a link named `notes.md`
15
+ // pointing at `/etc/passwd` yields nothing rather than leaking a line of it
16
+ // into the UI. Intermediate directory components are still traversed; callers
17
+ // pair this with `resolveRealPath` so an intermediate link out of the tree is
18
+ // caught before the read, not after.
19
+ //
20
+ // Nothing in this file trusts its caller to have checked anything.
21
+ //
22
+ // `O_NOFOLLOW` is absent on Windows; there the flag degrades to 0 and the
23
+ // scanner's own symlink detection remains the control.
24
+ const O_NOFOLLOW = typeof node_fs_1.constants.O_NOFOLLOW === 'number' ? node_fs_1.constants.O_NOFOLLOW : 0;
25
+ /** Opens a file read-only, refusing to follow a final-component symlink. */
26
+ function openNoFollow(path) {
27
+ return (0, node_fs_1.openSync)(path, node_fs_1.constants.O_RDONLY | O_NOFOLLOW);
28
+ }
29
+ /**
30
+ * Reads up to `maxBytes` from the head of a file.
31
+ * Returns undefined when the file cannot be read, or is a symlink.
32
+ */
33
+ function readHeadNoFollow(path, maxBytes) {
34
+ let fd;
35
+ try {
36
+ fd = openNoFollow(path);
37
+ const buf = Buffer.alloc(maxBytes);
38
+ const n = (0, node_fs_1.readSync)(fd, buf, 0, maxBytes, 0);
39
+ return buf.subarray(0, n).toString('utf8');
40
+ }
41
+ catch {
42
+ return undefined;
43
+ }
44
+ finally {
45
+ if (fd !== undefined)
46
+ (0, node_fs_1.closeSync)(fd);
47
+ }
48
+ }
49
+ /** Reads up to `maxBytes` as raw bytes, with the same symlink guarantee. */
50
+ function readBytesNoFollow(path, maxBytes) {
51
+ let fd;
52
+ try {
53
+ fd = openNoFollow(path);
54
+ const buf = Buffer.alloc(maxBytes);
55
+ const n = (0, node_fs_1.readSync)(fd, buf, 0, maxBytes, 0);
56
+ return buf.subarray(0, n);
57
+ }
58
+ catch {
59
+ return undefined;
60
+ }
61
+ finally {
62
+ if (fd !== undefined)
63
+ (0, node_fs_1.closeSync)(fd);
64
+ }
65
+ }
66
+ /**
67
+ * Reads a whole file, capped at `maxBytes`.
68
+ *
69
+ * Unlike `readFileText`, an unreadable file is reported as `undefined` rather
70
+ * than an empty string — the difference between "no content" and "refused to
71
+ * read" matters at a security boundary.
72
+ */
73
+ function readFileNoFollow(path, maxBytes) {
74
+ let fd;
75
+ try {
76
+ fd = openNoFollow(path);
77
+ const stat = (0, node_fs_1.fstatSync)(fd);
78
+ const totalBytes = stat.size;
79
+ const toRead = Math.min(totalBytes, maxBytes);
80
+ const buf = Buffer.alloc(toRead);
81
+ const n = (0, node_fs_1.readSync)(fd, buf, 0, toRead, 0);
82
+ return {
83
+ text: buf.subarray(0, n).toString('utf8'),
84
+ truncated: totalBytes > maxBytes,
85
+ totalBytes,
86
+ };
87
+ }
88
+ catch {
89
+ return undefined;
90
+ }
91
+ finally {
92
+ if (fd !== undefined)
93
+ (0, node_fs_1.closeSync)(fd);
94
+ }
95
+ }
96
+ /**
97
+ * Metadata for a path, without following a final-component symlink.
98
+ *
99
+ * `statSync` would follow the link, so a link named `manifest.json` would look
100
+ * like a perfectly ordinary file of the target's size. `lstatSync` describes
101
+ * the link itself, which is what a caller deciding whether to read must know.
102
+ */
103
+ function statNoFollow(path) {
104
+ try {
105
+ const st = (0, node_fs_1.lstatSync)(path);
106
+ return {
107
+ isFile: st.isFile(),
108
+ isDirectory: st.isDirectory(),
109
+ isSymbolicLink: st.isSymbolicLink(),
110
+ size: st.size,
111
+ };
112
+ }
113
+ catch {
114
+ return undefined;
115
+ }
116
+ }
117
+ //# sourceMappingURL=safeRead.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeRead.js","sourceRoot":"","sources":["../../src/util/safeRead.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@tinyviber/a2h",
3
+ "version": "0.1.0",
4
+ "description": "Agent to Human — turn messy agent workspaces into structured, human-readable local web interfaces.",
5
+ "license": "MIT",
6
+ "type": "commonjs",
7
+ "bin": {
8
+ "a2h": "bin/a2h.js"
9
+ },
10
+ "main": "dist/index.js",
11
+ "types": "dist/index.d.ts",
12
+ "files": [
13
+ "bin",
14
+ "dist"
15
+ ],
16
+ "engines": {
17
+ "node": ">=18.0.0"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.json && node scripts/copy-assets.js",
21
+ "dev": "node scripts/copy-assets.js && node bin/a2h.js",
22
+ "test": "vitest run",
23
+ "test:watch": "vitest",
24
+ "test:acceptance": "node test/acceptance.cjs",
25
+ "fixtures": "node test/fixtures/generate.mjs",
26
+ "prepublishOnly": "npm run build"
27
+ },
28
+ "dependencies": {
29
+ "diff": "^7.0.0",
30
+ "markdown-it": "^14.1.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/diff": "^7.0.0",
34
+ "@types/markdown-it": "^14.1.2",
35
+ "@types/node": "^22.10.0",
36
+ "playwright-core": "^1.49.0",
37
+ "typescript": "^5.7.2",
38
+ "vitest": "^2.1.8"
39
+ }
40
+ }