@caplets/core 0.26.1 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/attach/api.d.ts +10 -1
  2. package/dist/caplet-files-bundle.d.ts +1 -0
  3. package/dist/caplet-source.js +39 -3
  4. package/dist/cli/code-mode.d.ts +3 -2
  5. package/dist/cli/commands.d.ts +3 -1
  6. package/dist/cli/inspection.d.ts +2 -1
  7. package/dist/cli.d.ts +4 -0
  8. package/dist/code-mode/types.d.ts +2 -1
  9. package/dist/{completion-CFOJucl5.js → completion-CjE0EnbF.js} +16 -4
  10. package/dist/config/paths.d.ts +9 -0
  11. package/dist/config/validation.d.ts +2 -0
  12. package/dist/config-runtime.d.ts +6 -1
  13. package/dist/config-runtime.js +34 -3
  14. package/dist/config.d.ts +13 -2
  15. package/dist/engine.d.ts +18 -0
  16. package/dist/errors.d.ts +1 -1
  17. package/dist/esm-Db9dhnIG.js +7488 -0
  18. package/dist/exposure/namespace.d.ts +39 -0
  19. package/dist/index.js +840 -483
  20. package/dist/native/options.d.ts +1 -0
  21. package/dist/native/remote.d.ts +4 -2
  22. package/dist/native/service.d.ts +16 -2
  23. package/dist/native.js +1 -1
  24. package/dist/node-BgWIvSVP.js +17214 -0
  25. package/dist/rolldown-runtime-CE-6LUnI.js +44 -0
  26. package/dist/serve/http.d.ts +16 -1
  27. package/dist/serve/options.d.ts +2 -0
  28. package/dist/{service-aBIn4nrw.js → service-BfPCRxQ9.js} +2043 -154
  29. package/dist/src-Cd2QIUm1.js +813 -0
  30. package/dist/telemetry/context.d.ts +13 -0
  31. package/dist/telemetry/debug.d.ts +10 -0
  32. package/dist/telemetry/delivery.d.ts +1 -0
  33. package/dist/telemetry/events.d.ts +70 -0
  34. package/dist/telemetry/identity.d.ts +1 -0
  35. package/dist/telemetry/index.d.ts +8 -0
  36. package/dist/telemetry/intake.generated.d.ts +2 -0
  37. package/dist/telemetry/notice.d.ts +8 -0
  38. package/dist/telemetry/privacy.d.ts +3 -0
  39. package/dist/telemetry/providers.d.ts +21 -0
  40. package/dist/telemetry/runtime.d.ts +40 -0
  41. package/dist/telemetry/state.d.ts +53 -0
  42. package/dist/{validation-GD2x5HW1.js → validation-CWzd2gtn.js} +3 -1
  43. package/package.json +3 -1
@@ -0,0 +1,13 @@
1
+ import type { CapletsConfig } from "../config";
2
+ import { type TelemetryExecutionContext, type TelemetryState, type TelemetryStateOptions, type TelemetrySurface, type TelemetryVisibility } from "./state";
3
+ export type ResolveTelemetryStateOptions = TelemetryStateOptions & {
4
+ config?: Pick<CapletsConfig, "telemetry"> | undefined;
5
+ env?: NodeJS.ProcessEnv | undefined;
6
+ surface: TelemetrySurface;
7
+ visibility: TelemetryVisibility;
8
+ debug?: boolean | undefined;
9
+ allowWithoutNotice?: boolean | undefined;
10
+ createIdentity?: boolean | undefined;
11
+ };
12
+ export declare function resolveTelemetryState(options: ResolveTelemetryStateOptions): TelemetryState;
13
+ export declare function classifyExecutionContext(env?: NodeJS.ProcessEnv): TelemetryExecutionContext;
@@ -0,0 +1,10 @@
1
+ import type { TelemetryEvent } from "./events";
2
+ export type TelemetryDebugRecord = {
3
+ state: "debug" | "enabled" | "disabled" | "suppressed";
4
+ event: TelemetryEvent;
5
+ };
6
+ export declare class TelemetryDebugSink {
7
+ readonly records: TelemetryDebugRecord[];
8
+ capture(state: TelemetryDebugRecord["state"], event: TelemetryEvent): void;
9
+ toJSON(): TelemetryDebugRecord[];
10
+ }
@@ -0,0 +1 @@
1
+ export { readTelemetryDeliveryHealth, recordTelemetryDrop, type TelemetryDeliveryHealth, } from "./state";
@@ -0,0 +1,70 @@
1
+ import type { TelemetryExecutionContext, TelemetrySurface } from "./state";
2
+ export type RuntimeMode = "local" | "remote" | "cloud" | "unknown";
3
+ export type CommandFamily = "init" | "setup" | "add" | "install" | "auth" | "remote" | "doctor" | "serve" | "attach" | "daemon" | "inspect" | "check" | "tools" | "resources" | "prompts" | "complete" | "code_mode" | "native" | "telemetry" | "unknown";
4
+ export type Outcome = "success" | "failure" | "cancelled" | "timeout" | "suppressed";
5
+ export type DurationBucket = "lt_100ms" | "lt_1s" | "lt_5s" | "lt_30s" | "gte_30s";
6
+ export type TimeoutBucket = "none" | "lt_1s" | "lt_10s" | "lt_60s" | "gte_60s";
7
+ export type DiagnosticCategory = "config" | "auth" | "network" | "runtime" | "validation" | "code_mode" | "provider" | "unknown";
8
+ export type TelemetryProductEventName = "caplets_cli_command" | "caplets_tool_activation" | "caplets_code_mode_outcome";
9
+ export type TelemetryReliabilityEventName = "caplets_reliability_error";
10
+ export type TelemetryPropertyValue = string | number | boolean;
11
+ export type TelemetryProperties = Partial<{
12
+ package: string;
13
+ version: string;
14
+ surface: TelemetrySurface;
15
+ runtime_mode: RuntimeMode;
16
+ execution_context: TelemetryExecutionContext;
17
+ command_family: CommandFamily;
18
+ operation_family: CommandFamily;
19
+ outcome: Outcome;
20
+ duration_bucket: DurationBucket;
21
+ timeout_bucket: TimeoutBucket;
22
+ integration: "opencode" | "pi" | "native" | "unknown";
23
+ exposure_mode: "direct" | "progressive" | "code_mode" | "mixed" | "unknown";
24
+ backend_mcp_count: number;
25
+ backend_openapi_count: number;
26
+ backend_google_discovery_count: number;
27
+ backend_graphql_count: number;
28
+ backend_http_count: number;
29
+ backend_cli_count: number;
30
+ backend_caplets_count: number;
31
+ direct_count: number;
32
+ progressive_count: number;
33
+ code_mode_count: number;
34
+ session_category: "created" | "reused" | "none" | "unknown";
35
+ any_caplet_invoked: boolean;
36
+ provider: "posthog" | "sentry";
37
+ reason: string;
38
+ count_bucket: string;
39
+ error_code: string;
40
+ diagnostic_category: DiagnosticCategory;
41
+ os_family: NodeJS.Platform | "unknown";
42
+ arch: NodeJS.Architecture | "unknown";
43
+ node_major: number;
44
+ }>;
45
+ export type ProductTelemetryEvent = {
46
+ provider: "posthog";
47
+ name: TelemetryProductEventName;
48
+ distinctId: string;
49
+ properties: TelemetryProperties & {
50
+ $process_person_profile: false;
51
+ };
52
+ };
53
+ export type ReliabilityTelemetryEvent = {
54
+ provider: "sentry";
55
+ name: TelemetryReliabilityEventName;
56
+ tags: Record<string, string>;
57
+ fingerprint: string[];
58
+ };
59
+ export type TelemetryEvent = ProductTelemetryEvent | ReliabilityTelemetryEvent;
60
+ export declare function buildProductTelemetryEvent(input: {
61
+ name: TelemetryProductEventName;
62
+ distinctId: string;
63
+ properties: TelemetryProperties;
64
+ }): ProductTelemetryEvent;
65
+ export declare function buildReliabilityTelemetryEvent(input: {
66
+ name: TelemetryReliabilityEventName;
67
+ properties: TelemetryProperties;
68
+ }): ReliabilityTelemetryEvent;
69
+ export declare function durationBucket(ms: number): DurationBucket;
70
+ export declare function timeoutBucket(ms: number | undefined): TimeoutBucket;
@@ -0,0 +1 @@
1
+ export { deleteTelemetryIdentity, readTelemetryIdentity, rotateTelemetryIdentity, type TelemetryIdentity, } from "./state";
@@ -0,0 +1,8 @@
1
+ export { classifyExecutionContext, resolveTelemetryState, type ResolveTelemetryStateOptions, } from "./context";
2
+ export { deleteTelemetryIdentity, readTelemetryDeliveryHealth, readTelemetryIdentity, readTelemetryNotice, recordTelemetryDrop, recordTelemetryNoticeShown, rotateTelemetryIdentity, telemetryDeliveryHealthPath, telemetryIdentityPath, telemetryNoticePath, telemetryStateDir, type TelemetryDeliveryHealth, type TelemetryExecutionContext, type TelemetryIdentity, type TelemetryNoticeState, type TelemetryState, type TelemetryStateDecider, type TelemetryStateOptions, type TelemetryStateStatus, type TelemetrySurface, type TelemetryVisibility, } from "./state";
3
+ export { maybePrintTelemetryNotice, TELEMETRY_NOTICE } from "./notice";
4
+ export { buildProductTelemetryEvent, buildReliabilityTelemetryEvent, durationBucket, timeoutBucket, type CommandFamily, type DiagnosticCategory, type RuntimeMode, type ProductTelemetryEvent, type ReliabilityTelemetryEvent, type TelemetryEvent, type TelemetryProductEventName, type TelemetryProperties, type TelemetryReliabilityEventName, } from "./events";
5
+ export { assertTelemetrySafeProperties, stripSentryEvent } from "./privacy";
6
+ export { TelemetryDebugSink, type TelemetryDebugRecord } from "./debug";
7
+ export { createTelemetryDispatcher, type TelemetryDispatcher, type TelemetryDispatcherOptions, type TelemetryProviderFactories, } from "./providers";
8
+ export { backendFamilyCounts, captureRuntimeReliabilityEvent, captureRuntimeTelemetryEvent, codeModeTelemetryProperties, createRuntimeTelemetryContext, exposureModeCounts, operationFamilyFromOperation, outcomeFromResult, runtimeFailureTelemetryProperties, toolActivationProperties, type RuntimeTelemetryContext, type RuntimeTelemetryOptions, } from "./runtime";
@@ -0,0 +1,2 @@
1
+ export declare const BUNDLED_POSTHOG_TOKEN: string | undefined;
2
+ export declare const BUNDLED_SENTRY_DSN: string | undefined;
@@ -0,0 +1,8 @@
1
+ import { type TelemetrySurface, type TelemetryStateOptions } from "./state";
2
+ export declare const TELEMETRY_NOTICE = "Caplets collects anonymous telemetry for product usage and reliability. Disable it with CAPLETS_DISABLE_TELEMETRY=1 or `caplets telemetry disable`.\n";
3
+ export type TelemetryNoticeOptions = TelemetryStateOptions & {
4
+ surface: TelemetrySurface;
5
+ stderrIsTTY?: boolean | undefined;
6
+ writeErr: (text: string) => void;
7
+ };
8
+ export declare function maybePrintTelemetryNotice(options: TelemetryNoticeOptions): boolean;
@@ -0,0 +1,3 @@
1
+ import type { TelemetryProperties } from "./events";
2
+ export declare function assertTelemetrySafeProperties(properties: TelemetryProperties & Record<string, unknown>): void;
3
+ export declare function stripSentryEvent(event: Record<string, unknown>): Record<string, unknown>;
@@ -0,0 +1,21 @@
1
+ import type { NodeClient } from "@sentry/node";
2
+ import type { PostHog } from "posthog-node";
3
+ import type { TelemetryEvent } from "./events";
4
+ import { type TelemetryState } from "./state";
5
+ export type PostHogClient = Pick<PostHog, "capture" | "shutdown">;
6
+ export type SentryClient = Pick<NodeClient, "captureEvent" | "flush">;
7
+ export type TelemetryProviderFactories = {
8
+ createPostHog?: ((token: string) => Promise<PostHogClient> | PostHogClient) | undefined;
9
+ createSentry?: ((dsn: string) => Promise<SentryClient> | SentryClient) | undefined;
10
+ };
11
+ export type TelemetryDispatcherOptions = {
12
+ posthogToken?: string | undefined;
13
+ sentryDsn?: string | undefined;
14
+ stateDir?: string | undefined;
15
+ factories?: TelemetryProviderFactories | undefined;
16
+ };
17
+ export type TelemetryDispatcher = {
18
+ capture(state: TelemetryState, event: TelemetryEvent): Promise<void>;
19
+ shutdown(): Promise<void>;
20
+ };
21
+ export declare function createTelemetryDispatcher(options?: TelemetryDispatcherOptions): TelemetryDispatcher;
@@ -0,0 +1,40 @@
1
+ import type { CapletConfig, CapletsConfig } from "../config";
2
+ import { type CommandFamily, type Outcome, type RuntimeMode, type TelemetryProductEventName, type TelemetryProperties } from "./events";
3
+ import { TelemetryDebugSink } from "./debug";
4
+ import { type TelemetryDispatcher } from "./providers";
5
+ import { type TelemetrySurface, type TelemetryVisibility } from "./state";
6
+ export type RuntimeTelemetryOptions = {
7
+ config: CapletsConfig;
8
+ env?: NodeJS.ProcessEnv | undefined;
9
+ stateDir?: string | undefined;
10
+ surface: TelemetrySurface;
11
+ visibility: TelemetryVisibility;
12
+ runtimeMode?: RuntimeMode | undefined;
13
+ integration?: "opencode" | "pi" | "native" | "unknown" | undefined;
14
+ debugSink?: TelemetryDebugSink | undefined;
15
+ dispatcher?: TelemetryDispatcher | undefined;
16
+ };
17
+ export type RuntimeTelemetryContext = RuntimeTelemetryOptions & {
18
+ dispatcher: TelemetryDispatcher;
19
+ };
20
+ export declare function createRuntimeTelemetryContext(options: RuntimeTelemetryOptions): RuntimeTelemetryContext;
21
+ export declare function captureRuntimeTelemetryEvent(context: RuntimeTelemetryContext, name: TelemetryProductEventName, properties: TelemetryProperties): Promise<void>;
22
+ export declare function captureRuntimeReliabilityEvent(context: RuntimeTelemetryContext, properties: TelemetryProperties): Promise<void>;
23
+ export declare function backendFamilyCounts(config: CapletsConfig): TelemetryProperties;
24
+ export declare function exposureModeCounts(config: CapletsConfig): TelemetryProperties;
25
+ export declare function operationFamilyFromOperation(operation: unknown): CommandFamily;
26
+ export declare function outcomeFromResult(result: unknown): Outcome;
27
+ export declare function codeModeTelemetryProperties(envelope: unknown, durationMs: number, timeoutMs: number | undefined): TelemetryProperties;
28
+ export declare function toolActivationProperties(input: {
29
+ config: CapletsConfig;
30
+ caplet: CapletConfig | undefined;
31
+ operation: unknown;
32
+ exposureMode: "direct" | "progressive" | "code_mode" | "mixed" | "unknown";
33
+ result: unknown;
34
+ durationMs: number;
35
+ }): TelemetryProperties;
36
+ export declare function runtimeFailureTelemetryProperties(input: {
37
+ operation: unknown;
38
+ exposureMode: "direct" | "progressive" | "code_mode" | "mixed" | "unknown";
39
+ result: unknown;
40
+ }): TelemetryProperties;
@@ -0,0 +1,53 @@
1
+ export type TelemetrySurface = "cli" | "serve" | "attach" | "daemon" | "native" | "code_mode";
2
+ export type TelemetryVisibility = "visible" | "hidden" | "unknown";
3
+ export type TelemetryExecutionContext = "interactive" | "noninteractive" | "ci";
4
+ export type TelemetryStateStatus = "enabled" | "disabled" | "suppressed" | "debug";
5
+ export type TelemetryStateDecider = "debug" | "env" | "config" | "test" | "notice" | "default";
6
+ export type TelemetryIdentity = {
7
+ kind: "stable";
8
+ id: string;
9
+ } | {
10
+ kind: "ephemeral";
11
+ id: string;
12
+ reason: "state-unavailable";
13
+ };
14
+ export type TelemetryNoticeState = {
15
+ shown: false;
16
+ } | {
17
+ shown: true;
18
+ shownAt: string;
19
+ surface: TelemetrySurface;
20
+ };
21
+ export type TelemetryDeliveryHealth = Record<string, Record<string, number>>;
22
+ export type TelemetryState = {
23
+ status: TelemetryStateStatus;
24
+ decider: TelemetryStateDecider;
25
+ surface: TelemetrySurface;
26
+ visibility: TelemetryVisibility;
27
+ executionContext: TelemetryExecutionContext;
28
+ notice: TelemetryNoticeState;
29
+ stateDir?: string | undefined;
30
+ identity?: TelemetryIdentity | undefined;
31
+ };
32
+ export type TelemetryStateOptions = {
33
+ stateDir?: string | undefined;
34
+ };
35
+ export declare function telemetryStateDir(options?: TelemetryStateOptions): string;
36
+ export declare function telemetryIdentityPath(options?: TelemetryStateOptions): string;
37
+ export declare function telemetryNoticePath(options?: TelemetryStateOptions): string;
38
+ export declare function telemetryDeliveryHealthPath(options?: TelemetryStateOptions): string;
39
+ export declare function readTelemetryIdentity(options?: TelemetryStateOptions & {
40
+ create?: boolean | undefined;
41
+ }): TelemetryIdentity;
42
+ export declare function rotateTelemetryIdentity(options?: TelemetryStateOptions): TelemetryIdentity;
43
+ export declare function deleteTelemetryIdentity(options?: TelemetryStateOptions): void;
44
+ export declare function readTelemetryNotice(options?: TelemetryStateOptions): TelemetryNoticeState;
45
+ export declare function recordTelemetryNoticeShown(options: TelemetryStateOptions & {
46
+ surface: TelemetrySurface;
47
+ }): TelemetryNoticeState;
48
+ export declare function readTelemetryDeliveryHealth(options?: TelemetryStateOptions): TelemetryDeliveryHealth;
49
+ export declare function recordTelemetryDrop(options: TelemetryStateOptions & {
50
+ provider: string;
51
+ reason: string;
52
+ }): void;
53
+ export declare function writePrivateJson(path: string, value: unknown): boolean;
@@ -31,6 +31,7 @@ const CAPLETS_ERROR_CODES = [
31
31
  "SERVER_UNAVAILABLE",
32
32
  "SERVER_START_TIMEOUT",
33
33
  "UNKNOWN_OPERATION",
34
+ "CAPLET_NAMESPACE_COLLISION",
34
35
  "TOOL_NOT_FOUND",
35
36
  "TOOL_CALL_TIMEOUT",
36
37
  "AUTH_REQUIRED",
@@ -112,6 +113,7 @@ function errorResult(error, fallback) {
112
113
  //#endregion
113
114
  //#region src/config/validation.ts
114
115
  const SERVER_ID_PATTERN = /^[a-zA-Z0-9_-]{1,64}$/;
116
+ const NAMESPACE_ALIAS_LABEL_PATTERN = /^[a-z](?:[a-z0-9-]{0,30}[a-z0-9])?$/;
115
117
  const HEADER_NAME_PATTERN = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
116
118
  const HTTP_BASE_URL_PATTERN = /^(?![a-zA-Z][a-zA-Z0-9+.-]*:\/\/[^/?#]*@)[^?#]*$/;
117
119
  const FORBIDDEN_HEADERS = /* @__PURE__ */ new Set([
@@ -174,4 +176,4 @@ function isUrl(value) {
174
176
  }
175
177
  }
176
178
  //#endregion
177
- export { isAllowedHttpBaseUrl as a, validateHttpActionHeaders as c, errorResult as d, redactSecrets as f, SERVER_ID_PATTERN as i, CAPLETS_ERROR_CODES as l, HEADER_NAME_PATTERN as n, isAllowedRemoteUrl as o, toSafeError as p, HTTP_BASE_URL_PATTERN as r, isUrl as s, FORBIDDEN_HEADERS as t, CapletsError as u };
179
+ export { SERVER_ID_PATTERN as a, isUrl as c, CapletsError as d, errorResult as f, NAMESPACE_ALIAS_LABEL_PATTERN as i, validateHttpActionHeaders as l, toSafeError as m, HEADER_NAME_PATTERN as n, isAllowedHttpBaseUrl as o, redactSecrets as p, HTTP_BASE_URL_PATTERN as r, isAllowedRemoteUrl as s, FORBIDDEN_HEADERS as t, CAPLETS_ERROR_CODES as u };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caplets/core",
3
- "version": "0.26.1",
3
+ "version": "0.28.0",
4
4
  "description": "Core runtime library for Caplets Code Mode and progressive disclosure gateways.",
5
5
  "keywords": [
6
6
  "caplets",
@@ -90,6 +90,7 @@
90
90
  "@hono/mcp": "^0.3.0",
91
91
  "@hono/node-server": "^2.0.4",
92
92
  "@modelcontextprotocol/sdk": "^1.29.0",
93
+ "@sentry/node": "^10.60.0",
93
94
  "@ungap/structured-clone": "^1.3.1",
94
95
  "ajv": "^8.20.0",
95
96
  "commander": "^15.0.0",
@@ -97,6 +98,7 @@
97
98
  "graphql": "^16.14.2",
98
99
  "headers-polyfill": "^5.0.1",
99
100
  "hono": "^4.12.25",
101
+ "posthog-node": "^4.18.0",
100
102
  "quickjs-emscripten": "^0.32.0",
101
103
  "typescript": "^6.0.3",
102
104
  "vfile": "^6.0.3",