codex-overleaf-link 2.3.5 → 2.4.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.
Files changed (57) hide show
  1. package/README.md +63 -31
  2. package/README.zh-CN.md +543 -0
  3. package/extension/bootstrap/manifest.template.json +1 -1
  4. package/extension/src/background.js +7 -0
  5. package/extension/src/backgroundUpdateCoordinator.js +88 -4
  6. package/extension/src/content/activeTurnControl.js +1 -0
  7. package/extension/src/content/assetTransferBroker.js +2 -0
  8. package/extension/src/content/contentRuntime.js +77 -57
  9. package/extension/src/content/contextTray.js +4 -0
  10. package/extension/src/content/diagnosticsController.js +17 -3
  11. package/extension/src/content/diagnosticsPanel.js +129 -5
  12. package/extension/src/content/generated/content.bundle.js +1422 -348
  13. package/extension/src/content/generated/content.bundle.meta.json +7 -3
  14. package/extension/src/content/legacyGlobalRegistry.js +3 -0
  15. package/extension/src/content/modelPicker.js +21 -9
  16. package/extension/src/content/modelPickerSupport.js +38 -1
  17. package/extension/src/content/nativeCompatibilityController.js +4 -1
  18. package/extension/src/content/otWarmMirror.js +126 -92
  19. package/extension/src/content/otWarmMirrorController.js +122 -1
  20. package/extension/src/content/pageBridgeClient.js +2 -0
  21. package/extension/src/content/panelMaintenance.js +26 -15
  22. package/extension/src/content/providerSettingsCoordinator.js +1 -0
  23. package/extension/src/content/runFailureNotice.js +104 -0
  24. package/extension/src/content/runResultActions.js +16 -1
  25. package/extension/src/content/runScrollLayout.js +124 -0
  26. package/extension/src/content/runTimelineView.js +37 -11
  27. package/extension/src/content/sessionForkController.js +20 -11
  28. package/extension/src/content/settingsPanel.js +28 -11
  29. package/extension/src/content/trackedChangeCaptureController.js +153 -0
  30. package/extension/src/content/updateNotice.js +24 -4
  31. package/extension/src/content/writebackOrchestrator.js +31 -0
  32. package/extension/src/page/binaryAssetUploader.js +101 -29
  33. package/extension/src/page/overleafRealtimeObserver.js +120 -25
  34. package/extension/src/page/textFileCreator.js +493 -0
  35. package/extension/src/page/trackedChangeCapture.js +342 -0
  36. package/extension/src/page/trackedChangesLifecycle.js +145 -149
  37. package/extension/src/page/treeOperations.js +30 -2
  38. package/extension/src/page/writebackRouter.js +94 -48
  39. package/extension/src/pageBridge.js +62 -25
  40. package/extension/src/shared/compatibility.js +1 -1
  41. package/extension/src/shared/i18n.js +77 -37
  42. package/extension/src/shared/managedUpdateProjection.js +1 -1
  43. package/extension/src/shared/otText.js +0 -1
  44. package/extension/src/shared/pageRpcContract.js +2 -1
  45. package/extension/src/shared/sessionState.js +23 -23
  46. package/extension/src/shared/sessionTitle.js +120 -0
  47. package/extension/src/shared/storageDb.js +10 -12
  48. package/extension/src/shared/storageRunActions.js +29 -1
  49. package/extension/src/shared/updateRuntimeIdentity.js +32 -0
  50. package/extension/src/shared/writebackSettlement.js +19 -5
  51. package/extension/styles/panel.css +128 -24
  52. package/native-host/src/mirrorWorkspace.js +20 -1
  53. package/native-host/src/releaseProxy.js +177 -0
  54. package/native-host/src/releaseTransport.js +154 -0
  55. package/native-host/src/taskRunnerRuntime.js +25 -0
  56. package/native-host/src/updateManager.js +40 -39
  57. package/package.json +5 -1
@@ -2,9 +2,9 @@
2
2
  "schemaVersion": 1,
3
3
  "entry": "extension/entries/content-entry.mjs",
4
4
  "output": "extension/src/content/generated/content.bundle.js",
5
- "sourceDigest": "7ed22d5c82b20220316824547e1dfc359e45dfcdf1f1bca2fb7280195a05361c",
6
- "outputDigest": "50436e35fe942b3fd8540a6267fba79c41a53c216b1ffc42995e4ed026771de4",
7
- "byteLength": 2337940,
5
+ "sourceDigest": "f146d7e07b67706193fa5fcff26d7c9719826ac745aec9b745dd95c52413d27c",
6
+ "outputDigest": "11993fd0746a026b1e74399060e70559eb569fca492fcdec36c2fb69a78d6b80",
7
+ "byteLength": 2404976,
8
8
  "inputs": [
9
9
  "extension/entries/content-entry.mjs",
10
10
  "extension/src/content/activeTurnControl.js",
@@ -44,10 +44,12 @@
44
44
  "extension/src/content/recentProjects.js",
45
45
  "extension/src/content/reviewHunks.js",
46
46
  "extension/src/content/runController.js",
47
+ "extension/src/content/runFailureNotice.js",
47
48
  "extension/src/content/runGuidanceController.js",
48
49
  "extension/src/content/runGuidanceView.js",
49
50
  "extension/src/content/runQueueScheduler.js",
50
51
  "extension/src/content/runResultActions.js",
52
+ "extension/src/content/runScrollLayout.js",
51
53
  "extension/src/content/runSettlementPersistence.js",
52
54
  "extension/src/content/runTimelineView.js",
53
55
  "extension/src/content/scopedPersistenceCoordinator.js",
@@ -60,6 +62,7 @@
60
62
  "extension/src/content/sessionPersistence.js",
61
63
  "extension/src/content/settingsPanel.js",
62
64
  "extension/src/content/themeController.js",
65
+ "extension/src/content/trackedChangeCaptureController.js",
63
66
  "extension/src/content/updateIdle.js",
64
67
  "extension/src/content/updateNotice.js",
65
68
  "extension/src/content/writebackController.js",
@@ -90,6 +93,7 @@
90
93
  "extension/src/shared/scopedPersistenceTransaction.js",
91
94
  "extension/src/shared/sensitiveScan.js",
92
95
  "extension/src/shared/sessionState.js",
96
+ "extension/src/shared/sessionTitle.js",
93
97
  "extension/src/shared/settlementFacts.js",
94
98
  "extension/src/shared/staleGuard.js",
95
99
  "extension/src/shared/storageDb.js",
@@ -57,6 +57,8 @@
57
57
  'RunInputQueue',
58
58
  'RunQueueScheduler',
59
59
  'RunResultActions',
60
+ 'RunScrollLayout',
61
+ 'RunFailureNotice',
60
62
  'RunSettlementPersistence',
61
63
  'RunTimelineView',
62
64
  'ScopedPersistenceCoordinator',
@@ -73,6 +75,7 @@
73
75
  'StorageMigration',
74
76
  'Summary',
75
77
  'Theme',
78
+ 'TrackedChangeCaptureController',
76
79
  'UndoOperations',
77
80
  'UpdateIdle',
78
81
  'UpdateNotice',
@@ -134,7 +134,8 @@
134
134
  return { stale: false, error: response?.error || { code: 'provider_models_unavailable' } };
135
135
  }
136
136
  const sourceModels = hasDiscoveredModels ? response.result.models : fallbackModels;
137
- const retainedSelectedModel = retainSelectedModel(sourceModels, currentSelectedModel);
137
+ const preserveBuiltin = (selection?.providerId || 'builtin') === 'builtin' && (getState()?.providerId || 'builtin') === 'builtin';
138
+ const retainedSelectedModel = retainSelectedModel(sourceModels, currentSelectedModel, { preserveUnavailable: preserveBuiltin });
138
139
  const normalized = modelCatalog.normalizeDiscoveredModels({ models: sourceModels, selectedModel: retainedSelectedModel });
139
140
  if (normalized.usedFallback && response.result?.providerId && response.result.providerId !== 'builtin') {
140
141
  applyUnavailableModelOptions({ code: 'provider_model_catalog_invalid', message: 'The active provider returned no usable models.' });
@@ -143,9 +144,12 @@
143
144
  error: { code: 'provider_model_catalog_invalid', message: 'The active provider returned no usable models.' }
144
145
  };
145
146
  }
146
- renderModelOptions(normalized.models, retainedSelectedModel, { allowUnknownSelected: false });
147
+ const renderedModels = preserveBuiltin
148
+ ? Support.preserveSelectedCapabilities(normalized.models, retainedSelectedModel, getState(), !hasDiscoveredModels || response.result?.source === 'fallback')
149
+ : normalized.models;
150
+ renderModelOptions(renderedModels, retainedSelectedModel, { allowUnknownSelected: false });
147
151
  modelDiscovery = {
148
- status: hasDiscoveredModels && !normalized.usedFallback ? 'discovered' : 'fallback',
152
+ status: hasDiscoveredModels && !normalized.usedFallback && response.result?.source !== 'fallback' ? 'discovered' : 'fallback',
149
153
  source: hasDiscoveredModels ? response.result?.source || 'unknown' : 'fallback',
150
154
  fetchedAt: hasDiscoveredModels ? response.result?.fetchedAt || '' : '',
151
155
  errorCode: hasDiscoveredModels ? '' : response?.error?.code || '',
@@ -172,15 +176,16 @@
172
176
  }
173
177
 
174
178
  function applyUnavailableModelOptions(error) {
179
+ const selectedModel = resolveSelectedModel();
175
180
  const modelSelect = getPanel()?.querySelector('[data-model]');
176
181
  if (modelSelect) {
177
182
  modelSelect.textContent = '';
178
183
  const option = document.createElement('option');
179
- option.value = resolveSelectedModel();
184
+ option.value = selectedModel;
180
185
  option.textContent = tx('Models unavailable', '模型不可用');
181
186
  option.disabled = true;
182
187
  modelSelect.append(option);
183
- modelSelect.value = '';
188
+ modelSelect.value = selectedModel;
184
189
  modelSelect.disabled = true;
185
190
  }
186
191
  modelDiscovery = {
@@ -190,8 +195,15 @@
190
195
  errorCode: error?.code || '',
191
196
  errorMessage: error?.message || (error ? String(error) : '')
192
197
  };
193
- renderReasoningOptions([]);
194
- renderSpeedOptions([]);
198
+ const pendingModels = Support.preserveSelectedCapabilities(
199
+ [{ id: selectedModel, unverified: true }], selectedModel, getState(), true
200
+ );
201
+ renderReasoningOptions(pendingModels);
202
+ renderSpeedOptions(pendingModels);
203
+ for (const selector of ['[data-reasoning]', '[data-speed]']) {
204
+ const input = getPanel()?.querySelector(selector);
205
+ if (input) input.disabled = true;
206
+ }
195
207
  renderModelConfigChoices();
196
208
  updateModelDisplay();
197
209
  }
@@ -200,9 +212,9 @@
200
212
  const modelCatalog = getModelCatalog();
201
213
  const fallbackModels = modelCatalog.FALLBACK_MODELS;
202
214
  const sourceModels = fallbackModels;
203
- const retainedSelectedModel = retainSelectedModel(sourceModels, selectedModel);
215
+ const retainedSelectedModel = retainSelectedModel(sourceModels, selectedModel, { preserveUnavailable: (getState()?.providerId || 'builtin') === 'builtin' });
204
216
  const normalized = modelCatalog.normalizeDiscoveredModels({ models: sourceModels, selectedModel: retainedSelectedModel });
205
- renderModelOptions(normalized.models, retainedSelectedModel);
217
+ renderModelOptions(Support.preserveSelectedCapabilities(normalized.models, retainedSelectedModel, getState(), true), retainedSelectedModel);
206
218
  modelDiscovery = {
207
219
  status: 'fallback',
208
220
  source: 'fallback',
@@ -29,14 +29,49 @@
29
29
  return String(label || '').replace(/^gpt[-\s]*/i, '');
30
30
  }
31
31
 
32
- function retainSelectedModel(models, selectedModel) {
32
+ function retainSelectedModel(models, selectedModel, options = {}) {
33
33
  const selectedId = normalizeModelOptionId(selectedModel);
34
34
  if (!selectedId) return '';
35
+ if (options.preserveUnavailable === true) return selectedId;
35
36
  return (Array.isArray(models) ? models : []).some(model => (
36
37
  normalizeModelOptionId(typeof model === 'string' ? model : model?.id) === selectedId
37
38
  )) ? selectedId : '';
38
39
  }
39
40
 
41
+ // A fallback or missing catalog entry cannot revoke an explicit selection.
42
+ // Keep its saved controls provisional until real capability data arrives.
43
+ function preserveSelectedCapabilities(models, selectedModel, preferences = {}, provisional = false) {
44
+ const selectedId = normalizeModelOptionId(selectedModel);
45
+ const saved = preferences || {};
46
+ return (Array.isArray(models) ? models : []).map(model => {
47
+ if (model.id !== selectedId || (!provisional && !model.unverified)) return model;
48
+ const reasoningEfforts = normalizeReasoningEffortsForSelect([
49
+ ...(model.reasoningEfforts || []), saved.reasoningEffort
50
+ ]);
51
+ const speedTiers = normalizeSpeedTiersForSelect(model.speedTiers);
52
+ const speed = ['standard', 'fast'].includes(saved.speedTier) ? saved.speedTier : '';
53
+ if (speed && !speedTiers.includes(speed)) speedTiers.push(speed);
54
+ return {
55
+ ...model, unverified: true, reasoningEfforts, speedTiers,
56
+ defaultReasoningEffort: reasoningEfforts.includes(saved.reasoningEffort)
57
+ ? saved.reasoningEffort : model.defaultReasoningEffort,
58
+ defaultSpeedTier: speed || model.defaultSpeedTier || 'standard'
59
+ };
60
+ });
61
+ }
62
+
63
+ function getRenderedModelEntries(panel) {
64
+ return Array.from(panel?.querySelector('[data-model]')?.options || []).map(option => ({
65
+ id: option.value,
66
+ label: option.textContent,
67
+ reasoningEfforts: (option.dataset.reasoningEfforts || '').split(',').filter(Boolean),
68
+ defaultReasoningEffort: option.dataset.defaultReasoningEffort || '',
69
+ reasoningPresentation: option.dataset.reasoningPresentation || '',
70
+ speedTiers: (option.dataset.speedTiers || 'standard').split(',').filter(Boolean),
71
+ defaultSpeedTier: option.dataset.defaultSpeedTier || 'standard'
72
+ }));
73
+ }
74
+
40
75
  function shouldUseBuiltInFallback(response) {
41
76
  const providerId = normalizeModelOptionId(response?.result?.providerId);
42
77
  return response?.ok === true && (!providerId || providerId === 'builtin');
@@ -114,6 +149,8 @@
114
149
  normalizeReasoningEffortsForSelect,
115
150
  normalizeSpeedTiersForSelect,
116
151
  retainSelectedModel,
152
+ preserveSelectedCapabilities,
153
+ getRenderedModelEntries,
117
154
  shouldUseBuiltInFallback
118
155
  };
119
156
  return api;
@@ -23,7 +23,10 @@
23
23
  async function dispatch(payload, channelMethod) {
24
24
  const compatibilityGate = await ensureForMethod(payload?.method);
25
25
  if (!compatibilityGate.ok) return compatibilityGate.response;
26
- if (gatedMethods.has(payload?.method)) options.throwIfCancellationRequested?.();
26
+ // Post-Undo cache bookkeeping must survive the ended run's cancellation.
27
+ if (gatedMethods.has(payload?.method) && payload.method !== 'mirror.invalidate') {
28
+ options.throwIfCancellationRequested?.();
29
+ }
27
30
  return nativeChannel[channelMethod](
28
31
  attachEvidence(payload, compatibilityGate.compatibility)
29
32
  );