@oar-sh/oar 0.9.24 → 0.9.26
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 +284 -0
- package/README.md +12 -11
- package/package.json +5 -1
- package/server/claude-worker/claude-remote-relay-tool.mjs +15 -0
- package/server/claude-worker/claude-sdk-adapter.mjs +8 -4
- package/server/claude-worker/claude-session-process.mjs +4 -0
- package/server/claude-worker/claude-turn-publisher.mjs +25 -11
- package/server/claude-worker/sdk-message-normalizer.mjs +29 -1
- package/server/copilot-worker/copilot-prompt-context.mjs +2 -1
- package/server/copilot-worker/copilot-sdk-session-process.mjs +11 -9
- package/server/cursor-worker/cursor-turn-runner.mjs +3 -1
- package/server/cursor-worker/sdk-message-normalizer.mjs +13 -0
- package/server/db-schema.mjs +19 -0
- package/server/grok-worker/grok-turn-runner.mjs +3 -1
- 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/api-client.js +58 -0
- 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 +85 -25
- 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/context-usage-view.mjs +2 -2
- 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/live-activity-cap.mjs +3 -3
- package/server/public/app/markdown-math.mjs +471 -0
- 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/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/pwa-install.js +25 -4
- package/server/public/app/relay-error-ctas.mjs +5 -0
- package/server/public/app/relay-prompt-sanitizer.mjs +3 -0
- package/server/public/app/relay-restart-ui.js +2 -2
- package/server/public/app/remote-relays-settings.js +33 -6
- package/server/public/app/router.js +49 -237
- package/server/public/app/session-history-ui.js +2 -0
- package/server/public/app/settings-modal.js +4 -0
- package/server/public/app/settings-tabs.js +10 -1
- package/server/public/app/socket-handlers.js +26 -0
- package/server/public/app/store.js +2 -0
- package/server/public/app/stream-view-preference.mjs +1 -1
- package/server/public/app/tab-strip-fade.mjs +1 -1
- package/server/public/app/thoughts-preference.mjs +1 -1
- package/server/public/app/tmux-inspector-view.js +29 -16
- package/server/public/app/viewer-gallery.mjs +23 -1
- package/server/public/index.html +517 -123
- 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/media-routes.mjs +361 -0
- package/server/routes/messages-routes.mjs +1410 -360
- package/server/routes/relay-board-routes.mjs +46 -1
- package/server/routes/remote-relay-routes.mjs +1 -1
- package/server/routes/sessions-routes.mjs +361 -14
- package/server/server-runtime.mjs +21 -0
- package/server/services/database-file.mjs +6 -4
- 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/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/relay-prompt-sanitizer.mjs +7 -0
- package/server/services/relay-restart-queue.mjs +1 -1
- package/server/services/remote-relay-caller-context.mjs +6 -0
- package/server/services/remote-relay-dispatcher.mjs +409 -23
- package/server/services/remote-relay-registry-service.mjs +10 -2
- package/server/services/session-worker-stop-service.mjs +50 -18
- package/server/services/token-usage-service.mjs +15 -0
- package/shared/image-header.mjs +90 -0
- package/shared/math-instructions.mjs +30 -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 +96 -50
- package/server/public/app/math-dollars.mjs +0 -89
|
@@ -14,17 +14,22 @@ let inspectorState = {
|
|
|
14
14
|
listenersBound: false,
|
|
15
15
|
};
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
// The files index.html loads, and unpkg as the fallback: one package version
|
|
18
|
+
// and one hash per file, so either CDN must serve the same bytes.
|
|
19
|
+
const XTERM_STYLE_INTEGRITY = 'sha384-8Xk9wy/gzEDUKrXtrmCFa2bBuK3BpjpDuL/p0SeKQX19Khl/M+lHOgD/CyYf7efP';
|
|
20
|
+
const XTERM_SCRIPT_INTEGRITY = 'sha384-M169f14mRZOXm3hD/v2Ti0ThIT/RnAQagXA9nlE15yHAtrW19gdePJh/HaTzUOe/';
|
|
21
|
+
const XTERM_FIT_SCRIPT_INTEGRITY = 'sha384-iF+jqbuti4XlB64clWgFWYEscb+UnSRv3VgVikGYZu+otNFnSHr7y7NcKfBnGizn';
|
|
22
|
+
export const XTERM_STYLE_CANDIDATES = [
|
|
23
|
+
{ url: 'https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/css/xterm.css', integrity: XTERM_STYLE_INTEGRITY },
|
|
24
|
+
{ url: 'https://unpkg.com/@xterm/xterm@5.5.0/css/xterm.css', integrity: XTERM_STYLE_INTEGRITY },
|
|
20
25
|
];
|
|
21
|
-
const XTERM_SCRIPT_CANDIDATES = [
|
|
22
|
-
'https://cdn.jsdelivr.net/npm/xterm@5.5.0/lib/xterm.
|
|
23
|
-
'https://unpkg.com/xterm@5.5.0/lib/xterm.
|
|
26
|
+
export const XTERM_SCRIPT_CANDIDATES = [
|
|
27
|
+
{ url: 'https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/lib/xterm.js', integrity: XTERM_SCRIPT_INTEGRITY },
|
|
28
|
+
{ url: 'https://unpkg.com/@xterm/xterm@5.5.0/lib/xterm.js', integrity: XTERM_SCRIPT_INTEGRITY },
|
|
24
29
|
];
|
|
25
|
-
const XTERM_FIT_SCRIPT_CANDIDATES = [
|
|
26
|
-
'https://cdn.jsdelivr.net/npm/
|
|
27
|
-
'https://unpkg.com/
|
|
30
|
+
export const XTERM_FIT_SCRIPT_CANDIDATES = [
|
|
31
|
+
{ url: 'https://cdn.jsdelivr.net/npm/@xterm/addon-fit@0.10.0/lib/addon-fit.js', integrity: XTERM_FIT_SCRIPT_INTEGRITY },
|
|
32
|
+
{ url: 'https://unpkg.com/@xterm/addon-fit@0.10.0/lib/addon-fit.js', integrity: XTERM_FIT_SCRIPT_INTEGRITY },
|
|
28
33
|
];
|
|
29
34
|
|
|
30
35
|
let xtermLoadPromise = null;
|
|
@@ -64,7 +69,7 @@ function stripAnsiControlCodes(input = '') {
|
|
|
64
69
|
.replace(/\r(?!\n)/g, '');
|
|
65
70
|
}
|
|
66
71
|
|
|
67
|
-
function loadScript(src) {
|
|
72
|
+
function loadScript(src, integrity = '') {
|
|
68
73
|
return new Promise((resolve, reject) => {
|
|
69
74
|
const timeoutMs = 3500;
|
|
70
75
|
let settled = false;
|
|
@@ -101,6 +106,10 @@ function loadScript(src) {
|
|
|
101
106
|
}
|
|
102
107
|
const script = document.createElement('script');
|
|
103
108
|
script.src = src;
|
|
109
|
+
if (integrity) {
|
|
110
|
+
script.integrity = integrity;
|
|
111
|
+
script.crossOrigin = 'anonymous';
|
|
112
|
+
}
|
|
104
113
|
script.async = true;
|
|
105
114
|
script.onload = () => {
|
|
106
115
|
script.dataset.loaded = 'true';
|
|
@@ -114,9 +123,9 @@ function loadScript(src) {
|
|
|
114
123
|
});
|
|
115
124
|
}
|
|
116
125
|
|
|
117
|
-
function ensureStylesheet(
|
|
118
|
-
for (const
|
|
119
|
-
const hrefText = String(
|
|
126
|
+
function ensureStylesheet(candidates = []) {
|
|
127
|
+
for (const { url, integrity } of candidates) {
|
|
128
|
+
const hrefText = String(url || '').trim();
|
|
120
129
|
if (!hrefText) continue;
|
|
121
130
|
const already = Array.from(document.querySelectorAll('link[rel="stylesheet"]'))
|
|
122
131
|
.some((node) => String(node.getAttribute('href') || '').trim() === hrefText);
|
|
@@ -124,6 +133,10 @@ function ensureStylesheet(urlCandidates = []) {
|
|
|
124
133
|
const link = document.createElement('link');
|
|
125
134
|
link.rel = 'stylesheet';
|
|
126
135
|
link.href = hrefText;
|
|
136
|
+
if (integrity) {
|
|
137
|
+
link.integrity = integrity;
|
|
138
|
+
link.crossOrigin = 'anonymous';
|
|
139
|
+
}
|
|
127
140
|
document.head.appendChild(link);
|
|
128
141
|
return;
|
|
129
142
|
}
|
|
@@ -131,11 +144,11 @@ function ensureStylesheet(urlCandidates = []) {
|
|
|
131
144
|
|
|
132
145
|
async function loadFirstSuccessful(candidates = []) {
|
|
133
146
|
let lastError = null;
|
|
134
|
-
for (const
|
|
135
|
-
const src = String(
|
|
147
|
+
for (const { url, integrity } of candidates) {
|
|
148
|
+
const src = String(url || '').trim();
|
|
136
149
|
if (!src) continue;
|
|
137
150
|
try {
|
|
138
|
-
await loadScript(src);
|
|
151
|
+
await loadScript(src, integrity);
|
|
139
152
|
return true;
|
|
140
153
|
} catch (error) {
|
|
141
154
|
lastError = error;
|
|
@@ -32,7 +32,29 @@ export function galleryAt(gallery, index) {
|
|
|
32
32
|
|
|
33
33
|
export function galleryPositionLabel(gallery) {
|
|
34
34
|
if (!gallery || !Array.isArray(gallery.items) || !gallery.items.length) return '';
|
|
35
|
-
return `${gallery.index + 1} / ${gallery.items.length}`;
|
|
35
|
+
return `${gallery.index + 1} / ${gallery.items.length}${galleryHasMore(gallery) ? '+' : ''}`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// A paged gallery (the media gallery) knows only the pages loaded so far:
|
|
39
|
+
// `hasMore` says more items follow and `loadMore()` fetches the next page
|
|
40
|
+
// as `{ items, hasMore }`. Stepping past the last loaded item loads it.
|
|
41
|
+
|
|
42
|
+
export function galleryHasMore(gallery) {
|
|
43
|
+
return Boolean(gallery && gallery.hasMore && typeof gallery.loadMore === 'function');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Whether a step of `delta` can land somewhere: a neighbour, or a page still to load. */
|
|
47
|
+
export function galleryCanStep(gallery, delta) {
|
|
48
|
+
if (galleryNeighborIndex(gallery, delta) !== -1) return true;
|
|
49
|
+
return Number(delta) > 0 && galleryHasMore(gallery) && Number(gallery.index) === gallery.items.length - 1;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** The gallery with a loaded page appended (items it already has are not added twice). */
|
|
53
|
+
export function extendGallery(gallery, page) {
|
|
54
|
+
if (!gallery) return null;
|
|
55
|
+
const known = new Set(gallery.items.map((item) => item.key).filter(Boolean));
|
|
56
|
+
const added = (Array.isArray(page?.items) ? page.items : []).filter((item) => !item?.key || !known.has(item.key));
|
|
57
|
+
return { ...gallery, items: [...gallery.items, ...added], hasMore: Boolean(page?.hasMore) && added.length > 0 };
|
|
36
58
|
}
|
|
37
59
|
|
|
38
60
|
/** The items on either side of the open one, nearest first. */
|