oysterun 1.4.9 → 1.5.0-beta.1

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 (56) hide show
  1. package/dev/client/web/index.html +374 -34
  2. package/dev/client/web-chat/dist/assets/{ReactPrism-Dvxp38RS.js → ReactPrism-CnWaHTwG.js} +1 -1
  3. package/dev/client/web-chat/dist/assets/ReactPrism-CnWaHTwG.js.map +1 -0
  4. package/dev/client/web-chat/dist/assets/index-B9fWrEk-.js.map +1 -1
  5. package/dev/client/web-chat/dist/assets/{index-CdJBbrB6.js → index-Bk7cN522.js} +1 -1
  6. package/dev/client/web-chat/dist/assets/index-Bk7cN522.js.map +1 -0
  7. package/dev/client/web-chat/dist/assets/{index-5iJVcklH.js → index-Ca6_kdF9.js} +2 -2
  8. package/dev/client/web-chat/dist/assets/index-Ca6_kdF9.js.map +1 -0
  9. package/dev/client/web-chat/dist/assets/{index-BRrMvB8k.js → index-GA-8pt0s.js} +83 -85
  10. package/dev/client/web-chat/dist/assets/index-GA-8pt0s.js.map +1 -0
  11. package/dev/client/web-chat/dist/assets/{pdf-C_dxab-C.js → pdf-C_iV1r1i.js} +3 -3
  12. package/dev/client/web-chat/dist/assets/pdf-C_iV1r1i.js.map +1 -0
  13. package/dev/client/web-chat/dist/assets/{web-CDiscXap.js → web-BBXKV3Qt.js} +1 -1
  14. package/dev/client/web-chat/dist/assets/web-BBXKV3Qt.js.map +1 -0
  15. package/dev/client/web-chat/dist/assets/{web-PnVxTH3H.js → web-Dwq5XDl2.js} +1 -1
  16. package/dev/client/web-chat/dist/assets/web-Dwq5XDl2.js.map +1 -0
  17. package/dev/client/web-chat/dist/index.html +1 -1
  18. package/docs/routec/config_hierachy.md +3 -1
  19. package/docs/routec/dev/npm_native_dependency_install.md +126 -0
  20. package/docs/routec/dev/npmjs_publish.md +9 -0
  21. package/docs/routec/dev/pagination_doc.md +123 -0
  22. package/docs/routec/dev/tool_event_sqlite_continuation.md +128 -0
  23. package/docs/routec/form_UI_fields.md +2 -0
  24. package/docs/routec/host_owner_message_navigation.md +6 -5
  25. package/docs/routec/large_tool_event_spillover.md +44 -0
  26. package/docs/routec/tool_message_transfer_compression.md +12 -25
  27. package/host-service/adapters/debug-fixture-provider-adapter.mjs +63 -1
  28. package/host-service/adapters/debug-routec-structural-replay-provider-adapter.mjs +416 -0
  29. package/host-service/config.mjs +32 -0
  30. package/host-service/debug-routec-structural-replay.mjs +481 -0
  31. package/host-service/large-tool-call-store.mjs +709 -382
  32. package/host-service/matrix-event-writer.mjs +3 -0
  33. package/host-service/matrix-facade.mjs +14 -0
  34. package/host-service/npm-update-policy.mjs +91 -0
  35. package/host-service/package.json +2 -2
  36. package/host-service/provider-model-params.mjs +5 -2
  37. package/host-service/provider-registry.mjs +66 -2
  38. package/host-service/routec-matrix-storage-adapter.mjs +4 -2
  39. package/host-service/routec-viewport-geometry-diagnostics.mjs +179 -0
  40. package/host-service/server.mjs +434 -131
  41. package/host-service/session-manager.mjs +16 -0
  42. package/host-service/unified-tool-lifecycle-detail.mjs +2 -2
  43. package/host-service/update-reminder-state.mjs +2 -0
  44. package/package.json +3 -2
  45. package/tool_scripts/install_oysterun_update.mjs +296 -0
  46. package/tool_scripts/oysterun_service_common.sh +2 -0
  47. package/tool_scripts/verify_oysterun_runtime.mjs +87 -0
  48. package/dev/client/web-chat/dist/assets/ReactPrism-Dvxp38RS.js.map +0 -1
  49. package/dev/client/web-chat/dist/assets/index-5iJVcklH.js.map +0 -1
  50. package/dev/client/web-chat/dist/assets/index-BRrMvB8k.js.map +0 -1
  51. package/dev/client/web-chat/dist/assets/index-CdJBbrB6.js.map +0 -1
  52. package/dev/client/web-chat/dist/assets/pdf-C_dxab-C.js.map +0 -1
  53. package/dev/client/web-chat/dist/assets/web-CDiscXap.js.map +0 -1
  54. package/dev/client/web-chat/dist/assets/web-PnVxTH3H.js.map +0 -1
  55. package/docs/routec/dev/timeline_display_pagination_model.md +0 -255
  56. package/docs/routec/live_bottom_display_range_alignment.md +0 -47
@@ -8957,6 +8957,41 @@
8957
8957
  </div>
8958
8958
  </div>
8959
8959
  </div>
8960
+ <div
8961
+ class="kv-label hidden"
8962
+ id="host-update-beta-label"
8963
+ data-oysterun-p021-beta-update-gate="config-debug-only"
8964
+ >
8965
+ Latest Beta
8966
+ </div>
8967
+ <div
8968
+ class="kv-value hidden"
8969
+ id="host-update-beta-value"
8970
+ data-oysterun-p021-beta-update-gate="config-debug-only"
8971
+ >
8972
+ <div class="value-stack">
8973
+ <div
8974
+ class="mono-path"
8975
+ id="host-update-beta-version"
8976
+ >
8977
+ --
8978
+ </div>
8979
+ <div
8980
+ class="field-hint"
8981
+ id="host-update-beta-status"
8982
+ >
8983
+ Checking npm beta tag...
8984
+ </div>
8985
+ <button
8986
+ class="btn-ghost"
8987
+ type="button"
8988
+ id="host-update-beta-run-btn"
8989
+ onClick=${call("runOysterunBetaUpdate")}
8990
+ >
8991
+ Install Beta & Restart
8992
+ </button>
8993
+ </div>
8994
+ </div>
8960
8995
  <div class="kv-label">Action</div>
8961
8996
  <div class="kv-value">
8962
8997
  <div class="control-cell">
@@ -9036,6 +9071,13 @@
9036
9071
  work may be marked interrupted and will not be
9037
9072
  replayed.
9038
9073
  </div>
9074
+ <div
9075
+ class="field-hint host-update-confirmation-warning hidden"
9076
+ id="host-update-confirmation-beta-warning"
9077
+ >
9078
+ Beta builds may be unstable. This action
9079
+ installs the exact npm beta version shown above.
9080
+ </div>
9039
9081
  <div class="host-update-confirmation-actions">
9040
9082
  <button
9041
9083
  class="btn-ghost"
@@ -13057,11 +13099,17 @@ Waiting for Claude login output…</pre
13057
13099
  restartStatus: "",
13058
13100
  restartRestore: null,
13059
13101
  update: null,
13102
+ betaUpdate: null,
13103
+ debugHostPreferencesBetaUpdateEnabled: false,
13060
13104
  updateChecking: false,
13105
+ betaUpdateChecking: false,
13061
13106
  updateRunning: false,
13062
13107
  updateStatus: "",
13063
13108
  updateError: "",
13109
+ betaUpdateStatus: "",
13110
+ betaUpdateError: "",
13064
13111
  updateConfirmationVisible: false,
13112
+ updateConfirmationMode: "",
13065
13113
  updateConfirmationCurrentVersion: "",
13066
13114
  updateConfirmationTargetVersion: "",
13067
13115
  localUrl: "",
@@ -29472,7 +29520,7 @@ Waiting for Claude login output…</pre
29472
29520
  codexReasoningEffortSelect.disabled = true;
29473
29521
  }
29474
29522
  $("model-hint").textContent =
29475
- "Fake replay delay. Send 1-13, 13a-d, 16, or combos like 9*20, 7.";
29523
+ "Fake replay delay. Send P017_LIVE_TAIL_3S, 1-13, 13a-d, 16, or combos like 9*20, 7.";
29476
29524
  $("runtime-hint").textContent =
29477
29525
  "Uses the internal debug fixture provider. It is available only when Host debug fixture mode is enabled.";
29478
29526
  } else if (createRuntime === "debug-large-tool-spillover") {
@@ -32914,6 +32962,8 @@ Waiting for Claude login output…</pre
32914
32962
  data.folder_access_settings_supported === true,
32915
32963
  debugHostPreferencesFullDiskAccessBlockEnabled:
32916
32964
  data.debug_host_preferences_full_disk_access_block_enabled === true,
32965
+ debugHostPreferencesBetaUpdateEnabled:
32966
+ data.debug_host_preferences_beta_update_enabled === true,
32917
32967
  folderAccessSettingsUri:
32918
32968
  typeof data.folder_access_settings_uri === "string"
32919
32969
  ? data.folder_access_settings_uri
@@ -32950,11 +33000,19 @@ Waiting for Claude login output…</pre
32950
33000
  ? data.restart_restore
32951
33001
  : hostPreferencesState.restartRestore,
32952
33002
  update: normalizedUpdate,
33003
+ betaUpdate:
33004
+ data.debug_host_preferences_beta_update_enabled === true
33005
+ ? hostPreferencesState.betaUpdate
33006
+ : null,
32953
33007
  updateChecking: false,
33008
+ betaUpdateChecking: false,
32954
33009
  updateRunning: updateOperationBlocking,
32955
33010
  updateStatus: "",
32956
33011
  updateError: "",
33012
+ betaUpdateStatus: "",
33013
+ betaUpdateError: "",
32957
33014
  updateConfirmationVisible: false,
33015
+ updateConfirmationMode: "",
32958
33016
  updateConfirmationCurrentVersion: "",
32959
33017
  updateConfirmationTargetVersion: "",
32960
33018
  localUrl: data.local_url || "",
@@ -34588,9 +34646,19 @@ Waiting for Claude login output…</pre
34588
34646
  const update = normalizeOysterunUpdatePayload(
34589
34647
  hostPreferencesState.update || {}
34590
34648
  );
34649
+ const betaUpdate =
34650
+ hostPreferencesState.betaUpdate &&
34651
+ typeof hostPreferencesState.betaUpdate === "object"
34652
+ ? hostPreferencesState.betaUpdate
34653
+ : {};
34654
+ const betaUpdateVisible =
34655
+ hostPreferencesState.debugHostPreferencesBetaUpdateEnabled === true;
34656
+ setVisible("host-update-beta-label", betaUpdateVisible);
34657
+ setVisible("host-update-beta-value", betaUpdateVisible);
34591
34658
  setText("host-update-current", update.current_version || "--");
34592
34659
  setText("host-update-newest", update.newest_version || "--");
34593
34660
  setText("host-update-latest", update.newest_version || "--");
34661
+ setText("host-update-beta-version", betaUpdate.beta_version || "--");
34594
34662
  let updateStatus =
34595
34663
  hostPreferencesState.updateError ||
34596
34664
  hostPreferencesState.updateStatus ||
@@ -34608,6 +34676,27 @@ Waiting for Claude login output…</pre
34608
34676
  }
34609
34677
  }
34610
34678
  setText("host-update-status", updateStatus);
34679
+ let betaUpdateStatus =
34680
+ hostPreferencesState.betaUpdateError ||
34681
+ hostPreferencesState.betaUpdateStatus ||
34682
+ betaUpdate.error ||
34683
+ "";
34684
+ if (!betaUpdateStatus && betaUpdateVisible) {
34685
+ if (hostPreferencesState.betaUpdateChecking) {
34686
+ betaUpdateStatus = "Checking npm beta tag...";
34687
+ } else if (betaUpdate.relation === "installed") {
34688
+ betaUpdateStatus = "This beta version is already installed.";
34689
+ } else if (betaUpdate.relation === "older") {
34690
+ betaUpdateStatus = `Beta ${betaUpdate.beta_version} is older than the installed version.`;
34691
+ } else if (betaUpdate.update_supported === false) {
34692
+ betaUpdateStatus = "Beta install is unavailable on this stack.";
34693
+ } else if (betaUpdate.relation === "newer") {
34694
+ betaUpdateStatus = `Beta ${betaUpdate.beta_version} is available.`;
34695
+ } else {
34696
+ betaUpdateStatus = "Checking npm beta tag...";
34697
+ }
34698
+ }
34699
+ setText("host-update-beta-status", betaUpdateStatus);
34611
34700
  const updatePhase = getOysterunUpdatePhase(update);
34612
34701
  setText("host-update-phase", updatePhase);
34613
34702
  setText(
@@ -34618,13 +34707,27 @@ Waiting for Claude login output…</pre
34618
34707
  isOysterunUpdateOperationBlocking(update);
34619
34708
  const updateCanRun =
34620
34709
  update.update_supported === true && update.update_available === true;
34710
+ const betaUpdateCanRun =
34711
+ betaUpdateVisible &&
34712
+ betaUpdate.update_supported === true &&
34713
+ betaUpdate.install_available === true &&
34714
+ betaUpdate.relation === "newer";
34715
+ const updateConfirmationMode =
34716
+ hostPreferencesState.updateConfirmationMode === "beta"
34717
+ ? "beta"
34718
+ : "latest";
34719
+ const confirmationCanRun =
34720
+ updateConfirmationMode === "beta" ? betaUpdateCanRun : updateCanRun;
34621
34721
  const updateTargetVersion =
34622
- update.newest_version ||
34623
- update.latest_version ||
34722
+ (updateConfirmationMode === "beta"
34723
+ ? betaUpdate.beta_version || betaUpdate.target_version
34724
+ : update.newest_version || update.latest_version) ||
34624
34725
  hostPreferencesState.updateConfirmationTargetVersion ||
34625
34726
  "the newest version";
34626
34727
  const updateCurrentVersion =
34627
- update.current_version ||
34728
+ (updateConfirmationMode === "beta"
34729
+ ? betaUpdate.current_version
34730
+ : update.current_version) ||
34628
34731
  hostPreferencesState.updateConfirmationCurrentVersion ||
34629
34732
  "the current version";
34630
34733
  const updateConfirmationVisible =
@@ -34632,7 +34735,7 @@ Waiting for Claude login output…</pre
34632
34735
  !hostPreferencesState.updateChecking &&
34633
34736
  !hostPreferencesState.updateRunning &&
34634
34737
  !updateOperationBlocking &&
34635
- updateCanRun;
34738
+ confirmationCanRun;
34636
34739
  const updateProgressSpinner = $("host-update-progress-spinner");
34637
34740
  if (updateProgressSpinner) {
34638
34741
  updateProgressSpinner.classList.toggle(
@@ -34645,6 +34748,7 @@ Waiting for Claude login output…</pre
34645
34748
  updateCheckButton.disabled =
34646
34749
  disabled ||
34647
34750
  hostPreferencesState.updateChecking ||
34751
+ hostPreferencesState.betaUpdateChecking ||
34648
34752
  hostPreferencesState.updateRunning ||
34649
34753
  updateOperationBlocking ||
34650
34754
  updateConfirmationVisible;
@@ -34657,6 +34761,7 @@ Waiting for Claude login output…</pre
34657
34761
  updateRunButton.disabled =
34658
34762
  disabled ||
34659
34763
  hostPreferencesState.updateChecking ||
34764
+ hostPreferencesState.betaUpdateChecking ||
34660
34765
  hostPreferencesState.updateRunning ||
34661
34766
  updateOperationBlocking ||
34662
34767
  updateConfirmationVisible ||
@@ -34665,17 +34770,47 @@ Waiting for Claude login output…</pre
34665
34770
  ? "Installing..."
34666
34771
  : "Update & Restart";
34667
34772
  }
34773
+ const betaUpdateRunButton = $("host-update-beta-run-btn");
34774
+ if (betaUpdateRunButton) {
34775
+ betaUpdateRunButton.disabled =
34776
+ disabled ||
34777
+ hostPreferencesState.updateChecking ||
34778
+ hostPreferencesState.betaUpdateChecking ||
34779
+ hostPreferencesState.updateRunning ||
34780
+ updateOperationBlocking ||
34781
+ updateConfirmationVisible ||
34782
+ !betaUpdateCanRun;
34783
+ betaUpdateRunButton.textContent = hostPreferencesState.updateRunning
34784
+ ? "Installing..."
34785
+ : "Install Beta & Restart";
34786
+ }
34668
34787
  setVisible("host-update-confirmation", updateConfirmationVisible);
34788
+ setVisible(
34789
+ "host-update-confirmation-beta-warning",
34790
+ updateConfirmationVisible && updateConfirmationMode === "beta"
34791
+ );
34792
+ setText(
34793
+ "host-update-confirmation-title",
34794
+ updateConfirmationMode === "beta"
34795
+ ? "Confirm beta install and restart"
34796
+ : "Confirm update and restart"
34797
+ );
34669
34798
  setText("host-update-confirmation-current", updateCurrentVersion);
34670
34799
  setText("host-update-confirmation-target", updateTargetVersion);
34671
34800
  setText(
34672
34801
  "host-update-confirmation-copy",
34673
- `Update Oysterun from ${updateCurrentVersion} to ${updateTargetVersion}, then restart Host.`
34802
+ updateConfirmationMode === "beta"
34803
+ ? `Install Oysterun beta ${updateTargetVersion} over ${updateCurrentVersion}, then restart Host.`
34804
+ : `Update Oysterun from ${updateCurrentVersion} to ${updateTargetVersion}, then restart Host.`
34674
34805
  );
34675
34806
  const updateConfirmRunButton = $("host-update-confirm-run-btn");
34676
34807
  if (updateConfirmRunButton) {
34677
34808
  updateConfirmRunButton.disabled =
34678
34809
  disabled || !updateConfirmationVisible;
34810
+ updateConfirmRunButton.textContent =
34811
+ updateConfirmationMode === "beta"
34812
+ ? "Confirm Beta Install & Restart"
34813
+ : "Confirm Update & Restart";
34679
34814
  }
34680
34815
  const updateConfirmCancelButton = $("host-update-confirm-cancel-btn");
34681
34816
  if (updateConfirmCancelButton) {
@@ -34800,6 +34935,9 @@ Waiting for Claude login output…</pre
34800
34935
  ]);
34801
34936
  applyProviderCatalogData(providerData);
34802
34937
  applyHostPreferencesData(data);
34938
+ if (data.debug_host_preferences_beta_update_enabled === true) {
34939
+ await checkOysterunBetaUpdate({ quiet: true });
34940
+ }
34803
34941
  } catch (err) {
34804
34942
  if (isUnauthorizedError(err)) {
34805
34943
  await doLogout({
@@ -34927,6 +35065,7 @@ Waiting for Claude login output…</pre
34927
35065
  async function checkOysterunUpdate() {
34928
35066
  if (
34929
35067
  hostPreferencesState.updateChecking ||
35068
+ hostPreferencesState.betaUpdateChecking ||
34930
35069
  hostPreferencesState.updateRunning ||
34931
35070
  isOysterunUpdateOperationBlocking(hostPreferencesState.update)
34932
35071
  ) {
@@ -34938,6 +35077,7 @@ Waiting for Claude login output…</pre
34938
35077
  updateStatus: "Checking npm for updates...",
34939
35078
  updateError: "",
34940
35079
  updateConfirmationVisible: false,
35080
+ updateConfirmationMode: "",
34941
35081
  updateConfirmationCurrentVersion: "",
34942
35082
  updateConfirmationTargetVersion: "",
34943
35083
  };
@@ -34969,10 +35109,56 @@ Waiting for Claude login output…</pre
34969
35109
  }
34970
35110
  }
34971
35111
 
35112
+ async function checkOysterunBetaUpdate({ quiet = false } = {}) {
35113
+ if (
35114
+ hostPreferencesState.debugHostPreferencesBetaUpdateEnabled !== true ||
35115
+ hostPreferencesState.betaUpdateChecking ||
35116
+ hostPreferencesState.updateRunning ||
35117
+ isOysterunUpdateOperationBlocking(hostPreferencesState.update)
35118
+ ) {
35119
+ return;
35120
+ }
35121
+ hostPreferencesState = {
35122
+ ...hostPreferencesState,
35123
+ betaUpdateChecking: true,
35124
+ betaUpdateStatus: quiet ? "" : "Checking npm beta tag...",
35125
+ betaUpdateError: "",
35126
+ updateConfirmationVisible: false,
35127
+ updateConfirmationMode: "",
35128
+ updateConfirmationCurrentVersion: "",
35129
+ updateConfirmationTargetVersion: "",
35130
+ };
35131
+ renderHostPreferences();
35132
+ try {
35133
+ const data = await apiWithAuthRetry(
35134
+ "POST",
35135
+ "/admin/update-beta-check",
35136
+ {}
35137
+ );
35138
+ hostPreferencesState = {
35139
+ ...hostPreferencesState,
35140
+ betaUpdate: data && typeof data === "object" ? data : null,
35141
+ betaUpdateChecking: false,
35142
+ betaUpdateStatus: "",
35143
+ betaUpdateError: "",
35144
+ };
35145
+ renderHostPreferences();
35146
+ } catch (err) {
35147
+ hostPreferencesState = {
35148
+ ...hostPreferencesState,
35149
+ betaUpdateChecking: false,
35150
+ betaUpdateStatus: "",
35151
+ betaUpdateError: err.message || "Could not check the npm beta tag.",
35152
+ };
35153
+ renderHostPreferences();
35154
+ }
35155
+ }
35156
+
34972
35157
  async function runOysterunUpdate() {
34973
35158
  if (
34974
35159
  hostPreferencesState.updateRunning ||
34975
35160
  hostPreferencesState.updateChecking ||
35161
+ hostPreferencesState.betaUpdateChecking ||
34976
35162
  isOysterunUpdateOperationBlocking(hostPreferencesState.update)
34977
35163
  ) {
34978
35164
  return;
@@ -34991,6 +35177,7 @@ Waiting for Claude login output…</pre
34991
35177
  hostPreferencesState = {
34992
35178
  ...hostPreferencesState,
34993
35179
  updateConfirmationVisible: true,
35180
+ updateConfirmationMode: "latest",
34994
35181
  updateConfirmationCurrentVersion:
34995
35182
  update.current_version || "the current version",
34996
35183
  updateConfirmationTargetVersion: targetVersion,
@@ -35003,18 +35190,65 @@ Waiting for Claude login output…</pre
35003
35190
  }, 0);
35004
35191
  }
35005
35192
 
35193
+ async function runOysterunBetaUpdate() {
35194
+ if (
35195
+ hostPreferencesState.debugHostPreferencesBetaUpdateEnabled !== true ||
35196
+ hostPreferencesState.updateRunning ||
35197
+ hostPreferencesState.updateChecking ||
35198
+ hostPreferencesState.betaUpdateChecking ||
35199
+ isOysterunUpdateOperationBlocking(hostPreferencesState.update)
35200
+ ) {
35201
+ return;
35202
+ }
35203
+ const betaUpdate = hostPreferencesState.betaUpdate || {};
35204
+ if (
35205
+ betaUpdate.update_supported !== true ||
35206
+ betaUpdate.install_available !== true ||
35207
+ betaUpdate.relation !== "newer"
35208
+ ) {
35209
+ return;
35210
+ }
35211
+ const targetVersion =
35212
+ betaUpdate.beta_version || betaUpdate.target_version;
35213
+ if (!targetVersion) return;
35214
+ hostPreferencesState = {
35215
+ ...hostPreferencesState,
35216
+ updateConfirmationVisible: true,
35217
+ updateConfirmationMode: "beta",
35218
+ updateConfirmationCurrentVersion:
35219
+ betaUpdate.current_version || "the current version",
35220
+ updateConfirmationTargetVersion: targetVersion,
35221
+ betaUpdateStatus: "Confirm Beta Install & Restart to continue.",
35222
+ betaUpdateError: "",
35223
+ updateStatus: "",
35224
+ updateError: "",
35225
+ };
35226
+ renderHostPreferences();
35227
+ window.setTimeout(() => {
35228
+ $("host-update-confirm-run-btn")?.focus();
35229
+ }, 0);
35230
+ }
35231
+
35006
35232
  function cancelOysterunUpdateConfirmation() {
35233
+ const confirmationMode = hostPreferencesState.updateConfirmationMode;
35007
35234
  hostPreferencesState = {
35008
35235
  ...hostPreferencesState,
35009
35236
  updateConfirmationVisible: false,
35237
+ updateConfirmationMode: "",
35010
35238
  updateConfirmationCurrentVersion: "",
35011
35239
  updateConfirmationTargetVersion: "",
35012
35240
  updateStatus: "",
35013
35241
  updateError: "",
35242
+ betaUpdateStatus: "",
35243
+ betaUpdateError: "",
35014
35244
  };
35015
35245
  renderHostPreferences();
35016
35246
  window.setTimeout(() => {
35017
- $("host-update-run-btn")?.focus();
35247
+ $(
35248
+ confirmationMode === "beta"
35249
+ ? "host-update-beta-run-btn"
35250
+ : "host-update-run-btn"
35251
+ )?.focus();
35018
35252
  }, 0);
35019
35253
  }
35020
35254
 
@@ -35023,44 +35257,74 @@ Waiting for Claude login output…</pre
35023
35257
  !hostPreferencesState.updateConfirmationVisible ||
35024
35258
  hostPreferencesState.updateRunning ||
35025
35259
  hostPreferencesState.updateChecking ||
35260
+ hostPreferencesState.betaUpdateChecking ||
35026
35261
  isOysterunUpdateOperationBlocking(hostPreferencesState.update)
35027
35262
  ) {
35028
35263
  return;
35029
35264
  }
35030
- const update = hostPreferencesState.update || {};
35031
- if (
35032
- update.update_supported !== true ||
35033
- update.update_available !== true
35034
- ) {
35265
+ const confirmationMode =
35266
+ hostPreferencesState.updateConfirmationMode === "beta"
35267
+ ? "beta"
35268
+ : "latest";
35269
+ const update =
35270
+ confirmationMode === "beta"
35271
+ ? hostPreferencesState.betaUpdate || {}
35272
+ : hostPreferencesState.update || {};
35273
+ const canRun =
35274
+ confirmationMode === "beta"
35275
+ ? update.update_supported === true &&
35276
+ update.install_available === true &&
35277
+ update.relation === "newer"
35278
+ : update.update_supported === true &&
35279
+ update.update_available === true;
35280
+ if (!canRun) {
35035
35281
  cancelOysterunUpdateConfirmation();
35036
35282
  return;
35037
35283
  }
35038
35284
  const targetVersion =
35039
- update.newest_version ||
35040
- update.latest_version ||
35285
+ (confirmationMode === "beta"
35286
+ ? update.beta_version || update.target_version
35287
+ : update.newest_version || update.latest_version) ||
35041
35288
  hostPreferencesState.updateConfirmationTargetVersion ||
35042
35289
  "the newest version";
35043
35290
  hostPreferencesState = {
35044
35291
  ...hostPreferencesState,
35045
35292
  updateConfirmationVisible: false,
35293
+ updateConfirmationMode: "",
35046
35294
  updateConfirmationCurrentVersion: "",
35047
35295
  updateConfirmationTargetVersion: "",
35048
35296
  updateRunning: true,
35049
35297
  updateStatus: "Installing...",
35298
+ betaUpdateStatus: confirmationMode === "beta" ? "Installing..." : "",
35050
35299
  updateError: "",
35300
+ betaUpdateError: "",
35051
35301
  };
35052
35302
  renderHostPreferences();
35053
35303
  try {
35054
- const data = await apiWithAuthRetry("POST", "/admin/update-run", {});
35055
- const normalized = normalizeOysterunUpdatePayload(data);
35304
+ const data = await apiWithAuthRetry(
35305
+ "POST",
35306
+ confirmationMode === "beta"
35307
+ ? "/admin/update-beta-run"
35308
+ : "/admin/update-run",
35309
+ {}
35310
+ );
35311
+ const normalized =
35312
+ confirmationMode === "beta"
35313
+ ? data
35314
+ : normalizeOysterunUpdatePayload(data);
35056
35315
  hostPreferencesState = {
35057
35316
  ...hostPreferencesState,
35058
- update: normalized,
35317
+ ...(confirmationMode === "beta"
35318
+ ? { betaUpdate: normalized }
35319
+ : { update: normalized }),
35059
35320
  restartRestore:
35060
35321
  normalized.restart_restore || hostPreferencesState.restartRestore,
35061
35322
  updateRunning: true,
35062
35323
  updateStatus: "Restarting...",
35324
+ betaUpdateStatus:
35325
+ confirmationMode === "beta" ? "Restarting..." : "",
35063
35326
  updateError: "",
35327
+ betaUpdateError: "",
35064
35328
  };
35065
35329
  renderHostPreferences();
35066
35330
  waitForOysterunUpdateReconnect({
@@ -35069,19 +35333,32 @@ Waiting for Claude login output…</pre
35069
35333
  normalized.newest_version ||
35070
35334
  targetVersion,
35071
35335
  startedAt: Date.now(),
35336
+ mode: confirmationMode,
35072
35337
  });
35073
35338
  } catch (err) {
35074
35339
  hostPreferencesState = {
35075
35340
  ...hostPreferencesState,
35076
35341
  updateRunning: false,
35077
35342
  updateStatus: "",
35078
- updateError: err.message || "Could not schedule update.",
35343
+ betaUpdateStatus: "",
35344
+ ...(confirmationMode === "beta"
35345
+ ? {
35346
+ betaUpdateError:
35347
+ err.message || "Could not schedule beta install.",
35348
+ }
35349
+ : {
35350
+ updateError: err.message || "Could not schedule update.",
35351
+ }),
35079
35352
  };
35080
35353
  renderHostPreferences();
35081
35354
  }
35082
35355
  }
35083
35356
 
35084
- function waitForOysterunUpdateReconnect({ targetVersion, startedAt }) {
35357
+ function waitForOysterunUpdateReconnect({
35358
+ targetVersion,
35359
+ startedAt,
35360
+ mode = "latest",
35361
+ }) {
35085
35362
  const deadline = startedAt + 120000;
35086
35363
  const poll = async () => {
35087
35364
  if (!token) return;
@@ -35097,30 +35374,53 @@ Waiting for Claude login output…</pre
35097
35374
  hostPreferencesState = {
35098
35375
  ...hostPreferencesState,
35099
35376
  update: data,
35377
+ ...(mode === "beta" && complete
35378
+ ? {
35379
+ betaUpdate: {
35380
+ ...(hostPreferencesState.betaUpdate || {}),
35381
+ current_version: observedVersion,
35382
+ beta_version: targetVersion,
35383
+ target_version: targetVersion,
35384
+ relation: "installed",
35385
+ install_available: false,
35386
+ },
35387
+ }
35388
+ : {}),
35100
35389
  updateRunning: !complete && Date.now() < deadline,
35101
35390
  updateStatus: complete
35102
- ? `Oysterun updated to ${observedVersion || targetVersion}.`
35391
+ ? mode === "beta"
35392
+ ? ""
35393
+ : `Oysterun updated to ${observedVersion || targetVersion}.`
35103
35394
  : Date.now() >= deadline
35104
35395
  ? "Verifying..."
35105
35396
  : operation.phase || "Verifying...",
35106
35397
  updateError: "",
35398
+ betaUpdateStatus:
35399
+ mode === "beta" && complete
35400
+ ? `Oysterun beta ${
35401
+ observedVersion || targetVersion
35402
+ } is installed.`
35403
+ : hostPreferencesState.betaUpdateStatus,
35404
+ betaUpdateError: "",
35107
35405
  };
35108
35406
  renderHostPreferences();
35109
35407
  if (complete) {
35110
- dismissOysterunUpdateReminder();
35111
- window.setTimeout(() => {
35112
- if (
35113
- hostPreferencesState.updateStatus?.startsWith(
35114
- "Oysterun updated to "
35115
- )
35116
- ) {
35117
- hostPreferencesState = {
35118
- ...hostPreferencesState,
35119
- updateStatus: "Oysterun is up to date.",
35120
- };
35121
- renderHostPreferences();
35122
- }
35123
- }, 30000);
35408
+ if (mode !== "beta") {
35409
+ dismissOysterunUpdateReminder();
35410
+ window.setTimeout(() => {
35411
+ if (
35412
+ hostPreferencesState.updateStatus?.startsWith(
35413
+ "Oysterun updated to "
35414
+ )
35415
+ ) {
35416
+ hostPreferencesState = {
35417
+ ...hostPreferencesState,
35418
+ updateStatus: "Oysterun is up to date.",
35419
+ };
35420
+ renderHostPreferences();
35421
+ }
35422
+ }, 30000);
35423
+ }
35124
35424
  return;
35125
35425
  }
35126
35426
  } catch {
@@ -35564,6 +35864,45 @@ Waiting for Claude login output…</pre
35564
35864
  });
35565
35865
  }
35566
35866
 
35867
+ async function runOysterunBetaUpdate() {
35868
+ if (
35869
+ hostPreferencesState.debugHostPreferencesBetaUpdateEnabled !== true ||
35870
+ hostPreferencesState.updateRunning ||
35871
+ hostPreferencesState.updateChecking ||
35872
+ hostPreferencesState.betaUpdateChecking ||
35873
+ isOysterunUpdateOperationBlocking(hostPreferencesState.update)
35874
+ ) {
35875
+ return;
35876
+ }
35877
+ const betaUpdate = hostPreferencesState.betaUpdate || {};
35878
+ if (
35879
+ betaUpdate.update_supported !== true ||
35880
+ betaUpdate.install_available !== true ||
35881
+ betaUpdate.relation !== "newer"
35882
+ ) {
35883
+ return;
35884
+ }
35885
+ const targetVersion =
35886
+ betaUpdate.beta_version || betaUpdate.target_version;
35887
+ if (!targetVersion) return;
35888
+ hostPreferencesState = {
35889
+ ...hostPreferencesState,
35890
+ updateConfirmationVisible: true,
35891
+ updateConfirmationMode: "beta",
35892
+ updateConfirmationCurrentVersion:
35893
+ betaUpdate.current_version || "the current version",
35894
+ updateConfirmationTargetVersion: targetVersion,
35895
+ betaUpdateStatus: "Confirm Beta Install & Restart to continue.",
35896
+ betaUpdateError: "",
35897
+ updateStatus: "",
35898
+ updateError: "",
35899
+ };
35900
+ renderHostPreferences();
35901
+ window.setTimeout(() => {
35902
+ $("host-update-confirm-run-btn")?.focus();
35903
+ }, 0);
35904
+ }
35905
+
35567
35906
  async function finalizeStartedSession(data, opts = {}) {
35568
35907
  const attemptId = opts.attemptId ?? createSubmitState.activeAttemptId;
35569
35908
  if (!isCurrentCreateAttempt(attemptId)) return false;
@@ -49020,6 +49359,7 @@ Waiting for Claude login output…</pre
49020
49359
  window.restartHostFromPreferences = restartHostFromPreferences;
49021
49360
  window.checkOysterunUpdate = checkOysterunUpdate;
49022
49361
  window.runOysterunUpdate = runOysterunUpdate;
49362
+ window.runOysterunBetaUpdate = runOysterunBetaUpdate;
49023
49363
  window.cancelOysterunUpdateConfirmation =
49024
49364
  cancelOysterunUpdateConfirmation;
49025
49365
  window.confirmOysterunUpdateRestart = confirmOysterunUpdateRestart;
@@ -1,4 +1,4 @@
1
- import{g as ee,c as Y,r as K,j as Z}from"./index-BRrMvB8k.js";var X={exports:{}};(function(e){var t=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};/**
1
+ import{g as ee,c as Y,r as K,j as Z}from"./index-GA-8pt0s.js";var X={exports:{}};(function(e){var t=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};/**
2
2
  * Prism: Lightweight, robust, elegant syntax highlighting
3
3
  *
4
4
  * @license MIT <https://opensource.org/licenses/MIT>