@steipete/oracle 0.20.3 → 0.21.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 (47) hide show
  1. package/dist/bin/oracle-cli.js +2 -0
  2. package/dist/docs-site/.nojekyll +0 -0
  3. package/dist/docs-site/CNAME +1 -0
  4. package/dist/docs-site/RELEASING.html +403 -0
  5. package/dist/docs-site/advisor.html +317 -0
  6. package/dist/docs-site/agents.html +375 -0
  7. package/dist/docs-site/anthropic.html +368 -0
  8. package/dist/docs-site/bridge.html +421 -0
  9. package/dist/docs-site/browser-mode.html +636 -0
  10. package/dist/docs-site/chromium-forks.html +355 -0
  11. package/dist/docs-site/cli-reference.html +347 -0
  12. package/dist/docs-site/configuration.html +464 -0
  13. package/dist/docs-site/favicon.svg +14 -0
  14. package/dist/docs-site/followup.html +375 -0
  15. package/dist/docs-site/gemini.html +387 -0
  16. package/dist/docs-site/grok.html +325 -0
  17. package/dist/docs-site/index.html +360 -0
  18. package/dist/docs-site/install.html +335 -0
  19. package/dist/docs-site/linux.html +321 -0
  20. package/dist/docs-site/llms.txt +44 -0
  21. package/dist/docs-site/manual-tests.html +621 -0
  22. package/dist/docs-site/mcp.html +412 -0
  23. package/dist/docs-site/multimodel.html +364 -0
  24. package/dist/docs-site/mythical-pro-agents.html +360 -0
  25. package/dist/docs-site/notifier.html +338 -0
  26. package/dist/docs-site/openai-endpoints.html +417 -0
  27. package/dist/docs-site/openrouter.html +344 -0
  28. package/dist/docs-site/quickstart.html +369 -0
  29. package/dist/docs-site/refactor/ux.html +321 -0
  30. package/dist/docs-site/sessions.html +397 -0
  31. package/dist/docs-site/social-card.png +0 -0
  32. package/dist/docs-site/social-card.svg +79 -0
  33. package/dist/docs-site/spec.html +363 -0
  34. package/dist/docs-site/testing.html +323 -0
  35. package/dist/docs-site/tui-debug.html +326 -0
  36. package/dist/docs-site/windows-work.html +348 -0
  37. package/dist/docs-site/windows.html +320 -0
  38. package/dist/src/browser/chatgptConversation.js +309 -0
  39. package/dist/src/browser/config.js +2 -0
  40. package/dist/src/browser/index.js +78 -8
  41. package/dist/src/browser/sessionRunner.js +1 -0
  42. package/dist/src/cli/browserConfig.js +1 -0
  43. package/dist/src/cli/browserDefaults.js +4 -0
  44. package/dist/src/cli/sessionRunner.js +1 -0
  45. package/dist/src/config.js +1 -0
  46. package/dist/src/remote/server.js +1 -0
  47. package/package.json +1 -1
@@ -58,6 +58,7 @@ export const DEFAULT_BROWSER_CONFIG = {
58
58
  researchMode: "off",
59
59
  archiveConversations: "auto",
60
60
  resumeConversationUrl: null,
61
+ captureProviderNative: false,
61
62
  };
62
63
  export function resolveBrowserConfig(config) {
63
64
  const debugPortEnv = parseDebugPort(process.env.ORACLE_BROWSER_PORT ?? process.env.ORACLE_BROWSER_DEBUG_PORT);
@@ -117,6 +118,7 @@ export function resolveBrowserConfig(config) {
117
118
  researchMode,
118
119
  archiveConversations,
119
120
  resumeConversationUrl: config?.resumeConversationUrl ?? DEFAULT_BROWSER_CONFIG.resumeConversationUrl,
121
+ captureProviderNative: config?.captureProviderNative ?? DEFAULT_BROWSER_CONFIG.captureProviderNative,
120
122
  manualLogin,
121
123
  manualLoginProfileDir: manualLogin ? resolvedProfileDir : null,
122
124
  manualLoginCookieSync: config?.manualLoginCookieSync ?? DEFAULT_BROWSER_CONFIG.manualLoginCookieSync,
@@ -16,6 +16,7 @@ import { INPUT_SELECTORS } from "./constants.js";
16
16
  import { uploadAttachmentViaDataTransfer } from "./actions/remoteFileTransfer.js";
17
17
  import { ensureThinkingTime } from "./actions/thinkingTime.js";
18
18
  import { throwIfAssistantUiError } from "./actions/assistantResponse.js";
19
+ import { finalizeProviderNativeCapture, } from "./chatgptConversation.js";
19
20
  import { startThinkingStatusMonitor } from "./actions/thinkingStatus.js";
20
21
  import { classifyChatGptUiWarningText, collectChatGptUiWarnings, createAssistantTimeoutError, throwChatGptUiWarningIfPresent, } from "./uiWarnings.js";
21
22
  import { activateDeepResearch, captureDeepResearchTargetKeys, waitForDeepResearchCompletion, waitForResearchPlanAutoConfirm, } from "./actions/deepResearch.js";
@@ -443,6 +444,31 @@ function formatBrowserLeaseDiagnostics(options) {
443
444
  `launch=${options.launchDisposition ?? "unknown"}`,
444
445
  ].join("; ");
445
446
  }
447
+ /**
448
+ * Provider-native capture, gated on explicit opt-in.
449
+ *
450
+ * Off by default because it costs two extra authenticated requests per run and
451
+ * only matters when a caller intends to treat the transcript as evidence rather
452
+ * than as an answer. When it is on and it fails, the run is unaffected: the
453
+ * summary records why, and nothing throws.
454
+ */
455
+ async function runProviderNativeCapture(params) {
456
+ if (!params.config.captureProviderNative) {
457
+ return { artifacts: [] };
458
+ }
459
+ const conversationId = params.conversationUrl
460
+ ? extractConversationIdFromUrl(params.conversationUrl)
461
+ : undefined;
462
+ return finalizeProviderNativeCapture({
463
+ Runtime: params.Runtime,
464
+ conversationId,
465
+ conversationUrl: params.conversationUrl,
466
+ sessionId: params.sessionId,
467
+ answerMarkdown: params.answerMarkdown,
468
+ answerMessageId: params.answerMessageId,
469
+ logger: params.logger,
470
+ });
471
+ }
446
472
  function buildSkippedModelSelectionEvidence(desiredModel, strategy) {
447
473
  return {
448
474
  requestedModel: desiredModel ?? null,
@@ -682,6 +708,7 @@ async function runBrowserModeInternal(options, cancellation) {
682
708
  const startedAt = Date.now();
683
709
  let answerText = "";
684
710
  let answerMarkdown = "";
711
+ let answerMessageId;
685
712
  let answerHtml = "";
686
713
  let runStatus = "attempted";
687
714
  let connectionClosedUnexpectedly = false;
@@ -1227,15 +1254,23 @@ async function runBrowserModeInternal(options, cancellation) {
1227
1254
  conversationUrl: lastUrl,
1228
1255
  logger,
1229
1256
  }), logger);
1257
+ const providerCapture = await runProviderNativeCapture({
1258
+ Runtime,
1259
+ config,
1260
+ conversationUrl: lastUrl,
1261
+ sessionId: options.sessionId,
1262
+ answerMarkdown: researchResult.text,
1263
+ logger,
1264
+ });
1230
1265
  const transcriptArtifact = await saveOptionalArtifact(() => saveBrowserTranscriptArtifact({
1231
1266
  sessionId: options.sessionId,
1232
1267
  prompt: promptText,
1233
1268
  answerMarkdown: researchResult.text,
1234
1269
  conversationUrl: lastUrl,
1235
- artifacts: appendArtifacts(undefined, [reportArtifact]),
1270
+ artifacts: appendArtifacts(appendArtifacts(undefined, [reportArtifact]), providerCapture.artifacts),
1236
1271
  logger,
1237
1272
  }), logger);
1238
- const savedArtifacts = appendArtifacts(undefined, [reportArtifact, transcriptArtifact]);
1273
+ const savedArtifacts = appendArtifacts(appendArtifacts(undefined, [reportArtifact, transcriptArtifact]), providerCapture.artifacts);
1239
1274
  const archive = await maybeArchiveCompletedConversation({
1240
1275
  Runtime,
1241
1276
  logger,
@@ -1249,6 +1284,7 @@ async function runBrowserModeInternal(options, cancellation) {
1249
1284
  answerMarkdown: researchResult.text,
1250
1285
  answerHtml: researchResult.html,
1251
1286
  artifacts: savedArtifacts,
1287
+ providerNativeCapture: providerCapture.summary,
1252
1288
  archive,
1253
1289
  modelSelection: modelSelectionEvidence,
1254
1290
  thinkingSelection: thinkingSelectionEvidence,
@@ -1561,6 +1597,7 @@ async function runBrowserModeInternal(options, cancellation) {
1561
1597
  turnAnswerMarkdown = bestText;
1562
1598
  }
1563
1599
  }
1600
+ answerMessageId = turnAnswer.meta.messageId ?? undefined;
1564
1601
  return {
1565
1602
  label,
1566
1603
  answerText: turnAnswerText,
@@ -1664,15 +1701,25 @@ async function runBrowserModeInternal(options, cancellation) {
1664
1701
  });
1665
1702
  const savedImageArtifacts = appendArtifacts(undefined, imageArtifacts.savedImages);
1666
1703
  const savedBrowserArtifacts = appendArtifacts(savedImageArtifacts, fileArtifacts.savedFiles);
1704
+ const providerCapture = await runProviderNativeCapture({
1705
+ Runtime,
1706
+ config,
1707
+ conversationUrl: lastUrl,
1708
+ sessionId: options.sessionId,
1709
+ answerMarkdown,
1710
+ answerMessageId,
1711
+ logger,
1712
+ });
1713
+ const browserArtifactsWithCapture = appendArtifacts(savedBrowserArtifacts, providerCapture.artifacts);
1667
1714
  const transcriptArtifact = await saveOptionalArtifact(() => saveBrowserTranscriptArtifact({
1668
1715
  sessionId: options.sessionId,
1669
1716
  prompt: promptText,
1670
1717
  answerMarkdown,
1671
1718
  conversationUrl: lastUrl,
1672
- artifacts: savedBrowserArtifacts,
1719
+ artifacts: browserArtifactsWithCapture,
1673
1720
  logger,
1674
1721
  }), logger);
1675
- const savedArtifacts = appendArtifacts(savedBrowserArtifacts, [transcriptArtifact]);
1722
+ const savedArtifacts = appendArtifacts(browserArtifactsWithCapture, [transcriptArtifact]);
1676
1723
  const archive = await maybeArchiveCompletedConversation({
1677
1724
  Runtime,
1678
1725
  logger,
@@ -1692,6 +1739,7 @@ async function runBrowserModeInternal(options, cancellation) {
1692
1739
  answerMarkdown,
1693
1740
  answerHtml: answerHtml.length > 0 ? answerHtml : undefined,
1694
1741
  artifacts: savedArtifacts,
1742
+ providerNativeCapture: providerCapture.summary,
1695
1743
  generatedImages: imageArtifacts.generatedImages,
1696
1744
  savedImages: imageArtifacts.savedImages,
1697
1745
  downloadableFiles: fileArtifacts.files,
@@ -2233,6 +2281,7 @@ async function runRemoteBrowserMode(promptText, attachments, config, logger, opt
2233
2281
  const startedAt = Date.now();
2234
2282
  let answerText = "";
2235
2283
  let answerMarkdown = "";
2284
+ let answerMessageId;
2236
2285
  let answerHtml = "";
2237
2286
  let connectionClosedUnexpectedly = false;
2238
2287
  let runStatus = "attempted";
@@ -2552,15 +2601,23 @@ async function runRemoteBrowserMode(promptText, attachments, config, logger, opt
2552
2601
  conversationUrl: lastUrl,
2553
2602
  logger,
2554
2603
  }), logger);
2604
+ const providerCapture = await runProviderNativeCapture({
2605
+ Runtime,
2606
+ config,
2607
+ conversationUrl: lastUrl,
2608
+ sessionId: options.sessionId,
2609
+ answerMarkdown: researchResult.text,
2610
+ logger,
2611
+ });
2555
2612
  const transcriptArtifact = await saveOptionalArtifact(() => saveBrowserTranscriptArtifact({
2556
2613
  sessionId: options.sessionId,
2557
2614
  prompt: promptText,
2558
2615
  answerMarkdown: researchResult.text,
2559
2616
  conversationUrl: lastUrl,
2560
- artifacts: appendArtifacts(undefined, [reportArtifact]),
2617
+ artifacts: appendArtifacts(appendArtifacts(undefined, [reportArtifact]), providerCapture.artifacts),
2561
2618
  logger,
2562
2619
  }), logger);
2563
- const savedArtifacts = appendArtifacts(undefined, [reportArtifact, transcriptArtifact]);
2620
+ const savedArtifacts = appendArtifacts(appendArtifacts(undefined, [reportArtifact, transcriptArtifact]), providerCapture.artifacts);
2564
2621
  const archive = await maybeArchiveCompletedConversation({
2565
2622
  Runtime,
2566
2623
  logger,
@@ -2575,6 +2632,7 @@ async function runRemoteBrowserMode(promptText, attachments, config, logger, opt
2575
2632
  answerMarkdown: researchResult.text,
2576
2633
  answerHtml: researchResult.html,
2577
2634
  artifacts: savedArtifacts,
2635
+ providerNativeCapture: providerCapture.summary,
2578
2636
  archive,
2579
2637
  modelSelection: modelSelectionEvidence,
2580
2638
  thinkingSelection: thinkingSelectionEvidence,
@@ -2852,6 +2910,7 @@ async function runRemoteBrowserMode(promptText, attachments, config, logger, opt
2852
2910
  turnAnswerMarkdown = bestText;
2853
2911
  }
2854
2912
  }
2913
+ answerMessageId = turnAnswer.meta.messageId ?? undefined;
2855
2914
  return {
2856
2915
  label,
2857
2916
  answerText: turnAnswerText,
@@ -2947,15 +3006,25 @@ async function runRemoteBrowserMode(promptText, attachments, config, logger, opt
2947
3006
  });
2948
3007
  const savedImageArtifacts = appendArtifacts(undefined, imageArtifacts.savedImages);
2949
3008
  const savedBrowserArtifacts = appendArtifacts(savedImageArtifacts, fileArtifacts.savedFiles);
3009
+ const providerCapture = await runProviderNativeCapture({
3010
+ Runtime,
3011
+ config,
3012
+ conversationUrl: lastUrl,
3013
+ sessionId: options.sessionId,
3014
+ answerMarkdown,
3015
+ answerMessageId,
3016
+ logger,
3017
+ });
3018
+ const browserArtifactsWithCapture = appendArtifacts(savedBrowserArtifacts, providerCapture.artifacts);
2950
3019
  const transcriptArtifact = await saveOptionalArtifact(() => saveBrowserTranscriptArtifact({
2951
3020
  sessionId: options.sessionId,
2952
3021
  prompt: promptText,
2953
3022
  answerMarkdown,
2954
3023
  conversationUrl: lastUrl,
2955
- artifacts: savedBrowserArtifacts,
3024
+ artifacts: browserArtifactsWithCapture,
2956
3025
  logger,
2957
3026
  }), logger);
2958
- const savedArtifacts = appendArtifacts(savedBrowserArtifacts, [transcriptArtifact]);
3027
+ const savedArtifacts = appendArtifacts(browserArtifactsWithCapture, [transcriptArtifact]);
2959
3028
  const archive = await maybeArchiveCompletedConversation({
2960
3029
  Runtime,
2961
3030
  logger,
@@ -2991,6 +3060,7 @@ async function runRemoteBrowserMode(promptText, attachments, config, logger, opt
2991
3060
  submittedPromptHash,
2992
3061
  ownedRecoveryTarget,
2993
3062
  artifacts: savedArtifacts,
3063
+ providerNativeCapture: providerCapture.summary,
2994
3064
  generatedImages: imageArtifacts.generatedImages,
2995
3065
  savedImages: imageArtifacts.savedImages,
2996
3066
  downloadableFiles: fileArtifacts.files,
@@ -313,6 +313,7 @@ async function executeAssembledBrowserSession({ runOptions, browserConfig, log,
313
313
  archive: browserResult.archive,
314
314
  modelSelection,
315
315
  thinkingSelection,
316
+ providerNativeCapture: browserResult.providerNativeCapture,
316
317
  warnings,
317
318
  answerText,
318
319
  artifacts: savedArtifacts,
@@ -238,6 +238,7 @@ export async function buildBrowserConfig(options) {
238
238
  ? options.browserResearch
239
239
  : "off",
240
240
  archiveConversations: options.browserArchive,
241
+ captureProviderNative: options.browserCaptureProviderNative,
241
242
  };
242
243
  }
243
244
  function assertBrowserModelAvailable(model, modelStrategy) {
@@ -111,6 +111,10 @@ export function applyBrowserDefaultsFromConfig(options, config, getSource) {
111
111
  browser.thinkingTime !== undefined) {
112
112
  options.browserThinkingTime = normalizeThinkingTimeLevel(browser.thinkingTime) ?? undefined;
113
113
  }
114
+ if (isUnset("browserCaptureProviderNative") &&
115
+ typeof browser.captureProviderNative === "boolean") {
116
+ options.browserCaptureProviderNative = browser.captureProviderNative;
117
+ }
114
118
  if (isUnset("browserResearch") && browser.researchMode !== undefined) {
115
119
  options.browserResearch = browser.researchMode;
116
120
  }
@@ -161,6 +161,7 @@ export async function performSessionRun({ sessionMeta, runOptions, mode, browser
161
161
  archive: result.archive,
162
162
  modelSelection: result.modelSelection,
163
163
  thinkingSelection: result.thinkingSelection,
164
+ providerNativeCapture: result.providerNativeCapture,
164
165
  warnings: browserWarnings.length > 0 ? browserWarnings : undefined,
165
166
  },
166
167
  artifacts: mergeArtifacts(sessionMeta.artifacts, mergeArtifacts(result.artifacts, outputArtifacts.artifacts)),
@@ -131,6 +131,7 @@ function sanitizeProjectConfig(config) {
131
131
  if (config.browser) {
132
132
  sanitized.browser = {};
133
133
  const browser = config.browser;
134
+ // Full-conversation retention is user-owned; never allow captureProviderNative here.
134
135
  const allowedBrowserKeys = [
135
136
  "attachRunning",
136
137
  "timeoutMs",
@@ -867,6 +867,7 @@ function sanitizeResult(result, warnings = []) {
867
867
  answerChars: result.answerChars,
868
868
  modelSelection: result.modelSelection,
869
869
  thinkingSelection: result.thinkingSelection,
870
+ providerNativeCapture: result.providerNativeCapture,
870
871
  researchPlan: result.researchPlan,
871
872
  archive: result.archive,
872
873
  tabUrl: result.tabUrl,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steipete/oracle",
3
- "version": "0.20.3",
3
+ "version": "0.21.0",
4
4
  "description": "CLI wrapper around OpenAI Responses API with GPT-5.6 Sol, GPT-5.6, GPT-5.5 Pro, GPT-5.5, GPT-5.4, GPT-5.2, GPT-5.1, and GPT-5.1 Codex high reasoning modes.",
5
5
  "keywords": [],
6
6
  "homepage": "https://askoracle.sh",