@caplets/core 0.27.0 → 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.
@@ -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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caplets/core",
3
- "version": "0.27.0",
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",