@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
package/src/lib/http.ts
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { Context } from 'hono'
|
|
2
|
+
import type { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
import { AppError, toErrorDetails } from './errors.ts'
|
|
5
|
+
import type { ListQueryParameters, Page } from './pagination.ts'
|
|
6
|
+
|
|
7
|
+
/** The parsing every route repeats: read the wire, reject it, or hand back a typed value. */
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Where unauthenticated routes mount (`architecture.md` boot step 5).
|
|
11
|
+
*
|
|
12
|
+
* Shared because two places need to agree on it: the app mounts the public
|
|
13
|
+
* routers here, and a module that builds an absolute URL to one of its own
|
|
14
|
+
* public endpoints has to spell the same prefix.
|
|
15
|
+
*/
|
|
16
|
+
export const PUBLIC_ROUTE_PREFIX = '/v1/public'
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The scheme and host a request arrived on.
|
|
20
|
+
*
|
|
21
|
+
* Used to build absolute URLs a customer pastes into their own site. It follows
|
|
22
|
+
* the request rather than configuration, so it is right wherever the service is
|
|
23
|
+
* reached from and needs no new environment variable. Behind a proxy it is only
|
|
24
|
+
* right if that proxy preserves the external `Host`, which is the same condition
|
|
25
|
+
* every redirect and cookie domain already depends on.
|
|
26
|
+
*/
|
|
27
|
+
export function requestOrigin(context: Context): string {
|
|
28
|
+
return new URL(context.req.url).origin
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Reads and validates a JSON request body.
|
|
33
|
+
*
|
|
34
|
+
* @throws AppError 400 when the body is not JSON at all, 422 when it is JSON the
|
|
35
|
+
* schema refuses. The two are different client mistakes and `api.md` gives them
|
|
36
|
+
* different statuses.
|
|
37
|
+
*/
|
|
38
|
+
export async function readJsonBody<T>(context: Context, schema: z.ZodType<T>): Promise<T> {
|
|
39
|
+
const raw: unknown = await context.req.json().catch(() => {
|
|
40
|
+
throw new AppError('bad_request', 'Body must be valid JSON')
|
|
41
|
+
})
|
|
42
|
+
const parsed = schema.safeParse(raw)
|
|
43
|
+
|
|
44
|
+
if (!parsed.success) {
|
|
45
|
+
throw AppError.validationFailed('Request body is invalid', toErrorDetails(parsed.error.issues))
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return parsed.data
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Lifts `?limit=`, `?sort=` and `?cursor=` off a request. Validated where the sort fields are known. */
|
|
52
|
+
export function readListParameters(context: Context): ListQueryParameters {
|
|
53
|
+
return {
|
|
54
|
+
limit: context.req.query('limit'),
|
|
55
|
+
sort: context.req.query('sort'),
|
|
56
|
+
cursor: context.req.query('cursor'),
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* The most ids one filter may name, matching the `?limit=` ceiling in `api.md`.
|
|
62
|
+
*
|
|
63
|
+
* The two are the same number on purpose. A caller resolving a page of records
|
|
64
|
+
* asks about at most one page of ids, so a filter that allowed fewer would make
|
|
65
|
+
* the maximum page size unusable, and one that allowed more would invite a query
|
|
66
|
+
* no page could have produced.
|
|
67
|
+
*/
|
|
68
|
+
export const MAX_FILTER_IDS = 200
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Reads an id filter that may be given more than once: `?person_id=a&person_id=b`.
|
|
72
|
+
*
|
|
73
|
+
* Repeated parameters rather than a comma-separated list, because an id needs no
|
|
74
|
+
* escaping this way and there is no separator to get wrong. One occurrence is
|
|
75
|
+
* the ordinary case and reads the same as it always did.
|
|
76
|
+
*
|
|
77
|
+
* @returns The ids, or undefined when the parameter is absent.
|
|
78
|
+
* @throws AppError 422 for a blank value or more than `MAX_FILTER_IDS` of them.
|
|
79
|
+
* Silently dropping either would answer a different question than the one asked.
|
|
80
|
+
*/
|
|
81
|
+
export function readIdFilter(context: Context, name: string): readonly string[] | undefined {
|
|
82
|
+
const values = context.req.queries(name)
|
|
83
|
+
|
|
84
|
+
if (values === undefined || values.length === 0) {
|
|
85
|
+
return undefined
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (values.some((value) => value.length === 0)) {
|
|
89
|
+
throw AppError.validationFailed(`"${name}" cannot be blank`, [
|
|
90
|
+
{ field: name, message: 'Expected an id' },
|
|
91
|
+
])
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (values.length > MAX_FILTER_IDS) {
|
|
95
|
+
throw AppError.validationFailed(`"${name}" takes at most ${String(MAX_FILTER_IDS)} ids`, [
|
|
96
|
+
{ field: name, message: `Given ${String(values.length)}` },
|
|
97
|
+
])
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return values
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** The `{ data, next_cursor }` envelope from `api.md`. */
|
|
104
|
+
export function pageBody<T>(
|
|
105
|
+
page: Page<T>,
|
|
106
|
+
render: (item: T) => Record<string, unknown>,
|
|
107
|
+
): { data: Record<string, unknown>[]; next_cursor: string | null } {
|
|
108
|
+
return { data: page.items.map(render), next_cursor: page.nextCursor }
|
|
109
|
+
}
|
package/src/lib/ids.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ulid } from 'ulid'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Identifiers are `<prefix>_<ulid>`. This table is the single source of the
|
|
5
|
+
* prefixes documented in `api.md`; nothing else may hardcode one.
|
|
6
|
+
*/
|
|
7
|
+
export const idPrefixes = {
|
|
8
|
+
workspace: 'ws',
|
|
9
|
+
user: 'usr',
|
|
10
|
+
session: 'ses',
|
|
11
|
+
passwordResetToken: 'pwr',
|
|
12
|
+
teamMember: 'mem',
|
|
13
|
+
invite: 'inv',
|
|
14
|
+
apiKey: 'key',
|
|
15
|
+
person: 'per',
|
|
16
|
+
company: 'com',
|
|
17
|
+
position: 'pos',
|
|
18
|
+
pipelineStage: 'stage',
|
|
19
|
+
deal: 'deal',
|
|
20
|
+
opportunity: 'opp',
|
|
21
|
+
partnership: 'prt',
|
|
22
|
+
raise: 'rse',
|
|
23
|
+
role: 'role',
|
|
24
|
+
candidate: 'cand',
|
|
25
|
+
planItem: 'plan',
|
|
26
|
+
decision: 'dec',
|
|
27
|
+
note: 'note',
|
|
28
|
+
activity: 'act',
|
|
29
|
+
handbookPage: 'hb',
|
|
30
|
+
form: 'form',
|
|
31
|
+
formField: 'ff',
|
|
32
|
+
formSubmission: 'sub',
|
|
33
|
+
webhook: 'wh',
|
|
34
|
+
/** One settled delivery. `api.md` gained the prefix with the delivery log. */
|
|
35
|
+
webhookDelivery: 'whd',
|
|
36
|
+
agentRegistration: 'ag',
|
|
37
|
+
agentRun: 'run',
|
|
38
|
+
importJob: 'imp',
|
|
39
|
+
integrationConnection: 'int',
|
|
40
|
+
/** Never returns over the wire either: identified by `(workspace_id, module_id)` instead. */
|
|
41
|
+
moduleSetting: 'mset',
|
|
42
|
+
/**
|
|
43
|
+
* `idempotency_keys` has no routes of its own and never returns this id over
|
|
44
|
+
* the wire, so it is not in `api.md`'s public prefix table. It still comes
|
|
45
|
+
* from this factory rather than a bare `ulid()` call, so every id in the
|
|
46
|
+
* database is generated the same, injectable way.
|
|
47
|
+
*/
|
|
48
|
+
idempotencyKey: 'idem',
|
|
49
|
+
} as const
|
|
50
|
+
|
|
51
|
+
export type ObjectKind = keyof typeof idPrefixes
|
|
52
|
+
|
|
53
|
+
export type IdFactory = (kind: ObjectKind) => string
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Builds the id factory. The ULID generator is injected so tests can pin ids;
|
|
57
|
+
* production passes nothing and gets time-ordered ULIDs.
|
|
58
|
+
*/
|
|
59
|
+
export function createIdFactory(generateUlid: () => string = ulid): IdFactory {
|
|
60
|
+
return (kind: ObjectKind): string => `${idPrefixes[kind]}_${generateUlid()}`
|
|
61
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { LogLevel } from './config.ts'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Structured logging as JSON lines. The sink is injected so tests capture output
|
|
5
|
+
* instead of writing to stdout, and so a deployment can redirect it.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export type LogFields = Readonly<Record<string, unknown>>
|
|
9
|
+
|
|
10
|
+
export interface Logger {
|
|
11
|
+
debug(message: string, fields?: LogFields): void
|
|
12
|
+
info(message: string, fields?: LogFields): void
|
|
13
|
+
warn(message: string, fields?: LogFields): void
|
|
14
|
+
error(message: string, fields?: LogFields): void
|
|
15
|
+
/** Returns a logger that stamps `fields` onto every line, e.g. a request id. */
|
|
16
|
+
child(fields: LogFields): Logger
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type LogSink = (line: string) => void
|
|
20
|
+
|
|
21
|
+
const severityByLevel: Readonly<Record<LogLevel, number>> = {
|
|
22
|
+
debug: 10,
|
|
23
|
+
info: 20,
|
|
24
|
+
warn: 30,
|
|
25
|
+
error: 40,
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function writeToStdout(line: string): void {
|
|
29
|
+
process.stdout.write(`${line}\n`)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @param level Minimum level to emit. Lines below it are dropped.
|
|
34
|
+
* @param sink Receives one complete JSON line per log call.
|
|
35
|
+
* @param now Injected so tests get deterministic timestamps.
|
|
36
|
+
*/
|
|
37
|
+
export function createLogger(
|
|
38
|
+
level: LogLevel,
|
|
39
|
+
sink: LogSink = writeToStdout,
|
|
40
|
+
now: () => Date = () => new Date(),
|
|
41
|
+
): Logger {
|
|
42
|
+
const threshold = severityByLevel[level]
|
|
43
|
+
|
|
44
|
+
function build(boundFields: LogFields): Logger {
|
|
45
|
+
function emit(lineLevel: LogLevel, message: string, fields?: LogFields): void {
|
|
46
|
+
if (severityByLevel[lineLevel] < threshold) {
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
// The envelope is written last so a field called `message`, `level`, or
|
|
50
|
+
// `time` cannot overwrite it. A colliding field is dropped; a corrupted
|
|
51
|
+
// envelope would make the whole line untrustworthy.
|
|
52
|
+
sink(
|
|
53
|
+
JSON.stringify({
|
|
54
|
+
...boundFields,
|
|
55
|
+
...fields,
|
|
56
|
+
time: now().toISOString(),
|
|
57
|
+
level: lineLevel,
|
|
58
|
+
message,
|
|
59
|
+
}),
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
debug: (message, fields) => emit('debug', message, fields),
|
|
65
|
+
info: (message, fields) => emit('info', message, fields),
|
|
66
|
+
warn: (message, fields) => emit('warn', message, fields),
|
|
67
|
+
error: (message, fields) => emit('error', message, fields),
|
|
68
|
+
child: (fields) => build({ ...boundFields, ...fields }),
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return build({})
|
|
73
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs'
|
|
2
|
+
|
|
3
|
+
import { z } from 'zod'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Reads `modules.md`'s deploy-time module override file, the mechanism a
|
|
7
|
+
* self-hoster uses to lock a module on or off for every workspace the process
|
|
8
|
+
* serves, ahead of whatever a workspace's own settings screen would otherwise
|
|
9
|
+
* decide (`runtime/moduleConfig.ts` is where that override wins).
|
|
10
|
+
*
|
|
11
|
+
* Shape:
|
|
12
|
+
* ```json
|
|
13
|
+
* { "modules": { "raises": false, "hiring": false } }
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const moduleConfigFileSchema = z.object({
|
|
18
|
+
modules: z.record(z.string(), z.boolean()),
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
/** Thrown when a configured path exists but does not hold a valid module config file. */
|
|
22
|
+
export class ModuleConfigFileError extends Error {
|
|
23
|
+
constructor(path: string, reason: string) {
|
|
24
|
+
super(`${path} is not a valid module config file: ${reason}`)
|
|
25
|
+
this.name = 'ModuleConfigFileError'
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @param path Absolute or relative path, normally `KELPIE_MODULE_CONFIG_PATH`.
|
|
31
|
+
* Undefined when the deployment sets no path, which is the ordinary case: a
|
|
32
|
+
* workspace's own settings decide instead.
|
|
33
|
+
* @returns The module id to enabled map the file declares, or undefined when no
|
|
34
|
+
* path was given.
|
|
35
|
+
* @throws ModuleConfigFileError if a given path cannot be read or parsed.
|
|
36
|
+
*/
|
|
37
|
+
export function readModuleConfigFile(path: string | undefined): Readonly<Record<string, boolean>> | undefined {
|
|
38
|
+
if (path === undefined) {
|
|
39
|
+
return undefined
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
let raw: string
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
raw = readFileSync(path, 'utf8')
|
|
46
|
+
} catch (error: unknown) {
|
|
47
|
+
throw new ModuleConfigFileError(path, error instanceof Error ? error.message : String(error))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
let parsed: unknown
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
parsed = JSON.parse(raw)
|
|
54
|
+
} catch (error: unknown) {
|
|
55
|
+
throw new ModuleConfigFileError(path, error instanceof Error ? error.message : String(error))
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const result = moduleConfigFileSchema.safeParse(parsed)
|
|
59
|
+
|
|
60
|
+
if (!result.success) {
|
|
61
|
+
throw new ModuleConfigFileError(path, result.error.issues.map((issue) => issue.message).join('; '))
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return result.data.modules
|
|
65
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Values stored in a normalised form, per `schema.md`. The columns are `citext`
|
|
3
|
+
* as a second line of defence, so a missed normalisation still compares
|
|
4
|
+
* correctly rather than creating a duplicate.
|
|
5
|
+
*
|
|
6
|
+
* Blank normalises to null rather than to `''`. Both columns are unique within a
|
|
7
|
+
* workspace, so a stored empty string would make the second record without an
|
|
8
|
+
* address a 409.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** A scheme prefix: `https://`, `mailto:` and anything else shaped like one. */
|
|
12
|
+
const SCHEME = /^[a-z][a-z0-9+.-]*:\/\//u
|
|
13
|
+
|
|
14
|
+
export function normaliseEmail(raw: string): string | null {
|
|
15
|
+
const email = raw.trim().toLowerCase()
|
|
16
|
+
|
|
17
|
+
return email.length === 0 ? null : email
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Reduces a domain to its host: no scheme, no path, no trailing dot.
|
|
22
|
+
*
|
|
23
|
+
* Deliberately permissive. This normalises what was given; it does not decide
|
|
24
|
+
* whether the domain resolves, and a CRM regularly holds a company whose site is
|
|
25
|
+
* not up yet.
|
|
26
|
+
*/
|
|
27
|
+
export function normaliseDomain(raw: string): string | null {
|
|
28
|
+
const host = raw
|
|
29
|
+
.trim()
|
|
30
|
+
.toLowerCase()
|
|
31
|
+
.replace(SCHEME, '')
|
|
32
|
+
.split('/')[0]
|
|
33
|
+
?.replace(/\.$/u, '')
|
|
34
|
+
|
|
35
|
+
return host === undefined || host.length === 0 ? null : host
|
|
36
|
+
}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { asc, desc, sql } from 'drizzle-orm'
|
|
2
|
+
import type { Column, SQL } from 'drizzle-orm'
|
|
3
|
+
import { z } from 'zod'
|
|
4
|
+
|
|
5
|
+
import { AppError } from './errors.ts'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Cursor pagination from `api.md`: `?limit=` and `?cursor=`, an opaque cursor,
|
|
9
|
+
* and `{ data, next_cursor }` on the wire.
|
|
10
|
+
*
|
|
11
|
+
* The cursor is a keyset rather than an offset. It carries the sort value and id
|
|
12
|
+
* of the last row on the page, so a page boundary stays put when rows are
|
|
13
|
+
* inserted or deleted underneath a client. Offsets skip and repeat rows when that
|
|
14
|
+
* happens, which for a CRM that agents write to is not a rare case.
|
|
15
|
+
*
|
|
16
|
+
* A cursor is bound to the sort it was issued under. Reusing one against a
|
|
17
|
+
* different `?sort=` is a client bug, and it is reported as one rather than
|
|
18
|
+
* silently paging through a different order.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
export const DEFAULT_PAGE_SIZE = 50
|
|
22
|
+
export const MAX_PAGE_SIZE = 200
|
|
23
|
+
|
|
24
|
+
/** A field a list may be ordered by, and how its value survives a round trip through a cursor. */
|
|
25
|
+
export interface SortableField<TRecord> {
|
|
26
|
+
readonly column: Column
|
|
27
|
+
/** Reads the cursor value out of the last row of a page. */
|
|
28
|
+
readonly valueOf: (record: TRecord) => string
|
|
29
|
+
/** Turns that string back into something comparable against the column. */
|
|
30
|
+
readonly parse: (value: string) => Date | string | number
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** The documented sort fields of one resource, keyed by their wire name. */
|
|
34
|
+
export type SortableFields<TRecord> = Readonly<Record<string, SortableField<TRecord>>>
|
|
35
|
+
|
|
36
|
+
/** Where the previous page stopped. */
|
|
37
|
+
export interface CursorPosition {
|
|
38
|
+
readonly value: Date | string | number
|
|
39
|
+
readonly id: string
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface ListWindow<TRecord> {
|
|
43
|
+
/** How many rows the caller asked for. */
|
|
44
|
+
readonly limit: number
|
|
45
|
+
/** What to ask the database for: one more than `limit`, to detect a next page. */
|
|
46
|
+
readonly fetchLimit: number
|
|
47
|
+
/** The canonical sort spec, `-created_at` style. Cursors are bound to it. */
|
|
48
|
+
readonly sort: string
|
|
49
|
+
readonly field: SortableField<TRecord>
|
|
50
|
+
readonly descending: boolean
|
|
51
|
+
readonly position: CursorPosition | undefined
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface Page<TRecord> {
|
|
55
|
+
readonly items: readonly TRecord[]
|
|
56
|
+
readonly nextCursor: string | null
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface ListQueryParameters {
|
|
60
|
+
readonly limit?: string | undefined
|
|
61
|
+
readonly sort?: string | undefined
|
|
62
|
+
readonly cursor?: string | undefined
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** The cursor payload. It is client-supplied, so it is parsed, never trusted. */
|
|
66
|
+
const cursorSchema = z.strictObject({
|
|
67
|
+
sort: z.string().min(1),
|
|
68
|
+
value: z.string(),
|
|
69
|
+
id: z.string().min(1),
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
function invalidCursor(reason: string): AppError {
|
|
73
|
+
return AppError.validationFailed('That cursor is not one this API issued', [
|
|
74
|
+
{ field: 'cursor', message: reason },
|
|
75
|
+
])
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function textSort<TRecord>(
|
|
79
|
+
column: Column,
|
|
80
|
+
valueOf: (record: TRecord) => string,
|
|
81
|
+
): SortableField<TRecord> {
|
|
82
|
+
return { column, valueOf, parse: (value) => value }
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function integerSort<TRecord>(
|
|
86
|
+
column: Column,
|
|
87
|
+
valueOf: (record: TRecord) => number,
|
|
88
|
+
): SortableField<TRecord> {
|
|
89
|
+
return {
|
|
90
|
+
column,
|
|
91
|
+
valueOf: (record) => String(valueOf(record)),
|
|
92
|
+
parse: (value) => {
|
|
93
|
+
const parsed = Number(value)
|
|
94
|
+
|
|
95
|
+
if (!Number.isInteger(parsed)) {
|
|
96
|
+
throw invalidCursor('Its position is not a whole number')
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return parsed
|
|
100
|
+
},
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function timestampSort<TRecord>(
|
|
105
|
+
column: Column,
|
|
106
|
+
valueOf: (record: TRecord) => Date,
|
|
107
|
+
): SortableField<TRecord> {
|
|
108
|
+
return {
|
|
109
|
+
column,
|
|
110
|
+
valueOf: (record) => valueOf(record).toISOString(),
|
|
111
|
+
parse: (value) => {
|
|
112
|
+
const parsed = new Date(value)
|
|
113
|
+
|
|
114
|
+
if (Number.isNaN(parsed.getTime())) {
|
|
115
|
+
throw invalidCursor('Its position is not a timestamp')
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return parsed
|
|
119
|
+
},
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function encodeCursor(sort: string, value: string, id: string): string {
|
|
124
|
+
return Buffer.from(JSON.stringify({ sort, value, id }), 'utf8').toString('base64url')
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function decodeCursor(raw: string): z.infer<typeof cursorSchema> {
|
|
128
|
+
let payload: unknown
|
|
129
|
+
|
|
130
|
+
try {
|
|
131
|
+
payload = JSON.parse(Buffer.from(raw, 'base64url').toString('utf8'))
|
|
132
|
+
} catch {
|
|
133
|
+
// Base64 and JSON both refuse the same way here: the string did not come
|
|
134
|
+
// from `encodeCursor`. The client cannot act on which of the two failed.
|
|
135
|
+
throw invalidCursor('It is not readable')
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const parsed = cursorSchema.safeParse(payload)
|
|
139
|
+
|
|
140
|
+
if (!parsed.success) {
|
|
141
|
+
throw invalidCursor('It does not carry a position')
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return parsed.data
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Reads `?limit=` against the `api.md` range.
|
|
149
|
+
*
|
|
150
|
+
* Exported for the endpoints that take the same parameter without being paged
|
|
151
|
+
* lists. The dashboard is the case: it caps several embedded lists at once and
|
|
152
|
+
* issues no cursor, but the ceiling a caller may ask for is the same one.
|
|
153
|
+
*
|
|
154
|
+
* @throws AppError 422 for anything but a whole number in range.
|
|
155
|
+
*/
|
|
156
|
+
export function readPageSize(raw: string | undefined): number {
|
|
157
|
+
if (raw === undefined) {
|
|
158
|
+
return DEFAULT_PAGE_SIZE
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const limit = Number(raw)
|
|
162
|
+
|
|
163
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > MAX_PAGE_SIZE) {
|
|
164
|
+
throw AppError.validationFailed('That page size is out of range', [
|
|
165
|
+
{ field: 'limit', message: `Use a whole number from 1 to ${String(MAX_PAGE_SIZE)}` },
|
|
166
|
+
])
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return limit
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Reads `?limit=`, `?sort=` and `?cursor=` into a window a repository can apply.
|
|
174
|
+
*
|
|
175
|
+
* @param defaultSort The resource's own default, `-created_at` style. Naming a
|
|
176
|
+
* field the resource does not declare is a programming error, not a request
|
|
177
|
+
* error, so it throws rather than producing a 422.
|
|
178
|
+
* @throws AppError 422 for an out-of-range limit, an undocumented sort field, or
|
|
179
|
+
* a cursor that is unreadable or belongs to a different sort order.
|
|
180
|
+
*/
|
|
181
|
+
export function readListWindow<TRecord>(
|
|
182
|
+
query: ListQueryParameters,
|
|
183
|
+
fields: SortableFields<TRecord>,
|
|
184
|
+
defaultSort: string,
|
|
185
|
+
): ListWindow<TRecord> {
|
|
186
|
+
const sort = query.sort ?? defaultSort
|
|
187
|
+
const descending = sort.startsWith('-')
|
|
188
|
+
const name = descending ? sort.slice(1) : sort
|
|
189
|
+
const field = fields[name]
|
|
190
|
+
|
|
191
|
+
if (field === undefined) {
|
|
192
|
+
const documented = Object.keys(fields).sort().join(', ')
|
|
193
|
+
|
|
194
|
+
if (query.sort === undefined) {
|
|
195
|
+
throw new Error(`Default sort "${defaultSort}" is not one of: ${documented}`)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
throw AppError.validationFailed('That sort field is not available on this resource', [
|
|
199
|
+
{ field: 'sort', message: `Sort by one of: ${documented}` },
|
|
200
|
+
])
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const position = ((): CursorPosition | undefined => {
|
|
204
|
+
if (query.cursor === undefined) {
|
|
205
|
+
return undefined
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const decoded = decodeCursor(query.cursor)
|
|
209
|
+
|
|
210
|
+
if (decoded.sort !== sort) {
|
|
211
|
+
throw invalidCursor(`It was issued for sort=${decoded.sort}`)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return { value: field.parse(decoded.value), id: decoded.id }
|
|
215
|
+
})()
|
|
216
|
+
|
|
217
|
+
const limit = readPageSize(query.limit)
|
|
218
|
+
|
|
219
|
+
return { limit, fetchLimit: limit + 1, sort, field, descending, position }
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* The keyset predicate: everything after the cursor's row in the window's order.
|
|
224
|
+
*
|
|
225
|
+
* Values go through `sql.param` with their own column as the encoder. A bare
|
|
226
|
+
* `${value}` in a template reaches the driver unconverted, and postgres.js has no
|
|
227
|
+
* column to infer from, so a `Date` arrives where it wants a string.
|
|
228
|
+
*
|
|
229
|
+
* @returns undefined on the first page, where there is nothing to seek past.
|
|
230
|
+
*/
|
|
231
|
+
export function keysetCondition<TRecord>(
|
|
232
|
+
window: ListWindow<TRecord>,
|
|
233
|
+
idColumn: Column,
|
|
234
|
+
): SQL | undefined {
|
|
235
|
+
if (window.position === undefined) {
|
|
236
|
+
return undefined
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const { column } = window.field
|
|
240
|
+
const after = sql.param(window.position.value, column)
|
|
241
|
+
const afterId = sql.param(window.position.id, idColumn)
|
|
242
|
+
|
|
243
|
+
return window.descending
|
|
244
|
+
? sql`(${column} < ${after} or (${column} = ${after} and ${idColumn} < ${afterId}))`
|
|
245
|
+
: sql`(${column} > ${after} or (${column} = ${after} and ${idColumn} > ${afterId}))`
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* The ordering, id included. Without the id tiebreak two rows sharing a sort
|
|
250
|
+
* value could straddle a page boundary in either order, and one of them would be
|
|
251
|
+
* lost or repeated.
|
|
252
|
+
*/
|
|
253
|
+
export function orderByWindow<TRecord>(window: ListWindow<TRecord>, idColumn: Column): SQL[] {
|
|
254
|
+
const direction = window.descending ? desc : asc
|
|
255
|
+
|
|
256
|
+
return [direction(window.field.column), direction(idColumn)]
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Trims the extra row a repository fetched and turns it into a next cursor.
|
|
261
|
+
*
|
|
262
|
+
* @param rows Up to `window.fetchLimit` rows, in the window's order.
|
|
263
|
+
*/
|
|
264
|
+
export function toPage<TRecord>(
|
|
265
|
+
rows: readonly TRecord[],
|
|
266
|
+
window: ListWindow<TRecord>,
|
|
267
|
+
idOf: (record: TRecord) => string,
|
|
268
|
+
): Page<TRecord> {
|
|
269
|
+
if (rows.length < window.fetchLimit) {
|
|
270
|
+
return { items: rows, nextCursor: null }
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const items = rows.slice(0, window.limit)
|
|
274
|
+
const last = items.at(-1)
|
|
275
|
+
|
|
276
|
+
if (last === undefined) {
|
|
277
|
+
throw new Error('unreachable: a full page cannot be empty')
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return { items, nextCursor: encodeCursor(window.sort, window.field.valueOf(last), idOf(last)) }
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Re-shapes the items of a page, leaving the cursor alone.
|
|
285
|
+
*
|
|
286
|
+
* A service pages over stored rows and answers with views, and the cursor is
|
|
287
|
+
* built from the row it came from, not from what the caller is handed back.
|
|
288
|
+
*/
|
|
289
|
+
export function mapPage<TFrom, TTo>(page: Page<TFrom>, render: (item: TFrom) => TTo): Page<TTo> {
|
|
290
|
+
return { items: page.items.map(render), nextCursor: page.nextCursor }
|
|
291
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { MINIMUM_PASSWORD_LENGTH } from '@kelpie/schemas'
|
|
2
|
+
import { hash, verify } from '@node-rs/argon2'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Password hashing. Argon2id, the parameters the library defaults to, which
|
|
6
|
+
* follow the OWASP recommendation at time of writing.
|
|
7
|
+
*
|
|
8
|
+
* The algorithm and its parameters are embedded in the hash string, so raising
|
|
9
|
+
* the cost later does not invalidate existing hashes: they verify with the
|
|
10
|
+
* parameters they were made with, and `needsRehash` says when to upgrade one.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Rejected before hashing. Argon2 will happily hash an empty string.
|
|
15
|
+
*
|
|
16
|
+
* The number lives in `@kelpie/schemas` because the browser's change-password
|
|
17
|
+
* form states the rule before submitting, and two copies would be two rules.
|
|
18
|
+
* Re-exported here so callers keep reading it off the module that enforces it.
|
|
19
|
+
*/
|
|
20
|
+
export { MINIMUM_PASSWORD_LENGTH }
|
|
21
|
+
|
|
22
|
+
export class WeakPasswordError extends Error {
|
|
23
|
+
constructor(message: string) {
|
|
24
|
+
super(message)
|
|
25
|
+
this.name = 'WeakPasswordError'
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @throws WeakPasswordError when the password is too short to be worth hashing.
|
|
31
|
+
*/
|
|
32
|
+
export async function hashPassword(plaintext: string): Promise<string> {
|
|
33
|
+
if (plaintext.length < MINIMUM_PASSWORD_LENGTH) {
|
|
34
|
+
throw new WeakPasswordError(`Password must be at least ${MINIMUM_PASSWORD_LENGTH} characters`)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return hash(plaintext)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Constant-time within argon2 itself. Returns false rather than throwing on a
|
|
42
|
+
* malformed stored hash, because a corrupted row must not become a login bypass
|
|
43
|
+
* or a 500 that distinguishes it from a wrong password.
|
|
44
|
+
*/
|
|
45
|
+
export async function verifyPassword(storedHash: string, plaintext: string): Promise<boolean> {
|
|
46
|
+
try {
|
|
47
|
+
return await verify(storedHash, plaintext)
|
|
48
|
+
} catch {
|
|
49
|
+
// A hash argon2 cannot parse is not a match. The row is corrupt, not correct.
|
|
50
|
+
return false
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function isPasswordStrongEnough(plaintext: string): boolean {
|
|
55
|
+
return plaintext.length >= MINIMUM_PASSWORD_LENGTH
|
|
56
|
+
}
|