@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.
Files changed (35) hide show
  1. package/dist/agent/protocol-handler.d.ts +9 -0
  2. package/dist/agent/protocol-handler.d.ts.map +1 -1
  3. package/dist/agent/server-agent-turn.d.ts +83 -1
  4. package/dist/agent/server-agent-turn.d.ts.map +1 -1
  5. package/dist/agent/session-store.d.ts.map +1 -1
  6. package/dist/agent/stdio-transport.d.ts +18 -0
  7. package/dist/agent/stdio-transport.d.ts.map +1 -1
  8. package/dist/agent/wrongstack-acp-agent.d.ts +35 -0
  9. package/dist/agent/wrongstack-acp-agent.d.ts.map +1 -1
  10. package/dist/agent.js +30 -23
  11. package/dist/agent.js.map +3 -3
  12. package/dist/client/file-server.d.ts +19 -0
  13. package/dist/client/file-server.d.ts.map +1 -1
  14. package/dist/client/terminal-server.d.ts.map +1 -1
  15. package/dist/client/trust-boundary-permission.d.ts +16 -1
  16. package/dist/client/trust-boundary-permission.d.ts.map +1 -1
  17. package/dist/client/websocket-transport.d.ts.map +1 -1
  18. package/dist/client.js +40 -35
  19. package/dist/client.js.map +2 -2
  20. package/dist/index.js +91 -82
  21. package/dist/index.js.map +4 -4
  22. package/dist/integration/acp-bench.d.ts +32 -0
  23. package/dist/integration/acp-bench.d.ts.map +1 -1
  24. package/dist/integration/acp-subagent-runner.d.ts.map +1 -1
  25. package/dist/integration/ensemble-runner.d.ts +22 -1
  26. package/dist/integration/ensemble-runner.d.ts.map +1 -1
  27. package/dist/registry/acp-registry-fetch.d.ts +1 -1
  28. package/dist/registry/acp-registry-fetch.d.ts.map +1 -1
  29. package/dist/registry/ensemble-registry.d.ts +22 -0
  30. package/dist/registry/ensemble-registry.d.ts.map +1 -1
  31. package/dist/version.d.ts +8 -0
  32. package/dist/version.d.ts.map +1 -1
  33. package/dist/wrongstack-acp-agent.js +26 -20
  34. package/dist/wrongstack-acp-agent.js.map +2 -2
  35. 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;CACxB;AAED,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;IAEvC,YAAY,IAAI,EAAE,iBAAiB,EAWlC;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;CAwB/B"}
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,EAWtC;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;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE;YAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAA;KAAE,CAWlI;IAED,oEAAoE;IAC9D,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAIjG;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;IAwBhB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;CASvB"}
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,EAEb,oBAAoB,EAEpB,UAAU,EAEX,MAAM,2BAA2B,CAAC;AAEnC,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;AA0DD,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"}
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,CAoDrB;IAED,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBnC;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"}
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) && (value ?? 0) > 0 ? Math.floor(value) : fallback;
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 shim = process.platform === "win32" ? buildWin32CmdShimInvocation(this.opts.command, childArgs) : null;
73
- this.child = spawn2(shim?.command ?? this.opts.command, shim?.args ?? childArgs, {
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
- ...shim ? { windowsVerbatimArguments: shim.windowsVerbatimArguments } : {}
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) return Promise.resolve(expectDefined(this.messageQueue.shift()));
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
- try {
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 fsp.stat(safe).catch((err) => {
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 fsp.readFile(safe, {
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 fsp.writeFile(tmp, params.content, {
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 fsp.rename(tmp, safe);
328
+ await this.operations.rename(tmp, safe);
316
329
  } catch (err) {
317
330
  if (err instanceof FsError) {
318
- await fsp.unlink(tmp).catch(() => void 0);
331
+ await this.operations.unlink(tmp).catch(() => void 0);
319
332
  throw err;
320
333
  }
321
334
  try {
322
- await fsp.unlink(tmp);
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 fsp.realpath(probe);
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) return;
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 ?? 0 : 0;
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) && (value ?? 0) > 0 ? Math.floor(value) : fallback;
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
- switch (kind) {
2104
- case "provider_5xx":
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