qlogicagent 2.13.4 → 2.13.6

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.
@@ -8,5 +8,7 @@ export interface CommunityInstalledResource {
8
8
  }
9
9
  export interface InstallCommunitySkillOptions {
10
10
  fetchFn?: typeof fetch;
11
+ /** Replace an existing install in place (update flow) instead of erroring. */
12
+ allowReplace?: boolean;
11
13
  }
12
14
  export declare function installCommunitySkillResource(install: CommunityInstallResolution, options?: InstallCommunitySkillOptions): Promise<CommunityInstalledResource>;
@@ -17,6 +17,12 @@ export declare function handleCommunitySetConsent(this: CommunityHandlerHost, ms
17
17
  export declare function handleCommunityListShared(this: CommunityHandlerHost, msg: AgentRpcRequest): Promise<void>;
18
18
  export declare function handleCommunityMatchRegistry(this: CommunityHandlerHost, msg: AgentRpcRequest): Promise<void>;
19
19
  export declare function handleCommunityResolveInstall(this: CommunityHandlerHost, msg: AgentRpcRequest): Promise<void>;
20
+ export declare function handleCommunityListResourceVersions(this: CommunityHandlerHost, msg: AgentRpcRequest): Promise<void>;
21
+ export declare function handleCommunityGetRatingSummary(this: CommunityHandlerHost, msg: AgentRpcRequest): Promise<void>;
22
+ export declare function handleCommunityRateResource(this: CommunityHandlerHost, msg: AgentRpcRequest): Promise<void>;
23
+ export declare function handleCommunityReportResource(this: CommunityHandlerHost, msg: AgentRpcRequest): Promise<void>;
24
+ export declare function handleCommunityListComments(this: CommunityHandlerHost, msg: AgentRpcRequest): Promise<void>;
25
+ export declare function handleCommunityPostComment(this: CommunityHandlerHost, msg: AgentRpcRequest): Promise<void>;
20
26
  export declare function handleCommunityInstallResource(this: CommunityHandlerHost, msg: AgentRpcRequest): Promise<void>;
21
27
  /**
22
28
  * Handshake step ① — probe declared runtime dependencies (vetted catalog only).
@@ -3,35 +3,45 @@
3
3
  *
4
4
  * A skill manifest may declare `runtime: ["officecli"]` — bare ids only. The
5
5
  * registry stays declarative: WHAT a skill needs lives in Hub data, but HOW to
6
- * probe/install it lives here, reviewed in code. The installer never executes
7
- * anything from registry payloads, so a compromised registry row cannot turn
8
- * "install skill" into arbitrary code execution; unknown ids surface as
9
- * "manual" in the handshake UI instead of running anything.
6
+ * probe/install it lives here, reviewed in code. A runtime is a single-file
7
+ * binary mirrored to our OSS; the installer resolves a Hub-signed download URL,
8
+ * verifies its sha256 BEFORE placing the file, and never executes registry
9
+ * payloads so a compromised registry row cannot turn "install runtime" into
10
+ * arbitrary code execution. Unknown ids surface as "manual" in the handshake UI
11
+ * instead of running anything. CN-reliable: no dependency on foreign mirrors.
10
12
  */
11
13
  export interface RuntimeDependencySpec {
12
14
  id: string;
13
15
  /** Human-facing name shown in the handshake card. */
14
16
  label: string;
15
- /** Executable probed on PATH (and `extraWindowsPaths` fallbacks). */
17
+ /** Executable probed on PATH (and known-location fallbacks). */
16
18
  bin: string;
17
19
  probeArgs: string[];
18
20
  /** Known install locations not yet on PATH in this process (fresh installs). */
19
21
  extraWindowsPaths?: string[];
20
22
  /**
21
23
  * quick=true → the handshake auto-installs without an extra consent step
22
- * (small, single-artifact, official installer). quick=false → the client
23
- * must show a consent card first (large download / system-level changes).
24
+ * (small, single-artifact). quick=false → the client must show a consent
25
+ * card first (large download / system-level changes).
24
26
  */
25
27
  quick: boolean;
26
28
  /** Honest size estimate surfaced in the consent card. */
27
29
  estSizeMB: number;
28
- install: Partial<Record<"win32" | "default", {
29
- command: string;
30
- args: string[];
31
- }>>;
30
+ /** Single-file binary mirrored to our OSS, resolved per-platform via the Hub. */
31
+ hubBinary: HubBinaryInstall;
32
32
  installTimeoutMs: number;
33
33
  docsUrl?: string;
34
34
  }
35
+ export interface HubBinaryInstall {
36
+ /** Resolve id for the Hub (GET /api/v15/runtime/:id/resolve?platform=…). */
37
+ resourceId: string;
38
+ /** Absolute path the per-platform binary is written to (matches upstream layout). */
39
+ dest(): string;
40
+ /** Directory appended to the persistent user PATH so the agent shell finds `bin`. */
41
+ pathDir(): string;
42
+ /** chmod 0o755 after writing (POSIX). */
43
+ posixExecutable: boolean;
44
+ }
35
45
  export declare const RUNTIME_DEPENDENCIES: Record<string, RuntimeDependencySpec>;
36
46
  export interface RuntimeDependencyStatus {
37
47
  id: string;
@@ -46,6 +56,22 @@ export interface RuntimeDependencyStatus {
46
56
  estSizeMB?: number;
47
57
  docsUrl?: string;
48
58
  }
59
+ /** Resolved download for a hub-binary runtime (signed URL + integrity metadata). */
60
+ export interface ResolvedRuntimeBinary {
61
+ version: string;
62
+ downloadUrl: string;
63
+ /** sha256 hex digest — the integrity anchor verified before placing the file. */
64
+ checksum: string;
65
+ sizeBytes: number;
66
+ }
67
+ export interface RuntimeInstallDeps {
68
+ /** Resolve a hub-binary runtime via the Hub (community client). */
69
+ resolveBinary(id: string, platform: string): Promise<ResolvedRuntimeBinary>;
70
+ /** Injectable for tests. */
71
+ fetchFn?: typeof fetch;
72
+ }
73
+ /** Map this host to the officecli asset platform key (`<os>-<arch>`). */
74
+ export declare function runtimePlatformKey(): string;
49
75
  export declare function probeRuntimeDependency(id: string): Promise<RuntimeDependencyStatus>;
50
76
  export interface RuntimeInstallResult {
51
77
  id: string;
@@ -53,4 +79,4 @@ export interface RuntimeInstallResult {
53
79
  version?: string;
54
80
  binPath?: string;
55
81
  }
56
- export declare function installRuntimeDependency(id: string): Promise<RuntimeInstallResult>;
82
+ export declare function installRuntimeDependency(id: string, deps: RuntimeInstallDeps): Promise<RuntimeInstallResult>;
@@ -19,6 +19,10 @@ export interface SkillListEntry {
19
19
  fallbackDescription: string;
20
20
  systemGenerated: boolean;
21
21
  version?: string;
22
+ /** Registry version actually installed (from the lifecycle store) — same
23
+ * namespace as the catalog's latestVersion, so the UI can detect
24
+ * installed < latest and offer an update. Absent for non-registry skills. */
25
+ registryVersion?: string;
22
26
  description?: string;
23
27
  }
24
28
  /**
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Official China-mirror env vars (WS-A1a). Single source of truth: the constant
3
+ * map that points dependency pulls (npm/pip/uv) at official mainland mirrors —
4
+ * NOT our OSS. Lives in the config layer (not infra) so it can be public API:
5
+ * the runtime gateway merges it into the agent env when the user's region/network
6
+ * switch is on (cross-cutting ③); MCP subprocesses and skill shells then inherit
7
+ * it via the agent-process FORWARDED_ENV_KEYS list.
8
+ *
9
+ * Honest scope: this only redirects dependency *resolution* to official mirrors
10
+ * (covers most). It does NOT guarantee cold/new packages (npmmirror sync lag →
11
+ * 404) or run-time foreign APIs — those are surfaced as reachability notices (WS-A6).
12
+ */
13
+ export declare const CN_NPM_REGISTRY = "https://registry.npmmirror.com";
14
+ export declare const CN_PYPI_INDEX = "https://pypi.tuna.tsinghua.edu.cn/simple";
15
+ /** npmmirror's binary host — runtime interpreters (python-build-standalone, node dist). */
16
+ export declare const CN_BINARY_HOST = "https://registry.npmmirror.com/-/binary";
17
+ /** Mirror endpoint values (official mirrors, not our OSS). */
18
+ export declare function buildCnMirrorEnv(): Record<string, string>;
19
+ /**
20
+ * The env keys `buildCnMirrorEnv()` sets. agent-process appends these to its
21
+ * forwarded-env list so a mirror set on the agent propagates to MCP/skill children.
22
+ */
23
+ export declare const CN_MIRROR_ENV_KEYS: string[];
@@ -12,4 +12,5 @@ export { StdioTransport } from "./cli/transport.js";
12
12
  export { StdioServer, type StdioServerConfig } from "./cli/stdio-server.js";
13
13
  export type { LLMTransport, LLMRequest, LLMChunk } from "./runtime/ports/index.js";
14
14
  export { createHookRegistry } from "./runtime/hooks/hook-registry.js";
15
+ export { buildCnMirrorEnv, CN_MIRROR_ENV_KEYS } from "./config/cn-mirror.js";
15
16
  export { buildSkillInstruction, } from "./orchestration/index.js";
@@ -232,7 +232,15 @@ export interface SettingsListModelsResult {
232
232
  provider: string;
233
233
  model: string;
234
234
  displayName: string;
235
- purposes: string[];
235
+ routeIntents: string[];
236
+ capabilityProfile?: {
237
+ tasks?: string[];
238
+ input_modalities?: string[];
239
+ output_modalities?: string[];
240
+ traits?: string[];
241
+ verification?: Record<string, unknown>;
242
+ cost?: Record<string, unknown>;
243
+ };
236
244
  baseUrl?: string;
237
245
  enabled: boolean;
238
246
  }>;
@@ -241,7 +249,15 @@ export interface SettingsListModelsResult {
241
249
  provider: string;
242
250
  model: string;
243
251
  displayName: string;
244
- purposes: string[];
252
+ routeIntents: string[];
253
+ capabilityProfile?: {
254
+ tasks?: string[];
255
+ input_modalities?: string[];
256
+ output_modalities?: string[];
257
+ traits?: string[];
258
+ verification?: Record<string, unknown>;
259
+ cost?: Record<string, unknown>;
260
+ };
245
261
  baseUrl?: string;
246
262
  enabled: boolean;
247
263
  }>>;
@@ -259,7 +275,15 @@ export interface SettingsGetActiveModelResult {
259
275
  provider: string;
260
276
  model: string;
261
277
  displayName: string;
262
- purposes: string[];
278
+ routeIntents: string[];
279
+ capabilityProfile?: {
280
+ tasks?: string[];
281
+ input_modalities?: string[];
282
+ output_modalities?: string[];
283
+ traits?: string[];
284
+ verification?: Record<string, unknown>;
285
+ cost?: Record<string, unknown>;
286
+ };
263
287
  enabled: boolean;
264
288
  } | null;
265
289
  available: boolean;
@@ -24,12 +24,35 @@ export interface CommunityConsentClient {
24
24
  recordSignal(input: CommunityRecordSignalInput): Promise<CommunityRecordSignalResult>;
25
25
  recordTelemetry(input: CommunityRecordTelemetryInput): Promise<CommunityRecordTelemetryResult>;
26
26
  resolveInstall(resourceId: string, version?: string): Promise<CommunityInstallResolution>;
27
+ /** List a resource's published versions for the version/rollback menu (WS-B3). The
28
+ * default client always implements it; optional so lightweight mocks may omit it. */
29
+ listResourceVersions?(resourceId: string): Promise<CommunityResourceVersion[]>;
30
+ /** Rate a resource 1–5 (WS-B4); returns the new summary. Optional for mocks. */
31
+ rateResource?(resourceId: string, stars: number): Promise<CommunityRatingSummary>;
32
+ /** Current rating average + count (WS-B4). Optional for mocks. */
33
+ getRatingSummary?(resourceId: string): Promise<CommunityRatingSummary>;
34
+ /** Report a resource for abuse (WS-B4). Optional for mocks. */
35
+ reportResource?(resourceId: string, reason?: string): Promise<void>;
36
+ /** List community comments for a resource (WS-B4). Optional for mocks. */
37
+ listComments?(resourceId: string): Promise<CommunityComment[]>;
38
+ /** Post a community comment (WS-B4); new accounts are folded by the Hub. Optional for mocks. */
39
+ postComment?(resourceId: string, body: string): Promise<CommunityCommentPosted>;
40
+ /** Resolve a vetted runtime binary (e.g. officecli) for this platform → Hub-signed download. */
41
+ resolveRuntime(id: string, platform: string): Promise<CommunityRuntimeResolution>;
27
42
  listSharedResources(): Promise<CommunitySharedResource[]>;
28
43
  withdrawSharedResource(resourceId: string, reason?: string): Promise<CommunitySharedResource>;
29
44
  withdrawSharedResources(reason?: string): Promise<CommunitySharedResource[]>;
30
45
  listNotices(input?: CommunityListNoticesInput): Promise<CommunityNotice[]>;
31
46
  markNoticeRead(noticeId: number): Promise<CommunityNotice>;
32
47
  }
48
+ export interface CommunityRuntimeResolution {
49
+ id: string;
50
+ version: string;
51
+ downloadUrl: string;
52
+ /** sha256 hex digest — verified client-side before placing the binary. */
53
+ checksum: string;
54
+ sizeBytes: number;
55
+ }
33
56
  export interface CommunitySharedResource {
34
57
  id: string;
35
58
  type: string;
@@ -96,12 +119,14 @@ export interface CommunityRecordTelemetryInput {
96
119
  export interface CommunityRecordTelemetryResult {
97
120
  accepted: true;
98
121
  }
122
+ /** Notice event set, mirrors the Hub's opened CHECK (cross-cutting ④). */
123
+ export type CommunityNoticeEvent = "withdrawn" | "version-available" | "deprecated" | "version-yanked" | "frozen";
99
124
  export interface CommunityNotice {
100
125
  id: number;
101
126
  resourceId: string;
102
127
  resourceType: string;
103
128
  title: string;
104
- event: "withdrawn";
129
+ event: CommunityNoticeEvent;
105
130
  version: string | null;
106
131
  reason: string | null;
107
132
  read: boolean;
@@ -131,11 +156,43 @@ export interface CommunityInstallResolution {
131
156
  sizeBytes: number;
132
157
  downloadUrl: string;
133
158
  manifest: unknown;
159
+ /** Minimum client version the resource declares, when present (cross-cutting ①). */
160
+ minClientVersion?: string;
161
+ /** EdDSA signature (base64) + signing key id over the integrity metadata (WS-B1). */
162
+ signature?: string | null;
163
+ signingKeyId?: string | null;
164
+ }
165
+ export interface CommunityResourceVersion {
166
+ version: string;
167
+ createdAt: string;
168
+ sizeBytes: number;
169
+ yanked: boolean;
170
+ }
171
+ export interface CommunityRatingSummary {
172
+ average: number;
173
+ count: number;
174
+ }
175
+ export interface CommunityComment {
176
+ id: number;
177
+ body: string;
178
+ folded: boolean;
179
+ createdAt: string;
180
+ }
181
+ export interface CommunityCommentPosted {
182
+ id: number;
183
+ folded: boolean;
184
+ createdAt: string;
134
185
  }
135
186
  export interface CommunityConsentClientOptions {
136
187
  baseUrl: string;
137
188
  token: string;
138
189
  fetchFn?: typeof fetch;
190
+ /**
191
+ * Client version reported to the Hub via the `x-client-version` header on
192
+ * every registry request (version negotiation skeleton, cross-cutting ①).
193
+ * Omitted when unknown — the Hub records it but never rejects in Phase 1.
194
+ */
195
+ clientVersion?: string;
139
196
  }
140
197
  export declare function createCommunityConsentClient(options: CommunityConsentClientOptions): CommunityConsentClient;
141
198
  export declare function createDefaultCommunityConsentClient(configPort?: ConfigPort): CommunityConsentClient | null;
@@ -1 +1 @@
1
- export type CommunityTelemetryEvent = "community.journey.view" | "community.share.generated" | "community.sandbox.violation" | "community.desensitization.hit";
1
+ export type CommunityTelemetryEvent = "community.journey.view" | "community.share.generated" | "community.sandbox.violation" | "community.desensitization.hit" | "registry.install_failed";
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Shared community-package materialization (download → verify → extract).
3
+ *
4
+ * Single source of truth for turning a registry install resolution into bytes on
5
+ * disk: whole-package sha256 + size check, then a minimal tar.gz extractor with a
6
+ * path-traversal guard. Used by the skill installer and the pet asset installer so
7
+ * the security-sensitive verify/extract logic lives in exactly one place.
8
+ */
9
+ import type { CommunityInstallResolution } from "./community-consent-client.js";
10
+ /**
11
+ * Fetch the package, verifying it matches the registry's size + sha256. Delegates
12
+ * to the ranged downloader (WS-C4): 4MB Range chunks + .part resume for large
13
+ * assets, with a transparent whole-body fallback for small/non-Range packages.
14
+ */
15
+ export declare function downloadAndVerifyPackage(fetchFn: typeof fetch, install: Pick<CommunityInstallResolution, "downloadUrl" | "sizeBytes" | "checksum">, label: string): Promise<Buffer>;
16
+ /** Extract a gzip-compressed tar into targetDir; only regular files + dirs, no traversal. */
17
+ export declare function extractTarGz(pkg: Buffer, targetDir: string, label: string): Promise<void>;
18
+ /** Resolve a tar entry under rootDir, rejecting absolute paths and `..` traversal. */
19
+ export declare function safeTarTarget(rootDir: string, entryName: string, label: string): string;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Ranged package download with resume (WS-C4). Fetches a package in 4MB Range
3
+ * chunks into a `.part` file (resumable across retries/process restarts), with
4
+ * per-chunk retry, then verifies the assembled file's size + sha256 and returns
5
+ * the bytes. When the server ignores Range (responds 200 instead of 206) it
6
+ * falls back to verifying the whole body in memory — so small packages and
7
+ * non-Range servers cost no disk. Verify semantics are identical to the plain
8
+ * downloader, so callers are unchanged.
9
+ */
10
+ export interface RangedDownloadTarget {
11
+ downloadUrl: string;
12
+ sizeBytes: number;
13
+ checksum: string;
14
+ }
15
+ export declare function rangedDownloadVerified(fetchFn: typeof fetch, target: RangedDownloadTarget, label: string): Promise<Buffer>;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Client-side registry signature verification (WS-B1, cross-cutting ⑤).
3
+ *
4
+ * `canonicalSigningPayload` MUST be byte-identical to the Hub's
5
+ * `core/registry/registry-signing.ts` — a hand-written fixed field order joined by
6
+ * newlines, never JSON. The shared golden vector in both repos' tests pins this so
7
+ * the two implementations can never silently diverge (a drift would make every
8
+ * signature fail to verify). Verification is a second anchor beside the sha256
9
+ * checksum in the download path; the trusted public key is built into the client.
10
+ */
11
+ export interface SignablePackage {
12
+ id: string;
13
+ version: string;
14
+ checksum: string;
15
+ sizeBytes: number;
16
+ }
17
+ /** Byte-exact canonical payload — keep identical to the Hub. Fixed order; never reorder. */
18
+ export declare function canonicalSigningPayload(p: SignablePackage): string;
19
+ /** Verify an Ed25519 signature (base64) over the canonical payload. False on any error. */
20
+ export declare function verifyPackageSignature(p: SignablePackage, signatureBase64: string, publicKeyPem: string): boolean;
21
+ /**
22
+ * Signature gate mode (WS-B1 gradual rollout): "warn" logs but installs; "strict"
23
+ * refuses an install whose signature is missing or invalid. Sourced from
24
+ * QLOGIC_REGISTRY_SIGNATURE_MODE; defaults to "warn" so backfill can precede strict.
25
+ */
26
+ export type SignatureMode = "warn" | "strict";
27
+ export declare function resolveSignatureMode(value: string | undefined): SignatureMode;
28
+ export interface SignedResolution extends SignablePackage {
29
+ signature?: string | null;
30
+ signingKeyId?: string | null;
31
+ }
32
+ /**
33
+ * Dual-anchor signature gate (WS-B1) applied beside the sha256 check on install.
34
+ * strict: throw on a missing or invalid signature. warn (default): never throw —
35
+ * return the outcome so the caller can log it. A missing trusted public key (key
36
+ * ceremony not yet done) behaves like "unsigned" so warn-mode installs proceed.
37
+ */
38
+ export declare function checkResolutionSignature(resolution: SignedResolution, mode: SignatureMode, trustedPublicKeyPem: string | undefined): {
39
+ verified: boolean;
40
+ reason?: "unsigned" | "no-trusted-key" | "invalid-signature";
41
+ };
@@ -1,4 +1,4 @@
1
- import type { ModelEntry, ModelRegistry, ReasoningMode } from "./model-registry.js";
1
+ import type { ModelCapabilityProfile, ModelEntry, ModelRegistry, ReasoningMode } from "./model-registry.js";
2
2
  import type { ConfigPort } from "../ports/index.js";
3
3
  export declare const LLMROUTER_CATALOG_UNAVAILABLE_MESSAGE = "\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55";
4
4
  export declare const LLMROUTER_PROVIDER_ID = "llmrouter";
@@ -35,7 +35,7 @@ export interface LlmrouterCatalogModel {
35
35
  displayName?: string;
36
36
  name?: string;
37
37
  category?: string;
38
- purposes?: string[];
38
+ route_intents?: string[];
39
39
  baseUrl?: string;
40
40
  base_url?: string;
41
41
  provider_transport?: string;
@@ -52,7 +52,7 @@ export interface LlmrouterCatalogModel {
52
52
  reasoningMode?: ReasoningMode;
53
53
  media_type?: string | null;
54
54
  mediaType?: string | null;
55
- capabilities?: string[];
55
+ capability_profile?: ModelCapabilityProfile;
56
56
  pricing?: Record<string, unknown>;
57
57
  }
58
58
  export declare function getLlmrouterBaseUrl(configPort?: ConfigPort): string;
@@ -26,7 +26,7 @@ export interface ModelEntry {
26
26
  provider: string;
27
27
  model: string;
28
28
  displayName: string;
29
- purposes: ModelPurpose[];
29
+ routeIntents: ModelPurpose[];
30
30
  baseUrl?: string;
31
31
  enabled: boolean;
32
32
  nativeModelId?: string;
@@ -36,11 +36,26 @@ export interface ModelEntry {
36
36
  streamRequired?: boolean;
37
37
  toolCall?: boolean;
38
38
  mediaType?: string | null;
39
- capabilities?: string[];
39
+ capabilityProfile?: ModelCapabilityProfile;
40
40
  pricing?: Record<string, unknown>;
41
41
  /** Thinking-strength control class for the UI (see ReasoningMode). */
42
42
  reasoningMode?: ReasoningMode;
43
43
  }
44
+ export interface ModelCapabilityProfile {
45
+ tasks?: string[];
46
+ input_modalities?: string[];
47
+ output_modalities?: string[];
48
+ traits?: string[];
49
+ verification?: {
50
+ state?: string;
51
+ source?: string;
52
+ };
53
+ cost?: {
54
+ tier?: string;
55
+ requires_confirmation?: boolean;
56
+ default_selectable?: boolean;
57
+ };
58
+ }
44
59
  export type PurposeBindings = Partial<Record<ModelPurpose, string>>;
45
60
  export interface ModelRegistryConfig {
46
61
  providers: ProviderPoolConfig[];
@@ -8,6 +8,19 @@ export interface InstalledCommunityPetResource {
8
8
  installDir: string;
9
9
  name: string;
10
10
  sanitized: boolean;
11
+ /** Number of declared asset files materialized to disk. */
12
+ assetCount: number;
11
13
  }
12
- export declare function installCommunityPetResource(install: CommunityInstallResolution): Promise<InstalledCommunityPetResource>;
14
+ export interface InstallCommunityPetOptions {
15
+ fetchFn?: typeof fetch;
16
+ /** Replace an existing install in place (update flow) instead of erroring. */
17
+ allowReplace?: boolean;
18
+ }
19
+ /**
20
+ * Materialize a community pet end to end (WS-AD4): download the asset package,
21
+ * verify the whole-package sha256 (+ per-file sha256 when declared), unpack to a
22
+ * quarantine dir, then land it atomically at the install dir. Previously this only
23
+ * wrote manifest.json — the actual webp/animation bytes never reached disk.
24
+ */
25
+ export declare function installCommunityPetResource(install: CommunityInstallResolution, options?: InstallCommunityPetOptions): Promise<InstalledCommunityPetResource>;
13
26
  export declare function assertPetInstall(install: CommunityInstallResolution): void;