@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.
- package/CHANGELOG.md +28 -0
- package/README.md +33 -1
- package/lib/client.js +323 -8
- package/lib/client.js.map +1 -1
- package/lib/index.js +345 -9
- package/lib/types/client/CodexSubscriptionSection.d.ts.map +1 -1
- package/lib/types/client/CompactionRouteBundleConfig.d.ts +19 -0
- package/lib/types/client/CompactionRouteBundleConfig.d.ts.map +1 -0
- package/lib/types/client/CompactionRouteCard.d.ts +43 -0
- package/lib/types/client/CompactionRouteCard.d.ts.map +1 -0
- package/lib/types/client/api.d.ts +3 -1
- package/lib/types/client/api.d.ts.map +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/locales-ru/hub.d.ts.map +1 -1
- package/lib/types/client/locales.d.ts +35 -7
- package/lib/types/client/locales.d.ts.map +1 -1
- package/lib/types/client/styles.d.ts.map +1 -1
- package/lib/types/host/agent-preset.d.ts.map +1 -1
- package/lib/types/host/compaction-route/index.d.ts +132 -0
- package/lib/types/host/compaction-route/index.d.ts.map +1 -0
- package/lib/types/host/preferences.d.ts.map +1 -1
- package/lib/types/host/routes.d.ts.map +1 -1
- package/lib/types/host/subagent-model-authorization.d.ts +53 -1
- package/lib/types/host/subagent-model-authorization.d.ts.map +1 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/shared/compaction-route.d.ts +63 -0
- package/lib/types/shared/compaction-route.d.ts.map +1 -0
- package/lib/types/shared/contracts.d.ts +26 -0
- package/lib/types/shared/contracts.d.ts.map +1 -1
- package/lib/types/shared/preferences.d.ts +2 -0
- package/lib/types/shared/preferences.d.ts.map +1 -1
- package/package.json +1 -1
- package/presets/dispatch/README.md +8 -2
- 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
|
-
|
|
75793
|
-
|
|
75794
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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;
|
|
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,
|
|
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"}
|