@capybara-hq/kernel 0.1.0-rc.3 → 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 +47 -16
- package/dist/admin/admin.controller.js +44 -19
- package/dist/admin/extensions.controller.d.ts +24 -3
- package/dist/admin/extensions.controller.js +48 -8
- 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 +19 -0
- package/dist/agents/agent-lookup.js +21 -0
- package/dist/agents/agent-profile.service.d.ts +29 -0
- package/dist/agents/agent-profile.service.js +117 -0
- package/dist/agents/agents.controller.d.ts +168 -3
- package/dist/agents/agents.controller.js +201 -12
- package/dist/agents/agents.module.d.ts +4 -1
- package/dist/agents/agents.module.js +36 -6
- package/dist/agents/agents.service.d.ts +64 -27
- package/dist/agents/agents.service.js +199 -74
- package/dist/agents/definition.d.ts +53 -0
- package/dist/agents/definition.js +55 -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/instruction-files.d.ts +60 -0
- package/dist/agents/instruction-files.js +111 -0
- package/dist/agents/models.controller.d.ts +9 -3
- package/dist/agents/models.controller.js +19 -4
- 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/profile.d.ts +96 -0
- package/dist/agents/profile.js +51 -0
- package/dist/agents/readiness.controller.d.ts +26 -0
- package/dist/agents/readiness.controller.js +56 -0
- package/dist/agents/templates.controller.d.ts +86 -5
- package/dist/agents/templates.controller.js +171 -7
- package/dist/agents/templates.d.ts +127 -23
- package/dist/agents/templates.js +476 -53
- package/dist/background/background.controller.d.ts +38 -0
- package/dist/background/background.controller.js +87 -0
- package/dist/background/background.module.d.ts +10 -0
- package/dist/background/background.module.js +39 -0
- package/dist/background/finish.d.ts +44 -0
- package/dist/background/finish.js +94 -0
- package/dist/background/launch-lock.d.ts +15 -0
- package/dist/background/launch-lock.js +40 -0
- package/dist/background/launch.d.ts +36 -0
- package/dist/background/launch.js +70 -0
- package/dist/background/poll.job.d.ts +56 -0
- package/dist/background/poll.job.js +190 -0
- package/dist/background/render.d.ts +23 -0
- package/dist/background/render.js +48 -0
- package/dist/background/session.d.ts +48 -0
- package/dist/background/session.js +79 -0
- package/dist/background/status.d.ts +35 -0
- package/dist/background/status.js +57 -0
- package/dist/background/stop.d.ts +68 -0
- package/dist/background/stop.js +243 -0
- package/dist/background/store.d.ts +162 -0
- package/dist/background/store.js +357 -0
- package/dist/background/store.module.d.ts +6 -0
- package/dist/background/store.module.js +22 -0
- package/dist/background/tasks.service.d.ts +77 -0
- package/dist/background/tasks.service.js +211 -0
- package/dist/background/wake-rules.d.ts +66 -0
- package/dist/background/wake-rules.js +113 -0
- package/dist/background/wake.d.ts +30 -0
- package/dist/background/wake.js +63 -0
- package/dist/catalog/admin-catalog.controller.d.ts +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/claude/agents.js +2 -0
- 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 +623 -83
- 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 +1148 -1137
- 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 +21 -3
- package/dist/channels/channels.module.js +2 -0
- package/dist/channels/connections.service.d.ts +16 -1
- package/dist/channels/connections.service.js +38 -4
- 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/channels/threads.d.ts +5 -0
- package/dist/channels/threads.js +8 -0
- package/dist/config/docs.js +3 -1
- package/dist/config/schema.d.ts +24 -2
- package/dist/config/schema.js +145 -19
- package/dist/conversations/access.d.ts +6 -4
- package/dist/conversations/access.js +29 -5
- package/dist/conversations/agent-tree.d.ts +46 -0
- package/dist/conversations/agent-tree.js +92 -0
- package/dist/conversations/attachments.service.d.ts +30 -0
- package/dist/conversations/attachments.service.js +130 -5
- package/dist/conversations/conversations.controller.d.ts +79 -23
- package/dist/conversations/conversations.controller.js +141 -50
- package/dist/conversations/conversations.module.d.ts +1 -1
- package/dist/conversations/conversations.module.js +10 -7
- package/dist/conversations/conversations.service.d.ts +108 -9
- package/dist/conversations/conversations.service.js +237 -30
- package/dist/conversations/environment-status.d.ts +24 -0
- package/dist/conversations/environment-status.js +71 -0
- package/dist/conversations/event-log.d.ts +21 -6
- package/dist/conversations/event-log.js +70 -1
- package/dist/conversations/events.d.ts +140 -0
- package/dist/conversations/events.js +142 -13
- package/dist/conversations/queue.d.ts +3 -1
- package/dist/conversations/queue.js +13 -2
- package/dist/conversations/queue.service.d.ts +1 -1
- package/dist/conversations/queue.service.js +8 -1
- package/dist/conversations/titles.d.ts +12 -3
- package/dist/conversations/titles.js +36 -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 +420 -20
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +3 -0
- 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 +90 -2
- package/dist/errors.js +90 -2
- package/dist/evals/reconstruct.d.ts +18 -9
- package/dist/evals/reconstruct.js +26 -7
- package/dist/evals/run-replay.d.ts +7 -2
- package/dist/evals/run-replay.js +42 -7
- package/dist/evals/step-replay.d.ts +2 -5
- package/dist/evals/step-replay.js +13 -7
- package/dist/evals/trajectory.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 +67 -42
- package/dist/extensions/admin-view.d.ts +39 -10
- package/dist/extensions/admin-view.js +111 -20
- package/dist/extensions/blobs.js +1 -0
- 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-issues.d.ts +13 -1
- package/dist/extensions/config-issues.js +22 -5
- package/dist/extensions/config-json-schema.d.ts +43 -7
- package/dist/extensions/config-json-schema.js +124 -58
- package/dist/extensions/deployment-config-store.d.ts +6 -0
- package/dist/extensions/deployment-config.d.ts +78 -8
- package/dist/extensions/deployment-config.js +172 -34
- package/dist/extensions/display-name.d.ts +22 -0
- package/dist/extensions/display-name.js +77 -0
- package/dist/extensions/effective-config.d.ts +127 -0
- package/dist/extensions/effective-config.js +368 -0
- package/dist/extensions/extensions.module.js +14 -2
- package/dist/extensions/hooks.d.ts +37 -4
- package/dist/extensions/hooks.js +82 -16
- package/dist/extensions/host.d.ts +45 -2
- package/dist/extensions/host.js +112 -16
- package/dist/extensions/installs.d.ts +20 -8
- package/dist/extensions/installs.js +37 -15
- package/dist/extensions/org-config.d.ts +81 -6
- package/dist/extensions/org-config.js +195 -44
- package/dist/extensions/org-levels.d.ts +37 -0
- package/dist/extensions/org-levels.js +71 -0
- package/dist/extensions/org-overrides.d.ts +151 -0
- package/dist/extensions/org-overrides.js +524 -0
- package/dist/extensions/package.d.ts +14 -1
- package/dist/extensions/package.js +51 -2
- package/dist/extensions/permission-view.d.ts +19 -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.controller.d.ts +34 -0
- package/dist/extensions/point-defaults.controller.js +71 -0
- package/dist/extensions/point-defaults.d.ts +71 -0
- package/dist/extensions/point-defaults.js +234 -0
- package/dist/extensions/registry.d.ts +1 -1
- package/dist/extensions/registry.js +2 -0
- 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 +31 -3
- package/dist/http/app.d.ts +11 -2
- package/dist/http/app.js +31 -5
- package/dist/http/nest-logger.d.ts +6 -5
- package/dist/http/nest-logger.js +24 -10
- 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.controller.js +9 -5
- package/dist/identity/auth.guard.d.ts +13 -5
- package/dist/identity/auth.guard.js +26 -9
- package/dist/identity/cookies.d.ts +20 -5
- package/dist/identity/cookies.js +44 -6
- package/dist/identity/identity.module.d.ts +1 -1
- package/dist/identity/identity.module.js +4 -4
- package/dist/identity/me.controller.d.ts +5 -1
- package/dist/identity/me.controller.js +12 -3
- package/dist/identity/principal.d.ts +3 -3
- package/dist/identity/principal.js +3 -3
- package/dist/identity/sessions.d.ts +12 -0
- package/dist/identity/sessions.js +45 -0
- 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 +2 -2
- package/dist/index.js +1 -1
- package/dist/infra/cli/kernel-cli.module.js +9 -1
- package/dist/infra/config/kernel-config.service.js +27 -1
- package/dist/infra/database/database.module.js +1 -0
- 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/lifecycle/process-guards.js +4 -0
- package/dist/infra/logging/logging.module.d.ts +4 -2
- package/dist/infra/logging/logging.module.js +24 -6
- package/dist/infra/queue/add-job-once.d.ts +14 -0
- package/dist/infra/queue/add-job-once.js +16 -0
- package/dist/infra/queue/redis-connection.d.ts +6 -0
- package/dist/infra/queue/redis-connection.js +7 -0
- package/dist/infra/redis/redis.module.js +6 -2
- package/dist/infra/tokens.d.ts +6 -1
- package/dist/infra/tokens.js +6 -1
- 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/log.d.ts +13 -1
- package/dist/log.js +93 -17
- 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 +43 -9
- package/dist/models/purposes.js +48 -18
- package/dist/orgs/directory-sync.d.ts +14 -5
- package/dist/orgs/directory-sync.js +41 -17
- package/dist/orgs/offboarding.d.ts +12 -8
- package/dist/orgs/offboarding.js +54 -33
- 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 +20 -3
- package/dist/orgs/settings.service.js +19 -4
- 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 +15 -1
- package/dist/runtime/context/build.d.ts +11 -7
- package/dist/runtime/context/build.js +46 -19
- package/dist/runtime/context/claude-tools.d.ts +3 -1
- package/dist/runtime/context/claude-tools.js +8 -6
- package/dist/runtime/context/compaction.js +13 -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 +36 -17
- package/dist/runtime/loop.d.ts +34 -5
- package/dist/runtime/maintenance.d.ts +9 -4
- package/dist/runtime/maintenance.js +35 -8
- package/dist/runtime/model-call.d.ts +46 -8
- package/dist/runtime/model-call.js +72 -21
- package/dist/runtime/providers.d.ts +6 -0
- package/dist/runtime/providers.js +8 -0
- 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 +59 -2
- package/dist/runtime/run-queue.js +311 -38
- package/dist/runtime/run-worker.d.ts +11 -5
- package/dist/runtime/run-worker.js +69 -33
- package/dist/runtime/runtime.module.js +11 -3
- package/dist/runtime/step-log.d.ts +15 -4
- package/dist/runtime/step-log.js +24 -7
- 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 +44 -28
- 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.d.ts +2 -1
- package/dist/runtime/usage-report.js +19 -13
- package/dist/runtime/waits.d.ts +145 -36
- package/dist/runtime/waits.js +423 -109
- 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 +10 -4
- package/dist/sandbox/sandbox.service.d.ts +282 -129
- package/dist/sandbox/sandbox.service.js +736 -381
- 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 +25 -4
- package/dist/tools/builtin-names.d.ts +41 -7
- package/dist/tools/builtin-names.js +59 -7
- 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 +19 -1
- package/dist/tools/builtins/builtin-tools.js +59 -2
- 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.d.ts +1 -1
- package/dist/tools/builtins/sandbox/bash.js +241 -4
- package/dist/tools/builtins/sandbox/common.d.ts +69 -27
- package/dist/tools/builtins/sandbox/common.js +87 -48
- package/dist/tools/builtins/sandbox/deliver.js +1 -1
- 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 +3 -1
- package/dist/tools/builtins/sandbox/index.js +7 -1
- package/dist/tools/builtins/sandbox/read.js +1 -1
- package/dist/tools/builtins/sandbox/task-output.d.ts +74 -0
- package/dist/tools/builtins/sandbox/task-output.js +329 -0
- package/dist/tools/builtins/sandbox/task-stop.d.ts +10 -0
- package/dist/tools/builtins/sandbox/task-stop.js +113 -0
- package/dist/tools/builtins/sandbox/write.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/errors.d.ts +8 -0
- package/dist/tools/builtins/web/errors.js +53 -0
- package/dist/tools/builtins/web/extract.d.ts +62 -0
- package/dist/tools/builtins/web/extract.js +271 -0
- package/dist/tools/builtins/web/fetch.d.ts +55 -0
- package/dist/tools/builtins/web/fetch.js +175 -0
- package/dist/tools/builtins/web/index.d.ts +13 -0
- package/dist/tools/builtins/web/index.js +12 -0
- package/dist/tools/builtins/web/page-cache.d.ts +25 -0
- package/dist/tools/builtins/web/page-cache.js +77 -0
- package/dist/tools/builtins/web/search.d.ts +25 -0
- package/dist/tools/builtins/web/search.js +210 -0
- package/dist/tools/builtins/web/url.d.ts +17 -0
- package/dist/tools/builtins/web/url.js +43 -0
- package/dist/tools/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/oauth/flow-paths.d.ts +1 -1
- package/dist/tools/oauth/flow-paths.js +1 -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 +202 -364
- package/dist/tools/policy.d.ts +1 -1
- package/dist/tools/policy.js +36 -16
- package/dist/tools/registry.d.ts +120 -8
- package/dist/tools/registry.js +112 -19
- package/dist/tools/tools.module.js +24 -2
- package/dist/tools/validate.js +1 -1
- package/dist/ui/views.d.ts +2 -1
- package/dist/ui/views.js +17 -3
- package/package.json +3 -3
- package/src/migrations/0064_account_last_org.sql +7 -0
- package/src/migrations/0065_conversation_archive.sql +8 -0
- package/src/migrations/0066_extension_display_name.sql +4 -0
- package/src/migrations/0067_agent_profiles.sql +20 -0
- package/src/migrations/0068_agent_avatar_uploads.sql +7 -0
- package/src/migrations/0069_attachments_agent_idx.sql +3 -0
- package/src/migrations/0070_background_tasks.sql +37 -0
- package/src/migrations/0071_background_tasks_reserve.sql +6 -0
- package/src/migrations/0072_background_tasks_stopping.sql +5 -0
- package/src/migrations/0073_org_extension_point_defaults.sql +11 -0
- package/src/migrations/0074_subagent_tree.sql +50 -0
- package/src/migrations/0075_plugin_scope.sql +61 -0
- package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
- package/src/migrations/0077_scope_requests.sql +52 -0
- package/src/migrations/0078_scope_grant_switches.sql +18 -0
- package/src/migrations/0079_scope_live_install_switches.sql +19 -0
- package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
- package/src/migrations/0081_platform_components.sql +129 -0
- package/src/migrations/0082_platform_migration.sql +33 -0
- package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
- package/src/migrations/0084_org_owned_items.sql +85 -0
- package/src/migrations/0085_agent_templates_phase4.sql +45 -0
- package/src/migrations/0086_org_layering.sql +30 -0
- package/src/migrations/0087_approval_summary.sql +6 -0
- package/src/migrations/0088_environments.sql +80 -0
- package/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 -24
- package/dist/extensions/org-config.controller.js +0 -62
|
@@ -16,23 +16,39 @@ import { audit } from "../identity/audit.js";
|
|
|
16
16
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
17
17
|
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
18
18
|
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
19
|
-
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
20
19
|
import { rejectAnonymousGuest } from "../orgs/members.service.js";
|
|
21
20
|
import { OrgLock } from "../orgs/org-lock.js";
|
|
22
|
-
import { roleAtLeast } from "../orgs/roles.js";
|
|
21
|
+
import { can, roleAtLeast } from "../orgs/roles.js";
|
|
23
22
|
import { ProviderRegistry } from "../runtime/providers.js";
|
|
24
|
-
import { SandboxJobs } from "../sandbox/jobs.js";
|
|
25
23
|
import { SkillChangesService } from "../skills/changes.service.js";
|
|
26
24
|
import { assertOrgSkills, assertPinnedSkills } from "../skills/skills.service.js";
|
|
27
25
|
import { legacyKeySaveText } from "../tools/legacy-keys.js";
|
|
28
26
|
import { ToolRegistry } from "../tools/registry.js";
|
|
29
27
|
import { AgentLookup, isAgentVisibleTo, visibleTo, } from "./agent-lookup.js";
|
|
30
28
|
import { normalizeStoredDefinition, paramIssues, SUBAGENT_NAME_RE, SUBAGENT_ROSTER_MAX, } from "./definition.js";
|
|
29
|
+
import { deriveInstructions } from "./instruction-files.js";
|
|
30
|
+
import { PendingConnectorRequests } from "./pending-connector-requests.js";
|
|
31
|
+
import { randomPreset } from "./profile.js";
|
|
32
|
+
import { loadTemplates, templateTypeOf } from "./templates.js";
|
|
31
33
|
export { AGENT_VISIBILITIES, isAgentVisibleTo, visibleTo, } from "./agent-lookup.js";
|
|
32
34
|
export { paramIssues, SUBAGENT_ROSTER_MAX } from "./definition.js";
|
|
33
|
-
/**
|
|
34
|
-
|
|
35
|
+
/** A new agent has no id to bind an upload to yet: a client can only choose a preset on create. */
|
|
36
|
+
export function assertProfileWritable(profile) {
|
|
37
|
+
if (profile?.avatar?.kind === "upload") {
|
|
38
|
+
throw new ApiError("validation_failed", "Choose a preset avatar when creating an agent; upload one afterwards", [{ path: "avatar.kind", message: "upload is not supported on create" }]);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
35
41
|
const notFound = () => new ApiError("agent.not_found", "Agent not found");
|
|
42
|
+
/** A per-operation policy key of the `Platform` tool (Platform tool spec §6.2). */
|
|
43
|
+
const PLATFORM_POLICY_KEY = /^Platform:[a-z][a-z-]*\.[a-z][a-z-]*$/;
|
|
44
|
+
/**
|
|
45
|
+
* May `toolPolicies` hold this key: one of the agent's tool keys, or `Platform:<operation>` when
|
|
46
|
+
* `Platform` is among them (an unknown operation id is kept: a removed operation's policy is
|
|
47
|
+
* harmless).
|
|
48
|
+
*/
|
|
49
|
+
function isToolPolicyKey(key, toolKeys) {
|
|
50
|
+
return toolKeys.has(key) || (toolKeys.has("Platform") && PLATFORM_POLICY_KEY.test(key));
|
|
51
|
+
}
|
|
36
52
|
/** 键排序后的 JSON:jsonb 不保留键顺序,比较定义是否变化时用。 */
|
|
37
53
|
function canonical(v) {
|
|
38
54
|
if (Array.isArray(v))
|
|
@@ -45,12 +61,39 @@ function canonical(v) {
|
|
|
45
61
|
}
|
|
46
62
|
return JSON.stringify(v);
|
|
47
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* The pending connectors of a saved definition (ruling P4-6): absent from the request = the current
|
|
66
|
+
* version's (an editor that does not know them never drops them); given = a subset of the current
|
|
67
|
+
* ones, unchanged (only creating from a template adds them, only binding resolves them); `[]`
|
|
68
|
+
* removes them all. Another entry → 400 `validation_failed` at `pendingConnectors.<i>`.
|
|
69
|
+
*/
|
|
70
|
+
export function keepPendingConnectors(definition, given, current) {
|
|
71
|
+
const { pendingConnectors: _given, ...rest } = definition;
|
|
72
|
+
const next = given ?? current ?? [];
|
|
73
|
+
if (given !== undefined) {
|
|
74
|
+
const known = new Map((current ?? []).map((c) => [c.key, canonical(c)]));
|
|
75
|
+
const details = given.flatMap((c, i) => known.get(c.key) === canonical(c)
|
|
76
|
+
? []
|
|
77
|
+
: [
|
|
78
|
+
{
|
|
79
|
+
path: `pendingConnectors.${i}`,
|
|
80
|
+
message: "pending connectors come only from a template; keep or remove them",
|
|
81
|
+
},
|
|
82
|
+
]);
|
|
83
|
+
if (details.length > 0) {
|
|
84
|
+
throw new ApiError("validation_failed", "Invalid pending connectors", details);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return next.length > 0 ? { ...rest, pendingConnectors: [...next] } : rest;
|
|
88
|
+
}
|
|
48
89
|
/**
|
|
49
90
|
* Checks `subagents` of an agent definition in the caller's transaction (spec §5.2); throws 400
|
|
50
91
|
* `agent.subagents_invalid` with one detail per problem (`{ reason, path, value? }`):
|
|
51
|
-
* - `not_found`: a template id that is not a
|
|
92
|
+
* - `not_found`: a template id that is not a usable agent template of the org (its own, a linked
|
|
93
|
+
* copy, or a platform template on in the org);
|
|
52
94
|
* - `invalid_name`: an inline name or `agents[].as` outside {@link SUBAGENT_NAME_RE}, or
|
|
53
|
-
* `general-purpose`; `duplicate`: a roster type listed twice (a template id twice included
|
|
95
|
+
* `general-purpose`; `duplicate`: a roster type listed twice (a template id twice included, a
|
|
96
|
+
* bare template type equal to an inline name, a template typed `general-purpose`);
|
|
54
97
|
* - `tool_not_selected`: an inline template's `tools`, `disallowedTools` or `toolPolicies` key that
|
|
55
98
|
* is not a tool key of this agent (`toolKeys`, from `ToolRegistry.checkRefs`);
|
|
56
99
|
* - `skill_not_selected`: an inline skill id that is neither in `skills.orgSkills` nor a live
|
|
@@ -92,24 +135,44 @@ export async function assertSubagents(t, a) {
|
|
|
92
135
|
const templates = sub.templates ?? [];
|
|
93
136
|
const keptTemplates = new Set(a.kept?.templates ?? []);
|
|
94
137
|
const ids = [...new Set(templates)];
|
|
95
|
-
//
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
138
|
+
// usable templates (the org's, linked copies, platform templates on in the org) by id
|
|
139
|
+
const usable = await loadTemplates(t, a.orgId, ids);
|
|
140
|
+
// kept ids that are no longer usable: their type from the stored row, deleted or off included
|
|
141
|
+
const gone = ids.filter((id) => !usable.has(id) && keptTemplates.has(id));
|
|
142
|
+
const goneTypes = new Map();
|
|
143
|
+
if (gone.length > 0) {
|
|
144
|
+
const [orgRows, platformRows] = await Promise.all([
|
|
145
|
+
t
|
|
146
|
+
.selectFrom("agent_templates")
|
|
147
|
+
.select(["id", "name", "plugin_name"])
|
|
148
|
+
.where("org_id", "=", a.orgId)
|
|
149
|
+
.where("id", "in", gone)
|
|
150
|
+
.execute(),
|
|
151
|
+
t
|
|
152
|
+
.selectFrom("platform_agent_templates")
|
|
153
|
+
.select(["id", "name", "plugin_name"])
|
|
154
|
+
.where("id", "in", gone)
|
|
155
|
+
.execute(),
|
|
156
|
+
]);
|
|
157
|
+
for (const r of [...platformRows, ...orgRows]) {
|
|
158
|
+
goneTypes.set(r.id, templateTypeOf(r.plugin_name, r.name));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
104
161
|
templates.forEach((id, i) => {
|
|
105
162
|
const path = `subagents.templates.${i}`;
|
|
106
|
-
const row =
|
|
107
|
-
if (!keptTemplates.has(id) &&
|
|
163
|
+
const row = usable.get(id);
|
|
164
|
+
if (!keptTemplates.has(id) && row === undefined) {
|
|
108
165
|
add("not_found", path, id);
|
|
109
166
|
return;
|
|
110
167
|
}
|
|
111
|
-
// claimed by its roster type (`<plugin>:<name>`,
|
|
112
|
-
|
|
168
|
+
// claimed by its roster type (`<plugin>:<name>`, or a bare `<name>` without a plugin;
|
|
169
|
+
// roster.ts templateType), so nothing shadows it; `general-purpose` is reserved
|
|
170
|
+
const type = row === undefined
|
|
171
|
+
? (goneTypes.get(id) ?? `template:${id}`)
|
|
172
|
+
: templateTypeOf(row.plugin, row.name);
|
|
173
|
+
if (type === "general-purpose" && sub.general === false)
|
|
174
|
+
add("duplicate", path, type);
|
|
175
|
+
claim(type, path);
|
|
113
176
|
});
|
|
114
177
|
const inline = sub.inline ?? [];
|
|
115
178
|
const selected = new Set(a.definition.skills?.orgSkills ?? []);
|
|
@@ -140,8 +203,10 @@ export async function assertSubagents(t, a) {
|
|
|
140
203
|
for (const [j, key] of (x.disallowedTools ?? []).entries()) {
|
|
141
204
|
tool(key, `${base}.disallowedTools.${j}`);
|
|
142
205
|
}
|
|
143
|
-
for (const key of Object.keys(x.toolPolicies ?? {}))
|
|
144
|
-
|
|
206
|
+
for (const key of Object.keys(x.toolPolicies ?? {})) {
|
|
207
|
+
if (!isToolPolicyKey(key, a.toolKeys))
|
|
208
|
+
tool(key, `${base}.toolPolicies.${key}`);
|
|
209
|
+
}
|
|
145
210
|
(x.skills ?? []).forEach((id, j) => {
|
|
146
211
|
if (!selected.has(id) && !own.has(id))
|
|
147
212
|
add("skill_not_selected", `${base}.skills.${j}`, id);
|
|
@@ -192,34 +257,29 @@ let AgentsService = class AgentsService {
|
|
|
192
257
|
skillChanges;
|
|
193
258
|
orgLock;
|
|
194
259
|
providers;
|
|
195
|
-
sandboxJobs;
|
|
196
|
-
log;
|
|
197
260
|
txHost;
|
|
198
261
|
evalBudget;
|
|
262
|
+
setupRequests;
|
|
199
263
|
constructor(db, lookup, tools,
|
|
200
264
|
/** 删除 agent 时取消它待处理的技能改动(T15)。 */
|
|
201
265
|
skillChanges,
|
|
202
266
|
/** The org row lock (orgs/org-lock.ts): joins the caller's transaction. */
|
|
203
267
|
orgLock,
|
|
204
268
|
/** Resolves the agent's models (and their parameter declarations) when it is saved. */
|
|
205
|
-
providers,
|
|
206
|
-
/**
|
|
207
|
-
* The sandbox destruction after a delete (内核投递一次性维护任务 `sandbox-destroy-for`,worker
|
|
208
|
-
* 在锁内逐个销毁,幂等).
|
|
209
|
-
*/
|
|
210
|
-
sandboxJobs, log, txHost,
|
|
269
|
+
providers, txHost,
|
|
211
270
|
/** Cancels the deleted agent's running eval runs (in the delete's transaction). */
|
|
212
|
-
evalBudget
|
|
271
|
+
evalBudget,
|
|
272
|
+
/** Settles the agent's connector setup request when its pending connectors change (P4-7). */
|
|
273
|
+
setupRequests) {
|
|
213
274
|
this.db = db;
|
|
214
275
|
this.lookup = lookup;
|
|
215
276
|
this.tools = tools;
|
|
216
277
|
this.skillChanges = skillChanges;
|
|
217
278
|
this.orgLock = orgLock;
|
|
218
279
|
this.providers = providers;
|
|
219
|
-
this.sandboxJobs = sandboxJobs;
|
|
220
|
-
this.log = log;
|
|
221
280
|
this.txHost = txHost;
|
|
222
281
|
this.evalBudget = evalBudget;
|
|
282
|
+
this.setupRequests = setupRequests;
|
|
223
283
|
}
|
|
224
284
|
/**
|
|
225
285
|
* 校验工具引用与工具策略:引用的内置 / 插件 / 连接器工具必须存在(见 `ToolRegistry.checkRefs`);
|
|
@@ -230,7 +290,7 @@ let AgentsService = class AgentsService {
|
|
|
230
290
|
const { keys, issues } = await this.tools.checkRefs(orgId, def.tools);
|
|
231
291
|
const details = [...issues];
|
|
232
292
|
for (const key of Object.keys(def.toolPolicies)) {
|
|
233
|
-
if (!
|
|
293
|
+
if (!isToolPolicyKey(key, keys)) {
|
|
234
294
|
// an rc key (tool naming spec §8.3): saving writes current keys only, so name them
|
|
235
295
|
const renamed = legacyKeySaveText(key, keys);
|
|
236
296
|
details.push({
|
|
@@ -292,19 +352,39 @@ let AgentsService = class AgentsService {
|
|
|
292
352
|
* 新建 agent(版本 1):在组织行锁内授权 `agents.create`;主模型与兜底都必须可解析
|
|
293
353
|
* (`agent.model_unavailable`);兜底与主模型同一供应商只提示 `fallback_same_provider`。
|
|
294
354
|
*/
|
|
295
|
-
async create(orgId, actorAccountId,
|
|
355
|
+
async create(orgId, actorAccountId, request, actorTokenId, auditDetail) {
|
|
356
|
+
const { agent, warnings } = await this.createChecked(orgId, actorAccountId, request, null, actorTokenId, auditDetail);
|
|
357
|
+
return { agent, warnings };
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Creates an agent from a planned template definition (rulings P4-3, P4-8): {@link create}'s
|
|
361
|
+
* checks, plus, under the org row lock, 403 `agent.visibility_forbidden` when the visibility is
|
|
362
|
+
* not `private` and the creator lacks `agents.manage`; the provenance columns are written once.
|
|
363
|
+
* Returns the creator's role read under the lock (the caller decides on the pending connector
|
|
364
|
+
* request after the commit).
|
|
365
|
+
*/
|
|
366
|
+
createFromTemplate(orgId, actorAccountId, request, template, actorTokenId, auditDetail) {
|
|
367
|
+
return this.createChecked(orgId, actorAccountId, request, template, actorTokenId, auditDetail);
|
|
368
|
+
}
|
|
369
|
+
async createChecked(orgId, actorAccountId, request, template, actorTokenId, auditDetail) {
|
|
370
|
+
const input = { ...request, definition: deriveInstructions(request.definition, null) };
|
|
296
371
|
// 先解析模型(可能访问供应商),不在持有组织行锁时做
|
|
297
372
|
const warnings = await this.checkModels(input.definition);
|
|
298
373
|
const toolKeys = await this.checkTools(orgId, input.definition);
|
|
299
374
|
if (input.visibility !== "members" && (input.memberIds?.length ?? 0) > 0) {
|
|
300
375
|
throw new ApiError("validation_failed", "memberIds requires visibility 'members'");
|
|
301
376
|
}
|
|
302
|
-
|
|
303
|
-
|
|
377
|
+
assertProfileWritable(input.profile);
|
|
378
|
+
const { agent, role } = await this.createIn(orgId, actorAccountId, input, toolKeys, template, actorTokenId, auditDetail);
|
|
379
|
+
return { agent, warnings, role };
|
|
304
380
|
}
|
|
305
|
-
async createIn(orgId, actorAccountId, input, toolKeys, actorTokenId) {
|
|
381
|
+
async createIn(orgId, actorAccountId, input, toolKeys, template, actorTokenId, auditDetail) {
|
|
306
382
|
const t = this.db.db;
|
|
307
|
-
await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "agents.create");
|
|
383
|
+
const { role } = await this.orgLock.lockAndAuthorize(orgId, actorAccountId, "agents.create");
|
|
384
|
+
// ruling P4-3: a member creates a template agent for themself; sharing it is an admin's call
|
|
385
|
+
if (template !== null && input.visibility !== "private" && !can(role, "agents.manage")) {
|
|
386
|
+
throw new ApiError("agent.visibility_forbidden", "Only an organization admin can create an agent from a template for others; create it private");
|
|
387
|
+
}
|
|
308
388
|
await assertOrgSkills(t, orgId, input.definition.skills?.orgSkills ?? []);
|
|
309
389
|
await assertPinnedSkills(t, orgId, null, input.definition.skills);
|
|
310
390
|
await assertSubagents(t, {
|
|
@@ -326,6 +406,14 @@ let AgentsService = class AgentsService {
|
|
|
326
406
|
owner_account_id: actorAccountId,
|
|
327
407
|
visibility: input.visibility,
|
|
328
408
|
current_version: 1,
|
|
409
|
+
profile_avatar: JSON.stringify(input.profile?.avatar ?? { kind: "preset", id: randomPreset() }),
|
|
410
|
+
profile_description: input.profile?.description ?? "",
|
|
411
|
+
profile_quick_actions: JSON.stringify(input.profile?.quickActions ?? []),
|
|
412
|
+
...(template !== null && {
|
|
413
|
+
created_from_template_id: template.id,
|
|
414
|
+
created_from_template_version: template.version,
|
|
415
|
+
created_from_template_name: template.name,
|
|
416
|
+
}),
|
|
329
417
|
})
|
|
330
418
|
.execute();
|
|
331
419
|
await t
|
|
@@ -344,9 +432,14 @@ let AgentsService = class AgentsService {
|
|
|
344
432
|
orgId,
|
|
345
433
|
action: "agent.created",
|
|
346
434
|
target: id,
|
|
347
|
-
detail: {
|
|
435
|
+
detail: {
|
|
436
|
+
version: 1,
|
|
437
|
+
visibility: input.visibility,
|
|
438
|
+
...(template !== null && { template: { id: template.id, version: template.version } }),
|
|
439
|
+
...auditDetail,
|
|
440
|
+
},
|
|
348
441
|
});
|
|
349
|
-
return this.lookup.view(id);
|
|
442
|
+
return { agent: await this.lookup.view(id), role };
|
|
350
443
|
}
|
|
351
444
|
/**
|
|
352
445
|
* 锁组织行并复核发起人,再锁 agent 行:发起人须仍具备 `agents.create`(member 以上),且是负责人或组织管理员以上;
|
|
@@ -383,13 +476,14 @@ let AgentsService = class AgentsService {
|
|
|
383
476
|
* 修改 agent:`definition` 变化时写新版本(`current_version + 1`),只改 visibility / memberIds 不产生新版本。
|
|
384
477
|
* 只有负责人或组织管理员以上可改,在组织行锁内复核。
|
|
385
478
|
*/
|
|
386
|
-
async update(orgId, agentId, actorAccountId,
|
|
479
|
+
async update(orgId, agentId, actorAccountId, request, actorTokenId, auditDetail) {
|
|
480
|
+
const patch = request;
|
|
387
481
|
const warnings = patch.definition ? await this.checkModels(patch.definition) : [];
|
|
388
482
|
const toolKeys = patch.definition ? await this.checkTools(orgId, patch.definition) : null;
|
|
389
|
-
const agent = await this.updateIn(orgId, agentId, actorAccountId, patch, toolKeys, actorTokenId);
|
|
483
|
+
const agent = await this.updateIn(orgId, agentId, actorAccountId, patch, toolKeys, actorTokenId, auditDetail);
|
|
390
484
|
return { agent, warnings };
|
|
391
485
|
}
|
|
392
|
-
async updateIn(orgId, agentId, actorAccountId, patch, toolKeys, actorTokenId) {
|
|
486
|
+
async updateIn(orgId, agentId, actorAccountId, patch, toolKeys, actorTokenId, auditDetail) {
|
|
393
487
|
const t = this.db.db;
|
|
394
488
|
const before = await this.lockForWrite(orgId, agentId, actorAccountId);
|
|
395
489
|
if (patch.expectedVersion !== undefined && patch.expectedVersion !== before.current_version) {
|
|
@@ -407,26 +501,42 @@ let AgentsService = class AgentsService {
|
|
|
407
501
|
.where("agent_id", "=", agentId)
|
|
408
502
|
.where("version", "=", before.current_version)
|
|
409
503
|
.executeTakeFirstOrThrow();
|
|
504
|
+
// the prompt: instructionFiles give instructions; a save given neither keeps the current one
|
|
505
|
+
const currentDefinition = normalizeStoredDefinition(current.definition);
|
|
506
|
+
const definition = keepPendingConnectors(deriveInstructions(patch.definition, currentDefinition), patch.definition.pendingConnectors, currentDefinition.pendingConnectors);
|
|
410
507
|
// 当前版本已有的技能引用保存时合法,不再核对(被删的技能不挡住其他改动);新加的照常核对
|
|
411
508
|
const kept = new Set(current.definition.skills?.orgSkills ?? []);
|
|
412
|
-
await assertOrgSkills(t, orgId,
|
|
413
|
-
await assertPinnedSkills(t, orgId, agentId,
|
|
509
|
+
await assertOrgSkills(t, orgId, definition.skills?.orgSkills ?? [], kept);
|
|
510
|
+
await assertPinnedSkills(t, orgId, agentId, definition.skills, current.definition.skills?.pinned ?? []);
|
|
414
511
|
await assertSubagents(t, {
|
|
415
512
|
orgId,
|
|
416
513
|
agentId,
|
|
417
514
|
actorAccountId,
|
|
418
|
-
definition
|
|
515
|
+
definition,
|
|
419
516
|
toolKeys: toolKeys ?? new Set(),
|
|
420
517
|
kept: current.definition.subagents,
|
|
421
518
|
});
|
|
422
|
-
if (canonical(current.definition) !== canonical(
|
|
519
|
+
if (canonical(current.definition) !== canonical(definition)) {
|
|
520
|
+
// removing pending connectors in the editor narrows or cancels the setup request (P4-T6-3)
|
|
521
|
+
const keys = (definition.pendingConnectors ?? []).map((c) => c.key);
|
|
522
|
+
if (canonical((currentDefinition.pendingConnectors ?? []).map((c) => c.key)) !==
|
|
523
|
+
canonical(keys)) {
|
|
524
|
+
await this.setupRequests.settleIn({
|
|
525
|
+
orgId,
|
|
526
|
+
agentId,
|
|
527
|
+
keys,
|
|
528
|
+
close: "cancelled",
|
|
529
|
+
actor: actorAccountId,
|
|
530
|
+
actorTokenId,
|
|
531
|
+
});
|
|
532
|
+
}
|
|
423
533
|
toVersion = before.current_version + 1;
|
|
424
534
|
await t
|
|
425
535
|
.insertInto("agent_versions")
|
|
426
536
|
.values({
|
|
427
537
|
agent_id: agentId,
|
|
428
538
|
version: toVersion,
|
|
429
|
-
definition: JSON.stringify(
|
|
539
|
+
definition: JSON.stringify(definition),
|
|
430
540
|
created_by: actorAccountId,
|
|
431
541
|
})
|
|
432
542
|
.execute();
|
|
@@ -455,6 +565,7 @@ let AgentsService = class AgentsService {
|
|
|
455
565
|
...(visibility !== before.visibility && {
|
|
456
566
|
visibility: { from: before.visibility, to: visibility },
|
|
457
567
|
}),
|
|
568
|
+
...auditDetail,
|
|
458
569
|
},
|
|
459
570
|
});
|
|
460
571
|
return this.lookup.view(agentId);
|
|
@@ -463,7 +574,6 @@ let AgentsService = class AgentsService {
|
|
|
463
574
|
async softDelete(orgId, agentId, actorAccountId, actorTokenId) {
|
|
464
575
|
const cancelled = await this.softDeleteIn(orgId, agentId, actorAccountId, actorTokenId);
|
|
465
576
|
await this.skillChanges.finishCancel(orgId, cancelled);
|
|
466
|
-
await this.destroySandboxes(orgId, agentId);
|
|
467
577
|
}
|
|
468
578
|
async softDeleteIn(orgId, agentId, actorAccountId, actorTokenId) {
|
|
469
579
|
const t = this.db.db;
|
|
@@ -473,6 +583,13 @@ let AgentsService = class AgentsService {
|
|
|
473
583
|
.set({ deleted_at: sql `now()`, updated_at: sql `now()` })
|
|
474
584
|
.where("id", "=", agentId)
|
|
475
585
|
.execute();
|
|
586
|
+
// the avatar upload is garbage now: the cleanup job deletes it (and its object) once expired
|
|
587
|
+
await t
|
|
588
|
+
.updateTable("attachments")
|
|
589
|
+
.set({ expires_at: sql `now()` })
|
|
590
|
+
.where("agent_id", "=", agentId)
|
|
591
|
+
.where("purpose", "=", "agent-avatar")
|
|
592
|
+
.execute();
|
|
476
593
|
await audit(t, {
|
|
477
594
|
actorAccountId,
|
|
478
595
|
...(actorTokenId !== undefined && { actorTokenId }),
|
|
@@ -480,31 +597,20 @@ let AgentsService = class AgentsService {
|
|
|
480
597
|
action: "agent.deleted",
|
|
481
598
|
target: agentId,
|
|
482
599
|
});
|
|
600
|
+
// the agent row stays (soft delete), so its setup request is closed here (P4-T6-3)
|
|
601
|
+
await this.setupRequests.settleIn({
|
|
602
|
+
orgId,
|
|
603
|
+
agentId,
|
|
604
|
+
keys: [],
|
|
605
|
+
close: "cancelled",
|
|
606
|
+
actor: actorAccountId,
|
|
607
|
+
actorTokenId,
|
|
608
|
+
});
|
|
483
609
|
// 评测集的 agent 删除后其评测运行不再花钱:显式取消(审计带原因)
|
|
484
610
|
await this.evalBudget.cancelRuns({ orgId, agentId }, { accountId: actorAccountId, ...(actorTokenId !== undefined && { tokenId: actorTokenId }) }, "agent_deleted");
|
|
485
611
|
// joins this transaction (mandatory: it relies on the agent row lock taken above)
|
|
486
612
|
return this.skillChanges.cancelPendingForAgent(orgId, agentId, actorAccountId, "agent_deleted", actorTokenId);
|
|
487
613
|
}
|
|
488
|
-
/** 提交后尽力而为:投递销毁这个 agent 各对话还没销毁的沙箱(失败只记日志,留给不活跃销毁扫描)。 */
|
|
489
|
-
async destroySandboxes(orgId, agentId) {
|
|
490
|
-
try {
|
|
491
|
-
const rows = await this.db
|
|
492
|
-
.selectFrom("sandboxes as s")
|
|
493
|
-
.innerJoin("conversations as c", "c.id", "s.conversation_id")
|
|
494
|
-
.select("s.conversation_id")
|
|
495
|
-
.where("c.org_id", "=", orgId)
|
|
496
|
-
.where("c.agent_id", "=", agentId)
|
|
497
|
-
.where("s.status", "<>", "destroyed")
|
|
498
|
-
.execute();
|
|
499
|
-
const ids = rows.map((r) => r.conversation_id);
|
|
500
|
-
for (let i = 0; i < ids.length; i += SANDBOX_DESTROY_BATCH) {
|
|
501
|
-
await this.sandboxJobs.destroy(ids.slice(i, i + SANDBOX_DESTROY_BATCH));
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
catch (err) {
|
|
505
|
-
this.log.warn("cannot schedule sandbox destruction for a deleted agent", { agentId, err });
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
614
|
/**
|
|
509
615
|
* 重新指派负责人(`agents.manage`,admin):在组织行锁内授权;agent 不存在 / 已删除 → `agent.not_found`;
|
|
510
616
|
* 新负责人不是该组织成员 → `member.not_found`;是匿名访客 → `member.anonymous_guest`。
|
|
@@ -537,6 +643,8 @@ let AgentsService = class AgentsService {
|
|
|
537
643
|
.set({ owner_account_id: newOwnerId, needs_reassignment: false, updated_at: sql `now()` })
|
|
538
644
|
.where("id", "=", agentId)
|
|
539
645
|
.execute();
|
|
646
|
+
// the new owner hears about the agent's connector setup request (P4-T6-4)
|
|
647
|
+
await this.setupRequests.retargetIn([agentId], newOwnerId);
|
|
540
648
|
await audit(t, {
|
|
541
649
|
actorAccountId,
|
|
542
650
|
...(actorTokenId !== undefined && { actorTokenId }),
|
|
@@ -551,6 +659,24 @@ let AgentsService = class AgentsService {
|
|
|
551
659
|
});
|
|
552
660
|
return this.lookup.view(agentId);
|
|
553
661
|
}
|
|
662
|
+
/**
|
|
663
|
+
* `views` with `createdFrom.available` set (ruling P4-8): whether each recorded template is
|
|
664
|
+
* still usable in the org. One template read for all of them; only the agents API calls it.
|
|
665
|
+
*/
|
|
666
|
+
async withTemplateLinks(orgId, views) {
|
|
667
|
+
const ids = [
|
|
668
|
+
...new Set(views.flatMap((v) => (v.createdFrom === null ? [] : [v.createdFrom.templateId]))),
|
|
669
|
+
];
|
|
670
|
+
if (ids.length === 0)
|
|
671
|
+
return views;
|
|
672
|
+
const usable = await loadTemplates(this.db.db, orgId, ids);
|
|
673
|
+
return views.map((v) => v.createdFrom === null
|
|
674
|
+
? v
|
|
675
|
+
: {
|
|
676
|
+
...v,
|
|
677
|
+
createdFrom: { ...v.createdFrom, available: usable.has(v.createdFrom.templateId) },
|
|
678
|
+
});
|
|
679
|
+
}
|
|
554
680
|
/** 取对 viewer 可见的 agent;`viewerAccountId = null` 表示该组织的服务令牌。不可见 → `agent.not_found`。 */
|
|
555
681
|
get(orgId, agentId, viewerAccountId) {
|
|
556
682
|
return this.lookup.get(orgId, agentId, viewerAccountId);
|
|
@@ -614,9 +740,8 @@ AgentsService = __decorate([
|
|
|
614
740
|
__param(3, Inject(SkillChangesService)),
|
|
615
741
|
__param(4, Inject(OrgLock)),
|
|
616
742
|
__param(5, Inject(ProviderRegistry)),
|
|
617
|
-
__param(6, Inject(
|
|
618
|
-
__param(7, Inject(
|
|
619
|
-
__param(8, Inject(
|
|
620
|
-
__param(9, Inject(EvalBudget))
|
|
743
|
+
__param(6, Inject(TransactionHost)),
|
|
744
|
+
__param(7, Inject(EvalBudget)),
|
|
745
|
+
__param(8, Inject(PendingConnectorRequests))
|
|
621
746
|
], AgentsService);
|
|
622
747
|
export { AgentsService };
|
|
@@ -112,11 +112,42 @@ export declare const SubagentsSchema: z.ZodObject<{
|
|
|
112
112
|
dispatchable: z.ZodOptional<z.ZodBoolean>;
|
|
113
113
|
}, z.core.$strict>;
|
|
114
114
|
export type Subagents = z.infer<typeof SubagentsSchema>;
|
|
115
|
+
/** The key rule of a pending connector (`[a-z0-9-]`, URL-safe: it names the bind route). */
|
|
116
|
+
export declare const PENDING_CONNECTOR_KEY_RE: RegExp;
|
|
117
|
+
/** Pending connectors an agent may carry (the template's `connectors` limit). */
|
|
118
|
+
export declare const PENDING_CONNECTORS_MAX = 16;
|
|
119
|
+
export declare const PendingConnectorSchema: z.ZodObject<{
|
|
120
|
+
key: z.ZodString;
|
|
121
|
+
label: z.ZodString;
|
|
122
|
+
source: z.ZodUnion<readonly [z.ZodObject<{
|
|
123
|
+
template: z.ZodString;
|
|
124
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
125
|
+
needs: z.ZodObject<{
|
|
126
|
+
protocol: z.ZodEnum<{
|
|
127
|
+
mcp: "mcp";
|
|
128
|
+
openapi: "openapi";
|
|
129
|
+
}>;
|
|
130
|
+
endpoint: z.ZodString;
|
|
131
|
+
tools: z.ZodArray<z.ZodString>;
|
|
132
|
+
label: z.ZodString;
|
|
133
|
+
}, z.core.$strict>;
|
|
134
|
+
}, z.core.$strict>]>;
|
|
135
|
+
tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
136
|
+
policies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodEnum<{
|
|
137
|
+
ask: "ask";
|
|
138
|
+
deny: "deny";
|
|
139
|
+
}>>>;
|
|
140
|
+
}, z.core.$strict>;
|
|
141
|
+
export type PendingConnector = z.infer<typeof PendingConnectorSchema>;
|
|
115
142
|
/** Agent 定义:每次变化写一个新版本(`capybara.agent_versions`)。 */
|
|
116
143
|
export declare const AgentDefinitionSchema: z.ZodObject<{
|
|
117
144
|
name: z.ZodString;
|
|
118
145
|
avatarUrl: z.ZodDefault<z.ZodNullable<z.ZodURL>>;
|
|
119
146
|
instructions: z.ZodDefault<z.ZodString>;
|
|
147
|
+
instructionFiles: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
148
|
+
name: z.ZodString;
|
|
149
|
+
content: z.ZodString;
|
|
150
|
+
}, z.core.$strict>>>;
|
|
120
151
|
model: z.ZodObject<{
|
|
121
152
|
provider: z.ZodString;
|
|
122
153
|
model: z.ZodString;
|
|
@@ -187,6 +218,28 @@ export declare const AgentDefinitionSchema: z.ZodObject<{
|
|
|
187
218
|
}, z.core.$strict>>>;
|
|
188
219
|
dispatchable: z.ZodOptional<z.ZodBoolean>;
|
|
189
220
|
}, z.core.$strict>>;
|
|
221
|
+
pendingConnectors: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
222
|
+
key: z.ZodString;
|
|
223
|
+
label: z.ZodString;
|
|
224
|
+
source: z.ZodUnion<readonly [z.ZodObject<{
|
|
225
|
+
template: z.ZodString;
|
|
226
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
227
|
+
needs: z.ZodObject<{
|
|
228
|
+
protocol: z.ZodEnum<{
|
|
229
|
+
mcp: "mcp";
|
|
230
|
+
openapi: "openapi";
|
|
231
|
+
}>;
|
|
232
|
+
endpoint: z.ZodString;
|
|
233
|
+
tools: z.ZodArray<z.ZodString>;
|
|
234
|
+
label: z.ZodString;
|
|
235
|
+
}, z.core.$strict>;
|
|
236
|
+
}, z.core.$strict>]>;
|
|
237
|
+
tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
238
|
+
policies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodEnum<{
|
|
239
|
+
ask: "ask";
|
|
240
|
+
deny: "deny";
|
|
241
|
+
}>>>;
|
|
242
|
+
}, z.core.$strict>>>;
|
|
190
243
|
}, z.core.$strip>;
|
|
191
244
|
export type AgentDefinition = z.infer<typeof AgentDefinitionSchema>;
|
|
192
245
|
/** The connectors and extensions a definition's own tool refs name (to read an ambiguous rc key). */
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { validateParams } from "@capybara-hq/plugin-sdk";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { isLegacyBuiltinKey, isLegacyPrefixedKey, legacyToolKey, } from "../tools/legacy-keys.js";
|
|
4
|
+
import { InstructionFilesSchema } from "./instruction-files.js";
|
|
4
5
|
/** 模型引用:供应商插件名 + 模型 id。 */
|
|
5
6
|
export const ModelRef = z.object({ provider: z.string(), model: z.string() });
|
|
6
7
|
/**
|
|
@@ -90,11 +91,60 @@ export const SubagentsSchema = z
|
|
|
90
91
|
dispatchable: z.boolean().optional(),
|
|
91
92
|
})
|
|
92
93
|
.strict();
|
|
94
|
+
/** The key rule of a pending connector (`[a-z0-9-]`, URL-safe: it names the bind route). */
|
|
95
|
+
export const PENDING_CONNECTOR_KEY_RE = /^[a-z0-9][a-z0-9-]{0,63}$/;
|
|
96
|
+
/** Pending connectors an agent may carry (the template's `connectors` limit). */
|
|
97
|
+
export const PENDING_CONNECTORS_MAX = 16;
|
|
98
|
+
/**
|
|
99
|
+
* A connector the template the agent was created from needs and the org has not bound yet
|
|
100
|
+
* (ruling P4-6): `source.template` is the platform connector template's id, `source.needs` a
|
|
101
|
+
* hand-configured connector described by protocol, endpoint and tools (P4-11). `tools` are the
|
|
102
|
+
* tool names to enable once bound (absent = all of a template's tools), `policies` the template's
|
|
103
|
+
* tightened policies by tool name, applied by the bind. Never model-visible: tools are built from
|
|
104
|
+
* `tools` only, and a pending connector has none. Text limits are twice the template's (which
|
|
105
|
+
* counts code points) so any parsed template fits (this schema counts UTF-16 units).
|
|
106
|
+
*/
|
|
107
|
+
const PendingToolName = z.string().min(1).max(256);
|
|
108
|
+
export const PendingConnectorSchema = z
|
|
109
|
+
.object({
|
|
110
|
+
key: z.string().regex(PENDING_CONNECTOR_KEY_RE),
|
|
111
|
+
label: z.string().min(1).max(160),
|
|
112
|
+
source: z.union([
|
|
113
|
+
z.object({ template: z.string().min(1).max(100) }).strict(),
|
|
114
|
+
z
|
|
115
|
+
.object({
|
|
116
|
+
needs: z
|
|
117
|
+
.object({
|
|
118
|
+
protocol: z.enum(["mcp", "openapi"]),
|
|
119
|
+
endpoint: z.string().min(1).max(4096),
|
|
120
|
+
tools: z.array(PendingToolName).max(200),
|
|
121
|
+
label: z.string().min(1).max(160),
|
|
122
|
+
})
|
|
123
|
+
.strict(),
|
|
124
|
+
})
|
|
125
|
+
.strict(),
|
|
126
|
+
]),
|
|
127
|
+
tools: z.array(PendingToolName).max(200).optional(),
|
|
128
|
+
policies: z
|
|
129
|
+
.record(PendingToolName, z.enum(["ask", "deny"]))
|
|
130
|
+
.refine((p) => Object.keys(p).length <= 200, "at most 200 policies")
|
|
131
|
+
.optional(),
|
|
132
|
+
})
|
|
133
|
+
.strict();
|
|
93
134
|
/** Agent 定义:每次变化写一个新版本(`capybara.agent_versions`)。 */
|
|
94
135
|
export const AgentDefinitionSchema = z.object({
|
|
95
136
|
name: z.string().min(1).max(80),
|
|
96
137
|
avatarUrl: z.url().nullable().default(null),
|
|
138
|
+
/**
|
|
139
|
+
* The model-visible system prompt. Derived on save from `instructionFiles` when they are given
|
|
140
|
+
* (`deriveInstructions`); every reader (build.ts, the sub-agent copy, evals, replay) reads this.
|
|
141
|
+
*/
|
|
97
142
|
instructions: z.string().max(100_000).default(""),
|
|
143
|
+
/**
|
|
144
|
+
* The prompt files, the authoring form of `instructions` (spec 2026-11-04 §3.3). No default:
|
|
145
|
+
* definitions without it (every older version) read as one `AGENTS.md` and gain no version.
|
|
146
|
+
*/
|
|
147
|
+
instructionFiles: InstructionFilesSchema.optional(),
|
|
98
148
|
model: ModelRef,
|
|
99
149
|
fallback: ModelRef.nullable().default(null),
|
|
100
150
|
/** 主模型的参数(按主模型的声明校验)。 */
|
|
@@ -132,6 +182,11 @@ export const AgentDefinitionSchema = z.object({
|
|
|
132
182
|
.optional(),
|
|
133
183
|
/** Sub-agents (phase C); offered only when the builtin `Agent` tool is in `tools`. */
|
|
134
184
|
subagents: SubagentsSchema.optional(),
|
|
185
|
+
/**
|
|
186
|
+
* Connectors still to configure (ruling P4-6), written only by creating from a template. No
|
|
187
|
+
* default: definitions without it are unchanged. Model-invisible.
|
|
188
|
+
*/
|
|
189
|
+
pendingConnectors: z.array(PendingConnectorSchema).max(PENDING_CONNECTORS_MAX).optional(),
|
|
135
190
|
});
|
|
136
191
|
const isRecord = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
137
192
|
/**
|