@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.
Files changed (81) hide show
  1. package/CHANGELOG.md +172 -0
  2. package/README.md +176 -22
  3. package/package.json +1 -1
  4. package/server/README.md +174 -7
  5. package/server/claude-cloud-worker/claude-cloud-event-normalizer.mjs +340 -0
  6. package/server/claude-cloud-worker/claude-cloud-session-process.mjs +1325 -0
  7. package/server/claude-cloud-worker/claude-cloud-session-worker.mjs +155 -0
  8. package/server/claude-worker/claude-remote-relay-tool.mjs +2 -0
  9. package/server/claude-worker/claude-sdk-adapter.mjs +18 -2
  10. package/server/claude-worker/claude-session-process.mjs +33 -0
  11. package/server/claude-worker/claude-session-worker.mjs +6 -0
  12. package/server/db-schema.mjs +17 -0
  13. package/server/migrations/0006-workspace-root-settings.mjs +67 -0
  14. package/server/migrations/0007-claude-cloud.mjs +82 -0
  15. package/server/public/app/agent-sessions-settings-ui.js +197 -0
  16. package/server/public/app/agent-sessions-settings.mjs +134 -0
  17. package/server/public/app/api-client.js +143 -4
  18. package/server/public/app/attachments-view.js +20 -1
  19. package/server/public/app/attribution-control.mjs +46 -0
  20. package/server/public/app/bootstrap.js +344 -31
  21. package/server/public/app/claude-cloud-conversation-ui.js +110 -0
  22. package/server/public/app/claude-cloud-settings-ui.js +374 -0
  23. package/server/public/app/claude-cloud-ui.mjs +611 -0
  24. package/server/public/app/composer-control-state.mjs +11 -0
  25. package/server/public/app/context-menu.mjs +140 -0
  26. package/server/public/app/context-tier-options.mjs +4 -0
  27. package/server/public/app/conversation-origin-ui.js +27 -0
  28. package/server/public/app/conversation-provider-indicator.mjs +22 -4
  29. package/server/public/app/conversation-view.js +83 -4
  30. package/server/public/app/cwd-picker.js +12 -0
  31. package/server/public/app/journal-view.js +698 -28
  32. package/server/public/app/math-dollars.mjs +89 -0
  33. package/server/public/app/model-selector-options.mjs +1 -1
  34. package/server/public/app/plan-usage-view.mjs +36 -8
  35. package/server/public/app/relay-error-ctas.mjs +16 -2
  36. package/server/public/app/remote-relay-origin-view.mjs +120 -4
  37. package/server/public/app/router.js +49 -12
  38. package/server/public/app/settings-modal.js +33 -2
  39. package/server/public/app/settings-tabs.js +1 -1
  40. package/server/public/app/socket-handlers.js +51 -0
  41. package/server/public/index.html +381 -7
  42. package/server/relay-tools.md +13 -1
  43. package/server/repositories/remote-relay-repository.mjs +42 -1
  44. package/server/repositories/session-repository.mjs +47 -1
  45. package/server/routes/claude-cloud-routes.mjs +140 -0
  46. package/server/routes/git-routes.mjs +37 -0
  47. package/server/routes/messages-routes.mjs +120 -15
  48. package/server/routes/remote-relay-routes.mjs +15 -1
  49. package/server/routes/sessions-routes.mjs +502 -72
  50. package/server/server-runtime.mjs +258 -25
  51. package/server/services/claude-account-usage-service.mjs +176 -0
  52. package/server/services/claude-cloud-repo-service.mjs +408 -0
  53. package/server/services/claude-cloud-session-service.mjs +326 -0
  54. package/server/services/claude-cloud-settings-service.mjs +269 -0
  55. package/server/services/git-remote-service.mjs +115 -0
  56. package/server/services/plan-usage-claude-cloud.mjs +211 -0
  57. package/server/services/plan-usage-claude.mjs +202 -40
  58. package/server/services/plan-usage-contract.mjs +39 -3
  59. package/server/services/plan-usage-service.mjs +82 -2
  60. package/server/services/provider-reasoning-effort.mjs +3 -0
  61. package/server/services/remote-relay-caller-context.mjs +49 -10
  62. package/server/services/remote-relay-client.mjs +9 -0
  63. package/server/services/remote-relay-dispatcher.mjs +383 -35
  64. package/server/services/remote-relay-inbound.mjs +49 -2
  65. package/server/services/remote-relay-loopback.mjs +245 -0
  66. package/server/services/remote-relay-registry-service.mjs +52 -0
  67. package/server/services/session-worker-launch-service.mjs +100 -15
  68. package/server/services/session-worker-process-service.mjs +348 -129
  69. package/server/services/session-worker-stop-service.mjs +24 -13
  70. package/server/services/session-worker-supervisor-service.mjs +56 -1
  71. package/server/services/usage-limit-pause-service.mjs +3 -1
  72. package/server/services/worker-launch-note-service.mjs +151 -0
  73. package/shared/claude-attribution.mjs +117 -0
  74. package/shared/claude-cloud/api-client.mjs +809 -0
  75. package/shared/claude-cloud/base-url.mjs +47 -0
  76. package/shared/claude-cloud/credentials.mjs +221 -0
  77. package/shared/claude-cloud/repo-url.mjs +111 -0
  78. package/shared/provider-routing.mjs +4 -2
  79. package/shared/remote-relay-contract.mjs +153 -22
  80. package/shared/remote-relay-tool-core.mjs +11 -8
  81. 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()) {