@steipete/oracle 0.8.6 → 0.10.0

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 (181) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +130 -45
  3. package/dist/bin/oracle-cli.js +613 -379
  4. package/dist/bin/oracle-mcp.js +2 -2
  5. package/dist/bin/oracle.js +165 -279
  6. package/dist/scripts/agent-send.js +31 -31
  7. package/dist/scripts/check.js +6 -6
  8. package/dist/scripts/debug/extract-chatgpt-response.js +10 -10
  9. package/dist/scripts/docs-list.js +30 -30
  10. package/dist/scripts/git-policy.js +25 -23
  11. package/dist/scripts/run-cli.js +8 -8
  12. package/dist/scripts/runner.js +203 -195
  13. package/dist/scripts/test-browser.js +21 -18
  14. package/dist/scripts/test-remote-chrome.js +20 -20
  15. package/dist/src/bridge/connection.js +18 -18
  16. package/dist/src/bridge/userConfigFile.js +7 -7
  17. package/dist/src/browser/actions/assistantResponse.js +149 -101
  18. package/dist/src/browser/actions/attachmentDataTransfer.js +49 -47
  19. package/dist/src/browser/actions/attachments.js +246 -150
  20. package/dist/src/browser/actions/domEvents.js +2 -2
  21. package/dist/src/browser/actions/modelSelection.js +314 -104
  22. package/dist/src/browser/actions/navigation.js +161 -136
  23. package/dist/src/browser/actions/promptComposer.js +100 -64
  24. package/dist/src/browser/actions/remoteFileTransfer.js +10 -10
  25. package/dist/src/browser/actions/thinkingTime.js +207 -110
  26. package/dist/src/browser/chromeLifecycle.js +62 -60
  27. package/dist/src/browser/config.js +34 -15
  28. package/dist/src/browser/constants.js +17 -12
  29. package/dist/src/browser/cookies.js +19 -19
  30. package/dist/src/browser/detect.js +62 -62
  31. package/dist/src/browser/domDebug.js +1 -1
  32. package/dist/src/browser/index.js +452 -303
  33. package/dist/src/browser/modelStrategy.js +1 -1
  34. package/dist/src/browser/pageActions.js +5 -5
  35. package/dist/src/browser/policies.js +16 -13
  36. package/dist/src/browser/profileState.js +44 -39
  37. package/dist/src/browser/prompt.js +72 -42
  38. package/dist/src/browser/promptSummary.js +5 -5
  39. package/dist/src/browser/providerDomFlow.js +17 -0
  40. package/dist/src/browser/providers/chatgptDomProvider.js +49 -0
  41. package/dist/src/browser/providers/geminiDeepThinkDomProvider.js +254 -0
  42. package/dist/src/browser/providers/index.js +2 -0
  43. package/dist/src/browser/reattach.js +67 -34
  44. package/dist/src/browser/reattachHelpers.js +31 -26
  45. package/dist/src/browser/sessionRunner.js +37 -25
  46. package/dist/src/browser/utils.js +9 -9
  47. package/dist/src/browserMode.js +1 -1
  48. package/dist/src/cli/bridge/claudeConfig.js +16 -16
  49. package/dist/src/cli/bridge/client.js +28 -20
  50. package/dist/src/cli/bridge/codexConfig.js +16 -16
  51. package/dist/src/cli/bridge/doctor.js +47 -39
  52. package/dist/src/cli/bridge/host.js +58 -56
  53. package/dist/src/cli/browserConfig.js +65 -45
  54. package/dist/src/cli/browserDefaults.js +27 -26
  55. package/dist/src/cli/bundleWarnings.js +1 -1
  56. package/dist/src/cli/clipboard.js +11 -2
  57. package/dist/src/cli/detach.js +7 -4
  58. package/dist/src/cli/dryRun.js +29 -25
  59. package/dist/src/cli/duplicatePromptGuard.js +3 -3
  60. package/dist/src/cli/engine.js +9 -9
  61. package/dist/src/cli/errorUtils.js +1 -1
  62. package/dist/src/cli/fileSize.js +11 -0
  63. package/dist/src/cli/format.js +2 -2
  64. package/dist/src/cli/help.js +28 -28
  65. package/dist/src/cli/hiddenAliases.js +3 -3
  66. package/dist/src/cli/markdownBundle.js +12 -8
  67. package/dist/src/cli/markdownRenderer.js +15 -15
  68. package/dist/src/cli/notifier.js +77 -67
  69. package/dist/src/cli/options.js +145 -87
  70. package/dist/src/cli/oscUtils.js +1 -1
  71. package/dist/src/cli/promptRequirement.js +2 -2
  72. package/dist/src/cli/renderOutput.js +1 -1
  73. package/dist/src/cli/rootAlias.js +1 -1
  74. package/dist/src/cli/runOptions.js +37 -25
  75. package/dist/src/cli/sessionCommand.js +31 -21
  76. package/dist/src/cli/sessionDisplay.js +182 -79
  77. package/dist/src/cli/sessionLineage.js +60 -0
  78. package/dist/src/cli/sessionRunner.js +118 -90
  79. package/dist/src/cli/sessionTable.js +28 -24
  80. package/dist/src/cli/stdin.js +22 -0
  81. package/dist/src/cli/tagline.js +121 -124
  82. package/dist/src/cli/tui/index.js +140 -127
  83. package/dist/src/cli/writeOutputPath.js +5 -5
  84. package/dist/src/config.js +7 -7
  85. package/dist/src/gemini-web/browserSessionManager.js +80 -0
  86. package/dist/src/gemini-web/client.js +81 -64
  87. package/dist/src/gemini-web/executionMode.js +16 -0
  88. package/dist/src/gemini-web/executor.js +327 -169
  89. package/dist/src/gemini-web/index.js +1 -1
  90. package/dist/src/mcp/server.js +16 -12
  91. package/dist/src/mcp/tools/consult.js +81 -64
  92. package/dist/src/mcp/tools/sessionResources.js +12 -12
  93. package/dist/src/mcp/tools/sessions.js +26 -17
  94. package/dist/src/mcp/types.js +5 -5
  95. package/dist/src/mcp/utils.js +15 -7
  96. package/dist/src/oracle/background.js +15 -15
  97. package/dist/src/oracle/claude.js +53 -25
  98. package/dist/src/oracle/client.js +84 -46
  99. package/dist/src/oracle/config.js +124 -58
  100. package/dist/src/oracle/errors.js +38 -38
  101. package/dist/src/oracle/files.js +69 -45
  102. package/dist/src/oracle/finishLine.js +10 -8
  103. package/dist/src/oracle/format.js +3 -3
  104. package/dist/src/oracle/gemini.js +37 -30
  105. package/dist/src/oracle/logging.js +7 -7
  106. package/dist/src/oracle/markdown.js +28 -28
  107. package/dist/src/oracle/modelResolver.js +16 -16
  108. package/dist/src/oracle/multiModelRunner.js +12 -12
  109. package/dist/src/oracle/oscProgress.js +8 -8
  110. package/dist/src/oracle/promptAssembly.js +6 -3
  111. package/dist/src/oracle/request.js +23 -15
  112. package/dist/src/oracle/run.js +172 -140
  113. package/dist/src/oracle/runUtils.js +8 -5
  114. package/dist/src/oracle/tokenEstimate.js +6 -6
  115. package/dist/src/oracle/tokenStats.js +5 -5
  116. package/dist/src/oracle/tokenStringifier.js +5 -5
  117. package/dist/src/oracle.js +12 -12
  118. package/dist/src/oracleHome.js +3 -3
  119. package/dist/src/remote/client.js +25 -25
  120. package/dist/src/remote/health.js +20 -20
  121. package/dist/src/remote/remoteServiceConfig.js +9 -9
  122. package/dist/src/remote/server.js +129 -118
  123. package/dist/src/sessionManager.js +81 -75
  124. package/dist/src/sessionStore.js +3 -3
  125. package/dist/src/version.js +10 -10
  126. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/CodeResources +0 -0
  127. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/MacOS/OracleNotifier +0 -0
  128. package/dist/vendor/oracle-notifier/README.md +2 -0
  129. package/package.json +69 -65
  130. package/vendor/oracle-notifier/OracleNotifier.app/Contents/CodeResources +0 -0
  131. package/vendor/oracle-notifier/OracleNotifier.app/Contents/MacOS/OracleNotifier +0 -0
  132. package/vendor/oracle-notifier/README.md +2 -0
  133. package/dist/markdansi/types/index.js +0 -4
  134. package/dist/oracle/bin/oracle-cli.js +0 -472
  135. package/dist/oracle/src/browser/actions/assistantResponse.js +0 -471
  136. package/dist/oracle/src/browser/actions/attachments.js +0 -82
  137. package/dist/oracle/src/browser/actions/modelSelection.js +0 -190
  138. package/dist/oracle/src/browser/actions/navigation.js +0 -75
  139. package/dist/oracle/src/browser/actions/promptComposer.js +0 -167
  140. package/dist/oracle/src/browser/chromeLifecycle.js +0 -104
  141. package/dist/oracle/src/browser/config.js +0 -33
  142. package/dist/oracle/src/browser/constants.js +0 -40
  143. package/dist/oracle/src/browser/cookies.js +0 -210
  144. package/dist/oracle/src/browser/domDebug.js +0 -36
  145. package/dist/oracle/src/browser/index.js +0 -331
  146. package/dist/oracle/src/browser/pageActions.js +0 -5
  147. package/dist/oracle/src/browser/prompt.js +0 -88
  148. package/dist/oracle/src/browser/promptSummary.js +0 -20
  149. package/dist/oracle/src/browser/sessionRunner.js +0 -80
  150. package/dist/oracle/src/browser/utils.js +0 -62
  151. package/dist/oracle/src/browserMode.js +0 -1
  152. package/dist/oracle/src/cli/browserConfig.js +0 -44
  153. package/dist/oracle/src/cli/dryRun.js +0 -59
  154. package/dist/oracle/src/cli/engine.js +0 -17
  155. package/dist/oracle/src/cli/errorUtils.js +0 -9
  156. package/dist/oracle/src/cli/help.js +0 -70
  157. package/dist/oracle/src/cli/markdownRenderer.js +0 -15
  158. package/dist/oracle/src/cli/options.js +0 -103
  159. package/dist/oracle/src/cli/promptRequirement.js +0 -14
  160. package/dist/oracle/src/cli/rootAlias.js +0 -30
  161. package/dist/oracle/src/cli/sessionCommand.js +0 -77
  162. package/dist/oracle/src/cli/sessionDisplay.js +0 -270
  163. package/dist/oracle/src/cli/sessionRunner.js +0 -94
  164. package/dist/oracle/src/heartbeat.js +0 -43
  165. package/dist/oracle/src/oracle/client.js +0 -48
  166. package/dist/oracle/src/oracle/config.js +0 -29
  167. package/dist/oracle/src/oracle/errors.js +0 -101
  168. package/dist/oracle/src/oracle/files.js +0 -220
  169. package/dist/oracle/src/oracle/format.js +0 -33
  170. package/dist/oracle/src/oracle/fsAdapter.js +0 -7
  171. package/dist/oracle/src/oracle/oscProgress.js +0 -60
  172. package/dist/oracle/src/oracle/request.js +0 -48
  173. package/dist/oracle/src/oracle/run.js +0 -444
  174. package/dist/oracle/src/oracle/tokenStats.js +0 -39
  175. package/dist/oracle/src/oracle/types.js +0 -1
  176. package/dist/oracle/src/oracle.js +0 -9
  177. package/dist/oracle/src/sessionManager.js +0 -205
  178. package/dist/oracle/src/version.js +0 -39
  179. package/dist/scripts/chrome/browser-tools.js +0 -295
  180. package/dist/src/browser/profileSync.js +0 -141
  181. /package/dist/{oracle/src/browser/types.js → src/gemini-web/executionClients.js} +0 -0
@@ -2,29 +2,29 @@ export function maskApiKey(key) {
2
2
  if (!key)
3
3
  return null;
4
4
  if (key.length <= 8)
5
- return `${key[0] ?? ''}***${key[key.length - 1] ?? ''}`;
5
+ return `${key[0] ?? ""}***${key[key.length - 1] ?? ""}`;
6
6
  const prefix = key.slice(0, 4);
7
7
  const suffix = key.slice(-4);
8
8
  return `${prefix}****${suffix}`;
9
9
  }
10
10
  export function formatBaseUrlForLog(raw) {
11
11
  if (!raw)
12
- return '';
12
+ return "";
13
13
  try {
14
14
  const parsed = new URL(raw);
15
- const segments = parsed.pathname.split('/').filter(Boolean);
16
- let path = '';
15
+ const segments = parsed.pathname.split("/").filter(Boolean);
16
+ let path = "";
17
17
  if (segments.length > 0) {
18
18
  path = `/${segments[0]}`;
19
19
  if (segments.length > 1) {
20
- path += '/...';
20
+ path += "/...";
21
21
  }
22
22
  }
23
- const allowedQueryKeys = ['api-version'];
23
+ const allowedQueryKeys = ["api-version"];
24
24
  const maskedQuery = allowedQueryKeys
25
25
  .filter((key) => parsed.searchParams.has(key))
26
26
  .map((key) => `${key}=***`);
27
- const query = maskedQuery.length > 0 ? `?${maskedQuery.join('&')}` : '';
27
+ const query = maskedQuery.length > 0 ? `?${maskedQuery.join("&")}` : "";
28
28
  return `${parsed.protocol}//${parsed.host}${path}${query}`;
29
29
  }
30
30
  catch {
@@ -1,29 +1,29 @@
1
- import path from 'node:path';
1
+ import path from "node:path";
2
2
  const EXT_TO_LANG = {
3
- '.ts': 'ts',
4
- '.tsx': 'tsx',
5
- '.js': 'js',
6
- '.jsx': 'jsx',
7
- '.json': 'json',
8
- '.swift': 'swift',
9
- '.md': 'md',
10
- '.sh': 'bash',
11
- '.bash': 'bash',
12
- '.zsh': 'bash',
13
- '.py': 'python',
14
- '.rb': 'ruby',
15
- '.rs': 'rust',
16
- '.go': 'go',
17
- '.java': 'java',
18
- '.c': 'c',
19
- '.h': 'c',
20
- '.cpp': 'cpp',
21
- '.hpp': 'cpp',
22
- '.css': 'css',
23
- '.scss': 'scss',
24
- '.sql': 'sql',
25
- '.yaml': 'yaml',
26
- '.yml': 'yaml',
3
+ ".ts": "ts",
4
+ ".tsx": "tsx",
5
+ ".js": "js",
6
+ ".jsx": "jsx",
7
+ ".json": "json",
8
+ ".swift": "swift",
9
+ ".md": "md",
10
+ ".sh": "bash",
11
+ ".bash": "bash",
12
+ ".zsh": "bash",
13
+ ".py": "python",
14
+ ".rb": "ruby",
15
+ ".rs": "rust",
16
+ ".go": "go",
17
+ ".java": "java",
18
+ ".c": "c",
19
+ ".h": "c",
20
+ ".cpp": "cpp",
21
+ ".hpp": "cpp",
22
+ ".css": "css",
23
+ ".scss": "scss",
24
+ ".sql": "sql",
25
+ ".yaml": "yaml",
26
+ ".yml": "yaml",
27
27
  };
28
28
  function detectFenceLanguage(displayPath) {
29
29
  const ext = path.extname(displayPath).toLowerCase();
@@ -34,13 +34,13 @@ function pickFence(content) {
34
34
  const matches = [...content.matchAll(/`+/g)];
35
35
  const maxTicks = matches.reduce((max, m) => Math.max(max, m[0].length), 0);
36
36
  const fenceLength = Math.max(3, maxTicks + 1);
37
- return '`'.repeat(fenceLength);
37
+ return "`".repeat(fenceLength);
38
38
  }
39
39
  export function formatFileSection(displayPath, content) {
40
40
  const fence = pickFence(content);
41
41
  const lang = detectFenceLanguage(displayPath);
42
- const normalized = content.replace(/\s+$/u, '');
42
+ const normalized = content.replace(/\s+$/u, "");
43
43
  const header = `### File: ${displayPath}`;
44
44
  const fenceOpen = lang ? `${fence}${lang}` : fence;
45
- return [header, fenceOpen, normalized, fence, ''].join('\n');
45
+ return [header, fenceOpen, normalized, fence, ""].join("\n");
46
46
  }
@@ -1,8 +1,8 @@
1
- import { MODEL_CONFIGS, PRO_MODELS } from './config.js';
2
- import { countTokens as countTokensGpt5Pro } from 'gpt-tokenizer/model/gpt-5-pro';
3
- import { pricingFromUsdPerMillion } from 'tokentally';
4
- const OPENROUTER_DEFAULT_BASE = 'https://openrouter.ai/api/v1';
5
- const OPENROUTER_MODELS_ENDPOINT = 'https://openrouter.ai/api/v1/models';
1
+ import { MODEL_CONFIGS, PRO_MODELS } from "./config.js";
2
+ import { countTokens as countTokensGpt5Pro } from "gpt-tokenizer/model/gpt-5-pro";
3
+ import { pricingFromUsdPerMillion } from "tokentally";
4
+ const OPENROUTER_DEFAULT_BASE = "https://openrouter.ai/api/v1";
5
+ const OPENROUTER_MODELS_ENDPOINT = "https://openrouter.ai/api/v1/models";
6
6
  export function isKnownModel(model) {
7
7
  return Object.hasOwn(MODEL_CONFIGS, model);
8
8
  }
@@ -11,7 +11,7 @@ export function isOpenRouterBaseUrl(baseUrl) {
11
11
  return false;
12
12
  try {
13
13
  const url = new URL(baseUrl);
14
- return url.hostname.includes('openrouter.ai');
14
+ return url.hostname.includes("openrouter.ai");
15
15
  }
16
16
  catch {
17
17
  return false;
@@ -24,17 +24,17 @@ export function normalizeOpenRouterBaseUrl(baseUrl) {
24
24
  try {
25
25
  const url = new URL(baseUrl);
26
26
  // If user passed the responses endpoint, trim it so the client does not double-append.
27
- if (url.pathname.endsWith('/responses')) {
28
- url.pathname = url.pathname.replace(/\/responses\/?$/, '');
27
+ if (url.pathname.endsWith("/responses")) {
28
+ url.pathname = url.pathname.replace(/\/responses\/?$/, "");
29
29
  }
30
- return url.toString().replace(/\/+$/, '');
30
+ return url.toString().replace(/\/+$/, "");
31
31
  }
32
32
  catch {
33
33
  return baseUrl;
34
34
  }
35
35
  }
36
36
  export function safeModelSlug(model) {
37
- return model.replace(/[/\\]/g, '__').replace(/[:*?"<>|]/g, '_');
37
+ return model.replace(/[/\\]/g, "__").replace(/[:*?"<>|]/g, "_");
38
38
  }
39
39
  const catalogCache = new Map();
40
40
  const CACHE_TTL_MS = 5 * 60 * 1000;
@@ -81,7 +81,7 @@ async function fetchOpenRouterCatalog(apiKey, fetcher) {
81
81
  return models;
82
82
  }
83
83
  function mapToOpenRouterId(candidate, catalog, providerHint) {
84
- if (candidate.includes('/'))
84
+ if (candidate.includes("/"))
85
85
  return candidate;
86
86
  const byExact = catalog.find((entry) => entry.id === candidate);
87
87
  if (byExact)
@@ -105,7 +105,7 @@ export async function resolveModelConfig(model, options = {}) {
105
105
  if (openRouterActive && options.openRouterApiKey) {
106
106
  try {
107
107
  const catalog = await fetchOpenRouterCatalog(options.openRouterApiKey, fetcher);
108
- const targetId = mapToOpenRouterId(typeof model === 'string' ? model : String(model), catalog, known?.provider);
108
+ const targetId = mapToOpenRouterId(typeof model === "string" ? model : String(model), catalog, known?.provider);
109
109
  const info = catalog.find((entry) => entry.id === targetId) ?? null;
110
110
  if (info) {
111
111
  return {
@@ -117,7 +117,7 @@ export async function resolveModelConfig(model, options = {}) {
117
117
  }),
118
118
  apiModel: targetId,
119
119
  openRouterId: targetId,
120
- provider: known?.provider ?? 'other',
120
+ provider: known?.provider ?? "other",
121
121
  inputLimit: info.context_length ?? known?.inputLimit ?? 200_000,
122
122
  pricing: info.pricing && info.pricing.prompt != null && info.pricing.completion != null
123
123
  ? (() => {
@@ -130,7 +130,7 @@ export async function resolveModelConfig(model, options = {}) {
130
130
  outputPerToken: pricing.outputUsdPerToken,
131
131
  };
132
132
  })()
133
- : known?.pricing ?? null,
133
+ : (known?.pricing ?? null),
134
134
  supportsBackground: known?.supportsBackground ?? true,
135
135
  supportsSearch: known?.supportsSearch ?? true,
136
136
  };
@@ -145,7 +145,7 @@ export async function resolveModelConfig(model, options = {}) {
145
145
  }),
146
146
  apiModel: targetId,
147
147
  openRouterId: targetId,
148
- provider: known?.provider ?? 'other',
148
+ provider: known?.provider ?? "other",
149
149
  supportsBackground: known?.supportsBackground ?? true,
150
150
  supportsSearch: known?.supportsSearch ?? true,
151
151
  pricing: known?.pricing ?? null,
@@ -163,7 +163,7 @@ export async function resolveModelConfig(model, options = {}) {
163
163
  inputLimit: 200_000,
164
164
  reasoning: null,
165
165
  }),
166
- provider: known?.provider ?? 'other',
166
+ provider: known?.provider ?? "other",
167
167
  supportsBackground: known?.supportsBackground ?? true,
168
168
  supportsSearch: known?.supportsSearch ?? true,
169
169
  pricing: known?.pricing ?? null,
@@ -1,8 +1,8 @@
1
- import fs from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { runOracle, OracleResponseError, OracleTransportError, extractResponseMetadata, asOracleUserError, extractTextOutput, } from '../oracle.js';
4
- import { sessionStore } from '../sessionStore.js';
5
- import { findOscProgressSequences, OSC_PROGRESS_PREFIX } from 'osc-progress';
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { runOracle, OracleResponseError, OracleTransportError, extractResponseMetadata, asOracleUserError, extractTextOutput, } from "../oracle.js";
4
+ import { sessionStore } from "../sessionStore.js";
5
+ import { findOscProgressSequences, OSC_PROGRESS_PREFIX } from "osc-progress";
6
6
  function forwardOscProgress(chunk, shouldForward) {
7
7
  if (!shouldForward || !chunk.includes(OSC_PROGRESS_PREFIX)) {
8
8
  return;
@@ -43,7 +43,7 @@ export async function runMultiModelApiSession(params, deps = defaultDeps) {
43
43
  const rejected = [];
44
44
  settled.forEach((result, index) => {
45
45
  const exec = executions[index];
46
- if (result.status === 'fulfilled') {
46
+ if (result.status === "fulfilled") {
47
47
  fulfilled.push(result.value);
48
48
  }
49
49
  else {
@@ -65,7 +65,7 @@ function startModelExecution({ sessionMeta, runOptions, model, cwd, store, runOr
65
65
  sessionId: `${sessionMeta.id}:${model}`,
66
66
  };
67
67
  const perModelLog = (message) => {
68
- logWriter.logLine(message ?? '');
68
+ logWriter.logLine(message ?? "");
69
69
  };
70
70
  const mirrorOscProgress = process.stdout.isTTY === true;
71
71
  const perModelWrite = (chunk) => {
@@ -75,7 +75,7 @@ function startModelExecution({ sessionMeta, runOptions, model, cwd, store, runOr
75
75
  };
76
76
  const promise = (async () => {
77
77
  await store.updateModelRun(sessionMeta.id, model, {
78
- status: 'running',
78
+ status: "running",
79
79
  queuedAt: new Date().toISOString(),
80
80
  startedAt: new Date().toISOString(),
81
81
  });
@@ -91,12 +91,12 @@ function startModelExecution({ sessionMeta, runOptions, model, cwd, store, runOr
91
91
  log: perModelLog,
92
92
  write: perModelWrite,
93
93
  });
94
- if (result.mode !== 'live') {
95
- throw new Error('Unexpected preview result while running a session.');
94
+ if (result.mode !== "live") {
95
+ throw new Error("Unexpected preview result while running a session.");
96
96
  }
97
97
  const answerText = extractTextOutput(result.response);
98
98
  await store.updateModelRun(sessionMeta.id, model, {
99
- status: 'completed',
99
+ status: "completed",
100
100
  completedAt: new Date().toISOString(),
101
101
  usage: result.usage,
102
102
  response: extractResponseMetadata(result.response),
@@ -116,7 +116,7 @@ function startModelExecution({ sessionMeta, runOptions, model, cwd, store, runOr
116
116
  const responseMetadata = error instanceof OracleResponseError ? error.metadata : undefined;
117
117
  const transportMetadata = error instanceof OracleTransportError ? { reason: error.reason } : undefined;
118
118
  await store.updateModelRun(sessionMeta.id, model, {
119
- status: 'error',
119
+ status: "error",
120
120
  completedAt: new Date().toISOString(),
121
121
  response: responseMetadata,
122
122
  transport: transportMetadata,
@@ -1,24 +1,24 @@
1
- import process from 'node:process';
2
- import { startOscProgress as startOscProgressShared, supportsOscProgress as supportsOscProgressShared, } from 'osc-progress';
1
+ import process from "node:process";
2
+ import { startOscProgress as startOscProgressShared, supportsOscProgress as supportsOscProgressShared, } from "osc-progress";
3
3
  export function supportsOscProgress(env = process.env, isTty = process.stdout.isTTY) {
4
- if (env.CODEX_MANAGED_BY_NPM === '1' && env.ORACLE_FORCE_OSC_PROGRESS !== '1') {
4
+ if (env.CODEX_MANAGED_BY_NPM === "1" && env.ORACLE_FORCE_OSC_PROGRESS !== "1") {
5
5
  return false;
6
6
  }
7
7
  return supportsOscProgressShared(env, isTty, {
8
- disableEnvVar: 'ORACLE_NO_OSC_PROGRESS',
9
- forceEnvVar: 'ORACLE_FORCE_OSC_PROGRESS',
8
+ disableEnvVar: "ORACLE_NO_OSC_PROGRESS",
9
+ forceEnvVar: "ORACLE_FORCE_OSC_PROGRESS",
10
10
  });
11
11
  }
12
12
  export function startOscProgress(options = {}) {
13
13
  const env = options.env ?? process.env;
14
- if (env.CODEX_MANAGED_BY_NPM === '1' && env.ORACLE_FORCE_OSC_PROGRESS !== '1') {
14
+ if (env.CODEX_MANAGED_BY_NPM === "1" && env.ORACLE_FORCE_OSC_PROGRESS !== "1") {
15
15
  return () => { };
16
16
  }
17
17
  return startOscProgressShared({
18
18
  ...options,
19
19
  // Preserve Oracle's previous default: progress emits to stdout.
20
20
  write: options.write ?? ((text) => process.stdout.write(text)),
21
- disableEnvVar: 'ORACLE_NO_OSC_PROGRESS',
22
- forceEnvVar: 'ORACLE_FORCE_OSC_PROGRESS',
21
+ disableEnvVar: "ORACLE_NO_OSC_PROGRESS",
22
+ forceEnvVar: "ORACLE_FORCE_OSC_PROGRESS",
23
23
  });
24
24
  }
@@ -1,13 +1,16 @@
1
- import { formatFileSection } from './markdown.js';
1
+ import { formatFileSection } from "./markdown.js";
2
2
  /**
3
3
  * Build the shared markdown structure for system/user/file sections.
4
4
  * Collapses excessive blank lines and trims trailing whitespace to keep
5
5
  * snapshots stable across CLI and browser modes.
6
6
  */
7
7
  export function buildPromptMarkdown(systemPrompt, userPrompt, sections) {
8
- const lines = ['[SYSTEM]', systemPrompt, '', '[USER]', userPrompt, ''];
8
+ const lines = ["[SYSTEM]", systemPrompt, "", "[USER]", userPrompt, ""];
9
9
  sections.forEach((section) => {
10
10
  lines.push(formatFileSection(section.displayPath, section.content));
11
11
  });
12
- return lines.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd();
12
+ return lines
13
+ .join("\n")
14
+ .replace(/\n{3,}/g, "\n\n")
15
+ .trimEnd();
13
16
  }
@@ -1,27 +1,28 @@
1
- import fs from 'node:fs/promises';
2
- import { DEFAULT_SYSTEM_PROMPT } from './config.js';
3
- import { createFileSections, readFiles } from './files.js';
4
- import { formatFileSection } from './markdown.js';
5
- import { createFsAdapter } from './fsAdapter.js';
1
+ import fs from "node:fs/promises";
2
+ import { DEFAULT_SYSTEM_PROMPT } from "./config.js";
3
+ import { createFileSections, readFiles } from "./files.js";
4
+ import { formatFileSection } from "./markdown.js";
5
+ import { createFsAdapter } from "./fsAdapter.js";
6
6
  export function buildPrompt(basePrompt, files, cwd = process.cwd()) {
7
7
  if (!files.length) {
8
8
  return basePrompt;
9
9
  }
10
10
  const sections = createFileSections(files, cwd);
11
- const sectionText = sections.map((section) => section.sectionText).join('\n\n');
11
+ const sectionText = sections.map((section) => section.sectionText).join("\n\n");
12
12
  return `${basePrompt.trim()}\n\n${sectionText}`;
13
13
  }
14
- export function buildRequestBody({ modelConfig, systemPrompt, userPrompt, searchEnabled, maxOutputTokens, background, storeResponse, }) {
15
- const searchToolType = modelConfig.searchToolType ?? 'web_search_preview';
14
+ export function buildRequestBody({ modelConfig, systemPrompt, userPrompt, searchEnabled, maxOutputTokens, background, storeResponse, previousResponseId, }) {
15
+ const searchToolType = modelConfig.searchToolType ?? "web_search_preview";
16
16
  return {
17
17
  model: modelConfig.apiModel ?? modelConfig.model,
18
+ previous_response_id: previousResponseId ? previousResponseId : undefined,
18
19
  instructions: systemPrompt,
19
20
  input: [
20
21
  {
21
- role: 'user',
22
+ role: "user",
22
23
  content: [
23
24
  {
24
- type: 'input_text',
25
+ type: "input_text",
25
26
  text: userPrompt,
26
27
  },
27
28
  ],
@@ -37,14 +38,21 @@ export function buildRequestBody({ modelConfig, systemPrompt, userPrompt, search
37
38
  export async function renderPromptMarkdown(options, deps = {}) {
38
39
  const cwd = deps.cwd ?? process.cwd();
39
40
  const fsModule = deps.fs ?? createFsAdapter(fs);
40
- const files = await readFiles(options.file ?? [], { cwd, fsModule });
41
+ const files = await readFiles(options.file ?? [], {
42
+ cwd,
43
+ fsModule,
44
+ maxFileSizeBytes: options.maxFileSizeBytes,
45
+ });
41
46
  const sections = createFileSections(files, cwd);
42
47
  const systemPrompt = options.system?.trim() || DEFAULT_SYSTEM_PROMPT;
43
- const userPrompt = (options.prompt ?? '').trim();
44
- const lines = ['[SYSTEM]', systemPrompt, ''];
45
- lines.push('[USER]', userPrompt, '');
48
+ const userPrompt = (options.prompt ?? "").trim();
49
+ const lines = ["[SYSTEM]", systemPrompt, ""];
50
+ lines.push("[USER]", userPrompt, "");
46
51
  sections.forEach((section) => {
47
52
  lines.push(formatFileSection(section.displayPath, section.content));
48
53
  });
49
- return lines.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd();
54
+ return lines
55
+ .join("\n")
56
+ .replace(/\n{3,}/g, "\n\n")
57
+ .trimEnd();
50
58
  }