@tickernelz/paperclip-pro-server 2026.926.0 → 2026.926.2

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/routes/agents.d.ts.map +1 -1
  3. package/dist/routes/agents.js +116 -1
  4. package/dist/routes/agents.js.map +1 -1
  5. package/dist/routes/issues.d.ts.map +1 -1
  6. package/dist/routes/issues.js +79 -6
  7. package/dist/routes/issues.js.map +1 -1
  8. package/dist/routes/openapi.d.ts.map +1 -1
  9. package/dist/routes/openapi.js +30 -1
  10. package/dist/routes/openapi.js.map +1 -1
  11. package/dist/services/adapter-config-field-value.d.ts +12 -0
  12. package/dist/services/adapter-config-field-value.d.ts.map +1 -0
  13. package/dist/services/adapter-config-field-value.js +31 -0
  14. package/dist/services/adapter-config-field-value.js.map +1 -0
  15. package/dist/services/agent-adapter-config-batch.d.ts +26 -0
  16. package/dist/services/agent-adapter-config-batch.d.ts.map +1 -0
  17. package/dist/services/agent-adapter-config-batch.js +174 -0
  18. package/dist/services/agent-adapter-config-batch.js.map +1 -0
  19. package/dist/services/heartbeat.d.ts +4 -4
  20. package/dist/services/issue-model-override-inheritance.d.ts +13 -0
  21. package/dist/services/issue-model-override-inheritance.d.ts.map +1 -0
  22. package/dist/services/issue-model-override-inheritance.js +68 -0
  23. package/dist/services/issue-model-override-inheritance.js.map +1 -0
  24. package/dist/services/issue-run-model-override.d.ts +19 -4
  25. package/dist/services/issue-run-model-override.d.ts.map +1 -1
  26. package/dist/services/issue-run-model-override.js +71 -22
  27. package/dist/services/issue-run-model-override.js.map +1 -1
  28. package/dist/services/issues.d.ts.map +1 -1
  29. package/dist/services/issues.js +21 -0
  30. package/dist/services/issues.js.map +1 -1
  31. package/dist/services/native-runtime/native-session-executor.d.ts +1 -1
  32. package/dist/services/native-runtime/native-session-executor.d.ts.map +1 -1
  33. package/package.json +20 -20
  34. package/ui-dist/assets/{AgentAvatar-CWNp7Eqe.js → AgentAvatar-CnpBTXF0.js} +1 -1
  35. package/ui-dist/assets/{AgentIdentity-Bqzrcghn.js → AgentIdentity-CV55DQtR.js} +1 -1
  36. package/ui-dist/assets/{Agents.production-Cs7mMvAL.js → Agents.production-5Tba_pW_.js} +2 -2
  37. package/ui-dist/assets/{CompanyActivity.production-4bljbHSU.js → CompanyActivity.production-CONFWTe1.js} +1 -1
  38. package/ui-dist/assets/{CompanyExport-CBh7R3lQ.js → CompanyExport-CiOVCS4y.js} +1 -1
  39. package/ui-dist/assets/{CompanySkills.production-DEleeGzs.js → CompanySkills.production-gv4ej6PI.js} +1 -1
  40. package/ui-dist/assets/{Costs.production-Dm5j2nxX.js → Costs.production-C6rOIGNV.js} +1 -1
  41. package/ui-dist/assets/{EmptyState-D62UDLDa.js → EmptyState-DeVTy8IU.js} +1 -1
  42. package/ui-dist/assets/{MarkdownBody-DfGkmx3G.js → MarkdownBody-Da7yUIDf.js} +1 -1
  43. package/ui-dist/assets/{MarkdownEditor-ZwstkvWb.js → MarkdownEditor-7JCtdEaZ.js} +1 -1
  44. package/ui-dist/assets/{OrgChart.production-BWKofGdO.js → OrgChart.production-DYeuFtY_.js} +1 -1
  45. package/ui-dist/assets/{PageSkeleton-C0pPO_Gb.js → PageSkeleton-DRRnaWWU.js} +1 -1
  46. package/ui-dist/assets/{RoutineDetail.production-_auZa0K9.js → RoutineDetail.production-Bt4IHfSD.js} +1 -1
  47. package/ui-dist/assets/RoutineRunVariablesDialog-Bj-Q_Ua3.js +5 -0
  48. package/ui-dist/assets/{Routines.production-D8R6Ujt6.js → Routines.production-BBxSwg2A.js} +1 -1
  49. package/ui-dist/assets/{SidebarContext-B3vvFvTk.js → SidebarContext-CxjppFTY.js} +1 -1
  50. package/ui-dist/assets/{StatusIcon-BYqGFWup.js → StatusIcon-j05cEqDO.js} +1 -1
  51. package/ui-dist/assets/agents-ZcIBncVi.js +1 -0
  52. package/ui-dist/assets/{badge-CW7lQ_Zd.js → badge-B4sBXDQo.js} +1 -1
  53. package/ui-dist/assets/{bot-DIsSOxfs.js → bot-CcFVz40n.js} +1 -1
  54. package/ui-dist/assets/{button-BYQHEF4e.js → button-LkWt40cm.js} +1 -1
  55. package/ui-dist/assets/{card-CFXZOYds.js → card-DbvoJZ3K.js} +1 -1
  56. package/ui-dist/assets/{check-Cniv3It0.js → check-CgfxcCMv.js} +1 -1
  57. package/ui-dist/assets/{checkbox-MLVUJCCS.js → checkbox-CLAkJpms.js} +1 -1
  58. package/ui-dist/assets/{chevron-down-Dq0fsCvv.js → chevron-down-CpKmud_n.js} +1 -1
  59. package/ui-dist/assets/{chevron-right-C4o2Lqna.js → chevron-right-IZydUoW5.js} +1 -1
  60. package/ui-dist/assets/{clipboard-CfEDu5my.js → clipboard-CjMs5cp9.js} +1 -1
  61. package/ui-dist/assets/{company-members-tdITTHFY.js → company-members-Dyq_pnza.js} +1 -1
  62. package/ui-dist/assets/createLucideIcon-CZEG6UJ7.js +92 -0
  63. package/ui-dist/assets/{definition-B5Yyiufk.js → definition-B49KTmLW.js} +1 -1
  64. package/ui-dist/assets/{dist-DCpDFPbp.js → dist-Cqh7BG-j.js} +1 -1
  65. package/ui-dist/assets/{dist-bQQ2HFhw.js → dist-pDmgIRxg.js} +1 -1
  66. package/ui-dist/assets/{environments-awDXeIDD.js → environments-xbdxVBLT.js} +1 -1
  67. package/ui-dist/assets/{external-link-3uv6Ak2X.js → external-link-BbeUY6zf.js} +1 -1
  68. package/ui-dist/assets/{file-text-DWMD8a2i.js → file-text-BMJQ4LZs.js} +1 -1
  69. package/ui-dist/assets/{health-DY_y3c9e.js → health-Bj6kLXe5.js} +1 -1
  70. package/ui-dist/assets/{heartbeats-BQipXQOf.js → heartbeats-DFiFf4Zf.js} +1 -1
  71. package/ui-dist/assets/{index-N4w1Oco1.js → index-BRCs87uX.js} +162 -162
  72. package/ui-dist/assets/index-GCNIGBzC.css +1 -0
  73. package/ui-dist/assets/{input-B7ODc-rR.js → input-a7SggR2b.js} +1 -1
  74. package/ui-dist/assets/label-Dnc69R1W.js +5 -0
  75. package/ui-dist/assets/{loader-circle-DA6xS_rG.js → loader-circle-Cu72DKdC.js} +1 -1
  76. package/ui-dist/assets/{mention-chips-r4UB4Eiw.js → mention-chips-BEaOTvHT.js} +1 -1
  77. package/ui-dist/assets/{octagon-alert-DsI0y-RL.js → octagon-alert-DfqJ6RjK.js} +1 -1
  78. package/ui-dist/assets/{rotate-ccw-D6pz3VoJ.js → rotate-ccw-DiFaj3XM.js} +1 -1
  79. package/ui-dist/assets/{router-DcMYq5w_.js → router-G1KztA90.js} +1 -1
  80. package/ui-dist/assets/{save-CvrYa2yq.js → save-D9PtvKKu.js} +1 -1
  81. package/ui-dist/assets/{select-CV7s_3g2.js → select-DSr2hsz2.js} +1 -1
  82. package/ui-dist/assets/{sheet-CrBXG9pk.js → sheet-H27vJn3G.js} +1 -1
  83. package/ui-dist/assets/{skeleton-efW_R0t3.js → skeleton-CPVPMT4g.js} +1 -1
  84. package/ui-dist/assets/{tabs-4RdauNv3.js → tabs-D8G3-AL7.js} +1 -1
  85. package/ui-dist/assets/{triangle-alert-DQUol3t5.js → triangle-alert-DiD4Atur.js} +1 -1
  86. package/ui-dist/assets/{use-adapter-capabilities-pFfW1mOk.js → use-adapter-capabilities-D_QCYxa2.js} +1 -1
  87. package/ui-dist/assets/{useHiddenSettings-b1eurTXV.js → useHiddenSettings-vbDpbX0U.js} +1 -1
  88. package/ui-dist/assets/{zap-CKzX0hdL.js → zap-CCqZhqc3.js} +1 -1
  89. package/ui-dist/index.html +46 -46
  90. package/ui-dist/sw.js +1 -1
  91. package/ui-dist/assets/RoutineRunVariablesDialog-CUcwhS7L.js +0 -5
  92. package/ui-dist/assets/agents-CNina7HI.js +0 -1
  93. package/ui-dist/assets/createLucideIcon-CINAT48M.js +0 -92
  94. package/ui-dist/assets/index-BAoNTaz4.css +0 -1
  95. package/ui-dist/assets/label-BnqmTeef.js +0 -5
@@ -1,3 +1,3 @@
1
1
  {
2
- "commit": "185366d797dcf9fceeba036889b27bfddf783d56"
2
+ "commit": "3e59cc738507236084196e82e7632a1698d6a62e"
3
3
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,8BAA8B,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AA4EvE,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;AA2P1C,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,8CAg3NP"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/routes/agents.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,8BAA8B,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAkFvE,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;AA2P1C,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,8CA2/NP"}
@@ -18,12 +18,13 @@ import path from "node:path";
18
18
  import { activityLog, agents as agentsTable, chatConversations, companies, heartbeatRuns, issues as issuesTable, projects as projectsTable } from "@tickernelz/paperclip-pro-db";
19
19
  import { and, desc, eq, inArray, not, sql } from "drizzle-orm";
20
20
  import { sha256Digest } from "../services/feedback-redaction.js";
21
- import { agentSkillSyncSchema, agentMineInboxQuerySchema, ADAPTER_AGNOSTIC_KEYS, AGENT_DEFAULT_MAX_CONCURRENT_RUNS, createAgentKeySchema, createAgentHireSchema, createAgentSchema, deriveAgentUrlKey, isUuidLike, normalizeIssueIdentifier, resetAgentSessionSchema, testAdapterEnvironmentSchema, upsertAgentInstructionsFileSchema, updateAgentInstructionsBundleSchema, updateAgentPermissionsSchema, updateAgentInstructionsPathSchema, wakeAgentSchema, updateAgentSchema, supportedEnvironmentDriversForAdapter, LOW_TRUST_REVIEW_PRESET, startAdapterAuthSessionRequestSchema, startClaudeSetupTokenSessionRequestSchema, submitBrowserCodeRequestSchema, toAccountHandle, } from "@tickernelz/paperclip-pro-shared";
21
+ import { agentAdapterConfigBatchPreviewSchema, agentAdapterConfigBatchUpdateSchema, agentSkillSyncSchema, agentMineInboxQuerySchema, ADAPTER_AGNOSTIC_KEYS, AGENT_DEFAULT_MAX_CONCURRENT_RUNS, createAgentKeySchema, createAgentHireSchema, createAgentSchema, deriveAgentUrlKey, isUuidLike, normalizeIssueIdentifier, resetAgentSessionSchema, testAdapterEnvironmentSchema, upsertAgentInstructionsFileSchema, updateAgentInstructionsBundleSchema, updateAgentPermissionsSchema, updateAgentInstructionsPathSchema, wakeAgentSchema, updateAgentSchema, supportedEnvironmentDriversForAdapter, LOW_TRUST_REVIEW_PRESET, startAdapterAuthSessionRequestSchema, startClaudeSetupTokenSessionRequestSchema, submitBrowserCodeRequestSchema, toAccountHandle, } from "@tickernelz/paperclip-pro-shared";
22
22
  import { isForbiddenConfigEnvKey, normalizePaperclipRunnerAdapterConfig, PAPERCLIP_OPERATIONAL_SKILL_KEY, parseObject, resolvePaperclipInstanceRootForAdapter, readPaperclipSkillSyncPreference, writePaperclipSkillSyncPreference, } from "@tickernelz/paperclip-pro-adapter-utils/server-utils";
23
23
  import { trackAgentCreated } from "@tickernelz/paperclip-pro-shared/telemetry";
24
24
  import { validate } from "../middleware/validate.js";
25
25
  import { inheritNativeRunnerAdapterConfig } from "../services/native-runtime/native-agent-runtime-inheritance.js";
26
26
  import { agentInstructionsBundleMode } from "../services/agent-instructions.js";
27
+ import { buildAgentAdapterConfigBatchPreview, planAgentAdapterConfigBatch, } from "../services/agent-adapter-config-batch.js";
27
28
  import { agentService, agentInstructionsService, accessService, approvalService, builtInAgentService, companySkillService, budgetService, heartbeatService, ISSUE_LIST_DEFAULT_LIMIT, issueApprovalService, issueRecoveryActionService, issueService, logActivity, syncInstructionsBundleConfigFromFilePath, workspaceOperationService, } from "../services/index.js";
28
29
  import { badRequest, conflict, forbidden, HttpError, notFound, unprocessable } from "../errors.js";
29
30
  import { ONBOARDING_FIRST_TASK_SKILL_KEY, PAPERCLIP_CORE_SKILL_KEYS } from "../services/company-skills.js";
@@ -4220,6 +4221,120 @@ export function agentRoutes(db, options = {}) {
4220
4221
  });
4221
4222
  res.json(result.bundle);
4222
4223
  });
4224
+ async function loadAgentBatchTargets(req, res, agentIds) {
4225
+ const seen = {};
4226
+ const loaded = [];
4227
+ for (const agentId of agentIds) {
4228
+ if (seen[agentId])
4229
+ continue;
4230
+ seen[agentId] = true;
4231
+ const agent = await getAccessibleResource(req, res, svc.getById(agentId), "Agent not found");
4232
+ if (!agent)
4233
+ return null;
4234
+ loaded.push(agent);
4235
+ }
4236
+ const companyIds = new Set(loaded.map((agent) => agent.companyId));
4237
+ if (companyIds.size > 1) {
4238
+ throw forbidden("A batch cannot span companies");
4239
+ }
4240
+ const companyId = loaded[0].companyId;
4241
+ assertBoardOrAgentAuthority(req, "company:agents", companyId);
4242
+ return loaded;
4243
+ }
4244
+ router.post("/agents/batch/adapter-config/preview", validate(agentAdapterConfigBatchPreviewSchema), async (req, res) => {
4245
+ const targets = await loadAgentBatchTargets(req, res, req.body.agentIds);
4246
+ if (!targets)
4247
+ return;
4248
+ for (const agent of targets)
4249
+ await assertCanReadAgent(req, agent);
4250
+ res.json(await buildAgentAdapterConfigBatchPreview(targets.map((agent) => ({
4251
+ id: agent.id,
4252
+ name: agent.name,
4253
+ adapterType: agent.adapterType,
4254
+ adapterConfig: (asRecord(agent.adapterConfig) ?? {}),
4255
+ }))));
4256
+ });
4257
+ router.post("/agents/batch/adapter-config", validate(agentAdapterConfigBatchUpdateSchema), async (req, res) => {
4258
+ const targets = await loadAgentBatchTargets(req, res, req.body.agentIds);
4259
+ if (!targets)
4260
+ return;
4261
+ const values = req.body.values;
4262
+ assertNoAgentAdapterConfigMutation(req, values, "values");
4263
+ for (const agent of targets) {
4264
+ assertExternalInstructionsAdmin(req, agent);
4265
+ await assertCanUpdateAgent(req, agent);
4266
+ }
4267
+ const plan = await planAgentAdapterConfigBatch(targets.map((agent) => ({
4268
+ id: agent.id,
4269
+ name: agent.name,
4270
+ adapterType: agent.adapterType,
4271
+ adapterConfig: (asRecord(agent.adapterConfig) ?? {}),
4272
+ })), values);
4273
+ if (!plan.ok) {
4274
+ res.status(422).json({
4275
+ error: "No agent was changed: some values are invalid for their adapter.",
4276
+ failures: plan.failures,
4277
+ });
4278
+ return;
4279
+ }
4280
+ const actor = getActorInfo(req);
4281
+ const results = [];
4282
+ for (const entry of plan.entries) {
4283
+ if (entry.changedKeys.length === 0) {
4284
+ results.push({
4285
+ agentId: entry.agent.id,
4286
+ name: entry.agent.name,
4287
+ status: "unchanged",
4288
+ changedKeys: [],
4289
+ });
4290
+ continue;
4291
+ }
4292
+ const normalizedAdapterConfig = await normalizeMediatedAdapterConfigForPersistence({
4293
+ companyId: targets[0].companyId,
4294
+ adapterType: entry.agent.adapterType,
4295
+ adapterConfig: entry.adapterConfig,
4296
+ });
4297
+ const updated = await svc.update(entry.agent.id, { adapterConfig: normalizedAdapterConfig }, {
4298
+ recordRevision: {
4299
+ createdByAgentId: actor.agentId,
4300
+ createdByUserId: actor.actorType === "user" ? actor.actorId : null,
4301
+ source: "adapter_config_batch",
4302
+ },
4303
+ });
4304
+ if (!updated) {
4305
+ res.status(404).json({ error: "Agent not found" });
4306
+ return;
4307
+ }
4308
+ await logActivity(db, {
4309
+ companyId: updated.companyId,
4310
+ actorType: actor.actorType,
4311
+ actorId: actor.actorId,
4312
+ agentId: actor.agentId,
4313
+ runId: actor.runId,
4314
+ agentApiKeyId: actor.agentApiKeyId,
4315
+ action: "agent.updated",
4316
+ entityType: "agent",
4317
+ entityId: updated.id,
4318
+ details: {
4319
+ changedTopLevelKeys: ["adapterConfig"],
4320
+ changedAdapterConfigKeys: entry.changedKeys,
4321
+ batch: true,
4322
+ batchSize: plan.entries.length,
4323
+ },
4324
+ });
4325
+ results.push({
4326
+ agentId: entry.agent.id,
4327
+ name: entry.agent.name,
4328
+ status: "updated",
4329
+ changedKeys: entry.changedKeys,
4330
+ });
4331
+ }
4332
+ res.json({
4333
+ updated: results.filter((entry) => entry.status === "updated").length,
4334
+ unchanged: results.filter((entry) => entry.status === "unchanged").length,
4335
+ results,
4336
+ });
4337
+ });
4223
4338
  router.patch("/agents/:id", validate(updateAgentSchema), async (req, res) => {
4224
4339
  const id = req.params.id;
4225
4340
  const existing = await getAccessibleResource(req, res, svc.getById(id), "Agent not found");