@oar-sh/oar 0.9.0
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/README.md +190 -0
- package/.github/extensions/web-relay/extension.mjs +972 -0
- package/.github/extensions/web-relay/model-api/model-switching.mjs +338 -0
- package/.github/extensions/web-relay/polling/heartbeat.mjs +55 -0
- package/.github/extensions/web-relay/polling/polling-loop.mjs +1105 -0
- package/.github/extensions/web-relay/runtime/api-client.mjs +34 -0
- package/.github/extensions/web-relay/runtime/banner-state.mjs +126 -0
- package/.github/extensions/web-relay/runtime/config-loader.mjs +104 -0
- package/.github/extensions/web-relay/runtime/debug-log.mjs +27 -0
- package/.github/extensions/web-relay/runtime/send-and-wait-errors.mjs +170 -0
- package/.github/extensions/web-relay/runtime/session-binding.mjs +78 -0
- package/.github/extensions/web-relay/runtime/session-io.mjs +349 -0
- package/.github/extensions/web-relay/runtime/session-join-retry.mjs +44 -0
- package/.github/extensions/web-relay/runtime/session-registry.mjs +29 -0
- package/.github/extensions/web-relay/runtime/session-runtime-manager.mjs +156 -0
- package/.github/extensions/web-relay/runtime/session-sync-bridge.mjs +74 -0
- package/.github/extensions/web-relay/runtime/worker-websocket-link.mjs +325 -0
- package/.github/extensions/web-relay/runtime/workspace-root.mjs +55 -0
- package/.github/extensions/web-relay/server-lifecycle/managed-server.mjs +386 -0
- package/.github/extensions/web-relay/skills/prompt-context.mjs +160 -0
- package/.github/extensions/web-relay/skills/question-bridge.mjs +141 -0
- package/.github/extensions/web-relay/skills/question-routing-hooks.mjs +463 -0
- package/.github/extensions/web-relay/skills/reasoning-stream.mjs +285 -0
- package/.github/extensions/web-relay/skills/subagent-lifecycle.mjs +345 -0
- package/.github/extensions/web-relay/skills/tool-activity.mjs +243 -0
- package/.github/extensions/web-relay/utils/process-utils.mjs +25 -0
- package/.github/extensions/web-relay/utils/token-generation.mjs +58 -0
- package/CHANGELOG.md +25 -0
- package/LICENSE +21 -0
- package/README.md +717 -0
- package/bin/bat/oar.bat +46 -0
- package/bin/oar.js +665 -0
- package/package.json +68 -0
- package/server/README.md +1379 -0
- package/server/claude-worker/claude-attachments.mjs +134 -0
- package/server/claude-worker/claude-preview-tool.mjs +57 -0
- package/server/claude-worker/claude-sdk-adapter.mjs +420 -0
- package/server/claude-worker/claude-session-process.mjs +2391 -0
- package/server/claude-worker/claude-session-test-harness.mjs +236 -0
- package/server/claude-worker/claude-session-worker.mjs +186 -0
- package/server/claude-worker/claude-transcript-relocator.mjs +189 -0
- package/server/claude-worker/claude-turn-publisher.mjs +291 -0
- package/server/claude-worker/fixtures/workflow-run-record.json +1 -0
- package/server/claude-worker/sdk-message-normalizer.mjs +629 -0
- package/server/claude-worker/workflow-progress-digest.mjs +269 -0
- package/server/copilot-sdk-runtime.mjs +126 -0
- package/server/copilot-worker/copilot-attachments.mjs +97 -0
- package/server/copilot-worker/copilot-byok-provider.mjs +121 -0
- package/server/copilot-worker/copilot-continuation-signals.mjs +349 -0
- package/server/copilot-worker/copilot-plan-board.mjs +110 -0
- package/server/copilot-worker/copilot-prompt-context.mjs +86 -0
- package/server/copilot-worker/copilot-question-bridge.mjs +216 -0
- package/server/copilot-worker/copilot-sdk-adapter.mjs +494 -0
- package/server/copilot-worker/copilot-sdk-event-normalizer.mjs +800 -0
- package/server/copilot-worker/copilot-sdk-session-process.mjs +1729 -0
- package/server/copilot-worker/copilot-sdk-session-worker.mjs +167 -0
- package/server/copilot-worker/copilot-sdk-test-harness.mjs +329 -0
- package/server/copilot-worker/fixtures/abort-turn.json +588 -0
- package/server/copilot-worker/fixtures/ask-user-turn.json +1154 -0
- package/server/copilot-worker/fixtures/background-timer-continuation.json +445 -0
- package/server/copilot-worker/fixtures/background-timer-turn.json +497 -0
- package/server/copilot-worker/fixtures/happy-turn.json +566 -0
- package/server/copilot-worker/fixtures/quota-turn.json +647 -0
- package/server/copilot-worker/fixtures/reasoning-turn.json +625 -0
- package/server/copilot-worker/fixtures/resume-turn.json +700 -0
- package/server/copilot-worker/fixtures/subagent-turn.json +1378 -0
- package/server/copilot-worker/fixtures/tool-permission-turn.json +1293 -0
- package/server/cursor-worker/cursor-ask-user-tool.mjs +83 -0
- package/server/cursor-worker/cursor-attachments.mjs +88 -0
- package/server/cursor-worker/cursor-context-usage.mjs +85 -0
- package/server/cursor-worker/cursor-preview-tool.mjs +44 -0
- package/server/cursor-worker/cursor-sdk-adapter.mjs +554 -0
- package/server/cursor-worker/cursor-session-worker.mjs +145 -0
- package/server/cursor-worker/cursor-subagent-roster.mjs +81 -0
- package/server/cursor-worker/cursor-turn-runner.mjs +717 -0
- package/server/cursor-worker/sdk-message-normalizer.mjs +485 -0
- package/server/db-schema.mjs +932 -0
- package/server/features.mjs +106 -0
- package/server/grok-worker/acp-client.mjs +434 -0
- package/server/grok-worker/acp-host-services.mjs +277 -0
- package/server/grok-worker/grok-context-usage.mjs +77 -0
- package/server/grok-worker/grok-sdk-adapter.mjs +334 -0
- package/server/grok-worker/grok-session-worker.mjs +145 -0
- package/server/grok-worker/grok-turn-runner.mjs +523 -0
- package/server/grok-worker/sdk-message-normalizer.mjs +311 -0
- package/server/migrations/0001-add-structured-answer.mjs +80 -0
- package/server/migrations/0002-recent-workspace-roots-path-key.mjs +121 -0
- package/server/migrations/0003-push-subscriptions.mjs +87 -0
- package/server/public/app/action-confirmations.js +267 -0
- package/server/public/app/activity-replay-state.mjs +149 -0
- package/server/public/app/api-client.js +1082 -0
- package/server/public/app/ask-user-view.js +545 -0
- package/server/public/app/attachments-view.js +2112 -0
- package/server/public/app/auto-compact-window-options.mjs +59 -0
- package/server/public/app/background-tasks-view.mjs +494 -0
- package/server/public/app/bootstrap.js +4347 -0
- package/server/public/app/claude-auth-ui.js +394 -0
- package/server/public/app/claude-thinking-options.mjs +38 -0
- package/server/public/app/cli-install-ui.js +455 -0
- package/server/public/app/code-copy.mjs +85 -0
- package/server/public/app/composer-attachment-cache.mjs +151 -0
- package/server/public/app/composer-control-state.mjs +107 -0
- package/server/public/app/composer-paste.mjs +132 -0
- package/server/public/app/context-tier-options.mjs +68 -0
- package/server/public/app/context-usage-view.mjs +338 -0
- package/server/public/app/conversation-draft-timestamp-utils.mjs +11 -0
- package/server/public/app/conversation-preferences.mjs +91 -0
- package/server/public/app/conversation-provider-indicator.mjs +88 -0
- package/server/public/app/conversation-view.js +2898 -0
- package/server/public/app/cwd-menu-placement.mjs +85 -0
- package/server/public/app/cwd-picker.js +605 -0
- package/server/public/app/emoji-view.js +101 -0
- package/server/public/app/external-link-policy.mjs +80 -0
- package/server/public/app/file-preview-navigation.mjs +51 -0
- package/server/public/app/font-scaling.js +262 -0
- package/server/public/app/git-changes-view.js +339 -0
- package/server/public/app/git-diff-model.mjs +109 -0
- package/server/public/app/grok-auth-ui.js +387 -0
- package/server/public/app/image-downscale.mjs +174 -0
- package/server/public/app/in-flight-snapshot.mjs +40 -0
- package/server/public/app/infinite-loader.js +164 -0
- package/server/public/app/journal-view.js +1141 -0
- package/server/public/app/known-cwd-options.mjs +41 -0
- package/server/public/app/launch-cwd-path.mjs +23 -0
- package/server/public/app/live-message-dedupe.mjs +57 -0
- package/server/public/app/message-search-view.js +242 -0
- package/server/public/app/model-selector-options.mjs +31 -0
- package/server/public/app/model-vision-support.mjs +56 -0
- package/server/public/app/new-conversation-model-choice.mjs +67 -0
- package/server/public/app/plan-usage-view.mjs +307 -0
- package/server/public/app/preview-cards.mjs +273 -0
- package/server/public/app/preview-command.mjs +103 -0
- package/server/public/app/push-settings.js +370 -0
- package/server/public/app/pwa-install.js +456 -0
- package/server/public/app/question-schema-view.mjs +71 -0
- package/server/public/app/reasoning-effort-labels.mjs +42 -0
- package/server/public/app/relay-board-view.js +117 -0
- package/server/public/app/relay-dot-state.mjs +69 -0
- package/server/public/app/relay-error-ctas.mjs +52 -0
- package/server/public/app/relay-prompt-sanitizer.mjs +114 -0
- package/server/public/app/relay-thoughts.mjs +98 -0
- package/server/public/app/relay-watchdog-policy.mjs +29 -0
- package/server/public/app/repo-browser-preferences.mjs +79 -0
- package/server/public/app/repo-browser-tree-state.mjs +97 -0
- package/server/public/app/router.js +657 -0
- package/server/public/app/selection-guard.mjs +93 -0
- package/server/public/app/settings-modal.js +1484 -0
- package/server/public/app/settings-tabs.js +129 -0
- package/server/public/app/slash-autocomplete.mjs +188 -0
- package/server/public/app/slash-commands.mjs +183 -0
- package/server/public/app/socket-handlers.js +703 -0
- package/server/public/app/status-store.mjs +242 -0
- package/server/public/app/status-view.mjs +315 -0
- package/server/public/app/store.js +1454 -0
- package/server/public/app/stream-state.mjs +73 -0
- package/server/public/app/streaming-dom-patch.mjs +23 -0
- package/server/public/app/sync-outbox.mjs +208 -0
- package/server/public/app/tap-actions.js +62 -0
- package/server/public/app/thread-order.mjs +54 -0
- package/server/public/app/tmux-inspector-view.js +422 -0
- package/server/public/app/transcript-separators.mjs +282 -0
- package/server/public/app-icon-192.png +0 -0
- package/server/public/app-icon-512.png +0 -0
- package/server/public/app-icon.svg +4 -0
- package/server/public/favicon.ico +0 -0
- package/server/public/index.html +5743 -0
- package/server/public/manifest.webmanifest +32 -0
- package/server/public/sw.js +307 -0
- package/server/relay-exit-codes.mjs +4 -0
- package/server/relay-self-restart.mjs +170 -0
- package/server/relay-tools.md +27 -0
- package/server/relay.mjs +1026 -0
- package/server/repositories/image-conversation-repository.mjs +317 -0
- package/server/repositories/message-repository.mjs +434 -0
- package/server/repositories/question-repository.mjs +161 -0
- package/server/repositories/session-repository.mjs +320 -0
- package/server/repositories/share-visibility-statements.mjs +24 -0
- package/server/routes/ask-user-routes.mjs +292 -0
- package/server/routes/cache-routes.mjs +44 -0
- package/server/routes/git-routes.mjs +92 -0
- package/server/routes/messages-routes-test-harness.mjs +111 -0
- package/server/routes/messages-routes.mjs +7107 -0
- package/server/routes/preview-routes.mjs +108 -0
- package/server/routes/push-routes.mjs +59 -0
- package/server/routes/relay-board-routes.mjs +268 -0
- package/server/routes/sessions-routes.mjs +6150 -0
- package/server/server-runtime.mjs +7463 -0
- package/server/server.js +24 -0
- package/server/services/ask-user-routing-service.mjs +117 -0
- package/server/services/cache-rebuild-service.mjs +236 -0
- package/server/services/claude-auth-service.mjs +578 -0
- package/server/services/claude-context-usage.mjs +240 -0
- package/server/services/claude-session-root-service.mjs +228 -0
- package/server/services/cli-install-service.mjs +1152 -0
- package/server/services/cli-process-runner.mjs +181 -0
- package/server/services/cloudflared-tunnel-service.mjs +358 -0
- package/server/services/context-snapshot-service.mjs +499 -0
- package/server/services/context-usage-view.mjs +160 -0
- package/server/services/conversation-preferences-service.mjs +208 -0
- package/server/services/cursor-dashboard-usage.mjs +217 -0
- package/server/services/cursor-session-root-service.mjs +62 -0
- package/server/services/delete-archive-service.mjs +154 -0
- package/server/services/drives-path-helpers.mjs +66 -0
- package/server/services/fixtures/claude-auth-stub.sh +62 -0
- package/server/services/fixtures/cli-install-stub.sh +75 -0
- package/server/services/fixtures/grok-stub.sh +86 -0
- package/server/services/generated-image-cleanup-service.mjs +114 -0
- package/server/services/git-changes-service.mjs +195 -0
- package/server/services/github-billing-usage.mjs +133 -0
- package/server/services/grok-auth-service.mjs +593 -0
- package/server/services/grok-billing-usage.mjs +120 -0
- package/server/services/image-context-service.mjs +106 -0
- package/server/services/image-operation-service.mjs +135 -0
- package/server/services/keyed-mutex-service.mjs +82 -0
- package/server/services/mime-sniffer.mjs +118 -0
- package/server/services/oar-cli-helpers.mjs +109 -0
- package/server/services/oar-state-migration-service.mjs +243 -0
- package/server/services/plan-usage-claude.mjs +387 -0
- package/server/services/plan-usage-contract.mjs +271 -0
- package/server/services/plan-usage-copilot.mjs +421 -0
- package/server/services/plan-usage-cursor.mjs +566 -0
- package/server/services/plan-usage-grok.mjs +436 -0
- package/server/services/plan-usage-service.mjs +487 -0
- package/server/services/preview-health-probe.mjs +82 -0
- package/server/services/preview-proxy-server.mjs +498 -0
- package/server/services/preview-registry-service.mjs +457 -0
- package/server/services/preview-static-handler.mjs +237 -0
- package/server/services/provider-model-selection.mjs +91 -0
- package/server/services/provider-reasoning-effort.mjs +94 -0
- package/server/services/push-active-device-service.mjs +57 -0
- package/server/services/push-dispatch-service.mjs +459 -0
- package/server/services/rate-limit-service.mjs +63 -0
- package/server/services/relay-bridge-owner-service.mjs +84 -0
- package/server/services/relay-cli-launcher-service.mjs +209 -0
- package/server/services/relay-prompt-sanitizer.mjs +137 -0
- package/server/services/relay-queue-gate-service.mjs +38 -0
- package/server/services/relay-restart-orchestrator-service.mjs +935 -0
- package/server/services/relay-singleton-guard.mjs +124 -0
- package/server/services/safe-served-content.mjs +57 -0
- package/server/services/sdk-session-import-service.mjs +271 -0
- package/server/services/sdk-session-sync-service.mjs +207 -0
- package/server/services/session-history-refresh-service.mjs +497 -0
- package/server/services/session-transcript-service.mjs +419 -0
- package/server/services/session-worker-launch-service.mjs +786 -0
- package/server/services/session-worker-process-service.mjs +319 -0
- package/server/services/session-worker-registry-service.mjs +194 -0
- package/server/services/session-worker-stop-service.mjs +141 -0
- package/server/services/session-worker-supervisor-service.mjs +898 -0
- package/server/services/session-worker-websocket-service.mjs +483 -0
- package/server/services/ssh-tunnel-manager-service.mjs +423 -0
- package/server/services/status-event-service.mjs +158 -0
- package/server/services/tmux-inspector-access-policy.mjs +77 -0
- package/server/services/tmux-inspector-socket-service.mjs +191 -0
- package/server/services/tmux-inspector-stream-service.mjs +552 -0
- package/server/services/tunnel-worker-path-guard.mjs +107 -0
- package/server/services/upload-sweep.mjs +60 -0
- package/server/services/usage-snapshot-helpers.mjs +209 -0
- package/server/services/windows-autostart-service.mjs +115 -0
- package/server/services/workspace-root-defaults-service.mjs +34 -0
- package/server/services/workspace-root-path-policy.mjs +196 -0
- package/server/services/workspace-root-relaunch-service.mjs +132 -0
- package/server/services/workspace-symlink-guard.mjs +54 -0
- package/server/tools/capture-proxy.mjs +173 -0
- package/server/tty-console-bootstrap.mjs +75 -0
- package/server/uploads/README.md +36 -0
- package/server/uploads/image_input.md +540 -0
- package/server/windows-terminal-launcher.mjs +29 -0
- package/server/workspace-root.mjs +87 -0
- package/shared/ask-user-bridge.mjs +131 -0
- package/shared/auto-compact-window.mjs +116 -0
- package/shared/background-task-timeout.mjs +52 -0
- package/shared/claude-thinking.mjs +101 -0
- package/shared/context-window-fallbacks.mjs +148 -0
- package/shared/control-poller.mjs +115 -0
- package/shared/empty-turn-completion.mjs +20 -0
- package/shared/model-catalog-freshness.mjs +11 -0
- package/shared/model-descriptors.mjs +118 -0
- package/shared/model-id.mjs +147 -0
- package/shared/model-refresh.mjs +24 -0
- package/shared/openai-reasoning.mjs +13 -0
- package/shared/plan-lines.mjs +13 -0
- package/shared/preview-instructions.mjs +77 -0
- package/shared/preview-tool-core.mjs +191 -0
- package/shared/provider-routing.mjs +29 -0
- package/shared/question-schema.mjs +315 -0
- package/shared/question-timeout.mjs +18 -0
- package/shared/stream-emit-gating.mjs +28 -0
- package/shared/subagent-run-id.mjs +17 -0
- package/shared/thought-cap.mjs +13 -0
- package/shared/tool-activity.mjs +98 -0
- package/shared/turn-ceiling.mjs +53 -0
- package/shared/worker-bootstrap.mjs +44 -0
- package/shared/worker-crash-guard.mjs +60 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
const DEFAULT_FALLBACK_MODE = 'agent';
|
|
2
|
+
|
|
3
|
+
// Stored preferences arrive as '' when unset, so `??` would treat them as real
|
|
4
|
+
// values and block every fallback behind them.
|
|
5
|
+
export function normalizePreferenceValue(value) {
|
|
6
|
+
return String(value ?? '').trim();
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function firstDefinedPreference(...values) {
|
|
10
|
+
for (const value of values) {
|
|
11
|
+
const normalized = normalizePreferenceValue(value);
|
|
12
|
+
if (normalized) return normalized;
|
|
13
|
+
}
|
|
14
|
+
return '';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function normalizeModeList(modes = []) {
|
|
18
|
+
return Array.isArray(modes)
|
|
19
|
+
? modes.map((mode) => String(mode || '').trim()).filter(Boolean)
|
|
20
|
+
: [];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function normalizeModelList(models = []) {
|
|
24
|
+
return Array.isArray(models)
|
|
25
|
+
? models.map((model) => String(model || '').trim()).filter(Boolean)
|
|
26
|
+
: [];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function resolveConversationComposerSelection({
|
|
30
|
+
preferredRelayMode = '',
|
|
31
|
+
preferredModel = '',
|
|
32
|
+
selectedMode = '',
|
|
33
|
+
selectedModel = '',
|
|
34
|
+
supportedModes = [],
|
|
35
|
+
supportedModels = [],
|
|
36
|
+
fallbackMode = DEFAULT_FALLBACK_MODE,
|
|
37
|
+
fallbackModel = '',
|
|
38
|
+
} = {}) {
|
|
39
|
+
const allowedModes = normalizeModeList(supportedModes);
|
|
40
|
+
const allowedModels = normalizeModelList(supportedModels);
|
|
41
|
+
const modeFallback = allowedModes.includes(fallbackMode)
|
|
42
|
+
? fallbackMode
|
|
43
|
+
: (allowedModes[0] || DEFAULT_FALLBACK_MODE);
|
|
44
|
+
const preferredMode = String(preferredRelayMode || '').trim();
|
|
45
|
+
const nextMode = allowedModes.includes(preferredMode)
|
|
46
|
+
? preferredMode
|
|
47
|
+
: (allowedModes.includes(String(selectedMode || '').trim())
|
|
48
|
+
? String(selectedMode || '').trim()
|
|
49
|
+
: modeFallback);
|
|
50
|
+
|
|
51
|
+
const modelCandidates = [
|
|
52
|
+
String(preferredModel || '').trim(),
|
|
53
|
+
String(selectedModel || '').trim(),
|
|
54
|
+
String(fallbackModel || '').trim(),
|
|
55
|
+
allowedModels[0] || '',
|
|
56
|
+
].filter(Boolean);
|
|
57
|
+
// Provider catalogs own their casing, so a stored id that only differs in
|
|
58
|
+
// case still resolves to the catalog entry instead of dropping to a fallback.
|
|
59
|
+
const matchAllowedModel = (candidate) => allowedModels.find(
|
|
60
|
+
(allowed) => allowed === candidate || allowed.toLowerCase() === candidate.toLowerCase(),
|
|
61
|
+
);
|
|
62
|
+
const nextModel = allowedModels.length
|
|
63
|
+
? (modelCandidates.map(matchAllowedModel).find(Boolean) || allowedModels[0])
|
|
64
|
+
: (modelCandidates[0] || '');
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
mode: nextMode,
|
|
68
|
+
model: nextModel,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Priority: an explicit request (conversation preference, or the effort being
|
|
73
|
+
// carried across a user model change) beats what the previous conversation left
|
|
74
|
+
// in the DOM. Reversing those two is what let a New Chat "high" become "low".
|
|
75
|
+
export function resolveComposerReasoningEffort({
|
|
76
|
+
preferredEffort = '',
|
|
77
|
+
storedEffort = '',
|
|
78
|
+
currentEffort = '',
|
|
79
|
+
supportedEfforts = [],
|
|
80
|
+
} = {}) {
|
|
81
|
+
const options = (Array.isArray(supportedEfforts) ? supportedEfforts : [])
|
|
82
|
+
.map((effort) => String(effort || '').trim().toLowerCase())
|
|
83
|
+
.filter(Boolean);
|
|
84
|
+
if (!options.length) return '';
|
|
85
|
+
const candidates = [preferredEffort, storedEffort, currentEffort]
|
|
86
|
+
.map((effort) => String(effort || '').trim().toLowerCase())
|
|
87
|
+
.filter(Boolean);
|
|
88
|
+
const match = candidates.find((candidate) => options.includes(candidate));
|
|
89
|
+
if (match) return match;
|
|
90
|
+
return options.find((option) => option !== 'none') || options[0];
|
|
91
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export function resolveConversationProviderType(conversation = null) {
|
|
2
|
+
const providerType = String(
|
|
3
|
+
conversation?.runtimeProviderType
|
|
4
|
+
?? conversation?.runtime_provider_type
|
|
5
|
+
?? '',
|
|
6
|
+
).trim().toLowerCase();
|
|
7
|
+
return providerType;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function isConversationUsingOpenAIProvider(conversation = null) {
|
|
11
|
+
return resolveConversationProviderType(conversation) === 'openai';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function isConversationUsingClaudeProvider(conversation = null) {
|
|
15
|
+
return resolveConversationProviderType(conversation) === 'claude';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function isConversationUsingCursorProvider(conversation = null) {
|
|
19
|
+
return resolveConversationProviderType(conversation) === 'cursor';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function isConversationUsingGrokProvider(conversation = null) {
|
|
23
|
+
return resolveConversationProviderType(conversation) === 'grok';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// An unresolved provider stays unlabelled rather than defaulting to Copilot, so
|
|
27
|
+
// a conversation the client has not loaded yet cannot claim the wrong provider.
|
|
28
|
+
export function conversationProviderIndicatorLabel(conversation = null) {
|
|
29
|
+
const providerType = resolveConversationProviderType(conversation);
|
|
30
|
+
if (providerType === 'openai') return 'OpenAI';
|
|
31
|
+
if (providerType === 'claude') return 'Claude';
|
|
32
|
+
if (providerType === 'cursor') return 'Cursor';
|
|
33
|
+
if (providerType === 'grok') return 'Grok';
|
|
34
|
+
if (providerType === 'github' || providerType === 'github-copilot') return 'Copilot';
|
|
35
|
+
return '';
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const SESSION_LOCK_LABELS = {
|
|
39
|
+
github: 'GitHub Copilot',
|
|
40
|
+
openai: 'OpenAI',
|
|
41
|
+
'openai-image': 'OpenAI Image',
|
|
42
|
+
claude: 'Claude SDK',
|
|
43
|
+
cursor: 'Cursor SDK',
|
|
44
|
+
grok: 'Grok',
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export function isOpenAIImageModelId(modelId = '') {
|
|
48
|
+
const normalized = String(modelId || '').trim().toLowerCase().replace(/^openai\//, '');
|
|
49
|
+
return normalized.startsWith('gpt-image-') || normalized.startsWith('dall-e-');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Image conversations are stored as the `openai` provider with an image model,
|
|
53
|
+
// so the image variant only exists as a derived label.
|
|
54
|
+
export function sessionLockProviderKey({ providerType = '', model = '' } = {}) {
|
|
55
|
+
const normalized = String(providerType || '').trim().toLowerCase();
|
|
56
|
+
if (normalized === 'openai' || normalized === 'openai-byok') {
|
|
57
|
+
return isOpenAIImageModelId(model) ? 'openai-image' : 'openai';
|
|
58
|
+
}
|
|
59
|
+
if (normalized === 'openai-image' || normalized === 'openai-image-byok') return 'openai-image';
|
|
60
|
+
if (normalized === 'claude' || normalized === 'claude-agent-sdk' || normalized === 'anthropic') return 'claude';
|
|
61
|
+
if (normalized === 'cursor') return 'cursor';
|
|
62
|
+
if (normalized === 'grok' || normalized === 'xai' || normalized === 'xai-grok') return 'grok';
|
|
63
|
+
if (normalized === 'github' || normalized === 'github-copilot') return 'github';
|
|
64
|
+
return '';
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function sessionLockProviderLabel({ providerType = '', model = '' } = {}) {
|
|
68
|
+
return SESSION_LOCK_LABELS[sessionLockProviderKey({ providerType, model })] || '';
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The list pill borrows the composer's provider palette, so it resolves the same
|
|
72
|
+
// key the session-lock note uses — including the derived OpenAI image variant.
|
|
73
|
+
export function conversationProviderIndicatorKey(conversation = null) {
|
|
74
|
+
return sessionLockProviderKey({
|
|
75
|
+
providerType: resolveConversationProviderType(conversation),
|
|
76
|
+
model: conversation?.runtimeProviderModel
|
|
77
|
+
|| conversation?.runtimeModel
|
|
78
|
+
|| conversation?.preferredModel
|
|
79
|
+
|| '',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function sessionLockNoteText({ providerType = '', model = '', pinnedModel = '' } = {}) {
|
|
84
|
+
const label = sessionLockProviderLabel({ providerType, model });
|
|
85
|
+
if (!label) return '';
|
|
86
|
+
const pinned = String(pinnedModel || '').trim();
|
|
87
|
+
return `🔒 Session locked to ${label} models${pinned ? ` (${pinned})` : ''}.`;
|
|
88
|
+
}
|