@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
|
@@ -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
|
+
}
|