@waniwani/sdk 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -3,13 +3,60 @@ declare class WaniWaniError extends Error {
3
3
  constructor(message: string, status: number);
4
4
  }
5
5
 
6
+ type MCPProvider = "openai" | "anthropic" | "unknown";
7
+ /** OpenAI-specific MCP metadata structure */
8
+ interface OpenAIMeta {
9
+ "openai/subject"?: string;
10
+ "openai/session"?: string;
11
+ "openai/userAgent"?: string;
12
+ "openai/locale"?: string;
13
+ "openai/userLocation"?: {
14
+ city?: string;
15
+ region?: string;
16
+ country?: string;
17
+ timezone?: string;
18
+ latitude?: string;
19
+ longitude?: string;
20
+ };
21
+ timezone_offset_minutes?: number;
22
+ }
23
+ /** Location information (provider-agnostic) */
24
+ interface LocationInfo {
25
+ city?: string;
26
+ region?: string;
27
+ country?: string;
28
+ timezone?: string;
29
+ }
30
+ /** Normalized metadata extracted from any MCP provider */
31
+ interface NormalizedMeta {
32
+ provider: MCPProvider;
33
+ sessionId?: string;
34
+ externalUserId?: string;
35
+ userAgent?: string;
36
+ locale?: string;
37
+ location?: LocationInfo;
38
+ }
6
39
  type EventType = "session.started" | "tool.called" | "quote.requested" | "quote.succeeded" | "quote.failed" | "link.clicked" | "purchase.completed";
7
40
  type ToolType = "pricing" | "product_info" | "availability" | "support" | "other";
8
41
  interface BaseEvent {
9
- sessionId: string;
10
- userAgent?: string;
11
- externalUserId?: string;
12
- metadata?: Record<string, unknown>;
42
+ /**
43
+ * MCP request metadata. The SDK auto-extracts provider fields
44
+ * (sessionId, userId, location, etc.). Can also include custom fields.
45
+ *
46
+ * Location varies by MCP library:
47
+ * - `@vercel/mcp-handler`: `extra._meta`
48
+ * - `@modelcontextprotocol/sdk`: `request.params._meta`
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * wani.track({
53
+ * eventType: 'tool.called',
54
+ * toolName: 'search',
55
+ * meta: extra._meta,
56
+ * });
57
+ * ```
58
+ */
59
+ meta?: Record<string, unknown>;
13
60
  }
14
61
  type TrackEvent = ({
15
62
  eventType: "session.started";
@@ -38,19 +85,12 @@ type TrackEvent = ({
38
85
  */
39
86
  interface TrackingClient {
40
87
  /**
41
- * Track an event using the WaniWani API
88
+ * Track an event. Pass MCP request metadata to auto-extract session, user,
89
+ * and location info from the provider (OpenAI, Anthropic, etc.).
42
90
  */
43
91
  track: (event: TrackEvent) => Promise<{
44
92
  eventId: string;
45
93
  }>;
46
- /**
47
- * Extract session ID from MCP request metadata, or generate a new one.
48
- * If a new session ID is generated, automatically tracks a session.started event.
49
- *
50
- * @param meta - The _meta object from the MCP request (extra?._meta)
51
- * @returns The session ID (existing or newly generated)
52
- */
53
- getOrCreateSession: (meta?: Record<string, unknown>) => Promise<string>;
54
94
  }
55
95
 
56
96
  interface WaniWaniConfig {
@@ -80,6 +120,15 @@ interface WaniWaniConfig {
80
120
  interface WaniWaniClient extends TrackingClient {
81
121
  }
82
122
 
123
+ /**
124
+ * Detect which MCP provider sent the request based on metadata keys
125
+ */
126
+ declare function detectProvider(meta: Record<string, unknown>): MCPProvider;
127
+ /**
128
+ * Extract normalized metadata from any MCP provider's metadata
129
+ */
130
+ declare function extractMetadata(meta: Record<string, unknown>): NormalizedMeta;
131
+
83
132
  /**
84
133
  * Create a WaniWani SDK client
85
134
  *
@@ -101,4 +150,4 @@ interface WaniWaniClient extends TrackingClient {
101
150
  */
102
151
  declare function waniwani(config?: WaniWaniConfig): WaniWaniClient;
103
152
 
104
- export { type EventType, type ToolType, type TrackEvent, type WaniWaniClient, type WaniWaniConfig, WaniWaniError, waniwani };
153
+ export { type EventType, type LocationInfo, type MCPProvider, type NormalizedMeta, type OpenAIMeta, type ToolType, type TrackEvent, type WaniWaniClient, type WaniWaniConfig, WaniWaniError, detectProvider, extractMetadata, waniwani };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var o=class extends Error{constructor(t,s){super(t);this.status=s;this.name="WaniWaniError"}};function f(i){let{baseUrl:a,apiKey:t}=i;function s(){if(!t)throw new Error("WANIWANI_API_KEY is not set")}return{async track(e){try{s();let n=await fetch(`${a}/api/mcp/events`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(e)}),r=await n.json();if(!n.ok)throw new o(r.message??"Request failed",n.status);return{eventId:r.data.eventId}}catch(n){throw console.error("[WaniWani] Track error:",n),n}},async getOrCreateSession(e){if(e){let r=e["openai/sessionId"]||e.sessionId||e.conversationId;if(typeof r=="string"&&r.length>0)return r}let n=crypto.randomUUID();return await this.track({eventType:"session.started",sessionId:n}),n}}}function y(i){let a=i?.baseUrl??"https://app.waniwani.ai",t=i?.apiKey??process.env.WANIWANI_API_KEY;return{...f({baseUrl:a,apiKey:t})}}export{o as WaniWaniError,y as waniwani};
1
+ var r=class extends Error{constructor(t,p){super(t);this.status=p;this.name="WaniWaniError"}};function f(e){return e["openai/subject"]||e["openai/session"]?"openai":"unknown"}function c(e){switch(f(e)){case"openai":return m(e);case"anthropic":return y(e);default:return{provider:"unknown"}}}function m(e){let n=e["openai/userLocation"],t;return n&&(t={city:n.city,region:n.region,country:n.country,timezone:n.timezone}),{provider:"openai",sessionId:e["openai/session"],externalUserId:e["openai/subject"],userAgent:e["openai/userAgent"],locale:e["openai/locale"],location:t}}function y(e){return{provider:"anthropic"}}function l(e){let{baseUrl:n,apiKey:t}=e;function p(){if(!t)throw new Error("WANIWANI_API_KEY is not set")}return{async track(o){try{p();let i=o.meta?c(o.meta):{},d=await fetch(`${n}/api/mcp/events`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({...o,...i})}),u=await d.json();if(!d.ok)throw new r(u.message??"Request failed",d.status);return{eventId:u.data.eventId}}catch(i){throw console.error("[WaniWani] Track error:",i),i}}}}function g(e){let n=e?.baseUrl??"https://app.waniwani.ai",t=e?.apiKey??process.env.WANIWANI_API_KEY;return{...l({baseUrl:n,apiKey:t})}}export{r as WaniWaniError,f as detectProvider,c as extractMetadata,g as waniwani};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/error.ts","../src/tracking/index.ts","../src/waniwani.ts"],"sourcesContent":["// WaniWani SDK - Errors\n\nexport class WaniWaniError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic status: number,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"WaniWaniError\";\n\t}\n}\n","// Tracking Module\n\nimport { WaniWaniError } from \"../error.js\";\nimport type { InternalConfig } from \"../types.js\";\nimport type { TrackEvent, TrackingClient } from \"./@types.js\";\n\n// Re-export types\nexport type {\n\tEventType,\n\tToolType,\n\tTrackEvent,\n\tTrackingClient,\n} from \"./@types.js\";\n\nexport function createTrackingClient(config: InternalConfig): TrackingClient {\n\tconst { baseUrl, apiKey } = config;\n\n\tfunction checkIfApiKeyIsSet() {\n\t\tif (!apiKey) {\n\t\t\tthrow new Error(\"WANIWANI_API_KEY is not set\");\n\t\t}\n\t}\n\n\treturn {\n\t\tasync track(event: TrackEvent): Promise<{ eventId: string }> {\n\t\t\ttry {\n\t\t\t\tcheckIfApiKeyIsSet();\n\n\t\t\t\tconst response = await fetch(`${baseUrl}/api/mcp/events`, {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\t\t},\n\t\t\t\t\tbody: JSON.stringify(event),\n\t\t\t\t});\n\n\t\t\t\tconst data = await response.json();\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new WaniWaniError(\n\t\t\t\t\t\tdata.message ?? \"Request failed\",\n\t\t\t\t\t\tresponse.status,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn { eventId: data.data.eventId };\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"[WaniWani] Track error:\", error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\n\t\tasync getOrCreateSession(meta?: Record<string, unknown>): Promise<string> {\n\t\t\tif (meta) {\n\t\t\t\tconst sessionId =\n\t\t\t\t\tmeta[\"openai/sessionId\"] || meta.sessionId || meta.conversationId;\n\t\t\t\tif (typeof sessionId === \"string\" && sessionId.length > 0) {\n\t\t\t\t\treturn sessionId;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst sessionId = crypto.randomUUID();\n\t\t\tawait this.track({ eventType: \"session.started\", sessionId });\n\t\t\treturn sessionId;\n\t\t},\n\t};\n}\n","// WaniWani SDK - Main Entry\n\nimport { createTrackingClient } from \"./tracking/index.js\";\nimport type { WaniWaniClient, WaniWaniConfig } from \"./types.js\";\n\n/**\n * Create a WaniWani SDK client\n *\n * @param config - Configuration options\n * @returns A fully typed WaniWani client\n *\n * @example\n * ```typescript\n * import { waniwani } from \"@waniwani\";\n *\n * const client = waniwani({ apiKey: \"...\" });\n *\n * await client.track({\n * eventType: \"tool.called\",\n * sessionId: \"session-123\",\n * toolName: \"pricing\"\n * });\n * ```\n */\nexport function waniwani(config?: WaniWaniConfig): WaniWaniClient {\n\tconst baseUrl = config?.baseUrl ?? \"https://app.waniwani.ai\";\n\tconst apiKey = config?.apiKey ?? process.env.WANIWANI_API_KEY;\n\n\tconst internalConfig = { baseUrl, apiKey };\n\n\t// Compose client from modules\n\tconst tracking = createTrackingClient(internalConfig);\n\n\treturn {\n\t\t...tracking,\n\t\t// Future modules will be spread here\n\t\t// ...tools,\n\t};\n}\n"],"mappings":"AAEO,IAAMA,EAAN,cAA4B,KAAM,CACxC,YACCC,EACOC,EACN,CACD,MAAMD,CAAO,EAFN,YAAAC,EAGP,KAAK,KAAO,eACb,CACD,ECIO,SAASC,EAAqBC,EAAwC,CAC5E,GAAM,CAAE,QAAAC,EAAS,OAAAC,CAAO,EAAIF,EAE5B,SAASG,GAAqB,CAC7B,GAAI,CAACD,EACJ,MAAM,IAAI,MAAM,6BAA6B,CAE/C,CAEA,MAAO,CACN,MAAM,MAAME,EAAiD,CAC5D,GAAI,CACHD,EAAmB,EAEnB,IAAME,EAAW,MAAM,MAAM,GAAGJ,CAAO,kBAAmB,CACzD,OAAQ,OACR,QAAS,CACR,eAAgB,mBAChB,cAAe,UAAUC,CAAM,EAChC,EACA,KAAM,KAAK,UAAUE,CAAK,CAC3B,CAAC,EAEKE,EAAO,MAAMD,EAAS,KAAK,EAEjC,GAAI,CAACA,EAAS,GACb,MAAM,IAAIE,EACTD,EAAK,SAAW,iBAChBD,EAAS,MACV,EAGD,MAAO,CAAE,QAASC,EAAK,KAAK,OAAQ,CACrC,OAASE,EAAO,CACf,cAAQ,MAAM,0BAA2BA,CAAK,EACxCA,CACP,CACD,EAEA,MAAM,mBAAmBC,EAAiD,CACzE,GAAIA,EAAM,CACT,IAAMC,EACLD,EAAK,kBAAkB,GAAKA,EAAK,WAAaA,EAAK,eACpD,GAAI,OAAOC,GAAc,UAAYA,EAAU,OAAS,EACvD,OAAOA,CAET,CAEA,IAAMA,EAAY,OAAO,WAAW,EACpC,aAAM,KAAK,MAAM,CAAE,UAAW,kBAAmB,UAAAA,CAAU,CAAC,EACrDA,CACR,CACD,CACD,CC3CO,SAASC,EAASC,EAAyC,CACjE,IAAMC,EAAUD,GAAQ,SAAW,0BAC7BE,EAASF,GAAQ,QAAU,QAAQ,IAAI,iBAO7C,MAAO,CACN,GAHgBG,EAHM,CAAE,QAAAF,EAAS,OAAAC,CAAO,CAGW,CAMpD,CACD","names":["WaniWaniError","message","status","createTrackingClient","config","baseUrl","apiKey","checkIfApiKeyIsSet","event","response","data","WaniWaniError","error","meta","sessionId","waniwani","config","baseUrl","apiKey","createTrackingClient"]}
1
+ {"version":3,"sources":["../src/error.ts","../src/tracking/metadata.ts","../src/tracking/index.ts","../src/waniwani.ts"],"sourcesContent":["// WaniWani SDK - Errors\n\nexport class WaniWaniError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic status: number,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"WaniWaniError\";\n\t}\n}\n","// Metadata Extraction Module\n\nimport type {\n\tLocationInfo,\n\tMCPProvider,\n\tNormalizedMeta,\n\tOpenAIMeta,\n} from \"./@types.js\";\n\n/**\n * Detect which MCP provider sent the request based on metadata keys\n */\nexport function detectProvider(meta: Record<string, unknown>): MCPProvider {\n\tif (meta[\"openai/subject\"] || meta[\"openai/session\"]) {\n\t\treturn \"openai\";\n\t}\n\t// Add Anthropic detection when their MCP format is known\n\t// if (meta['anthropic/...']) return 'anthropic';\n\treturn \"unknown\";\n}\n\n/**\n * Extract normalized metadata from any MCP provider's metadata\n */\nexport function extractMetadata(meta: Record<string, unknown>): NormalizedMeta {\n\tconst provider = detectProvider(meta);\n\n\tswitch (provider) {\n\t\tcase \"openai\":\n\t\t\treturn extractOpenAIMeta(meta as unknown as OpenAIMeta);\n\t\tcase \"anthropic\":\n\t\t\treturn extractAnthropicMeta(meta);\n\t\tdefault:\n\t\t\treturn { provider: \"unknown\" };\n\t}\n}\n\nfunction extractOpenAIMeta(meta: OpenAIMeta): NormalizedMeta {\n\tconst rawLocation = meta[\"openai/userLocation\"];\n\tlet location: LocationInfo | undefined;\n\n\tif (rawLocation) {\n\t\tlocation = {\n\t\t\tcity: rawLocation.city,\n\t\t\tregion: rawLocation.region,\n\t\t\tcountry: rawLocation.country,\n\t\t\ttimezone: rawLocation.timezone,\n\t\t};\n\t}\n\n\treturn {\n\t\tprovider: \"openai\",\n\t\tsessionId: meta[\"openai/session\"],\n\t\texternalUserId: meta[\"openai/subject\"],\n\t\tuserAgent: meta[\"openai/userAgent\"],\n\t\tlocale: meta[\"openai/locale\"],\n\t\tlocation,\n\t};\n}\n\nfunction extractAnthropicMeta(_meta: Record<string, unknown>): NormalizedMeta {\n\t// Placeholder for Anthropic extraction logic\n\t// Will be implemented when Anthropic MCP metadata format is known\n\treturn { provider: \"anthropic\" };\n}\n","// Tracking Module\n\nimport { WaniWaniError } from \"../error.js\";\nimport type { InternalConfig } from \"../types.js\";\nimport type { TrackEvent, TrackingClient } from \"./@types.js\";\nimport { extractMetadata } from \"./metadata.js\";\n\n// Re-export types\nexport type {\n\tEventType,\n\tLocationInfo,\n\tMCPProvider,\n\tNormalizedMeta,\n\tOpenAIMeta,\n\tToolType,\n\tTrackEvent,\n\tTrackingClient,\n} from \"./@types.js\";\n\n// Re-export metadata utilities\nexport { detectProvider, extractMetadata } from \"./metadata.js\";\n\nexport function createTrackingClient(config: InternalConfig): TrackingClient {\n\tconst { baseUrl, apiKey } = config;\n\n\tfunction checkIfApiKeyIsSet() {\n\t\tif (!apiKey) {\n\t\t\tthrow new Error(\"WANIWANI_API_KEY is not set\");\n\t\t}\n\t}\n\n\treturn {\n\t\tasync track(event: TrackEvent): Promise<{ eventId: string }> {\n\t\t\ttry {\n\t\t\t\tcheckIfApiKeyIsSet();\n\n\t\t\t\t// Extract provider-specific fields from meta if present\n\t\t\t\tconst normalized = event.meta ? extractMetadata(event.meta) : {};\n\n\t\t\t\tconst response = await fetch(`${baseUrl}/api/mcp/events`, {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\t\t},\n\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\t...event,\n\t\t\t\t\t\t...normalized,\n\t\t\t\t\t}),\n\t\t\t\t});\n\n\t\t\t\tconst data = await response.json();\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new WaniWaniError(\n\t\t\t\t\t\tdata.message ?? \"Request failed\",\n\t\t\t\t\t\tresponse.status,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn { eventId: data.data.eventId };\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"[WaniWani] Track error:\", error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t};\n}\n","// WaniWani SDK - Main Entry\n\nimport { createTrackingClient } from \"./tracking/index.js\";\nimport type { WaniWaniClient, WaniWaniConfig } from \"./types.js\";\n\n/**\n * Create a WaniWani SDK client\n *\n * @param config - Configuration options\n * @returns A fully typed WaniWani client\n *\n * @example\n * ```typescript\n * import { waniwani } from \"@waniwani\";\n *\n * const client = waniwani({ apiKey: \"...\" });\n *\n * await client.track({\n * eventType: \"tool.called\",\n * sessionId: \"session-123\",\n * toolName: \"pricing\"\n * });\n * ```\n */\nexport function waniwani(config?: WaniWaniConfig): WaniWaniClient {\n\tconst baseUrl = config?.baseUrl ?? \"https://app.waniwani.ai\";\n\tconst apiKey = config?.apiKey ?? process.env.WANIWANI_API_KEY;\n\n\tconst internalConfig = { baseUrl, apiKey };\n\n\t// Compose client from modules\n\tconst tracking = createTrackingClient(internalConfig);\n\n\treturn {\n\t\t...tracking,\n\t\t// Future modules will be spread here\n\t\t// ...tools,\n\t};\n}\n"],"mappings":"AAEO,IAAMA,EAAN,cAA4B,KAAM,CACxC,YACCC,EACOC,EACN,CACD,MAAMD,CAAO,EAFN,YAAAC,EAGP,KAAK,KAAO,eACb,CACD,ECEO,SAASC,EAAeC,EAA4C,CAC1E,OAAIA,EAAK,gBAAgB,GAAKA,EAAK,gBAAgB,EAC3C,SAID,SACR,CAKO,SAASC,EAAgBD,EAA+C,CAG9E,OAFiBD,EAAeC,CAAI,EAElB,CACjB,IAAK,SACJ,OAAOE,EAAkBF,CAA6B,EACvD,IAAK,YACJ,OAAOG,EAAqBH,CAAI,EACjC,QACC,MAAO,CAAE,SAAU,SAAU,CAC/B,CACD,CAEA,SAASE,EAAkBF,EAAkC,CAC5D,IAAMI,EAAcJ,EAAK,qBAAqB,EAC1CK,EAEJ,OAAID,IACHC,EAAW,CACV,KAAMD,EAAY,KAClB,OAAQA,EAAY,OACpB,QAASA,EAAY,QACrB,SAAUA,EAAY,QACvB,GAGM,CACN,SAAU,SACV,UAAWJ,EAAK,gBAAgB,EAChC,eAAgBA,EAAK,gBAAgB,EACrC,UAAWA,EAAK,kBAAkB,EAClC,OAAQA,EAAK,eAAe,EAC5B,SAAAK,CACD,CACD,CAEA,SAASF,EAAqBG,EAAgD,CAG7E,MAAO,CAAE,SAAU,WAAY,CAChC,CC1CO,SAASC,EAAqBC,EAAwC,CAC5E,GAAM,CAAE,QAAAC,EAAS,OAAAC,CAAO,EAAIF,EAE5B,SAASG,GAAqB,CAC7B,GAAI,CAACD,EACJ,MAAM,IAAI,MAAM,6BAA6B,CAE/C,CAEA,MAAO,CACN,MAAM,MAAME,EAAiD,CAC5D,GAAI,CACHD,EAAmB,EAGnB,IAAME,EAAaD,EAAM,KAAOE,EAAgBF,EAAM,IAAI,EAAI,CAAC,EAEzDG,EAAW,MAAM,MAAM,GAAGN,CAAO,kBAAmB,CACzD,OAAQ,OACR,QAAS,CACR,eAAgB,mBAChB,cAAe,UAAUC,CAAM,EAChC,EACA,KAAM,KAAK,UAAU,CACpB,GAAGE,EACH,GAAGC,CACJ,CAAC,CACF,CAAC,EAEKG,EAAO,MAAMD,EAAS,KAAK,EAEjC,GAAI,CAACA,EAAS,GACb,MAAM,IAAIE,EACTD,EAAK,SAAW,iBAChBD,EAAS,MACV,EAGD,MAAO,CAAE,QAASC,EAAK,KAAK,OAAQ,CACrC,OAASE,EAAO,CACf,cAAQ,MAAM,0BAA2BA,CAAK,EACxCA,CACP,CACD,CACD,CACD,CC3CO,SAASC,EAASC,EAAyC,CACjE,IAAMC,EAAUD,GAAQ,SAAW,0BAC7BE,EAASF,GAAQ,QAAU,QAAQ,IAAI,iBAO7C,MAAO,CACN,GAHgBG,EAHM,CAAE,QAAAF,EAAS,OAAAC,CAAO,CAGW,CAMpD,CACD","names":["WaniWaniError","message","status","detectProvider","meta","extractMetadata","extractOpenAIMeta","extractAnthropicMeta","rawLocation","location","_meta","createTrackingClient","config","baseUrl","apiKey","checkIfApiKeyIsSet","event","normalized","extractMetadata","response","data","WaniWaniError","error","waniwani","config","baseUrl","apiKey","createTrackingClient"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@waniwani/sdk",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "WaniWani SDK - MCP event tracking and tools",
5
5
  "type": "module",
6
6
  "exports": {