@agent-native/core 0.124.0 → 0.124.2

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 (55) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +25 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/assets/branding/favicon-base64.ts +5 -0
  5. package/corpus/core/src/cli/templates-meta.ts +1 -0
  6. package/corpus/core/src/server/email.ts +2 -5
  7. package/corpus/templates/analytics/server/lib/dashboard-report-render.ts +6 -3
  8. package/corpus/templates/analytics/server/lib/report-chart-svg.ts +18 -5
  9. package/corpus/templates/crm/actions/_crm-list-utils.ts +178 -0
  10. package/corpus/templates/crm/actions/add-crm-record-to-list.ts +23 -2
  11. package/corpus/templates/crm/actions/create-crm-list.ts +229 -43
  12. package/corpus/templates/crm/actions/create-crm-record.ts +13 -5
  13. package/corpus/templates/crm/actions/update-crm-list-entry.ts +1 -1
  14. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +22 -2
  15. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +143 -32
  16. package/corpus/templates/crm/app/components/crm/board/CrmBoard.tsx +190 -75
  17. package/corpus/templates/crm/app/components/crm/grid/CrmGrid.tsx +267 -115
  18. package/corpus/templates/crm/app/components/crm/grid/GridCell.tsx +265 -131
  19. package/corpus/templates/crm/app/components/crm/record/AttributePanel.tsx +79 -100
  20. package/corpus/templates/crm/app/components/crm/record/RecordHeader.tsx +12 -8
  21. package/corpus/templates/crm/app/components/crm/record/RecordLists.tsx +27 -31
  22. package/corpus/templates/crm/app/components/crm/record/RecordTabs.tsx +16 -13
  23. package/corpus/templates/crm/app/components/crm/record/attribute-row.tsx +108 -0
  24. package/corpus/templates/crm/app/components/crm/record/field-editors.tsx +201 -9
  25. package/corpus/templates/crm/app/components/crm/record/panel-resize.ts +61 -0
  26. package/corpus/templates/crm/app/components/crm/record/record-data.ts +5 -4
  27. package/corpus/templates/crm/app/components/crm/shared/README-tokens.md +103 -0
  28. package/corpus/templates/crm/app/components/crm/shared/RecordReferencePicker.tsx +117 -0
  29. package/corpus/templates/crm/app/components/crm/shared/attribute-value.ts +84 -0
  30. package/corpus/templates/crm/app/components/crm/shared/ui-tokens.ts +89 -0
  31. package/corpus/templates/crm/app/global.css +170 -0
  32. package/corpus/templates/crm/app/i18n/en-US.ts +1 -0
  33. package/corpus/templates/crm/changelog/2026-07-26-a-half-typed-number-or-date-no-longer-saves-as-empty-the-fie.md +6 -0
  34. package/corpus/templates/crm/changelog/2026-07-26-a-new-pipeline-board-now-opens-with-stage-columns-a-summabl.md +6 -0
  35. package/corpus/templates/crm/changelog/2026-07-26-record-reference-fields-like-account-can-now-be-linked-from-.md +6 -0
  36. package/corpus/templates/crm/changelog/2026-07-26-retyping-a-record-field-now-replaces-the-old-value-instead-o.md +6 -0
  37. package/dist/assets/branding/favicon-base64.d.ts +2 -0
  38. package/dist/assets/branding/favicon-base64.d.ts.map +1 -0
  39. package/dist/assets/branding/favicon-base64.js +5 -0
  40. package/dist/assets/branding/favicon-base64.js.map +1 -0
  41. package/dist/cli/templates-meta.d.ts.map +1 -1
  42. package/dist/cli/templates-meta.js +1 -0
  43. package/dist/cli/templates-meta.js.map +1 -1
  44. package/dist/collab/routes.d.ts +1 -1
  45. package/dist/collab/struct-routes.d.ts +1 -1
  46. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  47. package/dist/notifications/routes.d.ts +3 -3
  48. package/dist/secrets/routes.d.ts +3 -3
  49. package/dist/server/email.d.ts.map +1 -1
  50. package/dist/server/email.js +2 -2
  51. package/dist/server/email.js.map +1 -1
  52. package/package.json +1 -1
  53. package/src/assets/branding/favicon-base64.ts +5 -0
  54. package/src/cli/templates-meta.ts +1 -0
  55. package/src/server/email.ts +2 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"favicon-base64.js","sourceRoot":"","sources":["../../../src/assets/branding/favicon-base64.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,0EAA0E;AAC1E,yCAAyC;AACzC,MAAM,CAAC,MAAM,kBAAkB,GAC7B,8owCAA8owC,CAAC","sourcesContent":["// @generated by scripts/build-branding-assets.mjs from favicon.png — do not edit by hand.\n// Base64 of the canonical branding PNG, inlined so it survives serverless\n// bundling (no runtime filesystem read).\nexport const FAVICON_PNG_BASE64 =\n \"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\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"templates-meta.d.ts","sourceRoot":"","sources":["../../src/cli/templates-meta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gEAAgE;IAChE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,wEAAwE;IACxE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,SAAS,EAAE,YAAY,EA2MnC,CAAC;AAEF,yEAAyE;AACzE,wBAAgB,gBAAgB,IAAI,YAAY,EAAE,CAEjD;AAED,gFAAgF;AAChF,wBAAgB,aAAa,IAAI,YAAY,EAAE,CAE9C;AAED,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAQlE;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C"}
1
+ {"version":3,"file":"templates-meta.d.ts","sourceRoot":"","sources":["../../src/cli/templates-meta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gEAAgE;IAChE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,wEAAwE;IACxE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,SAAS,EAAE,YAAY,EA4MnC,CAAC;AAEF,yEAAyE;AACzE,wBAAgB,gBAAgB,IAAI,YAAY,EAAE,CAEjD;AAED,gFAAgF;AAChF,wBAAgB,aAAa,IAAI,YAAY,EAAE,CAE9C;AAED,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAQlE;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C"}
@@ -201,6 +201,7 @@ export const TEMPLATES = [
201
201
  color: "#2563EB",
202
202
  colorRgb: "37 99 235",
203
203
  devPort: 8107,
204
+ prodUrl: "https://crm.agent-native.com",
204
205
  hidden: true,
205
206
  defaultMode: "dev",
206
207
  core: false,
@@ -1 +1 @@
1
- {"version":3,"file":"templates-meta.js","sourceRoot":"","sources":["../../src/cli/templates-meta.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * First-party template metadata used by the `agent-native` CLI.\n *\n * This file is intentionally inlined here (rather than imported from a\n * separate workspace package) so that the published `@agent-native/core`\n * has no `workspace:*` runtime dependencies. Without this inlining, `npx\n * @agent-native/core create ...` fails on a fresh machine with:\n *\n * npm error code EUNSUPPORTEDPROTOCOL\n * npm error Unsupported URL Type \"workspace:\": workspace:*\n *\n * Keep this list in sync with `packages/shared-app-config/templates.ts`,\n * which serves the same metadata to the desktop / mobile / frame packages\n * that always run inside the workspace. Duplication is intentional: the\n * CLI must remain installable outside the monorepo.\n */\n\nexport interface TemplateMeta {\n /** Directory name under templates/ and package name */\n name: string;\n /** Display name in pickers */\n label: string;\n /** One-line description shown in the picker */\n hint: string;\n /** Longer description (optional) */\n description?: string;\n /** Tabler icon name used in the desktop sidebar */\n icon: string;\n /** Hex accent color */\n color: string;\n /** CSS-safe RGB triplet (e.g. \"59 130 246\") */\n colorRgb: string;\n /** Dev server port for desktop `pnpm dev` */\n devPort: number;\n /** Production URL when running as a first-party app on agent-native.com */\n prodUrl?: string;\n /** Default URL path when deployed in a workspace (defaults to \"/<name>\") */\n prodPath?: string;\n /** Default mode when added to desktop app */\n defaultMode?: \"dev\" | \"prod\";\n /** Hide from pickers but still scaffoldable via explicit --template */\n hidden?: boolean;\n /** Include as a built-in connected A2A agent even when hidden from pickers */\n defaultAgent?: boolean;\n /** Always scaffold without prompting (e.g. chat as fallback) */\n alwaysAvailable?: boolean;\n /** Internal workspace packages this template depends on (e.g. \"scheduling\") */\n requiredPackages?: string[];\n /** Core app — featured in the CLI picker, homepage, and docs gallery */\n core?: boolean;\n}\n\nexport const TEMPLATES: TemplateMeta[] = [\n {\n name: \"calendar\",\n label: \"Calendar\",\n hint: \"Agent-native Google Calendar — manage events, sync, and public booking\",\n icon: \"CalendarDays\",\n color: \"#00B5FF\",\n colorRgb: \"0 181 255\",\n devPort: 8082,\n prodUrl: \"https://calendar.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"scheduling\"],\n core: true,\n },\n {\n name: \"content\",\n label: \"Content\",\n hint: \"Open-source Obsidian for MDX — edit local docs with agent assistance\",\n icon: \"FileText\",\n color: \"#10B981\",\n colorRgb: \"16 185 129\",\n devPort: 8083,\n prodUrl: \"https://content.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"creative-context\"],\n core: true,\n },\n {\n name: \"plan\",\n label: \"Plan\",\n hint: \"Structured visual plans and PR recaps with diagrams, wireframes, prototypes, annotations, and sharing\",\n icon: \"FileText\",\n color: \"#52525B\",\n colorRgb: \"82 82 91\",\n devPort: 8105,\n prodUrl: \"https://plan.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"slides\",\n label: \"Slides\",\n hint: \"Agent-native Google Slides — generate and edit React presentations\",\n icon: \"GalleryHorizontal\",\n color: \"#EC4899\",\n colorRgb: \"236 72 153\",\n devPort: 8086,\n prodUrl: \"https://slides.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"pinpoint\", \"creative-context\"],\n core: true,\n },\n {\n name: \"analytics\",\n label: \"Analytics\",\n hint: \"Agent-native Amplitude/Mixpanel — connect data sources, prompt for charts\",\n icon: \"BarChart2\",\n color: \"#F59E0B\",\n colorRgb: \"245 158 11\",\n devPort: 8088,\n prodUrl: \"https://analytics.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"creative-context\"],\n core: true,\n },\n {\n name: \"mail\",\n label: \"Mail\",\n hint: \"Agent-native Superhuman — email client with keyboard shortcuts and AI triage\",\n icon: \"Mail\",\n color: \"#3B82F6\",\n colorRgb: \"59 130 246\",\n devPort: 8085,\n prodUrl: \"https://mail.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"dispatch\",\n label: \"Dispatch\",\n hint: \"Central Slack/Telegram router with jobs, memory, approvals, and A2A delegation\",\n icon: \"MessageCircle\",\n color: \"#14B8A6\",\n colorRgb: \"20 184 166\",\n devPort: 8092,\n prodUrl: \"https://dispatch.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"forms\",\n label: \"Forms\",\n hint: \"Agent-native form builder — create, edit, and manage forms\",\n icon: \"ClipboardList\",\n color: \"#06B6D4\",\n colorRgb: \"6 182 212\",\n devPort: 8084,\n prodUrl: \"https://forms.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"chat\",\n label: \"Chat\",\n hint: \"Minimal chat-first app with durable threads, actions, and the app-agent loop\",\n icon: \"MessageCircle\",\n color: \"#18181B\",\n colorRgb: \"24 24 27\",\n devPort: 8089,\n prodUrl: \"https://chat.agent-native.com\",\n defaultMode: \"prod\",\n alwaysAvailable: true,\n core: true,\n },\n {\n name: \"clips\",\n label: \"Clips\",\n hint: \"Screen recording, meeting notes, and voice dictation — all with AI\",\n icon: \"ScreenShare\",\n color: \"#0EA5E9\",\n colorRgb: \"14 165 233\",\n devPort: 8094,\n prodUrl: \"https://clips.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"brain\",\n label: \"Brain\",\n hint: \"Cited company knowledge from Slack, meetings, transcripts, and decisions\",\n icon: \"Brain\",\n color: \"#8B5CF6\",\n colorRgb: \"139 92 246\",\n devPort: 8102,\n prodUrl: \"https://brain.agent-native.com\",\n defaultMode: \"prod\",\n defaultAgent: true,\n core: true,\n },\n {\n name: \"design\",\n label: \"Design\",\n hint: \"Agent-native design tool — create and edit visual designs with agent assistance\",\n icon: \"Brush\",\n color: \"#F472B6\",\n colorRgb: \"244 114 182\",\n devPort: 8099,\n prodUrl: \"https://design.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"pinpoint\", \"embedding\", \"creative-context\"],\n core: true,\n },\n {\n name: \"assets\",\n label: \"Assets\",\n hint: \"Digital asset manager — upload, organize, search, and generate on-brand images and videos\",\n icon: \"Photo\",\n color: \"#0F766E\",\n colorRgb: \"15 118 110\",\n devPort: 8100,\n prodUrl: \"https://assets.agent-native.com\",\n defaultMode: \"prod\",\n defaultAgent: true,\n requiredPackages: [\"embedding\", \"creative-context\"],\n core: true,\n },\n {\n name: \"tasks\",\n label: \"Tasks\",\n hint: \"Task-list-first workspace — inbox capture, custom fields, and drag-and-drop ordering\",\n icon: \"ListCheck\",\n color: \"#6366F1\",\n colorRgb: \"99 102 241\",\n devPort: 8091,\n prodUrl: \"https://tasks.agent-native.com\",\n defaultMode: \"prod\",\n hidden: true,\n core: false,\n },\n {\n name: \"crm\",\n label: \"CRM\",\n hint: \"Agent-native CRM over native SQL, HubSpot, or Salesforce — typed attributes, lists, pipelines, and evidence-grounded signals\",\n icon: \"Users\",\n color: \"#2563EB\",\n colorRgb: \"37 99 235\",\n devPort: 8107,\n hidden: true,\n defaultMode: \"dev\",\n core: false,\n },\n {\n name: \"macros\",\n label: \"Macros\",\n hint: \"Internal template — not shown in pickers\",\n icon: \"Code\",\n color: \"#71717A\",\n colorRgb: \"113 113 122\",\n devPort: 8093,\n prodUrl: \"https://macros.agent-native.com\",\n hidden: true,\n defaultMode: \"dev\",\n },\n];\n\n/** Return templates visible in user-facing pickers (excludes hidden). */\nexport function visibleTemplates(): TemplateMeta[] {\n return TEMPLATES.filter((t) => !t.hidden);\n}\n\n/** Return core templates — the featured set shown in CLI pickers by default. */\nexport function coreTemplates(): TemplateMeta[] {\n return TEMPLATES.filter((t) => t.core);\n}\n\n/** Lookup by name. Returns undefined for unknown names. */\nexport function getTemplate(name: string): TemplateMeta | undefined {\n // Tolerate legacy / renamed aliases.\n if (name === \"starter\") name = \"chat\";\n if (name === \"image\" || name === \"images\" || name === \"asset\") {\n name = \"assets\";\n }\n if (name === \"contracts\" || name === \"visual-plans\") name = \"plan\";\n return TEMPLATES.find((t) => t.name === name);\n}\n\n/** Names of all templates (including hidden) for validation. */\nexport function allTemplateNames(): string[] {\n return TEMPLATES.map((t) => t.name);\n}\n"]}
1
+ {"version":3,"file":"templates-meta.js","sourceRoot":"","sources":["../../src/cli/templates-meta.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * First-party template metadata used by the `agent-native` CLI.\n *\n * This file is intentionally inlined here (rather than imported from a\n * separate workspace package) so that the published `@agent-native/core`\n * has no `workspace:*` runtime dependencies. Without this inlining, `npx\n * @agent-native/core create ...` fails on a fresh machine with:\n *\n * npm error code EUNSUPPORTEDPROTOCOL\n * npm error Unsupported URL Type \"workspace:\": workspace:*\n *\n * Keep this list in sync with `packages/shared-app-config/templates.ts`,\n * which serves the same metadata to the desktop / mobile / frame packages\n * that always run inside the workspace. Duplication is intentional: the\n * CLI must remain installable outside the monorepo.\n */\n\nexport interface TemplateMeta {\n /** Directory name under templates/ and package name */\n name: string;\n /** Display name in pickers */\n label: string;\n /** One-line description shown in the picker */\n hint: string;\n /** Longer description (optional) */\n description?: string;\n /** Tabler icon name used in the desktop sidebar */\n icon: string;\n /** Hex accent color */\n color: string;\n /** CSS-safe RGB triplet (e.g. \"59 130 246\") */\n colorRgb: string;\n /** Dev server port for desktop `pnpm dev` */\n devPort: number;\n /** Production URL when running as a first-party app on agent-native.com */\n prodUrl?: string;\n /** Default URL path when deployed in a workspace (defaults to \"/<name>\") */\n prodPath?: string;\n /** Default mode when added to desktop app */\n defaultMode?: \"dev\" | \"prod\";\n /** Hide from pickers but still scaffoldable via explicit --template */\n hidden?: boolean;\n /** Include as a built-in connected A2A agent even when hidden from pickers */\n defaultAgent?: boolean;\n /** Always scaffold without prompting (e.g. chat as fallback) */\n alwaysAvailable?: boolean;\n /** Internal workspace packages this template depends on (e.g. \"scheduling\") */\n requiredPackages?: string[];\n /** Core app — featured in the CLI picker, homepage, and docs gallery */\n core?: boolean;\n}\n\nexport const TEMPLATES: TemplateMeta[] = [\n {\n name: \"calendar\",\n label: \"Calendar\",\n hint: \"Agent-native Google Calendar — manage events, sync, and public booking\",\n icon: \"CalendarDays\",\n color: \"#00B5FF\",\n colorRgb: \"0 181 255\",\n devPort: 8082,\n prodUrl: \"https://calendar.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"scheduling\"],\n core: true,\n },\n {\n name: \"content\",\n label: \"Content\",\n hint: \"Open-source Obsidian for MDX — edit local docs with agent assistance\",\n icon: \"FileText\",\n color: \"#10B981\",\n colorRgb: \"16 185 129\",\n devPort: 8083,\n prodUrl: \"https://content.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"creative-context\"],\n core: true,\n },\n {\n name: \"plan\",\n label: \"Plan\",\n hint: \"Structured visual plans and PR recaps with diagrams, wireframes, prototypes, annotations, and sharing\",\n icon: \"FileText\",\n color: \"#52525B\",\n colorRgb: \"82 82 91\",\n devPort: 8105,\n prodUrl: \"https://plan.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"slides\",\n label: \"Slides\",\n hint: \"Agent-native Google Slides — generate and edit React presentations\",\n icon: \"GalleryHorizontal\",\n color: \"#EC4899\",\n colorRgb: \"236 72 153\",\n devPort: 8086,\n prodUrl: \"https://slides.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"pinpoint\", \"creative-context\"],\n core: true,\n },\n {\n name: \"analytics\",\n label: \"Analytics\",\n hint: \"Agent-native Amplitude/Mixpanel — connect data sources, prompt for charts\",\n icon: \"BarChart2\",\n color: \"#F59E0B\",\n colorRgb: \"245 158 11\",\n devPort: 8088,\n prodUrl: \"https://analytics.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"creative-context\"],\n core: true,\n },\n {\n name: \"mail\",\n label: \"Mail\",\n hint: \"Agent-native Superhuman — email client with keyboard shortcuts and AI triage\",\n icon: \"Mail\",\n color: \"#3B82F6\",\n colorRgb: \"59 130 246\",\n devPort: 8085,\n prodUrl: \"https://mail.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"dispatch\",\n label: \"Dispatch\",\n hint: \"Central Slack/Telegram router with jobs, memory, approvals, and A2A delegation\",\n icon: \"MessageCircle\",\n color: \"#14B8A6\",\n colorRgb: \"20 184 166\",\n devPort: 8092,\n prodUrl: \"https://dispatch.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"forms\",\n label: \"Forms\",\n hint: \"Agent-native form builder — create, edit, and manage forms\",\n icon: \"ClipboardList\",\n color: \"#06B6D4\",\n colorRgb: \"6 182 212\",\n devPort: 8084,\n prodUrl: \"https://forms.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"chat\",\n label: \"Chat\",\n hint: \"Minimal chat-first app with durable threads, actions, and the app-agent loop\",\n icon: \"MessageCircle\",\n color: \"#18181B\",\n colorRgb: \"24 24 27\",\n devPort: 8089,\n prodUrl: \"https://chat.agent-native.com\",\n defaultMode: \"prod\",\n alwaysAvailable: true,\n core: true,\n },\n {\n name: \"clips\",\n label: \"Clips\",\n hint: \"Screen recording, meeting notes, and voice dictation — all with AI\",\n icon: \"ScreenShare\",\n color: \"#0EA5E9\",\n colorRgb: \"14 165 233\",\n devPort: 8094,\n prodUrl: \"https://clips.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"brain\",\n label: \"Brain\",\n hint: \"Cited company knowledge from Slack, meetings, transcripts, and decisions\",\n icon: \"Brain\",\n color: \"#8B5CF6\",\n colorRgb: \"139 92 246\",\n devPort: 8102,\n prodUrl: \"https://brain.agent-native.com\",\n defaultMode: \"prod\",\n defaultAgent: true,\n core: true,\n },\n {\n name: \"design\",\n label: \"Design\",\n hint: \"Agent-native design tool — create and edit visual designs with agent assistance\",\n icon: \"Brush\",\n color: \"#F472B6\",\n colorRgb: \"244 114 182\",\n devPort: 8099,\n prodUrl: \"https://design.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"pinpoint\", \"embedding\", \"creative-context\"],\n core: true,\n },\n {\n name: \"assets\",\n label: \"Assets\",\n hint: \"Digital asset manager — upload, organize, search, and generate on-brand images and videos\",\n icon: \"Photo\",\n color: \"#0F766E\",\n colorRgb: \"15 118 110\",\n devPort: 8100,\n prodUrl: \"https://assets.agent-native.com\",\n defaultMode: \"prod\",\n defaultAgent: true,\n requiredPackages: [\"embedding\", \"creative-context\"],\n core: true,\n },\n {\n name: \"tasks\",\n label: \"Tasks\",\n hint: \"Task-list-first workspace — inbox capture, custom fields, and drag-and-drop ordering\",\n icon: \"ListCheck\",\n color: \"#6366F1\",\n colorRgb: \"99 102 241\",\n devPort: 8091,\n prodUrl: \"https://tasks.agent-native.com\",\n defaultMode: \"prod\",\n hidden: true,\n core: false,\n },\n {\n name: \"crm\",\n label: \"CRM\",\n hint: \"Agent-native CRM over native SQL, HubSpot, or Salesforce — typed attributes, lists, pipelines, and evidence-grounded signals\",\n icon: \"Users\",\n color: \"#2563EB\",\n colorRgb: \"37 99 235\",\n devPort: 8107,\n prodUrl: \"https://crm.agent-native.com\",\n hidden: true,\n defaultMode: \"dev\",\n core: false,\n },\n {\n name: \"macros\",\n label: \"Macros\",\n hint: \"Internal template — not shown in pickers\",\n icon: \"Code\",\n color: \"#71717A\",\n colorRgb: \"113 113 122\",\n devPort: 8093,\n prodUrl: \"https://macros.agent-native.com\",\n hidden: true,\n defaultMode: \"dev\",\n },\n];\n\n/** Return templates visible in user-facing pickers (excludes hidden). */\nexport function visibleTemplates(): TemplateMeta[] {\n return TEMPLATES.filter((t) => !t.hidden);\n}\n\n/** Return core templates — the featured set shown in CLI pickers by default. */\nexport function coreTemplates(): TemplateMeta[] {\n return TEMPLATES.filter((t) => t.core);\n}\n\n/** Lookup by name. Returns undefined for unknown names. */\nexport function getTemplate(name: string): TemplateMeta | undefined {\n // Tolerate legacy / renamed aliases.\n if (name === \"starter\") name = \"chat\";\n if (name === \"image\" || name === \"images\" || name === \"asset\") {\n name = \"assets\";\n }\n if (name === \"contracts\" || name === \"visual-plans\") name = \"plan\";\n return TEMPLATES.find((t) => t.name === name);\n}\n\n/** Names of all templates (including hidden) for validation. */\nexport function allTemplateNames(): string[] {\n return TEMPLATES.map((t) => t.name);\n}\n"]}
@@ -41,9 +41,9 @@ export declare const postCollabUpdate: import("h3").EventHandlerWithFetch<import
41
41
  * Body: { text: string, fieldName?: string, requestSource?: string }
42
42
  */
43
43
  export declare const postCollabText: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
44
+ text?: undefined;
44
45
  ok?: undefined;
45
46
  error: string;
46
- text?: undefined;
47
47
  } | {
48
48
  error?: undefined;
49
49
  ok: boolean;
@@ -13,8 +13,8 @@
13
13
  * Body: { json: any, fieldName?: string, type?: "map"|"array", requestSource?: string }
14
14
  */
15
15
  export declare const postCollabJson: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
16
- error: string;
17
16
  ok?: undefined;
17
+ error: string;
18
18
  } | {
19
19
  error?: undefined;
20
20
  ok: boolean;
@@ -17,12 +17,12 @@ declare const _default: import("../../action.js").ActionDefinition<{
17
17
  id?: undefined;
18
18
  provider?: undefined;
19
19
  } | {
20
+ error?: undefined;
20
21
  configured?: undefined;
21
22
  connectPath?: undefined;
22
23
  url: string;
23
24
  id: string;
24
25
  provider: string;
25
- error?: undefined;
26
26
  }>;
27
27
  export default _default;
28
28
  //# sourceMappingURL=upload-image.d.ts.map
@@ -13,13 +13,13 @@
13
13
  export declare function createNotificationsHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<"" | import("./types.js").Notification[] | {
14
14
  count: number;
15
15
  updated?: undefined;
16
- ok?: undefined;
17
16
  error?: undefined;
17
+ ok?: undefined;
18
18
  } | {
19
19
  count?: undefined;
20
20
  updated: number;
21
- ok?: undefined;
22
21
  error?: undefined;
22
+ ok?: undefined;
23
23
  } | {
24
24
  count?: undefined;
25
25
  updated?: undefined;
@@ -28,7 +28,7 @@ export declare function createNotificationsHandler(): import("h3").EventHandlerW
28
28
  } | {
29
29
  count?: undefined;
30
30
  updated?: undefined;
31
- ok: boolean;
32
31
  error?: undefined;
32
+ ok: boolean;
33
33
  }>>;
34
34
  //# sourceMappingURL=routes.d.ts.map
@@ -34,16 +34,16 @@ export declare function createListSecretsHandler(): import("h3").EventHandlerWit
34
34
  /** POST /_agent-native/secrets/:key — write a secret. */
35
35
  export declare function createWriteSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
36
36
  error: string;
37
- status?: undefined;
38
37
  ok?: undefined;
38
+ status?: undefined;
39
39
  } | {
40
40
  ok: boolean;
41
41
  status: string;
42
42
  error?: undefined;
43
43
  } | {
44
+ ok?: undefined;
44
45
  error: string;
45
46
  removed?: undefined;
46
- ok?: undefined;
47
47
  } | {
48
48
  ok: boolean;
49
49
  removed: boolean;
@@ -54,9 +54,9 @@ export declare function createWriteSecretHandler(): import("h3").EventHandlerWit
54
54
  * current stored value without changing anything. Useful for the "Test" button.
55
55
  */
56
56
  export declare function createTestSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
57
+ ok?: undefined;
57
58
  error: string;
58
59
  note?: undefined;
59
- ok?: undefined;
60
60
  } | {
61
61
  ok: boolean;
62
62
  note?: undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/server/email.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC;CACvC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAiED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE1D;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAE/D;AA0ID,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBlE"}
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/server/email.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC;CACvC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA+DD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE1D;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAE/D;AA0ID,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBlE"}
@@ -9,12 +9,12 @@
9
9
  * With neither provider configured, `sendEmail` logs the message to the console
10
10
  * so the reset-password flow still works end-to-end for local development.
11
11
  */
12
- import { readFileSync } from "node:fs";
12
+ import { FAVICON_PNG_BASE64 } from "../assets/branding/favicon-base64.js";
13
13
  import { resolveSecret } from "./credential-provider.js";
14
14
  import { AGENT_NATIVE_EMAIL_LOGO_CONTENT_ID } from "./email-template.js";
15
15
  let cachedAgentNativeLogo;
16
16
  function getAgentNativeLogoAttachment() {
17
- cachedAgentNativeLogo ??= readFileSync(new URL("../../src/assets/branding/favicon.png", import.meta.url));
17
+ cachedAgentNativeLogo ??= Buffer.from(FAVICON_PNG_BASE64, "base64");
18
18
  return {
19
19
  filename: "agent-native-logo.png",
20
20
  content: cachedAgentNativeLogo,
@@ -1 +1 @@
1
- {"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/server/email.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Email transport for system emails (password resets, invitations, notifications).\n *\n * Providers are selected by scoped secrets:\n * RESEND_API_KEY — https://resend.com\n * SENDGRID_API_KEY — https://sendgrid.com\n * EMAIL_FROM — \"Name <addr@domain>\" (optional; defaults to Resend's sandbox)\n *\n * With neither provider configured, `sendEmail` logs the message to the console\n * so the reset-password flow still works end-to-end for local development.\n */\n\nimport { readFileSync } from \"node:fs\";\n\nimport { resolveSecret } from \"./credential-provider.js\";\nimport { AGENT_NATIVE_EMAIL_LOGO_CONTENT_ID } from \"./email-template.js\";\n\nexport type EmailProvider = \"resend\" | \"sendgrid\" | \"dev\";\n\nexport interface EmailAttachment {\n filename: string;\n content: string | Buffer;\n contentType?: string;\n contentId?: string;\n disposition?: \"attachment\" | \"inline\";\n}\n\nexport interface SendEmailArgs {\n to: string;\n subject: string;\n html: string;\n text?: string;\n from?: string;\n cc?: string | string[];\n replyTo?: string;\n inReplyTo?: string;\n references?: string;\n attachments?: EmailAttachment[];\n timeoutMs?: number;\n}\n\nlet cachedAgentNativeLogo: Buffer | undefined;\n\nfunction getAgentNativeLogoAttachment(): EmailAttachment {\n cachedAgentNativeLogo ??= readFileSync(\n new URL(\"../../src/assets/branding/favicon.png\", import.meta.url),\n );\n return {\n filename: \"agent-native-logo.png\",\n content: cachedAgentNativeLogo,\n contentType: \"image/png\",\n contentId: AGENT_NATIVE_EMAIL_LOGO_CONTENT_ID,\n disposition: \"inline\",\n };\n}\n\nfunction resolveAttachments(\n args: SendEmailArgs,\n): EmailAttachment[] | undefined {\n if (!args.html.includes(`cid:${AGENT_NATIVE_EMAIL_LOGO_CONTENT_ID}`)) {\n return args.attachments;\n }\n if (\n args.attachments?.some(\n (attachment) =>\n attachment.contentId === AGENT_NATIVE_EMAIL_LOGO_CONTENT_ID,\n )\n ) {\n return args.attachments;\n }\n return [...(args.attachments ?? []), getAgentNativeLogoAttachment()];\n}\n\ninterface EmailTransportConfig {\n provider: EmailProvider;\n resendApiKey?: string;\n sendgridApiKey?: string;\n from?: string;\n}\n\nasync function resolveEmailTransport(): Promise<EmailTransportConfig> {\n const [resendApiKey, sendgridApiKey, from] = await Promise.all([\n resolveSecret(\"RESEND_API_KEY\"),\n resolveSecret(\"SENDGRID_API_KEY\"),\n resolveSecret(\"EMAIL_FROM\"),\n ]);\n const resolvedFrom = from ?? undefined;\n if (resendApiKey) {\n return {\n provider: \"resend\",\n resendApiKey,\n from: resolvedFrom,\n };\n }\n if (sendgridApiKey) {\n return {\n provider: \"sendgrid\",\n sendgridApiKey,\n from: resolvedFrom,\n };\n }\n return { provider: \"dev\", from: resolvedFrom };\n}\n\nexport async function isEmailConfigured(): Promise<boolean> {\n return (await resolveEmailTransport()).provider !== \"dev\";\n}\n\nexport async function getEmailProvider(): Promise<EmailProvider> {\n return (await resolveEmailTransport()).provider;\n}\n\nfunction getFromAddress(\n config: EmailTransportConfig,\n override?: string,\n): string {\n const explicit = override || config.from;\n if (explicit) return explicit;\n // Resend lets unverified accounts send from its sandbox domain; SendGrid\n // does not, so falling back there would cause silent 403s at runtime.\n if (config.provider === \"sendgrid\") {\n throw new Error(\n \"EMAIL_FROM is required when using SendGrid — save it as a verified sender address.\",\n );\n }\n return \"Agent Native <onboarding@resend.dev>\";\n}\n\nasync function sendEmailWithSignal(\n args: SendEmailArgs,\n signal?: AbortSignal,\n): Promise<void> {\n const config = await resolveEmailTransport();\n signal?.throwIfAborted();\n const provider = config.provider;\n const from = getFromAddress(config, args.from);\n const attachments = resolveAttachments(args);\n\n if (provider === \"resend\") {\n const payload: Record<string, unknown> = {\n from,\n to: args.to,\n subject: args.subject,\n html: args.html,\n text: args.text,\n };\n if (args.cc) payload.cc = Array.isArray(args.cc) ? args.cc : [args.cc];\n if (args.replyTo) payload.reply_to = args.replyTo;\n if (attachments?.length) {\n payload.attachments = attachments.map((a) => ({\n filename: a.filename,\n content:\n typeof a.content === \"string\"\n ? a.content\n : a.content.toString(\"base64\"),\n content_type: a.contentType,\n content_id: a.contentId,\n }));\n }\n const headers: Record<string, string> = {};\n if (args.inReplyTo) headers[\"In-Reply-To\"] = args.inReplyTo;\n if (args.references) headers[\"References\"] = args.references;\n if (Object.keys(headers).length) payload.headers = headers;\n\n const res = await fetch(\"https://api.resend.com/emails\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.resendApiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n signal,\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`Resend error ${res.status}: ${body}`);\n }\n return;\n }\n\n if (provider === \"sendgrid\") {\n const personalization: Record<string, unknown> = {\n to: [{ email: args.to }],\n };\n if (args.cc) {\n const ccList = Array.isArray(args.cc) ? args.cc : [args.cc];\n personalization.cc = ccList.map((email) => ({ email }));\n }\n\n const sgPayload: Record<string, unknown> = {\n personalizations: [personalization],\n from: parseSendGridFrom(from),\n subject: args.subject,\n content: [\n ...(args.text ? [{ type: \"text/plain\", value: args.text }] : []),\n { type: \"text/html\", value: args.html },\n ],\n };\n if (args.replyTo) sgPayload.reply_to = parseSendGridFrom(args.replyTo);\n const sgHeaders: Record<string, string> = {};\n if (args.inReplyTo) sgHeaders[\"In-Reply-To\"] = args.inReplyTo;\n if (args.references) sgHeaders[\"References\"] = args.references;\n if (Object.keys(sgHeaders).length) sgPayload.headers = sgHeaders;\n if (attachments?.length) {\n sgPayload.attachments = attachments.map((a) => ({\n filename: a.filename,\n content:\n typeof a.content === \"string\"\n ? Buffer.from(a.content).toString(\"base64\")\n : a.content.toString(\"base64\"),\n type: a.contentType,\n disposition: a.disposition ?? (a.contentId ? \"inline\" : undefined),\n content_id: a.contentId,\n }));\n }\n\n const res = await fetch(\"https://api.sendgrid.com/v3/mail/send\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.sendgridApiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(sgPayload),\n signal,\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`SendGrid error ${res.status}: ${body}`);\n }\n return;\n }\n\n // Dev fallback — no provider configured. Logging the full body exposes\n // reset tokens, so only do it outside production. In production, refuse\n // to send rather than silently leaking secrets to logs.\n if (process.env.NODE_ENV === \"production\") {\n throw new Error(\n \"No email provider configured. Save RESEND_API_KEY or SENDGRID_API_KEY in settings.\",\n );\n }\n console.log(\n `\\n[agent-native:email] No email provider configured. ` +\n `Save RESEND_API_KEY or SENDGRID_API_KEY in settings to send real emails.\\n` +\n `---\\nTo: ${args.to}\\nFrom: ${from}\\nSubject: ${args.subject}\\n\\n` +\n `${args.text || stripHtml(args.html)}\\n---\\n`,\n );\n}\n\nexport async function sendEmail(args: SendEmailArgs): Promise<void> {\n const requestedTimeoutMs = Number(args.timeoutMs);\n if (!Number.isFinite(requestedTimeoutMs) || requestedTimeoutMs <= 0) {\n return sendEmailWithSignal(args);\n }\n\n const timeoutMs = Math.floor(requestedTimeoutMs);\n const controller = new AbortController();\n const timeoutError = new Error(`Email send timed out after ${timeoutMs}ms`);\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n sendEmailWithSignal(args, controller.signal),\n new Promise<never>((_, reject) => {\n timeout = setTimeout(() => {\n controller.abort(timeoutError);\n reject(timeoutError);\n }, timeoutMs);\n }),\n ]);\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\nfunction parseSendGridFrom(from: string): { email: string; name?: string } {\n const m = from.match(/^\\s*(.*?)\\s*<(.+)>\\s*$/);\n if (m && m[2]) return { name: m[1] || undefined, email: m[2] };\n return { email: from.trim() };\n}\n\nfunction stripHtml(html: string): string {\n return html\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<\\/p>/gi, \"\\n\\n\")\n .replace(/<[^>]+>/g, \"\")\n .replace(/&nbsp;/g, \" \")\n .trim();\n}\n"]}
1
+ {"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/server/email.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Email transport for system emails (password resets, invitations, notifications).\n *\n * Providers are selected by scoped secrets:\n * RESEND_API_KEY — https://resend.com\n * SENDGRID_API_KEY — https://sendgrid.com\n * EMAIL_FROM — \"Name <addr@domain>\" (optional; defaults to Resend's sandbox)\n *\n * With neither provider configured, `sendEmail` logs the message to the console\n * so the reset-password flow still works end-to-end for local development.\n */\n\nimport { FAVICON_PNG_BASE64 } from \"../assets/branding/favicon-base64.js\";\nimport { resolveSecret } from \"./credential-provider.js\";\nimport { AGENT_NATIVE_EMAIL_LOGO_CONTENT_ID } from \"./email-template.js\";\n\nexport type EmailProvider = \"resend\" | \"sendgrid\" | \"dev\";\n\nexport interface EmailAttachment {\n filename: string;\n content: string | Buffer;\n contentType?: string;\n contentId?: string;\n disposition?: \"attachment\" | \"inline\";\n}\n\nexport interface SendEmailArgs {\n to: string;\n subject: string;\n html: string;\n text?: string;\n from?: string;\n cc?: string | string[];\n replyTo?: string;\n inReplyTo?: string;\n references?: string;\n attachments?: EmailAttachment[];\n timeoutMs?: number;\n}\n\nlet cachedAgentNativeLogo: Buffer | undefined;\n\nfunction getAgentNativeLogoAttachment(): EmailAttachment {\n cachedAgentNativeLogo ??= Buffer.from(FAVICON_PNG_BASE64, \"base64\");\n return {\n filename: \"agent-native-logo.png\",\n content: cachedAgentNativeLogo,\n contentType: \"image/png\",\n contentId: AGENT_NATIVE_EMAIL_LOGO_CONTENT_ID,\n disposition: \"inline\",\n };\n}\n\nfunction resolveAttachments(\n args: SendEmailArgs,\n): EmailAttachment[] | undefined {\n if (!args.html.includes(`cid:${AGENT_NATIVE_EMAIL_LOGO_CONTENT_ID}`)) {\n return args.attachments;\n }\n if (\n args.attachments?.some(\n (attachment) =>\n attachment.contentId === AGENT_NATIVE_EMAIL_LOGO_CONTENT_ID,\n )\n ) {\n return args.attachments;\n }\n return [...(args.attachments ?? []), getAgentNativeLogoAttachment()];\n}\n\ninterface EmailTransportConfig {\n provider: EmailProvider;\n resendApiKey?: string;\n sendgridApiKey?: string;\n from?: string;\n}\n\nasync function resolveEmailTransport(): Promise<EmailTransportConfig> {\n const [resendApiKey, sendgridApiKey, from] = await Promise.all([\n resolveSecret(\"RESEND_API_KEY\"),\n resolveSecret(\"SENDGRID_API_KEY\"),\n resolveSecret(\"EMAIL_FROM\"),\n ]);\n const resolvedFrom = from ?? undefined;\n if (resendApiKey) {\n return {\n provider: \"resend\",\n resendApiKey,\n from: resolvedFrom,\n };\n }\n if (sendgridApiKey) {\n return {\n provider: \"sendgrid\",\n sendgridApiKey,\n from: resolvedFrom,\n };\n }\n return { provider: \"dev\", from: resolvedFrom };\n}\n\nexport async function isEmailConfigured(): Promise<boolean> {\n return (await resolveEmailTransport()).provider !== \"dev\";\n}\n\nexport async function getEmailProvider(): Promise<EmailProvider> {\n return (await resolveEmailTransport()).provider;\n}\n\nfunction getFromAddress(\n config: EmailTransportConfig,\n override?: string,\n): string {\n const explicit = override || config.from;\n if (explicit) return explicit;\n // Resend lets unverified accounts send from its sandbox domain; SendGrid\n // does not, so falling back there would cause silent 403s at runtime.\n if (config.provider === \"sendgrid\") {\n throw new Error(\n \"EMAIL_FROM is required when using SendGrid — save it as a verified sender address.\",\n );\n }\n return \"Agent Native <onboarding@resend.dev>\";\n}\n\nasync function sendEmailWithSignal(\n args: SendEmailArgs,\n signal?: AbortSignal,\n): Promise<void> {\n const config = await resolveEmailTransport();\n signal?.throwIfAborted();\n const provider = config.provider;\n const from = getFromAddress(config, args.from);\n const attachments = resolveAttachments(args);\n\n if (provider === \"resend\") {\n const payload: Record<string, unknown> = {\n from,\n to: args.to,\n subject: args.subject,\n html: args.html,\n text: args.text,\n };\n if (args.cc) payload.cc = Array.isArray(args.cc) ? args.cc : [args.cc];\n if (args.replyTo) payload.reply_to = args.replyTo;\n if (attachments?.length) {\n payload.attachments = attachments.map((a) => ({\n filename: a.filename,\n content:\n typeof a.content === \"string\"\n ? a.content\n : a.content.toString(\"base64\"),\n content_type: a.contentType,\n content_id: a.contentId,\n }));\n }\n const headers: Record<string, string> = {};\n if (args.inReplyTo) headers[\"In-Reply-To\"] = args.inReplyTo;\n if (args.references) headers[\"References\"] = args.references;\n if (Object.keys(headers).length) payload.headers = headers;\n\n const res = await fetch(\"https://api.resend.com/emails\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.resendApiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n signal,\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`Resend error ${res.status}: ${body}`);\n }\n return;\n }\n\n if (provider === \"sendgrid\") {\n const personalization: Record<string, unknown> = {\n to: [{ email: args.to }],\n };\n if (args.cc) {\n const ccList = Array.isArray(args.cc) ? args.cc : [args.cc];\n personalization.cc = ccList.map((email) => ({ email }));\n }\n\n const sgPayload: Record<string, unknown> = {\n personalizations: [personalization],\n from: parseSendGridFrom(from),\n subject: args.subject,\n content: [\n ...(args.text ? [{ type: \"text/plain\", value: args.text }] : []),\n { type: \"text/html\", value: args.html },\n ],\n };\n if (args.replyTo) sgPayload.reply_to = parseSendGridFrom(args.replyTo);\n const sgHeaders: Record<string, string> = {};\n if (args.inReplyTo) sgHeaders[\"In-Reply-To\"] = args.inReplyTo;\n if (args.references) sgHeaders[\"References\"] = args.references;\n if (Object.keys(sgHeaders).length) sgPayload.headers = sgHeaders;\n if (attachments?.length) {\n sgPayload.attachments = attachments.map((a) => ({\n filename: a.filename,\n content:\n typeof a.content === \"string\"\n ? Buffer.from(a.content).toString(\"base64\")\n : a.content.toString(\"base64\"),\n type: a.contentType,\n disposition: a.disposition ?? (a.contentId ? \"inline\" : undefined),\n content_id: a.contentId,\n }));\n }\n\n const res = await fetch(\"https://api.sendgrid.com/v3/mail/send\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.sendgridApiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(sgPayload),\n signal,\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`SendGrid error ${res.status}: ${body}`);\n }\n return;\n }\n\n // Dev fallback — no provider configured. Logging the full body exposes\n // reset tokens, so only do it outside production. In production, refuse\n // to send rather than silently leaking secrets to logs.\n if (process.env.NODE_ENV === \"production\") {\n throw new Error(\n \"No email provider configured. Save RESEND_API_KEY or SENDGRID_API_KEY in settings.\",\n );\n }\n console.log(\n `\\n[agent-native:email] No email provider configured. ` +\n `Save RESEND_API_KEY or SENDGRID_API_KEY in settings to send real emails.\\n` +\n `---\\nTo: ${args.to}\\nFrom: ${from}\\nSubject: ${args.subject}\\n\\n` +\n `${args.text || stripHtml(args.html)}\\n---\\n`,\n );\n}\n\nexport async function sendEmail(args: SendEmailArgs): Promise<void> {\n const requestedTimeoutMs = Number(args.timeoutMs);\n if (!Number.isFinite(requestedTimeoutMs) || requestedTimeoutMs <= 0) {\n return sendEmailWithSignal(args);\n }\n\n const timeoutMs = Math.floor(requestedTimeoutMs);\n const controller = new AbortController();\n const timeoutError = new Error(`Email send timed out after ${timeoutMs}ms`);\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n sendEmailWithSignal(args, controller.signal),\n new Promise<never>((_, reject) => {\n timeout = setTimeout(() => {\n controller.abort(timeoutError);\n reject(timeoutError);\n }, timeoutMs);\n }),\n ]);\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\nfunction parseSendGridFrom(from: string): { email: string; name?: string } {\n const m = from.match(/^\\s*(.*?)\\s*<(.+)>\\s*$/);\n if (m && m[2]) return { name: m[1] || undefined, email: m[2] };\n return { email: from.trim() };\n}\n\nfunction stripHtml(html: string): string {\n return html\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<\\/p>/gi, \"\\n\\n\")\n .replace(/<[^>]+>/g, \"\")\n .replace(/&nbsp;/g, \" \")\n .trim();\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.124.0",
3
+ "version": "0.124.2",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -0,0 +1,5 @@
1
+ // @generated by scripts/build-branding-assets.mjs from favicon.png — do not edit by hand.
2
+ // Base64 of the canonical branding PNG, inlined so it survives serverless
3
+ // bundling (no runtime filesystem read).
4
+ export const FAVICON_PNG_BASE64 =
5
+ "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";
@@ -237,6 +237,7 @@ export const TEMPLATES: TemplateMeta[] = [
237
237
  color: "#2563EB",
238
238
  colorRgb: "37 99 235",
239
239
  devPort: 8107,
240
+ prodUrl: "https://crm.agent-native.com",
240
241
  hidden: true,
241
242
  defaultMode: "dev",
242
243
  core: false,
@@ -10,8 +10,7 @@
10
10
  * so the reset-password flow still works end-to-end for local development.
11
11
  */
12
12
 
13
- import { readFileSync } from "node:fs";
14
-
13
+ import { FAVICON_PNG_BASE64 } from "../assets/branding/favicon-base64.js";
15
14
  import { resolveSecret } from "./credential-provider.js";
16
15
  import { AGENT_NATIVE_EMAIL_LOGO_CONTENT_ID } from "./email-template.js";
17
16
 
@@ -42,9 +41,7 @@ export interface SendEmailArgs {
42
41
  let cachedAgentNativeLogo: Buffer | undefined;
43
42
 
44
43
  function getAgentNativeLogoAttachment(): EmailAttachment {
45
- cachedAgentNativeLogo ??= readFileSync(
46
- new URL("../../src/assets/branding/favicon.png", import.meta.url),
47
- );
44
+ cachedAgentNativeLogo ??= Buffer.from(FAVICON_PNG_BASE64, "base64");
48
45
  return {
49
46
  filename: "agent-native-logo.png",
50
47
  content: cachedAgentNativeLogo,