@eddyskywalker/dsh-chatgpt-subscription 0.39.1 → 0.40.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 (34) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +33 -1
  3. package/lib/client.js +323 -8
  4. package/lib/client.js.map +1 -1
  5. package/lib/index.js +345 -9
  6. package/lib/types/client/CodexSubscriptionSection.d.ts.map +1 -1
  7. package/lib/types/client/CompactionRouteBundleConfig.d.ts +19 -0
  8. package/lib/types/client/CompactionRouteBundleConfig.d.ts.map +1 -0
  9. package/lib/types/client/CompactionRouteCard.d.ts +43 -0
  10. package/lib/types/client/CompactionRouteCard.d.ts.map +1 -0
  11. package/lib/types/client/api.d.ts +3 -1
  12. package/lib/types/client/api.d.ts.map +1 -1
  13. package/lib/types/client/index.d.ts.map +1 -1
  14. package/lib/types/client/locales-ru/hub.d.ts.map +1 -1
  15. package/lib/types/client/locales.d.ts +35 -7
  16. package/lib/types/client/locales.d.ts.map +1 -1
  17. package/lib/types/client/styles.d.ts.map +1 -1
  18. package/lib/types/host/agent-preset.d.ts.map +1 -1
  19. package/lib/types/host/compaction-route/index.d.ts +132 -0
  20. package/lib/types/host/compaction-route/index.d.ts.map +1 -0
  21. package/lib/types/host/preferences.d.ts.map +1 -1
  22. package/lib/types/host/routes.d.ts.map +1 -1
  23. package/lib/types/host/subagent-model-authorization.d.ts +53 -1
  24. package/lib/types/host/subagent-model-authorization.d.ts.map +1 -1
  25. package/lib/types/index.d.ts.map +1 -1
  26. package/lib/types/shared/compaction-route.d.ts +63 -0
  27. package/lib/types/shared/compaction-route.d.ts.map +1 -0
  28. package/lib/types/shared/contracts.d.ts +26 -0
  29. package/lib/types/shared/contracts.d.ts.map +1 -1
  30. package/lib/types/shared/preferences.d.ts +2 -0
  31. package/lib/types/shared/preferences.d.ts.map +1 -1
  32. package/package.json +1 -1
  33. package/presets/dispatch/README.md +8 -2
  34. package/presets/dispatch/agent.cordis.yml +11 -4
package/lib/index.js CHANGED
@@ -10630,6 +10630,50 @@ var FilePreferencesStore = class {
10630
10630
  }
10631
10631
  };
10632
10632
  //#endregion
10633
+ //#region src/shared/compaction-route.ts
10634
+ /** Runtime membership test for one stored target. */
10635
+ function isCompactionRouteTarget(value) {
10636
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
10637
+ const record = value;
10638
+ return isNonEmptyString(record.provider) && isNonEmptyString(record.model);
10639
+ }
10640
+ function isNonEmptyString(value) {
10641
+ return typeof value === "string" && value.trim().length > 0;
10642
+ }
10643
+ /**
10644
+ * Decide whether the payload is admissible on the target.
10645
+ *
10646
+ * An undisclosed modality list is unknown, not negative: the harness documents
10647
+ * absence as "not disclosed", so refusing on it would disable the feature on
10648
+ * every route that simply does not advertise. The request still runs, and a
10649
+ * real rejection falls back the same way an error does.
10650
+ *
10651
+ * @param facts - what the directory says about the target.
10652
+ * @param needs - what the payload contains.
10653
+ * @returns the refusal reason, or `undefined` when the target may take it.
10654
+ */
10655
+ function compactionSkipReason(facts, needs) {
10656
+ const modalities = facts.modalities;
10657
+ if (modalities === void 0) return void 0;
10658
+ const accepts = new Set(modalities);
10659
+ if (needs.video && !accepts.has("video")) return "target-accepts-no-video";
10660
+ }
10661
+ /**
10662
+ * Whether the target can carry images inline.
10663
+ *
10664
+ * Used for the recorded outcome only: an image the target cannot take is
10665
+ * replaced by a placeholder during projection, so the summary is still produced
10666
+ * but may describe a screenshot it never saw.
10667
+ *
10668
+ * @param facts - what the directory says about the target.
10669
+ * @returns false only when the target discloses image support and omits it.
10670
+ */
10671
+ function compactionRoutesImages(facts) {
10672
+ const modalities = facts.modalities;
10673
+ if (modalities === void 0) return true;
10674
+ return modalities.includes("image");
10675
+ }
10676
+ //#endregion
10633
10677
  //#region src/shared/preferences.ts
10634
10678
  const PREFERENCES_NAMESPACE = "dsh-chatgpt-subscription";
10635
10679
  const DEFAULT_PREFERENCES = {
@@ -10642,7 +10686,8 @@ const DEFAULT_PREFERENCES = {
10642
10686
  searchProvider: "dsh",
10643
10687
  contextWindowOverrides: {},
10644
10688
  proxyMode: "auto",
10645
- customProxyUrl: null
10689
+ customProxyUrl: null,
10690
+ compactionRoute: null
10646
10691
  };
10647
10692
  const SEARCH_PROVIDER_CODEX = "codex";
10648
10693
  function isSearchProviderPreference(value) {
@@ -10848,7 +10893,11 @@ function registerPreferenceStore(settings) {
10848
10893
  z.const("custom"),
10849
10894
  z.const("direct")
10850
10895
  ]).default(DEFAULT_PREFERENCES.proxyMode),
10851
- customProxyUrl: z.union([z.string(), z.const(null)]).default(DEFAULT_PREFERENCES.customProxyUrl)
10896
+ customProxyUrl: z.union([z.string(), z.const(null)]).default(DEFAULT_PREFERENCES.customProxyUrl),
10897
+ compactionRoute: z.union([z.object({
10898
+ provider: z.string(),
10899
+ model: z.string()
10900
+ }), z.const(null)]).default(DEFAULT_PREFERENCES.compactionRoute ?? null)
10852
10901
  });
10853
10902
  if (!hasRegister(settings)) {
10854
10903
  const fileStore = new FilePreferencesStore(schema, preferencesPath(), readLegacyPreferences);
@@ -10899,6 +10948,13 @@ var SettingsPreferenceStore = class {
10899
10948
  if (!isProxyMode(patch.proxyMode)) throw new PreferenceError("Unsupported proxy mode preference.");
10900
10949
  normalized.proxyMode = patch.proxyMode;
10901
10950
  }
10951
+ if (patch.compactionRoute !== void 0) {
10952
+ if (patch.compactionRoute !== null && !isCompactionRouteTarget(patch.compactionRoute)) throw new PreferenceError("Unsupported compaction route.");
10953
+ normalized.compactionRoute = patch.compactionRoute === null ? null : {
10954
+ provider: patch.compactionRoute.provider.trim(),
10955
+ model: patch.compactionRoute.model.trim()
10956
+ };
10957
+ }
10902
10958
  if (patch.customProxyUrl !== void 0) if (patch.customProxyUrl !== null) {
10903
10959
  const trimmed = patch.customProxyUrl.trim();
10904
10960
  if (trimmed.length > 0 && !/^https?:\/\//i.test(trimmed) && !/^socks5?:\/\//i.test(trimmed)) normalized.customProxyUrl = `http://${trimmed}`;
@@ -13629,6 +13685,12 @@ function registerRoutes(ctx, oauth, usage, preferences, proxyManager, searchSwit
13629
13685
  value: await usage.testConnection()
13630
13686
  });
13631
13687
  return;
13688
+ case `${ROUTE_PREFIX$4}/compaction/candidates`:
13689
+ json(response, {
13690
+ ok: true,
13691
+ value: await compactionCandidates(ctx)
13692
+ });
13693
+ return;
13632
13694
  case `${ROUTE_PREFIX$4}/preferences/update`: {
13633
13695
  const patch = readPreferencesUpdate(body, preferences.status());
13634
13696
  const value = await preferences.update(patch);
@@ -13737,6 +13799,23 @@ function field(value, name) {
13737
13799
  const candidate = value[name];
13738
13800
  return typeof candidate === "string" && candidate !== "" ? candidate : null;
13739
13801
  }
13802
+ /** The provider and model directory a compaction target is chosen from. */
13803
+ async function compactionCandidates(ctx) {
13804
+ const llm = ctx.llm;
13805
+ if (llm === void 0 || typeof llm.listProviders !== "function") return { providers: [] };
13806
+ return { providers: (await Promise.all(llm.listProviders().map(async (provider) => {
13807
+ const models = await llm.listModels(provider.id).catch(() => []);
13808
+ return {
13809
+ id: provider.id,
13810
+ name: provider.name,
13811
+ models: models.map((model) => ({
13812
+ id: model.id,
13813
+ name: model.name,
13814
+ modalities: [...model.inputModalities ?? []]
13815
+ }))
13816
+ };
13817
+ }))).filter((provider) => provider.models.length > 0) };
13818
+ }
13740
13819
  function isRecord$44(value) {
13741
13820
  return typeof value === "object" && value !== null && !Array.isArray(value);
13742
13821
  }
@@ -13770,6 +13849,13 @@ function readPreferencesUpdate(value, current) {
13770
13849
  if (value.searchProvider !== "dsh" && value.searchProvider !== "codex") throw new PreferenceError("searchProvider must be dsh or codex.");
13771
13850
  patch.searchProvider = value.searchProvider;
13772
13851
  }
13852
+ if ("compactionRoute" in value) {
13853
+ if (value.compactionRoute !== null && !isCompactionRouteTarget(value.compactionRoute)) throw new PreferenceError("compactionRoute must be null or an object with provider and model.");
13854
+ patch.compactionRoute = value.compactionRoute === null ? null : {
13855
+ provider: value.compactionRoute.provider.trim(),
13856
+ model: value.compactionRoute.model.trim()
13857
+ };
13858
+ }
13773
13859
  if ("contextWindowOverrides" in value) {
13774
13860
  if (!isRecord$44(value.contextWindowOverrides)) throw new PreferenceError("contextWindowOverrides must be an object.");
13775
13861
  const overrides = {};
@@ -75608,6 +75694,34 @@ function inheritRouteDenialReason(toolName, provider, model, allowed, reasoningE
75608
75694
  return `subagent model selection: "${toolName}" keeps its child on ${provider === void 0 || model === void 0 ? "the calling agent's route" : `"${provider}/${model}"${reasoningEffort === void 0 ? "" : ` (${reasoningEffort})`}`}, which this Session's allowlist does not authorize, so it is unavailable for now. Its child cannot be re-routed, so either delegate through a tool that exposes provider and model — passing one of ${authorizedRoutesText(allowed)} — or continue on an authorized model for this session, after which ${toolName} works again.`;
75609
75695
  }
75610
75696
  /**
75697
+ * Enforce the allowlist against the route an inherit-mode child would run on.
75698
+ * @param agent - Calling agent whose route the child inherits.
75699
+ * @param toolName - the tool the model called.
75700
+ * @param allowed - Routes the calling Session authorizes.
75701
+ * @returns a denial reason when the inherited route is unauthorized.
75702
+ */
75703
+ function inheritedRouteDenial(agent, toolName, allowed) {
75704
+ const inherited = inheritedRouteOf(agent);
75705
+ if (inherited.provider !== void 0 && inherited.model !== void 0 && routesInclude(allowed, inherited.provider, inherited.model)) return void 0;
75706
+ return inheritRouteDenialReason(toolName, inherited.provider, inherited.model, allowed, inherited.reasoningEffort);
75707
+ }
75708
+ /**
75709
+ * Build the denial reason for a half-specified route aimed at a tool that
75710
+ * exposes no route field at all.
75711
+ *
75712
+ * This is the one denial whose cause is not the call: the delegation tool was
75713
+ * mounted without model selection, so no argument can name a child route. The
75714
+ * reason states the configuration defect and the route the child would inherit,
75715
+ * because "call list_subagent_models and pass a route" would be unactionable.
75716
+ * @param toolName - the tool the model called.
75717
+ * @param inherited - the route the child would inherit from the caller.
75718
+ * @param allowed - Routes the calling Session authorizes.
75719
+ * @returns the corrective reason handed back to the model.
75720
+ */
75721
+ function routeFieldsUnavailableReason(toolName, inherited, allowed) {
75722
+ return `subagent model selection: "${toolName}" exposes no provider/model parameter in this deployment, so no call can name a child route — the delegation tool is mounted without model selection enabled. The child would run on ${inherited.provider === void 0 || inherited.model === void 0 ? "the calling agent's own route" : `"${inherited.provider}/${inherited.model}"`}; authorized routes are ${authorizedRoutesText(allowed)}.`;
75723
+ }
75724
+ /**
75611
75725
  * Resolve one tool's enforcement mode from the configured policies. An
75612
75726
  * unconfigured name is `undefined`: the guard does not police it, which is how
75613
75727
  * the plain-name configuration keeps its existing meaning.
@@ -75773,7 +75887,7 @@ function rewriteAuthorizedPromptAssembly(assembly, allowed, toolNames = DEFAULT_
75773
75887
  * @param inheritToolNames - Delegation tools that start a child on the caller's own route.
75774
75888
  * @returns a denial reason, or undefined to leave the call untouched.
75775
75889
  */
75776
- function delegationDenialReason(agent, toolName, args, preference, sessions, toolNames = DEFAULT_DELEGATION_TOOLS, scope = "session", inheritToolNames = []) {
75890
+ function delegationDenialReason(agent, toolName, args, preference, sessions, toolNames = DEFAULT_DELEGATION_TOOLS, scope = "session", inheritToolNames = [], declaresRouteParameters) {
75777
75891
  const mode = delegationModeOf([...toolNames.map((name) => ({
75778
75892
  name,
75779
75893
  mode: "explicit"
@@ -75789,9 +75903,12 @@ function delegationDenialReason(agent, toolName, args, preference, sessions, too
75789
75903
  const requestedModel = asString$1(request["model"]);
75790
75904
  if (mode === "inherit") {
75791
75905
  if (requestedProvider !== void 0 && requestedModel !== void 0) return inheritOverrideReason(toolName, requestedProvider, requestedModel);
75792
- const inherited = inheritedRouteOf(agent);
75793
- if (inherited.provider !== void 0 && inherited.model !== void 0 && routesInclude(allowed, inherited.provider, inherited.model)) return void 0;
75794
- return inheritRouteDenialReason(toolName, inherited.provider, inherited.model, allowed, inherited.reasoningEffort);
75906
+ return inheritedRouteDenial(agent, toolName, allowed);
75907
+ }
75908
+ if (declaresRouteParameters?.(agent, toolName) === false) {
75909
+ if (requestedProvider !== void 0 && requestedModel !== void 0) return inheritOverrideReason(toolName, requestedProvider, requestedModel);
75910
+ if (requestedProvider !== void 0 || requestedModel !== void 0) return routeFieldsUnavailableReason(toolName, inheritedRouteOf(agent), allowed);
75911
+ return inheritedRouteDenial(agent, toolName, allowed);
75795
75912
  }
75796
75913
  if (requestedProvider === void 0) return requestedModel === void 0 ? missingRouteReason(allowed) : partialRouteReason("provider", requestedModel, allowed);
75797
75914
  if (requestedModel === void 0) return partialRouteReason("model", requestedProvider, allowed);
@@ -75808,7 +75925,7 @@ function delegationDenialReason(agent, toolName, args, preference, sessions, too
75808
75925
  * @returns a guard that denies delegations outside the Session allowlist.
75809
75926
  */
75810
75927
  function createSubagentAuthorization(options) {
75811
- return (agent, toolName, args) => delegationDenialReason(agent, toolName, args, subagentModelSelectionPreference(options.settings), options.sessions, options.toolNames, options.scope ?? "session", options.inheritToolNames ?? []);
75928
+ return (agent, toolName, args) => delegationDenialReason(agent, toolName, args, subagentModelSelectionPreference(options.settings), options.sessions, options.toolNames, options.scope ?? "session", options.inheritToolNames ?? [], options.declaresRouteParameters);
75812
75929
  }
75813
75930
  /** Delegation names this guard recognizes when configuration omits them. */
75814
75931
  function normalizeDelegationToolNames(value) {
@@ -75849,6 +75966,34 @@ function validateDelegationToolNames(toolNames) {
75849
75966
  return [...toolNames];
75850
75967
  }
75851
75968
  /**
75969
+ * Build the live route-parameter probe from the Host tool registry.
75970
+ *
75971
+ * The registry is read per call rather than snapshotted: an HMR replacement or a
75972
+ * preset change can remount the delegation tool, and a stale answer would put
75973
+ * the guard back on the impossible branch.
75974
+ * @param ctx - Host context carrying the `tools` registry.
75975
+ * @returns a probe over the registry, or undefined when it exposes no readable
75976
+ * definitions (older harness generations), which keeps the configured mode.
75977
+ */
75978
+ function routeParameterProbe(ctx) {
75979
+ const registry = ctx.tools;
75980
+ if (typeof registry?.definitions !== "function") return void 0;
75981
+ const definitions = registry.definitions.bind(registry);
75982
+ return (agent, toolName) => {
75983
+ let visible;
75984
+ try {
75985
+ visible = definitions(agent);
75986
+ } catch {
75987
+ return;
75988
+ }
75989
+ const definition = visible.find((entry) => entry?.name === toolName);
75990
+ if (definition === void 0) return void 0;
75991
+ const parameters = asRecord$1(definition.parameters);
75992
+ if (parameters === void 0) return void 0;
75993
+ return "provider" in parameters || "model" in parameters;
75994
+ };
75995
+ }
75996
+ /**
75852
75997
  * Register the monotonic guard on the Host tool registry, and — when the Host
75853
75998
  * context exposes Cordis events — enrich `list_subagent_models` output with the
75854
75999
  * Session's split `{ provider, model }` routes and rewrite the misleading
@@ -75869,7 +76014,8 @@ function installSubagentModelAuthorization(ctx, sessions, config = {}) {
75869
76014
  sessions,
75870
76015
  toolNames,
75871
76016
  inheritToolNames,
75872
- scope
76017
+ scope,
76018
+ declaresRouteParameters: routeParameterProbe(ctx)
75873
76019
  });
75874
76020
  const disposeGuard = ctx.tools.guard((exec) => authorize(exec.agent, exec.name, exec.arguments));
75875
76021
  const eventHost = ctx;
@@ -76511,6 +76657,7 @@ Before dispatching, check whether subagent model selection is enabled in this se
76511
76657
 
76512
76658
  subagent_fork deliberately shares the parent agent's route (reusing conversation history and KV cache); use it only for reviews that require the coordinator's context, never as a shortcut around explicit routing.
76513
76659
  It has no provider/model parameters, so the explicit-route rule under [State: Listed] does not apply to it; however, the guard still validates the route it inherits: if your current model is not in the allowlist, subagent_fork will be hard-rejected—switch to subagent with an explicit allowed route, or switch this session to an allowed model so subagent_fork becomes available again.
76660
+ When the parent route is itself one of the authorized routes, subagent_fork needs no route argument and no discovery tool: its admission is decided by the route the calling session is actually running, so it still works when list_subagent_models is absent or when a delegation tool exposes no route field. Prefer it exactly then—parent route authorized and the subtask needs this conversation's context—and prefer subagent when the subtask needs another model or a clean context. Never conclude that delegation is impossible from a broken explicit-route path alone: try subagent_fork once and read the denial, which names the parent route and the authorized routes.
76514
76661
  Choose models based on task nature and model capability; keep model selection consistent across tasks of the same kind within a batch.
76515
76662
 
76516
76663
  ## R3 · Subagent Autonomy
@@ -76698,7 +76845,8 @@ Reset: fallback applies only to the current task. When the next task begins, alw
76698
76845
  config: {
76699
76846
  provider: "spawn",
76700
76847
  toolName: "subagent",
76701
- modelSelectionSettings: true,
76848
+ modelSelection: true,
76849
+ modelDiscovery: true,
76702
76850
  backgroundMode: "continuable"
76703
76851
  }
76704
76852
  },
@@ -78004,6 +78152,178 @@ function releaseListener$1(handle) {
78004
78152
  }
78005
78153
  handle?.dispose?.();
78006
78154
  }
78155
+ //#endregion
78156
+ //#region src/host/compaction-route/index.ts
78157
+ /**
78158
+ * Route an automatic compaction summary to a model other than the one that
78159
+ * built the conversation.
78160
+ *
78161
+ * A host computes the summary on the conversation's own model unless its
78162
+ * compaction config names another route. That config is preset-owned, so this
78163
+ * plugin cannot offer it as a setting; it re-routes the call one layer down,
78164
+ * at the `llm/stream` waterfall, where a compaction request is identifiable by
78165
+ * its `purpose` and every preset passes through.
78166
+ *
78167
+ * Three rules shape the listener:
78168
+ *
78169
+ * - **Refuse before sending what cannot work.** A video block has no wire
78170
+ * fallback on a target that does not take video, so the request would fail
78171
+ * after paying for it. The payload is inspected first and the conversation
78172
+ * model keeps the call instead.
78173
+ * - **Buffer, then fall back.** A host turns an adapter throw into a terminal
78174
+ * `finish` chunk instead of an exception, and a half-written summary is
78175
+ * worthless, so the alternate attempt is collected first. Only a complete one
78176
+ * is released downstream; anything else falls back to the conversation model
78177
+ * and is recorded, because a fallback the operator cannot see is a cost they
78178
+ * did not agree to.
78179
+ * - **Do not impose an output cap.** The host asks for 65 536 tokens of summary
78180
+ * by default; the official client sends no cap at all and lets the route
78181
+ * decide, so the cap is dropped for the re-routed call.
78182
+ *
78183
+ * @module dsh-chatgpt-subscription/compaction-route
78184
+ */
78185
+ /** How long one provider's model directory is reused. */
78186
+ const MODEL_CACHE_MS = 6e4;
78187
+ /**
78188
+ * Install the `llm/stream` listener.
78189
+ *
78190
+ * Returns `undefined` when the host exposes no event bus, so a caller can skip
78191
+ * installation instead of failing the plugin's load.
78192
+ *
78193
+ * @param ctx - structural context: the event bus and a logger.
78194
+ * @param deps - the LLM stream, the live target, and the optional directory.
78195
+ * @returns the live handle, or `undefined` on a host without an event bus.
78196
+ */
78197
+ function installCompactionRoute(ctx, deps) {
78198
+ const on = ctx.on;
78199
+ if (typeof on !== "function") return void 0;
78200
+ let outcome = null;
78201
+ const rerouted = /* @__PURE__ */ new WeakSet();
78202
+ const directory = /* @__PURE__ */ new Map();
78203
+ const factsFor = async (target) => {
78204
+ if (deps.listModels === void 0) return {};
78205
+ const now = Date.now();
78206
+ const cached = directory.get(target.provider);
78207
+ const models = cached !== void 0 && now - cached.at < MODEL_CACHE_MS ? cached.models : await deps.listModels(target.provider).catch(() => []);
78208
+ if (cached === void 0 || now - cached.at >= MODEL_CACHE_MS) directory.set(target.provider, {
78209
+ at: now,
78210
+ models
78211
+ });
78212
+ const entry = models.find((model) => model.id === target.model);
78213
+ return entry === void 0 ? {} : { modalities: entry.inputModalities };
78214
+ };
78215
+ const dispose = on("llm/stream", async function* routeByStream(options, next) {
78216
+ if (options.purpose !== "compaction" || rerouted.has(options)) return yield* next();
78217
+ const target = deps.readTarget();
78218
+ if (target === null) return yield* next();
78219
+ if (target.provider === options.provider && target.model === options.model) return yield* next();
78220
+ const facts = await factsFor(target);
78221
+ const needs = payloadNeeds(options);
78222
+ const skip = compactionSkipReason(facts, needs);
78223
+ if (skip !== void 0) {
78224
+ outcome = {
78225
+ kind: "skipped",
78226
+ at: Date.now(),
78227
+ reason: skip
78228
+ };
78229
+ ctx.logger?.warn(`[dsh-chatgpt-subscription] compaction kept on ${String(options.provider)}/${String(options.model)}: ${target.provider}/${target.model} ${skip}`);
78230
+ return yield* next();
78231
+ }
78232
+ const reroutedOptions = withoutOutputCap(options, target);
78233
+ rerouted.add(reroutedOptions);
78234
+ const attempt = await collect(() => deps.stream(reroutedOptions));
78235
+ if (attempt.ok) {
78236
+ outcome = {
78237
+ kind: "routed",
78238
+ provider: target.provider,
78239
+ model: target.model,
78240
+ at: Date.now(),
78241
+ imagesProjected: needs.image && !compactionRoutesImages(facts)
78242
+ };
78243
+ for (const chunk of attempt.chunks) yield chunk;
78244
+ return;
78245
+ }
78246
+ outcome = {
78247
+ kind: "fell-back",
78248
+ provider: options.provider ?? "",
78249
+ model: options.model ?? "",
78250
+ at: Date.now(),
78251
+ reason: attempt.reason
78252
+ };
78253
+ ctx.logger?.warn(`[dsh-chatgpt-subscription] compaction fell back to ${String(options.provider)}/${String(options.model)}: ${target.provider}/${target.model} failed with ${attempt.reason}`);
78254
+ return yield* next();
78255
+ }, { global: true });
78256
+ return {
78257
+ status: () => outcome,
78258
+ dispose: () => {
78259
+ if (typeof dispose === "function") dispose();
78260
+ }
78261
+ };
78262
+ }
78263
+ /**
78264
+ * Read what the payload actually carries.
78265
+ * @param options - the compaction request.
78266
+ * @returns whether it carries an image or a video block.
78267
+ */
78268
+ function payloadNeeds(options) {
78269
+ let image = false;
78270
+ let video = false;
78271
+ for (const message of options.messages ?? []) for (const block of message.content ?? []) if (block.type === "image") image = true;
78272
+ else if (block.type === "video") video = true;
78273
+ return {
78274
+ image,
78275
+ video
78276
+ };
78277
+ }
78278
+ /**
78279
+ * Build the request for the chosen target: the same conversation, no output cap.
78280
+ * @param options - the original compaction request.
78281
+ * @param target - the route to send it to.
78282
+ * @returns a detached request object.
78283
+ */
78284
+ function withoutOutputCap(options, target) {
78285
+ const { maxTokens: _dropped, ...rest } = options;
78286
+ return {
78287
+ ...rest,
78288
+ provider: target.provider,
78289
+ model: target.model
78290
+ };
78291
+ }
78292
+ /**
78293
+ * Run one attempt to completion, keeping its chunks only when it finished
78294
+ * cleanly.
78295
+ *
78296
+ * The stream is opened inside the try, not before it: an adapter that rejects
78297
+ * before yielding anything (an exhausted quota, a rejected credential) throws
78298
+ * from the call itself, and that is the same fallback case as a failed stream.
78299
+ */
78300
+ async function collect(open) {
78301
+ const chunks = [];
78302
+ let finishKind;
78303
+ try {
78304
+ for await (const chunk of open()) {
78305
+ chunks.push(chunk);
78306
+ if (chunk.type === "finish") finishKind = chunk.reason?.kind;
78307
+ }
78308
+ } catch (error) {
78309
+ return {
78310
+ ok: false,
78311
+ reason: error instanceof Error ? error.message : String(error)
78312
+ };
78313
+ }
78314
+ if (finishKind === void 0) return {
78315
+ ok: false,
78316
+ reason: "the stream ended without a finish chunk"
78317
+ };
78318
+ if (finishKind === "error" || finishKind === "aborted") return {
78319
+ ok: false,
78320
+ reason: finishKind
78321
+ };
78322
+ return {
78323
+ ok: true,
78324
+ chunks
78325
+ };
78326
+ }
78007
78327
  const DEFAULT_NO_ANSWER_RESUME_OPTIONS = {
78008
78328
  maxResumes: 2,
78009
78329
  text: "Your previous response ended without an answer and without calling a tool. Continue from where you left off: either state the conclusion you already reached, or make the single next tool call that moves the task forward. Do not restart the analysis."
@@ -79243,6 +79563,22 @@ function apply(ctx, pluginConfig = {}) {
79243
79563
  const store = createPlatformTokenStore();
79244
79564
  const preferences = registerPreferenceStore(ctx.settings);
79245
79565
  preferences.hydrate().catch(() => void 0);
79566
+ ctx.effect(() => {
79567
+ const llm = ctx.llm;
79568
+ const handle = installCompactionRoute({
79569
+ on: (event, listener, options) => ctx.on?.(event, listener, options),
79570
+ logger: ctx.logger
79571
+ }, {
79572
+ stream: (options) => llm.stream(options),
79573
+ listModels: (provider) => llm.listModels(provider),
79574
+ readTarget: () => preferences.status().compactionRoute ?? null
79575
+ });
79576
+ if (handle === void 0) {
79577
+ ctx.logger.warn("[dsh-chatgpt-subscription] compaction route skipped: this harness exposes no event bus");
79578
+ return () => void 0;
79579
+ }
79580
+ return () => handle.dispose();
79581
+ }, "dsh-chatgpt-subscription: compaction route");
79246
79582
  const antigravityStore = new FileCredentialStore$3();
79247
79583
  const antigravityAccountPool = new AccountPoolStore(void 0, void 0, antigravityStore);
79248
79584
  const antigravityModelSettings = new FileModelSettingsStore$2();
@@ -1 +1 @@
1
- {"version":3,"file":"CodexSubscriptionSection.d.ts","sourceRoot":"","sources":["../../../src/client/CodexSubscriptionSection.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AACjF,OAAO,KAAK,EAAyC,eAAe,EAAmD,cAAc,EAA8D,MAAM,wBAAwB,CAAA;AASjO,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAGjC,KAAK,KAAK,GAAG,YAAY,CAAC,kBAAkB,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAA;AACtE,KAAK,UAAU,GAAG,OAAO,GAAG,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,GAC/G,aAAa,GAAG,QAAQ,GAAG,gBAAgB,GAAG,UAAU,GAAG,OAAO,GAAG,eAAe,GAAG,SAAS,GAAG,IAAI,CAAA;AAC3G,KAAK,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;AAmD3B,wBAAgB,wBAAwB,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAg3BxE;AA+BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;IAAE,MAAM,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,CAAC;IAAC,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CA4B7I;AAWD,wBAAgB,gBAAgB,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAAE,YAAY,EAAE,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAUzN;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAczH;AAMD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAYpF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOlE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,SAA4B,GAAG,MAAM,GAAG,IAAI,CAGxG;AA0FD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAgBtE"}
1
+ {"version":3,"file":"CodexSubscriptionSection.d.ts","sourceRoot":"","sources":["../../../src/client/CodexSubscriptionSection.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AACjF,OAAO,KAAK,EAAyC,eAAe,EAAmD,cAAc,EAA8D,MAAM,wBAAwB,CAAA;AASjO,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAGjC,KAAK,KAAK,GAAG,YAAY,CAAC,kBAAkB,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAA;AACtE,KAAK,UAAU,GAAG,OAAO,GAAG,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,GAC/G,aAAa,GAAG,QAAQ,GAAG,gBAAgB,GAAG,UAAU,GAAG,OAAO,GAAG,eAAe,GAAG,SAAS,GAAG,IAAI,CAAA;AAC3G,KAAK,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;AAmD3B,wBAAgB,wBAAwB,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAs3BxE;AA+BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;IAAE,MAAM,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,CAAC;IAAC,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CA4B7I;AAWD,wBAAgB,gBAAgB,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAAE,YAAY,EAAE,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAUzN;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAczH;AAMD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAYpF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOlE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,SAA4B,GAAG,MAAM,GAAG,IAAI,CAGxG;AA0FD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAgBtE"}
@@ -0,0 +1,19 @@
1
+ import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
2
+ import { NS } from './locales.ts';
3
+ /** The package whose page this entry configures. */
4
+ export declare const COMPACTION_ROUTE_PACKAGE = "@eddyskywalker/dsh-chatgpt-subscription";
5
+ /** The view the page asks a configuration entry for. */
6
+ export interface PluginConfigViewLike {
7
+ readonly view: 'summary' | 'page';
8
+ }
9
+ /** Props the plugin-manager bundle page renders a configuration entry with. */
10
+ export type CompactionRouteBundleConfigProps = PropsLocale<typeof NS> & PluginConfigViewLike;
11
+ /**
12
+ * Render the compaction-model card on this package's bundle page only.
13
+ *
14
+ * Split in two so the hooks below never mount for the summary view: that view
15
+ * is a one-liner drawn beside the card, and fetching this plugin's preferences
16
+ * for it would be a request nobody asked for.
17
+ */
18
+ export declare function CompactionRouteBundleConfig(props: CompactionRouteBundleConfigProps): React.JSX.Element | null;
19
+ //# sourceMappingURL=CompactionRouteBundleConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompactionRouteBundleConfig.d.ts","sourceRoot":"","sources":["../../../src/client/CompactionRouteBundleConfig.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAKjC,oDAAoD;AACpD,eAAO,MAAM,wBAAwB,4CAA4C,CAAA;AAEjF,wDAAwD;AACxD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAA;CAClC;AAED,+EAA+E;AAC/E,MAAM,MAAM,gCAAgC,GACxC,WAAW,CAAC,OAAO,EAAE,CAAC,GACtB,oBAAoB,CAAA;AAExB;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,gCAAgC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAG7G"}
@@ -0,0 +1,43 @@
1
+ import type { SubscriptionPreferencesDto } from '../shared/contracts.ts';
2
+ import type { SubscriptionApi } from './api.ts';
3
+ /** Labels the settings page supplies, so this card carries no locale of its own. */
4
+ export interface CompactionRouteCardLabels {
5
+ title: string;
6
+ hint: string;
7
+ provider: string;
8
+ model: string;
9
+ save: string;
10
+ clear: string;
11
+ change: string;
12
+ /** Shown as the current value when no route is configured. */
13
+ follow: string;
14
+ saved: string;
15
+ failed: string;
16
+ /** Shown when the chosen model cannot take video, so compaction would fall back. */
17
+ noVideo: string;
18
+ /** Shown when the chosen model cannot take images, so they become placeholders. */
19
+ noImage: string;
20
+ empty: string;
21
+ }
22
+ export interface CompactionRouteCardProps {
23
+ readonly api: SubscriptionApi;
24
+ readonly preferences: SubscriptionPreferencesDto | null;
25
+ readonly disabled?: boolean;
26
+ readonly labels: CompactionRouteCardLabels;
27
+ readonly onSaved: (preferences: SubscriptionPreferencesDto) => void;
28
+ }
29
+ /**
30
+ * Choose the model an automatic compaction summarizes on.
31
+ *
32
+ * The route lives in this plugin's preferences and is applied by the host's
33
+ * `llm/stream` listener, so a saved choice takes effect on the next compaction
34
+ * without a restart. Both selects are needed together: a model id alone belongs
35
+ * to no route.
36
+ *
37
+ * The picker loads its directory on demand rather than on mount: opening the
38
+ * settings page must not cost a request to every line (that page is opened for
39
+ * unrelated reasons all the time), and the card already knows the saved route
40
+ * from the status it was rendered with.
41
+ */
42
+ export declare function CompactionRouteCard({ api, preferences, disabled, labels, onSaved }: CompactionRouteCardProps): React.JSX.Element;
43
+ //# sourceMappingURL=CompactionRouteCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompactionRouteCard.d.ts","sourceRoot":"","sources":["../../../src/client/CompactionRouteCard.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,0BAA0B,EAC3B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE/C,oFAAoF;AACpF,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,oFAAoF;IACpF,OAAO,EAAE,MAAM,CAAA;IACf,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAA;IAC7B,QAAQ,CAAC,WAAW,EAAE,0BAA0B,GAAG,IAAI,CAAA;IACvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAAA;IAC1C,QAAQ,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,0BAA0B,KAAK,IAAI,CAAA;CACpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,QAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,wBAAwB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAsIxI"}
@@ -1,4 +1,4 @@
1
- import type { DeviceLoginStartDto, LoginEventDto, LoginStartDto, PluginStatusDto, QuotaStatusDto, ConnectionTestDto, SubscriptionPreferencesDto, SubscriptionPreferencesUpdateDto } from '../shared/contracts.ts';
1
+ import type { DeviceLoginStartDto, LoginEventDto, LoginStartDto, PluginStatusDto, QuotaStatusDto, ConnectionTestDto, SubscriptionPreferencesDto, SubscriptionPreferencesUpdateDto, CompactionCandidatesDto } from '../shared/contracts.ts';
2
2
  export declare class SubscriptionApi {
3
3
  status(): Promise<PluginStatusDto>;
4
4
  startLogin(): Promise<LoginStartDto>;
@@ -52,6 +52,8 @@ export declare class SubscriptionApi {
52
52
  useResetCredit(): Promise<QuotaStatusDto>;
53
53
  testConnection(): Promise<ConnectionTestDto>;
54
54
  updatePreferences(patch: SubscriptionPreferencesUpdateDto): Promise<SubscriptionPreferencesDto>;
55
+ /** Every route a compaction summary may be pointed at, read per call. */
56
+ compactionCandidates(): Promise<CompactionCandidatesDto>;
55
57
  events(loginId: string): EventSource;
56
58
  }
57
59
  export declare function parseLoginEvent(event: MessageEvent<string>): LoginEventDto | null;
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/client/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,0BAA0B,EAC1B,gCAAgC,EACjC,MAAM,wBAAwB,CAAA;AAE/B,qBAAa,eAAe;IAC1B,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAIlC,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;IAIpC;;;;;;OAMG;IACH,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIhD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAI7D,kEAAkE;IAClE,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,CAAC;IAI7D;;;;;OAKG;IACH,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,gBAAgB,GAAG,UAAU,GAAG,SAAS,EAAE,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAIzM;;;;;;;;OAQG;IACH,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAI1D,6EAA6E;IAC7E,yBAAyB,IAAI,OAAO,CAAC,eAAe,CAAC;IAIrD;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAIzE,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;IAInC,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC;IAIvC,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC;IAIzC,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAI5C,iBAAiB,CAAC,KAAK,EAAE,gCAAgC,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAI/F,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;CAGrC;AAmBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,aAAa,GAAG,IAAI,CAOjF"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/client/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,0BAA0B,EAC1B,gCAAgC,EAChC,uBAAuB,EACxB,MAAM,wBAAwB,CAAA;AAE/B,qBAAa,eAAe;IAC1B,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAIlC,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;IAIpC;;;;;;OAMG;IACH,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIhD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAI7D,kEAAkE;IAClE,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE,CAAC;IAI7D;;;;;OAKG;IACH,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,gBAAgB,GAAG,UAAU,GAAG,SAAS,EAAE,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAIzM;;;;;;;;OAQG;IACH,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAI1D,6EAA6E;IAC7E,yBAAyB,IAAI,OAAO,CAAC,eAAe,CAAC;IAIrD;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAIzE,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;IAInC,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC;IAIvC,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC;IAIzC,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAI5C,iBAAiB,CAAC,KAAK,EAAE,gCAAgC,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAI/F,yEAAyE;IACzE,oBAAoB,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAIxD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;CAGrC;AAmBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,aAAa,GAAG,IAAI,CAOjF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAenE,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAQ/D,OAAO,EAAoD,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAGtH,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAGlG,OAAO,EAAqD,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAExH,OAAO,EAA+C,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAM5G,OAAO,EAAqD,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAKxH,OAAO,EAA0D,KAAK,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAElI,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAElG,OAAO,EAA+C,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAG5G,OAAO,EAAiD,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAGhH,OAAO,EAAwC,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAG9F,OAAO,EAAkD,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAMlH,OAAO,EAA6D,KAAK,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAExI,OAAO,QAAQ,kCAAkC,CAAC;IAChD;;;;;;;OAOG;IACH,UAAU,kBAAkB;QAC1B,0BAA0B,EAAE,SAAS,CAAA;QACrC,iBAAiB,EAAE,oBAAoB,CAAA;QACvC,YAAY,EAAE,eAAe,CAAA;QAC7B,kBAAkB,EAAE,oBAAoB,CAAA;QACxC,eAAe,EAAE,iBAAiB,CAAA;QAClC,kBAAkB,EAAE,oBAAoB,CAAA;QACxC,qBAAqB,EAAE,sBAAsB,CAAA;QAC7C,YAAY,EAAE,eAAe,CAAA;QAC7B,eAAe,EAAE,iBAAiB,CAAA;QAClC,gBAAgB,EAAE,kBAAkB,CAAA;QACpC,WAAW,EAAE,cAAc,CAAA;QAC3B,gBAAgB,EAAE,mBAAmB,CAAA;QACrC,sBAAsB,EAAE,wBAAwB,CAAA;KACjD;CACF;AAED,eAAO,MAAM,MAAM,UAQlB,CAAA;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CA2N9C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAgBnE,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAQ/D,OAAO,EAAoD,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAGtH,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAGlG,OAAO,EAAqD,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAExH,OAAO,EAA+C,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAM5G,OAAO,EAAqD,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAKxH,OAAO,EAA0D,KAAK,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAElI,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAElG,OAAO,EAA+C,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAG5G,OAAO,EAAiD,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAGhH,OAAO,EAAwC,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAG9F,OAAO,EAAkD,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAMlH,OAAO,EAA6D,KAAK,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAExI,OAAO,QAAQ,kCAAkC,CAAC;IAChD;;;;;;;OAOG;IACH,UAAU,kBAAkB;QAC1B,0BAA0B,EAAE,SAAS,CAAA;QACrC,iBAAiB,EAAE,oBAAoB,CAAA;QACvC,YAAY,EAAE,eAAe,CAAA;QAC7B,kBAAkB,EAAE,oBAAoB,CAAA;QACxC,eAAe,EAAE,iBAAiB,CAAA;QAClC,kBAAkB,EAAE,oBAAoB,CAAA;QACxC,qBAAqB,EAAE,sBAAsB,CAAA;QAC7C,YAAY,EAAE,eAAe,CAAA;QAC7B,eAAe,EAAE,iBAAiB,CAAA;QAClC,gBAAgB,EAAE,kBAAkB,CAAA;QACpC,WAAW,EAAE,cAAc,CAAA;QAC3B,gBAAgB,EAAE,mBAAmB,CAAA;QACrC,sBAAsB,EAAE,wBAAwB,CAAA;KACjD;CACF;AAED,eAAO,MAAM,MAAM,UAQlB,CAAA;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAsO9C"}
@@ -1 +1 @@
1
- {"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../../../../src/client/locales-ru/hub.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9C,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CA8MhD,CAAA"}
1
+ {"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../../../../src/client/locales-ru/hub.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9C,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CA4NhD,CAAA"}