@oar-sh/oar 0.9.9 → 0.9.11
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/CHANGELOG.md +561 -1
- package/README.md +162 -909
- package/bin/bat/oar.bat +46 -46
- package/package.json +14 -14
- package/server/README.md +369 -13
- package/server/claude-worker/claude-remote-relay-tool.mjs +10 -0
- package/server/claude-worker/claude-session-process.mjs +121 -9
- package/server/claude-worker/claude-session-worker.mjs +9 -1
- package/server/claude-worker/claude-turn-publisher.mjs +3 -0
- package/server/claude-worker/sdk-message-normalizer.mjs +31 -4
- package/server/claude-worker/subagent-timeline-recorder.mjs +572 -0
- package/server/copilot-worker/copilot-sdk-session-process.mjs +79 -12
- package/server/copilot-worker/copilot-sdk-session-worker.mjs +6 -0
- package/server/cursor-worker/cursor-sdk-adapter.mjs +56 -2
- package/server/db-schema.mjs +95 -2
- package/server/grok-worker/acp-client.mjs +2 -1
- package/server/grok-worker/acp-host-services.mjs +4 -3
- package/server/migrations/0009-subagent-timeline.mjs +135 -0
- package/server/migrations/0010-subagent-timeline-pruning.mjs +89 -0
- package/server/migrations/0011-relay-event-subscriptions.mjs +125 -0
- package/server/migrations/0012-cross-relay-event-subscriptions.mjs +116 -0
- package/server/migrations/0013-previews.mjs +130 -0
- package/server/migrations/0014-conversation-groups.mjs +89 -0
- package/server/migrations/0015-conversation-group-position.mjs +76 -0
- package/server/migrations/0016-share-access-log.mjs +110 -0
- package/server/public/app/about-ui.js +73 -0
- package/server/public/app/about-view.mjs +234 -0
- package/server/public/app/action-confirmations.js +31 -14
- package/server/public/app/agent-exchange-fold-view.mjs +187 -0
- package/server/public/app/api-client.js +312 -16
- package/server/public/app/archive-confirm.mjs +28 -0
- package/server/public/app/ask-user-view.js +17 -12
- package/server/public/app/attachments-view.js +516 -6
- package/server/public/app/background-tasks-view.mjs +18 -26
- package/server/public/app/bootstrap.js +336 -59
- package/server/public/app/chat-actions-menu-state.mjs +126 -0
- package/server/public/app/claude-cloud-conversation-ui.js +10 -22
- package/server/public/app/composer-control-state.mjs +16 -0
- package/server/public/app/composer-keyboard.mjs +54 -0
- package/server/public/app/context-menu.mjs +90 -6
- package/server/public/app/conversation-group-drag.mjs +191 -0
- package/server/public/app/conversation-group-order.mjs +265 -0
- package/server/public/app/conversation-group-state.mjs +100 -0
- package/server/public/app/conversation-list-drag.mjs +449 -0
- package/server/public/app/conversation-turn-state.mjs +81 -0
- package/server/public/app/conversation-view.js +436 -117
- package/server/public/app/cwd-picker.js +1 -1
- package/server/public/app/explorer-edit-state.mjs +68 -0
- package/server/public/app/hidden-messages-view.mjs +312 -0
- package/server/public/app/host-suspend-ui.js +13 -4
- package/server/public/app/journal-view.js +930 -45
- package/server/public/app/no-conversation-state.mjs +58 -0
- package/server/public/app/preview-cards.mjs +117 -31
- package/server/public/app/preview-command.mjs +10 -1
- package/server/public/app/provider-readiness.mjs +120 -0
- package/server/public/app/relay-board-view.js +19 -3
- package/server/public/app/relay-event-subscriptions-ui.js +184 -0
- package/server/public/app/relay-event-view.mjs +234 -0
- package/server/public/app/relay-restart-error.mjs +16 -0
- package/server/public/app/settings-modal.js +93 -9
- package/server/public/app/settings-tabs.js +1 -1
- package/server/public/app/share-format.mjs +49 -0
- package/server/public/app/share-preview-marks.mjs +167 -0
- package/server/public/app/share-state.js +109 -0
- package/server/public/app/shared-conversations-settings.js +480 -0
- package/server/public/app/socket-handlers.js +137 -40
- package/server/public/app/store.js +115 -32
- package/server/public/app/subagent-row.mjs +138 -0
- package/server/public/app/subagent-timeline-view.mjs +186 -0
- package/server/public/app/subagent-viewer-watch.mjs +50 -0
- package/server/public/app/subagent-viewer.mjs +558 -0
- package/server/public/app/task-row-format.mjs +29 -0
- package/server/public/app/transcript-jump-bottom-view.mjs +464 -0
- package/server/public/app/transcript-jump-bottom.mjs +210 -0
- package/server/public/app/transcript-reload-freshness.mjs +25 -0
- package/server/public/app/transcript-viewport-anchor.mjs +140 -0
- package/server/public/app/update-ui.js +1 -1
- package/server/public/app/viewer-history.mjs +5 -3
- package/server/public/index.html +774 -12
- package/server/relay-tools.md +2 -1
- package/server/relay.mjs +2 -1
- package/server/repositories/conversation-group-repository.mjs +444 -0
- package/server/repositories/message-repository.mjs +30 -3
- package/server/repositories/question-repository.mjs +9 -3
- package/server/repositories/remote-relay-repository.mjs +6 -2
- package/server/repositories/session-repository.mjs +12 -37
- package/server/repositories/share-repository.mjs +322 -0
- package/server/repositories/share-visibility-statements.mjs +10 -0
- package/server/repositories/subagent-timeline-statements.mjs +170 -0
- package/server/routes/about-routes.mjs +15 -0
- package/server/routes/ask-user-routes.mjs +3 -0
- package/server/routes/cache-routes.mjs +4 -0
- package/server/routes/conversation-group-routes.mjs +171 -0
- package/server/routes/messages-routes.mjs +698 -114
- package/server/routes/preview-routes.mjs +9 -1
- package/server/routes/relay-event-routes.mjs +157 -0
- package/server/routes/remote-relay-routes.mjs +15 -0
- package/server/routes/sessions-routes.mjs +843 -193
- package/server/server-runtime.mjs +559 -160
- package/server/services/about-service.mjs +461 -0
- package/server/services/background-task-store.mjs +128 -0
- package/server/services/background-work-view.mjs +228 -0
- package/server/services/cache-rebuild-service.mjs +30 -0
- package/server/services/delete-archive-service.mjs +4 -1
- package/server/services/detached-worker-watch-service.mjs +150 -0
- package/server/services/explorer-entry-name.mjs +26 -0
- package/server/services/explorer-mutations.mjs +122 -0
- package/server/services/hidden-message-list.mjs +21 -0
- package/server/services/host-suspend-command.mjs +2 -1
- package/server/services/message-pin-list.mjs +1 -1
- package/server/services/preview-health-probe.mjs +8 -1
- package/server/services/preview-proxy-server.mjs +49 -27
- package/server/services/preview-registry-service.mjs +676 -26
- package/server/services/preview-static-handler.mjs +40 -7
- package/server/services/preview-store.mjs +274 -0
- package/server/services/push-dispatch-service.mjs +18 -0
- package/server/services/rate-limit-service.mjs +12 -1
- package/server/services/relay-auth.mjs +183 -0
- package/server/services/relay-cli-launcher-service.mjs +3 -1
- package/server/services/relay-event-link-service.mjs +289 -0
- package/server/services/relay-event-service.mjs +1952 -0
- package/server/services/relay-shutdown-gate.mjs +31 -0
- package/server/services/remote-relay-caller-context.mjs +52 -7
- package/server/services/remote-relay-dispatcher.mjs +551 -7
- package/server/services/remote-relay-registry-service.mjs +11 -1
- package/server/services/request-boundary.mjs +183 -0
- package/server/services/session-activity-tracker.mjs +695 -0
- package/server/services/session-history-refresh-service.mjs +7 -0
- package/server/services/session-worker-launch-service.mjs +190 -6
- package/server/services/session-worker-process-service.mjs +10 -6
- package/server/services/share-access-log-service.mjs +123 -0
- package/server/services/share-path-redaction.mjs +424 -0
- package/server/services/stale-attempt-log-limiter.mjs +96 -0
- package/server/services/stale-recovery-clock-guard.mjs +57 -0
- package/server/services/stale-subagent-run-sweep.mjs +109 -0
- package/server/services/status-event-service.mjs +7 -3
- package/server/services/subagent-record-retention.mjs +164 -0
- package/server/services/subagent-timeline-service.mjs +328 -0
- package/server/services/subagent-viewer-rooms.mjs +119 -0
- package/server/services/tunnel-worker-path-guard.mjs +24 -41
- package/server/services/upgrade-socket-guard.mjs +16 -0
- package/server/services/windows-autostart-service.mjs +6 -1
- package/server/services/windows-boot-autostart-service.mjs +207 -23
- package/shared/preview-tool-core.mjs +15 -5
- package/shared/relay-events.mjs +371 -0
- package/shared/remote-relay-contract.mjs +160 -6
- package/shared/share-path-privacy.mjs +30 -0
- package/shared/subagent-record-retention.mjs +31 -0
- package/shared/subagent-timeline.mjs +79 -0
- package/shared/windows-system-tools.mjs +106 -0
- package/shared/worker-runtime/background-task-digest.mjs +30 -0
- package/shared/worker-runtime/heartbeat.mjs +24 -0
- package/shared/worker-runtime/kept-posts.mjs +83 -0
- package/shared/worker-runtime/worker-websocket-link.mjs +47 -15
|
@@ -5,8 +5,12 @@
|
|
|
5
5
|
// `backgroundTasks` on reload; hidden whenever the set is empty.
|
|
6
6
|
|
|
7
7
|
import { apiFetch } from './api-client.js';
|
|
8
|
-
import {
|
|
8
|
+
import { formatTaskModelLabel, formatTaskTokens } from './task-row-format.mjs';
|
|
9
9
|
import { prefixToolActivityEmoji } from './tool-activity-emoji.mjs';
|
|
10
|
+
|
|
11
|
+
// Shared with the sub-agent rows (subagent-row.mjs); re-exported for the
|
|
12
|
+
// transcript's finished-workflow card and the existing importers.
|
|
13
|
+
export { formatTaskModelLabel, formatTaskTokens };
|
|
10
14
|
import {
|
|
11
15
|
getPreviewsForConversation,
|
|
12
16
|
renderPreviewRowsInto,
|
|
@@ -71,16 +75,6 @@ function taskKindLabel(task) {
|
|
|
71
75
|
return label === 'Subagent' && subagentType ? subagentType : label;
|
|
72
76
|
}
|
|
73
77
|
|
|
74
|
-
// "claude-opus-5-5" → "Opus 5.5". A bare alias ("opus") is what a spawn pin
|
|
75
|
-
// carries until the subagent's first answer names the real model.
|
|
76
|
-
export function formatTaskModelLabel(model) {
|
|
77
|
-
const value = String(model || '').trim();
|
|
78
|
-
if (!value) return '';
|
|
79
|
-
if (/^claude-/i.test(value)) return humanizeModelLabel(value);
|
|
80
|
-
if (/^[a-z]+(\[[^\]]+\])?$/i.test(value)) return value.charAt(0).toUpperCase() + value.slice(1);
|
|
81
|
-
return humanizeModelLabel(value);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
78
|
// Detail line: the live tool call when the worker saw one ("🪓 Tool
|
|
85
79
|
// (PowerShell): cd …", cropped to the row by CSS), else the SDK's progress
|
|
86
80
|
// summary, else the bare tool name.
|
|
@@ -93,20 +87,6 @@ export function taskActivityText(task) {
|
|
|
93
87
|
return { text: lastToolName ? `using ${lastToolName}` : '', toolCall: false };
|
|
94
88
|
}
|
|
95
89
|
|
|
96
|
-
// Compact token counts: "812 tok", "62.2k tok", "1.2M tok". Exported for the
|
|
97
|
-
// transcript's finished-workflow card, which shares the panel's formatting.
|
|
98
|
-
export function formatTaskTokens(totalTokens) {
|
|
99
|
-
const tokens = Number(totalTokens);
|
|
100
|
-
if (!Number.isFinite(tokens) || tokens <= 0) return '';
|
|
101
|
-
if (tokens < 1000) return `${tokens} tok`;
|
|
102
|
-
if (tokens < 1_000_000) {
|
|
103
|
-
const thousands = tokens / 1000;
|
|
104
|
-
return `${thousands >= 100 ? Math.round(thousands) : thousands.toFixed(1)}k tok`;
|
|
105
|
-
}
|
|
106
|
-
const millions = tokens / 1_000_000;
|
|
107
|
-
return `${millions >= 100 ? Math.round(millions) : millions.toFixed(1)}M tok`;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
90
|
function escHtml(value) {
|
|
111
91
|
return String(value ?? '').replace(/[&<>"']/g, (ch) => ({
|
|
112
92
|
'&': '&', '<': '<', '>': '>', '"': '"', "'": ''',
|
|
@@ -377,6 +357,16 @@ async function stopBackgroundTask(conversationId, taskId) {
|
|
|
377
357
|
}
|
|
378
358
|
}
|
|
379
359
|
|
|
360
|
+
// A sub-agent task opens its record in the viewer: the task's spawning
|
|
361
|
+
// tool_use id is the run's id. Bash tasks, monitors and workflows have no
|
|
362
|
+
// record, and Copilot's tasks carry no run id.
|
|
363
|
+
export function subagentRunIdForTask(task) {
|
|
364
|
+
const runId = String(task?.toolUseId || '').trim();
|
|
365
|
+
if (!runId) return '';
|
|
366
|
+
const type = String(task?.taskType || '').trim();
|
|
367
|
+
return type === 'local_agent' || type === 'agent' || type === 'subagent' ? runId : '';
|
|
368
|
+
}
|
|
369
|
+
|
|
380
370
|
function renderTaskRow(conversationId, task) {
|
|
381
371
|
const key = `${conversationId}:${task.taskId}`;
|
|
382
372
|
const stopping = stopsInFlight.has(key);
|
|
@@ -403,7 +393,9 @@ function renderTaskRow(conversationId, task) {
|
|
|
403
393
|
<div class="bg-task-row" data-task-id="${escHtml(task.taskId)}">
|
|
404
394
|
${foldButton}<span class="bg-task-icon" title="${escHtml(task.taskType || 'task')}">${taskIcon(task.taskType)}</span>
|
|
405
395
|
<span class="bg-task-main">
|
|
406
|
-
|
|
396
|
+
${subagentRunIdForTask(task)
|
|
397
|
+
? `<button type="button" class="subagent-open bg-task-desc" data-subagent-open="${escHtml(subagentRunIdForTask(task))}" title="Open this sub-agent's thoughts, tool calls and reply">${escHtml(task.description || task.taskId)}</button>`
|
|
398
|
+
: `<span class="bg-task-desc">${escHtml(task.description || task.taskId)}</span>`}
|
|
407
399
|
${activity.text ? `<span class="bg-task-detail${activity.toolCall ? ' bg-task-toolcall' : ''}" title="${escHtml(activity.text)}">${escHtml(activity.text)}</span>` : ''}
|
|
408
400
|
</span>
|
|
409
401
|
<span class="bg-task-side">
|