@tickernelz/paperclip-pro-server 2026.1016.2 → 2026.1017.1
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/dist/build-info.json +1 -1
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +2 -0
- package/dist/middleware/auth.js.map +1 -1
- package/dist/routes/access.d.ts.map +1 -1
- package/dist/routes/access.js +24 -10
- package/dist/routes/access.js.map +1 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +60 -10
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/approvals.d.ts.map +1 -1
- package/dist/routes/approvals.js +14 -10
- package/dist/routes/approvals.js.map +1 -1
- package/dist/routes/authz.d.ts +1 -0
- package/dist/routes/authz.d.ts.map +1 -1
- package/dist/routes/authz.js +26 -5
- package/dist/routes/authz.js.map +1 -1
- package/dist/routes/companies.d.ts.map +1 -1
- package/dist/routes/companies.js +18 -21
- package/dist/routes/companies.js.map +1 -1
- package/dist/routes/issues.d.ts.map +1 -1
- package/dist/routes/issues.js +80 -21
- package/dist/routes/issues.js.map +1 -1
- package/dist/routes/paperclip-mcp.d.ts.map +1 -1
- package/dist/routes/paperclip-mcp.js +13 -3
- package/dist/routes/paperclip-mcp.js.map +1 -1
- package/dist/routes/workspace-command-authz.d.ts.map +1 -1
- package/dist/routes/workspace-command-authz.js +2 -1
- package/dist/routes/workspace-command-authz.js.map +1 -1
- package/dist/routes/workspace-runtime-service-authz.d.ts.map +1 -1
- package/dist/routes/workspace-runtime-service-authz.js +5 -2
- package/dist/routes/workspace-runtime-service-authz.js.map +1 -1
- package/dist/services/agent-authority-escalation.js +2 -2
- package/dist/services/agent-authority-escalation.js.map +1 -1
- package/dist/services/attention.d.ts.map +1 -1
- package/dist/services/attention.js +4 -0
- package/dist/services/attention.js.map +1 -1
- package/dist/services/authorization.d.ts +1 -0
- package/dist/services/authorization.d.ts.map +1 -1
- package/dist/services/authorization.js +39 -3
- package/dist/services/authorization.js.map +1 -1
- package/dist/services/heartbeat/retries.d.ts +1 -0
- package/dist/services/heartbeat/retries.d.ts.map +1 -1
- package/dist/services/heartbeat/retries.js +8 -2
- package/dist/services/heartbeat/retries.js.map +1 -1
- package/dist/services/heartbeat/scheduling.d.ts.map +1 -1
- package/dist/services/heartbeat/scheduling.js +83 -2
- package/dist/services/heartbeat/scheduling.js.map +1 -1
- package/dist/services/heartbeat/workspaces.d.ts +4 -0
- package/dist/services/heartbeat/workspaces.d.ts.map +1 -1
- package/dist/services/heartbeat/workspaces.js +46 -9
- package/dist/services/heartbeat/workspaces.js.map +1 -1
- package/dist/services/heartbeat.d.ts.map +1 -1
- package/dist/services/heartbeat.js +3 -3
- package/dist/services/heartbeat.js.map +1 -1
- package/dist/services/native-runtime/status-decision-committer.d.ts +12 -0
- package/dist/services/native-runtime/status-decision-committer.d.ts.map +1 -1
- package/dist/services/native-runtime/status-decision-committer.js +67 -9
- package/dist/services/native-runtime/status-decision-committer.js.map +1 -1
- package/dist/services/native-runtime/task-reassignment.test.js +8 -1
- package/dist/services/native-runtime/task-reassignment.test.js.map +1 -1
- package/dist/services/recovery/service.d.ts +3 -2
- package/dist/services/recovery/service.d.ts.map +1 -1
- package/dist/services/recovery/service.js +12 -1
- package/dist/services/recovery/service.js.map +1 -1
- package/node_modules/@microsoft/teams.api/package.json +4 -4
- package/node_modules/@microsoft/teams.apps/dist/middleware/auth/inbound-activity-token-validator.d.ts +10 -0
- package/node_modules/@microsoft/teams.apps/dist/middleware/auth/inbound-activity-token-validator.js +22 -3
- package/node_modules/@microsoft/teams.apps/package.json +5 -5
- package/node_modules/@microsoft/teams.cards/package.json +2 -2
- package/node_modules/@microsoft/teams.common/package.json +2 -2
- package/node_modules/@microsoft/teams.graph/package.json +3 -3
- package/node_modules/@microsoft/teams.graph-endpoints/package.json +2 -2
- package/package.json +21 -21
- package/ui-dist/assets/{AgentAvatar-DZh8tNnK.js → AgentAvatar-Cy7DadMK.js} +1 -1
- package/ui-dist/assets/{Agents.production-CVULb5cR.js → Agents.production-BJyEbiQk.js} +2 -2
- package/ui-dist/assets/{BreadcrumbContext-Bxr1TyKN.js → BreadcrumbContext-CIC8QOSJ.js} +2 -2
- package/ui-dist/assets/{CompanyActivity.production-Wked11oO.js → CompanyActivity.production-Dp4ldx4P.js} +1 -1
- package/ui-dist/assets/{CompanyExport-CsJNakda.js → CompanyExport-BBAKbfHg.js} +2 -2
- package/ui-dist/assets/{CompanySkills.production-CXPBOlb3.js → CompanySkills.production-XuOHqAg6.js} +3 -3
- package/ui-dist/assets/{EmptyState-DliXLd04.js → EmptyState-Dvu_j1Dk.js} +1 -1
- package/ui-dist/assets/{MarkdownBody-B5ygzgk6.js → MarkdownBody-Dh6kczcO.js} +3 -3
- package/ui-dist/assets/{MarkdownEditor-D7suACD6.js → MarkdownEditor-nPcj3w4g.js} +4 -4
- package/ui-dist/assets/{OrgChart.production-BjDW9Rac.js → OrgChart.production-B-U1K3BO.js} +1 -1
- package/ui-dist/assets/{PageSkeleton-BZF4K6Hf.js → PageSkeleton-B858kNMV.js} +1 -1
- package/ui-dist/assets/{RoutineDetail.production-C03tDWie.js → RoutineDetail.production-DR37hdFP.js} +1 -1
- package/ui-dist/assets/{RoutineRunVariablesDialog-DE5hp-_u.js → RoutineRunVariablesDialog-TmqPj_PL.js} +2 -2
- package/ui-dist/assets/{Routines.production-CDaXZ2Kc.js → Routines.production-D4Jwvus7.js} +1 -1
- package/ui-dist/assets/{StatusIcon-YdJnE47W.js → StatusIcon-PIDWeOS3.js} +1 -1
- package/ui-dist/assets/{ToastContext-Dh8dPdr5.js → ToastContext-B6w8XXdu.js} +1 -1
- package/ui-dist/assets/{agent-avatar-url-BnmqahQ7.js → agent-avatar-url-Dp-4-Emx.js} +1 -1
- package/ui-dist/assets/{alert-dialog-BxpRolrb.js → alert-dialog-Cgn1_GT7.js} +1 -1
- package/ui-dist/assets/{arrow-right-bnOoaiPg.js → arrow-right-Dblp-MTW.js} +1 -1
- package/ui-dist/assets/{badge-D5aOL1Ll.js → badge-B6lcLGFG.js} +1 -1
- package/ui-dist/assets/{bot-DpNd1tv2.js → bot-BIsZWSPn.js} +1 -1
- package/ui-dist/assets/{card-PCL2aF_L.js → card-Byu34cBe.js} +1 -1
- package/ui-dist/assets/{check-BiXfODpl.js → check-AN9f-5s7.js} +1 -1
- package/ui-dist/assets/{checkbox-5wFlZdZn.js → checkbox-DVrU8RYw.js} +1 -1
- package/ui-dist/assets/{clipboard-CTmezHYG.js → clipboard-Bj1LrAus.js} +1 -1
- package/ui-dist/assets/{company-members-Dd6xBf6K.js → company-members-B3Kl56Wi.js} +1 -1
- package/ui-dist/assets/{definition-CjvFnh6k.js → definition-DSY4nExe.js} +1 -1
- package/ui-dist/assets/{dist-BrRwU9U9.js → dist-BoN0lntx.js} +1 -1
- package/ui-dist/assets/{dist-CvM0_U_m.js → dist-DNeg6Olm.js} +1 -1
- package/ui-dist/assets/{dist-CMegW-DS.js → dist-qobNlkwf.js} +1 -1
- package/ui-dist/assets/{environments-Bj-4l7Ol.js → environments-CnsaRGwX.js} +1 -1
- package/ui-dist/assets/{external-link-LnxJtUIq.js → external-link-DJ5KXpF5.js} +1 -1
- package/ui-dist/assets/{file-text-Ba5Wddur.js → file-text-BqJfYVg5.js} +1 -1
- package/ui-dist/assets/{health-D8T5Zr74.js → health-DXJ-aWLi.js} +1 -1
- package/ui-dist/assets/{heartbeats-Dae6h2SU.js → heartbeats-BoD7FLml.js} +1 -1
- package/ui-dist/assets/{index-D4MfEOIw.js → index-BVwUuuxT.js} +168 -168
- package/ui-dist/assets/{input-CtLHwxEw.js → input-BGjNwUvf.js} +1 -1
- package/ui-dist/assets/{label-YjU0jMtG.js → label-CKJXPwWx.js} +2 -2
- package/ui-dist/assets/{mention-chips-ClRmijVb.js → mention-chips-BovBgzq0.js} +1 -1
- package/ui-dist/assets/{rotate-ccw-2WnWy1fs.js → rotate-ccw-B7ntLtp4.js} +1 -1
- package/ui-dist/assets/{select-DRgGQ-iP.js → select-DIma4_VX.js} +1 -1
- package/ui-dist/assets/{sheet-CACWxbsc.js → sheet-C9tsiOQC.js} +1 -1
- package/ui-dist/assets/skeleton-CyS6Uq5n.js +1 -0
- package/ui-dist/assets/{tabs-BfOtoFWj.js → tabs-nc-7quf8.js} +1 -1
- package/ui-dist/assets/{use-adapter-capabilities-JhD0-FlQ.js → use-adapter-capabilities-DiUfxjZz.js} +1 -1
- package/ui-dist/assets/{use-copy-action-qHyHFl14.js → use-copy-action-RWCAx8p8.js} +1 -1
- package/ui-dist/assets/{useHiddenSettings-Dz7GWNDr.js → useHiddenSettings-Be7MTSIM.js} +1 -1
- package/ui-dist/index.html +39 -39
- package/ui-dist/sw.js +1 -1
- package/ui-dist/assets/skeleton-DCrngTtF.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,8BAA8B,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,8BAA8B,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AA6FvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAiEhF,OAAO,EACL,wBAAwB,EAWxB,KAAK,sBAAsB,EAE3B,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAClC,KAAK,sBAAsB,EAK5B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EACV,cAAc,EAUf,MAAM,kCAAkC,CAAC;AAuQ1C,wBAAgB,WAAW,CACzB,EAAE,EAAE,EAAE,EACN,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,2BAA2B,GAAG,2BAA2B,CAAC,CAAC;IACrG,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,6EAA6E;IAC7E,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC;IACtC;;;;;OAKG;IACH,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC;;;OAGG;IACH,wBAAwB,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,IAAI,CAAC;IACvE;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE;QAChB,OAAO,EAAE,6BAA6B,CAAC;QACvC,MAAM,EAAE,sBAAsB,CAAC;QAC/B,yEAAyE;QACzE,KAAK,CAAC,EAAE,sBAAsB,CAAC;QAC/B;;;WAGG;QACH,kBAAkB,CAAC,EAAE,sBAAsB,CAAC;KAC7C,CAAC;CACE,8CA2jOP"}
|
package/dist/routes/agents.js
CHANGED
|
@@ -35,7 +35,7 @@ import path from "node:path";
|
|
|
35
35
|
import { activityLog, agents as agentsTable, chatConversations, companies, heartbeatRuns, issues as issuesTable, projects as projectsTable } from "@tickernelz/paperclip-pro-db";
|
|
36
36
|
import { and, desc, eq, inArray, not, sql } from "drizzle-orm";
|
|
37
37
|
import { sha256Digest } from "../services/feedback-redaction.js";
|
|
38
|
-
import { agentAdapterConfigBatchPreviewSchema, agentAdapterConfigBatchUpdateSchema, agentSkillSyncSchema, agentMineInboxQuerySchema, ADAPTER_AGNOSTIC_KEYS, AGENT_DEFAULT_MAX_CONCURRENT_RUNS, createAgentKeySchema, createAgentHireSchema, createAgentSchema, deriveAgentUrlKey, isUuidLike, normalizeIssueIdentifier, resetAgentSessionSchema, testAdapterEnvironmentSchema, upsertAgentInstructionsFileSchema, restoreAgentInstructionSchema, resolveAgentInstructionCandidateSchema, updateAgentInstructionsBundleSchema, updateAgentPermissionsSchema, updateAgentInstructionsPathSchema, wakeAgentSchema, updateAgentSchema, supportedEnvironmentDriversForAdapter, LOW_TRUST_REVIEW_PRESET, startAdapterAuthSessionRequestSchema, startClaudeSetupTokenSessionRequestSchema, submitBrowserCodeRequestSchema, toAccountHandle, } from "@tickernelz/paperclip-pro-shared";
|
|
38
|
+
import { agentAdapterConfigBatchPreviewSchema, agentAdapterConfigBatchUpdateSchema, agentSkillSyncSchema, agentMineInboxQuerySchema, ADAPTER_AGNOSTIC_KEYS, AGENT_DEFAULT_MAX_CONCURRENT_RUNS, AGENT_MAX_MAX_CONCURRENT_RUNS, AGENT_MIN_MAX_CONCURRENT_RUNS, createAgentKeySchema, createAgentHireSchema, createAgentSchema, deriveAgentUrlKey, isUuidLike, normalizeIssueIdentifier, resetAgentSessionSchema, testAdapterEnvironmentSchema, upsertAgentInstructionsFileSchema, restoreAgentInstructionSchema, resolveAgentInstructionCandidateSchema, updateAgentInstructionsBundleSchema, updateAgentPermissionsSchema, updateAgentInstructionsPathSchema, wakeAgentSchema, updateAgentSchema, supportedEnvironmentDriversForAdapter, LOW_TRUST_REVIEW_PRESET, startAdapterAuthSessionRequestSchema, startClaudeSetupTokenSessionRequestSchema, submitBrowserCodeRequestSchema, toAccountHandle, } from "@tickernelz/paperclip-pro-shared";
|
|
39
39
|
import { isForbiddenConfigEnvKey, normalizePaperclipRunnerAdapterConfig, PAPERCLIP_OPERATIONAL_SKILL_KEY, parseObject, resolvePaperclipInstanceRootForAdapter, readPaperclipSkillSyncPreference, writePaperclipSkillSyncPreference, } from "@tickernelz/paperclip-pro-adapter-utils/server-utils";
|
|
40
40
|
import { trackAgentCreated } from "@tickernelz/paperclip-pro-shared/telemetry";
|
|
41
41
|
import { validate } from "../middleware/validate.js";
|
|
@@ -52,7 +52,7 @@ import { normalizeAgentFallbackModelsConfig } from "../services/model-fallback.j
|
|
|
52
52
|
import { ONBOARDING_FIRST_TASK_SKILL_KEY, PAPERCLIP_CORE_SKILL_KEYS } from "../services/company-skills.js";
|
|
53
53
|
import { createRunSecretRedactionRegistry } from "../services/run-secret-redaction.js";
|
|
54
54
|
import { assertNoAgentAuthorityEscalation } from "../services/agent-authority-escalation.js";
|
|
55
|
-
import { assertAuthenticated, assertBoard, assertBoardOrAgentAuthority, assertCompanyAccess, assertInstanceAdmin, buildActorSecretContext, getAccessibleResource, getActorInfo, hasCompanyAccess } from "./authz.js";
|
|
55
|
+
import { assertAuthenticated, assertBoard, assertBoardOrAgentAuthority, assertCompanyAccess, assertInstanceAdmin, buildActorSecretContext, getAccessibleResource, getActorInfo, hasCompanyAccess, isCompanyOwnerAgentActor } from "./authz.js";
|
|
56
56
|
import { toCompactIssue } from "./issues.js";
|
|
57
57
|
import { runAdapterLoginStartSpine } from "./adapter-login-route-spine.js";
|
|
58
58
|
import { isLoginCommandSupportedAdapterType } from "../services/login-command.js";
|
|
@@ -1490,6 +1490,51 @@ export function agentRoutes(db, options = {}) {
|
|
|
1490
1490
|
if (previousRaw !== nextRaw)
|
|
1491
1491
|
assertInstanceAdmin(req);
|
|
1492
1492
|
}
|
|
1493
|
+
function effectiveMaxConcurrentRuns(runtimeConfig) {
|
|
1494
|
+
const configured = parseNumberLike(asRecord(asRecord(runtimeConfig)?.heartbeat)?.maxConcurrentRuns);
|
|
1495
|
+
if (configured == null)
|
|
1496
|
+
return AGENT_DEFAULT_MAX_CONCURRENT_RUNS;
|
|
1497
|
+
return Math.max(AGENT_MIN_MAX_CONCURRENT_RUNS, Math.min(AGENT_MAX_MAX_CONCURRENT_RUNS, Math.floor(configured)));
|
|
1498
|
+
}
|
|
1499
|
+
function withStoredMaxConcurrentRuns(nextRuntimeConfig, previousRuntimeConfig) {
|
|
1500
|
+
const nextHeartbeat = asRecord(nextRuntimeConfig.heartbeat);
|
|
1501
|
+
if (nextHeartbeat && hasOwn(nextHeartbeat, "maxConcurrentRuns"))
|
|
1502
|
+
return nextRuntimeConfig;
|
|
1503
|
+
const storedHeartbeat = asRecord(asRecord(previousRuntimeConfig)?.heartbeat);
|
|
1504
|
+
if (!storedHeartbeat || !hasOwn(storedHeartbeat, "maxConcurrentRuns"))
|
|
1505
|
+
return nextRuntimeConfig;
|
|
1506
|
+
return {
|
|
1507
|
+
...nextRuntimeConfig,
|
|
1508
|
+
heartbeat: { ...(nextHeartbeat ?? {}), maxConcurrentRuns: storedHeartbeat.maxConcurrentRuns },
|
|
1509
|
+
};
|
|
1510
|
+
}
|
|
1511
|
+
async function assertAgentKeepsMaxConcurrentRuns(req, target, nextRuntimeConfig, previousRuntimeConfig, surface) {
|
|
1512
|
+
if (req.actor.type !== "agent" || isCompanyOwnerAgentActor(req))
|
|
1513
|
+
return;
|
|
1514
|
+
const currentValue = effectiveMaxConcurrentRuns(previousRuntimeConfig);
|
|
1515
|
+
const requestedValue = effectiveMaxConcurrentRuns(nextRuntimeConfig);
|
|
1516
|
+
if (currentValue === requestedValue)
|
|
1517
|
+
return;
|
|
1518
|
+
const actor = getActorInfo(req);
|
|
1519
|
+
await logActivity(db, {
|
|
1520
|
+
companyId: target.companyId,
|
|
1521
|
+
actorType: actor.actorType,
|
|
1522
|
+
actorId: actor.actorId,
|
|
1523
|
+
agentId: actor.agentId,
|
|
1524
|
+
runId: actor.runId,
|
|
1525
|
+
agentApiKeyId: actor.agentApiKeyId,
|
|
1526
|
+
action: "agent.max_concurrent_runs_change_rejected",
|
|
1527
|
+
entityType: "agent",
|
|
1528
|
+
entityId: target.id,
|
|
1529
|
+
details: {
|
|
1530
|
+
surface,
|
|
1531
|
+
field: "runtimeConfig.heartbeat.maxConcurrentRuns",
|
|
1532
|
+
currentValue,
|
|
1533
|
+
requestedValue,
|
|
1534
|
+
},
|
|
1535
|
+
});
|
|
1536
|
+
throw forbidden("Agent-authenticated callers cannot change runtimeConfig.heartbeat.maxConcurrentRuns; ask a board user to change it.", { code: "agent_max_concurrent_runs_change_forbidden" });
|
|
1537
|
+
}
|
|
1493
1538
|
async function assertAgentDefaultEnvironmentSelection(companyId, environmentId, options) {
|
|
1494
1539
|
if (environmentId === undefined || environmentId === null)
|
|
1495
1540
|
return;
|
|
@@ -1972,7 +2017,7 @@ export function agentRoutes(db, options = {}) {
|
|
|
1972
2017
|
throw forbidden(decision.explanation, authorizationDeniedDetails(decision));
|
|
1973
2018
|
}
|
|
1974
2019
|
function assertNoAgentInstructionsConfigMutation(req, adapterConfig, path = "adapterConfig") {
|
|
1975
|
-
if (req.actor.type !== "agent" || !adapterConfig)
|
|
2020
|
+
if (req.actor.type !== "agent" || !adapterConfig || isCompanyOwnerAgentActor(req))
|
|
1976
2021
|
return;
|
|
1977
2022
|
const changedSensitiveKeys = KNOWN_INSTRUCTIONS_BUNDLE_KEYS
|
|
1978
2023
|
.filter((key) => adapterConfig[key] !== undefined)
|
|
@@ -1990,13 +2035,13 @@ export function agentRoutes(db, options = {}) {
|
|
|
1990
2035
|
return KNOWN_INSTRUCTIONS_BUNDLE_KEYS.some((key) => adapterConfig[key] !== undefined);
|
|
1991
2036
|
}
|
|
1992
2037
|
function assertNoAgentAdapterConfigMutation(req, adapterConfig, path = "adapterConfig") {
|
|
1993
|
-
if (req.actor.type === "agent" && ["dotAttachmentAccess", "dotWorkspaceAccess", "dotBindingId"].some(key => hasOwn(adapterConfig, key)))
|
|
2038
|
+
if (req.actor.type === "agent" && !isCompanyOwnerAgentActor(req) && ["dotAttachmentAccess", "dotWorkspaceAccess", "dotBindingId"].some(key => hasOwn(adapterConfig, key)))
|
|
1994
2039
|
throw forbidden("Only an operator can configure Dot attachment access, workspace access, or pairing.");
|
|
1995
2040
|
assertNoAgentInstructionsConfigMutation(req, adapterConfig, path);
|
|
1996
2041
|
assertNoAgentHostWorkspaceCommandMutation(req, collectAgentAdapterWorkspaceCommandPaths(adapterConfig, path));
|
|
1997
2042
|
}
|
|
1998
2043
|
function assertNoAgentProcessAdapterMutation(req, adapterType, mutatesConfiguration) {
|
|
1999
|
-
if (req.actor.type !== "agent" || adapterType !== "process" || !mutatesConfiguration)
|
|
2044
|
+
if (req.actor.type !== "agent" || adapterType !== "process" || !mutatesConfiguration || isCompanyOwnerAgentActor(req))
|
|
2000
2045
|
return;
|
|
2001
2046
|
throw forbidden("Agent keys cannot configure host-executed process adapters.");
|
|
2002
2047
|
}
|
|
@@ -2035,7 +2080,7 @@ export function agentRoutes(db, options = {}) {
|
|
|
2035
2080
|
(allowPlainCredentials && POOL_AUTH_OVERRIDE_ENV_KEYS.includes(key) && asEnvBindingString(value) !== null));
|
|
2036
2081
|
}
|
|
2037
2082
|
function assertNoAgentLocalAdapterHostCommandMutation(req, adapterType, adapterConfig, allowPlainCredentials = false) {
|
|
2038
|
-
if (req.actor.type !== "agent" || !adapterType.endsWith("_local"))
|
|
2083
|
+
if (req.actor.type !== "agent" || !adapterType.endsWith("_local") || isCompanyOwnerAgentActor(req))
|
|
2039
2084
|
return;
|
|
2040
2085
|
const changedKeys = LOCAL_ADAPTER_HOST_COMMAND_KEYS.filter((key) => adapterConfig[key] !== undefined &&
|
|
2041
2086
|
(key !== "env" || !containsOnlyLocalAdapterCredentialRefs(adapterType, adapterConfig.env, allowPlainCredentials)));
|
|
@@ -3293,6 +3338,7 @@ export function agentRoutes(db, options = {}) {
|
|
|
3293
3338
|
throw unprocessable("Invalid revision snapshot");
|
|
3294
3339
|
}
|
|
3295
3340
|
assertProviderTraceSettingTransition(req, rollbackConfig.runtimeConfig, existing.runtimeConfig);
|
|
3341
|
+
await assertAgentKeepsMaxConcurrentRuns(req, existing, rollbackConfig.runtimeConfig, existing.runtimeConfig, "agent.config_rollback");
|
|
3296
3342
|
const rollbackAdapterType = assertKnownAdapterType(typeof rollbackConfig.adapterType === "string"
|
|
3297
3343
|
? rollbackConfig.adapterType
|
|
3298
3344
|
: null);
|
|
@@ -3764,7 +3810,7 @@ export function agentRoutes(db, options = {}) {
|
|
|
3764
3810
|
res.status(403).json({ error: "Forbidden" });
|
|
3765
3811
|
return;
|
|
3766
3812
|
}
|
|
3767
|
-
if (
|
|
3813
|
+
if (!isCompanyOwnerAgentActor(req)) {
|
|
3768
3814
|
res.status(403).json({ error: "Only CEO can manage permissions" });
|
|
3769
3815
|
return;
|
|
3770
3816
|
}
|
|
@@ -3806,7 +3852,7 @@ export function agentRoutes(db, options = {}) {
|
|
|
3806
3852
|
res.json(await buildAgentDetail(agent));
|
|
3807
3853
|
});
|
|
3808
3854
|
router.patch("/agents/:id/instructions-path", validate(updateAgentInstructionsPathSchema), async (req, res) => {
|
|
3809
|
-
if (req.actor.type !== "board") {
|
|
3855
|
+
if (req.actor.type !== "board" && !isCompanyOwnerAgentActor(req)) {
|
|
3810
3856
|
throw forbidden("Only board-authenticated callers can manage instructions path or bundle configuration");
|
|
3811
3857
|
}
|
|
3812
3858
|
const id = req.params.id;
|
|
@@ -4373,6 +4419,10 @@ export function agentRoutes(db, options = {}) {
|
|
|
4373
4419
|
}
|
|
4374
4420
|
assertProviderTraceSettingTransition(req, runtimeConfig, existing.runtimeConfig);
|
|
4375
4421
|
requestedRuntimeConfig = req.actor.source === "mcp_oauth" ? { ...existing.runtimeConfig, ...runtimeConfig } : runtimeConfig;
|
|
4422
|
+
if (req.actor.type === "agent" && !isCompanyOwnerAgentActor(req)) {
|
|
4423
|
+
requestedRuntimeConfig = withStoredMaxConcurrentRuns(requestedRuntimeConfig, existing.runtimeConfig);
|
|
4424
|
+
}
|
|
4425
|
+
await assertAgentKeepsMaxConcurrentRuns(req, existing, requestedRuntimeConfig, existing.runtimeConfig, "agent.patch");
|
|
4376
4426
|
}
|
|
4377
4427
|
const touchesAdapterConfiguration = hasOwn(patchData, "adapterType") ||
|
|
4378
4428
|
hasOwn(patchData, "adapterConfig");
|
|
@@ -4813,7 +4863,7 @@ export function agentRoutes(db, options = {}) {
|
|
|
4813
4863
|
const agent = await getAccessibleResource(req, res, svc.getById(id), "Agent not found");
|
|
4814
4864
|
if (!agent)
|
|
4815
4865
|
return;
|
|
4816
|
-
if (req.actor.type === "agent") {
|
|
4866
|
+
if (req.actor.type === "agent" && !isCompanyOwnerAgentActor(req)) {
|
|
4817
4867
|
if (req.actor.agentId !== id) {
|
|
4818
4868
|
res.status(403).json({ error: "Agent can only invoke itself" });
|
|
4819
4869
|
return;
|
|
@@ -5060,7 +5110,7 @@ export function agentRoutes(db, options = {}) {
|
|
|
5060
5110
|
const agent = await getAccessibleResource(req, res, svc.getById(id), "Agent not found");
|
|
5061
5111
|
if (!agent)
|
|
5062
5112
|
return;
|
|
5063
|
-
if (req.actor.type === "agent") {
|
|
5113
|
+
if (req.actor.type === "agent" && !isCompanyOwnerAgentActor(req)) {
|
|
5064
5114
|
if (req.actor.agentId !== id) {
|
|
5065
5115
|
res.status(403).json({ error: "Agent can only invoke itself" });
|
|
5066
5116
|
return;
|