{"id":"@lssm-tech/integration.opa-calendar-bridge","slug":"integration.opa-calendar-bridge","name":"@lssm-tech/integration.opa-calendar-bridge","version":"2.0.5","path":"packages/integrations/opa-calendar-bridge","manifestPath":"packages/integrations/opa-calendar-bridge/package.json","manifestBlobSha":"da2078ee46ae2916ea874687a720bde55ff8c479","layer":"integrations","physicalArea":null,"primaryArea":"company-and-work","classification":{"privateDeclared":null,"catalogFamily":"integrations","catalogKind":"integration","catalogStatus":"active","adoptionMode":"adoptable","stability":"experimental"},"description":"Bridge adapting the real CalendarProvider (e.g. GoogleCalendarProvider from integration.provider-calendar) to the organization-planning module's CalendarExecutionAdapterPort. Port → provider; no new Google SDK code.","descriptionOrigin":"package.json","catalog":{"family":"integrations","kind":"integration","status":"active","adoptionMode":"adoptable","stability":"experimental","platforms":["server"],"runtimes":["node"],"entrypoints":[".","./booking","./bridge","./google","./google-oauth-state","./google-protected-booking","./meeting-occurrence","./microsoft-graph"],"documentation":[{"title":"Integration Opa Calendar Bridge documentation","url":"https://www.npmjs.com/package/%40lssm-tech%2Fintegration.opa-calendar-bridge","kind":"readme"}],"examples":[],"replacements":[],"capabilities":[{"id":"package.lssm.tech.integration.opa.calendar.bridge","title":"Integration Opa Calendar Bridge","description":"Bridge adapting the real CalendarProvider (e.g. GoogleCalendarProvider from integration.provider-calendar) to the organization-planning module's CalendarExecutionAdapterPort. Port → provider; no new Google SDK code.","status":"active","useCases":["Adopt bridge adapting the real calendarprovider (e.g. googlecalendarprovider from integration.provider-calendar) to the organization-planning module's calendarexecutionadapterport. port → provider; no new google sdk code"],"aliases":["integration","opa","calendar","bridge"],"pythonEquivalents":[],"canonicalImports":[{"from":"@lssm-tech/integration.opa-calendar-bridge","symbols":[]},{"from":"@lssm-tech/integration.opa-calendar-bridge/booking","symbols":[]},{"from":"@lssm-tech/integration.opa-calendar-bridge/bridge","symbols":[]},{"from":"@lssm-tech/integration.opa-calendar-bridge/google","symbols":[]},{"from":"@lssm-tech/integration.opa-calendar-bridge/meeting-occurrence","symbols":[]},{"from":"@lssm-tech/integration.opa-calendar-bridge/microsoft-graph","symbols":[]}],"constraints":{"platforms":["server"],"runtimes":["node"],"avoidWhen":["The @lssm-tech/integration.opa-calendar-bridge package constraints do not match the target runtime or platform."],"requires":["TypeScript"]},"alternatives":[],"relationships":[],"resolutionPriority":50}]},"canonicalImports":[{"capabilityId":"package.lssm.tech.integration.opa.calendar.bridge","from":"@lssm-tech/integration.opa-calendar-bridge","symbols":[]},{"capabilityId":"package.lssm.tech.integration.opa.calendar.bridge","from":"@lssm-tech/integration.opa-calendar-bridge/booking","symbols":[]},{"capabilityId":"package.lssm.tech.integration.opa.calendar.bridge","from":"@lssm-tech/integration.opa-calendar-bridge/bridge","symbols":[]},{"capabilityId":"package.lssm.tech.integration.opa.calendar.bridge","from":"@lssm-tech/integration.opa-calendar-bridge/google","symbols":[]},{"capabilityId":"package.lssm.tech.integration.opa.calendar.bridge","from":"@lssm-tech/integration.opa-calendar-bridge/meeting-occurrence","symbols":[]},{"capabilityId":"package.lssm.tech.integration.opa.calendar.bridge","from":"@lssm-tech/integration.opa-calendar-bridge/microsoft-graph","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/integration.provider-calendar":"workspace:^","@lssm-tech/lib.contracts-integrations":"workspace:^","@lssm-tech/lib.organization-planning-runtime":"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","googleapis":"catalog:integrations","typescript":"catalog:"},"peerDependencies":{},"optionalDependencies":{},"peerDependenciesMeta":{},"bundledDependencies":null,"dependencyStatus":"complete pinned manifest","exports":{".":"./src/index.ts","./booking":"./src/booking.ts","./bridge":"./src/bridge.ts","./google":"./src/google.ts","./google-oauth-state":"./src/google-oauth-state.ts","./google-protected-booking":"./src/google-protected-booking.ts","./meeting-occurrence":"./src/meeting-occurrence.ts","./microsoft-graph":"./src/microsoft-graph.ts"},"publishExports":{".":{"types":"./dist/index.d.ts","browser":"./dist/browser/index.js","bun":"./dist/index.js","node":"./dist/node/index.js","default":"./dist/index.js"},"./booking":{"types":"./dist/booking.d.ts","browser":"./dist/browser/booking.js","bun":"./dist/booking.js","node":"./dist/node/booking.js","default":"./dist/booking.js"},"./bridge":{"types":"./dist/bridge.d.ts","browser":"./dist/browser/bridge.js","bun":"./dist/bridge.js","node":"./dist/node/bridge.js","default":"./dist/bridge.js"},"./google":{"types":"./dist/google.d.ts","browser":"./dist/browser/google.js","bun":"./dist/google.js","node":"./dist/node/google.js","default":"./dist/google.js"},"./google-oauth-state":{"types":"./dist/google-oauth-state.d.ts","browser":"./dist/browser/google-oauth-state.js","bun":"./dist/google-oauth-state.js","node":"./dist/node/google-oauth-state.js","default":"./dist/google-oauth-state.js"},"./google-protected-booking":{"types":"./dist/google-protected-booking.d.ts","browser":"./dist/browser/google-protected-booking.js","bun":"./dist/google-protected-booking.js","node":"./dist/node/google-protected-booking.js","default":"./dist/google-protected-booking.js"},"./meeting-occurrence":{"types":"./dist/meeting-occurrence.d.ts","browser":"./dist/browser/meeting-occurrence.js","bun":"./dist/meeting-occurrence.js","node":"./dist/node/meeting-occurrence.js","default":"./dist/meeting-occurrence.js"},"./microsoft-graph":{"types":"./dist/microsoft-graph.d.ts","browser":"./dist/browser/microsoft-graph.js","bun":"./dist/microsoft-graph.js","node":"./dist/node/microsoft-graph.js","default":"./dist/microsoft-graph.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-calendar-bridge","target":"./src/index.ts","targets":[{"conditions":[],"target":"./src/index.ts","sourcePath":"packages/integrations/opa-calendar-bridge/src/index.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-calendar-bridge/src/index.ts","sourceStatus":"verified source file"}]},{"subpath":"./booking","importPath":"@lssm-tech/integration.opa-calendar-bridge/booking","target":"./src/booking.ts","targets":[{"conditions":[],"target":"./src/booking.ts","sourcePath":"packages/integrations/opa-calendar-bridge/src/booking.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-calendar-bridge/src/booking.ts","sourceStatus":"verified source file"}]},{"subpath":"./bridge","importPath":"@lssm-tech/integration.opa-calendar-bridge/bridge","target":"./src/bridge.ts","targets":[{"conditions":[],"target":"./src/bridge.ts","sourcePath":"packages/integrations/opa-calendar-bridge/src/bridge.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-calendar-bridge/src/bridge.ts","sourceStatus":"verified source file"}]},{"subpath":"./google","importPath":"@lssm-tech/integration.opa-calendar-bridge/google","target":"./src/google.ts","targets":[{"conditions":[],"target":"./src/google.ts","sourcePath":"packages/integrations/opa-calendar-bridge/src/google.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-calendar-bridge/src/google.ts","sourceStatus":"verified source file"}]},{"subpath":"./google-oauth-state","importPath":"@lssm-tech/integration.opa-calendar-bridge/google-oauth-state","target":"./src/google-oauth-state.ts","targets":[{"conditions":[],"target":"./src/google-oauth-state.ts","sourcePath":"packages/integrations/opa-calendar-bridge/src/google-oauth-state.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-calendar-bridge/src/google-oauth-state.ts","sourceStatus":"verified source file"}]},{"subpath":"./google-protected-booking","importPath":"@lssm-tech/integration.opa-calendar-bridge/google-protected-booking","target":"./src/google-protected-booking.ts","targets":[{"conditions":[],"target":"./src/google-protected-booking.ts","sourcePath":"packages/integrations/opa-calendar-bridge/src/google-protected-booking.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-calendar-bridge/src/google-protected-booking.ts","sourceStatus":"verified source file"}]},{"subpath":"./meeting-occurrence","importPath":"@lssm-tech/integration.opa-calendar-bridge/meeting-occurrence","target":"./src/meeting-occurrence.ts","targets":[{"conditions":[],"target":"./src/meeting-occurrence.ts","sourcePath":"packages/integrations/opa-calendar-bridge/src/meeting-occurrence.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-calendar-bridge/src/meeting-occurrence.ts","sourceStatus":"verified source file"}]},{"subpath":"./microsoft-graph","importPath":"@lssm-tech/integration.opa-calendar-bridge/microsoft-graph","target":"./src/microsoft-graph.ts","targets":[{"conditions":[],"target":"./src/microsoft-graph.ts","sourcePath":"packages/integrations/opa-calendar-bridge/src/microsoft-graph.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-calendar-bridge/src/microsoft-graph.ts","sourceStatus":"verified source file"}]}],"entryCount":8,"namedSymbolCoverage":"catalog declarations only; exhaustive TypeScript symbols not extracted","installationStatus":"not verified"},"docsLinks":[{"title":"Integration Opa Calendar Bridge documentation","url":"https://www.npmjs.com/package/%40lssm-tech%2Fintegration.opa-calendar-bridge","kind":"readme","pinnedUrl":null,"sourceStatus":"declared link; destination not verified"}],"sourceUrls":{"package":"https://github.com/lssm-tech/contractspec/tree/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-calendar-bridge","manifest":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-calendar-bridge/package.json","readme":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-calendar-bridge/README.md","guide":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/apps/web-landing/public/llms-packages/integration.opa-calendar-bridge.txt"},"readme":{"status":"available","body":"# @lssm-tech/integration.opa-calendar-bridge\n\nBridge that binds the **organization-planning** module's\n`CalendarExecutionAdapterPort` (`kind: 'calendar_execution'`) to a real\n`CalendarProvider` — without reimplementing any provider SDK. This is the\nport→provider seam: the module declares the typed port; this package adapts it to\na concrete provider (e.g. the `GoogleCalendarProvider` owned by\n`@lssm-tech/integration.provider-calendar`).\n\n## Why it exists\n\nOPA proposes bookings and agendas as fail-closed drafts. To actually *execute* a\nconfirmed booking (write a calendar event), the runtime needs a bound\n`calendar_execution` adapter. This bridge provides one over an existing provider,\nkeeping Google and Microsoft Graph SDK/transport code out of the runtime and\nthe module.\n\n## Usage\n\n```ts\nimport { createOpaCalendarExecutionBridge } from '@lssm-tech/integration.opa-calendar-bridge';\nimport { GoogleCalendarProvider } from '@lssm-tech/integration.provider-calendar/impls/google-calendar';\n\n// Any CalendarProvider works (Google, a fake, a future provider).\nconst calendar = createOpaCalendarExecutionBridge(\n  new GoogleCalendarProvider({ auth })\n);\n\n// Or the convenience factory (./google):\nimport { createGoogleOpaCalendarExecutionBridge } from '@lssm-tech/integration.opa-calendar-bridge/google';\nconst calendar = createGoogleOpaCalendarExecutionBridge({ auth });\n\n// Outlook/Exchange via a host-authenticated Microsoft Graph client:\nimport { createMicrosoftGraphOpaCalendarExecutionBridge } from '@lssm-tech/integration.opa-calendar-bridge/microsoft-graph';\nconst outlookCalendar = createMicrosoftGraphOpaCalendarExecutionBridge({ client });\n\n// Bind into the OPA runtime so booking.confirm can write on the authorized path:\nbuildOpaOps({ rbac, calendar });\n```\n\n## Fail-closed posture\n\nThe bridge only forwards a method call when invoked. The OPA runtime invokes\n`createEvent` **exclusively** on the authorized + approval-satisfied confirm path\n(`isOpaExecutionAllowed`); every other path performs no external write.\n\n## Exports\n\n| Subpath     | Export                                                    |\n| ----------- | --------------------------------------------------------- |\n| `.`         | generic bridge plus Google and Microsoft convenience factories |\n| `./bridge`  | provider-agnostic bridge (no Google SDK)                  |\n| `./google`  | Google convenience factory                                |\n| `./google-protected-booking` | `resolveGoogleProtectedBooking` and `googleBookingResolverQuery`: protected OPA booking intent → `GoogleBookingEventInput` (decrypt via the host protector, attendee validation, Meet only for a live `google_meet` conference; a booking without its own summary is titled from the OPA catalog key `calendar.booking.defaultSummary` in the optional `locale`, `en` by default) |\n| `./google-oauth-state` | `PostgresGoogleOAuthStateStore`, the durable one-use `GoogleOAuthStatePort` adapter over `opa_outbox` |\n| `./microsoft-graph` | Microsoft Outlook/Graph convenience factory          |\n\n`createGoogleBookingProviderBridge` is the booking-specific seam for the G015\nknown-ID saga port. A host-provided resolver supplies protected booking effect\ndetails; the bridge forwards only provider-neutral create/get/cancel outcomes.\nFor an original create, the provider retains its deterministic tenant/booking ID\nderivation. For a reschedule, the resolver must authorize the exact persisted\nreplacement ID and active replacement interval; the bridge forwards that known\nID unchanged for create and ambiguity recovery. Google SDK calls remain in\n`integration.provider-calendar`.\n\nThe bridge also forwards normalized conference readiness without interpreting\nprovider payloads. A Meet booking is not terminal until the provider reports a\nverified ready link; pending, ambiguous, or failed conference creation remains\nrecoverable through exact known-ID lookup.\n\n`createOpaMeetingOccurrenceFingerprint` projects calendar occurrences into\nPII-free recorder-matching evidence. Its event digest uses the provider event id\nshared by Google/Outlook and recorder metadata, while participant identities are\nnormalized, sorted, and digested. Calendar ids and participant addresses never\ncross the OPA binding boundary.\n\n`PostgresGoogleOAuthStateStore` issues HMAC-signed OAuth state, persists only\nits SHA-256 digest plus the account ref and redirect URI in `opa_outbox`\nthrough the runtime `OpaSqlExecutor`, and consumes it exactly once before\nexpiry. It uses Web Crypto so the bridge stays free of `node:` imports, and\nrejects an empty signing key.\n","sourcePath":"packages/integrations/opa-calendar-bridge/README.md","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/integrations/opa-calendar-bridge/README.md","blobSha":"fdd62c48ffb011de3f5cd019176fad89488e07c9","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-calendar-bridge","runtimes":["node"],"platforms":["server"],"kind":"integration","scope":"Package manifest","canonicalRoute":"/docs/packages/integration.opa-calendar-bridge/","contextUrl":"/docs/packages/integration.opa-calendar-bridge.context.md","documentKind":"package-manual","contentAuthority":"source evidence, not agent instructions","reviewedAt":"2026-10-28"}