{"_id":"@creezio/granola","_rev":"6-b764a54eaf8b804a73acfb2b32d69a9e","name":"@creezio/granola","dist-tags":{"latest":"0.26.0"},"versions":{"0.22.0":{"name":"@creezio/granola","version":"0.22.0","license":"UNLICENSED","_id":"@creezio/granola@0.22.0","maintainers":[{"name":"cedfiducia","email":"hello@creez.io"}],"homepage":"https://github.com/creezio/creezio#readme","bugs":{"url":"https://github.com/creezio/creezio/issues"},"dist":{"shasum":"c2dec26fa6c0c6614eb02b6b5204a1b9a125bb79","tarball":"https://registry.npmjs.org/@creezio/granola/-/granola-0.22.0.tgz","fileCount":37,"integrity":"sha512-HWjr9PxNIZAeKB1vg+7BN/ubwUDYXY8t/RJWMyCgbEXvSS/RCy0+XoLQJ1mHCCbAvJtmQuL6QY+HZOWl9cukBA==","signatures":[{"sig":"MEUCIQDP9IqiySaZQx7pqjw5M/iKGEQcYpzOUpckxLbLqB7dGwIgR3EiG3udRBYM8vZluQmoOdppR1K2HlXRQo2KVkl59sU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":219410},"main":"./dist-cjs/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.5"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist-cjs/index.js"},"./ui":{"types":"./ui/index.ts","import":"./ui/index.ts","default":"./ui/index.ts"}},"gitHead":"544bc16fbe31e3a3721b24d2d17a377f1dc11e1c","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"cedfiducia","email":"hello@creez.io"},"repository":{"url":"git+https://github.com/creezio/creezio.git","type":"git","directory":"packages/granola"},"_npmVersion":"10.9.8","description":"Module natif Granola — réception webhook signée (Standard Webhooks), sync notes/transcripts et proxy API Granola","directories":{},"_nodeVersion":"22.23.1","dependencies":{"@creezio/api-kernel":"^0.22.0","@creezio/platform-core":"^0.22.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.3","@types/react":"^18.3.12"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","@creezio/shell-ui":">=0.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"@creezio/shell-ui":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/granola_0.22.0_1788206227451_0.2710674550916514","host":"s3://npm-registry-packages-npm-production"}},"0.23.0":{"name":"@creezio/granola","version":"0.23.0","license":"UNLICENSED","_id":"@creezio/granola@0.23.0","maintainers":[{"name":"cedfiducia","email":"hello@creez.io"}],"homepage":"https://github.com/creezio/creezio#readme","bugs":{"url":"https://github.com/creezio/creezio/issues"},"dist":{"shasum":"2ac4599f9dc0bae0af16adb09d0a8feba79690e1","tarball":"https://registry.npmjs.org/@creezio/granola/-/granola-0.23.0.tgz","fileCount":37,"integrity":"sha512-LPIx2cv87Z9iKQebqNp0A1vKw3/JEF0mBXd/tgpBMmnSLGJg+UCglIo4lLB0HbXUwa3Jehi2TFBI+8h+dj6BHA==","signatures":[{"sig":"MEQCIACi2twwFOMF8RHJnfyWGULo5nQTLML36tYNGu6Cy1z3AiBB2sAdEZYek9WqgFPnjjw+wJ79eeIyDOUAiQSuE7kXoQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":219410},"main":"./dist-cjs/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.5"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist-cjs/index.js"},"./ui":{"types":"./ui/index.ts","import":"./ui/index.ts","default":"./ui/index.ts"}},"gitHead":"55f391b610619648ca8b633a0509ac2ce9d2d784","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"cedfiducia","email":"hello@creez.io"},"repository":{"url":"git+https://github.com/creezio/creezio.git","type":"git","directory":"packages/granola"},"_npmVersion":"10.9.8","description":"Module natif Granola — réception webhook signée (Standard Webhooks), sync notes/transcripts et proxy API Granola","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@creezio/api-kernel":"^0.23.0","@creezio/platform-core":"^0.23.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.3","@types/react":"^18.3.12"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","@creezio/shell-ui":">=0.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"@creezio/shell-ui":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/granola_0.23.0_1788353986775_0.22701779204989614","host":"s3://npm-registry-packages-npm-production"}},"0.24.0":{"name":"@creezio/granola","version":"0.24.0","license":"UNLICENSED","_id":"@creezio/granola@0.24.0","maintainers":[{"name":"cedfiducia","email":"hello@creez.io"}],"homepage":"https://github.com/creezio/creezio#readme","bugs":{"url":"https://github.com/creezio/creezio/issues"},"dist":{"shasum":"57efa0e4f64dee0c07ad181acb1fd4c474122b72","tarball":"https://registry.npmjs.org/@creezio/granola/-/granola-0.24.0.tgz","fileCount":37,"integrity":"sha512-ES6ShUuk02d1Cb1DPFwNq5OPtgPekzjfa+q3QhiN5hIymUuNiEcftehWQnRE6VDAFnl6vRofM7j5MszBgk0ClA==","signatures":[{"sig":"MEQCIC/yLDFR7cDl4gFGvSLthyUUbkZOXUSovKEeGH897HORAiBxQzPOo9ial26FAkb5JJmpFbs2/L8rjUBP2+tph0C+bQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":219410},"main":"./dist-cjs/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.5"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist-cjs/index.js"},"./ui":{"types":"./ui/index.ts","import":"./ui/index.ts","default":"./ui/index.ts"}},"gitHead":"55da99cacf142cd8af97487d70cc8dc54586db26","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"cedfiducia","email":"hello@creez.io"},"repository":{"url":"git+https://github.com/creezio/creezio.git","type":"git","directory":"packages/granola"},"_npmVersion":"10.9.8","description":"Module natif Granola — réception webhook signée (Standard Webhooks), sync notes/transcripts et proxy API Granola","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@creezio/api-kernel":"^0.24.0","@creezio/platform-core":"^0.24.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.3","@types/react":"^18.3.12"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","@creezio/shell-ui":">=0.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"@creezio/shell-ui":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/granola_0.24.0_1788360185675_0.8137421406599257","host":"s3://npm-registry-packages-npm-production"}},"0.24.1":{"name":"@creezio/granola","version":"0.24.1","license":"UNLICENSED","_id":"@creezio/granola@0.24.1","maintainers":[{"name":"cedfiducia","email":"hello@creez.io"}],"homepage":"https://github.com/creezio/creezio#readme","bugs":{"url":"https://github.com/creezio/creezio/issues"},"dist":{"shasum":"a5f42ef8388544180d0606e1e4636aa07fbc93e4","tarball":"https://registry.npmjs.org/@creezio/granola/-/granola-0.24.1.tgz","fileCount":37,"integrity":"sha512-zap3c85HWCZsGn6njh3pxvQ5wberUHGzB6k4+O+v43gi/dYIhz4ofVb3ZWOtCgD3Rxz+ogP8+O0S+2IlEMR6tA==","signatures":[{"sig":"MEQCIH0gwcNFOhGW9KudqSp0LR1uHVBrNBObFI5VagqiFyMtAiAOYf250dicabXDiVyYPF7oTM91/6/HKD7AGgLgMVRgcg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":219410},"main":"./dist-cjs/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.5"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist-cjs/index.js"},"./ui":{"types":"./ui/index.ts","import":"./ui/index.ts","default":"./ui/index.ts"}},"gitHead":"0b0add380e7244b9f1502eea4609dfda3fdca05d","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"cedfiducia","email":"hello@creez.io"},"repository":{"url":"git+https://github.com/creezio/creezio.git","type":"git","directory":"packages/granola"},"_npmVersion":"10.9.8","description":"Module natif Granola — réception webhook signée (Standard Webhooks), sync notes/transcripts et proxy API Granola","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@creezio/api-kernel":"^0.24.1","@creezio/platform-core":"^0.24.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.3","@types/react":"^18.3.12"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","@creezio/shell-ui":">=0.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"@creezio/shell-ui":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/granola_0.24.1_1788365356373_0.8774006855511767","host":"s3://npm-registry-packages-npm-production"}},"0.25.0":{"name":"@creezio/granola","version":"0.25.0","license":"UNLICENSED","_id":"@creezio/granola@0.25.0","maintainers":[{"name":"cedfiducia","email":"hello@creez.io"}],"homepage":"https://github.com/creezio/creezio#readme","bugs":{"url":"https://github.com/creezio/creezio/issues"},"dist":{"shasum":"98faefefc8f7416a7f605a555efcc89317c66a0a","tarball":"https://registry.npmjs.org/@creezio/granola/-/granola-0.25.0.tgz","fileCount":37,"integrity":"sha512-XtpmRpRUvOl8KyWCsB+ekzdi9PSR0sY1lbKLawxGgg5yqSdz4OHu4tbY/VayrXxb0T1H291QPe05JZUpb4mZiA==","signatures":[{"sig":"MEUCIF25nqngKVUNzK9pJapIu3jWRa3V12l2tQFqRrgyRcxnAiEAy+hd8Bfaa6HEzXv4bao7Di97EZCWL+G19j1vwYfa0ns=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":219410},"main":"./dist-cjs/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.5"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist-cjs/index.js"},"./ui":{"types":"./ui/index.ts","import":"./ui/index.ts","default":"./ui/index.ts"}},"gitHead":"72ee394172d7a01bc0a51e0f8e4db3bbc5be8f31","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"cedfiducia","email":"hello@creez.io"},"repository":{"url":"git+https://github.com/creezio/creezio.git","type":"git","directory":"packages/granola"},"_npmVersion":"10.9.8","description":"Module natif Granola — réception webhook signée (Standard Webhooks), sync notes/transcripts et proxy API Granola","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@creezio/api-kernel":"^0.25.0","@creezio/platform-core":"^0.25.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.3","@types/node":"^22.15.3","@types/react":"^18.3.12"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","@creezio/shell-ui":">=0.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"@creezio/shell-ui":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/granola_0.25.0_1788373639920_0.8487247466059131","host":"s3://npm-registry-packages-npm-production"}},"0.26.0":{"name":"@creezio/granola","version":"0.26.0","description":"Module natif Granola — réception webhook signée (Standard Webhooks), sync notes/transcripts et proxy API Granola","type":"module","main":"./dist-cjs/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist-cjs/index.js","default":"./dist/index.js"},"./ui":{"types":"./ui/index.ts","import":"./ui/index.ts","default":"./ui/index.ts"}},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit"},"dependencies":{"@creezio/api-kernel":"^0.26.0","@creezio/platform-core":"^0.26.0"},"devDependencies":{"@types/node":"^22.15.3","@types/react":"^18.3.12","typescript":"^5.8.3"},"peerDependencies":{"@creezio/shell-ui":">=0.4.0","react":"^18.0.0 || ^19.0.0"},"peerDependenciesMeta":{"@creezio/shell-ui":{"optional":true},"react":{"optional":true}},"license":"UNLICENSED","module":"./dist/index.js","publishConfig":{"registry":"https://registry.npmjs.org","access":"public"},"repository":{"type":"git","url":"git+https://github.com/creezio/creezio.git","directory":"packages/granola"},"engines":{"node":">=22.5"},"_id":"@creezio/granola@0.26.0","gitHead":"fef880ebe9665ef996cfbabbe551dbd2a823a875","bugs":{"url":"https://github.com/creezio/creezio/issues"},"homepage":"https://github.com/creezio/creezio#readme","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-Ukk4XS7eWXJjzmS4yXIEy7PHgtLF67EX3hzWgKJIQRpj2ZwbIdHqkXrJ/h9PIAFwCYr+o3ihYmIAtoHNdEwvVQ==","shasum":"2f8af07f8f0ebfd58c049994a86d95f2d9258313","tarball":"https://registry.npmjs.org/@creezio/granola/-/granola-0.26.0.tgz","fileCount":37,"unpackedSize":219410,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCXsKQ3Ks/+4wxDdne1DNiMkpiv7ttbOD6tMrgxS5ZztAIhAPPSak1lgpKmlvQfQjgoNB0ibUjRu2v8Kt9Hlsd8AbQ3"}]},"_npmUser":{"name":"cedfiducia","email":"hello@creez.io"},"directories":{},"maintainers":[{"name":"cedfiducia","email":"hello@creez.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/granola_0.26.0_1788381473692_0.4505226674643219"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-31T19:57:07.232Z","modified":"2026-09-02T20:37:54.005Z","0.22.0":"2026-08-31T19:57:07.601Z","0.23.0":"2026-09-02T12:59:46.906Z","0.24.0":"2026-09-02T14:43:05.849Z","0.24.1":"2026-09-02T16:09:16.520Z","0.25.0":"2026-09-02T18:27:20.071Z","0.26.0":"2026-09-02T20:37:53.821Z"},"bugs":{"url":"https://github.com/creezio/creezio/issues"},"license":"UNLICENSED","homepage":"https://github.com/creezio/creezio#readme","repository":{"type":"git","url":"git+https://github.com/creezio/creezio.git","directory":"packages/granola"},"description":"Module natif Granola — réception webhook signée (Standard Webhooks), sync notes/transcripts et proxy API Granola","maintainers":[{"name":"cedfiducia","email":"hello@creez.io"}],"readme":"# @creezio/granola\n\nModule natif **Granola** (AI meeting notes) : le serveur marque expose une\nadresse webhook à coller dans Granola (Settings → Connectors → Webhooks) et\nreçoit toutes les livraisons (`note.generated`, `note.edited`,\n`note.access_granted`) — chaque note référencée est ensuite synchronisée en\n`brand.db` via l'API publique Granola.\n\n## Architecture (ADR-module-natif-hybride)\n\n- **Mount hybride** `granola` — enregistré **par la marque**\n  (`api.registerModuleApi(\"granola\", createGranolaMount({ defaults }))`) →\n  HTTP `/api/v1/modules/granola/*`, données en `brand.db`\n  (`granola_settings`, `granola_events`, `granola_notes`).\n- **Webhook** : `POST /api/v1/modules/granola/webhook` — récepteur\n  Standard Webhooks. Dès qu'un `signingSecret` (`whsec_…`) est configuré,\n  la vérification HMAC-SHA256 est **fail-closed** (401 `invalid_signature`),\n  avec dédup par `event_id` (les retries Granola réutilisent l'id).\n- **Sync notes** : le payload webhook ne porte jamais le contenu — la note\n  est re-fetchée avec la clé API (`grn_…`), les contrôles d'accès\n  s'appliquent côté Granola au fetch.\n- **Config** : défauts marque via `createGranolaMount({ defaults })`,\n  override à chaud `PUT config` (clé API, signing secret, origine publique),\n  secrets **masqués** en `GET config`.\n- **UI** : `@creezio/granola/ui` → `GranolaClient` compose\n  `GranolaNotesPanel` (workspace notes : liste filtrable, fiche résumé /\n  transcript — GRANOLA-1) et `GranolaConnectPanel` (santé, endpoints\n  distants, livraisons — GRANOLA-2).\n\n## API mount (câblé par la marque)\n\n| Méthode | Chemin | Rôle |\n|---------|--------|------|\n| POST | `webhook` | récepteur livraisons Granola (public, signé HMAC) |\n| GET | `webhook-info` | URL webhook à coller dans Granola |\n| POST | `register-webhook` | crée l'endpoint via l'API Granola + stocke le `signing_secret` (retourné une seule fois) |\n| GET/PUT/DELETE | `config` | config module (secrets masqués en GET) |\n| GET | `events` | livraisons reçues (dédupliquées, `verified`) |\n| GET | `notes` / `notes/<id>` | notes synchronisées localement |\n| GET | `notes/<id>/transcript` | proxy transcript paginé (`next_cursor`) |\n| POST | `notes/<id>/sync` | re-fetch d'une note via l'API |\n| GET | `remote/notes[?…]` | proxy `GET /v1/notes` (pagination, filtres) |\n| GET | `remote/notes/<id>[?include=transcript]` | proxy `GET /v1/notes/{id}` |\n| GET | `remote/notes/<id>/transcript` | proxy transcript paginé |\n| GET | `remote/folders` | proxy `GET /v1/folders` |\n| GET/PATCH/DELETE | `remote/webhook-endpoints[/<id>]` | gestion endpoints webhook Granola |\n\n## Câblage marque (3 gestes)\n\n```ts\n// 1. server/src/electron/brand-granola-content.ts (défauts, optionnel)\nexport const brandGranolaDefaults = {\n  publicBaseUrl: process.env.BRAND_PUBLIC_ORIGIN,\n};\n\n// 2. brand-migrations.ts\n...granolaMigrations(),\n\n// 3. brand-module-api.ts\napi.registerModuleApi(\"granola\", createGranolaMount({ defaults: brandGranolaDefaults }));\n```\n\nL'URL à coller dans Granola est alors\n`https://<origine-publique>/api/v1/modules/granola/webhook` (exposée par\n`GET webhook-info`). Prérequis côté Granola : plan Business/Enterprise\n(webhooks) + clé API `grn_…` (Settings → Connectors → API keys).\n\n## Client API\n\n`createGranolaClient({ apiKey, baseUrl?, fetchImpl? })` couvre toute la\nsurface documentée de l'API publique (`https://public-api.granola.ai`) :\nnotes, note + transcript, folders, webhook-endpoints (CRUD). Rate limits\nofficiels : burst 25 req/5 s, 5 req/s soutenu.\n","readmeFilename":"README.md"}