@amplitude/ai 0.3.1 → 0.3.3
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/AGENTS.md +1 -1
- package/README.md +1 -1
- package/dist/bound-agent.d.ts.map +1 -1
- package/dist/bound-agent.js +0 -1
- package/dist/bound-agent.js.map +1 -1
- package/dist/mcp/instrument-file.js +2 -2
- package/dist/mcp/instrument-file.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/patching.d.ts.map +1 -1
- package/dist/propagation.d.ts.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/mistral.d.ts.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/llms-full.txt +1 -1
- package/llms.txt +1 -1
- package/mcp.schema.json +1 -1
- package/package.json +1 -1
package/AGENTS.md
CHANGED
package/README.md
CHANGED
|
@@ -413,7 +413,7 @@ const agent = ai.agent('support-bot', {
|
|
|
413
413
|
});
|
|
414
414
|
```
|
|
415
415
|
|
|
416
|
-
Child agents inherit context
|
|
416
|
+
Child agents inherit context from their parent and automatically set `parentAgentId` (note: `description` is agent-specific and is **not** inherited — pass it explicitly if needed):
|
|
417
417
|
|
|
418
418
|
```typescript
|
|
419
419
|
const orchestrator = ai.agent('orchestrator', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bound-agent.d.ts","names":[],"sources":["../src/bound-agent.ts"],"sourcesContent":[],"mappings":";;;;;;AAY8B,KAAlB,eAAA,GAAkB,OAAA,CAC5B,IAD4B,CACvB,UADuB,CACZ,WADY,CAAA,kBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,SAAA,CAAA,CAAA;AAAO,KAIzB,aAAA,GAAgB,OAJS,CAKnC,IALmC,CAMjC,UANiC,CAMtB,WANsB,CAAA,gBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,SAAA,GAAA,OAAA,GAAA,UAAA,GAAA,WAAA,CAAA,CAAA;AAIzB,KAOA,YAAA,GAAe,OAPF,CAQvB,IARuB,CASrB,UATqB,CASV,WATU,CAAA,eAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,UAAA,GAAA,WAAA,GAAA,SAAA,CAAA,CAAA;AAEV,KAYH,aAAA,GAAgB,OAZb,CAab,IAba,CAcX,UAdW,CAcA,WAdA,CAAA,gBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,OAAA,GAAA,UAAA,GAAA,WAAA,CAAA,CAAA;AAAX,KAmBQ,QAAA,GAAW,OAnBnB,CAoBF,IApBE,CAoBG,UApBH,CAoBc,WApBd,CAAA,WAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,UAAA,GAAA,WAAA,CAAA,CAAA;AADF,KAwBU,cAAA,GAAiB,OAxB3B,CAyBA,UAzBA,CAyBW,WAzBX,CAAA,iBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAD0B,KA6BhB,qBAAA,GAAwB,OA7BR,CA8B1B,IA9B0B,CA8BrB,UA9BqB,CA8BV,WA9BU,CAAA,wBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,aAAA,CAAA,CAAA;AAAO,KAiCvB,SAAA,GAAY,OAjCW,CAkCjC,IAlCiC,CAkC5B,UAlC4B,CAkCjB,WAlCiB,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,MAAA,GAAA,OAAA,GAAA,UAAA,CAAA,CAAA;AAOvB,UA4CK,YAAA,CA5CO;EAET,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAX,aAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EADF,aAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EADyB,YAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAO,WAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAOtB,OAAA,CAAA,EA2CA,MA3Ca,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EAEV,GAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAX,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EADF,OAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAD0B,MAAA,CAAA,EA+CjB,MA/CiB,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EAAO,QAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAOvB,gBAAQ,CAAA,EAAA,MAAA,GAAA,IAAA;;AACb,cA4CM,UAAA,CA5CN;EAAL,SAAA,GAAA,EA6Cc,WA7Cd;EADqB,SAAA,SAAA,EA+CD,MA/CC,CAAA,MAAA,EAAA,OAAA,CAAA;EAAO,WAAA,CAAA,EAAA,EAkDtB,WAlDsB,EAAA,IAAA,EAmDpB,YAnDoB,GAAA;IAIlB,OAAA,EAAA,MAAc;EACb,CAAA;EAAX,IAAA,OAAA,CAAA,CAAA,EAAA,MAAA;EAD2B,IAAA,EAAA,CAAA,CAAA,EAuEjB,WAvEiB;EAAO,KAAA,CAAA,OAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EA2EA,YA3EA,CAAA,EA2EoB,UA3EpB;EAIxB,QAAA,MAAA;EACM,gBAAA,CAAA,OAAA,EAAA,MAAA,EAAA,IAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"bound-agent.d.ts","names":[],"sources":["../src/bound-agent.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/bound-agent.js
CHANGED
|
@@ -48,7 +48,6 @@ var BoundAgent = class BoundAgent {
|
|
|
48
48
|
env: this._defaults.env,
|
|
49
49
|
customerOrgId: this._defaults.customerOrgId,
|
|
50
50
|
agentVersion: this._defaults.agentVersion,
|
|
51
|
-
description: this._defaults.description,
|
|
52
51
|
sessionId: this._defaults.sessionId,
|
|
53
52
|
traceId: this._defaults.traceId,
|
|
54
53
|
groups: this._defaults.groups,
|
package/dist/bound-agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bound-agent.js","names":["inherited: Record<string, unknown>"],"sources":["../src/bound-agent.ts"],"sourcesContent":["/**\n * BoundAgent — agent with pre-bound defaults for tracking context fields.\n *\n * Created via `ai.agent(agentId, opts)`. All tracking calls\n * automatically inherit agentId, userId, env, and other defaults.\n */\n\nimport type { AmplitudeAI } from './client.js';\nimport type { SessionEnrichments } from './core/enrichments.js';\nimport { PROP_SESSION_REPLAY_ID } from './core/tracking.js';\nimport { Session } from './session.js';\n\nexport type UserMessageOpts = Partial<\n Omit<Parameters<AmplitudeAI['trackUserMessage']>[0], 'content'>\n>;\n\nexport type AiMessageOpts = Partial<\n Omit<\n Parameters<AmplitudeAI['trackAiMessage']>[0],\n 'content' | 'model' | 'provider' | 'latencyMs'\n >\n>;\n\nexport type ToolCallOpts = Partial<\n Omit<\n Parameters<AmplitudeAI['trackToolCall']>[0],\n 'toolName' | 'latencyMs' | 'success'\n >\n>;\n\nexport type EmbeddingOpts = Partial<\n Omit<\n Parameters<AmplitudeAI['trackEmbedding']>[0],\n 'model' | 'provider' | 'latencyMs'\n >\n>;\n\nexport type SpanOpts = Partial<\n Omit<Parameters<AmplitudeAI['trackSpan']>[0], 'spanName' | 'latencyMs'>\n>;\n\nexport type SessionEndOpts = Partial<\n Parameters<AmplitudeAI['trackSessionEnd']>[0]\n>;\n\nexport type SessionEnrichmentOpts = Partial<\n Omit<Parameters<AmplitudeAI['trackSessionEnrichment']>[0], 'enrichments'>\n>;\n\nexport type ScoreOpts = Partial<\n Omit<Parameters<AmplitudeAI['score']>[0], 'name' | 'value' | 'targetId'>\n>;\n\nconst CONTEXT_FIELDS = [\n 'userId',\n 'agentId',\n 'parentAgentId',\n 'customerOrgId',\n 'agentVersion',\n 'description',\n 'context',\n 'env',\n 'sessionId',\n 'traceId',\n 'groups',\n] as const;\n\nexport interface AgentOptions {\n userId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n sessionId?: string | null;\n traceId?: string | null;\n groups?: Record<string, unknown> | null;\n deviceId?: string | null;\n browserSessionId?: string | null;\n}\n\nexport class BoundAgent {\n readonly _ai: AmplitudeAI;\n readonly _defaults: Record<string, unknown>;\n\n constructor(\n ai: AmplitudeAI,\n opts: AgentOptions & { agentId: string },\n ) {\n this._ai = ai;\n this._defaults = {\n userId: opts.userId ?? null,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId ?? null,\n customerOrgId: opts.customerOrgId ?? null,\n agentVersion: opts.agentVersion ?? null,\n description: opts.description ?? null,\n context: opts.context ?? null,\n env: opts.env ?? null,\n sessionId: opts.sessionId ?? null,\n traceId: opts.traceId ?? null,\n groups: opts.groups ?? null,\n deviceId: opts.deviceId ?? null,\n browserSessionId: opts.browserSessionId ?? null,\n };\n }\n\n get agentId(): string {\n return String(this._defaults.agentId);\n }\n\n get ai(): AmplitudeAI {\n return this._ai;\n }\n\n child(agentId: string, overrides: AgentOptions = {}): BoundAgent {\n const inherited: Record<string, unknown> = {\n userId: this._defaults.userId,\n env: this._defaults.env,\n customerOrgId: this._defaults.customerOrgId,\n agentVersion: this._defaults.agentVersion,\n description: this._defaults.description,\n sessionId: this._defaults.sessionId,\n traceId: this._defaults.traceId,\n groups: this._defaults.groups,\n deviceId: this._defaults.deviceId,\n browserSessionId: this._defaults.browserSessionId,\n };\n\n const parentCtx = this._defaults.context as Record<string, unknown> | null;\n const childCtx = overrides.context ?? null;\n const overrideEntries = Object.entries(overrides).filter(\n ([k]) => k !== 'context',\n );\n if (parentCtx || childCtx) {\n const merged = { ...(parentCtx ?? {}) };\n if (childCtx) Object.assign(merged, childCtx);\n inherited.context = merged;\n }\n\n for (const [k, v] of overrideEntries) {\n if (v != null) inherited[k] = v;\n }\n\n const { parentAgentId: inheritedParentAgentId, ...inheritedWithoutParent } =\n inherited;\n const explicitParent =\n (inheritedParentAgentId as string | null) ??\n (this._defaults.agentId as string);\n\n return new BoundAgent(this._ai, {\n agentId,\n parentAgentId: explicitParent,\n ...(inheritedWithoutParent as Record<string, string | null>),\n });\n }\n\n private _merge<T extends Record<string, unknown>>(\n kwargs: T,\n fields: readonly string[] = CONTEXT_FIELDS,\n ): T {\n const merged = { ...kwargs } as Record<string, unknown>;\n for (const field of fields) {\n if (merged[field] == null && this._defaults[field] != null) {\n merged[field] = this._defaults[field];\n }\n }\n const deviceId = this._defaults.deviceId as string | null;\n const browserSessionId = this._defaults.browserSessionId as string | null;\n if (deviceId && browserSessionId) {\n const existingEp = merged.eventProperties as\n | Record<string, unknown>\n | undefined;\n const ep = existingEp != null ? { ...existingEp } : {};\n if (!(PROP_SESSION_REPLAY_ID in ep)) {\n ep[PROP_SESSION_REPLAY_ID] = `${deviceId}/${browserSessionId}`;\n merged.eventProperties = ep;\n }\n }\n return merged as T;\n }\n\n trackUserMessage(content: string, opts: UserMessageOpts = {}): string {\n return this._ai.trackUserMessage({\n ...this._merge(opts),\n content,\n } as Parameters<AmplitudeAI['trackUserMessage']>[0]);\n }\n\n trackAiMessage(\n content: string,\n model: string,\n provider: string,\n latencyMs: number,\n opts: AiMessageOpts = {},\n ): string {\n return this._ai.trackAiMessage({\n ...this._merge(opts),\n content,\n model,\n provider,\n latencyMs,\n } as Parameters<AmplitudeAI['trackAiMessage']>[0]);\n }\n\n trackToolCall(\n toolName: string,\n latencyMs: number,\n success: boolean,\n opts: ToolCallOpts = {},\n ): string {\n return this._ai.trackToolCall({\n ...this._merge(opts),\n toolName,\n latencyMs,\n success,\n } as Parameters<AmplitudeAI['trackToolCall']>[0]);\n }\n\n trackEmbedding(\n model: string,\n provider: string,\n latencyMs: number,\n opts: EmbeddingOpts = {},\n ): string {\n return this._ai.trackEmbedding({\n ...this._merge(opts),\n model,\n provider,\n latencyMs,\n } as Parameters<AmplitudeAI['trackEmbedding']>[0]);\n }\n\n trackSpan(spanName: string, latencyMs: number, opts: SpanOpts = {}): string {\n return this._ai.trackSpan({\n ...this._merge(opts),\n spanName,\n latencyMs,\n } as Parameters<AmplitudeAI['trackSpan']>[0]);\n }\n\n trackSessionEnd(opts: SessionEndOpts = {}): void {\n this._ai.trackSessionEnd(\n this._merge(opts) as Parameters<AmplitudeAI['trackSessionEnd']>[0],\n );\n }\n\n trackSessionEnrichment(\n enrichments: SessionEnrichments,\n opts: SessionEnrichmentOpts = {},\n ): void {\n this._ai.trackSessionEnrichment({\n ...this._merge(opts),\n enrichments,\n } as Parameters<AmplitudeAI['trackSessionEnrichment']>[0]);\n }\n\n score(\n name: string,\n value: number,\n targetId: string,\n opts: ScoreOpts = {},\n ): void {\n this._ai.score({\n ...this._merge(opts),\n name,\n value,\n targetId,\n } as Parameters<AmplitudeAI['score']>[0]);\n }\n\n session(\n opts: {\n sessionId?: string | null;\n idleTimeoutMinutes?: number | null;\n userId?: string | null;\n deviceId?: string | null;\n browserSessionId?: string | null;\n autoFlush?: boolean;\n } = {},\n ): Session {\n return new Session(this, opts);\n }\n\n flush(): unknown {\n return this._ai.flush();\n }\n\n shutdown(): void {\n this._ai.shutdown();\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bound-agent.js","names":["inherited: Record<string, unknown>"],"sources":["../src/bound-agent.ts"],"sourcesContent":["/**\n * BoundAgent — agent with pre-bound defaults for tracking context fields.\n *\n * Created via `ai.agent(agentId, opts)`. All tracking calls\n * automatically inherit agentId, userId, env, and other defaults.\n */\n\nimport type { AmplitudeAI } from './client.js';\nimport type { SessionEnrichments } from './core/enrichments.js';\nimport { PROP_SESSION_REPLAY_ID } from './core/tracking.js';\nimport { Session } from './session.js';\n\nexport type UserMessageOpts = Partial<\n Omit<Parameters<AmplitudeAI['trackUserMessage']>[0], 'content'>\n>;\n\nexport type AiMessageOpts = Partial<\n Omit<\n Parameters<AmplitudeAI['trackAiMessage']>[0],\n 'content' | 'model' | 'provider' | 'latencyMs'\n >\n>;\n\nexport type ToolCallOpts = Partial<\n Omit<\n Parameters<AmplitudeAI['trackToolCall']>[0],\n 'toolName' | 'latencyMs' | 'success'\n >\n>;\n\nexport type EmbeddingOpts = Partial<\n Omit<\n Parameters<AmplitudeAI['trackEmbedding']>[0],\n 'model' | 'provider' | 'latencyMs'\n >\n>;\n\nexport type SpanOpts = Partial<\n Omit<Parameters<AmplitudeAI['trackSpan']>[0], 'spanName' | 'latencyMs'>\n>;\n\nexport type SessionEndOpts = Partial<\n Parameters<AmplitudeAI['trackSessionEnd']>[0]\n>;\n\nexport type SessionEnrichmentOpts = Partial<\n Omit<Parameters<AmplitudeAI['trackSessionEnrichment']>[0], 'enrichments'>\n>;\n\nexport type ScoreOpts = Partial<\n Omit<Parameters<AmplitudeAI['score']>[0], 'name' | 'value' | 'targetId'>\n>;\n\nconst CONTEXT_FIELDS = [\n 'userId',\n 'agentId',\n 'parentAgentId',\n 'customerOrgId',\n 'agentVersion',\n 'description',\n 'context',\n 'env',\n 'sessionId',\n 'traceId',\n 'groups',\n] as const;\n\nexport interface AgentOptions {\n userId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n sessionId?: string | null;\n traceId?: string | null;\n groups?: Record<string, unknown> | null;\n deviceId?: string | null;\n browserSessionId?: string | null;\n}\n\nexport class BoundAgent {\n readonly _ai: AmplitudeAI;\n readonly _defaults: Record<string, unknown>;\n\n constructor(\n ai: AmplitudeAI,\n opts: AgentOptions & { agentId: string },\n ) {\n this._ai = ai;\n this._defaults = {\n userId: opts.userId ?? null,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId ?? null,\n customerOrgId: opts.customerOrgId ?? null,\n agentVersion: opts.agentVersion ?? null,\n description: opts.description ?? null,\n context: opts.context ?? null,\n env: opts.env ?? null,\n sessionId: opts.sessionId ?? null,\n traceId: opts.traceId ?? null,\n groups: opts.groups ?? null,\n deviceId: opts.deviceId ?? null,\n browserSessionId: opts.browserSessionId ?? null,\n };\n }\n\n get agentId(): string {\n return String(this._defaults.agentId);\n }\n\n get ai(): AmplitudeAI {\n return this._ai;\n }\n\n child(agentId: string, overrides: AgentOptions = {}): BoundAgent {\n const inherited: Record<string, unknown> = {\n userId: this._defaults.userId,\n env: this._defaults.env,\n customerOrgId: this._defaults.customerOrgId,\n agentVersion: this._defaults.agentVersion,\n sessionId: this._defaults.sessionId,\n traceId: this._defaults.traceId,\n groups: this._defaults.groups,\n deviceId: this._defaults.deviceId,\n browserSessionId: this._defaults.browserSessionId,\n };\n\n const parentCtx = this._defaults.context as Record<string, unknown> | null;\n const childCtx = overrides.context ?? null;\n const overrideEntries = Object.entries(overrides).filter(\n ([k]) => k !== 'context',\n );\n if (parentCtx || childCtx) {\n const merged = { ...(parentCtx ?? {}) };\n if (childCtx) Object.assign(merged, childCtx);\n inherited.context = merged;\n }\n\n for (const [k, v] of overrideEntries) {\n if (v != null) inherited[k] = v;\n }\n\n const { parentAgentId: inheritedParentAgentId, ...inheritedWithoutParent } =\n inherited;\n const explicitParent =\n (inheritedParentAgentId as string | null) ??\n (this._defaults.agentId as string);\n\n return new BoundAgent(this._ai, {\n agentId,\n parentAgentId: explicitParent,\n ...(inheritedWithoutParent as Record<string, string | null>),\n });\n }\n\n private _merge<T extends Record<string, unknown>>(\n kwargs: T,\n fields: readonly string[] = CONTEXT_FIELDS,\n ): T {\n const merged = { ...kwargs } as Record<string, unknown>;\n for (const field of fields) {\n if (merged[field] == null && this._defaults[field] != null) {\n merged[field] = this._defaults[field];\n }\n }\n const deviceId = this._defaults.deviceId as string | null;\n const browserSessionId = this._defaults.browserSessionId as string | null;\n if (deviceId && browserSessionId) {\n const existingEp = merged.eventProperties as\n | Record<string, unknown>\n | undefined;\n const ep = existingEp != null ? { ...existingEp } : {};\n if (!(PROP_SESSION_REPLAY_ID in ep)) {\n ep[PROP_SESSION_REPLAY_ID] = `${deviceId}/${browserSessionId}`;\n merged.eventProperties = ep;\n }\n }\n return merged as T;\n }\n\n trackUserMessage(content: string, opts: UserMessageOpts = {}): string {\n return this._ai.trackUserMessage({\n ...this._merge(opts),\n content,\n } as Parameters<AmplitudeAI['trackUserMessage']>[0]);\n }\n\n trackAiMessage(\n content: string,\n model: string,\n provider: string,\n latencyMs: number,\n opts: AiMessageOpts = {},\n ): string {\n return this._ai.trackAiMessage({\n ...this._merge(opts),\n content,\n model,\n provider,\n latencyMs,\n } as Parameters<AmplitudeAI['trackAiMessage']>[0]);\n }\n\n trackToolCall(\n toolName: string,\n latencyMs: number,\n success: boolean,\n opts: ToolCallOpts = {},\n ): string {\n return this._ai.trackToolCall({\n ...this._merge(opts),\n toolName,\n latencyMs,\n success,\n } as Parameters<AmplitudeAI['trackToolCall']>[0]);\n }\n\n trackEmbedding(\n model: string,\n provider: string,\n latencyMs: number,\n opts: EmbeddingOpts = {},\n ): string {\n return this._ai.trackEmbedding({\n ...this._merge(opts),\n model,\n provider,\n latencyMs,\n } as Parameters<AmplitudeAI['trackEmbedding']>[0]);\n }\n\n trackSpan(spanName: string, latencyMs: number, opts: SpanOpts = {}): string {\n return this._ai.trackSpan({\n ...this._merge(opts),\n spanName,\n latencyMs,\n } as Parameters<AmplitudeAI['trackSpan']>[0]);\n }\n\n trackSessionEnd(opts: SessionEndOpts = {}): void {\n this._ai.trackSessionEnd(\n this._merge(opts) as Parameters<AmplitudeAI['trackSessionEnd']>[0],\n );\n }\n\n trackSessionEnrichment(\n enrichments: SessionEnrichments,\n opts: SessionEnrichmentOpts = {},\n ): void {\n this._ai.trackSessionEnrichment({\n ...this._merge(opts),\n enrichments,\n } as Parameters<AmplitudeAI['trackSessionEnrichment']>[0]);\n }\n\n score(\n name: string,\n value: number,\n targetId: string,\n opts: ScoreOpts = {},\n ): void {\n this._ai.score({\n ...this._merge(opts),\n name,\n value,\n targetId,\n } as Parameters<AmplitudeAI['score']>[0]);\n }\n\n session(\n opts: {\n sessionId?: string | null;\n idleTimeoutMinutes?: number | null;\n userId?: string | null;\n deviceId?: string | null;\n browserSessionId?: string | null;\n autoFlush?: boolean;\n } = {},\n ): Session {\n return new Session(this, opts);\n }\n\n flush(): unknown {\n return this._ai.flush();\n }\n\n shutdown(): void {\n this._ai.shutdown();\n }\n}\n"],"mappings":"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"}
|
|
@@ -97,7 +97,7 @@ function addSessionWrapping(source, agentId, bootstrapImportPath) {
|
|
|
97
97
|
const agentLine = `const agent = ai.agent('${agentId}');\n`;
|
|
98
98
|
if (ROUTE_HANDLER_RE.test(result)) {
|
|
99
99
|
const handlerMatch = result.match(/export\s+async\s+function\s+(?:POST|GET|PUT|DELETE)\s*\([^)]*\)\s*\{/);
|
|
100
|
-
result = result.replace(/(export\s+async\s+function\s+(?:POST|GET|PUT|DELETE)\s*\([^)]*\)\s*\{)/, `$1\n ${agentLine.trim()}\n const { messages, userId, sessionId } = await req.json();\n const _response = await agent.session({ userId, sessionId }).run(async (s) => {`);
|
|
100
|
+
result = result.replace(/(export\s+async\s+function\s+(?:POST|GET|PUT|DELETE)\s*\([^)]*\)\s*\{)/, `$1\n ${agentLine.trim()}\n const { messages, userId, sessionId } = await req.json();\n // TODO(required): Ensure userId comes from auth, not the request body, to prevent spoofing.\n // sessionId is optional — omit it and the SDK auto-generates a unique UUID per request.\n const _response = await agent.session({ userId, ...(sessionId && { sessionId }) }).run(async (s) => {`);
|
|
101
101
|
if (handlerMatch?.index != null) {
|
|
102
102
|
const openBraceIdx = result.indexOf("{", handlerMatch.index);
|
|
103
103
|
if (openBraceIdx >= 0) {
|
|
@@ -112,7 +112,7 @@ function addSessionWrapping(source, agentId, bootstrapImportPath) {
|
|
|
112
112
|
result = `${result.slice(0, closingBraceIdx)} });\n await ai.flush();\n return _response;\n${result.slice(closingBraceIdx)}`;
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
|
-
} else if (EXPRESS_HANDLER_RE.test(result) || HONO_HANDLER_RE.test(result)) result = result.replace(/((?:app|router)\.\s*(?:get|post|put|delete)\s*\(\s*['"][^'"]+['"]\s*,\s*(?:async\s+)?\([^)]*\)\s*(?:=>)?\s*\{)/, `$1\n ${agentLine.trim()}\n const _response = await agent.session({ userId:
|
|
115
|
+
} else if (EXPRESS_HANDLER_RE.test(result) || HONO_HANDLER_RE.test(result)) result = result.replace(/((?:app|router)\.\s*(?:get|post|put|delete)\s*\(\s*['"][^'"]+['"]\s*,\s*(?:async\s+)?\([^)]*\)\s*(?:=>)?\s*\{)/, `$1\n // TODO(required): Replace with the real user ID from your auth/request context.\n // Without a real userId, per-user funnels, retention, and cohorts won't work.\n const _userId = 'anonymous'; // e.g. req.user.id, req.auth.sub, req.session.userId\n ${agentLine.trim()}\n const _response = await agent.session({ userId: _userId }).run(async (s) => {`);
|
|
116
116
|
return result;
|
|
117
117
|
}
|
|
118
118
|
function addUserMessageTracking(source) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument-file.js","names":["PROVIDER_IMPORT_MAP: Record<string, { module: string; defaultExport: string; namedExport: string }>","results: Array<{ start: number; end: number; fullMatch: string }>","namedImports: string[]"],"sources":["../../src/mcp/instrument-file.ts"],"sourcesContent":["export interface InstrumentFileOptions {\n source: string;\n filePath: string;\n tier: 'quick_start' | 'standard' | 'advanced';\n bootstrapImportPath: string;\n agentId: string;\n description?: string | null;\n providers: string[];\n}\n\nconst PROVIDER_IMPORT_MAP: Record<string, { module: string; defaultExport: string; namedExport: string }> = {\n openai: { module: 'openai', defaultExport: 'OpenAI', namedExport: 'openai' },\n '@anthropic-ai/sdk': { module: '@anthropic-ai/sdk', defaultExport: 'Anthropic', namedExport: 'anthropic' },\n '@google/generative-ai': { module: '@google/generative-ai', defaultExport: 'GoogleGenerativeAI', namedExport: 'gemini' },\n '@google/genai': { module: '@google/genai', defaultExport: 'GoogleGenAI', namedExport: 'genai' },\n '@mistralai/mistralai': { module: '@mistralai/mistralai', defaultExport: 'Mistral', namedExport: 'mistral' },\n '@azure/openai': { module: '@azure/openai', defaultExport: 'AzureOpenAI', namedExport: 'azureOpenai' },\n 'cohere-ai': { module: 'cohere-ai', defaultExport: 'CohereClient', namedExport: 'cohere' },\n};\n\n// Balanced-paren constructor matcher: handles nested parens like new OpenAI({ apiKey: getKey() })\nfunction matchConstructor(source: string, constructorName: string): Array<{ start: number; end: number; fullMatch: string }> {\n const results: Array<{ start: number; end: number; fullMatch: string }> = [];\n const re = new RegExp(`new\\\\s+${constructorName}\\\\s*\\\\(`, 'g');\n for (const m of source.matchAll(re)) {\n const openIdx = (m.index ?? 0) + m[0].length - 1;\n let depth = 1;\n let i = openIdx + 1;\n while (i < source.length && depth > 0) {\n if (source[i] === '(') depth++;\n else if (source[i] === ')') depth--;\n i++;\n }\n results.push({ start: m.index ?? 0, end: i, fullMatch: source.slice(m.index ?? 0, i) });\n }\n return results;\n}\n\nconst ROUTE_HANDLER_RE =\n /export\\s+async\\s+function\\s+(?:POST|GET|PUT|DELETE)\\b/;\nconst EXPRESS_HANDLER_RE =\n /(?:app|router)\\.\\s*(?:get|post|put|delete)\\s*\\(\\s*['\"][^'\"]+['\"]\\s*,\\s*(?:async\\s+)?\\(/;\nconst HONO_HANDLER_RE =\n /(?:app|router)\\.\\s*(?:get|post|put|delete)\\s*\\(\\s*['\"][^'\"]+['\"]\\s*,\\s*(?:async\\s+)?\\(\\s*c\\b/;\n\nfunction replaceProviderImports(\n source: string,\n providers: string[],\n bootstrapImportPath: string,\n): string {\n let result = source;\n const namedImports: string[] = [];\n\n for (const provider of providers) {\n const mapping = PROVIDER_IMPORT_MAP[provider];\n if (!mapping) continue;\n\n // Match default import: import OpenAI from 'openai'\n const defaultImportRe = new RegExp(\n `import\\\\s+${mapping.defaultExport}\\\\s+from\\\\s+['\"]${mapping.module}['\"];?`,\n );\n // Match named import (single or multi-line): import { OpenAI } from 'openai'\n // or: import {\\n OpenAI,\\n AsyncOpenAI,\\n} from 'openai'\n const escapedModule = mapping.module.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const namedImportRe = new RegExp(\n `import\\\\s*\\\\{[^}]*\\\\b${mapping.defaultExport}\\\\b[^}]*\\\\}\\\\s*from\\\\s+['\"]${escapedModule}['\"];?`,\n 's',\n );\n if (defaultImportRe.test(result)) {\n result = result.replace(defaultImportRe, '');\n namedImports.push(mapping.namedExport);\n } else if (namedImportRe.test(result)) {\n result = result.replace(namedImportRe, '');\n namedImports.push(mapping.namedExport);\n }\n\n // Replace constructors with pre-wrapped named imports using balanced-paren matching\n const matches = matchConstructor(result, mapping.defaultExport);\n for (let i = matches.length - 1; i >= 0; i--) {\n const match = matches[i];\n if (match) {\n result = result.slice(0, match.start) + mapping.namedExport + result.slice(match.end);\n }\n }\n }\n\n if (namedImports.length > 0) {\n const importLine = `import { ${namedImports.join(', ')} } from '${bootstrapImportPath}';\\n`;\n result = importLine + result;\n }\n\n return result;\n}\n\nfunction addSessionWrapping(\n source: string,\n agentId: string,\n bootstrapImportPath: string,\n): string {\n let result = source;\n\n const importFromPath = new RegExp(\n `import\\\\s*\\\\{([^}]*)\\\\}\\\\s*from\\\\s*['\"]${bootstrapImportPath.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}['\"]`,\n );\n const existingImportMatch = importFromPath.exec(result);\n if (existingImportMatch) {\n const existingNames = existingImportMatch[1] ?? '';\n const importedNames = existingNames.split(',').map(s => s.trim());\n if (!importedNames.includes('ai')) {\n const newNames = existingNames.trim() ? `ai, ${existingNames.trim()}` : 'ai';\n result = result.replace(existingImportMatch[0], `import { ${newNames} } from '${bootstrapImportPath}'`);\n }\n } else if (!result.includes(`from '${bootstrapImportPath}'`) &&\n !result.includes(`from \"${bootstrapImportPath}\"`)) {\n result = `import { ai } from '${bootstrapImportPath}';\\n${result}`;\n }\n\n const agentLine = `const agent = ai.agent('${agentId}');\\n`;\n\n // Wrap route handler body inside session.run(), with flush after session completes\n if (ROUTE_HANDLER_RE.test(result)) {\n const handlerMatch = result.match(\n /export\\s+async\\s+function\\s+(?:POST|GET|PUT|DELETE)\\s*\\([^)]*\\)\\s*\\{/,\n );\n result = result.replace(\n /(export\\s+async\\s+function\\s+(?:POST|GET|PUT|DELETE)\\s*\\([^)]*\\)\\s*\\{)/,\n `$1\\n ${agentLine.trim()}\\n const { messages, userId, sessionId } = await req.json();\\n const _response = await agent.session({ userId, sessionId }).run(async (s) => {`,\n );\n if (handlerMatch?.index != null) {\n const openBraceIdx = result.indexOf('{', handlerMatch.index);\n if (openBraceIdx >= 0) {\n let depth = 1;\n let i = openBraceIdx + 1;\n while (i < result.length && depth > 0) {\n if (result[i] === '{') depth++;\n else if (result[i] === '}') depth--;\n i++;\n }\n const closingBraceIdx = i - 1;\n result = `${result.slice(0, closingBraceIdx)} });\\n await ai.flush();\\n return _response;\\n${result.slice(closingBraceIdx)}`;\n }\n }\n } else if (EXPRESS_HANDLER_RE.test(result) || HONO_HANDLER_RE.test(result)) {\n result = result.replace(\n /((?:app|router)\\.\\s*(?:get|post|put|delete)\\s*\\(\\s*['\"][^'\"]+['\"]\\s*,\\s*(?:async\\s+)?\\([^)]*\\)\\s*(?:=>)?\\s*\\{)/,\n `$1\\n ${agentLine.trim()}\\n const _response = await agent.session({ userId: 'todo-extract-user-id', sessionId: 'todo-extract-session-id' }).run(async (s) => {`,\n );\n }\n\n return result;\n}\n\nfunction addUserMessageTracking(source: string): string {\n const requestBodyRe = /(const\\s+\\{[^}]*\\}\\s*=\\s*(?:await\\s+)?(?:req\\.body|request\\.json\\(\\)|await\\s+request\\.json\\(\\)))/;\n const match = requestBodyRe.exec(source);\n if (match) {\n return source.replace(\n match[0],\n `${match[0]};\\n // TODO: extract user message and call s.trackUserMessage(userMessage)`,\n );\n }\n return source;\n}\n\nexport function instrumentFile(opts: InstrumentFileOptions): string {\n if (opts.tier === 'quick_start') {\n return opts.source;\n }\n\n let result = opts.source;\n\n result = replaceProviderImports(result, opts.providers, opts.bootstrapImportPath);\n\n if (opts.tier === 'advanced') {\n result = addSessionWrapping(result, opts.agentId, opts.bootstrapImportPath);\n result = addUserMessageTracking(result);\n }\n\n return result;\n}\n"],"mappings":";AAUA,MAAMA,sBAAsG;CAC1G,QAAQ;EAAE,QAAQ;EAAU,eAAe;EAAU,aAAa;EAAU;CAC5E,qBAAqB;EAAE,QAAQ;EAAqB,eAAe;EAAa,aAAa;EAAa;CAC1G,yBAAyB;EAAE,QAAQ;EAAyB,eAAe;EAAsB,aAAa;EAAU;CACxH,iBAAiB;EAAE,QAAQ;EAAiB,eAAe;EAAe,aAAa;EAAS;CAChG,wBAAwB;EAAE,QAAQ;EAAwB,eAAe;EAAW,aAAa;EAAW;CAC5G,iBAAiB;EAAE,QAAQ;EAAiB,eAAe;EAAe,aAAa;EAAe;CACtG,aAAa;EAAE,QAAQ;EAAa,eAAe;EAAgB,aAAa;EAAU;CAC3F;AAGD,SAAS,iBAAiB,QAAgB,iBAAmF;CAC3H,MAAMC,UAAoE,EAAE;CAC5E,MAAM,KAAK,IAAI,OAAO,UAAU,gBAAgB,UAAU,IAAI;AAC9D,MAAK,MAAM,KAAK,OAAO,SAAS,GAAG,EAAE;EACnC,MAAM,WAAW,EAAE,SAAS,KAAK,EAAE,GAAG,SAAS;EAC/C,IAAI,QAAQ;EACZ,IAAI,IAAI,UAAU;AAClB,SAAO,IAAI,OAAO,UAAU,QAAQ,GAAG;AACrC,OAAI,OAAO,OAAO,IAAK;YACd,OAAO,OAAO,IAAK;AAC5B;;AAEF,UAAQ,KAAK;GAAE,OAAO,EAAE,SAAS;GAAG,KAAK;GAAG,WAAW,OAAO,MAAM,EAAE,SAAS,GAAG,EAAE;GAAE,CAAC;;AAEzF,QAAO;;AAGT,MAAM,mBACJ;AACF,MAAM,qBACJ;AACF,MAAM,kBACJ;AAEF,SAAS,uBACP,QACA,WACA,qBACQ;CACR,IAAI,SAAS;CACb,MAAMC,eAAyB,EAAE;AAEjC,MAAK,MAAM,YAAY,WAAW;EAChC,MAAM,UAAU,oBAAoB;AACpC,MAAI,CAAC,QAAS;EAGd,MAAM,kCAAkB,IAAI,OAC1B,aAAa,QAAQ,cAAc,kBAAkB,QAAQ,OAAO,QACrE;EAGD,MAAM,gBAAgB,QAAQ,OAAO,QAAQ,uBAAuB,OAAO;EAC3E,MAAM,gBAAgB,IAAI,OACxB,wBAAwB,QAAQ,cAAc,6BAA6B,cAAc,SACzF,IACD;AACD,MAAI,gBAAgB,KAAK,OAAO,EAAE;AAChC,YAAS,OAAO,QAAQ,iBAAiB,GAAG;AAC5C,gBAAa,KAAK,QAAQ,YAAY;aAC7B,cAAc,KAAK,OAAO,EAAE;AACrC,YAAS,OAAO,QAAQ,eAAe,GAAG;AAC1C,gBAAa,KAAK,QAAQ,YAAY;;EAIxC,MAAM,UAAU,iBAAiB,QAAQ,QAAQ,cAAc;AAC/D,OAAK,IAAI,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;GAC5C,MAAM,QAAQ,QAAQ;AACtB,OAAI,MACF,UAAS,OAAO,MAAM,GAAG,MAAM,MAAM,GAAG,QAAQ,cAAc,OAAO,MAAM,MAAM,IAAI;;;AAK3F,KAAI,aAAa,SAAS,EAExB,UADmB,YAAY,aAAa,KAAK,KAAK,CAAC,WAAW,oBAAoB,QAChE;AAGxB,QAAO;;AAGT,SAAS,mBACP,QACA,SACA,qBACQ;CACR,IAAI,SAAS;CAKb,MAAM,uCAHiB,IAAI,OACzB,0CAA0C,oBAAoB,QAAQ,uBAAuB,OAAO,CAAC,MACtG,EAC0C,KAAK,OAAO;AACvD,KAAI,qBAAqB;EACvB,MAAM,gBAAgB,oBAAoB,MAAM;AAEhD,MAAI,CADkB,cAAc,MAAM,IAAI,CAAC,KAAI,MAAK,EAAE,MAAM,CAAC,CAC9C,SAAS,KAAK,EAAE;GACjC,MAAM,WAAW,cAAc,MAAM,GAAG,OAAO,cAAc,MAAM,KAAK;AACxE,YAAS,OAAO,QAAQ,oBAAoB,IAAI,YAAY,SAAS,WAAW,oBAAoB,GAAG;;YAEhG,CAAC,OAAO,SAAS,SAAS,oBAAoB,GAAG,IACxD,CAAC,OAAO,SAAS,SAAS,oBAAoB,GAAG,CACnD,UAAS,uBAAuB,oBAAoB,MAAM;CAG5D,MAAM,YAAY,2BAA2B,QAAQ;AAGrD,KAAI,iBAAiB,KAAK,OAAO,EAAE;EACjC,MAAM,eAAe,OAAO,MAC1B,uEACD;AACD,WAAS,OAAO,QACd,0EACA,SAAS,UAAU,MAAM,CAAC,kJAC3B;AACD,MAAI,cAAc,SAAS,MAAM;GAC/B,MAAM,eAAe,OAAO,QAAQ,KAAK,aAAa,MAAM;AAC5D,OAAI,gBAAgB,GAAG;IACrB,IAAI,QAAQ;IACZ,IAAI,IAAI,eAAe;AACvB,WAAO,IAAI,OAAO,UAAU,QAAQ,GAAG;AACrC,SAAI,OAAO,OAAO,IAAK;cACd,OAAO,OAAO,IAAK;AAC5B;;IAEF,MAAM,kBAAkB,IAAI;AAC5B,aAAS,GAAG,OAAO,MAAM,GAAG,gBAAgB,CAAC,mDAAmD,OAAO,MAAM,gBAAgB;;;YAGxH,mBAAmB,KAAK,OAAO,IAAI,gBAAgB,KAAK,OAAO,CACxE,UAAS,OAAO,QACd,kHACA,WAAW,UAAU,MAAM,CAAC,0IAC7B;AAGH,QAAO;;AAGT,SAAS,uBAAuB,QAAwB;CAEtD,MAAM,QADgB,mGACM,KAAK,OAAO;AACxC,KAAI,MACF,QAAO,OAAO,QACZ,MAAM,IACN,GAAG,MAAM,GAAG,+EACb;AAEH,QAAO;;AAGT,SAAgB,eAAe,MAAqC;AAClE,KAAI,KAAK,SAAS,cAChB,QAAO,KAAK;CAGd,IAAI,SAAS,KAAK;AAElB,UAAS,uBAAuB,QAAQ,KAAK,WAAW,KAAK,oBAAoB;AAEjF,KAAI,KAAK,SAAS,YAAY;AAC5B,WAAS,mBAAmB,QAAQ,KAAK,SAAS,KAAK,oBAAoB;AAC3E,WAAS,uBAAuB,OAAO;;AAGzC,QAAO"}
|
|
1
|
+
{"version":3,"file":"instrument-file.js","names":["PROVIDER_IMPORT_MAP: Record<string, { module: string; defaultExport: string; namedExport: string }>","results: Array<{ start: number; end: number; fullMatch: string }>","namedImports: string[]"],"sources":["../../src/mcp/instrument-file.ts"],"sourcesContent":["export interface InstrumentFileOptions {\n source: string;\n filePath: string;\n tier: 'quick_start' | 'standard' | 'advanced';\n bootstrapImportPath: string;\n agentId: string;\n description?: string | null;\n providers: string[];\n}\n\nconst PROVIDER_IMPORT_MAP: Record<string, { module: string; defaultExport: string; namedExport: string }> = {\n openai: { module: 'openai', defaultExport: 'OpenAI', namedExport: 'openai' },\n '@anthropic-ai/sdk': { module: '@anthropic-ai/sdk', defaultExport: 'Anthropic', namedExport: 'anthropic' },\n '@google/generative-ai': { module: '@google/generative-ai', defaultExport: 'GoogleGenerativeAI', namedExport: 'gemini' },\n '@google/genai': { module: '@google/genai', defaultExport: 'GoogleGenAI', namedExport: 'genai' },\n '@mistralai/mistralai': { module: '@mistralai/mistralai', defaultExport: 'Mistral', namedExport: 'mistral' },\n '@azure/openai': { module: '@azure/openai', defaultExport: 'AzureOpenAI', namedExport: 'azureOpenai' },\n 'cohere-ai': { module: 'cohere-ai', defaultExport: 'CohereClient', namedExport: 'cohere' },\n};\n\n// Balanced-paren constructor matcher: handles nested parens like new OpenAI({ apiKey: getKey() })\nfunction matchConstructor(source: string, constructorName: string): Array<{ start: number; end: number; fullMatch: string }> {\n const results: Array<{ start: number; end: number; fullMatch: string }> = [];\n const re = new RegExp(`new\\\\s+${constructorName}\\\\s*\\\\(`, 'g');\n for (const m of source.matchAll(re)) {\n const openIdx = (m.index ?? 0) + m[0].length - 1;\n let depth = 1;\n let i = openIdx + 1;\n while (i < source.length && depth > 0) {\n if (source[i] === '(') depth++;\n else if (source[i] === ')') depth--;\n i++;\n }\n results.push({ start: m.index ?? 0, end: i, fullMatch: source.slice(m.index ?? 0, i) });\n }\n return results;\n}\n\nconst ROUTE_HANDLER_RE =\n /export\\s+async\\s+function\\s+(?:POST|GET|PUT|DELETE)\\b/;\nconst EXPRESS_HANDLER_RE =\n /(?:app|router)\\.\\s*(?:get|post|put|delete)\\s*\\(\\s*['\"][^'\"]+['\"]\\s*,\\s*(?:async\\s+)?\\(/;\nconst HONO_HANDLER_RE =\n /(?:app|router)\\.\\s*(?:get|post|put|delete)\\s*\\(\\s*['\"][^'\"]+['\"]\\s*,\\s*(?:async\\s+)?\\(\\s*c\\b/;\n\nfunction replaceProviderImports(\n source: string,\n providers: string[],\n bootstrapImportPath: string,\n): string {\n let result = source;\n const namedImports: string[] = [];\n\n for (const provider of providers) {\n const mapping = PROVIDER_IMPORT_MAP[provider];\n if (!mapping) continue;\n\n // Match default import: import OpenAI from 'openai'\n const defaultImportRe = new RegExp(\n `import\\\\s+${mapping.defaultExport}\\\\s+from\\\\s+['\"]${mapping.module}['\"];?`,\n );\n // Match named import (single or multi-line): import { OpenAI } from 'openai'\n // or: import {\\n OpenAI,\\n AsyncOpenAI,\\n} from 'openai'\n const escapedModule = mapping.module.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const namedImportRe = new RegExp(\n `import\\\\s*\\\\{[^}]*\\\\b${mapping.defaultExport}\\\\b[^}]*\\\\}\\\\s*from\\\\s+['\"]${escapedModule}['\"];?`,\n 's',\n );\n if (defaultImportRe.test(result)) {\n result = result.replace(defaultImportRe, '');\n namedImports.push(mapping.namedExport);\n } else if (namedImportRe.test(result)) {\n result = result.replace(namedImportRe, '');\n namedImports.push(mapping.namedExport);\n }\n\n // Replace constructors with pre-wrapped named imports using balanced-paren matching\n const matches = matchConstructor(result, mapping.defaultExport);\n for (let i = matches.length - 1; i >= 0; i--) {\n const match = matches[i];\n if (match) {\n result = result.slice(0, match.start) + mapping.namedExport + result.slice(match.end);\n }\n }\n }\n\n if (namedImports.length > 0) {\n const importLine = `import { ${namedImports.join(', ')} } from '${bootstrapImportPath}';\\n`;\n result = importLine + result;\n }\n\n return result;\n}\n\nfunction addSessionWrapping(\n source: string,\n agentId: string,\n bootstrapImportPath: string,\n): string {\n let result = source;\n\n const importFromPath = new RegExp(\n `import\\\\s*\\\\{([^}]*)\\\\}\\\\s*from\\\\s*['\"]${bootstrapImportPath.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}['\"]`,\n );\n const existingImportMatch = importFromPath.exec(result);\n if (existingImportMatch) {\n const existingNames = existingImportMatch[1] ?? '';\n const importedNames = existingNames.split(',').map(s => s.trim());\n if (!importedNames.includes('ai')) {\n const newNames = existingNames.trim() ? `ai, ${existingNames.trim()}` : 'ai';\n result = result.replace(existingImportMatch[0], `import { ${newNames} } from '${bootstrapImportPath}'`);\n }\n } else if (!result.includes(`from '${bootstrapImportPath}'`) &&\n !result.includes(`from \"${bootstrapImportPath}\"`)) {\n result = `import { ai } from '${bootstrapImportPath}';\\n${result}`;\n }\n\n const agentLine = `const agent = ai.agent('${agentId}');\\n`;\n\n // Wrap route handler body inside session.run(), with flush after session completes\n if (ROUTE_HANDLER_RE.test(result)) {\n const handlerMatch = result.match(\n /export\\s+async\\s+function\\s+(?:POST|GET|PUT|DELETE)\\s*\\([^)]*\\)\\s*\\{/,\n );\n result = result.replace(\n /(export\\s+async\\s+function\\s+(?:POST|GET|PUT|DELETE)\\s*\\([^)]*\\)\\s*\\{)/,\n `$1\\n ${agentLine.trim()}\\n const { messages, userId, sessionId } = await req.json();\\n // TODO(required): Ensure userId comes from auth, not the request body, to prevent spoofing.\\n // sessionId is optional — omit it and the SDK auto-generates a unique UUID per request.\\n const _response = await agent.session({ userId, ...(sessionId && { sessionId }) }).run(async (s) => {`,\n );\n if (handlerMatch?.index != null) {\n const openBraceIdx = result.indexOf('{', handlerMatch.index);\n if (openBraceIdx >= 0) {\n let depth = 1;\n let i = openBraceIdx + 1;\n while (i < result.length && depth > 0) {\n if (result[i] === '{') depth++;\n else if (result[i] === '}') depth--;\n i++;\n }\n const closingBraceIdx = i - 1;\n result = `${result.slice(0, closingBraceIdx)} });\\n await ai.flush();\\n return _response;\\n${result.slice(closingBraceIdx)}`;\n }\n }\n } else if (EXPRESS_HANDLER_RE.test(result) || HONO_HANDLER_RE.test(result)) {\n result = result.replace(\n /((?:app|router)\\.\\s*(?:get|post|put|delete)\\s*\\(\\s*['\"][^'\"]+['\"]\\s*,\\s*(?:async\\s+)?\\([^)]*\\)\\s*(?:=>)?\\s*\\{)/,\n `$1\\n // TODO(required): Replace with the real user ID from your auth/request context.\\n // Without a real userId, per-user funnels, retention, and cohorts won't work.\\n const _userId = 'anonymous'; // e.g. req.user.id, req.auth.sub, req.session.userId\\n ${agentLine.trim()}\\n const _response = await agent.session({ userId: _userId }).run(async (s) => {`,\n );\n }\n\n return result;\n}\n\nfunction addUserMessageTracking(source: string): string {\n const requestBodyRe = /(const\\s+\\{[^}]*\\}\\s*=\\s*(?:await\\s+)?(?:req\\.body|request\\.json\\(\\)|await\\s+request\\.json\\(\\)))/;\n const match = requestBodyRe.exec(source);\n if (match) {\n return source.replace(\n match[0],\n `${match[0]};\\n // TODO: extract user message and call s.trackUserMessage(userMessage)`,\n );\n }\n return source;\n}\n\nexport function instrumentFile(opts: InstrumentFileOptions): string {\n if (opts.tier === 'quick_start') {\n return opts.source;\n }\n\n let result = opts.source;\n\n result = replaceProviderImports(result, opts.providers, opts.bootstrapImportPath);\n\n if (opts.tier === 'advanced') {\n result = addSessionWrapping(result, opts.agentId, opts.bootstrapImportPath);\n result = addUserMessageTracking(result);\n }\n\n return result;\n}\n"],"mappings":"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"}
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","names":[],"sources":["../../src/mcp/server.ts"],"sourcesContent":[],"mappings":";;;KA0DK,WAAA;cAaC,iFAGS;AAvEqD,cAgJ9D,YAzFU,EAAA,GAAA,GAyFS,SAzFT;AAAA,cA0hBV,YA7gBA,EAAA,GAAA,GA6gByB,OArd9B,CAAA,IAAA,
|
|
1
|
+
{"version":3,"file":"server.d.ts","names":[],"sources":["../../src/mcp/server.ts"],"sourcesContent":[],"mappings":";;;KA0DK,WAAA;cAaC,iFAGS;AAvEqD,cAgJ9D,YAzFU,EAAA,GAAA,GAyFS,SAzFT;AAAA,cA0hBV,YA7gBA,EAAA,GAAA,GA6gByB,OArd9B,CAAA,IAAA,CAAA"}
|
package/dist/patching.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patching.d.ts","names":[],"sources":["../src/patching.ts"],"sourcesContent":[],"mappings":";;;;AAoLgB,iBAjJA,gBAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"patching.d.ts","names":[],"sources":["../src/patching.ts"],"sourcesContent":[],"mappings":";;;;AAoLgB,iBAjJA,gBAAA,CAAA,CAkJU,EAAA,MAAA,EAAA;AAuHV,iBApNA,WAAA,CAqND,OAAW,EAAA;EA6CV,WAAA,EAjQD,WAiQa;EAgGZ,gBAAK,CAAA,EAAA,OACN;EAiEC,MAAA,CAAA,EAAA,OAAO;AAUvB,CAAA,CAAA,EAAgB,IAAA;AAIA,iBA7ZA,cAAA,CA6ZgB,OAAA,EAAA;EAIhB,WAAA,EAhaD,WAgac;EAIb,MAAA,CAAA,EAAA,OAAA;AAIhB,CAAA,CAAA,EAAgB,IAAA;AAIA,iBAhYA,gBAAA,CAgYkB,OAAA,EAAA;eA/XnB;;;iBAyBC,WAAA;eACD;;;iBAuHC,YAAA;eACD;;;iBA6CC,YAAA;eACD;;;;;;;;;;;;;;;;;;iBA+FC,KAAA;eACD;YACH;;iBAgEI,OAAA,CAAA;iBAUA,aAAA,CAAA;iBAIA,gBAAA,CAAA;iBAIA,aAAA,CAAA;iBAIA,cAAA,CAAA;iBAIA,cAAA,CAAA;iBAIA,kBAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propagation.d.ts","names":[],"sources":["../src/propagation.ts"],"sourcesContent":[],"mappings":";iBAKgB,0BAAA;AAAA,iBAIA,0BAAA,CAAA,CAJ0B,EAAA,OAAA;AAI1B,iBAIA,aAAA,CAJ0B,OAAA,CAAA,EAK9B,MAL8B,CAAA,MAAA,EAAA,MAAA,CAAA,CAAA,EAMvC,MANuC,CAAA,MAAA,EAAA,MAAA,CAAA;AAI1B,iBAoBA,cAAA,
|
|
1
|
+
{"version":3,"file":"propagation.d.ts","names":[],"sources":["../src/propagation.ts"],"sourcesContent":[],"mappings":";iBAKgB,0BAAA;AAAA,iBAIA,0BAAA,CAAA,CAJ0B,EAAA,OAAA;AAI1B,iBAIA,aAAA,CAJ0B,OAAA,CAAA,EAK9B,MAL8B,CAAA,MAAA,EAAA,MAAA,CAAA,CAAA,EAMvC,MANuC,CAAA,MAAA,EAAA,MAAA,CAAA;AAI1B,iBAoBA,cAAA,CAnBJ,OACT,EAmBQ,MAnBF,CAAA,MAAA,EAAA,MAAA,CAAA,CAAA,EAoBN,MApBM,CAAA,MAAA,EAAA,MAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","names":[],"sources":["../../src/providers/anthropic.ts"],"sourcesContent":[],"mappings":";;;;;;AAyBM,cADO,mBACW,
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","names":[],"sources":["../../src/providers/anthropic.ts"],"sourcesContent":[],"mappings":";;;;;;AAyBM,cADO,mBACW,EAAA,OAAM;AAI9B,cAJM,gBAI2B,EAJT,MAKX,CAAA,MAAA,EAAA,OAEK,CAAA,GAAA,IAAA;AAOA,UAVD,gBAAA,CAUC;EAA0B,SAAA,EAT/B,aAS+B;EAGvB,MAAA,CAAA,EAAA,MAAA;EAGE,aAAA,CAAA,EAbL,aAaK,GAAA,IAAA;EAmCP,gBAAA,CAAA,EAAA,OAAA;EAxCN;EAAc,eAAA,CAAA,EAAA,OAAA;AA6CxB;AACa,cAhDA,SAgDA,CAAA,gBA/CK,MA+CL,CAAA,MAAA,EAAA,OAAA,CAAA,GA/C+B,MA+C/B,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,SA9CH,cAAA,CA8CG;EAQA,QAAA,OAAA;EACE,SAAA,QAAA,EArDM,eAqDN;EACI,QAAA,iBAAA;EAeP,WAAA,CAAA,OAAA,EAlEW,gBAkEX;EACa,IAAA,MAAA,CAAA,CAAA,EAhCT,OAgCS;;AACQ,cA5BpB,eAAA,CA4BoB;EAA5B,SAAA,EA3BQ,MA2BR,CAAA,MAAA,EAAA,OAAA,CAAA;EAAO,QAAA,QAAA;EAuSI,QAAA,UAAA;EAmBA,QAAA,cAAA;EACC,QAAA,iBAAA;EAAN,WAAA,CAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EA9UE,OA8UF,EAAA,SAAA,EA7UI,aA6UJ,EAAA,aAAA,EA5UQ,aA4UR,GAAA,IAAA,EAAA,gBAAA,EAAA,OAAA;EAIQ,MAAA,CAAA,MAAA,EAjUP,MAiUO,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,kBAAA,CAAA,EAhUM,oBAgUN,CAAA,EA/Td,OA+Tc,CA/TN,iBA+TM,GA/Tc,aA+Td,CAAA,OAAA,CAAA,CAAA;EAAN,QAAA,WAAA;EAAK,QAAA,mBAAA;;;iBAxBF,4BAAA;iBAmBA,uBAAA,UACL,MAAM;;;aAIJ,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.d.ts","names":[],"sources":["../../src/providers/gemini.ts"],"sourcesContent":[],"mappings":";;;;;;AAaM,cADO,gBACQ,
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","names":[],"sources":["../../src/providers/gemini.ts"],"sourcesContent":[],"mappings":";;;;;;AAaM,cADO,gBACQ,EAAA,OAAM;AAI3B,cAJM,aAIwB,EAJT,MAKR,CAAA,MAAA,EAAA,OAEK,CAAA,GAAA,IAAA;AAQK,UAXN,aAAA,CAWM;EAuBX,SAAA,EAjCC,aAiCD;EACP,MAAA,CAAA,EAAA,MAAA;EA0EO,aAAA,CAAA,EA1GM,aA0GN,GAAA,IAAA;EACP;EAtGuB,YAAA,CAAA,EAAA,OAAA;;AA0PZ,cA1PH,MAAA,SAAe,cAAA,CAgQV;;uBA7PK;yCAuBX,0BACP;+CA0EO,0BACP;;;;iBAoJW,qBAAA;;;;;;kBAME,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mistral.d.ts","names":[],"sources":["../../src/providers/mistral.ts"],"sourcesContent":[],"mappings":";;;;;;AAaM,cADO,iBACS,
|
|
1
|
+
{"version":3,"file":"mistral.d.ts","names":[],"sources":["../../src/providers/mistral.ts"],"sourcesContent":[],"mappings":";;;;;;AAaM,cADO,iBACS,EAAA,OAAM;AAI5B,cAJM,cAIyB,EAJT,MAKT,CAAA,MAAA,EAAA,OAEK,CAAA,GAAA,IAAA;AAOD,UAVA,cAAA,CAUA;EAEM,SAAA,EAXV,aAWU;EAJM,MAAA,CAAA,EAAA,MAAA;EAAc,aAAA,CAAA,EALzB,aAKyB,GAAA,IAAA;EAoC9B;EAI2B,aAAA,CAAA,EAAA,OAAA;;AAQW,cAhDtC,OAAA,SAAgB,cAAA,CAgDsB;EAmF5B,QAAA,OAAA;EAA0B,SAAA,IAAA,EAjIhC,WAiIgC;EAAO,WAAA,CAAA,OAAA,EA/HjC,cA+HiC;;;cA/F3C,WAAA;;;wCAI2B;mBAQf,0BAA0B;iBAmF5B,0BAA0B"}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;AAkBA;;;;;AAeA;AAQA;AAeA;AAQA;AAKA;AA0BA;AAWA;AAciB,UAtGA,cAAA,CAsGsB;EAStB,UAAA,EAAA,MAAU;EAQV,OAAA,CAAA,EAAA,MAAA;EASA,SAAA,CAAA,EAAA,MAAA;EASA,UAAA,CAAA,EAAA,MAAA;EASA,gBAAA,CAAA,EA7II,MA6IJ,CAAA,MAAwB,EAAA,OAG7B,CAAA;EAOK,eAAA,CAAA,EAtJG,MAsJgB,CAAA,MAAA,EAAA,OAAA,CAAA;EAcnB,MAAA,CAAA,EAnKN,MAmKM,CAAA,MAAc,EAAA,OAIpB,CAAA;EAYM,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAe;AAahC;AAUA;AAYA;AAeA;;AAGkB,UAhOD,aAAA,CAgOC;EACH,KAAA,EAAA,CAAA,KAAA,EAhOE,cAgOF,EAAA,GAAA,IAAA;;AAMf;AASA;AASA;AAQA;AAYiB,UArQA,mBAAA,SAA4B,aAqQP,CAAA;EASrB,KAAA,EAAA,GAAA,GAAA,OAAA;EAqBA,QAAA,CAAA,EAAA,GAAA,GAAA,IAAiB;EAYjB,IAAA,CAAA,EAAA,CAAA,MAAA,EAAA,MAAmB,EAAA,GAAA,
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;AAkBA;;;;;AAeA;AAQA;AAeA;AAQA;AAKA;AA0BA;AAWA;AAciB,UAtGA,cAAA,CAsGsB;EAStB,UAAA,EAAA,MAAU;EAQV,OAAA,CAAA,EAAA,MAAA;EASA,SAAA,CAAA,EAAA,MAAA;EASA,UAAA,CAAA,EAAA,MAAA;EASA,gBAAA,CAAA,EA7II,MA6IJ,CAAA,MAAwB,EAAA,OAG7B,CAAA;EAOK,eAAA,CAAA,EAtJG,MAsJgB,CAAA,MAAA,EAAA,OAAA,CAAA;EAcnB,MAAA,CAAA,EAnKN,MAmKM,CAAA,MAAc,EAAA,OAIpB,CAAA;EAYM,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAe;AAahC;AAUA;AAYA;AAeA;;AAGkB,UAhOD,aAAA,CAgOC;EACH,KAAA,EAAA,CAAA,KAAA,EAhOE,cAgOF,EAAA,GAAA,IAAA;;AAMf;AASA;AASA;AAQA;AAYiB,UArQA,mBAAA,SAA4B,aAqQP,CAAA;EASrB,KAAA,EAAA,GAAA,GAAA,OAAA;EAqBA,QAAA,CAAA,EAAA,GAAA,GAAA,IAAiB;EAYjB,IAAA,CAAA,EAAA,CAAA,MAAA,EAAA,MAAmB,EAAA,GAAA,OAExB;EAOK,aAAA,CAAA,EApTC,MAoTY,CAAA,MAAA,EAAA,OAAA,CAAA;AAQ9B;AAaA;AASA;AAkBA;AAUA;;;;;AA6BoC,UAhYnB,eAAA,CAgYmB;EAAtB,SAAA,SAAA,EA/XQ,mBA+XR;;;;;;KAxXF,aAAA,GAAgB,gBAAgB;;;;iBAK5B,gBAAA,QAAwB,gBAAgB;;;;;UA0BvC,WAAA;;;;eAIF;;;;;;UAOE,oBAAA;;YAEL;;;;;;;;;;;UAYK,sBAAA;;WAEN;UACD;;;;;UAMO,UAAA;;;iBACkC;;;;;;;UAOlC,gBAAA;;;;;;;;UASA,mBAAA;;qBAEI;;;;;;;;;UAOJ,+BAAA;;;;;;;;UASA,wBAAA;;;YAGL;;;;;;UAOK,mBAAA;;;;;;;;;;;;;UAcA,cAAA;;;;WAIN;UACD;;;;;;UAWO,eAAA;;;;;;;;;;;;UAaA,iBAAA;;WAEN;SACF;;;;;;UAOQ,YAAA;;;;;;;;;;;UAYA,mBAAA;;;;;;;;;;UAeA,cAAA;aACJ;;kBAEK;eACH;;;;;UAME,oBAAA;;kBAEC;eACH;;;;;UAME,mBAAA;;;;;;;;UASA,eAAA;;;YAEK;;;;;;UAML,UAAA;;;;UAEsB;;;;;;UAUtB,qBAAA;;;;;;;;UASA,uBAAA;;;gBAGD;;;;;;;;;;;;;;;UAkBC,iBAAA;;;;;;;;;;;UAYA,mBAAA;;YAEL;UACF;;;;;UAMO,aAAA;;;;;;;;;UAQA,iBAAA;;;;;;;;UAaA,aAAA;;;;;;;;UASA,UAAA;;;;;;;;;;;;;;;;;KAkBL,OAAA,UAAiB;;;;;;;;;UAUZ,gBAAA;;;;;;;;;;;;;;YAcL;;WAED;oBACS;;;;;;;;;;;;cAYN,MAAM,gBAAgB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","names":[],"sources":["../../src/utils/logger.ts"],"sourcesContent":[],"mappings":";UAAiB,MAAA;EAAA,KAAA,CAAA,OAAM,EAAA,MAAA,CAAA,EAAA,IAAA;EAcP,KAAA,CAAA,OAAS,EAAA,MAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"logger.d.ts","names":[],"sources":["../../src/utils/logger.ts"],"sourcesContent":[],"mappings":";UAAiB,MAAA;EAAA,KAAA,CAAA,OAAM,EAAA,MAAA,CAAA,EAAA,IAAA;EAcP,KAAA,CAAA,OAAS,EAAA,MAAA,CAAA,EAAA,IAAuB;;;;iBAAhC,SAAA,uBAAgC"}
|
package/llms-full.txt
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# llms-full.txt
|
|
2
|
-
# @amplitude/ai 0.3.
|
|
2
|
+
# @amplitude/ai 0.3.3 — Complete API Reference for AI Coding Agents
|
|
3
3
|
#
|
|
4
4
|
# This file is the definitive guide for any coding agent instrumenting
|
|
5
5
|
# a JavaScript/TypeScript AI application with @amplitude/ai.
|
package/llms.txt
CHANGED
package/mcp.schema.json
CHANGED