@graph8/sdk 0.361.0 → 0.370.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 (388) hide show
  1. package/README.md +14 -10
  2. package/blocks/_foundation/README.md +172 -1
  3. package/blocks/_foundation/block.json +234 -13
  4. package/blocks/_foundation/components/api-error.tsx +71 -25
  5. package/blocks/_foundation/components/brand-provider.tsx +23 -0
  6. package/blocks/_foundation/components/confirmed-action.tsx +90 -0
  7. package/blocks/_foundation/components/connect-graph8.tsx +280 -0
  8. package/blocks/_foundation/components/empty-state.tsx +39 -7
  9. package/blocks/_foundation/components/screen/bar-list.tsx +71 -0
  10. package/blocks/_foundation/components/screen/detail-panel.tsx +114 -0
  11. package/blocks/_foundation/components/screen/entity-avatar.tsx +56 -0
  12. package/blocks/_foundation/components/screen/form-sheet.tsx +73 -0
  13. package/blocks/_foundation/components/screen/index.ts +22 -0
  14. package/blocks/_foundation/components/screen/key-value-list.tsx +65 -0
  15. package/blocks/_foundation/components/screen/record-link.tsx +76 -0
  16. package/blocks/_foundation/components/screen/screen-layout.tsx +124 -0
  17. package/blocks/_foundation/components/screen/section-card.tsx +47 -0
  18. package/blocks/_foundation/components/screen/sparkline.tsx +77 -0
  19. package/blocks/_foundation/components/screen/split-view.tsx +125 -0
  20. package/blocks/_foundation/components/screen/stat-strip.tsx +121 -0
  21. package/blocks/_foundation/components/screen/status-pill.tsx +104 -0
  22. package/blocks/_foundation/components/screen/time-series-chart-recharts.tsx +65 -0
  23. package/blocks/_foundation/components/screen/time-series-chart.tsx +32 -0
  24. package/blocks/_foundation/components/screen/time-series-format.ts +57 -0
  25. package/blocks/_foundation/components/screen/toolbar.tsx +144 -0
  26. package/blocks/_foundation/hooks/use-brand.ts +52 -0
  27. package/blocks/_foundation/hooks/use-g8-mutation.ts +23 -0
  28. package/blocks/_foundation/hooks/use-g8-query.ts +127 -1
  29. package/blocks/_foundation/hooks/use-paginated.ts +120 -0
  30. package/blocks/_foundation/hooks/use-row-activation.ts +57 -0
  31. package/blocks/_foundation/hooks/use-url-state.ts +74 -0
  32. package/blocks/_foundation/lib/g8-cache.ts +454 -0
  33. package/blocks/_foundation/lib/g8-client.ts +1 -1
  34. package/blocks/_foundation/lib/plural.ts +23 -0
  35. package/blocks/_foundation/server/connect-route.ts +15 -0
  36. package/blocks/_foundation/server/connect.ts +127 -0
  37. package/blocks/_foundation/server/local-key.ts +70 -0
  38. package/blocks/_foundation/server/proxy.ts +103 -3
  39. package/blocks/_foundation/server/route.ts +16 -4
  40. package/blocks/agents/README.md +14 -0
  41. package/blocks/agents/block.json +33 -1
  42. package/blocks/agents/components/agent-builder.tsx +13 -8
  43. package/blocks/agents/components/agent-knowledge-panel.tsx +2 -1
  44. package/blocks/agents/components/agent-run-detail.tsx +102 -0
  45. package/blocks/agents/components/agent-runs.tsx +16 -7
  46. package/blocks/agents/components/agents-screen.tsx +184 -0
  47. package/blocks/analytics/README.md +13 -0
  48. package/blocks/analytics/block.json +45 -1
  49. package/blocks/analytics/components/analytics-screen.tsx +209 -0
  50. package/blocks/analytics/components/leaderboard.tsx +14 -7
  51. package/blocks/analytics/components/report-builder.tsx +23 -9
  52. package/blocks/analytics/components/report-detail.tsx +84 -0
  53. package/blocks/analytics/components/trend-chart.tsx +62 -0
  54. package/blocks/appointments/README.md +21 -1
  55. package/blocks/appointments/block.json +43 -2
  56. package/blocks/appointments/components/availability-editor.tsx +17 -5
  57. package/blocks/appointments/components/event-type-editor.tsx +2 -1
  58. package/blocks/appointments/components/event-type-related.tsx +77 -0
  59. package/blocks/appointments/components/meeting-list.tsx +14 -6
  60. package/blocks/appointments/components/meetings-screen.tsx +157 -0
  61. package/blocks/appointments/components/scheduling-screen.tsx +122 -0
  62. package/blocks/appointments/hooks/use-event-types.ts +17 -0
  63. package/blocks/block.schema.json +18 -0
  64. package/blocks/block.types.ts +26 -0
  65. package/blocks/campaigns/README.md +41 -11
  66. package/blocks/campaigns/block.json +105 -42
  67. package/blocks/campaigns/components/campaign-assets.tsx +16 -5
  68. package/blocks/campaigns/components/campaign-launch-step.tsx +102 -19
  69. package/blocks/campaigns/components/campaign-list.tsx +7 -3
  70. package/blocks/campaigns/components/campaign-wizard.tsx +43 -10
  71. package/blocks/campaigns/components/campaigns-screen.tsx +267 -0
  72. package/blocks/campaigns/components/icp-detail.tsx +154 -0
  73. package/blocks/campaigns/components/icp-editor.tsx +15 -15
  74. package/blocks/campaigns/components/persona-detail.tsx +172 -0
  75. package/blocks/campaigns/components/persona-editor.tsx +14 -11
  76. package/blocks/campaigns/lib/campaigns-utils.ts +134 -1
  77. package/blocks/campaigns/recipes/attach-audience-and-launch.ts +16 -3
  78. package/blocks/campaigns/recipes/generate-ideas-and-create-campaign.ts +8 -4
  79. package/blocks/coach/README.md +10 -0
  80. package/blocks/coach/block.json +16 -1
  81. package/blocks/coach/components/coach-screen.tsx +222 -0
  82. package/blocks/copilot/README.md +13 -0
  83. package/blocks/copilot/block.json +14 -1
  84. package/blocks/copilot/components/copilot-panel.tsx +14 -5
  85. package/blocks/copilot/components/copilot-screen.tsx +148 -0
  86. package/blocks/copilot/components/copilot-team-chat.tsx +7 -5
  87. package/blocks/crm/README.md +28 -0
  88. package/blocks/crm/block.json +58 -2
  89. package/blocks/crm/components/companies-screen.tsx +345 -0
  90. package/blocks/crm/components/company-detail.tsx +8 -6
  91. package/blocks/crm/components/company-table.tsx +11 -4
  92. package/blocks/crm/components/contact-detail.tsx +6 -3
  93. package/blocks/crm/components/contact-table.tsx +10 -3
  94. package/blocks/crm/components/contacts-screen.tsx +359 -0
  95. package/blocks/crm/components/dedupe-review.tsx +7 -5
  96. package/blocks/crm/components/import-wizard.tsx +4 -2
  97. package/blocks/crm/components/notes-panel.tsx +4 -4
  98. package/blocks/crm/components/record-form.tsx +5 -3
  99. package/blocks/crm/components/task-list.tsx +4 -4
  100. package/blocks/crm/components/tasks-screen.tsx +379 -0
  101. package/blocks/crm/hooks/use-custom-fields.ts +6 -1
  102. package/blocks/crm/hooks/use-page-query.ts +7 -1
  103. package/blocks/crm/lib/crm-types.ts +12 -2
  104. package/blocks/crm/lib/screen-parts.tsx +105 -0
  105. package/blocks/deals/README.md +34 -3
  106. package/blocks/deals/block.json +45 -4
  107. package/blocks/deals/components/deal-detail.tsx +27 -13
  108. package/blocks/deals/components/deal-related.tsx +87 -0
  109. package/blocks/deals/components/deals-screen.tsx +298 -0
  110. package/blocks/deals/components/pipeline-board.tsx +4 -2
  111. package/blocks/deals/components/stage-editor.tsx +4 -4
  112. package/blocks/deals/hooks/use-default-owner.ts +60 -0
  113. package/blocks/deals/hooks/use-pipeline-deals.ts +5 -1
  114. package/blocks/deals/hooks/use-pipelines.ts +1 -1
  115. package/blocks/deals/lib/deals-types.ts +14 -0
  116. package/blocks/dialer/README.md +34 -2
  117. package/blocks/dialer/block.json +67 -1
  118. package/blocks/dialer/components/call-contact-button.tsx +252 -0
  119. package/blocks/dialer/components/call-log-screen.tsx +205 -0
  120. package/blocks/dialer/components/call-log.tsx +7 -3
  121. package/blocks/dialer/components/call-queue.tsx +1 -1
  122. package/blocks/dialer/components/dialer-screen.tsx +319 -0
  123. package/blocks/dialer/components/dialer-session-detail.tsx +153 -0
  124. package/blocks/dialer/components/live-calls-table.tsx +7 -3
  125. package/blocks/dialer/components/session-start-form.tsx +4 -2
  126. package/blocks/dialer/components/softphone.tsx +3 -1
  127. package/blocks/enrichment/README.md +14 -2
  128. package/blocks/enrichment/block.json +32 -4
  129. package/blocks/enrichment/components/bulk-enrich-panel.tsx +10 -5
  130. package/blocks/enrichment/components/email-verify-badge.tsx +28 -8
  131. package/blocks/enrichment/components/enrich-button.tsx +32 -9
  132. package/blocks/enrichment/components/enrichment-job-detail.tsx +78 -0
  133. package/blocks/enrichment/components/enrichment-screen.tsx +288 -0
  134. package/blocks/enrichment/components/waterfall-config.tsx +39 -10
  135. package/blocks/enrichment/recipes/waterfall-pipeline.ts +3 -2
  136. package/blocks/forms/README.md +12 -0
  137. package/blocks/forms/block.json +39 -17
  138. package/blocks/forms/components/form-builder.tsx +3 -1
  139. package/blocks/forms/components/form-embed.tsx +3 -1
  140. package/blocks/forms/components/forms-screen.tsx +353 -0
  141. package/blocks/forms/components/submissions-table.tsx +16 -6
  142. package/blocks/inbox/README.md +27 -3
  143. package/blocks/inbox/block.json +14 -2
  144. package/blocks/inbox/components/inbox-list.tsx +7 -3
  145. package/blocks/inbox/components/inbox-screen.tsx +294 -27
  146. package/blocks/inbox/components/reply-composer.tsx +65 -9
  147. package/blocks/inbox/components/tag-and-assign.tsx +4 -2
  148. package/blocks/inbox/hooks/use-inbox-thread.ts +1 -1
  149. package/blocks/inbox/hooks/use-inbox-threads.ts +1 -0
  150. package/blocks/inbox/lib/inbox-types.ts +47 -1
  151. package/blocks/inbox/recipes/01-triage-and-reply.ts +12 -2
  152. package/blocks/integrations/README.md +9 -0
  153. package/blocks/integrations/block.json +46 -1
  154. package/blocks/integrations/components/crm-detail.tsx +100 -0
  155. package/blocks/integrations/components/integration-list.tsx +9 -4
  156. package/blocks/integrations/components/integrations-screen.tsx +135 -0
  157. package/blocks/integrations/components/sync-status.tsx +5 -3
  158. package/blocks/integrations/components/webhook-detail.tsx +160 -0
  159. package/blocks/integrations/components/webhook-manager.tsx +13 -8
  160. package/blocks/integrations/lib/integrations-utils.ts +6 -1
  161. package/blocks/intent/README.md +14 -0
  162. package/blocks/intent/block.json +27 -1
  163. package/blocks/intent/components/intent-feed.tsx +5 -2
  164. package/blocks/intent/components/intent-keyword-manager.tsx +8 -4
  165. package/blocks/intent/components/intent-screen.tsx +265 -0
  166. package/blocks/intent/components/keyword-detail.tsx +124 -0
  167. package/blocks/lifecycle/README.md +16 -0
  168. package/blocks/lifecycle/block.json +34 -7
  169. package/blocks/lifecycle/components/account-related.tsx +66 -0
  170. package/blocks/lifecycle/components/lifecycle-board.tsx +3 -1
  171. package/blocks/lifecycle/components/lifecycle-screen.tsx +149 -0
  172. package/blocks/lifecycle/lib/lifecycle.ts +1 -1
  173. package/blocks/lists/README.md +13 -0
  174. package/blocks/lists/block.json +39 -1
  175. package/blocks/lists/components/add-to-list-button.tsx +3 -2
  176. package/blocks/lists/components/list-picker.tsx +5 -1
  177. package/blocks/lists/components/list-table.tsx +11 -5
  178. package/blocks/lists/components/lists-screen.tsx +344 -0
  179. package/blocks/lists/components/suppression-manager.tsx +6 -2
  180. package/blocks/lists/components/suppressions-screen.tsx +255 -0
  181. package/blocks/mailboxes/README.md +17 -0
  182. package/blocks/mailboxes/block.json +65 -17
  183. package/blocks/mailboxes/components/connect-mailbox.tsx +23 -13
  184. package/blocks/mailboxes/components/domain-detail.tsx +142 -0
  185. package/blocks/mailboxes/components/domain-purchase.tsx +6 -3
  186. package/blocks/mailboxes/components/mailbox-detail.tsx +156 -0
  187. package/blocks/mailboxes/components/mailboxes-screen.tsx +223 -0
  188. package/blocks/mailboxes/components/warmup-health.tsx +4 -2
  189. package/blocks/mailboxes/lib/mailboxes-utils.ts +22 -1
  190. package/blocks/newsletter/README.md +13 -0
  191. package/blocks/newsletter/block.json +47 -23
  192. package/blocks/newsletter/components/issue-scheduler.tsx +2 -1
  193. package/blocks/newsletter/components/newsletter-screen.tsx +404 -0
  194. package/blocks/newsletter/components/subscriber-table.tsx +12 -6
  195. package/blocks/nurture/README.md +12 -0
  196. package/blocks/nurture/block.json +35 -13
  197. package/blocks/nurture/components/nurture-builder.tsx +3 -1
  198. package/blocks/nurture/components/nurture-enroll.tsx +6 -3
  199. package/blocks/nurture/components/nurture-form.tsx +23 -3
  200. package/blocks/nurture/components/nurture-screen.tsx +283 -0
  201. package/blocks/nurture/lib/nurture-types.ts +1 -1
  202. package/blocks/objects/README.md +17 -0
  203. package/blocks/objects/block.json +29 -16
  204. package/blocks/objects/components/object-not-found.tsx +3 -1
  205. package/blocks/objects/components/object-record-detail.tsx +2 -1
  206. package/blocks/objects/components/object-schema-editor.tsx +3 -1
  207. package/blocks/objects/components/object-table.tsx +13 -3
  208. package/blocks/objects/components/objects-screen.tsx +147 -0
  209. package/blocks/objects/lib/object-types.ts +1 -1
  210. package/blocks/pages/README.md +12 -0
  211. package/blocks/pages/block.json +35 -22
  212. package/blocks/pages/components/brand-kit-editor.tsx +5 -2
  213. package/blocks/pages/components/content-library.tsx +46 -11
  214. package/blocks/pages/components/page-list.tsx +6 -3
  215. package/blocks/pages/components/pages-screen.tsx +154 -0
  216. package/blocks/quotes/README.md +17 -0
  217. package/blocks/quotes/block.json +38 -9
  218. package/blocks/quotes/components/product-picker.tsx +3 -1
  219. package/blocks/quotes/components/quote-list.tsx +7 -3
  220. package/blocks/quotes/components/quote-related.tsx +123 -0
  221. package/blocks/quotes/components/quotes-screen.tsx +169 -0
  222. package/blocks/radar/README.md +10 -0
  223. package/blocks/radar/block.json +41 -1
  224. package/blocks/radar/components/competitor-detail.tsx +117 -0
  225. package/blocks/radar/components/competitor-tracker.tsx +3 -1
  226. package/blocks/radar/components/radar-report.tsx +4 -2
  227. package/blocks/radar/components/radar-screen.tsx +214 -0
  228. package/blocks/radar/components/report-detail.tsx +104 -0
  229. package/blocks/search/README.md +10 -0
  230. package/blocks/search/block.json +16 -1
  231. package/blocks/search/components/filter-builder.tsx +3 -3
  232. package/blocks/search/components/prospect-results.tsx +5 -3
  233. package/blocks/search/components/prospect-search-screen.tsx +235 -0
  234. package/blocks/search/components/saved-searches.tsx +4 -1
  235. package/blocks/search/hooks/use-filter-options.ts +20 -6
  236. package/blocks/search/lib/search-types.ts +2 -0
  237. package/blocks/sequencer/README.md +49 -9
  238. package/blocks/sequencer/block.json +99 -19
  239. package/blocks/sequencer/components/enroll-dialog.tsx +9 -3
  240. package/blocks/sequencer/components/sequence-builder.tsx +211 -46
  241. package/blocks/sequencer/components/sequence-detail.tsx +259 -0
  242. package/blocks/sequencer/components/sequence-enrollments.tsx +114 -0
  243. package/blocks/sequencer/components/sequence-list.tsx +33 -8
  244. package/blocks/sequencer/components/sequence-stats.tsx +3 -2
  245. package/blocks/sequencer/components/sequence-steps-panel.tsx +103 -0
  246. package/blocks/sequencer/components/sequences-screen.tsx +159 -0
  247. package/blocks/sequencer/components/step-editor.tsx +3 -1
  248. package/blocks/sequencer/lib/sequencer-utils.ts +128 -5
  249. package/blocks/sequencer/recipes/create-multichannel-sequence.ts +33 -5
  250. package/blocks/sequencer/recipes/launch-and-enroll.ts +19 -2
  251. package/blocks/social-ads/README.md +11 -0
  252. package/blocks/social-ads/block.json +101 -2
  253. package/blocks/social-ads/components/ad-campaign-list.tsx +9 -5
  254. package/blocks/social-ads/components/ads-screen.tsx +152 -0
  255. package/blocks/social-ads/components/audience-sync-detail.tsx +188 -0
  256. package/blocks/social-ads/components/audience-sync.tsx +11 -7
  257. package/blocks/social-ads/components/campaign-detail.tsx +133 -0
  258. package/blocks/social-ads/components/creative-detail.tsx +150 -0
  259. package/blocks/social-ads/components/creative-gallery.tsx +15 -5
  260. package/blocks/social-ads/components/post-composer.tsx +3 -1
  261. package/blocks/social-ads/components/post-detail.tsx +160 -0
  262. package/blocks/social-ads/components/social-post-list.tsx +11 -3
  263. package/blocks/social-ads/components/social-screen.tsx +160 -0
  264. package/blocks/visitors/README.md +10 -0
  265. package/blocks/visitors/block.json +25 -1
  266. package/blocks/visitors/components/snippet-install.tsx +3 -1
  267. package/blocks/visitors/components/visitor-company-card.tsx +2 -2
  268. package/blocks/visitors/components/visitor-detail.tsx +105 -0
  269. package/blocks/visitors/components/visitor-feed.tsx +11 -2
  270. package/blocks/visitors/components/visitors-screen.tsx +166 -0
  271. package/blocks/webchat/README.md +10 -0
  272. package/blocks/webchat/block.json +21 -7
  273. package/blocks/webchat/components/chat-widget-config.tsx +7 -4
  274. package/blocks/webchat/components/conversation-list.tsx +7 -3
  275. package/blocks/webchat/components/webchat-screen.tsx +245 -0
  276. package/blocks/workbench/README.md +11 -0
  277. package/blocks/workbench/block.json +48 -1
  278. package/blocks/workbench/components/column-recipe-editor.tsx +4 -2
  279. package/blocks/workbench/components/workbench-grid.tsx +9 -3
  280. package/blocks/workbench/components/workbench-row-detail.tsx +104 -0
  281. package/blocks/workbench/components/workbench-screen.tsx +192 -0
  282. package/blocks/workbench/components/workbench-sources.tsx +194 -0
  283. package/blocks/workflows/README.md +13 -0
  284. package/blocks/workflows/block.json +28 -9
  285. package/blocks/workflows/components/run-history.tsx +31 -9
  286. package/blocks/workflows/components/trigger-config.tsx +3 -1
  287. package/blocks/workflows/components/workflow-editor.tsx +3 -1
  288. package/blocks/workflows/components/workflow-list.tsx +13 -6
  289. package/blocks/workflows/components/workflows-screen.tsx +193 -0
  290. package/dist/cli.js +2785 -1637
  291. package/dist/errors.d.mts +34 -0
  292. package/dist/errors.d.ts +34 -0
  293. package/dist/errors.js +46 -0
  294. package/dist/errors.js.map +1 -0
  295. package/dist/errors.mjs +21 -0
  296. package/dist/errors.mjs.map +1 -0
  297. package/dist/index.browser.js +11 -5
  298. package/dist/index.browser.js.map +1 -1
  299. package/dist/index.browser.mjs +11 -5
  300. package/dist/index.browser.mjs.map +1 -1
  301. package/dist/index.d.mts +164 -25
  302. package/dist/index.d.ts +164 -25
  303. package/dist/index.js +11 -5
  304. package/dist/index.js.map +1 -1
  305. package/dist/index.mjs +11 -5
  306. package/dist/index.mjs.map +1 -1
  307. package/dist/react.browser.js +10 -4
  308. package/dist/react.browser.js.map +1 -1
  309. package/dist/react.browser.mjs +10 -4
  310. package/dist/react.browser.mjs.map +1 -1
  311. package/dist/react.d.mts +142 -5
  312. package/dist/react.d.ts +142 -5
  313. package/dist/react.js +10 -4
  314. package/dist/react.js.map +1 -1
  315. package/dist/react.mjs +10 -4
  316. package/dist/react.mjs.map +1 -1
  317. package/dist/types/blocks/add.d.ts +11 -4
  318. package/dist/types/blocks/brand.d.ts +113 -0
  319. package/dist/types/blocks/compose.d.ts +53 -0
  320. package/dist/types/blocks/create.d.ts +25 -8
  321. package/dist/types/blocks/doctor.d.ts +6 -1
  322. package/dist/types/blocks/flows.d.ts +20 -0
  323. package/dist/types/blocks/navfile.d.ts +35 -0
  324. package/dist/types/blocks/paths.d.ts +4 -0
  325. package/dist/types/blocks/prefixes.d.ts +37 -0
  326. package/dist/types/blocks/registry.d.ts +32 -0
  327. package/dist/types/blocks/screens.d.ts +53 -0
  328. package/dist/types/cli.d.ts +2 -0
  329. package/dist/types/errors.d.ts +33 -0
  330. package/dist/types/http.d.ts +2 -18
  331. package/dist/types/version.d.ts +2 -2
  332. package/docs/agents.md +15 -4
  333. package/docs/api/README.md +2 -2
  334. package/docs/api/by-path.md +1 -0
  335. package/docs/api/desk.d.ts +98 -2
  336. package/docs/api/desk.md +123 -1
  337. package/docs/api/inbox.d.ts +10 -2
  338. package/docs/api/inbox.md +10 -2
  339. package/docs/api/seo.d.ts +19 -1
  340. package/docs/api/seo.md +24 -1
  341. package/package.json +16 -2
  342. package/stacks/6sense.json +41 -16
  343. package/stacks/apollo/pages/companies.tsx.tmpl +50 -0
  344. package/stacks/apollo/pages/contacts.tsx.tmpl +117 -0
  345. package/stacks/apollo.json +118 -36
  346. package/stacks/calendly.json +60 -0
  347. package/stacks/clay/pages/companies.tsx.tmpl +15 -0
  348. package/stacks/clay/pages/contacts.tsx.tmpl +19 -0
  349. package/stacks/clay.json +59 -26
  350. package/stacks/gong.json +81 -35
  351. package/stacks/hootsuite.json +99 -0
  352. package/stacks/hubspot/pages/companies.tsx.tmpl +47 -0
  353. package/stacks/hubspot/pages/contacts.tsx.tmpl +111 -0
  354. package/stacks/hubspot/pages/deals.tsx.tmpl +11 -0
  355. package/stacks/hubspot/pages/inbox.tsx.tmpl +92 -0
  356. package/stacks/hubspot/pages/quotes.tsx.tmpl +11 -0
  357. package/stacks/hubspot.json +167 -66
  358. package/stacks/intercom.json +48 -20
  359. package/stacks/mailchimp.json +52 -33
  360. package/stacks/outreach/pages/contacts.tsx.tmpl +85 -0
  361. package/stacks/outreach.json +88 -25
  362. package/stacks/pipedrive/pages/companies.tsx.tmpl +47 -0
  363. package/stacks/pipedrive/pages/contacts.tsx.tmpl +47 -0
  364. package/stacks/pipedrive/pages/deals.tsx.tmpl +11 -0
  365. package/stacks/pipedrive/pages/inbox.tsx.tmpl +92 -0
  366. package/stacks/pipedrive/pages/quotes.tsx.tmpl +11 -0
  367. package/stacks/pipedrive.json +115 -0
  368. package/stacks/salesforce/pages/companies.tsx.tmpl +47 -0
  369. package/stacks/salesforce/pages/contacts.tsx.tmpl +47 -0
  370. package/stacks/salesforce/pages/deals.tsx.tmpl +11 -0
  371. package/stacks/salesforce/pages/quotes.tsx.tmpl +11 -0
  372. package/stacks/salesforce.json +81 -31
  373. package/stacks/stack.schema.json +6 -1
  374. package/stacks/zoominfo/pages/companies.tsx.tmpl +15 -0
  375. package/stacks/zoominfo/pages/contacts.tsx.tmpl +19 -0
  376. package/stacks/zoominfo.json +102 -0
  377. package/styles/styles.css +1 -1
  378. package/templates/next-app/README.md.tmpl +55 -8
  379. package/templates/next-app/app/globals.css.tmpl +105 -0
  380. package/templates/next-app/app/layout.tsx.tmpl +18 -4
  381. package/templates/next-app/components/app-shell.tsx.tmpl +248 -23
  382. package/templates/next-app/components/shell/connection-status.tsx.tmpl +109 -0
  383. package/templates/next-app/components/shell/nav-model.ts.tmpl +65 -0
  384. package/templates/next-app/components/shell/quick-jump.tsx.tmpl +131 -0
  385. package/templates/next-app/components/shell/theme-toggle.tsx.tmpl +40 -0
  386. package/templates/next-app/dot-gitignore.tmpl +2 -0
  387. package/templates/next-app/lib/nav.ts.tmpl +1 -1
  388. package/templates/next-app/package.json.tmpl +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graph8/sdk",
3
- "version": "0.361.0",
3
+ "version": "0.370.0",
4
4
  "description": "graph8 SDK - CRM, enrichment, sequences, campaigns, and tracking for B2B",
5
5
  "license": "MIT",
6
6
  "author": "graph8 <support@graph8.com> (https://graph8.com)",
@@ -49,6 +49,11 @@
49
49
  "import": "./dist/react.mjs",
50
50
  "require": "./dist/react.js"
51
51
  },
52
+ "./errors": {
53
+ "types": "./dist/errors.d.ts",
54
+ "import": "./dist/errors.mjs",
55
+ "require": "./dist/errors.js"
56
+ },
52
57
  "./ui": {
53
58
  "types": "./dist/ui/index.d.ts",
54
59
  "import": "./dist/ui/index.mjs",
@@ -63,6 +68,11 @@
63
68
  "./ui/theme.css": "./styles/theme.css",
64
69
  "./ui/styles.css": "./styles/styles.css"
65
70
  },
71
+ "sideEffects": [
72
+ "*.css",
73
+ "./dist/*.js",
74
+ "./dist/*.mjs"
75
+ ],
66
76
  "files": [
67
77
  "dist",
68
78
  "blocks",
@@ -73,8 +83,9 @@
73
83
  "README.md"
74
84
  ],
75
85
  "scripts": {
76
- "build": "tsup && npm run build:ui && npm run build:types && npm run docs:agents",
86
+ "build": "node scripts/clean-dist.mjs && tsup && npm run build:ui && npm run build:types && npm run docs:agents",
77
87
  "test": "vitest run",
88
+ "validate:blocks": "vite-node --script scripts/blocks/validate.ts",
78
89
  "dev": "tsup --watch",
79
90
  "prepublishOnly": "npm run build",
80
91
  "generate": "node scripts/generate-from-contract.mjs",
@@ -83,6 +94,9 @@
83
94
  "build:types": "node scripts/emit-module-types.mjs",
84
95
  "docs:agents": "vite-node scripts/agent-docs/cli.ts",
85
96
  "e2e:create": "node scripts/e2e-create.mjs",
97
+ "e2e:flows": "node scripts/e2e-flows.mjs",
98
+ "mock:graph8": "node scripts/mock-graph8/server.mjs",
99
+ "mock:graph8:coverage": "node scripts/mock-graph8/coverage.mjs",
86
100
  "generate:ui": "node scripts/sync-ui.mjs",
87
101
  "generate:ui:check": "node scripts/sync-ui.mjs --check",
88
102
  "build:ui": "tsup --config tsup.ui.config.ts && node scripts/postbuild-ui.mjs && node scripts/build-ui-css.mjs"
@@ -2,7 +2,7 @@
2
2
  "$schema": "./stack.schema.json",
3
3
  "id": "6sense",
4
4
  "title": "6sense-style account intelligence",
5
- "summary": "Buyer intent, website visitor identification and competitor tracking on top of the CRM.",
5
+ "summary": "Intent, website visitors and competitor tracking on top of your accounts and contacts.",
6
6
  "status": "available",
7
7
  "blocks": [
8
8
  "foundation",
@@ -11,36 +11,61 @@
11
11
  "visitors",
12
12
  "radar"
13
13
  ],
14
+ "home": "/intent",
14
15
  "nav": [
15
- {
16
- "label": "Contacts",
17
- "path": "/contacts",
18
- "block": "crm",
19
- "component": "ContactTable"
20
- },
21
- {
22
- "label": "Companies",
23
- "path": "/companies",
24
- "block": "crm",
25
- "component": "CompanyTable"
26
- },
27
16
  {
28
17
  "label": "Intent",
29
18
  "path": "/intent",
30
19
  "block": "intent",
31
- "component": "IntentFeed"
20
+ "component": "IntentScreen",
21
+ "icon": "Radar",
22
+ "group": "Signals",
23
+ "description": "Accounts showing buying intent"
32
24
  },
33
25
  {
34
26
  "label": "Visitors",
35
27
  "path": "/visitors",
36
28
  "block": "visitors",
37
- "component": "VisitorFeed"
29
+ "component": "VisitorsScreen",
30
+ "icon": "Eye",
31
+ "group": "Signals",
32
+ "description": "Who is on your website right now"
38
33
  },
39
34
  {
40
35
  "label": "Competitors",
41
36
  "path": "/competitors",
42
37
  "block": "radar",
43
- "component": "CompetitorTracker"
38
+ "component": "RadarScreen",
39
+ "icon": "Crosshair",
40
+ "group": "Signals",
41
+ "description": "Track competitors and market moves"
42
+ },
43
+ {
44
+ "label": "Companies",
45
+ "path": "/companies",
46
+ "block": "crm",
47
+ "component": "CompaniesScreen",
48
+ "icon": "Building2",
49
+ "group": "Prospect",
50
+ "description": "Accounts and the people at them"
51
+ },
52
+ {
53
+ "label": "Contacts",
54
+ "path": "/contacts",
55
+ "block": "crm",
56
+ "component": "ContactsScreen",
57
+ "icon": "Users",
58
+ "group": "Prospect",
59
+ "description": "People you sell to, with notes, tasks and activity"
60
+ },
61
+ {
62
+ "label": "Tasks",
63
+ "path": "/tasks",
64
+ "block": "crm",
65
+ "component": "TasksScreen",
66
+ "icon": "CheckSquare",
67
+ "group": "Work",
68
+ "description": "Follow-ups due across your records"
44
69
  }
45
70
  ]
46
71
  }
@@ -0,0 +1,50 @@
1
+ "use client";
2
+
3
+ // Generated by `graph8-sdk create {{stackId}}`. The {{block}} block's {{component}} (source in {{blockDir}}), with the
4
+ // other blocks of this app plugged into its slots. Edit freely: this file is yours.
5
+ import Link from "next/link";
6
+ import { Skeleton } from "@graph8/sdk/ui";
7
+ import { Handshake } from "lucide-react";
8
+ import { ApiError } from "@/components/g8/_foundation/api-error";
9
+ import { EmptyState } from "@/components/g8/_foundation/empty-state";
10
+ import { useG8Query } from "@/components/g8/_foundation/hooks/use-g8-query";
11
+ import { g8Get } from "@/components/g8/_foundation/lib/g8-client";
12
+ import { CompaniesScreen } from "@/components/g8/crm/companies-screen";
13
+ import { EnrichButton } from "@/components/g8/enrichment/enrich-button";
14
+ import { dataOf, formatMoney } from "@/components/g8/deals/lib/deals-types";
15
+
16
+ /** One row of GET /contacts/{id}/deals and GET /companies/{id}/deals (the API's ContactDealResponse). */
17
+ interface LinkedDeal { deal_id?: string | null; name?: string | null; stage?: string | null; value?: number | null; currency?: string | null; role?: string | null }
18
+
19
+ /** The deals linked to one contact or company, each opening in the Deals page. */
20
+ function LinkedDeals({ kind, id }: { kind: "contacts" | "companies"; id: number }) {
21
+ const q = useG8Query(async (signal) => {
22
+ const inner = dataOf<{ items?: LinkedDeal[] } | LinkedDeal[]>(await g8Get(`/${kind}/${id}/deals`, undefined, { signal }));
23
+ return (Array.isArray(inner) ? inner : (inner.items ?? [])).filter((d) => d.deal_id);
24
+ }, [kind, id]);
25
+ if (q.error) return <ApiError error={q.error} title="Could not load deals" onRetry={() => void q.refetch()} />;
26
+ if (!q.data) return <Skeleton className="h-24 w-full" aria-label="Loading deals" />;
27
+ if (q.data.length === 0) return <EmptyState compact icon={<Handshake className="size-8" />} title="No deals yet" description="Deals linked to this record show up here." />;
28
+ return (
29
+ <ul className="divide-y rounded-md border" aria-label="Deals">
30
+ {q.data.map((d) => (
31
+ <li key={d.deal_id}>
32
+ <Link href={`/deals?id=${encodeURIComponent(d.deal_id as string)}`} className="flex items-center justify-between gap-3 p-3 text-sm hover:bg-muted">
33
+ <span className="min-w-0 truncate font-medium">{d.name || "Untitled deal"}</span>
34
+ <span className="shrink-0 text-xs text-muted-foreground">{[d.stage, d.value != null ? formatMoney(d.value, d.currency) : null].filter(Boolean).join(" · ")}</span>
35
+ </Link>
36
+ </li>
37
+ ))}
38
+ </ul>
39
+ );
40
+ }
41
+
42
+ export default function Page() {
43
+ return (
44
+ <CompaniesScreen
45
+ renderRowActions={(c, { reload }) => <EnrichButton kind="company" lookup={{ domain: c.domain ?? undefined, name: c.name ?? undefined }} record={{ ...c }} onApplied={reload} label="Enrich" size="sm" variant="ghost" />}
46
+ renderDetailActions={(c, { reload }) => <EnrichButton kind="company" lookup={{ domain: c.domain ?? undefined, name: c.name ?? undefined }} record={{ ...c }} onApplied={reload} label="Enrich" />}
47
+ extraDetailTabs={[{ id: "deals", label: "Deals", render: (c) => <LinkedDeals kind="companies" id={c.id} /> }]}
48
+ />
49
+ );
50
+ }
@@ -0,0 +1,117 @@
1
+ "use client";
2
+
3
+ // Generated by `graph8-sdk create {{stackId}}`. The {{block}} block's {{component}} (source in {{blockDir}}), with the
4
+ // other blocks of this app plugged into its slots. Edit freely: this file is yours.
5
+ import { useState } from "react";
6
+ import Link from "next/link";
7
+ import { Button, Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, Skeleton } from "@graph8/sdk/ui";
8
+ import { Handshake, ListPlus } from "lucide-react";
9
+ import { ApiError } from "@/components/g8/_foundation/api-error";
10
+ import { EmptyState } from "@/components/g8/_foundation/empty-state";
11
+ import { useG8Query } from "@/components/g8/_foundation/hooks/use-g8-query";
12
+ import { g8Get } from "@/components/g8/_foundation/lib/g8-client";
13
+ import { ContactsScreen } from "@/components/g8/crm/contacts-screen";
14
+ import { CallContactButton } from "@/components/g8/dialer/call-contact-button";
15
+ import { EnrichButton } from "@/components/g8/enrichment/enrich-button";
16
+ import { dataOf, formatMoney } from "@/components/g8/deals/lib/deals-types";
17
+ import { EnrollDialog } from "@/components/g8/sequencer/enroll-dialog";
18
+ import { listOf, statusGroup, type SequenceRow } from "@/components/g8/sequencer/lib/sequencer-utils";
19
+
20
+ /** Every active sequence, paging through the whole list (the API answers one page at a time). */
21
+ async function activeSequences(signal: AbortSignal): Promise<SequenceRow[]> {
22
+ const out: SequenceRow[] = [];
23
+ for (let page = 1; page <= 50; page++) {
24
+ const env = await g8Get("/sequences", { page, limit: 100 }, { signal });
25
+ const rows = listOf<SequenceRow>(env);
26
+ out.push(...rows.filter((s) => statusGroup(s.status) === "live"));
27
+ const more = (env as { pagination?: { has_next?: boolean } }).pagination?.has_next;
28
+ if (!more || rows.length === 0) break;
29
+ }
30
+ return out;
31
+ }
32
+
33
+ /** Pick a sequence, then enroll the contacts in it. The enroll dialog shows the sending preflight before anything is sent. */
34
+ function AddToSequence({ contactIds, onEnrolled, variant = "outline" }: { contactIds: number[]; onEnrolled?: () => void; variant?: "outline" | "default" }) {
35
+ const [step, setStep] = useState<"closed" | "pick" | "enroll">("closed");
36
+ const [sequenceId, setSequenceId] = useState("");
37
+ const sequences = useG8Query(activeSequences, [], { enabled: step === "pick" });
38
+ const chosen = (sequences.data ?? []).find((s) => s.id === sequenceId);
39
+ return (
40
+ <>
41
+ <Button size="sm" variant={variant} disabled={contactIds.length === 0} onClick={() => { setSequenceId(""); setStep("pick"); }}>
42
+ <ListPlus className="mr-1 size-4" aria-hidden />
43
+ Add to sequence
44
+ </Button>
45
+ <Sheet open={step === "pick"} onOpenChange={(o) => { if (!o) setStep("closed"); }}>
46
+ <SheetContent className="w-full sm:max-w-md">
47
+ <SheetHeader>
48
+ <SheetTitle>Add to sequence</SheetTitle>
49
+ <SheetDescription>{contactIds.length === 1 ? "1 contact" : `${contactIds.length} contacts`} will be enrolled in the sequence you pick.</SheetDescription>
50
+ </SheetHeader>
51
+ <div className="space-y-3 p-4">
52
+ {sequences.error ? <ApiError error={sequences.error} title="Could not load sequences" onRetry={() => void sequences.refetch()} /> : null}
53
+ {sequences.loading && !sequences.data ? <Skeleton className="h-9 w-full" aria-label="Loading sequences" /> : null}
54
+ {sequences.data && sequences.data.length === 0 ? <EmptyState compact title="No active sequences" description="Launch a sequence on the Sequences page first." /> : null}
55
+ {sequences.data && sequences.data.length > 0 ? (
56
+ <>
57
+ <label htmlFor="enroll-sequence" className="text-sm font-medium">Sequence</label>
58
+ <select id="enroll-sequence" className="h-9 w-full rounded-md border bg-background px-2 text-sm" value={sequenceId} onChange={(e) => setSequenceId(e.target.value)}>
59
+ <option value="">Choose a sequence</option>
60
+ {sequences.data.map((s) => <option key={s.id} value={s.id}>{s.name || s.id}</option>)}
61
+ </select>
62
+ <Button disabled={!sequenceId} onClick={() => setStep("enroll")}>Continue</Button>
63
+ </>
64
+ ) : null}
65
+ </div>
66
+ </SheetContent>
67
+ </Sheet>
68
+ {step === "enroll" && chosen ? (
69
+ <EnrollDialog open sequenceId={chosen.id} sequenceName={chosen.name ?? undefined} contactIds={contactIds} onClose={() => setStep("closed")} onEnrolled={() => { setStep("closed"); onEnrolled?.(); }} />
70
+ ) : null}
71
+ </>
72
+ );
73
+ }
74
+
75
+ /** One row of GET /contacts/{id}/deals and GET /companies/{id}/deals (the API's ContactDealResponse). */
76
+ interface LinkedDeal { deal_id?: string | null; name?: string | null; stage?: string | null; value?: number | null; currency?: string | null; role?: string | null }
77
+
78
+ /** The deals linked to one contact or company, each opening in the Deals page. */
79
+ function LinkedDeals({ kind, id }: { kind: "contacts" | "companies"; id: number }) {
80
+ const q = useG8Query(async (signal) => {
81
+ const inner = dataOf<{ items?: LinkedDeal[] } | LinkedDeal[]>(await g8Get(`/${kind}/${id}/deals`, undefined, { signal }));
82
+ return (Array.isArray(inner) ? inner : (inner.items ?? [])).filter((d) => d.deal_id);
83
+ }, [kind, id]);
84
+ if (q.error) return <ApiError error={q.error} title="Could not load deals" onRetry={() => void q.refetch()} />;
85
+ if (!q.data) return <Skeleton className="h-24 w-full" aria-label="Loading deals" />;
86
+ if (q.data.length === 0) return <EmptyState compact icon={<Handshake className="size-8" />} title="No deals yet" description="Deals linked to this record show up here." />;
87
+ return (
88
+ <ul className="divide-y rounded-md border" aria-label="Deals">
89
+ {q.data.map((d) => (
90
+ <li key={d.deal_id}>
91
+ <Link href={`/deals?id=${encodeURIComponent(d.deal_id as string)}`} className="flex items-center justify-between gap-3 p-3 text-sm hover:bg-muted">
92
+ <span className="min-w-0 truncate font-medium">{d.name || "Untitled deal"}</span>
93
+ <span className="shrink-0 text-xs text-muted-foreground">{[d.stage, d.value != null ? formatMoney(d.value, d.currency) : null].filter(Boolean).join(" · ")}</span>
94
+ </Link>
95
+ </li>
96
+ ))}
97
+ </ul>
98
+ );
99
+ }
100
+
101
+ export default function Page() {
102
+ return (
103
+ <ContactsScreen
104
+ renderRowActions={(c, { reload }) => <EnrichButton kind="person" lookup={{ email: c.work_email ?? undefined, linkedin_url: c.linkedin_url ?? undefined, first_name: c.first_name ?? undefined, last_name: c.last_name ?? undefined }} record={{ ...c }} onApplied={reload} label="Enrich" size="sm" variant="ghost" />}
105
+ renderBulkActions={({ ids, clear }) => <AddToSequence contactIds={ids} onEnrolled={clear} />}
106
+ renderDetailActions={(c, { reload }) => (
107
+ <>
108
+ <EnrichButton kind="person" lookup={{ email: c.work_email ?? undefined, linkedin_url: c.linkedin_url ?? undefined, first_name: c.first_name ?? undefined, last_name: c.last_name ?? undefined }} record={{ ...c }} onApplied={reload} label="Enrich" />
109
+ <AddToSequence contactIds={[c.id]} />
110
+ {/* One call to this contact through the dialer; confirmed, and your softphone joins it. */}
111
+ <CallContactButton contact={{ id: c.id, first_name: c.first_name, last_name: c.last_name, full_name: c.full_name, email: c.work_email, company: c.company_name, mobile_phone: c.mobile_phone, direct_phone: c.direct_phone }} />
112
+ </>
113
+ )}
114
+ extraDetailTabs={[{ id: "deals", label: "Deals", render: (c) => <LinkedDeals kind="contacts" id={c.id} /> }]}
115
+ />
116
+ );
117
+ }
@@ -2,7 +2,7 @@
2
2
  "$schema": "./stack.schema.json",
3
3
  "id": "apollo",
4
4
  "title": "Apollo-style prospecting",
5
- "summary": "Find, enrich and contact prospects: contacts, lists, search, enrichment, intent, sequences, inbox, dialer, deals and analytics.",
5
+ "summary": "Find, enrich and contact prospects: contacts, lists, search, enrichment, intent, sequences, campaigns, inbox, dialer, deals and analytics.",
6
6
  "status": "available",
7
7
  "blocks": [
8
8
  "foundation",
@@ -14,6 +14,7 @@
14
14
  "visitors",
15
15
  "mailboxes",
16
16
  "sequencer",
17
+ "campaigns",
17
18
  "inbox",
18
19
  "dialer",
19
20
  "appointments",
@@ -21,108 +22,189 @@
21
22
  "analytics",
22
23
  "integrations"
23
24
  ],
25
+ "home": "/analytics",
24
26
  "nav": [
27
+ {
28
+ "label": "Analytics",
29
+ "path": "/analytics",
30
+ "block": "analytics",
31
+ "component": "AnalyticsScreen",
32
+ "icon": "BarChart3",
33
+ "group": "Insights",
34
+ "description": "Pipeline, engagement and team KPIs"
35
+ },
36
+ {
37
+ "label": "Prospect search",
38
+ "path": "/prospect-search",
39
+ "block": "search",
40
+ "component": "ProspectSearchScreen",
41
+ "icon": "Search",
42
+ "group": "Prospect",
43
+ "description": "Find new people and companies, then save them"
44
+ },
25
45
  {
26
46
  "label": "Contacts",
27
47
  "path": "/contacts",
28
48
  "block": "crm",
29
- "component": "ContactTable"
49
+ "component": "ContactsScreen",
50
+ "icon": "Users",
51
+ "group": "Prospect",
52
+ "description": "People you sell to, with notes, tasks and activity",
53
+ "page": "pages/contacts.tsx.tmpl"
30
54
  },
31
55
  {
32
56
  "label": "Companies",
33
57
  "path": "/companies",
34
58
  "block": "crm",
35
- "component": "CompanyTable"
59
+ "component": "CompaniesScreen",
60
+ "icon": "Building2",
61
+ "group": "Prospect",
62
+ "description": "Accounts and the people at them",
63
+ "page": "pages/companies.tsx.tmpl"
36
64
  },
37
65
  {
38
66
  "label": "Lists",
39
67
  "path": "/lists",
40
68
  "block": "lists",
41
- "component": "ListTable"
42
- },
43
- {
44
- "label": "Suppressions",
45
- "path": "/suppressions",
46
- "block": "lists",
47
- "component": "SuppressionManager"
48
- },
49
- {
50
- "label": "Prospect search",
51
- "path": "/prospect-search",
52
- "block": "search",
53
- "component": "ProspectResults"
69
+ "component": "ListsScreen",
70
+ "icon": "ListChecks",
71
+ "group": "Prospect",
72
+ "description": "Saved audiences you can sequence or sync"
54
73
  },
55
74
  {
56
75
  "label": "Enrichment",
57
76
  "path": "/enrichment",
58
77
  "block": "enrichment",
59
- "component": "BulkEnrichPanel"
78
+ "component": "EnrichmentScreen",
79
+ "icon": "Sparkles",
80
+ "group": "Prospect",
81
+ "description": "Fill in emails, phones and firmographics"
60
82
  },
61
83
  {
62
84
  "label": "Intent",
63
85
  "path": "/intent",
64
86
  "block": "intent",
65
- "component": "IntentFeed"
87
+ "component": "IntentScreen",
88
+ "icon": "Radar",
89
+ "group": "Signals",
90
+ "description": "Accounts showing buying intent"
66
91
  },
67
92
  {
68
93
  "label": "Visitors",
69
94
  "path": "/visitors",
70
95
  "block": "visitors",
71
- "component": "VisitorFeed"
72
- },
73
- {
74
- "label": "Mailboxes",
75
- "path": "/mailboxes",
76
- "block": "mailboxes",
77
- "component": "MailboxList"
96
+ "component": "VisitorsScreen",
97
+ "icon": "Eye",
98
+ "group": "Signals",
99
+ "description": "Who is on your website right now"
78
100
  },
79
101
  {
80
102
  "label": "Sequences",
81
103
  "path": "/sequences",
82
104
  "block": "sequencer",
83
- "component": "SequenceList"
105
+ "component": "SequencesScreen",
106
+ "icon": "Workflow",
107
+ "group": "Engage",
108
+ "description": "Multi-step outreach cadences"
109
+ },
110
+ {
111
+ "label": "Campaigns",
112
+ "path": "/campaigns",
113
+ "block": "campaigns",
114
+ "component": "CampaignsScreen",
115
+ "icon": "Rocket",
116
+ "group": "Engage",
117
+ "description": "Campaigns from brief to launch"
84
118
  },
85
119
  {
86
120
  "label": "Inbox",
87
121
  "path": "/inbox",
88
122
  "block": "inbox",
89
- "component": "InboxList"
123
+ "component": "InboxScreen",
124
+ "icon": "Inbox",
125
+ "group": "Engage",
126
+ "description": "Replies from every channel in one place"
90
127
  },
91
128
  {
92
129
  "label": "Dialer",
93
130
  "path": "/dialer",
94
131
  "block": "dialer",
95
- "component": "CallQueue"
132
+ "component": "DialerScreen",
133
+ "icon": "Phone",
134
+ "group": "Engage",
135
+ "description": "Call queues and live sessions"
96
136
  },
97
137
  {
98
138
  "label": "Call log",
99
139
  "path": "/calls",
100
140
  "block": "dialer",
101
- "component": "CallLog"
141
+ "component": "CallLogScreen",
142
+ "icon": "PhoneCall",
143
+ "group": "Engage",
144
+ "description": "Every call with transcript and outcome"
102
145
  },
103
146
  {
104
147
  "label": "Meetings",
105
148
  "path": "/meetings",
106
149
  "block": "appointments",
107
- "component": "MeetingList"
150
+ "component": "MeetingsScreen",
151
+ "icon": "CalendarCheck",
152
+ "group": "Engage",
153
+ "description": "Booked, held and missed meetings"
154
+ },
155
+ {
156
+ "label": "Scheduling",
157
+ "path": "/scheduling",
158
+ "block": "appointments",
159
+ "component": "SchedulingScreen",
160
+ "icon": "CalendarClock",
161
+ "group": "Setup",
162
+ "description": "Booking links and event types"
108
163
  },
109
164
  {
110
165
  "label": "Deals",
111
166
  "path": "/deals",
112
167
  "block": "deals",
113
- "component": "PipelineBoard"
168
+ "component": "DealsScreen",
169
+ "icon": "Handshake",
170
+ "group": "Pipeline",
171
+ "description": "Pipeline board, forecast and deal detail"
114
172
  },
115
173
  {
116
- "label": "Analytics",
117
- "path": "/analytics",
118
- "block": "analytics",
119
- "component": "KpiTiles"
174
+ "label": "Tasks",
175
+ "path": "/tasks",
176
+ "block": "crm",
177
+ "component": "TasksScreen",
178
+ "icon": "CheckSquare",
179
+ "group": "Work",
180
+ "description": "Follow-ups due across your records"
181
+ },
182
+ {
183
+ "label": "Mailboxes",
184
+ "path": "/mailboxes",
185
+ "block": "mailboxes",
186
+ "component": "MailboxesScreen",
187
+ "icon": "Mail",
188
+ "group": "Setup",
189
+ "description": "Sending mailboxes and warmup health"
190
+ },
191
+ {
192
+ "label": "Suppressions",
193
+ "path": "/suppressions",
194
+ "block": "lists",
195
+ "component": "SuppressionsScreen",
196
+ "icon": "ShieldOff",
197
+ "group": "Setup",
198
+ "description": "People and domains you never contact"
120
199
  },
121
200
  {
122
201
  "label": "Integrations",
123
202
  "path": "/integrations",
124
203
  "block": "integrations",
125
- "component": "IntegrationList"
204
+ "component": "IntegrationsScreen",
205
+ "icon": "Plug",
206
+ "group": "Setup",
207
+ "description": "Connected tools and data sources"
126
208
  }
127
209
  ]
128
210
  }
@@ -0,0 +1,60 @@
1
+ {
2
+ "$schema": "./stack.schema.json",
3
+ "id": "calendly",
4
+ "title": "Calendly-style scheduling",
5
+ "summary": "Booking links, meetings and the contacts behind them.",
6
+ "status": "available",
7
+ "blocks": [
8
+ "foundation",
9
+ "crm",
10
+ "appointments"
11
+ ],
12
+ "home": "/meetings",
13
+ "nav": [
14
+ {
15
+ "label": "Meetings",
16
+ "path": "/meetings",
17
+ "block": "appointments",
18
+ "component": "MeetingsScreen",
19
+ "icon": "CalendarCheck",
20
+ "group": "Engage",
21
+ "description": "Booked, held and missed meetings"
22
+ },
23
+ {
24
+ "label": "Scheduling",
25
+ "path": "/scheduling",
26
+ "block": "appointments",
27
+ "component": "SchedulingScreen",
28
+ "icon": "CalendarClock",
29
+ "group": "Setup",
30
+ "description": "Booking links and event types"
31
+ },
32
+ {
33
+ "label": "Contacts",
34
+ "path": "/contacts",
35
+ "block": "crm",
36
+ "component": "ContactsScreen",
37
+ "icon": "Users",
38
+ "group": "Prospect",
39
+ "description": "People you sell to, with notes, tasks and activity"
40
+ },
41
+ {
42
+ "label": "Companies",
43
+ "path": "/companies",
44
+ "block": "crm",
45
+ "component": "CompaniesScreen",
46
+ "icon": "Building2",
47
+ "group": "Prospect",
48
+ "description": "Accounts and the people at them"
49
+ },
50
+ {
51
+ "label": "Tasks",
52
+ "path": "/tasks",
53
+ "block": "crm",
54
+ "component": "TasksScreen",
55
+ "icon": "CheckSquare",
56
+ "group": "Work",
57
+ "description": "Follow-ups due across your records"
58
+ }
59
+ ]
60
+ }
@@ -0,0 +1,15 @@
1
+ "use client";
2
+
3
+ // Generated by `graph8-sdk create {{stackId}}`. The {{block}} block's {{component}} (source in {{blockDir}}), with the
4
+ // other blocks of this app plugged into its slots. Edit freely: this file is yours.
5
+ import { CompaniesScreen } from "@/components/g8/crm/companies-screen";
6
+ import { EnrichButton } from "@/components/g8/enrichment/enrich-button";
7
+
8
+ export default function Page() {
9
+ return (
10
+ <CompaniesScreen
11
+ renderRowActions={(c, { reload }) => <EnrichButton kind="company" lookup={{ domain: c.domain ?? undefined, name: c.name ?? undefined }} record={{ ...c }} onApplied={reload} label="Enrich" size="sm" variant="ghost" />}
12
+ renderDetailActions={(c, { reload }) => <EnrichButton kind="company" lookup={{ domain: c.domain ?? undefined, name: c.name ?? undefined }} record={{ ...c }} onApplied={reload} recordLoaded label="Enrich" />}
13
+ />
14
+ );
15
+ }
@@ -0,0 +1,19 @@
1
+ "use client";
2
+
3
+ // Generated by `graph8-sdk create {{stackId}}`. The {{block}} block's {{component}} (source in {{blockDir}}), with the
4
+ // other blocks of this app plugged into its slots. Edit freely: this file is yours.
5
+ import { ContactsScreen } from "@/components/g8/crm/contacts-screen";
6
+ import { EnrichButton } from "@/components/g8/enrichment/enrich-button";
7
+
8
+ export default function Page() {
9
+ return (
10
+ <ContactsScreen
11
+ renderRowActions={(c, { reload }) => <EnrichButton kind="person" lookup={{ email: c.work_email ?? undefined, linkedin_url: c.linkedin_url ?? undefined, first_name: c.first_name ?? undefined, last_name: c.last_name ?? undefined }} record={{ ...c }} onApplied={reload} label="Enrich" size="sm" variant="ghost" />}
12
+ renderDetailActions={(c, { reload }) => (
13
+ <>
14
+ <EnrichButton kind="person" lookup={{ email: c.work_email ?? undefined, linkedin_url: c.linkedin_url ?? undefined, first_name: c.first_name ?? undefined, last_name: c.last_name ?? undefined }} record={{ ...c }} onApplied={reload} recordLoaded label="Enrich" />
15
+ </>
16
+ )}
17
+ />
18
+ );
19
+ }