@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.
- 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 +25 -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 +11 -9
- 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/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/workspaces.d.ts +4 -0
- package/dist/services/heartbeat/workspaces.d.ts.map +1 -1
- package/dist/services/heartbeat/workspaces.js +31 -1
- package/dist/services/heartbeat/workspaces.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/package.json +21 -21
- package/ui-dist/assets/{AgentAvatar-DZh8tNnK.js → AgentAvatar-Cy7DadMK.js} +1 -1
- package/ui-dist/assets/{Agents.production-DpTtM4u0.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-DM91g5Qm.js → CompanyActivity.production-Dp4ldx4P.js} +1 -1
- package/ui-dist/assets/{CompanyExport-BBybWfOl.js → CompanyExport-BBAKbfHg.js} +2 -2
- package/ui-dist/assets/{CompanySkills.production-BhE1n37T.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-v5jbdAkS.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-CL8QlWKs.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-Be0sGmcv.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-INMCT-ER.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-CIfPzMR0.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;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,
|
|
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
|
@@ -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 (
|
|
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;
|