@wrongstack/acp 0.295.0 → 0.295.1
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/agent/protocol-handler.d.ts +9 -0
- package/dist/agent/protocol-handler.d.ts.map +1 -1
- package/dist/agent/server-agent-turn.d.ts +83 -1
- package/dist/agent/server-agent-turn.d.ts.map +1 -1
- package/dist/agent/session-store.d.ts.map +1 -1
- package/dist/agent/stdio-transport.d.ts +18 -0
- package/dist/agent/stdio-transport.d.ts.map +1 -1
- package/dist/agent/wrongstack-acp-agent.d.ts +35 -0
- package/dist/agent/wrongstack-acp-agent.d.ts.map +1 -1
- package/dist/agent.js +30 -23
- package/dist/agent.js.map +3 -3
- package/dist/client/file-server.d.ts +19 -0
- package/dist/client/file-server.d.ts.map +1 -1
- package/dist/client/terminal-server.d.ts.map +1 -1
- package/dist/client/trust-boundary-permission.d.ts +16 -1
- package/dist/client/trust-boundary-permission.d.ts.map +1 -1
- package/dist/client/websocket-transport.d.ts.map +1 -1
- package/dist/client.js +40 -35
- package/dist/client.js.map +2 -2
- package/dist/index.js +91 -82
- package/dist/index.js.map +4 -4
- package/dist/integration/acp-bench.d.ts +32 -0
- package/dist/integration/acp-bench.d.ts.map +1 -1
- package/dist/integration/acp-subagent-runner.d.ts.map +1 -1
- package/dist/integration/ensemble-runner.d.ts +22 -1
- package/dist/integration/ensemble-runner.d.ts.map +1 -1
- package/dist/registry/acp-registry-fetch.d.ts +1 -1
- package/dist/registry/acp-registry-fetch.d.ts.map +1 -1
- package/dist/registry/ensemble-registry.d.ts +22 -0
- package/dist/registry/ensemble-registry.d.ts.map +1 -1
- package/dist/version.d.ts +8 -0
- package/dist/version.d.ts.map +1 -1
- package/dist/wrongstack-acp-agent.js +26 -20
- package/dist/wrongstack-acp-agent.js.map +2 -2
- package/package.json +2 -2
|
@@ -14,6 +14,24 @@ export interface FileServerOptions {
|
|
|
14
14
|
* `writeTextFile` call. Default 5 MiB.
|
|
15
15
|
*/
|
|
16
16
|
maxWriteBytes?: number;
|
|
17
|
+
/** Filesystem implementation override for deterministic tests. */
|
|
18
|
+
operations?: FileServerOperations;
|
|
19
|
+
}
|
|
20
|
+
export interface FileServerOperations {
|
|
21
|
+
stat(file: string): Promise<{
|
|
22
|
+
size: number;
|
|
23
|
+
}>;
|
|
24
|
+
readFile(file: string, options: {
|
|
25
|
+
encoding: 'utf8';
|
|
26
|
+
signal: AbortSignal;
|
|
27
|
+
}): Promise<string>;
|
|
28
|
+
writeFile(file: string, content: string, options: {
|
|
29
|
+
encoding: 'utf8';
|
|
30
|
+
signal: AbortSignal;
|
|
31
|
+
}): Promise<void>;
|
|
32
|
+
realpath(file: string): Promise<string>;
|
|
33
|
+
rename(from: string, to: string): Promise<void>;
|
|
34
|
+
unlink(file: string): Promise<void>;
|
|
17
35
|
}
|
|
18
36
|
export interface ReadFileParams {
|
|
19
37
|
sessionId: string;
|
|
@@ -40,6 +58,7 @@ export declare class FileServer {
|
|
|
40
58
|
private readonly timeoutMs;
|
|
41
59
|
private readonly maxReadBytes;
|
|
42
60
|
private readonly maxWriteBytes;
|
|
61
|
+
private readonly operations;
|
|
43
62
|
constructor(opts: FileServerOptions);
|
|
44
63
|
/** Read a text file. Returns the content as a string. */
|
|
45
64
|
readTextFile(params: ReadFileParams): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-server.d.ts","sourceRoot":"","sources":["../../src/client/file-server.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"file-server.d.ts","sourceRoot":"","sources":["../../src/client/file-server.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,QAAQ,CACN,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,GACjD,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,GACjD,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAWD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,QAAQ,GACR,cAAc,GACd,SAAS,GACT,cAAc,GACd,WAAW,CAAC;AAKhB;;;GAGG;AACH,qBAAa,OAAQ,SAAQ,KAAK;IAChC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,YAAY,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAK3D;CACF;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAElD,YAAY,IAAI,EAAE,iBAAiB,EAYlC;IAED,yDAAyD;IACnD,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CA8BvE;IAED,uDAAuD;IACjD,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C1D;IAED;;;;;;;OAOG;YACW,aAAa;IAmB3B;;;;OAIG;YACW,gBAAgB;CA0B/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-server.d.ts","sourceRoot":"","sources":["../../src/client/terminal-server.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAsBD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAC9D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiC;IAC9D,OAAO,CAAC,MAAM,CAAK;IAEnB,YAAY,IAAI,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"terminal-server.d.ts","sourceRoot":"","sources":["../../src/client/terminal-server.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAsBD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAC9D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiC;IAC9D,OAAO,CAAC,MAAM,CAAK;IAEnB,YAAY,IAAI,EAAE,qBAAqB,EAUtC;IAED,yDAAyD;IACzD,MAAM,CAAC,MAAM,EAAE;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,GAAG,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACxC,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CA0HzB;IAED,iEAAiE;IACjE,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG;QAC1B,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE;YAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAC;KACjE,CAWA;IAED,oEAAoE;IAC9D,WAAW,CACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAI7D;IAED,mFAAmF;IACnF,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAQ7B;IAED,uDAAuD;IACvD,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAahC;IAED,wDAAwD;IACxD,UAAU,IAAI,IAAI,CAKjB;IAED,OAAO,CAAC,UAAU;IAwBlB,OAAO,CAAC,QAAQ;IAsBhB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;CAMvB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { TrustActor, TrustAuthContext, TrustBoundary, TrustBoundaryRequest, TrustScope } from '@wrongstack/core/security';
|
|
1
|
+
import type { TrustActor, TrustAuthContext, TrustBoundary, TrustBoundaryDecision, TrustBoundaryRequest, TrustRisk, TrustScope, TrustSubject } from '@wrongstack/core/security';
|
|
2
|
+
import type { PermissionOption, RequestPermissionOutcome, ToolKind } from '../types/acp-v1.js';
|
|
2
3
|
import type { PermissionPolicy, PermissionRequest } from './permission.js';
|
|
3
4
|
export interface ACPTrustBoundaryAdapterOptions {
|
|
4
5
|
boundary: TrustBoundary;
|
|
@@ -6,6 +7,11 @@ export interface ACPTrustBoundaryAdapterOptions {
|
|
|
6
7
|
scope?: TrustScope | undefined;
|
|
7
8
|
authContext?: TrustAuthContext | undefined;
|
|
8
9
|
}
|
|
10
|
+
declare function pickOption(options: readonly PermissionOption[], allowed: boolean): RequestPermissionOutcome;
|
|
11
|
+
declare function riskFor(kind: ToolKind | undefined): TrustRisk;
|
|
12
|
+
declare function capabilityFor(request: PermissionRequest): string;
|
|
13
|
+
declare function subjectFor(request: PermissionRequest): TrustSubject;
|
|
14
|
+
declare function isAllowed(decision: TrustBoundaryDecision): boolean;
|
|
9
15
|
export declare function toTrustBoundaryRequest(request: PermissionRequest, options: Omit<ACPTrustBoundaryAdapterOptions, 'boundary'>): TrustBoundaryRequest;
|
|
10
16
|
/**
|
|
11
17
|
* Adapts ACP permission callbacks to the shared TrustBoundary authority.
|
|
@@ -13,4 +19,13 @@ export declare function toTrustBoundaryRequest(request: PermissionRequest, optio
|
|
|
13
19
|
* boundary's host adapter, which must return a final `allow` after consent.
|
|
14
20
|
*/
|
|
15
21
|
export declare function makeTrustBoundaryPermissionPolicy(options: ACPTrustBoundaryAdapterOptions): PermissionPolicy;
|
|
22
|
+
/** Direct-module test seam; not re-exported by the package barrel. */
|
|
23
|
+
export declare const trustBoundaryPermissionCoverage: {
|
|
24
|
+
pickOption: typeof pickOption;
|
|
25
|
+
riskFor: typeof riskFor;
|
|
26
|
+
capabilityFor: typeof capabilityFor;
|
|
27
|
+
subjectFor: typeof subjectFor;
|
|
28
|
+
isAllowed: typeof isAllowed;
|
|
29
|
+
};
|
|
30
|
+
export {};
|
|
16
31
|
//# sourceMappingURL=trust-boundary-permission.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trust-boundary-permission.d.ts","sourceRoot":"","sources":["../../src/client/trust-boundary-permission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,aAAa,
|
|
1
|
+
{"version":3,"file":"trust-boundary-permission.d.ts","sourceRoot":"","sources":["../../src/client/trust-boundary-permission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,SAAS,EACT,UAAU,EACV,YAAY,EACb,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE3E,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAC5C;AAED,iBAAS,UAAU,CACjB,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,OAAO,EAAE,OAAO,GACf,wBAAwB,CAO1B;AAED,iBAAS,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAKtD;AAED,iBAAS,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAWzD;AAED,iBAAS,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,YAAY,CAkB5D;AAED,iBAAS,SAAS,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAE3D;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,IAAI,CAAC,8BAA8B,EAAE,UAAU,CAAC,GACxD,oBAAoB,CA2BtB;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,8BAA8B,GACtC,gBAAgB,CAOlB;AAED,sEAAsE;AACtE,eAAO,MAAM,+BAA+B;;;;;;CAM3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-transport.d.ts","sourceRoot":"","sources":["../../src/client/websocket-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,WAAW,+BAA+B;IAC9C,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IAC1C,4DAA4D;IAC5D,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,kEAAkE;IAClE,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAeD,qBAAa,wBAAyB,YAAW,kBAAkB;IACjE,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwC;IACjE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkC;IACvD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAEzC,YAAY,IAAI,EAAE,+BAA+B,EAIhD;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"websocket-transport.d.ts","sourceRoot":"","sources":["../../src/client/websocket-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,WAAW,+BAA+B;IAC9C,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IAC1C,4DAA4D;IAC5D,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,kEAAkE;IAClE,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAeD,qBAAa,wBAAyB,YAAW,kBAAkB;IACjE,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwC;IACjE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkC;IACvD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAEzC,YAAY,IAAI,EAAE,+BAA+B,EAIhD;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAmDrB;IAED,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBnC;IAED,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAGxD;IAED,IAAI,IAAI,IAAI,CAUX;IAED,OAAO,CAAC,MAAM;IAiCd,OAAO,CAAC,QAAQ;CASjB"}
|
package/dist/client.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// src/agent/stdio-transport.ts
|
|
2
2
|
import { expectDefined, writeErr } from "@wrongstack/core/utils";
|
|
3
|
+
import { treeKill } from "@wrongstack/core/utils/tree-kill";
|
|
3
4
|
|
|
4
5
|
// src/win32-cmd.ts
|
|
5
6
|
var WIN32_CMD_META = /[&|<>"\r\n\0]/;
|
|
@@ -29,7 +30,7 @@ function quoteWin32CmdArg(arg) {
|
|
|
29
30
|
var DEFAULT_MAX_FRAME_CHARS = 20 * 1024 * 1024;
|
|
30
31
|
var DEFAULT_MAX_QUEUED_MESSAGES = 1e3;
|
|
31
32
|
function positiveLimit(value, fallback) {
|
|
32
|
-
return Number.isFinite(value) &&
|
|
33
|
+
return value !== void 0 && Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback;
|
|
33
34
|
}
|
|
34
35
|
var ClientTransport = class {
|
|
35
36
|
child = null;
|
|
@@ -47,10 +48,7 @@ var ClientTransport = class {
|
|
|
47
48
|
...options
|
|
48
49
|
};
|
|
49
50
|
this.maxFrameChars = positiveLimit(options.maxFrameChars, DEFAULT_MAX_FRAME_CHARS);
|
|
50
|
-
this.maxQueuedMessages = positiveLimit(
|
|
51
|
-
options.maxQueuedMessages,
|
|
52
|
-
DEFAULT_MAX_QUEUED_MESSAGES
|
|
53
|
-
);
|
|
51
|
+
this.maxQueuedMessages = positiveLimit(options.maxQueuedMessages, DEFAULT_MAX_QUEUED_MESSAGES);
|
|
54
52
|
}
|
|
55
53
|
async start() {
|
|
56
54
|
if (this.child) return;
|
|
@@ -69,13 +67,13 @@ var ClientTransport = class {
|
|
|
69
67
|
const spawnCwd = isPkgLauncher ? os.homedir() : this.opts.cwd;
|
|
70
68
|
try {
|
|
71
69
|
const childArgs = this.opts.args ?? [];
|
|
72
|
-
const
|
|
73
|
-
this.child = spawn2(
|
|
70
|
+
const invocation = spawnInvocation(this.opts.command, childArgs, process.platform);
|
|
71
|
+
this.child = spawn2(invocation.command, invocation.args, {
|
|
74
72
|
env: { ...buildChildEnv2(), ...this.opts.env },
|
|
75
73
|
cwd: spawnCwd,
|
|
76
74
|
stdio: ["pipe", "pipe", "pipe"],
|
|
77
75
|
windowsHide: true,
|
|
78
|
-
...
|
|
76
|
+
...verbatimOptions(invocation)
|
|
79
77
|
});
|
|
80
78
|
} catch (err) {
|
|
81
79
|
clearTimeout(timeout);
|
|
@@ -140,7 +138,8 @@ var ClientTransport = class {
|
|
|
140
138
|
});
|
|
141
139
|
}
|
|
142
140
|
read() {
|
|
143
|
-
if (this.messageQueue.length > 0)
|
|
141
|
+
if (this.messageQueue.length > 0)
|
|
142
|
+
return Promise.resolve(expectDefined(this.messageQueue.shift()));
|
|
144
143
|
if (this.closed) return Promise.resolve(null);
|
|
145
144
|
return new Promise((resolve3) => {
|
|
146
145
|
this.resolveRead = resolve3;
|
|
@@ -159,10 +158,7 @@ var ClientTransport = class {
|
|
|
159
158
|
this.handlers.clear();
|
|
160
159
|
const child = this.child;
|
|
161
160
|
if (!child) return;
|
|
162
|
-
|
|
163
|
-
child.kill();
|
|
164
|
-
} catch {
|
|
165
|
-
}
|
|
161
|
+
treeKill(child);
|
|
166
162
|
this.child = null;
|
|
167
163
|
}
|
|
168
164
|
onChildData(chunk) {
|
|
@@ -226,6 +222,13 @@ var ClientTransport = class {
|
|
|
226
222
|
}
|
|
227
223
|
}
|
|
228
224
|
};
|
|
225
|
+
function spawnInvocation(command, args, platform) {
|
|
226
|
+
if (platform !== "win32") return { command, args };
|
|
227
|
+
return buildWin32CmdShimInvocation(command, args);
|
|
228
|
+
}
|
|
229
|
+
function verbatimOptions(invocation) {
|
|
230
|
+
return invocation.windowsVerbatimArguments ? { windowsVerbatimArguments: invocation.windowsVerbatimArguments } : {};
|
|
231
|
+
}
|
|
229
232
|
|
|
230
233
|
// src/types/acp-v1.ts
|
|
231
234
|
var ACP_PROTOCOL_VERSION = 1;
|
|
@@ -235,6 +238,14 @@ import { randomBytes } from "node:crypto";
|
|
|
235
238
|
import { realpathSync } from "node:fs";
|
|
236
239
|
import * as fsp from "node:fs/promises";
|
|
237
240
|
import * as path from "node:path";
|
|
241
|
+
var DEFAULT_FILE_OPERATIONS = {
|
|
242
|
+
stat: fsp.stat,
|
|
243
|
+
readFile: fsp.readFile,
|
|
244
|
+
writeFile: fsp.writeFile,
|
|
245
|
+
realpath: fsp.realpath,
|
|
246
|
+
rename: fsp.rename,
|
|
247
|
+
unlink: fsp.unlink
|
|
248
|
+
};
|
|
238
249
|
var DEFAULT_MAX_READ_BYTES = 5 * 1024 * 1024;
|
|
239
250
|
var DEFAULT_MAX_WRITE_BYTES = 5 * 1024 * 1024;
|
|
240
251
|
var FsError = class extends Error {
|
|
@@ -253,12 +264,14 @@ var FileServer = class {
|
|
|
253
264
|
timeoutMs;
|
|
254
265
|
maxReadBytes;
|
|
255
266
|
maxWriteBytes;
|
|
267
|
+
operations;
|
|
256
268
|
constructor(opts) {
|
|
257
269
|
this.root = path.resolve(opts.projectRoot);
|
|
258
270
|
this.realRoot = safeRealpathSync(this.root);
|
|
259
271
|
this.timeoutMs = opts.timeoutMs ?? 3e4;
|
|
260
272
|
this.maxReadBytes = opts.maxReadBytes ?? DEFAULT_MAX_READ_BYTES;
|
|
261
273
|
this.maxWriteBytes = opts.maxWriteBytes ?? DEFAULT_MAX_WRITE_BYTES;
|
|
274
|
+
this.operations = opts.operations ?? DEFAULT_FILE_OPERATIONS;
|
|
262
275
|
}
|
|
263
276
|
/** Read a text file. Returns the content as a string. */
|
|
264
277
|
async readTextFile(params) {
|
|
@@ -266,7 +279,7 @@ var FileServer = class {
|
|
|
266
279
|
const controller = new AbortController();
|
|
267
280
|
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
268
281
|
try {
|
|
269
|
-
const stat2 = await
|
|
282
|
+
const stat2 = await this.operations.stat(safe).catch((err) => {
|
|
270
283
|
throw mapFsError(err, safe);
|
|
271
284
|
});
|
|
272
285
|
if (stat2.size > this.maxReadBytes) {
|
|
@@ -276,7 +289,7 @@ var FileServer = class {
|
|
|
276
289
|
`file is ${stat2.size} bytes, max read is ${this.maxReadBytes} bytes`
|
|
277
290
|
);
|
|
278
291
|
}
|
|
279
|
-
const content = await
|
|
292
|
+
const content = await this.operations.readFile(safe, {
|
|
280
293
|
encoding: "utf8",
|
|
281
294
|
signal: controller.signal
|
|
282
295
|
});
|
|
@@ -306,20 +319,20 @@ var FileServer = class {
|
|
|
306
319
|
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
307
320
|
const tmp = `${safe}.${randomBytes(6).toString("hex")}.tmp`;
|
|
308
321
|
try {
|
|
309
|
-
await
|
|
322
|
+
await this.operations.writeFile(tmp, params.content, {
|
|
310
323
|
encoding: "utf8",
|
|
311
324
|
signal: controller.signal
|
|
312
325
|
});
|
|
313
326
|
await this.assertRealInside(tmp);
|
|
314
327
|
await this.assertRealInside(path.dirname(safe));
|
|
315
|
-
await
|
|
328
|
+
await this.operations.rename(tmp, safe);
|
|
316
329
|
} catch (err) {
|
|
317
330
|
if (err instanceof FsError) {
|
|
318
|
-
await
|
|
331
|
+
await this.operations.unlink(tmp).catch(() => void 0);
|
|
319
332
|
throw err;
|
|
320
333
|
}
|
|
321
334
|
try {
|
|
322
|
-
await
|
|
335
|
+
await this.operations.unlink(tmp);
|
|
323
336
|
} catch {
|
|
324
337
|
}
|
|
325
338
|
if (controller.signal.aborted) {
|
|
@@ -363,12 +376,14 @@ var FileServer = class {
|
|
|
363
376
|
for (; ; ) {
|
|
364
377
|
let real;
|
|
365
378
|
try {
|
|
366
|
-
real = await
|
|
379
|
+
real = await this.operations.realpath(probe);
|
|
367
380
|
} catch (err) {
|
|
368
381
|
const code = err.code;
|
|
369
382
|
if (code === "ENOENT") {
|
|
370
383
|
const parent = path.dirname(probe);
|
|
371
|
-
if (parent === probe)
|
|
384
|
+
if (parent === probe) {
|
|
385
|
+
throw new FsError("ENOENT", resolvedPath, `no existing ancestor: ${resolvedPath}`);
|
|
386
|
+
}
|
|
372
387
|
probe = parent;
|
|
373
388
|
continue;
|
|
374
389
|
}
|
|
@@ -466,7 +481,6 @@ var TerminalServer = class {
|
|
|
466
481
|
this.outputByteLimit = opts.outputByteLimit ?? 1024 * 1024;
|
|
467
482
|
this.maxOutputByteLimit = opts.maxOutputByteLimit ?? 16 * 1024 * 1024;
|
|
468
483
|
this.maxTerminals = this.clampFiniteInt(opts.maxTerminals, 32);
|
|
469
|
-
if (this.maxTerminals < 1) throw new RangeError("maxTerminals must be at least 1");
|
|
470
484
|
this.abortSignal = opts.signal;
|
|
471
485
|
if (opts.signal) {
|
|
472
486
|
opts.signal.addEventListener("abort", this.abortHandler, { once: true });
|
|
@@ -797,7 +811,6 @@ var WebSocketClientTransport = class {
|
|
|
797
811
|
const ws = new WS(this.opts.url, this.opts.protocols);
|
|
798
812
|
this.ws = ws;
|
|
799
813
|
const timer = setTimeout(() => {
|
|
800
|
-
if (settled) return;
|
|
801
814
|
settled = true;
|
|
802
815
|
try {
|
|
803
816
|
ws.close();
|
|
@@ -835,7 +848,7 @@ var WebSocketClientTransport = class {
|
|
|
835
848
|
}
|
|
836
849
|
try {
|
|
837
850
|
const serialized = JSON.stringify(msg);
|
|
838
|
-
const buffered = Number.isFinite(this.ws.bufferedAmount) ? this.ws.bufferedAmount
|
|
851
|
+
const buffered = Number.isFinite(this.ws.bufferedAmount) ? this.ws.bufferedAmount : 0;
|
|
839
852
|
if (buffered + Buffer.byteLength(serialized, "utf8") > this.maxBufferedBytes) {
|
|
840
853
|
this.stop();
|
|
841
854
|
return Promise.reject(new Error("WebSocket transport send buffer limit exceeded"));
|
|
@@ -892,7 +905,7 @@ var WebSocketClientTransport = class {
|
|
|
892
905
|
}
|
|
893
906
|
};
|
|
894
907
|
function finitePositiveLimit(value, fallback) {
|
|
895
|
-
return Number.isFinite(value) &&
|
|
908
|
+
return value !== void 0 && Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback;
|
|
896
909
|
}
|
|
897
910
|
|
|
898
911
|
// src/client/acp-session.ts
|
|
@@ -2100,16 +2113,8 @@ function mapACPKind(acpKind) {
|
|
|
2100
2113
|
}
|
|
2101
2114
|
}
|
|
2102
2115
|
function isRetryable(kind) {
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
case "provider_rate_limit":
|
|
2106
|
-
case "provider_timeout":
|
|
2107
|
-
case "tool_threw":
|
|
2108
|
-
case "budget_timeout":
|
|
2109
|
-
return true;
|
|
2110
|
-
default:
|
|
2111
|
-
return false;
|
|
2112
|
-
}
|
|
2116
|
+
void kind;
|
|
2117
|
+
return false;
|
|
2113
2118
|
}
|
|
2114
2119
|
|
|
2115
2120
|
// src/client/tool-translator.ts
|