@okrapdf/cli 0.4.7 → 0.5.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 (63) hide show
  1. package/dist/commands/auth.d.ts.map +1 -1
  2. package/dist/commands/auth.js +94 -26
  3. package/dist/commands/auth.js.map +1 -1
  4. package/dist/commands/chat.d.ts +6 -17
  5. package/dist/commands/chat.d.ts.map +1 -1
  6. package/dist/commands/chat.js +344 -332
  7. package/dist/commands/chat.js.map +1 -1
  8. package/dist/commands/elements.d.ts.map +1 -1
  9. package/dist/commands/elements.js +15 -12
  10. package/dist/commands/elements.js.map +1 -1
  11. package/dist/commands/jobs.d.ts.map +1 -1
  12. package/dist/commands/jobs.js +228 -13
  13. package/dist/commands/jobs.js.map +1 -1
  14. package/dist/commands/read.d.ts.map +1 -1
  15. package/dist/commands/read.js +11 -9
  16. package/dist/commands/read.js.map +1 -1
  17. package/dist/commands/search.d.ts.map +1 -1
  18. package/dist/commands/search.js +3 -24
  19. package/dist/commands/search.js.map +1 -1
  20. package/dist/lib/backends/do-adapters.test.d.ts +6 -0
  21. package/dist/lib/backends/do-adapters.test.d.ts.map +1 -0
  22. package/dist/lib/backends/do-adapters.test.js +311 -0
  23. package/dist/lib/backends/do-adapters.test.js.map +1 -0
  24. package/dist/lib/backends/do.d.ts +23 -0
  25. package/dist/lib/backends/do.d.ts.map +1 -0
  26. package/dist/lib/backends/do.js +340 -0
  27. package/dist/lib/backends/do.js.map +1 -0
  28. package/dist/lib/backends/index.d.ts +7 -0
  29. package/dist/lib/backends/index.d.ts.map +1 -0
  30. package/dist/lib/backends/index.js +8 -0
  31. package/dist/lib/backends/index.js.map +1 -0
  32. package/dist/lib/backends/okrapdf.d.ts +9 -0
  33. package/dist/lib/backends/okrapdf.d.ts.map +1 -0
  34. package/dist/lib/backends/okrapdf.js +50 -0
  35. package/dist/lib/backends/okrapdf.js.map +1 -0
  36. package/dist/lib/backends/types.d.ts +205 -0
  37. package/dist/lib/backends/types.d.ts.map +1 -0
  38. package/dist/lib/backends/types.js +7 -0
  39. package/dist/lib/backends/types.js.map +1 -0
  40. package/dist/lib/completion-stream.d.ts +22 -0
  41. package/dist/lib/completion-stream.d.ts.map +1 -0
  42. package/dist/lib/completion-stream.js +69 -0
  43. package/dist/lib/completion-stream.js.map +1 -0
  44. package/dist/lib/config.d.ts +4 -0
  45. package/dist/lib/config.d.ts.map +1 -1
  46. package/dist/lib/config.js +6 -0
  47. package/dist/lib/config.js.map +1 -1
  48. package/dist/lib/general-chat.d.ts +11 -0
  49. package/dist/lib/general-chat.d.ts.map +1 -0
  50. package/dist/lib/general-chat.js +69 -0
  51. package/dist/lib/general-chat.js.map +1 -0
  52. package/dist/lib/multi-doc-chat.d.ts +20 -0
  53. package/dist/lib/multi-doc-chat.d.ts.map +1 -0
  54. package/dist/lib/multi-doc-chat.js +162 -0
  55. package/dist/lib/multi-doc-chat.js.map +1 -0
  56. package/dist/lib/single-doc-chat.d.ts +14 -0
  57. package/dist/lib/single-doc-chat.d.ts.map +1 -0
  58. package/dist/lib/single-doc-chat.js +165 -0
  59. package/dist/lib/single-doc-chat.js.map +1 -0
  60. package/dist/lib/task-agent.d.ts.map +1 -1
  61. package/dist/lib/task-agent.js +29 -10
  62. package/dist/lib/task-agent.js.map +1 -1
  63. package/package.json +3 -1
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Shared backend types — DO response shapes and backend interface.
3
+ *
4
+ * Commands call Backend methods; they never call fetch directly.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/backends/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Shared JSONL stream reader for /completion endpoints.
3
+ *
4
+ * All chat modes (single-doc, multi-doc, general) stream JSONL with the same
5
+ * event types: text_delta, toolcall_end, tool_result, step_done, done, error.
6
+ */
7
+ export interface StreamCallbacks {
8
+ onTextDelta?(delta: string): void;
9
+ onToolCallEnd?(name: string): void;
10
+ onToolResult?(name: string): void;
11
+ onStepDone?(stopReason: string): void;
12
+ }
13
+ export interface StreamResult {
14
+ answer: string;
15
+ costUsd: number;
16
+ }
17
+ /**
18
+ * Read a JSONL streaming response and invoke callbacks for each event.
19
+ * Returns the final answer and cost from the `done` event.
20
+ */
21
+ export declare function readCompletionStream(response: Response, callbacks: StreamCallbacks): Promise<StreamResult>;
22
+ //# sourceMappingURL=completion-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-stream.d.ts","sourceRoot":"","sources":["../../src/lib/completion-stream.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,eAAe,GACzB,OAAO,CAAC,YAAY,CAAC,CAuDvB"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Shared JSONL stream reader for /completion endpoints.
3
+ *
4
+ * All chat modes (single-doc, multi-doc, general) stream JSONL with the same
5
+ * event types: text_delta, toolcall_end, tool_result, step_done, done, error.
6
+ */
7
+ /**
8
+ * Read a JSONL streaming response and invoke callbacks for each event.
9
+ * Returns the final answer and cost from the `done` event.
10
+ */
11
+ export async function readCompletionStream(response, callbacks) {
12
+ const reader = response.body.getReader();
13
+ const decoder = new TextDecoder();
14
+ let buffer = '';
15
+ let finalAnswer = '';
16
+ let totalCostUsd = 0;
17
+ while (true) {
18
+ const { done, value } = await reader.read();
19
+ if (done)
20
+ break;
21
+ buffer += decoder.decode(value, { stream: true });
22
+ const lines = buffer.split('\n');
23
+ buffer = lines.pop();
24
+ for (const line of lines) {
25
+ if (!line.trim())
26
+ continue;
27
+ let event;
28
+ try {
29
+ event = JSON.parse(line);
30
+ }
31
+ catch {
32
+ continue;
33
+ }
34
+ switch (event.type) {
35
+ case 'text_delta':
36
+ callbacks.onTextDelta?.(event.delta);
37
+ break;
38
+ case 'toolcall_end':
39
+ callbacks.onToolCallEnd?.(event.name);
40
+ break;
41
+ case 'tool_result':
42
+ callbacks.onToolResult?.(event.name);
43
+ break;
44
+ case 'step_done':
45
+ callbacks.onStepDone?.(event.stopReason);
46
+ break;
47
+ case 'done':
48
+ finalAnswer = event.answer || '';
49
+ totalCostUsd = event.usage?.costUsd || 0;
50
+ break;
51
+ case 'error':
52
+ throw new Error(event.details || event.error || 'Completion failed');
53
+ }
54
+ }
55
+ }
56
+ // Drain remaining buffer
57
+ if (buffer.trim()) {
58
+ try {
59
+ const event = JSON.parse(buffer);
60
+ if (event.type === 'done') {
61
+ finalAnswer = event.answer || '';
62
+ totalCostUsd = event.usage?.costUsd || 0;
63
+ }
64
+ }
65
+ catch { /* ignore */ }
66
+ }
67
+ return { answer: finalAnswer, costUsd: totalCostUsd };
68
+ }
69
+ //# sourceMappingURL=completion-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-stream.js","sourceRoot":"","sources":["../../src/lib/completion-stream.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,QAAkB,EAClB,SAA0B;IAE1B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAK,CAAC,SAAS,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAChB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAElD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAEtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC3B,IAAI,KAAU,CAAC;YACf,IAAI,CAAC;gBAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;YAErD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,YAAY;oBACf,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACrC,MAAM;gBACR,KAAK,cAAc;oBACjB,SAAS,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACtC,MAAM;gBACR,KAAK,aAAa;oBAChB,SAAS,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACrC,MAAM;gBACR,KAAK,WAAW;oBACd,SAAS,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBACzC,MAAM;gBACR,KAAK,MAAM;oBACT,WAAW,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;oBACjC,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,CAAC;oBACzC,MAAM;gBACR,KAAK,OAAO;oBACV,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,IAAI,mBAAmB,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAQ,CAAC;YACxC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,WAAW,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;gBACjC,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AACxD,CAAC"}
@@ -73,6 +73,10 @@ export declare function getAgentSessionUrl(): string;
73
73
  * Get agent session HTTP URL (for replay/events)
74
74
  */
75
75
  export declare function getAgentSessionHttpUrl(): string;
76
+ /**
77
+ * Get the Document Agent shared secret for /document/:id/* HTTP endpoints.
78
+ */
79
+ export declare function getDocumentAgentSecret(): string | undefined;
76
80
  /**
77
81
  * Check if JSON output is requested (via --json flag or OKRA_OUTPUT_FORMAT=json)
78
82
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA6BhF;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,GAAG,SAAS,CAE9C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,CAG/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAE3D;AAED,wBAAgB,aAAa,IAAI,SAAS,GAAG,SAAS,CAGrD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAElD;AAED,wBAAgB,aAAa,IAAI,QAAQ,GAAG,SAAS,CAGpD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAID;;GAEG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAQrC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAG/C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAK5D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA6BhF;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,GAAG,SAAS,CAE9C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,CAG/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAE3D;AAED,wBAAgB,aAAa,IAAI,SAAS,GAAG,SAAS,CAGrD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAElD;AAED,wBAAgB,aAAa,IAAI,QAAQ,GAAG,SAAS,CAGpD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAID;;GAEG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAQrC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAG/C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,SAAS,CAE3D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAK5D"}
@@ -151,6 +151,12 @@ export function getAgentSessionHttpUrl() {
151
151
  const ws = getAgentSessionUrl();
152
152
  return ws.replace(/^wss:/, 'https:').replace(/^ws:/, 'http:');
153
153
  }
154
+ /**
155
+ * Get the Document Agent shared secret for /document/:id/* HTTP endpoints.
156
+ */
157
+ export function getDocumentAgentSecret() {
158
+ return process.env.DOCUMENT_AGENT_SHARED_SECRET || config.get('document_agent_secret');
159
+ }
154
160
  /**
155
161
  * Check if JSON output is requested (via --json flag or OKRA_OUTPUT_FORMAT=json)
156
162
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * General chat (no documents) — proxied through worker to Fireworks.
3
+ *
4
+ * okra chat "what is a 10-K filing?"
5
+ */
6
+ export interface GeneralChatOptions {
7
+ message: string;
8
+ model?: string;
9
+ }
10
+ export declare function runGeneralChat(opts: GeneralChatOptions): Promise<void>;
11
+ //# sourceMappingURL=general-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"general-chat.d.ts","sourceRoot":"","sources":["../../src/lib/general-chat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+D5E"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * General chat (no documents) — proxied through worker to Fireworks.
3
+ *
4
+ * okra chat "what is a 10-K filing?"
5
+ */
6
+ import { getDocumentAgentSecret, getAgentSessionHttpUrl } from './config.js';
7
+ import { isQuietMode } from './runtime.js';
8
+ import { error } from './output.js';
9
+ import { createSpinner } from './progress.js';
10
+ import { EXIT_CODES } from './client.js';
11
+ import { readCompletionStream } from './completion-stream.js';
12
+ export async function runGeneralChat(opts) {
13
+ const secret = getDocumentAgentSecret();
14
+ if (!secret) {
15
+ error('DOCUMENT_AGENT_SHARED_SECRET not set. Add to .env or env.');
16
+ process.exit(EXIT_CODES.AUTH_ERROR);
17
+ }
18
+ const quiet = isQuietMode();
19
+ const useSpinners = !quiet && process.stderr.isTTY;
20
+ const baseUrl = getAgentSessionHttpUrl();
21
+ const completionUrl = `${baseUrl}/chat/completion`;
22
+ const chatSpinner = useSpinners
23
+ ? createSpinner('Thinking...', { stream: process.stderr })
24
+ : null;
25
+ chatSpinner?.start();
26
+ let totalCostUsd = 0;
27
+ try {
28
+ const response = await fetch(completionUrl, {
29
+ method: 'POST',
30
+ headers: {
31
+ 'Content-Type': 'application/json',
32
+ 'Accept': 'application/x-ndjson',
33
+ 'x-document-agent-secret': secret,
34
+ },
35
+ body: JSON.stringify({
36
+ prompt: opts.message,
37
+ stream: true,
38
+ ...(opts.model && { model: opts.model }),
39
+ }),
40
+ });
41
+ if (!response.ok) {
42
+ const body = await response.text();
43
+ throw new Error(`Chat failed (${response.status}): ${body}`);
44
+ }
45
+ const result = await readCompletionStream(response, {
46
+ onTextDelta(delta) {
47
+ if (chatSpinner?.isSpinning)
48
+ chatSpinner.stop();
49
+ process.stdout.write(delta);
50
+ },
51
+ });
52
+ totalCostUsd = result.costUsd;
53
+ if (chatSpinner?.isSpinning)
54
+ chatSpinner.stop();
55
+ process.stdout.write('\n');
56
+ if (!quiet && totalCostUsd > 0) {
57
+ const chalk = (await import('chalk')).default;
58
+ process.stderr.write(chalk.dim(`\n$${totalCostUsd.toFixed(4)}`) + '\n');
59
+ }
60
+ }
61
+ catch (err) {
62
+ if (chatSpinner?.isSpinning)
63
+ chatSpinner.fail('Chat failed');
64
+ error(err instanceof Error ? err.message : String(err));
65
+ process.exitCode = EXIT_CODES.GENERAL_ERROR;
66
+ }
67
+ process.exit(process.exitCode ?? 0);
68
+ }
69
+ //# sourceMappingURL=general-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"general-chat.js","sourceRoot":"","sources":["../../src/lib/general-chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Multi-document chat via /orchestrate/completion on worker.
3
+ *
4
+ * okra chat "compare revenue" --doc ocr-XXX,ocr-YYY
5
+ * okra chat "compare all" -c my-collection
6
+ *
7
+ * Lead agent (Fireworks kimi-k2p5) with query_document tool that fans out
8
+ * to each DocumentAgent DO's /completion endpoint.
9
+ */
10
+ export interface MultiDocChatOptions {
11
+ message: string;
12
+ /** Comma-separated job IDs */
13
+ documents?: string;
14
+ /** Collection name or ID */
15
+ collection?: string;
16
+ model?: string;
17
+ share?: boolean;
18
+ }
19
+ export declare function runMultiDocChat(opts: MultiDocChatOptions): Promise<void>;
20
+ //# sourceMappingURL=multi-doc-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-doc-chat.d.ts","sourceRoot":"","sources":["../../src/lib/multi-doc-chat.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA0ED,wBAAsB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8F9E"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Multi-document chat via /orchestrate/completion on worker.
3
+ *
4
+ * okra chat "compare revenue" --doc ocr-XXX,ocr-YYY
5
+ * okra chat "compare all" -c my-collection
6
+ *
7
+ * Lead agent (Fireworks kimi-k2p5) with query_document tool that fans out
8
+ * to each DocumentAgent DO's /completion endpoint.
9
+ */
10
+ import { getDocumentAgentSecret, getAgentSessionHttpUrl } from './config.js';
11
+ import { isQuietMode } from './runtime.js';
12
+ import { error, info } from './output.js';
13
+ import { createSpinner } from './progress.js';
14
+ import { EXIT_CODES, get, OkraApiError } from './client.js';
15
+ import { readCompletionStream } from './completion-stream.js';
16
+ async function resolveDocuments(documents, collection) {
17
+ // Direct job IDs — resolve file names in parallel
18
+ if (documents) {
19
+ const jobIds = documents.split(',').map(s => s.trim()).filter(Boolean);
20
+ for (const id of jobIds) {
21
+ if (!id.startsWith('ocr-')) {
22
+ error(`Invalid job ID: ${id} (must start with ocr-)`);
23
+ process.exit(EXIT_CODES.INVALID_ARGS);
24
+ }
25
+ }
26
+ const resolved = await Promise.all(jobIds.map(async (id) => {
27
+ try {
28
+ const job = await get(`api/v1/jobs/${id}`);
29
+ return { jobId: id, fileName: job.filename || id };
30
+ }
31
+ catch {
32
+ return { jobId: id, fileName: id };
33
+ }
34
+ }));
35
+ return resolved;
36
+ }
37
+ // Collection
38
+ if (collection) {
39
+ // Check if it's inline job IDs separated by commas
40
+ const parts = collection.split(',').map(s => s.trim());
41
+ if (parts.every(s => s.startsWith('ocr-'))) {
42
+ return parts.map(id => ({ jobId: id, fileName: id }));
43
+ }
44
+ try {
45
+ const payload = await get(`api/v1/collections/${encodeURIComponent(collection)}`);
46
+ info(`Collection: ${payload.name} (${payload.id})`);
47
+ const docs = payload.documents.map(d => ({
48
+ jobId: d.job_id,
49
+ fileName: d.file_name || d.job_id,
50
+ }));
51
+ for (const d of docs)
52
+ info(` ${d.jobId} ${d.fileName}`);
53
+ if (docs.length === 0) {
54
+ error('Collection is empty — add documents first');
55
+ process.exit(EXIT_CODES.INVALID_ARGS);
56
+ }
57
+ return docs;
58
+ }
59
+ catch (err) {
60
+ if (err instanceof OkraApiError && err.statusCode === 404) {
61
+ error(`Collection not found: ${collection}`);
62
+ process.exit(EXIT_CODES.NOT_FOUND);
63
+ }
64
+ throw err;
65
+ }
66
+ }
67
+ error('Provide document IDs (--doc) or collection (-c)');
68
+ process.exit(EXIT_CODES.INVALID_ARGS);
69
+ return []; // unreachable
70
+ }
71
+ export async function runMultiDocChat(opts) {
72
+ const secret = getDocumentAgentSecret();
73
+ if (!secret) {
74
+ error('DOCUMENT_AGENT_SHARED_SECRET not set. Add to .env or env.');
75
+ process.exit(EXIT_CODES.AUTH_ERROR);
76
+ }
77
+ const docs = await resolveDocuments(opts.documents, opts.collection);
78
+ const names = docs.map(d => d.fileName).join(', ');
79
+ info(`Querying ${docs.length} documents (${names})`);
80
+ const quiet = isQuietMode();
81
+ const useSpinners = !quiet && process.stderr.isTTY;
82
+ const baseUrl = getAgentSessionHttpUrl();
83
+ const completionUrl = `${baseUrl}/orchestrate/completion`;
84
+ const chatSpinner = useSpinners
85
+ ? createSpinner('Thinking...', { stream: process.stderr })
86
+ : null;
87
+ chatSpinner?.start();
88
+ let totalCostUsd = 0;
89
+ let toolCallCount = 0;
90
+ try {
91
+ const response = await fetch(completionUrl, {
92
+ method: 'POST',
93
+ headers: {
94
+ 'Content-Type': 'application/json',
95
+ 'Accept': 'application/x-ndjson',
96
+ 'x-document-agent-secret': secret,
97
+ },
98
+ body: JSON.stringify({
99
+ query: opts.message,
100
+ documents: docs,
101
+ stream: true,
102
+ ...(opts.model && { model: opts.model }),
103
+ }),
104
+ });
105
+ if (!response.ok) {
106
+ const body = await response.text();
107
+ throw new Error(`Orchestrate failed (${response.status}): ${body}`);
108
+ }
109
+ const result = await readCompletionStream(response, {
110
+ onTextDelta(delta) {
111
+ if (chatSpinner?.isSpinning)
112
+ chatSpinner.stop();
113
+ process.stdout.write(delta);
114
+ },
115
+ onToolCallEnd(name) {
116
+ toolCallCount++;
117
+ if (chatSpinner) {
118
+ if (!chatSpinner.isSpinning)
119
+ chatSpinner.start();
120
+ chatSpinner.text = `Querying: ${name}`;
121
+ }
122
+ },
123
+ onToolResult(name) {
124
+ if (chatSpinner?.isSpinning)
125
+ chatSpinner.text = `${name} done`;
126
+ },
127
+ onStepDone(stopReason) {
128
+ if (stopReason === 'toolUse' && chatSpinner) {
129
+ if (!chatSpinner.isSpinning)
130
+ chatSpinner.start();
131
+ chatSpinner.text = 'Synthesizing...';
132
+ }
133
+ },
134
+ });
135
+ totalCostUsd = result.costUsd;
136
+ if (chatSpinner?.isSpinning)
137
+ chatSpinner.stop();
138
+ process.stdout.write('\n');
139
+ if (!quiet) {
140
+ const parts = [];
141
+ if (totalCostUsd > 0)
142
+ parts.push(`$${totalCostUsd.toFixed(4)}`);
143
+ if (toolCallCount > 0)
144
+ parts.push(`${toolCallCount} tool calls`);
145
+ if (parts.length) {
146
+ const chalk = (await import('chalk')).default;
147
+ process.stderr.write(chalk.dim(`\n${parts.join(' | ')}`) + '\n');
148
+ }
149
+ }
150
+ if (opts.share) {
151
+ process.stderr.write(`Share URL: https://okrapdf.com/share/multi-doc\n`);
152
+ }
153
+ }
154
+ catch (err) {
155
+ if (chatSpinner?.isSpinning)
156
+ chatSpinner.fail('Query failed');
157
+ error(err instanceof Error ? err.message : String(err));
158
+ process.exitCode = EXIT_CODES.GENERAL_ERROR;
159
+ }
160
+ process.exit(process.exitCode ?? 0);
161
+ }
162
+ //# sourceMappingURL=multi-doc-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-doc-chat.js","sourceRoot":"","sources":["../../src/lib/multi-doc-chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Single-document chat via /document/:id/completion (Gen 3 path).
3
+ *
4
+ * Sends a prompt to a DocumentAgent DO and streams JSONL back.
5
+ */
6
+ export interface SingleDocChatOptions {
7
+ jobId: string;
8
+ message: string;
9
+ schema?: string;
10
+ share?: boolean;
11
+ model?: string;
12
+ }
13
+ export declare function runSingleDocChat(opts: SingleDocChatOptions): Promise<void>;
14
+ //# sourceMappingURL=single-doc-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-doc-chat.d.ts","sourceRoot":"","sources":["../../src/lib/single-doc-chat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyJhF"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Single-document chat via /document/:id/completion (Gen 3 path).
3
+ *
4
+ * Sends a prompt to a DocumentAgent DO and streams JSONL back.
5
+ */
6
+ import { getDocumentAgentSecret, getAgentSessionHttpUrl, getApiKey } from './config.js';
7
+ import { isQuietMode } from './runtime.js';
8
+ import { error, info } from './output.js';
9
+ import { createSpinner } from './progress.js';
10
+ import { EXIT_CODES, patch as apiPatch } from './client.js';
11
+ import { resolveSchema, extractJson, listBuiltinNames, } from './structured-output.js';
12
+ import { resolveJobId } from './resolver.js';
13
+ import { readCompletionStream } from './completion-stream.js';
14
+ export async function runSingleDocChat(opts) {
15
+ const secret = getDocumentAgentSecret();
16
+ if (!secret) {
17
+ error('DOCUMENT_AGENT_SHARED_SECRET not set. Add to .env or env. Use --socket for legacy WS path.');
18
+ process.exit(EXIT_CODES.AUTH_ERROR);
19
+ }
20
+ // Resolve schema if provided
21
+ let resolvedSchema;
22
+ if (opts.schema) {
23
+ if (opts.schema === 'help') {
24
+ console.log('Built-in schemas:');
25
+ for (const name of listBuiltinNames()) {
26
+ console.log(` ${name}`);
27
+ }
28
+ console.log('\nYou can also pass inline JSON or a file path:');
29
+ console.log(' --schema \'{"type":"object","properties":{"name":{"type":"string"}}}\'');
30
+ console.log(' --schema ./my-schema.json');
31
+ process.exit(0);
32
+ }
33
+ const result = resolveSchema(opts.schema);
34
+ if ('error' in result) {
35
+ error(result.error);
36
+ process.exit(EXIT_CODES.INVALID_ARGS);
37
+ }
38
+ resolvedSchema = result.schema;
39
+ }
40
+ // Resolve document reference to jobId
41
+ const resolved = await resolveJobId(opts.jobId).catch((err) => {
42
+ error(err instanceof Error ? err.message : String(err));
43
+ process.exit(EXIT_CODES.GENERAL_ERROR);
44
+ });
45
+ const jobId = resolved.jobId;
46
+ const quiet = isQuietMode();
47
+ const useSpinners = !quiet && process.stderr.isTTY;
48
+ // --share
49
+ if (opts.share) {
50
+ const apiKey = getApiKey();
51
+ if (apiKey) {
52
+ try {
53
+ await apiPatch(`api/share/${jobId}`, { is_public: true });
54
+ info(`Share URL: https://okrapdf.com/share/${jobId}`);
55
+ }
56
+ catch (err) {
57
+ error(`Failed to enable sharing: ${err instanceof Error ? err.message : String(err)}`);
58
+ }
59
+ }
60
+ }
61
+ const baseUrl = getAgentSessionHttpUrl();
62
+ const completionUrl = `${baseUrl}/document/${jobId}/completion`;
63
+ const chatSpinner = useSpinners
64
+ ? createSpinner('Thinking...', { stream: process.stderr })
65
+ : null;
66
+ chatSpinner?.start();
67
+ let finalAnswer = '';
68
+ let totalCostUsd = 0;
69
+ let toolCallCount = 0;
70
+ try {
71
+ const response = await fetch(completionUrl, {
72
+ method: 'POST',
73
+ headers: {
74
+ 'Content-Type': 'application/json',
75
+ 'Accept': 'application/x-ndjson',
76
+ 'x-document-agent-secret': secret,
77
+ },
78
+ body: JSON.stringify({ prompt: opts.message, stream: true }),
79
+ });
80
+ if (!response.ok) {
81
+ const body = await response.text();
82
+ throw new Error(`Completion failed (${response.status}): ${body}`);
83
+ }
84
+ const result = await readCompletionStream(response, {
85
+ onTextDelta(delta) {
86
+ if (chatSpinner?.isSpinning)
87
+ chatSpinner.stop();
88
+ process.stdout.write(delta);
89
+ },
90
+ onToolCallEnd(name) {
91
+ toolCallCount++;
92
+ if (chatSpinner) {
93
+ if (!chatSpinner.isSpinning)
94
+ chatSpinner.start();
95
+ chatSpinner.text = `Tool: ${name}`;
96
+ }
97
+ },
98
+ onToolResult(name) {
99
+ if (chatSpinner?.isSpinning)
100
+ chatSpinner.text = `Tool: ${name} done`;
101
+ },
102
+ onStepDone(stopReason) {
103
+ if (stopReason === 'toolUse' && chatSpinner) {
104
+ if (!chatSpinner.isSpinning)
105
+ chatSpinner.start();
106
+ chatSpinner.text = 'Thinking...';
107
+ }
108
+ },
109
+ });
110
+ finalAnswer = result.answer;
111
+ totalCostUsd = result.costUsd;
112
+ if (chatSpinner?.isSpinning)
113
+ chatSpinner.stop();
114
+ process.stdout.write('\n');
115
+ if (!quiet && !resolvedSchema) {
116
+ const parts = [];
117
+ if (totalCostUsd > 0)
118
+ parts.push(`$${totalCostUsd.toFixed(4)}`);
119
+ if (toolCallCount > 0)
120
+ parts.push(`${toolCallCount} tool calls`);
121
+ if (parts.length) {
122
+ const chalk = (await import('chalk')).default;
123
+ process.stderr.write(chalk.dim(`\n${parts.join(' | ')}`) + '\n');
124
+ }
125
+ }
126
+ if (opts.share)
127
+ process.stderr.write(`Share URL: https://okrapdf.com/share/${jobId}\n`);
128
+ }
129
+ catch (err) {
130
+ if (chatSpinner?.isSpinning)
131
+ chatSpinner.fail('Completion failed');
132
+ error(err instanceof Error ? err.message : String(err));
133
+ process.exitCode = EXIT_CODES.GENERAL_ERROR;
134
+ }
135
+ // Structured output
136
+ if (resolvedSchema && !process.exitCode) {
137
+ let parsed = extractJson(finalAnswer);
138
+ if (parsed === null) {
139
+ process.stderr.write('Failed to extract JSON from response.\n');
140
+ process.stderr.write('Raw output:\n' + finalAnswer + '\n');
141
+ process.exitCode = EXIT_CODES.VALIDATION_ERROR;
142
+ }
143
+ if (parsed !== null && !process.exitCode) {
144
+ if (resolvedSchema.zodSchema) {
145
+ const result = resolvedSchema.zodSchema.safeParse(parsed);
146
+ if (result.success) {
147
+ process.stdout.write(JSON.stringify(result.data, null, 2) + '\n');
148
+ }
149
+ else {
150
+ process.stderr.write('Schema validation failed:\n');
151
+ for (const issue of result.error.issues) {
152
+ process.stderr.write(` - ${issue.path.join('.')}: ${issue.message}\n`);
153
+ }
154
+ process.stderr.write('\nRaw JSON:\n' + JSON.stringify(parsed, null, 2) + '\n');
155
+ process.exitCode = EXIT_CODES.VALIDATION_ERROR;
156
+ }
157
+ }
158
+ else {
159
+ process.stdout.write(JSON.stringify(parsed, null, 2) + '\n');
160
+ }
161
+ }
162
+ }
163
+ process.exit(process.exitCode ?? 0);
164
+ }
165
+ //# sourceMappingURL=single-doc-chat.js.map