@capybara-hq/kernel 0.1.0-rc.4 → 0.1.0-rc.5
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 +39 -13
- package/dist/admin/admin.controller.js +33 -17
- 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 +51 -22
- package/dist/agents/agents.service.js +172 -70
- 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/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/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 +6 -2
- package/dist/config/schema.js +46 -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 +69 -12
- package/dist/conversations/conversations.service.js +106 -27
- 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 +5 -0
- package/dist/ctx/create-ctx.js +15 -5
- package/dist/db/kernel-schema.d.ts +362 -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 +82 -2
- package/dist/errors.js +82 -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 +16 -4
- package/dist/evals/step-replay.d.ts +2 -5
- package/dist/evals/step-replay.js +1 -1
- 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/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 +8 -2
- package/dist/extensions/hooks.d.ts +37 -4
- package/dist/extensions/hooks.js +82 -16
- package/dist/extensions/host.d.ts +19 -1
- package/dist/extensions/host.js +30 -7
- 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/files/previewers.d.ts +8 -1
- package/dist/files/previewers.js +35 -6
- package/dist/http/api.module.js +23 -3
- package/dist/http/app.d.ts +11 -2
- package/dist/http/app.js +31 -5
- 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 +21 -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 +11 -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/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 +20 -9
- package/dist/models/purposes.js +17 -8
- 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 +1387 -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.js +2 -0
- 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 +30 -8
- package/dist/runtime/model-call.js +69 -19
- 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 +11 -5
- package/dist/runtime/run-worker.js +54 -31
- 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 +43 -29
- 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.js +17 -12
- 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 +187 -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/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
|
@@ -12,7 +12,8 @@ import { connectorToolKey, ToolError, } from "@capybara-hq/plugin-sdk";
|
|
|
12
12
|
import { Inject, Injectable } from "@nestjs/common";
|
|
13
13
|
import { sql } from "kysely";
|
|
14
14
|
import { z } from "zod";
|
|
15
|
-
import {
|
|
15
|
+
import { connectorTemplateState } from "../catalog/component-state.js";
|
|
16
|
+
import { assertItemInstallable } from "../catalog/request-rules.js";
|
|
16
17
|
import { ApiError } from "../errors.js";
|
|
17
18
|
import { ExtensionRegistry } from "../extensions/registry.js";
|
|
18
19
|
import { audit } from "../identity/audit.js";
|
|
@@ -142,6 +143,34 @@ let ConnectorsService = class ConnectorsService {
|
|
|
142
143
|
.executeTakeFirst();
|
|
143
144
|
return row !== undefined;
|
|
144
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* The first free default name and slug ({@link CreateConnectorInput.slugDefault}), read in the
|
|
148
|
+
* caller's transaction under the org lock.
|
|
149
|
+
*/
|
|
150
|
+
async freeName(t, orgId, d) {
|
|
151
|
+
const base = deriveSlug(d.name ?? d.display) ?? deriveSlug(d.display);
|
|
152
|
+
if (base === null) {
|
|
153
|
+
throw fail("slug", `Cannot derive a slug from the name; provide one. ${SLUG_RULE}`);
|
|
154
|
+
}
|
|
155
|
+
const taken = new Set((await t
|
|
156
|
+
.selectFrom("connectors")
|
|
157
|
+
.select("slug")
|
|
158
|
+
.where("org_id", "=", orgId)
|
|
159
|
+
.where("deleted_at", "is", null)
|
|
160
|
+
.execute()).map((r) => r.slug));
|
|
161
|
+
for (const m of this.extensions.manifests())
|
|
162
|
+
taken.add(m.name);
|
|
163
|
+
for (let n = 1;; n++) {
|
|
164
|
+
const suffix = n === 1 ? "" : `_${n}`;
|
|
165
|
+
const slug = `${base.slice(0, 24 - suffix.length).replace(/_+$/, "")}${suffix}`;
|
|
166
|
+
if (!isValidSlug(slug) || taken.has(slug))
|
|
167
|
+
continue;
|
|
168
|
+
const nth = ` ${n}`;
|
|
169
|
+
const name = d.name ??
|
|
170
|
+
(n === 1 ? d.display : `${[...d.display].slice(0, 80 - nth.length).join("")}${nth}`);
|
|
171
|
+
return { name: [...name].slice(0, 80).join(""), slug };
|
|
172
|
+
}
|
|
173
|
+
}
|
|
145
174
|
resolveSlug(input) {
|
|
146
175
|
if (input.slug !== undefined) {
|
|
147
176
|
if (!isValidSlug(input.slug))
|
|
@@ -253,7 +282,8 @@ let ConnectorsService = class ConnectorsService {
|
|
|
253
282
|
checkCreateInput(actorAccountId, input) {
|
|
254
283
|
const slug = this.resolveSlug(input);
|
|
255
284
|
const endpoint = this.parseEndpoint(input.connector, input.endpoint);
|
|
256
|
-
|
|
285
|
+
// a defaulted slug skips plugin names itself (`freeName`)
|
|
286
|
+
if (!input.slugDefault && this.extensions.manifests().some((m) => m.name === slug)) {
|
|
257
287
|
throw fail("slug", `Slug "${slug}" is the name of an installed plugin; choose another`);
|
|
258
288
|
}
|
|
259
289
|
const auth = input.auth;
|
|
@@ -311,21 +341,21 @@ let ConnectorsService = class ConnectorsService {
|
|
|
311
341
|
// 自建被禁止时先拒绝(事务里再复核一次):不该为此触发外连
|
|
312
342
|
if (!input.template)
|
|
313
343
|
await assertCustomAllowed(this.db, "customConnectors");
|
|
344
|
+
await this.assertKindAvailable(orgId, input.connector);
|
|
314
345
|
const { slug, endpoint, owner, secret } = this.checkCreateInput(actorAccountId, input);
|
|
315
346
|
const id = randomUUID();
|
|
316
347
|
const auth = input.auth;
|
|
317
348
|
const publicUrl = this.config.get().http.publicUrl;
|
|
318
|
-
// 先做不需要连接的检查:冲突的 slug 不该触发一次外连
|
|
319
|
-
if (await this.slugTaken(this.db, orgId, slug)) {
|
|
349
|
+
// 先做不需要连接的检查:冲突的 slug 不该触发一次外连 (a defaulted slug is chosen under the lock)
|
|
350
|
+
if (!input.slugDefault && (await this.slugTaken(this.db, orgId, slug))) {
|
|
320
351
|
throw new ApiError("connector.slug_taken", "Connector slug is already taken");
|
|
321
352
|
}
|
|
322
353
|
const oauth = isOAuth(auth)
|
|
323
354
|
? await this.prepareOAuth(auth, endpoint, input.credential, publicUrl)
|
|
324
355
|
: undefined;
|
|
325
|
-
let
|
|
326
|
-
let issues = [];
|
|
356
|
+
let listed;
|
|
327
357
|
if (auth.type !== "oauth_code") {
|
|
328
|
-
|
|
358
|
+
listed = await this.drift.listTools(input.connector, endpoint, async () => {
|
|
329
359
|
if (auth.type === "none")
|
|
330
360
|
return { headers: {} };
|
|
331
361
|
if (oauth?.tokens) {
|
|
@@ -335,7 +365,6 @@ let ConnectorsService = class ConnectorsService {
|
|
|
335
365
|
throw new CredentialMissing(id, auth.ownership);
|
|
336
366
|
return this.credentials.injectionFor(id, auth, secret);
|
|
337
367
|
}, { orgId, slug });
|
|
338
|
-
({ rows, issues } = snapshot(slug, listed.specs, listed.resources));
|
|
339
368
|
}
|
|
340
369
|
return this.createIn(orgId, actorAccountId, input, actorTokenId, {
|
|
341
370
|
id,
|
|
@@ -344,13 +373,12 @@ let ConnectorsService = class ConnectorsService {
|
|
|
344
373
|
owner,
|
|
345
374
|
secret,
|
|
346
375
|
oauth,
|
|
347
|
-
|
|
348
|
-
issues,
|
|
376
|
+
listed,
|
|
349
377
|
});
|
|
350
378
|
}
|
|
351
379
|
/** The org-locked, re-checked insert of {@link create} (the outbound checks ran before). */
|
|
352
380
|
async createIn(orgId, actorAccountId, input, actorTokenId, c) {
|
|
353
|
-
const { id,
|
|
381
|
+
const { id, endpoint, owner, secret, oauth } = c;
|
|
354
382
|
const auth = input.auth;
|
|
355
383
|
const t = this.db;
|
|
356
384
|
await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "connectors.manage");
|
|
@@ -359,22 +387,53 @@ let ConnectorsService = class ConnectorsService {
|
|
|
359
387
|
}
|
|
360
388
|
else
|
|
361
389
|
await assertCustomAllowed(t, "customConnectors");
|
|
362
|
-
|
|
390
|
+
let slug = c.slug;
|
|
391
|
+
let name = input.name;
|
|
392
|
+
if (input.slugDefault)
|
|
393
|
+
({ slug, name } = await this.freeName(t, orgId, input.slugDefault));
|
|
394
|
+
else if (await this.slugTaken(t, orgId, slug)) {
|
|
363
395
|
throw new ApiError("connector.slug_taken", "Connector slug is already taken");
|
|
364
396
|
}
|
|
397
|
+
// the snapshot's keys name the final slug
|
|
398
|
+
const { rows, issues } = c.listed === undefined
|
|
399
|
+
? { rows: [], issues: [] }
|
|
400
|
+
: snapshot(slug, c.listed.specs, c.listed.resources);
|
|
401
|
+
// A connector made from a platform connector template stays linked to it (ruling E2)
|
|
402
|
+
const tpl = input.template;
|
|
403
|
+
const platformTemplate = tpl?.templateId !== undefined
|
|
404
|
+
? await t
|
|
405
|
+
.selectFrom("platform_connector_templates")
|
|
406
|
+
.select("id")
|
|
407
|
+
.where("catalog_item_id", "=", tpl.itemId)
|
|
408
|
+
.where("template_id", "=", tpl.templateId)
|
|
409
|
+
.where("deleted_at", "is", null)
|
|
410
|
+
.executeTakeFirst()
|
|
411
|
+
: undefined;
|
|
412
|
+
if (tpl?.mustBeOn) {
|
|
413
|
+
const state = platformTemplate === undefined
|
|
414
|
+
? "absent"
|
|
415
|
+
: await connectorTemplateState(t, orgId, platformTemplate.id);
|
|
416
|
+
if (state === "absent") {
|
|
417
|
+
throw new ApiError("component.not_found", "The connector template does not exist or is not available in this organization");
|
|
418
|
+
}
|
|
419
|
+
if (state === "off") {
|
|
420
|
+
throw new ApiError("component.off", "This connector template is off in this organization; switch it (or its plugin) on first");
|
|
421
|
+
}
|
|
422
|
+
}
|
|
365
423
|
await t
|
|
366
424
|
.insertInto("connectors")
|
|
367
425
|
.values({
|
|
368
426
|
id,
|
|
369
427
|
org_id: orgId,
|
|
370
428
|
slug,
|
|
371
|
-
name
|
|
429
|
+
name,
|
|
372
430
|
connector: input.connector,
|
|
373
431
|
endpoint: JSON.stringify(endpoint),
|
|
374
432
|
auth: JSON.stringify(auth),
|
|
375
433
|
created_by: actorAccountId,
|
|
376
434
|
catalog_item_id: input.template?.itemId ?? null,
|
|
377
435
|
catalog_version: input.template?.version ?? null,
|
|
436
|
+
platform_template_id: platformTemplate?.id ?? null,
|
|
378
437
|
// 授权码连接器安装时没有快照:模板的默认策略留到首个快照时应用
|
|
379
438
|
template_tool_policies: input.template?.defaultToolPolicies
|
|
380
439
|
? JSON.stringify(input.template.defaultToolPolicies)
|
|
@@ -418,7 +477,7 @@ let ConnectorsService = class ConnectorsService {
|
|
|
418
477
|
return { connector: await this.detail(t, orgId, id, actorAccountId), issues };
|
|
419
478
|
}
|
|
420
479
|
/**
|
|
421
|
-
* Checks a template update before anything is written (
|
|
480
|
+
* Checks a template update before anything is written (the platform plugin update): the endpoint
|
|
422
481
|
* against the connector's schema, and with `resetCredentials` the new credential's shape, or for
|
|
423
482
|
* OAuth the client setup (discovery, dynamic registration or the client credentials token; an
|
|
424
483
|
* outbound failure -> 502 `connector.connect_failed`). Writes nothing.
|
|
@@ -534,6 +593,21 @@ let ConnectorsService = class ConnectorsService {
|
|
|
534
593
|
},
|
|
535
594
|
});
|
|
536
595
|
}
|
|
596
|
+
/** Refuses a loaded kind whose extension is not enabled in the org (the same notion as {@link kinds}). */
|
|
597
|
+
async assertKindAvailable(orgId, kind) {
|
|
598
|
+
if (!this.registry.findConnector(kind))
|
|
599
|
+
return; // unknown kinds fail in parseEndpoint
|
|
600
|
+
if (!(await this.registry.connectorKindAvailable(orgId, kind))) {
|
|
601
|
+
throw new ApiError("connector.kind_unavailable", `Connector kind "${kind}" is not enabled for this organization; enable its plugin first`);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* The connector kinds the org can create connectors of (the install wizard's protocol step): a
|
|
606
|
+
* kind is listed when its `connector@1` extension is loaded and enabled in the org.
|
|
607
|
+
*/
|
|
608
|
+
kinds(orgId) {
|
|
609
|
+
return this.registry.connectorKindsFor(orgId);
|
|
610
|
+
}
|
|
537
611
|
/**
|
|
538
612
|
* Previews a connector (Ruling A20, for the install wizard): after checking the connector, the
|
|
539
613
|
* endpoint (credential pattern check included) and the credential shape, reads the endpoint
|
|
@@ -548,6 +622,7 @@ let ConnectorsService = class ConnectorsService {
|
|
|
548
622
|
async preview(orgId, input) {
|
|
549
623
|
// 部署禁止组织自建连接器时也不替组织去连任意端点(目录安装不走预览)
|
|
550
624
|
await assertCustomAllowed(this.db, "customConnectors");
|
|
625
|
+
await this.assertKindAvailable(orgId, input.connector);
|
|
551
626
|
const endpoint = this.parseEndpoint(input.connector, input.endpoint);
|
|
552
627
|
const connector = this.registry.findConnector(input.connector);
|
|
553
628
|
if (!connector)
|
|
@@ -684,6 +759,7 @@ let ConnectorsService = class ConnectorsService {
|
|
|
684
759
|
endpoint: endpointView(r.endpoint),
|
|
685
760
|
auth: r.auth,
|
|
686
761
|
status: r.status,
|
|
762
|
+
platformTemplateId: r.platform_template_id ?? null,
|
|
687
763
|
createdBy: r.created_by,
|
|
688
764
|
createdAt: r.created_at,
|
|
689
765
|
updatedAt: r.updated_at,
|
|
@@ -721,6 +797,7 @@ let ConnectorsService = class ConnectorsService {
|
|
|
721
797
|
return {
|
|
722
798
|
name: t.name,
|
|
723
799
|
key: connectorToolKey(r.slug, t.name),
|
|
800
|
+
title: typeof spec.title === "string" ? spec.title : null,
|
|
724
801
|
description: spec.description,
|
|
725
802
|
inputSchema: spec.inputSchema,
|
|
726
803
|
annotations: spec.annotations ?? null,
|
|
@@ -891,7 +968,9 @@ let ConnectorsService = class ConnectorsService {
|
|
|
891
968
|
* 在调用方事务里软删除连接器(调用方已锁组织行并按需复核角色;应用安装的回滚与卸载用):删全部凭据与授权,
|
|
892
969
|
* 审计 `connector.deleted`(`reason` 并进 detail)。已删除 / 不存在 → `connector.not_found`。
|
|
893
970
|
*/
|
|
894
|
-
async removeIn(orgId, connectorId,
|
|
971
|
+
async removeIn(orgId, connectorId,
|
|
972
|
+
/** null: the kernel itself (the plugin scope sync uninstalling a plugin). */
|
|
973
|
+
actorAccountId, actorTokenId, reason) {
|
|
895
974
|
const t = this.db;
|
|
896
975
|
const app = await this.row(t, orgId, connectorId, true);
|
|
897
976
|
await t
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type OrgContext } from "../orgs/org.guard.js";
|
|
2
|
+
import { type ExtensionToolsOffer, OrgExtensionTools } from "./info.js";
|
|
3
|
+
/**
|
|
4
|
+
* `GET /api/v1/orgs/:orgId/tools/extensions` (`agents.use`) → `{ extensions }`: the tools of the
|
|
5
|
+
* extensions enabled in the org, grouped by extension, for the agent form's Tools section (it adds
|
|
6
|
+
* or removes `{kind:"plugin",plugin,name}` references). Display only; nothing here is model-visible.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ExtensionToolsController {
|
|
9
|
+
private readonly tools;
|
|
10
|
+
constructor(tools: OrgExtensionTools);
|
|
11
|
+
extensions(org: OrgContext): Promise<{
|
|
12
|
+
extensions: ExtensionToolsOffer[];
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
};
|
|
10
|
+
import { Controller, Get, Header, Inject } from "@nestjs/common";
|
|
11
|
+
import { CurrentOrg, OrgAction } from "../orgs/org.guard.js";
|
|
12
|
+
import { OrgExtensionTools } from "./info.js";
|
|
13
|
+
/**
|
|
14
|
+
* `GET /api/v1/orgs/:orgId/tools/extensions` (`agents.use`) → `{ extensions }`: the tools of the
|
|
15
|
+
* extensions enabled in the org, grouped by extension, for the agent form's Tools section (it adds
|
|
16
|
+
* or removes `{kind:"plugin",plugin,name}` references). Display only; nothing here is model-visible.
|
|
17
|
+
*/
|
|
18
|
+
let ExtensionToolsController = class ExtensionToolsController {
|
|
19
|
+
tools;
|
|
20
|
+
constructor(tools) {
|
|
21
|
+
this.tools = tools;
|
|
22
|
+
}
|
|
23
|
+
async extensions(org) {
|
|
24
|
+
return { extensions: await this.tools.list(org.orgId) };
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
__decorate([
|
|
28
|
+
Get("extensions"),
|
|
29
|
+
Header("cache-control", "private, no-store"),
|
|
30
|
+
OrgAction("agents.use"),
|
|
31
|
+
__param(0, CurrentOrg())
|
|
32
|
+
], ExtensionToolsController.prototype, "extensions", null);
|
|
33
|
+
ExtensionToolsController = __decorate([
|
|
34
|
+
Controller("api/v1/orgs/:orgId/tools"),
|
|
35
|
+
__param(0, Inject(OrgExtensionTools))
|
|
36
|
+
], ExtensionToolsController);
|
|
37
|
+
export { ExtensionToolsController };
|
package/dist/tools/info.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { type LocalizedName } from "@capybara-hq/plugin-sdk";
|
|
1
|
+
import { type LocalizedName, type ToolAnnotations } from "@capybara-hq/plugin-sdk";
|
|
2
2
|
import { ConversationAccess } from "../conversations/access.js";
|
|
3
3
|
import type { KernelSchemaDb } from "../db/kernel-schema.js";
|
|
4
4
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
5
|
+
import { OrgToolSwitches } from "./org-tool-switches.js";
|
|
5
6
|
import { ToolRegistry } from "./registry.js";
|
|
6
7
|
/**
|
|
7
8
|
* Tool presentation metadata for the conversation page (UI refresh B, design spec §6.16.9): the
|
|
@@ -84,3 +85,43 @@ export declare class ConversationToolInfo {
|
|
|
84
85
|
access: Pick<ConversationAccess, "isAccessible">);
|
|
85
86
|
get(orgId: string, conversationId: string, viewerAccountId: string, keys: readonly string[]): Promise<ToolInfo[]>;
|
|
86
87
|
}
|
|
88
|
+
/** One tool of {@link OrgExtensionTools}. Display only, for the agent form. */
|
|
89
|
+
export interface ExtensionToolOffer {
|
|
90
|
+
/** The tool's registered name (the `name` of a `{kind:"plugin"}` reference). */
|
|
91
|
+
name: string;
|
|
92
|
+
/** The model-visible key, `plugin__<plugin>__<name>` (the `toolPolicies` key). */
|
|
93
|
+
key: string;
|
|
94
|
+
/** The declared display title (`ToolSpec.title`), or null. */
|
|
95
|
+
title: string | null;
|
|
96
|
+
/** The first non-empty line of the tool's description (English, model-facing text). */
|
|
97
|
+
description: string;
|
|
98
|
+
annotations: ToolAnnotations;
|
|
99
|
+
/** The tool's default policy: its `defaultPolicy`, else derived from the annotations. */
|
|
100
|
+
defaultPolicy: "allow" | "ask";
|
|
101
|
+
/**
|
|
102
|
+
* The org turned this tool off (layering spec A §7): still listed, so the form shows it as
|
|
103
|
+
* unavailable in the agents that selected it.
|
|
104
|
+
*/
|
|
105
|
+
switchedOff: boolean;
|
|
106
|
+
}
|
|
107
|
+
/** One extension of {@link OrgExtensionTools} with its tools, in registration order. */
|
|
108
|
+
export interface ExtensionToolsOffer {
|
|
109
|
+
plugin: string;
|
|
110
|
+
/** The plugin's catalog display name, else its name. */
|
|
111
|
+
displayName: LocalizedName;
|
|
112
|
+
tools: ExtensionToolOffer[];
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* `GET /orgs/:orgId/tools/extensions`: the tools an agent of this org can reference by
|
|
116
|
+
* `{kind:"plugin"}` and get at run time, grouped by extension: the extensions loaded on this
|
|
117
|
+
* replica and enabled in the org (`enabled.ts`, through the host), each with the tools it
|
|
118
|
+
* registered whose key is valid (`ToolRegistry.forAgent` reports the others unavailable); a tool
|
|
119
|
+
* the org turned off is listed with `switchedOff`.
|
|
120
|
+
*/
|
|
121
|
+
export declare class OrgExtensionTools {
|
|
122
|
+
private readonly db;
|
|
123
|
+
private readonly registry;
|
|
124
|
+
private readonly switches;
|
|
125
|
+
constructor(db: KernelDb, registry: Pick<ToolRegistry, "extensionToolSpecs" | "enabledExtensions">, switches: Pick<OrgToolSwitches, "offKeys">);
|
|
126
|
+
list(orgId: string): Promise<ExtensionToolsOffer[]>;
|
|
127
|
+
}
|
package/dist/tools/info.js
CHANGED
|
@@ -16,7 +16,9 @@ import { UUID_RE } from "../ui/registry.js";
|
|
|
16
16
|
import { BUILTIN_TOOL_KINDS, SANDBOX_TOOL_NAMES } from "./builtin-names.js";
|
|
17
17
|
import { pluginDisplayNames } from "./display-names.js";
|
|
18
18
|
import { isLegacyBuiltinKey, LEGACY_BUILTINS } from "./legacy-keys.js";
|
|
19
|
-
import {
|
|
19
|
+
import { toolKeyIssue } from "./naming.js";
|
|
20
|
+
import { OrgToolSwitches } from "./org-tool-switches.js";
|
|
21
|
+
import { policyFromAnnotations, ToolRegistry } from "./registry.js";
|
|
20
22
|
export { BUILTIN_TOOL_KINDS } from "./builtin-names.js";
|
|
21
23
|
/** At most this many keys per request, each at most {@link TOOL_INFO_KEY_MAX} characters. */
|
|
22
24
|
export const TOOL_INFO_MAX_KEYS = 100;
|
|
@@ -160,3 +162,64 @@ ConversationToolInfo = __decorate([
|
|
|
160
162
|
__param(2, Inject(ConversationAccess))
|
|
161
163
|
], ConversationToolInfo);
|
|
162
164
|
export { ConversationToolInfo };
|
|
165
|
+
/**
|
|
166
|
+
* `GET /orgs/:orgId/tools/extensions`: the tools an agent of this org can reference by
|
|
167
|
+
* `{kind:"plugin"}` and get at run time, grouped by extension: the extensions loaded on this
|
|
168
|
+
* replica and enabled in the org (`enabled.ts`, through the host), each with the tools it
|
|
169
|
+
* registered whose key is valid (`ToolRegistry.forAgent` reports the others unavailable); a tool
|
|
170
|
+
* the org turned off is listed with `switchedOff`.
|
|
171
|
+
*/
|
|
172
|
+
let OrgExtensionTools = class OrgExtensionTools {
|
|
173
|
+
db;
|
|
174
|
+
registry;
|
|
175
|
+
switches;
|
|
176
|
+
constructor(db, registry, switches) {
|
|
177
|
+
this.db = db;
|
|
178
|
+
this.registry = registry;
|
|
179
|
+
this.switches = switches;
|
|
180
|
+
}
|
|
181
|
+
async list(orgId) {
|
|
182
|
+
const [enabled, off] = await Promise.all([
|
|
183
|
+
this.registry.enabledExtensions(orgId),
|
|
184
|
+
this.switches.offKeys(orgId),
|
|
185
|
+
]);
|
|
186
|
+
const groups = new Map();
|
|
187
|
+
for (const t of this.registry.extensionToolSpecs()) {
|
|
188
|
+
if (!enabled.has(t.plugin))
|
|
189
|
+
continue;
|
|
190
|
+
const key = extensionToolKey(t.plugin, t.spec.name);
|
|
191
|
+
if (toolKeyIssue(key) !== null)
|
|
192
|
+
continue;
|
|
193
|
+
const tools = groups.get(t.plugin) ?? [];
|
|
194
|
+
if (tools.some((x) => x.name === t.spec.name))
|
|
195
|
+
continue;
|
|
196
|
+
tools.push({
|
|
197
|
+
name: t.spec.name,
|
|
198
|
+
key,
|
|
199
|
+
title: display(t.spec).title,
|
|
200
|
+
description: firstLine(t.spec.description),
|
|
201
|
+
annotations: { ...(t.spec.annotations ?? {}) },
|
|
202
|
+
defaultPolicy: t.spec.defaultPolicy ?? policyFromAnnotations(t.spec.annotations),
|
|
203
|
+
switchedOff: off.has(key),
|
|
204
|
+
});
|
|
205
|
+
groups.set(t.plugin, tools);
|
|
206
|
+
}
|
|
207
|
+
const names = await pluginDisplayNames(this.db.db, [...groups.keys()]);
|
|
208
|
+
return [...groups].map(([plugin, tools]) => ({
|
|
209
|
+
plugin,
|
|
210
|
+
displayName: names.get(plugin) ?? { zh: plugin, en: plugin },
|
|
211
|
+
tools,
|
|
212
|
+
}));
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
OrgExtensionTools = __decorate([
|
|
216
|
+
Injectable(),
|
|
217
|
+
__param(0, Inject(KernelDb)),
|
|
218
|
+
__param(1, Inject(ToolRegistry)),
|
|
219
|
+
__param(2, Inject(OrgToolSwitches))
|
|
220
|
+
], OrgExtensionTools);
|
|
221
|
+
export { OrgExtensionTools };
|
|
222
|
+
const firstLine = (s) => (typeof s === "string" ? s : "")
|
|
223
|
+
.split("\n")
|
|
224
|
+
.map((l) => l.trim())
|
|
225
|
+
.find((l) => l !== "") ?? "";
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { ExtensionHost } from "../extensions/host.js";
|
|
2
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
3
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
4
|
+
import { OrgLock } from "../orgs/org-lock.js";
|
|
5
|
+
/** One tool of an extension with its switch in the org. */
|
|
6
|
+
export interface OrgToolSwitch {
|
|
7
|
+
tool: string;
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** An org agent whose current version selects the tool being switched off. */
|
|
11
|
+
export interface AffectedAgent {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The result of {@link OrgToolSwitches.set}: the PCM §5 rule 8 preview of a switch-off (the org's
|
|
17
|
+
* agents that selected the tool and the hash to confirm it with), or the switch applied.
|
|
18
|
+
*/
|
|
19
|
+
export type OrgToolSwitchResult = {
|
|
20
|
+
applied: false;
|
|
21
|
+
affectedAgents: AffectedAgent[];
|
|
22
|
+
confirm: string;
|
|
23
|
+
} | {
|
|
24
|
+
applied: true;
|
|
25
|
+
};
|
|
26
|
+
/** Model-visible (English): why a turned-off extension tool is not offered. */
|
|
27
|
+
export declare const toolTurnedOffReason: (key: string) => string;
|
|
28
|
+
/**
|
|
29
|
+
* Per-org switches of single extension tools (layering spec A §7, table `org_tool_switches`): an
|
|
30
|
+
* org admin turns off one tool an extension registers (`ctx.tools.register`); it is then not
|
|
31
|
+
* offered to any agent of the org (`ToolRegistry.forAgent`) and refused if called
|
|
32
|
+
* (`ToolPipeline`). No row means on. A row of a tool the extension stops registering is kept and
|
|
33
|
+
* applies again if the tool comes back. Builtin and connector tools are out of scope. Read from PG
|
|
34
|
+
* on every use, no in-process state.
|
|
35
|
+
*/
|
|
36
|
+
export declare class OrgToolSwitches {
|
|
37
|
+
private readonly kdb;
|
|
38
|
+
readonly txHost: TransactionHost;
|
|
39
|
+
private readonly host;
|
|
40
|
+
/** The org row lock: re-checks `org.extensions.manage` under the lock. */
|
|
41
|
+
private readonly orgLock;
|
|
42
|
+
constructor(kdb: KernelDb, txHost: TransactionHost, host: Pick<ExtensionHost, "tools">,
|
|
43
|
+
/** The org row lock: re-checks `org.extensions.manage` under the lock. */
|
|
44
|
+
orgLock: Pick<OrgLock, "lockAndAuthorize">);
|
|
45
|
+
private get db();
|
|
46
|
+
/** The tool names `plugin` registers on this replica, in registration order. */
|
|
47
|
+
private registered;
|
|
48
|
+
/**
|
|
49
|
+
* The tools of an extension the org sees: running here and visible under plugin scope, else 404
|
|
50
|
+
* `extension.not_found` (an invisible one is answered like an unknown one).
|
|
51
|
+
*/
|
|
52
|
+
private toolsFor;
|
|
53
|
+
/** The stored switches of the org (all extensions, or one), `false` ones only matter. */
|
|
54
|
+
private offRows;
|
|
55
|
+
/** Every tool the extension registers on this replica with its switch (default on). */
|
|
56
|
+
list(orgId: string, plugin: string): Promise<OrgToolSwitch[]>;
|
|
57
|
+
/** The model-visible keys (`plugin__<extension>__<tool>`) of the tools turned off in the org. */
|
|
58
|
+
offKeys(orgId: string): Promise<Set<string>>;
|
|
59
|
+
/** Whether the org turned off this tool. */
|
|
60
|
+
isToolOff(orgId: string, plugin: string, tool: string): Promise<boolean>;
|
|
61
|
+
/**
|
|
62
|
+
* Switches one tool in the org. On applies at once. Off, while the tool is on: without
|
|
63
|
+
* `confirm` the preview (the org's agents whose current version selects the tool) and its hash,
|
|
64
|
+
* with the current hash the switch is written (a changed preview -> 409 `plugin.switch_stale`).
|
|
65
|
+
* A tool the extension does not register -> 404 `extension.tool_not_found`. A change writes the
|
|
66
|
+
* audit row `extension.tool_switched`.
|
|
67
|
+
*/
|
|
68
|
+
set(orgId: string, plugin: string, tool: string, enabled: boolean, actor: {
|
|
69
|
+
accountId: string;
|
|
70
|
+
tokenId?: string | undefined;
|
|
71
|
+
}, confirm?: string): Promise<OrgToolSwitchResult>;
|
|
72
|
+
/** The org's live agents whose current version selects `{kind:"plugin", plugin, name: tool}`. */
|
|
73
|
+
private agentsSelecting;
|
|
74
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
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
|
+
};
|
|
10
|
+
import { createHash } from "node:crypto";
|
|
11
|
+
import { extensionToolKey } from "@capybara-hq/plugin-sdk";
|
|
12
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
13
|
+
import { sql } from "kysely";
|
|
14
|
+
import { ApiError } from "../errors.js";
|
|
15
|
+
import { ExtensionHost } from "../extensions/host.js";
|
|
16
|
+
import { extensionVisibleTo } from "../extensions/org-config.js";
|
|
17
|
+
import { audit } from "../identity/audit.js";
|
|
18
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
19
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
20
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
21
|
+
import { OrgLock } from "../orgs/org-lock.js";
|
|
22
|
+
/** Model-visible (English): why a turned-off extension tool is not offered. */
|
|
23
|
+
export const toolTurnedOffReason = (key) => `Tool ${key} is turned off in this organization`;
|
|
24
|
+
/** The confirm hash of a switch-off preview. */
|
|
25
|
+
function switchOffHash(orgId, plugin, tool, agents) {
|
|
26
|
+
return createHash("sha256")
|
|
27
|
+
.update(JSON.stringify({ orgId, plugin, tool, agents: agents.map((a) => a.id) }))
|
|
28
|
+
.digest("hex");
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Per-org switches of single extension tools (layering spec A §7, table `org_tool_switches`): an
|
|
32
|
+
* org admin turns off one tool an extension registers (`ctx.tools.register`); it is then not
|
|
33
|
+
* offered to any agent of the org (`ToolRegistry.forAgent`) and refused if called
|
|
34
|
+
* (`ToolPipeline`). No row means on. A row of a tool the extension stops registering is kept and
|
|
35
|
+
* applies again if the tool comes back. Builtin and connector tools are out of scope. Read from PG
|
|
36
|
+
* on every use, no in-process state.
|
|
37
|
+
*/
|
|
38
|
+
let OrgToolSwitches = class OrgToolSwitches {
|
|
39
|
+
kdb;
|
|
40
|
+
txHost;
|
|
41
|
+
host;
|
|
42
|
+
orgLock;
|
|
43
|
+
constructor(kdb, txHost, host,
|
|
44
|
+
/** The org row lock: re-checks `org.extensions.manage` under the lock. */
|
|
45
|
+
orgLock) {
|
|
46
|
+
this.kdb = kdb;
|
|
47
|
+
this.txHost = txHost;
|
|
48
|
+
this.host = host;
|
|
49
|
+
this.orgLock = orgLock;
|
|
50
|
+
}
|
|
51
|
+
get db() {
|
|
52
|
+
return this.kdb.db;
|
|
53
|
+
}
|
|
54
|
+
/** The tool names `plugin` registers on this replica, in registration order. */
|
|
55
|
+
registered(plugin) {
|
|
56
|
+
return [
|
|
57
|
+
...new Set(this.host
|
|
58
|
+
.tools()
|
|
59
|
+
.filter((t) => t.plugin === plugin)
|
|
60
|
+
.map((t) => t.spec.name)),
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* The tools of an extension the org sees: running here and visible under plugin scope, else 404
|
|
65
|
+
* `extension.not_found` (an invisible one is answered like an unknown one).
|
|
66
|
+
*/
|
|
67
|
+
async toolsFor(orgId, plugin) {
|
|
68
|
+
const tools = this.registered(plugin);
|
|
69
|
+
if (tools.length === 0 || !(await extensionVisibleTo(this.db, orgId, plugin))) {
|
|
70
|
+
throw new ApiError("extension.not_found", `Extension ${plugin} is not installed`);
|
|
71
|
+
}
|
|
72
|
+
return tools;
|
|
73
|
+
}
|
|
74
|
+
/** The stored switches of the org (all extensions, or one), `false` ones only matter. */
|
|
75
|
+
async offRows(orgId, plugin) {
|
|
76
|
+
let q = this.db
|
|
77
|
+
.selectFrom("org_tool_switches")
|
|
78
|
+
.select(["plugin", "tool"])
|
|
79
|
+
.where("org_id", "=", orgId)
|
|
80
|
+
.where("enabled", "=", false);
|
|
81
|
+
if (plugin !== undefined)
|
|
82
|
+
q = q.where("plugin", "=", plugin);
|
|
83
|
+
return q.execute();
|
|
84
|
+
}
|
|
85
|
+
/** Every tool the extension registers on this replica with its switch (default on). */
|
|
86
|
+
async list(orgId, plugin) {
|
|
87
|
+
const tools = await this.toolsFor(orgId, plugin);
|
|
88
|
+
const off = new Set((await this.offRows(orgId, plugin)).map((r) => r.tool));
|
|
89
|
+
return tools.map((tool) => ({ tool, enabled: !off.has(tool) }));
|
|
90
|
+
}
|
|
91
|
+
/** The model-visible keys (`plugin__<extension>__<tool>`) of the tools turned off in the org. */
|
|
92
|
+
async offKeys(orgId) {
|
|
93
|
+
return new Set((await this.offRows(orgId)).map((r) => extensionToolKey(r.plugin, r.tool)));
|
|
94
|
+
}
|
|
95
|
+
/** Whether the org turned off this tool. */
|
|
96
|
+
async isToolOff(orgId, plugin, tool) {
|
|
97
|
+
const row = await this.db
|
|
98
|
+
.selectFrom("org_tool_switches")
|
|
99
|
+
.select("enabled")
|
|
100
|
+
.where("org_id", "=", orgId)
|
|
101
|
+
.where("plugin", "=", plugin)
|
|
102
|
+
.where("tool", "=", tool)
|
|
103
|
+
.executeTakeFirst();
|
|
104
|
+
return row?.enabled === false;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Switches one tool in the org. On applies at once. Off, while the tool is on: without
|
|
108
|
+
* `confirm` the preview (the org's agents whose current version selects the tool) and its hash,
|
|
109
|
+
* with the current hash the switch is written (a changed preview -> 409 `plugin.switch_stale`).
|
|
110
|
+
* A tool the extension does not register -> 404 `extension.tool_not_found`. A change writes the
|
|
111
|
+
* audit row `extension.tool_switched`.
|
|
112
|
+
*/
|
|
113
|
+
async set(orgId, plugin, tool, enabled, actor, confirm) {
|
|
114
|
+
await this.orgLock.lockAndAuthorize(orgId, actor.accountId, "org.extensions.manage");
|
|
115
|
+
const tools = await this.toolsFor(orgId, plugin);
|
|
116
|
+
if (!tools.includes(tool)) {
|
|
117
|
+
throw new ApiError("extension.tool_not_found", `Extension ${plugin} does not register a tool named ${tool}`);
|
|
118
|
+
}
|
|
119
|
+
const from = !(await this.isToolOff(orgId, plugin, tool));
|
|
120
|
+
if (from === enabled)
|
|
121
|
+
return { applied: true };
|
|
122
|
+
if (!enabled) {
|
|
123
|
+
const affectedAgents = await this.agentsSelecting(orgId, plugin, tool);
|
|
124
|
+
const hash = switchOffHash(orgId, plugin, tool, affectedAgents);
|
|
125
|
+
if (confirm === undefined)
|
|
126
|
+
return { applied: false, affectedAgents, confirm: hash };
|
|
127
|
+
if (confirm !== hash) {
|
|
128
|
+
throw new ApiError("plugin.switch_stale", "What switching this tool off affects has changed; review it and confirm again");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
await this.db
|
|
132
|
+
.insertInto("org_tool_switches")
|
|
133
|
+
.values({ org_id: orgId, plugin, tool, enabled, updated_by: actor.accountId })
|
|
134
|
+
.onConflict((oc) => oc.columns(["org_id", "plugin", "tool"]).doUpdateSet({
|
|
135
|
+
enabled,
|
|
136
|
+
updated_by: actor.accountId,
|
|
137
|
+
updated_at: sql `now()`,
|
|
138
|
+
}))
|
|
139
|
+
.execute();
|
|
140
|
+
await audit(this.db, {
|
|
141
|
+
actorAccountId: actor.accountId,
|
|
142
|
+
...(actor.tokenId !== undefined && { actorTokenId: actor.tokenId }),
|
|
143
|
+
orgId,
|
|
144
|
+
action: "extension.tool_switched",
|
|
145
|
+
target: extensionToolKey(plugin, tool),
|
|
146
|
+
detail: { plugin, tool, from, to: enabled },
|
|
147
|
+
});
|
|
148
|
+
return { applied: true };
|
|
149
|
+
}
|
|
150
|
+
/** The org's live agents whose current version selects `{kind:"plugin", plugin, name: tool}`. */
|
|
151
|
+
async agentsSelecting(orgId, plugin, tool) {
|
|
152
|
+
const rows = await this.db
|
|
153
|
+
.selectFrom("agents as a")
|
|
154
|
+
.innerJoin("agent_versions as v", (j) => j.onRef("v.agent_id", "=", "a.id").onRef("v.version", "=", "a.current_version"))
|
|
155
|
+
.select(["a.id", "v.definition"])
|
|
156
|
+
.where("a.org_id", "=", orgId)
|
|
157
|
+
.where("a.deleted_at", "is", null)
|
|
158
|
+
.orderBy("a.id")
|
|
159
|
+
.execute();
|
|
160
|
+
const out = [];
|
|
161
|
+
for (const r of rows) {
|
|
162
|
+
const def = r.definition;
|
|
163
|
+
const refs = Array.isArray(def?.tools) ? def.tools : [];
|
|
164
|
+
const selects = refs.some((x) => {
|
|
165
|
+
const ref = x;
|
|
166
|
+
return ref?.kind === "plugin" && ref.plugin === plugin && ref.name === tool;
|
|
167
|
+
});
|
|
168
|
+
if (selects)
|
|
169
|
+
out.push({ id: r.id, name: typeof def?.name === "string" ? def.name : r.id });
|
|
170
|
+
}
|
|
171
|
+
return out;
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
__decorate([
|
|
175
|
+
Transactional()
|
|
176
|
+
], OrgToolSwitches.prototype, "set", null);
|
|
177
|
+
OrgToolSwitches = __decorate([
|
|
178
|
+
Injectable(),
|
|
179
|
+
__param(0, Inject(KernelDb)),
|
|
180
|
+
__param(1, Inject(TransactionHost)),
|
|
181
|
+
__param(2, Inject(ExtensionHost)),
|
|
182
|
+
__param(3, Inject(OrgLock))
|
|
183
|
+
], OrgToolSwitches);
|
|
184
|
+
export { OrgToolSwitches };
|