{"_id":"@braedonsaunders/appkit-integrations","_rev":"2-d0ee9a661cf351936347d7bad8b89716","name":"@braedonsaunders/appkit-integrations","dist-tags":{"latest":"3.0.0"},"versions":{"2.0.0":{"name":"@braedonsaunders/appkit-integrations","version":"2.0.0","keywords":["appkit","application-framework","typescript"],"author":{"name":"Braedon Saunders"},"license":"AGPL-3.0-or-later","_id":"@braedonsaunders/appkit-integrations@2.0.0","maintainers":[{"name":"braedonsaunders","email":"bsaunders@rassaun.com"}],"homepage":"https://github.com/braedonsaunders/appkit/tree/main/packages/integrations#readme","bugs":{"url":"https://github.com/braedonsaunders/appkit/issues"},"dist":{"shasum":"b2776001f2e371b5f6dc1207c8cf5f6471537c4b","tarball":"https://registry.npmjs.org/@braedonsaunders/appkit-integrations/-/appkit-integrations-2.0.0.tgz","fileCount":96,"integrity":"sha512-+oStOsMs5aW6kZ8cqP1owSFkXfJrrVAbNwhaYAnEQWvbvtCtVRH44x8Q7QcmgNiMQcq1Sc+OIkMw2smH9DZj0g==","signatures":[{"sig":"MEUCIQCJvRLiD3k4GQ+Bql6s2p0BGB/g8+pjJNBCCgeX+Lj+oQIgc3jF313mf3UGuF7e7lmNzUbmUEC1hYfmBGTDa7Dvw3s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@braedonsaunders%2fappkit-integrations@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":392556},"main":"./index.js","type":"module","_from":"file:braedonsaunders-appkit-integrations-2.0.0.tgz","types":"./index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./sql":{"types":"./sql.d.ts","import":"./sql.js","default":"./sql.js"},"./chat":{"types":"./chat.d.ts","import":"./chat.js","default":"./chat.js"},"./http":{"types":"./http.d.ts","import":"./http.js","default":"./http.js"},"./email":{"types":"./email.d.ts","import":"./email.js","default":"./email.js"},"./react":{"types":"./react.d.ts","import":"./react.js","default":"./react.js"},"./schema":{"types":"./schema.d.ts","import":"./schema.js","default":"./schema.js"},"./sheets":{"types":"./sheets.d.ts","import":"./sheets.js","default":"./sheets.js"},"./catalog":{"types":"./types.d.ts","import":"./types.js","default":"./types.js"},"./drizzle":{"types":"./drizzle.d.ts","import":"./drizzle.js","default":"./drizzle.js"},"./triggers":{"types":"./trigger-catalog.d.ts","import":"./trigger-catalog.js","default":"./trigger-catalog.js"},"./sql-catalog":{"types":"./sql-catalog.d.ts","import":"./sql-catalog.js","default":"./sql-catalog.js"},"./destinations":{"types":"./destination-registry.d.ts","import":"./destination-registry.js","default":"./destination-registry.js"},"./package.json":"./package.json","./destination-catalog":{"types":"./destination-catalog.d.ts","import":"./destination-catalog.js","default":"./destination-catalog.js"}},"_npmUser":{"name":"braedonsaunders","email":"bsaunders@rassaun.com"},"_resolved":"/tmp/96120e3ce04ac23521365e2e6260f80b/braedonsaunders-appkit-integrations-2.0.0.tgz","_integrity":"sha512-+oStOsMs5aW6kZ8cqP1owSFkXfJrrVAbNwhaYAnEQWvbvtCtVRH44x8Q7QcmgNiMQcq1Sc+OIkMw2smH9DZj0g==","repository":{"url":"git+https://github.com/braedonsaunders/appkit.git","type":"git","directory":"packages/integrations"},"_npmVersion":"10.9.8","description":"Production outbound automation with authoring UI, durable publication, retry ledgers, and optional HTTP, chat, Sheets, email, SQL, and Drizzle adapters.","directories":{},"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"peerDependencies":{"react":"^19.0.0","react-dom":"^19.0.0","drizzle-orm":"^0.45.2","lucide-react":"^1.24.0","@braedonsaunders/appkit-db":"^0.2.0","@braedonsaunders/appkit-ui":"^0.2.0","@braedonsaunders/appkit-sync":"^1.1.0","@braedonsaunders/appkit-email-render":"^0.1.1"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"drizzle-orm":{"optional":true},"lucide-react":{"optional":true},"@braedonsaunders/appkit-db":{"optional":true},"@braedonsaunders/appkit-ui":{"optional":true},"@braedonsaunders/appkit-sync":{"optional":true},"@braedonsaunders/appkit-email-render":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/appkit-integrations_2.0.0_1787095315548_0.5207793834583829","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@braedonsaunders/appkit-integrations","version":"3.0.0","description":"Production outbound automation with authoring UI, durable publication, retry ledgers, and optional HTTP, chat, Sheets, email, SQL, and Drizzle adapters.","license":"AGPL-3.0-or-later","type":"module","exports":{".":{"types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./triggers":{"types":"./trigger-catalog.d.ts","import":"./trigger-catalog.js","default":"./trigger-catalog.js"},"./destinations":{"types":"./destination-registry.d.ts","import":"./destination-registry.js","default":"./destination-registry.js"},"./catalog":{"types":"./types.d.ts","import":"./types.js","default":"./types.js"},"./destination-catalog":{"types":"./destination-catalog.d.ts","import":"./destination-catalog.js","default":"./destination-catalog.js"},"./http":{"types":"./http.d.ts","import":"./http.js","default":"./http.js"},"./chat":{"types":"./chat.d.ts","import":"./chat.js","default":"./chat.js"},"./sheets":{"types":"./sheets.d.ts","import":"./sheets.js","default":"./sheets.js"},"./email":{"types":"./email.d.ts","import":"./email.js","default":"./email.js"},"./sql":{"types":"./sql.d.ts","import":"./sql.js","default":"./sql.js"},"./sql-catalog":{"types":"./sql-catalog.d.ts","import":"./sql-catalog.js","default":"./sql-catalog.js"},"./schema":{"types":"./schema.d.ts","import":"./schema.js","default":"./schema.js"},"./drizzle":{"types":"./drizzle.d.ts","import":"./drizzle.js","default":"./drizzle.js"},"./react":{"types":"./react.d.ts","import":"./react.js","default":"./react.js"},"./package.json":"./package.json"},"main":"./index.js","types":"./index.d.ts","peerDependencies":{"@braedonsaunders/appkit-email-render":"^0.1.1","@braedonsaunders/appkit-db":"^0.2.0","@braedonsaunders/appkit-sync":"^1.1.1","drizzle-orm":"^0.45.2","@braedonsaunders/appkit-ui":"^0.3.0","lucide-react":"^1.24.0","react":"^19.0.0","react-dom":"^19.0.0"},"peerDependenciesMeta":{"@braedonsaunders/appkit-email-render":{"optional":true},"@braedonsaunders/appkit-db":{"optional":true},"@braedonsaunders/appkit-sync":{"optional":true},"drizzle-orm":{"optional":true},"@braedonsaunders/appkit-ui":{"optional":true},"lucide-react":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true}},"author":{"name":"Braedon Saunders"},"repository":{"type":"git","url":"git+https://github.com/braedonsaunders/appkit.git","directory":"packages/integrations"},"homepage":"https://github.com/braedonsaunders/appkit/tree/main/packages/integrations#readme","bugs":{"url":"https://github.com/braedonsaunders/appkit/issues"},"engines":{"node":">=22"},"keywords":["appkit","application-framework","typescript"],"_id":"@braedonsaunders/appkit-integrations@3.0.0","_integrity":"sha512-HlUVcquh43yeHkd0J+IdWt/43Mf4zyLDyFphHAmpCOwrYgJkQtQwPCFj7qthvLLRkJjtAD6JbGduZadPtFRiVA==","_resolved":"/tmp/1766a3a7e5ec603d9288118a745b5960/braedonsaunders-appkit-integrations-3.0.0.tgz","_from":"file:braedonsaunders-appkit-integrations-3.0.0.tgz","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-HlUVcquh43yeHkd0J+IdWt/43Mf4zyLDyFphHAmpCOwrYgJkQtQwPCFj7qthvLLRkJjtAD6JbGduZadPtFRiVA==","shasum":"046d3255b67f020528b0bc58f317211c697ad96e","tarball":"https://registry.npmjs.org/@braedonsaunders/appkit-integrations/-/appkit-integrations-3.0.0.tgz","fileCount":96,"unpackedSize":392331,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@braedonsaunders%2fappkit-integrations@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCc+NG0XAVB0w1302ecTJcQMGo3/Z4GsuGCF+od6x2kvwIhAOhZvgE70b7CnxWZ77l+kLfEysY6bDbAWMaF4fza9nod"}]},"_npmUser":{"name":"braedonsaunders","email":"bsaunders@rassaun.com"},"directories":{},"maintainers":[{"name":"braedonsaunders","email":"bsaunders@rassaun.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/appkit-integrations_3.0.0_1789182673542_0.5243535471915233"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-18T23:21:55.386Z","modified":"2026-09-12T03:11:14.006Z","2.0.0":"2026-08-18T23:21:55.691Z","3.0.0":"2026-09-12T03:11:13.694Z"},"bugs":{"url":"https://github.com/braedonsaunders/appkit/issues"},"author":{"name":"Braedon Saunders"},"license":"AGPL-3.0-or-later","homepage":"https://github.com/braedonsaunders/appkit/tree/main/packages/integrations#readme","keywords":["appkit","application-framework","typescript"],"repository":{"type":"git","url":"git+https://github.com/braedonsaunders/appkit.git","directory":"packages/integrations"},"description":"Production outbound automation with authoring UI, durable publication, retry ledgers, and optional HTTP, chat, Sheets, email, SQL, and Drizzle adapters.","maintainers":[{"name":"braedonsaunders","email":"bsaunders@rassaun.com"}],"readme":"# @braedonsaunders/appkit-integrations\n\nBuild outbound automations as a complete pipeline: an application event selects\nmatching automations, a durable queue isolates each delivery, the dispatcher\nmaps data into a destination, and a per-record ledger makes retries safe.\n\n```bash\npnpm add @braedonsaunders/appkit-integrations\n```\n\nThe package is modular. The root contains the dependency-free event, registry,\npublisher, dispatcher, memory-store, idempotency, and authoring contracts. Add\nonly the destination, React, or Postgres entry points your application uses.\n\n## Runtime\n\n```ts\nimport {\n  createIntegrationDispatcher,\n  createIntegrationPublisher,\n  createIntegrationRegistry,\n  createMemoryIntegrationStore,\n} from '@braedonsaunders/appkit-integrations'\nimport { httpDestination } from '@braedonsaunders/appkit-integrations/http'\n\nconst registry = createIntegrationRegistry({\n  triggers: appTriggers,\n  destinations: [httpDestination],\n})\nconst store = createMemoryIntegrationStore(automationDefinitions)\n\nconst publishIntegrationEvent = createIntegrationPublisher({\n  store,\n  enqueueOutboundDispatch: outboundQueue.enqueueOutboundDispatch,\n})\nconst dispatchOne = createIntegrationDispatcher({\n  store,\n  registry,\n  unseal: applicationSecrets.unseal,\n})\n```\n\n`publishIntegrationEvent(context, event, sourceEventId)` creates one stable job\nid per matching automation. A worker calls\n`dispatchOne(context, automationId, event)`. Completed send-once deliveries are\nsuppressed, partial deliveries resume known successes, reversible destinations\nreceive prior external ids, and an explicit empty ref list clears stale ledger\nstate.\n\n## Destinations\n\n- `/http` — public HTTPS REST requests with tokenized headers and bodies\n- `/chat` — Slack and Teams incoming webhooks, including Slack Block Kit\n- `/sheets` — Google Sheets append through service-account credentials\n- `/email` — sanitized token templates through an application-owned transport\n- `/sql` — TLS-only PostgreSQL, MySQL, MariaDB, and SQL Server delivery with\n  identity-based reversal, weekly row fan-out, required-field filtering, and\n  value maps\n\nEach destination is an independent import. HTTP, chat, Sheets, and SQL reuse\nthe hardened egress and database-driver entries from `@braedonsaunders/appkit-sync`; email\naccepts your queue or transport instead of choosing one for you.\n\n## Authoring UI\n\n```tsx\nimport { IntegrationBuilder, IntegrationHub } from '@braedonsaunders/appkit-integrations/react'\n```\n\n`IntegrationHub` provides the production connected-grid and searchable inbound\nor outbound catalogue. `IntegrationBuilder` includes trigger and destination\nselection, declared connection and secret fields, per-destination mapping\neditors, click-to-insert trigger tokens, send-once policy, connection testing,\nand save callbacks. It returns plaintext secret replacements separately so the\nserver can seal them before persistence.\n\n## Postgres and RLS\n\n`@braedonsaunders/appkit-integrations/schema` owns `tenant_integrations` and\n`integration_export_log`, including the composite tenant foreign key, soft\ndeletion, lifecycle status, delivery details, and retry/reversal status.\n`@braedonsaunders/appkit-integrations/drizzle` requires an RLS tenant runner:\n\n```ts\nimport { createDrizzleIntegrationStore } from '@braedonsaunders/appkit-integrations/drizzle'\n\nconst store = createDrizzleIntegrationStore(db, withTenant)\n```\n\nInstall `drizzle/0000_integrations.sql`, include\n`INTEGRATION_TENANT_TABLES` in your RLS policy installation, and keep trigger\ncatalogues, authorization, domain event shaping, credentials, and the durable\nqueue in the application that owns them.\n","readmeFilename":"README.md"}