@capybara-hq/kernel 0.1.0-rc.4 → 0.1.0-rc.6
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 +61 -5
- package/dist/admin/admin.controller.d.ts +51 -14
- package/dist/admin/admin.controller.js +60 -19
- package/dist/admin/extensions.controller.d.ts +16 -2
- package/dist/admin/extensions.controller.js +26 -6
- package/dist/admin/setup-lock.d.ts +1 -1
- package/dist/admin/setup-lock.js +1 -1
- package/dist/admin/setup.controller.d.ts +1 -1
- package/dist/admin/setup.controller.js +1 -1
- package/dist/admin/setup.service.d.ts +4 -4
- package/dist/admin/setup.service.js +8 -8
- package/dist/agents/agent-lookup.d.ts +16 -0
- package/dist/agents/agent-lookup.js +11 -0
- package/dist/agents/agents.controller.d.ts +76 -1
- package/dist/agents/agents.controller.js +90 -11
- package/dist/agents/agents.module.d.ts +4 -1
- package/dist/agents/agents.module.js +32 -6
- package/dist/agents/agents.service.d.ts +54 -23
- package/dist/agents/agents.service.js +180 -76
- package/dist/agents/definition.d.ts +49 -0
- package/dist/agents/definition.js +45 -0
- package/dist/agents/from-template.d.ts +106 -0
- package/dist/agents/from-template.js +649 -0
- package/dist/agents/from-template.service.d.ts +60 -0
- package/dist/agents/from-template.service.js +161 -0
- package/dist/agents/models.controller.d.ts +34 -5
- package/dist/agents/models.controller.js +50 -6
- package/dist/agents/org-templates.d.ts +176 -0
- package/dist/agents/org-templates.js +827 -0
- package/dist/agents/pending-connector-requests.d.ts +77 -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/readiness.controller.d.ts +5 -5
- package/dist/agents/readiness.controller.js +6 -6
- package/dist/agents/templates.controller.d.ts +86 -5
- package/dist/agents/templates.controller.js +171 -7
- package/dist/agents/templates.d.ts +127 -23
- package/dist/agents/templates.js +475 -52
- package/dist/background/background.module.js +8 -1
- package/dist/background/finish.d.ts +3 -2
- package/dist/background/launch-lock.d.ts +4 -3
- package/dist/background/launch-lock.js +4 -3
- package/dist/background/poll.job.d.ts +9 -6
- package/dist/background/poll.job.js +30 -22
- package/dist/background/session.d.ts +13 -2
- package/dist/background/session.js +13 -0
- package/dist/background/stop.d.ts +12 -6
- package/dist/background/stop.js +57 -39
- package/dist/background/store.d.ts +18 -6
- package/dist/background/store.js +12 -6
- package/dist/background/tasks.service.d.ts +15 -5
- package/dist/background/tasks.service.js +42 -17
- package/dist/background/wake-rules.d.ts +27 -18
- package/dist/background/wake-rules.js +52 -22
- package/dist/background/wake.d.ts +13 -11
- package/dist/background/wake.js +20 -14
- package/dist/catalog/admin-catalog.controller.d.ts +129 -30
- package/dist/catalog/admin-catalog.controller.js +213 -42
- package/dist/catalog/catalog-content.d.ts +58 -32
- package/dist/catalog/catalog-content.js +34 -8
- 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 +111 -7
- package/dist/catalog/catalog-items.js +279 -13
- package/dist/catalog/catalog-scope.service.d.ts +260 -0
- package/dist/catalog/catalog-scope.service.js +1116 -0
- package/dist/catalog/catalog.module.d.ts +7 -9
- package/dist/catalog/catalog.module.js +41 -31
- package/dist/catalog/catalog.service.d.ts +101 -29
- package/dist/catalog/catalog.service.js +104 -106
- package/dist/catalog/cli.d.ts +11 -1
- package/dist/catalog/cli.js +26 -1
- 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 +152 -0
- package/dist/catalog/component-scope.controller.js +287 -0
- package/dist/catalog/component-scope.service.d.ts +303 -0
- package/dist/catalog/component-scope.service.js +936 -0
- package/dist/catalog/component-state.d.ts +174 -0
- package/dist/catalog/component-state.js +437 -0
- package/dist/catalog/job-ids.d.ts +30 -0
- package/dist/catalog/job-ids.js +25 -0
- package/dist/catalog/marketplace-fetch.d.ts +1 -1
- package/dist/catalog/marketplaces.controller.d.ts +22 -5
- package/dist/catalog/marketplaces.controller.js +56 -7
- package/dist/catalog/marketplaces.service.d.ts +54 -14
- package/dist/catalog/marketplaces.service.js +71 -22
- package/dist/catalog/org-catalog.controller.d.ts +125 -34
- package/dist/catalog/org-catalog.controller.js +181 -65
- package/dist/catalog/org-catalog.service.d.ts +65 -33
- package/dist/catalog/org-catalog.service.js +324 -157
- 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 +119 -0
- package/dist/catalog/org-extension.controller.js +266 -0
- package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
- package/dist/catalog/org-plugin-uploads.controller.js +213 -0
- package/dist/catalog/org-plugin-uploads.d.ts +63 -0
- package/dist/catalog/org-plugin-uploads.js +116 -0
- package/dist/catalog/owned-items.d.ts +184 -0
- package/dist/catalog/owned-items.js +789 -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 +221 -0
- package/dist/catalog/platform-components.js +761 -0
- package/dist/catalog/platform-migration.d.ts +115 -0
- package/dist/catalog/platform-migration.js +582 -0
- package/dist/catalog/plugin-import.d.ts +178 -34
- package/dist/catalog/plugin-import.js +622 -82
- package/dist/catalog/plugin-install.d.ts +185 -41
- package/dist/catalog/plugin-install.js +758 -126
- package/dist/catalog/plugin-upgrade.d.ts +260 -225
- package/dist/catalog/plugin-upgrade.js +1147 -1136
- package/dist/catalog/request-rules.d.ts +65 -0
- package/dist/catalog/request-rules.js +217 -0
- package/dist/catalog/requests.service.d.ts +193 -118
- package/dist/catalog/requests.service.js +526 -343
- 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 +118 -0
- package/dist/channels/actions.js +1 -0
- package/dist/channels/cards.js +20 -2
- package/dist/channels/channels.module.js +2 -0
- package/dist/channels/inbound.d.ts +9 -1
- package/dist/channels/inbound.js +67 -5
- package/dist/channels/phrases.d.ts +35 -0
- package/dist/channels/phrases.js +29 -0
- package/dist/config/docs.js +3 -1
- package/dist/config/schema.d.ts +10 -2
- package/dist/config/schema.js +70 -22
- package/dist/conversations/access.d.ts +6 -4
- package/dist/conversations/access.js +27 -5
- package/dist/conversations/agent-tree.d.ts +46 -0
- package/dist/conversations/agent-tree.js +92 -0
- package/dist/conversations/conversations.controller.d.ts +43 -18
- package/dist/conversations/conversations.controller.js +79 -38
- package/dist/conversations/conversations.module.d.ts +1 -1
- package/dist/conversations/conversations.module.js +7 -7
- package/dist/conversations/conversations.service.d.ts +73 -15
- package/dist/conversations/conversations.service.js +115 -35
- package/dist/conversations/environment-status.d.ts +24 -0
- package/dist/conversations/environment-status.js +71 -0
- package/dist/conversations/event-log.d.ts +20 -5
- package/dist/conversations/event-log.js +60 -0
- package/dist/conversations/events.d.ts +84 -2
- package/dist/conversations/events.js +91 -17
- package/dist/conversations/queue.service.d.ts +1 -1
- package/dist/conversations/queue.service.js +5 -0
- package/dist/conversations/titles.d.ts +5 -3
- package/dist/conversations/titles.js +21 -8
- package/dist/conversations/tree.d.ts +17 -0
- package/dist/conversations/tree.js +42 -0
- package/dist/ctx/create-ctx.d.ts +20 -1
- package/dist/ctx/create-ctx.js +38 -7
- package/dist/db/kernel-schema.d.ts +386 -18
- package/dist/environments/access.d.ts +41 -0
- package/dist/environments/access.js +77 -0
- package/dist/environments/conversation-environments.d.ts +61 -0
- package/dist/environments/conversation-environments.js +170 -0
- package/dist/environments/dto.d.ts +25 -0
- package/dist/environments/dto.js +12 -0
- package/dist/environments/environments.controller.d.ts +33 -0
- package/dist/environments/environments.controller.js +110 -0
- package/dist/environments/environments.module.d.ts +8 -0
- package/dist/environments/environments.module.js +27 -0
- package/dist/environments/environments.service.d.ts +153 -0
- package/dist/environments/environments.service.js +541 -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 +85 -2
- package/dist/errors.js +85 -2
- package/dist/evals/reconstruct.d.ts +18 -9
- package/dist/evals/reconstruct.js +26 -7
- package/dist/evals/run-replay.d.ts +4 -2
- package/dist/evals/run-replay.js +20 -6
- package/dist/evals/runs.service.d.ts +2 -1
- package/dist/evals/runs.service.js +13 -12
- package/dist/evals/step-replay.d.ts +4 -6
- package/dist/evals/step-replay.js +4 -3
- package/dist/evals/trajectory.service.d.ts +8 -3
- package/dist/evals/trajectory.service.js +26 -14
- package/dist/evals/worker.d.ts +5 -5
- package/dist/evals/worker.js +9 -3
- package/dist/extensions/admin-ops.d.ts +36 -10
- package/dist/extensions/admin-ops.js +65 -42
- package/dist/extensions/admin-view.d.ts +37 -10
- package/dist/extensions/admin-view.js +103 -20
- package/dist/extensions/bootstrap.d.ts +17 -4
- package/dist/extensions/bootstrap.js +70 -9
- package/dist/extensions/cli.d.ts +12 -0
- package/dist/extensions/cli.js +11 -2
- package/dist/extensions/config-hash.d.ts +10 -0
- package/dist/extensions/config-hash.js +38 -0
- package/dist/extensions/deployment-config.d.ts +28 -5
- package/dist/extensions/deployment-config.js +48 -7
- package/dist/extensions/effective-config.d.ts +127 -0
- package/dist/extensions/effective-config.js +368 -0
- package/dist/extensions/extensions.module.js +11 -11
- package/dist/extensions/hooks.d.ts +37 -4
- package/dist/extensions/hooks.js +82 -16
- package/dist/extensions/host.d.ts +24 -10
- package/dist/extensions/host.js +49 -54
- package/dist/extensions/installs.d.ts +20 -8
- package/dist/extensions/installs.js +37 -15
- package/dist/extensions/org-config.d.ts +75 -6
- package/dist/extensions/org-config.js +184 -32
- 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/permission-view.d.ts +16 -4
- package/dist/extensions/permission-view.js +4 -4
- package/dist/extensions/plugin-items.d.ts +21 -0
- package/dist/extensions/plugin-items.js +42 -0
- package/dist/extensions/point-defaults.d.ts +12 -5
- package/dist/extensions/point-defaults.js +37 -9
- package/dist/extensions/resolve.d.ts +5 -1
- package/dist/extensions/resolve.js +15 -2
- package/dist/extensions/state.module.d.ts +9 -0
- package/dist/extensions/state.module.js +38 -0
- package/dist/files/previewers.d.ts +8 -1
- package/dist/files/previewers.js +35 -6
- package/dist/http/api.module.js +25 -3
- package/dist/http/app.d.ts +11 -2
- package/dist/http/app.js +31 -5
- package/dist/http/plugin-dispatch.d.ts +4 -1
- package/dist/http/plugin-dispatch.js +14 -2
- package/dist/identity/accounts.d.ts +29 -29
- package/dist/identity/accounts.js +47 -47
- package/dist/identity/audit.d.ts +2 -1
- package/dist/identity/auth.guard.d.ts +13 -5
- package/dist/identity/auth.guard.js +26 -9
- package/dist/identity/identity.module.d.ts +1 -1
- package/dist/identity/identity.module.js +4 -4
- package/dist/identity/me.controller.js +1 -1
- package/dist/identity/principal.d.ts +3 -3
- package/dist/identity/principal.js +3 -3
- package/dist/identity/settings.d.ts +22 -11
- package/dist/identity/settings.js +53 -18
- package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
- package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
- package/dist/inbox/inbox.module.d.ts +4 -1
- package/dist/inbox/inbox.module.js +7 -3
- package/dist/inbox/inbox.service.d.ts +62 -3
- package/dist/inbox/inbox.service.js +74 -4
- 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 +1 -1
- package/dist/index.js +1 -1
- package/dist/infra/cli/kernel-cli.module.js +9 -1
- package/dist/infra/config/kernel-config.service.js +24 -1
- package/dist/infra/database/xact-lock.d.ts +1 -1
- package/dist/infra/database/xact-lock.js +1 -1
- package/dist/infra/events/kernel-events.d.ts +19 -2
- package/dist/infra/queue/add-job-once.d.ts +14 -0
- package/dist/infra/queue/add-job-once.js +16 -0
- package/dist/kernel.module.js +6 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
- package/dist/lifecycle/kernel-lifecycle.js +4 -4
- 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 +99 -0
- package/dist/models/enablement.js +263 -0
- package/dist/models/models.module.d.ts +5 -1
- package/dist/models/models.module.js +16 -4
- package/dist/models/prices.d.ts +5 -5
- package/dist/models/prices.js +4 -4
- package/dist/models/purposes.controller.d.ts +6 -4
- package/dist/models/purposes.controller.js +13 -7
- package/dist/models/purposes.d.ts +37 -12
- package/dist/models/purposes.js +63 -17
- package/dist/orgs/directory-sync.d.ts +14 -5
- package/dist/orgs/directory-sync.js +41 -17
- package/dist/orgs/offboarding.d.ts +9 -7
- package/dist/orgs/offboarding.js +28 -17
- package/dist/orgs/org-lock.d.ts +5 -0
- package/dist/orgs/org-lock.js +13 -0
- package/dist/orgs/org.guard.d.ts +10 -0
- package/dist/orgs/org.guard.js +43 -32
- package/dist/orgs/orgs.module.js +3 -0
- package/dist/orgs/orgs.service.d.ts +20 -7
- package/dist/orgs/orgs.service.js +32 -12
- package/dist/orgs/roles.d.ts +1 -1
- package/dist/orgs/roles.js +5 -1
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.service.d.ts +15 -3
- package/dist/orgs/settings.service.js +6 -2
- package/dist/overrides.d.ts +3 -0
- package/dist/overrides.js +2 -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 +11 -0
- package/dist/platform/errors.js +26 -0
- package/dist/platform/exclusions.d.ts +12 -0
- package/dist/platform/exclusions.js +1405 -0
- package/dist/platform/method.d.ts +6 -0
- package/dist/platform/method.js +15 -0
- package/dist/platform/operation.d.ts +92 -0
- package/dist/platform/operation.js +35 -0
- package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
- package/dist/platform/ops/agent-templates.ops.js +92 -0
- package/dist/platform/ops/agents.ops.d.ts +19 -0
- package/dist/platform/ops/agents.ops.js +294 -0
- package/dist/platform/ops/connectors.ops.d.ts +15 -0
- package/dist/platform/ops/connectors.ops.js +126 -0
- package/dist/platform/ops/errors.d.ts +11 -0
- package/dist/platform/ops/errors.js +22 -0
- package/dist/platform/ops/extensions.ops.d.ts +19 -0
- package/dist/platform/ops/extensions.ops.js +116 -0
- package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
- package/dist/platform/ops/marketplaces.ops.js +157 -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 +23 -0
- package/dist/platform/ops/platform.ops.js +158 -0
- package/dist/platform/ops/plugins.ops.d.ts +33 -0
- package/dist/platform/ops/plugins.ops.js +377 -0
- package/dist/platform/ops/requests.ops.d.ts +14 -0
- package/dist/platform/ops/requests.ops.js +153 -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 +13 -0
- package/dist/platform/ops/skills.ops.js +98 -0
- package/dist/platform/ops/summary.d.ts +10 -0
- package/dist/platform/ops/summary.js +18 -0
- package/dist/platform/platform-ops.module.d.ts +7 -0
- package/dist/platform/platform-ops.module.js +55 -0
- package/dist/platform/platform.module.d.ts +8 -0
- package/dist/platform/platform.module.js +25 -0
- package/dist/platform/redact-orgs.d.ts +7 -0
- package/dist/platform/redact-orgs.js +52 -0
- package/dist/platform/registry.d.ts +30 -0
- package/dist/platform/registry.js +111 -0
- package/dist/roles/worker-role.d.ts +6 -4
- package/dist/roles/worker-role.js +14 -7
- package/dist/roles/worker.module.d.ts +1 -1
- package/dist/roles/worker.module.js +9 -1
- package/dist/runtime/context/build.d.ts +6 -4
- package/dist/runtime/context/build.js +26 -7
- package/dist/runtime/context/claude-tools.d.ts +2 -1
- package/dist/runtime/context/claude-tools.js +5 -4
- package/dist/runtime/context/compaction.js +9 -0
- package/dist/runtime/context/reminders.d.ts +2 -0
- package/dist/runtime/context/reminders.js +2 -0
- package/dist/runtime/context/skills.js +9 -2
- package/dist/runtime/context/tool-changes.d.ts +27 -0
- package/dist/runtime/context/tool-changes.js +60 -0
- package/dist/runtime/hook-calls.d.ts +8 -1
- package/dist/runtime/hook-calls.js +40 -7
- package/dist/runtime/langgraph-loop.d.ts +3 -1
- package/dist/runtime/langgraph-loop.js +35 -17
- package/dist/runtime/loop.d.ts +32 -4
- package/dist/runtime/maintenance.d.ts +7 -4
- package/dist/runtime/maintenance.js +23 -8
- package/dist/runtime/model-call.d.ts +38 -11
- package/dist/runtime/model-call.js +97 -24
- package/dist/runtime/providers.d.ts +146 -32
- package/dist/runtime/providers.js +321 -67
- package/dist/runtime/run-control.d.ts +11 -1
- package/dist/runtime/run-control.js +12 -0
- package/dist/runtime/run-drafts.d.ts +85 -0
- package/dist/runtime/run-drafts.js +230 -0
- package/dist/runtime/run-jobs.d.ts +3 -5
- package/dist/runtime/run-jobs.js +3 -7
- package/dist/runtime/run-queue.d.ts +37 -3
- package/dist/runtime/run-queue.js +188 -11
- package/dist/runtime/run-worker.d.ts +12 -6
- package/dist/runtime/run-worker.js +58 -35
- package/dist/runtime/runtime.module.js +3 -0
- package/dist/runtime/step-log.d.ts +9 -4
- package/dist/runtime/step-log.js +8 -5
- package/dist/runtime/stream.controller.d.ts +23 -1
- package/dist/runtime/stream.controller.js +60 -3
- package/dist/runtime/stream.d.ts +4 -1
- package/dist/runtime/stream.js +27 -3
- package/dist/runtime/subagents/child.d.ts +55 -7
- package/dist/runtime/subagents/child.js +105 -7
- package/dist/runtime/subagents/definition.d.ts +12 -3
- package/dist/runtime/subagents/definition.js +46 -32
- package/dist/runtime/subagents/deliveries.d.ts +71 -0
- package/dist/runtime/subagents/deliveries.js +228 -0
- package/dist/runtime/subagents/dispatch.d.ts +115 -26
- package/dist/runtime/subagents/dispatch.js +212 -141
- package/dist/runtime/subagents/limits.d.ts +24 -5
- package/dist/runtime/subagents/limits.js +40 -6
- package/dist/runtime/subagents/messages.d.ts +95 -0
- package/dist/runtime/subagents/messages.js +328 -0
- package/dist/runtime/subagents/preamble.d.ts +4 -4
- package/dist/runtime/subagents/preamble.js +9 -7
- package/dist/runtime/subagents/progress.d.ts +8 -6
- 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 +24 -7
- package/dist/runtime/subagents/roster.js +47 -11
- package/dist/runtime/subagents/skill-fork.d.ts +3 -2
- package/dist/runtime/subagents/skill-fork.js +8 -4
- 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 +7 -4
- package/dist/runtime/subagents/subagents.service.js +11 -6
- 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 +33 -38
- package/dist/runtime/usage-report.js +169 -96
- package/dist/runtime/waits.d.ts +140 -37
- package/dist/runtime/waits.js +394 -106
- package/dist/sandbox/jobs.d.ts +40 -13
- package/dist/sandbox/jobs.js +57 -20
- package/dist/sandbox/leases.d.ts +37 -54
- package/dist/sandbox/leases.js +71 -115
- package/dist/sandbox/providers.d.ts +2 -2
- package/dist/sandbox/providers.js +1 -1
- package/dist/sandbox/sandbox.module.d.ts +3 -2
- package/dist/sandbox/sandbox.module.js +4 -3
- package/dist/sandbox/sandbox.service.d.ts +229 -134
- package/dist/sandbox/sandbox.service.js +630 -409
- package/dist/skills/catalog.d.ts +3 -2
- package/dist/skills/catalog.js +21 -43
- package/dist/skills/changes.controller.d.ts +7 -0
- package/dist/skills/changes.controller.js +19 -1
- package/dist/skills/invoke.js +8 -3
- package/dist/skills/package.d.ts +20 -1
- package/dist/skills/package.js +28 -1
- package/dist/skills/skills.controller.d.ts +39 -4
- package/dist/skills/skills.controller.js +88 -10
- package/dist/skills/skills.module.js +10 -1
- package/dist/skills/skills.service.d.ts +106 -26
- package/dist/skills/skills.service.js +421 -75
- package/dist/skills/usable.d.ts +81 -0
- package/dist/skills/usable.js +379 -0
- package/dist/tools/approvals.service.d.ts +20 -2
- package/dist/tools/approvals.service.js +23 -4
- package/dist/tools/builtin-names.d.ts +21 -5
- package/dist/tools/builtin-names.js +30 -5
- package/dist/tools/builtins/agent.d.ts +23 -21
- package/dist/tools/builtins/agent.js +62 -55
- package/dist/tools/builtins/builtin-tools.d.ts +6 -2
- package/dist/tools/builtins/builtin-tools.js +37 -12
- package/dist/tools/builtins/handback.d.ts +28 -0
- package/dist/tools/builtins/handback.js +53 -0
- package/dist/tools/builtins/platform.d.ts +34 -0
- package/dist/tools/builtins/platform.js +362 -0
- package/dist/tools/builtins/sandbox/bash.js +13 -3
- package/dist/tools/builtins/sandbox/common.d.ts +43 -24
- package/dist/tools/builtins/sandbox/common.js +80 -45
- package/dist/tools/builtins/sandbox/edit.js +2 -2
- package/dist/tools/builtins/sandbox/glob.js +2 -2
- package/dist/tools/builtins/sandbox/grep.js +2 -4
- package/dist/tools/builtins/sandbox/index.d.ts +1 -1
- package/dist/tools/builtins/sandbox/index.js +1 -1
- package/dist/tools/builtins/sandbox/read.js +1 -1
- package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
- package/dist/tools/builtins/sandbox/task-output.js +30 -5
- package/dist/tools/builtins/sandbox/task-stop.js +2 -1
- package/dist/tools/builtins/sandbox/write.js +2 -2
- 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 +22 -14
- package/dist/tools/builtins/skill-load.js +86 -57
- package/dist/tools/builtins/skill-write.js +1 -1
- package/dist/tools/builtins/web/extract.js +5 -1
- package/dist/tools/builtins/web/fetch.js +1 -0
- package/dist/tools/builtins/web/search.js +1 -0
- package/dist/tools/connectors.controller.d.ts +10 -0
- package/dist/tools/connectors.controller.js +12 -0
- package/dist/tools/connectors.service.d.ts +46 -5
- package/dist/tools/connectors.service.js +94 -15
- 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 +42 -1
- package/dist/tools/info.js +64 -1
- package/dist/tools/org-tool-switches.d.ts +74 -0
- package/dist/tools/org-tool-switches.js +184 -0
- package/dist/tools/pipeline.d.ts +46 -40
- package/dist/tools/pipeline.js +193 -364
- package/dist/tools/policy.d.ts +1 -1
- package/dist/tools/policy.js +36 -16
- package/dist/tools/registry.d.ts +98 -5
- package/dist/tools/registry.js +87 -9
- package/dist/tools/tools.module.js +12 -2
- package/dist/ui/views.d.ts +2 -1
- package/dist/ui/views.js +17 -3
- package/package.json +3 -3
- 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/dist/catalog/upgrade-targets.d.ts +0 -56
- package/dist/catalog/upgrade-targets.js +0 -90
- package/dist/conversations/sandbox-status.d.ts +0 -24
- package/dist/conversations/sandbox-status.js +0 -52
- package/dist/extensions/org-config.controller.d.ts +0 -32
- package/dist/extensions/org-config.controller.js +0 -70
package/dist/skills/catalog.d.ts
CHANGED
|
@@ -64,7 +64,7 @@ export interface ResolvedSkill {
|
|
|
64
64
|
*/
|
|
65
65
|
export declare function resolveSkills(db: KernelSchemaDb, input: Omit<EffectiveSkillsInput, "conversationId"> & {
|
|
66
66
|
conversationId?: string;
|
|
67
|
-
}): Promise<ResolvedSkill[]>;
|
|
67
|
+
}, log?: Pick<Logger, "warn">): Promise<ResolvedSkill[]>;
|
|
68
68
|
/** A pinned skill to read: an effective skill the agent version pins. */
|
|
69
69
|
interface PinnedCandidate {
|
|
70
70
|
id: string;
|
|
@@ -81,7 +81,8 @@ interface PinnedCandidate {
|
|
|
81
81
|
*/
|
|
82
82
|
export declare function pinnedFailureText(e: ApiError): string;
|
|
83
83
|
/**
|
|
84
|
-
* Reads each pinned skill's SKILL.md from `kernel/<orgId>/<source>SKILL.md
|
|
84
|
+
* Reads each pinned skill's SKILL.md from `kernel/<orgId>/<source>SKILL.md` (a platform version's
|
|
85
|
+
* `platform:<prefix>` from `deployment/<prefix>SKILL.md`), verifies it against
|
|
85
86
|
* the manifest's size and sha256 and returns the parsed body, in order. Every failure throws
|
|
86
87
|
* `storage.unavailable` (Decision 9: the run fails before any model request):
|
|
87
88
|
* - a read error is retried once ({@link PINNED_READ_ATTEMPTS}), then is transient (the user
|
package/dist/skills/catalog.js
CHANGED
|
@@ -21,6 +21,7 @@ import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
|
21
21
|
import { CLAUDE_CODE_TOOL_MAP } from "../runtime/context/claude-tools.js";
|
|
22
22
|
import { sameSnapshot, } from "../runtime/context/skills.js";
|
|
23
23
|
import { StorageService } from "../storage/storage.service.js";
|
|
24
|
+
import { selectedSkills, skillFileStore } from "./usable.js";
|
|
24
25
|
/**
|
|
25
26
|
* 技能目录快照(M5 T14,Ruling M17):运行开始时解析「此刻对这个对话生效的技能」,与日志里最新一份快照不同才写
|
|
26
27
|
* `skills_catalog`。模型看到的目录与 `Skill` 的名字解析只来自日志,不读实时的库。
|
|
@@ -73,43 +74,18 @@ function forModel(all, input, log) {
|
|
|
73
74
|
* included and not truncated ({@link forModel} gives the model's part). Without
|
|
74
75
|
* `conversationId` (a conversation not created yet) no trial draft applies.
|
|
75
76
|
*/
|
|
76
|
-
export async function resolveSkills(db, input) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
.select([
|
|
85
|
-
"skills.id",
|
|
86
|
-
"skills.scope",
|
|
87
|
-
"skills.name",
|
|
88
|
-
"skills.current_version",
|
|
89
|
-
"skill_versions.manifest",
|
|
90
|
-
"skill_versions.object_prefix",
|
|
91
|
-
"skill_versions.source_format",
|
|
92
|
-
"catalog_items.name as item_name",
|
|
93
|
-
])
|
|
94
|
-
.where("skills.org_id", "=", input.orgId)
|
|
95
|
-
.where("skills.deleted_at", "is", null)
|
|
96
|
-
.where((eb) => {
|
|
97
|
-
const agentOwn = eb.and([
|
|
98
|
-
eb("skills.scope", "=", "agent"),
|
|
99
|
-
eb("skills.agent_id", "=", input.agentId),
|
|
100
|
-
]);
|
|
101
|
-
if (orgSkills.length === 0)
|
|
102
|
-
return agentOwn;
|
|
103
|
-
return eb.or([
|
|
104
|
-
agentOwn,
|
|
105
|
-
eb.and([eb("skills.scope", "=", "org"), eb("skills.id", "in", orgSkills)]),
|
|
106
|
-
]);
|
|
107
|
-
})
|
|
108
|
-
.execute();
|
|
77
|
+
export async function resolveSkills(db, input, log) {
|
|
78
|
+
// Phase 2 (Task 3): `orgSkills` ids may be org skills, org copies linked to a platform skill
|
|
79
|
+
// (served as its current version under the copy's id, ruling B2) or platform skill ids; only
|
|
80
|
+
// those usable in the org resolve (skills/usable.ts)
|
|
81
|
+
const rows = await selectedSkills(db, { orgId: input.orgId, agentId: input.agentId, orgSkills: input.agent.skills?.orgSkills ?? [] }, log);
|
|
82
|
+
// One skill per name: the agent's own, then an org skill or copy (an id the agent kept from
|
|
83
|
+
// before the platform component existed), then a platform skill id; ties by id
|
|
84
|
+
const rank = (r) => r.scope === "agent" ? 0 : r.platformSkillId === r.id ? 2 : 1;
|
|
109
85
|
const byName = new Map();
|
|
110
86
|
for (const r of rows) {
|
|
111
87
|
const prev = byName.get(r.name);
|
|
112
|
-
if (!prev || (
|
|
88
|
+
if (!prev || rank(r) < rank(prev))
|
|
113
89
|
byName.set(r.name, r);
|
|
114
90
|
}
|
|
115
91
|
const effective = new Map([...byName.values()].map((r) => [
|
|
@@ -118,12 +94,12 @@ export async function resolveSkills(db, input) {
|
|
|
118
94
|
skill: {
|
|
119
95
|
id: r.id,
|
|
120
96
|
name: r.name,
|
|
121
|
-
description: r.
|
|
122
|
-
version: r.
|
|
123
|
-
source: r.
|
|
124
|
-
...(r.
|
|
97
|
+
description: r.description,
|
|
98
|
+
version: r.version,
|
|
99
|
+
source: r.source,
|
|
100
|
+
...(r.plugin !== null && { plugin: r.plugin }),
|
|
125
101
|
},
|
|
126
|
-
format: r.
|
|
102
|
+
format: r.format,
|
|
127
103
|
manifest: r.manifest,
|
|
128
104
|
},
|
|
129
105
|
]));
|
|
@@ -210,7 +186,8 @@ export function pinnedFailureText(e) {
|
|
|
210
186
|
return "File storage is temporarily unavailable, so this agent's pinned skills cannot be read; send the message again later.";
|
|
211
187
|
}
|
|
212
188
|
/**
|
|
213
|
-
* Reads each pinned skill's SKILL.md from `kernel/<orgId>/<source>SKILL.md
|
|
189
|
+
* Reads each pinned skill's SKILL.md from `kernel/<orgId>/<source>SKILL.md` (a platform version's
|
|
190
|
+
* `platform:<prefix>` from `deployment/<prefix>SKILL.md`), verifies it against
|
|
214
191
|
* the manifest's size and sha256 and returns the parsed body, in order. Every failure throws
|
|
215
192
|
* `storage.unavailable` (Decision 9: the run fails before any model request):
|
|
216
193
|
* - a read error is retried once ({@link PINNED_READ_ATTEMPTS}), then is transient (the user
|
|
@@ -224,9 +201,10 @@ export async function loadPinnedBodies(storage, orgId, pinned, opts = {}) {
|
|
|
224
201
|
if (pinned.length === 0)
|
|
225
202
|
return [];
|
|
226
203
|
storage.assertAvailable();
|
|
227
|
-
const store = storage.kernel(orgId);
|
|
228
204
|
const out = [];
|
|
229
205
|
for (const p of pinned) {
|
|
206
|
+
// a platform version (`platform:<prefix>`) is read from deployment/ (ruling D2)
|
|
207
|
+
const { store, prefix } = skillFileStore(storage, orgId, p.source);
|
|
230
208
|
const unreadable = (problem) => {
|
|
231
209
|
opts.log?.error("pinned skill unreadable", {
|
|
232
210
|
orgId,
|
|
@@ -246,7 +224,7 @@ export async function loadPinnedBodies(storage, orgId, pinned, opts = {}) {
|
|
|
246
224
|
for (let attempt = 1; bytes === null; attempt++) {
|
|
247
225
|
let got;
|
|
248
226
|
try {
|
|
249
|
-
got = await store.get(`${
|
|
227
|
+
got = await store.get(`${prefix}${SKILL_ENTRY_FILE}`, opts.signal && { signal: opts.signal });
|
|
250
228
|
if (got)
|
|
251
229
|
bytes = new Uint8Array(await new Response(got.body).arrayBuffer());
|
|
252
230
|
}
|
|
@@ -390,7 +368,7 @@ let SkillsCatalogService = class SkillsCatalogService {
|
|
|
390
368
|
async record(input, opts = {}) {
|
|
391
369
|
const log = opts.log ?? this.log;
|
|
392
370
|
for (let attempt = 1; attempt <= RECORD_ATTEMPTS; attempt++) {
|
|
393
|
-
const all = await resolveSkills(this.db.db, input);
|
|
371
|
+
const all = await resolveSkills(this.db.db, input, attempt === 1 ? log : undefined);
|
|
394
372
|
// Warn about manual-only pins once, on the first attempt
|
|
395
373
|
const first = pinnedCandidates(forModel(all, input), input.agent, input, all, attempt === 1 ? log : undefined);
|
|
396
374
|
const pinned = fitPinned(await loadPinnedBodies(this.storage, input.orgId, first, { log }), log, input);
|
|
@@ -12,6 +12,9 @@ declare const DecideBody: z.ZodObject<{
|
|
|
12
12
|
}>;
|
|
13
13
|
note: z.ZodOptional<z.ZodString>;
|
|
14
14
|
}, z.core.$strict>;
|
|
15
|
+
declare const NoticeParamsSchema: z.ZodObject<{
|
|
16
|
+
id: z.ZodString;
|
|
17
|
+
}, z.core.$strip>;
|
|
15
18
|
/**
|
|
16
19
|
* 共享 agent 的技能变更申请(`/api/v1/orgs/:orgId/skill-changes`,M5 T15,R4)。动作 `approvals.decide`
|
|
17
20
|
* (访客起、仅限用户主体:agent / 服务令牌不能决定,R2);能否决定由服务按该 agent **当前的负责人**判定,
|
|
@@ -47,10 +50,14 @@ export declare class AgentSkillsController {
|
|
|
47
50
|
/**
|
|
48
51
|
* 收件箱(`GET /api/v1/orgs/:orgId/inbox`,计划取舍 C6:按类型汇总):当前用户待处理的工具审批与
|
|
49
52
|
* 能决定的技能变更,新的在前、最多 100 项(`truncated` 表示还有更多)。仅限用户主体。
|
|
53
|
+
* Org admins also see the org's open notices and dismiss them with
|
|
54
|
+
* `POST /api/v1/orgs/:orgId/inbox/notices/:id/dismiss`.
|
|
50
55
|
*/
|
|
51
56
|
export declare class InboxController {
|
|
52
57
|
private readonly inbox;
|
|
53
58
|
constructor(inbox: InboxService);
|
|
54
59
|
list(principal: Principal, org: OrgContext): Promise<InboxView>;
|
|
60
|
+
/** An org admin dismisses an org notice (`skill_renamed`) -> 204. */
|
|
61
|
+
dismissNotice(principal: Principal, org: OrgContext, params: z.infer<typeof NoticeParamsSchema>): Promise<void>;
|
|
55
62
|
}
|
|
56
63
|
export {};
|
|
@@ -13,7 +13,7 @@ import { AgentsService } from "../agents/agents.service.js";
|
|
|
13
13
|
import { CurrentPrincipal, patTokenId, requireUser, } from "../identity/principal.js";
|
|
14
14
|
import { InboxService } from "../inbox/inbox.service.js";
|
|
15
15
|
import { createZodDto } from "../infra/validation/create-zod-dto.js";
|
|
16
|
-
import { ZBody } from "../infra/validation/zod-params.js";
|
|
16
|
+
import { ZBody, ZParam } from "../infra/validation/zod-params.js";
|
|
17
17
|
import { CurrentOrg, OrgAction } from "../orgs/org.guard.js";
|
|
18
18
|
import { SkillChangesService, } from "./changes.service.js";
|
|
19
19
|
import { SkillsService } from "./skills.service.js";
|
|
@@ -25,6 +25,9 @@ const DecideBody = z
|
|
|
25
25
|
.strict();
|
|
26
26
|
class SkillChangeDecideBody extends createZodDto(DecideBody, "SkillChangeDecideBody") {
|
|
27
27
|
}
|
|
28
|
+
const NoticeParamsSchema = z.object({ id: z.string().min(1).max(100) });
|
|
29
|
+
class NoticeParams extends createZodDto(NoticeParamsSchema, "InboxNoticeParams") {
|
|
30
|
+
}
|
|
28
31
|
/**
|
|
29
32
|
* 共享 agent 的技能变更申请(`/api/v1/orgs/:orgId/skill-changes`,M5 T15,R4)。动作 `approvals.decide`
|
|
30
33
|
* (访客起、仅限用户主体:agent / 服务令牌不能决定,R2);能否决定由服务按该 agent **当前的负责人**判定,
|
|
@@ -118,6 +121,8 @@ export { AgentSkillsController };
|
|
|
118
121
|
/**
|
|
119
122
|
* 收件箱(`GET /api/v1/orgs/:orgId/inbox`,计划取舍 C6:按类型汇总):当前用户待处理的工具审批与
|
|
120
123
|
* 能决定的技能变更,新的在前、最多 100 项(`truncated` 表示还有更多)。仅限用户主体。
|
|
124
|
+
* Org admins also see the org's open notices and dismiss them with
|
|
125
|
+
* `POST /api/v1/orgs/:orgId/inbox/notices/:id/dismiss`.
|
|
121
126
|
*/
|
|
122
127
|
let InboxController = class InboxController {
|
|
123
128
|
inbox;
|
|
@@ -128,6 +133,11 @@ let InboxController = class InboxController {
|
|
|
128
133
|
const p = requireUser(principal);
|
|
129
134
|
return this.inbox.list(org.orgId, p.account.id);
|
|
130
135
|
}
|
|
136
|
+
/** An org admin dismisses an org notice (`skill_renamed`) -> 204. */
|
|
137
|
+
async dismissNotice(principal, org, params) {
|
|
138
|
+
const p = requireUser(principal);
|
|
139
|
+
await this.inbox.dismissNotice(org.orgId, p.account.id, params.id);
|
|
140
|
+
}
|
|
131
141
|
};
|
|
132
142
|
__decorate([
|
|
133
143
|
Get(),
|
|
@@ -135,6 +145,14 @@ __decorate([
|
|
|
135
145
|
__param(0, CurrentPrincipal()),
|
|
136
146
|
__param(1, CurrentOrg())
|
|
137
147
|
], InboxController.prototype, "list", null);
|
|
148
|
+
__decorate([
|
|
149
|
+
Post("notices/:id/dismiss"),
|
|
150
|
+
HttpCode(204),
|
|
151
|
+
OrgAction("approvals.decide"),
|
|
152
|
+
__param(0, CurrentPrincipal()),
|
|
153
|
+
__param(1, CurrentOrg()),
|
|
154
|
+
__param(2, ZParam(NoticeParams))
|
|
155
|
+
], InboxController.prototype, "dismissNotice", null);
|
|
138
156
|
InboxController = __decorate([
|
|
139
157
|
Controller("api/v1/orgs/:orgId/inbox"),
|
|
140
158
|
__param(0, Inject(InboxService))
|
package/dist/skills/invoke.js
CHANGED
|
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
8
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
9
|
};
|
|
10
|
-
import { escapeSkillInvocationTags, hasShellInjection, parseSkillMd, renderSkillBody, renderSkillInvocation, SKILL_ENTRY_FILE, SKILL_INVOCATION_LIMITS, } from "@capybara-hq/plugin-sdk";
|
|
10
|
+
import { escapeSkillInvocationTags, hasShellInjection, parseSkillMd, renderSkillBody, renderSkillInvocation, SKILL_ENTRY_FILE, SKILL_INVOCATION_LIMITS, skillDigest, } from "@capybara-hq/plugin-sdk";
|
|
11
11
|
import { Inject, Injectable } from "@nestjs/common";
|
|
12
12
|
import { AgentLookup } from "../agents/agent-lookup.js";
|
|
13
13
|
import { ApiError } from "../errors.js";
|
|
@@ -18,6 +18,7 @@ import { StorageService } from "../storage/storage.service.js";
|
|
|
18
18
|
import { BUILTIN } from "../tools/builtin-names.js";
|
|
19
19
|
import { findSkillVersion, readSkillFile, SkillIntegrityError, } from "../tools/builtins/skill-load.js";
|
|
20
20
|
import { invocationOf, resolveSkills } from "./catalog.js";
|
|
21
|
+
import { skillFileStore } from "./usable.js";
|
|
21
22
|
/** A leading `/<name>` or `/<plugin>:<name>`, then whitespace or the end (spec §3.2). */
|
|
22
23
|
const SLASH_COMMAND_RE = /^\/([a-z0-9-]+(?::[a-z0-9-]+)?)(?:\s|$)/;
|
|
23
24
|
/** `/name args` at the very start of a message, or null (`/etc/hosts`, ` /x`, `/Upper`). */
|
|
@@ -151,6 +152,7 @@ let SkillInvoker = class SkillInvoker {
|
|
|
151
152
|
const input = {
|
|
152
153
|
name: a.name,
|
|
153
154
|
skillName: found.skill.name,
|
|
155
|
+
digest: skillDigest(found.manifest.files),
|
|
154
156
|
version: found.skill.version,
|
|
155
157
|
body,
|
|
156
158
|
invocation: inv,
|
|
@@ -159,7 +161,7 @@ let SkillInvoker = class SkillInvoker {
|
|
|
159
161
|
};
|
|
160
162
|
// a SKILL.md whose body alone renders over the limit can never be invoked: say so, rather than
|
|
161
163
|
// "shorten the arguments"
|
|
162
|
-
tooLarge(found.skill.name, () => renderSkillBody(body, inv, "", found.skill.name));
|
|
164
|
+
tooLarge(found.skill.name, () => renderSkillBody(body, inv, "", found.skill.name, input.digest));
|
|
163
165
|
const args = a.args.trim();
|
|
164
166
|
const record = {
|
|
165
167
|
id: found.skill.id,
|
|
@@ -219,6 +221,7 @@ let SkillInvoker = class SkillInvoker {
|
|
|
219
221
|
const task = (child) => renderSkillInvocation({
|
|
220
222
|
name: skill.name,
|
|
221
223
|
skillName: skill.name,
|
|
224
|
+
digest: skillDigest(found.manifest.files),
|
|
222
225
|
version: skill.version,
|
|
223
226
|
body,
|
|
224
227
|
invocation: inv,
|
|
@@ -254,7 +257,9 @@ let SkillInvoker = class SkillInvoker {
|
|
|
254
257
|
this.storage.assertAvailable();
|
|
255
258
|
let bytes;
|
|
256
259
|
try {
|
|
257
|
-
|
|
260
|
+
// a platform version (`platform:<prefix>`) is read from deployment/ (ruling D2)
|
|
261
|
+
const { store, prefix } = skillFileStore(this.storage, orgId, r.skill.source);
|
|
262
|
+
bytes = await readSkillFile(store, `${prefix}${SKILL_ENTRY_FILE}`, md);
|
|
258
263
|
}
|
|
259
264
|
catch (e) {
|
|
260
265
|
if (e instanceof SkillIntegrityError)
|
package/dist/skills/package.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type SkillInvocation } from "@capybara-hq/plugin-sdk";
|
|
2
|
+
import type { SkillManifest } from "../db/kernel-schema.js";
|
|
2
3
|
/**
|
|
3
4
|
* 技能包(zip)解包与校验。zip 一律当作恶意输入:
|
|
4
5
|
*
|
|
@@ -45,7 +46,7 @@ export interface SkillPackage {
|
|
|
45
46
|
export declare function storedInvocation(i: SkillInvocation): SkillInvocation | undefined;
|
|
46
47
|
/**
|
|
47
48
|
* Invalid zip or skill content (`problems` lists each one, in English). Independent of HTTP: a
|
|
48
|
-
* skill upload maps it to `skill.invalid_package`,
|
|
49
|
+
* skill upload maps it to `skill.invalid_package`, a platform catalog import to
|
|
49
50
|
* `catalog.invalid_manifest`.
|
|
50
51
|
*/
|
|
51
52
|
export declare class SkillArchiveError extends Error {
|
|
@@ -85,3 +86,21 @@ export declare function checkSkillFiles(files: SkillPackageFile[], opts?: {
|
|
|
85
86
|
* 不合法 → {@link SkillArchiveError}。
|
|
86
87
|
*/
|
|
87
88
|
export declare function readZipFiles(bytes: Uint8Array, maxBytes: number): Promise<SkillPackageFile[]>;
|
|
89
|
+
/**
|
|
90
|
+
* Checks skill files that are already unpacked (paths relative to the skill root), e.g. the ones
|
|
91
|
+
* built from text, with the rules of {@link readSkillPackage}. Invalid -> `skill.invalid_package`.
|
|
92
|
+
*/
|
|
93
|
+
export declare function checkBuiltSkillFiles(files: SkillPackageFile[]): SkillPackage;
|
|
94
|
+
/** A validated skill package: its name, description, files and invocation. */
|
|
95
|
+
export interface SkillPackageInput {
|
|
96
|
+
name: string;
|
|
97
|
+
description: string;
|
|
98
|
+
files: SkillPackageFile[];
|
|
99
|
+
/** Phase D: stored in the manifest when it is not the default. */
|
|
100
|
+
invocation?: SkillInvocation;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The stored manifest of a skill package (the invocation only when it is not the default); org
|
|
104
|
+
* skills and platform skills store the same shape.
|
|
105
|
+
*/
|
|
106
|
+
export declare function skillManifest(pkg: SkillPackageInput): SkillManifest;
|
package/dist/skills/package.js
CHANGED
|
@@ -48,7 +48,7 @@ export function storedInvocation(i) {
|
|
|
48
48
|
const ignored = (path) => path.startsWith("__MACOSX/") || path === ".DS_Store" || path.endsWith("/.DS_Store");
|
|
49
49
|
/**
|
|
50
50
|
* Invalid zip or skill content (`problems` lists each one, in English). Independent of HTTP: a
|
|
51
|
-
* skill upload maps it to `skill.invalid_package`,
|
|
51
|
+
* skill upload maps it to `skill.invalid_package`, a platform catalog import to
|
|
52
52
|
* `catalog.invalid_manifest`.
|
|
53
53
|
*/
|
|
54
54
|
export class SkillArchiveError extends Error {
|
|
@@ -225,3 +225,30 @@ export async function readZipFiles(bytes, maxBytes) {
|
|
|
225
225
|
}
|
|
226
226
|
return raw;
|
|
227
227
|
}
|
|
228
|
+
/**
|
|
229
|
+
* Checks skill files that are already unpacked (paths relative to the skill root), e.g. the ones
|
|
230
|
+
* built from text, with the rules of {@link readSkillPackage}. Invalid -> `skill.invalid_package`.
|
|
231
|
+
*/
|
|
232
|
+
export function checkBuiltSkillFiles(files) {
|
|
233
|
+
try {
|
|
234
|
+
return { ...checkSkillFiles(files), files };
|
|
235
|
+
}
|
|
236
|
+
catch (e) {
|
|
237
|
+
if (e instanceof SkillArchiveError)
|
|
238
|
+
throw invalid(e.problems);
|
|
239
|
+
throw e;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* The stored manifest of a skill package (the invocation only when it is not the default); org
|
|
244
|
+
* skills and platform skills store the same shape.
|
|
245
|
+
*/
|
|
246
|
+
export function skillManifest(pkg) {
|
|
247
|
+
const invocation = pkg.invocation && storedInvocation(pkg.invocation);
|
|
248
|
+
return {
|
|
249
|
+
name: pkg.name,
|
|
250
|
+
description: pkg.description,
|
|
251
|
+
files: pkg.files.map(({ path, size, sha256 }) => ({ path, size, sha256 })),
|
|
252
|
+
...(invocation !== undefined && { invocation }),
|
|
253
|
+
};
|
|
254
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { OwnedItems, type OwnedSkillDeletePreview } from "../catalog/owned-items.js";
|
|
2
3
|
import { type CreatedAttachment } from "../conversations/attachments.service.js";
|
|
3
4
|
import { type Principal } from "../identity/principal.js";
|
|
4
5
|
import { type OrgContext } from "../orgs/org.guard.js";
|
|
@@ -8,7 +9,17 @@ declare const UploadBody: z.ZodObject<{
|
|
|
8
9
|
size: z.ZodNumber;
|
|
9
10
|
}, z.core.$strict>;
|
|
10
11
|
declare const CreateBody: z.ZodObject<{
|
|
11
|
-
uploadId: z.ZodString
|
|
12
|
+
uploadId: z.ZodOptional<z.ZodString>;
|
|
13
|
+
name: z.ZodOptional<z.ZodString & z.ZodType<string, string, z.core.$ZodTypeInternals<string, string>>>;
|
|
14
|
+
description: z.ZodOptional<z.ZodString>;
|
|
15
|
+
body: z.ZodOptional<z.ZodString>;
|
|
16
|
+
shareable: z.ZodOptional<z.ZodBoolean>;
|
|
17
|
+
}, z.core.$strict>;
|
|
18
|
+
declare const IdParams: z.ZodObject<{
|
|
19
|
+
id: z.ZodString;
|
|
20
|
+
}, z.core.$strip>;
|
|
21
|
+
declare const ShareableBody: z.ZodObject<{
|
|
22
|
+
shareable: z.ZodBoolean;
|
|
12
23
|
}, z.core.$strict>;
|
|
13
24
|
/**
|
|
14
25
|
* The org skill library (`/api/v1/orgs/:orgId/skills`, human users only):
|
|
@@ -21,20 +32,44 @@ declare const CreateBody: z.ZodObject<{
|
|
|
21
32
|
* `POST /attachments/:id/finalize`, or skip it and let the next step finalize);
|
|
22
33
|
* 3. `POST /` `{ uploadId }` unpacks and checks it, creating a skill or adding a version to the
|
|
23
34
|
* skill with the same name;
|
|
24
|
-
* `DELETE /:id` soft-deletes (the web asks for confirmation, R3
|
|
35
|
+
* `DELETE /:id` soft-deletes (the web asks for confirmation, R3; `GET /:id/delete-preview` says
|
|
36
|
+
* what it does), `PUT /:id/shareable` sets 可共享 (plugin scope phase 3, ruling P3-6).
|
|
25
37
|
* When the deployment setting `customSkills` is deny, registering an upload and creating both
|
|
26
38
|
* return 403 `catalog.custom_disabled` (decided in the service, re-checked inside the org row lock
|
|
27
|
-
* on create); installing skills from the
|
|
39
|
+
* on create); installing skills from the platform catalog is unaffected.
|
|
28
40
|
*/
|
|
29
41
|
export declare class SkillsController {
|
|
30
42
|
private readonly skills;
|
|
31
|
-
|
|
43
|
+
/** The org's own items: 可共享 and the delete of a promoted skill (rulings P3-3, P3-19). */
|
|
44
|
+
private readonly owned;
|
|
45
|
+
constructor(skills: SkillsService,
|
|
46
|
+
/** The org's own items: 可共享 and the delete of a promoted skill (rulings P3-3, P3-19). */
|
|
47
|
+
owned: OwnedItems);
|
|
32
48
|
createUpload(principal: Principal, org: OrgContext, body: z.infer<typeof UploadBody>): Promise<CreatedAttachment>;
|
|
33
49
|
create(principal: Principal, org: OrgContext, body: z.infer<typeof CreateBody>): Promise<UploadedSkill>;
|
|
34
50
|
list(principal: Principal, org: OrgContext): Promise<{
|
|
35
51
|
skills: SkillSummary[];
|
|
36
52
|
}>;
|
|
37
53
|
get(principal: Principal, org: OrgContext, id: string): Promise<SkillDetail>;
|
|
54
|
+
/**
|
|
55
|
+
* Sets 可共享 on the org's own skill (`{ shareable }` -> 200 `{ id, shareable }`): only an org
|
|
56
|
+
* skill of the org's own (P3-6: an agent's skill or a copy of another owner's platform skill ->
|
|
57
|
+
* 409 `catalog.not_owned`); one it promoted writes its platform row too (ruling P3-2).
|
|
58
|
+
*/
|
|
59
|
+
setShareable(principal: Principal, org: OrgContext, params: z.infer<typeof IdParams>, body: z.infer<typeof ShareableBody>): Promise<{
|
|
60
|
+
id: string;
|
|
61
|
+
shareable: boolean;
|
|
62
|
+
}>;
|
|
63
|
+
/**
|
|
64
|
+
* What deleting the skill does (pre-flight F19, P3-19; nothing written): `outcome`
|
|
65
|
+
* `transferred` when it was shared and another org uses it (`orgs`), else `removed`; `agents`
|
|
66
|
+
* the org's agents that lose it.
|
|
67
|
+
*/
|
|
68
|
+
deletePreview(principal: Principal, org: OrgContext, params: z.infer<typeof IdParams>): Promise<OwnedSkillDeletePreview>;
|
|
69
|
+
/**
|
|
70
|
+
* Soft-deletes the skill; one the org shared that another org uses is transferred to the
|
|
71
|
+
* platform first (P3-19, platform notice `ownership_transferred`). 204.
|
|
72
|
+
*/
|
|
38
73
|
remove(principal: Principal, org: OrgContext, id: string): Promise<void>;
|
|
39
74
|
}
|
|
40
75
|
export {};
|
|
@@ -7,14 +7,16 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
8
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
9
|
};
|
|
10
|
-
import { hasControlChars, MEDIA_NAME_MAX_CHARS } from "@capybara-hq/plugin-sdk";
|
|
11
|
-
import { Controller, Delete, Get, HttpCode, Inject, Param, Post } from "@nestjs/common";
|
|
10
|
+
import { hasControlChars, isSkillName, MEDIA_NAME_MAX_CHARS, SKILL_LIMITS, } from "@capybara-hq/plugin-sdk";
|
|
11
|
+
import { Controller, Delete, Get, HttpCode, Inject, Param, Post, Put } from "@nestjs/common";
|
|
12
12
|
import { z } from "zod";
|
|
13
|
+
import { OwnedItems } from "../catalog/owned-items.js";
|
|
13
14
|
import { SKILL_PACKAGE_UPLOAD_MAX_BYTES, } from "../conversations/attachments.service.js";
|
|
14
15
|
import { CurrentPrincipal, patTokenId, requireUser, } from "../identity/principal.js";
|
|
15
16
|
import { createZodDto } from "../infra/validation/create-zod-dto.js";
|
|
16
|
-
import { ZBody } from "../infra/validation/zod-params.js";
|
|
17
|
+
import { ZBody, ZParam } from "../infra/validation/zod-params.js";
|
|
17
18
|
import { CurrentOrg, OrgAction } from "../orgs/org.guard.js";
|
|
19
|
+
import { SKILL_WRITE_MAX_BYTES } from "../tools/builtins/skill-write.js";
|
|
18
20
|
import { SkillsService, } from "./skills.service.js";
|
|
19
21
|
const UploadBody = z
|
|
20
22
|
.object({
|
|
@@ -26,11 +28,31 @@ const UploadBody = z
|
|
|
26
28
|
size: z.number().int().min(1).max(SKILL_PACKAGE_UPLOAD_MAX_BYTES),
|
|
27
29
|
})
|
|
28
30
|
.strict();
|
|
29
|
-
const CreateBody = z
|
|
31
|
+
const CreateBody = z
|
|
32
|
+
.object({
|
|
33
|
+
uploadId: z.string().min(1).max(100).optional(),
|
|
34
|
+
name: z
|
|
35
|
+
.string()
|
|
36
|
+
.refine(isSkillName, "name must be 1-64 lowercase letters, digits and single hyphens")
|
|
37
|
+
.optional(),
|
|
38
|
+
description: z.string().min(1).max(SKILL_LIMITS.descriptionMaxChars).optional(),
|
|
39
|
+
body: z.string().max(SKILL_WRITE_MAX_BYTES).optional(),
|
|
40
|
+
shareable: z.boolean().optional(),
|
|
41
|
+
})
|
|
42
|
+
.strict()
|
|
43
|
+
.refine((v) => v.uploadId !== undefined
|
|
44
|
+
? v.name === undefined && v.description === undefined && v.body === undefined
|
|
45
|
+
: v.name !== undefined && v.description !== undefined && v.body !== undefined, "send either { uploadId } or { name, description, body }");
|
|
30
46
|
class SkillUploadBody extends createZodDto(UploadBody, "SkillUploadBody") {
|
|
31
47
|
}
|
|
32
48
|
class SkillCreateBody extends createZodDto(CreateBody, "SkillCreateBody") {
|
|
33
49
|
}
|
|
50
|
+
const IdParams = z.object({ id: z.string().min(1).max(100) });
|
|
51
|
+
const ShareableBody = z.object({ shareable: z.boolean() }).strict();
|
|
52
|
+
class SkillIdParams extends createZodDto(IdParams, "SkillIdParams") {
|
|
53
|
+
}
|
|
54
|
+
class SkillShareableBody extends createZodDto(ShareableBody, "SkillShareableBody") {
|
|
55
|
+
}
|
|
34
56
|
/**
|
|
35
57
|
* The org skill library (`/api/v1/orgs/:orgId/skills`, human users only):
|
|
36
58
|
* - read: `skills.read` (member and up) — `GET /` list, `GET /:id` detail (versions and file
|
|
@@ -42,15 +64,20 @@ class SkillCreateBody extends createZodDto(CreateBody, "SkillCreateBody") {
|
|
|
42
64
|
* `POST /attachments/:id/finalize`, or skip it and let the next step finalize);
|
|
43
65
|
* 3. `POST /` `{ uploadId }` unpacks and checks it, creating a skill or adding a version to the
|
|
44
66
|
* skill with the same name;
|
|
45
|
-
* `DELETE /:id` soft-deletes (the web asks for confirmation, R3
|
|
67
|
+
* `DELETE /:id` soft-deletes (the web asks for confirmation, R3; `GET /:id/delete-preview` says
|
|
68
|
+
* what it does), `PUT /:id/shareable` sets 可共享 (plugin scope phase 3, ruling P3-6).
|
|
46
69
|
* When the deployment setting `customSkills` is deny, registering an upload and creating both
|
|
47
70
|
* return 403 `catalog.custom_disabled` (decided in the service, re-checked inside the org row lock
|
|
48
|
-
* on create); installing skills from the
|
|
71
|
+
* on create); installing skills from the platform catalog is unaffected.
|
|
49
72
|
*/
|
|
50
73
|
let SkillsController = class SkillsController {
|
|
51
74
|
skills;
|
|
52
|
-
|
|
75
|
+
owned;
|
|
76
|
+
constructor(skills,
|
|
77
|
+
/** The org's own items: 可共享 and the delete of a promoted skill (rulings P3-3, P3-19). */
|
|
78
|
+
owned) {
|
|
53
79
|
this.skills = skills;
|
|
80
|
+
this.owned = owned;
|
|
54
81
|
}
|
|
55
82
|
async createUpload(principal, org, body) {
|
|
56
83
|
const p = requireUser(principal);
|
|
@@ -58,7 +85,17 @@ let SkillsController = class SkillsController {
|
|
|
58
85
|
}
|
|
59
86
|
async create(principal, org, body) {
|
|
60
87
|
const p = requireUser(principal);
|
|
61
|
-
|
|
88
|
+
const tokenId = patTokenId(p);
|
|
89
|
+
if (body.uploadId !== undefined) {
|
|
90
|
+
return this.skills.upload(org.orgId, p.account.id, body.uploadId, tokenId, body.shareable);
|
|
91
|
+
}
|
|
92
|
+
return this.skills.createFromText(org.orgId, p.account.id, {
|
|
93
|
+
name: body.name,
|
|
94
|
+
description: body.description,
|
|
95
|
+
body: body.body,
|
|
96
|
+
...(body.shareable !== undefined && { shareable: body.shareable }),
|
|
97
|
+
...(tokenId !== undefined && { actorTokenId: tokenId }),
|
|
98
|
+
});
|
|
62
99
|
}
|
|
63
100
|
async list(principal, org) {
|
|
64
101
|
requireUser(principal);
|
|
@@ -68,9 +105,34 @@ let SkillsController = class SkillsController {
|
|
|
68
105
|
requireUser(principal);
|
|
69
106
|
return this.skills.get(org.orgId, id);
|
|
70
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Sets 可共享 on the org's own skill (`{ shareable }` -> 200 `{ id, shareable }`): only an org
|
|
110
|
+
* skill of the org's own (P3-6: an agent's skill or a copy of another owner's platform skill ->
|
|
111
|
+
* 409 `catalog.not_owned`); one it promoted writes its platform row too (ruling P3-2).
|
|
112
|
+
*/
|
|
113
|
+
async setShareable(principal, org, params, body) {
|
|
114
|
+
const p = requireUser(principal);
|
|
115
|
+
const tokenId = patTokenId(p);
|
|
116
|
+
await this.owned.setShareable(org.orgId, p.account.id, { kind: "skill", id: params.id }, body.shareable, tokenId !== undefined ? { actorTokenId: tokenId } : {});
|
|
117
|
+
return { id: params.id, shareable: body.shareable };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* What deleting the skill does (pre-flight F19, P3-19; nothing written): `outcome`
|
|
121
|
+
* `transferred` when it was shared and another org uses it (`orgs`), else `removed`; `agents`
|
|
122
|
+
* the org's agents that lose it.
|
|
123
|
+
*/
|
|
124
|
+
async deletePreview(principal, org, params) {
|
|
125
|
+
requireUser(principal);
|
|
126
|
+
return this.owned.previewSkillDelete(org.orgId, params.id);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Soft-deletes the skill; one the org shared that another org uses is transferred to the
|
|
130
|
+
* platform first (P3-19, platform notice `ownership_transferred`). 204.
|
|
131
|
+
*/
|
|
71
132
|
async remove(principal, org, id) {
|
|
72
133
|
const p = requireUser(principal);
|
|
73
|
-
|
|
134
|
+
const tokenId = patTokenId(p);
|
|
135
|
+
await this.owned.deleteSkill(org.orgId, p.account.id, id, tokenId !== undefined ? { actorTokenId: tokenId } : {});
|
|
74
136
|
}
|
|
75
137
|
};
|
|
76
138
|
__decorate([
|
|
@@ -100,6 +162,21 @@ __decorate([
|
|
|
100
162
|
__param(1, CurrentOrg()),
|
|
101
163
|
__param(2, Param("id"))
|
|
102
164
|
], SkillsController.prototype, "get", null);
|
|
165
|
+
__decorate([
|
|
166
|
+
Put(":id/shareable"),
|
|
167
|
+
OrgAction("skills.manage"),
|
|
168
|
+
__param(0, CurrentPrincipal()),
|
|
169
|
+
__param(1, CurrentOrg()),
|
|
170
|
+
__param(2, ZParam(SkillIdParams)),
|
|
171
|
+
__param(3, ZBody(SkillShareableBody))
|
|
172
|
+
], SkillsController.prototype, "setShareable", null);
|
|
173
|
+
__decorate([
|
|
174
|
+
Get(":id/delete-preview"),
|
|
175
|
+
OrgAction("skills.manage"),
|
|
176
|
+
__param(0, CurrentPrincipal()),
|
|
177
|
+
__param(1, CurrentOrg()),
|
|
178
|
+
__param(2, ZParam(SkillIdParams))
|
|
179
|
+
], SkillsController.prototype, "deletePreview", null);
|
|
103
180
|
__decorate([
|
|
104
181
|
Delete(":id"),
|
|
105
182
|
HttpCode(204),
|
|
@@ -110,6 +187,7 @@ __decorate([
|
|
|
110
187
|
], SkillsController.prototype, "remove", null);
|
|
111
188
|
SkillsController = __decorate([
|
|
112
189
|
Controller("api/v1/orgs/:orgId/skills"),
|
|
113
|
-
__param(0, Inject(SkillsService))
|
|
190
|
+
__param(0, Inject(SkillsService)),
|
|
191
|
+
__param(1, Inject(OwnedItems))
|
|
114
192
|
], SkillsController);
|
|
115
193
|
export { SkillsController };
|
|
@@ -6,6 +6,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
6
6
|
};
|
|
7
7
|
import { Module } from "@nestjs/common";
|
|
8
8
|
import { AgentLookupModule } from "../agents/agent-lookup.js";
|
|
9
|
+
import { CatalogImportModule } from "../catalog/catalog-import.module.js";
|
|
9
10
|
import { AttachmentsModule } from "../conversations/attachments.module.js";
|
|
10
11
|
import { EventLogModule } from "../conversations/event-log.js";
|
|
11
12
|
import { OrgLockModule } from "../orgs/org-lock.js";
|
|
@@ -22,7 +23,15 @@ let SkillsModule = class SkillsModule {
|
|
|
22
23
|
};
|
|
23
24
|
SkillsModule = __decorate([
|
|
24
25
|
Module({
|
|
25
|
-
imports: [
|
|
26
|
+
imports: [
|
|
27
|
+
StorageModule,
|
|
28
|
+
OrgLockModule,
|
|
29
|
+
EventLogModule,
|
|
30
|
+
AttachmentsModule,
|
|
31
|
+
AgentLookupModule,
|
|
32
|
+
// the owner's new version of a skill it promoted goes to the platform row (ruling P3-4)
|
|
33
|
+
CatalogImportModule,
|
|
34
|
+
],
|
|
26
35
|
providers: [SkillsService, SkillChangesService, SkillsCatalogService, SkillInvoker],
|
|
27
36
|
exports: [SkillsService, SkillChangesService, SkillsCatalogService, SkillInvoker],
|
|
28
37
|
})
|