@kelpie/server 0.1.0
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.
- package/LICENSE +661 -0
- package/README.md +57 -0
- package/dist/app.d.ts +36 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +98 -0
- package/dist/app.js.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/actor.d.ts +71 -0
- package/dist/lib/actor.d.ts.map +1 -0
- package/dist/lib/actor.js +48 -0
- package/dist/lib/actor.js.map +1 -0
- package/dist/lib/changes.d.ts +17 -0
- package/dist/lib/changes.d.ts.map +1 -0
- package/dist/lib/changes.js +35 -0
- package/dist/lib/changes.js.map +1 -0
- package/dist/lib/columns.d.ts +152 -0
- package/dist/lib/columns.d.ts.map +1 -0
- package/dist/lib/columns.js +126 -0
- package/dist/lib/columns.js.map +1 -0
- package/dist/lib/config.d.ts +36 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +52 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/database.d.ts +57 -0
- package/dist/lib/database.d.ts.map +1 -0
- package/dist/lib/database.js +91 -0
- package/dist/lib/database.js.map +1 -0
- package/dist/lib/dates.d.ts +11 -0
- package/dist/lib/dates.d.ts.map +1 -0
- package/dist/lib/dates.js +17 -0
- package/dist/lib/dates.js.map +1 -0
- package/dist/lib/email.d.ts +42 -0
- package/dist/lib/email.d.ts.map +1 -0
- package/dist/lib/email.js +38 -0
- package/dist/lib/email.js.map +1 -0
- package/dist/lib/errors.d.ts +76 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +102 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/http.d.ts +59 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +89 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/ids.d.ts +55 -0
- package/dist/lib/ids.d.ts.map +1 -0
- package/dist/lib/ids.js +56 -0
- package/dist/lib/ids.js.map +1 -0
- package/dist/lib/logger.d.ts +22 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +43 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/moduleConfig.d.ts +14 -0
- package/dist/lib/moduleConfig.d.ts.map +1 -0
- package/dist/lib/moduleConfig.js +56 -0
- package/dist/lib/moduleConfig.js.map +1 -0
- package/dist/lib/normalisation.d.ts +19 -0
- package/dist/lib/normalisation.d.ts.map +1 -0
- package/dist/lib/normalisation.js +32 -0
- package/dist/lib/normalisation.js.map +1 -0
- package/dist/lib/pagination.d.ts +104 -0
- package/dist/lib/pagination.d.ts.map +1 -0
- package/dist/lib/pagination.js +189 -0
- package/dist/lib/pagination.js.map +1 -0
- package/dist/lib/passwords.d.ts +32 -0
- package/dist/lib/passwords.d.ts.map +1 -0
- package/dist/lib/passwords.js +51 -0
- package/dist/lib/passwords.js.map +1 -0
- package/dist/lib/search.d.ts +11 -0
- package/dist/lib/search.d.ts.map +1 -0
- package/dist/lib/search.js +25 -0
- package/dist/lib/search.js.map +1 -0
- package/dist/lib/secrets.d.ts +40 -0
- package/dist/lib/secrets.d.ts.map +1 -0
- package/dist/lib/secrets.js +152 -0
- package/dist/lib/secrets.js.map +1 -0
- package/dist/lib/timezones.d.ts +38 -0
- package/dist/lib/timezones.d.ts.map +1 -0
- package/dist/lib/timezones.js +55 -0
- package/dist/lib/timezones.js.map +1 -0
- package/dist/lib/tokens.d.ts +10 -0
- package/dist/lib/tokens.d.ts.map +1 -0
- package/dist/lib/tokens.js +31 -0
- package/dist/lib/tokens.js.map +1 -0
- package/dist/lib/url.d.ts +25 -0
- package/dist/lib/url.d.ts.map +1 -0
- package/dist/lib/url.js +41 -0
- package/dist/lib/url.js.map +1 -0
- package/dist/modules/activities/index.d.ts +18 -0
- package/dist/modules/activities/index.d.ts.map +1 -0
- package/dist/modules/activities/index.js +34 -0
- package/dist/modules/activities/index.js.map +1 -0
- package/dist/modules/activities/recorder.d.ts +53 -0
- package/dist/modules/activities/recorder.d.ts.map +1 -0
- package/dist/modules/activities/recorder.js +36 -0
- package/dist/modules/activities/recorder.js.map +1 -0
- package/dist/modules/activities/repository.d.ts +52 -0
- package/dist/modules/activities/repository.d.ts.map +1 -0
- package/dist/modules/activities/repository.js +127 -0
- package/dist/modules/activities/repository.js.map +1 -0
- package/dist/modules/activities/routes.d.ts +17 -0
- package/dist/modules/activities/routes.d.ts.map +1 -0
- package/dist/modules/activities/routes.js +45 -0
- package/dist/modules/activities/routes.js.map +1 -0
- package/dist/modules/activities/schema.d.ts +188 -0
- package/dist/modules/activities/schema.d.ts.map +1 -0
- package/dist/modules/activities/schema.js +34 -0
- package/dist/modules/activities/schema.js.map +1 -0
- package/dist/modules/activities/service.d.ts +32 -0
- package/dist/modules/activities/service.d.ts.map +1 -0
- package/dist/modules/activities/service.js +28 -0
- package/dist/modules/activities/service.js.map +1 -0
- package/dist/modules/activities/tools.d.ts +4 -0
- package/dist/modules/activities/tools.d.ts.map +1 -0
- package/dist/modules/activities/tools.js +26 -0
- package/dist/modules/activities/tools.js.map +1 -0
- package/dist/modules/activities/wording.d.ts +79 -0
- package/dist/modules/activities/wording.d.ts.map +1 -0
- package/dist/modules/activities/wording.js +134 -0
- package/dist/modules/activities/wording.js.map +1 -0
- package/dist/modules/agent-tasks/catalog.d.ts +16 -0
- package/dist/modules/agent-tasks/catalog.d.ts.map +1 -0
- package/dist/modules/agent-tasks/catalog.js +694 -0
- package/dist/modules/agent-tasks/catalog.js.map +1 -0
- package/dist/modules/agent-tasks/dispatch.d.ts +61 -0
- package/dist/modules/agent-tasks/dispatch.d.ts.map +1 -0
- package/dist/modules/agent-tasks/dispatch.js +139 -0
- package/dist/modules/agent-tasks/dispatch.js.map +1 -0
- package/dist/modules/agent-tasks/index.d.ts +17 -0
- package/dist/modules/agent-tasks/index.d.ts.map +1 -0
- package/dist/modules/agent-tasks/index.js +54 -0
- package/dist/modules/agent-tasks/index.js.map +1 -0
- package/dist/modules/agent-tasks/prompt.d.ts +41 -0
- package/dist/modules/agent-tasks/prompt.d.ts.map +1 -0
- package/dist/modules/agent-tasks/prompt.js +78 -0
- package/dist/modules/agent-tasks/prompt.js.map +1 -0
- package/dist/modules/agent-tasks/repository.d.ts +32 -0
- package/dist/modules/agent-tasks/repository.d.ts.map +1 -0
- package/dist/modules/agent-tasks/repository.js +83 -0
- package/dist/modules/agent-tasks/repository.js.map +1 -0
- package/dist/modules/agent-tasks/resolve.d.ts +44 -0
- package/dist/modules/agent-tasks/resolve.d.ts.map +1 -0
- package/dist/modules/agent-tasks/resolve.js +396 -0
- package/dist/modules/agent-tasks/resolve.js.map +1 -0
- package/dist/modules/agent-tasks/routes.d.ts +55 -0
- package/dist/modules/agent-tasks/routes.d.ts.map +1 -0
- package/dist/modules/agent-tasks/routes.js +173 -0
- package/dist/modules/agent-tasks/routes.js.map +1 -0
- package/dist/modules/agent-tasks/schema.d.ts +346 -0
- package/dist/modules/agent-tasks/schema.d.ts.map +1 -0
- package/dist/modules/agent-tasks/schema.js +47 -0
- package/dist/modules/agent-tasks/schema.js.map +1 -0
- package/dist/modules/agent-tasks/service.d.ts +79 -0
- package/dist/modules/agent-tasks/service.d.ts.map +1 -0
- package/dist/modules/agent-tasks/service.js +210 -0
- package/dist/modules/agent-tasks/service.js.map +1 -0
- package/dist/modules/agent-tasks/wire.d.ts +35 -0
- package/dist/modules/agent-tasks/wire.d.ts.map +1 -0
- package/dist/modules/agent-tasks/wire.js +31 -0
- package/dist/modules/agent-tasks/wire.js.map +1 -0
- package/dist/modules/api-keys/index.d.ts +9 -0
- package/dist/modules/api-keys/index.d.ts.map +1 -0
- package/dist/modules/api-keys/index.js +29 -0
- package/dist/modules/api-keys/index.js.map +1 -0
- package/dist/modules/api-keys/keys.d.ts +25 -0
- package/dist/modules/api-keys/keys.d.ts.map +1 -0
- package/dist/modules/api-keys/keys.js +40 -0
- package/dist/modules/api-keys/keys.js.map +1 -0
- package/dist/modules/api-keys/repository.d.ts +15 -0
- package/dist/modules/api-keys/repository.d.ts.map +1 -0
- package/dist/modules/api-keys/repository.js +48 -0
- package/dist/modules/api-keys/repository.js.map +1 -0
- package/dist/modules/api-keys/routes.d.ts +8 -0
- package/dist/modules/api-keys/routes.d.ts.map +1 -0
- package/dist/modules/api-keys/routes.js +52 -0
- package/dist/modules/api-keys/routes.js.map +1 -0
- package/dist/modules/api-keys/schema.d.ts +166 -0
- package/dist/modules/api-keys/schema.d.ts.map +1 -0
- package/dist/modules/api-keys/schema.js +23 -0
- package/dist/modules/api-keys/schema.js.map +1 -0
- package/dist/modules/api-keys/service.d.ts +37 -0
- package/dist/modules/api-keys/service.d.ts.map +1 -0
- package/dist/modules/api-keys/service.js +95 -0
- package/dist/modules/api-keys/service.js.map +1 -0
- package/dist/modules/attachedRecords.d.ts +39 -0
- package/dist/modules/attachedRecords.d.ts.map +1 -0
- package/dist/modules/attachedRecords.js +52 -0
- package/dist/modules/attachedRecords.js.map +1 -0
- package/dist/modules/auth/actor.d.ts +11 -0
- package/dist/modules/auth/actor.d.ts.map +1 -0
- package/dist/modules/auth/actor.js +10 -0
- package/dist/modules/auth/actor.js.map +1 -0
- package/dist/modules/auth/credentials.d.ts +18 -0
- package/dist/modules/auth/credentials.d.ts.map +1 -0
- package/dist/modules/auth/credentials.js +105 -0
- package/dist/modules/auth/credentials.js.map +1 -0
- package/dist/modules/auth/index.d.ts +3 -0
- package/dist/modules/auth/index.d.ts.map +1 -0
- package/dist/modules/auth/index.js +41 -0
- package/dist/modules/auth/index.js.map +1 -0
- package/dist/modules/auth/preferences.d.ts +34 -0
- package/dist/modules/auth/preferences.d.ts.map +1 -0
- package/dist/modules/auth/preferences.js +30 -0
- package/dist/modules/auth/preferences.js.map +1 -0
- package/dist/modules/auth/repository.d.ts +54 -0
- package/dist/modules/auth/repository.d.ts.map +1 -0
- package/dist/modules/auth/repository.js +137 -0
- package/dist/modules/auth/repository.js.map +1 -0
- package/dist/modules/auth/routes.d.ts +10 -0
- package/dist/modules/auth/routes.d.ts.map +1 -0
- package/dist/modules/auth/routes.js +181 -0
- package/dist/modules/auth/routes.js.map +1 -0
- package/dist/modules/auth/schema.d.ts +530 -0
- package/dist/modules/auth/schema.d.ts.map +1 -0
- package/dist/modules/auth/schema.js +67 -0
- package/dist/modules/auth/schema.js.map +1 -0
- package/dist/modules/auth/service.d.ts +73 -0
- package/dist/modules/auth/service.d.ts.map +1 -0
- package/dist/modules/auth/service.js +288 -0
- package/dist/modules/auth/service.js.map +1 -0
- package/dist/modules/auth/session.d.ts +16 -0
- package/dist/modules/auth/session.d.ts.map +1 -0
- package/dist/modules/auth/session.js +30 -0
- package/dist/modules/auth/session.js.map +1 -0
- package/dist/modules/companies/index.d.ts +9 -0
- package/dist/modules/companies/index.d.ts.map +1 -0
- package/dist/modules/companies/index.js +37 -0
- package/dist/modules/companies/index.js.map +1 -0
- package/dist/modules/companies/repository.d.ts +40 -0
- package/dist/modules/companies/repository.d.ts.map +1 -0
- package/dist/modules/companies/repository.js +112 -0
- package/dist/modules/companies/repository.js.map +1 -0
- package/dist/modules/companies/routes.d.ts +89 -0
- package/dist/modules/companies/routes.d.ts.map +1 -0
- package/dist/modules/companies/routes.js +125 -0
- package/dist/modules/companies/routes.js.map +1 -0
- package/dist/modules/companies/schema.d.ts +381 -0
- package/dist/modules/companies/schema.d.ts.map +1 -0
- package/dist/modules/companies/schema.js +51 -0
- package/dist/modules/companies/schema.js.map +1 -0
- package/dist/modules/companies/service.d.ts +49 -0
- package/dist/modules/companies/service.d.ts.map +1 -0
- package/dist/modules/companies/service.js +184 -0
- package/dist/modules/companies/service.js.map +1 -0
- package/dist/modules/companies/tools.d.ts +4 -0
- package/dist/modules/companies/tools.d.ts.map +1 -0
- package/dist/modules/companies/tools.js +27 -0
- package/dist/modules/companies/tools.js.map +1 -0
- package/dist/modules/core.d.ts +21 -0
- package/dist/modules/core.d.ts.map +1 -0
- package/dist/modules/core.js +82 -0
- package/dist/modules/core.js.map +1 -0
- package/dist/modules/crudTools.d.ts +99 -0
- package/dist/modules/crudTools.d.ts.map +1 -0
- package/dist/modules/crudTools.js +123 -0
- package/dist/modules/crudTools.js.map +1 -0
- package/dist/modules/dashboard/attention.d.ts +39 -0
- package/dist/modules/dashboard/attention.d.ts.map +1 -0
- package/dist/modules/dashboard/attention.js +57 -0
- package/dist/modules/dashboard/attention.js.map +1 -0
- package/dist/modules/dashboard/index.d.ts +15 -0
- package/dist/modules/dashboard/index.d.ts.map +1 -0
- package/dist/modules/dashboard/index.js +44 -0
- package/dist/modules/dashboard/index.js.map +1 -0
- package/dist/modules/dashboard/repository.d.ts +83 -0
- package/dist/modules/dashboard/repository.d.ts.map +1 -0
- package/dist/modules/dashboard/repository.js +217 -0
- package/dist/modules/dashboard/repository.js.map +1 -0
- package/dist/modules/dashboard/routes.d.ts +21 -0
- package/dist/modules/dashboard/routes.d.ts.map +1 -0
- package/dist/modules/dashboard/routes.js +116 -0
- package/dist/modules/dashboard/routes.js.map +1 -0
- package/dist/modules/dashboard/service.d.ts +122 -0
- package/dist/modules/dashboard/service.d.ts.map +1 -0
- package/dist/modules/dashboard/service.js +215 -0
- package/dist/modules/dashboard/service.js.map +1 -0
- package/dist/modules/dashboard/tools.d.ts +4 -0
- package/dist/modules/dashboard/tools.d.ts.map +1 -0
- package/dist/modules/dashboard/tools.js +33 -0
- package/dist/modules/dashboard/tools.js.map +1 -0
- package/dist/modules/deals/index.d.ts +11 -0
- package/dist/modules/deals/index.d.ts.map +1 -0
- package/dist/modules/deals/index.js +38 -0
- package/dist/modules/deals/index.js.map +1 -0
- package/dist/modules/deals/repository.d.ts +44 -0
- package/dist/modules/deals/repository.d.ts.map +1 -0
- package/dist/modules/deals/repository.js +160 -0
- package/dist/modules/deals/repository.js.map +1 -0
- package/dist/modules/deals/routes.d.ts +50 -0
- package/dist/modules/deals/routes.d.ts.map +1 -0
- package/dist/modules/deals/routes.js +132 -0
- package/dist/modules/deals/routes.js.map +1 -0
- package/dist/modules/deals/schema.d.ts +419 -0
- package/dist/modules/deals/schema.d.ts.map +1 -0
- package/dist/modules/deals/schema.js +61 -0
- package/dist/modules/deals/schema.js.map +1 -0
- package/dist/modules/deals/service.d.ts +71 -0
- package/dist/modules/deals/service.d.ts.map +1 -0
- package/dist/modules/deals/service.js +277 -0
- package/dist/modules/deals/service.js.map +1 -0
- package/dist/modules/deals/tools.d.ts +4 -0
- package/dist/modules/deals/tools.d.ts.map +1 -0
- package/dist/modules/deals/tools.js +33 -0
- package/dist/modules/deals/tools.js.map +1 -0
- package/dist/modules/decisions/index.d.ts +11 -0
- package/dist/modules/decisions/index.d.ts.map +1 -0
- package/dist/modules/decisions/index.js +34 -0
- package/dist/modules/decisions/index.js.map +1 -0
- package/dist/modules/decisions/repository.d.ts +38 -0
- package/dist/modules/decisions/repository.d.ts.map +1 -0
- package/dist/modules/decisions/repository.js +126 -0
- package/dist/modules/decisions/repository.js.map +1 -0
- package/dist/modules/decisions/routes.d.ts +42 -0
- package/dist/modules/decisions/routes.d.ts.map +1 -0
- package/dist/modules/decisions/routes.js +131 -0
- package/dist/modules/decisions/routes.js.map +1 -0
- package/dist/modules/decisions/schema.d.ts +228 -0
- package/dist/modules/decisions/schema.d.ts.map +1 -0
- package/dist/modules/decisions/schema.js +41 -0
- package/dist/modules/decisions/schema.js.map +1 -0
- package/dist/modules/decisions/service.d.ts +60 -0
- package/dist/modules/decisions/service.d.ts.map +1 -0
- package/dist/modules/decisions/service.js +122 -0
- package/dist/modules/decisions/service.js.map +1 -0
- package/dist/modules/decisions/tools.d.ts +4 -0
- package/dist/modules/decisions/tools.d.ts.map +1 -0
- package/dist/modules/decisions/tools.js +32 -0
- package/dist/modules/decisions/tools.js.map +1 -0
- package/dist/modules/forms/embed.d.ts +50 -0
- package/dist/modules/forms/embed.d.ts.map +1 -0
- package/dist/modules/forms/embed.js +236 -0
- package/dist/modules/forms/embed.js.map +1 -0
- package/dist/modules/forms/fields.d.ts +71 -0
- package/dist/modules/forms/fields.d.ts.map +1 -0
- package/dist/modules/forms/fields.js +122 -0
- package/dist/modules/forms/fields.js.map +1 -0
- package/dist/modules/forms/index.d.ts +15 -0
- package/dist/modules/forms/index.d.ts.map +1 -0
- package/dist/modules/forms/index.js +53 -0
- package/dist/modules/forms/index.js.map +1 -0
- package/dist/modules/forms/mapping.d.ts +99 -0
- package/dist/modules/forms/mapping.d.ts.map +1 -0
- package/dist/modules/forms/mapping.js +152 -0
- package/dist/modules/forms/mapping.js.map +1 -0
- package/dist/modules/forms/publicRoutes.d.ts +11 -0
- package/dist/modules/forms/publicRoutes.d.ts.map +1 -0
- package/dist/modules/forms/publicRoutes.js +68 -0
- package/dist/modules/forms/publicRoutes.js.map +1 -0
- package/dist/modules/forms/repository.d.ts +65 -0
- package/dist/modules/forms/repository.d.ts.map +1 -0
- package/dist/modules/forms/repository.js +139 -0
- package/dist/modules/forms/repository.js.map +1 -0
- package/dist/modules/forms/routes.d.ts +106 -0
- package/dist/modules/forms/routes.d.ts.map +1 -0
- package/dist/modules/forms/routes.js +204 -0
- package/dist/modules/forms/routes.js.map +1 -0
- package/dist/modules/forms/schema.d.ts +643 -0
- package/dist/modules/forms/schema.d.ts.map +1 -0
- package/dist/modules/forms/schema.js +87 -0
- package/dist/modules/forms/schema.js.map +1 -0
- package/dist/modules/forms/service.d.ts +62 -0
- package/dist/modules/forms/service.d.ts.map +1 -0
- package/dist/modules/forms/service.js +208 -0
- package/dist/modules/forms/service.js.map +1 -0
- package/dist/modules/forms/submission.d.ts +30 -0
- package/dist/modules/forms/submission.d.ts.map +1 -0
- package/dist/modules/forms/submission.js +337 -0
- package/dist/modules/forms/submission.js.map +1 -0
- package/dist/modules/forms/tools.d.ts +4 -0
- package/dist/modules/forms/tools.d.ts.map +1 -0
- package/dist/modules/forms/tools.js +46 -0
- package/dist/modules/forms/tools.js.map +1 -0
- package/dist/modules/handbook/index.d.ts +15 -0
- package/dist/modules/handbook/index.d.ts.map +1 -0
- package/dist/modules/handbook/index.js +37 -0
- package/dist/modules/handbook/index.js.map +1 -0
- package/dist/modules/handbook/repository.d.ts +52 -0
- package/dist/modules/handbook/repository.d.ts.map +1 -0
- package/dist/modules/handbook/repository.js +109 -0
- package/dist/modules/handbook/repository.js.map +1 -0
- package/dist/modules/handbook/routes.d.ts +38 -0
- package/dist/modules/handbook/routes.d.ts.map +1 -0
- package/dist/modules/handbook/routes.js +103 -0
- package/dist/modules/handbook/routes.js.map +1 -0
- package/dist/modules/handbook/schema.d.ts +206 -0
- package/dist/modules/handbook/schema.d.ts.map +1 -0
- package/dist/modules/handbook/schema.js +37 -0
- package/dist/modules/handbook/schema.js.map +1 -0
- package/dist/modules/handbook/service.d.ts +59 -0
- package/dist/modules/handbook/service.d.ts.map +1 -0
- package/dist/modules/handbook/service.js +246 -0
- package/dist/modules/handbook/service.js.map +1 -0
- package/dist/modules/handbook/slugs.d.ts +28 -0
- package/dist/modules/handbook/slugs.d.ts.map +1 -0
- package/dist/modules/handbook/slugs.js +48 -0
- package/dist/modules/handbook/slugs.js.map +1 -0
- package/dist/modules/handbook/tools.d.ts +4 -0
- package/dist/modules/handbook/tools.d.ts.map +1 -0
- package/dist/modules/handbook/tools.js +26 -0
- package/dist/modules/handbook/tools.js.map +1 -0
- package/dist/modules/handbook/tree.d.ts +69 -0
- package/dist/modules/handbook/tree.d.ts.map +1 -0
- package/dist/modules/handbook/tree.js +117 -0
- package/dist/modules/handbook/tree.js.map +1 -0
- package/dist/modules/hiring/candidates.d.ts +70 -0
- package/dist/modules/hiring/candidates.d.ts.map +1 -0
- package/dist/modules/hiring/candidates.js +243 -0
- package/dist/modules/hiring/candidates.js.map +1 -0
- package/dist/modules/hiring/index.d.ts +15 -0
- package/dist/modules/hiring/index.d.ts.map +1 -0
- package/dist/modules/hiring/index.js +48 -0
- package/dist/modules/hiring/index.js.map +1 -0
- package/dist/modules/hiring/repository.d.ts +52 -0
- package/dist/modules/hiring/repository.d.ts.map +1 -0
- package/dist/modules/hiring/repository.js +137 -0
- package/dist/modules/hiring/repository.js.map +1 -0
- package/dist/modules/hiring/roles.d.ts +42 -0
- package/dist/modules/hiring/roles.d.ts.map +1 -0
- package/dist/modules/hiring/roles.js +104 -0
- package/dist/modules/hiring/roles.js.map +1 -0
- package/dist/modules/hiring/routes.d.ts +73 -0
- package/dist/modules/hiring/routes.d.ts.map +1 -0
- package/dist/modules/hiring/routes.js +170 -0
- package/dist/modules/hiring/routes.js.map +1 -0
- package/dist/modules/hiring/schema.d.ts +308 -0
- package/dist/modules/hiring/schema.d.ts.map +1 -0
- package/dist/modules/hiring/schema.js +62 -0
- package/dist/modules/hiring/schema.js.map +1 -0
- package/dist/modules/hiring/tools.d.ts +8 -0
- package/dist/modules/hiring/tools.d.ts.map +1 -0
- package/dist/modules/hiring/tools.js +50 -0
- package/dist/modules/hiring/tools.js.map +1 -0
- package/dist/modules/import-export/csv.d.ts +47 -0
- package/dist/modules/import-export/csv.d.ts.map +1 -0
- package/dist/modules/import-export/csv.js +138 -0
- package/dist/modules/import-export/csv.js.map +1 -0
- package/dist/modules/import-export/drafts.d.ts +83 -0
- package/dist/modules/import-export/drafts.d.ts.map +1 -0
- package/dist/modules/import-export/drafts.js +97 -0
- package/dist/modules/import-export/drafts.js.map +1 -0
- package/dist/modules/import-export/exportRows.d.ts +8 -0
- package/dist/modules/import-export/exportRows.d.ts.map +1 -0
- package/dist/modules/import-export/exportRows.js +71 -0
- package/dist/modules/import-export/exportRows.js.map +1 -0
- package/dist/modules/import-export/index.d.ts +15 -0
- package/dist/modules/import-export/index.d.ts.map +1 -0
- package/dist/modules/import-export/index.js +43 -0
- package/dist/modules/import-export/index.js.map +1 -0
- package/dist/modules/import-export/mapping.d.ts +46 -0
- package/dist/modules/import-export/mapping.d.ts.map +1 -0
- package/dist/modules/import-export/mapping.js +115 -0
- package/dist/modules/import-export/mapping.js.map +1 -0
- package/dist/modules/import-export/plan.d.ts +107 -0
- package/dist/modules/import-export/plan.d.ts.map +1 -0
- package/dist/modules/import-export/plan.js +178 -0
- package/dist/modules/import-export/plan.js.map +1 -0
- package/dist/modules/import-export/presets.d.ts +39 -0
- package/dist/modules/import-export/presets.d.ts.map +1 -0
- package/dist/modules/import-export/presets.js +151 -0
- package/dist/modules/import-export/presets.js.map +1 -0
- package/dist/modules/import-export/repository.d.ts +171 -0
- package/dist/modules/import-export/repository.d.ts.map +1 -0
- package/dist/modules/import-export/repository.js +343 -0
- package/dist/modules/import-export/repository.js.map +1 -0
- package/dist/modules/import-export/routes.d.ts +9 -0
- package/dist/modules/import-export/routes.d.ts.map +1 -0
- package/dist/modules/import-export/routes.js +199 -0
- package/dist/modules/import-export/routes.js.map +1 -0
- package/dist/modules/import-export/schema.d.ts +494 -0
- package/dist/modules/import-export/schema.d.ts.map +1 -0
- package/dist/modules/import-export/schema.js +99 -0
- package/dist/modules/import-export/schema.js.map +1 -0
- package/dist/modules/import-export/service.d.ts +74 -0
- package/dist/modules/import-export/service.d.ts.map +1 -0
- package/dist/modules/import-export/service.js +561 -0
- package/dist/modules/import-export/service.js.map +1 -0
- package/dist/modules/import-export/streams.d.ts +4 -0
- package/dist/modules/import-export/streams.d.ts.map +1 -0
- package/dist/modules/import-export/streams.js +55 -0
- package/dist/modules/import-export/streams.js.map +1 -0
- package/dist/modules/import-export/tools.d.ts +22 -0
- package/dist/modules/import-export/tools.d.ts.map +1 -0
- package/dist/modules/import-export/tools.js +116 -0
- package/dist/modules/import-export/tools.js.map +1 -0
- package/dist/modules/import-export/validation.d.ts +7 -0
- package/dist/modules/import-export/validation.d.ts.map +1 -0
- package/dist/modules/import-export/validation.js +114 -0
- package/dist/modules/import-export/validation.js.map +1 -0
- package/dist/modules/import-export/writes.d.ts +45 -0
- package/dist/modules/import-export/writes.d.ts.map +1 -0
- package/dist/modules/import-export/writes.js +247 -0
- package/dist/modules/import-export/writes.js.map +1 -0
- package/dist/modules/integrations/schema.d.ts +185 -0
- package/dist/modules/integrations/schema.d.ts.map +1 -0
- package/dist/modules/integrations/schema.js +26 -0
- package/dist/modules/integrations/schema.js.map +1 -0
- package/dist/modules/mcp/index.d.ts +26 -0
- package/dist/modules/mcp/index.d.ts.map +1 -0
- package/dist/modules/mcp/index.js +45 -0
- package/dist/modules/mcp/index.js.map +1 -0
- package/dist/modules/mcp/protocol.d.ts +166 -0
- package/dist/modules/mcp/protocol.d.ts.map +1 -0
- package/dist/modules/mcp/protocol.js +292 -0
- package/dist/modules/mcp/protocol.js.map +1 -0
- package/dist/modules/mcp/router.d.ts +23 -0
- package/dist/modules/mcp/router.d.ts.map +1 -0
- package/dist/modules/mcp/router.js +298 -0
- package/dist/modules/mcp/router.js.map +1 -0
- package/dist/modules/notes/index.d.ts +9 -0
- package/dist/modules/notes/index.d.ts.map +1 -0
- package/dist/modules/notes/index.js +37 -0
- package/dist/modules/notes/index.js.map +1 -0
- package/dist/modules/notes/repository.d.ts +34 -0
- package/dist/modules/notes/repository.d.ts.map +1 -0
- package/dist/modules/notes/repository.js +70 -0
- package/dist/modules/notes/repository.js.map +1 -0
- package/dist/modules/notes/routes.d.ts +37 -0
- package/dist/modules/notes/routes.d.ts.map +1 -0
- package/dist/modules/notes/routes.js +124 -0
- package/dist/modules/notes/routes.js.map +1 -0
- package/dist/modules/notes/schema.d.ts +176 -0
- package/dist/modules/notes/schema.d.ts.map +1 -0
- package/dist/modules/notes/schema.js +35 -0
- package/dist/modules/notes/schema.js.map +1 -0
- package/dist/modules/notes/service.d.ts +49 -0
- package/dist/modules/notes/service.d.ts.map +1 -0
- package/dist/modules/notes/service.js +118 -0
- package/dist/modules/notes/service.js.map +1 -0
- package/dist/modules/notes/tools.d.ts +4 -0
- package/dist/modules/notes/tools.d.ts.map +1 -0
- package/dist/modules/notes/tools.js +41 -0
- package/dist/modules/notes/tools.js.map +1 -0
- package/dist/modules/opportunities/index.d.ts +11 -0
- package/dist/modules/opportunities/index.d.ts.map +1 -0
- package/dist/modules/opportunities/index.js +38 -0
- package/dist/modules/opportunities/index.js.map +1 -0
- package/dist/modules/opportunities/repository.d.ts +28 -0
- package/dist/modules/opportunities/repository.d.ts.map +1 -0
- package/dist/modules/opportunities/repository.js +89 -0
- package/dist/modules/opportunities/repository.js.map +1 -0
- package/dist/modules/opportunities/routes.d.ts +39 -0
- package/dist/modules/opportunities/routes.d.ts.map +1 -0
- package/dist/modules/opportunities/routes.js +104 -0
- package/dist/modules/opportunities/routes.js.map +1 -0
- package/dist/modules/opportunities/schema.d.ts +266 -0
- package/dist/modules/opportunities/schema.d.ts.map +1 -0
- package/dist/modules/opportunities/schema.js +41 -0
- package/dist/modules/opportunities/schema.js.map +1 -0
- package/dist/modules/opportunities/service.d.ts +60 -0
- package/dist/modules/opportunities/service.d.ts.map +1 -0
- package/dist/modules/opportunities/service.js +212 -0
- package/dist/modules/opportunities/service.js.map +1 -0
- package/dist/modules/opportunities/tools.d.ts +4 -0
- package/dist/modules/opportunities/tools.d.ts.map +1 -0
- package/dist/modules/opportunities/tools.js +33 -0
- package/dist/modules/opportunities/tools.js.map +1 -0
- package/dist/modules/partnerships/index.d.ts +11 -0
- package/dist/modules/partnerships/index.d.ts.map +1 -0
- package/dist/modules/partnerships/index.js +38 -0
- package/dist/modules/partnerships/index.js.map +1 -0
- package/dist/modules/partnerships/repository.d.ts +47 -0
- package/dist/modules/partnerships/repository.d.ts.map +1 -0
- package/dist/modules/partnerships/repository.js +169 -0
- package/dist/modules/partnerships/repository.js.map +1 -0
- package/dist/modules/partnerships/routes.d.ts +46 -0
- package/dist/modules/partnerships/routes.d.ts.map +1 -0
- package/dist/modules/partnerships/routes.js +122 -0
- package/dist/modules/partnerships/routes.js.map +1 -0
- package/dist/modules/partnerships/schema.d.ts +338 -0
- package/dist/modules/partnerships/schema.d.ts.map +1 -0
- package/dist/modules/partnerships/schema.js +54 -0
- package/dist/modules/partnerships/schema.js.map +1 -0
- package/dist/modules/partnerships/service.d.ts +71 -0
- package/dist/modules/partnerships/service.d.ts.map +1 -0
- package/dist/modules/partnerships/service.js +273 -0
- package/dist/modules/partnerships/service.js.map +1 -0
- package/dist/modules/partnerships/tools.d.ts +4 -0
- package/dist/modules/partnerships/tools.d.ts.map +1 -0
- package/dist/modules/partnerships/tools.js +35 -0
- package/dist/modules/partnerships/tools.js.map +1 -0
- package/dist/modules/people/index.d.ts +9 -0
- package/dist/modules/people/index.d.ts.map +1 -0
- package/dist/modules/people/index.js +37 -0
- package/dist/modules/people/index.js.map +1 -0
- package/dist/modules/people/repository.d.ts +31 -0
- package/dist/modules/people/repository.d.ts.map +1 -0
- package/dist/modules/people/repository.js +109 -0
- package/dist/modules/people/repository.js.map +1 -0
- package/dist/modules/people/routes.d.ts +111 -0
- package/dist/modules/people/routes.d.ts.map +1 -0
- package/dist/modules/people/routes.js +134 -0
- package/dist/modules/people/routes.js.map +1 -0
- package/dist/modules/people/schema.d.ts +354 -0
- package/dist/modules/people/schema.d.ts.map +1 -0
- package/dist/modules/people/schema.js +61 -0
- package/dist/modules/people/schema.js.map +1 -0
- package/dist/modules/people/service.d.ts +56 -0
- package/dist/modules/people/service.d.ts.map +1 -0
- package/dist/modules/people/service.js +190 -0
- package/dist/modules/people/service.js.map +1 -0
- package/dist/modules/people/tools.d.ts +4 -0
- package/dist/modules/people/tools.d.ts.map +1 -0
- package/dist/modules/people/tools.js +27 -0
- package/dist/modules/people/tools.js.map +1 -0
- package/dist/modules/pipelines/index.d.ts +9 -0
- package/dist/modules/pipelines/index.d.ts.map +1 -0
- package/dist/modules/pipelines/index.js +37 -0
- package/dist/modules/pipelines/index.js.map +1 -0
- package/dist/modules/pipelines/repository.d.ts +26 -0
- package/dist/modules/pipelines/repository.d.ts.map +1 -0
- package/dist/modules/pipelines/repository.js +67 -0
- package/dist/modules/pipelines/repository.js.map +1 -0
- package/dist/modules/pipelines/routes.d.ts +33 -0
- package/dist/modules/pipelines/routes.d.ts.map +1 -0
- package/dist/modules/pipelines/routes.js +98 -0
- package/dist/modules/pipelines/routes.js.map +1 -0
- package/dist/modules/pipelines/schema.d.ts +170 -0
- package/dist/modules/pipelines/schema.d.ts.map +1 -0
- package/dist/modules/pipelines/schema.js +30 -0
- package/dist/modules/pipelines/schema.js.map +1 -0
- package/dist/modules/pipelines/service.d.ts +49 -0
- package/dist/modules/pipelines/service.d.ts.map +1 -0
- package/dist/modules/pipelines/service.js +227 -0
- package/dist/modules/pipelines/service.js.map +1 -0
- package/dist/modules/pipelines/tools.d.ts +4 -0
- package/dist/modules/pipelines/tools.d.ts.map +1 -0
- package/dist/modules/pipelines/tools.js +43 -0
- package/dist/modules/pipelines/tools.js.map +1 -0
- package/dist/modules/plans/index.d.ts +10 -0
- package/dist/modules/plans/index.d.ts.map +1 -0
- package/dist/modules/plans/index.js +33 -0
- package/dist/modules/plans/index.js.map +1 -0
- package/dist/modules/plans/repository.d.ts +49 -0
- package/dist/modules/plans/repository.d.ts.map +1 -0
- package/dist/modules/plans/repository.js +94 -0
- package/dist/modules/plans/repository.js.map +1 -0
- package/dist/modules/plans/routes.d.ts +46 -0
- package/dist/modules/plans/routes.d.ts.map +1 -0
- package/dist/modules/plans/routes.js +152 -0
- package/dist/modules/plans/routes.js.map +1 -0
- package/dist/modules/plans/schema.d.ts +209 -0
- package/dist/modules/plans/schema.d.ts.map +1 -0
- package/dist/modules/plans/schema.js +37 -0
- package/dist/modules/plans/schema.js.map +1 -0
- package/dist/modules/plans/service.d.ts +57 -0
- package/dist/modules/plans/service.d.ts.map +1 -0
- package/dist/modules/plans/service.js +125 -0
- package/dist/modules/plans/service.js.map +1 -0
- package/dist/modules/plans/tools.d.ts +4 -0
- package/dist/modules/plans/tools.d.ts.map +1 -0
- package/dist/modules/plans/tools.js +39 -0
- package/dist/modules/plans/tools.js.map +1 -0
- package/dist/modules/positions/index.d.ts +9 -0
- package/dist/modules/positions/index.d.ts.map +1 -0
- package/dist/modules/positions/index.js +36 -0
- package/dist/modules/positions/index.js.map +1 -0
- package/dist/modules/positions/repository.d.ts +34 -0
- package/dist/modules/positions/repository.d.ts.map +1 -0
- package/dist/modules/positions/repository.js +71 -0
- package/dist/modules/positions/repository.js.map +1 -0
- package/dist/modules/positions/routes.d.ts +22 -0
- package/dist/modules/positions/routes.d.ts.map +1 -0
- package/dist/modules/positions/routes.js +56 -0
- package/dist/modules/positions/routes.js.map +1 -0
- package/dist/modules/positions/schema.d.ts +154 -0
- package/dist/modules/positions/schema.d.ts.map +1 -0
- package/dist/modules/positions/schema.js +36 -0
- package/dist/modules/positions/schema.js.map +1 -0
- package/dist/modules/positions/service.d.ts +46 -0
- package/dist/modules/positions/service.d.ts.map +1 -0
- package/dist/modules/positions/service.js +159 -0
- package/dist/modules/positions/service.js.map +1 -0
- package/dist/modules/positions/tools.d.ts +4 -0
- package/dist/modules/positions/tools.d.ts.map +1 -0
- package/dist/modules/positions/tools.js +26 -0
- package/dist/modules/positions/tools.js.map +1 -0
- package/dist/modules/raises/index.d.ts +11 -0
- package/dist/modules/raises/index.d.ts.map +1 -0
- package/dist/modules/raises/index.js +38 -0
- package/dist/modules/raises/index.js.map +1 -0
- package/dist/modules/raises/repository.d.ts +48 -0
- package/dist/modules/raises/repository.d.ts.map +1 -0
- package/dist/modules/raises/repository.js +164 -0
- package/dist/modules/raises/repository.js.map +1 -0
- package/dist/modules/raises/routes.d.ts +48 -0
- package/dist/modules/raises/routes.d.ts.map +1 -0
- package/dist/modules/raises/routes.js +126 -0
- package/dist/modules/raises/routes.js.map +1 -0
- package/dist/modules/raises/schema.d.ts +356 -0
- package/dist/modules/raises/schema.d.ts.map +1 -0
- package/dist/modules/raises/schema.js +55 -0
- package/dist/modules/raises/schema.js.map +1 -0
- package/dist/modules/raises/service.d.ts +79 -0
- package/dist/modules/raises/service.d.ts.map +1 -0
- package/dist/modules/raises/service.js +275 -0
- package/dist/modules/raises/service.js.map +1 -0
- package/dist/modules/raises/tools.d.ts +4 -0
- package/dist/modules/raises/tools.d.ts.map +1 -0
- package/dist/modules/raises/tools.js +33 -0
- package/dist/modules/raises/tools.js.map +1 -0
- package/dist/modules/recordTargets.d.ts +55 -0
- package/dist/modules/recordTargets.d.ts.map +1 -0
- package/dist/modules/recordTargets.js +107 -0
- package/dist/modules/recordTargets.js.map +1 -0
- package/dist/modules/references.d.ts +8 -0
- package/dist/modules/references.d.ts.map +1 -0
- package/dist/modules/references.js +40 -0
- package/dist/modules/references.js.map +1 -0
- package/dist/modules/reseal.d.ts +33 -0
- package/dist/modules/reseal.d.ts.map +1 -0
- package/dist/modules/reseal.js +108 -0
- package/dist/modules/reseal.js.map +1 -0
- package/dist/modules/search/index.d.ts +21 -0
- package/dist/modules/search/index.d.ts.map +1 -0
- package/dist/modules/search/index.js +50 -0
- package/dist/modules/search/index.js.map +1 -0
- package/dist/modules/search/query.d.ts +44 -0
- package/dist/modules/search/query.d.ts.map +1 -0
- package/dist/modules/search/query.js +88 -0
- package/dist/modules/search/query.js.map +1 -0
- package/dist/modules/search/repository.d.ts +44 -0
- package/dist/modules/search/repository.d.ts.map +1 -0
- package/dist/modules/search/repository.js +252 -0
- package/dist/modules/search/repository.js.map +1 -0
- package/dist/modules/search/routes.d.ts +17 -0
- package/dist/modules/search/routes.d.ts.map +1 -0
- package/dist/modules/search/routes.js +93 -0
- package/dist/modules/search/routes.js.map +1 -0
- package/dist/modules/search/service.d.ts +55 -0
- package/dist/modules/search/service.d.ts.map +1 -0
- package/dist/modules/search/service.js +69 -0
- package/dist/modules/search/service.js.map +1 -0
- package/dist/modules/search/tools.d.ts +4 -0
- package/dist/modules/search/tools.d.ts.map +1 -0
- package/dist/modules/search/tools.js +52 -0
- package/dist/modules/search/tools.js.map +1 -0
- package/dist/modules/stagedRecords.d.ts +28 -0
- package/dist/modules/stagedRecords.d.ts.map +1 -0
- package/dist/modules/stagedRecords.js +50 -0
- package/dist/modules/stagedRecords.js.map +1 -0
- package/dist/modules/webhooks/delivery.d.ts +98 -0
- package/dist/modules/webhooks/delivery.d.ts.map +1 -0
- package/dist/modules/webhooks/delivery.js +237 -0
- package/dist/modules/webhooks/delivery.js.map +1 -0
- package/dist/modules/webhooks/index.d.ts +23 -0
- package/dist/modules/webhooks/index.d.ts.map +1 -0
- package/dist/modules/webhooks/index.js +48 -0
- package/dist/modules/webhooks/index.js.map +1 -0
- package/dist/modules/webhooks/payloads.d.ts +31 -0
- package/dist/modules/webhooks/payloads.d.ts.map +1 -0
- package/dist/modules/webhooks/payloads.js +52 -0
- package/dist/modules/webhooks/payloads.js.map +1 -0
- package/dist/modules/webhooks/repository.d.ts +70 -0
- package/dist/modules/webhooks/repository.d.ts.map +1 -0
- package/dist/modules/webhooks/repository.js +140 -0
- package/dist/modules/webhooks/repository.js.map +1 -0
- package/dist/modules/webhooks/routes.d.ts +47 -0
- package/dist/modules/webhooks/routes.d.ts.map +1 -0
- package/dist/modules/webhooks/routes.js +170 -0
- package/dist/modules/webhooks/routes.js.map +1 -0
- package/dist/modules/webhooks/schema.d.ts +396 -0
- package/dist/modules/webhooks/schema.d.ts.map +1 -0
- package/dist/modules/webhooks/schema.js +61 -0
- package/dist/modules/webhooks/schema.js.map +1 -0
- package/dist/modules/webhooks/service.d.ts +65 -0
- package/dist/modules/webhooks/service.d.ts.map +1 -0
- package/dist/modules/webhooks/service.js +202 -0
- package/dist/modules/webhooks/service.js.map +1 -0
- package/dist/modules/webhooks/signing.d.ts +57 -0
- package/dist/modules/webhooks/signing.d.ts.map +1 -0
- package/dist/modules/webhooks/signing.js +69 -0
- package/dist/modules/webhooks/signing.js.map +1 -0
- package/dist/modules/webhooks/tools.d.ts +4 -0
- package/dist/modules/webhooks/tools.d.ts.map +1 -0
- package/dist/modules/webhooks/tools.js +77 -0
- package/dist/modules/webhooks/tools.js.map +1 -0
- package/dist/modules/webhooks/url.d.ts +10 -0
- package/dist/modules/webhooks/url.d.ts.map +1 -0
- package/dist/modules/webhooks/url.js +9 -0
- package/dist/modules/webhooks/url.js.map +1 -0
- package/dist/modules/workspace/capabilities.d.ts +9 -0
- package/dist/modules/workspace/capabilities.d.ts.map +1 -0
- package/dist/modules/workspace/capabilities.js +12 -0
- package/dist/modules/workspace/capabilities.js.map +1 -0
- package/dist/modules/workspace/idempotencyMiddleware.d.ts +16 -0
- package/dist/modules/workspace/idempotencyMiddleware.d.ts.map +1 -0
- package/dist/modules/workspace/idempotencyMiddleware.js +142 -0
- package/dist/modules/workspace/idempotencyMiddleware.js.map +1 -0
- package/dist/modules/workspace/idempotencyRepository.d.ts +43 -0
- package/dist/modules/workspace/idempotencyRepository.d.ts.map +1 -0
- package/dist/modules/workspace/idempotencyRepository.js +75 -0
- package/dist/modules/workspace/idempotencyRepository.js.map +1 -0
- package/dist/modules/workspace/index.d.ts +9 -0
- package/dist/modules/workspace/index.d.ts.map +1 -0
- package/dist/modules/workspace/index.js +53 -0
- package/dist/modules/workspace/index.js.map +1 -0
- package/dist/modules/workspace/repository.d.ts +112 -0
- package/dist/modules/workspace/repository.d.ts.map +1 -0
- package/dist/modules/workspace/repository.js +266 -0
- package/dist/modules/workspace/repository.js.map +1 -0
- package/dist/modules/workspace/roles.d.ts +22 -0
- package/dist/modules/workspace/roles.d.ts.map +1 -0
- package/dist/modules/workspace/roles.js +31 -0
- package/dist/modules/workspace/roles.js.map +1 -0
- package/dist/modules/workspace/routes.d.ts +41 -0
- package/dist/modules/workspace/routes.d.ts.map +1 -0
- package/dist/modules/workspace/routes.js +158 -0
- package/dist/modules/workspace/routes.js.map +1 -0
- package/dist/modules/workspace/schema.d.ts +719 -0
- package/dist/modules/workspace/schema.d.ts.map +1 -0
- package/dist/modules/workspace/schema.js +102 -0
- package/dist/modules/workspace/schema.js.map +1 -0
- package/dist/modules/workspace/service.d.ts +94 -0
- package/dist/modules/workspace/service.d.ts.map +1 -0
- package/dist/modules/workspace/service.js +528 -0
- package/dist/modules/workspace/service.js.map +1 -0
- package/dist/modules/workspace/starters.d.ts +22 -0
- package/dist/modules/workspace/starters.d.ts.map +1 -0
- package/dist/modules/workspace/starters.js +56 -0
- package/dist/modules/workspace/starters.js.map +1 -0
- package/dist/modules/workspace/tools.d.ts +4 -0
- package/dist/modules/workspace/tools.d.ts.map +1 -0
- package/dist/modules/workspace/tools.js +95 -0
- package/dist/modules/workspace/tools.js.map +1 -0
- package/dist/runtime/entitlements.d.ts +66 -0
- package/dist/runtime/entitlements.d.ts.map +1 -0
- package/dist/runtime/entitlements.js +62 -0
- package/dist/runtime/entitlements.js.map +1 -0
- package/dist/runtime/events.d.ts +139 -0
- package/dist/runtime/events.d.ts.map +1 -0
- package/dist/runtime/events.js +98 -0
- package/dist/runtime/events.js.map +1 -0
- package/dist/runtime/migrate.d.ts +28 -0
- package/dist/runtime/migrate.d.ts.map +1 -0
- package/dist/runtime/migrate.js +43 -0
- package/dist/runtime/migrate.js.map +1 -0
- package/dist/runtime/module.d.ts +138 -0
- package/dist/runtime/module.d.ts.map +1 -0
- package/dist/runtime/module.js +2 -0
- package/dist/runtime/module.js.map +1 -0
- package/dist/runtime/moduleConfig.d.ts +21 -0
- package/dist/runtime/moduleConfig.d.ts.map +1 -0
- package/dist/runtime/moduleConfig.js +54 -0
- package/dist/runtime/moduleConfig.js.map +1 -0
- package/dist/runtime/order.d.ts +21 -0
- package/dist/runtime/order.d.ts.map +1 -0
- package/dist/runtime/order.js +72 -0
- package/dist/runtime/order.js.map +1 -0
- package/dist/runtime/registry.d.ts +66 -0
- package/dist/runtime/registry.d.ts.map +1 -0
- package/dist/runtime/registry.js +148 -0
- package/dist/runtime/registry.js.map +1 -0
- package/dist/runtime/transaction.d.ts +34 -0
- package/dist/runtime/transaction.d.ts.map +1 -0
- package/dist/runtime/transaction.js +24 -0
- package/dist/runtime/transaction.js.map +1 -0
- package/dist/schema/index.d.ts +30 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +30 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/testing/app.d.ts +42 -0
- package/dist/testing/app.d.ts.map +1 -0
- package/dist/testing/app.js +31 -0
- package/dist/testing/app.js.map +1 -0
- package/dist/testing/client.d.ts +34 -0
- package/dist/testing/client.d.ts.map +1 -0
- package/dist/testing/client.js +70 -0
- package/dist/testing/client.js.map +1 -0
- package/dist/testing/database.d.ts +17 -0
- package/dist/testing/database.d.ts.map +1 -0
- package/dist/testing/database.js +84 -0
- package/dist/testing/database.js.map +1 -0
- package/dist/testing/environment.d.ts +17 -0
- package/dist/testing/environment.d.ts.map +1 -0
- package/dist/testing/environment.js +19 -0
- package/dist/testing/environment.js.map +1 -0
- package/dist/testing/fixtures.d.ts +22 -0
- package/dist/testing/fixtures.d.ts.map +1 -0
- package/dist/testing/fixtures.js +55 -0
- package/dist/testing/fixtures.js.map +1 -0
- package/dist/testing/index.d.ts +10 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +6 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/services.d.ts +18 -0
- package/dist/testing/services.d.ts.map +1 -0
- package/dist/testing/services.js +43 -0
- package/dist/testing/services.js.map +1 -0
- package/migrations/0000_initial_schema.sql +597 -0
- package/migrations/0001_uneven_lockjaw.sql +11 -0
- package/migrations/0002_neat_madame_web.sql +2 -0
- package/migrations/0003_bright_shockwave.sql +1 -0
- package/migrations/0004_drop_unused_import_columns.sql +2 -0
- package/migrations/0005_import_job_rows.sql +23 -0
- package/migrations/0006_drop_webhook_secret_hash.sql +1 -0
- package/migrations/0007_add_webhook_secret_encrypted.sql +1 -0
- package/migrations/0008_rich_mister_sinister.sql +3 -0
- package/migrations/0009_natural_proemial_gods.sql +1 -0
- package/migrations/0010_fine_brood.sql +1 -0
- package/migrations/0011_add_webhook_previous_secret.sql +2 -0
- package/migrations/0012_idempotency_keys_response_nullable.sql +1 -0
- package/migrations/0013_add_agent_run_failure_reason.sql +1 -0
- package/migrations/0014_right_shinko_yamashiro.sql +12 -0
- package/migrations/0015_peaceful_chimera.sql +33 -0
- package/migrations/meta/0000_snapshot.json +4467 -0
- package/migrations/meta/0001_snapshot.json +4539 -0
- package/migrations/meta/0002_snapshot.json +4539 -0
- package/migrations/meta/0003_snapshot.json +4544 -0
- package/migrations/meta/0004_snapshot.json +4531 -0
- package/migrations/meta/0005_snapshot.json +4674 -0
- package/migrations/meta/0006_snapshot.json +4668 -0
- package/migrations/meta/0007_snapshot.json +4674 -0
- package/migrations/meta/0008_snapshot.json +4694 -0
- package/migrations/meta/0009_snapshot.json +4700 -0
- package/migrations/meta/0010_snapshot.json +4694 -0
- package/migrations/meta/0011_snapshot.json +4706 -0
- package/migrations/meta/0012_snapshot.json +4706 -0
- package/migrations/meta/0013_snapshot.json +4712 -0
- package/migrations/meta/0014_snapshot.json +4802 -0
- package/migrations/meta/0015_snapshot.json +5077 -0
- package/migrations/meta/_journal.json +118 -0
- package/package.json +68 -0
- package/src/app.ts +157 -0
- package/src/index.ts +113 -0
- package/src/lib/actor.ts +99 -0
- package/src/lib/changes.ts +43 -0
- package/src/lib/columns.ts +170 -0
- package/src/lib/config.ts +86 -0
- package/src/lib/database.ts +118 -0
- package/src/lib/dates.ts +18 -0
- package/src/lib/email.ts +65 -0
- package/src/lib/errors.ts +156 -0
- package/src/lib/http.ts +109 -0
- package/src/lib/ids.ts +61 -0
- package/src/lib/logger.ts +73 -0
- package/src/lib/moduleConfig.ts +65 -0
- package/src/lib/normalisation.ts +36 -0
- package/src/lib/pagination.ts +291 -0
- package/src/lib/passwords.ts +56 -0
- package/src/lib/search.ts +29 -0
- package/src/lib/secrets.ts +223 -0
- package/src/lib/timezones.ts +59 -0
- package/src/lib/tokens.ts +37 -0
- package/src/lib/url.ts +52 -0
- package/src/modules/activities/index.ts +43 -0
- package/src/modules/activities/recorder.ts +108 -0
- package/src/modules/activities/repository.ts +196 -0
- package/src/modules/activities/routes.ts +78 -0
- package/src/modules/activities/schema.ts +41 -0
- package/src/modules/activities/service.ts +93 -0
- package/src/modules/activities/tools.ts +40 -0
- package/src/modules/activities/wording.ts +168 -0
- package/src/modules/agent-tasks/catalog.ts +712 -0
- package/src/modules/agent-tasks/dispatch.ts +188 -0
- package/src/modules/agent-tasks/index.ts +79 -0
- package/src/modules/agent-tasks/prompt.ts +140 -0
- package/src/modules/agent-tasks/repository.ts +152 -0
- package/src/modules/agent-tasks/resolve.ts +704 -0
- package/src/modules/agent-tasks/routes.ts +260 -0
- package/src/modules/agent-tasks/schema.ts +57 -0
- package/src/modules/agent-tasks/service.ts +370 -0
- package/src/modules/agent-tasks/wire.ts +61 -0
- package/src/modules/api-keys/index.ts +34 -0
- package/src/modules/api-keys/keys.ts +59 -0
- package/src/modules/api-keys/repository.ts +82 -0
- package/src/modules/api-keys/routes.ts +83 -0
- package/src/modules/api-keys/schema.ts +28 -0
- package/src/modules/api-keys/service.ts +152 -0
- package/src/modules/attachedRecords.ts +85 -0
- package/src/modules/auth/actor.ts +17 -0
- package/src/modules/auth/credentials.ts +153 -0
- package/src/modules/auth/index.ts +49 -0
- package/src/modules/auth/preferences.ts +57 -0
- package/src/modules/auth/repository.ts +240 -0
- package/src/modules/auth/routes.ts +247 -0
- package/src/modules/auth/schema.ts +77 -0
- package/src/modules/auth/service.ts +441 -0
- package/src/modules/auth/session.ts +40 -0
- package/src/modules/companies/index.ts +43 -0
- package/src/modules/companies/repository.ts +185 -0
- package/src/modules/companies/routes.ts +170 -0
- package/src/modules/companies/schema.ts +66 -0
- package/src/modules/companies/service.ts +267 -0
- package/src/modules/companies/tools.ts +32 -0
- package/src/modules/core.ts +93 -0
- package/src/modules/crudTools.ts +226 -0
- package/src/modules/dashboard/attention.ts +67 -0
- package/src/modules/dashboard/index.ts +49 -0
- package/src/modules/dashboard/repository.ts +360 -0
- package/src/modules/dashboard/routes.ts +171 -0
- package/src/modules/dashboard/service.ts +449 -0
- package/src/modules/dashboard/tools.ts +39 -0
- package/src/modules/deals/index.ts +44 -0
- package/src/modules/deals/repository.ts +251 -0
- package/src/modules/deals/routes.ts +166 -0
- package/src/modules/deals/schema.ts +72 -0
- package/src/modules/deals/service.ts +433 -0
- package/src/modules/deals/tools.ts +39 -0
- package/src/modules/decisions/index.ts +40 -0
- package/src/modules/decisions/repository.ts +204 -0
- package/src/modules/decisions/routes.ts +184 -0
- package/src/modules/decisions/schema.ts +56 -0
- package/src/modules/decisions/service.ts +223 -0
- package/src/modules/decisions/tools.ts +38 -0
- package/src/modules/forms/embed.ts +274 -0
- package/src/modules/forms/fields.ts +206 -0
- package/src/modules/forms/index.ts +61 -0
- package/src/modules/forms/mapping.ts +222 -0
- package/src/modules/forms/publicRoutes.ts +92 -0
- package/src/modules/forms/repository.ts +223 -0
- package/src/modules/forms/routes.ts +276 -0
- package/src/modules/forms/schema.ts +135 -0
- package/src/modules/forms/service.ts +362 -0
- package/src/modules/forms/submission.ts +496 -0
- package/src/modules/forms/tools.ts +66 -0
- package/src/modules/handbook/index.ts +43 -0
- package/src/modules/handbook/repository.ts +173 -0
- package/src/modules/handbook/routes.ts +145 -0
- package/src/modules/handbook/schema.ts +43 -0
- package/src/modules/handbook/service.ts +399 -0
- package/src/modules/handbook/slugs.ts +54 -0
- package/src/modules/handbook/tools.ts +32 -0
- package/src/modules/handbook/tree.ts +158 -0
- package/src/modules/hiring/candidates.ts +391 -0
- package/src/modules/hiring/index.ts +55 -0
- package/src/modules/hiring/repository.ts +244 -0
- package/src/modules/hiring/roles.ts +174 -0
- package/src/modules/hiring/routes.ts +257 -0
- package/src/modules/hiring/schema.ts +93 -0
- package/src/modules/hiring/tools.ts +73 -0
- package/src/modules/import-export/csv.ts +180 -0
- package/src/modules/import-export/drafts.ts +182 -0
- package/src/modules/import-export/exportRows.ts +85 -0
- package/src/modules/import-export/index.ts +49 -0
- package/src/modules/import-export/mapping.ts +154 -0
- package/src/modules/import-export/plan.ts +311 -0
- package/src/modules/import-export/presets.ts +183 -0
- package/src/modules/import-export/repository.ts +603 -0
- package/src/modules/import-export/routes.ts +276 -0
- package/src/modules/import-export/schema.ts +142 -0
- package/src/modules/import-export/service.ts +842 -0
- package/src/modules/import-export/streams.ts +98 -0
- package/src/modules/import-export/tools.ts +153 -0
- package/src/modules/import-export/validation.ts +163 -0
- package/src/modules/import-export/writes.ts +365 -0
- package/src/modules/integrations/schema.ts +31 -0
- package/src/modules/mcp/index.ts +52 -0
- package/src/modules/mcp/protocol.ts +442 -0
- package/src/modules/mcp/router.ts +425 -0
- package/src/modules/notes/index.ts +43 -0
- package/src/modules/notes/repository.ts +130 -0
- package/src/modules/notes/routes.ts +170 -0
- package/src/modules/notes/schema.ts +42 -0
- package/src/modules/notes/service.ts +204 -0
- package/src/modules/notes/tools.ts +46 -0
- package/src/modules/opportunities/index.ts +44 -0
- package/src/modules/opportunities/repository.ts +157 -0
- package/src/modules/opportunities/routes.ts +152 -0
- package/src/modules/opportunities/schema.ts +47 -0
- package/src/modules/opportunities/service.ts +342 -0
- package/src/modules/opportunities/tools.ts +39 -0
- package/src/modules/partnerships/index.ts +44 -0
- package/src/modules/partnerships/repository.ts +274 -0
- package/src/modules/partnerships/routes.ts +170 -0
- package/src/modules/partnerships/schema.ts +65 -0
- package/src/modules/partnerships/service.ts +442 -0
- package/src/modules/partnerships/tools.ts +41 -0
- package/src/modules/people/index.ts +43 -0
- package/src/modules/people/repository.ts +167 -0
- package/src/modules/people/routes.ts +175 -0
- package/src/modules/people/schema.ts +89 -0
- package/src/modules/people/service.ts +284 -0
- package/src/modules/people/tools.ts +32 -0
- package/src/modules/pipelines/index.ts +43 -0
- package/src/modules/pipelines/repository.ts +116 -0
- package/src/modules/pipelines/routes.ts +157 -0
- package/src/modules/pipelines/schema.ts +37 -0
- package/src/modules/pipelines/service.ts +339 -0
- package/src/modules/pipelines/tools.ts +52 -0
- package/src/modules/plans/index.ts +39 -0
- package/src/modules/plans/repository.ts +174 -0
- package/src/modules/plans/routes.ts +212 -0
- package/src/modules/plans/schema.ts +45 -0
- package/src/modules/plans/service.ts +223 -0
- package/src/modules/plans/tools.ts +45 -0
- package/src/modules/positions/index.ts +42 -0
- package/src/modules/positions/repository.ts +136 -0
- package/src/modules/positions/routes.ts +97 -0
- package/src/modules/positions/schema.ts +42 -0
- package/src/modules/positions/service.ts +253 -0
- package/src/modules/positions/tools.ts +32 -0
- package/src/modules/raises/index.ts +44 -0
- package/src/modules/raises/repository.ts +254 -0
- package/src/modules/raises/routes.ts +160 -0
- package/src/modules/raises/schema.ts +66 -0
- package/src/modules/raises/service.ts +442 -0
- package/src/modules/raises/tools.ts +39 -0
- package/src/modules/recordTargets.ts +194 -0
- package/src/modules/references.ts +44 -0
- package/src/modules/reseal.ts +178 -0
- package/src/modules/search/index.ts +55 -0
- package/src/modules/search/query.ts +104 -0
- package/src/modules/search/repository.ts +388 -0
- package/src/modules/search/routes.ts +131 -0
- package/src/modules/search/service.ts +153 -0
- package/src/modules/search/tools.ts +60 -0
- package/src/modules/stagedRecords.ts +91 -0
- package/src/modules/webhooks/delivery.ts +349 -0
- package/src/modules/webhooks/index.ts +85 -0
- package/src/modules/webhooks/payloads.ts +84 -0
- package/src/modules/webhooks/repository.ts +244 -0
- package/src/modules/webhooks/routes.ts +240 -0
- package/src/modules/webhooks/schema.ts +78 -0
- package/src/modules/webhooks/service.ts +347 -0
- package/src/modules/webhooks/signing.ts +95 -0
- package/src/modules/webhooks/tools.ts +108 -0
- package/src/modules/webhooks/url.ts +21 -0
- package/src/modules/workspace/capabilities.ts +14 -0
- package/src/modules/workspace/idempotencyMiddleware.ts +207 -0
- package/src/modules/workspace/idempotencyRepository.ts +111 -0
- package/src/modules/workspace/index.ts +64 -0
- package/src/modules/workspace/repository.ts +420 -0
- package/src/modules/workspace/roles.ts +38 -0
- package/src/modules/workspace/routes.ts +255 -0
- package/src/modules/workspace/schema.ts +130 -0
- package/src/modules/workspace/service.ts +798 -0
- package/src/modules/workspace/starters.ts +69 -0
- package/src/modules/workspace/tools.ts +141 -0
- package/src/runtime/entitlements.ts +142 -0
- package/src/runtime/events.ts +185 -0
- package/src/runtime/migrate.ts +75 -0
- package/src/runtime/module.ts +147 -0
- package/src/runtime/moduleConfig.ts +68 -0
- package/src/runtime/order.ts +90 -0
- package/src/runtime/registry.ts +263 -0
- package/src/runtime/transaction.ts +80 -0
- package/src/schema/index.ts +30 -0
- package/src/testing/app.ts +79 -0
- package/src/testing/client.ts +118 -0
- package/src/testing/database.ts +106 -0
- package/src/testing/environment.ts +22 -0
- package/src/testing/fixtures.ts +70 -0
- package/src/testing/index.ts +13 -0
- package/src/testing/services.ts +67 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { SEARCH_COLLECTIONS } from '@kelpie/schemas'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
import { MAX_PAGE_SIZE } from '../../lib/pagination.ts'
|
|
5
|
+
import type { McpToolRegistry } from '../../runtime/module.ts'
|
|
6
|
+
import { MAX_SEARCH_TERM_LENGTH } from './query.ts'
|
|
7
|
+
import { searchResponse } from './routes.ts'
|
|
8
|
+
import type { SearchService } from './service.ts'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* `search_query`, and nothing else. Nothing here writes.
|
|
12
|
+
*
|
|
13
|
+
* Named for what it does rather than for the REST verb. `api.md` builds a tool
|
|
14
|
+
* name from the path segment and the verb, which would give `search_get`; that
|
|
15
|
+
* reads as fetching a saved search, and a tool an agent picks from a list of
|
|
16
|
+
* dozens is chosen by its name before its description.
|
|
17
|
+
*
|
|
18
|
+
* This is the tool an agent reaches for before any of the `*_list` ones: those
|
|
19
|
+
* need to know which resource holds the answer, and a question rarely does.
|
|
20
|
+
*/
|
|
21
|
+
const queryArgs = z.strictObject({
|
|
22
|
+
q: z
|
|
23
|
+
.string()
|
|
24
|
+
.min(1)
|
|
25
|
+
.max(MAX_SEARCH_TERM_LENGTH)
|
|
26
|
+
.describe('What to search for. Every word is matched as a prefix, so partial words work.'),
|
|
27
|
+
type: z
|
|
28
|
+
.array(z.enum(SEARCH_COLLECTIONS))
|
|
29
|
+
.nonempty()
|
|
30
|
+
.optional()
|
|
31
|
+
.describe('Which collections to look through. Omit to search all nine.'),
|
|
32
|
+
limit: z
|
|
33
|
+
.number()
|
|
34
|
+
.int()
|
|
35
|
+
.min(1)
|
|
36
|
+
.max(MAX_PAGE_SIZE)
|
|
37
|
+
.optional()
|
|
38
|
+
.describe('How many results each group carries. The total beside each group is exact.'),
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
export function registerSearchTools(mcp: McpToolRegistry, service: SearchService): void {
|
|
42
|
+
mcp.tool({
|
|
43
|
+
name: 'search_query',
|
|
44
|
+
description:
|
|
45
|
+
'Search every CRM record and handbook page at once: People (including the job titles on ' +
|
|
46
|
+
'their Positions), Companies, Deals, Opportunities, Raises, Partnerships, Roles, Decisions, ' +
|
|
47
|
+
'and handbook bodies. Deals, Opportunities and Raises also match the titles of their Plan ' +
|
|
48
|
+
'items. Results come back grouped by collection, each group ranked and carrying an exact ' +
|
|
49
|
+
'total, with a snippet centred on the match. Mirrors GET /v1/search.',
|
|
50
|
+
inputSchema: queryArgs,
|
|
51
|
+
invoke: async (args, actor) =>
|
|
52
|
+
searchResponse(
|
|
53
|
+
await service.find(actor, {
|
|
54
|
+
term: args.q,
|
|
55
|
+
limit: args.limit,
|
|
56
|
+
collections: args.type,
|
|
57
|
+
}),
|
|
58
|
+
),
|
|
59
|
+
})
|
|
60
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { and, eq } from 'drizzle-orm'
|
|
2
|
+
|
|
3
|
+
import type { Queryable } from '../runtime/transaction.ts'
|
|
4
|
+
import { deals } from './deals/schema.ts'
|
|
5
|
+
import { opportunities } from './opportunities/schema.ts'
|
|
6
|
+
import { partnerships } from './partnerships/schema.ts'
|
|
7
|
+
import type { PipelineKind } from './pipelines/schema.ts'
|
|
8
|
+
import { raises } from './raises/schema.ts'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The four tables whose rows sit in a pipeline stage, for the one operation that
|
|
12
|
+
* spans them all: removing a stage moves whatever still references it.
|
|
13
|
+
*
|
|
14
|
+
* Touching four modules' tables here rather than composing four services follows
|
|
15
|
+
* `attachedRecords.ts`: the alternative is a stage removal that imports every
|
|
16
|
+
* staged service to ask each for a bulk move it exists for nowhere else.
|
|
17
|
+
*
|
|
18
|
+
* Four written-out branches rather than a table-of-tables, because Drizzle's
|
|
19
|
+
* `update().set()` needs the concrete table type to check the column names.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
export interface StagedRecordMove {
|
|
23
|
+
readonly workspaceId: string
|
|
24
|
+
readonly fromStageId: string
|
|
25
|
+
readonly toStageId: string
|
|
26
|
+
readonly movedAt: Date
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Moves every record of one kind out of a stage.
|
|
31
|
+
*
|
|
32
|
+
* @param db Must be the caller's transaction: the move only makes sense alongside
|
|
33
|
+
* the stage delete that forced it.
|
|
34
|
+
* @returns The ids that moved, for the caller's activity trail and events.
|
|
35
|
+
*/
|
|
36
|
+
export async function reassignStagedRecords(
|
|
37
|
+
db: Queryable,
|
|
38
|
+
kind: PipelineKind,
|
|
39
|
+
move: StagedRecordMove,
|
|
40
|
+
): Promise<readonly string[]> {
|
|
41
|
+
const changes = { stageId: move.toStageId, updatedAt: move.movedAt }
|
|
42
|
+
|
|
43
|
+
switch (kind) {
|
|
44
|
+
case 'deal': {
|
|
45
|
+
const moved = await db
|
|
46
|
+
.update(deals)
|
|
47
|
+
.set(changes)
|
|
48
|
+
.where(and(eq(deals.workspaceId, move.workspaceId), eq(deals.stageId, move.fromStageId)))
|
|
49
|
+
.returning({ id: deals.id })
|
|
50
|
+
|
|
51
|
+
return moved.map((row) => row.id)
|
|
52
|
+
}
|
|
53
|
+
case 'opportunity': {
|
|
54
|
+
const moved = await db
|
|
55
|
+
.update(opportunities)
|
|
56
|
+
.set(changes)
|
|
57
|
+
.where(
|
|
58
|
+
and(
|
|
59
|
+
eq(opportunities.workspaceId, move.workspaceId),
|
|
60
|
+
eq(opportunities.stageId, move.fromStageId),
|
|
61
|
+
),
|
|
62
|
+
)
|
|
63
|
+
.returning({ id: opportunities.id })
|
|
64
|
+
|
|
65
|
+
return moved.map((row) => row.id)
|
|
66
|
+
}
|
|
67
|
+
case 'raise': {
|
|
68
|
+
const moved = await db
|
|
69
|
+
.update(raises)
|
|
70
|
+
.set(changes)
|
|
71
|
+
.where(and(eq(raises.workspaceId, move.workspaceId), eq(raises.stageId, move.fromStageId)))
|
|
72
|
+
.returning({ id: raises.id })
|
|
73
|
+
|
|
74
|
+
return moved.map((row) => row.id)
|
|
75
|
+
}
|
|
76
|
+
case 'partnership': {
|
|
77
|
+
const moved = await db
|
|
78
|
+
.update(partnerships)
|
|
79
|
+
.set(changes)
|
|
80
|
+
.where(
|
|
81
|
+
and(
|
|
82
|
+
eq(partnerships.workspaceId, move.workspaceId),
|
|
83
|
+
eq(partnerships.stageId, move.fromStageId),
|
|
84
|
+
),
|
|
85
|
+
)
|
|
86
|
+
.returning({ id: partnerships.id })
|
|
87
|
+
|
|
88
|
+
return moved.map((row) => row.id)
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
|
|
3
|
+
import type { Database } from '../../lib/database.ts'
|
|
4
|
+
import { describeThrown } from '../../lib/errors.ts'
|
|
5
|
+
import type { IdFactory } from '../../lib/ids.ts'
|
|
6
|
+
import type { Logger } from '../../lib/logger.ts'
|
|
7
|
+
import type { SecretCipher } from '../../lib/secrets.ts'
|
|
8
|
+
import type { TransactionScope } from '../../runtime/transaction.ts'
|
|
9
|
+
import type { WebhookEventPayload } from './payloads.ts'
|
|
10
|
+
import * as repository from './repository.ts'
|
|
11
|
+
import type { WebhookRecord } from './repository.ts'
|
|
12
|
+
import { deliveryBody, deliveryHeaders, renderDeliveryBody, signDeliveryBody } from './signing.ts'
|
|
13
|
+
import type { DeliveryEnvelope } from './signing.ts'
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The delivery engine: a consumer of the internal event bus that turns one
|
|
17
|
+
* domain event into one signed HTTP request per subscribed webhook.
|
|
18
|
+
*
|
|
19
|
+
* It runs after the emitting transaction commits and is not awaited by the
|
|
20
|
+
* request that caused it (`runtime/transaction.ts`), so an unreachable endpoint
|
|
21
|
+
* slows nobody down.
|
|
22
|
+
*
|
|
23
|
+
* Delivery is at-least-once and there is no durable queue, the same caveat the
|
|
24
|
+
* bus itself carries. A crash between the commit and the last attempt loses the
|
|
25
|
+
* delivery; the retry budget below is deliberately small so a graceful shutdown
|
|
26
|
+
* is not held open for minutes waiting for an endpoint that is already gone.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/** How long one attempt may take before it counts as failed. */
|
|
30
|
+
export const DELIVERY_TIMEOUT_MS = 10_000
|
|
31
|
+
|
|
32
|
+
/** Waits between attempts. Its length plus one is the attempt budget. */
|
|
33
|
+
export const RETRY_DELAYS_MS: readonly number[] = [1_000, 5_000, 15_000]
|
|
34
|
+
|
|
35
|
+
export const MAX_DELIVERY_ATTEMPTS = RETRY_DELAYS_MS.length + 1
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @param attempts How many attempts have already been made.
|
|
39
|
+
* @returns How long to wait before the next one, or undefined when the budget
|
|
40
|
+
* is spent and the delivery has failed for good.
|
|
41
|
+
*/
|
|
42
|
+
export function retryDelayAfter(attempts: number): number | undefined {
|
|
43
|
+
return RETRY_DELAYS_MS[attempts - 1]
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const DAY_MS = 86_400_000
|
|
47
|
+
|
|
48
|
+
/** What an unset `WEBHOOK_DELIVERY_RETENTION_DAYS` means. */
|
|
49
|
+
export const DEFAULT_DELIVERY_RETENTION_DAYS = 30
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* The environment slice for the delivery log's retention window. Validated at
|
|
53
|
+
* boot through `context.config`, so a malformed value stops the service with
|
|
54
|
+
* the module named rather than quietly pruning by the wrong window.
|
|
55
|
+
*
|
|
56
|
+
* Optional with a stated default, unlike most of the environment: absence is
|
|
57
|
+
* the normal state for an operator who does not care how long the log is, and
|
|
58
|
+
* the README's configuration table carries the default so it is not silent.
|
|
59
|
+
* Blank counts as absent, the `SECRET_ENCRYPTION_KEY_PREVIOUS` rule: operators
|
|
60
|
+
* empty a line far more often than they delete it.
|
|
61
|
+
*/
|
|
62
|
+
export const deliveryRetentionConfigSchema = z.object({
|
|
63
|
+
WEBHOOK_DELIVERY_RETENTION_DAYS: z
|
|
64
|
+
.string()
|
|
65
|
+
.optional()
|
|
66
|
+
.transform((value) => (value === undefined || value.trim().length === 0 ? undefined : value))
|
|
67
|
+
.refine(
|
|
68
|
+
(value) => value === undefined || (Number.isInteger(Number(value)) && Number(value) >= 1),
|
|
69
|
+
{ message: 'must be a whole number of days, at least 1' },
|
|
70
|
+
)
|
|
71
|
+
.transform((value) =>
|
|
72
|
+
value === undefined ? DEFAULT_DELIVERY_RETENTION_DAYS : Number(value),
|
|
73
|
+
),
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
export type DeliveryRetentionConfig = z.infer<typeof deliveryRetentionConfigSchema>
|
|
77
|
+
|
|
78
|
+
/** The moment a log row written before has outlived its retention. */
|
|
79
|
+
export function retentionCutoff(at: Date, retentionDays: number): Date {
|
|
80
|
+
return new Date(at.getTime() - retentionDays * DAY_MS)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface DeliveryRequest {
|
|
84
|
+
readonly url: string
|
|
85
|
+
readonly body: string
|
|
86
|
+
readonly headers: Readonly<Record<string, string>>
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface AttemptOutcome {
|
|
90
|
+
readonly delivered: boolean
|
|
91
|
+
/** The response status, or null when no response arrived at all. */
|
|
92
|
+
readonly status: number | null
|
|
93
|
+
/** Why it failed, for the log. Null on success. */
|
|
94
|
+
readonly reason: string | null
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** The outbound port. Injected so no test makes a network call. */
|
|
98
|
+
export type SendDelivery = (request: DeliveryRequest) => Promise<AttemptOutcome>
|
|
99
|
+
|
|
100
|
+
export type Sleep = (milliseconds: number) => Promise<void>
|
|
101
|
+
|
|
102
|
+
export function sleepFor(milliseconds: number): Promise<void> {
|
|
103
|
+
return new Promise((resolve) => {
|
|
104
|
+
setTimeout(resolve, milliseconds)
|
|
105
|
+
})
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* The real sender.
|
|
110
|
+
*
|
|
111
|
+
* Redirects are not followed. A customer whose endpoint moved should see the
|
|
112
|
+
* `301` and update the registration, rather than have Kelpie quietly post
|
|
113
|
+
* workspace data to whichever host the old one now points at.
|
|
114
|
+
*
|
|
115
|
+
* The catch is broad because this is the process boundary: `fetch` rejects with
|
|
116
|
+
* anything from a DNS failure to an abort, the set is open, and turning all of
|
|
117
|
+
* it into one outcome is the port's whole job. Nothing is swallowed — the
|
|
118
|
+
* reason reaches the log and the delivery is recorded as failed.
|
|
119
|
+
*/
|
|
120
|
+
export function createHttpSender(fetchImplementation: typeof fetch = fetch): SendDelivery {
|
|
121
|
+
return async (request) => {
|
|
122
|
+
try {
|
|
123
|
+
const response = await fetchImplementation(request.url, {
|
|
124
|
+
method: 'POST',
|
|
125
|
+
body: request.body,
|
|
126
|
+
headers: request.headers,
|
|
127
|
+
redirect: 'manual',
|
|
128
|
+
signal: AbortSignal.timeout(DELIVERY_TIMEOUT_MS),
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
return response.ok
|
|
132
|
+
? { delivered: true, status: response.status, reason: null }
|
|
133
|
+
: {
|
|
134
|
+
delivered: false,
|
|
135
|
+
status: response.status,
|
|
136
|
+
reason: `endpoint answered ${String(response.status)}`,
|
|
137
|
+
}
|
|
138
|
+
} catch (error: unknown) {
|
|
139
|
+
return { delivered: false, status: null, reason: describeThrown(error) }
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export interface DeliveryDependencies {
|
|
145
|
+
readonly db: Database
|
|
146
|
+
readonly transaction: TransactionScope
|
|
147
|
+
readonly createId: IdFactory
|
|
148
|
+
readonly now: () => Date
|
|
149
|
+
readonly cipher: SecretCipher
|
|
150
|
+
readonly send: SendDelivery
|
|
151
|
+
/** Injected so tests do not spend the retry budget in real time. */
|
|
152
|
+
readonly sleep: Sleep
|
|
153
|
+
/** From `deliveryRetentionConfigSchema`, validated at boot. */
|
|
154
|
+
readonly retentionDays: number
|
|
155
|
+
readonly log: Logger
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export interface DeliveryEngine {
|
|
159
|
+
/** Fans one event out to every subscribed webhook in its workspace. */
|
|
160
|
+
deliver(payload: WebhookEventPayload): Promise<void>
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export function createDeliveryEngine(dependencies: DeliveryDependencies): DeliveryEngine {
|
|
164
|
+
/**
|
|
165
|
+
* Writes the outcome: one log row, the expired rows gone, and the webhook's
|
|
166
|
+
* status when it moved.
|
|
167
|
+
*
|
|
168
|
+
* One transaction, so a reader never sees a hook marked failing with no
|
|
169
|
+
* failure recorded against it.
|
|
170
|
+
*
|
|
171
|
+
* Retention is enforced here rather than by a schedule because there is no
|
|
172
|
+
* scheduler in the service, and the log only grows through this function —
|
|
173
|
+
* pruning on every append caps the table exactly where the growth happens.
|
|
174
|
+
* The cost is the documented residue: a hook that stops delivering keeps its
|
|
175
|
+
* last window of rows until the hook or the workspace is deleted.
|
|
176
|
+
*/
|
|
177
|
+
async function record(
|
|
178
|
+
webhook: WebhookRecord,
|
|
179
|
+
payload: WebhookEventPayload,
|
|
180
|
+
delivery: {
|
|
181
|
+
id: string
|
|
182
|
+
sentAt: Date
|
|
183
|
+
body: Record<string, unknown>
|
|
184
|
+
attempts: number
|
|
185
|
+
outcome: AttemptOutcome
|
|
186
|
+
},
|
|
187
|
+
): Promise<void> {
|
|
188
|
+
const nextStatus = delivery.outcome.delivered ? 'active' : 'failing'
|
|
189
|
+
|
|
190
|
+
const pruned = await dependencies.transaction(async ({ tx }) => {
|
|
191
|
+
await repository.insertDelivery(tx, {
|
|
192
|
+
id: delivery.id,
|
|
193
|
+
workspaceId: webhook.workspaceId,
|
|
194
|
+
webhookId: webhook.id,
|
|
195
|
+
event: payload.event,
|
|
196
|
+
payload: delivery.body,
|
|
197
|
+
status: delivery.outcome.delivered ? 'success' : 'failed',
|
|
198
|
+
attempts: delivery.attempts,
|
|
199
|
+
// `created_at` is when the delivery was built, which is the `created_at`
|
|
200
|
+
// inside the payload too, so the log row and what the receiver holds
|
|
201
|
+
// agree. `delivered_at` is when it actually landed, up to the whole
|
|
202
|
+
// retry budget later.
|
|
203
|
+
deliveredAt: delivery.outcome.delivered ? dependencies.now() : null,
|
|
204
|
+
createdAt: delivery.sentAt,
|
|
205
|
+
})
|
|
206
|
+
|
|
207
|
+
// The cutoff is later than the row above's `created_at` for any positive
|
|
208
|
+
// window, so a prune can never take the delivery it arrived with, and
|
|
209
|
+
// `last_delivery_*` always has a row to read.
|
|
210
|
+
const expired = await repository.deleteExpiredDeliveries(
|
|
211
|
+
tx,
|
|
212
|
+
webhook.id,
|
|
213
|
+
retentionCutoff(dependencies.now(), dependencies.retentionDays),
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
// A paused webhook is never selected for delivery, so the only statuses
|
|
217
|
+
// reachable here are the two the engine owns. Leaving an unchanged one
|
|
218
|
+
// alone keeps a healthy endpoint from being rewritten on every event.
|
|
219
|
+
if (webhook.status !== nextStatus) {
|
|
220
|
+
await repository.setWebhookStatus(tx, webhook.id, nextStatus)
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return expired
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
// After the transaction settles: a rollback would make this line a lie.
|
|
227
|
+
if (pruned > 0) {
|
|
228
|
+
dependencies.log.debug('pruned expired webhook deliveries', {
|
|
229
|
+
webhookId: webhook.id,
|
|
230
|
+
pruned,
|
|
231
|
+
})
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
async function attemptUntilDelivered(request: DeliveryRequest): Promise<{
|
|
236
|
+
attempts: number
|
|
237
|
+
outcome: AttemptOutcome
|
|
238
|
+
}> {
|
|
239
|
+
let attempts = 0
|
|
240
|
+
|
|
241
|
+
for (;;) {
|
|
242
|
+
attempts += 1
|
|
243
|
+
|
|
244
|
+
const outcome = await dependencies.send(request)
|
|
245
|
+
|
|
246
|
+
if (outcome.delivered) {
|
|
247
|
+
return { attempts, outcome }
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const delay = retryDelayAfter(attempts)
|
|
251
|
+
|
|
252
|
+
if (delay === undefined) {
|
|
253
|
+
return { attempts, outcome }
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
await dependencies.sleep(delay)
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Every secret this delivery should be signed under, newest first.
|
|
262
|
+
*
|
|
263
|
+
* A secret that will not decrypt throws, and the caller logs it against this
|
|
264
|
+
* webhook. Deliberately not recorded as a failed delivery: the endpoint did
|
|
265
|
+
* nothing wrong, Kelpie's key did, and marking the registration `failing`
|
|
266
|
+
* would send the customer debugging their own server while the real fault is
|
|
267
|
+
* `SECRET_ENCRYPTION_KEY`.
|
|
268
|
+
*
|
|
269
|
+
* The expiry is read here rather than swept by a job. There is no scheduler in
|
|
270
|
+
* the service, and an overlap that has run out simply stops being signed with;
|
|
271
|
+
* the column is cleared by the next rotation or by deleting the registration.
|
|
272
|
+
*/
|
|
273
|
+
function signaturesFor(webhook: WebhookRecord, text: string, at: Date): readonly string[] {
|
|
274
|
+
const signatures = [signDeliveryBody(dependencies.cipher.open(webhook.secretEncrypted), text)]
|
|
275
|
+
const expiresAt = webhook.previousSecretExpiresAt
|
|
276
|
+
|
|
277
|
+
if (webhook.previousSecretEncrypted !== null && expiresAt !== null && expiresAt > at) {
|
|
278
|
+
signatures.push(
|
|
279
|
+
signDeliveryBody(dependencies.cipher.open(webhook.previousSecretEncrypted), text),
|
|
280
|
+
)
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
return signatures
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
async function deliverTo(webhook: WebhookRecord, payload: WebhookEventPayload): Promise<void> {
|
|
287
|
+
const deliveryId = dependencies.createId('webhookDelivery')
|
|
288
|
+
const envelope: DeliveryEnvelope = {
|
|
289
|
+
deliveryId,
|
|
290
|
+
event: payload.event,
|
|
291
|
+
sentAt: dependencies.now(),
|
|
292
|
+
workspaceId: payload.workspaceId,
|
|
293
|
+
data: payload.data,
|
|
294
|
+
}
|
|
295
|
+
const body = deliveryBody(envelope)
|
|
296
|
+
const text = renderDeliveryBody(body)
|
|
297
|
+
const { attempts, outcome } = await attemptUntilDelivered({
|
|
298
|
+
url: webhook.url,
|
|
299
|
+
body: text,
|
|
300
|
+
headers: deliveryHeaders(envelope, signaturesFor(webhook, text, envelope.sentAt)),
|
|
301
|
+
})
|
|
302
|
+
|
|
303
|
+
if (!outcome.delivered) {
|
|
304
|
+
dependencies.log.warn('webhook delivery failed', {
|
|
305
|
+
webhookId: webhook.id,
|
|
306
|
+
deliveryId,
|
|
307
|
+
event: payload.event,
|
|
308
|
+
attempts,
|
|
309
|
+
status: outcome.status,
|
|
310
|
+
reason: outcome.reason,
|
|
311
|
+
})
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// The body is stored as it was sent, so the log answers "what did they
|
|
315
|
+
// actually receive" rather than "what would we build for this event today".
|
|
316
|
+
await record(webhook, payload, { id: deliveryId, sentAt: envelope.sentAt, body, attempts, outcome })
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
return {
|
|
320
|
+
async deliver(payload) {
|
|
321
|
+
const subscribed = await repository.listSubscribed(
|
|
322
|
+
dependencies.db,
|
|
323
|
+
payload.workspaceId,
|
|
324
|
+
payload.event,
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
if (subscribed.length === 0) {
|
|
328
|
+
return
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// One unreachable endpoint, or one row whose secret will not decrypt,
|
|
332
|
+
// must not stop the others. Same reason the bus settles its handlers
|
|
333
|
+
// rather than racing them.
|
|
334
|
+
const outcomes = await Promise.allSettled(
|
|
335
|
+
subscribed.map((webhook) => deliverTo(webhook, payload)),
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
for (const [index, outcome] of outcomes.entries()) {
|
|
339
|
+
if (outcome.status === 'rejected') {
|
|
340
|
+
dependencies.log.error('webhook delivery could not be attempted', {
|
|
341
|
+
webhookId: subscribed[index]?.id,
|
|
342
|
+
event: payload.event,
|
|
343
|
+
error: describeThrown(outcome.reason),
|
|
344
|
+
})
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
}
|
|
349
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { createSecretCipher, secretEncryptionConfigSchema } from '../../lib/secrets.ts'
|
|
2
|
+
import type { KelpieModule } from '../../runtime/module.ts'
|
|
3
|
+
import {
|
|
4
|
+
createDeliveryEngine,
|
|
5
|
+
createHttpSender,
|
|
6
|
+
deliveryRetentionConfigSchema,
|
|
7
|
+
sleepFor,
|
|
8
|
+
} from './delivery.ts'
|
|
9
|
+
import type { SendDelivery, Sleep } from './delivery.ts'
|
|
10
|
+
import { subscribeDeliverableEvents } from './payloads.ts'
|
|
11
|
+
import { mountWebhooksRoutes } from './routes.ts'
|
|
12
|
+
import * as schema from './schema.ts'
|
|
13
|
+
import { createWebhooksService } from './service.ts'
|
|
14
|
+
import { registerWebhooksTools } from './tools.ts'
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Webhooks: registration, and the engine that bridges the internal event bus to
|
|
18
|
+
* outbound HTTP.
|
|
19
|
+
*
|
|
20
|
+
* `requires` is `workspace` alone. The engine consumes events by name and never
|
|
21
|
+
* reads the tables behind them, so it does not depend on the modules that emit
|
|
22
|
+
* them — a payload carries the record's type and id and nothing else, which is
|
|
23
|
+
* what keeps this module from growing a dependency on every CRM module in turn.
|
|
24
|
+
*
|
|
25
|
+
* Subscription happens during `register`, and `architecture.md` fixes this
|
|
26
|
+
* module near the end of the core order, so every emitting module is already in
|
|
27
|
+
* place. Nothing depends on that: the bus resolves handlers at publication.
|
|
28
|
+
*/
|
|
29
|
+
export interface WebhooksModuleOptions {
|
|
30
|
+
/** Injected by tests so no suite makes a network call. */
|
|
31
|
+
readonly send?: SendDelivery
|
|
32
|
+
/** Injected by tests so no suite spends the retry budget in real time. */
|
|
33
|
+
readonly sleep?: Sleep
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function createWebhooksModule(
|
|
37
|
+
migrationsDirectory: string,
|
|
38
|
+
options: WebhooksModuleOptions = {},
|
|
39
|
+
): KelpieModule {
|
|
40
|
+
return {
|
|
41
|
+
id: 'webhooks',
|
|
42
|
+
requires: ['workspace'],
|
|
43
|
+
|
|
44
|
+
register(context) {
|
|
45
|
+
// Validated at boot rather than on the first delivery: a missing or
|
|
46
|
+
// malformed key means no webhook can ever be signed, and finding that out
|
|
47
|
+
// when a customer's endpoint goes quiet is far too late. The retention
|
|
48
|
+
// window is validated the same way for the same reason — a bad value
|
|
49
|
+
// should stop boot, not prune by the wrong window.
|
|
50
|
+
const cipher = createSecretCipher(context.config(secretEncryptionConfigSchema))
|
|
51
|
+
const retention = context.config(deliveryRetentionConfigSchema)
|
|
52
|
+
|
|
53
|
+
const service = createWebhooksService({
|
|
54
|
+
db: context.db,
|
|
55
|
+
transaction: context.transaction,
|
|
56
|
+
createId: context.createId,
|
|
57
|
+
now: context.now,
|
|
58
|
+
cipher,
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
const engine = createDeliveryEngine({
|
|
62
|
+
db: context.db,
|
|
63
|
+
transaction: context.transaction,
|
|
64
|
+
createId: context.createId,
|
|
65
|
+
now: context.now,
|
|
66
|
+
cipher,
|
|
67
|
+
send: options.send ?? createHttpSender(),
|
|
68
|
+
sleep: options.sleep ?? sleepFor,
|
|
69
|
+
retentionDays: retention.WEBHOOK_DELIVERY_RETENTION_DAYS,
|
|
70
|
+
log: context.log,
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
context.schema(schema, migrationsDirectory)
|
|
74
|
+
subscribeDeliverableEvents(context.events, (payload) => engine.deliver(payload))
|
|
75
|
+
|
|
76
|
+
context.routes((router) => {
|
|
77
|
+
mountWebhooksRoutes(router, { db: context.db, now: context.now, service })
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
registerWebhooksTools(context.mcp, service)
|
|
81
|
+
|
|
82
|
+
return Promise.resolve()
|
|
83
|
+
},
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { WebhookEvent } from '@kelpie/schemas'
|
|
2
|
+
|
|
3
|
+
import type { DomainEvents, EventBus } from '../../runtime/events.ts'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The bridge from the internal event catalog to what a webhook receiver sees.
|
|
7
|
+
*
|
|
8
|
+
* `modules.md` makes the webhooks engine a consumer of the bus, so this is the
|
|
9
|
+
* only place that knows both vocabularies. Everything downstream works with a
|
|
10
|
+
* `WebhookEventPayload` and never sees a `DomainEvents` key.
|
|
11
|
+
*
|
|
12
|
+
* Payload keys are `snake_case`, matching `api.md`, because a receiver has no
|
|
13
|
+
* reason to expect a different convention from a webhook than from the REST
|
|
14
|
+
* surface it also calls.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export type { WebhookEvent }
|
|
18
|
+
|
|
19
|
+
/** One event, resolved to the workspace it belongs to and the body to send. */
|
|
20
|
+
export interface WebhookEventPayload {
|
|
21
|
+
readonly workspaceId: string
|
|
22
|
+
readonly event: WebhookEvent
|
|
23
|
+
/** The `data` object of the delivery body. */
|
|
24
|
+
readonly data: Record<string, unknown>
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Payload builders, one per deliverable event.
|
|
29
|
+
*
|
|
30
|
+
* `satisfies` is what keeps this honest: adding a name to `WEBHOOK_EVENTS`
|
|
31
|
+
* without a builder here is a compile error rather than an event that resolves
|
|
32
|
+
* to nothing at runtime.
|
|
33
|
+
*/
|
|
34
|
+
const builders = {
|
|
35
|
+
'record.created': (payload: DomainEvents['record.created']): WebhookEventPayload => ({
|
|
36
|
+
workspaceId: payload.workspaceId,
|
|
37
|
+
event: 'record.created',
|
|
38
|
+
data: { object_type: payload.objectType, record_id: payload.recordId },
|
|
39
|
+
}),
|
|
40
|
+
|
|
41
|
+
'record.updated': (payload: DomainEvents['record.updated']): WebhookEventPayload => ({
|
|
42
|
+
workspaceId: payload.workspaceId,
|
|
43
|
+
event: 'record.updated',
|
|
44
|
+
data: {
|
|
45
|
+
object_type: payload.objectType,
|
|
46
|
+
record_id: payload.recordId,
|
|
47
|
+
// The values stay as the emitting service named them, which is camelCase
|
|
48
|
+
// (`parentId`, `sortOrder`) even though the keys around them are not.
|
|
49
|
+
// Translating them to the wire spelling would mean a second copy of every
|
|
50
|
+
// module's column naming, kept in step by hand.
|
|
51
|
+
changed_fields: [...payload.changedFields],
|
|
52
|
+
},
|
|
53
|
+
}),
|
|
54
|
+
|
|
55
|
+
'record.deleted': (payload: DomainEvents['record.deleted']): WebhookEventPayload => ({
|
|
56
|
+
workspaceId: payload.workspaceId,
|
|
57
|
+
event: 'record.deleted',
|
|
58
|
+
data: { object_type: payload.objectType, record_id: payload.recordId },
|
|
59
|
+
}),
|
|
60
|
+
|
|
61
|
+
'form.submitted': (payload: DomainEvents['form.submitted']): WebhookEventPayload => ({
|
|
62
|
+
workspaceId: payload.workspaceId,
|
|
63
|
+
event: 'form.submitted',
|
|
64
|
+
data: { form_id: payload.formId, submission_id: payload.submissionId },
|
|
65
|
+
}),
|
|
66
|
+
} satisfies { [Name in WebhookEvent]: (payload: DomainEvents[Name]) => WebhookEventPayload }
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Subscribes the engine to every deliverable event.
|
|
70
|
+
*
|
|
71
|
+
* Written out one call at a time rather than looped over `WEBHOOK_EVENTS`,
|
|
72
|
+
* because TypeScript cannot correlate a payload type with a generic key: a loop
|
|
73
|
+
* would need a cast, and the cast is exactly what would let a wrong payload
|
|
74
|
+
* through. A literal key indexes `builders` at its precise signature.
|
|
75
|
+
*/
|
|
76
|
+
export function subscribeDeliverableEvents(
|
|
77
|
+
bus: EventBus,
|
|
78
|
+
deliver: (payload: WebhookEventPayload) => Promise<void>,
|
|
79
|
+
): void {
|
|
80
|
+
bus.subscribe('record.created', (payload) => deliver(builders['record.created'](payload)))
|
|
81
|
+
bus.subscribe('record.updated', (payload) => deliver(builders['record.updated'](payload)))
|
|
82
|
+
bus.subscribe('record.deleted', (payload) => deliver(builders['record.deleted'](payload)))
|
|
83
|
+
bus.subscribe('form.submitted', (payload) => deliver(builders['form.submitted'](payload)))
|
|
84
|
+
}
|