0pflow 0.1.0-dev.b4bf1ab → 0.1.0-dev.b8b505d

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 (239) hide show
  1. package/dist/__tests__/discover.integration.test.d.ts +2 -0
  2. package/dist/__tests__/discover.integration.test.d.ts.map +1 -0
  3. package/dist/__tests__/discover.integration.test.js +137 -0
  4. package/dist/__tests__/discover.integration.test.js.map +1 -0
  5. package/dist/__tests__/factory.test.js +7 -0
  6. package/dist/__tests__/factory.test.js.map +1 -1
  7. package/dist/__tests__/integration.e2e.test.js +2 -1
  8. package/dist/__tests__/integration.e2e.test.js.map +1 -1
  9. package/dist/__tests__/integration.test.js +87 -82
  10. package/dist/__tests__/integration.test.js.map +1 -1
  11. package/dist/agent.d.ts +7 -0
  12. package/dist/agent.d.ts.map +1 -1
  13. package/dist/agent.js +59 -9
  14. package/dist/agent.js.map +1 -1
  15. package/dist/cli/__tests__/discovery.test.js +1 -1
  16. package/dist/cli/__tests__/discovery.test.js.map +1 -1
  17. package/dist/cli/app.d.ts +6 -0
  18. package/dist/cli/app.d.ts.map +1 -1
  19. package/dist/cli/app.js +27 -0
  20. package/dist/cli/app.js.map +1 -1
  21. package/dist/cli/discovery.d.ts +10 -0
  22. package/dist/cli/discovery.d.ts.map +1 -1
  23. package/dist/cli/discovery.js +42 -0
  24. package/dist/cli/discovery.js.map +1 -1
  25. package/dist/cli/env.js +1 -1
  26. package/dist/cli/env.js.map +1 -1
  27. package/dist/cli/index.d.ts.map +1 -1
  28. package/dist/cli/index.js +120 -24
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/cli/mcp/config.d.ts +0 -1
  31. package/dist/cli/mcp/config.d.ts.map +1 -1
  32. package/dist/cli/mcp/config.js +2 -4
  33. package/dist/cli/mcp/config.js.map +1 -1
  34. package/dist/cli/mcp/lib/scaffolding.d.ts +33 -0
  35. package/dist/cli/mcp/lib/scaffolding.d.ts.map +1 -0
  36. package/dist/cli/mcp/lib/scaffolding.js +254 -0
  37. package/dist/cli/mcp/lib/scaffolding.js.map +1 -0
  38. package/dist/cli/mcp/lib/templates.d.ts +1 -0
  39. package/dist/cli/mcp/lib/templates.d.ts.map +1 -1
  40. package/dist/cli/mcp/lib/templates.js.map +1 -1
  41. package/dist/cli/mcp/tools/createApp.d.ts +1 -0
  42. package/dist/cli/mcp/tools/createApp.d.ts.map +1 -1
  43. package/dist/cli/mcp/tools/createApp.js +12 -55
  44. package/dist/cli/mcp/tools/createApp.js.map +1 -1
  45. package/dist/cli/mcp/tools/createDatabase.d.ts.map +1 -1
  46. package/dist/cli/mcp/tools/createDatabase.js +2 -41
  47. package/dist/cli/mcp/tools/createDatabase.js.map +1 -1
  48. package/dist/cli/mcp/tools/getConnectionInfo.d.ts +19 -0
  49. package/dist/cli/mcp/tools/getConnectionInfo.d.ts.map +1 -0
  50. package/dist/cli/mcp/tools/getConnectionInfo.js +111 -0
  51. package/dist/cli/mcp/tools/getConnectionInfo.js.map +1 -0
  52. package/dist/cli/mcp/tools/getRun.d.ts +22 -0
  53. package/dist/cli/mcp/tools/getRun.d.ts.map +1 -0
  54. package/dist/cli/mcp/tools/getRun.js +80 -0
  55. package/dist/cli/mcp/tools/getRun.js.map +1 -0
  56. package/dist/cli/mcp/tools/getTrace.d.ts +32 -0
  57. package/dist/cli/mcp/tools/getTrace.d.ts.map +1 -0
  58. package/dist/cli/mcp/tools/getTrace.js +104 -0
  59. package/dist/cli/mcp/tools/getTrace.js.map +1 -0
  60. package/dist/cli/mcp/tools/index.d.ts +94 -1
  61. package/dist/cli/mcp/tools/index.d.ts.map +1 -1
  62. package/dist/cli/mcp/tools/index.js +16 -0
  63. package/dist/cli/mcp/tools/index.js.map +1 -1
  64. package/dist/cli/mcp/tools/listIntegrations.d.ts +14 -0
  65. package/dist/cli/mcp/tools/listIntegrations.d.ts.map +1 -0
  66. package/dist/cli/mcp/tools/listIntegrations.js +53 -0
  67. package/dist/cli/mcp/tools/listIntegrations.js.map +1 -0
  68. package/dist/cli/mcp/tools/listRuns.d.ts +21 -0
  69. package/dist/cli/mcp/tools/listRuns.d.ts.map +1 -0
  70. package/dist/cli/mcp/tools/listRuns.js +72 -0
  71. package/dist/cli/mcp/tools/listRuns.js.map +1 -0
  72. package/dist/cli/mcp/tools/listWorkflows.d.ts +15 -0
  73. package/dist/cli/mcp/tools/listWorkflows.d.ts.map +1 -0
  74. package/dist/cli/mcp/tools/listWorkflows.js +45 -0
  75. package/dist/cli/mcp/tools/listWorkflows.js.map +1 -0
  76. package/dist/cli/mcp/tools/runNode.d.ts +17 -0
  77. package/dist/cli/mcp/tools/runNode.d.ts.map +1 -0
  78. package/dist/cli/mcp/tools/runNode.js +74 -0
  79. package/dist/cli/mcp/tools/runNode.js.map +1 -0
  80. package/dist/cli/mcp/tools/runWorkflow.d.ts +16 -0
  81. package/dist/cli/mcp/tools/runWorkflow.d.ts.map +1 -0
  82. package/dist/cli/mcp/tools/runWorkflow.js +66 -0
  83. package/dist/cli/mcp/tools/runWorkflow.js.map +1 -0
  84. package/dist/cli/mcp/tools/setupAppSchema.d.ts +1 -1
  85. package/dist/cli/mcp/tools/setupAppSchema.d.ts.map +1 -1
  86. package/dist/cli/mcp/tools/setupAppSchema.js +11 -129
  87. package/dist/cli/mcp/tools/setupAppSchema.js.map +1 -1
  88. package/dist/cli/mcp/tools/utils.d.ts +7 -0
  89. package/dist/cli/mcp/tools/utils.d.ts.map +1 -0
  90. package/dist/cli/mcp/tools/utils.js +28 -0
  91. package/dist/cli/mcp/tools/utils.js.map +1 -0
  92. package/dist/cli/run.d.ts +2 -0
  93. package/dist/cli/run.d.ts.map +1 -0
  94. package/dist/cli/run.js +391 -0
  95. package/dist/cli/run.js.map +1 -0
  96. package/dist/cli/trace.d.ts +5 -0
  97. package/dist/cli/trace.d.ts.map +1 -1
  98. package/dist/cli/trace.js +1 -1
  99. package/dist/cli/trace.js.map +1 -1
  100. package/dist/connections/cloud-auth.d.ts +46 -0
  101. package/dist/connections/cloud-auth.d.ts.map +1 -0
  102. package/dist/connections/cloud-auth.js +243 -0
  103. package/dist/connections/cloud-auth.js.map +1 -0
  104. package/dist/connections/cloud-client.d.ts +25 -0
  105. package/dist/connections/cloud-client.d.ts.map +1 -0
  106. package/dist/connections/cloud-client.js +59 -0
  107. package/dist/connections/cloud-client.js.map +1 -0
  108. package/dist/connections/cloud-integration-provider.d.ts +21 -0
  109. package/dist/connections/cloud-integration-provider.d.ts.map +1 -0
  110. package/dist/connections/cloud-integration-provider.js +26 -0
  111. package/dist/connections/cloud-integration-provider.js.map +1 -0
  112. package/dist/connections/index.d.ts +11 -0
  113. package/dist/connections/index.d.ts.map +1 -0
  114. package/dist/connections/index.js +9 -0
  115. package/dist/connections/index.js.map +1 -0
  116. package/dist/connections/integration-provider.d.ts +38 -0
  117. package/dist/connections/integration-provider.d.ts.map +1 -0
  118. package/dist/connections/integration-provider.js +20 -0
  119. package/dist/connections/integration-provider.js.map +1 -0
  120. package/dist/connections/local-integration-provider.d.ts +28 -0
  121. package/dist/connections/local-integration-provider.d.ts.map +1 -0
  122. package/dist/connections/local-integration-provider.js +54 -0
  123. package/dist/connections/local-integration-provider.js.map +1 -0
  124. package/dist/connections/nango-client.d.ts +14 -0
  125. package/dist/connections/nango-client.d.ts.map +1 -0
  126. package/dist/connections/nango-client.js +50 -0
  127. package/dist/connections/nango-client.js.map +1 -0
  128. package/dist/connections/resolver.d.ts +26 -0
  129. package/dist/connections/resolver.d.ts.map +1 -0
  130. package/dist/connections/resolver.js +48 -0
  131. package/dist/connections/resolver.js.map +1 -0
  132. package/dist/connections/schema.d.ts +8 -0
  133. package/dist/connections/schema.d.ts.map +1 -0
  134. package/dist/connections/schema.js +31 -0
  135. package/dist/connections/schema.js.map +1 -0
  136. package/dist/context.d.ts.map +1 -1
  137. package/dist/context.js +4 -0
  138. package/dist/context.js.map +1 -1
  139. package/dist/dev-ui/api.d.ts +16 -0
  140. package/dist/dev-ui/api.d.ts.map +1 -0
  141. package/dist/dev-ui/api.js +237 -0
  142. package/dist/dev-ui/api.js.map +1 -0
  143. package/dist/dev-ui/dag/extractor.d.ts +19 -0
  144. package/dist/dev-ui/dag/extractor.d.ts.map +1 -0
  145. package/dist/dev-ui/dag/extractor.js +716 -0
  146. package/dist/dev-ui/dag/extractor.js.map +1 -0
  147. package/dist/dev-ui/dag/types.d.ts +42 -0
  148. package/dist/dev-ui/dag/types.d.ts.map +1 -0
  149. package/dist/dev-ui/dag/types.js +2 -0
  150. package/dist/dev-ui/dag/types.js.map +1 -0
  151. package/dist/dev-ui/dev-server.d.ts +18 -0
  152. package/dist/dev-ui/dev-server.d.ts.map +1 -0
  153. package/dist/dev-ui/dev-server.js +222 -0
  154. package/dist/dev-ui/dev-server.js.map +1 -0
  155. package/dist/dev-ui/index.d.ts +3 -0
  156. package/dist/dev-ui/index.d.ts.map +1 -0
  157. package/dist/dev-ui/index.js +2 -0
  158. package/dist/dev-ui/index.js.map +1 -0
  159. package/dist/dev-ui/pty.d.ts +16 -0
  160. package/dist/dev-ui/pty.d.ts.map +1 -0
  161. package/dist/dev-ui/pty.js +87 -0
  162. package/dist/dev-ui/pty.js.map +1 -0
  163. package/dist/dev-ui/watcher.d.ts +12 -0
  164. package/dist/dev-ui/watcher.d.ts.map +1 -0
  165. package/dist/dev-ui/watcher.js +162 -0
  166. package/dist/dev-ui/watcher.js.map +1 -0
  167. package/dist/dev-ui/ws.d.ts +52 -0
  168. package/dist/dev-ui/ws.d.ts.map +1 -0
  169. package/dist/dev-ui/ws.js +32 -0
  170. package/dist/dev-ui/ws.js.map +1 -0
  171. package/dist/dev-ui-client/assets/index-C-LxzUII.css +32 -0
  172. package/dist/dev-ui-client/assets/index-DAKTQEvj.js +1 -0
  173. package/dist/dev-ui-client/assets/index-aAIwXl4O.js +127 -0
  174. package/dist/dev-ui-client/index.html +13 -0
  175. package/dist/discover.d.ts +15 -0
  176. package/dist/discover.d.ts.map +1 -0
  177. package/dist/discover.js +29 -0
  178. package/dist/discover.js.map +1 -0
  179. package/dist/factory.d.ts.map +1 -1
  180. package/dist/factory.js +25 -12
  181. package/dist/factory.js.map +1 -1
  182. package/dist/index.d.ts +5 -1
  183. package/dist/index.d.ts.map +1 -1
  184. package/dist/index.js +4 -0
  185. package/dist/index.js.map +1 -1
  186. package/dist/node.d.ts +1 -0
  187. package/dist/node.d.ts.map +1 -1
  188. package/dist/node.js +1 -0
  189. package/dist/node.js.map +1 -1
  190. package/dist/nodes/agent/executor.d.ts +2 -0
  191. package/dist/nodes/agent/executor.d.ts.map +1 -1
  192. package/dist/nodes/agent/executor.js +11 -1
  193. package/dist/nodes/agent/executor.js.map +1 -1
  194. package/dist/types.d.ts +21 -3
  195. package/dist/types.d.ts.map +1 -1
  196. package/dist/version.d.ts +6 -0
  197. package/dist/version.d.ts.map +1 -0
  198. package/dist/version.js +7 -0
  199. package/dist/version.js.map +1 -0
  200. package/dist/workflow.d.ts +22 -0
  201. package/dist/workflow.d.ts.map +1 -1
  202. package/dist/workflow.js +97 -2
  203. package/dist/workflow.js.map +1 -1
  204. package/package.json +28 -6
  205. package/templates/app/.env.example +13 -0
  206. package/templates/app/README.md +29 -0
  207. package/templates/app/biome.jsonc +81 -0
  208. package/templates/app/dbos-config.yaml +6 -0
  209. package/templates/app/drizzle.config.ts +12 -0
  210. package/templates/app/next.config.js +10 -0
  211. package/templates/app/package.json +55 -0
  212. package/templates/app/postcss.config.js +5 -0
  213. package/templates/app/public/favicon.ico +0 -0
  214. package/templates/app/src/app/_components/.gitkeep +0 -0
  215. package/templates/app/src/app/api/trpc/[trpc]/route.ts +34 -0
  216. package/templates/app/src/app/api/workflow/[name]/route.ts +37 -0
  217. package/templates/app/src/app/layout.tsx +29 -0
  218. package/templates/app/src/app/page.tsx +18 -0
  219. package/templates/app/src/env.js +46 -0
  220. package/templates/app/src/instrumentation.ts +6 -0
  221. package/templates/app/src/lib/pflow.ts +29 -0
  222. package/templates/app/src/server/api/root.ts +21 -0
  223. package/templates/app/src/server/api/routers/.gitkeep +0 -0
  224. package/templates/app/src/server/api/trpc.ts +106 -0
  225. package/templates/app/src/server/db/index.ts +18 -0
  226. package/templates/app/src/server/db/schema.ts +14 -0
  227. package/templates/app/src/styles/globals.css +6 -0
  228. package/templates/app/src/styles/globals.css.orange +126 -0
  229. package/templates/app/src/trpc/query-client.ts +25 -0
  230. package/templates/app/src/trpc/react.tsx +78 -0
  231. package/templates/app/src/trpc/server.ts +30 -0
  232. package/templates/app/tsconfig.check.json +23 -0
  233. package/templates/app/tsconfig.json +42 -0
  234. package/templates/app/tsconfig.server.json +5 -0
  235. package/templates/app/tsconfig.test.json +21 -0
  236. package/dist/cli/install.d.ts +0 -63
  237. package/dist/cli/install.d.ts.map +0 -1
  238. package/dist/cli/install.js +0 -239
  239. package/dist/cli/install.js.map +0 -1
@@ -0,0 +1,14 @@
1
+ import { pgSchema } from "drizzle-orm/pg-core";
2
+ import { env } from "~/env";
3
+
4
+ /**
5
+ * Use a dedicated PostgreSQL schema for this app's tables.
6
+ * @see https://orm.drizzle.team/docs/schemas
7
+ */
8
+ export const schema = pgSchema(env.DATABASE_SCHEMA);
9
+
10
+ /**
11
+ * Helper to create tables in the app's schema.
12
+ * Always use this instead of pgTable to ensure tables are in the correct schema.
13
+ */
14
+ const createTable = schema.table;
@@ -0,0 +1,6 @@
1
+ @import "tailwindcss";
2
+
3
+ @theme {
4
+ --font-sans: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif,
5
+ "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
6
+ }
@@ -0,0 +1,126 @@
1
+ @import "tailwindcss";
2
+ @import "tw-animate-css";
3
+
4
+ @custom-variant dark (&:is(.dark *));
5
+
6
+ @theme {
7
+ --font-sans: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif,
8
+ "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
9
+ }
10
+
11
+ @theme inline {
12
+ --radius-sm: calc(var(--radius) - 4px);
13
+ --radius-md: calc(var(--radius) - 2px);
14
+ --radius-lg: var(--radius);
15
+ --radius-xl: calc(var(--radius) + 4px);
16
+ --color-background: var(--background);
17
+ --color-foreground: var(--foreground);
18
+ --color-card: var(--card);
19
+ --color-card-foreground: var(--card-foreground);
20
+ --color-popover: var(--popover);
21
+ --color-popover-foreground: var(--popover-foreground);
22
+ --color-primary: var(--primary);
23
+ --color-primary-foreground: var(--primary-foreground);
24
+ --color-secondary: var(--secondary);
25
+ --color-secondary-foreground: var(--secondary-foreground);
26
+ --color-muted: var(--muted);
27
+ --color-muted-foreground: var(--muted-foreground);
28
+ --color-accent: var(--accent);
29
+ --color-accent-foreground: var(--accent-foreground);
30
+ --color-destructive: var(--destructive);
31
+ --color-border: var(--border);
32
+ --color-input: var(--input);
33
+ --color-ring: var(--ring);
34
+ --color-chart-1: var(--chart-1);
35
+ --color-chart-2: var(--chart-2);
36
+ --color-chart-3: var(--chart-3);
37
+ --color-chart-4: var(--chart-4);
38
+ --color-chart-5: var(--chart-5);
39
+ --color-sidebar: var(--sidebar);
40
+ --color-sidebar-foreground: var(--sidebar-foreground);
41
+ --color-sidebar-primary: var(--sidebar-primary);
42
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
43
+ --color-sidebar-accent: var(--sidebar-accent);
44
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
45
+ --color-sidebar-border: var(--sidebar-border);
46
+ --color-sidebar-ring: var(--sidebar-ring);
47
+ }
48
+
49
+ :root {
50
+ --radius: 0.65rem;
51
+ --background: oklch(1 0 0);
52
+ --foreground: oklch(0.141 0.005 285.823);
53
+ --card: oklch(1 0 0);
54
+ --card-foreground: oklch(0.141 0.005 285.823);
55
+ --popover: oklch(1 0 0);
56
+ --popover-foreground: oklch(0.141 0.005 285.823);
57
+ --primary: oklch(0.646 0.222 41.116);
58
+ --primary-foreground: oklch(0.98 0.016 73.684);
59
+ --secondary: oklch(0.967 0.001 286.375);
60
+ --secondary-foreground: oklch(0.21 0.006 285.885);
61
+ --muted: oklch(0.967 0.001 286.375);
62
+ --muted-foreground: oklch(0.552 0.016 285.938);
63
+ --accent: oklch(0.967 0.001 286.375);
64
+ --accent-foreground: oklch(0.21 0.006 285.885);
65
+ --destructive: oklch(0.577 0.245 27.325);
66
+ --border: oklch(0.92 0.004 286.32);
67
+ --input: oklch(0.92 0.004 286.32);
68
+ --ring: oklch(0.75 0.183 55.934);
69
+ --chart-1: oklch(0.837 0.128 66.29);
70
+ --chart-2: oklch(0.705 0.213 47.604);
71
+ --chart-3: oklch(0.646 0.222 41.116);
72
+ --chart-4: oklch(0.553 0.195 38.402);
73
+ --chart-5: oklch(0.47 0.157 37.304);
74
+ --sidebar: oklch(0.985 0 0);
75
+ --sidebar-foreground: oklch(0.141 0.005 285.823);
76
+ --sidebar-primary: oklch(0.646 0.222 41.116);
77
+ --sidebar-primary-foreground: oklch(0.98 0.016 73.684);
78
+ --sidebar-accent: oklch(0.967 0.001 286.375);
79
+ --sidebar-accent-foreground: oklch(0.21 0.006 285.885);
80
+ --sidebar-border: oklch(0.92 0.004 286.32);
81
+ --sidebar-ring: oklch(0.75 0.183 55.934);
82
+ }
83
+
84
+ .dark {
85
+ --background: oklch(0.141 0.005 285.823);
86
+ --foreground: oklch(0.985 0 0);
87
+ --card: oklch(0.21 0.006 285.885);
88
+ --card-foreground: oklch(0.985 0 0);
89
+ --popover: oklch(0.21 0.006 285.885);
90
+ --popover-foreground: oklch(0.985 0 0);
91
+ --primary: oklch(0.705 0.213 47.604);
92
+ --primary-foreground: oklch(0.98 0.016 73.684);
93
+ --secondary: oklch(0.274 0.006 286.033);
94
+ --secondary-foreground: oklch(0.985 0 0);
95
+ --muted: oklch(0.274 0.006 286.033);
96
+ --muted-foreground: oklch(0.705 0.015 286.067);
97
+ --accent: oklch(0.274 0.006 286.033);
98
+ --accent-foreground: oklch(0.985 0 0);
99
+ --destructive: oklch(0.704 0.191 22.216);
100
+ --border: oklch(1 0 0 / 10%);
101
+ --input: oklch(1 0 0 / 15%);
102
+ --ring: oklch(0.408 0.123 38.172);
103
+ --chart-1: oklch(0.837 0.128 66.29);
104
+ --chart-2: oklch(0.705 0.213 47.604);
105
+ --chart-3: oklch(0.646 0.222 41.116);
106
+ --chart-4: oklch(0.553 0.195 38.402);
107
+ --chart-5: oklch(0.47 0.157 37.304);
108
+ --sidebar: oklch(0.21 0.006 285.885);
109
+ --sidebar-foreground: oklch(0.985 0 0);
110
+ --sidebar-primary: oklch(0.705 0.213 47.604);
111
+ --sidebar-primary-foreground: oklch(0.98 0.016 73.684);
112
+ --sidebar-accent: oklch(0.274 0.006 286.033);
113
+ --sidebar-accent-foreground: oklch(0.985 0 0);
114
+ --sidebar-border: oklch(1 0 0 / 10%);
115
+ --sidebar-ring: oklch(0.408 0.123 38.172);
116
+ }
117
+
118
+ @layer base {
119
+ * {
120
+ @apply border-border outline-ring/50;
121
+ }
122
+
123
+ body {
124
+ @apply bg-background text-foreground;
125
+ }
126
+ }
@@ -0,0 +1,25 @@
1
+ import {
2
+ defaultShouldDehydrateQuery,
3
+ QueryClient,
4
+ } from "@tanstack/react-query";
5
+ import SuperJSON from "superjson";
6
+
7
+ export const createQueryClient = () =>
8
+ new QueryClient({
9
+ defaultOptions: {
10
+ queries: {
11
+ // With SSR, we usually want to set some default staleTime
12
+ // above 0 to avoid refetching immediately on the client
13
+ staleTime: 30 * 1000,
14
+ },
15
+ dehydrate: {
16
+ serializeData: SuperJSON.serialize,
17
+ shouldDehydrateQuery: (query) =>
18
+ defaultShouldDehydrateQuery(query) ||
19
+ query.state.status === "pending",
20
+ },
21
+ hydrate: {
22
+ deserializeData: SuperJSON.deserialize,
23
+ },
24
+ },
25
+ });
@@ -0,0 +1,78 @@
1
+ "use client";
2
+
3
+ import { QueryClientProvider, type QueryClient } from "@tanstack/react-query";
4
+ import { httpBatchStreamLink, loggerLink } from "@trpc/client";
5
+ import { createTRPCReact } from "@trpc/react-query";
6
+ import { type inferRouterInputs, type inferRouterOutputs } from "@trpc/server";
7
+ import { useState } from "react";
8
+ import SuperJSON from "superjson";
9
+
10
+ import { type AppRouter } from "~/server/api/root";
11
+ import { createQueryClient } from "./query-client";
12
+
13
+ let clientQueryClientSingleton: QueryClient | undefined = undefined;
14
+ const getQueryClient = () => {
15
+ if (typeof window === "undefined") {
16
+ // Server: always make a new query client
17
+ return createQueryClient();
18
+ }
19
+ // Browser: use singleton pattern to keep the same query client
20
+ clientQueryClientSingleton ??= createQueryClient();
21
+
22
+ return clientQueryClientSingleton;
23
+ };
24
+
25
+ export const api = createTRPCReact<AppRouter>();
26
+
27
+ /**
28
+ * Inference helper for inputs.
29
+ *
30
+ * @example type HelloInput = RouterInputs['example']['hello']
31
+ */
32
+ export type RouterInputs = inferRouterInputs<AppRouter>;
33
+
34
+ /**
35
+ * Inference helper for outputs.
36
+ *
37
+ * @example type HelloOutput = RouterOutputs['example']['hello']
38
+ */
39
+ export type RouterOutputs = inferRouterOutputs<AppRouter>;
40
+
41
+ export function TRPCReactProvider(props: { children: React.ReactNode }) {
42
+ const queryClient = getQueryClient();
43
+
44
+ const [trpcClient] = useState(() =>
45
+ api.createClient({
46
+ links: [
47
+ loggerLink({
48
+ enabled: (op) =>
49
+ process.env.NODE_ENV === "development" ||
50
+ (op.direction === "down" && op.result instanceof Error),
51
+ }),
52
+ httpBatchStreamLink({
53
+ transformer: SuperJSON,
54
+ url: `${getBaseUrl()}/api/trpc`,
55
+ headers: () => {
56
+ const headers = new Headers();
57
+ headers.set("x-trpc-source", "nextjs-react");
58
+ return headers;
59
+ },
60
+ }),
61
+ ],
62
+ })
63
+ );
64
+
65
+ return (
66
+ <QueryClientProvider client={queryClient}>
67
+ <api.Provider client={trpcClient} queryClient={queryClient}>
68
+ {props.children}
69
+ </api.Provider>
70
+ </QueryClientProvider>
71
+ );
72
+ }
73
+
74
+ function getBaseUrl() {
75
+ if (typeof window !== "undefined") return window.location.origin;
76
+ if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`;
77
+ return `http://localhost:${process.env.PORT ?? 3000}`;
78
+ }
@@ -0,0 +1,30 @@
1
+ import "server-only";
2
+
3
+ import { createHydrationHelpers } from "@trpc/react-query/rsc";
4
+ import { headers } from "next/headers";
5
+ import { cache } from "react";
6
+
7
+ import { createCaller, type AppRouter } from "~/server/api/root";
8
+ import { createTRPCContext } from "~/server/api/trpc";
9
+ import { createQueryClient } from "./query-client";
10
+
11
+ /**
12
+ * This wraps the `createTRPCContext` helper and provides the required context for the tRPC API when
13
+ * handling a tRPC call from a React Server Component.
14
+ */
15
+ const createContext = cache(async () => {
16
+ const heads = new Headers(await headers());
17
+ heads.set("x-trpc-source", "rsc");
18
+
19
+ return createTRPCContext({
20
+ headers: heads,
21
+ });
22
+ });
23
+
24
+ const getQueryClient = cache(createQueryClient);
25
+ const caller = createCaller(createContext);
26
+
27
+ export const { trpc: api, HydrateClient } = createHydrationHelpers<AppRouter>(
28
+ caller,
29
+ getQueryClient
30
+ );
@@ -0,0 +1,23 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "noUnusedLocals": true,
5
+ "noUnusedParameters": true,
6
+ "allowUnreachableCode": false,
7
+ "allowUnusedLabels": false
8
+ },
9
+ "exclude": [
10
+ "node_modules",
11
+ ".next",
12
+ "dist",
13
+ "coverage",
14
+ "**/*.test.ts",
15
+ "**/*.test.tsx",
16
+ "**/*.spec.ts",
17
+ "**/*.spec.tsx",
18
+ "src/**/__tests__/**",
19
+ "tests/**",
20
+ "vitest.config.*",
21
+ "vitest.setup.*"
22
+ ]
23
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "compilerOptions": {
3
+ /* Base Options: */
4
+ "esModuleInterop": true,
5
+ "skipLibCheck": true,
6
+ "target": "es2022",
7
+ "allowJs": true,
8
+ "resolveJsonModule": true,
9
+ "moduleDetection": "force",
10
+ "isolatedModules": true,
11
+ "verbatimModuleSyntax": true,
12
+
13
+ /* Strictness */
14
+ "strict": true,
15
+ "noUncheckedIndexedAccess": true,
16
+ "checkJs": true,
17
+
18
+ /* Bundled projects */
19
+ "lib": ["dom", "dom.iterable", "ES2022"],
20
+ "noEmit": true,
21
+ "module": "ESNext",
22
+ "moduleResolution": "Bundler",
23
+ "jsx": "preserve",
24
+ "plugins": [{ "name": "next" }],
25
+ "incremental": true,
26
+
27
+ /* Path Aliases */
28
+ "baseUrl": ".",
29
+ "paths": {
30
+ "~/*": ["./src/*"]
31
+ }
32
+ },
33
+ "include": [
34
+ "next-env.d.ts",
35
+ "**/*.ts",
36
+ "**/*.tsx",
37
+ "**/*.cjs",
38
+ "**/*.js",
39
+ ".next/types/**/*.ts"
40
+ ],
41
+ "exclude": ["node_modules", "generated"]
42
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "include": ["src/server/**/*.ts", "src/env.js"],
4
+ "exclude": ["node_modules"]
5
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "noUnusedLocals": true,
5
+ "noUnusedParameters": true,
6
+ "allowUnreachableCode": false,
7
+ },
8
+ "include": [
9
+ "**/*.test.ts",
10
+ "**/*.test.tsx",
11
+ "**/*.spec.ts",
12
+ "**/*.spec.tsx",
13
+ "src/**/__tests__/*.ts",
14
+ "src/**/__tests__/*.tsx",
15
+ "src/tests/**/*.ts",
16
+ "tests/**/*.ts",
17
+ "tests/**/*.tsx",
18
+ "vitest.config.*",
19
+ "vitest.setup.*"
20
+ ]
21
+ }
@@ -1,63 +0,0 @@
1
- export interface McpCommandResult {
2
- command: string[];
3
- isLocal: boolean;
4
- packageRoot?: string;
5
- }
6
- export interface InstallSettings {
7
- mcpCommand: string[];
8
- installedAt: string;
9
- }
10
- /**
11
- * Build the MCP command by taking the current invocation and replacing "install" with "mcp start"
12
- */
13
- export declare function buildMcpCommand(): McpCommandResult;
14
- /**
15
- * Get the settings directory path
16
- */
17
- export declare function getSettingsDir(): string;
18
- /**
19
- * Get the settings file path
20
- */
21
- export declare function getSettingsPath(): string;
22
- /**
23
- * Read current settings
24
- */
25
- export declare function readSettings(): InstallSettings | null;
26
- /**
27
- * Write settings to disk
28
- */
29
- export declare function writeSettings(settings: InstallSettings): void;
30
- /**
31
- * Check if Claude Code CLI is available
32
- */
33
- export declare function isClaudeCliAvailable(): boolean;
34
- /**
35
- * Add the 0pflow marketplace to Claude Code
36
- */
37
- export declare function addMarketplace(mcpResult: McpCommandResult, stdio?: "inherit" | "ignore"): {
38
- success: boolean;
39
- error?: string;
40
- };
41
- /**
42
- * Install the 0pflow plugin to Claude Code
43
- */
44
- export declare function installPlugin(stdio?: "inherit" | "ignore"): {
45
- success: boolean;
46
- error?: string;
47
- };
48
- export interface InstallOptions {
49
- force?: boolean;
50
- verbose?: boolean;
51
- }
52
- /**
53
- * Run the install command
54
- */
55
- export declare function runInstall(options?: InstallOptions): Promise<void>;
56
- export interface UninstallOptions {
57
- verbose?: boolean;
58
- }
59
- /**
60
- * Run the uninstall command
61
- */
62
- export declare function runUninstall(options?: UninstallOptions): Promise<void>;
63
- //# sourceMappingURL=install.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,gBAAgB,CAoClD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAGvC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,eAAe,GAAG,IAAI,CAUrD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAM7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAO9C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,gBAAgB,EAAE,KAAK,GAAE,SAAS,GAAG,QAAoB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAazI;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,GAAE,SAAS,GAAG,QAAoB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAU3G;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuE5E;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgChF"}
@@ -1,239 +0,0 @@
1
- import { execSync } from "node:child_process";
2
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
- import { dirname, join, resolve } from "node:path";
4
- import pc from "picocolors";
5
- import { getNpmVersionForMcp } from "./index.js";
6
- function printBanner() {
7
- console.log();
8
- console.log(pc.red(" ___ __ _"));
9
- console.log(pc.red(" / _ \\ _ __ / _| | _____ __"));
10
- console.log(pc.red(" | | | | '_ \\ |_| |/ _ \\ \\ /\\ / /"));
11
- console.log(pc.red(" | |_| | |_) | _| | (_) \\ V V /"));
12
- console.log(pc.red(" \\___/| .__/|_| |_|\\___/ \\_/\\_/"));
13
- console.log(pc.red(" |_|"));
14
- console.log();
15
- }
16
- /**
17
- * Build the MCP command by taking the current invocation and replacing "install" with "mcp start"
18
- */
19
- export function buildMcpCommand() {
20
- const args = [...process.argv];
21
- // Find and replace "install" with "mcp", "start"
22
- const installIndex = args.findIndex(arg => arg === "install");
23
- const baseArgs = installIndex !== -1
24
- ? args.slice(0, installIndex)
25
- : args;
26
- const scriptPath = baseArgs[1] || "";
27
- // If we're running a .ts file, tsx hides itself from argv
28
- // so we see "node file.ts" but need "npx tsx file.ts" to actually run it
29
- if (scriptPath.endsWith(".ts")) {
30
- // Script is at packages/core/src/cli/index.ts, repo root is 4 levels up
31
- const packageRoot = resolve(dirname(scriptPath), "../../../..");
32
- return {
33
- command: ["npx", "tsx", scriptPath, "mcp", "start"],
34
- isLocal: true,
35
- packageRoot,
36
- };
37
- }
38
- // If running from npx cache or node_modules, use npx 0pflow@version
39
- if (scriptPath.includes(".npm/_npx") || scriptPath.includes("node_modules/0pflow")) {
40
- const ver = getNpmVersionForMcp();
41
- return {
42
- command: ["npx", "-y", `0pflow@${ver}`, "mcp", "start"],
43
- isLocal: false,
44
- };
45
- }
46
- return {
47
- command: [...baseArgs, "mcp", "start"],
48
- isLocal: false,
49
- };
50
- }
51
- /**
52
- * Get the settings directory path
53
- */
54
- export function getSettingsDir() {
55
- const home = process.env.HOME || process.env.USERPROFILE || "~";
56
- return join(home, ".config", "0pflow");
57
- }
58
- /**
59
- * Get the settings file path
60
- */
61
- export function getSettingsPath() {
62
- return join(getSettingsDir(), "settings.json");
63
- }
64
- /**
65
- * Read current settings
66
- */
67
- export function readSettings() {
68
- const settingsPath = getSettingsPath();
69
- if (!existsSync(settingsPath)) {
70
- return null;
71
- }
72
- try {
73
- return JSON.parse(readFileSync(settingsPath, "utf-8"));
74
- }
75
- catch {
76
- return null;
77
- }
78
- }
79
- /**
80
- * Write settings to disk
81
- */
82
- export function writeSettings(settings) {
83
- const settingsDir = getSettingsDir();
84
- if (!existsSync(settingsDir)) {
85
- mkdirSync(settingsDir, { recursive: true });
86
- }
87
- writeFileSync(getSettingsPath(), JSON.stringify(settings, null, 2) + "\n");
88
- }
89
- /**
90
- * Check if Claude Code CLI is available
91
- */
92
- export function isClaudeCliAvailable() {
93
- try {
94
- execSync("claude --version", { stdio: "ignore" });
95
- return true;
96
- }
97
- catch {
98
- return false;
99
- }
100
- }
101
- /**
102
- * Add the 0pflow marketplace to Claude Code
103
- */
104
- export function addMarketplace(mcpResult, stdio = "inherit") {
105
- try {
106
- const marketplaceSource = mcpResult.isLocal && mcpResult.packageRoot
107
- ? mcpResult.packageRoot
108
- : "timescale/0pflow";
109
- execSync(`claude plugin marketplace add ${marketplaceSource}`, { stdio });
110
- return { success: true };
111
- }
112
- catch (err) {
113
- return {
114
- success: false,
115
- error: err instanceof Error ? err.message : String(err)
116
- };
117
- }
118
- }
119
- /**
120
- * Install the 0pflow plugin to Claude Code
121
- */
122
- export function installPlugin(stdio = "inherit") {
123
- try {
124
- execSync("claude plugin install 0pflow", { stdio });
125
- return { success: true };
126
- }
127
- catch (err) {
128
- return {
129
- success: false,
130
- error: err instanceof Error ? err.message : String(err)
131
- };
132
- }
133
- }
134
- /**
135
- * Run the install command
136
- */
137
- export async function runInstall(options = {}) {
138
- const { verbose = false } = options;
139
- // Check if Claude CLI is available
140
- if (!isClaudeCliAvailable()) {
141
- console.log(pc.red("Error: Claude Code CLI not found."));
142
- console.log(pc.dim("Install Claude Code first: https://claude.ai/code"));
143
- process.exit(1);
144
- }
145
- // Build MCP command from current invocation
146
- const mcpResult = buildMcpCommand();
147
- if (verbose) {
148
- console.log(pc.dim("MCP command:"), mcpResult.command.join(" "));
149
- }
150
- // Check for existing installation
151
- const existingSettings = readSettings();
152
- if (existingSettings && !options.force) {
153
- console.log(pc.yellow("Already installed."), pc.dim("Use --force to reinstall."));
154
- return;
155
- }
156
- if (existingSettings) {
157
- console.log(pc.dim("Existing installation found, reinstalling (--force)..."));
158
- await runUninstall({ verbose });
159
- }
160
- // Write settings
161
- const settings = {
162
- mcpCommand: mcpResult.command,
163
- installedAt: new Date().toISOString(),
164
- };
165
- writeSettings(settings);
166
- // Development mode: just show the command to use
167
- if (mcpResult.isLocal) {
168
- printBanner();
169
- console.log(pc.yellow("Development mode detected"));
170
- console.log();
171
- console.log(pc.bold("To use the plugin, run Claude Code with:"));
172
- console.log();
173
- console.log(pc.cyan(` claude --plugin-dir ${mcpResult.packageRoot}`));
174
- console.log();
175
- return;
176
- }
177
- // Add marketplace (suppress claude CLI output in non-verbose mode)
178
- const stdio = verbose ? "inherit" : "ignore";
179
- const marketplaceResult = addMarketplace(mcpResult, stdio);
180
- const pluginResult = installPlugin(stdio);
181
- if (verbose) {
182
- console.log(marketplaceResult.success ? pc.green("✓ Marketplace added") : pc.yellow("⚠ Marketplace may already exist"));
183
- console.log(pluginResult.success ? pc.green("✓ Plugin installed") : pc.red("✗ Plugin install failed"));
184
- }
185
- if (pluginResult.success) {
186
- printBanner();
187
- console.log(pc.green("✓"), "Installed successfully");
188
- console.log();
189
- console.log(pc.bold("Next steps:"));
190
- console.log(pc.dim(" 1. Restart Claude Code in a new project folder"));
191
- console.log(pc.dim(" 2. Ask Claude to create a workflow, e.g.:"));
192
- console.log(pc.cyan(' "Create a workflow that enriches leads from a CSV file"'));
193
- console.log();
194
- }
195
- else {
196
- console.log(pc.red("✗"), "Installation failed");
197
- process.exit(1);
198
- }
199
- }
200
- /**
201
- * Run the uninstall command
202
- */
203
- export async function runUninstall(options = {}) {
204
- const { verbose = false } = options;
205
- const stdio = verbose ? "inherit" : "ignore";
206
- // Uninstall plugin and marketplace from Claude
207
- if (isClaudeCliAvailable()) {
208
- try {
209
- execSync("claude plugin uninstall 0pflow", { stdio });
210
- if (verbose)
211
- console.log(pc.green("✓"), "Plugin uninstalled");
212
- }
213
- catch {
214
- if (verbose)
215
- console.log(pc.yellow("⚠"), "Could not uninstall plugin");
216
- }
217
- try {
218
- execSync("claude plugin marketplace remove 0pflow", { stdio });
219
- if (verbose)
220
- console.log(pc.green("✓"), "Marketplace removed");
221
- }
222
- catch {
223
- if (verbose)
224
- console.log(pc.yellow("⚠"), "Could not remove marketplace");
225
- }
226
- }
227
- // Remove settings file
228
- const settingsPath = getSettingsPath();
229
- if (existsSync(settingsPath)) {
230
- const { unlinkSync } = await import("node:fs");
231
- unlinkSync(settingsPath);
232
- if (verbose)
233
- console.log(pc.green("✓"), "Settings file removed");
234
- }
235
- if (verbose) {
236
- console.log(pc.green("Uninstalled."));
237
- }
238
- }
239
- //# sourceMappingURL=install.js.map