@tickernelz/paperclip-pro-server 2026.926.1 → 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.
- package/dist/build-info.json +1 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +116 -1
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/issues.d.ts.map +1 -1
- package/dist/routes/issues.js +79 -6
- package/dist/routes/issues.js.map +1 -1
- package/dist/routes/openapi.d.ts.map +1 -1
- package/dist/routes/openapi.js +30 -1
- package/dist/routes/openapi.js.map +1 -1
- package/dist/services/adapter-config-field-value.d.ts +12 -0
- package/dist/services/adapter-config-field-value.d.ts.map +1 -0
- package/dist/services/adapter-config-field-value.js +31 -0
- package/dist/services/adapter-config-field-value.js.map +1 -0
- package/dist/services/agent-adapter-config-batch.d.ts +26 -0
- package/dist/services/agent-adapter-config-batch.d.ts.map +1 -0
- package/dist/services/agent-adapter-config-batch.js +174 -0
- package/dist/services/agent-adapter-config-batch.js.map +1 -0
- package/dist/services/heartbeat.d.ts +4 -4
- package/dist/services/issue-model-override-inheritance.d.ts +13 -0
- package/dist/services/issue-model-override-inheritance.d.ts.map +1 -0
- package/dist/services/issue-model-override-inheritance.js +68 -0
- package/dist/services/issue-model-override-inheritance.js.map +1 -0
- package/dist/services/issue-run-model-override.d.ts +19 -4
- package/dist/services/issue-run-model-override.d.ts.map +1 -1
- package/dist/services/issue-run-model-override.js +71 -22
- package/dist/services/issue-run-model-override.js.map +1 -1
- package/dist/services/issues.d.ts.map +1 -1
- package/dist/services/issues.js +21 -0
- package/dist/services/issues.js.map +1 -1
- package/dist/services/native-runtime/native-session-executor.d.ts +1 -1
- package/dist/services/native-runtime/native-session-executor.d.ts.map +1 -1
- package/package.json +20 -20
- package/ui-dist/assets/{AgentAvatar-CWNp7Eqe.js → AgentAvatar-CnpBTXF0.js} +1 -1
- package/ui-dist/assets/{AgentIdentity-Bqzrcghn.js → AgentIdentity-CV55DQtR.js} +1 -1
- package/ui-dist/assets/{Agents.production-Cs7mMvAL.js → Agents.production-5Tba_pW_.js} +2 -2
- package/ui-dist/assets/{CompanyActivity.production-4bljbHSU.js → CompanyActivity.production-CONFWTe1.js} +1 -1
- package/ui-dist/assets/{CompanyExport-CBh7R3lQ.js → CompanyExport-CiOVCS4y.js} +1 -1
- package/ui-dist/assets/{CompanySkills.production-DEleeGzs.js → CompanySkills.production-gv4ej6PI.js} +1 -1
- package/ui-dist/assets/{Costs.production-Dm5j2nxX.js → Costs.production-C6rOIGNV.js} +1 -1
- package/ui-dist/assets/{EmptyState-D62UDLDa.js → EmptyState-DeVTy8IU.js} +1 -1
- package/ui-dist/assets/{MarkdownBody-DfGkmx3G.js → MarkdownBody-Da7yUIDf.js} +1 -1
- package/ui-dist/assets/{MarkdownEditor-ZwstkvWb.js → MarkdownEditor-7JCtdEaZ.js} +1 -1
- package/ui-dist/assets/{OrgChart.production-BWKofGdO.js → OrgChart.production-DYeuFtY_.js} +1 -1
- package/ui-dist/assets/{PageSkeleton-C0pPO_Gb.js → PageSkeleton-DRRnaWWU.js} +1 -1
- package/ui-dist/assets/{RoutineDetail.production-_auZa0K9.js → RoutineDetail.production-Bt4IHfSD.js} +1 -1
- package/ui-dist/assets/RoutineRunVariablesDialog-Bj-Q_Ua3.js +5 -0
- package/ui-dist/assets/{Routines.production-D8R6Ujt6.js → Routines.production-BBxSwg2A.js} +1 -1
- package/ui-dist/assets/{SidebarContext-B3vvFvTk.js → SidebarContext-CxjppFTY.js} +1 -1
- package/ui-dist/assets/{StatusIcon-BYqGFWup.js → StatusIcon-j05cEqDO.js} +1 -1
- package/ui-dist/assets/agents-ZcIBncVi.js +1 -0
- package/ui-dist/assets/{badge-CW7lQ_Zd.js → badge-B4sBXDQo.js} +1 -1
- package/ui-dist/assets/{bot-DIsSOxfs.js → bot-CcFVz40n.js} +1 -1
- package/ui-dist/assets/{button-BYQHEF4e.js → button-LkWt40cm.js} +1 -1
- package/ui-dist/assets/{card-CFXZOYds.js → card-DbvoJZ3K.js} +1 -1
- package/ui-dist/assets/{check-Cniv3It0.js → check-CgfxcCMv.js} +1 -1
- package/ui-dist/assets/{checkbox-MLVUJCCS.js → checkbox-CLAkJpms.js} +1 -1
- package/ui-dist/assets/{chevron-down-Dq0fsCvv.js → chevron-down-CpKmud_n.js} +1 -1
- package/ui-dist/assets/{chevron-right-C4o2Lqna.js → chevron-right-IZydUoW5.js} +1 -1
- package/ui-dist/assets/{clipboard-CfEDu5my.js → clipboard-CjMs5cp9.js} +1 -1
- package/ui-dist/assets/{company-members-tdITTHFY.js → company-members-Dyq_pnza.js} +1 -1
- package/ui-dist/assets/createLucideIcon-CZEG6UJ7.js +92 -0
- package/ui-dist/assets/{definition-B5Yyiufk.js → definition-B49KTmLW.js} +1 -1
- package/ui-dist/assets/{dist-DCpDFPbp.js → dist-Cqh7BG-j.js} +1 -1
- package/ui-dist/assets/{dist-bQQ2HFhw.js → dist-pDmgIRxg.js} +1 -1
- package/ui-dist/assets/{environments-awDXeIDD.js → environments-xbdxVBLT.js} +1 -1
- package/ui-dist/assets/{external-link-3uv6Ak2X.js → external-link-BbeUY6zf.js} +1 -1
- package/ui-dist/assets/{file-text-DWMD8a2i.js → file-text-BMJQ4LZs.js} +1 -1
- package/ui-dist/assets/{health-DY_y3c9e.js → health-Bj6kLXe5.js} +1 -1
- package/ui-dist/assets/{heartbeats-BQipXQOf.js → heartbeats-DFiFf4Zf.js} +1 -1
- package/ui-dist/assets/{index-N4w1Oco1.js → index-BRCs87uX.js} +162 -162
- package/ui-dist/assets/index-GCNIGBzC.css +1 -0
- package/ui-dist/assets/{input-B7ODc-rR.js → input-a7SggR2b.js} +1 -1
- package/ui-dist/assets/label-Dnc69R1W.js +5 -0
- package/ui-dist/assets/{loader-circle-DA6xS_rG.js → loader-circle-Cu72DKdC.js} +1 -1
- package/ui-dist/assets/{mention-chips-r4UB4Eiw.js → mention-chips-BEaOTvHT.js} +1 -1
- package/ui-dist/assets/{octagon-alert-DsI0y-RL.js → octagon-alert-DfqJ6RjK.js} +1 -1
- package/ui-dist/assets/{rotate-ccw-D6pz3VoJ.js → rotate-ccw-DiFaj3XM.js} +1 -1
- package/ui-dist/assets/{router-DcMYq5w_.js → router-G1KztA90.js} +1 -1
- package/ui-dist/assets/{save-CvrYa2yq.js → save-D9PtvKKu.js} +1 -1
- package/ui-dist/assets/{select-CV7s_3g2.js → select-DSr2hsz2.js} +1 -1
- package/ui-dist/assets/{sheet-CrBXG9pk.js → sheet-H27vJn3G.js} +1 -1
- package/ui-dist/assets/{skeleton-efW_R0t3.js → skeleton-CPVPMT4g.js} +1 -1
- package/ui-dist/assets/{tabs-4RdauNv3.js → tabs-D8G3-AL7.js} +1 -1
- package/ui-dist/assets/{triangle-alert-DQUol3t5.js → triangle-alert-DiD4Atur.js} +1 -1
- package/ui-dist/assets/{use-adapter-capabilities-pFfW1mOk.js → use-adapter-capabilities-D_QCYxa2.js} +1 -1
- package/ui-dist/assets/{useHiddenSettings-b1eurTXV.js → useHiddenSettings-vbDpbX0U.js} +1 -1
- package/ui-dist/assets/{zap-CKzX0hdL.js → zap-CCqZhqc3.js} +1 -1
- package/ui-dist/index.html +46 -46
- package/ui-dist/sw.js +1 -1
- package/ui-dist/assets/RoutineRunVariablesDialog-CUcwhS7L.js +0 -5
- package/ui-dist/assets/agents-CNina7HI.js +0 -1
- package/ui-dist/assets/createLucideIcon-CINAT48M.js +0 -92
- package/ui-dist/assets/index-BAoNTaz4.css +0 -1
- package/ui-dist/assets/label-BnqmTeef.js +0 -5
package/dist/build-info.json
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/routes/agents.js
CHANGED
|
@@ -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");
|