@achieveai/hitl-mcp-server 2.9.1 → 2.11.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/dist/cli.d.ts +31 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +133 -5
- package/dist/cli.js.map +1 -1
- package/dist/git-context.d.ts +41 -2
- package/dist/git-context.d.ts.map +1 -1
- package/dist/git-context.js +86 -2
- package/dist/git-context.js.map +1 -1
- package/dist/host-settings.d.ts +68 -0
- package/dist/host-settings.d.ts.map +1 -0
- package/dist/host-settings.js +136 -0
- package/dist/host-settings.js.map +1 -0
- package/dist/mcp-server.d.ts +54 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +421 -70
- package/dist/mcp-server.js.map +1 -1
- package/dist/ntfy-transport.d.ts +285 -13
- package/dist/ntfy-transport.d.ts.map +1 -1
- package/dist/ntfy-transport.js +747 -88
- package/dist/ntfy-transport.js.map +1 -1
- package/dist/payload.d.ts +80 -0
- package/dist/payload.d.ts.map +1 -0
- package/dist/payload.js +135 -0
- package/dist/payload.js.map +1 -0
- package/dist/plan-diff.d.ts +29 -0
- package/dist/plan-diff.d.ts.map +1 -0
- package/dist/plan-diff.js +138 -0
- package/dist/plan-diff.js.map +1 -0
- package/dist/plan-file.d.ts +24 -0
- package/dist/plan-file.d.ts.map +1 -0
- package/dist/plan-file.js +98 -0
- package/dist/plan-file.js.map +1 -0
- package/dist/plan-review.d.ts +54 -0
- package/dist/plan-review.d.ts.map +1 -0
- package/dist/plan-review.js +110 -0
- package/dist/plan-review.js.map +1 -0
- package/dist/setup.d.ts +22 -5
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +52 -15
- package/dist/setup.js.map +1 -1
- package/dist/snapshot-store.d.ts +104 -0
- package/dist/snapshot-store.d.ts.map +1 -0
- package/dist/snapshot-store.js +209 -0
- package/dist/snapshot-store.js.map +1 -0
- package/dist/types.d.ts +114 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +13 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +15 -0
- package/dist/version.js.map +1 -0
- package/package.json +64 -61
- package/dist/bin/windows-x64/hitl-client.exe +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ntfy-transport.js","sourceRoot":"","sources":["../src/ntfy-transport.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ntfy-transport.js","sourceRoot":"","sources":["../src/ntfy-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { PlanPayloadRef } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Payload pipeline for the four plan-review message types ONLY.
|
|
4
|
+
*
|
|
5
|
+
* plaintext = base64( gzip( JSON.stringify(bodyObject) ) ) // ASCII-safe string
|
|
6
|
+
* contentHash = sha256hex(plaintext)
|
|
7
|
+
* cipher = encrypt(plaintext, key) // existing envelope JSON
|
|
8
|
+
* kind = byteLength(cipher) <= PLAN_INLINE_THRESHOLD_BYTES ? 'inline' : 'attachment'
|
|
9
|
+
*
|
|
10
|
+
* The base64 layer exists precisely so the shipping string-in/string-out crypto
|
|
11
|
+
* works unchanged on gzip binary. No new crypto lives here.
|
|
12
|
+
*
|
|
13
|
+
* The four shipping types (question / answer / notification /
|
|
14
|
+
* dismiss_notification) must NOT go through this — they keep a byte-identical
|
|
15
|
+
* wire format and stay wired to chunking.ts.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Ciphers at or under this size travel inline in the outer message; larger ones
|
|
19
|
+
* become an ntfy attachment. Chosen so the whole outer message stays under
|
|
20
|
+
* CHUNK_THRESHOLD_BYTES — a chunked plan_review would break the
|
|
21
|
+
* one-ntfy-message-per-review guarantee (C-1).
|
|
22
|
+
*/
|
|
23
|
+
export declare const PLAN_INLINE_THRESHOLD_BYTES = 2048;
|
|
24
|
+
/**
|
|
25
|
+
* Caps on what a payload may expand to.
|
|
26
|
+
*
|
|
27
|
+
* The content hash is no protection here: it is computed over the compressed
|
|
28
|
+
* plaintext, which is exactly the bytes an attacker controls, so it confirms
|
|
29
|
+
* "these are the bytes that were sent" and says nothing about what they
|
|
30
|
+
* decompress to. Without a cap a 1 GiB expansion is a couple of seconds of
|
|
31
|
+
* work for whoever holds the topic (H4).
|
|
32
|
+
*
|
|
33
|
+
* A plan is capped at 1 MB and a body carries the plan plus its diff, so 8 MB
|
|
34
|
+
* is well clear of anything legitimate. The compressed cap is below ntfy's own
|
|
35
|
+
* 2 MB attachment limit, so nothing that could arrive is rejected by it.
|
|
36
|
+
*/
|
|
37
|
+
export declare const PLAN_MAX_COMPRESSED_BYTES: number;
|
|
38
|
+
export declare const PLAN_MAX_DECOMPRESSED_BYTES: number;
|
|
39
|
+
/** Raised when a payload cannot be turned back into its body object. */
|
|
40
|
+
export declare class PayloadDecodeError extends Error {
|
|
41
|
+
readonly cause?: unknown | undefined;
|
|
42
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
43
|
+
}
|
|
44
|
+
/** Raised when an outer message would need chunking, which new types never do. */
|
|
45
|
+
export declare class PlanMessageTooLargeError extends Error {
|
|
46
|
+
readonly byteLength: number;
|
|
47
|
+
constructor(byteLength: number);
|
|
48
|
+
}
|
|
49
|
+
/** The wire bytes plus the reference that describes them. */
|
|
50
|
+
export interface EncodedPayload {
|
|
51
|
+
/**
|
|
52
|
+
* Goes into the outer message's `body` field. `data` is populated only when
|
|
53
|
+
* `kind === 'inline'`; for `'attachment'` the cipher travels as the PUT body
|
|
54
|
+
* and the reader recovers it from the ntfy event's attachment URL.
|
|
55
|
+
*/
|
|
56
|
+
ref: PlanPayloadRef;
|
|
57
|
+
/**
|
|
58
|
+
* The encrypted-envelope JSON string, or — when no encryption key is
|
|
59
|
+
* configured — the bare base64(gzip(json)) plaintext.
|
|
60
|
+
*/
|
|
61
|
+
cipher: string;
|
|
62
|
+
}
|
|
63
|
+
/** sha256 hex of a utf-8 string. */
|
|
64
|
+
export declare function sha256Hex(value: string): string;
|
|
65
|
+
/** Encode a plan-review body for the wire. */
|
|
66
|
+
export declare function encodePayload(body: unknown, keyHex?: string): EncodedPayload;
|
|
67
|
+
/**
|
|
68
|
+
* Inverse of encodePayload. `cipher` is `ref.data` for an inline payload, or
|
|
69
|
+
* the downloaded attachment bytes as a utf-8 string for an attachment one.
|
|
70
|
+
* Throws PayloadDecodeError on a bad key, corrupt bytes, or a hash mismatch —
|
|
71
|
+
* a mismatch must surface as a visible refusal, never a blank window (C-2).
|
|
72
|
+
*/
|
|
73
|
+
export declare function decodePayload<T>(cipher: string, keyHex: string | undefined, expectedHash: string): T;
|
|
74
|
+
/**
|
|
75
|
+
* Guard for the publish path: a plan-review message must fit in one ntfy
|
|
76
|
+
* message. Call this on the serialized outer body (post-encryption) before
|
|
77
|
+
* publishing, and throw rather than silently falling back to chunking.
|
|
78
|
+
*/
|
|
79
|
+
export declare function assertNoChunk(outerBody: string): void;
|
|
80
|
+
//# sourceMappingURL=payload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../src/payload.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD;;;;;;;;;;;;;;GAcG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,yBAAyB,QAAkB,CAAC;AACzD,eAAO,MAAM,2BAA2B,QAAkB,CAAC;AAE3D,wEAAwE;AACxE,qBAAa,kBAAmB,SAAQ,KAAK;IACd,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;gBAAzC,OAAO,EAAE,MAAM,EAAW,KAAK,CAAC,EAAE,OAAO,YAAA;CAItD;AAED,kFAAkF;AAClF,qBAAa,wBAAyB,SAAQ,KAAK;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM;gBAAlB,UAAU,EAAE,MAAM;CAOxC;AAED,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,GAAG,EAAE,cAAc,CAAC;IACpB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,oCAAoC;AACpC,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,8CAA8C;AAC9C,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,CAc5E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,CAAC,CAyCpG;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAIrD"}
|
package/dist/payload.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import crypto from 'crypto';
|
|
2
|
+
import zlib from 'zlib';
|
|
3
|
+
import { shouldChunk, CHUNK_THRESHOLD_BYTES } from './chunking.js';
|
|
4
|
+
import { encrypt, decrypt } from './crypto.js';
|
|
5
|
+
/**
|
|
6
|
+
* Payload pipeline for the four plan-review message types ONLY.
|
|
7
|
+
*
|
|
8
|
+
* plaintext = base64( gzip( JSON.stringify(bodyObject) ) ) // ASCII-safe string
|
|
9
|
+
* contentHash = sha256hex(plaintext)
|
|
10
|
+
* cipher = encrypt(plaintext, key) // existing envelope JSON
|
|
11
|
+
* kind = byteLength(cipher) <= PLAN_INLINE_THRESHOLD_BYTES ? 'inline' : 'attachment'
|
|
12
|
+
*
|
|
13
|
+
* The base64 layer exists precisely so the shipping string-in/string-out crypto
|
|
14
|
+
* works unchanged on gzip binary. No new crypto lives here.
|
|
15
|
+
*
|
|
16
|
+
* The four shipping types (question / answer / notification /
|
|
17
|
+
* dismiss_notification) must NOT go through this — they keep a byte-identical
|
|
18
|
+
* wire format and stay wired to chunking.ts.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Ciphers at or under this size travel inline in the outer message; larger ones
|
|
22
|
+
* become an ntfy attachment. Chosen so the whole outer message stays under
|
|
23
|
+
* CHUNK_THRESHOLD_BYTES — a chunked plan_review would break the
|
|
24
|
+
* one-ntfy-message-per-review guarantee (C-1).
|
|
25
|
+
*/
|
|
26
|
+
export const PLAN_INLINE_THRESHOLD_BYTES = 2048;
|
|
27
|
+
/**
|
|
28
|
+
* Caps on what a payload may expand to.
|
|
29
|
+
*
|
|
30
|
+
* The content hash is no protection here: it is computed over the compressed
|
|
31
|
+
* plaintext, which is exactly the bytes an attacker controls, so it confirms
|
|
32
|
+
* "these are the bytes that were sent" and says nothing about what they
|
|
33
|
+
* decompress to. Without a cap a 1 GiB expansion is a couple of seconds of
|
|
34
|
+
* work for whoever holds the topic (H4).
|
|
35
|
+
*
|
|
36
|
+
* A plan is capped at 1 MB and a body carries the plan plus its diff, so 8 MB
|
|
37
|
+
* is well clear of anything legitimate. The compressed cap is below ntfy's own
|
|
38
|
+
* 2 MB attachment limit, so nothing that could arrive is rejected by it.
|
|
39
|
+
*/
|
|
40
|
+
export const PLAN_MAX_COMPRESSED_BYTES = 2 * 1024 * 1024;
|
|
41
|
+
export const PLAN_MAX_DECOMPRESSED_BYTES = 8 * 1024 * 1024;
|
|
42
|
+
/** Raised when a payload cannot be turned back into its body object. */
|
|
43
|
+
export class PayloadDecodeError extends Error {
|
|
44
|
+
cause;
|
|
45
|
+
constructor(message, cause) {
|
|
46
|
+
super(message);
|
|
47
|
+
this.cause = cause;
|
|
48
|
+
this.name = 'PayloadDecodeError';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Raised when an outer message would need chunking, which new types never do. */
|
|
52
|
+
export class PlanMessageTooLargeError extends Error {
|
|
53
|
+
byteLength;
|
|
54
|
+
constructor(byteLength) {
|
|
55
|
+
super(`Plan message outer body is ${byteLength} bytes, over the ${CHUNK_THRESHOLD_BYTES}-byte ` +
|
|
56
|
+
`single-message limit. Plan-review messages must never chunk (C-1).`);
|
|
57
|
+
this.byteLength = byteLength;
|
|
58
|
+
this.name = 'PlanMessageTooLargeError';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** sha256 hex of a utf-8 string. */
|
|
62
|
+
export function sha256Hex(value) {
|
|
63
|
+
return crypto.createHash('sha256').update(value, 'utf8').digest('hex');
|
|
64
|
+
}
|
|
65
|
+
/** Encode a plan-review body for the wire. */
|
|
66
|
+
export function encodePayload(body, keyHex) {
|
|
67
|
+
const plaintext = zlib.gzipSync(Buffer.from(JSON.stringify(body), 'utf8')).toString('base64');
|
|
68
|
+
const contentHash = sha256Hex(plaintext);
|
|
69
|
+
const contentLength = Buffer.byteLength(plaintext, 'utf8');
|
|
70
|
+
const cipher = keyHex ? encrypt(plaintext, keyHex) : plaintext;
|
|
71
|
+
const inline = Buffer.byteLength(cipher, 'utf8') <= PLAN_INLINE_THRESHOLD_BYTES;
|
|
72
|
+
return {
|
|
73
|
+
ref: inline
|
|
74
|
+
? { kind: 'inline', data: cipher, contentHash, contentLength }
|
|
75
|
+
: { kind: 'attachment', contentHash, contentLength },
|
|
76
|
+
cipher,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Inverse of encodePayload. `cipher` is `ref.data` for an inline payload, or
|
|
81
|
+
* the downloaded attachment bytes as a utf-8 string for an attachment one.
|
|
82
|
+
* Throws PayloadDecodeError on a bad key, corrupt bytes, or a hash mismatch —
|
|
83
|
+
* a mismatch must surface as a visible refusal, never a blank window (C-2).
|
|
84
|
+
*/
|
|
85
|
+
export function decodePayload(cipher, keyHex, expectedHash) {
|
|
86
|
+
let plaintext;
|
|
87
|
+
if (keyHex) {
|
|
88
|
+
try {
|
|
89
|
+
plaintext = decrypt(cipher, keyHex);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
throw new PayloadDecodeError('Failed to decrypt plan payload', err);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
plaintext = cipher;
|
|
97
|
+
}
|
|
98
|
+
const actualHash = sha256Hex(plaintext);
|
|
99
|
+
if (actualHash !== expectedHash) {
|
|
100
|
+
throw new PayloadDecodeError(`Plan payload hash mismatch: expected ${expectedHash}, got ${actualHash}`);
|
|
101
|
+
}
|
|
102
|
+
let json;
|
|
103
|
+
try {
|
|
104
|
+
const compressed = Buffer.from(plaintext, 'base64');
|
|
105
|
+
if (compressed.byteLength > PLAN_MAX_COMPRESSED_BYTES) {
|
|
106
|
+
throw new PayloadDecodeError(`Plan payload is ${compressed.byteLength} compressed bytes, over the ` +
|
|
107
|
+
`${PLAN_MAX_COMPRESSED_BYTES} limit`);
|
|
108
|
+
}
|
|
109
|
+
json = zlib
|
|
110
|
+
.gunzipSync(compressed, { maxOutputLength: PLAN_MAX_DECOMPRESSED_BYTES })
|
|
111
|
+
.toString('utf8');
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
if (err instanceof PayloadDecodeError)
|
|
115
|
+
throw err;
|
|
116
|
+
throw new PayloadDecodeError('Failed to gunzip plan payload', err);
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
return JSON.parse(json);
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
throw new PayloadDecodeError('Plan payload is not valid JSON', err);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Guard for the publish path: a plan-review message must fit in one ntfy
|
|
127
|
+
* message. Call this on the serialized outer body (post-encryption) before
|
|
128
|
+
* publishing, and throw rather than silently falling back to chunking.
|
|
129
|
+
*/
|
|
130
|
+
export function assertNoChunk(outerBody) {
|
|
131
|
+
if (shouldChunk(outerBody)) {
|
|
132
|
+
throw new PlanMessageTooLargeError(Buffer.byteLength(outerBody, 'utf8'));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=payload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload.js","sourceRoot":"","sources":["../src/payload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { PlanIdentity, RecordedRevision } from './snapshot-store.js';
|
|
2
|
+
/**
|
|
3
|
+
* Pick what this revision is diffed against.
|
|
4
|
+
*
|
|
5
|
+
* Revision 1 uses git `HEAD:<relpath>` when the plan is tracked, else nothing
|
|
6
|
+
* (all-added, B-1/B-5). Revision ≥ 2 uses the previous snapshot and ignores git
|
|
7
|
+
* entirely, because plans usually live in gitignored directories where git has
|
|
8
|
+
* no baseline and every revision would otherwise look brand new.
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveBaseline(identity: PlanIdentity, recorded: RecordedRevision): string | null;
|
|
11
|
+
/**
|
|
12
|
+
* Build the unified diff for a plan revision.
|
|
13
|
+
*
|
|
14
|
+
* @param displayPath - Repo-relative path used in the `---`/`+++` headers (F-9)
|
|
15
|
+
* @param content - The revision being reviewed
|
|
16
|
+
* @param baseline - What to diff against, or null for a brand-new plan
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildPlanDiff(displayPath: string, content: string, baseline: string | null): string;
|
|
19
|
+
/**
|
|
20
|
+
* Split into lines on LF only, leaving any CR attached to the end of its line.
|
|
21
|
+
*
|
|
22
|
+
* That is what makes a CRLF plan yield the same line count — and therefore the
|
|
23
|
+
* same anchors — as its LF twin, while the bytes travel through untouched.
|
|
24
|
+
*/
|
|
25
|
+
export declare function splitLinesPreserving(text: string): {
|
|
26
|
+
lines: string[];
|
|
27
|
+
hasTrailingNewline: boolean;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=plan-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-diff.d.ts","sourceRoot":"","sources":["../src/plan-diff.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAqC1E;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAQjG;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAenG;AAwED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,kBAAkB,EAAE,OAAO,CAAA;CAAE,CAQnG"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { structuredPatch, formatPatch } from 'diff';
|
|
2
|
+
import { isTracked, readHeadContent } from './git-context.js';
|
|
3
|
+
/**
|
|
4
|
+
* The unified diff shipped alongside a plan's current content.
|
|
5
|
+
*
|
|
6
|
+
* Context is effectively infinite, so the "diff" is the whole document with
|
|
7
|
+
* change markers — the reviewer scrolls one continuous plan rather than
|
|
8
|
+
* disconnected hunks, and every line is anchorable.
|
|
9
|
+
*
|
|
10
|
+
* Two cases would otherwise render as an empty document and become
|
|
11
|
+
* unselectable, so both get a synthetic hunk:
|
|
12
|
+
* - a brand-new plan → all-added `@@ -0,0 +1,N @@`
|
|
13
|
+
* - a byte-identical resubmit → all-context `@@ -1,N +1,N @@` (B-3)
|
|
14
|
+
*
|
|
15
|
+
* Line endings are preserved verbatim. Normalizing CRLF here would change the
|
|
16
|
+
* line count relative to the snapshot and shift every comment anchor (B-11).
|
|
17
|
+
*/
|
|
18
|
+
/** Full-document context: large enough that no real plan produces split hunks. */
|
|
19
|
+
const FULL_DOCUMENT_CONTEXT = 999_999;
|
|
20
|
+
/**
|
|
21
|
+
* How long the diff may run before giving up.
|
|
22
|
+
*
|
|
23
|
+
* `structuredPatch` is synchronous, so its cost is the event loop's cost: the
|
|
24
|
+
* heartbeat cannot fire and every other in-flight request stalls behind it.
|
|
25
|
+
* Measured at 20 s for 10,000 changed lines, extrapolating to roughly 45 s at
|
|
26
|
+
* the 1 MB plan cap — and a normally rewritten plan gets there without anyone
|
|
27
|
+
* trying (H6). Well under the 15 s heartbeat interval, so a bail-out still
|
|
28
|
+
* leaves the call looking alive.
|
|
29
|
+
*/
|
|
30
|
+
const DIFF_TIMEOUT_MS = 3_000;
|
|
31
|
+
/** jsdiff's marker for a final line with no terminating newline. */
|
|
32
|
+
const NO_NEWLINE_MARKER = '\';
|
|
33
|
+
/**
|
|
34
|
+
* Pick what this revision is diffed against.
|
|
35
|
+
*
|
|
36
|
+
* Revision 1 uses git `HEAD:<relpath>` when the plan is tracked, else nothing
|
|
37
|
+
* (all-added, B-1/B-5). Revision ≥ 2 uses the previous snapshot and ignores git
|
|
38
|
+
* entirely, because plans usually live in gitignored directories where git has
|
|
39
|
+
* no baseline and every revision would otherwise look brand new.
|
|
40
|
+
*/
|
|
41
|
+
export function resolveBaseline(identity, recorded) {
|
|
42
|
+
if (recorded.revision >= 2) {
|
|
43
|
+
return recorded.previousContent;
|
|
44
|
+
}
|
|
45
|
+
if (identity.repoRoot && isTracked(identity.repoRoot, identity.resolvedPath)) {
|
|
46
|
+
return readHeadContent(identity.repoRoot, identity.resolvedPath);
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Build the unified diff for a plan revision.
|
|
52
|
+
*
|
|
53
|
+
* @param displayPath - Repo-relative path used in the `---`/`+++` headers (F-9)
|
|
54
|
+
* @param content - The revision being reviewed
|
|
55
|
+
* @param baseline - What to diff against, or null for a brand-new plan
|
|
56
|
+
*/
|
|
57
|
+
export function buildPlanDiff(displayPath, content, baseline) {
|
|
58
|
+
const patch = baseline === null ? null : diffAgainst(displayPath, baseline, content);
|
|
59
|
+
// No baseline, or a comparison that ran out of time: show the whole document
|
|
60
|
+
// as new. The reviewer loses the change markers but keeps every line, which
|
|
61
|
+
// is far better than a call that blocks the process for a minute.
|
|
62
|
+
const resolved = patch ?? emptyPatch(displayPath, [allAddedHunk(content)]);
|
|
63
|
+
// Identical revisions produce no hunks at all; substitute the all-context
|
|
64
|
+
// document so an unchanged resubmit stays fully line-selectable (B-3).
|
|
65
|
+
if (resolved.hunks.length === 0) {
|
|
66
|
+
resolved.hunks = [allContextHunk(content)];
|
|
67
|
+
}
|
|
68
|
+
return formatPatch(resolved);
|
|
69
|
+
}
|
|
70
|
+
/** `structuredPatch` returns undefined when it hits the timeout, despite its types. */
|
|
71
|
+
function diffAgainst(displayPath, baseline, content) {
|
|
72
|
+
const patch = structuredPatch(`a/${displayPath}`, `b/${displayPath}`, baseline, content, undefined, undefined,
|
|
73
|
+
// `timeout` is honoured by jsdiff's diff engine (base.js) but missing from
|
|
74
|
+
// @types/diff's PatchOptions, hence the cast.
|
|
75
|
+
{ context: FULL_DOCUMENT_CONTEXT, timeout: DIFF_TIMEOUT_MS });
|
|
76
|
+
if (!patch) {
|
|
77
|
+
console.error(`Diff of ${displayPath} exceeded ${DIFF_TIMEOUT_MS}ms; showing the plan without change markers.`);
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return patch;
|
|
81
|
+
}
|
|
82
|
+
/** A patch envelope carrying hand-built hunks, named exactly as jsdiff names them. */
|
|
83
|
+
function emptyPatch(displayPath, hunks) {
|
|
84
|
+
return {
|
|
85
|
+
oldFileName: `a/${displayPath}`,
|
|
86
|
+
newFileName: `b/${displayPath}`,
|
|
87
|
+
oldHeader: undefined,
|
|
88
|
+
newHeader: undefined,
|
|
89
|
+
hunks,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** `@@ -0,0 +1,N @@` — every line added. */
|
|
93
|
+
function allAddedHunk(content) {
|
|
94
|
+
const { lines, hasTrailingNewline } = splitLinesPreserving(content);
|
|
95
|
+
return {
|
|
96
|
+
// formatPatch applies the unified-diff quirk of printing one less when the
|
|
97
|
+
// side has zero lines, so these starts are the pre-quirk values.
|
|
98
|
+
oldStart: 1,
|
|
99
|
+
oldLines: 0,
|
|
100
|
+
newStart: 1,
|
|
101
|
+
newLines: lines.length,
|
|
102
|
+
lines: prefix(lines, '+', hasTrailingNewline),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/** `@@ -1,N +1,N @@` — every line unchanged, but present and therefore selectable. */
|
|
106
|
+
function allContextHunk(content) {
|
|
107
|
+
const { lines, hasTrailingNewline } = splitLinesPreserving(content);
|
|
108
|
+
return {
|
|
109
|
+
oldStart: 1,
|
|
110
|
+
oldLines: lines.length,
|
|
111
|
+
newStart: 1,
|
|
112
|
+
newLines: lines.length,
|
|
113
|
+
lines: prefix(lines, ' ', hasTrailingNewline),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function prefix(lines, marker, hasTrailingNewline) {
|
|
117
|
+
const out = lines.map((line) => marker + line);
|
|
118
|
+
if (!hasTrailingNewline && out.length > 0) {
|
|
119
|
+
out.push(NO_NEWLINE_MARKER);
|
|
120
|
+
}
|
|
121
|
+
return out;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Split into lines on LF only, leaving any CR attached to the end of its line.
|
|
125
|
+
*
|
|
126
|
+
* That is what makes a CRLF plan yield the same line count — and therefore the
|
|
127
|
+
* same anchors — as its LF twin, while the bytes travel through untouched.
|
|
128
|
+
*/
|
|
129
|
+
export function splitLinesPreserving(text) {
|
|
130
|
+
if (text === '')
|
|
131
|
+
return { lines: [], hasTrailingNewline: true };
|
|
132
|
+
const hasTrailingNewline = text.endsWith('\n');
|
|
133
|
+
const lines = text.split('\n');
|
|
134
|
+
if (hasTrailingNewline)
|
|
135
|
+
lines.pop();
|
|
136
|
+
return { lines, hasTrailingNewline };
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=plan-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-diff.js","sourceRoot":"","sources":["../src/plan-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Default hard ceiling on plan size. 1 MB gzips to ~250 KB, well under ntfy's 2 MB. */
|
|
2
|
+
export declare const PLAN_MAX_BYTES: number;
|
|
3
|
+
/** Raised for every rejection in this module, so the caller can map one error kind. */
|
|
4
|
+
export declare class PlanFileError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
/** A validated plan file plus the bytes that were actually read. */
|
|
8
|
+
export interface PlanFile {
|
|
9
|
+
/** Fully resolved, symlink-free absolute path. */
|
|
10
|
+
resolvedPath: string;
|
|
11
|
+
/** utf-8 content, line endings preserved verbatim (B-11). */
|
|
12
|
+
content: string;
|
|
13
|
+
/** utf-8 byte length of `content`. */
|
|
14
|
+
byteLength: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Validate and read a plan file.
|
|
18
|
+
*
|
|
19
|
+
* @param filePath - Absolute or `cwd`-relative path supplied by the agent
|
|
20
|
+
* @param cwd - Base for a relative path; defaults to the server's cwd
|
|
21
|
+
* @param maxBytes - Hard size ceiling; over it is an error, never a truncation
|
|
22
|
+
*/
|
|
23
|
+
export declare function readPlanFile(filePath: string, cwd?: string, maxBytes?: number): PlanFile;
|
|
24
|
+
//# sourceMappingURL=plan-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-file.d.ts","sourceRoot":"","sources":["../src/plan-file.ts"],"names":[],"mappings":"AAwBA,wFAAwF;AACxF,eAAO,MAAM,cAAc,QAAc,CAAC;AAE1C,uFAAuF;AACvF,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,oEAAoE;AACpE,MAAM,WAAW,QAAQ;IACvB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAsB,EAC3B,QAAQ,GAAE,MAAuB,GAChC,QAAQ,CA0EV"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { lstatSync, realpathSync, statSync, readFileSync } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Validation and reading of the markdown file an agent hands to ReviewPlan.
|
|
5
|
+
*
|
|
6
|
+
* A plan is untrusted input in two directions: the agent chooses the path, and
|
|
7
|
+
* the file's own bytes end up rendered on someone's phone. The checks below run
|
|
8
|
+
* in a fixed order so no widening step can undo a narrowing one:
|
|
9
|
+
*
|
|
10
|
+
* 1. reject NUL (F-3 — a NUL truncates the path inside libc)
|
|
11
|
+
* 2. resolve the realpath (F-2 — collapses symlinks and `..`)
|
|
12
|
+
* 3. re-check the extension on the RESOLVED path (F-2 — a `.md` symlink
|
|
13
|
+
* pointing at `~/.ssh/id_rsa` passes an extension check on the link name)
|
|
14
|
+
* 4. lstat + stat: regular files only, no directories, no devices (F-3)
|
|
15
|
+
* 5. size cap as a HARD error, never truncation (F-4)
|
|
16
|
+
*
|
|
17
|
+
* The file is read exactly once, after every check, and hashed from the bytes
|
|
18
|
+
* actually read — so the hash always describes what was reviewed.
|
|
19
|
+
*/
|
|
20
|
+
/** Extensions accepted as a plan. Checked on the resolved realpath, not the argument. */
|
|
21
|
+
const MARKDOWN_EXTENSIONS = ['.md', '.markdown'];
|
|
22
|
+
/** Default hard ceiling on plan size. 1 MB gzips to ~250 KB, well under ntfy's 2 MB. */
|
|
23
|
+
export const PLAN_MAX_BYTES = 1024 * 1024;
|
|
24
|
+
/** Raised for every rejection in this module, so the caller can map one error kind. */
|
|
25
|
+
export class PlanFileError extends Error {
|
|
26
|
+
constructor(message) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = 'PlanFileError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Validate and read a plan file.
|
|
33
|
+
*
|
|
34
|
+
* @param filePath - Absolute or `cwd`-relative path supplied by the agent
|
|
35
|
+
* @param cwd - Base for a relative path; defaults to the server's cwd
|
|
36
|
+
* @param maxBytes - Hard size ceiling; over it is an error, never a truncation
|
|
37
|
+
*/
|
|
38
|
+
export function readPlanFile(filePath, cwd = process.cwd(), maxBytes = PLAN_MAX_BYTES) {
|
|
39
|
+
if (typeof filePath !== 'string' || filePath.trim() === '') {
|
|
40
|
+
throw new PlanFileError('filePath must be a non-empty string');
|
|
41
|
+
}
|
|
42
|
+
// 1. NUL — must precede every fs call, since the path is truncated at the NUL
|
|
43
|
+
// by the OS layer and the checks below would then describe a different file.
|
|
44
|
+
if (filePath.includes('\0')) {
|
|
45
|
+
throw new PlanFileError('filePath contains a NUL byte');
|
|
46
|
+
}
|
|
47
|
+
const absolute = path.resolve(cwd, filePath);
|
|
48
|
+
// 2. realpath — collapses symlinks and `..` so steps 3-5 describe the real target.
|
|
49
|
+
let resolvedPath;
|
|
50
|
+
try {
|
|
51
|
+
resolvedPath = realpathSync.native(absolute);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
const code = err.code;
|
|
55
|
+
if (code === 'ENOENT') {
|
|
56
|
+
throw new PlanFileError(`Plan file not found: ${absolute}`);
|
|
57
|
+
}
|
|
58
|
+
throw new PlanFileError(`Cannot resolve plan file ${absolute}: ${err.message}`);
|
|
59
|
+
}
|
|
60
|
+
// 3. Extension on the RESOLVED path. Checking the argument instead would let
|
|
61
|
+
// `plan.md -> /etc/shadow` through (F-2).
|
|
62
|
+
const ext = path.extname(resolvedPath).toLowerCase();
|
|
63
|
+
if (!MARKDOWN_EXTENSIONS.includes(ext)) {
|
|
64
|
+
throw new PlanFileError(`Plan file must be markdown (${MARKDOWN_EXTENSIONS.join(' or ')}); ` +
|
|
65
|
+
`${resolvedPath} resolves to '${ext || 'no extension'}'`);
|
|
66
|
+
}
|
|
67
|
+
// 4. lstat on the resolved path catches a symlink chain that realpath could
|
|
68
|
+
// not fully collapse; stat catches directories, FIFOs, sockets, devices.
|
|
69
|
+
const linkStat = lstatSync(resolvedPath);
|
|
70
|
+
if (linkStat.isSymbolicLink()) {
|
|
71
|
+
throw new PlanFileError(`Plan file is still a symlink after resolution: ${resolvedPath}`);
|
|
72
|
+
}
|
|
73
|
+
const fileStat = statSync(resolvedPath);
|
|
74
|
+
if (fileStat.isDirectory()) {
|
|
75
|
+
throw new PlanFileError(`Plan file is a directory: ${resolvedPath}`);
|
|
76
|
+
}
|
|
77
|
+
if (!fileStat.isFile()) {
|
|
78
|
+
throw new PlanFileError(`Plan file is not a regular file: ${resolvedPath}`);
|
|
79
|
+
}
|
|
80
|
+
// 5. Size — a hard error. Truncating would hand the human a plan that differs
|
|
81
|
+
// from the one on disk while still hashing as "what was reviewed" (F-4).
|
|
82
|
+
if (fileStat.size > maxBytes) {
|
|
83
|
+
throw new PlanFileError(`Plan file is ${fileStat.size} bytes, over the ${maxBytes}-byte limit. ` +
|
|
84
|
+
`Split the plan or raise the limit — it is never truncated.`);
|
|
85
|
+
}
|
|
86
|
+
const buffer = readFileSync(resolvedPath);
|
|
87
|
+
// Re-check against the bytes read, not the stat: the file may have grown
|
|
88
|
+
// between stat and read (TOCTOU).
|
|
89
|
+
if (buffer.byteLength > maxBytes) {
|
|
90
|
+
throw new PlanFileError(`Plan file grew to ${buffer.byteLength} bytes while being read, over the ${maxBytes}-byte limit.`);
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
resolvedPath,
|
|
94
|
+
content: buffer.toString('utf8'),
|
|
95
|
+
byteLength: buffer.byteLength,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=plan-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-file.js","sourceRoot":"","sources":["../src/plan-file.ts"],"names":[],"mappings":"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"}
|