@alpic-ai/insights 1.161.0 → 1.162.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/index.d.mts CHANGED
@@ -7,33 +7,17 @@ interface PromptData {
7
7
  }
8
8
  interface IntentMiddlewareOptions {
9
9
  handler?: (prompt: PromptData) => Promise<void> | void;
10
- /**
11
- * If provided, only these tool names will have the `user_intent` field injected and their
12
- * prompts captured. All other tools are left untouched.
13
- */
10
+ /** When provided, only these tool names have the `user_intent` field injected and their prompts captured; all other tools are left untouched. */
14
11
  tools?: string[];
15
- /**
16
- * Mapping of tool names to argument names whose values should be captured as the intent.
17
- * Use this when the tool already has an argument (e.g. `query`, `question`) that conveys user
18
- * intent. For tools in this mapping, the synthetic `user_intent` argument is not injected into the
19
- * schema and the argument's value is read straight from the tool call arguments without being stripped.
20
- */
12
+ /** Maps tool names to an existing argument (e.g. `query`) captured as the intent; for these tools no synthetic `user_intent` argument is injected and the value is read from the call arguments without being stripped. */
21
13
  argumentNameOverride?: Record<string, string>;
22
14
  }
23
- /**
24
- * Structurally compatible with `skybridge/server`'s `McpMiddlewareFn` so
25
- * skybridge users can still pass the result into `server.mcpMiddleware(...)`.
26
- */
15
+ /** Structurally compatible with `skybridge/server`'s `McpMiddlewareFn` so skybridge users can still pass the result into `server.mcpMiddleware(...)`. */
27
16
  type McpMiddlewareFn = (request: {
28
17
  method: string;
29
18
  params: Record<string, unknown>;
30
19
  }, extra: unknown, next: () => Promise<unknown>) => Promise<unknown> | unknown;
31
- /**
32
- * Captures the user's natural-language intent behind each tool call so MCP
33
- * server builders can see *why* their tools are being invoked, not just that
34
- * they were. The LLM fills in `user_intent` from the original user message
35
- * (the server has no other way to access it).
36
- */
20
+ /** Captures the user's natural-language intent behind each tool call: the LLM fills in `user_intent` from the original user message, which the server has no other way to access. */
37
21
  declare function intentMiddleware(options?: IntentMiddlewareOptions): McpMiddlewareFn;
38
22
  //#endregion
39
23
  //#region src/analytics-middleware.d.ts
@@ -49,16 +33,10 @@ interface CaptureOptions {
49
33
  interface Analytics {
50
34
  /** Records a custom event on the current session's timeline, interleaved with tool calls. */
51
35
  capture(name: string, options?: CaptureOptions): void;
52
- /**
53
- * Replaces the current request user's trait snapshot (e.g. email, name, plan). The target user
54
- * is resolved by Alpic from the request auth context — no id or sessionId is passed.
55
- */
36
+ /** Replaces the current request user's trait snapshot (e.g. email, name, plan); the target user is resolved by Alpic from the request auth context — no id or sessionId is passed. */
56
37
  identify(traits: Record<string, string>): void;
57
38
  }
58
- /**
59
- * Shape of the handler `extra` once `analyticsMiddleware()` (or `track(server)`) is installed.
60
- * Cast the handler's `extra` to this to access `analytics` with types.
61
- */
39
+ /** Shape of the handler `extra` once `analyticsMiddleware()` (or `track(server)`) is installed; cast the handler's `extra` to this to access `analytics` with types. */
62
40
  interface AnalyticsExtra {
63
41
  analytics: Analytics;
64
42
  }
@@ -74,13 +52,7 @@ interface AnalyticsMiddlewareOptions {
74
52
  /** Receives each request's analytics locally, whether or not the server is hosted by Alpic. */
75
53
  handler?: (batch: AnalyticsBatch) => Promise<void> | void;
76
54
  }
77
- /**
78
- * Lets MCP server builders record custom analytics events and user traits from inside tool
79
- * handlers, via `extra.analytics.capture(...)` / `extra.analytics.identify(...)`. Calls are
80
- * buffered during the request. On Alpic, private environment-provided `_meta` keys carry them to
81
- * the proxy for ingestion. Locally, pass a handler to receive them without exposing analytics in
82
- * the MCP response.
83
- */
55
+ /** Buffers `extra.analytics.capture(...)` / `identify(...)` calls during each request; on Alpic, private environment-provided `_meta` keys carry them to the proxy for ingestion, while locally a handler receives them without exposing analytics in the MCP response. */
84
56
  declare function analyticsMiddleware(options?: AnalyticsMiddlewareOptions): McpMiddlewareFn;
85
57
  //#endregion
86
58
  //#region src/feedback-middleware.d.ts
@@ -89,48 +61,22 @@ interface FeedbackData {
89
61
  source: "model" | "user";
90
62
  }
91
63
  interface FeedbackMiddlewareOptions {
92
- /**
93
- * Custom handler invoked with the user's feedback. When provided, the middleware still attaches the feedback to the response `_meta`.
94
- * The handler runs **in addition to** Alpic's dashboard delivery, feedback are still captured when deployed on Alpic.
95
- */
64
+ /** Invoked with the user's feedback in addition to Alpic's dashboard delivery — the middleware still attaches the feedback to the response `_meta`. */
96
65
  handler?: (feedback: FeedbackData) => Promise<void> | void;
97
66
  }
98
- /**
99
- * Lets MCP server builders collect qualitative feedback from end users about their
100
- * tool/server. Injects a `send_feedback` tool at `tools/list` time and intercepts calls
101
- * to it at `tools/call` time. The tool has no handler on the server. The middleware
102
- * short-circuits the call and either invokes the provided `handler` or attaches the
103
- * feedback to the response `_meta`.
104
- */
67
+ /** Injects a `send_feedback` tool at `tools/list` time and short-circuits calls to it at `tools/call` time (the tool has no server-side handler), invoking `options.handler` or attaching the feedback to the response `_meta`. */
105
68
  declare function feedbackMiddleware(options?: FeedbackMiddlewareOptions): McpMiddlewareFn;
106
69
  //#endregion
107
70
  //#region src/capture-feedback.d.ts
108
- /**
109
- * Injects a `send_feedback` tool into a vanilla `@modelcontextprotocol/sdk`
110
- * server and captures feedback submissions. Accepts the high-level `McpServer`
111
- * or the low-level `Server` and patches the `tools/list` and `tools/call`
112
- * request handlers to surface captured feedback via `options.handler` (or,
113
- * when `ALPIC_FEEDBACK_META_KEY` is set, via the response `_meta`).
114
- */
71
+ /** Injects a `send_feedback` tool by patching the server's `tools/list` and `tools/call` handlers, surfacing captured feedback via `options.handler` (or via the response `_meta` when `ALPIC_FEEDBACK_META_KEY` is set). */
115
72
  declare const captureFeedback: (server: McpServer | Server, options?: FeedbackMiddlewareOptions) => void;
116
73
  //#endregion
117
74
  //#region src/capture-intents.d.ts
118
- /**
119
- * Captures the user's natural-language intent behind each tool call on a vanilla
120
- * `@modelcontextprotocol/sdk` server. Accepts the high-level `McpServer` or the
121
- * low-level `Server` and patches the `tools/list` and `tools/call` request
122
- * handlers to surface the captured intent via `options.handler` (or, when
123
- * `ALPIC_INTENT_META_KEY` is set, via the response `_meta`).
124
- */
75
+ /** Captures the user's natural-language intent behind each tool call by patching the server's `tools/list` and `tools/call` handlers, surfacing it via `options.handler` (or via the response `_meta` when `ALPIC_INTENT_META_KEY` is set). */
125
76
  declare const captureIntents: (server: McpServer | Server, options?: IntentMiddlewareOptions) => void;
126
77
  //#endregion
127
78
  //#region src/track.d.ts
128
- /**
129
- * Enables custom analytics events on a vanilla `@modelcontextprotocol/sdk` server. Accepts the
130
- * high-level `McpServer` or the low-level `Server` and patches the `tools/call` request handlers
131
- * so tool handlers can call `extra.analytics.capture(...)` / `extra.analytics.identify(...)`.
132
- * Pass a handler in `options` to receive analytics when running outside Alpic.
133
- */
79
+ /** Enables custom analytics events by patching the server's `tools/call` handlers so tool handlers can call `extra.analytics.capture(...)` / `identify(...)`; pass `options.handler` to receive analytics when running outside Alpic. */
134
80
  declare const track: (server: McpServer | Server, options?: AnalyticsMiddlewareOptions) => void;
135
81
  //#endregion
136
82
  export { type Analytics, type AnalyticsBatch, type AnalyticsEvent, type AnalyticsExtra, type AnalyticsMiddlewareOptions, type CaptureOptions, type FeedbackData, type FeedbackMiddlewareOptions, type IntentMiddlewareOptions, type McpMiddlewareFn, type PromptData, analyticsMiddleware, captureFeedback, captureIntents, feedbackMiddleware, intentMiddleware, track };
package/dist/index.mjs CHANGED
@@ -44,13 +44,7 @@ function createAnalyticsBuffer() {
44
44
  }
45
45
  };
46
46
  }
47
- /**
48
- * Lets MCP server builders record custom analytics events and user traits from inside tool
49
- * handlers, via `extra.analytics.capture(...)` / `extra.analytics.identify(...)`. Calls are
50
- * buffered during the request. On Alpic, private environment-provided `_meta` keys carry them to
51
- * the proxy for ingestion. Locally, pass a handler to receive them without exposing analytics in
52
- * the MCP response.
53
- */
47
+ /** Buffers `extra.analytics.capture(...)` / `identify(...)` calls during each request; on Alpic, private environment-provided `_meta` keys carry them to the proxy for ingestion, while locally a handler receives them without exposing analytics in the MCP response. */
54
48
  function analyticsMiddleware(options) {
55
49
  return async (request, extra, next) => {
56
50
  if (request.method !== "tools/call" || extra === null || typeof extra !== "object") return next();
@@ -102,13 +96,7 @@ const FEEDBACK_OUTPUT_SCHEMA = {
102
96
  additionalProperties: false
103
97
  };
104
98
  const FEEDBACK_STRUCTURED_CONTENT = { status: "received" };
105
- /**
106
- * Lets MCP server builders collect qualitative feedback from end users about their
107
- * tool/server. Injects a `send_feedback` tool at `tools/list` time and intercepts calls
108
- * to it at `tools/call` time. The tool has no handler on the server. The middleware
109
- * short-circuits the call and either invokes the provided `handler` or attaches the
110
- * feedback to the response `_meta`.
111
- */
99
+ /** Injects a `send_feedback` tool at `tools/list` time and short-circuits calls to it at `tools/call` time (the tool has no server-side handler), invoking `options.handler` or attaching the feedback to the response `_meta`. */
112
100
  function feedbackMiddleware(options) {
113
101
  return async (request, _extra, next) => {
114
102
  const metaKeyName = process.env.ALPIC_FEEDBACK_META_KEY;
@@ -187,15 +175,7 @@ function feedbackMiddleware(options) {
187
175
  }
188
176
  //#endregion
189
177
  //#region src/install-capture-middleware.ts
190
- /**
191
- * Patches the `tools/list` and `tools/call` request handlers of a vanilla
192
- * `@modelcontextprotocol/sdk` server (high-level `McpServer` or low-level
193
- * `Server`) to run the given middleware.
194
- *
195
- * Already-registered handlers are wrapped immediately; future registrations
196
- * (e.g. tools added after this call) are wrapped via a `Map.set` proxy so order
197
- * of calls relative to `registerTool` does not matter.
198
- */
178
+ /** Patches the server's `tools/list` and `tools/call` handlers to run the middleware; future registrations are wrapped via a `Map.set` proxy so call order relative to `registerTool` does not matter. */
199
179
  const installCaptureMiddleware = (server, { middleware, installedMarker, disabledWarning }) => {
200
180
  const handlers = ("server" in server ? server.server : server)?._requestHandlers;
201
181
  if (!(handlers instanceof Map)) {
@@ -222,13 +202,7 @@ const installCaptureMiddleware = (server, { middleware, installedMarker, disable
222
202
  };
223
203
  //#endregion
224
204
  //#region src/capture-feedback.ts
225
- /**
226
- * Injects a `send_feedback` tool into a vanilla `@modelcontextprotocol/sdk`
227
- * server and captures feedback submissions. Accepts the high-level `McpServer`
228
- * or the low-level `Server` and patches the `tools/list` and `tools/call`
229
- * request handlers to surface captured feedback via `options.handler` (or,
230
- * when `ALPIC_FEEDBACK_META_KEY` is set, via the response `_meta`).
231
- */
205
+ /** Injects a `send_feedback` tool by patching the server's `tools/list` and `tools/call` handlers, surfacing captured feedback via `options.handler` (or via the response `_meta` when `ALPIC_FEEDBACK_META_KEY` is set). */
232
206
  const captureFeedback = (server, options) => {
233
207
  installCaptureMiddleware(server, {
234
208
  middleware: feedbackMiddleware(options),
@@ -239,12 +213,7 @@ const captureFeedback = (server, options) => {
239
213
  //#endregion
240
214
  //#region src/intent-middleware.ts
241
215
  const USER_INTENT_FIELD = "user_intent";
242
- /**
243
- * Captures the user's natural-language intent behind each tool call so MCP
244
- * server builders can see *why* their tools are being invoked, not just that
245
- * they were. The LLM fills in `user_intent` from the original user message
246
- * (the server has no other way to access it).
247
- */
216
+ /** Captures the user's natural-language intent behind each tool call: the LLM fills in `user_intent` from the original user message, which the server has no other way to access. */
248
217
  function intentMiddleware(options) {
249
218
  const argumentNameOverride = options?.argumentNameOverride ?? {};
250
219
  const toolsFilter = options?.tools ? new Set(options.tools) : null;
@@ -320,13 +289,7 @@ Before sending, strip all personally identifiable information (names, emails, ph
320
289
  }
321
290
  //#endregion
322
291
  //#region src/capture-intents.ts
323
- /**
324
- * Captures the user's natural-language intent behind each tool call on a vanilla
325
- * `@modelcontextprotocol/sdk` server. Accepts the high-level `McpServer` or the
326
- * low-level `Server` and patches the `tools/list` and `tools/call` request
327
- * handlers to surface the captured intent via `options.handler` (or, when
328
- * `ALPIC_INTENT_META_KEY` is set, via the response `_meta`).
329
- */
292
+ /** Captures the user's natural-language intent behind each tool call by patching the server's `tools/list` and `tools/call` handlers, surfacing it via `options.handler` (or via the response `_meta` when `ALPIC_INTENT_META_KEY` is set). */
330
293
  const captureIntents = (server, options) => {
331
294
  installCaptureMiddleware(server, {
332
295
  middleware: intentMiddleware(options),
@@ -336,12 +299,7 @@ const captureIntents = (server, options) => {
336
299
  };
337
300
  //#endregion
338
301
  //#region src/track.ts
339
- /**
340
- * Enables custom analytics events on a vanilla `@modelcontextprotocol/sdk` server. Accepts the
341
- * high-level `McpServer` or the low-level `Server` and patches the `tools/call` request handlers
342
- * so tool handlers can call `extra.analytics.capture(...)` / `extra.analytics.identify(...)`.
343
- * Pass a handler in `options` to receive analytics when running outside Alpic.
344
- */
302
+ /** Enables custom analytics events by patching the server's `tools/call` handlers so tool handlers can call `extra.analytics.capture(...)` / `identify(...)`; pass `options.handler` to receive analytics when running outside Alpic. */
345
303
  const track = (server, options) => {
346
304
  installCaptureMiddleware(server, {
347
305
  middleware: analyticsMiddleware(options),
@@ -39,21 +39,13 @@ interface AlpicAnalyticsProps {
39
39
  beforeSend?: BeforeSend;
40
40
  autoCapture?: AutoCaptureOptions;
41
41
  }
42
- /**
43
- * Provides Alpic Analytics to descendant components and configures itself from the widget host.
44
- * Wrap the widget once, then call `useAnalytics()` from components that capture events.
45
- * Events captured before configuration is available are buffered automatically.
46
- */
42
+ /** Provides Alpic Analytics to descendant components, configuring itself from the widget host; events captured before configuration is available are buffered automatically. */
47
43
  declare function AlpicAnalytics({ children, beforeSend, autoCapture }: AlpicAnalyticsProps): import("react").JSX.Element;
48
44
  /** Returns the analytics client from the nearest `AlpicAnalytics` provider. */
49
45
  declare function useAnalytics(): Analytics;
50
46
  //#endregion
51
47
  //#region src/react/auto-capture.d.ts
52
- /**
53
- * Reserved auto-capture event names. The `$` prefix marks events emitted by the SDK itself
54
- * (lifecycle, errors, interactions) so the analytics UI can distinguish them from custom
55
- * `capture()` calls. Keep in sync with the server-side reserved namespace.
56
- */
48
+ /** The `$` prefix marks events emitted by the SDK itself so the analytics UI can distinguish them from custom `capture()` calls; keep in sync with the server-side reserved namespace. */
57
49
  declare const AUTO_EVENT: {
58
50
  readonly loaded: "$loaded";
59
51
  readonly visible: "$visible";
@@ -72,11 +72,7 @@ function isSameStamp(left, right) {
72
72
  }
73
73
  //#endregion
74
74
  //#region src/react/auto-capture.ts
75
- /**
76
- * Reserved auto-capture event names. The `$` prefix marks events emitted by the SDK itself
77
- * (lifecycle, errors, interactions) so the analytics UI can distinguish them from custom
78
- * `capture()` calls. Keep in sync with the server-side reserved namespace.
79
- */
75
+ /** The `$` prefix marks events emitted by the SDK itself so the analytics UI can distinguish them from custom `capture()` calls; keep in sync with the server-side reserved namespace. */
80
76
  const AUTO_EVENT = {
81
77
  loaded: "$loaded",
82
78
  visible: "$visible",
@@ -88,10 +84,7 @@ const AUTO_EVENT = {
88
84
  const INTERACTION_ATTRIBUTE = "data-alpic-event";
89
85
  const INTERACTION_DATASET_KEY = "alpicEvent";
90
86
  const INTERACTION_DATASET_PREFIX = "alpic";
91
- /**
92
- * Resolves the nearest `[data-alpic-event]` ancestor of a click target into an event: the
93
- * attribute value is the name, and every other `data-alpic-*` attribute becomes a property.
94
- */
87
+ /** Resolves the nearest `[data-alpic-event]` ancestor of a click target: the attribute value is the event name, and every other `data-alpic-*` attribute becomes a property. */
95
88
  function resolveInteractionEvent(target) {
96
89
  if (!(target instanceof Element)) return null;
97
90
  const element = target.closest(`[${INTERACTION_ATTRIBUTE}]`);
@@ -217,11 +210,7 @@ observeRuntime();
217
210
  //#endregion
218
211
  //#region src/react/alpic-analytics.tsx
219
212
  const AnalyticsContext = createContext(null);
220
- /**
221
- * Provides Alpic Analytics to descendant components and configures itself from the widget host.
222
- * Wrap the widget once, then call `useAnalytics()` from components that capture events.
223
- * Events captured before configuration is available are buffered automatically.
224
- */
213
+ /** Provides Alpic Analytics to descendant components, configuring itself from the widget host; events captured before configuration is available are buffered automatically. */
225
214
  function AlpicAnalytics({ children, beforeSend, autoCapture }) {
226
215
  const beforeSendRef = useRef(beforeSend);
227
216
  beforeSendRef.current = beforeSend;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alpic-ai/insights",
3
- "version": "1.161.0",
3
+ "version": "1.162.0",
4
4
  "description": "User insights middlewares for Alpic-hosted MCP servers",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",
@@ -34,17 +34,17 @@
34
34
  }
35
35
  },
36
36
  "devDependencies": {
37
- "@modelcontextprotocol/sdk": "^1.29.0",
37
+ "@modelcontextprotocol/sdk": "^1.30.0",
38
38
  "@testing-library/dom": "^10.4.1",
39
39
  "@testing-library/react": "^16.3.2",
40
40
  "@total-typescript/tsconfig": "^1.0.4",
41
41
  "@types/node": "^25.9.5",
42
- "@types/react": "19.2.17",
42
+ "@types/react": "19.2.18",
43
43
  "jsdom": "^30.0.1",
44
44
  "react": "^19.2.8",
45
45
  "react-dom": "^19.2.8",
46
46
  "shx": "^0.4.0",
47
- "skybridge": "^1.3.0",
47
+ "skybridge": "^1.3.2",
48
48
  "tsdown": "^0.22.14",
49
49
  "typescript": "^6.0.3",
50
50
  "vitest": "^4.1.10",
@@ -52,8 +52,12 @@
52
52
  },
53
53
  "scripts": {
54
54
  "build": "shx rm -rf dist && tsdown",
55
+ "build:python": "cd python && uv build --no-sources",
55
56
  "format": "biome check --write --error-on-warnings .",
56
57
  "test": "pnpm run test:unit && pnpm run test:type && pnpm run test:format",
58
+ "test:python": "cd python && uv run --locked pytest",
59
+ "test:python:format": "cd python && uv run --locked ruff check . && uv run --locked ruff format --check .",
60
+ "test:python:smoke": "pnpm run build:python && cd python && uv run --isolated --no-project --with dist/*.whl scripts/smoke_test.py && uv run --isolated --no-project --with dist/*.tar.gz scripts/smoke_test.py",
57
61
  "test:unit": "vitest run",
58
62
  "test:format": "biome check --error-on-warnings .",
59
63
  "test:type": "tsgo --noEmit",