@amplitude/ai 0.3.0 → 0.3.1
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/dist/core/tracking.d.ts.map +1 -1
- package/dist/mcp/generate-verify-test.d.ts.map +1 -1
- package/dist/mcp/generate-verify-test.js +14 -6
- package/dist/mcp/generate-verify-test.js.map +1 -1
- package/dist/mcp/instrument-file.d.ts.map +1 -1
- package/dist/mcp/instrument-file.js +5 -8
- 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/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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracking.d.ts","names":[],"sources":["../../src/core/tracking.ts"],"sourcesContent":[],"mappings":";;;;;;iBA6HgB,qBAAA;UA8BC,uBAAA;EA9BD,SAAA,EA+BH,aA/BwB;EA8BpB,MAAA,EAAA,MAAA;EACJ,cAAA,EAAA,MAAA;EAeD,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAII,OAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAEL,MAAA,CAAA,EAAA,MAAA;EACS,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACD,cAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACR,GAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACO,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAa,OAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAGf,aAAA,CAAA,EAAA,MAAgB,GAAA,IAAA;EA0Ff,aAAA,CAAA,EAAA,MAAA,GAAqB,IAAA;EACzB,YAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAsBO,WAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAgB,OAAA,CAAA,EA9HxB,MA8HwB,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EAAtB,cAAA,CAAA,EAAA,OAAA;EAWE,MAAA,CAAA,EAAA,OAAA;EACL,eAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAQC,WAAA,CAAA,EA9II,UA8IJ,EAAA,GAAA,IAAA;EAEQ,aAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACD,MAAA,CAAA,EA/IR,YA+IQ,EAAA,GAAA,IAAA;EACR,eAAA,CAAA,EA/IS,MA+IT,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EACO,cAAA,CAAA,EA/IC,MA+ID,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EAAa,MAAA,CAAA,EA9IpB,MA8IoB,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EAGf,aAAA,CAAA,EAhJE,
|
|
1
|
+
{"version":3,"file":"tracking.d.ts","names":[],"sources":["../../src/core/tracking.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-verify-test.d.ts","names":[],"sources":["../../src/mcp/generate-verify-test.ts"],"sourcesContent":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"generate-verify-test.d.ts","names":[],"sources":["../../src/mcp/generate-verify-test.ts"],"sourcesContent":[],"mappings":";;;iBAMgB,kBAAA,aAA+B"}
|
|
@@ -1,19 +1,27 @@
|
|
|
1
1
|
//#region src/mcp/generate-verify-test.ts
|
|
2
|
+
function escapeStr(s) {
|
|
3
|
+
return s.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
|
|
4
|
+
}
|
|
2
5
|
function generateVerifyTest(scanResult) {
|
|
3
6
|
const lines = [];
|
|
4
7
|
lines.push("import { describe, it, expect } from 'vitest';", "import { MockAmplitudeAI } from '@amplitude/ai/testing';", "", "describe('Amplitude AI verification', () => {");
|
|
5
|
-
for (const agent of scanResult.agents)
|
|
8
|
+
for (const agent of scanResult.agents) {
|
|
9
|
+
const eid = escapeStr(agent.inferred_id);
|
|
10
|
+
lines.push(` it('${eid} emits correct event sequence', () => {`, " const mock = new MockAmplitudeAI();", ` const agent = mock.agent('${eid}');`, " const session = agent.session({ userId: 'verify-user', sessionId: 'verify-session' });", " session.runSync((s) => {", " s.trackUserMessage('test message');", " });", " const events = mock.getEvents();", " expect(events.length).toBeGreaterThanOrEqual(2);", ` mock.assertEventTracked('[Agent] User Message', { '[Agent] Agent ID': '${eid}' });`, " mock.assertSessionClosed('verify-session');", " });", "");
|
|
11
|
+
}
|
|
6
12
|
if ((scanResult.is_multi_agent || scanResult.multi_agent_signals.length > 0) && scanResult.agents.length >= 2) {
|
|
7
13
|
const parentAgent = scanResult.agents[0];
|
|
8
14
|
const childAgent = scanResult.agents[1];
|
|
9
15
|
if (parentAgent && childAgent) {
|
|
10
|
-
|
|
16
|
+
const pid = escapeStr(parentAgent.inferred_id);
|
|
17
|
+
const cid = escapeStr(childAgent.inferred_id);
|
|
18
|
+
lines.push(" it('multi-agent delegation via runAs', () => {", " const mock = new MockAmplitudeAI();", ` const parent = mock.agent('${pid}');`, ` const child = parent.child('${cid}');`, " const session = parent.session({ userId: 'verify-user', sessionId: 'verify-multi' });", " session.runSync((s) => {", " s.runAsSync(child, (cs) => {", " cs.trackUserMessage('delegated task');", " });", " });", ` const childEvents = mock.eventsForAgent('${cid}');`, " expect(childEvents.length).toBeGreaterThan(0);", " expect(childEvents[0].event_properties?.['[Agent] Session ID']).toBe('verify-multi');", " });", "");
|
|
11
19
|
const childAgents = scanResult.agents.slice(0, 2);
|
|
12
|
-
lines.push(" it('parallel fan-out shares session', async () => {", " const mock = new MockAmplitudeAI();", ` const orchestrator = mock.agent('${
|
|
13
|
-
for (const child of childAgents) lines.push(` orchestrator.child('${child.inferred_id}'),`);
|
|
20
|
+
lines.push(" it('parallel fan-out shares session', async () => {", " const mock = new MockAmplitudeAI();", ` const orchestrator = mock.agent('${pid}');`, " const children = [");
|
|
21
|
+
for (const child of childAgents) lines.push(` orchestrator.child('${escapeStr(child.inferred_id)}'),`);
|
|
14
22
|
lines.push(" ];", " const session = orchestrator.session({ userId: 'verify-user', sessionId: 'verify-parallel' });", " await session.run(async (s) => {", " await Promise.all(children.map((child) =>", " s.runAs(child, async (cs) => {", " cs.trackUserMessage('parallel task');", " }),", " ));", " });", " for (const child of children) {", " const events = mock.eventsForAgent(child.agentId);", " expect(events.length).toBeGreaterThan(0);", " expect(events[0].event_properties?.['[Agent] Session ID']).toBe('verify-parallel');", " }", " });", "");
|
|
15
|
-
lines.push(" it('tool calls inside runAs are attributed to child agent', () => {", " const mock = new MockAmplitudeAI();", ` const parent = mock.agent('${
|
|
16
|
-
lines.push(" it('runAs restores parent context after child throws', () => {", " const mock = new MockAmplitudeAI();", ` const parent = mock.agent('${
|
|
23
|
+
lines.push(" it('tool calls inside runAs are attributed to child agent', () => {", " const mock = new MockAmplitudeAI();", ` const parent = mock.agent('${pid}');`, ` const child = parent.child('${cid}');`, " const session = parent.session({ userId: 'verify-user', sessionId: 'verify-tools' });", " session.runSync((s) => {", " s.runAsSync(child, (cs) => {", " cs.trackToolCall('search_knowledge_base', 150, true);", " });", " });", " const toolEvents = mock.getEvents().filter(e => e.event_type === '[Agent] Tool Call');", " expect(toolEvents.length).toBe(1);", ` expect(toolEvents[0].event_properties?.['[Agent] Agent ID']).toBe('${cid}');`, ` expect(toolEvents[0].event_properties?.['[Agent] Parent Agent ID']).toBe('${pid}');`, " });", "");
|
|
24
|
+
lines.push(" it('runAs restores parent context after child throws', () => {", " const mock = new MockAmplitudeAI();", ` const parent = mock.agent('${pid}');`, ` const faultyChild = parent.child('${cid}-faulty');`, " const session = parent.session({ userId: 'verify-user', sessionId: 'verify-error' });", " session.runSync((s) => {", " try {", " s.runAsSync(faultyChild, () => {", " throw new Error('child failed');", " });", " } catch {", " s.trackUserMessage('recovering from child failure');", " }", " });", ` const parentEvents = mock.eventsForAgent('${pid}');`, " const recoveryMsg = parentEvents.find(e => e.event_type === '[Agent] User Message');", " expect(recoveryMsg).toBeDefined();", ` expect(recoveryMsg?.event_properties?.['[Agent] Agent ID']).toBe('${pid}');`, " });", "");
|
|
17
25
|
}
|
|
18
26
|
}
|
|
19
27
|
lines.push("});", "");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-verify-test.js","names":["lines: string[]"],"sources":["../../src/mcp/generate-verify-test.ts"],"sourcesContent":["import type { ScanResult } from './scan-project.js';\n\nexport function generateVerifyTest(scanResult: ScanResult): string {\n const lines: string[] = [];\n\n lines.push(\n \"import { describe, it, expect } from 'vitest';\",\n \"import { MockAmplitudeAI } from '@amplitude/ai/testing';\",\n '',\n \"describe('Amplitude AI verification', () => {\",\n );\n\n for (const agent of scanResult.agents) {\n lines.push(\n ` it('${
|
|
1
|
+
{"version":3,"file":"generate-verify-test.js","names":["lines: string[]"],"sources":["../../src/mcp/generate-verify-test.ts"],"sourcesContent":["import type { ScanResult } from './scan-project.js';\n\nfunction escapeStr(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\nexport function generateVerifyTest(scanResult: ScanResult): string {\n const lines: string[] = [];\n\n lines.push(\n \"import { describe, it, expect } from 'vitest';\",\n \"import { MockAmplitudeAI } from '@amplitude/ai/testing';\",\n '',\n \"describe('Amplitude AI verification', () => {\",\n );\n\n for (const agent of scanResult.agents) {\n const eid = escapeStr(agent.inferred_id);\n lines.push(\n ` it('${eid} emits correct event sequence', () => {`,\n ' const mock = new MockAmplitudeAI();',\n ` const agent = mock.agent('${eid}');`,\n \" const session = agent.session({ userId: 'verify-user', sessionId: 'verify-session' });\",\n ' session.runSync((s) => {',\n \" s.trackUserMessage('test message');\",\n ' });',\n ' const events = mock.getEvents();',\n ' expect(events.length).toBeGreaterThanOrEqual(2);',\n ` mock.assertEventTracked('[Agent] User Message', { '[Agent] Agent ID': '${eid}' });`,\n \" mock.assertSessionClosed('verify-session');\",\n ' });',\n '',\n );\n }\n\n const shouldEmitMultiAgentTests =\n (scanResult.is_multi_agent || scanResult.multi_agent_signals.length > 0) &&\n scanResult.agents.length >= 2;\n\n if (shouldEmitMultiAgentTests) {\n const parentAgent = scanResult.agents[0];\n const childAgent = scanResult.agents[1];\n\n if (parentAgent && childAgent) {\n const pid = escapeStr(parentAgent.inferred_id);\n const cid = escapeStr(childAgent.inferred_id);\n\n lines.push(\n \" it('multi-agent delegation via runAs', () => {\",\n ' const mock = new MockAmplitudeAI();',\n ` const parent = mock.agent('${pid}');`,\n ` const child = parent.child('${cid}');`,\n \" const session = parent.session({ userId: 'verify-user', sessionId: 'verify-multi' });\",\n ' session.runSync((s) => {',\n ' s.runAsSync(child, (cs) => {',\n \" cs.trackUserMessage('delegated task');\",\n ' });',\n ' });',\n ` const childEvents = mock.eventsForAgent('${cid}');`,\n ' expect(childEvents.length).toBeGreaterThan(0);',\n \" expect(childEvents[0].event_properties?.['[Agent] Session ID']).toBe('verify-multi');\",\n ' });',\n '',\n );\n\n const childAgents = scanResult.agents.slice(0, 2);\n lines.push(\n \" it('parallel fan-out shares session', async () => {\",\n ' const mock = new MockAmplitudeAI();',\n ` const orchestrator = mock.agent('${pid}');`,\n ' const children = [',\n );\n for (const child of childAgents) {\n lines.push(\n ` orchestrator.child('${escapeStr(child.inferred_id)}'),`,\n );\n }\n lines.push(\n ' ];',\n \" const session = orchestrator.session({ userId: 'verify-user', sessionId: 'verify-parallel' });\",\n ' await session.run(async (s) => {',\n ' await Promise.all(children.map((child) =>',\n ' s.runAs(child, async (cs) => {',\n \" cs.trackUserMessage('parallel task');\",\n ' }),',\n ' ));',\n ' });',\n ' for (const child of children) {',\n ' const events = mock.eventsForAgent(child.agentId);',\n ' expect(events.length).toBeGreaterThan(0);',\n \" expect(events[0].event_properties?.['[Agent] Session ID']).toBe('verify-parallel');\",\n ' }',\n ' });',\n '',\n );\n\n lines.push(\n \" it('tool calls inside runAs are attributed to child agent', () => {\",\n ' const mock = new MockAmplitudeAI();',\n ` const parent = mock.agent('${pid}');`,\n ` const child = parent.child('${cid}');`,\n \" const session = parent.session({ userId: 'verify-user', sessionId: 'verify-tools' });\",\n ' session.runSync((s) => {',\n ' s.runAsSync(child, (cs) => {',\n \" cs.trackToolCall('search_knowledge_base', 150, true);\",\n ' });',\n ' });',\n \" const toolEvents = mock.getEvents().filter(e => e.event_type === '[Agent] Tool Call');\",\n ' expect(toolEvents.length).toBe(1);',\n ` expect(toolEvents[0].event_properties?.['[Agent] Agent ID']).toBe('${cid}');`,\n ` expect(toolEvents[0].event_properties?.['[Agent] Parent Agent ID']).toBe('${pid}');`,\n ' });',\n '',\n );\n\n lines.push(\n \" it('runAs restores parent context after child throws', () => {\",\n ' const mock = new MockAmplitudeAI();',\n ` const parent = mock.agent('${pid}');`,\n ` const faultyChild = parent.child('${cid}-faulty');`,\n \" const session = parent.session({ userId: 'verify-user', sessionId: 'verify-error' });\",\n ' session.runSync((s) => {',\n ' try {',\n ' s.runAsSync(faultyChild, () => {',\n \" throw new Error('child failed');\",\n ' });',\n ' } catch {',\n \" s.trackUserMessage('recovering from child failure');\",\n ' }',\n ' });',\n ` const parentEvents = mock.eventsForAgent('${pid}');`,\n \" const recoveryMsg = parentEvents.find(e => e.event_type === '[Agent] User Message');\",\n ' expect(recoveryMsg).toBeDefined();',\n ` expect(recoveryMsg?.event_properties?.['[Agent] Agent ID']).toBe('${pid}');`,\n ' });',\n '',\n );\n }\n }\n\n lines.push('});', '');\n\n return lines.join('\\n');\n}\n"],"mappings":";AAEA,SAAS,UAAU,GAAmB;AACpC,QAAO,EAAE,QAAQ,OAAO,OAAO,CAAC,QAAQ,MAAM,MAAM;;AAGtD,SAAgB,mBAAmB,YAAgC;CACjE,MAAMA,QAAkB,EAAE;AAE1B,OAAM,KACJ,kDACA,4DACA,IACA,gDACD;AAED,MAAK,MAAM,SAAS,WAAW,QAAQ;EACrC,MAAM,MAAM,UAAU,MAAM,YAAY;AACxC,QAAM,KACJ,SAAS,IAAI,0CACb,2CACA,iCAAiC,IAAI,MACrC,8FACA,gCACA,6CACA,WACA,wCACA,wDACA,8EAA8E,IAAI,QAClF,mDACA,SACA,GACD;;AAOH,MAHG,WAAW,kBAAkB,WAAW,oBAAoB,SAAS,MACtE,WAAW,OAAO,UAAU,GAEC;EAC7B,MAAM,cAAc,WAAW,OAAO;EACtC,MAAM,aAAa,WAAW,OAAO;AAErC,MAAI,eAAe,YAAY;GAC7B,MAAM,MAAM,UAAU,YAAY,YAAY;GAC9C,MAAM,MAAM,UAAU,WAAW,YAAY;AAE7C,SAAM,KACJ,oDACA,2CACA,kCAAkC,IAAI,MACtC,mCAAmC,IAAI,MACvC,6FACA,gCACA,sCACA,kDACA,aACA,WACA,gDAAgD,IAAI,MACpD,sDACA,6FACA,SACA,GACD;GAED,MAAM,cAAc,WAAW,OAAO,MAAM,GAAG,EAAE;AACjD,SAAM,KACJ,yDACA,2CACA,wCAAwC,IAAI,MAC5C,yBACD;AACD,QAAK,MAAM,SAAS,YAClB,OAAM,KACJ,6BAA6B,UAAU,MAAM,YAAY,CAAC,KAC3D;AAEH,SAAM,KACJ,UACA,sGACA,wCACA,mDACA,0CACA,mDACA,eACA,aACA,WACA,uCACA,4DACA,mDACA,6FACA,SACA,SACA,GACD;AAED,SAAM,KACJ,yEACA,2CACA,kCAAkC,IAAI,MACtC,mCAAmC,IAAI,MACvC,6FACA,gCACA,sCACA,iEACA,aACA,WACA,8FACA,0CACA,0EAA0E,IAAI,MAC9E,iFAAiF,IAAI,MACrF,SACA,GACD;AAED,SAAM,KACJ,oEACA,2CACA,kCAAkC,IAAI,MACtC,yCAAyC,IAAI,aAC7C,6FACA,gCACA,eACA,4CACA,8CACA,eACA,mBACA,gEACA,WACA,WACA,iDAAiD,IAAI,MACrD,4FACA,0CACA,yEAAyE,IAAI,MAC7E,SACA,GACD;;;AAIL,OAAM,KAAK,OAAO,GAAG;AAErB,QAAO,MAAM,KAAK,KAAK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument-file.d.ts","names":[],"sources":["../../src/mcp/instrument-file.ts"],"sourcesContent":[],"mappings":";UAAiB,qBAAA;EAAA,MAAA,EAAA,MAAA;
|
|
1
|
+
{"version":3,"file":"instrument-file.d.ts","names":[],"sources":["../../src/mcp/instrument-file.ts"],"sourcesContent":[],"mappings":";UAAiB,qBAAA;EAAA,MAAA,EAAA,MAAA;EAoKD,QAAA,EAAA,MAAA;;;;;;;iBAAA,cAAA,OAAqB"}
|
|
@@ -66,7 +66,8 @@ function replaceProviderImports(source, providers, bootstrapImportPath) {
|
|
|
66
66
|
const mapping = PROVIDER_IMPORT_MAP[provider];
|
|
67
67
|
if (!mapping) continue;
|
|
68
68
|
const defaultImportRe = /* @__PURE__ */ new RegExp(`import\\s+${mapping.defaultExport}\\s+from\\s+['"]${mapping.module}['"];?`);
|
|
69
|
-
const
|
|
69
|
+
const escapedModule = mapping.module.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
70
|
+
const namedImportRe = new RegExp(`import\\s*\\{[^}]*\\b${mapping.defaultExport}\\b[^}]*\\}\\s*from\\s+['"]${escapedModule}['"];?`, "s");
|
|
70
71
|
if (defaultImportRe.test(result)) {
|
|
71
72
|
result = result.replace(defaultImportRe, "");
|
|
72
73
|
namedImports.push(mapping.namedExport);
|
|
@@ -96,7 +97,7 @@ function addSessionWrapping(source, agentId, bootstrapImportPath) {
|
|
|
96
97
|
const agentLine = `const agent = ai.agent('${agentId}');\n`;
|
|
97
98
|
if (ROUTE_HANDLER_RE.test(result)) {
|
|
98
99
|
const handlerMatch = result.match(/export\s+async\s+function\s+(?:POST|GET|PUT|DELETE)\s*\([^)]*\)\s*\{/);
|
|
99
|
-
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
|
|
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
101
|
if (handlerMatch?.index != null) {
|
|
101
102
|
const openBraceIdx = result.indexOf("{", handlerMatch.index);
|
|
102
103
|
if (openBraceIdx >= 0) {
|
|
@@ -108,10 +109,10 @@ function addSessionWrapping(source, agentId, bootstrapImportPath) {
|
|
|
108
109
|
i++;
|
|
109
110
|
}
|
|
110
111
|
const closingBraceIdx = i - 1;
|
|
111
|
-
result = `${result.slice(0, closingBraceIdx)} });\n${result.slice(closingBraceIdx)}`;
|
|
112
|
+
result = `${result.slice(0, closingBraceIdx)} });\n await ai.flush();\n return _response;\n${result.slice(closingBraceIdx)}`;
|
|
112
113
|
}
|
|
113
114
|
}
|
|
114
|
-
} 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
|
|
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: 'todo-extract-user-id', sessionId: 'todo-extract-session-id' }).run(async (s) => {`);
|
|
115
116
|
return result;
|
|
116
117
|
}
|
|
117
118
|
function addUserMessageTracking(source) {
|
|
@@ -119,9 +120,6 @@ function addUserMessageTracking(source) {
|
|
|
119
120
|
if (match) return source.replace(match[0], `${match[0]};\n // TODO: extract user message and call s.trackUserMessage(userMessage)`);
|
|
120
121
|
return source;
|
|
121
122
|
}
|
|
122
|
-
function addFlushBeforeReturn(source) {
|
|
123
|
-
return source.replace(/(\n)([ \t]*)(return\s+(?:Response\.json|new\s+Response|NextResponse|res\.json|res\.send)\s*\()/g, "$1$2await ai.flush();\n$2$3");
|
|
124
|
-
}
|
|
125
123
|
function instrumentFile(opts) {
|
|
126
124
|
if (opts.tier === "quick_start") return opts.source;
|
|
127
125
|
let result = opts.source;
|
|
@@ -129,7 +127,6 @@ function instrumentFile(opts) {
|
|
|
129
127
|
if (opts.tier === "advanced") {
|
|
130
128
|
result = addSessionWrapping(result, opts.agentId, opts.bootstrapImportPath);
|
|
131
129
|
result = addUserMessageTracking(result);
|
|
132
|
-
result = addFlushBeforeReturn(result);
|
|
133
130
|
}
|
|
134
131
|
return result;
|
|
135
132
|
}
|
|
@@ -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: import { AzureOpenAI } from '@azure/openai'\n const namedImportRe = new RegExp(\n `import\\\\s*\\\\{\\\\s*${mapping.defaultExport}\\\\s*\\\\}\\\\s*from\\\\s+['\"]${mapping.module}['\"];?`,\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()\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 return agent.session({ userId, sessionId }).run(async (s) => {`,\n );\n // Find the handler's closing brace using balanced-brace matching from the handler opening\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${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 return 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\nfunction addFlushBeforeReturn(source: string): string {\n // Insert await ai.flush() before return statements in route handlers\n return source.replace(\n /(\\n)([ \\t]*)(return\\s+(?:Response\\.json|new\\s+Response|NextResponse|res\\.json|res\\.send)\\s*\\()/g,\n '$1$2await ai.flush();\\n$2$3',\n );\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 result = addFlushBeforeReturn(result);\n }\n\n return result;\n}\n"],"mappings":"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"}
|
|
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"}
|
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,CArDc"}
|
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,CAkJD,EAAW,MAAA,EAAA;AAuHV,iBApNA,WAAA,CAqND,OAAA,EAAW;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,CAlBb,OAAM,EAmBE,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,EAAM,OAAA;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,EAAM,OAAA;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,EAAM,OAAA;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"}
|
|
@@ -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,EAAuB,IAAA;;;;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.1 — 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