@oar-sh/oar 0.9.23 → 0.9.25
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/.github/extensions/web-relay/skills/reasoning-stream.mjs +3 -1
- package/CHANGELOG.md +307 -0
- package/README.md +12 -11
- package/bin/oar.js +54 -4
- package/package.json +11 -7
- package/server/agent-sdk-loader.mjs +116 -0
- package/server/agent-sdks/claude/entry.mjs +4 -0
- package/server/agent-sdks/claude/package-lock.json +1438 -0
- package/server/agent-sdks/claude/package.json +13 -0
- package/server/agent-sdks/cursor/entry-sqlite.mjs +2 -0
- package/server/agent-sdks/cursor/entry.mjs +3 -0
- package/server/agent-sdks/cursor/package-lock.json +171 -0
- package/server/agent-sdks/cursor/package.json +11 -0
- package/server/agent-sdks/koffi/entry.cjs +2 -0
- package/server/agent-sdks/koffi/package-lock.json +368 -0
- package/server/agent-sdks/koffi/package.json +10 -0
- package/server/claude-worker/claude-preview-tool.mjs +5 -2
- package/server/claude-worker/claude-remote-relay-tool.mjs +20 -2
- package/server/claude-worker/claude-sdk-adapter.mjs +4 -1
- package/server/claude-worker/sdk-message-normalizer.mjs +29 -1
- package/server/copilot-worker/copilot-sdk-session-process.mjs +13 -8
- package/server/cursor-worker/cursor-sdk-adapter.mjs +5 -3
- package/server/cursor-worker/sdk-message-normalizer.mjs +13 -0
- package/server/db-schema.mjs +19 -0
- package/server/grok-worker/sdk-message-normalizer.mjs +3 -0
- package/server/migrations/0039-media-index.mjs +167 -0
- package/server/migrations/0040-image-session-defaults.mjs +93 -0
- package/server/public/app/agent-sdk-ui.js +349 -0
- package/server/public/app/api-client.js +149 -8
- package/server/public/app/ask-user-view.js +2 -1
- package/server/public/app/attachments-view.js +66 -9
- package/server/public/app/bootstrap.js +289 -94
- package/server/public/app/chat-actions-menu-state.mjs +1 -0
- package/server/public/app/context-media-tab.js +143 -0
- package/server/public/app/conversation-view.js +90 -5
- package/server/public/app/image-composer-ui.js +518 -0
- package/server/public/app/image-turn-placeholder.mjs +233 -0
- package/server/public/app/journal-view.js +12 -2
- package/server/public/app/media-gallery-model.mjs +202 -0
- package/server/public/app/media-gallery-ui.js +524 -0
- package/server/public/app/media-view.js +79 -0
- package/server/public/app/model-refresh-ui.mjs +413 -0
- package/server/public/app/no-conversation-state.mjs +5 -2
- package/server/public/app/openai-image-composer.mjs +492 -0
- package/server/public/app/openai-image-cost-ui.js +426 -0
- package/server/public/app/openai-image-spend.mjs +443 -0
- package/server/public/app/plan-usage-view.mjs +38 -6
- package/server/public/app/provider-readiness.mjs +67 -4
- package/server/public/app/relay-error-ctas.mjs +5 -0
- package/server/public/app/session-history-ui.js +2 -0
- package/server/public/app/settings-modal.js +171 -0
- package/server/public/app/socket-handlers.js +47 -0
- package/server/public/app/tab-strip-fade.mjs +1 -1
- package/server/public/app/viewer-gallery.mjs +23 -1
- package/server/public/index.html +478 -9
- package/server/relay-tools.md +1 -0
- package/server/repositories/image-conversation-repository.mjs +69 -0
- package/server/repositories/media-repository.mjs +305 -0
- package/server/routes/agent-sdk-routes.mjs +73 -0
- package/server/routes/media-routes.mjs +361 -0
- package/server/routes/messages-routes.mjs +1467 -343
- package/server/routes/sessions-routes.mjs +596 -123
- package/server/server-runtime.mjs +414 -81
- package/server/services/about-service.mjs +26 -6
- package/server/services/agent-sdk-launch-gate.mjs +124 -0
- package/server/services/agent-sdk-paths.mjs +307 -0
- package/server/services/agent-sdk-store.mjs +1211 -0
- package/server/services/claude-api-settings-service.mjs +54 -17
- package/server/services/cli-install-service.mjs +3 -2
- package/server/services/copilot-model-discovery-service.mjs +7 -1
- package/server/services/database-file.mjs +23 -5
- package/server/services/deepseek-settings-service.mjs +58 -20
- package/server/services/earlier-database-service.mjs +4 -2
- package/server/services/generated-image-cleanup-service.mjs +2 -1
- package/server/services/generated-image-files.mjs +110 -0
- package/server/services/image-input-paths.mjs +389 -0
- package/server/services/image-operation-service.mjs +6 -2
- package/server/services/media-extract.mjs +653 -0
- package/server/services/media-index-service.mjs +221 -0
- package/server/services/model-refresh-scheduler.mjs +153 -0
- package/server/services/model-variant-catalog-service.mjs +141 -9
- package/server/services/oar-cli-helpers.mjs +72 -9
- package/server/services/oar-state-migration-service.mjs +2 -12
- package/server/services/oar-state-root.mjs +17 -0
- package/server/services/openai-image-preview-turns.mjs +330 -0
- package/server/services/openai-image-spend-service.mjs +516 -0
- package/server/services/openai-image-stream.mjs +170 -0
- package/server/services/plan-usage-openai-image.mjs +148 -0
- package/server/services/provider-model-refresh.mjs +326 -0
- package/server/services/provider-model-state.mjs +395 -0
- package/server/services/relay-singleton-guard.mjs +72 -10
- package/server/services/remote-relay-caller-context.mjs +6 -0
- package/server/services/remote-relay-dispatcher.mjs +386 -22
- package/server/services/remote-relay-registry-service.mjs +3 -1
- package/server/services/session-worker-launch-service.mjs +13 -0
- package/server/services/session-worker-supervisor-service.mjs +19 -1
- package/server/services/session-worker-websocket-service.mjs +15 -0
- package/server/services/token-usage-service.mjs +15 -0
- package/server/services/update-install-service.mjs +2 -2
- package/server/services/worker-launch-note-service.mjs +14 -2
- package/server/services/worker-recycle-service.mjs +145 -11
- package/shared/image-header.mjs +90 -0
- package/shared/model-refresh-schedule.mjs +120 -0
- package/shared/openai-image-options.mjs +299 -0
- package/shared/openai-image-presets.mjs +175 -0
- package/shared/openai-image-previews.mjs +40 -0
- package/shared/openai-image-prices.mjs +291 -0
- package/shared/openai-image-spend.mjs +90 -0
- package/shared/remote-relay-contract.mjs +126 -4
- package/shared/worker-runtime/direct-openai-image.mjs +98 -48
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
agentSdkFromCheckout,
|
|
6
|
+
getAgentSdkDescriptor,
|
|
7
|
+
isValidAgentSdkInstall,
|
|
8
|
+
writeAgentSdkLease,
|
|
9
|
+
} from './services/agent-sdk-paths.mjs';
|
|
10
|
+
import { currentBootId, processIdentity } from './services/relay-singleton-guard.mjs';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Loads an agent SDK the relay installs on demand (agent-sdk-store.mjs),
|
|
14
|
+
* wherever this process has it:
|
|
15
|
+
*
|
|
16
|
+
* 1. OAR_AGENT_SDK_DIR_<SDK>: the folder the relay launched this worker
|
|
17
|
+
* with, kept for the worker's whole life;
|
|
18
|
+
* 2. in the relay itself, the store's ready folder (setAgentSdkStore);
|
|
19
|
+
* 3. in a git checkout that has it installed, the package's devDependency.
|
|
20
|
+
*
|
|
21
|
+
* Otherwise AgentSdkMissingError. A folder is imported through its entry
|
|
22
|
+
* file by path: the bare imports in it resolve from the folder's own
|
|
23
|
+
* node_modules, so there is no NODE_PATH and no exports map to read.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
export const AGENT_SDK_MISSING_CODE = 'AGENT_SDK_MISSING';
|
|
27
|
+
|
|
28
|
+
export class AgentSdkMissingError extends Error {
|
|
29
|
+
constructor(sdk, detail = '') {
|
|
30
|
+
const label = getAgentSdkDescriptor(sdk)?.label || sdk;
|
|
31
|
+
super(`${label} is not installed${detail ? ` (${detail})` : ''}.`);
|
|
32
|
+
this.name = 'AgentSdkMissingError';
|
|
33
|
+
this.code = AGENT_SDK_MISSING_CODE;
|
|
34
|
+
this.sdk = sdk;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function agentSdkDirEnvName(sdk) {
|
|
39
|
+
return `OAR_AGENT_SDK_DIR_${String(sdk || '').toUpperCase()}`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
let relayStore = null;
|
|
43
|
+
const cache = new Map();
|
|
44
|
+
const leased = new Set();
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The relay registers its store at start. From then on the environment's
|
|
48
|
+
* folder is not looked at in this process: a relay started from inside a
|
|
49
|
+
* worker's session would otherwise take that worker's SDK.
|
|
50
|
+
*/
|
|
51
|
+
export function setAgentSdkStore(store) {
|
|
52
|
+
relayStore = store || null;
|
|
53
|
+
cache.clear();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// What a checkout's devDependency gives, in the shape of the entry files.
|
|
57
|
+
const CHECKOUT_IMPORTS = {
|
|
58
|
+
claude: {
|
|
59
|
+
main: async () => ({ ...(await import('@anthropic-ai/claude-agent-sdk')), z: await import('zod') }),
|
|
60
|
+
},
|
|
61
|
+
cursor: {
|
|
62
|
+
main: () => import('@cursor/sdk'),
|
|
63
|
+
sqlite: () => import('@cursor/sdk/sqlite'),
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
function importFromDir(descriptor, dir, entry, { lease, env }) {
|
|
68
|
+
if (!isValidAgentSdkInstall(dir, { id: descriptor.id })) {
|
|
69
|
+
throw new AgentSdkMissingError(descriptor.id, `${dir} is not a finished install`);
|
|
70
|
+
}
|
|
71
|
+
if (lease && !leased.has(dir)) {
|
|
72
|
+
leased.add(dir);
|
|
73
|
+
writeAgentSdkLease(dir, {
|
|
74
|
+
holder: (() => { try { return processIdentity(process.pid); } catch { return null; } })(),
|
|
75
|
+
bootId: currentBootId(),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return import(pathToFileURL(path.join(dir, descriptor.entries[entry])).href);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Where loadAgentSdk would take the SDK from: { source, dir }, or null. */
|
|
82
|
+
export function resolveAgentSdkSource(sdk, { env = process.env, store = relayStore, fromCheckout } = {}) {
|
|
83
|
+
const descriptor = getAgentSdkDescriptor(sdk);
|
|
84
|
+
if (!descriptor) return null;
|
|
85
|
+
if (!store) {
|
|
86
|
+
const dir = String(env?.[agentSdkDirEnvName(descriptor.id)] || '').trim();
|
|
87
|
+
if (dir) return { source: 'env', dir: path.resolve(dir) };
|
|
88
|
+
} else {
|
|
89
|
+
const dir = store.readyDir(descriptor.id);
|
|
90
|
+
if (dir) return { source: 'store', dir };
|
|
91
|
+
}
|
|
92
|
+
if (fromCheckout ?? agentSdkFromCheckout(descriptor.id, { env })) return { source: 'checkout', dir: null };
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* The SDK's module namespace (`entry`: 'main', or 'sqlite' for Cursor's
|
|
98
|
+
* local store). Claude's carries `z`, the zod its tools are written with.
|
|
99
|
+
*/
|
|
100
|
+
export async function loadAgentSdk(sdk, { entry = 'main', env = process.env, store = relayStore, fromCheckout } = {}) {
|
|
101
|
+
const descriptor = getAgentSdkDescriptor(sdk);
|
|
102
|
+
if (!descriptor || !descriptor.entries[entry]) throw new Error(`Unknown agent SDK entry: ${sdk}/${entry}`);
|
|
103
|
+
const found = resolveAgentSdkSource(descriptor.id, { env, store, fromCheckout });
|
|
104
|
+
if (!found) throw new AgentSdkMissingError(descriptor.id);
|
|
105
|
+
const key = `${descriptor.id}:${entry}:${found.source}:${found.dir || ''}`;
|
|
106
|
+
if (!cache.has(key)) {
|
|
107
|
+
const loading = found.source === 'checkout'
|
|
108
|
+
? CHECKOUT_IMPORTS[descriptor.id][entry]()
|
|
109
|
+
// The relay's own import (model discovery) holds the folder for the
|
|
110
|
+
// relay's life, a worker's for its own: both lease it.
|
|
111
|
+
: importFromDir(descriptor, found.dir, entry, { lease: true, env });
|
|
112
|
+
cache.set(key, loading);
|
|
113
|
+
loading.catch(() => { if (cache.get(key) === loading) cache.delete(key); });
|
|
114
|
+
}
|
|
115
|
+
return cache.get(key);
|
|
116
|
+
}
|