@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,399 @@
|
|
|
1
|
+
import { changedKeys } from '../../lib/changes.ts'
|
|
2
|
+
import { UNIQUE_VIOLATION, postgresErrorCode } from '../../lib/database.ts'
|
|
3
|
+
import type { Database } from '../../lib/database.ts'
|
|
4
|
+
import { AppError } from '../../lib/errors.ts'
|
|
5
|
+
import type { IdFactory } from '../../lib/ids.ts'
|
|
6
|
+
import { mapPage, readListWindow, toPage } from '../../lib/pagination.ts'
|
|
7
|
+
import type { ListQueryParameters, Page } from '../../lib/pagination.ts'
|
|
8
|
+
import type { Transaction, TransactionScope } from '../../runtime/transaction.ts'
|
|
9
|
+
import type { Actor } from '../auth/actor.ts'
|
|
10
|
+
import { actorMemberId, requireWorkspaceId } from '../auth/actor.ts'
|
|
11
|
+
import * as repository from './repository.ts'
|
|
12
|
+
import { DEFAULT_HANDBOOK_PAGE_SORT, HANDBOOK_PAGE_SORTS } from './repository.ts'
|
|
13
|
+
import type { HandbookPageFilters, HandbookPageRecord } from './repository.ts'
|
|
14
|
+
import { slugFromTitle, uniqueSlug } from './slugs.ts'
|
|
15
|
+
import { MAX_DEPTH, childrenOf, depthOf, descendantIds, placeAt, rejectMove } from './tree.ts'
|
|
16
|
+
import type { MoveRejection } from './tree.ts'
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The handbook: nested markdown pages, read by people in a sidebar and by agents
|
|
20
|
+
* over the same endpoints.
|
|
21
|
+
*
|
|
22
|
+
* This service owns the two rules the schema cannot hold. Depth and the
|
|
23
|
+
* no-descendant-cycles rule are checked here because a self-referencing foreign
|
|
24
|
+
* key expresses the shape of a tree and nothing about its bounds. Sibling order
|
|
25
|
+
* is kept contiguous from 0 for the same reason a pipeline's is: it is what lets
|
|
26
|
+
* a PATCHed `sort_order` mean "position in the sidebar" rather than an opaque
|
|
27
|
+
* number a client has to guess a gap in.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
export interface HandbookDependencies {
|
|
31
|
+
readonly db: Database
|
|
32
|
+
readonly transaction: TransactionScope
|
|
33
|
+
readonly createId: IdFactory
|
|
34
|
+
readonly now: () => Date
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** A page as the API returns one: the stored row minus the tenancy column. */
|
|
38
|
+
export type HandbookPageView = Omit<HandbookPageRecord, 'workspaceId'>
|
|
39
|
+
|
|
40
|
+
export interface CreateHandbookPageInput {
|
|
41
|
+
readonly title: string
|
|
42
|
+
/** Absent means empty. A page is created before it is written, which is the point of "Add subpage". */
|
|
43
|
+
readonly body: string
|
|
44
|
+
/** Absent means derived from the title, with a numeric suffix if that is taken. */
|
|
45
|
+
readonly slug: string | undefined
|
|
46
|
+
/** Null means top level. */
|
|
47
|
+
readonly parentId: string | null
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* PATCH semantics: an absent field is left alone.
|
|
52
|
+
*
|
|
53
|
+
* `parentId` and `sortOrder` are the move; `title`, `body` and `slug` are the
|
|
54
|
+
* edit. A request may carry both, and the two are applied in that order so the
|
|
55
|
+
* page ends up where it was put with what it was given.
|
|
56
|
+
*/
|
|
57
|
+
export interface UpdateHandbookPageInput {
|
|
58
|
+
readonly title?: string | undefined
|
|
59
|
+
readonly body?: string | undefined
|
|
60
|
+
readonly slug?: string | undefined
|
|
61
|
+
/** Null moves the page to the top level. */
|
|
62
|
+
readonly parentId?: string | null | undefined
|
|
63
|
+
/** The page's new position among its siblings, 0-based. */
|
|
64
|
+
readonly sortOrder?: number | undefined
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface HandbookService {
|
|
68
|
+
list(
|
|
69
|
+
actor: Actor,
|
|
70
|
+
filters: HandbookPageFilters,
|
|
71
|
+
query: ListQueryParameters,
|
|
72
|
+
): Promise<Page<HandbookPageView>>
|
|
73
|
+
get(actor: Actor, id: string): Promise<HandbookPageView>
|
|
74
|
+
create(actor: Actor, input: CreateHandbookPageInput): Promise<HandbookPageView>
|
|
75
|
+
update(actor: Actor, id: string, changes: UpdateHandbookPageInput): Promise<HandbookPageView>
|
|
76
|
+
remove(actor: Actor, id: string): Promise<void>
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function toView(record: HandbookPageRecord): HandbookPageView {
|
|
80
|
+
const { workspaceId: _workspaceId, ...view } = record
|
|
81
|
+
|
|
82
|
+
return view
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** The 422 a refused move produces. Each rejection is a different mistake, so each says something different. */
|
|
86
|
+
function moveRefused(rejection: MoveRejection): AppError {
|
|
87
|
+
const messages: Readonly<Record<MoveRejection, string>> = {
|
|
88
|
+
self: 'A page cannot be nested under itself',
|
|
89
|
+
descendant: 'A page cannot be nested under one of its own subpages',
|
|
90
|
+
missing_parent: 'That parent page is not in this workspace',
|
|
91
|
+
too_deep: `The handbook nests ${String(MAX_DEPTH + 1)} levels deep at most`,
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return AppError.validationFailed(messages[rejection], [
|
|
95
|
+
{ field: 'parent_id', message: messages[rejection] },
|
|
96
|
+
])
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function duplicateSlug(): AppError {
|
|
100
|
+
return AppError.conflict('A handbook page in this workspace already uses that address', [
|
|
101
|
+
{ field: 'slug', message: 'Already in use' },
|
|
102
|
+
])
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function createHandbookService(dependencies: HandbookDependencies): HandbookService {
|
|
106
|
+
async function require(workspaceId: string, id: string): Promise<HandbookPageRecord> {
|
|
107
|
+
const page = await repository.findPage(dependencies.db, workspaceId, id)
|
|
108
|
+
|
|
109
|
+
// A page in another workspace is indistinguishable from one that never
|
|
110
|
+
// existed, per `api.md`.
|
|
111
|
+
if (page === undefined) {
|
|
112
|
+
throw AppError.notFound('Handbook page not found')
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return page
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Writes a sibling set back as positions 0..n-1, touching only the rows that
|
|
120
|
+
* moved, and re-parenting `reparented` if it is one of them.
|
|
121
|
+
*
|
|
122
|
+
* `updated_at` and `updated_by` are deliberately not written. They say who last
|
|
123
|
+
* wrote the page, which is the line the reader sees under its title, and a page
|
|
124
|
+
* that shifted down one because a neighbour was dragged above it was not
|
|
125
|
+
* written by anybody.
|
|
126
|
+
*/
|
|
127
|
+
async function renumber(
|
|
128
|
+
tx: Transaction,
|
|
129
|
+
workspaceId: string,
|
|
130
|
+
order: readonly HandbookPageRecord[],
|
|
131
|
+
reparented: { readonly id: string; readonly parentId: string | null } | undefined,
|
|
132
|
+
): Promise<void> {
|
|
133
|
+
for (const [index, page] of order.entries()) {
|
|
134
|
+
const movesParent = reparented !== undefined && reparented.id === page.id
|
|
135
|
+
const movesOrder = page.sortOrder !== index
|
|
136
|
+
|
|
137
|
+
if (!movesParent && !movesOrder) {
|
|
138
|
+
continue
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
await repository.updatePage(tx, workspaceId, page.id, {
|
|
142
|
+
...(movesParent ? { parentId: reparented.parentId } : {}),
|
|
143
|
+
sortOrder: index,
|
|
144
|
+
})
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Applies a move, and reports which fields it changed.
|
|
150
|
+
*
|
|
151
|
+
* The page is lifted out of its sibling set and dropped into the target one at
|
|
152
|
+
* `position`, then both sets are renumbered. When the parent does not change
|
|
153
|
+
* there is only one set, and lifting then re-inserting is what turns a
|
|
154
|
+
* `sort_order` of 2 into "third among your siblings" rather than a raw column
|
|
155
|
+
* write that could leave two pages sharing a position.
|
|
156
|
+
*
|
|
157
|
+
* @param position Absent leaves the page where it sits, which for a re-nest
|
|
158
|
+
* means the end of its new sibling set: there is no position to keep.
|
|
159
|
+
*/
|
|
160
|
+
async function move(
|
|
161
|
+
tx: Transaction,
|
|
162
|
+
workspaceId: string,
|
|
163
|
+
page: HandbookPageRecord,
|
|
164
|
+
parentId: string | null,
|
|
165
|
+
position: number | undefined,
|
|
166
|
+
): Promise<readonly string[]> {
|
|
167
|
+
const all = await repository.listAllPages(tx, workspaceId)
|
|
168
|
+
const changesParent = parentId !== page.parentId
|
|
169
|
+
|
|
170
|
+
if (changesParent) {
|
|
171
|
+
const rejection = rejectMove(all, page.id, parentId)
|
|
172
|
+
|
|
173
|
+
if (rejection !== undefined) {
|
|
174
|
+
throw moveRefused(rejection)
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const siblings = childrenOf(all, parentId).filter((sibling) => sibling.id !== page.id)
|
|
179
|
+
const held = childrenOf(all, page.parentId).findIndex((sibling) => sibling.id === page.id)
|
|
180
|
+
|
|
181
|
+
await renumber(
|
|
182
|
+
tx,
|
|
183
|
+
workspaceId,
|
|
184
|
+
placeAt(siblings, page, position ?? (changesParent ? siblings.length : held)),
|
|
185
|
+
changesParent ? { id: page.id, parentId } : undefined,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
if (changesParent) {
|
|
189
|
+
await renumber(tx, workspaceId, siblingsOf(all, page), undefined)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const moved = await repository.findPage(tx, workspaceId, page.id)
|
|
193
|
+
|
|
194
|
+
if (moved === undefined) {
|
|
195
|
+
throw AppError.notFound('Handbook page not found')
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return [
|
|
199
|
+
...(changesParent ? ['parentId'] : []),
|
|
200
|
+
...(moved.sortOrder === page.sortOrder ? [] : ['sortOrder']),
|
|
201
|
+
]
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** The set a page is leaving, without the page. Renumbered so it stays contiguous from 0. */
|
|
205
|
+
function siblingsOf(
|
|
206
|
+
all: readonly HandbookPageRecord[],
|
|
207
|
+
page: HandbookPageRecord,
|
|
208
|
+
): HandbookPageRecord[] {
|
|
209
|
+
return childrenOf(all, page.parentId).filter((sibling) => sibling.id !== page.id)
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* The edit half of a PATCH: what the page says, and who last said it.
|
|
214
|
+
*
|
|
215
|
+
* `updated_at` and `updated_by` are stamped here and nowhere else, so a request
|
|
216
|
+
* that only moved the page leaves them alone. Re-reads instead of writing when
|
|
217
|
+
* nothing about the content changed, because the row may still have been
|
|
218
|
+
* renumbered by the move that ran first.
|
|
219
|
+
*/
|
|
220
|
+
async function writeContent(
|
|
221
|
+
tx: Transaction,
|
|
222
|
+
workspaceId: string,
|
|
223
|
+
id: string,
|
|
224
|
+
columns: Partial<repository.HandbookPageColumns>,
|
|
225
|
+
actor: Actor,
|
|
226
|
+
changed: boolean,
|
|
227
|
+
): Promise<HandbookPageRecord | undefined> {
|
|
228
|
+
if (!changed) {
|
|
229
|
+
return repository.findPage(tx, workspaceId, id)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
try {
|
|
233
|
+
return await repository.updatePage(tx, workspaceId, id, {
|
|
234
|
+
...columns,
|
|
235
|
+
updatedBy: actorMemberId(actor),
|
|
236
|
+
updatedAt: dependencies.now(),
|
|
237
|
+
})
|
|
238
|
+
} catch (error: unknown) {
|
|
239
|
+
if (postgresErrorCode(error) === UNIQUE_VIOLATION) {
|
|
240
|
+
throw duplicateSlug()
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
throw error
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return {
|
|
248
|
+
async list(actor, filters, query) {
|
|
249
|
+
const workspaceId = requireWorkspaceId(actor)
|
|
250
|
+
const window = readListWindow(query, HANDBOOK_PAGE_SORTS, DEFAULT_HANDBOOK_PAGE_SORT)
|
|
251
|
+
const rows = await repository.listPages(dependencies.db, workspaceId, filters, window)
|
|
252
|
+
|
|
253
|
+
return mapPage(toPage(rows, window, (page) => page.id), toView)
|
|
254
|
+
},
|
|
255
|
+
|
|
256
|
+
async get(actor, id) {
|
|
257
|
+
return toView(await require(requireWorkspaceId(actor), id))
|
|
258
|
+
},
|
|
259
|
+
|
|
260
|
+
async create(actor, input) {
|
|
261
|
+
const workspaceId = requireWorkspaceId(actor)
|
|
262
|
+
const id = dependencies.createId('handbookPage')
|
|
263
|
+
|
|
264
|
+
return dependencies.transaction(async ({ tx, events }) => {
|
|
265
|
+
const all = await repository.listAllPages(tx, workspaceId)
|
|
266
|
+
|
|
267
|
+
if (input.parentId !== null) {
|
|
268
|
+
const parent = all.find((page) => page.id === input.parentId)
|
|
269
|
+
|
|
270
|
+
if (parent === undefined) {
|
|
271
|
+
throw moveRefused('missing_parent')
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// A new page carries no subtree, so its own depth is the whole check.
|
|
275
|
+
if (depthOf(all, parent.id) + 1 > MAX_DEPTH) {
|
|
276
|
+
throw moveRefused('too_deep')
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
const taken = new Set(all.map((page) => page.slug))
|
|
281
|
+
const siblings = childrenOf(all, input.parentId)
|
|
282
|
+
|
|
283
|
+
try {
|
|
284
|
+
const created = await repository.insertPage(tx, {
|
|
285
|
+
id,
|
|
286
|
+
workspaceId,
|
|
287
|
+
title: input.title,
|
|
288
|
+
slug: input.slug ?? uniqueSlug(taken, slugFromTitle(input.title)),
|
|
289
|
+
parentId: input.parentId,
|
|
290
|
+
sortOrder: siblings.length,
|
|
291
|
+
body: input.body,
|
|
292
|
+
updatedBy: actorMemberId(actor),
|
|
293
|
+
})
|
|
294
|
+
|
|
295
|
+
events.emit('record.created', {
|
|
296
|
+
workspaceId,
|
|
297
|
+
objectType: 'handbook_page',
|
|
298
|
+
recordId: id,
|
|
299
|
+
})
|
|
300
|
+
|
|
301
|
+
return toView(created)
|
|
302
|
+
} catch (error: unknown) {
|
|
303
|
+
// A slug given by the caller, or two concurrent creates that derived
|
|
304
|
+
// the same one from the same read of `taken`.
|
|
305
|
+
if (postgresErrorCode(error) === UNIQUE_VIOLATION) {
|
|
306
|
+
throw duplicateSlug()
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
throw error
|
|
310
|
+
}
|
|
311
|
+
})
|
|
312
|
+
},
|
|
313
|
+
|
|
314
|
+
async update(actor, id, changes) {
|
|
315
|
+
const workspaceId = requireWorkspaceId(actor)
|
|
316
|
+
const existing = await require(workspaceId, id)
|
|
317
|
+
const columns = {
|
|
318
|
+
...(changes.title === undefined ? {} : { title: changes.title }),
|
|
319
|
+
...(changes.body === undefined ? {} : { body: changes.body }),
|
|
320
|
+
...(changes.slug === undefined ? {} : { slug: changes.slug }),
|
|
321
|
+
}
|
|
322
|
+
const written = changedKeys(existing, columns)
|
|
323
|
+
const moves = changes.parentId !== undefined || changes.sortOrder !== undefined
|
|
324
|
+
|
|
325
|
+
if (written.length === 0 && !moves) {
|
|
326
|
+
return toView(existing)
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
return dependencies.transaction(async ({ tx, events }) => {
|
|
330
|
+
const movedFields = moves
|
|
331
|
+
? await move(
|
|
332
|
+
tx,
|
|
333
|
+
workspaceId,
|
|
334
|
+
existing,
|
|
335
|
+
changes.parentId === undefined ? existing.parentId : changes.parentId,
|
|
336
|
+
changes.sortOrder,
|
|
337
|
+
)
|
|
338
|
+
: []
|
|
339
|
+
|
|
340
|
+
const updated = await writeContent(tx, workspaceId, id, columns, actor, written.length > 0)
|
|
341
|
+
|
|
342
|
+
if (updated === undefined) {
|
|
343
|
+
throw AppError.notFound('Handbook page not found')
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
const changed = [...written, ...movedFields]
|
|
347
|
+
|
|
348
|
+
if (changed.length > 0) {
|
|
349
|
+
events.emit('record.updated', {
|
|
350
|
+
workspaceId,
|
|
351
|
+
objectType: 'handbook_page',
|
|
352
|
+
recordId: id,
|
|
353
|
+
changedFields: changed,
|
|
354
|
+
})
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
return toView(updated)
|
|
358
|
+
})
|
|
359
|
+
},
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Deletes the page and every page nested under it.
|
|
363
|
+
*
|
|
364
|
+
* The subtree goes through the self-referencing foreign key's cascade, so the
|
|
365
|
+
* ids are read first: a webhook consumer mirroring the handbook needs one
|
|
366
|
+
* `record.deleted` per page that is gone, not one for the page a person
|
|
367
|
+
* happened to click on.
|
|
368
|
+
*
|
|
369
|
+
* Siblings shifting up afterwards emit nothing. A consumer that mirrors order
|
|
370
|
+
* re-reads the sibling set, which is the same thing it does after a drag.
|
|
371
|
+
*/
|
|
372
|
+
async remove(actor, id) {
|
|
373
|
+
const workspaceId = requireWorkspaceId(actor)
|
|
374
|
+
|
|
375
|
+
await dependencies.transaction(async ({ tx, events }) => {
|
|
376
|
+
const all = await repository.listAllPages(tx, workspaceId)
|
|
377
|
+
const page = all.find((candidate) => candidate.id === id)
|
|
378
|
+
|
|
379
|
+
if (page === undefined) {
|
|
380
|
+
throw AppError.notFound('Handbook page not found')
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
const removed = [id, ...descendantIds(all, id)]
|
|
384
|
+
|
|
385
|
+
await repository.deletePage(tx, workspaceId, id)
|
|
386
|
+
await renumber(
|
|
387
|
+
tx,
|
|
388
|
+
workspaceId,
|
|
389
|
+
childrenOf(all, page.parentId).filter((sibling) => sibling.id !== id),
|
|
390
|
+
undefined,
|
|
391
|
+
)
|
|
392
|
+
|
|
393
|
+
for (const recordId of removed) {
|
|
394
|
+
events.emit('record.deleted', { workspaceId, objectType: 'handbook_page', recordId })
|
|
395
|
+
}
|
|
396
|
+
})
|
|
397
|
+
},
|
|
398
|
+
}
|
|
399
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handbook slugs: the stable handle a page is addressed by.
|
|
3
|
+
*
|
|
4
|
+
* Hyphenated rather than the underscores a pipeline stage uses, because these are
|
|
5
|
+
* the ones already written down. `onboarding.md` seeds `ideal-customer-profile`,
|
|
6
|
+
* and `agent-tasks.md` names pages by exactly those strings in a task's
|
|
7
|
+
* `handbookSlugs`.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** Long enough for a real page title, short enough to stay a handle. Matches the route's `slug` bound. */
|
|
11
|
+
export const MAX_SLUG_LENGTH = 100
|
|
12
|
+
|
|
13
|
+
/** What the API accepts as a hand-written slug: lowercase words joined by single hyphens. */
|
|
14
|
+
export const SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A slug derived from a page title: accents stripped, lowercased, runs of
|
|
18
|
+
* anything else collapsed to one hyphen.
|
|
19
|
+
*
|
|
20
|
+
* @returns `page` for a title that leaves nothing behind, the way `Term sheet`
|
|
21
|
+
* leaves `term_sheet` but `!!!` leaves nothing at all.
|
|
22
|
+
*/
|
|
23
|
+
export function slugFromTitle(title: string): string {
|
|
24
|
+
const slug = title
|
|
25
|
+
.normalize('NFKD')
|
|
26
|
+
.replace(/[̀-ͯ]/gu, '')
|
|
27
|
+
.toLowerCase()
|
|
28
|
+
.replace(/[^a-z0-9]+/gu, '-')
|
|
29
|
+
.replace(/^-+|-+$/gu, '')
|
|
30
|
+
.slice(0, MAX_SLUG_LENGTH)
|
|
31
|
+
.replace(/-+$/gu, '')
|
|
32
|
+
|
|
33
|
+
return slug.length === 0 ? 'page' : slug
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* `pricing`, `pricing-2`, `pricing-3`: two pages may share a title, and the
|
|
38
|
+
* unique index means they may not share a slug.
|
|
39
|
+
*
|
|
40
|
+
* @param taken Every slug already in the workspace.
|
|
41
|
+
*/
|
|
42
|
+
export function uniqueSlug(taken: ReadonlySet<string>, base: string): string {
|
|
43
|
+
if (!taken.has(base)) {
|
|
44
|
+
return base
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
for (let suffix = 2; ; suffix += 1) {
|
|
48
|
+
const candidate = `${base.slice(0, MAX_SLUG_LENGTH - 1 - String(suffix).length)}-${String(suffix)}`
|
|
49
|
+
|
|
50
|
+
if (!taken.has(candidate)) {
|
|
51
|
+
return candidate
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
|
|
3
|
+
import type { McpToolRegistry } from '../../runtime/module.ts'
|
|
4
|
+
import { idArg, idSetArg, listWindowShape, registerCrudTools, termArg, toSet } from '../crudTools.ts'
|
|
5
|
+
import { createBody, handbookPageResponse, toCreateInput, toUpdateInput, updateBody } from './routes.ts'
|
|
6
|
+
import type { HandbookService } from './service.ts'
|
|
7
|
+
|
|
8
|
+
/** `handbook_pages_*`. Same schemas and mappers as `/v1/handbook_pages`. */
|
|
9
|
+
|
|
10
|
+
const listArgs = z.strictObject({
|
|
11
|
+
...listWindowShape,
|
|
12
|
+
q: termArg.describe('Free text over the title and the body. This is how you search the handbook.'),
|
|
13
|
+
slug: idSetArg.optional().describe('Fetch pages by their stable slug rather than by id.'),
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
export function registerHandbookTools(mcp: McpToolRegistry, service: HandbookService): void {
|
|
17
|
+
registerCrudTools(mcp, {
|
|
18
|
+
resource: 'handbook_pages',
|
|
19
|
+
subject: 'handbook page',
|
|
20
|
+
about:
|
|
21
|
+
'A markdown page of company knowledge: voice, ICP, how we sell, case studies. ' +
|
|
22
|
+
'Read these before writing anything a customer will see.',
|
|
23
|
+
service,
|
|
24
|
+
render: handbookPageResponse,
|
|
25
|
+
listArgs,
|
|
26
|
+
toFilters: (args) => ({ term: args.q, slugs: toSet(args.slug) }),
|
|
27
|
+
createArgs: createBody,
|
|
28
|
+
toCreateInput,
|
|
29
|
+
updateArgs: updateBody.extend({ id: idArg }),
|
|
30
|
+
toUpdateInput,
|
|
31
|
+
})
|
|
32
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The handbook tree's rules, as plain functions over the rows.
|
|
3
|
+
*
|
|
4
|
+
* A self-referencing foreign key can express a tree but not its bounds: nothing
|
|
5
|
+
* in Postgres refuses a page nested under its own child, and nothing counts
|
|
6
|
+
* levels. `schema.md` puts both in the service, and they live here rather than in
|
|
7
|
+
* `service.ts` so they can be exercised without a database.
|
|
8
|
+
*
|
|
9
|
+
* Every function takes one workspace's pages. They are small enough to walk in
|
|
10
|
+
* memory, and a single snapshot is what makes a sequence of checks agree with
|
|
11
|
+
* each other.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* How deep a page may sit, counting a top-level page as 0.
|
|
16
|
+
*
|
|
17
|
+
* Four, the mockup's `MAX_DEPTH`, so five levels are reachable. The cap exists
|
|
18
|
+
* because the sidebar indents by a fixed 14px per level and a sixth level has
|
|
19
|
+
* nowhere left to go in a 260px column.
|
|
20
|
+
*/
|
|
21
|
+
export const MAX_DEPTH = 4
|
|
22
|
+
|
|
23
|
+
/** What the tree rules need off a page. The service passes stored rows, which carry more. */
|
|
24
|
+
export interface TreeNode {
|
|
25
|
+
readonly id: string
|
|
26
|
+
readonly parentId: string | null
|
|
27
|
+
readonly sortOrder: number
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* One parent's children, in sibling order. `parentId: null` gives the top level.
|
|
32
|
+
*
|
|
33
|
+
* The id tiebreak never fires while the service keeps a sibling set contiguous
|
|
34
|
+
* from 0, but two rows sharing a position must still come back in a fixed order
|
|
35
|
+
* rather than the one the planner happened to choose.
|
|
36
|
+
*/
|
|
37
|
+
export function childrenOf<TNode extends TreeNode>(
|
|
38
|
+
nodes: readonly TNode[],
|
|
39
|
+
parentId: string | null,
|
|
40
|
+
): TNode[] {
|
|
41
|
+
return nodes
|
|
42
|
+
.filter((node) => node.parentId === parentId)
|
|
43
|
+
.sort((left, right) => left.sortOrder - right.sortOrder || left.id.localeCompare(right.id))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Every page under this one, at any depth. The set a delete takes with it, and the set a move may not land in. */
|
|
47
|
+
export function descendantIds(nodes: readonly TreeNode[], rootId: string): ReadonlySet<string> {
|
|
48
|
+
const found = new Set<string>()
|
|
49
|
+
const pending = [rootId]
|
|
50
|
+
|
|
51
|
+
while (pending.length > 0) {
|
|
52
|
+
const parentId = pending.pop()
|
|
53
|
+
|
|
54
|
+
for (const child of nodes.filter((node) => node.parentId === parentId)) {
|
|
55
|
+
// A cycle would loop forever. The service cannot create one, but this
|
|
56
|
+
// walks whatever is in the table rather than trusting that.
|
|
57
|
+
if (!found.has(child.id)) {
|
|
58
|
+
found.add(child.id)
|
|
59
|
+
pending.push(child.id)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return found
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* How deep a page sits, counting a top-level page as 0.
|
|
69
|
+
*
|
|
70
|
+
* @returns The depth, or `MAX_DEPTH + 1` if the chain above the page is broken
|
|
71
|
+
* or circular. That is deliberately over the cap: a page whose ancestry cannot
|
|
72
|
+
* be resolved must fail a depth check rather than pass one.
|
|
73
|
+
*/
|
|
74
|
+
export function depthOf(nodes: readonly TreeNode[], id: string): number {
|
|
75
|
+
const byId = new Map(nodes.map((node) => [node.id, node]))
|
|
76
|
+
let cursor = byId.get(id)?.parentId ?? null
|
|
77
|
+
let depth = 0
|
|
78
|
+
|
|
79
|
+
while (cursor !== null) {
|
|
80
|
+
depth += 1
|
|
81
|
+
|
|
82
|
+
if (depth > MAX_DEPTH) {
|
|
83
|
+
return MAX_DEPTH + 1
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
cursor = byId.get(cursor)?.parentId ?? null
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return depth
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** How many levels sit below a page: 0 when it has no children. A move carries this with it. */
|
|
93
|
+
export function subtreeHeight(nodes: readonly TreeNode[], rootId: string): number {
|
|
94
|
+
const children = nodes.filter((node) => node.parentId === rootId)
|
|
95
|
+
|
|
96
|
+
if (children.length === 0) {
|
|
97
|
+
return 0
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return 1 + Math.max(...children.map((child) => subtreeHeight(nodes, child.id)))
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Why a move was refused. The service turns each into a 422 with its own message. */
|
|
104
|
+
export type MoveRejection = 'self' | 'descendant' | 'missing_parent' | 'too_deep'
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Whether a page may become a child of `parentId`.
|
|
108
|
+
*
|
|
109
|
+
* The three refusals are different mistakes and the caller is told which. Depth
|
|
110
|
+
* counts the whole subtree, not just the page: re-nesting a branch three levels
|
|
111
|
+
* tall under a level-two parent would push its leaves past the cap even though
|
|
112
|
+
* the page itself lands inside it.
|
|
113
|
+
*
|
|
114
|
+
* @param parentId The proposed parent, or null for the top level.
|
|
115
|
+
* @returns undefined when the move is allowed.
|
|
116
|
+
*/
|
|
117
|
+
export function rejectMove(
|
|
118
|
+
nodes: readonly TreeNode[],
|
|
119
|
+
pageId: string,
|
|
120
|
+
parentId: string | null,
|
|
121
|
+
): MoveRejection | undefined {
|
|
122
|
+
if (parentId === null) {
|
|
123
|
+
return subtreeHeight(nodes, pageId) > MAX_DEPTH ? 'too_deep' : undefined
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (parentId === pageId) {
|
|
127
|
+
return 'self'
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (!nodes.some((node) => node.id === parentId)) {
|
|
131
|
+
return 'missing_parent'
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (descendantIds(nodes, pageId).has(parentId)) {
|
|
135
|
+
return 'descendant'
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return depthOf(nodes, parentId) + 1 + subtreeHeight(nodes, pageId) > MAX_DEPTH
|
|
139
|
+
? 'too_deep'
|
|
140
|
+
: undefined
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* A sibling set with one page placed at `position`, 0-based.
|
|
145
|
+
*
|
|
146
|
+
* @param siblings The set the page is joining, in order, without the page itself.
|
|
147
|
+
* @param position Where it lands. Past the end is the end, which is what an
|
|
148
|
+
* absent position means and what a drag to the bottom of a list produces.
|
|
149
|
+
*/
|
|
150
|
+
export function placeAt<TNode extends TreeNode>(
|
|
151
|
+
siblings: readonly TNode[],
|
|
152
|
+
page: TNode,
|
|
153
|
+
position: number,
|
|
154
|
+
): TNode[] {
|
|
155
|
+
const index = Math.max(0, Math.min(position, siblings.length))
|
|
156
|
+
|
|
157
|
+
return [...siblings.slice(0, index), page, ...siblings.slice(index)]
|
|
158
|
+
}
|