@oar-sh/oar 0.9.6 → 0.9.7
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 +172 -0
- package/README.md +176 -22
- package/package.json +1 -1
- package/server/README.md +174 -7
- package/server/claude-cloud-worker/claude-cloud-event-normalizer.mjs +340 -0
- package/server/claude-cloud-worker/claude-cloud-session-process.mjs +1325 -0
- package/server/claude-cloud-worker/claude-cloud-session-worker.mjs +155 -0
- package/server/claude-worker/claude-remote-relay-tool.mjs +2 -0
- package/server/claude-worker/claude-sdk-adapter.mjs +18 -2
- package/server/claude-worker/claude-session-process.mjs +33 -0
- package/server/claude-worker/claude-session-worker.mjs +6 -0
- package/server/db-schema.mjs +17 -0
- package/server/migrations/0006-workspace-root-settings.mjs +67 -0
- package/server/migrations/0007-claude-cloud.mjs +82 -0
- package/server/public/app/agent-sessions-settings-ui.js +197 -0
- package/server/public/app/agent-sessions-settings.mjs +134 -0
- package/server/public/app/api-client.js +143 -4
- package/server/public/app/attachments-view.js +20 -1
- package/server/public/app/attribution-control.mjs +46 -0
- package/server/public/app/bootstrap.js +344 -31
- package/server/public/app/claude-cloud-conversation-ui.js +110 -0
- package/server/public/app/claude-cloud-settings-ui.js +374 -0
- package/server/public/app/claude-cloud-ui.mjs +611 -0
- package/server/public/app/composer-control-state.mjs +11 -0
- package/server/public/app/context-menu.mjs +140 -0
- package/server/public/app/context-tier-options.mjs +4 -0
- package/server/public/app/conversation-origin-ui.js +27 -0
- package/server/public/app/conversation-provider-indicator.mjs +22 -4
- package/server/public/app/conversation-view.js +83 -4
- package/server/public/app/cwd-picker.js +12 -0
- package/server/public/app/journal-view.js +698 -28
- package/server/public/app/math-dollars.mjs +89 -0
- package/server/public/app/model-selector-options.mjs +1 -1
- package/server/public/app/plan-usage-view.mjs +36 -8
- package/server/public/app/relay-error-ctas.mjs +16 -2
- package/server/public/app/remote-relay-origin-view.mjs +120 -4
- package/server/public/app/router.js +49 -12
- package/server/public/app/settings-modal.js +33 -2
- package/server/public/app/settings-tabs.js +1 -1
- package/server/public/app/socket-handlers.js +51 -0
- package/server/public/index.html +381 -7
- package/server/relay-tools.md +13 -1
- package/server/repositories/remote-relay-repository.mjs +42 -1
- package/server/repositories/session-repository.mjs +47 -1
- package/server/routes/claude-cloud-routes.mjs +140 -0
- package/server/routes/git-routes.mjs +37 -0
- package/server/routes/messages-routes.mjs +120 -15
- package/server/routes/remote-relay-routes.mjs +15 -1
- package/server/routes/sessions-routes.mjs +502 -72
- package/server/server-runtime.mjs +258 -25
- package/server/services/claude-account-usage-service.mjs +176 -0
- package/server/services/claude-cloud-repo-service.mjs +408 -0
- package/server/services/claude-cloud-session-service.mjs +326 -0
- package/server/services/claude-cloud-settings-service.mjs +269 -0
- package/server/services/git-remote-service.mjs +115 -0
- package/server/services/plan-usage-claude-cloud.mjs +211 -0
- package/server/services/plan-usage-claude.mjs +202 -40
- package/server/services/plan-usage-contract.mjs +39 -3
- package/server/services/plan-usage-service.mjs +82 -2
- package/server/services/provider-reasoning-effort.mjs +3 -0
- package/server/services/remote-relay-caller-context.mjs +49 -10
- package/server/services/remote-relay-client.mjs +9 -0
- package/server/services/remote-relay-dispatcher.mjs +383 -35
- package/server/services/remote-relay-inbound.mjs +49 -2
- package/server/services/remote-relay-loopback.mjs +245 -0
- package/server/services/remote-relay-registry-service.mjs +52 -0
- package/server/services/session-worker-launch-service.mjs +100 -15
- package/server/services/session-worker-process-service.mjs +348 -129
- package/server/services/session-worker-stop-service.mjs +24 -13
- package/server/services/session-worker-supervisor-service.mjs +56 -1
- package/server/services/usage-limit-pause-service.mjs +3 -1
- package/server/services/worker-launch-note-service.mjs +151 -0
- package/shared/claude-attribution.mjs +117 -0
- package/shared/claude-cloud/api-client.mjs +809 -0
- package/shared/claude-cloud/base-url.mjs +47 -0
- package/shared/claude-cloud/credentials.mjs +221 -0
- package/shared/claude-cloud/repo-url.mjs +111 -0
- package/shared/provider-routing.mjs +4 -2
- package/shared/remote-relay-contract.mjs +153 -22
- package/shared/remote-relay-tool-core.mjs +11 -8
- package/shared/steer-settle-failure.mjs +1 -0
|
@@ -30,6 +30,8 @@ import {
|
|
|
30
30
|
setConversationWatcherCount,
|
|
31
31
|
setUpdateState,
|
|
32
32
|
applySessionWorkerSteering,
|
|
33
|
+
refreshSummaryModal,
|
|
34
|
+
summaryModalState,
|
|
33
35
|
} from './store.js';
|
|
34
36
|
import { scheduleContextUsageRefresh } from './api-client.js';
|
|
35
37
|
import { publishStatusEvent, recordStatusEvent } from './status-store.mjs';
|
|
@@ -44,8 +46,12 @@ import { setConversationBackgroundTasks } from './background-tasks-view.mjs';
|
|
|
44
46
|
import { setPreviews } from './preview-cards.mjs';
|
|
45
47
|
import { setRemoteRelaysSnapshot } from './remote-relays-store.mjs';
|
|
46
48
|
import { REMOTE_RELAY_SOCKET_EVENT } from './remote-relay-shared.mjs';
|
|
49
|
+
import { AGENT_SESSIONS_SOCKET_EVENT } from './agent-sessions-settings.mjs';
|
|
50
|
+
import { applyAgentSessionsSettingsState, refreshAgentSessionsSection } from './agent-sessions-settings-ui.js';
|
|
47
51
|
import { applyClaudeAuthState } from './claude-auth-ui.js';
|
|
48
52
|
import { applyGrokAuthState } from './grok-auth-ui.js';
|
|
53
|
+
import { applyClaudeCloudSettingsState, refreshClaudeCloudSettingsState } from './claude-cloud-settings-ui.js';
|
|
54
|
+
import { applyClaudeCloudSessionEvent } from './claude-cloud-conversation-ui.js';
|
|
49
55
|
import { applyCliInstallState } from './cli-install-ui.js';
|
|
50
56
|
import { renderUpdateSection } from './update-ui.js';
|
|
51
57
|
import { applyHostSuspendState, applyRelayShutdownState } from './host-suspend-ui.js';
|
|
@@ -65,6 +71,7 @@ import {
|
|
|
65
71
|
applyConversationTurnStatus,
|
|
66
72
|
renderMessages,
|
|
67
73
|
appendMessage,
|
|
74
|
+
replaceRenderedMessage,
|
|
68
75
|
applyIncomingConversationDraftUpdate,
|
|
69
76
|
getRenderedConversationMessageFingerprints,
|
|
70
77
|
clearBubbleCancelState,
|
|
@@ -408,6 +415,18 @@ export async function connectSocket(overrideDeps) {
|
|
|
408
415
|
socket.on('claude_usage_limit', (payload) => {
|
|
409
416
|
applyClaudeUsageLimit(payload || null);
|
|
410
417
|
});
|
|
418
|
+
// Claude Cloud settings (enable, default model, environment). The event
|
|
419
|
+
// carries the same shape as GET /api/settings/claude-cloud; one without a
|
|
420
|
+
// body is read as "something changed" and answered with a fresh read.
|
|
421
|
+
socket.on('claude_cloud_settings_updated', (payload) => {
|
|
422
|
+
if (payload && typeof payload === 'object') applyClaudeCloudSettingsState(payload);
|
|
423
|
+
else void refreshClaudeCloudSettingsState();
|
|
424
|
+
});
|
|
425
|
+
// A cloud session got its id, pushed a branch or reported a new cost: the
|
|
426
|
+
// conversation's `cloud` field changed, and with it the cloud line.
|
|
427
|
+
socket.on('claude_cloud_session', (payload) => {
|
|
428
|
+
if (applyClaudeCloudSessionEvent(payload || null)) deps?.syncChatTitleControls?.();
|
|
429
|
+
});
|
|
411
430
|
socket.on('grok_settings_updated', (payload) => {
|
|
412
431
|
deps?.applyGrokSettingsState?.(payload || {});
|
|
413
432
|
if (Number(payload?.reconciliation?.updatedUnstartedConversations || 0) > 0) {
|
|
@@ -498,6 +517,20 @@ export async function connectSocket(overrideDeps) {
|
|
|
498
517
|
if (sourceMessageId) clearRelayStreamStateForMessage(sourceMessageId);
|
|
499
518
|
refreshSessionWorkerStatus().catch(() => {});
|
|
500
519
|
});
|
|
520
|
+
// A folder's commit attribution changed (any client): an open context modal
|
|
521
|
+
// re-reads it so its row and effect text match.
|
|
522
|
+
socket.on('workspace_root_attribution_updated', () => {
|
|
523
|
+
if (summaryModalState.kind === 'context') refreshSummaryModal().catch(() => {});
|
|
524
|
+
});
|
|
525
|
+
// A message the relay rewrote in place (the note while a session's worker
|
|
526
|
+
// cannot be started): same id, new text or kind. Not on the page yet (the
|
|
527
|
+
// conversation was opened after it was written): appended like any other.
|
|
528
|
+
socket.on('message_updated', ({ conversationId, messageId, message }) => {
|
|
529
|
+
if (!messageId || conversationId !== currentConvId || !message) return;
|
|
530
|
+
if (!replaceRenderedMessage(message, messageId)) {
|
|
531
|
+
appendMessage(message, isMessagesAtBottom(), messageId, false);
|
|
532
|
+
}
|
|
533
|
+
});
|
|
501
534
|
socket.on('relay_question', ({ question }) => upsertRelayQuestion(question));
|
|
502
535
|
socket.on('relay_question_updated', ({ question }) => upsertRelayQuestion(question));
|
|
503
536
|
socket.on('relay_question_changed', () => {
|
|
@@ -521,6 +554,13 @@ export async function connectSocket(overrideDeps) {
|
|
|
521
554
|
socket.on(REMOTE_RELAY_SOCKET_EVENT, (payload) => {
|
|
522
555
|
setRemoteRelaysSnapshot(payload || null);
|
|
523
556
|
});
|
|
557
|
+
// Agent sessions (Settings → Relays): the event carries the same shape as
|
|
558
|
+
// GET /api/settings/agent-sessions; one without a body is answered with a
|
|
559
|
+
// fresh read.
|
|
560
|
+
socket.on(AGENT_SESSIONS_SOCKET_EVENT, (payload) => {
|
|
561
|
+
if (payload && typeof payload === 'object') applyAgentSessionsSettingsState(payload);
|
|
562
|
+
else void refreshAgentSessionsSection();
|
|
563
|
+
});
|
|
524
564
|
socket.on('relay_activity', ({ conversationId, messageId, text, subagentRunId, metadata }) => {
|
|
525
565
|
if (!messageId || !text) return;
|
|
526
566
|
const entry = {
|
|
@@ -737,6 +777,17 @@ export async function connectSocket(overrideDeps) {
|
|
|
737
777
|
}
|
|
738
778
|
renderConvList();
|
|
739
779
|
});
|
|
780
|
+
socket.on('conversation_archived', ({ conversationId, archived }) => {
|
|
781
|
+
const id = String(conversationId || '').trim();
|
|
782
|
+
if (!id) return;
|
|
783
|
+
const conversation = conversations[id];
|
|
784
|
+
if (conversation) conversation.archived = archived !== false;
|
|
785
|
+
renderConvList();
|
|
786
|
+
if (currentConvId === id) {
|
|
787
|
+
syncChatTitleControls();
|
|
788
|
+
syncComposerButtonState();
|
|
789
|
+
}
|
|
790
|
+
});
|
|
740
791
|
socket.on('conversation_deleted', ({ conversationId }) => {
|
|
741
792
|
delete conversations[conversationId];
|
|
742
793
|
for (const [id, question] of relayQuestions.entries()) {
|