@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.
- package/LICENSE +1 -1
- package/README.md +130 -45
- package/dist/bin/oracle-cli.js +613 -379
- package/dist/bin/oracle-mcp.js +2 -2
- package/dist/bin/oracle.js +165 -279
- package/dist/scripts/agent-send.js +31 -31
- package/dist/scripts/check.js +6 -6
- package/dist/scripts/debug/extract-chatgpt-response.js +10 -10
- package/dist/scripts/docs-list.js +30 -30
- package/dist/scripts/git-policy.js +25 -23
- package/dist/scripts/run-cli.js +8 -8
- package/dist/scripts/runner.js +203 -195
- package/dist/scripts/test-browser.js +21 -18
- package/dist/scripts/test-remote-chrome.js +20 -20
- package/dist/src/bridge/connection.js +18 -18
- package/dist/src/bridge/userConfigFile.js +7 -7
- package/dist/src/browser/actions/assistantResponse.js +149 -101
- package/dist/src/browser/actions/attachmentDataTransfer.js +49 -47
- package/dist/src/browser/actions/attachments.js +246 -150
- package/dist/src/browser/actions/domEvents.js +2 -2
- package/dist/src/browser/actions/modelSelection.js +314 -104
- package/dist/src/browser/actions/navigation.js +161 -136
- package/dist/src/browser/actions/promptComposer.js +100 -64
- package/dist/src/browser/actions/remoteFileTransfer.js +10 -10
- package/dist/src/browser/actions/thinkingTime.js +207 -110
- package/dist/src/browser/chromeLifecycle.js +62 -60
- package/dist/src/browser/config.js +34 -15
- package/dist/src/browser/constants.js +17 -12
- package/dist/src/browser/cookies.js +19 -19
- package/dist/src/browser/detect.js +62 -62
- package/dist/src/browser/domDebug.js +1 -1
- package/dist/src/browser/index.js +452 -303
- package/dist/src/browser/modelStrategy.js +1 -1
- package/dist/src/browser/pageActions.js +5 -5
- package/dist/src/browser/policies.js +16 -13
- package/dist/src/browser/profileState.js +44 -39
- package/dist/src/browser/prompt.js +72 -42
- package/dist/src/browser/promptSummary.js +5 -5
- package/dist/src/browser/providerDomFlow.js +17 -0
- package/dist/src/browser/providers/chatgptDomProvider.js +49 -0
- package/dist/src/browser/providers/geminiDeepThinkDomProvider.js +254 -0
- package/dist/src/browser/providers/index.js +2 -0
- package/dist/src/browser/reattach.js +67 -34
- package/dist/src/browser/reattachHelpers.js +31 -26
- package/dist/src/browser/sessionRunner.js +37 -25
- package/dist/src/browser/utils.js +9 -9
- package/dist/src/browserMode.js +1 -1
- package/dist/src/cli/bridge/claudeConfig.js +16 -16
- package/dist/src/cli/bridge/client.js +28 -20
- package/dist/src/cli/bridge/codexConfig.js +16 -16
- package/dist/src/cli/bridge/doctor.js +47 -39
- package/dist/src/cli/bridge/host.js +58 -56
- package/dist/src/cli/browserConfig.js +65 -45
- package/dist/src/cli/browserDefaults.js +27 -26
- package/dist/src/cli/bundleWarnings.js +1 -1
- package/dist/src/cli/clipboard.js +11 -2
- package/dist/src/cli/detach.js +7 -4
- package/dist/src/cli/dryRun.js +29 -25
- package/dist/src/cli/duplicatePromptGuard.js +3 -3
- package/dist/src/cli/engine.js +9 -9
- package/dist/src/cli/errorUtils.js +1 -1
- package/dist/src/cli/fileSize.js +11 -0
- package/dist/src/cli/format.js +2 -2
- package/dist/src/cli/help.js +28 -28
- package/dist/src/cli/hiddenAliases.js +3 -3
- package/dist/src/cli/markdownBundle.js +12 -8
- package/dist/src/cli/markdownRenderer.js +15 -15
- package/dist/src/cli/notifier.js +77 -67
- package/dist/src/cli/options.js +145 -87
- package/dist/src/cli/oscUtils.js +1 -1
- package/dist/src/cli/promptRequirement.js +2 -2
- package/dist/src/cli/renderOutput.js +1 -1
- package/dist/src/cli/rootAlias.js +1 -1
- package/dist/src/cli/runOptions.js +37 -25
- package/dist/src/cli/sessionCommand.js +31 -21
- package/dist/src/cli/sessionDisplay.js +182 -79
- package/dist/src/cli/sessionLineage.js +60 -0
- package/dist/src/cli/sessionRunner.js +118 -90
- package/dist/src/cli/sessionTable.js +28 -24
- package/dist/src/cli/stdin.js +22 -0
- package/dist/src/cli/tagline.js +121 -124
- package/dist/src/cli/tui/index.js +140 -127
- package/dist/src/cli/writeOutputPath.js +5 -5
- package/dist/src/config.js +7 -7
- package/dist/src/gemini-web/browserSessionManager.js +80 -0
- package/dist/src/gemini-web/client.js +81 -64
- package/dist/src/gemini-web/executionMode.js +16 -0
- package/dist/src/gemini-web/executor.js +327 -169
- package/dist/src/gemini-web/index.js +1 -1
- package/dist/src/mcp/server.js +16 -12
- package/dist/src/mcp/tools/consult.js +81 -64
- package/dist/src/mcp/tools/sessionResources.js +12 -12
- package/dist/src/mcp/tools/sessions.js +26 -17
- package/dist/src/mcp/types.js +5 -5
- package/dist/src/mcp/utils.js +15 -7
- package/dist/src/oracle/background.js +15 -15
- package/dist/src/oracle/claude.js +53 -25
- package/dist/src/oracle/client.js +84 -46
- package/dist/src/oracle/config.js +124 -58
- package/dist/src/oracle/errors.js +38 -38
- package/dist/src/oracle/files.js +69 -45
- package/dist/src/oracle/finishLine.js +10 -8
- package/dist/src/oracle/format.js +3 -3
- package/dist/src/oracle/gemini.js +37 -30
- package/dist/src/oracle/logging.js +7 -7
- package/dist/src/oracle/markdown.js +28 -28
- package/dist/src/oracle/modelResolver.js +16 -16
- package/dist/src/oracle/multiModelRunner.js +12 -12
- package/dist/src/oracle/oscProgress.js +8 -8
- package/dist/src/oracle/promptAssembly.js +6 -3
- package/dist/src/oracle/request.js +23 -15
- package/dist/src/oracle/run.js +172 -140
- package/dist/src/oracle/runUtils.js +8 -5
- package/dist/src/oracle/tokenEstimate.js +6 -6
- package/dist/src/oracle/tokenStats.js +5 -5
- package/dist/src/oracle/tokenStringifier.js +5 -5
- package/dist/src/oracle.js +12 -12
- package/dist/src/oracleHome.js +3 -3
- package/dist/src/remote/client.js +25 -25
- package/dist/src/remote/health.js +20 -20
- package/dist/src/remote/remoteServiceConfig.js +9 -9
- package/dist/src/remote/server.js +129 -118
- package/dist/src/sessionManager.js +81 -75
- package/dist/src/sessionStore.js +3 -3
- package/dist/src/version.js +10 -10
- package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/CodeResources +0 -0
- package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/MacOS/OracleNotifier +0 -0
- package/dist/vendor/oracle-notifier/README.md +2 -0
- package/package.json +69 -65
- package/vendor/oracle-notifier/OracleNotifier.app/Contents/CodeResources +0 -0
- package/vendor/oracle-notifier/OracleNotifier.app/Contents/MacOS/OracleNotifier +0 -0
- package/vendor/oracle-notifier/README.md +2 -0
- package/dist/markdansi/types/index.js +0 -4
- package/dist/oracle/bin/oracle-cli.js +0 -472
- package/dist/oracle/src/browser/actions/assistantResponse.js +0 -471
- package/dist/oracle/src/browser/actions/attachments.js +0 -82
- package/dist/oracle/src/browser/actions/modelSelection.js +0 -190
- package/dist/oracle/src/browser/actions/navigation.js +0 -75
- package/dist/oracle/src/browser/actions/promptComposer.js +0 -167
- package/dist/oracle/src/browser/chromeLifecycle.js +0 -104
- package/dist/oracle/src/browser/config.js +0 -33
- package/dist/oracle/src/browser/constants.js +0 -40
- package/dist/oracle/src/browser/cookies.js +0 -210
- package/dist/oracle/src/browser/domDebug.js +0 -36
- package/dist/oracle/src/browser/index.js +0 -331
- package/dist/oracle/src/browser/pageActions.js +0 -5
- package/dist/oracle/src/browser/prompt.js +0 -88
- package/dist/oracle/src/browser/promptSummary.js +0 -20
- package/dist/oracle/src/browser/sessionRunner.js +0 -80
- package/dist/oracle/src/browser/utils.js +0 -62
- package/dist/oracle/src/browserMode.js +0 -1
- package/dist/oracle/src/cli/browserConfig.js +0 -44
- package/dist/oracle/src/cli/dryRun.js +0 -59
- package/dist/oracle/src/cli/engine.js +0 -17
- package/dist/oracle/src/cli/errorUtils.js +0 -9
- package/dist/oracle/src/cli/help.js +0 -70
- package/dist/oracle/src/cli/markdownRenderer.js +0 -15
- package/dist/oracle/src/cli/options.js +0 -103
- package/dist/oracle/src/cli/promptRequirement.js +0 -14
- package/dist/oracle/src/cli/rootAlias.js +0 -30
- package/dist/oracle/src/cli/sessionCommand.js +0 -77
- package/dist/oracle/src/cli/sessionDisplay.js +0 -270
- package/dist/oracle/src/cli/sessionRunner.js +0 -94
- package/dist/oracle/src/heartbeat.js +0 -43
- package/dist/oracle/src/oracle/client.js +0 -48
- package/dist/oracle/src/oracle/config.js +0 -29
- package/dist/oracle/src/oracle/errors.js +0 -101
- package/dist/oracle/src/oracle/files.js +0 -220
- package/dist/oracle/src/oracle/format.js +0 -33
- package/dist/oracle/src/oracle/fsAdapter.js +0 -7
- package/dist/oracle/src/oracle/oscProgress.js +0 -60
- package/dist/oracle/src/oracle/request.js +0 -48
- package/dist/oracle/src/oracle/run.js +0 -444
- package/dist/oracle/src/oracle/tokenStats.js +0 -39
- package/dist/oracle/src/oracle/types.js +0 -1
- package/dist/oracle/src/oracle.js +0 -9
- package/dist/oracle/src/sessionManager.js +0 -205
- package/dist/oracle/src/version.js +0 -39
- package/dist/scripts/chrome/browser-tools.js +0 -295
- package/dist/src/browser/profileSync.js +0 -141
- /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] ??
|
|
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(
|
|
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 = [
|
|
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
|
|
1
|
+
import path from "node:path";
|
|
2
2
|
const EXT_TO_LANG = {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
|
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,
|
|
45
|
+
return [header, fenceOpen, normalized, fence, ""].join("\n");
|
|
46
46
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { MODEL_CONFIGS, PRO_MODELS } from
|
|
2
|
-
import { countTokens as countTokensGpt5Pro } from
|
|
3
|
-
import { pricingFromUsdPerMillion } from
|
|
4
|
-
const OPENROUTER_DEFAULT_BASE =
|
|
5
|
-
const OPENROUTER_MODELS_ENDPOINT =
|
|
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(
|
|
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(
|
|
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,
|
|
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 ===
|
|
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 ??
|
|
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 ??
|
|
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 ??
|
|
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
|
|
2
|
-
import path from
|
|
3
|
-
import { runOracle, OracleResponseError, OracleTransportError, extractResponseMetadata, asOracleUserError, extractTextOutput, } from
|
|
4
|
-
import { sessionStore } from
|
|
5
|
-
import { findOscProgressSequences, OSC_PROGRESS_PREFIX } from
|
|
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 ===
|
|
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:
|
|
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 !==
|
|
95
|
-
throw new Error(
|
|
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:
|
|
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:
|
|
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
|
|
2
|
-
import { startOscProgress as startOscProgressShared, supportsOscProgress as supportsOscProgressShared, } from
|
|
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 ===
|
|
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:
|
|
9
|
-
forceEnvVar:
|
|
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 ===
|
|
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:
|
|
22
|
-
forceEnvVar:
|
|
21
|
+
disableEnvVar: "ORACLE_NO_OSC_PROGRESS",
|
|
22
|
+
forceEnvVar: "ORACLE_FORCE_OSC_PROGRESS",
|
|
23
23
|
});
|
|
24
24
|
}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import { formatFileSection } from
|
|
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 = [
|
|
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
|
|
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
|
|
2
|
-
import { DEFAULT_SYSTEM_PROMPT } from
|
|
3
|
-
import { createFileSections, readFiles } from
|
|
4
|
-
import { formatFileSection } from
|
|
5
|
-
import { createFsAdapter } from
|
|
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(
|
|
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 ??
|
|
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:
|
|
22
|
+
role: "user",
|
|
22
23
|
content: [
|
|
23
24
|
{
|
|
24
|
-
type:
|
|
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 ?? [], {
|
|
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 ??
|
|
44
|
-
const lines = [
|
|
45
|
-
lines.push(
|
|
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
|
|
54
|
+
return lines
|
|
55
|
+
.join("\n")
|
|
56
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
57
|
+
.trimEnd();
|
|
50
58
|
}
|