@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.11
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/bootstrap.json +85 -5
- package/dist/admin/admin.controller.d.ts +52 -71
- package/dist/admin/admin.controller.js +117 -63
- package/dist/admin/admin.module.d.ts +3 -0
- package/dist/admin/admin.module.js +22 -0
- package/dist/admin/admin.schemas.d.ts +60 -0
- package/dist/admin/admin.schemas.js +50 -0
- package/dist/admin/extensions.controller.d.ts +47 -16
- package/dist/admin/extensions.controller.js +94 -23
- package/dist/admin/extensions.schemas.d.ts +7 -0
- package/dist/admin/extensions.schemas.js +10 -0
- package/dist/admin/limit-defaults.d.ts +20 -0
- package/dist/admin/limit-defaults.js +10 -0
- package/dist/admin/setup-lock.d.ts +16 -0
- package/dist/admin/setup-lock.js +47 -0
- package/dist/admin/setup.controller.d.ts +9 -9
- package/dist/admin/setup.controller.js +28 -26
- package/dist/admin/setup.service.d.ts +20 -28
- package/dist/admin/setup.service.js +65 -65
- package/dist/agents/agent-lookup.d.ts +72 -0
- package/dist/agents/agent-lookup.js +208 -0
- package/dist/agents/agent-profile.service.d.ts +31 -0
- package/dist/agents/agent-profile.service.js +122 -0
- package/dist/agents/agents.controller.d.ts +54 -169
- package/dist/agents/agents.controller.js +172 -37
- package/dist/agents/agents.module.d.ts +10 -0
- package/dist/agents/agents.module.js +71 -0
- package/dist/agents/agents.schemas.d.ts +389 -0
- package/dist/agents/agents.schemas.js +126 -0
- package/dist/agents/agents.service.d.ts +104 -76
- package/dist/agents/agents.service.js +509 -383
- package/dist/agents/definition.d.ts +133 -21
- package/dist/agents/definition.js +361 -41
- package/dist/agents/from-template.d.ts +106 -0
- package/dist/agents/from-template.js +680 -0
- package/dist/agents/from-template.service.d.ts +72 -0
- package/dist/agents/from-template.service.js +178 -0
- package/dist/agents/instruction-files.d.ts +60 -0
- package/dist/agents/instruction-files.js +111 -0
- package/dist/agents/models.controller.d.ts +44 -6
- package/dist/agents/models.controller.js +84 -8
- package/dist/agents/org-templates.d.ts +186 -0
- package/dist/agents/org-templates.js +868 -0
- package/dist/agents/pending-connector-requests.d.ts +79 -0
- package/dist/agents/pending-connector-requests.js +215 -0
- package/dist/agents/pending-connectors.controller.d.ts +39 -0
- package/dist/agents/pending-connectors.controller.js +91 -0
- package/dist/agents/pending-connectors.service.d.ts +62 -0
- package/dist/agents/pending-connectors.service.js +282 -0
- package/dist/agents/profile.d.ts +114 -0
- package/dist/agents/profile.js +55 -0
- package/dist/agents/readiness.controller.d.ts +26 -0
- package/dist/agents/readiness.controller.js +56 -0
- package/dist/agents/templates.controller.d.ts +78 -6
- package/dist/agents/templates.controller.js +154 -8
- package/dist/agents/templates.d.ts +132 -30
- package/dist/agents/templates.js +500 -46
- package/dist/agents/templates.schemas.d.ts +20 -0
- package/dist/agents/templates.schemas.js +45 -0
- package/dist/app.d.ts +93 -0
- package/dist/app.js +150 -0
- package/dist/background/background.controller.d.ts +38 -0
- package/dist/background/background.controller.js +88 -0
- package/dist/background/background.module.d.ts +10 -0
- package/dist/background/background.module.js +39 -0
- package/dist/background/background.schemas.d.ts +10 -0
- package/dist/background/background.schemas.js +16 -0
- package/dist/background/finish.d.ts +44 -0
- package/dist/background/finish.js +95 -0
- package/dist/background/launch-lock.d.ts +15 -0
- package/dist/background/launch-lock.js +40 -0
- package/dist/background/launch.d.ts +42 -0
- package/dist/background/launch.js +77 -0
- package/dist/background/poll.job.d.ts +56 -0
- package/dist/background/poll.job.js +195 -0
- package/dist/background/render.d.ts +23 -0
- package/dist/background/render.js +48 -0
- package/dist/background/session.d.ts +48 -0
- package/dist/background/session.js +80 -0
- package/dist/background/status.d.ts +35 -0
- package/dist/background/status.js +57 -0
- package/dist/background/stop.d.ts +68 -0
- package/dist/background/stop.js +244 -0
- package/dist/background/store.d.ts +167 -0
- package/dist/background/store.js +361 -0
- package/dist/background/store.module.d.ts +6 -0
- package/dist/background/store.module.js +22 -0
- package/dist/background/tasks.service.d.ts +77 -0
- package/dist/background/tasks.service.js +216 -0
- package/dist/background/wake-rules.d.ts +66 -0
- package/dist/background/wake-rules.js +113 -0
- package/dist/background/wake.d.ts +30 -0
- package/dist/background/wake.js +63 -0
- package/dist/catalog/admin-catalog.controller.d.ts +102 -52
- package/dist/catalog/admin-catalog.controller.js +222 -67
- package/dist/catalog/admin-catalog.schemas.d.ts +72 -0
- package/dist/catalog/admin-catalog.schemas.js +92 -0
- package/dist/catalog/catalog-content.d.ts +264 -0
- package/dist/catalog/catalog-content.js +430 -0
- package/dist/catalog/catalog-files.d.ts +41 -0
- package/dist/catalog/catalog-files.js +86 -0
- package/dist/catalog/catalog-import.module.d.ts +7 -0
- package/dist/catalog/catalog-import.module.js +60 -0
- package/dist/catalog/catalog-items.d.ts +290 -0
- package/dist/catalog/catalog-items.js +677 -0
- package/dist/catalog/catalog-scope.service.d.ts +286 -0
- package/dist/catalog/catalog-scope.service.js +1196 -0
- package/dist/catalog/catalog.module.d.ts +12 -0
- package/dist/catalog/catalog.module.js +81 -0
- package/dist/catalog/catalog.service.d.ts +144 -207
- package/dist/catalog/catalog.service.js +258 -528
- package/dist/catalog/claude/agents.js +15 -10
- package/dist/catalog/claude/translate.js +3 -0
- package/dist/catalog/cli.d.ts +14 -3
- package/dist/catalog/cli.js +39 -32
- package/dist/catalog/component-promotion.d.ts +96 -0
- package/dist/catalog/component-promotion.js +395 -0
- package/dist/catalog/component-scope.controller.d.ts +90 -0
- package/dist/catalog/component-scope.controller.js +234 -0
- package/dist/catalog/component-scope.schemas.d.ts +118 -0
- package/dist/catalog/component-scope.schemas.js +97 -0
- package/dist/catalog/component-scope.service.d.ts +366 -0
- package/dist/catalog/component-scope.service.js +1115 -0
- package/dist/catalog/component-state.d.ts +197 -0
- package/dist/catalog/component-state.js +473 -0
- package/dist/catalog/git-source.d.ts +9 -1
- package/dist/catalog/git-source.js +29 -2
- package/dist/catalog/job-ids.d.ts +45 -0
- package/dist/catalog/job-ids.js +40 -0
- package/dist/catalog/jobs.d.ts +27 -0
- package/dist/catalog/jobs.js +70 -0
- package/dist/catalog/locks.d.ts +24 -0
- package/dist/catalog/locks.js +63 -0
- package/dist/catalog/marketplace-fetch.d.ts +1 -1
- package/dist/catalog/marketplace-icons.d.ts +64 -0
- package/dist/catalog/marketplace-icons.js +131 -0
- package/dist/catalog/marketplaces.controller.d.ts +53 -44
- package/dist/catalog/marketplaces.controller.js +146 -51
- package/dist/catalog/marketplaces.schemas.d.ts +48 -0
- package/dist/catalog/marketplaces.schemas.js +53 -0
- package/dist/catalog/marketplaces.service.d.ts +136 -26
- package/dist/catalog/marketplaces.service.js +663 -281
- package/dist/catalog/org-catalog.controller.d.ts +115 -63
- package/dist/catalog/org-catalog.controller.js +207 -100
- package/dist/catalog/org-catalog.schemas.d.ts +88 -0
- package/dist/catalog/org-catalog.schemas.js +93 -0
- package/dist/catalog/org-catalog.service.d.ts +89 -216
- package/dist/catalog/org-catalog.service.js +434 -472
- package/dist/catalog/org-extension-switch.d.ts +41 -0
- package/dist/catalog/org-extension-switch.js +115 -0
- package/dist/catalog/org-extension.controller.d.ts +113 -0
- package/dist/catalog/org-extension.controller.js +271 -0
- package/dist/catalog/org-extension.schemas.d.ts +15 -0
- package/dist/catalog/org-extension.schemas.js +22 -0
- package/dist/catalog/org-plugin-uploads.controller.d.ts +77 -0
- package/dist/catalog/org-plugin-uploads.controller.js +200 -0
- package/dist/catalog/org-plugin-uploads.d.ts +71 -0
- package/dist/catalog/org-plugin-uploads.js +122 -0
- package/dist/catalog/org-plugin-uploads.schemas.d.ts +20 -0
- package/dist/catalog/org-plugin-uploads.schemas.js +32 -0
- package/dist/catalog/owned-items.d.ts +188 -0
- package/dist/catalog/owned-items.js +808 -0
- package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
- package/dist/catalog/owned-plugin-cleanup.js +194 -0
- package/dist/catalog/ownership.d.ts +172 -0
- package/dist/catalog/ownership.js +326 -0
- package/dist/catalog/platform-components.d.ts +243 -0
- package/dist/catalog/platform-components.js +872 -0
- package/dist/catalog/platform-migration.d.ts +115 -0
- package/dist/catalog/platform-migration.js +583 -0
- package/dist/catalog/plugin-import.d.ts +293 -71
- package/dist/catalog/plugin-import.js +1039 -281
- package/dist/catalog/plugin-install.d.ts +271 -66
- package/dist/catalog/plugin-install.js +1198 -344
- package/dist/catalog/plugin-package.d.ts +41 -4
- package/dist/catalog/plugin-package.js +140 -7
- package/dist/catalog/plugin-upgrade.d.ts +312 -188
- package/dist/catalog/plugin-upgrade.js +1371 -1065
- package/dist/catalog/request-rules.d.ts +65 -0
- package/dist/catalog/request-rules.js +217 -0
- package/dist/catalog/requests.service.d.ts +205 -117
- package/dist/catalog/requests.service.js +612 -369
- package/dist/catalog/reserved-names.d.ts +8 -0
- package/dist/catalog/reserved-names.js +42 -0
- package/dist/catalog/scope-orgs.d.ts +21 -0
- package/dist/catalog/scope-orgs.js +67 -0
- package/dist/catalog/scope-state.d.ts +35 -0
- package/dist/catalog/scope-state.js +87 -0
- package/dist/catalog/scope-sync-workers.d.ts +7 -0
- package/dist/catalog/scope-sync-workers.js +29 -0
- package/dist/catalog/scope-sync.d.ts +176 -0
- package/dist/catalog/scope-sync.js +576 -0
- package/dist/catalog/scope.d.ts +42 -0
- package/dist/catalog/scope.js +42 -0
- package/dist/catalog/unshare.d.ts +22 -0
- package/dist/catalog/unshare.js +119 -0
- package/dist/channels/actions.d.ts +6 -4
- package/dist/channels/actions.js +11 -4
- package/dist/channels/cards.d.ts +33 -11
- package/dist/channels/cards.js +96 -24
- package/dist/channels/channels.module.d.ts +40 -0
- package/dist/channels/channels.module.js +130 -0
- package/dist/channels/channels.schemas.d.ts +37 -0
- package/dist/channels/channels.schemas.js +38 -0
- package/dist/channels/connections.controller.d.ts +44 -37
- package/dist/channels/connections.controller.js +83 -38
- package/dist/channels/connections.service.d.ts +101 -30
- package/dist/channels/connections.service.js +380 -147
- package/dist/channels/inbound.d.ts +44 -38
- package/dist/channels/inbound.js +190 -44
- package/dist/channels/job-ids.d.ts +10 -0
- package/dist/channels/job-ids.js +10 -0
- package/dist/channels/jobs.d.ts +85 -0
- package/dist/channels/jobs.js +157 -0
- package/dist/channels/outbound.d.ts +71 -80
- package/dist/channels/outbound.js +219 -202
- package/dist/channels/phrases.d.ts +33 -2
- package/dist/channels/phrases.js +29 -1
- package/dist/channels/supervisor.d.ts +88 -46
- package/dist/channels/supervisor.js +230 -132
- package/dist/channels/threads.d.ts +34 -8
- package/dist/channels/threads.js +79 -13
- package/dist/channels/webhook.d.ts +20 -14
- package/dist/channels/webhook.js +51 -20
- package/dist/config/docs.js +5 -1
- package/dist/config/load.d.ts +3 -2
- package/dist/config/load.js +3 -2
- package/dist/config/nacos-source.js +11 -2
- package/dist/config/schema.d.ts +36 -2
- package/dist/config/schema.js +226 -25
- package/dist/conversations/access.d.ts +31 -0
- package/dist/conversations/access.js +110 -0
- package/dist/conversations/agent-tree.d.ts +46 -0
- package/dist/conversations/agent-tree.js +92 -0
- package/dist/conversations/artifacts.d.ts +11 -11
- package/dist/conversations/artifacts.js +36 -10
- package/dist/conversations/attachments.controller.d.ts +1 -1
- package/dist/conversations/attachments.controller.js +8 -6
- package/dist/conversations/attachments.module.d.ts +7 -0
- package/dist/conversations/attachments.module.js +25 -0
- package/dist/conversations/attachments.service.d.ts +60 -22
- package/dist/conversations/attachments.service.js +249 -51
- package/dist/conversations/conversations.controller.d.ts +86 -50
- package/dist/conversations/conversations.controller.js +184 -103
- package/dist/conversations/conversations.module.d.ts +8 -0
- package/dist/conversations/conversations.module.js +72 -0
- package/dist/conversations/conversations.schemas.d.ts +52 -0
- package/dist/conversations/conversations.schemas.js +79 -0
- package/dist/conversations/conversations.service.d.ts +166 -49
- package/dist/conversations/conversations.service.js +383 -179
- package/dist/conversations/environment-status.d.ts +24 -0
- package/dist/conversations/environment-status.js +71 -0
- package/dist/conversations/event-log.d.ts +64 -27
- package/dist/conversations/event-log.js +167 -31
- package/dist/conversations/events.d.ts +252 -9
- package/dist/conversations/events.js +243 -32
- package/dist/conversations/files.d.ts +10 -10
- package/dist/conversations/files.js +37 -11
- package/dist/conversations/idem-keys.d.ts +5 -0
- package/dist/conversations/idem-keys.js +5 -0
- package/dist/conversations/job-ids.d.ts +6 -0
- package/dist/conversations/job-ids.js +6 -0
- package/dist/conversations/message-context.d.ts +79 -0
- package/dist/conversations/message-context.js +145 -0
- package/dist/conversations/outputs-read.d.ts +11 -11
- package/dist/conversations/outputs-read.js +31 -7
- package/dist/conversations/queue.d.ts +53 -58
- package/dist/conversations/queue.js +37 -293
- package/dist/conversations/queue.service.d.ts +60 -0
- package/dist/conversations/queue.service.js +350 -0
- package/dist/conversations/titles.d.ts +83 -27
- package/dist/conversations/titles.js +195 -71
- package/dist/conversations/tree.d.ts +17 -0
- package/dist/conversations/tree.js +42 -0
- package/dist/ctx/bus.js +9 -3
- package/dist/ctx/create-ctx.d.ts +26 -1
- package/dist/ctx/create-ctx.js +45 -16
- package/dist/ctx/lock.d.ts +7 -3
- package/dist/ctx/lock.js +9 -20
- package/dist/ctx/secrets.d.ts +10 -2
- package/dist/ctx/secrets.js +7 -3
- package/dist/db/kernel-schema.d.ts +589 -27
- package/dist/db/pool.d.ts +10 -0
- package/dist/db/pool.js +4 -0
- package/dist/devices/device-auth.controller.d.ts +42 -0
- package/dist/devices/device-auth.controller.js +116 -0
- package/dist/devices/device-auth.d.ts +119 -0
- package/dist/devices/device-auth.js +403 -0
- package/dist/devices/device-auth.module.d.ts +7 -0
- package/dist/devices/device-auth.module.js +25 -0
- package/dist/devices/device-gateway.d.ts +128 -0
- package/dist/devices/device-gateway.js +530 -0
- package/dist/devices/device-provider.d.ts +89 -0
- package/dist/devices/device-provider.js +151 -0
- package/dist/devices/device-routes.d.ts +36 -0
- package/dist/devices/device-routes.js +90 -0
- package/dist/devices/devices.module.d.ts +16 -0
- package/dist/devices/devices.module.js +44 -0
- package/dist/devices/dto.d.ts +66 -0
- package/dist/devices/dto.js +44 -0
- package/dist/devices/keys.d.ts +25 -0
- package/dist/devices/keys.js +25 -0
- package/dist/devices/machines.d.ts +118 -0
- package/dist/devices/machines.js +366 -0
- package/dist/devices/relay.d.ts +100 -0
- package/dist/devices/relay.js +373 -0
- package/dist/devices/targets.d.ts +28 -0
- package/dist/devices/targets.js +73 -0
- package/dist/environments/access.d.ts +66 -0
- package/dist/environments/access.js +113 -0
- package/dist/environments/conversation-environments.d.ts +75 -0
- package/dist/environments/conversation-environments.js +231 -0
- package/dist/environments/dto.d.ts +25 -0
- package/dist/environments/dto.js +12 -0
- package/dist/environments/environments.controller.d.ts +36 -0
- package/dist/environments/environments.controller.js +124 -0
- package/dist/environments/environments.module.d.ts +8 -0
- package/dist/environments/environments.module.js +31 -0
- package/dist/environments/environments.schemas.d.ts +3 -0
- package/dist/environments/environments.schemas.js +14 -0
- package/dist/environments/environments.service.d.ts +251 -0
- package/dist/environments/environments.service.js +791 -0
- package/dist/environments/label.d.ts +11 -0
- package/dist/environments/label.js +25 -0
- package/dist/environments/legacy-cleanup.job.d.ts +34 -0
- package/dist/environments/legacy-cleanup.job.js +141 -0
- package/dist/errors.d.ts +160 -2
- package/dist/errors.js +160 -2
- package/dist/evals/budget.d.ts +42 -21
- package/dist/evals/budget.js +114 -62
- package/dist/evals/evals.module.d.ts +31 -0
- package/dist/evals/evals.module.js +114 -0
- package/dist/evals/evals.schemas.d.ts +110 -0
- package/dist/evals/evals.schemas.js +107 -0
- package/dist/evals/jobs.d.ts +20 -0
- package/dist/evals/jobs.js +45 -0
- package/dist/evals/reconstruct.d.ts +18 -9
- package/dist/evals/reconstruct.js +36 -10
- package/dist/evals/recorded-tools.d.ts +37 -1
- package/dist/evals/recorded-tools.js +120 -10
- package/dist/evals/run-replay.d.ts +75 -10
- package/dist/evals/run-replay.js +218 -94
- package/dist/evals/runs.controller.d.ts +3 -58
- package/dist/evals/runs.controller.js +18 -50
- package/dist/evals/runs.service.d.ts +31 -52
- package/dist/evals/runs.service.js +281 -255
- package/dist/evals/sets.controller.d.ts +3 -29
- package/dist/evals/sets.controller.js +18 -39
- package/dist/evals/sets.service.d.ts +29 -13
- package/dist/evals/sets.service.js +262 -202
- package/dist/evals/snapshot.d.ts +5 -4
- package/dist/evals/snapshot.js +17 -4
- package/dist/evals/step-replay.d.ts +6 -8
- package/dist/evals/step-replay.js +17 -10
- package/dist/evals/trajectory.controller.d.ts +1 -1
- package/dist/evals/trajectory.controller.js +11 -7
- package/dist/evals/trajectory.d.ts +2 -2
- package/dist/evals/trajectory.js +1 -1
- package/dist/evals/trajectory.service.d.ts +13 -7
- package/dist/evals/trajectory.service.js +56 -21
- package/dist/evals/worker.d.ts +48 -31
- package/dist/evals/worker.js +229 -124
- package/dist/extensions/admin-ops.d.ts +133 -41
- package/dist/extensions/admin-ops.js +378 -172
- package/dist/extensions/admin-view.d.ts +82 -32
- package/dist/extensions/admin-view.js +284 -71
- package/dist/extensions/approvals.d.ts +24 -10
- package/dist/extensions/approvals.js +73 -46
- package/dist/extensions/blobs.d.ts +27 -10
- package/dist/extensions/blobs.js +112 -45
- package/dist/extensions/bootstrap.d.ts +99 -36
- package/dist/extensions/bootstrap.js +290 -134
- package/dist/extensions/cli.d.ts +32 -10
- package/dist/extensions/cli.js +52 -98
- package/dist/extensions/config-hash.d.ts +10 -0
- package/dist/extensions/config-hash.js +38 -0
- package/dist/extensions/config-issues.d.ts +19 -0
- package/dist/extensions/config-issues.js +48 -0
- package/dist/extensions/config-json-schema.d.ts +43 -7
- package/dist/extensions/config-json-schema.js +124 -58
- package/dist/extensions/deployment-config-store.d.ts +55 -0
- package/dist/extensions/deployment-config-store.js +133 -0
- package/dist/extensions/deployment-config.d.ts +146 -70
- package/dist/extensions/deployment-config.js +439 -246
- package/dist/extensions/display-name.d.ts +22 -0
- package/dist/extensions/display-name.js +77 -0
- package/dist/extensions/effective-config.d.ts +127 -0
- package/dist/extensions/effective-config.js +368 -0
- package/dist/extensions/enabled.d.ts +5 -5
- package/dist/extensions/extensions.module.d.ts +8 -0
- package/dist/extensions/extensions.module.js +96 -0
- package/dist/extensions/hooks.d.ts +40 -6
- package/dist/extensions/hooks.js +83 -17
- package/dist/extensions/host.d.ts +161 -80
- package/dist/extensions/host.js +505 -213
- package/dist/extensions/installs.d.ts +73 -19
- package/dist/extensions/installs.js +174 -37
- package/dist/extensions/job-ids.d.ts +6 -0
- package/dist/extensions/job-ids.js +6 -0
- package/dist/extensions/lifecycle-topics.d.ts +18 -0
- package/dist/extensions/lifecycle-topics.js +18 -0
- package/dist/extensions/lifecycle.d.ts +35 -47
- package/dist/extensions/lifecycle.js +103 -39
- package/dist/extensions/locks.d.ts +45 -0
- package/dist/extensions/locks.js +112 -0
- package/dist/extensions/migrate-lock.d.ts +3 -4
- package/dist/extensions/org-config.d.ts +141 -49
- package/dist/extensions/org-config.js +471 -243
- package/dist/extensions/org-levels.d.ts +37 -0
- package/dist/extensions/org-levels.js +71 -0
- package/dist/extensions/org-overrides.d.ts +151 -0
- package/dist/extensions/org-overrides.js +524 -0
- package/dist/extensions/package.d.ts +14 -1
- package/dist/extensions/package.js +51 -2
- package/dist/extensions/permission-view.d.ts +59 -6
- package/dist/extensions/permission-view.js +7 -5
- package/dist/extensions/plugin-guides.d.ts +129 -0
- package/dist/extensions/plugin-guides.js +283 -0
- package/dist/extensions/plugin-icons.d.ts +54 -0
- package/dist/extensions/plugin-icons.js +125 -0
- package/dist/extensions/plugin-items.d.ts +21 -0
- package/dist/extensions/plugin-items.js +42 -0
- package/dist/extensions/point-defaults.controller.d.ts +28 -0
- package/dist/extensions/point-defaults.controller.js +69 -0
- package/dist/extensions/point-defaults.d.ts +73 -0
- package/dist/extensions/point-defaults.js +236 -0
- package/dist/extensions/point-defaults.schemas.d.ts +9 -0
- package/dist/extensions/point-defaults.schemas.js +14 -0
- package/dist/extensions/registry.d.ts +50 -2
- package/dist/extensions/registry.js +91 -4
- package/dist/extensions/resolve.d.ts +51 -1
- package/dist/extensions/resolve.js +85 -3
- package/dist/extensions/single-provider.d.ts +92 -0
- package/dist/extensions/single-provider.js +180 -0
- package/dist/extensions/sources.d.ts +19 -10
- package/dist/extensions/sources.js +34 -13
- package/dist/extensions/state.module.d.ts +9 -0
- package/dist/extensions/state.module.js +38 -0
- package/dist/extensions/unavailable.d.ts +50 -0
- package/dist/extensions/unavailable.js +115 -0
- package/dist/files/files.module.d.ts +3 -0
- package/dist/files/files.module.js +22 -0
- package/dist/files/previewers.controller.d.ts +7 -2
- package/dist/files/previewers.controller.js +19 -12
- package/dist/files/previewers.d.ts +21 -19
- package/dist/files/previewers.js +114 -38
- package/dist/files/previewers.schemas.d.ts +10 -0
- package/dist/files/previewers.schemas.js +9 -0
- package/dist/http/adapter.d.ts +3 -0
- package/dist/http/adapter.js +25 -0
- package/dist/http/api.module.d.ts +3 -110
- package/dist/http/api.module.js +93 -358
- package/dist/http/app.d.ts +22 -17
- package/dist/http/app.js +46 -65
- package/dist/http/error-filter.module.d.ts +5 -0
- package/dist/http/error-filter.module.js +18 -0
- package/dist/http/error.filter.js +2 -2
- package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +7 -3
- package/dist/http/gateway-routes.js +16 -0
- package/dist/http/nest-logger.d.ts +6 -5
- package/dist/http/nest-logger.js +24 -10
- package/dist/http/plugin-dispatch.d.ts +4 -1
- package/dist/http/plugin-dispatch.js +14 -2
- package/dist/identity/accounts.d.ts +137 -38
- package/dist/identity/accounts.js +386 -186
- package/dist/identity/api-tokens.d.ts +11 -7
- package/dist/identity/api-tokens.js +71 -44
- package/dist/identity/audit.d.ts +9 -5
- package/dist/identity/audit.js +5 -1
- package/dist/identity/auth.controller.d.ts +11 -10
- package/dist/identity/auth.controller.js +40 -30
- package/dist/identity/auth.guard.d.ts +16 -8
- package/dist/identity/auth.guard.js +41 -13
- package/dist/identity/binding.d.ts +9 -11
- package/dist/identity/binding.js +41 -13
- package/dist/identity/cookies.d.ts +26 -5
- package/dist/identity/cookies.js +58 -6
- package/dist/identity/external-identity-lock.d.ts +17 -0
- package/dist/identity/external-identity-lock.js +39 -0
- package/dist/identity/external.d.ts +19 -15
- package/dist/identity/external.js +163 -125
- package/dist/identity/identity.module.d.ts +6 -0
- package/dist/identity/identity.module.js +59 -0
- package/dist/identity/initial-passwords.controller.d.ts +22 -0
- package/dist/identity/initial-passwords.controller.js +49 -0
- package/dist/identity/initial-passwords.d.ts +61 -0
- package/dist/identity/initial-passwords.job.d.ts +16 -0
- package/dist/identity/initial-passwords.job.js +46 -0
- package/dist/identity/initial-passwords.js +159 -0
- package/dist/identity/me.controller.d.ts +32 -15
- package/dist/identity/me.controller.js +80 -33
- package/dist/identity/me.schemas.d.ts +24 -0
- package/dist/identity/me.schemas.js +25 -0
- package/dist/identity/principal.d.ts +11 -3
- package/dist/identity/principal.js +11 -3
- package/dist/identity/sessions.d.ts +24 -10
- package/dist/identity/sessions.js +119 -42
- package/dist/identity/settings.d.ts +69 -23
- package/dist/identity/settings.js +201 -72
- package/dist/identity/sso.controller.d.ts +7 -7
- package/dist/identity/sso.controller.js +13 -9
- package/dist/identity/sso.d.ts +9 -12
- package/dist/identity/sso.js +54 -24
- package/dist/identity/super-admin.d.ts +20 -0
- package/dist/identity/super-admin.js +81 -0
- package/dist/inbox/inbox.module.d.ts +6 -0
- package/dist/inbox/inbox.module.js +26 -0
- package/dist/inbox/inbox.schemas.d.ts +8 -0
- package/dist/inbox/inbox.schemas.js +11 -0
- package/dist/inbox/inbox.service.d.ts +68 -11
- package/dist/inbox/inbox.service.js +104 -13
- package/dist/inbox/org-notices.d.ts +63 -0
- package/dist/inbox/org-notices.js +91 -0
- package/dist/inbox/platform-inbox.controller.d.ts +23 -0
- package/dist/inbox/platform-inbox.controller.js +58 -0
- package/dist/inbox/platform-inbox.service.d.ts +151 -0
- package/dist/inbox/platform-inbox.service.js +263 -0
- package/dist/inbox/platform-notices.d.ts +19 -0
- package/dist/inbox/platform-notices.js +9 -0
- package/dist/index.d.ts +22 -13
- package/dist/index.js +16 -7
- package/dist/infra/cache/cache.module.d.ts +3 -0
- package/dist/infra/cache/cache.module.js +16 -0
- package/dist/infra/cache/cache.service.d.ts +21 -0
- package/dist/infra/cache/cache.service.js +80 -0
- package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
- package/dist/infra/cache/cacheable.decorator.js +83 -0
- package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
- package/dist/infra/cli/kernel-cli.module.js +173 -0
- package/dist/infra/close-within.d.ts +15 -0
- package/dist/infra/close-within.js +36 -0
- package/dist/infra/config/config.module.d.ts +13 -0
- package/dist/infra/config/config.module.js +39 -0
- package/dist/infra/config/kernel-config.service.d.ts +25 -0
- package/dist/infra/config/kernel-config.service.js +157 -0
- package/dist/infra/database/after-commit.d.ts +6 -0
- package/dist/infra/database/after-commit.js +9 -0
- package/dist/infra/database/database.module.d.ts +25 -0
- package/dist/infra/database/database.module.js +91 -0
- package/dist/infra/database/kernel-db.d.ts +22 -0
- package/dist/infra/database/kernel-db.js +65 -0
- package/dist/infra/database/transaction-host.d.ts +50 -0
- package/dist/infra/database/transaction-host.js +125 -0
- package/dist/infra/database/transactional.decorator.d.ts +15 -0
- package/dist/infra/database/transactional.decorator.js +27 -0
- package/dist/infra/database/xact-lock.d.ts +17 -0
- package/dist/infra/database/xact-lock.js +43 -0
- package/dist/infra/events/kernel-events.d.ts +121 -0
- package/dist/infra/events/kernel-events.js +65 -0
- package/dist/infra/health/health.controller.d.ts +26 -0
- package/dist/infra/health/health.controller.js +104 -0
- package/dist/infra/health/health.module.d.ts +9 -0
- package/dist/infra/health/health.module.js +24 -0
- package/dist/infra/health/health.options.d.ts +10 -0
- package/dist/infra/health/health.options.js +15 -0
- package/dist/infra/health/shutdown-state.d.ts +6 -0
- package/dist/infra/health/shutdown-state.js +2 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
- package/dist/infra/lifecycle/process-guards.d.ts +52 -0
- package/dist/infra/lifecycle/process-guards.js +90 -0
- package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
- package/dist/infra/lifecycle/shutdown-signals.js +48 -0
- package/dist/infra/lock/key-template.d.ts +13 -0
- package/dist/infra/lock/key-template.js +46 -0
- package/dist/infra/lock/lock.module.d.ts +3 -0
- package/dist/infra/lock/lock.module.js +16 -0
- package/dist/infra/lock/lock.service.d.ts +120 -0
- package/dist/infra/lock/lock.service.js +343 -0
- package/dist/infra/lock/shared-lease.d.ts +44 -0
- package/dist/infra/lock/shared-lease.js +121 -0
- package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
- package/dist/infra/lock/with-lock.decorator.js +49 -0
- package/dist/infra/logging/logging.module.d.ts +18 -0
- package/dist/infra/logging/logging.module.js +52 -0
- package/dist/infra/queue/add-job-once.d.ts +14 -0
- package/dist/infra/queue/add-job-once.js +16 -0
- package/dist/infra/queue/configured-processor.d.ts +18 -0
- package/dist/infra/queue/configured-processor.js +23 -0
- package/dist/infra/queue/job-failure.d.ts +18 -0
- package/dist/infra/queue/job-failure.js +26 -0
- package/dist/infra/queue/queue-shutdown.d.ts +27 -0
- package/dist/infra/queue/queue-shutdown.js +81 -0
- package/dist/infra/queue/queue.module.d.ts +16 -0
- package/dist/infra/queue/queue.module.js +61 -0
- package/dist/infra/queue/redis-connection.d.ts +13 -0
- package/dist/infra/queue/redis-connection.js +25 -0
- package/dist/infra/queue/retired-schedulers.d.ts +7 -0
- package/dist/infra/queue/retired-schedulers.js +9 -0
- package/dist/infra/queue/run-job.d.ts +16 -0
- package/dist/infra/queue/run-job.js +19 -0
- package/dist/infra/redis/redis.module.d.ts +24 -0
- package/dist/infra/redis/redis.module.js +91 -0
- package/dist/infra/schedule/cron-tick.d.ts +12 -0
- package/dist/infra/schedule/cron-tick.js +25 -0
- package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
- package/dist/infra/schedule/locked-cron.decorator.js +53 -0
- package/dist/infra/schedule/locked-interval.d.ts +69 -0
- package/dist/infra/schedule/locked-interval.js +190 -0
- package/dist/infra/schedule/locked-tick.d.ts +90 -0
- package/dist/infra/schedule/locked-tick.js +137 -0
- package/dist/infra/schedule/schedule.module.d.ts +8 -0
- package/dist/infra/schedule/schedule.module.js +27 -0
- package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
- package/dist/infra/schedule/scheduled-runs.js +163 -0
- package/dist/infra/swagger/swagger.d.ts +16 -0
- package/dist/infra/swagger/swagger.js +31 -0
- package/dist/infra/throttler/credential-throttler.d.ts +35 -0
- package/dist/infra/throttler/credential-throttler.js +77 -0
- package/dist/infra/throttler/named-throttlers.d.ts +36 -0
- package/dist/infra/throttler/named-throttlers.js +157 -0
- package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
- package/dist/infra/throttler/redis-throttler-storage.js +130 -0
- package/dist/infra/throttler/throttler.guard.d.ts +23 -0
- package/dist/infra/throttler/throttler.guard.js +68 -0
- package/dist/infra/throttler/throttler.module.d.ts +15 -0
- package/dist/infra/throttler/throttler.module.js +53 -0
- package/dist/infra/tokens.d.ts +20 -0
- package/dist/infra/tokens.js +20 -0
- package/dist/infra/validation/create-zod-dto.d.ts +23 -0
- package/dist/infra/validation/create-zod-dto.js +35 -0
- package/dist/infra/validation/parse-with-zod.d.ts +7 -0
- package/dist/infra/validation/parse-with-zod.js +12 -0
- package/dist/infra/validation/validation.module.d.ts +3 -0
- package/dist/infra/validation/validation.module.js +16 -0
- package/dist/infra/validation/zod-params.d.ts +7 -0
- package/dist/infra/validation/zod-params.js +42 -0
- package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
- package/dist/infra/validation/zod-validation.pipe.js +31 -0
- package/dist/kernel.d.ts +9 -244
- package/dist/kernel.js +8 -1305
- package/dist/kernel.module.d.ts +17 -0
- package/dist/kernel.module.js +145 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
- package/dist/lifecycle/kernel-lifecycle.js +465 -0
- package/dist/lifecycle/tokens.d.ts +3 -0
- package/dist/lifecycle/tokens.js +3 -0
- package/dist/log-context.d.ts +2 -0
- package/dist/log-context.js +4 -0
- package/dist/log.d.ts +13 -1
- package/dist/log.js +93 -17
- package/dist/models/embeddings.d.ts +82 -0
- package/dist/models/embeddings.js +326 -0
- package/dist/models/enablement.controller.d.ts +40 -0
- package/dist/models/enablement.controller.js +74 -0
- package/dist/models/enablement.d.ts +101 -0
- package/dist/models/enablement.js +264 -0
- package/dist/models/models.module.d.ts +7 -0
- package/dist/models/models.module.js +36 -0
- package/dist/models/org-models.schemas.d.ts +8 -0
- package/dist/models/org-models.schemas.js +22 -0
- package/dist/models/prices.d.ts +13 -5
- package/dist/models/prices.js +69 -39
- package/dist/models/purposes.controller.d.ts +6 -4
- package/dist/models/purposes.controller.js +16 -11
- package/dist/models/purposes.d.ts +103 -23
- package/dist/models/purposes.js +208 -77
- package/dist/orgs/directory-sync.controller.d.ts +1 -1
- package/dist/orgs/directory-sync.controller.js +2 -2
- package/dist/orgs/directory-sync.d.ts +74 -35
- package/dist/orgs/directory-sync.js +243 -132
- package/dist/orgs/invitations.controller.d.ts +8 -8
- package/dist/orgs/invitations.controller.js +27 -26
- package/dist/orgs/invitations.service.d.ts +12 -9
- package/dist/orgs/invitations.service.js +130 -92
- package/dist/orgs/job-ids.d.ts +8 -0
- package/dist/orgs/job-ids.js +8 -0
- package/dist/orgs/members.service.d.ts +19 -12
- package/dist/orgs/members.service.js +161 -117
- package/dist/orgs/offboarding.d.ts +61 -60
- package/dist/orgs/offboarding.js +206 -95
- package/dist/orgs/org-lock.d.ts +33 -19
- package/dist/orgs/org-lock.js +94 -35
- package/dist/orgs/org.guard.d.ts +11 -1
- package/dist/orgs/org.guard.js +45 -34
- package/dist/orgs/orgs.controller.d.ts +13 -16
- package/dist/orgs/orgs.controller.js +29 -20
- package/dist/orgs/orgs.module.d.ts +6 -0
- package/dist/orgs/orgs.module.js +71 -0
- package/dist/orgs/orgs.schemas.d.ts +8 -0
- package/dist/orgs/orgs.schemas.js +16 -0
- package/dist/orgs/orgs.service.d.ts +47 -21
- package/dist/orgs/orgs.service.js +166 -91
- package/dist/orgs/roles.d.ts +1 -1
- package/dist/orgs/roles.js +5 -1
- package/dist/orgs/settings.controller.d.ts +2 -2
- package/dist/orgs/settings.controller.js +8 -6
- package/dist/orgs/settings.service.d.ts +76 -14
- package/dist/orgs/settings.service.js +140 -51
- package/dist/overrides.d.ts +63 -0
- package/dist/overrides.js +34 -0
- package/dist/platform/actor.d.ts +48 -0
- package/dist/platform/actor.js +100 -0
- package/dist/platform/agent-docs.d.ts +18 -0
- package/dist/platform/agent-docs.js +59 -0
- package/dist/platform/availability.d.ts +14 -0
- package/dist/platform/availability.js +43 -0
- package/dist/platform/errors.d.ts +28 -0
- package/dist/platform/errors.js +65 -0
- package/dist/platform/exclusions.d.ts +11 -0
- package/dist/platform/exclusions.js +683 -0
- package/dist/platform/method.d.ts +6 -0
- package/dist/platform/method.js +15 -0
- package/dist/platform/operation.d.ts +169 -0
- package/dist/platform/operation.js +94 -0
- package/dist/platform/ops/accounts.ops.d.ts +32 -0
- package/dist/platform/ops/accounts.ops.js +291 -0
- package/dist/platform/ops/admin.ops.d.ts +38 -0
- package/dist/platform/ops/admin.ops.js +407 -0
- package/dist/platform/ops/agent-skills.ops.d.ts +24 -0
- package/dist/platform/ops/agent-skills.ops.js +226 -0
- package/dist/platform/ops/agent-templates.ops.d.ts +17 -0
- package/dist/platform/ops/agent-templates.ops.js +272 -0
- package/dist/platform/ops/agents.ops.d.ts +37 -0
- package/dist/platform/ops/agents.ops.js +717 -0
- package/dist/platform/ops/approvals.ops.d.ts +30 -0
- package/dist/platform/ops/approvals.ops.js +116 -0
- package/dist/platform/ops/background.ops.d.ts +14 -0
- package/dist/platform/ops/background.ops.js +134 -0
- package/dist/platform/ops/catalog-admin.ops.d.ts +74 -0
- package/dist/platform/ops/catalog-admin.ops.js +599 -0
- package/dist/platform/ops/channels.ops.d.ts +16 -0
- package/dist/platform/ops/channels.ops.js +195 -0
- package/dist/platform/ops/components.ops.d.ts +46 -0
- package/dist/platform/ops/components.ops.js +854 -0
- package/dist/platform/ops/connectors.ops.d.ts +17 -0
- package/dist/platform/ops/connectors.ops.js +188 -0
- package/dist/platform/ops/conversations.ops.d.ts +30 -0
- package/dist/platform/ops/conversations.ops.js +470 -0
- package/dist/platform/ops/environments.ops.d.ts +26 -0
- package/dist/platform/ops/environments.ops.js +311 -0
- package/dist/platform/ops/errors.d.ts +16 -0
- package/dist/platform/ops/errors.js +30 -0
- package/dist/platform/ops/evals.ops.d.ts +28 -0
- package/dist/platform/ops/evals.ops.js +783 -0
- package/dist/platform/ops/extensions-admin.ops.d.ts +25 -0
- package/dist/platform/ops/extensions-admin.ops.js +372 -0
- package/dist/platform/ops/extensions.ops.d.ts +25 -0
- package/dist/platform/ops/extensions.ops.js +347 -0
- package/dist/platform/ops/inbox.ops.d.ts +25 -0
- package/dist/platform/ops/inbox.ops.js +378 -0
- package/dist/platform/ops/marketplaces.ops.d.ts +22 -0
- package/dist/platform/ops/marketplaces.ops.js +466 -0
- package/dist/platform/ops/models.ops.d.ts +25 -0
- package/dist/platform/ops/models.ops.js +232 -0
- package/dist/platform/ops/org-plugins.ops.d.ts +29 -0
- package/dist/platform/ops/org-plugins.ops.js +329 -0
- package/dist/platform/ops/org-settings.ops.d.ts +18 -0
- package/dist/platform/ops/org-settings.ops.js +127 -0
- package/dist/platform/ops/orgs.ops.d.ts +28 -0
- package/dist/platform/ops/orgs.ops.js +296 -0
- package/dist/platform/ops/other-orgs.d.ts +20 -0
- package/dist/platform/ops/other-orgs.js +72 -0
- package/dist/platform/ops/paging.d.ts +14 -0
- package/dist/platform/ops/paging.js +20 -0
- package/dist/platform/ops/platform.ops.d.ts +30 -0
- package/dist/platform/ops/platform.ops.js +231 -0
- package/dist/platform/ops/plugins.ops.d.ts +35 -0
- package/dist/platform/ops/plugins.ops.js +476 -0
- package/dist/platform/ops/previewers.ops.d.ts +14 -0
- package/dist/platform/ops/previewers.ops.js +109 -0
- package/dist/platform/ops/requests.ops.d.ts +14 -0
- package/dist/platform/ops/requests.ops.js +191 -0
- package/dist/platform/ops/role.d.ts +4 -0
- package/dist/platform/ops/role.js +10 -0
- package/dist/platform/ops/skills.ops.d.ts +17 -0
- package/dist/platform/ops/skills.ops.js +216 -0
- package/dist/platform/ops/summary.d.ts +10 -0
- package/dist/platform/ops/summary.js +18 -0
- package/dist/platform/ops/themes.ops.d.ts +14 -0
- package/dist/platform/ops/themes.ops.js +47 -0
- package/dist/platform/ops/unavailable.d.ts +23 -0
- package/dist/platform/ops/unavailable.js +118 -0
- package/dist/platform/parity.d.ts +33 -0
- package/dist/platform/parity.js +272 -0
- package/dist/platform/platform-ops.module.d.ts +40 -0
- package/dist/platform/platform-ops.module.js +127 -0
- package/dist/platform/platform.module.d.ts +8 -0
- package/dist/platform/platform.module.js +25 -0
- package/dist/platform/registry.d.ts +30 -0
- package/dist/platform/registry.js +111 -0
- package/dist/platform/route-schemas.d.ts +18 -0
- package/dist/platform/route-schemas.js +66 -0
- package/dist/roles/gateway-role.d.ts +54 -0
- package/dist/roles/gateway-role.js +118 -0
- package/dist/roles/gateway.module.d.ts +9 -0
- package/dist/roles/gateway.module.js +31 -0
- package/dist/roles/worker-role.d.ts +65 -0
- package/dist/roles/worker-role.js +151 -0
- package/dist/roles/worker.module.d.ts +14 -0
- package/dist/roles/worker.module.js +106 -0
- package/dist/runtime/abort.js +19 -2
- package/dist/runtime/checkpointer.d.ts +8 -3
- package/dist/runtime/checkpointer.js +87 -55
- package/dist/runtime/context/build.d.ts +21 -13
- package/dist/runtime/context/build.js +106 -29
- package/dist/runtime/context/claude-tools.d.ts +4 -1
- package/dist/runtime/context/claude-tools.js +13 -12
- package/dist/runtime/context/compaction.js +24 -1
- package/dist/runtime/context/environment-paths.d.ts +40 -0
- package/dist/runtime/context/environment-paths.js +48 -0
- package/dist/runtime/context/legacy-text.d.ts +22 -0
- package/dist/runtime/context/legacy-text.js +37 -0
- package/dist/runtime/context/reminders.d.ts +2 -0
- package/dist/runtime/context/reminders.js +2 -0
- package/dist/runtime/context/run-context.d.ts +65 -0
- package/dist/runtime/context/run-context.js +215 -0
- package/dist/runtime/context/skills.d.ts +29 -11
- package/dist/runtime/context/skills.js +46 -32
- package/dist/runtime/context/tool-changes.d.ts +27 -0
- package/dist/runtime/context/tool-changes.js +60 -0
- package/dist/runtime/conversation-lock.d.ts +20 -11
- package/dist/runtime/conversation-lock.js +62 -72
- package/dist/runtime/hook-calls.d.ts +11 -4
- package/dist/runtime/hook-calls.js +41 -13
- package/dist/runtime/job-ids.d.ts +10 -0
- package/dist/runtime/job-ids.js +10 -0
- package/dist/runtime/langgraph-loop.d.ts +3 -1
- package/dist/runtime/langgraph-loop.js +37 -18
- package/dist/runtime/loop.d.ts +42 -6
- package/dist/runtime/loop.js +14 -0
- package/dist/runtime/maintenance-queue.d.ts +10 -0
- package/dist/runtime/maintenance-queue.js +10 -0
- package/dist/runtime/maintenance.d.ts +50 -74
- package/dist/runtime/maintenance.js +166 -137
- package/dist/runtime/model-call.d.ts +61 -15
- package/dist/runtime/model-call.js +128 -84
- package/dist/runtime/providers.d.ts +158 -27
- package/dist/runtime/providers.js +373 -63
- package/dist/runtime/quota.d.ts +17 -3
- package/dist/runtime/quota.js +27 -2
- package/dist/runtime/retired-schedulers.d.ts +7 -0
- package/dist/runtime/retired-schedulers.js +31 -0
- package/dist/runtime/run-context.service.d.ts +65 -0
- package/dist/runtime/run-context.service.js +236 -0
- package/dist/runtime/run-control.d.ts +43 -0
- package/dist/runtime/run-control.js +89 -0
- package/dist/runtime/run-drafts.d.ts +85 -0
- package/dist/runtime/run-drafts.js +230 -0
- package/dist/runtime/run-finish.d.ts +27 -18
- package/dist/runtime/run-finish.js +98 -51
- package/dist/runtime/run-jobs.d.ts +46 -0
- package/dist/runtime/run-jobs.js +91 -0
- package/dist/runtime/run-processors.d.ts +60 -0
- package/dist/runtime/run-processors.js +185 -0
- package/dist/runtime/run-queue.d.ts +90 -58
- package/dist/runtime/run-queue.js +566 -297
- package/dist/runtime/run-steps.d.ts +39 -0
- package/dist/runtime/run-steps.js +96 -0
- package/dist/runtime/run-worker.d.ts +134 -77
- package/dist/runtime/run-worker.js +412 -237
- package/dist/runtime/runtime.module.d.ts +10 -0
- package/dist/runtime/runtime.module.js +122 -0
- package/dist/runtime/step-log.d.ts +51 -0
- package/dist/runtime/step-log.js +111 -0
- package/dist/runtime/stream.controller.d.ts +28 -9
- package/dist/runtime/stream.controller.js +72 -13
- package/dist/runtime/stream.d.ts +27 -6
- package/dist/runtime/stream.js +102 -7
- package/dist/runtime/subagents/child.d.ts +58 -51
- package/dist/runtime/subagents/child.js +105 -86
- package/dist/runtime/subagents/definition.d.ts +32 -28
- package/dist/runtime/subagents/definition.js +89 -143
- package/dist/runtime/subagents/deliveries.d.ts +71 -0
- package/dist/runtime/subagents/deliveries.js +228 -0
- package/dist/runtime/subagents/dispatch.d.ts +197 -27
- package/dist/runtime/subagents/dispatch.js +336 -270
- package/dist/runtime/subagents/limits.d.ts +32 -8
- package/dist/runtime/subagents/limits.js +44 -8
- package/dist/runtime/subagents/messages.d.ts +95 -0
- package/dist/runtime/subagents/messages.js +328 -0
- package/dist/runtime/subagents/org-agents.d.ts +4 -4
- package/dist/runtime/subagents/org-agents.js +3 -2
- package/dist/runtime/subagents/preamble.d.ts +4 -4
- package/dist/runtime/subagents/preamble.js +9 -7
- package/dist/runtime/subagents/progress.d.ts +10 -8
- package/dist/runtime/subagents/progress.js +11 -6
- package/dist/runtime/subagents/render.d.ts +30 -0
- package/dist/runtime/subagents/render.js +53 -0
- package/dist/runtime/subagents/roster.d.ts +27 -10
- package/dist/runtime/subagents/roster.js +49 -13
- package/dist/runtime/subagents/skill-fork.d.ts +10 -10
- package/dist/runtime/subagents/skill-fork.js +23 -8
- package/dist/runtime/subagents/status.d.ts +14 -0
- package/dist/runtime/subagents/status.js +23 -0
- package/dist/runtime/subagents/subagents.service.d.ts +43 -0
- package/dist/runtime/subagents/subagents.service.js +106 -0
- package/dist/runtime/usage-report-jobs.d.ts +88 -0
- package/dist/runtime/usage-report-jobs.js +158 -0
- package/dist/runtime/usage-report.d.ts +121 -83
- package/dist/runtime/usage-report.js +355 -181
- package/dist/runtime/waits.d.ts +258 -81
- package/dist/runtime/waits.js +800 -263
- package/dist/sandbox/job-ids.d.ts +10 -0
- package/dist/sandbox/job-ids.js +10 -0
- package/dist/sandbox/jobs.d.ts +68 -0
- package/dist/sandbox/jobs.js +150 -0
- package/dist/sandbox/leases.d.ts +73 -82
- package/dist/sandbox/leases.js +162 -346
- package/dist/sandbox/providers.d.ts +46 -0
- package/dist/sandbox/providers.js +83 -0
- package/dist/sandbox/sandbox.module.d.ts +9 -0
- package/dist/sandbox/sandbox.module.js +36 -0
- package/dist/sandbox/sandbox.service.d.ts +359 -151
- package/dist/sandbox/sandbox.service.js +950 -435
- package/dist/sandbox/unreachable.d.ts +30 -0
- package/dist/sandbox/unreachable.js +108 -0
- package/dist/skills/catalog.d.ts +40 -26
- package/dist/skills/catalog.js +120 -99
- package/dist/skills/changes.controller.d.ts +11 -4
- package/dist/skills/changes.controller.js +34 -9
- package/dist/skills/changes.service.d.ts +31 -21
- package/dist/skills/changes.service.js +426 -368
- package/dist/skills/invocable.controller.d.ts +2 -2
- package/dist/skills/invocable.controller.js +10 -7
- package/dist/skills/invocation-keys.d.ts +1 -1
- package/dist/skills/invocation-keys.js +1 -1
- package/dist/skills/invoke.d.ts +19 -18
- package/dist/skills/invoke.js +68 -24
- package/dist/skills/package.d.ts +20 -1
- package/dist/skills/package.js +28 -1
- package/dist/skills/skills.controller.d.ts +33 -7
- package/dist/skills/skills.controller.js +79 -12
- package/dist/skills/skills.module.d.ts +6 -0
- package/dist/skills/skills.module.js +39 -0
- package/dist/skills/skills.schemas.d.ts +48 -0
- package/dist/skills/skills.schemas.js +61 -0
- package/dist/skills/skills.service.d.ts +151 -44
- package/dist/skills/skills.service.js +636 -204
- package/dist/skills/usable.d.ts +81 -0
- package/dist/skills/usable.js +379 -0
- package/dist/storage/job-ids.d.ts +6 -0
- package/dist/storage/job-ids.js +6 -0
- package/dist/storage/purge.d.ts +22 -7
- package/dist/storage/purge.js +55 -3
- package/dist/storage/storage.module.d.ts +6 -0
- package/dist/storage/storage.module.js +23 -0
- package/dist/storage/storage.service.d.ts +18 -4
- package/dist/storage/storage.service.js +44 -3
- package/dist/themes/render-css.d.ts +12 -0
- package/dist/themes/render-css.js +132 -0
- package/dist/themes/theme-delivery.service.d.ts +34 -0
- package/dist/themes/theme-delivery.service.js +111 -0
- package/dist/themes/theme-state.d.ts +95 -0
- package/dist/themes/theme-state.js +203 -0
- package/dist/themes/theme-usage.d.ts +61 -0
- package/dist/themes/theme-usage.js +98 -0
- package/dist/themes/themes-public.controller.d.ts +28 -0
- package/dist/themes/themes-public.controller.js +92 -0
- package/dist/themes/themes.controller.d.ts +13 -0
- package/dist/themes/themes.controller.js +38 -0
- package/dist/themes/themes.module.d.ts +3 -0
- package/dist/themes/themes.module.js +21 -0
- package/dist/themes/themes.schemas.d.ts +3 -0
- package/dist/themes/themes.schemas.js +2 -0
- package/dist/themes/themes.service.d.ts +50 -0
- package/dist/themes/themes.service.js +99 -0
- package/dist/time-zone.d.ts +5 -0
- package/dist/time-zone.js +19 -0
- package/dist/tools/approvals.controller.d.ts +1 -1
- package/dist/tools/approvals.controller.js +14 -11
- package/dist/tools/approvals.schemas.d.ts +21 -0
- package/dist/tools/approvals.schemas.js +15 -0
- package/dist/tools/approvals.service.d.ts +53 -27
- package/dist/tools/approvals.service.js +365 -260
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtin-names.d.ts +109 -0
- package/dist/tools/builtin-names.js +173 -0
- package/dist/tools/builtins/agent.d.ts +27 -25
- package/dist/tools/builtins/agent.js +66 -63
- package/dist/tools/builtins/ask-user.d.ts +3 -3
- package/dist/tools/builtins/ask-user.js +3 -3
- package/dist/tools/builtins/builtin-tools.d.ts +41 -0
- package/dist/tools/builtins/builtin-tools.js +151 -0
- package/dist/tools/builtins/current-time.d.ts +26 -0
- package/dist/tools/builtins/current-time.js +99 -0
- package/dist/tools/builtins/handback.d.ts +28 -0
- package/dist/tools/builtins/handback.js +53 -0
- package/dist/tools/builtins/platform.d.ts +51 -0
- package/dist/tools/builtins/platform.js +451 -0
- package/dist/tools/builtins/read-tool-output.d.ts +3 -3
- package/dist/tools/builtins/read-tool-output.js +3 -3
- package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
- package/dist/tools/builtins/sandbox/bash.js +293 -41
- package/dist/tools/builtins/sandbox/common.d.ts +137 -37
- package/dist/tools/builtins/sandbox/common.js +222 -62
- package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
- package/dist/tools/builtins/sandbox/deliver.js +21 -18
- package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
- package/dist/tools/builtins/sandbox/edit.js +65 -51
- package/dist/tools/builtins/sandbox/file-state.d.ts +34 -0
- package/dist/tools/builtins/sandbox/file-state.js +34 -0
- package/dist/tools/builtins/sandbox/glob-match.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob-match.js +1 -1
- package/dist/tools/builtins/sandbox/glob.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob.js +19 -14
- package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
- package/dist/tools/builtins/sandbox/grep.js +155 -36
- package/dist/tools/builtins/sandbox/index.d.ts +9 -5
- package/dist/tools/builtins/sandbox/index.js +13 -5
- package/dist/tools/builtins/sandbox/read.d.ts +2 -2
- package/dist/tools/builtins/sandbox/read.js +30 -20
- package/dist/tools/builtins/sandbox/task-output.d.ts +79 -0
- package/dist/tools/builtins/sandbox/task-output.js +334 -0
- package/dist/tools/builtins/sandbox/task-stop.d.ts +10 -0
- package/dist/tools/builtins/sandbox/task-stop.js +113 -0
- package/dist/tools/builtins/sandbox/write.d.ts +1 -1
- package/dist/tools/builtins/sandbox/write.js +52 -45
- package/dist/tools/builtins/send-message.d.ts +56 -0
- package/dist/tools/builtins/send-message.js +100 -0
- package/dist/tools/builtins/skill-load.d.ts +32 -21
- package/dist/tools/builtins/skill-load.js +125 -74
- package/dist/tools/builtins/skill-write.d.ts +4 -4
- package/dist/tools/builtins/skill-write.js +12 -12
- package/dist/tools/builtins/tool-search.d.ts +13 -9
- package/dist/tools/builtins/tool-search.js +25 -14
- package/dist/tools/builtins/web/errors.d.ts +8 -0
- package/dist/tools/builtins/web/errors.js +53 -0
- package/dist/tools/builtins/web/extract.d.ts +62 -0
- package/dist/tools/builtins/web/extract.js +271 -0
- package/dist/tools/builtins/web/fetch.d.ts +55 -0
- package/dist/tools/builtins/web/fetch.js +175 -0
- package/dist/tools/builtins/web/index.d.ts +13 -0
- package/dist/tools/builtins/web/index.js +12 -0
- package/dist/tools/builtins/web/page-cache.d.ts +25 -0
- package/dist/tools/builtins/web/page-cache.js +77 -0
- package/dist/tools/builtins/web/search.d.ts +25 -0
- package/dist/tools/builtins/web/search.js +210 -0
- package/dist/tools/builtins/web/url.d.ts +17 -0
- package/dist/tools/builtins/web/url.js +43 -0
- package/dist/tools/canonical-json.d.ts +6 -0
- package/dist/tools/canonical-json.js +16 -0
- package/dist/tools/connector-content.controller.d.ts +1 -1
- package/dist/tools/connector-content.controller.js +11 -6
- package/dist/tools/connector-content.d.ts +12 -15
- package/dist/tools/connector-content.js +53 -18
- package/dist/tools/connectors.controller.d.ts +16 -3
- package/dist/tools/connectors.controller.js +34 -14
- package/dist/tools/connectors.schemas.d.ts +12 -0
- package/dist/tools/connectors.schemas.js +19 -0
- package/dist/tools/connectors.service.d.ts +80 -18
- package/dist/tools/connectors.service.js +529 -358
- package/dist/tools/credentials.d.ts +20 -20
- package/dist/tools/credentials.js +55 -34
- package/dist/tools/display-names.d.ts +9 -0
- package/dist/tools/display-names.js +24 -0
- package/dist/tools/drift.d.ts +29 -41
- package/dist/tools/drift.js +116 -84
- package/dist/tools/elicitation.js +1 -1
- package/dist/tools/extension-tools.controller.d.ts +14 -0
- package/dist/tools/extension-tools.controller.js +37 -0
- package/dist/tools/info.d.ts +73 -13
- package/dist/tools/info.js +151 -39
- package/dist/tools/job-ids.d.ts +13 -0
- package/dist/tools/job-ids.js +15 -0
- package/dist/tools/jobs.d.ts +24 -0
- package/dist/tools/jobs.js +69 -0
- package/dist/tools/legacy-data.d.ts +34 -0
- package/dist/tools/legacy-data.js +76 -0
- package/dist/tools/legacy-keys.d.ts +51 -0
- package/dist/tools/legacy-keys.js +115 -0
- package/dist/tools/naming.d.ts +1 -5
- package/dist/tools/naming.js +1 -7
- package/dist/tools/oauth/flow-paths.d.ts +16 -0
- package/dist/tools/oauth/flow-paths.js +38 -0
- package/dist/tools/oauth/flow.d.ts +30 -30
- package/dist/tools/oauth/flow.js +109 -81
- package/dist/tools/oauth/oauth.controller.d.ts +3 -3
- package/dist/tools/oauth/oauth.controller.js +12 -9
- package/dist/tools/oauth/tokens.d.ts +45 -10
- package/dist/tools/oauth/tokens.js +70 -24
- package/dist/tools/org-tool-switches.d.ts +88 -0
- package/dist/tools/org-tool-switches.js +201 -0
- package/dist/tools/outputs.d.ts +13 -4
- package/dist/tools/outputs.js +48 -4
- package/dist/tools/pipeline.d.ts +108 -80
- package/dist/tools/pipeline.js +396 -409
- package/dist/tools/policy.d.ts +4 -17
- package/dist/tools/policy.js +49 -35
- package/dist/tools/questions.controller.d.ts +2 -2
- package/dist/tools/questions.controller.js +9 -6
- package/dist/tools/questions.service.d.ts +26 -25
- package/dist/tools/questions.service.js +201 -142
- package/dist/tools/registry.d.ts +215 -84
- package/dist/tools/registry.js +382 -264
- package/dist/tools/resources.d.ts +1 -1
- package/dist/tools/resources.js +1 -1
- package/dist/tools/specs.d.ts +5 -4
- package/dist/tools/specs.js +3 -1
- package/dist/tools/tools.module.d.ts +10 -0
- package/dist/tools/tools.module.js +113 -0
- package/dist/tools/validate.js +1 -1
- package/dist/ui/call-extension.d.ts +16 -0
- package/dist/ui/call-extension.js +38 -0
- package/dist/ui/embed-token.d.ts +9 -5
- package/dist/ui/embed-token.js +34 -6
- package/dist/ui/ui-stream.d.ts +22 -17
- package/dist/ui/ui-stream.js +72 -12
- package/dist/ui/ui.module.d.ts +7 -0
- package/dist/ui/ui.module.js +28 -0
- package/dist/ui/views.controller.d.ts +14 -12
- package/dist/ui/views.controller.js +32 -25
- package/dist/ui/views.d.ts +10 -57
- package/dist/ui/views.js +58 -46
- package/package.json +13 -3
- package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
- package/src/migrations/0064_account_last_org.sql +7 -0
- package/src/migrations/0065_conversation_archive.sql +8 -0
- package/src/migrations/0066_extension_display_name.sql +4 -0
- package/src/migrations/0067_agent_profiles.sql +20 -0
- package/src/migrations/0068_agent_avatar_uploads.sql +7 -0
- package/src/migrations/0069_attachments_agent_idx.sql +3 -0
- package/src/migrations/0070_background_tasks.sql +37 -0
- package/src/migrations/0071_background_tasks_reserve.sql +6 -0
- package/src/migrations/0072_background_tasks_stopping.sql +5 -0
- package/src/migrations/0073_org_extension_point_defaults.sql +11 -0
- package/src/migrations/0074_subagent_tree.sql +50 -0
- package/src/migrations/0075_plugin_scope.sql +61 -0
- package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
- package/src/migrations/0077_scope_requests.sql +52 -0
- package/src/migrations/0078_scope_grant_switches.sql +18 -0
- package/src/migrations/0079_scope_live_install_switches.sql +19 -0
- package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
- package/src/migrations/0081_platform_components.sql +129 -0
- package/src/migrations/0082_platform_migration.sql +33 -0
- package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
- package/src/migrations/0084_org_owned_items.sql +85 -0
- package/src/migrations/0085_agent_templates_phase4.sql +45 -0
- package/src/migrations/0086_org_layering.sql +30 -0
- package/src/migrations/0087_approval_summary.sql +6 -0
- package/src/migrations/0088_environments.sql +80 -0
- package/src/migrations/0089_model_kinds_usage.sql +38 -0
- package/src/migrations/0090_initial_passwords.sql +27 -0
- package/src/migrations/0091_account_time_zone.sql +4 -0
- package/src/migrations/0092_tools_default_on.sql +27 -0
- package/src/migrations/0093_connected_environments.sql +37 -0
- package/src/migrations/0094_environment_paths_idx.sql +7 -0
- package/src/migrations/0095_environment_files_resets.sql +5 -0
- package/src/migrations/0096_environment_demoted_default.sql +18 -0
- package/src/migrations/0097_extension_installs_enabled_at.sql +16 -0
- package/src/migrations/0098_single_provider_running_first.sql +41 -0
- package/src/migrations/0099_channel_connection_guide_ack.sql +6 -0
- package/src/migrations/0100_catalog_files.sql +13 -0
- package/src/migrations/0101_marketplace_icons.sql +32 -0
- package/src/migrations/0102_themes.sql +64 -0
- package/src/migrations/0103_ui_theme_setting.sql +7 -0
- package/dist/catalog/upgrade-targets.d.ts +0 -59
- package/dist/catalog/upgrade-targets.js +0 -90
- package/dist/conversations/sandbox-status.d.ts +0 -21
- package/dist/conversations/sandbox-status.js +0 -24
- package/dist/extensions/org-config.controller.d.ts +0 -24
- package/dist/extensions/org-config.controller.js +0 -59
- package/dist/http/gateway.module.js +0 -13
- package/dist/http/health.controller.d.ts +0 -26
- package/dist/http/health.controller.js +0 -79
- package/dist/http/tokens.d.ts +0 -131
- package/dist/http/tokens.js +0 -131
- package/dist/http/zod.pipe.d.ts +0 -8
- package/dist/http/zod.pipe.js +0 -14
- package/dist/identity/enterprise-admin.d.ts +0 -14
- package/dist/identity/enterprise-admin.js +0 -27
- package/dist/identity/rate-limit.d.ts +0 -55
- package/dist/identity/rate-limit.js +0 -121
- package/dist/sandbox/lifecycle.d.ts +0 -21
- package/dist/sandbox/lifecycle.js +0 -68
- package/dist/tools/builtins/sandbox/names.d.ts +0 -7
- package/dist/tools/builtins/sandbox/names.js +0 -20
|
@@ -1,19 +1,36 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
1
10
|
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { CATALOG_ITEM_NAME_RE, marketplaceEntryVersion, PLUGIN_MANIFEST_FILE, parseMarketplaceManifest, parsePluginManifest, SDK_VERSION, SEMVER_VERSION_RE, } from "@capybara-hq/plugin-sdk";
|
|
11
|
+
import { CATALOG_ITEM_NAME_RE, marketplaceEntryDeprecation, marketplaceEntryVersion, PLUGIN_MANIFEST_FILE, parseMarketplaceManifest, parsePluginManifest, pluginDescription, SDK_VERSION, SEMVER_VERSION_RE, } from "@capybara-hq/plugin-sdk";
|
|
12
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
3
13
|
import { sql } from "kysely";
|
|
4
14
|
import semver from "semver";
|
|
5
15
|
import { MARKETPLACE_MAX_MIRRORS } from "../config/schema.js";
|
|
6
16
|
import { ConfigError } from "../config/types.js";
|
|
7
17
|
import { createSecrets } from "../ctx/secrets.js";
|
|
8
18
|
import { ApiError } from "../errors.js";
|
|
9
|
-
import { DEPLOYMENT_SECRETS_ORG } from "../extensions/deployment-config.js";
|
|
19
|
+
import { DEPLOYMENT_SECRETS_ORG } from "../extensions/deployment-config-store.js";
|
|
10
20
|
import { audit } from "../identity/audit.js";
|
|
11
|
-
import {
|
|
21
|
+
import { SuperAdminLock } from "../identity/super-admin.js";
|
|
22
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
23
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
24
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
25
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
26
|
+
import { KERNEL_LOGGER, KEYRING } from "../infra/tokens.js";
|
|
12
27
|
import { KERNEL_VERSION } from "../version.js";
|
|
13
28
|
import { CLAUDE_PLUGIN_FILE } from "./claude/manifest.js";
|
|
14
29
|
import { CLAUDE_MARKETPLACE_FILE, parseClaudeMarketplace, } from "./claude/marketplace.js";
|
|
15
30
|
import { expandGitUrl, GitSourceError, gitErrorDetails, gitLocationIdentity, gitUrlIdentity, normalGitPath, readGitTreeAndOids, resolveGitCommit, } from "./git-source.js";
|
|
31
|
+
import { CatalogSourceLock } from "./locks.js";
|
|
16
32
|
import { fetchMarketplaceManifest, MarketplaceFetchError, MarketplaceInvalidError, marketplaceNetPolicy, marketplaceUrlProblem, } from "./marketplace-fetch.js";
|
|
33
|
+
import { checkMarketplaceIcon, fetchMarketplaceIcon, gitIconPaths, MARKETPLACE_ICON_CONCURRENCY, MARKETPLACE_ICON_FETCHES_MAX, MARKETPLACE_ICON_MAX_BYTES, MARKETPLACE_ICON_RETRY_MS, marketplaceIconUrl, wantedIcons, } from "./marketplace-icons.js";
|
|
17
34
|
import { compareVersions, newestFirst, sameRelease } from "./versions.js";
|
|
18
35
|
/** 官方清单来源的 id。 */
|
|
19
36
|
export const OFFICIAL_MARKETPLACE_ID = "official";
|
|
@@ -227,6 +244,20 @@ export function headsToResolve(entries, imported, config, max) {
|
|
|
227
244
|
export const HOST_VERSIONS = { kernel: KERNEL_VERSION, sdk: SDK_VERSION };
|
|
228
245
|
/** Whether this deployment satisfies the entry's `minKernel`. */
|
|
229
246
|
export const entryCompatible = (e) => e.minKernel === undefined || semver.gte(HOST_VERSIONS.kernel, e.minKernel);
|
|
247
|
+
/** Whether the marketplace marks the entry deprecated (`deprecated: true` or with a reason). */
|
|
248
|
+
export const entryDeprecated = (e) => marketplaceEntryDeprecation(e) !== null;
|
|
249
|
+
/**
|
|
250
|
+
* Refuses importing (or requesting) a deprecated marketplace entry: 409
|
|
251
|
+
* `marketplace.entry_deprecated`, its reason in the message and details.
|
|
252
|
+
*/
|
|
253
|
+
export function assertEntryNotDeprecated(e) {
|
|
254
|
+
const d = marketplaceEntryDeprecation(e);
|
|
255
|
+
if (d === null)
|
|
256
|
+
return;
|
|
257
|
+
const version = marketplaceEntryVersion(e);
|
|
258
|
+
throw new ApiError("marketplace.entry_deprecated", `${e.name}${version !== null ? `@${version}` : ""} is deprecated by its marketplace` +
|
|
259
|
+
`${d.reason !== null ? `: ${d.reason}` : ""}; import another version`, [{ entry: e.name, version, reason: d.reason }]);
|
|
260
|
+
}
|
|
230
261
|
/**
|
|
231
262
|
* The form of a marketplace address (spec §5.1): `owner/repo` (expanded to GitHub), an https URL
|
|
232
263
|
* whose path ends in `.git`, or any URL with `form: "git"` is a git repository; anything else
|
|
@@ -266,7 +297,7 @@ export function hostAllowed(host, config) {
|
|
|
266
297
|
return allowed.length === 0 || allowed.includes(host.toLowerCase());
|
|
267
298
|
}
|
|
268
299
|
/** Why an entry is not importable from a marketplace of `form`, or undefined when it is. */
|
|
269
|
-
function unimportable(e, form, config) {
|
|
300
|
+
export function unimportable(e, form, config) {
|
|
270
301
|
if ("path" in e.source && form !== "git")
|
|
271
302
|
return "path_needs_git_marketplace";
|
|
272
303
|
const host = entrySourceHost(e);
|
|
@@ -276,10 +307,30 @@ function unimportable(e, form, config) {
|
|
|
276
307
|
}
|
|
277
308
|
/** 来源是否生效:本身启用,official 还要配置没关。 */
|
|
278
309
|
export const sourceEffective = (row, config) => row.enabled && (!row.builtin || config.marketplaces.official.enabled);
|
|
310
|
+
/**
|
|
311
|
+
* The default entry of a marketplace plugin (`version` `""`: the entry without a version), the
|
|
312
|
+
* same order as the web's market row (`groupMarketplaceEntries`, apps/web/src/lib/catalog.ts):
|
|
313
|
+
* the newest `usable` versioned entry, a stable version before a prerelease; else the entry
|
|
314
|
+
* without a version that is not deprecated; else the newest versioned one that is not deprecated;
|
|
315
|
+
* else the entry without a version; else the newest.
|
|
316
|
+
*/
|
|
317
|
+
export function pickDefaultEntry(entries, o) {
|
|
318
|
+
const versioned = entries
|
|
319
|
+
.filter((e) => e.version !== "")
|
|
320
|
+
.sort((a, b) => newestFirst(a.version, b.version));
|
|
321
|
+
const bare = entries.filter((e) => e.version === "");
|
|
322
|
+
return (versioned.find((e) => o.usable(e) && semver.prerelease(e.version) === null) ??
|
|
323
|
+
versioned.find(o.usable) ??
|
|
324
|
+
bare.find((e) => !o.deprecated(e)) ??
|
|
325
|
+
versioned.find((e) => !o.deprecated(e)) ??
|
|
326
|
+
bare[0] ??
|
|
327
|
+
versioned[0]);
|
|
328
|
+
}
|
|
279
329
|
/**
|
|
280
330
|
* Reads a marketplace entry for import: `version` given -> the entry listing that version; omitted
|
|
281
|
-
* ->
|
|
282
|
-
*
|
|
331
|
+
* -> {@link pickDefaultEntry} over the compatible, importable entries that are not deprecated
|
|
332
|
+
* (a fallback is refused later as incompatible or deprecated). Marketplace missing ->
|
|
333
|
+
* `marketplace.not_found`;
|
|
283
334
|
* marketplace disabled (official offline included), entry or version missing ->
|
|
284
335
|
* `marketplace.entry_not_found`.
|
|
285
336
|
*/
|
|
@@ -309,13 +360,13 @@ export async function loadMarketplaceEntry(db, config, sourceId, name, version)
|
|
|
309
360
|
pickedRow = entries.find((e) => e.version === version);
|
|
310
361
|
}
|
|
311
362
|
else {
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
363
|
+
pickedRow = pickDefaultEntry(entries, {
|
|
364
|
+
// compatible, importable, not deprecated
|
|
365
|
+
usable: (e) => entryCompatible(e.entry) &&
|
|
366
|
+
unimportable(e.entry, src.form, config) === undefined &&
|
|
367
|
+
!entryDeprecated(e.entry),
|
|
368
|
+
deprecated: (e) => entryDeprecated(e.entry),
|
|
369
|
+
});
|
|
319
370
|
}
|
|
320
371
|
const picked = pickedRow?.entry;
|
|
321
372
|
if (!picked) {
|
|
@@ -337,19 +388,37 @@ export async function loadMarketplaceEntry(db, config, sourceId, name, version)
|
|
|
337
388
|
};
|
|
338
389
|
}
|
|
339
390
|
/**
|
|
340
|
-
* Marketplaces (D16 / C25 / C26, `/api/v1/admin/marketplaces/*`,
|
|
391
|
+
* Marketplaces (D16 / C25 / C26, `/api/v1/admin/marketplaces/*`, super admins only): the official
|
|
341
392
|
* marketplace (config `marketplaces.official.*`, synced at startup into the marketplace with id
|
|
342
|
-
* `official`) and
|
|
393
|
+
* `official`) and custom marketplaces (PG, optional token in secrets). A refresh (maintenance
|
|
343
394
|
* job `catalogs-refresh` every `marketplaces.refreshIntervalMinutes` minutes, or manual) tries the main
|
|
344
395
|
* URL and then the mirrors with If-None-Match; on success it replaces that marketplace's cached
|
|
345
396
|
* entries as a whole, when all fail (an invalid manifest included) it keeps the previous ones with
|
|
346
397
|
* status `error`. A status change audits `marketplace.refreshed` and logs once. Stateless, shared
|
|
347
398
|
* by every replica.
|
|
348
399
|
*/
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
400
|
+
let MarketplacesService = class MarketplacesService {
|
|
401
|
+
kdb;
|
|
402
|
+
adminLock;
|
|
403
|
+
sourceLock;
|
|
404
|
+
config;
|
|
405
|
+
keyring;
|
|
406
|
+
log;
|
|
407
|
+
txHost;
|
|
408
|
+
constructor(kdb,
|
|
409
|
+
/** The super admin lock (identity/super-admin.ts): joins the caller's transaction. */
|
|
410
|
+
adminLock, sourceLock, config, keyring, log, txHost) {
|
|
411
|
+
this.kdb = kdb;
|
|
412
|
+
this.adminLock = adminLock;
|
|
413
|
+
this.sourceLock = sourceLock;
|
|
414
|
+
this.config = config;
|
|
415
|
+
this.keyring = keyring;
|
|
416
|
+
this.log = log;
|
|
417
|
+
this.txHost = txHost;
|
|
418
|
+
}
|
|
419
|
+
/** The kernel-schema handle of the current context (the transaction, else the pool). */
|
|
420
|
+
get db() {
|
|
421
|
+
return this.kdb.db;
|
|
353
422
|
}
|
|
354
423
|
/**
|
|
355
424
|
* Creates / updates the official marketplace from config (name, URL, its form per
|
|
@@ -360,14 +429,14 @@ export class MarketplacesService {
|
|
|
360
429
|
* without the schema).
|
|
361
430
|
*/
|
|
362
431
|
async syncOfficialFromConfig() {
|
|
363
|
-
const o = this.
|
|
432
|
+
const o = this.config.get().marketplaces.official;
|
|
364
433
|
const { form, url } = marketplaceForm(o.url);
|
|
365
434
|
if (form === "git" && o.mirrors.length > 0) {
|
|
366
435
|
throw new ConfigError("invalid configuration:\n - marketplaces.official.mirrors: a git marketplace has no mirrors (point marketplaces.official.url at a mirror repository instead)");
|
|
367
436
|
}
|
|
368
437
|
const mirrors = JSON.stringify(o.mirrors);
|
|
369
438
|
const same = sql `marketplaces.url = excluded.url AND marketplaces.form = excluded.form`;
|
|
370
|
-
await this.
|
|
439
|
+
await this.db
|
|
371
440
|
.insertInto("marketplaces")
|
|
372
441
|
.values({
|
|
373
442
|
id: OFFICIAL_MARKETPLACE_ID,
|
|
@@ -393,7 +462,7 @@ export class MarketplacesService {
|
|
|
393
462
|
}
|
|
394
463
|
/** 全部来源(official 在前,其余按创建时间)。 */
|
|
395
464
|
async list() {
|
|
396
|
-
const rows = (await this.
|
|
465
|
+
const rows = (await this.db
|
|
397
466
|
.selectFrom("marketplaces")
|
|
398
467
|
.selectAll()
|
|
399
468
|
.orderBy("builtin", "desc")
|
|
@@ -403,7 +472,7 @@ export class MarketplacesService {
|
|
|
403
472
|
return this.views(rows);
|
|
404
473
|
}
|
|
405
474
|
async get(id) {
|
|
406
|
-
const row = (await this.
|
|
475
|
+
const row = (await this.db
|
|
407
476
|
.selectFrom("marketplaces")
|
|
408
477
|
.selectAll()
|
|
409
478
|
.where("id", "=", id)
|
|
@@ -413,7 +482,7 @@ export class MarketplacesService {
|
|
|
413
482
|
return (await this.views([row]))[0];
|
|
414
483
|
}
|
|
415
484
|
/**
|
|
416
|
-
* Adds
|
|
485
|
+
* Adds a custom marketplace (audit `marketplace.added`). URL and mirrors must be https,
|
|
417
486
|
* without user info. The form follows {@link marketplaceForm}; a git marketplace may name a `ref`
|
|
418
487
|
* (branch or tag, default the remote HEAD) and has no mirrors.
|
|
419
488
|
*/
|
|
@@ -425,44 +494,67 @@ export class MarketplacesService {
|
|
|
425
494
|
if (input.token !== undefined)
|
|
426
495
|
this.checkToken(input.token);
|
|
427
496
|
const id = randomUUID();
|
|
428
|
-
await this.
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
497
|
+
await this.writeAdd(actor, id, { ...input, name, form, url }, opts);
|
|
498
|
+
return this.get(id);
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* The read-only checks of {@link add}, for the `Platform` tool's precheck (before the card): the
|
|
502
|
+
* name, URL and git fields as `add` checks them (throws `validation_failed`), then the source
|
|
503
|
+
* that has the same URL and ref already, if any (adding a duplicate is allowed; the tool points
|
|
504
|
+
* the agent at the existing source instead).
|
|
505
|
+
*/
|
|
506
|
+
async checkAdd(input) {
|
|
507
|
+
this.checkName(input.name);
|
|
508
|
+
const { form, url } = marketplaceForm(input.url);
|
|
509
|
+
this.checkUrls(url, []);
|
|
510
|
+
this.checkGitFields(form, input.ref ?? null, []);
|
|
511
|
+
const same = await this.db
|
|
512
|
+
.selectFrom("marketplaces")
|
|
513
|
+
.select(["id", "name"])
|
|
514
|
+
.where("url", "=", url)
|
|
515
|
+
.where("ref", input.ref === undefined ? "is" : "=", input.ref ?? null)
|
|
516
|
+
.executeTakeFirst();
|
|
517
|
+
return same ?? null;
|
|
518
|
+
}
|
|
519
|
+
async writeAdd(actor, id, input, opts) {
|
|
520
|
+
const { name, url, form } = input;
|
|
521
|
+
const t = this.db;
|
|
522
|
+
await this.adminLock.lockAndAuthorize(actor);
|
|
523
|
+
await t
|
|
524
|
+
.insertInto("marketplaces")
|
|
525
|
+
.values({
|
|
526
|
+
id,
|
|
527
|
+
name,
|
|
528
|
+
url,
|
|
529
|
+
form,
|
|
530
|
+
ref: input.ref ?? null,
|
|
531
|
+
mirrors: JSON.stringify(input.mirrors ?? []),
|
|
532
|
+
builtin: false,
|
|
533
|
+
enabled: true,
|
|
534
|
+
created_by: actor,
|
|
535
|
+
})
|
|
536
|
+
.execute();
|
|
537
|
+
if (input.token !== undefined) {
|
|
538
|
+
await this.secrets().set(DEPLOYMENT_SECRETS_ORG, tokenKey(id), input.token);
|
|
539
|
+
}
|
|
540
|
+
await audit(t, {
|
|
541
|
+
actorAccountId: actor,
|
|
542
|
+
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
543
|
+
action: "marketplace.added",
|
|
544
|
+
target: id,
|
|
545
|
+
detail: {
|
|
434
546
|
name,
|
|
435
547
|
url,
|
|
436
548
|
form,
|
|
437
|
-
ref: input.ref
|
|
438
|
-
mirrors:
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
})
|
|
443
|
-
.execute();
|
|
444
|
-
if (input.token !== undefined) {
|
|
445
|
-
await this.secrets(trx).set(DEPLOYMENT_SECRETS_ORG, tokenKey(id), input.token);
|
|
446
|
-
}
|
|
447
|
-
await audit(trx, {
|
|
448
|
-
actorAccountId: actor,
|
|
449
|
-
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
450
|
-
action: "marketplace.added",
|
|
451
|
-
target: id,
|
|
452
|
-
detail: {
|
|
453
|
-
name,
|
|
454
|
-
url,
|
|
455
|
-
form,
|
|
456
|
-
...(input.ref !== undefined && { ref: input.ref }),
|
|
457
|
-
mirrors: input.mirrors ?? [],
|
|
458
|
-
hasToken: input.token !== undefined,
|
|
459
|
-
},
|
|
460
|
-
});
|
|
549
|
+
...(input.ref !== undefined && { ref: input.ref }),
|
|
550
|
+
mirrors: input.mirrors ?? [],
|
|
551
|
+
hasToken: input.token !== undefined,
|
|
552
|
+
...opts.auditDetail,
|
|
553
|
+
},
|
|
461
554
|
});
|
|
462
|
-
return this.get(id);
|
|
463
555
|
}
|
|
464
556
|
/**
|
|
465
|
-
* Updates
|
|
557
|
+
* Updates a custom marketplace (audit `marketplace.updated`, listing the changed fields, the
|
|
466
558
|
* token's value never recorded; not written when unchanged). `token: null` clears the token.
|
|
467
559
|
* Official only takes `enabled`, any other field -> `marketplace.builtin`. Changing the URL, form
|
|
468
560
|
* or ref clears the ETag and the last commit (the next refresh reads everything again); a new URL
|
|
@@ -472,129 +564,131 @@ export class MarketplacesService {
|
|
|
472
564
|
*/
|
|
473
565
|
async update(actor, id, patch, opts = {}) {
|
|
474
566
|
const name = patch.name !== undefined ? this.checkName(patch.name) : undefined;
|
|
475
|
-
await this.
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
await secrets.set(DEPLOYMENT_SECRETS_ORG, tokenKey(id), patch.token);
|
|
567
|
+
await this.writeUpdate(actor, id, name, patch, opts);
|
|
568
|
+
return this.get(id);
|
|
569
|
+
}
|
|
570
|
+
async writeUpdate(actor, id, name, patch, opts) {
|
|
571
|
+
const t = this.db;
|
|
572
|
+
await this.adminLock.lockAndAuthorize(actor);
|
|
573
|
+
const row = (await t
|
|
574
|
+
.selectFrom("marketplaces")
|
|
575
|
+
.selectAll()
|
|
576
|
+
.where("id", "=", id)
|
|
577
|
+
.forUpdate()
|
|
578
|
+
.executeTakeFirst());
|
|
579
|
+
if (!row)
|
|
580
|
+
throw notFound();
|
|
581
|
+
if (row.builtin &&
|
|
582
|
+
(name !== undefined ||
|
|
583
|
+
patch.url !== undefined ||
|
|
584
|
+
patch.form !== undefined ||
|
|
585
|
+
patch.ref !== undefined ||
|
|
586
|
+
patch.mirrors !== undefined ||
|
|
587
|
+
patch.token !== undefined)) {
|
|
588
|
+
throw builtinErr("changed");
|
|
589
|
+
}
|
|
590
|
+
const target = patch.url !== undefined || patch.form !== undefined
|
|
591
|
+
? marketplaceForm(patch.url ?? row.url, patch.form)
|
|
592
|
+
: { form: row.form, url: row.url };
|
|
593
|
+
// Switching form clears the other form's fields unless the patch sets them: the ref when
|
|
594
|
+
// becoming http, the mirrors when becoming git
|
|
595
|
+
const switched = target.form !== row.form;
|
|
596
|
+
const ref = patch.ref !== undefined ? patch.ref : switched && target.form === "http" ? null : row.ref;
|
|
597
|
+
const mirrors = patch.mirrors ?? (switched && target.form === "git" ? [] : row.mirrors);
|
|
598
|
+
this.checkUrls(target.url, mirrors);
|
|
599
|
+
this.checkGitFields(target.form, ref, mirrors);
|
|
600
|
+
if (typeof patch.token === "string")
|
|
601
|
+
this.checkToken(patch.token);
|
|
602
|
+
const changed = [];
|
|
603
|
+
const set = {};
|
|
604
|
+
if (name !== undefined && name !== row.name) {
|
|
605
|
+
set.name = name;
|
|
606
|
+
changed.push("name");
|
|
607
|
+
}
|
|
608
|
+
if (target.url !== row.url) {
|
|
609
|
+
set.url = target.url;
|
|
610
|
+
changed.push("url");
|
|
611
|
+
}
|
|
612
|
+
if (target.form !== row.form) {
|
|
613
|
+
set.form = target.form;
|
|
614
|
+
changed.push("form");
|
|
615
|
+
}
|
|
616
|
+
if (ref !== row.ref) {
|
|
617
|
+
set.ref = ref;
|
|
618
|
+
changed.push("ref");
|
|
619
|
+
}
|
|
620
|
+
if (set.url !== undefined || set.form !== undefined || set.ref !== undefined) {
|
|
621
|
+
set.etag = null;
|
|
622
|
+
set.last_commit = null;
|
|
623
|
+
}
|
|
624
|
+
if (JSON.stringify(mirrors) !== JSON.stringify(row.mirrors)) {
|
|
625
|
+
set.mirrors = JSON.stringify(mirrors);
|
|
626
|
+
changed.push("mirrors");
|
|
627
|
+
}
|
|
628
|
+
if (patch.enabled !== undefined && patch.enabled !== row.enabled) {
|
|
629
|
+
set.enabled = patch.enabled;
|
|
630
|
+
changed.push("enabled");
|
|
631
|
+
}
|
|
632
|
+
if (Object.keys(set).length > 0) {
|
|
633
|
+
await t.updateTable("marketplaces").set(set).where("id", "=", id).execute();
|
|
634
|
+
}
|
|
635
|
+
if (patch.token !== undefined) {
|
|
636
|
+
const secrets = this.secrets();
|
|
637
|
+
const had = (await secrets.get(DEPLOYMENT_SECRETS_ORG, tokenKey(id))) !== null;
|
|
638
|
+
if (patch.token === null) {
|
|
639
|
+
if (had) {
|
|
640
|
+
await secrets.delete(DEPLOYMENT_SECRETS_ORG, tokenKey(id));
|
|
550
641
|
changed.push("token");
|
|
551
642
|
}
|
|
552
643
|
}
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
644
|
+
else {
|
|
645
|
+
await secrets.set(DEPLOYMENT_SECRETS_ORG, tokenKey(id), patch.token);
|
|
646
|
+
changed.push("token");
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
if (changed.length === 0)
|
|
650
|
+
return;
|
|
651
|
+
await audit(t, {
|
|
652
|
+
actorAccountId: actor,
|
|
653
|
+
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
654
|
+
action: "marketplace.updated",
|
|
655
|
+
target: id,
|
|
656
|
+
detail: {
|
|
657
|
+
changed,
|
|
658
|
+
...(set.enabled !== undefined && { enabled: set.enabled }),
|
|
659
|
+
...(set.url !== undefined && { url: set.url }),
|
|
660
|
+
...(set.form !== undefined && { form: set.form }),
|
|
661
|
+
...(set.ref !== undefined && { ref: set.ref }),
|
|
662
|
+
...opts.auditDetail,
|
|
663
|
+
},
|
|
568
664
|
});
|
|
569
|
-
return this.get(id);
|
|
570
665
|
}
|
|
571
666
|
/**
|
|
572
|
-
* Deletes
|
|
667
|
+
* Deletes a custom marketplace (audit `marketplace.removed`): its cached entries and token
|
|
573
668
|
* are deleted; imported catalog items are kept (their marketplace becomes null). Official can
|
|
574
669
|
* only be disabled -> `marketplace.builtin`.
|
|
575
670
|
*/
|
|
576
671
|
async remove(actor, id, opts = {}) {
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
});
|
|
672
|
+
const t = this.db;
|
|
673
|
+
await this.adminLock.lockAndAuthorize(actor);
|
|
674
|
+
const row = await t
|
|
675
|
+
.selectFrom("marketplaces")
|
|
676
|
+
.select(["builtin", "name", "url"])
|
|
677
|
+
.where("id", "=", id)
|
|
678
|
+
.forUpdate()
|
|
679
|
+
.executeTakeFirst();
|
|
680
|
+
if (!row)
|
|
681
|
+
throw notFound();
|
|
682
|
+
if (row.builtin)
|
|
683
|
+
throw builtinErr("deleted");
|
|
684
|
+
await t.deleteFrom("marketplaces").where("id", "=", id).execute();
|
|
685
|
+
await this.secrets().delete(DEPLOYMENT_SECRETS_ORG, tokenKey(id));
|
|
686
|
+
await audit(t, {
|
|
687
|
+
actorAccountId: actor,
|
|
688
|
+
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
689
|
+
action: "marketplace.removed",
|
|
690
|
+
target: id,
|
|
691
|
+
detail: { name: row.name, url: row.url, ...opts.auditDetail },
|
|
598
692
|
});
|
|
599
693
|
}
|
|
600
694
|
/**
|
|
@@ -609,8 +703,8 @@ export class MarketplacesService {
|
|
|
609
703
|
* (the message gives each URL's failure).
|
|
610
704
|
*/
|
|
611
705
|
async refresh(id, signal, actor, opts = {}) {
|
|
612
|
-
const config = this.
|
|
613
|
-
const row = (await this.
|
|
706
|
+
const config = this.config.get();
|
|
707
|
+
const row = (await this.db
|
|
614
708
|
.selectFrom("marketplaces")
|
|
615
709
|
.selectAll()
|
|
616
710
|
.where("id", "=", id)
|
|
@@ -624,7 +718,7 @@ export class MarketplacesService {
|
|
|
624
718
|
}
|
|
625
719
|
const token = row.builtin
|
|
626
720
|
? undefined
|
|
627
|
-
: ((await this.secrets(
|
|
721
|
+
: ((await this.secrets().get(DEPLOYMENT_SECRETS_ORG, tokenKey(id))) ?? undefined);
|
|
628
722
|
const tokenOrigin = new URL(row.url).origin;
|
|
629
723
|
const errors = [];
|
|
630
724
|
// the API code of each failed URL (undefined: an ordinary fetch failure)
|
|
@@ -660,7 +754,7 @@ export class MarketplacesService {
|
|
|
660
754
|
etag: row.etag,
|
|
661
755
|
...(token !== undefined && { token, tokenOrigin }),
|
|
662
756
|
maxBytes: config.marketplaces.maxIndexBytes,
|
|
663
|
-
timeoutMs:
|
|
757
|
+
timeoutMs: MARKETPLACE_FETCH_TIMEOUT_MS,
|
|
664
758
|
net: marketplaceNetPolicy(config),
|
|
665
759
|
signal,
|
|
666
760
|
});
|
|
@@ -688,89 +782,35 @@ export class MarketplacesService {
|
|
|
688
782
|
? new Map()
|
|
689
783
|
: await this.resolveHeads(id, outcome === "not_modified" ? undefined : outcome.manifest.plugins, { url: row.url, token }, signal);
|
|
690
784
|
const lastError = status === "error" ? errors.join("\n").slice(0, MAX_ERROR_CHARS) : null;
|
|
691
|
-
const from = await this.
|
|
692
|
-
await sql `SELECT pg_advisory_xact_lock(hashtext(${`capybara.catalog-source:${id}`}))`.execute(trx);
|
|
693
|
-
const cur = await trx
|
|
694
|
-
.selectFrom("marketplaces")
|
|
695
|
-
.select(["last_status", "url", "mirrors", "form", "ref", "last_commit"])
|
|
696
|
-
.where("id", "=", id)
|
|
697
|
-
.forUpdate()
|
|
698
|
-
.executeTakeFirst();
|
|
699
|
-
if (!cur)
|
|
700
|
-
throw notFound();
|
|
701
|
-
// The admin changed the URL / mirrors during the fetch: what we fetched is the old address's
|
|
702
|
-
// content, so write no entries, ETag or status (the next refresh uses the new address)
|
|
703
|
-
if (cur.url !== row.url ||
|
|
704
|
-
cur.form !== row.form ||
|
|
705
|
-
cur.ref !== row.ref ||
|
|
706
|
-
// another refresh wrote a commit meanwhile: ours may be older, never move it back
|
|
707
|
-
cur.last_commit !== row.last_commit ||
|
|
708
|
-
JSON.stringify(cur.mirrors) !== JSON.stringify(row.mirrors)) {
|
|
709
|
-
return "stale";
|
|
710
|
-
}
|
|
711
|
-
if (outcome !== undefined && outcome !== "not_modified") {
|
|
712
|
-
await this.replaceEntries(trx, id, outcome.manifest.plugins, outcome.trees, outcome.overlays);
|
|
713
|
-
}
|
|
714
|
-
if (outcome !== undefined) {
|
|
715
|
-
// heads not resolved this time are unknown again (never a stale head)
|
|
716
|
-
await trx
|
|
717
|
-
.updateTable("marketplace_entries")
|
|
718
|
-
.set({ head_commit: null, tree_oid: null })
|
|
719
|
-
.where("source_id", "=", id)
|
|
720
|
-
.where("head_commit", "is not", null)
|
|
721
|
-
.execute();
|
|
722
|
-
}
|
|
723
|
-
for (const [key, head] of heads) {
|
|
724
|
-
const [name, version] = key.split("\0");
|
|
725
|
-
await trx
|
|
726
|
-
.updateTable("marketplace_entries")
|
|
727
|
-
.set({ head_commit: head.commit, tree_oid: head.tree })
|
|
728
|
-
.where("source_id", "=", id)
|
|
729
|
-
.where("name", "=", name)
|
|
730
|
-
.where("version", "=", version)
|
|
731
|
-
.execute();
|
|
732
|
-
}
|
|
733
|
-
await trx
|
|
734
|
-
.updateTable("marketplaces")
|
|
735
|
-
.set({
|
|
736
|
-
last_status: status,
|
|
737
|
-
last_error: lastError,
|
|
738
|
-
last_refreshed_at: sql `now()`,
|
|
739
|
-
...(outcome !== undefined &&
|
|
740
|
-
outcome !== "not_modified" && {
|
|
741
|
-
etag: outcome.etag,
|
|
742
|
-
last_commit: outcome.commit ?? null,
|
|
743
|
-
owner_name: outcome.manifest.owner?.name ?? null,
|
|
744
|
-
skipped: JSON.stringify(outcome.skipped ?? []),
|
|
745
|
-
}),
|
|
746
|
-
})
|
|
747
|
-
.where("id", "=", id)
|
|
748
|
-
.execute();
|
|
749
|
-
if (cur.last_status !== status) {
|
|
750
|
-
await audit(trx, {
|
|
751
|
-
...(actor !== undefined && { actorAccountId: actor }),
|
|
752
|
-
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
753
|
-
action: "marketplace.refreshed",
|
|
754
|
-
target: id,
|
|
755
|
-
detail: {
|
|
756
|
-
from: cur.last_status,
|
|
757
|
-
to: status,
|
|
758
|
-
...(lastError !== null && { error: lastError }),
|
|
759
|
-
},
|
|
760
|
-
});
|
|
761
|
-
}
|
|
762
|
-
return cur.last_status;
|
|
763
|
-
});
|
|
785
|
+
const from = await this.recordRefresh(row, { outcome, heads, status, lastError }, actor, opts);
|
|
764
786
|
if (from === "stale") {
|
|
765
|
-
this.
|
|
787
|
+
this.log.info("marketplace changed during refresh; result discarded", { marketplace: id });
|
|
766
788
|
return this.get(id);
|
|
767
789
|
}
|
|
790
|
+
if (outcome !== undefined) {
|
|
791
|
+
// a failed icon never fails the refresh: the entry shows its initial
|
|
792
|
+
try {
|
|
793
|
+
await this.syncIcons(row, outcome === "not_modified" ? undefined : outcome.icons, signal);
|
|
794
|
+
// only now is the commit fully synced: a refresh at it may be not_modified from here on
|
|
795
|
+
if (outcome !== "not_modified" && outcome.commit !== undefined) {
|
|
796
|
+
await this.db
|
|
797
|
+
.updateTable("marketplaces")
|
|
798
|
+
.set({ icons_commit: outcome.commit })
|
|
799
|
+
.where("id", "=", id)
|
|
800
|
+
.where("last_commit", "=", outcome.commit)
|
|
801
|
+
.execute();
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
catch (err) {
|
|
805
|
+
this.log.warn("marketplace icons not updated", { marketplace: id, err });
|
|
806
|
+
}
|
|
807
|
+
}
|
|
768
808
|
if (from !== status) {
|
|
769
809
|
if (status === "error") {
|
|
770
|
-
this.
|
|
810
|
+
this.log.warn("marketplace refresh failed", { marketplace: id, error: lastError });
|
|
771
811
|
}
|
|
772
812
|
else {
|
|
773
|
-
this.
|
|
813
|
+
this.log.info("marketplace refreshed", { marketplace: id });
|
|
774
814
|
}
|
|
775
815
|
}
|
|
776
816
|
if (status === "error" && opts.throwOnError) {
|
|
@@ -784,8 +824,9 @@ export class MarketplacesService {
|
|
|
784
824
|
}
|
|
785
825
|
/**
|
|
786
826
|
* Reads a git marketplace (spec §5.1): resolves `ref` (default the remote HEAD); the same commit
|
|
787
|
-
* as the last refresh
|
|
788
|
-
*
|
|
827
|
+
* as the last refresh, whose path icons were stored too (`icons_commit`) -> `not_modified`
|
|
828
|
+
* (nothing else is fetched; a commit whose icons were not stored is read again). Otherwise only
|
|
829
|
+
* what the root needs is read, in this order: `.capybara-plugin/marketplace.json` (at most
|
|
789
830
|
* `marketplaces.maxIndexBytes`, validated like an http manifest); `.claude-plugin/marketplace.json`
|
|
790
831
|
* (a Claude Code marketplace: each entry's component fields and `strict` become its overlay, and
|
|
791
832
|
* entries Capybara cannot store are `skipped`); else a single-plugin repo (the root has
|
|
@@ -794,7 +835,7 @@ export class MarketplacesService {
|
|
|
794
835
|
* (Decision 3). Throws {@link GitSourceError} or {@link MarketplaceInvalidError}.
|
|
795
836
|
*/
|
|
796
837
|
async fetchGit(row, token, signal) {
|
|
797
|
-
const config = this.
|
|
838
|
+
const config = this.config.get();
|
|
798
839
|
const options = {
|
|
799
840
|
net: marketplaceNetPolicy(config),
|
|
800
841
|
maxBytes: config.packages.maxBytes,
|
|
@@ -803,12 +844,12 @@ export class MarketplacesService {
|
|
|
803
844
|
};
|
|
804
845
|
const loc = { url: row.url, ...(row.ref !== null && { ref: row.ref }) };
|
|
805
846
|
const commit = await resolveGitCommit(loc, options);
|
|
806
|
-
if (commit === row.last_commit)
|
|
847
|
+
if (commit === row.last_commit && commit === row.icons_commit)
|
|
807
848
|
return "not_modified";
|
|
808
849
|
const MANIFEST = ".capybara-plugin/marketplace.json";
|
|
809
850
|
let hasSkills = false;
|
|
810
851
|
const dec = (b) => new TextDecoder().decode(b);
|
|
811
|
-
const { files, trees } = await readGitTreeAndOids({ url: row.url, commit }, {
|
|
852
|
+
const { files, trees, blobs: icons, } = await readGitTreeAndOids({ url: row.url, commit }, {
|
|
812
853
|
...options,
|
|
813
854
|
include: (path, type) => {
|
|
814
855
|
if (path === "skills" && type === "tree")
|
|
@@ -824,6 +865,13 @@ export class MarketplacesService {
|
|
|
824
865
|
trees: (read) => read.has(MANIFEST) || !read.has(CLAUDE_MARKETPLACE_FILE)
|
|
825
866
|
? pathEntryDirs(read.get(MANIFEST), config.marketplaces.maxIndexBytes)
|
|
826
867
|
: claudePathEntryDirs(read.get(CLAUDE_MARKETPLACE_FILE), config.marketplaces.maxIndexBytes, config.marketplaces.allowInsecureLoopback),
|
|
868
|
+
// the icon files the entries name (a Claude Code marketplace names none)
|
|
869
|
+
blobs: {
|
|
870
|
+
paths: (read) => read.has(MANIFEST) || !read.has(CLAUDE_MARKETPLACE_FILE)
|
|
871
|
+
? gitIconPaths(read, MANIFEST, config.marketplaces.maxIndexBytes, MARKETPLACE_ICON_FETCHES_MAX)
|
|
872
|
+
: [],
|
|
873
|
+
maxBytes: MARKETPLACE_ICON_MAX_BYTES,
|
|
874
|
+
},
|
|
827
875
|
});
|
|
828
876
|
const raw = files.get(MANIFEST);
|
|
829
877
|
const claudeRaw = files.get(CLAUDE_MARKETPLACE_FILE);
|
|
@@ -881,9 +929,16 @@ export class MarketplacesService {
|
|
|
881
929
|
if ("errors" in m) {
|
|
882
930
|
throw new MarketplaceInvalidError(`the repository is a single plugin, but its ${PLUGIN_MANIFEST_FILE} is invalid: ${m.errors.slice(0, 5).join("; ")}`, m.errors);
|
|
883
931
|
}
|
|
932
|
+
const d = pluginDescription(m.description);
|
|
884
933
|
entry = {
|
|
885
934
|
name: m.name,
|
|
886
|
-
summary: {
|
|
935
|
+
summary: {
|
|
936
|
+
en: d.en.slice(0, SUMMARY_MAX),
|
|
937
|
+
...(d.zh !== undefined && { zh: d.zh.slice(0, SUMMARY_MAX) }),
|
|
938
|
+
},
|
|
939
|
+
...(m.displayName !== undefined && { displayName: m.displayName }),
|
|
940
|
+
// the plugin's own icon, read from the same commit
|
|
941
|
+
...(m.icon !== undefined && { icon: `./${normalGitPath(m.icon)}` }),
|
|
887
942
|
version: m.version,
|
|
888
943
|
source: { path: "." },
|
|
889
944
|
};
|
|
@@ -903,7 +958,7 @@ export class MarketplacesService {
|
|
|
903
958
|
}
|
|
904
959
|
manifest = { schemaVersion: 1, name: row.name, plugins: [entry] };
|
|
905
960
|
}
|
|
906
|
-
return { manifest, etag: null, commit, trees };
|
|
961
|
+
return { manifest, etag: null, commit, trees, icons };
|
|
907
962
|
}
|
|
908
963
|
/**
|
|
909
964
|
* Resolves the branch heads of the entries {@link headsToResolve} picks (at most
|
|
@@ -914,9 +969,9 @@ export class MarketplacesService {
|
|
|
914
969
|
* entry unknown (never fails the refresh). Returns `name\0version` -> head.
|
|
915
970
|
*/
|
|
916
971
|
async resolveHeads(id, fresh, m, signal) {
|
|
917
|
-
const config = this.
|
|
972
|
+
const config = this.config.get();
|
|
918
973
|
const listed = fresh ??
|
|
919
|
-
(await this.
|
|
974
|
+
(await this.db
|
|
920
975
|
.selectFrom("marketplace_entries")
|
|
921
976
|
.select("entry")
|
|
922
977
|
.where("source_id", "=", id)
|
|
@@ -925,7 +980,7 @@ export class MarketplacesService {
|
|
|
925
980
|
const names = [...new Set(listed.filter((e) => "git" in e.source).map((e) => e.name))];
|
|
926
981
|
if (names.length === 0)
|
|
927
982
|
return out;
|
|
928
|
-
const imported = await this.
|
|
983
|
+
const imported = await this.db
|
|
929
984
|
.selectFrom("catalog_items as i")
|
|
930
985
|
.innerJoin("catalog_item_versions as v", "v.item_id", "i.id")
|
|
931
986
|
.select(["i.name", "v.version", "v.source", "v.source_ref", "v.integrity", "v.source_detail"])
|
|
@@ -933,7 +988,7 @@ export class MarketplacesService {
|
|
|
933
988
|
.where("i.name", "in", names)
|
|
934
989
|
.execute();
|
|
935
990
|
const todo = headsToResolve(listed, imported, config, MARKETPLACE_HEADS_MAX);
|
|
936
|
-
const timeoutMs =
|
|
991
|
+
const timeoutMs = MARKETPLACE_FETCH_TIMEOUT_MS;
|
|
937
992
|
const queue = [...todo];
|
|
938
993
|
await Promise.all(Array.from({ length: Math.min(HEADS_CONCURRENCY, queue.length) }, async () => {
|
|
939
994
|
for (let e = queue.shift(); e !== undefined; e = queue.shift()) {
|
|
@@ -959,7 +1014,7 @@ export class MarketplacesService {
|
|
|
959
1014
|
}
|
|
960
1015
|
catch (err) {
|
|
961
1016
|
// a head lookup never fails the refresh: that entry stays unknown
|
|
962
|
-
this.
|
|
1017
|
+
this.log.warn("cannot resolve the branch head of a marketplace entry", {
|
|
963
1018
|
marketplace: id,
|
|
964
1019
|
entry: e.name,
|
|
965
1020
|
error: err instanceof Error ? err.message : String(err),
|
|
@@ -969,14 +1024,207 @@ export class MarketplacesService {
|
|
|
969
1024
|
}));
|
|
970
1025
|
return out;
|
|
971
1026
|
}
|
|
972
|
-
/**
|
|
1027
|
+
/**
|
|
1028
|
+
* Brings the marketplace's stored icons (`marketplace_icons`) in line with its stored entries
|
|
1029
|
+
* after a refresh (outside any transaction: downloads first, then one short write). A repository
|
|
1030
|
+
* path (git marketplaces) is taken from `fresh`, the files of the commit just read, and kept as
|
|
1031
|
+
* stored when the commit did not change (`fresh` undefined). A URL is downloaded only when it is
|
|
1032
|
+
* not stored yet (its content is treated as fixed), at most {@link MARKETPLACE_ICON_FETCHES_MAX}
|
|
1033
|
+
* per refresh, under the marketplace network rules and `marketplaces.allowedHosts`, never with
|
|
1034
|
+
* the token. A failed download is remembered (`marketplace_icon_failures`) and retried only after
|
|
1035
|
+
* {@link MARKETPLACE_ICON_RETRY_MS}, URLs never tried first, so broken URLs never starve the
|
|
1036
|
+
* cap. An icon that is missing, too large or not a real svg / png is skipped and logged; icons
|
|
1037
|
+
* (and failures) no entry names any more are deleted.
|
|
1038
|
+
*/
|
|
1039
|
+
async syncIcons(row, fresh, signal) {
|
|
1040
|
+
const config = this.config.get();
|
|
1041
|
+
const entries = await this.db
|
|
1042
|
+
.selectFrom("marketplace_entries")
|
|
1043
|
+
.select("entry")
|
|
1044
|
+
.where("source_id", "=", row.id)
|
|
1045
|
+
.execute();
|
|
1046
|
+
const { paths, urls } = wantedIcons(entries.map((r) => r.entry), row.form);
|
|
1047
|
+
const have = new Set((await this.db
|
|
1048
|
+
.selectFrom("marketplace_icons")
|
|
1049
|
+
.select("ref")
|
|
1050
|
+
.where("source_id", "=", row.id)
|
|
1051
|
+
.execute()).map((r) => r.ref));
|
|
1052
|
+
// the URLs that failed before, oldest failure first, and whether their backoff is over
|
|
1053
|
+
const failures = await this.db
|
|
1054
|
+
.selectFrom("marketplace_icon_failures")
|
|
1055
|
+
.select([
|
|
1056
|
+
"ref",
|
|
1057
|
+
sql `failed_at <= now() - make_interval(secs => ${MARKETPLACE_ICON_RETRY_MS / 1000})`.as("due"),
|
|
1058
|
+
])
|
|
1059
|
+
.where("source_id", "=", row.id)
|
|
1060
|
+
.orderBy("failed_at")
|
|
1061
|
+
.orderBy("ref")
|
|
1062
|
+
.execute();
|
|
1063
|
+
const failedBefore = new Map(failures.map((f) => [f.ref, f.due]));
|
|
1064
|
+
const put = [];
|
|
1065
|
+
const keep = new Set();
|
|
1066
|
+
const problems = [];
|
|
1067
|
+
for (const ref of paths) {
|
|
1068
|
+
if (fresh === undefined) {
|
|
1069
|
+
if (have.has(ref))
|
|
1070
|
+
keep.add(ref);
|
|
1071
|
+
continue;
|
|
1072
|
+
}
|
|
1073
|
+
const data = fresh.get(ref.slice(2));
|
|
1074
|
+
const r = data === undefined
|
|
1075
|
+
? `${ref} is not a file of at most ${MARKETPLACE_ICON_MAX_BYTES} bytes in the repository`
|
|
1076
|
+
: checkMarketplaceIcon(ref, data);
|
|
1077
|
+
if (typeof r === "string")
|
|
1078
|
+
problems.push({ icon: ref, problem: r });
|
|
1079
|
+
else
|
|
1080
|
+
put.push({ ref, icon: r });
|
|
1081
|
+
}
|
|
1082
|
+
// IPv6 hostnames come bracketed from URL; allowedHosts entries are written without brackets
|
|
1083
|
+
const hostOf = (url) => new URL(url).hostname.toLowerCase().replace(/^\[(.*)\]$/, "$1");
|
|
1084
|
+
const neverTried = [];
|
|
1085
|
+
for (const url of urls) {
|
|
1086
|
+
if (have.has(url)) {
|
|
1087
|
+
keep.add(url);
|
|
1088
|
+
continue;
|
|
1089
|
+
}
|
|
1090
|
+
const host = hostOf(url);
|
|
1091
|
+
if (!hostAllowed(host, config)) {
|
|
1092
|
+
problems.push({ icon: url, problem: `${host} is not in marketplaces.allowedHosts` });
|
|
1093
|
+
}
|
|
1094
|
+
else if (!failedBefore.has(url)) {
|
|
1095
|
+
neverTried.push(url);
|
|
1096
|
+
}
|
|
1097
|
+
}
|
|
1098
|
+
// retries after the never-tried URLs, oldest failure first, within the cap
|
|
1099
|
+
const retries = failures
|
|
1100
|
+
.filter((f) => f.due && urls.has(f.ref) && !have.has(f.ref))
|
|
1101
|
+
.map((f) => f.ref)
|
|
1102
|
+
.filter((url) => hostAllowed(hostOf(url), config));
|
|
1103
|
+
const toFetch = [...neverTried, ...retries].slice(0, MARKETPLACE_ICON_FETCHES_MAX);
|
|
1104
|
+
const net = marketplaceNetPolicy(config);
|
|
1105
|
+
const queue = [...toFetch];
|
|
1106
|
+
const failed = [];
|
|
1107
|
+
await Promise.all(Array.from({ length: Math.min(MARKETPLACE_ICON_CONCURRENCY, queue.length) }, async () => {
|
|
1108
|
+
for (let url = queue.shift(); url !== undefined; url = queue.shift()) {
|
|
1109
|
+
if (signal.aborted)
|
|
1110
|
+
return;
|
|
1111
|
+
const r = await fetchMarketplaceIcon(url, { net, signal });
|
|
1112
|
+
if (typeof r === "string") {
|
|
1113
|
+
problems.push({ icon: url, problem: r });
|
|
1114
|
+
// an aborted refresh says nothing about the URL
|
|
1115
|
+
if (!signal.aborted)
|
|
1116
|
+
failed.push(url);
|
|
1117
|
+
}
|
|
1118
|
+
else
|
|
1119
|
+
put.push({ ref: url, icon: r });
|
|
1120
|
+
}
|
|
1121
|
+
}));
|
|
1122
|
+
if (problems.length > 0) {
|
|
1123
|
+
this.log.warn("marketplace icons skipped", {
|
|
1124
|
+
marketplace: row.id,
|
|
1125
|
+
count: problems.length,
|
|
1126
|
+
problems: problems.slice(0, 5),
|
|
1127
|
+
});
|
|
1128
|
+
}
|
|
1129
|
+
const gone = [...have].filter((ref) => !keep.has(ref) && !put.some((p) => p.ref === ref));
|
|
1130
|
+
// failures of URLs now stored or named by no entry
|
|
1131
|
+
const cleared = [...failedBefore.keys()].filter((ref) => !urls.has(ref) || put.some((p) => p.ref === ref));
|
|
1132
|
+
if (put.length > 0 || gone.length > 0 || failed.length > 0 || cleared.length > 0) {
|
|
1133
|
+
await this.writeIcons(row.id, { put, gone, failed, cleared });
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1136
|
+
/**
|
|
1137
|
+
* Writes a refresh's icons: upserts `put`, deletes `gone`, records the `failed` downloads and
|
|
1138
|
+
* forgets the `cleared` failures (see {@link syncIcons}).
|
|
1139
|
+
*/
|
|
1140
|
+
async writeIcons(id, w) {
|
|
1141
|
+
const t = this.db;
|
|
1142
|
+
if (w.gone.length > 0) {
|
|
1143
|
+
await t
|
|
1144
|
+
.deleteFrom("marketplace_icons")
|
|
1145
|
+
.where("source_id", "=", id)
|
|
1146
|
+
.where("ref", "in", w.gone)
|
|
1147
|
+
.execute();
|
|
1148
|
+
}
|
|
1149
|
+
for (const { ref, icon } of w.put) {
|
|
1150
|
+
const values = {
|
|
1151
|
+
sha256: icon.sha256,
|
|
1152
|
+
content_type: icon.contentType,
|
|
1153
|
+
data: Buffer.from(icon.data),
|
|
1154
|
+
fetched_at: sql `now()`,
|
|
1155
|
+
};
|
|
1156
|
+
await t
|
|
1157
|
+
.insertInto("marketplace_icons")
|
|
1158
|
+
.values({ source_id: id, ref, ...values })
|
|
1159
|
+
.onConflict((oc) => oc.columns(["source_id", "ref"]).doUpdateSet(values))
|
|
1160
|
+
.execute();
|
|
1161
|
+
}
|
|
1162
|
+
if (w.cleared.length > 0) {
|
|
1163
|
+
await t
|
|
1164
|
+
.deleteFrom("marketplace_icon_failures")
|
|
1165
|
+
.where("source_id", "=", id)
|
|
1166
|
+
.where("ref", "in", w.cleared)
|
|
1167
|
+
.execute();
|
|
1168
|
+
}
|
|
1169
|
+
// sorted: two replicas refreshing at once lock the rows in the same order
|
|
1170
|
+
for (const ref of [...w.failed].sort()) {
|
|
1171
|
+
await t
|
|
1172
|
+
.insertInto("marketplace_icon_failures")
|
|
1173
|
+
.values({ source_id: id, ref })
|
|
1174
|
+
.onConflict((oc) => oc.columns(["source_id", "ref"]).doUpdateSet({
|
|
1175
|
+
failed_at: sql `now()`,
|
|
1176
|
+
attempts: sql `marketplace_icon_failures.attempts + 1`,
|
|
1177
|
+
}))
|
|
1178
|
+
.execute();
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
/**
|
|
1182
|
+
* A stored marketplace icon by its sha256 (the address the entries carry); not stored ->
|
|
1183
|
+
* `catalog.icon_not_found`. Read from PG, never from the network. `browsable` (the org route):
|
|
1184
|
+
* the marketplace must also be one the org browse lists (effective), else not found.
|
|
1185
|
+
*/
|
|
1186
|
+
async icon(id, sha256, opts = {}) {
|
|
1187
|
+
if (opts.browsable) {
|
|
1188
|
+
// the org browse lists enabled marketplaces only (official also needs the config on)
|
|
1189
|
+
const m = await this.db
|
|
1190
|
+
.selectFrom("marketplaces")
|
|
1191
|
+
.select(["builtin", "enabled"])
|
|
1192
|
+
.where("id", "=", id)
|
|
1193
|
+
.executeTakeFirst();
|
|
1194
|
+
if (!m || !sourceEffective(m, this.config.get())) {
|
|
1195
|
+
throw new ApiError("catalog.icon_not_found", "This marketplace has no such icon");
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
const row = /^[0-9a-f]{64}$/.test(sha256)
|
|
1199
|
+
? await this.db
|
|
1200
|
+
.selectFrom("marketplace_icons")
|
|
1201
|
+
.select(["content_type", "data"])
|
|
1202
|
+
.where("source_id", "=", id)
|
|
1203
|
+
.where("sha256", "=", sha256)
|
|
1204
|
+
.limit(1)
|
|
1205
|
+
.executeTakeFirst()
|
|
1206
|
+
: undefined;
|
|
1207
|
+
if (!row)
|
|
1208
|
+
throw new ApiError("catalog.icon_not_found", "This marketplace has no such icon");
|
|
1209
|
+
// checked again on read, like a catalog icon (`readCatalogIcon`): PG may have been changed
|
|
1210
|
+
const data = new Uint8Array(row.data);
|
|
1211
|
+
const checked = checkMarketplaceIcon(row.content_type === "image/svg+xml" ? "icon.svg" : "icon.png", data);
|
|
1212
|
+
if (typeof checked === "string") {
|
|
1213
|
+
throw new ApiError("internal", `Stored marketplace icon is invalid: ${checked}`);
|
|
1214
|
+
}
|
|
1215
|
+
if (checked.sha256 !== sha256) {
|
|
1216
|
+
throw new ApiError("internal", "Stored marketplace icon does not match its recorded hash");
|
|
1217
|
+
}
|
|
1218
|
+
return { contentType: checked.contentType, data };
|
|
1219
|
+
}
|
|
1220
|
+
/** The token of a custom marketplace (undefined without one; official never has one). */
|
|
973
1221
|
async token(id) {
|
|
974
|
-
return (await this.secrets(
|
|
1222
|
+
return (await this.secrets().get(DEPLOYMENT_SECRETS_ORG, tokenKey(id))) ?? undefined;
|
|
975
1223
|
}
|
|
976
1224
|
/** Refreshes every effective marketplace (maintenance job `catalogs-refresh`), one failing not stopping the rest. */
|
|
977
1225
|
async refreshAll(signal) {
|
|
978
|
-
const config = this.
|
|
979
|
-
const rows = await this.
|
|
1226
|
+
const config = this.config.get();
|
|
1227
|
+
const rows = await this.db
|
|
980
1228
|
.selectFrom("marketplaces")
|
|
981
1229
|
.select(["id", "builtin", "enabled"])
|
|
982
1230
|
.orderBy("id")
|
|
@@ -990,7 +1238,7 @@ export class MarketplacesService {
|
|
|
990
1238
|
await this.refresh(r.id, signal);
|
|
991
1239
|
}
|
|
992
1240
|
catch (err) {
|
|
993
|
-
this.
|
|
1241
|
+
this.log.error("marketplace refresh crashed", { marketplace: r.id, err });
|
|
994
1242
|
}
|
|
995
1243
|
}
|
|
996
1244
|
}
|
|
@@ -1000,9 +1248,11 @@ export class MarketplacesService {
|
|
|
1000
1248
|
* first), marketplace, at most {@link MARKETPLACE_ENTRIES_MAX}; `truncated` means there are more
|
|
1001
1249
|
* (the UI suggests narrowing the filter).
|
|
1002
1250
|
*/
|
|
1003
|
-
async entries(q = {}
|
|
1004
|
-
|
|
1005
|
-
|
|
1251
|
+
async entries(q = {},
|
|
1252
|
+
/** The URL of a stored marketplace icon (default: the admin route). */
|
|
1253
|
+
iconUrl = marketplaceIconUrl) {
|
|
1254
|
+
const config = this.config.get();
|
|
1255
|
+
let query = this.db
|
|
1006
1256
|
.selectFrom("marketplace_entries as e")
|
|
1007
1257
|
.innerJoin("marketplaces as s", "s.id", "e.source_id")
|
|
1008
1258
|
.select([
|
|
@@ -1034,6 +1284,8 @@ export class MarketplacesService {
|
|
|
1034
1284
|
eb(sql `coalesce(e.npm, '')`, "ilike", like),
|
|
1035
1285
|
eb(sql `e.entry->'summary'->>'en'`, "ilike", like),
|
|
1036
1286
|
eb(sql `coalesce(e.entry->'summary'->>'zh', '')`, "ilike", like),
|
|
1287
|
+
eb(sql `coalesce(e.entry->'displayName'->>'en', '')`, "ilike", like),
|
|
1288
|
+
eb(sql `coalesce(e.entry->'displayName'->>'zh', '')`, "ilike", like),
|
|
1037
1289
|
]));
|
|
1038
1290
|
}
|
|
1039
1291
|
const fetched = await query.execute();
|
|
@@ -1043,7 +1295,7 @@ export class MarketplacesService {
|
|
|
1043
1295
|
a.source_id.localeCompare(b.source_id));
|
|
1044
1296
|
if (rows.length === 0)
|
|
1045
1297
|
return { items: [], truncated: false };
|
|
1046
|
-
const items = await this.
|
|
1298
|
+
const items = await this.db
|
|
1047
1299
|
.selectFrom("catalog_items as i")
|
|
1048
1300
|
.leftJoin("catalog_item_versions as v", "v.item_id", "i.id")
|
|
1049
1301
|
.select([
|
|
@@ -1078,6 +1330,16 @@ export class MarketplacesService {
|
|
|
1078
1330
|
a.imported.sort(newestFirst);
|
|
1079
1331
|
a.versions = a.imported.map((v) => v.version);
|
|
1080
1332
|
}
|
|
1333
|
+
const iconRows = await this.db
|
|
1334
|
+
.selectFrom("marketplace_icons")
|
|
1335
|
+
.select(["source_id", "ref", "sha256"])
|
|
1336
|
+
.where("source_id", "in", [...new Set(rows.map((r) => r.source_id))])
|
|
1337
|
+
.execute();
|
|
1338
|
+
const iconOf = new Map(iconRows.map((i) => [`${i.source_id}\0${i.ref}`, i.sha256]));
|
|
1339
|
+
const iconUrlOf = (sourceId, ref) => {
|
|
1340
|
+
const sha = ref === undefined ? undefined : iconOf.get(`${sourceId}\0${ref}`);
|
|
1341
|
+
return sha === undefined ? null : iconUrl(sourceId, sha);
|
|
1342
|
+
};
|
|
1081
1343
|
const views = rows.map((r) => {
|
|
1082
1344
|
const e = r.entry;
|
|
1083
1345
|
const version = marketplaceEntryVersion(e);
|
|
@@ -1092,17 +1354,25 @@ export class MarketplacesService {
|
|
|
1092
1354
|
name: r.name,
|
|
1093
1355
|
version,
|
|
1094
1356
|
summary: e.summary,
|
|
1357
|
+
displayName: e.displayName ?? null,
|
|
1095
1358
|
minKernel: e.minKernel ?? null,
|
|
1096
1359
|
homepage: e.homepage ?? null,
|
|
1097
1360
|
permissions: e.permissions ?? null,
|
|
1098
1361
|
source: e.source,
|
|
1362
|
+
deprecated: marketplaceEntryDeprecation(e),
|
|
1099
1363
|
format: r.claude === null ? "capybara" : "claude-code",
|
|
1100
1364
|
compatible,
|
|
1101
1365
|
importable,
|
|
1102
1366
|
...(reason !== undefined && { reason }),
|
|
1103
1367
|
adopted: adopted ? { itemId: adopted.itemId, versions: [...adopted.versions] } : null,
|
|
1104
|
-
|
|
1368
|
+
icon: iconUrlOf(r.source_id, e.icon),
|
|
1369
|
+
newerAvailable: compatible &&
|
|
1370
|
+
!entryDeprecated(e) &&
|
|
1371
|
+
version !== null &&
|
|
1372
|
+
top !== undefined &&
|
|
1373
|
+
compareVersions(version, top) > 0,
|
|
1105
1374
|
contentChanged: adopted !== null &&
|
|
1375
|
+
!entryDeprecated(e) &&
|
|
1106
1376
|
entryContentChanged(e, {
|
|
1107
1377
|
marketplaceId: r.source_id,
|
|
1108
1378
|
headCommit: r.head_commit,
|
|
@@ -1114,14 +1384,96 @@ export class MarketplacesService {
|
|
|
1114
1384
|
});
|
|
1115
1385
|
return { items: views, truncated };
|
|
1116
1386
|
}
|
|
1387
|
+
/**
|
|
1388
|
+
* Writes a refresh's result under the marketplace's lock (entries, heads, status, the status
|
|
1389
|
+
* change audit); `stale` when the marketplace changed during the fetch (nothing is written).
|
|
1390
|
+
*/
|
|
1391
|
+
async recordRefresh(row, r, actor, opts) {
|
|
1392
|
+
const { id } = row;
|
|
1393
|
+
const { outcome, heads, status, lastError } = r;
|
|
1394
|
+
await this.sourceLock.lock(id);
|
|
1395
|
+
const t = this.db;
|
|
1396
|
+
const cur = await t
|
|
1397
|
+
.selectFrom("marketplaces")
|
|
1398
|
+
.select(["last_status", "url", "mirrors", "form", "ref", "last_commit"])
|
|
1399
|
+
.where("id", "=", id)
|
|
1400
|
+
.forUpdate()
|
|
1401
|
+
.executeTakeFirst();
|
|
1402
|
+
if (!cur)
|
|
1403
|
+
throw notFound();
|
|
1404
|
+
// The admin changed the URL / mirrors during the fetch: what we fetched is the old address's
|
|
1405
|
+
// content, so write no entries, ETag or status (the next refresh uses the new address)
|
|
1406
|
+
if (cur.url !== row.url ||
|
|
1407
|
+
cur.form !== row.form ||
|
|
1408
|
+
cur.ref !== row.ref ||
|
|
1409
|
+
// another refresh wrote a commit meanwhile: ours may be older, never move it back
|
|
1410
|
+
cur.last_commit !== row.last_commit ||
|
|
1411
|
+
JSON.stringify(cur.mirrors) !== JSON.stringify(row.mirrors)) {
|
|
1412
|
+
return "stale";
|
|
1413
|
+
}
|
|
1414
|
+
if (outcome !== undefined && outcome !== "not_modified") {
|
|
1415
|
+
await this.replaceEntries(id, outcome.manifest.plugins, outcome.trees, outcome.overlays);
|
|
1416
|
+
}
|
|
1417
|
+
if (outcome !== undefined) {
|
|
1418
|
+
// heads not resolved this time are unknown again (never a stale head)
|
|
1419
|
+
await t
|
|
1420
|
+
.updateTable("marketplace_entries")
|
|
1421
|
+
.set({ head_commit: null, tree_oid: null })
|
|
1422
|
+
.where("source_id", "=", id)
|
|
1423
|
+
.where("head_commit", "is not", null)
|
|
1424
|
+
.execute();
|
|
1425
|
+
}
|
|
1426
|
+
for (const [key, head] of heads) {
|
|
1427
|
+
const [name, version] = key.split("\0");
|
|
1428
|
+
await t
|
|
1429
|
+
.updateTable("marketplace_entries")
|
|
1430
|
+
.set({ head_commit: head.commit, tree_oid: head.tree })
|
|
1431
|
+
.where("source_id", "=", id)
|
|
1432
|
+
.where("name", "=", name)
|
|
1433
|
+
.where("version", "=", version)
|
|
1434
|
+
.execute();
|
|
1435
|
+
}
|
|
1436
|
+
await t
|
|
1437
|
+
.updateTable("marketplaces")
|
|
1438
|
+
.set({
|
|
1439
|
+
last_status: status,
|
|
1440
|
+
last_error: lastError,
|
|
1441
|
+
last_refreshed_at: sql `now()`,
|
|
1442
|
+
...(outcome !== undefined &&
|
|
1443
|
+
outcome !== "not_modified" && {
|
|
1444
|
+
etag: outcome.etag,
|
|
1445
|
+
last_commit: outcome.commit ?? null,
|
|
1446
|
+
owner_name: outcome.manifest.owner?.name ?? null,
|
|
1447
|
+
skipped: JSON.stringify(outcome.skipped ?? []),
|
|
1448
|
+
}),
|
|
1449
|
+
})
|
|
1450
|
+
.where("id", "=", id)
|
|
1451
|
+
.execute();
|
|
1452
|
+
if (cur.last_status !== status) {
|
|
1453
|
+
await audit(t, {
|
|
1454
|
+
...(actor !== undefined && { actorAccountId: actor }),
|
|
1455
|
+
...(opts.actorTokenId !== undefined && { actorTokenId: opts.actorTokenId }),
|
|
1456
|
+
action: "marketplace.refreshed",
|
|
1457
|
+
target: id,
|
|
1458
|
+
detail: {
|
|
1459
|
+
from: cur.last_status,
|
|
1460
|
+
to: status,
|
|
1461
|
+
...(lastError !== null && { error: lastError }),
|
|
1462
|
+
...opts.auditDetail,
|
|
1463
|
+
},
|
|
1464
|
+
});
|
|
1465
|
+
}
|
|
1466
|
+
return cur.last_status;
|
|
1467
|
+
}
|
|
1117
1468
|
/**
|
|
1118
1469
|
* Replaces the entries of a marketplace; `trees` (a git marketplace) gives each path entry the
|
|
1119
1470
|
* tree oid of its directory.
|
|
1120
1471
|
*/
|
|
1121
|
-
async replaceEntries(
|
|
1122
|
-
|
|
1472
|
+
async replaceEntries(id, entries, trees, overlays) {
|
|
1473
|
+
const t = this.db;
|
|
1474
|
+
await t.deleteFrom("marketplace_entries").where("source_id", "=", id).execute();
|
|
1123
1475
|
for (let i = 0; i < entries.length; i += INSERT_BATCH) {
|
|
1124
|
-
await
|
|
1476
|
+
await t
|
|
1125
1477
|
.insertInto("marketplace_entries")
|
|
1126
1478
|
.values(entries.slice(i, i + INSERT_BATCH).map((e) => ({
|
|
1127
1479
|
source_id: id,
|
|
@@ -1138,15 +1490,15 @@ export class MarketplacesService {
|
|
|
1138
1490
|
async views(rows) {
|
|
1139
1491
|
if (rows.length === 0)
|
|
1140
1492
|
return [];
|
|
1141
|
-
const config = this.
|
|
1493
|
+
const config = this.config.get();
|
|
1142
1494
|
const ids = rows.map((r) => r.id);
|
|
1143
|
-
const counts = await this.
|
|
1495
|
+
const counts = await this.db
|
|
1144
1496
|
.selectFrom("marketplace_entries")
|
|
1145
1497
|
.select(["source_id", (eb) => eb.fn.countAll().as("n")])
|
|
1146
1498
|
.where("source_id", "in", ids)
|
|
1147
1499
|
.groupBy("source_id")
|
|
1148
1500
|
.execute();
|
|
1149
|
-
const tokens = await this.
|
|
1501
|
+
const tokens = await this.db
|
|
1150
1502
|
.selectFrom("secrets")
|
|
1151
1503
|
.select("key")
|
|
1152
1504
|
.where("namespace", "=", SECRETS_NAMESPACE)
|
|
@@ -1176,8 +1528,9 @@ export class MarketplacesService {
|
|
|
1176
1528
|
createdAt: r.created_at.toISOString(),
|
|
1177
1529
|
}));
|
|
1178
1530
|
}
|
|
1179
|
-
secrets(
|
|
1180
|
-
|
|
1531
|
+
/** The deployment secrets on the current context's handle (the transaction, else the pool). */
|
|
1532
|
+
secrets() {
|
|
1533
|
+
return createSecrets(this.db, this.keyring, SECRETS_NAMESPACE);
|
|
1181
1534
|
}
|
|
1182
1535
|
checkName(name) {
|
|
1183
1536
|
const n = name.trim();
|
|
@@ -1187,7 +1540,7 @@ export class MarketplacesService {
|
|
|
1187
1540
|
return n;
|
|
1188
1541
|
}
|
|
1189
1542
|
checkUrls(url, mirrors) {
|
|
1190
|
-
const allow = this.
|
|
1543
|
+
const allow = this.config.get().marketplaces.allowInsecureLoopback;
|
|
1191
1544
|
if (mirrors.length > MARKETPLACE_MAX_MIRRORS) {
|
|
1192
1545
|
throw new ApiError("validation_failed", `at most ${MARKETPLACE_MAX_MIRRORS} mirrors`);
|
|
1193
1546
|
}
|
|
@@ -1214,4 +1567,33 @@ export class MarketplacesService {
|
|
|
1214
1567
|
throw new ApiError("validation_failed", `token must be 1–${MAX_TOKEN_CHARS} characters without line breaks`);
|
|
1215
1568
|
}
|
|
1216
1569
|
}
|
|
1217
|
-
}
|
|
1570
|
+
};
|
|
1571
|
+
__decorate([
|
|
1572
|
+
Transactional()
|
|
1573
|
+
], MarketplacesService.prototype, "writeAdd", null);
|
|
1574
|
+
__decorate([
|
|
1575
|
+
Transactional()
|
|
1576
|
+
], MarketplacesService.prototype, "writeUpdate", null);
|
|
1577
|
+
__decorate([
|
|
1578
|
+
Transactional()
|
|
1579
|
+
], MarketplacesService.prototype, "remove", null);
|
|
1580
|
+
__decorate([
|
|
1581
|
+
Transactional()
|
|
1582
|
+
], MarketplacesService.prototype, "writeIcons", null);
|
|
1583
|
+
__decorate([
|
|
1584
|
+
Transactional()
|
|
1585
|
+
], MarketplacesService.prototype, "recordRefresh", null);
|
|
1586
|
+
__decorate([
|
|
1587
|
+
Transactional({ propagation: "mandatory" })
|
|
1588
|
+
], MarketplacesService.prototype, "replaceEntries", null);
|
|
1589
|
+
MarketplacesService = __decorate([
|
|
1590
|
+
Injectable(),
|
|
1591
|
+
__param(0, Inject(KernelDb)),
|
|
1592
|
+
__param(1, Inject(SuperAdminLock)),
|
|
1593
|
+
__param(2, Inject(CatalogSourceLock)),
|
|
1594
|
+
__param(3, Inject(KernelConfigService)),
|
|
1595
|
+
__param(4, Inject(KEYRING)),
|
|
1596
|
+
__param(5, Inject(KERNEL_LOGGER)),
|
|
1597
|
+
__param(6, Inject(TransactionHost))
|
|
1598
|
+
], MarketplacesService);
|
|
1599
|
+
export { MarketplacesService };
|