@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.
Files changed (124) hide show
  1. package/dist/build-info.json +1 -1
  2. package/dist/middleware/auth.d.ts.map +1 -1
  3. package/dist/middleware/auth.js +2 -0
  4. package/dist/middleware/auth.js.map +1 -1
  5. package/dist/routes/access.d.ts.map +1 -1
  6. package/dist/routes/access.js +24 -10
  7. package/dist/routes/access.js.map +1 -1
  8. package/dist/routes/agents.d.ts.map +1 -1
  9. package/dist/routes/agents.js +60 -10
  10. package/dist/routes/agents.js.map +1 -1
  11. package/dist/routes/approvals.d.ts.map +1 -1
  12. package/dist/routes/approvals.js +14 -10
  13. package/dist/routes/approvals.js.map +1 -1
  14. package/dist/routes/authz.d.ts +1 -0
  15. package/dist/routes/authz.d.ts.map +1 -1
  16. package/dist/routes/authz.js +26 -5
  17. package/dist/routes/authz.js.map +1 -1
  18. package/dist/routes/companies.d.ts.map +1 -1
  19. package/dist/routes/companies.js +18 -21
  20. package/dist/routes/companies.js.map +1 -1
  21. package/dist/routes/issues.d.ts.map +1 -1
  22. package/dist/routes/issues.js +80 -21
  23. package/dist/routes/issues.js.map +1 -1
  24. package/dist/routes/paperclip-mcp.d.ts.map +1 -1
  25. package/dist/routes/paperclip-mcp.js +13 -3
  26. package/dist/routes/paperclip-mcp.js.map +1 -1
  27. package/dist/routes/workspace-command-authz.d.ts.map +1 -1
  28. package/dist/routes/workspace-command-authz.js +2 -1
  29. package/dist/routes/workspace-command-authz.js.map +1 -1
  30. package/dist/routes/workspace-runtime-service-authz.d.ts.map +1 -1
  31. package/dist/routes/workspace-runtime-service-authz.js +5 -2
  32. package/dist/routes/workspace-runtime-service-authz.js.map +1 -1
  33. package/dist/services/agent-authority-escalation.js +2 -2
  34. package/dist/services/agent-authority-escalation.js.map +1 -1
  35. package/dist/services/attention.d.ts.map +1 -1
  36. package/dist/services/attention.js +4 -0
  37. package/dist/services/attention.js.map +1 -1
  38. package/dist/services/authorization.d.ts +1 -0
  39. package/dist/services/authorization.d.ts.map +1 -1
  40. package/dist/services/authorization.js +39 -3
  41. package/dist/services/authorization.js.map +1 -1
  42. package/dist/services/heartbeat/retries.d.ts +1 -0
  43. package/dist/services/heartbeat/retries.d.ts.map +1 -1
  44. package/dist/services/heartbeat/retries.js +8 -2
  45. package/dist/services/heartbeat/retries.js.map +1 -1
  46. package/dist/services/heartbeat/scheduling.d.ts.map +1 -1
  47. package/dist/services/heartbeat/scheduling.js +83 -2
  48. package/dist/services/heartbeat/scheduling.js.map +1 -1
  49. package/dist/services/heartbeat/workspaces.d.ts +4 -0
  50. package/dist/services/heartbeat/workspaces.d.ts.map +1 -1
  51. package/dist/services/heartbeat/workspaces.js +46 -9
  52. package/dist/services/heartbeat/workspaces.js.map +1 -1
  53. package/dist/services/heartbeat.d.ts.map +1 -1
  54. package/dist/services/heartbeat.js +3 -3
  55. package/dist/services/heartbeat.js.map +1 -1
  56. package/dist/services/native-runtime/status-decision-committer.d.ts +12 -0
  57. package/dist/services/native-runtime/status-decision-committer.d.ts.map +1 -1
  58. package/dist/services/native-runtime/status-decision-committer.js +67 -9
  59. package/dist/services/native-runtime/status-decision-committer.js.map +1 -1
  60. package/dist/services/native-runtime/task-reassignment.test.js +8 -1
  61. package/dist/services/native-runtime/task-reassignment.test.js.map +1 -1
  62. package/dist/services/recovery/service.d.ts +3 -2
  63. package/dist/services/recovery/service.d.ts.map +1 -1
  64. package/dist/services/recovery/service.js +12 -1
  65. package/dist/services/recovery/service.js.map +1 -1
  66. package/node_modules/@microsoft/teams.api/package.json +4 -4
  67. package/node_modules/@microsoft/teams.apps/dist/middleware/auth/inbound-activity-token-validator.d.ts +10 -0
  68. package/node_modules/@microsoft/teams.apps/dist/middleware/auth/inbound-activity-token-validator.js +22 -3
  69. package/node_modules/@microsoft/teams.apps/package.json +5 -5
  70. package/node_modules/@microsoft/teams.cards/package.json +2 -2
  71. package/node_modules/@microsoft/teams.common/package.json +2 -2
  72. package/node_modules/@microsoft/teams.graph/package.json +3 -3
  73. package/node_modules/@microsoft/teams.graph-endpoints/package.json +2 -2
  74. package/package.json +21 -21
  75. package/ui-dist/assets/{AgentAvatar-DZh8tNnK.js → AgentAvatar-Cy7DadMK.js} +1 -1
  76. package/ui-dist/assets/{Agents.production-CVULb5cR.js → Agents.production-BJyEbiQk.js} +2 -2
  77. package/ui-dist/assets/{BreadcrumbContext-Bxr1TyKN.js → BreadcrumbContext-CIC8QOSJ.js} +2 -2
  78. package/ui-dist/assets/{CompanyActivity.production-Wked11oO.js → CompanyActivity.production-Dp4ldx4P.js} +1 -1
  79. package/ui-dist/assets/{CompanyExport-CsJNakda.js → CompanyExport-BBAKbfHg.js} +2 -2
  80. package/ui-dist/assets/{CompanySkills.production-CXPBOlb3.js → CompanySkills.production-XuOHqAg6.js} +3 -3
  81. package/ui-dist/assets/{EmptyState-DliXLd04.js → EmptyState-Dvu_j1Dk.js} +1 -1
  82. package/ui-dist/assets/{MarkdownBody-B5ygzgk6.js → MarkdownBody-Dh6kczcO.js} +3 -3
  83. package/ui-dist/assets/{MarkdownEditor-D7suACD6.js → MarkdownEditor-nPcj3w4g.js} +4 -4
  84. package/ui-dist/assets/{OrgChart.production-BjDW9Rac.js → OrgChart.production-B-U1K3BO.js} +1 -1
  85. package/ui-dist/assets/{PageSkeleton-BZF4K6Hf.js → PageSkeleton-B858kNMV.js} +1 -1
  86. package/ui-dist/assets/{RoutineDetail.production-C03tDWie.js → RoutineDetail.production-DR37hdFP.js} +1 -1
  87. package/ui-dist/assets/{RoutineRunVariablesDialog-DE5hp-_u.js → RoutineRunVariablesDialog-TmqPj_PL.js} +2 -2
  88. package/ui-dist/assets/{Routines.production-CDaXZ2Kc.js → Routines.production-D4Jwvus7.js} +1 -1
  89. package/ui-dist/assets/{StatusIcon-YdJnE47W.js → StatusIcon-PIDWeOS3.js} +1 -1
  90. package/ui-dist/assets/{ToastContext-Dh8dPdr5.js → ToastContext-B6w8XXdu.js} +1 -1
  91. package/ui-dist/assets/{agent-avatar-url-BnmqahQ7.js → agent-avatar-url-Dp-4-Emx.js} +1 -1
  92. package/ui-dist/assets/{alert-dialog-BxpRolrb.js → alert-dialog-Cgn1_GT7.js} +1 -1
  93. package/ui-dist/assets/{arrow-right-bnOoaiPg.js → arrow-right-Dblp-MTW.js} +1 -1
  94. package/ui-dist/assets/{badge-D5aOL1Ll.js → badge-B6lcLGFG.js} +1 -1
  95. package/ui-dist/assets/{bot-DpNd1tv2.js → bot-BIsZWSPn.js} +1 -1
  96. package/ui-dist/assets/{card-PCL2aF_L.js → card-Byu34cBe.js} +1 -1
  97. package/ui-dist/assets/{check-BiXfODpl.js → check-AN9f-5s7.js} +1 -1
  98. package/ui-dist/assets/{checkbox-5wFlZdZn.js → checkbox-DVrU8RYw.js} +1 -1
  99. package/ui-dist/assets/{clipboard-CTmezHYG.js → clipboard-Bj1LrAus.js} +1 -1
  100. package/ui-dist/assets/{company-members-Dd6xBf6K.js → company-members-B3Kl56Wi.js} +1 -1
  101. package/ui-dist/assets/{definition-CjvFnh6k.js → definition-DSY4nExe.js} +1 -1
  102. package/ui-dist/assets/{dist-BrRwU9U9.js → dist-BoN0lntx.js} +1 -1
  103. package/ui-dist/assets/{dist-CvM0_U_m.js → dist-DNeg6Olm.js} +1 -1
  104. package/ui-dist/assets/{dist-CMegW-DS.js → dist-qobNlkwf.js} +1 -1
  105. package/ui-dist/assets/{environments-Bj-4l7Ol.js → environments-CnsaRGwX.js} +1 -1
  106. package/ui-dist/assets/{external-link-LnxJtUIq.js → external-link-DJ5KXpF5.js} +1 -1
  107. package/ui-dist/assets/{file-text-Ba5Wddur.js → file-text-BqJfYVg5.js} +1 -1
  108. package/ui-dist/assets/{health-D8T5Zr74.js → health-DXJ-aWLi.js} +1 -1
  109. package/ui-dist/assets/{heartbeats-Dae6h2SU.js → heartbeats-BoD7FLml.js} +1 -1
  110. package/ui-dist/assets/{index-D4MfEOIw.js → index-BVwUuuxT.js} +168 -168
  111. package/ui-dist/assets/{input-CtLHwxEw.js → input-BGjNwUvf.js} +1 -1
  112. package/ui-dist/assets/{label-YjU0jMtG.js → label-CKJXPwWx.js} +2 -2
  113. package/ui-dist/assets/{mention-chips-ClRmijVb.js → mention-chips-BovBgzq0.js} +1 -1
  114. package/ui-dist/assets/{rotate-ccw-2WnWy1fs.js → rotate-ccw-B7ntLtp4.js} +1 -1
  115. package/ui-dist/assets/{select-DRgGQ-iP.js → select-DIma4_VX.js} +1 -1
  116. package/ui-dist/assets/{sheet-CACWxbsc.js → sheet-C9tsiOQC.js} +1 -1
  117. package/ui-dist/assets/skeleton-CyS6Uq5n.js +1 -0
  118. package/ui-dist/assets/{tabs-BfOtoFWj.js → tabs-nc-7quf8.js} +1 -1
  119. package/ui-dist/assets/{use-adapter-capabilities-JhD0-FlQ.js → use-adapter-capabilities-DiUfxjZz.js} +1 -1
  120. package/ui-dist/assets/{use-copy-action-qHyHFl14.js → use-copy-action-RWCAx8p8.js} +1 -1
  121. package/ui-dist/assets/{useHiddenSettings-Dz7GWNDr.js → useHiddenSettings-Be7MTSIM.js} +1 -1
  122. package/ui-dist/index.html +39 -39
  123. package/ui-dist/sw.js +1 -1
  124. 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;AA2FvE,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,8CAm/NP"}
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"}
@@ -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 (actorAgent.role !== "ceo") {
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;