@okrapdf/cli 0.3.2 → 0.3.3

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 (40) hide show
  1. package/dist/cli.test.js +178 -11
  2. package/dist/cli.test.js.map +1 -1
  3. package/dist/commands/chat.d.ts.map +1 -1
  4. package/dist/commands/chat.js +246 -10
  5. package/dist/commands/chat.js.map +1 -1
  6. package/dist/commands/chat.test.js +178 -3
  7. package/dist/commands/chat.test.js.map +1 -1
  8. package/dist/commands/jobs.d.ts.map +1 -1
  9. package/dist/commands/jobs.js +4 -3
  10. package/dist/commands/jobs.js.map +1 -1
  11. package/dist/index.js +0 -0
  12. package/dist/lib/agent-renderer.d.ts +12 -0
  13. package/dist/lib/agent-renderer.d.ts.map +1 -1
  14. package/dist/lib/agent-renderer.js +28 -0
  15. package/dist/lib/agent-renderer.js.map +1 -1
  16. package/dist/lib/client.d.ts +1 -0
  17. package/dist/lib/client.d.ts.map +1 -1
  18. package/dist/lib/client.js +1 -0
  19. package/dist/lib/client.js.map +1 -1
  20. package/dist/lib/config.d.ts +8 -0
  21. package/dist/lib/config.d.ts.map +1 -1
  22. package/dist/lib/config.js +13 -0
  23. package/dist/lib/config.js.map +1 -1
  24. package/dist/lib/runtime.d.ts.map +1 -1
  25. package/dist/lib/runtime.js +5 -0
  26. package/dist/lib/runtime.js.map +1 -1
  27. package/dist/lib/structured-output.d.ts +32 -0
  28. package/dist/lib/structured-output.d.ts.map +1 -0
  29. package/dist/lib/structured-output.js +156 -0
  30. package/dist/lib/structured-output.js.map +1 -0
  31. package/dist/lib/structured-output.test.d.ts +2 -0
  32. package/dist/lib/structured-output.test.d.ts.map +1 -0
  33. package/dist/lib/structured-output.test.js +148 -0
  34. package/dist/lib/structured-output.test.js.map +1 -0
  35. package/dist/lib/system-prompt.d.ts +4 -0
  36. package/dist/lib/system-prompt.d.ts.map +1 -1
  37. package/dist/lib/system-prompt.js +8 -0
  38. package/dist/lib/system-prompt.js.map +1 -1
  39. package/dist/templates/replay-viewer.html +230 -0
  40. 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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"}
@@ -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,CA6W3C"}
@@ -22,22 +22,48 @@ import '../lib/ws-polyfill.js';
22
22
  import { Command } from 'commander';
23
23
  import { AgentSessionClient } from '@steventsao/agent-session';
24
24
  import { fetchBootstrap } from '../lib/bootstrap.js';
25
- import { AgentRenderer } from '../lib/agent-renderer.js';
26
- import { CLI_SYSTEM_PROMPT } from '../lib/system-prompt.js';
27
- import { getApiKey } from '../lib/config.js';
25
+ import { AgentRenderer, SilentCollectorRenderer } from '../lib/agent-renderer.js';
26
+ import { buildSystemPrompt } from '../lib/system-prompt.js';
27
+ import { getApiKey, getAgentSessionUrl, getAgentSessionHttpUrl } from '../lib/config.js';
28
28
  import { error, info } from '../lib/output.js';
29
29
  import { createSpinner } from '../lib/progress.js';
30
30
  import { OkraApiError, EXIT_CODES } from '../lib/client.js';
31
- const WSS_URL = 'wss://agent-session.steventsao.workers.dev';
31
+ import { resolveSchema, extractJson, listBuiltinNames, } from '../lib/structured-output.js';
32
+ const WSS_URL = getAgentSessionUrl();
32
33
  const SANDBOX_TEMPLATE = 'okra-claude-agent-sdk';
33
34
  const SANDBOX_TIMEOUT_MS = 120_000;
34
35
  export function createChatCommand() {
35
36
  const chat = new Command('chat')
36
- .description('Chat with a document via agent session')
37
+ .description('Chat with a document via agent session');
38
+ // Default subcommand: okra chat <jobId> -m "msg"
39
+ const send = new Command('send')
40
+ .description('Send a message to a document chat session')
37
41
  .argument('<jobId>', 'OCR job ID (e.g. ocr-Bvx9ire6wFEHbsjecW3FM)')
38
42
  .requiredOption('-m, --message <message>', 'Message to send')
39
43
  .option('-o, --output <format>', 'Output format (text, json)', 'text')
44
+ .option('-s, --schema <schema>', 'Structured output: built-in name, inline JSON, or file path')
40
45
  .action(async (jobId, options) => {
46
+ // Handle --schema help
47
+ if (options.schema === 'help') {
48
+ console.log('Built-in schemas:');
49
+ for (const name of listBuiltinNames()) {
50
+ console.log(` ${name}`);
51
+ }
52
+ console.log('\nYou can also pass inline JSON or a file path:');
53
+ console.log(' --schema \'{"type":"object","properties":{"name":{"type":"string"}}}\'');
54
+ console.log(' --schema ./my-schema.json');
55
+ process.exit(0);
56
+ }
57
+ // Resolve schema (built-in name, inline JSON, or file path)
58
+ let resolvedSchema;
59
+ if (options.schema) {
60
+ const result = resolveSchema(options.schema);
61
+ if ('error' in result) {
62
+ error(result.error);
63
+ process.exit(EXIT_CODES.INVALID_ARGS);
64
+ }
65
+ resolvedSchema = result.schema;
66
+ }
41
67
  const apiKey = getApiKey();
42
68
  if (!apiKey) {
43
69
  error('Not authenticated. Run `okra auth login` first.');
@@ -68,7 +94,9 @@ export function createChatCommand() {
68
94
  process.exit(EXIT_CODES.GENERAL_ERROR);
69
95
  }
70
96
  // 2. Connect WebSocket
71
- const renderer = new AgentRenderer();
97
+ const renderer = resolvedSchema
98
+ ? new SilentCollectorRenderer()
99
+ : new AgentRenderer();
72
100
  const client = new AgentSessionClient({
73
101
  url: WSS_URL,
74
102
  sessionId: jobId,
@@ -141,6 +169,8 @@ export function createChatCommand() {
141
169
  return;
142
170
  renderer.onAgentStarted();
143
171
  });
172
+ // Capture structured_output from SDK result event
173
+ let structuredOutput = undefined;
144
174
  client.on('AGENT_MESSAGE', (event) => {
145
175
  if (!messageSent)
146
176
  return;
@@ -151,6 +181,10 @@ export function createChatCommand() {
151
181
  rejectAgent(new Error(String(errMsg)));
152
182
  return;
153
183
  }
184
+ // Capture SDK structured_output from result event
185
+ if (event.subtype === 'result' && event.structured_output != null) {
186
+ structuredOutput = event.structured_output;
187
+ }
154
188
  renderer.onAgentMessage(event.message?.content);
155
189
  });
156
190
  client.on('AGENT_DONE', (event) => {
@@ -188,17 +222,27 @@ export function createChatCommand() {
188
222
  await replayDone;
189
223
  // 7. Send message — flip gate so subsequent events are rendered
190
224
  messageSent = true;
191
- info(`Sending: ${options.message}`);
225
+ if (!resolvedSchema)
226
+ info(`Sending: ${options.message}`);
227
+ const systemPrompt = buildSystemPrompt({ schema: resolvedSchema });
192
228
  // Send raw AGENT_MESSAGE so author metadata is preserved across
193
229
  // older @steventsao/agent-session client versions used by the CLI.
194
- client.send({
230
+ const wsMessage = {
195
231
  type: 'AGENT_MESSAGE',
196
232
  content: options.message,
197
233
  model: { id: 'claude-sonnet-4-20250514', provider: 'anthropic' },
198
- systemPrompt: CLI_SYSTEM_PROMPT,
234
+ systemPrompt,
199
235
  agentType: 'claude-code',
200
236
  author: { name: 'okra-cli', clientType: 'cli' },
201
- });
237
+ };
238
+ // Send JSON Schema for SDK-native structured output
239
+ if (resolvedSchema) {
240
+ wsMessage.outputFormat = {
241
+ type: 'json_schema',
242
+ schema: resolvedSchema.jsonSchema,
243
+ };
244
+ }
245
+ client.send(wsMessage);
202
246
  // 8. Wait for agent completion
203
247
  try {
204
248
  await agentDone;
@@ -207,10 +251,202 @@ export function createChatCommand() {
207
251
  error(err instanceof Error ? err.message : String(err));
208
252
  process.exitCode = EXIT_CODES.GENERAL_ERROR;
209
253
  }
254
+ // 8b. Structured output: prefer SDK structured_output, fall back to text extraction
255
+ if (resolvedSchema && !process.exitCode) {
256
+ let parsed = structuredOutput ?? null;
257
+ // Fallback: extract JSON from collected text if SDK didn't return structured_output
258
+ if (parsed === null) {
259
+ const raw = renderer.getCollectedText();
260
+ parsed = extractJson(raw);
261
+ if (parsed === null) {
262
+ console.error('Failed to extract JSON from agent response.');
263
+ console.error('Raw output:\n' + raw);
264
+ process.exitCode = EXIT_CODES.VALIDATION_ERROR;
265
+ }
266
+ }
267
+ if (parsed !== null && !process.exitCode) {
268
+ // For built-in schemas, validate with Zod; for custom schemas, output as-is
269
+ if (resolvedSchema.zodSchema) {
270
+ const result = resolvedSchema.zodSchema.safeParse(parsed);
271
+ if (result.success) {
272
+ console.log(JSON.stringify(result.data, null, 2));
273
+ }
274
+ else {
275
+ console.error('Schema validation failed:');
276
+ for (const issue of result.error.issues) {
277
+ console.error(` - ${issue.path.join('.')}: ${issue.message}`);
278
+ }
279
+ console.error('\nRaw JSON:\n' + JSON.stringify(parsed, null, 2));
280
+ process.exitCode = EXIT_CODES.VALIDATION_ERROR;
281
+ }
282
+ }
283
+ else {
284
+ // Custom schema — SDK already validated via constrained decoding
285
+ console.log(JSON.stringify(parsed, null, 2));
286
+ }
287
+ }
288
+ }
210
289
  // 9. Disconnect and exit
211
290
  client.disconnect();
212
291
  process.exit(process.exitCode ?? 0);
213
292
  });
293
+ // ── view subcommand ──────────────────────────────────────────────────
294
+ const view = new Command('view')
295
+ .description('View a past chat session (read-only replay)')
296
+ .argument('[sessionId]', 'Session ID to view')
297
+ .option('--file <path>', 'Read events from local JSONL file instead of server')
298
+ .option('--web', 'Open as static HTML in browser')
299
+ .option('--jsonl', 'Output raw JSONL to stdout')
300
+ .action(async (sessionId, opts) => {
301
+ const { readFileSync, writeFileSync } = await import('fs');
302
+ const { tmpdir } = await import('os');
303
+ const { join, dirname } = await import('path');
304
+ const { fileURLToPath } = await import('url');
305
+ const chalk = (await import('chalk')).default;
306
+ const got = (await import('got')).default;
307
+ const { openInBrowser } = await import('../lib/browser.js');
308
+ // Resolve events source
309
+ let events;
310
+ if (opts.file) {
311
+ try {
312
+ const raw = readFileSync(opts.file, 'utf8');
313
+ events = parseJsonl(raw);
314
+ }
315
+ catch (err) {
316
+ error(`Failed to read file: ${err instanceof Error ? err.message : err}`);
317
+ process.exit(EXIT_CODES.GENERAL_ERROR);
318
+ }
319
+ }
320
+ else if (sessionId) {
321
+ const apiKey = getApiKey();
322
+ if (!apiKey) {
323
+ error('Not authenticated. Run `okra auth login` first.');
324
+ process.exit(EXIT_CODES.AUTH_ERROR);
325
+ }
326
+ const spinner = createSpinner('Fetching session events...');
327
+ spinner.start();
328
+ try {
329
+ const url = `${getAgentSessionHttpUrl()}/session/${sessionId}/events`;
330
+ const response = await got(url, {
331
+ headers: { Authorization: `Bearer ${apiKey}` },
332
+ timeout: { request: 15_000 },
333
+ });
334
+ events = parseJsonl(response.body);
335
+ spinner.succeed(`${events.length} events loaded`);
336
+ }
337
+ catch (err) {
338
+ spinner.fail('Failed to fetch events');
339
+ error(err instanceof Error ? err.message : String(err));
340
+ process.exit(EXIT_CODES.GENERAL_ERROR);
341
+ }
342
+ }
343
+ else {
344
+ error('Provide a session ID or --file path');
345
+ process.exit(EXIT_CODES.INVALID_ARGS);
346
+ return;
347
+ }
348
+ if (events.length === 0) {
349
+ info('No events found');
350
+ process.exit(0);
351
+ }
352
+ // Output modes
353
+ if (opts.jsonl) {
354
+ for (const evt of events) {
355
+ console.log(JSON.stringify(evt));
356
+ }
357
+ }
358
+ else if (opts.web) {
359
+ const label = sessionId || opts.file || 'local';
360
+ const currentDir = dirname(fileURLToPath(import.meta.url));
361
+ const templatePath = join(currentDir, '..', 'templates', 'replay-viewer.html');
362
+ let template = readFileSync(templatePath, 'utf8');
363
+ template = template.replace(/\{\{SESSION_ID\}\}/g, label);
364
+ template = template.replace('{{REPLAY_DATA}}', JSON.stringify(events));
365
+ const safeId = label.replace(/[^a-zA-Z0-9_-]/g, '_');
366
+ const outPath = join(tmpdir(), `okra-replay-${safeId}.html`);
367
+ writeFileSync(outPath, template, 'utf8');
368
+ info(`Opening ${outPath}`);
369
+ await openInBrowser(`file://${outPath}`);
370
+ }
371
+ else {
372
+ renderTerminalTranscript(events, chalk);
373
+ }
374
+ process.exit(0);
375
+ });
376
+ chat.addCommand(send, { isDefault: true });
377
+ chat.addCommand(view);
214
378
  return chat;
215
379
  }
380
+ function parseJsonl(raw) {
381
+ return raw
382
+ .split('\n')
383
+ .filter(line => line.trim())
384
+ .map(line => {
385
+ try {
386
+ return JSON.parse(line);
387
+ }
388
+ catch {
389
+ return null;
390
+ }
391
+ })
392
+ .filter((e) => e !== null);
393
+ }
394
+ /* eslint-disable @typescript-eslint/no-explicit-any */
395
+ function renderTerminalTranscript(events, chalk) {
396
+ for (const evt of events) {
397
+ const ts = evt.timestamp ? chalk.dim(new Date(evt.timestamp).toLocaleTimeString() + ' ') : '';
398
+ switch (evt.type) {
399
+ case 'user': {
400
+ const author = evt.author ? chalk.dim(` (${evt.author.name})`) : '';
401
+ console.log(`\n${ts}${chalk.blue.bold('User')}${author}`);
402
+ const content = typeof evt.message?.content === 'string'
403
+ ? evt.message.content
404
+ : '';
405
+ if (content)
406
+ console.log(content);
407
+ break;
408
+ }
409
+ case 'assistant': {
410
+ console.log(`\n${ts}${chalk.bold('Assistant')}`);
411
+ const blocks = evt.message?.content;
412
+ if (Array.isArray(blocks)) {
413
+ for (const b of blocks) {
414
+ if (b.type === 'text' && b.text) {
415
+ console.log(b.text);
416
+ }
417
+ else if (b.type === 'tool_use') {
418
+ console.log(chalk.dim(` ▸ ${b.name}(${JSON.stringify(b.input).slice(0, 120)})`));
419
+ }
420
+ else if (b.type === 'tool_result') {
421
+ const text = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);
422
+ if (text) {
423
+ const truncated = text.length > 200 ? text.slice(0, 200) + '...' : text;
424
+ console.log(chalk.dim(` ← ${truncated}`));
425
+ }
426
+ }
427
+ }
428
+ }
429
+ break;
430
+ }
431
+ case 'result': {
432
+ const parts = [];
433
+ if (evt.duration_ms != null)
434
+ parts.push(`${(evt.duration_ms / 1000).toFixed(1)}s`);
435
+ if (evt.total_cost_usd != null)
436
+ parts.push(`$${evt.total_cost_usd.toFixed(4)}`);
437
+ if (evt.exit_code != null)
438
+ parts.push(`exit ${evt.exit_code}`);
439
+ if (parts.length)
440
+ console.log(chalk.dim(`\n${parts.join(' · ')}`));
441
+ break;
442
+ }
443
+ case 'error':
444
+ console.log(`\n${ts}${chalk.red('Error:')} ${evt.error || ''}`);
445
+ break;
446
+ case 'system':
447
+ console.log(chalk.dim(` [system] ${evt.message || ''}`));
448
+ break;
449
+ }
450
+ }
451
+ }
216
452
  //# sourceMappingURL=chat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}