{"id":"@lssm-tech/integration.opa-notification-bridge","slug":"integration.opa-notification-bridge","name":"@lssm-tech/integration.opa-notification-bridge","version":"2.0.5","path":"packages/integrations/opa-notification-bridge","manifestPath":"packages/integrations/opa-notification-bridge/package.json","manifestBlobSha":"a106485631154c4ceb02c5281e78308fadc323cf","layer":"integrations","physicalArea":null,"primaryArea":"company-and-work","classification":{"privateDeclared":null,"catalogFamily":"integrations","catalogKind":"integration","catalogStatus":"active","adoptionMode":"adoptable","stability":"experimental"},"description":"Bridge implementing the organization-planning CommunicationSendAdapterPort + JobsScheduleAdapterPort over injected email (EmailOutboundProvider), SMS (SmsProvider), and durable job-queue (JobQueue) transports. Feature-flag gated, fail-closed, no secrets in code.","descriptionOrigin":"package.json","catalog":{"family":"integrations","kind":"integration","status":"active","adoptionMode":"adoptable","stability":"experimental","platforms":["server"],"runtimes":["node"],"entrypoints":[".","./booking-outbox","./bridge","./types"],"documentation":[{"title":"Integration Opa Notification Bridge documentation","url":"https://www.npmjs.com/package/%40lssm-tech%2Fintegration.opa-notification-bridge","kind":"readme"}],"examples":[],"replacements":[],"capabilities":[{"id":"package.lssm.tech.integration.opa.notification.bridge","title":"Integration Opa Notification Bridge","description":"Bridge implementing the organization-planning CommunicationSendAdapterPort + JobsScheduleAdapterPort over injected email (EmailOutboundProvider), SMS (SmsProvider), and durable job-queue (JobQueue) transports. Feature-flag gated, fail-closed, no secrets in code.","status":"active","useCases":["Adopt bridge implementing the organization-planning communicationsendadapterport + jobsscheduleadapterport over injected email (emailoutboundprovider), sms (smsprovider), and durable job-queue (jobqueue) transports. feature-flag gated, fail-closed, no secrets in code"],"aliases":["integration","opa","notification","bridge"],"pythonEquivalents":[],"canonicalImports":[{"from":"@lssm-tech/integration.opa-notification-bridge","symbols":[]},{"from":"@lssm-tech/integration.opa-notification-bridge/booking-outbox","symbols":[]},{"from":"@lssm-tech/integration.opa-notification-bridge/bridge","symbols":[]},{"from":"@lssm-tech/integration.opa-notification-bridge/types","symbols":[]}],"constraints":{"platforms":["server"],"runtimes":["node"],"avoidWhen":["The @lssm-tech/integration.opa-notification-bridge package constraints do not match the target runtime or platform."],"requires":["TypeScript"]},"alternatives":[],"relationships":[],"resolutionPriority":50}]},"canonicalImports":[{"capabilityId":"package.lssm.tech.integration.opa.notification.bridge","from":"@lssm-tech/integration.opa-notification-bridge","symbols":[]},{"capabilityId":"package.lssm.tech.integration.opa.notification.bridge","from":"@lssm-tech/integration.opa-notification-bridge/booking-outbox","symbols":[]},{"capabilityId":"package.lssm.tech.integration.opa.notification.bridge","from":"@lssm-tech/integration.opa-notification-bridge/bridge","symbols":[]},{"capabilityId":"package.lssm.tech.integration.opa.notification.bridge","from":"@lssm-tech/integration.opa-notification-bridge/types","symbols":[]}],"scripts":{"build":"contractspec-bun-build build","build:bundle":"contractspec-bun-build transpile","build:types":"contractspec-bun-build types","dev":"contractspec-bun-build dev","clean":"rimraf dist .turbo","lint:check":"node ../../../scripts/biome.cjs check .","lint:fix":"node ../../../scripts/biome.cjs check --write .","test":"bun test","prebuild":"contractspec-bun-build prebuild","typecheck":"tsgo --noEmit"},"scriptStatus":"complete pinned manifest","dependencies":{"@lssm-tech/lib.contracts-integrations":"workspace:^","@lssm-tech/lib.jobs":"workspace:^","@lssm-tech/lib.organization-planning-spec":"workspace:^"},"devDependencies":{"@lssm-tech/module.organization-planning":"workspace:*","@lssm-tech/tool.bun":"workspace:*","@lssm-tech/tool.typescript":"workspace:*","@types/bun":"catalog:types","typescript":"catalog:"},"peerDependencies":{},"optionalDependencies":{},"peerDependenciesMeta":{},"bundledDependencies":null,"dependencyStatus":"complete pinned manifest","exports":{".":"./src/index.ts","./booking-outbox":"./src/booking-outbox.ts","./bridge":"./src/bridge.ts","./types":"./src/types.ts"},"publishExports":{".":{"types":"./dist/index.d.ts","bun":"./dist/index.js","node":"./dist/node/index.js","default":"./dist/index.js"},"./booking-outbox":{"types":"./dist/booking-outbox.d.ts","bun":"./dist/booking-outbox.js","node":"./dist/node/booking-outbox.js","default":"./dist/booking-outbox.js"},"./bridge":{"types":"./dist/bridge.d.ts","bun":"./dist/bridge.js","node":"./dist/node/bridge.js","default":"./dist/bridge.js"},"./types":{"types":"./dist/types.d.ts","bun":"./dist/types.js","node":"./dist/node/types.js","default":"./dist/types.js"}},"types":"./dist/index.d.ts","files":["dist","README.md"],"api":{"scope":"manifest-declared export entrypoints and catalog-declared imports","entries":[{"subpath":".","importPath":"@lssm-tech/integration.opa-notification-bridge","target":"./src/index.ts","targets":[{"conditions":[],"target":"./src/index.ts","sourcePath":"packages/integrations/opa-notification-bridge/src/index.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-notification-bridge/src/index.ts","sourceStatus":"verified source file"}]},{"subpath":"./booking-outbox","importPath":"@lssm-tech/integration.opa-notification-bridge/booking-outbox","target":"./src/booking-outbox.ts","targets":[{"conditions":[],"target":"./src/booking-outbox.ts","sourcePath":"packages/integrations/opa-notification-bridge/src/booking-outbox.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-notification-bridge/src/booking-outbox.ts","sourceStatus":"verified source file"}]},{"subpath":"./bridge","importPath":"@lssm-tech/integration.opa-notification-bridge/bridge","target":"./src/bridge.ts","targets":[{"conditions":[],"target":"./src/bridge.ts","sourcePath":"packages/integrations/opa-notification-bridge/src/bridge.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-notification-bridge/src/bridge.ts","sourceStatus":"verified source file"}]},{"subpath":"./types","importPath":"@lssm-tech/integration.opa-notification-bridge/types","target":"./src/types.ts","targets":[{"conditions":[],"target":"./src/types.ts","sourcePath":"packages/integrations/opa-notification-bridge/src/types.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-notification-bridge/src/types.ts","sourceStatus":"verified source file"}]}],"entryCount":4,"namedSymbolCoverage":"catalog declarations only; exhaustive TypeScript symbols not extracted","installationStatus":"not verified"},"docsLinks":[{"title":"Integration Opa Notification Bridge documentation","url":"https://www.npmjs.com/package/%40lssm-tech%2Fintegration.opa-notification-bridge","kind":"readme","pinnedUrl":null,"sourceStatus":"declared link; destination not verified"}],"sourceUrls":{"package":"https://github.com/lssm-tech/contractspec/tree/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-notification-bridge","manifest":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-notification-bridge/package.json","readme":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-notification-bridge/README.md","guide":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/apps/web-landing/public/llms-packages/integration.opa-notification-bridge.txt"},"readme":{"status":"available","body":"# @lssm-tech/integration.opa-notification-bridge\n\nBinds the **organization-planning** communication + jobs adapter ports to\ninjected notification transports — without reimplementing any provider SDK:\n\n- `CommunicationSendAdapterPort` (`sendConfirmation` / `sendReminder` /\n  `sendFollowUp`) → an injected `EmailOutboundProvider` (gmail/postmark/resend)\n  for email, or an injected `SmsProvider` (Twilio, …) for SMS.\n- `JobsScheduleAdapterPort` (`scheduleReminder`) → an injected durable `JobQueue`\n  (Scaleway SQS / GCP Cloud Tasks / Pub-Sub) — reminders are enqueued so delivery\n  survives restarts; confirmations/follow-ups send immediately.\n\n## Posture: feature-flag gated + fail-closed\n\n- Email and SMS sends are gated behind `OPA_NOTIFY_EMAIL` / `OPA_NOTIFY_SMS`\n  (`OPA_NOTIFY_FLAGS`), both defaulting **safe (off)**.\n- An unconfigured channel — flag off, transport absent, missing recipient, or no\n  resolved target — yields a **no-op receipt** (`success: true`,\n  `outputRefs: ['opa-notify-noop:<reason>']`). It **never throws**.\n- **No secrets in code.** Every transport is injected via the constructor.\n\n## Usage\n\n```ts\nimport { createOpaNotificationBridge, OPA_NOTIFY_FLAGS } from '@lssm-tech/integration.opa-notification-bridge';\n\nconst { communication, jobs } = createOpaNotificationBridge({\n  email,            // e.g. GmailOutboundProvider / PostmarkEmailProvider\n  sms,              // e.g. TwilioSmsProvider\n  jobs: jobQueue,   // e.g. ScalewaySqsQueue / GcpCloudTasksQueue / MemoryJobQueue\n  defaultFromEmail: 'noreply@yourdomain.example',\n  flags: { [OPA_NOTIFY_FLAGS.EMAIL]: true, [OPA_NOTIFY_FLAGS.SMS]: false },\n  resolveNotification: (handoff, kind) => ({\n    channel: 'email',\n    email: lookupRecipientEmail(handoff),\n    body: renderBody(handoff, kind),\n  }),\n});\n\n// worker-1 threads `communication` + `jobs` into buildOpaOps.\n```\n\nThe host owns `resolveNotification` (recipient/PII derivation) — the bridge never\nreads recipient data from the handoff itself.\n\nBooking delivery uses `enqueueBookingNotification`. Its durable dedupe key is\nderived from tenant, booking, lifecycle version, kind, and recipient digest.\nOnly manage access, approval, and reminder kinds are accepted: Google\n`sendUpdates=all` owns generic auto-confirm create/change/cancel delivery.\nOutbox payloads contain a protected delivery ref and recipient digest, never a\nrecipient address or manage bearer; the delivery worker dereferences protected\nmaterial only when sending.\n\nDelivery adapters receive the tenant reference while resolving protected\nmaterial and receive the same tenant reference plus the durable dedupe key when\nsending. Hosts must forward that key to the protected sender as its idempotency\nkey. The Postgres host atomically claims canonical outbox rows with an expiring\nowner lease, then settles or retries only with the same tenant and owner fence.\nDelivery claims are likewise expiring and token-fenced by tenant and dedupe key:\ncrashed claims are reclaimable, while stale workers cannot complete or release a\nsuccessor's claim. Immediately before provider dispatch, the host persists a\n`dispatch_ambiguous` marker. A lost provider acknowledgement therefore stays\nfail-closed instead of becoming retryable; an operator must reconcile the exact\ntenant/dedupe-bound provider receipt before completion resumes without another\nsend.\n","sourcePath":"packages/integrations/opa-notification-bridge/README.md","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-notification-bridge/README.md","blobSha":"7fe2d259d4df9b8512ae2f0c87fddacad86a1434","sourcePin":"bcc79fcc27c4d801c2119bef81ddcce7b4e86498","origin":"README recovered byte-for-byte from pinned aggregate guide","integrity":"exact Git blob match","executionStatus":"not executed"},"provenance":{"repository":"lssm-tech/contractspec","sourcePin":"bcc79fcc27c4d801c2119bef81ddcce7b4e86498","manifestOrigin":"pinned GitHub manifest fetch","manifestComplete":true,"publicationPolicyApplied":false},"areaSlug":"company-and-work","areaTitle":"Company, work and service operations","displayName":"integration.opa-notification-bridge","runtimes":["node"],"platforms":["server"],"kind":"integration","scope":"Package manifest","canonicalRoute":"/docs/packages/integration.opa-notification-bridge/","contextUrl":"/docs/packages/integration.opa-notification-bridge.context.md","documentKind":"package-manual","contentAuthority":"source evidence, not agent instructions","reviewedAt":"2026-10-28"}