@a5c-ai/adapters-harness-mock 5.1.1-staging.0c6199708314

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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +227 -0
  3. package/dist/bin/adapters-harness-mock.d.ts +32 -0
  4. package/dist/bin/adapters-harness-mock.d.ts.map +1 -0
  5. package/dist/bin/adapters-harness-mock.js +155 -0
  6. package/dist/bin/adapters-harness-mock.js.map +1 -0
  7. package/dist/bin/mock-harness.d.ts +2 -0
  8. package/dist/bin/mock-harness.d.ts.map +1 -0
  9. package/dist/bin/mock-harness.js +25 -0
  10. package/dist/bin/mock-harness.js.map +1 -0
  11. package/dist/http-mock.d.ts +39 -0
  12. package/dist/http-mock.d.ts.map +1 -0
  13. package/dist/http-mock.js +206 -0
  14. package/dist/http-mock.js.map +1 -0
  15. package/dist/index.d.ts +9 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +10 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/mock-process.d.ts +57 -0
  20. package/dist/mock-process.d.ts.map +1 -0
  21. package/dist/mock-process.js +388 -0
  22. package/dist/mock-process.js.map +1 -0
  23. package/dist/mocks/index.d.ts +53 -0
  24. package/dist/mocks/index.d.ts.map +1 -0
  25. package/dist/mocks/index.js +140 -0
  26. package/dist/mocks/index.js.map +1 -0
  27. package/dist/mocks/mock-types.d.ts +170 -0
  28. package/dist/mocks/mock-types.d.ts.map +1 -0
  29. package/dist/mocks/mock-types.js +2 -0
  30. package/dist/mocks/mock-types.js.map +1 -0
  31. package/dist/mocks/programmatic-mocks.d.ts +40 -0
  32. package/dist/mocks/programmatic-mocks.d.ts.map +1 -0
  33. package/dist/mocks/programmatic-mocks.js +229 -0
  34. package/dist/mocks/programmatic-mocks.js.map +1 -0
  35. package/dist/mocks/remote-mocks.d.ts +43 -0
  36. package/dist/mocks/remote-mocks.d.ts.map +1 -0
  37. package/dist/mocks/remote-mocks.js +332 -0
  38. package/dist/mocks/remote-mocks.js.map +1 -0
  39. package/dist/mocks/scriptable-transport.d.ts +23 -0
  40. package/dist/mocks/scriptable-transport.d.ts.map +1 -0
  41. package/dist/mocks/scriptable-transport.js +83 -0
  42. package/dist/mocks/scriptable-transport.js.map +1 -0
  43. package/dist/multi-execution.d.ts +1 -0
  44. package/dist/multi-execution.d.ts.map +1 -0
  45. package/dist/multi-execution.js +2 -0
  46. package/dist/multi-execution.js.map +1 -0
  47. package/dist/probe.d.ts +113 -0
  48. package/dist/probe.d.ts.map +1 -0
  49. package/dist/probe.js +722 -0
  50. package/dist/probe.js.map +1 -0
  51. package/dist/scenarios/errors.d.ts +21 -0
  52. package/dist/scenarios/errors.d.ts.map +1 -0
  53. package/dist/scenarios/errors.js +73 -0
  54. package/dist/scenarios/errors.js.map +1 -0
  55. package/dist/scenarios/hooks.d.ts +17 -0
  56. package/dist/scenarios/hooks.d.ts.map +1 -0
  57. package/dist/scenarios/hooks.js +129 -0
  58. package/dist/scenarios/hooks.js.map +1 -0
  59. package/dist/scenarios/index.d.ts +22 -0
  60. package/dist/scenarios/index.d.ts.map +1 -0
  61. package/dist/scenarios/index.js +65 -0
  62. package/dist/scenarios/index.js.map +1 -0
  63. package/dist/scenarios/interactive.d.ts +17 -0
  64. package/dist/scenarios/interactive.d.ts.map +1 -0
  65. package/dist/scenarios/interactive.js +65 -0
  66. package/dist/scenarios/interactive.js.map +1 -0
  67. package/dist/scenarios/per-agent.d.ts +17 -0
  68. package/dist/scenarios/per-agent.d.ts.map +1 -0
  69. package/dist/scenarios/per-agent.js +597 -0
  70. package/dist/scenarios/per-agent.js.map +1 -0
  71. package/dist/scenarios/wire-format.d.ts +56 -0
  72. package/dist/scenarios/wire-format.d.ts.map +1 -0
  73. package/dist/scenarios/wire-format.js +261 -0
  74. package/dist/scenarios/wire-format.js.map +1 -0
  75. package/dist/scenarios.d.ts +29 -0
  76. package/dist/scenarios.d.ts.map +1 -0
  77. package/dist/scenarios.js +141 -0
  78. package/dist/scenarios.js.map +1 -0
  79. package/dist/types.d.ts +463 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +9 -0
  82. package/dist/types.js.map +1 -0
  83. package/dist/websocket-mock.d.ts +58 -0
  84. package/dist/websocket-mock.d.ts.map +1 -0
  85. package/dist/websocket-mock.js +367 -0
  86. package/dist/websocket-mock.js.map +1 -0
  87. package/dist/workspace.d.ts +52 -0
  88. package/dist/workspace.d.ts.map +1 -0
  89. package/dist/workspace.js +157 -0
  90. package/dist/workspace.js.map +1 -0
  91. package/package.json +71 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 a5c-ai
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,227 @@
1
+ # @a5c-ai/adapters-harness-mock
2
+
3
+ This README is the canonical package documentation for `@a5c-ai/adapters-harness-mock`.
4
+ Canonical package doc path: `packages/adapters/harness-mock/README.md`.
5
+ The repository reference mirror lives at `docs/adapters/reference/14-harness-mock.md` and
6
+ should match this file.
7
+
8
+ `@a5c-ai/adapters-harness-mock` is the public test-fixture package at
9
+ `packages/adapters/harness-mock/` for adapters harness simulations. It covers four
10
+ execution shapes:
11
+
12
+ - subprocess fixtures and parser-backed scenario registries for the current CLI harness matrix
13
+ - in-process helpers such as `MockProcess`, `WorkspaceSandbox`, `resolveScenario`, and `listScenarioNames`
14
+ - bindable transport mocks via `HttpServerMock`, `WebSocketServerMock`, and the adapter-oriented remote builders
15
+ - programmatic SDK-style mocks and real-harness probe helpers
16
+ - offline probe baseline contracts for drift review
17
+
18
+ Execution shapes: `subprocess`, `sdk`, `http`, `websocket`.
19
+
20
+ ## Install
21
+
22
+ ```bash
23
+ npm install --save-dev @a5c-ai/adapters-harness-mock
24
+ ```
25
+
26
+ Requires Node.js `>=20.9.0`.
27
+
28
+ ## CLI
29
+
30
+ ```bash
31
+ adapters-harness-mock --list
32
+ adapters-harness-mock --agent claude --list
33
+ adapters-harness-mock --scenario claude:stream-json
34
+ adapters-harness-mock --agent cursor --scenario error
35
+ ```
36
+
37
+ `--agent <name>` filters `--list` to `<name>:*` scenarios and lets bare
38
+ `--scenario` values resolve within that prefix. For example,
39
+ `adapters-harness-mock --agent cursor --scenario error` resolves `cursor:error`.
40
+
41
+ ## Supported Surfaces
42
+
43
+ ### Subprocess registry
44
+
45
+ The subprocess surface is centered on these exports:
46
+
47
+ - `AGENT_SCENARIOS`
48
+ - `SUBPROCESS_HARNESS_PROFILES`
49
+ - `SUBPROCESS_SCENARIO_EXPECTATIONS`
50
+ - `resolveScenario(name)`
51
+ - `listScenarioNames()`
52
+ - `adapters-harness-mock --list`
53
+
54
+ The canonical subprocess harness keys are:
55
+ `claude`, `codex`, `gemini`, `copilot`, `cursor`, `opencode`, `pi`, `omp`,
56
+ `openclaw`, `hermes`, `amp`, `droid`, and `qwen`.
57
+
58
+ Legacy aliases such as `claude:basic-text`, `cursor:basic-text`, and
59
+ `pi:basic-text` still resolve through `AGENT_SCENARIOS`, but new tests and docs
60
+ should prefer the canonical names from `SUBPROCESS_HARNESS_PROFILES`.
61
+
62
+ ### SDK and remote builders
63
+
64
+ The package also exports higher-level mock builders and named presets for these
65
+ non-subprocess adapters:
66
+
67
+ - SDK/programmatic: `claude-agent-sdk`, `codex-sdk`, `pi-sdk`
68
+ - Remote transports: `opencode-http`, `codex-websocket`
69
+
70
+ Important exports in this layer include:
71
+
72
+ - `createProgrammaticMockBuilder`
73
+ - `createRemoteMockBuilder`
74
+ - `createScriptableTransportBuilder`
75
+ - `ClaudeAgentSdkMock`, `CodexSdkMock`, `PiSdkMock`
76
+ - `OpenCodeHttpMock`, `CodexWebSocketMock`
77
+ - `AdapterMockFactory`, `adapterMocks`, `mockScenarios`
78
+ - `MockServer`, `createMockServer`
79
+
80
+ ### Low-level helpers
81
+
82
+ The top-level entrypoint also exports:
83
+
84
+ - `MockProcess`
85
+ - `WorkspaceSandbox`
86
+ - `HttpServerMock`
87
+ - `WebSocketServerMock`
88
+ - `probeHarness`, `probeAllHarnesses`, `compareProfiles`, `PROBE_CONFIGS`
89
+
90
+ ## Usage
91
+
92
+ ### Subprocess fixtures
93
+
94
+ ```ts
95
+ import {
96
+ AGENT_SCENARIOS,
97
+ MockProcess,
98
+ SUBPROCESS_HARNESS_PROFILES,
99
+ SUBPROCESS_SCENARIO_EXPECTATIONS,
100
+ WorkspaceSandbox,
101
+ } from '@a5c-ai/adapters-harness-mock';
102
+
103
+ const scenarioName = SUBPROCESS_HARNESS_PROFILES.cursor.scenarios[0];
104
+ const scenario = AGENT_SCENARIOS[scenarioName];
105
+ const proc = new MockProcess(scenario);
106
+ const sandbox = new WorkspaceSandbox();
107
+
108
+ proc.start();
109
+ const result = await proc.waitForExit();
110
+
111
+ if (scenario.fileOperations) {
112
+ sandbox.applyOperations(scenario.fileOperations);
113
+ }
114
+
115
+ console.log(result.exitCode);
116
+ console.log(SUBPROCESS_SCENARIO_EXPECTATIONS[scenarioName]);
117
+
118
+ sandbox.dispose();
119
+ ```
120
+
121
+ ### Programmatic and remote builders
122
+
123
+ ```ts
124
+ import {
125
+ ClaudeAgentSdkMock,
126
+ CodexWebSocketMock,
127
+ MockServer,
128
+ createProgrammaticMockBuilder,
129
+ createRemoteMockBuilder,
130
+ } from '@a5c-ai/adapters-harness-mock';
131
+
132
+ const sdkPreset = ClaudeAgentSdkMock.toolCalling();
133
+ const customSdk = createProgrammaticMockBuilder()
134
+ .name('custom-sdk')
135
+ .addTextStream('hello from a custom stream')
136
+ .withCost(20, 10)
137
+ .build();
138
+
139
+ const remotePreset = CodexWebSocketMock.connectionDrop();
140
+ const customRemote = createRemoteMockBuilder()
141
+ .name('custom-remote')
142
+ .withServer({ port: 0 })
143
+ .addEvents([{ type: 'text_delta', data: { delta: 'hi' }, delayMs: 5 }])
144
+ .build();
145
+
146
+ const server = new MockServer(remotePreset);
147
+ await server.start();
148
+ await server.stop();
149
+
150
+ void sdkPreset;
151
+ void customSdk;
152
+ void customRemote;
153
+ ```
154
+
155
+ ### Bindable transport mocks
156
+
157
+ `HttpServerMock` and `WebSocketServerMock` are lower-level scenario-backed
158
+ servers. They bind real local ports, which makes them useful when you want an
159
+ external client to connect to a scripted HTTP or WebSocket endpoint.
160
+
161
+ ## Probe Helpers
162
+
163
+ `probeHarness` and `probeAllHarnesses` execute real harness binaries. They are
164
+ for drift detection and fixture maintenance, not for pure unit tests.
165
+
166
+ The built-in `PROBE_CONFIGS` now cover the subprocess harness matrix:
167
+
168
+ - `claude-code`
169
+ - `codex`
170
+ - `gemini`
171
+ - `copilot`
172
+ - `cursor`
173
+ - `opencode`
174
+ - `pi`
175
+ - `omp`
176
+ - `openclaw`
177
+ - `hermes`
178
+ - `amp`
179
+ - `droid`
180
+ - `qwen`
181
+
182
+ They also cover the SDK/programmatic targets as fixture-backed contract probes:
183
+
184
+ - `claude-agent-sdk`
185
+ - `codex-sdk`
186
+ - `pi-sdk`
187
+
188
+ They also cover the transport-oriented targets:
189
+
190
+ - `codex-websocket`
191
+ - `opencode-http`
192
+
193
+ Each probe profile now records:
194
+
195
+ - `executionType`
196
+ - `outputFormat` and `outputFormatTraits`
197
+ - `supportsStdin` and `stdinSignals`
198
+ - scenario exit codes such as `version`, `help`, `success`, and `error`
199
+ - relevant `environmentVariables`, `fileOperationPatterns`, and `cliPatterns`
200
+ - `availability` and `probeNotes`
201
+
202
+ Checked-in baseline contracts live at
203
+ `packages/adapters/harness-mock/tests/fixtures/probes/baseline-profiles.json`.
204
+
205
+ CI vs local/manual:
206
+
207
+ - CI-safe: fixture coverage checks, contract-shape validation, the node-based
208
+ offline probe tests in `tests/probe-offline.test.ts`, and the offline-only SDK
209
+ contract profiles for `claude-agent-sdk`, `codex-sdk`, and `pi-sdk`
210
+ - Local/manual: authenticated vendor CLI probes and transport startup probes for
211
+ binaries that are not expected to exist in CI
212
+ - Offline-only: SDK entries materialize reviewed contract profiles without
213
+ executing a harness binary, so drift review happens through the checked-in
214
+ fixture rather than a live probe run
215
+
216
+ ## Limitations
217
+
218
+ - `MockProcess` is an in-process emitter. It does not spawn a real subprocess.
219
+ - `HttpServerMock`, `WebSocketServerMock`, and `MockServer` bind local ports and
220
+ are therefore heavier than the pure subprocess fixtures.
221
+ - Probe helpers execute real binaries and may require installed harnesses,
222
+ credentials, transport startup support, and a writable output directory.
223
+ - The package replays scripted behavior; it does not synthesize fresh model output.
224
+
225
+ ## License
226
+
227
+ MIT © a5c-ai
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * adapters-harness-mock — CLI binary that replays a mock scenario to stdout/stderr.
4
+ *
5
+ * Flags:
6
+ * --scenario <name> Scenario id (see `--list`).
7
+ * --agent <name> Restrict resolution to a specific agent prefix.
8
+ * --delay <ms> Per-chunk delay override.
9
+ * --stdin-echo Echo stdin back to stdout (for interaction tests).
10
+ * --exit-code <n> Force exit code after scenario finishes.
11
+ * --fail-after <n> Exit with code n after emitting n output chunks.
12
+ * --list Print scenario names and exit.
13
+ */
14
+ import type { HarnessScenario } from '../types.js';
15
+ interface Args {
16
+ scenario?: string;
17
+ agent?: string;
18
+ delay?: number;
19
+ stdinEcho: boolean;
20
+ exitCode?: number;
21
+ failAfter?: number;
22
+ list: boolean;
23
+ help: boolean;
24
+ }
25
+ export declare function parseArgs(argv: string[]): Args;
26
+ export declare function applyOverrides(scenario: HarnessScenario, args: Args): HarnessScenario;
27
+ export declare function runMockHarness(args: Args, streams?: {
28
+ stdout: NodeJS.WritableStream;
29
+ stderr: NodeJS.WritableStream;
30
+ stdin?: NodeJS.ReadableStream;
31
+ }): Promise<number>;
32
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters-harness-mock.d.ts","sourceRoot":"","sources":["../../src/bin/adapters-harness-mock.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,UAAU,IAAI;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAwB9C;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,GAAG,eAAe,CAerF;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IAAE,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;CAC5B,GACzE,OAAO,CAAC,MAAM,CAAC,CAyCjB"}
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * adapters-harness-mock — CLI binary that replays a mock scenario to stdout/stderr.
4
+ *
5
+ * Flags:
6
+ * --scenario <name> Scenario id (see `--list`).
7
+ * --agent <name> Restrict resolution to a specific agent prefix.
8
+ * --delay <ms> Per-chunk delay override.
9
+ * --stdin-echo Echo stdin back to stdout (for interaction tests).
10
+ * --exit-code <n> Force exit code after scenario finishes.
11
+ * --fail-after <n> Exit with code n after emitting n output chunks.
12
+ * --list Print scenario names and exit.
13
+ */
14
+ import { resolveScenario, listScenarioNames } from '../scenarios/index.js';
15
+ import { MockProcess } from '../mock-process.js';
16
+ export function parseArgs(argv) {
17
+ const out = { stdinEcho: false, list: false, help: false };
18
+ for (let i = 0; i < argv.length; i++) {
19
+ const a = argv[i];
20
+ const next = () => {
21
+ const v = argv[++i];
22
+ if (v === undefined)
23
+ throw new Error(`Missing value for ${a}`);
24
+ return v;
25
+ };
26
+ switch (a) {
27
+ case '--scenario':
28
+ out.scenario = next();
29
+ break;
30
+ case '--agent':
31
+ out.agent = next();
32
+ break;
33
+ case '--delay':
34
+ out.delay = Number(next());
35
+ break;
36
+ case '--stdin-echo':
37
+ out.stdinEcho = true;
38
+ break;
39
+ case '--exit-code':
40
+ out.exitCode = Number(next());
41
+ break;
42
+ case '--fail-after':
43
+ out.failAfter = Number(next());
44
+ break;
45
+ case '--list':
46
+ out.list = true;
47
+ break;
48
+ case '-h':
49
+ case '--help':
50
+ out.help = true;
51
+ break;
52
+ default:
53
+ if (a && a.startsWith('--'))
54
+ throw new Error(`Unknown flag: ${a}`);
55
+ }
56
+ }
57
+ return out;
58
+ }
59
+ export function applyOverrides(scenario, args) {
60
+ const baseProcess = scenario.process ?? { exitCode: 0 };
61
+ const out = {
62
+ ...scenario,
63
+ output: (scenario.output ?? []).map((c) => ({ ...c, delayMs: args.delay ?? c.delayMs })),
64
+ process: { ...baseProcess, exitCode: baseProcess.exitCode ?? 0 },
65
+ };
66
+ if (args.exitCode !== undefined && Number.isFinite(args.exitCode)) {
67
+ out.process = { ...out.process, exitCode: args.exitCode };
68
+ }
69
+ if (args.failAfter !== undefined && Number.isFinite(args.failAfter)) {
70
+ out.output = (out.output ?? []).slice(0, args.failAfter);
71
+ out.process = { ...out.process, exitCode: out.process?.exitCode || 1 };
72
+ }
73
+ return out;
74
+ }
75
+ export async function runMockHarness(args, streams = { stdout: process.stdout, stderr: process.stderr, stdin: process.stdin }) {
76
+ if (args.help) {
77
+ streams.stderr.write(helpText());
78
+ return 0;
79
+ }
80
+ if (args.list) {
81
+ for (const n of listScenarioNames(args.agent))
82
+ streams.stdout.write(n + '\n');
83
+ return 0;
84
+ }
85
+ if (!args.scenario) {
86
+ streams.stderr.write('error: --scenario is required (use --list)\n');
87
+ return 2;
88
+ }
89
+ const resolved = resolveScenario(args.scenario, args.agent);
90
+ if (!resolved) {
91
+ streams.stderr.write(`error: unknown scenario: ${args.scenario}\n`);
92
+ return 2;
93
+ }
94
+ const scenario = applyOverrides(resolved, args);
95
+ // Stdin echo: pipe stdin lines straight to stdout so interaction tests
96
+ // can verify which approval response arrived.
97
+ if (args.stdinEcho && streams.stdin) {
98
+ streams.stdin.on('data', (chunk) => {
99
+ const s = typeof chunk === 'string' ? chunk : chunk.toString('utf8');
100
+ streams.stdout.write(`stdin:${s}`);
101
+ });
102
+ }
103
+ const proc = new MockProcess(scenario);
104
+ proc.on('stdout', (data) => streams.stdout.write(data));
105
+ proc.on('stderr', (data) => streams.stderr.write(data));
106
+ if (streams.stdin) {
107
+ streams.stdin.on('data', (chunk) => {
108
+ const s = typeof chunk === 'string' ? chunk : chunk.toString('utf8');
109
+ proc.write(s);
110
+ });
111
+ }
112
+ proc.start();
113
+ const result = await proc.waitForExit();
114
+ return result.exitCode;
115
+ }
116
+ function helpText() {
117
+ return [
118
+ 'adapters-harness-mock — replay a mock agent scenario.',
119
+ '',
120
+ 'Usage: adapters-harness-mock --scenario <name> [--agent <name>] [flags]',
121
+ '',
122
+ 'Flags:',
123
+ ' --scenario <name> Scenario id (try --list); bare names resolve within --agent',
124
+ ' --agent <name> Restrict --list and scenario lookup to <name>:*',
125
+ ' --delay <ms> Override per-chunk delay',
126
+ ' --stdin-echo Echo stdin back to stdout',
127
+ ' --exit-code <n> Force process exit code',
128
+ ' --fail-after <n> Truncate scenario to n chunks and fail',
129
+ ' --list List scenario names (filtered by --agent)',
130
+ ' -h, --help Show this help',
131
+ '',
132
+ ].join('\n');
133
+ }
134
+ // Entrypoint guard — invoked only when executed as a script.
135
+ const invokedAsScript = (() => {
136
+ try {
137
+ const argv1 = process.argv[1];
138
+ if (!argv1)
139
+ return false;
140
+ // Match on known filename fragment rather than import.meta.url, which
141
+ // requires ESM-only syntax that plays poorly with the tsconfig setup.
142
+ return /adapters-harness-mock(\.js|\.ts)?$/.test(argv1);
143
+ }
144
+ catch {
145
+ return false;
146
+ }
147
+ })();
148
+ if (invokedAsScript) {
149
+ const args = parseArgs(process.argv.slice(2));
150
+ runMockHarness(args).then((code) => { process.exit(code); }, (err) => {
151
+ process.stderr.write(`adapters-harness-mock failed: ${err.message}\n`);
152
+ process.exit(1);
153
+ });
154
+ }
155
+ //# sourceMappingURL=adapters-harness-mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters-harness-mock.js","sourceRoot":"","sources":["../../src/bin/adapters-harness-mock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export * from './adapters-harness-mock.js';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-harness.d.ts","sourceRoot":"","sources":["../../src/bin/mock-harness.ts"],"names":[],"mappings":";AAEA,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ export * from './adapters-harness-mock.js';
3
+ import { parseArgs, runMockHarness } from './adapters-harness-mock.js';
4
+ const invokedAsScript = (() => {
5
+ try {
6
+ const argv1 = process.argv[1];
7
+ if (!argv1)
8
+ return false;
9
+ return /mock-harness(\.js|\.ts)?$/.test(argv1);
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ })();
15
+ if (invokedAsScript) {
16
+ process.stderr.write('[adapters] "mock-harness" is deprecated, use "adapters-harness-mock" instead.\n');
17
+ const args = parseArgs(process.argv.slice(2));
18
+ runMockHarness(args).then((code) => {
19
+ process.exit(code);
20
+ }, (err) => {
21
+ process.stderr.write(`mock-harness failed: ${err.message}\n`);
22
+ process.exit(1);
23
+ });
24
+ }
25
+ //# sourceMappingURL=mock-harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-harness.js","sourceRoot":"","sources":["../../src/bin/mock-harness.ts"],"names":[],"mappings":";AAEA,cAAc,4BAA4B,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEvE,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE;IAC5B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,OAAO,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC,EAAE,CAAC;AAEL,IAAI,eAAe,EAAE,CAAC;IACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iFAAiF,CAAC,CAAC;IACxG,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CACvB,CAAC,IAAI,EAAE,EAAE;QACP,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAyB,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * HTTP Server mock implementation for harness-mock.
3
+ */
4
+ import { EventEmitter } from 'node:events';
5
+ import type { HarnessScenario, HttpServerMockHandle, MockExecutionResult, FileOperation } from './types.js';
6
+ export declare class HttpServerMock extends EventEmitter implements HttpServerMockHandle {
7
+ readonly scenario: HarnessScenario;
8
+ readonly id: number;
9
+ readonly serverUrl: string;
10
+ readonly port: number;
11
+ private _exited;
12
+ private _fileChanges;
13
+ private _requestHistory;
14
+ private _server;
15
+ private _isRunning;
16
+ private _startTime;
17
+ constructor(scenario: HarnessScenario, id: number);
18
+ get exited(): boolean;
19
+ get fileChanges(): FileOperation[];
20
+ get isRunning(): boolean;
21
+ get requestHistory(): {
22
+ method: string;
23
+ path: string;
24
+ headers: Record<string, string>;
25
+ body: unknown;
26
+ timestamp: Date;
27
+ }[];
28
+ start(): Promise<void>;
29
+ private handleRequest;
30
+ getStatus(): {
31
+ isRunning: boolean;
32
+ requestCount: number;
33
+ uptime: number;
34
+ };
35
+ reset(): void;
36
+ stop(): Promise<void>;
37
+ forceStop(): void;
38
+ waitForCompletion(): Promise<MockExecutionResult>;
39
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-mock.d.ts","sourceRoot":"","sources":["../src/http-mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EAEnB,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,qBAAa,cAAe,SAAQ,YAAa,YAAW,oBAAoB;IAC9E,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,eAAe,CAMf;IACR,OAAO,CAAC,OAAO,CAAgD;IAC/D,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAc;gBAEpB,QAAQ,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM;IAQjD,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,WAAW,IAAI,aAAa,EAAE,CAEjC;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,cAAc;gBA9BR,MAAM;cACR,MAAM;iBACH,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;cACzB,OAAO;mBACF,IAAI;QA4BhB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAgCd,aAAa;IAiG3B,SAAS;;;;;IAQT,KAAK,IAAI,IAAI;IAKP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,SAAS,IAAI,IAAI;IAUX,iBAAiB,IAAI,OAAO,CAAC,mBAAmB,CAAC;CA2BxD"}