@caplets/core 0.28.1 → 0.29.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/dist/native.js CHANGED
@@ -1,4 +1,4 @@
1
- import { B as nativeCodeModeToolId, I as nativeCapletPromptGuidance, L as nativeCapletToolDescription, R as nativeCapletToolName, V as nativeCodeModeToolName, h as createSdkRemoteCapletsClient, m as RemoteNativeCapletsService, t as createNativeCapletsService, w as resolveNativeCapletsServiceOptions, z as nativeCapletsSystemGuidance } from "./service-B6YvNthO.js";
1
+ import { B as nativeCodeModeToolId, I as nativeCapletPromptGuidance, L as nativeCapletToolDescription, R as nativeCapletToolName, V as nativeCodeModeToolName, h as createSdkRemoteCapletsClient, m as RemoteNativeCapletsService, t as createNativeCapletsService, w as resolveNativeCapletsServiceOptions, z as nativeCapletsSystemGuidance } from "./service-CnVGCjpT.js";
2
2
  import { generatedToolInputJsonSchema, generatedToolInputSchema } from "./generated-tool-input-schema.js";
3
3
  //#region src/native/process-cleanup.ts
4
4
  function registerNativeCapletsProcessCleanup(service, options = {}) {
@@ -17221,6 +17221,13 @@ function defaultTelemetryNoticePath(env = process.env, home = homedir(), platfor
17221
17221
  function defaultTelemetryDeliveryHealthPath(env = process.env, home = homedir(), platform = process.platform) {
17222
17222
  return (platform === "win32" ? win32.join : posix.join)(defaultTelemetryStateDir(env, home, platform), "delivery-health.json");
17223
17223
  }
17224
+ function defaultUpdateCheckStateDir(env = process.env, home = homedir(), platform = process.platform) {
17225
+ return (platform === "win32" ? win32.join : posix.join)(defaultStateBaseDir(env, home, platform), "caplets", "update-check");
17226
+ }
17227
+ function defaultUpdateCheckCacheDir(env = process.env, home = homedir(), platform = process.platform) {
17228
+ const pathJoin = platform === "win32" ? win32.join : posix.join;
17229
+ return platform === "win32" ? pathJoin(defaultCacheBaseDir(env, home, platform), "caplets", "cache", "update-check") : pathJoin(defaultCacheBaseDir(env, home, platform), "caplets", "update-check");
17230
+ }
17224
17231
  function defaultArtifactDir(env = process.env, home = homedir(), platform = process.platform) {
17225
17232
  return (platform === "win32" ? win32.join : posix.join)(defaultStateBaseDir(env, home, platform), "caplets", "artifacts");
17226
17233
  }
@@ -17239,6 +17246,8 @@ const DEFAULT_TELEMETRY_STATE_DIR = defaultTelemetryStateDir();
17239
17246
  defaultTelemetryIdentityPath();
17240
17247
  defaultTelemetryNoticePath();
17241
17248
  defaultTelemetryDeliveryHealthPath();
17249
+ const DEFAULT_UPDATE_CHECK_STATE_DIR = defaultUpdateCheckStateDir();
17250
+ const DEFAULT_UPDATE_CHECK_CACHE_DIR = defaultUpdateCheckCacheDir();
17242
17251
  const DEFAULT_COMPLETION_CACHE_DIR = defaultCompletionCacheDir();
17243
17252
  const DEFAULT_OBSERVED_OUTPUT_SHAPE_CACHE_DIR = defaultObservedOutputShapeCacheDir();
17244
17253
  const PROJECT_CONFIG_FILE = join(".caplets", "config.json");
@@ -18173,23 +18182,33 @@ var DownstreamManager = class {
18173
18182
  const capabilities = (await this.connect(server)).client.getServerCapabilities() ?? {};
18174
18183
  const tools = await this.refreshTools(server, true);
18175
18184
  this.registry.setStatus(server.server, "available");
18185
+ const capabilitySummary = {
18186
+ tools: Boolean(capabilities.tools),
18187
+ resources: Boolean(capabilities.resources),
18188
+ resourceTemplates: Boolean(capabilities.resources),
18189
+ prompts: Boolean(capabilities.prompts),
18190
+ completions: Boolean(capabilities.completions)
18191
+ };
18176
18192
  const result = {
18177
18193
  id: server.server,
18178
18194
  status: "available",
18179
- capabilities: {
18180
- tools: Boolean(capabilities.tools),
18181
- resources: Boolean(capabilities.resources),
18182
- resourceTemplates: Boolean(capabilities.resources),
18183
- prompts: Boolean(capabilities.prompts),
18184
- completions: Boolean(capabilities.completions)
18185
- },
18195
+ capabilities: capabilitySummary,
18186
18196
  toolCount: tools.length,
18187
18197
  elapsedMs: Date.now() - startedAt
18188
18198
  };
18189
- if (capabilities.resources) Object.assign(result, {
18190
- resourceCount: (await this.listResources(server, true)).length,
18191
- resourceTemplateCount: (await this.listResourceTemplates(server, true)).length
18192
- });
18199
+ if (capabilities.resources) {
18200
+ let resourceTemplateCount = 0;
18201
+ try {
18202
+ resourceTemplateCount = (await this.listResourceTemplates(server, true)).length;
18203
+ } catch (error) {
18204
+ if (!isUnsupportedCapability$1(error)) throw error;
18205
+ capabilitySummary.resourceTemplates = false;
18206
+ }
18207
+ Object.assign(result, {
18208
+ resourceCount: (await this.listResources(server, true)).length,
18209
+ resourceTemplateCount
18210
+ });
18211
+ }
18193
18212
  if (capabilities.prompts) Object.assign(result, { promptCount: (await this.listPrompts(server, true)).length });
18194
18213
  return result;
18195
18214
  } catch (error) {
@@ -18252,11 +18271,23 @@ var DownstreamManager = class {
18252
18271
  if (!force && connection.resourceTemplates && this.isCacheFresh(connection.resourceTemplatesFetchedAt, server.toolCacheTtlMs)) return connection.resourceTemplates;
18253
18272
  const resourceTemplates = [];
18254
18273
  let cursor;
18255
- do {
18256
- const result = await connection.client.listResourceTemplates(cursor ? { cursor } : void 0, { timeout: server.startupTimeoutMs });
18257
- resourceTemplates.push(...result.resourceTemplates ?? []);
18258
- cursor = result.nextCursor;
18259
- } while (cursor);
18274
+ try {
18275
+ do {
18276
+ const result = await connection.client.listResourceTemplates(cursor ? { cursor } : void 0, { timeout: server.startupTimeoutMs });
18277
+ resourceTemplates.push(...result.resourceTemplates ?? []);
18278
+ cursor = result.nextCursor;
18279
+ } while (cursor);
18280
+ } catch (error) {
18281
+ if (isMcpMethodNotFoundError(error)) {
18282
+ connection.resourceTemplates = [];
18283
+ connection.resourceTemplatesFetchedAt = Date.now();
18284
+ throw new CapletsError("UNSUPPORTED_CAPABILITY", `${server.server} does not implement MCP resource templates`, {
18285
+ server: server.server,
18286
+ capability: "resourceTemplates"
18287
+ });
18288
+ }
18289
+ throw error;
18290
+ }
18260
18291
  connection.resourceTemplates = resourceTemplates;
18261
18292
  connection.resourceTemplatesFetchedAt = Date.now();
18262
18293
  return resourceTemplates;
@@ -18680,6 +18711,12 @@ function nearbyToolNames(tools, needle) {
18680
18711
  function isTimeoutLike(error) {
18681
18712
  return error instanceof Error && /timeout|timed out|aborted/i.test(error.message);
18682
18713
  }
18714
+ function isUnsupportedCapability$1(error) {
18715
+ return error instanceof CapletsError && error.code === "UNSUPPORTED_CAPABILITY";
18716
+ }
18717
+ function isMcpMethodNotFoundError(error) {
18718
+ return error instanceof Error && /MCP error -32601/i.test(error.message);
18719
+ }
18683
18720
  function stringifyPromptArgs(args) {
18684
18721
  const stringified = {};
18685
18722
  for (const [key, value] of Object.entries(args)) {
@@ -64478,7 +64515,7 @@ async function defaultSentryFactory(dsn) {
64478
64515
  }
64479
64516
  //#endregion
64480
64517
  //#region package.json
64481
- var version = "0.28.1";
64518
+ var version = "0.29.0";
64482
64519
  //#endregion
64483
64520
  //#region src/telemetry/runtime.ts
64484
64521
  function createRuntimeTelemetryContext(options) {
@@ -64855,7 +64892,7 @@ var CapletsEngine = class {
64855
64892
  }
64856
64893
  }
64857
64894
  async completeCliWords(words) {
64858
- const { completeCliWords } = await import("./completion-D9253pYs.js").then((n) => n.r);
64895
+ const { completeCliWords } = await import("./completion-YRQc_o-I.js").then((n) => n.r);
64859
64896
  return await completeCliWords(words, {
64860
64897
  config: this.registry.config,
64861
64898
  managers: {
@@ -85480,4 +85517,4 @@ function errorMessage(error) {
85480
85517
  return error instanceof Error ? error.message : String(error);
85481
85518
  }
85482
85519
  //#endregion
85483
- export { redactCodeModeLogText as $, getParseErrorMessage as $n, readTokenBundle as $t, resolveRemoteMode as A, GetPromptRequestSchema as An, loadProjectConfig as At, nativeCodeModeToolId as B, LoggingLevelSchema as Bn, discoverCapletFiles as Bt, CapletsCloudClient as C, CreateMessageResultSchema as Cn, ServerRegistry as Ct, normalizeRemoteProfileHostUrl as D, ElicitResultSchema as Dn, loadConfigWithSources as Dt, isCapletsCloudUrl as E, DEFAULT_NEGOTIATED_PROTOCOL_VERSION as En, loadConfig as Et, resolveCapletsServer as F, ListPromptsRequestSchema as Fn, FileVaultStore as Ft, runCodeMode as G, assertCompleteRequestPrompt as Gn, markdownStructuredContent as Gt, codeModeRunInputSchema as H, ReadResourceRequestSchema as Hn, loadCapletFilesFromMap as Ht, nativeCapletPromptGuidance as I, ListResourceTemplatesRequestSchema as In, VAULT_MAX_VALUE_BYTES as It, diagnoseCodeModeTypeScript as J, isJSONRPCErrorResponse as Jn, runOAuthFlow as Jt, CodeModeSessionManager as K, assertCompleteRequestResourceTemplate as Kn, refreshOAuthTokenBundle as Kt, nativeCapletToolDescription as L, ListResourcesRequestSchema as Ln, validateVaultKeyName as Lt, controlUrlForBase as M, InitializedNotificationSchema as Mn, vaultBootstrapResolver as Mt, isLoopbackHost as N, JSONRPCMessageSchema as Nn, vaultResolverForAuthDir as Nt, resolveCapletsRemote as O, EmptyResultSchema as On, loadGlobalConfig as Ot, parseServerBaseUrl as P, LATEST_PROTOCOL_VERSION as Pn, vaultStoreForAuthDir as Pt, CodeModeLogStore as Q, getObjectShape as Qn, isTokenBundleExpired as Qt, nativeCapletToolName as R, ListRootsResultSchema as Rn, decryptVaultValue as Rt, buildProjectSyncManifest as S, CompleteRequestSchema as Sn, handleServerTool as St, hostedCloudWorkspaceFromRemoteUrl as T, CreateTaskResultSchema as Tn, GoogleDiscoveryManager as Tt, codeModeRunParamsSchema as U, SUPPORTED_PROTOCOL_VERSIONS as Un, hasRenderableStructuredContent as Ut, nativeCodeModeToolName as V, McpError as Vn, validateCapletFile as Vt, emptyCodeModeRunMeta as W, SetLevelRequestSchema as Wn, markdownCallToolResultContent as Wt, listCodeModeCallableCaplets as X, isJSONRPCResultResponse as Xn, startOAuthFlow as Xt, createCodeModeCapletsApi as Y, isJSONRPCRequest as Yn, startGenericOAuthFlow as Yt, CodeModeJournalStore as Z, getLiteralValue as Zn, deleteTokenBundle as Zt, attachErrorResponse as _, Protocol as _n, rotateTelemetryIdentity as _t, CloudAuthStore as a, defaultConfigPath as an, safeParse as ar, version as at, invokeAttachExport$1 as b, CallToolRequestSchema as bn, findProjectRoot as bt, redactedCloudAuthStatus as c, resolveCapletsRoot as cn, buildProductTelemetryEvent as ct, projectBindingError as d, resolveProjectConfigPath as dn, maybePrintTelemetryNotice as dt, DEFAULT_AUTH_DIR as en, getSchemaDescription as er, codeModeDeclarationHash as et, projectBindingRecovery as f, ReadBuffer as fn, resolveTelemetryState as ft, CAPLETS_ATTACH_SESSION_HEADER as g, AjvJsonSchemaValidator as gn, readTelemetryNotice as gt, createSdkRemoteCapletsClient as h, assertToolsCallTaskCapability as hn, readTelemetryIdentity as ht, createRemoteProfileStore as i, defaultConfigBaseDir as in, objectFromShape as ir, CapletsEngine as it, appendBasePath as j, InitializeRequestSchema as jn, parseConfig as jt, resolveHostedCloudRemote as k, ErrorCode as kn, loadLocalOverlayConfigWithSources as kt, PROJECT_BINDING_ERROR_CODES as l, resolveConfigPath as ln, buildReliabilityTelemetryEvent as lt, RemoteNativeCapletsService as m, assertClientRequestTaskCapability as mn, readTelemetryDeliveryHealth as mt, resolveRemoteSelection as n, DEFAULT_OBSERVED_OUTPUT_SHAPE_CACHE_DIR as nn, isZ4Schema as nr, generateCodeModeRunToolDescription as nt, cloudAuthPath as o, defaultStateBaseDir as on, safeParseAsync as or, createTelemetryDispatcher as ot, CloudAuthClient as p, serializeMessage as pn, deleteTelemetryIdentity as pt, QuickJsCodeModeSandbox as q, isInitializeRequest as qn, runGenericOAuthFlow as qt, cloudCredentialsFromRemoteProfile as r, defaultCacheBaseDir as rn, normalizeObjectSchema as rr, minifyCodeModeDeclarationText as rt, migrateCredentials as s, defaultTelemetryStateDir as sn, TelemetryDebugSink as st, createNativeCapletsService as t, DEFAULT_COMPLETION_CACHE_DIR as tn, isSchemaOptional as tr, generateCodeModeDeclarations as tt, ProjectBindingError as u, resolveProjectCapletsRoot as un, durationBucket as ut, buildAttachProjection as v, mergeCapabilities as vn, resolveExposure as vt, resolveNativeCapletsServiceOptions as w, CreateMessageResultWithToolsSchema as wn, capabilityDescription as wt, invokeNativeAttachExport as x, CallToolResultSchema as xn, fingerprintProjectRoot as xt, buildNativeAttachProjection as y, toJsonSchemaCompat as yn, decodeDirectResourceUri as yt, nativeCapletsSystemGuidance as z, ListToolsRequestSchema as zn, encryptVaultValue as zt };
85520
+ export { redactCodeModeLogText as $, isJSONRPCRequest as $n, readTokenBundle as $t, resolveRemoteMode as A, DEFAULT_NEGOTIATED_PROTOCOL_VERSION as An, loadProjectConfig as At, nativeCodeModeToolId as B, ListResourceTemplatesRequestSchema as Bn, discoverCapletFiles as Bt, CapletsCloudClient as C, toJsonSchemaCompat as Cn, ServerRegistry as Ct, normalizeRemoteProfileHostUrl as D, CreateMessageResultSchema as Dn, loadConfigWithSources as Dt, isCapletsCloudUrl as E, CompleteRequestSchema as En, loadConfig as Et, resolveCapletsServer as F, InitializeRequestSchema as Fn, FileVaultStore as Ft, runCodeMode as G, McpError as Gn, markdownStructuredContent as Gt, codeModeRunInputSchema as H, ListRootsResultSchema as Hn, loadCapletFilesFromMap as Ht, nativeCapletPromptGuidance as I, InitializedNotificationSchema as In, VAULT_MAX_VALUE_BYTES as It, diagnoseCodeModeTypeScript as J, SetLevelRequestSchema as Jn, runOAuthFlow as Jt, CodeModeSessionManager as K, ReadResourceRequestSchema as Kn, refreshOAuthTokenBundle as Kt, nativeCapletToolDescription as L, JSONRPCMessageSchema as Ln, validateVaultKeyName as Lt, controlUrlForBase as M, EmptyResultSchema as Mn, vaultBootstrapResolver as Mt, isLoopbackHost as N, ErrorCode as Nn, vaultResolverForAuthDir as Nt, resolveCapletsRemote as O, CreateMessageResultWithToolsSchema as On, loadGlobalConfig as Ot, parseServerBaseUrl as P, GetPromptRequestSchema as Pn, vaultStoreForAuthDir as Pt, CodeModeLogStore as Q, isJSONRPCErrorResponse as Qn, isTokenBundleExpired as Qt, nativeCapletToolName as R, LATEST_PROTOCOL_VERSION as Rn, decryptVaultValue as Rt, buildProjectSyncManifest as S, mergeCapabilities as Sn, handleServerTool as St, hostedCloudWorkspaceFromRemoteUrl as T, CallToolResultSchema as Tn, GoogleDiscoveryManager as Tt, codeModeRunParamsSchema as U, ListToolsRequestSchema as Un, hasRenderableStructuredContent as Ut, nativeCodeModeToolName as V, ListResourcesRequestSchema as Vn, validateCapletFile as Vt, emptyCodeModeRunMeta as W, LoggingLevelSchema as Wn, markdownCallToolResultContent as Wt, listCodeModeCallableCaplets as X, assertCompleteRequestResourceTemplate as Xn, startOAuthFlow as Xt, createCodeModeCapletsApi as Y, assertCompleteRequestPrompt as Yn, startGenericOAuthFlow as Yt, CodeModeJournalStore as Z, isInitializeRequest as Zn, deleteTokenBundle as Zt, attachErrorResponse as _, serializeMessage as _n, rotateTelemetryIdentity as _t, CloudAuthStore as a, defaultCacheBaseDir as an, isSchemaOptional as ar, version as at, invokeAttachExport$1 as b, AjvJsonSchemaValidator as bn, findProjectRoot as bt, redactedCloudAuthStatus as c, defaultStateBaseDir as cn, objectFromShape as cr, buildProductTelemetryEvent as ct, projectBindingError as d, defaultUpdateCheckStateDir as dn, maybePrintTelemetryNotice as dt, DEFAULT_AUTH_DIR as en, isJSONRPCResultResponse as er, codeModeDeclarationHash as et, projectBindingRecovery as f, resolveCapletsRoot as fn, resolveTelemetryState as ft, CAPLETS_ATTACH_SESSION_HEADER as g, ReadBuffer as gn, readTelemetryNotice as gt, createSdkRemoteCapletsClient as h, resolveProjectConfigPath as hn, readTelemetryIdentity as ht, createRemoteProfileStore as i, DEFAULT_UPDATE_CHECK_STATE_DIR as in, getSchemaDescription as ir, CapletsEngine as it, appendBasePath as j, ElicitResultSchema as jn, parseConfig as jt, resolveHostedCloudRemote as k, CreateTaskResultSchema as kn, loadLocalOverlayConfigWithSources as kt, PROJECT_BINDING_ERROR_CODES as l, defaultTelemetryStateDir as ln, safeParse as lr, buildReliabilityTelemetryEvent as lt, RemoteNativeCapletsService as m, resolveProjectCapletsRoot as mn, readTelemetryDeliveryHealth as mt, resolveRemoteSelection as n, DEFAULT_OBSERVED_OUTPUT_SHAPE_CACHE_DIR as nn, getObjectShape as nr, generateCodeModeRunToolDescription as nt, cloudAuthPath as o, defaultConfigBaseDir as on, isZ4Schema as or, createTelemetryDispatcher as ot, CloudAuthClient as p, resolveConfigPath as pn, deleteTelemetryIdentity as pt, QuickJsCodeModeSandbox as q, SUPPORTED_PROTOCOL_VERSIONS as qn, runGenericOAuthFlow as qt, cloudCredentialsFromRemoteProfile as r, DEFAULT_UPDATE_CHECK_CACHE_DIR as rn, getParseErrorMessage as rr, minifyCodeModeDeclarationText as rt, migrateCredentials as s, defaultConfigPath as sn, normalizeObjectSchema as sr, TelemetryDebugSink as st, createNativeCapletsService as t, DEFAULT_COMPLETION_CACHE_DIR as tn, getLiteralValue as tr, generateCodeModeDeclarations as tt, ProjectBindingError as u, defaultUpdateCheckCacheDir as un, safeParseAsync as ur, durationBucket as ut, buildAttachProjection as v, assertClientRequestTaskCapability as vn, resolveExposure as vt, resolveNativeCapletsServiceOptions as w, CallToolRequestSchema as wn, capabilityDescription as wt, invokeNativeAttachExport as x, Protocol as xn, fingerprintProjectRoot as xt, buildNativeAttachProjection as y, assertToolsCallTaskCapability as yn, decodeDirectResourceUri as yt, nativeCapletsSystemGuidance as z, ListPromptsRequestSchema as zn, encryptVaultValue as zt };
@@ -0,0 +1,5 @@
1
+ export declare const DISABLE_UPDATE_CHECK_ENV = "CAPLETS_DISABLE_UPDATE_CHECK";
2
+ export declare const UPDATE_NOTICE_STDERR_ENV = "CAPLETS_UPDATE_NOTICE_STDERR";
3
+ export type UpdateCheckEnv = Record<string, string | undefined> | NodeJS.ProcessEnv;
4
+ export declare function isUpdateCheckDisabled(env?: UpdateCheckEnv): boolean;
5
+ export declare function isUpdateNoticeStderrOptIn(env?: UpdateCheckEnv): boolean;
@@ -0,0 +1,14 @@
1
+ import { type UpdateCheckEnv } from "./control";
2
+ export type UpdateNoticeEligibility = {
3
+ eligible: true;
4
+ command: string;
5
+ } | {
6
+ eligible: false;
7
+ reason: string;
8
+ };
9
+ export type UpdateNoticeEligibilityInput = {
10
+ args: string[];
11
+ env?: UpdateCheckEnv | undefined;
12
+ stderrIsTTY?: boolean | undefined;
13
+ };
14
+ export declare function classifyUpdateNoticeEligibility(input: UpdateNoticeEligibilityInput): UpdateNoticeEligibility;
@@ -0,0 +1,8 @@
1
+ export { isUpdateCheckDisabled, isUpdateNoticeStderrOptIn } from "./control";
2
+ export { classifyUpdateNoticeEligibility } from "./eligibility";
3
+ export { maybePrintUpdateNotice } from "./notice";
4
+ export { fetchPublicCapletsMetadata } from "./registry";
5
+ export { refreshUpdateMetadata } from "./refresh";
6
+ export { UPDATE_CHECK_ACCEPT_HEADER, UPDATE_CHECK_CACHE_TTL_MS, UPDATE_CHECK_FETCH_TIMEOUT_MS, UPDATE_CHECK_LOCK_TTL_MS, UPDATE_CHECK_MAX_RESPONSE_BYTES, UPDATE_CHECK_MAX_STALE_MS, UPDATE_CHECK_NEGATIVE_TTL_MS, UPDATE_CHECK_NOTICE_REPEAT_MS, UPDATE_CHECK_PACKAGE_NAME, UPDATE_CHECK_REGISTRY_URL, acquireUpdateRefreshLock, readUpdateMetadataCache, readUpdateNoticeState, recordUpdateNoticeShown, releaseUpdateRefreshLock, shouldShowUpdateNotice, updateCheckCacheDir, updateCheckStateDir, updateMetadataCachePath, updateNoticeStatePath, updateRefreshLockPath, writePrivateJson, writeUpdateMetadataCache, } from "./state";
7
+ export { findAvailableUpdate } from "./version";
8
+ export type { PackageVersionMetadata } from "./version";
@@ -0,0 +1,13 @@
1
+ import { type UpdateCheckPathsOptions } from "./state";
2
+ export type MaybePrintUpdateNoticeOptions = UpdateCheckPathsOptions & {
3
+ args: string[];
4
+ env?: Record<string, string | undefined> | NodeJS.ProcessEnv | undefined;
5
+ version?: string | undefined;
6
+ fetcher?: typeof fetch | undefined;
7
+ signal?: AbortSignal | undefined;
8
+ stderrIsTTY?: boolean | undefined;
9
+ writeErr?: ((value: string) => void) | undefined;
10
+ now?: number | undefined;
11
+ refreshForLater?: boolean | undefined;
12
+ };
13
+ export declare function maybePrintUpdateNotice(options: MaybePrintUpdateNoticeOptions): Promise<void>;
@@ -0,0 +1,9 @@
1
+ import { type UpdateCheckPathsOptions } from "./state";
2
+ export type RefreshUpdateMetadataOptions = UpdateCheckPathsOptions & {
3
+ fetcher?: typeof fetch | undefined;
4
+ signal?: AbortSignal | undefined;
5
+ now?: number | undefined;
6
+ timeoutMs?: number | undefined;
7
+ maxResponseBytes?: number | undefined;
8
+ };
9
+ export declare function refreshUpdateMetadata(options?: RefreshUpdateMetadataOptions): Promise<"refreshed" | "skipped" | "failed">;
@@ -0,0 +1,12 @@
1
+ import type { PackageVersionMetadata } from "./version";
2
+ export declare class UpdateRegistryError extends Error {
3
+ readonly reason: "http" | "timeout" | "invalid" | "network" | "too_large" | "error";
4
+ constructor(message: string, reason: "http" | "timeout" | "invalid" | "network" | "too_large" | "error");
5
+ }
6
+ export type FetchUpdateMetadataOptions = {
7
+ fetcher?: typeof fetch | undefined;
8
+ signal?: AbortSignal | undefined;
9
+ timeoutMs: number;
10
+ maxResponseBytes?: number | undefined;
11
+ };
12
+ export declare function fetchPublicCapletsMetadata(options: FetchUpdateMetadataOptions): Promise<PackageVersionMetadata>;
@@ -0,0 +1,58 @@
1
+ import type { PackageVersionMetadata } from "./version";
2
+ export declare const UPDATE_CHECK_PACKAGE_NAME = "caplets";
3
+ export declare const UPDATE_CHECK_REGISTRY_URL = "https://registry.npmjs.org/caplets";
4
+ export declare const UPDATE_CHECK_ACCEPT_HEADER = "application/vnd.npm.install-v1+json";
5
+ export declare const UPDATE_CHECK_CACHE_TTL_MS: number;
6
+ export declare const UPDATE_CHECK_MAX_STALE_MS: number;
7
+ export declare const UPDATE_CHECK_NEGATIVE_TTL_MS: number;
8
+ export declare const UPDATE_CHECK_LOCK_TTL_MS: number;
9
+ export declare const UPDATE_CHECK_FETCH_TIMEOUT_MS = 250;
10
+ export declare const UPDATE_CHECK_MAX_RESPONSE_BYTES: number;
11
+ export declare const UPDATE_CHECK_NOTICE_REPEAT_MS: number;
12
+ export type UpdateCheckPathsOptions = {
13
+ cacheDir?: string | undefined;
14
+ stateDir?: string | undefined;
15
+ };
16
+ export type UpdateMetadataCacheEntry = {
17
+ status: "positive";
18
+ fetchedAt: number;
19
+ expiresAt: number;
20
+ staleUntil: number;
21
+ source: typeof UPDATE_CHECK_REGISTRY_URL;
22
+ metadata: PackageVersionMetadata;
23
+ } | {
24
+ status: "negative";
25
+ fetchedAt: number;
26
+ expiresAt: number;
27
+ reason: "http" | "timeout" | "invalid" | "network" | "too_large" | "error";
28
+ };
29
+ export type ReadUpdateMetadataCacheEntry = UpdateMetadataCacheEntry & {
30
+ fresh: boolean;
31
+ usable: boolean;
32
+ };
33
+ export type UpdateNoticeState = {
34
+ shown: Record<string, {
35
+ shownAt: number;
36
+ }>;
37
+ };
38
+ export declare function updateCheckCacheDir(options?: UpdateCheckPathsOptions): string;
39
+ export declare function updateCheckStateDir(options?: UpdateCheckPathsOptions): string;
40
+ export declare function updateMetadataCachePath(options?: UpdateCheckPathsOptions): string;
41
+ export declare function updateRefreshLockPath(options?: UpdateCheckPathsOptions): string;
42
+ export declare function updateNoticeStatePath(options?: UpdateCheckPathsOptions): string;
43
+ export declare function readUpdateMetadataCache(options?: UpdateCheckPathsOptions & {
44
+ now?: number | undefined;
45
+ }): ReadUpdateMetadataCacheEntry | undefined;
46
+ export declare function writeUpdateMetadataCache(entry: UpdateMetadataCacheEntry, options?: UpdateCheckPathsOptions): boolean;
47
+ export declare function readUpdateNoticeState(options?: UpdateCheckPathsOptions): UpdateNoticeState;
48
+ export declare function shouldShowUpdateNotice(version: string, options?: UpdateCheckPathsOptions & {
49
+ now?: number | undefined;
50
+ }): boolean;
51
+ export declare function recordUpdateNoticeShown(version: string, options?: UpdateCheckPathsOptions & {
52
+ now?: number | undefined;
53
+ }): boolean;
54
+ export declare function acquireUpdateRefreshLock(options?: UpdateCheckPathsOptions & {
55
+ now?: number | undefined;
56
+ }): boolean;
57
+ export declare function releaseUpdateRefreshLock(options?: UpdateCheckPathsOptions): void;
58
+ export declare function writePrivateJson(path: string, value: unknown): boolean;
@@ -0,0 +1,14 @@
1
+ export type PackageVersionMetadata = {
2
+ packageName: string;
3
+ distTags: Record<string, string>;
4
+ versions: string[];
5
+ };
6
+ export type AvailableUpdate = {
7
+ available: true;
8
+ runningVersion: string;
9
+ latestVersion: string;
10
+ } | {
11
+ available: false;
12
+ reason: "invalid-running-version" | "no-eligible-version";
13
+ };
14
+ export declare function findAvailableUpdate(runningVersion: string | undefined, metadata: PackageVersionMetadata): AvailableUpdate;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caplets/core",
3
- "version": "0.28.1",
3
+ "version": "0.29.0",
4
4
  "description": "Core runtime library for Caplets Code Mode and progressive disclosure gateways.",
5
5
  "keywords": [
6
6
  "caplets",
@@ -100,6 +100,7 @@
100
100
  "hono": "^4.12.25",
101
101
  "posthog-node": "^4.18.0",
102
102
  "quickjs-emscripten": "^0.32.0",
103
+ "semver": "^7.8.5",
103
104
  "typescript": "^6.0.3",
104
105
  "vfile": "^6.0.3",
105
106
  "vfile-matter": "^5.0.1",
@@ -110,6 +111,7 @@
110
111
  },
111
112
  "devDependencies": {
112
113
  "@types/node": "^25.9.3",
114
+ "@types/semver": "^7.7.1",
113
115
  "@typescript/native-preview": "7.0.0-dev.20260613.1",
114
116
  "rolldown": "^1.1.1",
115
117
  "vitest": "^4.1.8"