@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # AGENTS.md
2
2
 
3
- Package: `@amplitude/ai` v0.3.0
3
+ Package: `@amplitude/ai` v0.3.1
4
4
 
5
5
  ## Install
6
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"tracking.d.ts","names":[],"sources":["../../src/core/tracking.ts"],"sourcesContent":[],"mappings":"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"}
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":";;;iBAEgB,kBAAA,aAA+B"}
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) lines.push(` it('${agent.inferred_id} emits correct event sequence', () => {`, " const mock = new MockAmplitudeAI();", ` const agent = mock.agent('${agent.inferred_id}');`, " 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': '${agent.inferred_id}' });`, " mock.assertSessionClosed('verify-session');", " });", "");
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
- lines.push(" it('multi-agent delegation via runAs', () => {", " const mock = new MockAmplitudeAI();", ` const parent = mock.agent('${parentAgent.inferred_id}');`, ` const child = parent.child('${childAgent.inferred_id}');`, " 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('${childAgent.inferred_id}');`, " expect(childEvents.length).toBeGreaterThan(0);", " expect(childEvents[0].event_properties?.['[Agent] Session ID']).toBe('verify-multi');", " });", "");
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('${parentAgent.inferred_id}');`, " const children = [");
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('${parentAgent.inferred_id}');`, ` const child = parent.child('${childAgent.inferred_id}');`, " 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('${childAgent.inferred_id}');`, ` expect(toolEvents[0].event_properties?.['[Agent] Parent Agent ID']).toBe('${parentAgent.inferred_id}');`, " });", "");
16
- lines.push(" it('runAs restores parent context after child throws', () => {", " const mock = new MockAmplitudeAI();", ` const parent = mock.agent('${parentAgent.inferred_id}');`, ` const faultyChild = parent.child('${childAgent.inferred_id}-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('${parentAgent.inferred_id}');`, " const recoveryMsg = parentEvents.find(e => e.event_type === '[Agent] User Message');", " expect(recoveryMsg).toBeDefined();", ` expect(recoveryMsg?.event_properties?.['[Agent] Agent ID']).toBe('${parentAgent.inferred_id}');`, " });", "");
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('${agent.inferred_id} emits correct event sequence', () => {`,\n ' const mock = new MockAmplitudeAI();',\n ` const agent = mock.agent('${agent.inferred_id}');`,\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': '${agent.inferred_id}' });`,\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 lines.push(\n \" it('multi-agent delegation via runAs', () => {\",\n ' const mock = new MockAmplitudeAI();',\n ` const parent = mock.agent('${parentAgent.inferred_id}');`,\n ` const child = parent.child('${childAgent.inferred_id}');`,\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('${childAgent.inferred_id}');`,\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('${parentAgent.inferred_id}');`,\n ' const children = [',\n );\n for (const child of childAgents) {\n lines.push(\n ` orchestrator.child('${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('${parentAgent.inferred_id}');`,\n ` const child = parent.child('${childAgent.inferred_id}');`,\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('${childAgent.inferred_id}');`,\n ` expect(toolEvents[0].event_properties?.['[Agent] Parent Agent ID']).toBe('${parentAgent.inferred_id}');`,\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('${parentAgent.inferred_id}');`,\n ` const faultyChild = parent.child('${childAgent.inferred_id}-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('${parentAgent.inferred_id}');`,\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('${parentAgent.inferred_id}');`,\n ' });',\n '',\n );\n }\n }\n\n lines.push('});', '');\n\n return lines.join('\\n');\n}\n"],"mappings":";AAEA,SAAgB,mBAAmB,YAAgC;CACjE,MAAMA,QAAkB,EAAE;AAE1B,OAAM,KACJ,kDACA,4DACA,IACA,gDACD;AAED,MAAK,MAAM,SAAS,WAAW,OAC7B,OAAM,KACJ,SAAS,MAAM,YAAY,0CAC3B,2CACA,iCAAiC,MAAM,YAAY,MACnD,8FACA,gCACA,6CACA,WACA,wCACA,wDACA,8EAA8E,MAAM,YAAY,QAChG,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;AAC7B,SAAM,KACJ,oDACA,2CACA,kCAAkC,YAAY,YAAY,MAC1D,mCAAmC,WAAW,YAAY,MAC1D,6FACA,gCACA,sCACA,kDACA,aACA,WACA,gDAAgD,WAAW,YAAY,MACvE,sDACA,6FACA,SACA,GACD;GAED,MAAM,cAAc,WAAW,OAAO,MAAM,GAAG,EAAE;AACjD,SAAM,KACJ,yDACA,2CACA,wCAAwC,YAAY,YAAY,MAChE,yBACD;AACD,QAAK,MAAM,SAAS,YAClB,OAAM,KACJ,6BAA6B,MAAM,YAAY,KAChD;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,YAAY,YAAY,MAC1D,mCAAmC,WAAW,YAAY,MAC1D,6FACA,gCACA,sCACA,iEACA,aACA,WACA,8FACA,0CACA,0EAA0E,WAAW,YAAY,MACjG,iFAAiF,YAAY,YAAY,MACzG,SACA,GACD;AAED,SAAM,KACJ,oEACA,2CACA,kCAAkC,YAAY,YAAY,MAC1D,yCAAyC,WAAW,YAAY,aAChE,6FACA,gCACA,eACA,4CACA,8CACA,eACA,mBACA,gEACA,WACA,WACA,iDAAiD,YAAY,YAAY,MACzE,4FACA,0CACA,yEAAyE,YAAY,YAAY,MACjG,SACA,GACD;;;AAIL,OAAM,KAAK,OAAO,GAAG;AAErB,QAAO,MAAM,KAAK,KAAK"}
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;EA0KD,QAAA,EAAA,MAAA;;;;;;;iBAAA,cAAA,OAAqB"}
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 namedImportRe = /* @__PURE__ */ new RegExp(`import\\s*\\{\\s*${mapping.defaultExport}\\s*\\}\\s*from\\s+['"]${mapping.module}['"];?`);
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 return 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 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 return agent.session({ userId: 'todo-extract-user-id', sessionId: 'todo-extract-session-id' }).run(async (s) => {`);
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":"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"}
@@ -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,CAAA"}
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"}
@@ -1 +1 @@
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
+ {"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,CAnBJ,OACT,EAmBQ,MAnBF,CAAA,MAAA,EAAA,MAAA,CAAA,CAAA,EAoBN,MApBM,CAAA,MAAA,EAAA,MAAA,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,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
+ {"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,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
+ {"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,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"}
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,EAAA,IAAuB;;;;iBAAhC,SAAA,uBAAgC"}
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.0 — Complete API Reference for AI Coding Agents
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
@@ -1,7 +1,7 @@
1
1
  <!-- GENERATED FILE: do not edit manually. Update scripts/generate-agent-docs.mjs instead. -->
2
2
  # llms.txt
3
3
  package=@amplitude/ai
4
- version=0.3.0
4
+ version=0.3.1
5
5
 
6
6
  [mcp.tools]
7
7
  get_event_schema
package/mcp.schema.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "generated": true,
3
3
  "package": "@amplitude/ai",
4
- "version": "0.3.0",
4
+ "version": "0.3.1",
5
5
  "prompt": "instrument_app",
6
6
  "tools": [
7
7
  "get_event_schema",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amplitude/ai",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "private": false,
5
5
  "description": "Amplitude AI SDK - LLM usage tracking for Amplitude Analytics",
6
6
  "keywords": [