@okrapdf/cli 0.3.2 → 0.3.4

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 (48) hide show
  1. package/dist/cli.test.js +178 -11
  2. package/dist/cli.test.js.map +1 -1
  3. package/dist/commands/chat-schema-output.test.d.ts +2 -0
  4. package/dist/commands/chat-schema-output.test.d.ts.map +1 -0
  5. package/dist/commands/chat-schema-output.test.js +151 -0
  6. package/dist/commands/chat-schema-output.test.js.map +1 -0
  7. package/dist/commands/chat.d.ts.map +1 -1
  8. package/dist/commands/chat.js +268 -12
  9. package/dist/commands/chat.js.map +1 -1
  10. package/dist/commands/chat.test.js +178 -3
  11. package/dist/commands/chat.test.js.map +1 -1
  12. package/dist/commands/jobs.d.ts.map +1 -1
  13. package/dist/commands/jobs.js +4 -3
  14. package/dist/commands/jobs.js.map +1 -1
  15. package/dist/index.js +0 -0
  16. package/dist/lib/agent-renderer.d.ts +12 -0
  17. package/dist/lib/agent-renderer.d.ts.map +1 -1
  18. package/dist/lib/agent-renderer.js +28 -0
  19. package/dist/lib/agent-renderer.js.map +1 -1
  20. package/dist/lib/client.d.ts +1 -0
  21. package/dist/lib/client.d.ts.map +1 -1
  22. package/dist/lib/client.js +1 -0
  23. package/dist/lib/client.js.map +1 -1
  24. package/dist/lib/config.d.ts +8 -0
  25. package/dist/lib/config.d.ts.map +1 -1
  26. package/dist/lib/config.js +13 -0
  27. package/dist/lib/config.js.map +1 -1
  28. package/dist/lib/progress.d.ts +6 -2
  29. package/dist/lib/progress.d.ts.map +1 -1
  30. package/dist/lib/progress.js +5 -2
  31. package/dist/lib/progress.js.map +1 -1
  32. package/dist/lib/runtime.d.ts.map +1 -1
  33. package/dist/lib/runtime.js +5 -0
  34. package/dist/lib/runtime.js.map +1 -1
  35. package/dist/lib/structured-output.d.ts +32 -0
  36. package/dist/lib/structured-output.d.ts.map +1 -0
  37. package/dist/lib/structured-output.js +156 -0
  38. package/dist/lib/structured-output.js.map +1 -0
  39. package/dist/lib/structured-output.test.d.ts +2 -0
  40. package/dist/lib/structured-output.test.d.ts.map +1 -0
  41. package/dist/lib/structured-output.test.js +148 -0
  42. package/dist/lib/structured-output.test.js.map +1 -0
  43. package/dist/lib/system-prompt.d.ts +4 -0
  44. package/dist/lib/system-prompt.d.ts.map +1 -1
  45. package/dist/lib/system-prompt.js +8 -0
  46. package/dist/lib/system-prompt.js.map +1 -1
  47. package/dist/templates/replay-viewer.html +230 -0
  48. package/package.json +4 -3
package/dist/cli.test.js CHANGED
@@ -1,35 +1,202 @@
1
1
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
+ // Mock client module before importing anything that uses it
3
+ vi.mock('./lib/client.js', async (importOriginal) => {
4
+ const actual = await importOriginal();
5
+ return {
6
+ ...actual,
7
+ get: vi.fn(),
8
+ };
9
+ });
2
10
  import { createProgram } from './cli.js';
11
+ import { get } from './lib/client.js';
12
+ const mockedGet = vi.mocked(get);
3
13
  const ORIGINAL_ENV = process.env;
4
- describe('global output behavior', () => {
14
+ const FAKE_JOBS_RESPONSE = {
15
+ items: [
16
+ {
17
+ job_id: 'ocr-abc123',
18
+ status: 'completed',
19
+ filename: 'invoice.pdf',
20
+ total_pages: 10,
21
+ pages_completed: 10,
22
+ error: null,
23
+ created_at: '2026-02-15T00:00:00Z',
24
+ updated_at: '2026-02-15T01:00:00Z',
25
+ viewer_url: 'https://app.okrapdf.com/ocr/ocr-abc123',
26
+ },
27
+ {
28
+ job_id: 'ocr-xyz789',
29
+ status: 'running',
30
+ filename: 'report.pdf',
31
+ total_pages: 5,
32
+ pages_completed: 2,
33
+ error: null,
34
+ created_at: '2026-02-16T00:00:00Z',
35
+ updated_at: '2026-02-16T01:00:00Z',
36
+ viewer_url: 'https://app.okrapdf.com/ocr/ocr-xyz789',
37
+ },
38
+ ],
39
+ pagination: { page: 1, totalPages: 1, total: 2 },
40
+ };
41
+ function cleanEnv() {
42
+ process.env = { ...ORIGINAL_ENV };
43
+ delete process.env.OKRA_OUTPUT_FORMAT;
44
+ delete process.env.OKRA_JSON_FIELDS;
45
+ delete process.env.OKRA_JQ;
46
+ delete process.env.OKRA_QUIET;
47
+ delete process.env.OKRA_VERBOSE;
48
+ }
49
+ describe('global --json flag', () => {
50
+ beforeEach(cleanEnv);
51
+ afterEach(() => {
52
+ process.env = ORIGINAL_ENV;
53
+ vi.restoreAllMocks();
54
+ });
55
+ it('--json exit_codes filters to only that field', async () => {
56
+ const out = [];
57
+ vi.spyOn(console, 'log').mockImplementation((...args) => {
58
+ out.push(args.join(' '));
59
+ });
60
+ const program = createProgram();
61
+ // --json takes 'exit_codes' as the field filter, 'exit-codes' is the subcommand
62
+ await program.parseAsync(['--json', 'exit_codes', 'exit-codes'], { from: 'user' });
63
+ const payload = JSON.parse(out.join('\n'));
64
+ expect(payload).toHaveProperty('exit_codes');
65
+ expect(Object.keys(payload)).toEqual(['exit_codes']);
66
+ });
67
+ });
68
+ describe('--json field filtering with jobs list', () => {
5
69
  beforeEach(() => {
6
- process.env = { ...ORIGINAL_ENV };
7
- delete process.env.OKRA_OUTPUT_FORMAT;
8
- delete process.env.OKRA_QUIET;
9
- delete process.env.OKRA_VERBOSE;
70
+ cleanEnv();
71
+ process.env.OKRA_API_KEY = 'test-key';
10
72
  });
11
73
  afterEach(() => {
12
74
  process.env = ORIGINAL_ENV;
13
75
  vi.restoreAllMocks();
76
+ mockedGet.mockReset();
77
+ });
78
+ it('--json filename (before subcommand) returns only filename', async () => {
79
+ mockedGet.mockResolvedValueOnce(FAKE_JOBS_RESPONSE);
80
+ const out = [];
81
+ vi.spyOn(console, 'log').mockImplementation((...args) => {
82
+ out.push(args.join(' '));
83
+ });
84
+ const program = createProgram();
85
+ await program.parseAsync(['--json', 'filename', 'jobs', 'list'], { from: 'user' });
86
+ const payload = JSON.parse(out.join('\n'));
87
+ expect(Array.isArray(payload)).toBe(true);
88
+ expect(payload).toHaveLength(2);
89
+ for (const item of payload) {
90
+ expect(Object.keys(item)).toEqual(['filename']);
91
+ }
92
+ expect(payload[0].filename).toBe('invoice.pdf');
93
+ });
94
+ it('--json job_id,status returns only those two fields', async () => {
95
+ mockedGet.mockResolvedValueOnce(FAKE_JOBS_RESPONSE);
96
+ const out = [];
97
+ vi.spyOn(console, 'log').mockImplementation((...args) => {
98
+ out.push(args.join(' '));
99
+ });
100
+ const program = createProgram();
101
+ await program.parseAsync(['--json', 'job_id,status', 'jobs', 'list'], { from: 'user' });
102
+ const payload = JSON.parse(out.join('\n'));
103
+ expect(Array.isArray(payload)).toBe(true);
104
+ for (const item of payload) {
105
+ expect(Object.keys(item).sort()).toEqual(['job_id', 'status']);
106
+ }
14
107
  });
15
- it('applies global --json as output override when -o is not specified', async () => {
108
+ it('--json filename (after subcommand) also filters correctly', async () => {
109
+ mockedGet.mockResolvedValueOnce(FAKE_JOBS_RESPONSE);
16
110
  const out = [];
17
111
  vi.spyOn(console, 'log').mockImplementation((...args) => {
18
112
  out.push(args.join(' '));
19
113
  });
20
114
  const program = createProgram();
21
- await program.parseAsync(['--json', 'exit-codes'], { from: 'user' });
115
+ await program.parseAsync(['jobs', 'list', '--json', 'filename', '-l', '5'], { from: 'user' });
22
116
  const payload = JSON.parse(out.join('\n'));
23
- expect(payload.exit_codes.general_error).toBe(1);
117
+ expect(Array.isArray(payload)).toBe(true);
118
+ for (const item of payload) {
119
+ expect(Object.keys(item)).toEqual(['filename']);
120
+ }
24
121
  });
25
- it('keeps explicit -o value over global --json', async () => {
122
+ it('full run() simulation with bootstrapGlobalEnv', async () => {
123
+ const { bootstrapGlobalEnv } = await import('./lib/runtime.js');
124
+ const argv = ['node', 'okra', 'jobs', 'list', '--json', 'filename', '-l', '5'];
125
+ bootstrapGlobalEnv(argv);
126
+ mockedGet.mockResolvedValueOnce(FAKE_JOBS_RESPONSE);
26
127
  const out = [];
27
128
  vi.spyOn(console, 'log').mockImplementation((...args) => {
28
129
  out.push(args.join(' '));
29
130
  });
30
131
  const program = createProgram();
31
- await program.parseAsync(['--json', 'exit-codes', '-o', 'table'], { from: 'user' });
32
- expect(() => JSON.parse(out.join('\n'))).toThrow();
132
+ await program.parseAsync(argv);
133
+ const payload = JSON.parse(out.join('\n'));
134
+ expect(Array.isArray(payload)).toBe(true);
135
+ for (const item of payload) {
136
+ expect(Object.keys(item)).toEqual(['filename']);
137
+ }
138
+ });
139
+ });
140
+ describe('JSON output cleanliness (gh CLI patterns)', () => {
141
+ beforeEach(() => {
142
+ cleanEnv();
143
+ process.env.OKRA_API_KEY = 'test-key';
144
+ });
145
+ afterEach(() => {
146
+ process.env = ORIGINAL_ENV;
147
+ vi.restoreAllMocks();
148
+ mockedGet.mockReset();
149
+ });
150
+ it('suppresses pagination footer in JSON mode', async () => {
151
+ const multiPageResponse = {
152
+ ...FAKE_JOBS_RESPONSE,
153
+ pagination: { page: 1, totalPages: 35, total: 699 },
154
+ };
155
+ mockedGet.mockResolvedValueOnce(multiPageResponse);
156
+ const out = [];
157
+ vi.spyOn(console, 'log').mockImplementation((...args) => {
158
+ out.push(args.join(' '));
159
+ });
160
+ const program = createProgram();
161
+ await program.parseAsync(['--json', 'job_id', 'jobs', 'list'], { from: 'user' });
162
+ const raw = out.join('\n');
163
+ // Should be valid JSON with no trailing "Page X of Y" text
164
+ expect(() => JSON.parse(raw)).not.toThrow();
165
+ expect(raw).not.toContain('Page');
166
+ expect(raw).not.toContain('total');
167
+ });
168
+ it('shows pagination footer in table mode', async () => {
169
+ const multiPageResponse = {
170
+ ...FAKE_JOBS_RESPONSE,
171
+ pagination: { page: 1, totalPages: 35, total: 699 },
172
+ };
173
+ mockedGet.mockResolvedValueOnce(multiPageResponse);
174
+ const out = [];
175
+ vi.spyOn(console, 'log').mockImplementation((...args) => {
176
+ out.push(args.join(' '));
177
+ });
178
+ const program = createProgram();
179
+ await program.parseAsync(['jobs', 'list'], { from: 'user' });
180
+ const raw = out.join('\n');
181
+ expect(raw).toContain('Page 1 of 35');
182
+ expect(raw).toContain('699 total');
183
+ });
184
+ });
185
+ describe('bootstrapGlobalEnv', () => {
186
+ beforeEach(cleanEnv);
187
+ afterEach(() => {
188
+ process.env = ORIGINAL_ENV;
189
+ });
190
+ it('--json sets OKRA_OUTPUT_FORMAT', async () => {
191
+ const { bootstrapGlobalEnv } = await import('./lib/runtime.js');
192
+ bootstrapGlobalEnv(['node', 'okra', 'jobs', 'list', '--json']);
193
+ expect(process.env.OKRA_OUTPUT_FORMAT).toBe('json');
194
+ });
195
+ it('--json=fields sets OKRA_JSON_FIELDS', async () => {
196
+ const { bootstrapGlobalEnv } = await import('./lib/runtime.js');
197
+ bootstrapGlobalEnv(['node', 'okra', 'jobs', 'list', '--json=filename,status']);
198
+ expect(process.env.OKRA_OUTPUT_FORMAT).toBe('json');
199
+ expect(process.env.OKRA_JSON_FIELDS).toBe('filename,status');
33
200
  });
34
201
  });
35
202
  //# sourceMappingURL=cli.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../src/cli.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;AAEjC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACtC,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,GAAG,YAAY,CAAC;QAC3B,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE;YACtD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;QAChC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAErE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAA2C,CAAC;QACrF,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE;YACtD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;QAChC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAEpF,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../src/cli.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chat-schema-output.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-schema-output.test.d.ts","sourceRoot":"","sources":["../../src/commands/chat-schema-output.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * TDD: --schema mode must produce ONLY valid JSON on stdout.
3
+ *
4
+ * gh CLI pattern: human-friendly output (spinners, status) → stderr.
5
+ * stdout is reserved for machine-readable output.
6
+ */
7
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
8
+ // ── Mocks (before any imports that touch them) ──────────────────────────
9
+ // Mock ws-polyfill (no-op)
10
+ vi.mock('../lib/ws-polyfill.js', () => ({}));
11
+ // Mock config
12
+ vi.mock('../lib/config.js', () => ({
13
+ getApiKey: () => 'test-key',
14
+ getAgentSessionUrl: () => 'wss://localhost:9999',
15
+ getAgentSessionHttpUrl: () => 'http://localhost:9999',
16
+ getOutputFormat: () => 'text',
17
+ getJsonFields: () => null,
18
+ getJqExpression: () => null,
19
+ }));
20
+ // Mock bootstrap — use a forwarding wrapper so vi.restoreAllMocks doesn't break it
21
+ const mockFetchBootstrap = vi.fn().mockResolvedValue({
22
+ archiveUrl: 'https://example.com/archive.tar.gz',
23
+ metadata: { totalPages: 5 },
24
+ });
25
+ vi.mock('../lib/bootstrap.js', () => ({
26
+ fetchBootstrap: (...args) => mockFetchBootstrap(...args),
27
+ }));
28
+ // Fake AgentSessionClient that simulates the full connect → sandbox → agent flow
29
+ let fakeClientHandlers = {};
30
+ const fakeClient = {
31
+ on: vi.fn((event, handler) => {
32
+ (fakeClientHandlers[event] ??= []).push(handler);
33
+ }),
34
+ send: vi.fn(),
35
+ connect: vi.fn(() => {
36
+ // Simulate: READY → SANDBOX_STATUS ready
37
+ setTimeout(() => {
38
+ for (const h of fakeClientHandlers['READY'] ?? [])
39
+ h({ sandboxId: 'sb-123' });
40
+ for (const h of fakeClientHandlers['SANDBOX_STATUS'] ?? [])
41
+ h({ status: 'ready' });
42
+ }, 5);
43
+ }),
44
+ disconnect: vi.fn(),
45
+ };
46
+ vi.mock('@steventsao/agent-session', () => ({
47
+ AgentSessionClient: vi.fn(() => fakeClient),
48
+ }));
49
+ // Mock process.exit so test doesn't actually exit
50
+ const mockExit = vi.spyOn(process, 'exit').mockImplementation((() => { }));
51
+ // ── Imports ─────────────────────────────────────────────────────────────
52
+ import { createChatCommand } from './chat.js';
53
+ // ── Helpers ─────────────────────────────────────────────────────────────
54
+ /** Simulate agent responding after our message is sent */
55
+ function simulateAgentResponse(jsonPayload) {
56
+ const checkSend = setInterval(() => {
57
+ if (fakeClient.send.mock.calls.length > 0) {
58
+ clearInterval(checkSend);
59
+ for (const h of fakeClientHandlers['AGENT_STARTED'] ?? [])
60
+ h({});
61
+ for (const h of fakeClientHandlers['AGENT_MESSAGE'] ?? []) {
62
+ h({
63
+ subtype: 'result',
64
+ structured_output: jsonPayload,
65
+ message: { content: [{ type: 'text', text: JSON.stringify(jsonPayload) }] },
66
+ });
67
+ }
68
+ for (const h of fakeClientHandlers['AGENT_DONE'] ?? [])
69
+ h({ total_cost_usd: 0.01, duration_ms: 500 });
70
+ }
71
+ }, 10);
72
+ setTimeout(() => clearInterval(checkSend), 5000);
73
+ }
74
+ // ── Tests ───────────────────────────────────────────────────────────────
75
+ describe('chat --schema: stdout must be pure JSON', () => {
76
+ let stdoutWriteCalls;
77
+ let stderrWriteCalls;
78
+ let origStdoutWrite;
79
+ let origStderrWrite;
80
+ beforeEach(() => {
81
+ // Reset fake client state
82
+ fakeClientHandlers = {};
83
+ fakeClient.on.mockClear();
84
+ fakeClient.send.mockClear();
85
+ fakeClient.connect.mockClear();
86
+ fakeClient.disconnect.mockClear();
87
+ mockExit.mockClear();
88
+ mockFetchBootstrap.mockClear();
89
+ // Intercept at the lowest level: process.stdout.write / process.stderr.write
90
+ stdoutWriteCalls = [];
91
+ stderrWriteCalls = [];
92
+ origStdoutWrite = process.stdout.write.bind(process.stdout);
93
+ origStderrWrite = process.stderr.write.bind(process.stderr);
94
+ process.stdout.write = ((...args) => {
95
+ const chunk = typeof args[0] === 'string' ? args[0] : Buffer.isBuffer(args[0]) ? args[0].toString() : String(args[0]);
96
+ stdoutWriteCalls.push(chunk);
97
+ return true;
98
+ });
99
+ process.stderr.write = ((...args) => {
100
+ const chunk = typeof args[0] === 'string' ? args[0] : Buffer.isBuffer(args[0]) ? args[0].toString() : String(args[0]);
101
+ stderrWriteCalls.push(chunk);
102
+ return true;
103
+ });
104
+ });
105
+ afterEach(() => {
106
+ process.stdout.write = origStdoutWrite;
107
+ process.stderr.write = origStderrWrite;
108
+ });
109
+ it('stdout contains ONLY the JSON result, no spinners or logs', async () => {
110
+ const expectedPayload = { companyName: 'Acme Corp' };
111
+ simulateAgentResponse(expectedPayload);
112
+ const chat = createChatCommand();
113
+ await chat.parseAsync([
114
+ 'send', 'ocr-test123',
115
+ '-m', 'get company info',
116
+ '--schema', '{"type":"object","properties":{"companyName":{"type":"string"}}}',
117
+ ], { from: 'user' });
118
+ const stdout = stdoutWriteCalls.join('');
119
+ // Must be valid JSON and nothing else
120
+ let parsed;
121
+ expect(() => { parsed = JSON.parse(stdout.trim()); }).not.toThrow();
122
+ expect(parsed).toEqual(expectedPayload);
123
+ // Must NOT contain spinner or log artifacts
124
+ expect(stdout).not.toContain('Document ready');
125
+ expect(stdout).not.toContain('Sandbox ready');
126
+ expect(stdout).not.toContain('Booting sandbox');
127
+ expect(stdout).not.toContain('[AgentSession]');
128
+ expect(stdout).not.toContain('Sending:');
129
+ }, 15_000);
130
+ it('spinners and status messages go to stderr in schema mode', async () => {
131
+ const expectedPayload = { count: 42 };
132
+ simulateAgentResponse(expectedPayload);
133
+ const chat = createChatCommand();
134
+ await chat.parseAsync([
135
+ 'send', 'ocr-test456',
136
+ '-m', 'count tables',
137
+ '--schema', '{"type":"object","properties":{"count":{"type":"number"}}}',
138
+ ], { from: 'user' });
139
+ const stderr = stderrWriteCalls.join('');
140
+ // Spinners should go to stderr
141
+ expect(stderr).toContain('Document ready');
142
+ // stdout should be clean JSON only
143
+ const stdout = stdoutWriteCalls.join('');
144
+ expect(() => JSON.parse(stdout.trim())).not.toThrow();
145
+ }, 15_000);
146
+ it('without --schema, createChatCommand works', () => {
147
+ const chat = createChatCommand();
148
+ expect(chat.name()).toBe('chat');
149
+ });
150
+ });
151
+ //# sourceMappingURL=chat-schema-output.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-schema-output.test.js","sourceRoot":"","sources":["../../src/commands/chat-schema-output.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,uBAAuB,CAAC;AAE/B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,wBAAgB,iBAAiB,IAAI,OAAO,CAiM3C"}
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,uBAAuB,CAAC;AAE/B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,wBAAgB,iBAAiB,IAAI,OAAO,CAmY3C"}