@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,108 @@
|
|
|
1
|
+
import { eq } from 'drizzle-orm';
|
|
2
|
+
import { SecretDecryptionError } from '../lib/secrets.js';
|
|
3
|
+
import { agentRegistrations } from './agent-tasks/schema.js';
|
|
4
|
+
import { integrationConnections } from './integrations/schema.js';
|
|
5
|
+
import { webhooks } from './webhooks/schema.js';
|
|
6
|
+
/**
|
|
7
|
+
* Every column holding a value sealed by `lib/secrets.ts`.
|
|
8
|
+
*
|
|
9
|
+
* All three that exist are here, including the two nothing writes yet. Covering
|
|
10
|
+
* a column before its first write is the cheap half of this: the expensive half
|
|
11
|
+
* is noticing, a year later, that a rotation reported success while stranding a
|
|
12
|
+
* customer's stored OAuth credential with no way back. `resealTest` asserts this
|
|
13
|
+
* list against the schema, so a fourth `_encrypted` column fails a test the day
|
|
14
|
+
* it is added rather than at the next rotation.
|
|
15
|
+
*
|
|
16
|
+
* There is no registry for modules to declare these through, on purpose. One
|
|
17
|
+
* caller does not need an extension point, and a sealed column that nothing
|
|
18
|
+
* re-seals is a bug whichever way it was registered.
|
|
19
|
+
*/
|
|
20
|
+
const SEALED_COLUMNS = [
|
|
21
|
+
{
|
|
22
|
+
label: 'webhooks.secret_encrypted',
|
|
23
|
+
read: async (db) => db.select({ id: webhooks.id, sealed: webhooks.secretEncrypted }).from(webhooks),
|
|
24
|
+
write: async (db, id, sealed) => {
|
|
25
|
+
await db.update(webhooks).set({ secretEncrypted: sealed }).where(eq(webhooks.id, id));
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
label: 'webhooks.previous_secret_encrypted',
|
|
30
|
+
read: async (db) => db.select({ id: webhooks.id, sealed: webhooks.previousSecretEncrypted }).from(webhooks),
|
|
31
|
+
write: async (db, id, sealed) => {
|
|
32
|
+
await db.update(webhooks).set({ previousSecretEncrypted: sealed }).where(eq(webhooks.id, id));
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
label: 'agent_registrations.auth_header_encrypted',
|
|
37
|
+
read: async (db) => db
|
|
38
|
+
.select({ id: agentRegistrations.id, sealed: agentRegistrations.authHeaderEncrypted })
|
|
39
|
+
.from(agentRegistrations),
|
|
40
|
+
write: async (db, id, sealed) => {
|
|
41
|
+
await db
|
|
42
|
+
.update(agentRegistrations)
|
|
43
|
+
.set({ authHeaderEncrypted: sealed })
|
|
44
|
+
.where(eq(agentRegistrations.id, id));
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
label: 'integration_connections.secrets_encrypted',
|
|
49
|
+
read: async (db) => db
|
|
50
|
+
.select({ id: integrationConnections.id, sealed: integrationConnections.secretsEncrypted })
|
|
51
|
+
.from(integrationConnections),
|
|
52
|
+
write: async (db, id, sealed) => {
|
|
53
|
+
await db
|
|
54
|
+
.update(integrationConnections)
|
|
55
|
+
.set({ secretsEncrypted: sealed })
|
|
56
|
+
.where(eq(integrationConnections.id, id));
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
/** The columns this pass covers. Exported for the test that checks none is missing. */
|
|
61
|
+
export const RESEALED_COLUMNS = SEALED_COLUMNS.map((column) => column.label);
|
|
62
|
+
/**
|
|
63
|
+
* Reads every sealed column, and rewrites anything not already under the
|
|
64
|
+
* current key.
|
|
65
|
+
*
|
|
66
|
+
* Does not throw for a row it cannot open. One unreadable row must not stop the
|
|
67
|
+
* pass from fixing every other one, so it is reported and the caller decides
|
|
68
|
+
* what a non-empty `unreadable` means.
|
|
69
|
+
*/
|
|
70
|
+
export async function resealStoredSecrets(db, cipher) {
|
|
71
|
+
const columns = [];
|
|
72
|
+
for (const column of SEALED_COLUMNS) {
|
|
73
|
+
// Null means the row holds no secret, which is every row of a column whose
|
|
74
|
+
// module has not started writing one. Not counted as examined: a report
|
|
75
|
+
// saying it looked at forty rows and re-sealed none would read as a problem.
|
|
76
|
+
const rows = (await column.read(db)).filter((row) => row.sealed !== null);
|
|
77
|
+
const unreadable = [];
|
|
78
|
+
let resealed = 0;
|
|
79
|
+
for (const row of rows) {
|
|
80
|
+
let next;
|
|
81
|
+
try {
|
|
82
|
+
next = cipher.reseal(row.sealed);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (!(error instanceof SecretDecryptionError)) {
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
unreadable.push(row.id);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
// Undefined means it is already sealed under the current key, which is
|
|
92
|
+
// every row on a second run and most rows on the first.
|
|
93
|
+
if (next === undefined) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
await column.write(db, row.id, next);
|
|
97
|
+
resealed += 1;
|
|
98
|
+
}
|
|
99
|
+
columns.push({ label: column.label, examined: rows.length, resealed, unreadable });
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
columns,
|
|
103
|
+
examined: columns.reduce((total, column) => total + column.examined, 0),
|
|
104
|
+
resealed: columns.reduce((total, column) => total + column.resealed, 0),
|
|
105
|
+
unreadable: columns.reduce((total, column) => total + column.unreadable.length, 0),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=reseal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reseal.js","sourceRoot":"","sources":["../../src/modules/reseal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { KelpieModule } from '../../runtime/module.ts';
|
|
2
|
+
/**
|
|
3
|
+
* One box across nine collections.
|
|
4
|
+
*
|
|
5
|
+
* It contributes no tables and calls no `context.schema`. The `search_vector`
|
|
6
|
+
* column each searchable table carries belongs to that table's own module, which
|
|
7
|
+
* is the only place that knows which of its columns are worth indexing.
|
|
8
|
+
*
|
|
9
|
+
* `requires` names every module holding one of those columns, including the two
|
|
10
|
+
* that are never results themselves: `positions` carries the job titles People are
|
|
11
|
+
* found by, and `plans` the step titles Deals, Opportunities and Raises are found
|
|
12
|
+
* by. Nothing here runs at registration, so this is not about ordering. It is
|
|
13
|
+
* about an assembly built without one of them, which would boot and then answer
|
|
14
|
+
* this endpoint with a query against a table that has no migration.
|
|
15
|
+
*
|
|
16
|
+
* `structural`, like `dashboard`: the search box is in the application shell on
|
|
17
|
+
* every page, so a workspace that switched this off would be left with a control
|
|
18
|
+
* that answers 404.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createSearchModule(): KelpieModule;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/search/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAK3D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CA+BjD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { mountSearchRoutes } from './routes.js';
|
|
2
|
+
import { createSearchService } from './service.js';
|
|
3
|
+
import { registerSearchTools } from './tools.js';
|
|
4
|
+
/**
|
|
5
|
+
* One box across nine collections.
|
|
6
|
+
*
|
|
7
|
+
* It contributes no tables and calls no `context.schema`. The `search_vector`
|
|
8
|
+
* column each searchable table carries belongs to that table's own module, which
|
|
9
|
+
* is the only place that knows which of its columns are worth indexing.
|
|
10
|
+
*
|
|
11
|
+
* `requires` names every module holding one of those columns, including the two
|
|
12
|
+
* that are never results themselves: `positions` carries the job titles People are
|
|
13
|
+
* found by, and `plans` the step titles Deals, Opportunities and Raises are found
|
|
14
|
+
* by. Nothing here runs at registration, so this is not about ordering. It is
|
|
15
|
+
* about an assembly built without one of them, which would boot and then answer
|
|
16
|
+
* this endpoint with a query against a table that has no migration.
|
|
17
|
+
*
|
|
18
|
+
* `structural`, like `dashboard`: the search box is in the application shell on
|
|
19
|
+
* every page, so a workspace that switched this off would be left with a control
|
|
20
|
+
* that answers 404.
|
|
21
|
+
*/
|
|
22
|
+
export function createSearchModule() {
|
|
23
|
+
return {
|
|
24
|
+
id: 'search',
|
|
25
|
+
requires: [
|
|
26
|
+
'workspace',
|
|
27
|
+
'people',
|
|
28
|
+
'positions',
|
|
29
|
+
'companies',
|
|
30
|
+
'deals',
|
|
31
|
+
'opportunities',
|
|
32
|
+
'partnerships',
|
|
33
|
+
'raises',
|
|
34
|
+
'hiring',
|
|
35
|
+
'plans',
|
|
36
|
+
'decisions',
|
|
37
|
+
'handbook',
|
|
38
|
+
],
|
|
39
|
+
structural: true,
|
|
40
|
+
register(context) {
|
|
41
|
+
const service = createSearchService({ db: context.db });
|
|
42
|
+
context.routes((router) => {
|
|
43
|
+
mountSearchRoutes(router, { db: context.db, now: context.now, service });
|
|
44
|
+
});
|
|
45
|
+
registerSearchTools(context.mcp, service);
|
|
46
|
+
return Promise.resolve();
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/search/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEhD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,QAAQ,EAAE;YACR,WAAW;YACX,QAAQ;YACR,WAAW;YACX,WAAW;YACX,OAAO;YACP,eAAe;YACf,cAAc;YACd,QAAQ;YACR,QAAQ;YACR,OAAO;YACP,WAAW;YACX,UAAU;SACX;QACD,UAAU,EAAE,IAAI;QAEhB,QAAQ,CAAC,OAAO;YACd,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;YAEvD,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;gBACxB,iBAAiB,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YAC1E,CAAC,CAAC,CAAA;YAEF,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YAEzC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAC1B,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turning what someone typed into a `tsquery`, and lifting a readable fragment
|
|
3
|
+
* out of what matched.
|
|
4
|
+
*
|
|
5
|
+
* Pure: no database, no actor, no clock. Both halves are the parts of search most
|
|
6
|
+
* likely to be wrong in a way no integration test would notice, so both are unit
|
|
7
|
+
* tested against their own cases.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* How long a `?q=` may be before the boundary refuses it.
|
|
11
|
+
*
|
|
12
|
+
* Every word becomes a clause of an `&`-joined `tsquery`, so an unbounded string
|
|
13
|
+
* is an unbounded query plan. Nobody searches a CRM with a paragraph.
|
|
14
|
+
*/
|
|
15
|
+
export declare const MAX_SEARCH_TERM_LENGTH = 200;
|
|
16
|
+
/**
|
|
17
|
+
* The typed string as a `tsquery`, or null when it holds nothing to search for.
|
|
18
|
+
*
|
|
19
|
+
* Every word is a prefix clause. Someone typing `acm` into a search box is part
|
|
20
|
+
* way through `acme` and expects to see it; `to_tsquery('acm')` alone finds
|
|
21
|
+
* nothing, because full-text matches whole lexemes. Stemming still applies on top,
|
|
22
|
+
* so `meetings` finds a record that says `meeting`.
|
|
23
|
+
*
|
|
24
|
+
* Words are joined with `&`: every word has to appear somewhere in the record.
|
|
25
|
+
* `|` would rank a record matching one word of four alongside one matching all of
|
|
26
|
+
* them, which reads as a search box that ignores what you typed.
|
|
27
|
+
*
|
|
28
|
+
* @returns null when the input holds no letters or digits at all, which is a
|
|
29
|
+
* query with no clauses rather than a syntax error to hand to Postgres.
|
|
30
|
+
*/
|
|
31
|
+
export declare function toTsQuery(raw: string): string | null;
|
|
32
|
+
/** The words `toTsQuery` searched for, which is what `snippet` centres on. */
|
|
33
|
+
export declare function searchWords(raw: string): readonly string[];
|
|
34
|
+
/**
|
|
35
|
+
* A one-line fragment of `body`, centred on the first search word it contains.
|
|
36
|
+
*
|
|
37
|
+
* Falls back to the opening of the text when no word appears literally, because a
|
|
38
|
+
* result with no preview at all reads as a result with no content.
|
|
39
|
+
*
|
|
40
|
+
* @param body The record's own prose. Markdown is flattened first.
|
|
41
|
+
* @param words What was searched for, from `searchWords`.
|
|
42
|
+
*/
|
|
43
|
+
export declare function snippet(body: string, words: readonly string[]): string;
|
|
44
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/modules/search/query.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAA;AAKzC;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQpD;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAE1D;AA6BD;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAiBtE"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turning what someone typed into a `tsquery`, and lifting a readable fragment
|
|
3
|
+
* out of what matched.
|
|
4
|
+
*
|
|
5
|
+
* Pure: no database, no actor, no clock. Both halves are the parts of search most
|
|
6
|
+
* likely to be wrong in a way no integration test would notice, so both are unit
|
|
7
|
+
* tested against their own cases.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* How long a `?q=` may be before the boundary refuses it.
|
|
11
|
+
*
|
|
12
|
+
* Every word becomes a clause of an `&`-joined `tsquery`, so an unbounded string
|
|
13
|
+
* is an unbounded query plan. Nobody searches a CRM with a paragraph.
|
|
14
|
+
*/
|
|
15
|
+
export const MAX_SEARCH_TERM_LENGTH = 200;
|
|
16
|
+
/** Anything that is not a letter or a digit separates one word from the next. */
|
|
17
|
+
const SEPARATORS = /[^\p{L}\p{N}]+/gu;
|
|
18
|
+
/**
|
|
19
|
+
* The typed string as a `tsquery`, or null when it holds nothing to search for.
|
|
20
|
+
*
|
|
21
|
+
* Every word is a prefix clause. Someone typing `acm` into a search box is part
|
|
22
|
+
* way through `acme` and expects to see it; `to_tsquery('acm')` alone finds
|
|
23
|
+
* nothing, because full-text matches whole lexemes. Stemming still applies on top,
|
|
24
|
+
* so `meetings` finds a record that says `meeting`.
|
|
25
|
+
*
|
|
26
|
+
* Words are joined with `&`: every word has to appear somewhere in the record.
|
|
27
|
+
* `|` would rank a record matching one word of four alongside one matching all of
|
|
28
|
+
* them, which reads as a search box that ignores what you typed.
|
|
29
|
+
*
|
|
30
|
+
* @returns null when the input holds no letters or digits at all, which is a
|
|
31
|
+
* query with no clauses rather than a syntax error to hand to Postgres.
|
|
32
|
+
*/
|
|
33
|
+
export function toTsQuery(raw) {
|
|
34
|
+
const words = raw.split(SEPARATORS).filter((word) => word.length > 0);
|
|
35
|
+
if (words.length === 0) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
return words.map((word) => `${word}:*`).join(' & ');
|
|
39
|
+
}
|
|
40
|
+
/** The words `toTsQuery` searched for, which is what `snippet` centres on. */
|
|
41
|
+
export function searchWords(raw) {
|
|
42
|
+
return raw.split(SEPARATORS).filter((word) => word.length > 0);
|
|
43
|
+
}
|
|
44
|
+
/** How much of the source text a snippet carries, either side of the match. */
|
|
45
|
+
const LEAD = 24;
|
|
46
|
+
const TRAIL = 56;
|
|
47
|
+
/** Markdown punctuation, which is noise once a page body is one line of preview. */
|
|
48
|
+
const MARKUP = /[#*`|[\]_>]/gu;
|
|
49
|
+
function flatten(body) {
|
|
50
|
+
return body.replace(MARKUP, ' ').replace(/\s+/gu, ' ').trim();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Finds the earliest position any search word appears at, case-insensitively.
|
|
54
|
+
*
|
|
55
|
+
* @returns -1 when none of them appear literally. That is not a contradiction of
|
|
56
|
+
* the match: the row matched a stemmed lexeme (`meeting` for `meetings`) or
|
|
57
|
+
* matched on a different field than the one being excerpted.
|
|
58
|
+
*/
|
|
59
|
+
function firstMatch(haystack, words) {
|
|
60
|
+
const lowered = haystack.toLowerCase();
|
|
61
|
+
return words
|
|
62
|
+
.map((word) => lowered.indexOf(word.toLowerCase()))
|
|
63
|
+
.filter((index) => index >= 0)
|
|
64
|
+
.reduce((earliest, index) => (earliest < 0 ? index : Math.min(earliest, index)), -1);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* A one-line fragment of `body`, centred on the first search word it contains.
|
|
68
|
+
*
|
|
69
|
+
* Falls back to the opening of the text when no word appears literally, because a
|
|
70
|
+
* result with no preview at all reads as a result with no content.
|
|
71
|
+
*
|
|
72
|
+
* @param body The record's own prose. Markdown is flattened first.
|
|
73
|
+
* @param words What was searched for, from `searchWords`.
|
|
74
|
+
*/
|
|
75
|
+
export function snippet(body, words) {
|
|
76
|
+
const plain = flatten(body);
|
|
77
|
+
if (plain.length === 0) {
|
|
78
|
+
return '';
|
|
79
|
+
}
|
|
80
|
+
const found = firstMatch(plain, words);
|
|
81
|
+
if (found < 0) {
|
|
82
|
+
return plain.length > LEAD + TRAIL ? `${plain.slice(0, LEAD + TRAIL)}…` : plain;
|
|
83
|
+
}
|
|
84
|
+
const start = Math.max(0, found - LEAD);
|
|
85
|
+
const end = Math.min(plain.length, found + TRAIL);
|
|
86
|
+
return `${start > 0 ? '…' : ''}${plain.slice(start, end)}${end < plain.length ? '…' : ''}`;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/modules/search/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { SearchCollection } from '@kelpie/schemas';
|
|
2
|
+
import type { SQL } from 'drizzle-orm';
|
|
3
|
+
import type { Queryable } from '../../runtime/transaction.ts';
|
|
4
|
+
/**
|
|
5
|
+
* The reads behind `GET /v1/search`: one query per collection, each against that
|
|
6
|
+
* collection's own `search_vector` GIN index.
|
|
7
|
+
*
|
|
8
|
+
* Eleven tables and no repository imports, the same licence `dashboard` takes and
|
|
9
|
+
* for the same reason. A search that composed nine repositories would ask each of
|
|
10
|
+
* them for a page it then had to re-rank, and none of them can rank at all.
|
|
11
|
+
*
|
|
12
|
+
* **Every branch of every query has to be indexable.** Four collections match on a
|
|
13
|
+
* second table as well: a Person is found by a job title that lives on Position,
|
|
14
|
+
* and a Deal, Opportunity or Raise by a step that lives on Plan. Written as
|
|
15
|
+
* `own_vector @@ q OR EXISTS (…)` that is a sequential scan, because Postgres will
|
|
16
|
+
* not use an index for an `OR` whose other branch is a subquery. Written as a
|
|
17
|
+
* `UNION ALL` of two matches, each branch uses its own index and the ranks are
|
|
18
|
+
* merged afterwards. That is why the shape below looks indirect.
|
|
19
|
+
*/
|
|
20
|
+
/** A row on its way to becoming a result. `subtitle` and `snippet` are per collection. */
|
|
21
|
+
export interface SearchHit {
|
|
22
|
+
readonly id: string;
|
|
23
|
+
readonly title: string;
|
|
24
|
+
readonly subtitle: string | null;
|
|
25
|
+
readonly snippetSource: string | null;
|
|
26
|
+
}
|
|
27
|
+
/** What one collection answered: a capped, ranked page and the exact number of matches. */
|
|
28
|
+
export interface CollectionHits {
|
|
29
|
+
readonly collection: SearchCollection;
|
|
30
|
+
readonly hits: readonly SearchHit[];
|
|
31
|
+
readonly total: number;
|
|
32
|
+
}
|
|
33
|
+
/** The compiled `tsquery`, built once per request and shared by every collection. */
|
|
34
|
+
export declare function compileQuery(tsQuery: string): SQL;
|
|
35
|
+
export declare function searchHandbookPages(db: Queryable, workspaceId: string, query: SQL, limit: number): Promise<CollectionHits>;
|
|
36
|
+
export declare function searchPeople(db: Queryable, workspaceId: string, query: SQL, limit: number): Promise<CollectionHits>;
|
|
37
|
+
export declare function searchRoles(db: Queryable, workspaceId: string, query: SQL, limit: number): Promise<CollectionHits>;
|
|
38
|
+
export declare function searchCompanies(db: Queryable, workspaceId: string, query: SQL, limit: number): Promise<CollectionHits>;
|
|
39
|
+
export declare function searchDeals(db: Queryable, workspaceId: string, query: SQL, limit: number): Promise<CollectionHits>;
|
|
40
|
+
export declare function searchOpportunities(db: Queryable, workspaceId: string, query: SQL, limit: number): Promise<CollectionHits>;
|
|
41
|
+
export declare function searchRaises(db: Queryable, workspaceId: string, query: SQL, limit: number): Promise<CollectionHits>;
|
|
42
|
+
export declare function searchPartnerships(db: Queryable, workspaceId: string, query: SQL, limit: number): Promise<CollectionHits>;
|
|
43
|
+
export declare function searchDecisions(db: Queryable, workspaceId: string, query: SQL, limit: number): Promise<CollectionHits>;
|
|
44
|
+
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/modules/search/repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAItC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAc7D;;;;;;;;;;;;;;;GAeG;AAEH,0FAA0F;AAC1F,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CACtC;AAED,2FAA2F;AAC3F,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAA;IACrC,QAAQ,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,CAAA;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAYD,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAEjD;AAiCD,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,SAAS,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,GAAG,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAezB;AAED,wBAAsB,YAAY,CAChC,EAAE,EAAE,SAAS,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,GAAG,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CA8BzB;AAED,wBAAsB,WAAW,CAC/B,EAAE,EAAE,SAAS,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,GAAG,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAgBzB;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,SAAS,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,GAAG,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAezB;AA0BD,wBAAsB,WAAW,CAC/B,EAAE,EAAE,SAAS,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,GAAG,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAwBzB;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,SAAS,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,GAAG,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAuBzB;AAED,wBAAsB,YAAY,CAChC,EAAE,EAAE,SAAS,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,GAAG,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAwBzB;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,SAAS,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,GAAG,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAezB;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,SAAS,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,GAAG,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAiBzB"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { and, asc, desc, eq, max, sql } from 'drizzle-orm';
|
|
2
|
+
import { unionAll } from 'drizzle-orm/pg-core';
|
|
3
|
+
import { companies } from '../companies/schema.js';
|
|
4
|
+
import { deals } from '../deals/schema.js';
|
|
5
|
+
import { decisions } from '../decisions/schema.js';
|
|
6
|
+
import { handbookPages } from '../handbook/schema.js';
|
|
7
|
+
import { roles } from '../hiring/schema.js';
|
|
8
|
+
import { opportunities } from '../opportunities/schema.js';
|
|
9
|
+
import { partnerships } from '../partnerships/schema.js';
|
|
10
|
+
import { people } from '../people/schema.js';
|
|
11
|
+
import { pipelineStages } from '../pipelines/schema.js';
|
|
12
|
+
import { planItems } from '../plans/schema.js';
|
|
13
|
+
import { positions } from '../positions/schema.js';
|
|
14
|
+
import { raises } from '../raises/schema.js';
|
|
15
|
+
/**
|
|
16
|
+
* How far a match on a related record sits below a match on the record itself.
|
|
17
|
+
*
|
|
18
|
+
* A Deal whose own summary says "renewal" is a better answer than one with a
|
|
19
|
+
* planned step that mentions it. Without this they interleave by `ts_rank` alone,
|
|
20
|
+
* which compares the wrong two things: one rank is over the record, the other over
|
|
21
|
+
* a single line attached to it.
|
|
22
|
+
*/
|
|
23
|
+
const RELATED_RANK_FACTOR = 0.4;
|
|
24
|
+
/** The compiled `tsquery`, built once per request and shared by every collection. */
|
|
25
|
+
export function compileQuery(tsQuery) {
|
|
26
|
+
return sql `to_tsquery('english', ${tsQuery})`;
|
|
27
|
+
}
|
|
28
|
+
function matches(vector, query) {
|
|
29
|
+
return sql `${vector} @@ ${query}`;
|
|
30
|
+
}
|
|
31
|
+
function rank(vector, query) {
|
|
32
|
+
return sql `ts_rank(${vector}, ${query})`;
|
|
33
|
+
}
|
|
34
|
+
function relatedRank(vector, query) {
|
|
35
|
+
return sql `ts_rank(${vector}, ${query}) * ${RELATED_RANK_FACTOR}`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The number of matching records, which is not the number of rows returned.
|
|
39
|
+
*
|
|
40
|
+
* A window function is evaluated before `LIMIT`, so this counts every group the
|
|
41
|
+
* query found and the page below it stays capped. `api.md` has no envelope for
|
|
42
|
+
* this endpoint and the dashboard's precedent is an exact total beside a short
|
|
43
|
+
* list, because a capped list cannot answer "how many".
|
|
44
|
+
*
|
|
45
|
+
* Cast to `int` because `count` is `bigint`, and postgres.js hands a bigint back
|
|
46
|
+
* as a string rather than losing precision on it. Summing those gives `'01'`
|
|
47
|
+
* instead of `1`, which is a wrong number rather than a type error.
|
|
48
|
+
*/
|
|
49
|
+
const total = sql `(count(*) over ())::int`;
|
|
50
|
+
/** Rows are grouped by id, so a record matching on both itself and a related row appears once. */
|
|
51
|
+
function bestRank(rankColumn) {
|
|
52
|
+
return sql `${max(rankColumn)}`;
|
|
53
|
+
}
|
|
54
|
+
export async function searchHandbookPages(db, workspaceId, query, limit) {
|
|
55
|
+
const rows = await db
|
|
56
|
+
.select({
|
|
57
|
+
id: handbookPages.id,
|
|
58
|
+
title: handbookPages.title,
|
|
59
|
+
subtitle: handbookPages.slug,
|
|
60
|
+
snippetSource: handbookPages.body,
|
|
61
|
+
total,
|
|
62
|
+
})
|
|
63
|
+
.from(handbookPages)
|
|
64
|
+
.where(and(eq(handbookPages.workspaceId, workspaceId), matches(handbookPages.searchVector, query)))
|
|
65
|
+
.orderBy(desc(rank(handbookPages.searchVector, query)), asc(handbookPages.id))
|
|
66
|
+
.limit(limit);
|
|
67
|
+
return collect('handbook_page', rows);
|
|
68
|
+
}
|
|
69
|
+
export async function searchPeople(db, workspaceId, query, limit) {
|
|
70
|
+
const own = db
|
|
71
|
+
.select({ id: people.id, rank: rank(people.searchVector, query).as('rank') })
|
|
72
|
+
.from(people)
|
|
73
|
+
.where(and(eq(people.workspaceId, workspaceId), matches(people.searchVector, query)));
|
|
74
|
+
// A person is found by the title they hold, which is on Position and never on
|
|
75
|
+
// Person (`brief.md`). `?q=` on people already reaches the same way.
|
|
76
|
+
const byTitle = db
|
|
77
|
+
.select({ id: positions.personId, rank: relatedRank(positions.searchVector, query).as('rank') })
|
|
78
|
+
.from(positions)
|
|
79
|
+
.where(and(eq(positions.workspaceId, workspaceId), matches(positions.searchVector, query)));
|
|
80
|
+
const hits = unionAll(own, byTitle).as('hits');
|
|
81
|
+
const rows = await db
|
|
82
|
+
.select({
|
|
83
|
+
id: people.id,
|
|
84
|
+
title: people.name,
|
|
85
|
+
subtitle: people.email,
|
|
86
|
+
snippetSource: people.summary,
|
|
87
|
+
total,
|
|
88
|
+
})
|
|
89
|
+
.from(hits)
|
|
90
|
+
.innerJoin(people, eq(people.id, hits.id))
|
|
91
|
+
.groupBy(people.id)
|
|
92
|
+
.orderBy(desc(bestRank(hits.rank)), asc(people.id))
|
|
93
|
+
.limit(limit);
|
|
94
|
+
return collect('person', rows);
|
|
95
|
+
}
|
|
96
|
+
export async function searchRoles(db, workspaceId, query, limit) {
|
|
97
|
+
const rows = await db
|
|
98
|
+
.select({
|
|
99
|
+
id: roles.id,
|
|
100
|
+
title: roles.title,
|
|
101
|
+
subtitle: roles.status,
|
|
102
|
+
// A Role is a title and a status. There is no prose on it to excerpt.
|
|
103
|
+
snippetSource: sql `null::text`,
|
|
104
|
+
total,
|
|
105
|
+
})
|
|
106
|
+
.from(roles)
|
|
107
|
+
.where(and(eq(roles.workspaceId, workspaceId), matches(roles.searchVector, query)))
|
|
108
|
+
.orderBy(desc(rank(roles.searchVector, query)), asc(roles.id))
|
|
109
|
+
.limit(limit);
|
|
110
|
+
return collect('role', rows);
|
|
111
|
+
}
|
|
112
|
+
export async function searchCompanies(db, workspaceId, query, limit) {
|
|
113
|
+
const rows = await db
|
|
114
|
+
.select({
|
|
115
|
+
id: companies.id,
|
|
116
|
+
title: companies.name,
|
|
117
|
+
subtitle: companies.domain,
|
|
118
|
+
snippetSource: companies.summary,
|
|
119
|
+
total,
|
|
120
|
+
})
|
|
121
|
+
.from(companies)
|
|
122
|
+
.where(and(eq(companies.workspaceId, workspaceId), matches(companies.searchVector, query)))
|
|
123
|
+
.orderBy(desc(rank(companies.searchVector, query)), asc(companies.id))
|
|
124
|
+
.limit(limit);
|
|
125
|
+
return collect('company', rows);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* A Deal, Opportunity or Raise found by one of its Plan items.
|
|
129
|
+
*
|
|
130
|
+
* `plan_items` is polymorphic with no foreign key, so the target type is part of
|
|
131
|
+
* the match rather than something a join expresses.
|
|
132
|
+
*/
|
|
133
|
+
function byPlanItem(db, workspaceId, query, targetType) {
|
|
134
|
+
return db
|
|
135
|
+
.select({ id: planItems.targetId, rank: relatedRank(planItems.searchVector, query).as('rank') })
|
|
136
|
+
.from(planItems)
|
|
137
|
+
.where(and(eq(planItems.workspaceId, workspaceId), eq(planItems.targetType, targetType), matches(planItems.searchVector, query)));
|
|
138
|
+
}
|
|
139
|
+
export async function searchDeals(db, workspaceId, query, limit) {
|
|
140
|
+
const own = db
|
|
141
|
+
.select({ id: deals.id, rank: rank(deals.searchVector, query).as('rank') })
|
|
142
|
+
.from(deals)
|
|
143
|
+
.where(and(eq(deals.workspaceId, workspaceId), matches(deals.searchVector, query)));
|
|
144
|
+
const hits = unionAll(own, byPlanItem(db, workspaceId, query, 'deal')).as('hits');
|
|
145
|
+
const rows = await db
|
|
146
|
+
.select({
|
|
147
|
+
id: deals.id,
|
|
148
|
+
title: deals.name,
|
|
149
|
+
subtitle: pipelineStages.label,
|
|
150
|
+
snippetSource: deals.summary,
|
|
151
|
+
total,
|
|
152
|
+
})
|
|
153
|
+
.from(hits)
|
|
154
|
+
.innerJoin(deals, eq(deals.id, hits.id))
|
|
155
|
+
.innerJoin(pipelineStages, eq(pipelineStages.id, deals.stageId))
|
|
156
|
+
.groupBy(deals.id, pipelineStages.label)
|
|
157
|
+
.orderBy(desc(bestRank(hits.rank)), asc(deals.id))
|
|
158
|
+
.limit(limit);
|
|
159
|
+
return collect('deal', rows);
|
|
160
|
+
}
|
|
161
|
+
export async function searchOpportunities(db, workspaceId, query, limit) {
|
|
162
|
+
const own = db
|
|
163
|
+
.select({ id: opportunities.id, rank: rank(opportunities.searchVector, query).as('rank') })
|
|
164
|
+
.from(opportunities)
|
|
165
|
+
.where(and(eq(opportunities.workspaceId, workspaceId), matches(opportunities.searchVector, query)));
|
|
166
|
+
const hits = unionAll(own, byPlanItem(db, workspaceId, query, 'opportunity')).as('hits');
|
|
167
|
+
const rows = await db
|
|
168
|
+
.select({
|
|
169
|
+
id: opportunities.id,
|
|
170
|
+
title: opportunities.name,
|
|
171
|
+
subtitle: opportunities.kind,
|
|
172
|
+
snippetSource: opportunities.summary,
|
|
173
|
+
total,
|
|
174
|
+
})
|
|
175
|
+
.from(hits)
|
|
176
|
+
.innerJoin(opportunities, eq(opportunities.id, hits.id))
|
|
177
|
+
.groupBy(opportunities.id)
|
|
178
|
+
.orderBy(desc(bestRank(hits.rank)), asc(opportunities.id))
|
|
179
|
+
.limit(limit);
|
|
180
|
+
return collect('opportunity', rows);
|
|
181
|
+
}
|
|
182
|
+
export async function searchRaises(db, workspaceId, query, limit) {
|
|
183
|
+
const own = db
|
|
184
|
+
.select({ id: raises.id, rank: rank(raises.searchVector, query).as('rank') })
|
|
185
|
+
.from(raises)
|
|
186
|
+
.where(and(eq(raises.workspaceId, workspaceId), matches(raises.searchVector, query)));
|
|
187
|
+
const hits = unionAll(own, byPlanItem(db, workspaceId, query, 'raise')).as('hits');
|
|
188
|
+
const rows = await db
|
|
189
|
+
.select({
|
|
190
|
+
id: raises.id,
|
|
191
|
+
title: raises.name,
|
|
192
|
+
subtitle: pipelineStages.label,
|
|
193
|
+
snippetSource: raises.summary,
|
|
194
|
+
total,
|
|
195
|
+
})
|
|
196
|
+
.from(hits)
|
|
197
|
+
.innerJoin(raises, eq(raises.id, hits.id))
|
|
198
|
+
.innerJoin(pipelineStages, eq(pipelineStages.id, raises.stageId))
|
|
199
|
+
.groupBy(raises.id, pipelineStages.label)
|
|
200
|
+
.orderBy(desc(bestRank(hits.rank)), asc(raises.id))
|
|
201
|
+
.limit(limit);
|
|
202
|
+
return collect('raise', rows);
|
|
203
|
+
}
|
|
204
|
+
export async function searchPartnerships(db, workspaceId, query, limit) {
|
|
205
|
+
const rows = await db
|
|
206
|
+
.select({
|
|
207
|
+
id: partnerships.id,
|
|
208
|
+
title: partnerships.name,
|
|
209
|
+
subtitle: partnerships.kind,
|
|
210
|
+
snippetSource: partnerships.summary,
|
|
211
|
+
total,
|
|
212
|
+
})
|
|
213
|
+
.from(partnerships)
|
|
214
|
+
.where(and(eq(partnerships.workspaceId, workspaceId), matches(partnerships.searchVector, query)))
|
|
215
|
+
.orderBy(desc(rank(partnerships.searchVector, query)), asc(partnerships.id))
|
|
216
|
+
.limit(limit);
|
|
217
|
+
return collect('partnership', rows);
|
|
218
|
+
}
|
|
219
|
+
export async function searchDecisions(db, workspaceId, query, limit) {
|
|
220
|
+
const rows = await db
|
|
221
|
+
.select({
|
|
222
|
+
id: decisions.id,
|
|
223
|
+
title: decisions.body,
|
|
224
|
+
// The date it was decided, as `YYYY-MM-DD`. A decision has no name and no
|
|
225
|
+
// stage; when it was made is the line the mockup shows beside it.
|
|
226
|
+
subtitle: sql `to_char(${decisions.decidedAt} at time zone 'UTC', 'YYYY-MM-DD')`,
|
|
227
|
+
snippetSource: decisions.rationale,
|
|
228
|
+
total,
|
|
229
|
+
})
|
|
230
|
+
.from(decisions)
|
|
231
|
+
.where(and(eq(decisions.workspaceId, workspaceId), matches(decisions.searchVector, query)))
|
|
232
|
+
.orderBy(desc(rank(decisions.searchVector, query)), asc(decisions.id))
|
|
233
|
+
.limit(limit);
|
|
234
|
+
return collect('decision', rows);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* `count(*) over ()` is on every row, so an empty page carries no total at all.
|
|
238
|
+
* That is the only case where zero is the right answer.
|
|
239
|
+
*/
|
|
240
|
+
function collect(collection, rows) {
|
|
241
|
+
return {
|
|
242
|
+
collection,
|
|
243
|
+
hits: rows.map(({ id, title, subtitle, snippetSource }) => ({
|
|
244
|
+
id,
|
|
245
|
+
title,
|
|
246
|
+
subtitle,
|
|
247
|
+
snippetSource,
|
|
248
|
+
})),
|
|
249
|
+
total: rows[0]?.total ?? 0,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=repository.js.map
|