@kelpi/mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/README.md +312 -0
  2. package/bin/kelpi-mcp +3 -0
  3. package/dist/__tests__/integration-api/fixtures.d.ts +382 -0
  4. package/dist/__tests__/integration-api/fixtures.d.ts.map +1 -0
  5. package/dist/__tests__/integration-api/fixtures.js +478 -0
  6. package/dist/__tests__/integration-api/fixtures.js.map +1 -0
  7. package/dist/__tests__/integration-api/index.d.ts +19 -0
  8. package/dist/__tests__/integration-api/index.d.ts.map +1 -0
  9. package/dist/__tests__/integration-api/index.js +33 -0
  10. package/dist/__tests__/integration-api/index.js.map +1 -0
  11. package/dist/__tests__/integration-api/setup.d.ts +176 -0
  12. package/dist/__tests__/integration-api/setup.d.ts.map +1 -0
  13. package/dist/__tests__/integration-api/setup.js +329 -0
  14. package/dist/__tests__/integration-api/setup.js.map +1 -0
  15. package/dist/__tests__/setup.d.ts +2 -0
  16. package/dist/__tests__/setup.d.ts.map +1 -0
  17. package/dist/__tests__/setup.js +11 -0
  18. package/dist/__tests__/setup.js.map +1 -0
  19. package/dist/__tests__/unit/test-utils.d.ts +46 -0
  20. package/dist/__tests__/unit/test-utils.d.ts.map +1 -0
  21. package/dist/__tests__/unit/test-utils.js +50 -0
  22. package/dist/__tests__/unit/test-utils.js.map +1 -0
  23. package/dist/index.d.ts +6 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +34 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/lib/api-client.d.ts +17 -0
  28. package/dist/lib/api-client.d.ts.map +1 -0
  29. package/dist/lib/api-client.js +169 -0
  30. package/dist/lib/api-client.js.map +1 -0
  31. package/dist/lib/auth-state.d.ts +54 -0
  32. package/dist/lib/auth-state.d.ts.map +1 -0
  33. package/dist/lib/auth-state.js +131 -0
  34. package/dist/lib/auth-state.js.map +1 -0
  35. package/dist/lib/config.d.ts +39 -0
  36. package/dist/lib/config.d.ts.map +1 -0
  37. package/dist/lib/config.js +170 -0
  38. package/dist/lib/config.js.map +1 -0
  39. package/dist/lib/error-formatter.d.ts +40 -0
  40. package/dist/lib/error-formatter.d.ts.map +1 -0
  41. package/dist/lib/error-formatter.js +149 -0
  42. package/dist/lib/error-formatter.js.map +1 -0
  43. package/dist/lib/errors.d.ts +44 -0
  44. package/dist/lib/errors.d.ts.map +1 -0
  45. package/dist/lib/errors.js +56 -0
  46. package/dist/lib/errors.js.map +1 -0
  47. package/dist/lib/tool-helpers.d.ts +49 -0
  48. package/dist/lib/tool-helpers.d.ts.map +1 -0
  49. package/dist/lib/tool-helpers.js +101 -0
  50. package/dist/lib/tool-helpers.js.map +1 -0
  51. package/dist/lib/tool-registry.d.ts +111 -0
  52. package/dist/lib/tool-registry.d.ts.map +1 -0
  53. package/dist/lib/tool-registry.js +112 -0
  54. package/dist/lib/tool-registry.js.map +1 -0
  55. package/dist/lib/version.d.ts +13 -0
  56. package/dist/lib/version.d.ts.map +1 -0
  57. package/dist/lib/version.js +13 -0
  58. package/dist/lib/version.js.map +1 -0
  59. package/dist/prompts/flow-generator.d.ts +45 -0
  60. package/dist/prompts/flow-generator.d.ts.map +1 -0
  61. package/dist/prompts/flow-generator.js +177 -0
  62. package/dist/prompts/flow-generator.js.map +1 -0
  63. package/dist/prompts/index.d.ts +7 -0
  64. package/dist/prompts/index.d.ts.map +1 -0
  65. package/dist/prompts/index.js +7 -0
  66. package/dist/prompts/index.js.map +1 -0
  67. package/dist/server.d.ts +66 -0
  68. package/dist/server.d.ts.map +1 -0
  69. package/dist/server.js +140 -0
  70. package/dist/server.js.map +1 -0
  71. package/dist/tools/auth/index.d.ts +18 -0
  72. package/dist/tools/auth/index.d.ts.map +1 -0
  73. package/dist/tools/auth/index.js +50 -0
  74. package/dist/tools/auth/index.js.map +1 -0
  75. package/dist/tools/auth/login.d.ts +37 -0
  76. package/dist/tools/auth/login.d.ts.map +1 -0
  77. package/dist/tools/auth/login.js +257 -0
  78. package/dist/tools/auth/login.js.map +1 -0
  79. package/dist/tools/auth/schemas.d.ts +69 -0
  80. package/dist/tools/auth/schemas.d.ts.map +1 -0
  81. package/dist/tools/auth/schemas.js +36 -0
  82. package/dist/tools/auth/schemas.js.map +1 -0
  83. package/dist/tools/auth/status.d.ts +11 -0
  84. package/dist/tools/auth/status.d.ts.map +1 -0
  85. package/dist/tools/auth/status.js +50 -0
  86. package/dist/tools/auth/status.js.map +1 -0
  87. package/dist/tools/contacts/create.d.ts +11 -0
  88. package/dist/tools/contacts/create.d.ts.map +1 -0
  89. package/dist/tools/contacts/create.js +47 -0
  90. package/dist/tools/contacts/create.js.map +1 -0
  91. package/dist/tools/contacts/index.d.ts +10 -0
  92. package/dist/tools/contacts/index.d.ts.map +1 -0
  93. package/dist/tools/contacts/index.js +40 -0
  94. package/dist/tools/contacts/index.js.map +1 -0
  95. package/dist/tools/contacts/schemas.d.ts +37 -0
  96. package/dist/tools/contacts/schemas.d.ts.map +1 -0
  97. package/dist/tools/contacts/schemas.js +15 -0
  98. package/dist/tools/contacts/schemas.js.map +1 -0
  99. package/dist/tools/events/index.d.ts +10 -0
  100. package/dist/tools/events/index.d.ts.map +1 -0
  101. package/dist/tools/events/index.js +42 -0
  102. package/dist/tools/events/index.js.map +1 -0
  103. package/dist/tools/events/schemas.d.ts +37 -0
  104. package/dist/tools/events/schemas.d.ts.map +1 -0
  105. package/dist/tools/events/schemas.js +17 -0
  106. package/dist/tools/events/schemas.js.map +1 -0
  107. package/dist/tools/events/track.d.ts +11 -0
  108. package/dist/tools/events/track.d.ts.map +1 -0
  109. package/dist/tools/events/track.js +41 -0
  110. package/dist/tools/events/track.js.map +1 -0
  111. package/dist/tools/flows/activate.d.ts +11 -0
  112. package/dist/tools/flows/activate.d.ts.map +1 -0
  113. package/dist/tools/flows/activate.js +46 -0
  114. package/dist/tools/flows/activate.js.map +1 -0
  115. package/dist/tools/flows/create.d.ts +11 -0
  116. package/dist/tools/flows/create.d.ts.map +1 -0
  117. package/dist/tools/flows/create.js +72 -0
  118. package/dist/tools/flows/create.js.map +1 -0
  119. package/dist/tools/flows/index.d.ts +24 -0
  120. package/dist/tools/flows/index.d.ts.map +1 -0
  121. package/dist/tools/flows/index.js +183 -0
  122. package/dist/tools/flows/index.js.map +1 -0
  123. package/dist/tools/flows/list.d.ts +11 -0
  124. package/dist/tools/flows/list.d.ts.map +1 -0
  125. package/dist/tools/flows/list.js +34 -0
  126. package/dist/tools/flows/list.js.map +1 -0
  127. package/dist/tools/flows/schemas.d.ts +621 -0
  128. package/dist/tools/flows/schemas.d.ts.map +1 -0
  129. package/dist/tools/flows/schemas.js +135 -0
  130. package/dist/tools/flows/schemas.js.map +1 -0
  131. package/dist/tools/flows/transform.d.ts +39 -0
  132. package/dist/tools/flows/transform.d.ts.map +1 -0
  133. package/dist/tools/flows/transform.js +139 -0
  134. package/dist/tools/flows/transform.js.map +1 -0
  135. package/dist/tools/index.d.ts +34 -0
  136. package/dist/tools/index.d.ts.map +1 -0
  137. package/dist/tools/index.js +46 -0
  138. package/dist/tools/index.js.map +1 -0
  139. package/dist/tools/sdk/index.d.ts +18 -0
  140. package/dist/tools/sdk/index.d.ts.map +1 -0
  141. package/dist/tools/sdk/index.js +69 -0
  142. package/dist/tools/sdk/index.js.map +1 -0
  143. package/dist/tools/sdk/public-key.d.ts +11 -0
  144. package/dist/tools/sdk/public-key.d.ts.map +1 -0
  145. package/dist/tools/sdk/public-key.js +24 -0
  146. package/dist/tools/sdk/public-key.js.map +1 -0
  147. package/dist/tools/sdk/schemas.d.ts +48 -0
  148. package/dist/tools/sdk/schemas.d.ts.map +1 -0
  149. package/dist/tools/sdk/schemas.js +35 -0
  150. package/dist/tools/sdk/schemas.js.map +1 -0
  151. package/dist/tools/sdk/snippet.d.ts +11 -0
  152. package/dist/tools/sdk/snippet.d.ts.map +1 -0
  153. package/dist/tools/sdk/snippet.js +50 -0
  154. package/dist/tools/sdk/snippet.js.map +1 -0
  155. package/dist/tools/sdk/templates/index.d.ts +5 -0
  156. package/dist/tools/sdk/templates/index.d.ts.map +1 -0
  157. package/dist/tools/sdk/templates/index.js +5 -0
  158. package/dist/tools/sdk/templates/index.js.map +1 -0
  159. package/dist/tools/sdk/templates/nextjs.d.ts +5 -0
  160. package/dist/tools/sdk/templates/nextjs.d.ts.map +1 -0
  161. package/dist/tools/sdk/templates/nextjs.js +71 -0
  162. package/dist/tools/sdk/templates/nextjs.js.map +1 -0
  163. package/dist/tools/sdk/templates/node.d.ts +9 -0
  164. package/dist/tools/sdk/templates/node.d.ts.map +1 -0
  165. package/dist/tools/sdk/templates/node.js +170 -0
  166. package/dist/tools/sdk/templates/node.js.map +1 -0
  167. package/dist/tools/sdk/templates/react.d.ts +5 -0
  168. package/dist/tools/sdk/templates/react.d.ts.map +1 -0
  169. package/dist/tools/sdk/templates/react.js +54 -0
  170. package/dist/tools/sdk/templates/react.js.map +1 -0
  171. package/dist/tools/sdk/templates/vanilla.d.ts +5 -0
  172. package/dist/tools/sdk/templates/vanilla.d.ts.map +1 -0
  173. package/dist/tools/sdk/templates/vanilla.js +61 -0
  174. package/dist/tools/sdk/templates/vanilla.js.map +1 -0
  175. package/dist/tools/templates/create.d.ts +11 -0
  176. package/dist/tools/templates/create.d.ts.map +1 -0
  177. package/dist/tools/templates/create.js +39 -0
  178. package/dist/tools/templates/create.js.map +1 -0
  179. package/dist/tools/templates/index.d.ts +17 -0
  180. package/dist/tools/templates/index.d.ts.map +1 -0
  181. package/dist/tools/templates/index.js +68 -0
  182. package/dist/tools/templates/index.js.map +1 -0
  183. package/dist/tools/templates/list.d.ts +11 -0
  184. package/dist/tools/templates/list.d.ts.map +1 -0
  185. package/dist/tools/templates/list.js +31 -0
  186. package/dist/tools/templates/list.js.map +1 -0
  187. package/dist/tools/templates/schemas.d.ts +90 -0
  188. package/dist/tools/templates/schemas.d.ts.map +1 -0
  189. package/dist/tools/templates/schemas.js +37 -0
  190. package/dist/tools/templates/schemas.js.map +1 -0
  191. package/dist/types.d.ts +55 -0
  192. package/dist/types.d.ts.map +1 -0
  193. package/dist/types.js +2 -0
  194. package/dist/types.js.map +1 -0
  195. package/package.json +76 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/tools/sdk/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAE/F;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE;QACtC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,4CAA4C,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;KAC7G,CAAC;CACH,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AA4BpD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAiB;IAC1D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAsB,kBAAkB,EAAE;QACzE,QAAQ,EAAE,QAAQ;KACnB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,IAAI,CAAiB,kBAAkB,EAAE;QAC3E,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,QAAQ;KACnB,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC,IAAI,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ToolHandler } from '../../lib/tool-registry.js';
2
+ /**
3
+ * Creates a get SDK snippet handler.
4
+ * This factory function allows for dependency injection in tests.
5
+ */
6
+ export declare function createGetSdkSnippetHandler(): ToolHandler;
7
+ /**
8
+ * Default get SDK snippet handler
9
+ */
10
+ export declare const getSdkSnippetHandler: ToolHandler;
11
+ //# sourceMappingURL=snippet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snippet.d.ts","sourceRoot":"","sources":["../../../src/tools/sdk/snippet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,4BAA4B,CAAC;AA8B1E;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,WAAW,CAkBxD;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,aAA+B,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { withAuth, textResponse, validationErrorResponse, handleApiError, } from '../../lib/tool-helpers.js';
2
+ import { getSdkSnippetInputSchema, getOrCreatePublicKey } from './schemas.js';
3
+ import { getReactSnippet, getNextJsSnippet, getVanillaSnippet, getNodeSnippet, getExpressSnippet } from './templates/index.js';
4
+ /**
5
+ * Get the snippet for a given framework
6
+ */
7
+ function getSnippetForFramework(framework, publicKey) {
8
+ switch (framework) {
9
+ case 'react':
10
+ return getReactSnippet(publicKey);
11
+ case 'nextjs':
12
+ return getNextJsSnippet(publicKey);
13
+ case 'vanilla':
14
+ return getVanillaSnippet(publicKey);
15
+ case 'node':
16
+ return getNodeSnippet(publicKey);
17
+ case 'express':
18
+ return getExpressSnippet(publicKey);
19
+ default:
20
+ throw new Error(`Unknown framework: ${framework}`);
21
+ }
22
+ }
23
+ /**
24
+ * Creates a get SDK snippet handler.
25
+ * This factory function allows for dependency injection in tests.
26
+ */
27
+ export function createGetSdkSnippetHandler() {
28
+ return async (input) => {
29
+ // Validate input using Zod schema
30
+ const validationResult = getSdkSnippetInputSchema.safeParse(input);
31
+ if (!validationResult.success) {
32
+ return validationErrorResponse(validationResult.error, 'Invalid framework');
33
+ }
34
+ return withAuth('getting SDK snippets', async ({ client }) => {
35
+ try {
36
+ const keyData = await getOrCreatePublicKey(client);
37
+ const snippet = getSnippetForFramework(validationResult.data.framework, keyData.key);
38
+ return textResponse(snippet);
39
+ }
40
+ catch (err) {
41
+ return handleApiError(err, 'get SDK snippet');
42
+ }
43
+ });
44
+ };
45
+ }
46
+ /**
47
+ * Default get SDK snippet handler
48
+ */
49
+ export const getSdkSnippetHandler = createGetSdkSnippetHandler();
50
+ //# sourceMappingURL=snippet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snippet.js","sourceRoot":"","sources":["../../../src/tools/sdk/snippet.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,uBAAuB,EACvB,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAA2B,MAAM,cAAc,CAAC;AACvG,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE/H;;GAEG;AACH,SAAS,sBAAsB,CAAC,SAA6B,EAAE,SAAiB;IAC9E,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;QACpC,KAAK,QAAQ;YACX,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACrC,KAAK,SAAS;YACZ,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACtC,KAAK,MAAM;YACT,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;QACnC,KAAK,SAAS;YACZ,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACtC;YACE,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,KAAK,EAAE,KAA8B,EAAuB,EAAE;QACnE,kCAAkC;QAClC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnE,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;YAC9B,OAAO,uBAAuB,CAAC,gBAAgB,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,QAAQ,CAAC,sBAAsB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAC3D,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAG,sBAAsB,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;gBACrF,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,cAAc,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAChD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { getReactSnippet } from './react.js';
2
+ export { getNextJsSnippet } from './nextjs.js';
3
+ export { getVanillaSnippet } from './vanilla.js';
4
+ export { getNodeSnippet, getExpressSnippet } from './node.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tools/sdk/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { getReactSnippet } from './react.js';
2
+ export { getNextJsSnippet } from './nextjs.js';
3
+ export { getVanillaSnippet } from './vanilla.js';
4
+ export { getNodeSnippet, getExpressSnippet } from './node.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/tools/sdk/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Next.js SDK snippet template
3
+ */
4
+ export declare function getNextJsSnippet(publicKey: string): string;
5
+ //# sourceMappingURL=nextjs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../../../src/tools/sdk/templates/nextjs.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAkE1D"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Next.js SDK snippet template
3
+ */
4
+ export function getNextJsSnippet(publicKey) {
5
+ return `// Install: npm install @kelpi/react
6
+
7
+ // ============================================
8
+ // app/providers.tsx - Create a providers file
9
+ // ============================================
10
+ 'use client';
11
+
12
+ import { KelpiProvider } from '@kelpi/react';
13
+
14
+ export function Providers({ children }: { children: React.ReactNode }) {
15
+ return (
16
+ <KelpiProvider apiKey="${publicKey}">
17
+ {children}
18
+ </KelpiProvider>
19
+ );
20
+ }
21
+
22
+ // ============================================
23
+ // app/layout.tsx - Use the provider in layout
24
+ // ============================================
25
+ import { Providers } from './providers';
26
+
27
+ export default function RootLayout({
28
+ children,
29
+ }: {
30
+ children: React.ReactNode;
31
+ }) {
32
+ return (
33
+ <html lang="en">
34
+ <body>
35
+ <Providers>{children}</Providers>
36
+ </body>
37
+ </html>
38
+ );
39
+ }
40
+
41
+ // ============================================
42
+ // app/components/TrackingExample.tsx - Client component
43
+ // ============================================
44
+ 'use client';
45
+
46
+ import { useKelpi } from '@kelpi/react';
47
+
48
+ export function TrackingExample() {
49
+ const kelpi = useKelpi();
50
+
51
+ // Identify user after authentication
52
+ const handleUserLogin = async (user: { id: string; email: string }) => {
53
+ await kelpi.identify(user.id, {
54
+ email: user.email,
55
+ });
56
+ };
57
+
58
+ // Track page views or events
59
+ const trackPageView = (page: string) => {
60
+ kelpi.track('page_viewed', { page });
61
+ };
62
+
63
+ return (
64
+ <button onClick={() => kelpi.track('button_clicked')}>
65
+ Track Event
66
+ </button>
67
+ );
68
+ }
69
+ `;
70
+ }
71
+ //# sourceMappingURL=nextjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs.js","sourceRoot":"","sources":["../../../../src/tools/sdk/templates/nextjs.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO;;;;;;;;;;;6BAWoB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDrC,CAAC;AACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Node.js SDK snippet template
3
+ */
4
+ export declare function getNodeSnippet(publicKey: string): string;
5
+ /**
6
+ * Express.js SDK snippet template
7
+ */
8
+ export declare function getExpressSnippet(publicKey: string): string;
9
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/tools/sdk/templates/node.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAgExD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAiG3D"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Node.js SDK snippet template
3
+ */
4
+ export function getNodeSnippet(publicKey) {
5
+ return `// Install: npm install @kelpi/sdk
6
+
7
+ import { Kelpi } from '@kelpi/sdk';
8
+ import { createMemoryStorage } from '@kelpi/sdk/storage';
9
+
10
+ // 1. Create and initialize the SDK for server-side use
11
+ const kelpi = new Kelpi({
12
+ // Use memory storage for server-side (not browser localStorage)
13
+ storage: createMemoryStorage(),
14
+ });
15
+
16
+ kelpi.init({
17
+ apiKey: '${publicKey}',
18
+ // Optional: custom API host
19
+ // apiHost: 'https://api.kelpi.ai',
20
+ });
21
+
22
+ // 2. Identify users from your backend
23
+ async function identifyUser(userId: string, traits: Record<string, unknown>) {
24
+ try {
25
+ const response = await kelpi.identify(userId, traits);
26
+ console.log('User identified:', response.contact_id);
27
+ return response;
28
+ } catch (error) {
29
+ console.error('Failed to identify user:', error);
30
+ throw error;
31
+ }
32
+ }
33
+
34
+ // 3. Track server-side events
35
+ function trackServerEvent(eventName: string, properties: Record<string, unknown>) {
36
+ kelpi.track(eventName, properties);
37
+ }
38
+
39
+ // 4. Flush events before process exit
40
+ async function shutdown() {
41
+ await kelpi.flush();
42
+ process.exit(0);
43
+ }
44
+
45
+ process.on('SIGTERM', shutdown);
46
+ process.on('SIGINT', shutdown);
47
+
48
+ // Example usage in an API endpoint
49
+ async function handlePurchase(userId: string, orderData: { orderId: string; amount: number }) {
50
+ // Identify/update user
51
+ await identifyUser(userId, {
52
+ lastPurchaseAt: new Date().toISOString(),
53
+ });
54
+
55
+ // Track the purchase event
56
+ trackServerEvent('purchase_completed', {
57
+ order_id: orderData.orderId,
58
+ amount: orderData.amount,
59
+ currency: 'USD',
60
+ });
61
+
62
+ // Flush immediately for important events
63
+ await kelpi.flush();
64
+ }
65
+
66
+ export { kelpi, identifyUser, trackServerEvent };
67
+ `;
68
+ }
69
+ /**
70
+ * Express.js SDK snippet template
71
+ */
72
+ export function getExpressSnippet(publicKey) {
73
+ return `// Install: npm install @kelpi/sdk express
74
+
75
+ import express from 'express';
76
+ import { Kelpi } from '@kelpi/sdk';
77
+ import { createMemoryStorage } from '@kelpi/sdk/storage';
78
+
79
+ const app = express();
80
+ app.use(express.json());
81
+
82
+ // 1. Initialize Kelpi SDK
83
+ const kelpi = new Kelpi({
84
+ storage: createMemoryStorage(),
85
+ });
86
+
87
+ kelpi.init({
88
+ apiKey: '${publicKey}',
89
+ });
90
+
91
+ // 2. Middleware to track requests (optional)
92
+ app.use((req, res, next) => {
93
+ const userId = req.headers['x-user-id'] as string;
94
+ if (userId) {
95
+ kelpi.track('api_request', {
96
+ method: req.method,
97
+ path: req.path,
98
+ userId,
99
+ });
100
+ }
101
+ next();
102
+ });
103
+
104
+ // 3. Example: Identify user on signup
105
+ app.post('/api/signup', async (req, res) => {
106
+ const { email, name } = req.body;
107
+ const userId = generateUserId(); // Your user ID generation logic
108
+
109
+ try {
110
+ // Identify the new user
111
+ await kelpi.identify(userId, {
112
+ email,
113
+ name,
114
+ signedUpAt: new Date().toISOString(),
115
+ });
116
+
117
+ // Track signup event
118
+ kelpi.track('user_signed_up', {
119
+ method: 'email',
120
+ });
121
+
122
+ await kelpi.flush();
123
+
124
+ res.json({ success: true, userId });
125
+ } catch (error) {
126
+ res.status(500).json({ error: 'Signup failed' });
127
+ }
128
+ });
129
+
130
+ // 4. Example: Track purchase
131
+ app.post('/api/purchase', async (req, res) => {
132
+ const { userId, orderId, amount } = req.body;
133
+
134
+ // Identify to update traits
135
+ await kelpi.identify(userId, {
136
+ lastPurchaseAt: new Date().toISOString(),
137
+ });
138
+
139
+ // Track purchase
140
+ kelpi.track('purchase_completed', {
141
+ order_id: orderId,
142
+ amount,
143
+ currency: 'USD',
144
+ });
145
+
146
+ await kelpi.flush();
147
+
148
+ res.json({ success: true });
149
+ });
150
+
151
+ // 5. Graceful shutdown
152
+ const shutdown = async () => {
153
+ await kelpi.flush();
154
+ process.exit(0);
155
+ };
156
+
157
+ process.on('SIGTERM', shutdown);
158
+ process.on('SIGINT', shutdown);
159
+
160
+ const PORT = process.env.PORT || 3000;
161
+ app.listen(PORT, () => {
162
+ console.log(\`Server running on port \${PORT}\`);
163
+ });
164
+
165
+ function generateUserId(): string {
166
+ return 'user_' + Math.random().toString(36).substr(2, 9);
167
+ }
168
+ `;
169
+ }
170
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../../src/tools/sdk/templates/node.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO;;;;;;;;;;;;aAYI,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDrB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,OAAO;;;;;;;;;;;;;;;aAeI,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgFrB,CAAC;AACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * React SDK snippet template
3
+ */
4
+ export declare function getReactSnippet(publicKey: string): string;
5
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../../src/tools/sdk/templates/react.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAiDzD"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * React SDK snippet template
3
+ */
4
+ export function getReactSnippet(publicKey) {
5
+ return `// Install: npm install @kelpi/react
6
+
7
+ import { KelpiProvider, useKelpi } from '@kelpi/react';
8
+
9
+ // 1. Wrap your app with KelpiProvider
10
+ function App() {
11
+ return (
12
+ <KelpiProvider apiKey="${publicKey}">
13
+ <YourApp />
14
+ </KelpiProvider>
15
+ );
16
+ }
17
+
18
+ // 2. Use the useKelpi hook in your components
19
+ function MyComponent() {
20
+ const kelpi = useKelpi();
21
+
22
+ // Identify a user (call this after login)
23
+ const handleLogin = async (userId: string, email: string) => {
24
+ await kelpi.identify(userId, {
25
+ email,
26
+ firstName: 'John',
27
+ lastName: 'Doe',
28
+ });
29
+ };
30
+
31
+ // Track events
32
+ const handleButtonClick = () => {
33
+ kelpi.track('button_clicked', {
34
+ button_id: 'signup',
35
+ page: '/home',
36
+ });
37
+ };
38
+
39
+ // Reset on logout
40
+ const handleLogout = () => {
41
+ kelpi.reset();
42
+ };
43
+
44
+ return (
45
+ <div>
46
+ <button onClick={handleButtonClick}>Click me</button>
47
+ </div>
48
+ );
49
+ }
50
+
51
+ export default App;
52
+ `;
53
+ }
54
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../../../src/tools/sdk/templates/react.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,OAAO;;;;;;;6BAOoB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCrC,CAAC;AACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Vanilla JavaScript SDK snippet template
3
+ */
4
+ export declare function getVanillaSnippet(publicKey: string): string;
5
+ //# sourceMappingURL=vanilla.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vanilla.d.ts","sourceRoot":"","sources":["../../../../src/tools/sdk/templates/vanilla.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAwD3D"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Vanilla JavaScript SDK snippet template
3
+ */
4
+ export function getVanillaSnippet(publicKey) {
5
+ return `// Install: npm install @kelpi/sdk
6
+ // Or use CDN: <script src="https://cdn.kelpi.ai/sdk.min.js"></script>
7
+
8
+ import { Kelpi } from '@kelpi/sdk';
9
+
10
+ // 1. Create and initialize the SDK
11
+ const kelpi = new Kelpi();
12
+
13
+ kelpi.init({
14
+ apiKey: '${publicKey}',
15
+ // Optional: custom API host (defaults to https://api.kelpi.ai)
16
+ // apiHost: 'https://api.kelpi.ai',
17
+ // Optional: enable debug mode
18
+ // debug: true,
19
+ });
20
+
21
+ // 2. Identify a user (call after login)
22
+ async function onUserLogin(userId, email) {
23
+ try {
24
+ await kelpi.identify(userId, {
25
+ email: email,
26
+ // Add any other traits
27
+ firstName: 'John',
28
+ plan: 'premium',
29
+ });
30
+ console.log('User identified successfully');
31
+ } catch (error) {
32
+ console.error('Failed to identify user:', error);
33
+ }
34
+ }
35
+
36
+ // 3. Track events
37
+ function trackEvent(eventName, properties) {
38
+ kelpi.track(eventName, properties);
39
+ // Events are queued and sent in batches
40
+ }
41
+
42
+ // Example: Track a button click
43
+ document.getElementById('signup-btn').addEventListener('click', () => {
44
+ trackEvent('signup_clicked', {
45
+ button_location: 'header',
46
+ page: window.location.pathname,
47
+ });
48
+ });
49
+
50
+ // 4. Flush events immediately (optional)
51
+ async function sendEventsNow() {
52
+ await kelpi.flush();
53
+ }
54
+
55
+ // 5. Reset on logout
56
+ function onUserLogout() {
57
+ kelpi.reset();
58
+ }
59
+ `;
60
+ }
61
+ //# sourceMappingURL=vanilla.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vanilla.js","sourceRoot":"","sources":["../../../../src/tools/sdk/templates/vanilla.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,OAAO;;;;;;;;;aASI,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CrB,CAAC;AACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ToolHandler } from '../../lib/tool-registry.js';
2
+ /**
3
+ * Creates a create template handler.
4
+ * This factory function allows for dependency injection in tests.
5
+ */
6
+ export declare function createCreateTemplateHandler(): ToolHandler;
7
+ /**
8
+ * Default create template handler
9
+ */
10
+ export declare const createTemplateHandler: ToolHandler;
11
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/tools/templates/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,4BAA4B,CAAC;AAW1E;;;GAGG;AACH,wBAAgB,2BAA2B,IAAI,WAAW,CA2BzD;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,aAAgC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { ApiError } from '../../lib/api-client.js';
2
+ import { withAuth, successResponse, validationErrorResponse, errorResponse, unknownErrorResponse, } from '../../lib/tool-helpers.js';
3
+ import { createTemplateInputSchema } from './schemas.js';
4
+ /**
5
+ * Creates a create template handler.
6
+ * This factory function allows for dependency injection in tests.
7
+ */
8
+ export function createCreateTemplateHandler() {
9
+ return async (input) => {
10
+ // Validate input using Zod schema
11
+ const validationResult = createTemplateInputSchema.safeParse(input);
12
+ if (!validationResult.success) {
13
+ return validationErrorResponse(validationResult.error, 'Invalid template data');
14
+ }
15
+ return withAuth('creating templates', async ({ client }) => {
16
+ try {
17
+ const response = await client.post('/api/v1/templates', validationResult.data);
18
+ return successResponse(response.data);
19
+ }
20
+ catch (err) {
21
+ if (err instanceof ApiError) {
22
+ const message = err.status === 409
23
+ ? `Template with slug "${input.slug}" already exists`
24
+ : err.message;
25
+ return errorResponse('Failed to create template', message, {
26
+ status: err.status,
27
+ ...(err.validationErrors && { validation_errors: err.validationErrors }),
28
+ });
29
+ }
30
+ return unknownErrorResponse(err, 'create template');
31
+ }
32
+ });
33
+ };
34
+ }
35
+ /**
36
+ * Default create template handler
37
+ */
38
+ export const createTemplateHandler = createCreateTemplateHandler();
39
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/tools/templates/create.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EACL,QAAQ,EACR,eAAe,EACf,uBAAuB,EACvB,aAAa,EACb,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,yBAAyB,EAAyB,MAAM,cAAc,CAAC;AAEhF;;;GAGG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO,KAAK,EAAE,KAA8B,EAAuB,EAAE;QACnE,kCAAkC;QAClC,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACpE,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;YAC9B,OAAO,uBAAuB,CAAC,gBAAgB,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;QAClF,CAAC;QAED,OAAO,QAAQ,CAAC,oBAAoB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACzD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAmB,mBAAmB,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBACjG,OAAO,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;oBAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,KAAK,GAAG;wBAChC,CAAC,CAAC,uBAAuB,KAAK,CAAC,IAAI,kBAAkB;wBACrD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;oBAEhB,OAAO,aAAa,CAAC,2BAA2B,EAAE,OAAO,EAAE;wBACzD,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,GAAG,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,iBAAiB,EAAE,GAAG,CAAC,gBAAgB,EAAE,CAAC;qBACzE,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ToolWithHandler } from '../../lib/tool-registry.js';
2
+ /**
3
+ * kelpi_create_template tool definition and handler
4
+ *
5
+ * Creates a new email template with variables support.
6
+ */
7
+ export declare const kelpiCreateTemplate: ToolWithHandler;
8
+ /**
9
+ * kelpi_list_templates tool definition and handler
10
+ *
11
+ * Lists all templates in the workspace.
12
+ */
13
+ export declare const kelpiListTemplates: ToolWithHandler;
14
+ export * from './schemas.js';
15
+ export { createCreateTemplateHandler } from './create.js';
16
+ export { createListTemplatesHandler } from './list.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAKlE;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,eA8BjC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,eAiBhC,CAAC;AAGF,cAAc,cAAc,CAAC;AAG7B,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC"}