@tickernelz/paperclip-pro-server 2026.1017.0 → 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 (95) 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 +25 -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 +11 -9
  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/authorization.d.ts +1 -0
  36. package/dist/services/authorization.d.ts.map +1 -1
  37. package/dist/services/authorization.js +39 -3
  38. package/dist/services/authorization.js.map +1 -1
  39. package/dist/services/heartbeat/workspaces.d.ts +4 -0
  40. package/dist/services/heartbeat/workspaces.d.ts.map +1 -1
  41. package/dist/services/heartbeat/workspaces.js +31 -1
  42. package/dist/services/heartbeat/workspaces.js.map +1 -1
  43. package/dist/services/native-runtime/task-reassignment.test.js +8 -1
  44. package/dist/services/native-runtime/task-reassignment.test.js.map +1 -1
  45. package/package.json +21 -21
  46. package/ui-dist/assets/{AgentAvatar-DZh8tNnK.js → AgentAvatar-Cy7DadMK.js} +1 -1
  47. package/ui-dist/assets/{Agents.production-DpTtM4u0.js → Agents.production-BJyEbiQk.js} +2 -2
  48. package/ui-dist/assets/{BreadcrumbContext-Bxr1TyKN.js → BreadcrumbContext-CIC8QOSJ.js} +2 -2
  49. package/ui-dist/assets/{CompanyActivity.production-DM91g5Qm.js → CompanyActivity.production-Dp4ldx4P.js} +1 -1
  50. package/ui-dist/assets/{CompanyExport-BBybWfOl.js → CompanyExport-BBAKbfHg.js} +2 -2
  51. package/ui-dist/assets/{CompanySkills.production-BhE1n37T.js → CompanySkills.production-XuOHqAg6.js} +3 -3
  52. package/ui-dist/assets/{EmptyState-DliXLd04.js → EmptyState-Dvu_j1Dk.js} +1 -1
  53. package/ui-dist/assets/{MarkdownBody-B5ygzgk6.js → MarkdownBody-Dh6kczcO.js} +3 -3
  54. package/ui-dist/assets/{MarkdownEditor-D7suACD6.js → MarkdownEditor-nPcj3w4g.js} +4 -4
  55. package/ui-dist/assets/{OrgChart.production-v5jbdAkS.js → OrgChart.production-B-U1K3BO.js} +1 -1
  56. package/ui-dist/assets/{PageSkeleton-BZF4K6Hf.js → PageSkeleton-B858kNMV.js} +1 -1
  57. package/ui-dist/assets/{RoutineDetail.production-CL8QlWKs.js → RoutineDetail.production-DR37hdFP.js} +1 -1
  58. package/ui-dist/assets/{RoutineRunVariablesDialog-DE5hp-_u.js → RoutineRunVariablesDialog-TmqPj_PL.js} +2 -2
  59. package/ui-dist/assets/{Routines.production-Be0sGmcv.js → Routines.production-D4Jwvus7.js} +1 -1
  60. package/ui-dist/assets/{StatusIcon-YdJnE47W.js → StatusIcon-PIDWeOS3.js} +1 -1
  61. package/ui-dist/assets/{ToastContext-Dh8dPdr5.js → ToastContext-B6w8XXdu.js} +1 -1
  62. package/ui-dist/assets/{agent-avatar-url-BnmqahQ7.js → agent-avatar-url-Dp-4-Emx.js} +1 -1
  63. package/ui-dist/assets/{alert-dialog-BxpRolrb.js → alert-dialog-Cgn1_GT7.js} +1 -1
  64. package/ui-dist/assets/{arrow-right-bnOoaiPg.js → arrow-right-Dblp-MTW.js} +1 -1
  65. package/ui-dist/assets/{badge-D5aOL1Ll.js → badge-B6lcLGFG.js} +1 -1
  66. package/ui-dist/assets/{bot-DpNd1tv2.js → bot-BIsZWSPn.js} +1 -1
  67. package/ui-dist/assets/{card-PCL2aF_L.js → card-Byu34cBe.js} +1 -1
  68. package/ui-dist/assets/{check-BiXfODpl.js → check-AN9f-5s7.js} +1 -1
  69. package/ui-dist/assets/{checkbox-5wFlZdZn.js → checkbox-DVrU8RYw.js} +1 -1
  70. package/ui-dist/assets/{clipboard-CTmezHYG.js → clipboard-Bj1LrAus.js} +1 -1
  71. package/ui-dist/assets/{company-members-Dd6xBf6K.js → company-members-B3Kl56Wi.js} +1 -1
  72. package/ui-dist/assets/{definition-INMCT-ER.js → definition-DSY4nExe.js} +1 -1
  73. package/ui-dist/assets/{dist-BrRwU9U9.js → dist-BoN0lntx.js} +1 -1
  74. package/ui-dist/assets/{dist-CvM0_U_m.js → dist-DNeg6Olm.js} +1 -1
  75. package/ui-dist/assets/{dist-CMegW-DS.js → dist-qobNlkwf.js} +1 -1
  76. package/ui-dist/assets/{environments-Bj-4l7Ol.js → environments-CnsaRGwX.js} +1 -1
  77. package/ui-dist/assets/{external-link-LnxJtUIq.js → external-link-DJ5KXpF5.js} +1 -1
  78. package/ui-dist/assets/{file-text-Ba5Wddur.js → file-text-BqJfYVg5.js} +1 -1
  79. package/ui-dist/assets/{health-D8T5Zr74.js → health-DXJ-aWLi.js} +1 -1
  80. package/ui-dist/assets/{heartbeats-Dae6h2SU.js → heartbeats-BoD7FLml.js} +1 -1
  81. package/ui-dist/assets/{index-CIfPzMR0.js → index-BVwUuuxT.js} +168 -168
  82. package/ui-dist/assets/{input-CtLHwxEw.js → input-BGjNwUvf.js} +1 -1
  83. package/ui-dist/assets/{label-YjU0jMtG.js → label-CKJXPwWx.js} +2 -2
  84. package/ui-dist/assets/{mention-chips-ClRmijVb.js → mention-chips-BovBgzq0.js} +1 -1
  85. package/ui-dist/assets/{rotate-ccw-2WnWy1fs.js → rotate-ccw-B7ntLtp4.js} +1 -1
  86. package/ui-dist/assets/{select-DRgGQ-iP.js → select-DIma4_VX.js} +1 -1
  87. package/ui-dist/assets/{sheet-CACWxbsc.js → sheet-C9tsiOQC.js} +1 -1
  88. package/ui-dist/assets/skeleton-CyS6Uq5n.js +1 -0
  89. package/ui-dist/assets/{tabs-BfOtoFWj.js → tabs-nc-7quf8.js} +1 -1
  90. package/ui-dist/assets/{use-adapter-capabilities-JhD0-FlQ.js → use-adapter-capabilities-DiUfxjZz.js} +1 -1
  91. package/ui-dist/assets/{use-copy-action-qHyHFl14.js → use-copy-action-RWCAx8p8.js} +1 -1
  92. package/ui-dist/assets/{useHiddenSettings-Dz7GWNDr.js → useHiddenSettings-Be7MTSIM.js} +1 -1
  93. package/ui-dist/index.html +39 -39
  94. package/ui-dist/sw.js +1 -1
  95. 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;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,8CA0iOP"}
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"}
@@ -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";
@@ -1496,8 +1496,20 @@ export function agentRoutes(db, options = {}) {
1496
1496
  return AGENT_DEFAULT_MAX_CONCURRENT_RUNS;
1497
1497
  return Math.max(AGENT_MIN_MAX_CONCURRENT_RUNS, Math.min(AGENT_MAX_MAX_CONCURRENT_RUNS, Math.floor(configured)));
1498
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
+ }
1499
1511
  async function assertAgentKeepsMaxConcurrentRuns(req, target, nextRuntimeConfig, previousRuntimeConfig, surface) {
1500
- if (req.actor.type !== "agent")
1512
+ if (req.actor.type !== "agent" || isCompanyOwnerAgentActor(req))
1501
1513
  return;
1502
1514
  const currentValue = effectiveMaxConcurrentRuns(previousRuntimeConfig);
1503
1515
  const requestedValue = effectiveMaxConcurrentRuns(nextRuntimeConfig);
@@ -2005,7 +2017,7 @@ export function agentRoutes(db, options = {}) {
2005
2017
  throw forbidden(decision.explanation, authorizationDeniedDetails(decision));
2006
2018
  }
2007
2019
  function assertNoAgentInstructionsConfigMutation(req, adapterConfig, path = "adapterConfig") {
2008
- if (req.actor.type !== "agent" || !adapterConfig)
2020
+ if (req.actor.type !== "agent" || !adapterConfig || isCompanyOwnerAgentActor(req))
2009
2021
  return;
2010
2022
  const changedSensitiveKeys = KNOWN_INSTRUCTIONS_BUNDLE_KEYS
2011
2023
  .filter((key) => adapterConfig[key] !== undefined)
@@ -2023,13 +2035,13 @@ export function agentRoutes(db, options = {}) {
2023
2035
  return KNOWN_INSTRUCTIONS_BUNDLE_KEYS.some((key) => adapterConfig[key] !== undefined);
2024
2036
  }
2025
2037
  function assertNoAgentAdapterConfigMutation(req, adapterConfig, path = "adapterConfig") {
2026
- 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)))
2027
2039
  throw forbidden("Only an operator can configure Dot attachment access, workspace access, or pairing.");
2028
2040
  assertNoAgentInstructionsConfigMutation(req, adapterConfig, path);
2029
2041
  assertNoAgentHostWorkspaceCommandMutation(req, collectAgentAdapterWorkspaceCommandPaths(adapterConfig, path));
2030
2042
  }
2031
2043
  function assertNoAgentProcessAdapterMutation(req, adapterType, mutatesConfiguration) {
2032
- if (req.actor.type !== "agent" || adapterType !== "process" || !mutatesConfiguration)
2044
+ if (req.actor.type !== "agent" || adapterType !== "process" || !mutatesConfiguration || isCompanyOwnerAgentActor(req))
2033
2045
  return;
2034
2046
  throw forbidden("Agent keys cannot configure host-executed process adapters.");
2035
2047
  }
@@ -2068,7 +2080,7 @@ export function agentRoutes(db, options = {}) {
2068
2080
  (allowPlainCredentials && POOL_AUTH_OVERRIDE_ENV_KEYS.includes(key) && asEnvBindingString(value) !== null));
2069
2081
  }
2070
2082
  function assertNoAgentLocalAdapterHostCommandMutation(req, adapterType, adapterConfig, allowPlainCredentials = false) {
2071
- if (req.actor.type !== "agent" || !adapterType.endsWith("_local"))
2083
+ if (req.actor.type !== "agent" || !adapterType.endsWith("_local") || isCompanyOwnerAgentActor(req))
2072
2084
  return;
2073
2085
  const changedKeys = LOCAL_ADAPTER_HOST_COMMAND_KEYS.filter((key) => adapterConfig[key] !== undefined &&
2074
2086
  (key !== "env" || !containsOnlyLocalAdapterCredentialRefs(adapterType, adapterConfig.env, allowPlainCredentials)));
@@ -3798,7 +3810,7 @@ export function agentRoutes(db, options = {}) {
3798
3810
  res.status(403).json({ error: "Forbidden" });
3799
3811
  return;
3800
3812
  }
3801
- if (actorAgent.role !== "ceo") {
3813
+ if (!isCompanyOwnerAgentActor(req)) {
3802
3814
  res.status(403).json({ error: "Only CEO can manage permissions" });
3803
3815
  return;
3804
3816
  }
@@ -3840,7 +3852,7 @@ export function agentRoutes(db, options = {}) {
3840
3852
  res.json(await buildAgentDetail(agent));
3841
3853
  });
3842
3854
  router.patch("/agents/:id/instructions-path", validate(updateAgentInstructionsPathSchema), async (req, res) => {
3843
- if (req.actor.type !== "board") {
3855
+ if (req.actor.type !== "board" && !isCompanyOwnerAgentActor(req)) {
3844
3856
  throw forbidden("Only board-authenticated callers can manage instructions path or bundle configuration");
3845
3857
  }
3846
3858
  const id = req.params.id;
@@ -4407,6 +4419,9 @@ export function agentRoutes(db, options = {}) {
4407
4419
  }
4408
4420
  assertProviderTraceSettingTransition(req, runtimeConfig, existing.runtimeConfig);
4409
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
+ }
4410
4425
  await assertAgentKeepsMaxConcurrentRuns(req, existing, requestedRuntimeConfig, existing.runtimeConfig, "agent.patch");
4411
4426
  }
4412
4427
  const touchesAdapterConfiguration = hasOwn(patchData, "adapterType") ||
@@ -4848,7 +4863,7 @@ export function agentRoutes(db, options = {}) {
4848
4863
  const agent = await getAccessibleResource(req, res, svc.getById(id), "Agent not found");
4849
4864
  if (!agent)
4850
4865
  return;
4851
- if (req.actor.type === "agent") {
4866
+ if (req.actor.type === "agent" && !isCompanyOwnerAgentActor(req)) {
4852
4867
  if (req.actor.agentId !== id) {
4853
4868
  res.status(403).json({ error: "Agent can only invoke itself" });
4854
4869
  return;
@@ -5095,7 +5110,7 @@ export function agentRoutes(db, options = {}) {
5095
5110
  const agent = await getAccessibleResource(req, res, svc.getById(id), "Agent not found");
5096
5111
  if (!agent)
5097
5112
  return;
5098
- if (req.actor.type === "agent") {
5113
+ if (req.actor.type === "agent" && !isCompanyOwnerAgentActor(req)) {
5099
5114
  if (req.actor.agentId !== id) {
5100
5115
  res.status(403).json({ error: "Agent can only invoke itself" });
5101
5116
  return;