@yansigit/opencodex 2.36.1-dev.20260829.42 → 2.36.1-dev.20260829.48

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 (51) hide show
  1. package/gui/dist/assets/{ApiKeys-C_cz6Rww.js → ApiKeys-LOOFiZfv.js} +1 -1
  2. package/gui/dist/assets/{Claude-ofGguLfF.js → Claude-BwKzpXe3.js} +1 -1
  3. package/gui/dist/assets/{CodexSet-fhGiVwxe.js → CodexSet-B5qi9KeE.js} +1 -1
  4. package/gui/dist/assets/{FileIntegrationPage-B-dI69Kn.js → FileIntegrationPage-B0sUef6W.js} +1 -1
  5. package/gui/dist/assets/{Grok-CgkBu_Sm.js → Grok-bsb4n-f4.js} +1 -1
  6. package/gui/dist/assets/{Integrations-CTWMNzkD.js → Integrations-CSMwFDvM.js} +2 -2
  7. package/gui/dist/assets/{IntegrationsOverview-BKZ0dZnj.js → IntegrationsOverview-CTORdKJA.js} +1 -1
  8. package/gui/dist/assets/{Logs-6r90C0x4.js → Logs-BWYbfELf.js} +1 -1
  9. package/gui/dist/assets/{Models-CpcS1zZr.js → Models-CexEtdT1.js} +1 -1
  10. package/gui/dist/assets/{NumberStepper-C70ttiJY.js → NumberStepper-BapSFQnW.js} +1 -1
  11. package/gui/dist/assets/{Providers-BROTzuSF.js → Providers-BwUFeAgA.js} +1 -1
  12. package/gui/dist/assets/{RestoreDialog-DR5vgFXB.js → RestoreDialog-CD8piq90.js} +1 -1
  13. package/gui/dist/assets/{Startup-BSoZDYbS.js → Startup-BgX731C2.js} +1 -1
  14. package/gui/dist/assets/{Storage-CUvBwbeB.js → Storage-Bgq7HphP.js} +1 -1
  15. package/gui/dist/assets/{Subagents-CYu3_DBt.js → Subagents-ChxItbeF.js} +1 -1
  16. package/gui/dist/assets/{Usage-BV36sd7V.js → Usage-BkylzP50.js} +1 -1
  17. package/gui/dist/assets/{data-surface-DhcMe0J_.js → data-surface-pCXChiBf.js} +1 -1
  18. package/gui/dist/assets/{index-DnuNKc0D.js → index-CNopOid3.js} +2 -2
  19. package/gui/dist/assets/{model-display-BPrQ7F3P.js → model-display-CiUpg8T9.js} +1 -1
  20. package/gui/dist/assets/{provider-payload-CMb37zWF.js → provider-payload-b2jlS-On.js} +1 -1
  21. package/gui/dist/index.html +1 -1
  22. package/package.json +1 -1
  23. package/src/cli/agent.ts +19 -2
  24. package/src/cli/config-command.ts +7 -3
  25. package/src/cli/init.ts +2 -2
  26. package/src/cli/provider.ts +58 -74
  27. package/src/cli/registry.ts +1 -1
  28. package/src/codex/catalog.ts +1 -1
  29. package/src/codex/convergence.ts +110 -15
  30. package/src/codex/inject.ts +2 -0
  31. package/src/codex/subagent-defaults.ts +1 -8
  32. package/src/codex/subagent-model-authority.ts +189 -0
  33. package/src/config.ts +209 -11
  34. package/src/generated/compatibility-version.json +35 -27
  35. package/src/oauth/index.ts +143 -82
  36. package/src/oauth/login-cli.ts +53 -11
  37. package/src/providers/alibaba-region-startup.ts +31 -11
  38. package/src/providers/api-keys.ts +58 -34
  39. package/src/providers/key-failover.ts +59 -46
  40. package/src/providers/model-rename-startup.ts +25 -7
  41. package/src/providers/openai-tier-startup.ts +38 -14
  42. package/src/server/index.ts +10 -0
  43. package/src/server/management/agent-settings-routes.ts +12 -0
  44. package/src/server/management/context.ts +10 -3
  45. package/src/server/management/logs-usage-routes.ts +19 -16
  46. package/src/server/management/model-routes.ts +284 -165
  47. package/src/server/management/oauth-account-routes.ts +93 -15
  48. package/src/server/management/provider-routes.ts +200 -87
  49. package/src/server/responses/collaboration.ts +1 -1
  50. package/src/storage/policy-input.ts +166 -0
  51. package/src/storage/policy.ts +59 -211
package/src/config.ts CHANGED
@@ -96,7 +96,6 @@ import {
96
96
  isValidCost4Rate,
97
97
  refreshPreservedProviderOwner,
98
98
  refreshUserCostOverlays,
99
- withPreservedDiskOnlyProviders,
100
99
  } from "./usage/user-cost-overlays";
101
100
  import { MAX_COST4_RATE } from "./usage/expected-prices";
102
101
  import {
@@ -106,6 +105,8 @@ import {
106
105
  } from "./lib/app-owned-memory";
107
106
  import { isHostedToolUnsupportedForModel } from "./responses/hosted-tool-policy";
108
107
  import {
108
+ AtomicWriteResidualTempError,
109
+ AtomicWriteSecretResidualError,
109
110
  atomicWriteFile,
110
111
  isMissingPathError,
111
112
  nextAtomicTempSequence,
@@ -2732,23 +2733,34 @@ export const withExpectedConfigGenerationSync: WithExpectedConfigGenerationSync
2732
2733
  * cost-overlay registry from the persisted config so runtime estimates follow
2733
2734
  * every save path.
2734
2735
  */
2735
- function persistConfigUnlocked(config: OcxConfig): boolean {
2736
+ type PersistConfigAuthority = "ordinary" | "mutation" | "replacement";
2737
+
2738
+ function persistConfigUnlocked(config: OcxConfig, authority: PersistConfigAuthority = "ordinary"): boolean {
2736
2739
  const configPath = getConfigPath();
2737
2740
  // Check the resolved file target before reading it: a symlink can point from an
2738
2741
  // isolated test home into the protected real home, where another write guard
2739
2742
  // must not mask this refusal based on the target's current contents.
2740
2743
  assertNotRealHomeUnderTest(dirname(resolveWriteTarget(configPath)));
2741
2744
  const raw = readRawConfigJson();
2742
- if (raw && configNeedsProviderRepair(raw)) {
2745
+ if (authority !== "replacement" && raw && configNeedsProviderRepair(raw)) {
2743
2746
  throw new Error("refusing to overwrite a config repaired with defaults; fix the persisted config first");
2744
2747
  }
2745
- // External editors can add provider rows the live config deliberately does
2746
- // not route with yet; merge them at the serialization boundary so an
2747
- // unrelated in-process save cannot erase the provider or its overlay.
2748
- // Provider preservation reads symbol-keyed live-owner state, which structuredClone
2749
- // intentionally drops. Resolve that ownership before projecting JSON provenance.
2748
+ const snapshot = readConfigFileSnapshot();
2749
+ if (authority !== "replacement" && snapshot.diagnostics.source === "fallback") {
2750
+ throw new Error("refusing to overwrite an invalid persisted config; fix the persisted config first");
2751
+ }
2752
+ // Automatic whole-config writes own non-provider settings only. A valid disk
2753
+ // registry is authoritative; explicit locked mutations pass replacement
2754
+ // authority for intentional provider/default changes.
2755
+ const base = snapshot.diagnostics.source === "file" && authority === "ordinary"
2756
+ ? {
2757
+ ...config,
2758
+ providers: snapshot.diagnostics.config.providers,
2759
+ defaultProvider: snapshot.diagnostics.config.defaultProvider,
2760
+ }
2761
+ : config;
2750
2762
  const provenanceProjection = projectConfigRebaseProvenance(config);
2751
- const persisted = withPreservedDiskOnlyProviders(config);
2763
+ const persisted = base;
2752
2764
  if (provenanceProjection.configRebaseProvenance === undefined) delete persisted.configRebaseProvenance;
2753
2765
  else persisted.configRebaseProvenance = provenanceProjection.configRebaseProvenance;
2754
2766
  const bytes = JSON.stringify(persisted, null, 2) + "\n";
@@ -2790,6 +2802,183 @@ export function saveConfig(config: OcxConfig): void {
2790
2802
  });
2791
2803
  }
2792
2804
 
2805
+ /** Replace a validated config under the shared lock for confirmed import/init flows. */
2806
+ export function replacePersistedConfig(config: OcxConfig): void {
2807
+ assertNotRealHomeUnderTest(getConfigDir());
2808
+ withConfigMutationLockSync(() => {
2809
+ const projected = projectCustomModelCatalogMigration(
2810
+ readRawConfigJson(),
2811
+ projectConfigRebaseProvenance(config),
2812
+ );
2813
+ if (persistConfigUnlocked(projected, "replacement")) bumpGenerationForCooperatingConfigWrite();
2814
+ adoptCustomModelCatalogMigration(config, projected);
2815
+ if (projected.configRebaseProvenance === undefined) delete config.configRebaseProvenance;
2816
+ else config.configRebaseProvenance = structuredClone(projected.configRebaseProvenance);
2817
+ clearPendingConfigTopLevelDeletions(config);
2818
+ });
2819
+ }
2820
+
2821
+ export type PersistedConfigInitializationOutcome = "created" | "exists" | "invalid";
2822
+
2823
+ export class PersistedConfigInitializationCleanupError extends Error {
2824
+ constructor(options?: ErrorOptions) {
2825
+ super("Initial config publication cleanup failed after rollback", options);
2826
+ this.name = "PersistedConfigInitializationCleanupError";
2827
+ }
2828
+ }
2829
+
2830
+ export class PersistedConfigInitializationRollbackError extends Error {
2831
+ constructor(options?: ErrorOptions) {
2832
+ super("Initial config publication rollback failed", options);
2833
+ this.name = "PersistedConfigInitializationRollbackError";
2834
+ }
2835
+ }
2836
+
2837
+ export interface PersistedConfigInitializationIO {
2838
+ createExclusive(path: string): void;
2839
+ write(path: string, bytes: string): void;
2840
+ harden(path: string): void;
2841
+ publishNoReplace(temp: string, target: string): void;
2842
+ truncate(path: string): void;
2843
+ unlink(path: string): void;
2844
+ }
2845
+
2846
+ let persistedConfigInitializationBeforePublishForTests: (() => void) | null = null;
2847
+
2848
+ /** Test-only one-shot seam: create a competing config after staging, before no-replace publication. */
2849
+ export function setPersistedConfigInitializationBeforePublishForTests(hook: (() => void) | null): void {
2850
+ persistedConfigInitializationBeforePublishForTests = hook;
2851
+ }
2852
+
2853
+ function publishInitialConfigNoReplace(
2854
+ config: OcxConfig,
2855
+ io: PersistedConfigInitializationIO,
2856
+ ): boolean {
2857
+ const configPath = getConfigPath();
2858
+ const target = resolveWriteTarget(configPath);
2859
+ assertNotRealHomeUnderTest(dirname(target));
2860
+ recordOwnedConfigPath(getConfigDir(), configPath);
2861
+ const persisted = projectConfigRebaseProvenance(config);
2862
+ const bytes = JSON.stringify(persisted, null, 2) + "\n";
2863
+ const temp = `${target}.ocx.${process.pid}.${nextAtomicTempSequence()}.tmp`;
2864
+ let staged = false;
2865
+ let hardened = false;
2866
+ let published = false;
2867
+ let cleanupAttempted = false;
2868
+
2869
+ const scrubUnpublishedTemp = (cause?: unknown): void => {
2870
+ cleanupAttempted = true;
2871
+ let scrubbed = false;
2872
+ try {
2873
+ io.truncate(temp);
2874
+ scrubbed = true;
2875
+ } catch (error) {
2876
+ if (isMissingPathError(error)) scrubbed = true;
2877
+ else {
2878
+ try { io.write(temp, ""); scrubbed = true; } catch { /* removal may still succeed */ }
2879
+ }
2880
+ }
2881
+ let removed = false;
2882
+ try {
2883
+ io.unlink(temp);
2884
+ removed = true;
2885
+ } catch (error) {
2886
+ if (isMissingPathError(error)) removed = true;
2887
+ else {
2888
+ try { io.unlink(temp); removed = true; }
2889
+ catch (retryError) { if (isMissingPathError(retryError)) removed = true; }
2890
+ }
2891
+ }
2892
+ if (removed) forgetEphemeralSecretPath(temp);
2893
+ if (!removed && !scrubbed) throw new AtomicWriteSecretResidualError(temp, { cause });
2894
+ if (!removed) throw new AtomicWriteResidualTempError(temp, hardened, { cause });
2895
+ };
2896
+
2897
+ try {
2898
+ io.createExclusive(temp);
2899
+ staged = true;
2900
+ io.write(temp, bytes);
2901
+ io.harden(temp);
2902
+ hardened = true;
2903
+ const hook = persistedConfigInitializationBeforePublishForTests;
2904
+ persistedConfigInitializationBeforePublishForTests = null;
2905
+ hook?.();
2906
+ try {
2907
+ io.publishNoReplace(temp, target);
2908
+ } catch (cause) {
2909
+ if (!isAlreadyExistsError(cause)) throw cause;
2910
+ scrubUnpublishedTemp(cause);
2911
+ return false;
2912
+ }
2913
+ published = true;
2914
+ try {
2915
+ io.unlink(temp);
2916
+ forgetEphemeralSecretPath(temp);
2917
+ } catch (firstError) {
2918
+ if (isMissingPathError(firstError)) {
2919
+ forgetEphemeralSecretPath(temp);
2920
+ } else try {
2921
+ io.unlink(temp);
2922
+ forgetEphemeralSecretPath(temp);
2923
+ } catch (secondError) {
2924
+ if (isMissingPathError(secondError)) {
2925
+ forgetEphemeralSecretPath(temp);
2926
+ } else {
2927
+ // Both names point to one inode. Remove the published name before scrubbing.
2928
+ try { io.unlink(target); }
2929
+ catch (cause) { throw new PersistedConfigInitializationRollbackError({ cause }); }
2930
+ published = false;
2931
+ scrubUnpublishedTemp(secondError);
2932
+ throw new PersistedConfigInitializationCleanupError({ cause: secondError });
2933
+ }
2934
+ }
2935
+ }
2936
+ refreshUserCostOverlays(persisted);
2937
+ return true;
2938
+ } catch (cause) {
2939
+ if (staged && !published && !cleanupAttempted) scrubUnpublishedTemp(cause);
2940
+ throw cause;
2941
+ }
2942
+ }
2943
+
2944
+ function defaultPersistedConfigInitializationIO(configPath: string): PersistedConfigInitializationIO {
2945
+ return {
2946
+ createExclusive: target => { writeFileSync(target, "", { flag: "wx", mode: 0o600 }); },
2947
+ write: (target, bytes) => writeFileSync(target, bytes),
2948
+ harden: target => {
2949
+ try { chmodSync(target, 0o600); } catch { /* platform may ignore chmod */ }
2950
+ if (process.platform === "win32") hardenSecretPath(target, { required: true, timeoutMemoKey: configPath });
2951
+ },
2952
+ publishNoReplace: (temp, target) => linkSync(temp, target),
2953
+ truncate: target => truncateSync(target, 0),
2954
+ unlink: unlinkSync,
2955
+ };
2956
+ }
2957
+
2958
+ /** Create the initial config under the shared lock, but never replace existing bytes. */
2959
+ export function initializePersistedConfigIfMissing(
2960
+ config: OcxConfig,
2961
+ io = defaultPersistedConfigInitializationIO(getConfigPath()),
2962
+ ): PersistedConfigInitializationOutcome {
2963
+ assertNotRealHomeUnderTest(getConfigDir());
2964
+ return withConfigMutationLockSync(() => {
2965
+ const snapshot = readConfigFileSnapshot();
2966
+ if (snapshot.diagnostics.source === "file") return "exists";
2967
+ if (snapshot.diagnostics.source !== "default") return "invalid";
2968
+ const projected = projectCustomModelCatalogMigration(
2969
+ readRawConfigJson(),
2970
+ projectConfigRebaseProvenance(config),
2971
+ );
2972
+ if (!publishInitialConfigNoReplace(projected, io)) {
2973
+ const winner = readConfigFileSnapshot();
2974
+ return winner.diagnostics.source === "file" ? "exists" : "invalid";
2975
+ }
2976
+ bumpGenerationForCooperatingConfigWrite();
2977
+ adoptCustomModelCatalogMigration(config, projected);
2978
+ return "created";
2979
+ });
2980
+ }
2981
+
2793
2982
  export type PersistedConfigMutation<T> = {
2794
2983
  changed: boolean;
2795
2984
  value: T;
@@ -2799,6 +2988,13 @@ export type PersistedConfigMutationOutcome<T> =
2799
2988
  | { status: "committed" | "unchanged"; value: T }
2800
2989
  | { status: "unavailable"; reason: "missing" | "invalid" | "conflict" };
2801
2990
 
2991
+ export class ConfigMutationValidationError extends Error {
2992
+ constructor(readonly validationError: string) {
2993
+ super(`Config mutation rejected: ${validationError}`);
2994
+ this.name = "ConfigMutationValidationError";
2995
+ }
2996
+ }
2997
+
2802
2998
  const CONFIG_MUTATION_MAX_REBASE_ATTEMPTS = 3;
2803
2999
  let persistedConfigMutationBeforeCommitForTests: (() => void) | null = null;
2804
3000
 
@@ -2871,7 +3067,9 @@ export function mutatePersistedConfig<T>(
2871
3067
  commitBase.diagnostics.config,
2872
3068
  confirmedConfig,
2873
3069
  );
2874
- if (persistConfigUnlocked(projected)) bumpGenerationForCooperatingConfigWrite();
3070
+ const validation = validateConfigCandidate(projected);
3071
+ if (!validation.ok) throw new ConfigMutationValidationError(validation.error);
3072
+ if (persistConfigUnlocked(projected, "mutation")) bumpGenerationForCooperatingConfigWrite();
2875
3073
  return { status: "committed", value: confirmed.value };
2876
3074
  }
2877
3075
  return { status: "unavailable", reason: "conflict" };
@@ -3193,7 +3391,7 @@ function readPersistedServerBinding(
3193
3391
  * conflict keeps the live value;
3194
3392
  * - a provider or custom-model row deleted on disk stays deleted even if stale
3195
3393
  * live state edited that same row;
3196
- * - file missing/unreadable → save what we have, no throw.
3394
+ * - missing file → save what we have; invalid existing file → fail closed.
3197
3395
  *
3198
3396
  * Custom-model rows are merged by their stable `id`, preserving independent
3199
3397
  * edits and deletions across stale whole-config saves.
@@ -10,7 +10,7 @@
10
10
  },
11
11
  {
12
12
  "path": "package.json",
13
- "sha256": "2f5a421719b3d052a71a69af74f225ff812e3168681e71687faae37846e50f90"
13
+ "sha256": "c223c9a248049f4e19e7dee2837311746d85ba6e2b79498d6b1a3b07a2201c03"
14
14
  },
15
15
  {
16
16
  "path": "scripts/model-metadata.source.json",
@@ -486,7 +486,7 @@
486
486
  },
487
487
  {
488
488
  "path": "src/cli/agent.ts",
489
- "sha256": "549c31a1ffe8e856094e0db1eb376e9b82d6b5f3763edd2e410acc403dadb771"
489
+ "sha256": "3caa13112d1023cafefc56addb66d7e36fcb05b1b71a29caf675a7893d69d574"
490
490
  },
491
491
  {
492
492
  "path": "src/cli/alias.ts",
@@ -526,7 +526,7 @@
526
526
  },
527
527
  {
528
528
  "path": "src/cli/config-command.ts",
529
- "sha256": "fa4b09ccb9a24384520818d11510f0400679597ee2936bc180a2555c329689bc"
529
+ "sha256": "1fbca0cbbdfbdab499c354f4e76d063b709ee7da99ad2334061bea580506a04c"
530
530
  },
531
531
  {
532
532
  "path": "src/cli/debug.ts",
@@ -558,7 +558,7 @@
558
558
  },
559
559
  {
560
560
  "path": "src/cli/init.ts",
561
- "sha256": "9eeb5b5916c35f5c3994b6ef3dd6e230b30c05605c7d463ff0a604635639cef2"
561
+ "sha256": "ced149008c298c1167f8e710055ec5a293522e81dcc9e3bba2c8049dd32d3ec5"
562
562
  },
563
563
  {
564
564
  "path": "src/cli/integrations.ts",
@@ -606,7 +606,7 @@
606
606
  },
607
607
  {
608
608
  "path": "src/cli/provider.ts",
609
- "sha256": "8cb7c9364cdb40989af7ee267c87c5b3e04e6557cbad91c428074cd4a461bb5e"
609
+ "sha256": "51f3110937eb259c93e5e04d4a1cdb07b0d546be8c8adcc9c1a410f728265d2c"
610
610
  },
611
611
  {
612
612
  "path": "src/cli/ready.ts",
@@ -614,7 +614,7 @@
614
614
  },
615
615
  {
616
616
  "path": "src/cli/registry.ts",
617
- "sha256": "a90b57f449e91d67a409abb89ad8126c97f899b82930de18c205bf5553753f77"
617
+ "sha256": "66f2c0dad2451db553e7e0ae7905c78c3261e8ce2d76684d358a7148ab1582c9"
618
618
  },
619
619
  {
620
620
  "path": "src/cli/replit-gateway-key-input.ts",
@@ -766,7 +766,7 @@
766
766
  },
767
767
  {
768
768
  "path": "src/codex/catalog.ts",
769
- "sha256": "2916321bbfbd26112dc816055a452348251a1b65a2a2535b089c9135c690499a"
769
+ "sha256": "9e7af66b04e8718f4b7bf822994941a06b4135253a98668963e77bd88c9c3076"
770
770
  },
771
771
  {
772
772
  "path": "src/codex/catalog/account-models.ts",
@@ -826,7 +826,7 @@
826
826
  },
827
827
  {
828
828
  "path": "src/codex/convergence.ts",
829
- "sha256": "dfb4a900ca40eb4e112f5fd1b9ed73058301b0c6533a7a6d210b80aeef62c3ab"
829
+ "sha256": "f6ae4b0bdacfc59e9227d8bf3b5f118d9264abb1ec8224c8dc1203bcfacadf8e"
830
830
  },
831
831
  {
832
832
  "path": "src/codex/coordinator-doctor.ts",
@@ -898,7 +898,7 @@
898
898
  },
899
899
  {
900
900
  "path": "src/codex/inject.ts",
901
- "sha256": "fed0dd2913d0ca07fb8486a91e74411dce65ca96fb8ca989e4fca0984e71f14e"
901
+ "sha256": "22fe9dc3b8fe3994b921ad619807b899e609834ea69e47c5b9494075327341a2"
902
902
  },
903
903
  {
904
904
  "path": "src/codex/injected-marker.ts",
@@ -1098,7 +1098,11 @@
1098
1098
  },
1099
1099
  {
1100
1100
  "path": "src/codex/subagent-defaults.ts",
1101
- "sha256": "08e3efa192430891d9d221d41e5124177c2c03656e3eb832087fdfb778a7703e"
1101
+ "sha256": "c2683dd65ab7565c703e6637c5aa6c22c6a937d264e369efabb3eddabe7ba88a"
1102
+ },
1103
+ {
1104
+ "path": "src/codex/subagent-model-authority.ts",
1105
+ "sha256": "09928c56938d711365c324653e5870fc9f7aad021abae20e7d7a7ad870e52053"
1102
1106
  },
1103
1107
  {
1104
1108
  "path": "src/codex/subagent-model-fallback.ts",
@@ -1166,7 +1170,7 @@
1166
1170
  },
1167
1171
  {
1168
1172
  "path": "src/config.ts",
1169
- "sha256": "f5fb76e03c8e27883d2522cf78daf7ef4643e36625e126683d470f4f7616d3f8"
1173
+ "sha256": "ab945b93888473c8165ca9cfe43b5ddca53c01d6de26b5c76b89903471aa7e24"
1170
1174
  },
1171
1175
  {
1172
1176
  "path": "src/config/atomic-write.ts",
@@ -2174,7 +2178,7 @@
2174
2178
  },
2175
2179
  {
2176
2180
  "path": "src/oauth/index.ts",
2177
- "sha256": "d2891b2d232f7c4821e6a83860f335a6179e82b7f4f58d840bd2be8e5e8ba701"
2181
+ "sha256": "608e24a1883561d5638e21aa0cc66530c512e37afbf2917c9510c5ee19fac6b3"
2178
2182
  },
2179
2183
  {
2180
2184
  "path": "src/oauth/key-providers.ts",
@@ -2202,7 +2206,7 @@
2202
2206
  },
2203
2207
  {
2204
2208
  "path": "src/oauth/login-cli.ts",
2205
- "sha256": "7d98c1b8e45a36d367e7019733c8975f7fe562db2fb71f40798aa04c59f6bec0"
2209
+ "sha256": "331024c25a8e2df86879dfa465b905bc35c5157b21f1da711c82618cb9f5e4c5"
2206
2210
  },
2207
2211
  {
2208
2212
  "path": "src/oauth/nous.ts",
@@ -2242,7 +2246,7 @@
2242
2246
  },
2243
2247
  {
2244
2248
  "path": "src/providers/alibaba-region-startup.ts",
2245
- "sha256": "310b2a0575bdaea6bd7fb5d5ac8dba1228f8e383e258755b7e93c72f7ef01ec1"
2249
+ "sha256": "0915c6e813c955ddefbd610891a4d91e546f904aaf7777514563a66bff0b5cbe"
2246
2250
  },
2247
2251
  {
2248
2252
  "path": "src/providers/antigravity-models.ts",
@@ -2254,7 +2258,7 @@
2254
2258
  },
2255
2259
  {
2256
2260
  "path": "src/providers/api-keys.ts",
2257
- "sha256": "23d44706556147475ff87a71f409afcd201b656d3c62cb750a4cb6c60df44e80"
2261
+ "sha256": "36e2b59bf5b61ef601426d507c09acd9df09854405c8c4dfda0afb9829709be8"
2258
2262
  },
2259
2263
  {
2260
2264
  "path": "src/providers/auto-compact-budget.ts",
@@ -2306,7 +2310,7 @@
2306
2310
  },
2307
2311
  {
2308
2312
  "path": "src/providers/key-failover.ts",
2309
- "sha256": "56ad909cc9007b644a737f0283fc4d4ae2819794446fa278187abd7841322904"
2313
+ "sha256": "60bb2974bdda5825ad54974617c688139fceaa1c9d9b0d107fc06f8ba30ccc46"
2310
2314
  },
2311
2315
  {
2312
2316
  "path": "src/providers/kiro-models.ts",
@@ -2334,7 +2338,7 @@
2334
2338
  },
2335
2339
  {
2336
2340
  "path": "src/providers/model-rename-startup.ts",
2337
- "sha256": "8a143284d736759bf63c8cb296c19e61dec9596dfc781d8dd87038778153f55f"
2341
+ "sha256": "6a98ec00772e7b45c056d7c4161a454cceeaa9780de58ca5e89b674c6cc58ca5"
2338
2342
  },
2339
2343
  {
2340
2344
  "path": "src/providers/new-model-policy.ts",
@@ -2346,7 +2350,7 @@
2346
2350
  },
2347
2351
  {
2348
2352
  "path": "src/providers/openai-tier-startup.ts",
2349
- "sha256": "41256c1ef4b2271168a52dcfb3ab986077cfa8edc0386230a01f5b196155ca42"
2353
+ "sha256": "cb2631ad03a7727d34e7df97137848514b114790bb94276d71729efe9d605815"
2350
2354
  },
2351
2355
  {
2352
2356
  "path": "src/providers/openai-tiers.ts",
@@ -2682,7 +2686,7 @@
2682
2686
  },
2683
2687
  {
2684
2688
  "path": "src/server/index.ts",
2685
- "sha256": "e39a7d1b9812bdf91677f27be4b4ef0a486015170f41e69fb3d8c330970f0aba"
2689
+ "sha256": "748a821368960a58228937a15582cb05a087bcc438849d367dc74c05eb5dbf6c"
2686
2690
  },
2687
2691
  {
2688
2692
  "path": "src/server/lifecycle.ts",
@@ -2710,7 +2714,7 @@
2710
2714
  },
2711
2715
  {
2712
2716
  "path": "src/server/management/agent-settings-routes.ts",
2713
- "sha256": "2ba31a9adb7ba798a7a9fdeada3a2430ad2497205ec3671f4c3a5bfbab68f8c5"
2717
+ "sha256": "8046634493d0317a25b283e5ffa0007cf3a54dadcda5b6e7e7dcf83743f718bc"
2714
2718
  },
2715
2719
  {
2716
2720
  "path": "src/server/management/api-access.ts",
@@ -2738,7 +2742,7 @@
2738
2742
  },
2739
2743
  {
2740
2744
  "path": "src/server/management/context.ts",
2741
- "sha256": "48b53d840a12a08da2e22864d209099bb3832d9571360899f670956ed0e2a5fa"
2745
+ "sha256": "13dfe2bb83ddc157d53b5e5e9340a677d9a80fbf0209f63d8598a8e9da44f269"
2742
2746
  },
2743
2747
  {
2744
2748
  "path": "src/server/management/integration-routes.ts",
@@ -2754,11 +2758,11 @@
2754
2758
  },
2755
2759
  {
2756
2760
  "path": "src/server/management/logs-usage-routes.ts",
2757
- "sha256": "24f5aec4c42a7ae0460d60acab8242facaa1b8f27d67d96f22ebb439a85955c2"
2761
+ "sha256": "77bd7f6ffef94bea9b11a5c0bdefb30cce9d6c69a4bea0281db7e71ad1a48cbc"
2758
2762
  },
2759
2763
  {
2760
2764
  "path": "src/server/management/model-routes.ts",
2761
- "sha256": "eaa34ed610ea3651c48d36b47f1b34eaf7ac74b33ccfff1f5852f809d71845f2"
2765
+ "sha256": "5651f71ad65fcc46d74176aa6119393ef074502e1b6c6d29a235c294850cd594"
2762
2766
  },
2763
2767
  {
2764
2768
  "path": "src/server/management/model-rows.ts",
@@ -2770,7 +2774,7 @@
2770
2774
  },
2771
2775
  {
2772
2776
  "path": "src/server/management/oauth-account-routes.ts",
2773
- "sha256": "2fd9233cd2994161950747fc771e67a5724d1a961ff474fd0cd2e4693638938f"
2777
+ "sha256": "29050746283e3fd553e0de399fda85cbc9b0760e25e0dc3ba8e6fdbc4b33c7f6"
2774
2778
  },
2775
2779
  {
2776
2780
  "path": "src/server/management/provider-capability-config.ts",
@@ -2778,7 +2782,7 @@
2778
2782
  },
2779
2783
  {
2780
2784
  "path": "src/server/management/provider-routes.ts",
2781
- "sha256": "5e9d3b6985b2e498034a4d06336be2de6a6d77ddab7dc794ed3eb2979bd4ce25"
2785
+ "sha256": "7abf9c86655670bc2de1383577b85e1a4cac5e92447d2a77421820e3126a2d97"
2782
2786
  },
2783
2787
  {
2784
2788
  "path": "src/server/management/replit-provider-routes.ts",
@@ -2934,7 +2938,7 @@
2934
2938
  },
2935
2939
  {
2936
2940
  "path": "src/server/responses/collaboration.ts",
2937
- "sha256": "c06f21efd00814eb1021b73e4fe16e693a93205768f8f1a55c63e854e657075d"
2941
+ "sha256": "614afac38832befe772e6b59f6dedd3dfd44546a8f48ea2660fdcb0f9f1c089f"
2938
2942
  },
2939
2943
  {
2940
2944
  "path": "src/server/responses/combo-stream-preflight.ts",
@@ -3076,6 +3080,10 @@
3076
3080
  "path": "src/storage/cleanup.ts",
3077
3081
  "sha256": "2a90e83983c7da9bdb2ac0134870dd7ba85d4469237fae798c60b34985c8e554"
3078
3082
  },
3083
+ {
3084
+ "path": "src/storage/policy-input.ts",
3085
+ "sha256": "94537ac1a988156404ab598c644ed86f2ffac3b286ad73cbf5d84f5ee5b07f35"
3086
+ },
3079
3087
  {
3080
3088
  "path": "src/storage/policy-job.ts",
3081
3089
  "sha256": "4fa9f2297feb1a9404af6173adbf875c19f5e79f4b1aca0056744e83d503ad8a"
@@ -3090,7 +3098,7 @@
3090
3098
  },
3091
3099
  {
3092
3100
  "path": "src/storage/policy.ts",
3093
- "sha256": "93050c0be848f0df9c7114d903272738fb817b62fb0cdd9d7a59e55b9b267601"
3101
+ "sha256": "aaefd080cf74c38596134ac4a62ef16128c090b38e9bf13eaf749fbd82862204"
3094
3102
  },
3095
3103
  {
3096
3104
  "path": "src/storage/restore-job.ts",