@steipete/oracle 0.9.0 → 0.11.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 (194) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +107 -49
  3. package/dist/bin/oracle-cli.js +551 -410
  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/archiveConversation.js +224 -0
  18. package/dist/src/browser/actions/assistantResponse.js +175 -101
  19. package/dist/src/browser/actions/attachmentDataTransfer.js +49 -47
  20. package/dist/src/browser/actions/attachments.js +246 -150
  21. package/dist/src/browser/actions/deepResearch.js +662 -0
  22. package/dist/src/browser/actions/domEvents.js +2 -2
  23. package/dist/src/browser/actions/modelSelection.js +342 -119
  24. package/dist/src/browser/actions/navigation.js +183 -137
  25. package/dist/src/browser/actions/projectSources.js +491 -0
  26. package/dist/src/browser/actions/promptComposer.js +152 -91
  27. package/dist/src/browser/actions/remoteFileTransfer.js +10 -10
  28. package/dist/src/browser/actions/thinkingStatus.js +391 -0
  29. package/dist/src/browser/actions/thinkingTime.js +207 -110
  30. package/dist/src/browser/artifacts.js +150 -0
  31. package/dist/src/browser/attachRunning.js +31 -0
  32. package/dist/src/browser/chatgptImages.js +315 -0
  33. package/dist/src/browser/chromeLifecycle.js +276 -63
  34. package/dist/src/browser/config.js +59 -16
  35. package/dist/src/browser/constants.js +25 -12
  36. package/dist/src/browser/controlPlan.js +81 -0
  37. package/dist/src/browser/cookies.js +19 -19
  38. package/dist/src/browser/detect.js +250 -77
  39. package/dist/src/browser/domDebug.js +50 -1
  40. package/dist/src/browser/index.js +1559 -692
  41. package/dist/src/browser/liveTabs.js +434 -0
  42. package/dist/src/browser/modelStrategy.js +1 -1
  43. package/dist/src/browser/pageActions.js +5 -5
  44. package/dist/src/browser/policies.js +16 -13
  45. package/dist/src/browser/profileState.js +127 -42
  46. package/dist/src/browser/projectSourcesRunner.js +366 -0
  47. package/dist/src/browser/prompt.js +72 -42
  48. package/dist/src/browser/promptSummary.js +5 -5
  49. package/dist/src/browser/providerDomFlow.js +1 -1
  50. package/dist/src/browser/providers/chatgptDomProvider.js +9 -9
  51. package/dist/src/browser/providers/geminiDeepThinkDomProvider.js +51 -42
  52. package/dist/src/browser/providers/index.js +2 -2
  53. package/dist/src/browser/reattach.js +178 -73
  54. package/dist/src/browser/reattachHelpers.js +32 -27
  55. package/dist/src/browser/sessionRunner.js +89 -25
  56. package/dist/src/browser/tabLeaseRegistry.js +182 -0
  57. package/dist/src/browser/utils.js +9 -9
  58. package/dist/src/browserMode.js +1 -1
  59. package/dist/src/cli/bridge/claudeConfig.js +24 -20
  60. package/dist/src/cli/bridge/client.js +28 -20
  61. package/dist/src/cli/bridge/codexConfig.js +16 -16
  62. package/dist/src/cli/bridge/doctor.js +47 -39
  63. package/dist/src/cli/bridge/host.js +58 -56
  64. package/dist/src/cli/browserConfig.js +102 -48
  65. package/dist/src/cli/browserDefaults.js +51 -26
  66. package/dist/src/cli/browserTabs.js +228 -0
  67. package/dist/src/cli/bundleWarnings.js +1 -1
  68. package/dist/src/cli/clipboard.js +11 -2
  69. package/dist/src/cli/detach.js +2 -2
  70. package/dist/src/cli/dryRun.js +62 -26
  71. package/dist/src/cli/duplicatePromptGuard.js +12 -4
  72. package/dist/src/cli/engine.js +9 -9
  73. package/dist/src/cli/errorUtils.js +1 -1
  74. package/dist/src/cli/fileSize.js +3 -3
  75. package/dist/src/cli/format.js +2 -2
  76. package/dist/src/cli/help.js +28 -28
  77. package/dist/src/cli/hiddenAliases.js +3 -3
  78. package/dist/src/cli/markdownBundle.js +7 -7
  79. package/dist/src/cli/markdownRenderer.js +15 -15
  80. package/dist/src/cli/notifier.js +77 -67
  81. package/dist/src/cli/options.js +131 -106
  82. package/dist/src/cli/oscUtils.js +1 -1
  83. package/dist/src/cli/projectSources.js +116 -0
  84. package/dist/src/cli/promptRequirement.js +2 -2
  85. package/dist/src/cli/renderOutput.js +1 -1
  86. package/dist/src/cli/rootAlias.js +1 -1
  87. package/dist/src/cli/runOptions.js +32 -28
  88. package/dist/src/cli/sessionCommand.js +82 -21
  89. package/dist/src/cli/sessionDisplay.js +213 -87
  90. package/dist/src/cli/sessionLineage.js +6 -2
  91. package/dist/src/cli/sessionRunner.js +149 -95
  92. package/dist/src/cli/sessionTable.js +26 -23
  93. package/dist/src/cli/stdin.js +22 -0
  94. package/dist/src/cli/tagline.js +121 -124
  95. package/dist/src/cli/tui/index.js +139 -128
  96. package/dist/src/cli/writeOutputPath.js +5 -5
  97. package/dist/src/config.js +7 -7
  98. package/dist/src/gemini-web/browserSessionManager.js +19 -15
  99. package/dist/src/gemini-web/client.js +76 -70
  100. package/dist/src/gemini-web/executionMode.js +6 -8
  101. package/dist/src/gemini-web/executor.js +98 -93
  102. package/dist/src/gemini-web/index.js +1 -1
  103. package/dist/src/mcp/consultPresets.js +19 -0
  104. package/dist/src/mcp/server.js +18 -12
  105. package/dist/src/mcp/tools/consult.js +246 -67
  106. package/dist/src/mcp/tools/projectSources.js +123 -0
  107. package/dist/src/mcp/tools/sessionResources.js +12 -12
  108. package/dist/src/mcp/tools/sessions.js +26 -17
  109. package/dist/src/mcp/types.js +12 -5
  110. package/dist/src/mcp/utils.js +21 -8
  111. package/dist/src/oracle/background.js +15 -15
  112. package/dist/src/oracle/claude.js +53 -25
  113. package/dist/src/oracle/client.js +50 -41
  114. package/dist/src/oracle/config.js +96 -66
  115. package/dist/src/oracle/errors.js +38 -38
  116. package/dist/src/oracle/files.js +55 -46
  117. package/dist/src/oracle/finishLine.js +10 -8
  118. package/dist/src/oracle/format.js +3 -3
  119. package/dist/src/oracle/gemini.js +37 -33
  120. package/dist/src/oracle/logging.js +7 -7
  121. package/dist/src/oracle/markdown.js +28 -28
  122. package/dist/src/oracle/modelResolver.js +16 -16
  123. package/dist/src/oracle/multiModelRunner.js +12 -12
  124. package/dist/src/oracle/oscProgress.js +8 -8
  125. package/dist/src/oracle/promptAssembly.js +6 -3
  126. package/dist/src/oracle/request.js +16 -13
  127. package/dist/src/oracle/run.js +160 -135
  128. package/dist/src/oracle/runUtils.js +8 -5
  129. package/dist/src/oracle/tokenEstimate.js +6 -6
  130. package/dist/src/oracle/tokenStats.js +5 -5
  131. package/dist/src/oracle/tokenStringifier.js +5 -5
  132. package/dist/src/oracle.js +12 -12
  133. package/dist/src/oracleHome.js +3 -3
  134. package/dist/src/projectSources/plan.js +27 -0
  135. package/dist/src/projectSources/url.js +23 -0
  136. package/dist/src/remote/client.js +25 -25
  137. package/dist/src/remote/health.js +20 -20
  138. package/dist/src/remote/remoteServiceConfig.js +9 -9
  139. package/dist/src/remote/server.js +129 -118
  140. package/dist/src/sessionManager.js +78 -75
  141. package/dist/src/sessionStore.js +3 -3
  142. package/dist/src/version.js +10 -10
  143. package/dist/vendor/oracle-notifier/README.md +2 -0
  144. package/package.json +67 -62
  145. package/vendor/oracle-notifier/README.md +2 -0
  146. package/dist/markdansi/types/index.js +0 -4
  147. package/dist/oracle/bin/oracle-cli.js +0 -472
  148. package/dist/oracle/src/browser/actions/assistantResponse.js +0 -471
  149. package/dist/oracle/src/browser/actions/attachments.js +0 -82
  150. package/dist/oracle/src/browser/actions/modelSelection.js +0 -190
  151. package/dist/oracle/src/browser/actions/navigation.js +0 -75
  152. package/dist/oracle/src/browser/actions/promptComposer.js +0 -167
  153. package/dist/oracle/src/browser/chromeLifecycle.js +0 -104
  154. package/dist/oracle/src/browser/config.js +0 -33
  155. package/dist/oracle/src/browser/constants.js +0 -40
  156. package/dist/oracle/src/browser/cookies.js +0 -210
  157. package/dist/oracle/src/browser/domDebug.js +0 -36
  158. package/dist/oracle/src/browser/index.js +0 -331
  159. package/dist/oracle/src/browser/pageActions.js +0 -5
  160. package/dist/oracle/src/browser/prompt.js +0 -88
  161. package/dist/oracle/src/browser/promptSummary.js +0 -20
  162. package/dist/oracle/src/browser/sessionRunner.js +0 -80
  163. package/dist/oracle/src/browser/utils.js +0 -62
  164. package/dist/oracle/src/browserMode.js +0 -1
  165. package/dist/oracle/src/cli/browserConfig.js +0 -44
  166. package/dist/oracle/src/cli/dryRun.js +0 -59
  167. package/dist/oracle/src/cli/engine.js +0 -17
  168. package/dist/oracle/src/cli/errorUtils.js +0 -9
  169. package/dist/oracle/src/cli/help.js +0 -70
  170. package/dist/oracle/src/cli/markdownRenderer.js +0 -15
  171. package/dist/oracle/src/cli/options.js +0 -103
  172. package/dist/oracle/src/cli/promptRequirement.js +0 -14
  173. package/dist/oracle/src/cli/rootAlias.js +0 -30
  174. package/dist/oracle/src/cli/sessionCommand.js +0 -77
  175. package/dist/oracle/src/cli/sessionDisplay.js +0 -270
  176. package/dist/oracle/src/cli/sessionRunner.js +0 -94
  177. package/dist/oracle/src/heartbeat.js +0 -43
  178. package/dist/oracle/src/oracle/client.js +0 -48
  179. package/dist/oracle/src/oracle/config.js +0 -29
  180. package/dist/oracle/src/oracle/errors.js +0 -101
  181. package/dist/oracle/src/oracle/files.js +0 -220
  182. package/dist/oracle/src/oracle/format.js +0 -33
  183. package/dist/oracle/src/oracle/fsAdapter.js +0 -7
  184. package/dist/oracle/src/oracle/oscProgress.js +0 -60
  185. package/dist/oracle/src/oracle/request.js +0 -48
  186. package/dist/oracle/src/oracle/run.js +0 -444
  187. package/dist/oracle/src/oracle/tokenStats.js +0 -39
  188. package/dist/oracle/src/oracle/types.js +0 -1
  189. package/dist/oracle/src/oracle.js +0 -9
  190. package/dist/oracle/src/sessionManager.js +0 -205
  191. package/dist/oracle/src/version.js +0 -39
  192. package/dist/scripts/chrome/browser-tools.js +0 -295
  193. package/dist/src/browser/profileSync.js +0 -141
  194. /package/dist/{oracle/src/browser → src/projectSources}/types.js +0 -0
@@ -1,47 +1,77 @@
1
- import chalk from 'chalk';
2
- import { usesDefaultStatusFilters } from './options.js';
3
- import { attachSession, showStatus } from './sessionDisplay.js';
4
- import { sessionStore } from '../sessionStore.js';
1
+ import chalk from "chalk";
2
+ import { usesDefaultStatusFilters } from "./options.js";
3
+ import { attachSession, showStatus, } from "./sessionDisplay.js";
4
+ import { harvestSessionBrowserOutput, liveTailSessionBrowserOutput, } from "./browserTabs.js";
5
+ import { sessionStore } from "../sessionStore.js";
5
6
  const defaultDependencies = {
6
7
  showStatus,
7
8
  attachSession,
9
+ harvestSessionBrowserOutput,
10
+ liveTailSessionBrowserOutput,
8
11
  usesDefaultStatusFilters,
9
12
  deleteSessionsOlderThan: (options) => sessionStore.deleteOlderThan(options),
10
13
  getSessionPaths: (sessionId) => sessionStore.getPaths(sessionId),
11
14
  };
12
- const SESSION_OPTION_KEYS = new Set(['hours', 'limit', 'all', 'clear', 'clean', 'render', 'renderMarkdown', 'path', 'model']);
15
+ const SESSION_OPTION_KEYS = new Set([
16
+ "hours",
17
+ "limit",
18
+ "all",
19
+ "clear",
20
+ "clean",
21
+ "render",
22
+ "renderMarkdown",
23
+ "path",
24
+ "model",
25
+ "harvest",
26
+ "live",
27
+ "writeOutput",
28
+ "browserTab",
29
+ ]);
13
30
  export async function handleSessionCommand(sessionId, command, deps = defaultDependencies) {
14
31
  const sessionOptions = command.opts();
32
+ const allOptions = command.optsWithGlobals?.() ?? sessionOptions;
33
+ const writeOutputPath = sessionOptions.writeOutput ??
34
+ sessionOptions.writeOutputPath ??
35
+ allOptions.writeOutput ??
36
+ allOptions.writeOutputPath ??
37
+ command.getOptionValue?.("writeOutput") ??
38
+ command.getOptionValue?.("writeOutputPath");
39
+ const browserTabRef = sessionOptions.browserTab ??
40
+ sessionOptions.browserTabRef ??
41
+ allOptions.browserTab ??
42
+ allOptions.browserTabRef ??
43
+ command.getOptionValue?.("browserTab") ??
44
+ command.getOptionValue?.("browserTabRef");
15
45
  if (sessionOptions.verboseRender) {
16
- process.env.ORACLE_VERBOSE_RENDER = '1';
46
+ process.env.ORACLE_VERBOSE_RENDER = "1";
17
47
  }
18
- const renderSource = command.getOptionValueSource?.('render');
19
- const renderMarkdownSource = command.getOptionValueSource?.('renderMarkdown');
20
- const renderExplicit = renderSource === 'cli' || renderMarkdownSource === 'cli';
48
+ const renderSource = command.getOptionValueSource?.("render");
49
+ const renderMarkdownSource = command.getOptionValueSource?.("renderMarkdown");
50
+ const renderExplicit = renderSource === "cli" || renderMarkdownSource === "cli";
21
51
  const autoRender = !renderExplicit && process.stdout.isTTY;
22
52
  const pathRequested = Boolean(sessionOptions.path);
23
53
  const clearRequested = Boolean(sessionOptions.clear || sessionOptions.clean);
24
54
  if (clearRequested) {
25
55
  if (sessionId) {
26
- console.error('Cannot combine a session ID with --clear. Remove the ID to delete cached sessions.');
56
+ console.error("Cannot combine a session ID with --clear. Remove the ID to delete cached sessions.");
27
57
  process.exitCode = 1;
28
58
  return;
29
59
  }
30
60
  const hours = sessionOptions.hours;
31
61
  const includeAll = sessionOptions.all;
32
62
  const result = await deps.deleteSessionsOlderThan({ hours, includeAll });
33
- const scope = includeAll ? 'all stored sessions' : `sessions older than ${hours}h`;
63
+ const scope = includeAll ? "all stored sessions" : `sessions older than ${hours}h`;
34
64
  console.log(formatSessionCleanupMessage(result, scope));
35
65
  return;
36
66
  }
37
- if (sessionId === 'clear' || sessionId === 'clean') {
67
+ if (sessionId === "clear" || sessionId === "clean") {
38
68
  console.error('Session cleanup now uses --clear. Run "oracle session --clear --hours <n>" instead.');
39
69
  process.exitCode = 1;
40
70
  return;
41
71
  }
42
72
  if (pathRequested) {
43
73
  if (!sessionId) {
44
- console.error('The --path flag requires a session ID.');
74
+ console.error("The --path flag requires a session ID.");
45
75
  process.exitCode = 1;
46
76
  return;
47
77
  }
@@ -50,10 +80,10 @@ export async function handleSessionCommand(sessionId, command, deps = defaultDep
50
80
  const richTty = Boolean(process.stdout.isTTY && chalk.level > 0);
51
81
  const label = (text) => (richTty ? chalk.cyan(text) : text);
52
82
  const value = (text) => (richTty ? chalk.dim(text) : text);
53
- console.log(`${label('Session dir:')} ${value(paths.dir)}`);
54
- console.log(`${label('Metadata:')} ${value(paths.metadata)}`);
55
- console.log(`${label('Request:')} ${value(paths.request)}`);
56
- console.log(`${label('Log:')} ${value(paths.log)}`);
83
+ console.log(`${label("Session dir:")} ${value(paths.dir)}`);
84
+ console.log(`${label("Metadata:")} ${value(paths.metadata)}`);
85
+ console.log(`${label("Request:")} ${value(paths.request)}`);
86
+ console.log(`${label("Log:")} ${value(paths.log)}`);
57
87
  }
58
88
  catch (error) {
59
89
  console.error(error instanceof Error ? error.message : String(error));
@@ -61,6 +91,37 @@ export async function handleSessionCommand(sessionId, command, deps = defaultDep
61
91
  }
62
92
  return;
63
93
  }
94
+ const harvestRequested = Boolean(sessionOptions.harvest);
95
+ const liveRequested = Boolean(sessionOptions.live);
96
+ if (harvestRequested && liveRequested) {
97
+ console.error("Cannot combine --harvest and --live. Choose one.");
98
+ process.exitCode = 1;
99
+ return;
100
+ }
101
+ if (writeOutputPath && !harvestRequested && !liveRequested) {
102
+ console.error("The --write-output flag requires --harvest or --live.");
103
+ process.exitCode = 1;
104
+ return;
105
+ }
106
+ if (harvestRequested || liveRequested) {
107
+ if (!sessionId) {
108
+ console.error(`The ${harvestRequested ? "--harvest" : "--live"} flag requires a session ID.`);
109
+ process.exitCode = 1;
110
+ return;
111
+ }
112
+ if (harvestRequested) {
113
+ await deps.harvestSessionBrowserOutput(sessionId, {
114
+ writeOutputPath,
115
+ browserTabRef,
116
+ });
117
+ return;
118
+ }
119
+ await deps.liveTailSessionBrowserOutput(sessionId, {
120
+ writeOutputPath,
121
+ browserTabRef,
122
+ });
123
+ return;
124
+ }
64
125
  if (!sessionId) {
65
126
  const showExamples = deps.usesDefaultStatusFilters(command);
66
127
  await deps.showStatus({
@@ -75,7 +136,7 @@ export async function handleSessionCommand(sessionId, command, deps = defaultDep
75
136
  // Surface any root-level flags that were provided but are ignored when attaching to a session.
76
137
  const ignoredFlags = listIgnoredFlags(command);
77
138
  if (ignoredFlags.length > 0) {
78
- console.log(`Ignoring flags on session attach: ${ignoredFlags.join(', ')}`);
139
+ console.log(`Ignoring flags on session attach: ${ignoredFlags.join(", ")}`);
79
140
  }
80
141
  const renderMarkdown = Boolean(sessionOptions.render || sessionOptions.renderMarkdown || autoRender);
81
142
  await deps.attachSession(sessionId, {
@@ -85,8 +146,8 @@ export async function handleSessionCommand(sessionId, command, deps = defaultDep
85
146
  });
86
147
  }
87
148
  export function formatSessionCleanupMessage(result, scope) {
88
- const deletedLabel = `${result.deleted} ${result.deleted === 1 ? 'session' : 'sessions'}`;
89
- const remainingLabel = `${result.remaining} ${result.remaining === 1 ? 'session' : 'sessions'} remain`;
149
+ const deletedLabel = `${result.deleted} ${result.deleted === 1 ? "session" : "sessions"}`;
150
+ const remainingLabel = `${result.remaining} ${result.remaining === 1 ? "session" : "sessions"} remain`;
90
151
  const hint = 'Run "oracle session --clear --all" to delete everything.';
91
152
  return `Deleted ${deletedLabel} (${scope}). ${remainingLabel}.\n${hint}`;
92
153
  }
@@ -98,7 +159,7 @@ function listIgnoredFlags(command) {
98
159
  continue;
99
160
  }
100
161
  const source = command.getOptionValueSource?.(key);
101
- if (source !== 'cli' && source !== 'env') {
162
+ if (source !== "cli" && source !== "env") {
102
163
  continue;
103
164
  }
104
165
  const value = opts[key];