@tickernelz/paperclip-pro-server 2026.926.1 → 2026.926.3
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 +134 -5
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/issues.d.ts.map +1 -1
- package/dist/routes/issues.js +86 -6
- package/dist/routes/issues.js.map +1 -1
- package/dist/routes/openapi.d.ts.map +1 -1
- package/dist/routes/openapi.js +50 -8
- package/dist/routes/openapi.js.map +1 -1
- package/dist/routes/paperclip-mcp.d.ts.map +1 -1
- package/dist/routes/paperclip-mcp.js +23 -2
- package/dist/routes/paperclip-mcp.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 +5 -0
- package/dist/services/issues.d.ts.map +1 -1
- package/dist/services/issues.js +36 -1
- 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/node_modules/micromark/dev/lib/compile.d.ts.map +1 -1
- package/node_modules/micromark/dev/lib/compile.js +14 -4
- package/node_modules/micromark/dev/lib/create-tokenizer.d.ts.map +1 -1
- package/node_modules/micromark/dev/lib/create-tokenizer.js +7 -6
- package/node_modules/micromark/dev/lib/initialize/document.js +25 -21
- package/node_modules/micromark/dev/lib/initialize/text.d.ts.map +1 -1
- package/node_modules/micromark/dev/lib/initialize/text.js +10 -6
- package/node_modules/micromark/dev/lib/preprocess.d.ts.map +1 -1
- package/node_modules/micromark/dev/lib/preprocess.js +19 -21
- package/node_modules/micromark/lib/compile.d.ts.map +1 -1
- package/node_modules/micromark/lib/compile.js +37 -29
- package/node_modules/micromark/lib/create-tokenizer.d.ts.map +1 -1
- package/node_modules/micromark/lib/create-tokenizer.js +37 -35
- package/node_modules/micromark/lib/initialize/document.js +21 -13
- package/node_modules/micromark/lib/initialize/text.d.ts.map +1 -1
- package/node_modules/micromark/lib/initialize/text.js +7 -3
- package/node_modules/micromark/lib/preprocess.d.ts.map +1 -1
- package/node_modules/micromark/lib/preprocess.js +16 -19
- package/node_modules/micromark/package.json +2 -15
- package/node_modules/micromark-core-commonmark/dev/lib/attention.js +18 -24
- package/node_modules/micromark-core-commonmark/dev/lib/code-fenced.d.ts.map +1 -1
- package/node_modules/micromark-core-commonmark/dev/lib/code-fenced.js +1 -43
- package/node_modules/micromark-core-commonmark/dev/lib/code-indented.js +19 -43
- package/node_modules/micromark-core-commonmark/dev/lib/heading-atx.js +2 -6
- package/node_modules/micromark-core-commonmark/dev/lib/html-flow.d.ts.map +1 -1
- package/node_modules/micromark-core-commonmark/dev/lib/html-flow.js +2 -53
- package/node_modules/micromark-core-commonmark/dev/lib/label-end.js +14 -12
- package/node_modules/micromark-core-commonmark/dev/lib/label-start-image.d.ts.map +1 -1
- package/node_modules/micromark-core-commonmark/dev/lib/label-start-image.js +14 -5
- package/node_modules/micromark-core-commonmark/dev/lib/label-start-link.d.ts.map +1 -1
- package/node_modules/micromark-core-commonmark/dev/lib/label-start-link.js +14 -5
- package/node_modules/micromark-core-commonmark/dev/lib/partial-non-lazy-continuation.d.ts +4 -0
- package/node_modules/micromark-core-commonmark/dev/lib/partial-non-lazy-continuation.d.ts.map +1 -0
- package/node_modules/micromark-core-commonmark/dev/lib/partial-non-lazy-continuation.js +67 -0
- package/node_modules/micromark-core-commonmark/dev/lib/setext-underline.d.ts.map +1 -1
- package/node_modules/micromark-core-commonmark/dev/lib/setext-underline.js +8 -5
- package/node_modules/micromark-core-commonmark/lib/attention.js +14 -24
- package/node_modules/micromark-core-commonmark/lib/code-fenced.d.ts.map +1 -1
- package/node_modules/micromark-core-commonmark/lib/code-fenced.js +1 -39
- package/node_modules/micromark-core-commonmark/lib/code-indented.js +11 -29
- package/node_modules/micromark-core-commonmark/lib/heading-atx.js +2 -6
- package/node_modules/micromark-core-commonmark/lib/html-flow.d.ts.map +1 -1
- package/node_modules/micromark-core-commonmark/lib/html-flow.js +2 -51
- package/node_modules/micromark-core-commonmark/lib/label-end.js +11 -10
- package/node_modules/micromark-core-commonmark/lib/label-start-image.d.ts.map +1 -1
- package/node_modules/micromark-core-commonmark/lib/label-start-image.js +11 -3
- package/node_modules/micromark-core-commonmark/lib/label-start-link.d.ts.map +1 -1
- package/node_modules/micromark-core-commonmark/lib/label-start-link.js +11 -3
- package/node_modules/micromark-core-commonmark/lib/partial-non-lazy-continuation.d.ts +4 -0
- package/node_modules/micromark-core-commonmark/lib/partial-non-lazy-continuation.d.ts.map +1 -0
- package/node_modules/micromark-core-commonmark/lib/partial-non-lazy-continuation.js +61 -0
- package/node_modules/micromark-core-commonmark/lib/setext-underline.d.ts.map +1 -1
- package/node_modules/micromark-core-commonmark/lib/setext-underline.js +7 -5
- package/node_modules/micromark-core-commonmark/package.json +4 -16
- package/node_modules/micromark-factory-space/dev/index.d.ts +24 -1
- package/node_modules/micromark-factory-space/dev/index.d.ts.map +1 -1
- package/node_modules/micromark-factory-space/dev/index.js +58 -3
- package/node_modules/micromark-factory-space/index.d.ts +24 -1
- package/node_modules/micromark-factory-space/index.d.ts.map +1 -1
- package/node_modules/micromark-factory-space/index.js +55 -3
- package/node_modules/micromark-factory-space/package.json +1 -10
- package/node_modules/micromark-factory-space/readme.md +25 -25
- package/node_modules/micromark-util-edit-map/dev/index.d.ts +78 -0
- package/node_modules/micromark-util-edit-map/dev/index.d.ts.map +1 -0
- package/node_modules/micromark-util-edit-map/dev/index.js +237 -0
- package/node_modules/micromark-util-edit-map/index.d.ts +78 -0
- package/node_modules/micromark-util-edit-map/index.d.ts.map +1 -0
- package/node_modules/micromark-util-edit-map/index.js +225 -0
- package/node_modules/micromark-util-edit-map/license +22 -0
- package/node_modules/micromark-util-edit-map/package.json +48 -0
- package/node_modules/micromark-util-edit-map/readme.md +234 -0
- package/node_modules/micromark-util-types/index.d.ts +6 -3
- package/node_modules/micromark-util-types/package.json +2 -36
- package/node_modules/ws/lib/websocket.js +17 -3
- package/node_modules/ws/package.json +1 -1
- package/package.json +20 -20
- package/skills/paperclip/references/api-reference.md +2 -2
- 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-BGeWxNtU.js} +2 -2
- package/ui-dist/assets/{CompanyActivity.production-4bljbHSU.js → CompanyActivity.production-9gzPo_M_.js} +1 -1
- package/ui-dist/assets/{CompanyExport-CBh7R3lQ.js → CompanyExport-CwCAJj2l.js} +1 -1
- package/ui-dist/assets/{CompanySkills.production-DEleeGzs.js → CompanySkills.production-CiTG4koz.js} +1 -1
- package/ui-dist/assets/{Costs.production-Dm5j2nxX.js → Costs.production-CFn4Pjkh.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-U1cB4YS_.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-oI3mHlKM.js} +1 -1
- package/ui-dist/assets/RoutineRunVariablesDialog-Bj-Q_Ua3.js +5 -0
- package/ui-dist/assets/{Routines.production-D8R6Ujt6.js → Routines.production-sl1FiAYd.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-DrGsWdJY.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-GCNIGBzC.css +1 -0
- package/ui-dist/assets/{index-N4w1Oco1.js → index-cwemnRTq.js} +162 -162
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paperclip-mcp.d.ts","sourceRoot":"","sources":["../../src/routes/paperclip-mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,EAAE,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"paperclip-mcp.d.ts","sourceRoot":"","sources":["../../src/routes/paperclip-mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,EAAE,EAAE,MAAM,8BAA8B,CAAC;AA4B/D,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,EAAE,8CAuFxC"}
|
|
@@ -2,7 +2,9 @@ import { Router } from "express";
|
|
|
2
2
|
import { agents } from "@tickernelz/paperclip-pro-db";
|
|
3
3
|
import { and, eq } from "drizzle-orm";
|
|
4
4
|
import { agentAuthorityCapabilities } from "@tickernelz/paperclip-pro-shared";
|
|
5
|
-
import { paperclipToolCatalog, parseToolsets, PaperclipApiClient, } from "@tickernelz/paperclip-pro-mcp-server/catalog";
|
|
5
|
+
import { InvalidCursorError, paperclipToolCatalog, parseToolsets, PaperclipApiClient, resolvePageSize, } from "@tickernelz/paperclip-pro-mcp-server/catalog";
|
|
6
|
+
import { sharedToolNotes } from "@tickernelz/paperclip-pro-mcp-server/generated-tools";
|
|
7
|
+
import { accessService } from "../services/access.js";
|
|
6
8
|
import { forbidden, unauthorized } from "../errors.js";
|
|
7
9
|
const PROTOCOL_VERSION = "2025-06-18";
|
|
8
10
|
/** The server's own listen address, so a tool call re-enters the REST API over loopback. */
|
|
@@ -20,6 +22,7 @@ function loopbackApiUrl(req) {
|
|
|
20
22
|
/** Mounted after actor middleware; only run-scoped agent credentials authenticate here. */
|
|
21
23
|
export function paperclipMcpRoutes(db) {
|
|
22
24
|
const router = Router();
|
|
25
|
+
const access = accessService(db);
|
|
23
26
|
router.get("/mcp/paperclip", (_req, res) => {
|
|
24
27
|
res.status(405).json({ error: "Method not allowed" });
|
|
25
28
|
});
|
|
@@ -41,10 +44,12 @@ export function paperclipMcpRoutes(db) {
|
|
|
41
44
|
const { id = null, method, params } = (req.body ?? {});
|
|
42
45
|
const send = (result) => res.json({ jsonrpc: "2.0", id, result });
|
|
43
46
|
if (method === "initialize") {
|
|
47
|
+
const notes = sharedToolNotes();
|
|
44
48
|
return send({
|
|
45
49
|
protocolVersion: PROTOCOL_VERSION,
|
|
46
50
|
capabilities: { tools: { listChanged: false } },
|
|
47
51
|
serverInfo: { name: "paperclip", version: "0.1.0" },
|
|
52
|
+
...(notes.length > 0 ? { instructions: notes.join(" ") } : {}),
|
|
48
53
|
});
|
|
49
54
|
}
|
|
50
55
|
if (typeof method === "string" && method.startsWith("notifications/")) {
|
|
@@ -68,7 +73,23 @@ export function paperclipMcpRoutes(db) {
|
|
|
68
73
|
toolsets,
|
|
69
74
|
agentRole: agent?.role ?? null,
|
|
70
75
|
});
|
|
71
|
-
const
|
|
76
|
+
const capabilities = agentAuthorityCapabilities(agent?.role);
|
|
77
|
+
const management = capabilities.some((capability) => capability.startsWith("company:"));
|
|
78
|
+
const grants = management ? await access.listPrincipalGrants(companyId, "agent", agentId) : [];
|
|
79
|
+
let definitions;
|
|
80
|
+
let listing;
|
|
81
|
+
try {
|
|
82
|
+
({ definitions, listing } = paperclipToolCatalog(client, toolsets, management, {
|
|
83
|
+
boardSurface: { capabilities, permissionKeys: new Set(grants.map((row) => row.permissionKey)) },
|
|
84
|
+
cursor: typeof params?.cursor === "string" ? params.cursor : null,
|
|
85
|
+
pageSize: resolvePageSize(),
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (!(error instanceof InvalidCursorError))
|
|
90
|
+
throw error;
|
|
91
|
+
return res.json({ jsonrpc: "2.0", id, error: { code: -32602, message: error.message } });
|
|
92
|
+
}
|
|
72
93
|
if (method === "tools/list")
|
|
73
94
|
return send(listing);
|
|
74
95
|
const tool = definitions.find((entry) => entry.name === params?.name);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paperclip-mcp.js","sourceRoot":"","sources":["../../src/routes/paperclip-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAgB,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAW,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,kBAAkB,
|
|
1
|
+
{"version":3,"file":"paperclip-mcp.js","sourceRoot":"","sources":["../../src/routes/paperclip-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ConfigFieldSchema } from "../adapters/types.js";
|
|
2
|
+
export declare class AdapterConfigFieldValueError extends Error {
|
|
3
|
+
readonly status: number;
|
|
4
|
+
constructor(message: string, status?: number);
|
|
5
|
+
}
|
|
6
|
+
export declare function isFreeTextAdapterConfigField(field: ConfigFieldSchema): boolean;
|
|
7
|
+
/** Validates one value against the adapter's published field schema. */
|
|
8
|
+
export declare function validateAdapterConfigFieldValue(field: ConfigFieldSchema, value: string, wording: {
|
|
9
|
+
clearHint: string;
|
|
10
|
+
unsupportedReason: string;
|
|
11
|
+
}): string;
|
|
12
|
+
//# sourceMappingURL=adapter-config-field-value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-config-field-value.d.ts","sourceRoot":"","sources":["../../src/services/adapter-config-field-value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAI9D,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,YAAY,OAAO,EAAE,MAAM,EAAE,MAAM,SAAM,EAIxC;CACF;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAE9E;AAED,wEAAwE;AACxE,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,GACxD,MAAM,CAsBR"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const FREE_TEXT_FIELD_TYPES = { text: true, combobox: true };
|
|
2
|
+
export class AdapterConfigFieldValueError extends Error {
|
|
3
|
+
status;
|
|
4
|
+
constructor(message, status = 422) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "AdapterConfigFieldValueError";
|
|
7
|
+
this.status = status;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export function isFreeTextAdapterConfigField(field) {
|
|
11
|
+
return Boolean(FREE_TEXT_FIELD_TYPES[field.type]);
|
|
12
|
+
}
|
|
13
|
+
/** Validates one value against the adapter's published field schema. */
|
|
14
|
+
export function validateAdapterConfigFieldValue(field, value, wording) {
|
|
15
|
+
const trimmed = value.trim();
|
|
16
|
+
if (!trimmed) {
|
|
17
|
+
throw new AdapterConfigFieldValueError(`${field.label} cannot be empty; ${wording.clearHint}.`);
|
|
18
|
+
}
|
|
19
|
+
if (field.type === "select") {
|
|
20
|
+
const allowed = (field.options ?? []).map((option) => option.value);
|
|
21
|
+
if (!allowed.includes(trimmed)) {
|
|
22
|
+
throw new AdapterConfigFieldValueError(`${field.label} must be one of: ${allowed.join(", ")}.`);
|
|
23
|
+
}
|
|
24
|
+
return trimmed;
|
|
25
|
+
}
|
|
26
|
+
if (!isFreeTextAdapterConfigField(field)) {
|
|
27
|
+
throw new AdapterConfigFieldValueError(`${field.label} ${wording.unsupportedReason}.`);
|
|
28
|
+
}
|
|
29
|
+
return trimmed;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=adapter-config-field-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-config-field-value.js","sourceRoot":"","sources":["../../src/services/adapter-config-field-value.ts"],"names":[],"mappings":"AAEA,MAAM,qBAAqB,GAAyB,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEnF,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IAC5C,MAAM,CAAS;IACxB,YAAY,OAAe,EAAE,MAAM,GAAG,GAAG;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAwB;IACnE,OAAO,OAAO,CAAC,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,+BAA+B,CAC7C,KAAwB,EACxB,KAAa,EACb,OAAyD;IAEzD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,4BAA4B,CACpC,GAAG,KAAK,CAAC,KAAK,qBAAqB,OAAO,CAAC,SAAS,GAAG,CACxD,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,4BAA4B,CACpC,GAAG,KAAK,CAAC,KAAK,oBAAoB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACxD,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,4BAA4B,CACpC,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,iBAAiB,GAAG,CAC/C,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AgentAdapterConfigBatchFailure, AgentAdapterConfigBatchPreview } from "@tickernelz/paperclip-pro-shared";
|
|
2
|
+
/** The model-selection keys a batch may write; everything else stays single-agent. */
|
|
3
|
+
export declare const AGENT_ADAPTER_CONFIG_BATCH_KEYS: readonly string[];
|
|
4
|
+
export interface AgentAdapterConfigBatchAgent {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
adapterType: string;
|
|
8
|
+
adapterConfig: Record<string, unknown> | null;
|
|
9
|
+
}
|
|
10
|
+
export interface AgentAdapterConfigBatchPlanEntry {
|
|
11
|
+
agent: AgentAdapterConfigBatchAgent;
|
|
12
|
+
adapterConfig: Record<string, unknown>;
|
|
13
|
+
changedKeys: string[];
|
|
14
|
+
}
|
|
15
|
+
export type AgentAdapterConfigBatchPlan = {
|
|
16
|
+
ok: true;
|
|
17
|
+
entries: AgentAdapterConfigBatchPlanEntry[];
|
|
18
|
+
} | {
|
|
19
|
+
ok: false;
|
|
20
|
+
failures: AgentAdapterConfigBatchFailure[];
|
|
21
|
+
};
|
|
22
|
+
/** The fields a batch may set: the intersection over the selected agents' schemas. */
|
|
23
|
+
export declare function buildAgentAdapterConfigBatchPreview(agents: AgentAdapterConfigBatchAgent[]): Promise<AgentAdapterConfigBatchPreview>;
|
|
24
|
+
/** Validates every value per agent; one invalid field rejects the whole batch. */
|
|
25
|
+
export declare function planAgentAdapterConfigBatch(agents: AgentAdapterConfigBatchAgent[], values: Record<string, string | null>): Promise<AgentAdapterConfigBatchPlan>;
|
|
26
|
+
//# sourceMappingURL=agent-adapter-config-batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-adapter-config-batch.d.ts","sourceRoot":"","sources":["../../src/services/agent-adapter-config-batch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,8BAA8B,EAC9B,8BAA8B,EAE/B,MAAM,kCAAkC,CAAC;AAS1C,sFAAsF;AACtF,eAAO,MAAM,+BAA+B,EAAE,SAAS,MAAM,EAQ5D,CAAC;AAOF,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,gCAAgC;IAC/C,KAAK,EAAE,4BAA4B,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,2BAA2B,GACnC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,gCAAgC,EAAE,CAAA;CAAE,GACzD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,8BAA8B,EAAE,CAAA;CAAE,CAAC;AAsD9D,sFAAsF;AACtF,wBAAsB,mCAAmC,CACvD,MAAM,EAAE,4BAA4B,EAAE,GACrC,OAAO,CAAC,8BAA8B,CAAC,CA4CzC;AAED,kFAAkF;AAClF,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,4BAA4B,EAAE,EACtC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAwDtC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { AdapterConfigFieldValueError, isFreeTextAdapterConfigField, validateAdapterConfigFieldValue, } from "./adapter-config-field-value.js";
|
|
2
|
+
import { resolveAdapterConfigSchema } from "./adapter-config-schema.js";
|
|
3
|
+
/** The model-selection keys a batch may write; everything else stays single-agent. */
|
|
4
|
+
export const AGENT_ADAPTER_CONFIG_BATCH_KEYS = [
|
|
5
|
+
"model",
|
|
6
|
+
"thinking",
|
|
7
|
+
"provider",
|
|
8
|
+
"smolModel",
|
|
9
|
+
"slowModel",
|
|
10
|
+
"planModel",
|
|
11
|
+
"modelCycle",
|
|
12
|
+
];
|
|
13
|
+
/** `provider` on a paperclip_runner agent needs the single-agent transition checks. */
|
|
14
|
+
const PROVIDER_LOCKED_ADAPTER_TYPES = {
|
|
15
|
+
paperclip_runner: true,
|
|
16
|
+
};
|
|
17
|
+
function asRecord(value) {
|
|
18
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
19
|
+
? value
|
|
20
|
+
: {};
|
|
21
|
+
}
|
|
22
|
+
async function batchFieldsFor(agent) {
|
|
23
|
+
const resolved = await resolveAdapterConfigSchema(agent.adapterType);
|
|
24
|
+
if (!resolved.ok) {
|
|
25
|
+
return {
|
|
26
|
+
fields: {},
|
|
27
|
+
reason: resolved.reason === "not_registered"
|
|
28
|
+
? `Adapter "${agent.adapterType}" is not registered.`
|
|
29
|
+
: `Adapter "${agent.adapterType}" does not publish a config schema.`,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const fields = {};
|
|
33
|
+
for (const field of resolved.schema.fields) {
|
|
34
|
+
if (!AGENT_ADAPTER_CONFIG_BATCH_KEYS.includes(field.key))
|
|
35
|
+
continue;
|
|
36
|
+
if (field.type !== "select" && !isFreeTextAdapterConfigField(field))
|
|
37
|
+
continue;
|
|
38
|
+
if (field.key === "provider" && PROVIDER_LOCKED_ADAPTER_TYPES[agent.adapterType]) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
fields[field.key] = field;
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
fields,
|
|
45
|
+
reason: Object.keys(fields).length
|
|
46
|
+
? null
|
|
47
|
+
: `Adapter "${agent.adapterType}" exposes no batch-editable model setting.`,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function describeField(key, field) {
|
|
51
|
+
return {
|
|
52
|
+
key,
|
|
53
|
+
label: field.label,
|
|
54
|
+
hint: field.hint ?? null,
|
|
55
|
+
freeText: isFreeTextAdapterConfigField(field),
|
|
56
|
+
options: (field.options ?? [])
|
|
57
|
+
.filter((option) => option.value.trim())
|
|
58
|
+
.map((option) => ({
|
|
59
|
+
value: option.value,
|
|
60
|
+
label: option.label,
|
|
61
|
+
...(option.group ? { group: option.group } : {}),
|
|
62
|
+
})),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** The fields a batch may set: the intersection over the selected agents' schemas. */
|
|
66
|
+
export async function buildAgentAdapterConfigBatchPreview(agents) {
|
|
67
|
+
const targets = [];
|
|
68
|
+
let shared = null;
|
|
69
|
+
for (const agent of agents) {
|
|
70
|
+
const { fields, reason } = await batchFieldsFor(agent);
|
|
71
|
+
const config = asRecord(agent.adapterConfig);
|
|
72
|
+
const current = {};
|
|
73
|
+
for (const key of Object.keys(fields)) {
|
|
74
|
+
const value = config[key];
|
|
75
|
+
current[key] = typeof value === "string" && value.trim() ? value.trim() : null;
|
|
76
|
+
}
|
|
77
|
+
targets.push({
|
|
78
|
+
agentId: agent.id,
|
|
79
|
+
name: agent.name,
|
|
80
|
+
adapterType: agent.adapterType,
|
|
81
|
+
eligible: reason === null,
|
|
82
|
+
reason,
|
|
83
|
+
current,
|
|
84
|
+
});
|
|
85
|
+
if (reason !== null)
|
|
86
|
+
continue;
|
|
87
|
+
const described = {};
|
|
88
|
+
for (const [key, field] of Object.entries(fields)) {
|
|
89
|
+
described[key] = describeField(key, field);
|
|
90
|
+
}
|
|
91
|
+
if (shared === null) {
|
|
92
|
+
shared = described;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
for (const key of Object.keys(shared)) {
|
|
96
|
+
const candidate = described[key];
|
|
97
|
+
if (!candidate) {
|
|
98
|
+
delete shared[key];
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const allowed = {};
|
|
102
|
+
for (const option of candidate.options)
|
|
103
|
+
allowed[option.value] = true;
|
|
104
|
+
shared[key] = {
|
|
105
|
+
...shared[key],
|
|
106
|
+
freeText: shared[key].freeText && candidate.freeText,
|
|
107
|
+
options: shared[key].options.filter((option) => allowed[option.value]),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return { fields: Object.values(shared ?? {}), agents: targets };
|
|
112
|
+
}
|
|
113
|
+
/** Validates every value per agent; one invalid field rejects the whole batch. */
|
|
114
|
+
export async function planAgentAdapterConfigBatch(agents, values) {
|
|
115
|
+
const failures = [];
|
|
116
|
+
const entries = [];
|
|
117
|
+
for (const agent of agents) {
|
|
118
|
+
const { fields, reason } = await batchFieldsFor(agent);
|
|
119
|
+
if (reason !== null) {
|
|
120
|
+
failures.push({ agentId: agent.id, name: agent.name, key: null, message: reason });
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const adapterConfig = { ...asRecord(agent.adapterConfig) };
|
|
124
|
+
const changedKeys = [];
|
|
125
|
+
for (const [key, value] of Object.entries(values)) {
|
|
126
|
+
const field = fields[key];
|
|
127
|
+
if (!field) {
|
|
128
|
+
failures.push({
|
|
129
|
+
agentId: agent.id,
|
|
130
|
+
name: agent.name,
|
|
131
|
+
key,
|
|
132
|
+
message: key === "provider" && PROVIDER_LOCKED_ADAPTER_TYPES[agent.adapterType]
|
|
133
|
+
? `Change the provider of a ${agent.adapterType} agent one agent at a time.`
|
|
134
|
+
: `Adapter "${agent.adapterType}" does not expose a batch-editable "${key}" setting.`,
|
|
135
|
+
});
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (value === null) {
|
|
139
|
+
if (adapterConfig[key] === undefined)
|
|
140
|
+
continue;
|
|
141
|
+
delete adapterConfig[key];
|
|
142
|
+
changedKeys.push(key);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
const next = validateAdapterConfigFieldValue(field, value, {
|
|
147
|
+
clearHint: "clear the field instead",
|
|
148
|
+
unsupportedReason: "cannot be changed in a batch",
|
|
149
|
+
});
|
|
150
|
+
if (adapterConfig[key] === next)
|
|
151
|
+
continue;
|
|
152
|
+
adapterConfig[key] = next;
|
|
153
|
+
changedKeys.push(key);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
if (error instanceof AdapterConfigFieldValueError) {
|
|
157
|
+
failures.push({
|
|
158
|
+
agentId: agent.id,
|
|
159
|
+
name: agent.name,
|
|
160
|
+
key,
|
|
161
|
+
message: error.message,
|
|
162
|
+
});
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
entries.push({ agent, adapterConfig, changedKeys: changedKeys.sort() });
|
|
169
|
+
}
|
|
170
|
+
if (failures.length > 0)
|
|
171
|
+
return { ok: false, failures };
|
|
172
|
+
return { ok: true, entries };
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=agent-adapter-config-batch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-adapter-config-batch.js","sourceRoot":"","sources":["../../src/services/agent-adapter-config-batch.ts"],"names":[],"mappings":"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"}
|
|
@@ -2690,7 +2690,7 @@ export declare function heartbeatService(db: Db, options?: HeartbeatServiceOptio
|
|
|
2690
2690
|
runId?: string | null;
|
|
2691
2691
|
wakeReason?: string;
|
|
2692
2692
|
}) => Promise<{
|
|
2693
|
-
|
|
2693
|
+
reason?: undefined;
|
|
2694
2694
|
outcome: "triggered";
|
|
2695
2695
|
} | {
|
|
2696
2696
|
outcome: "skipped";
|
|
@@ -2953,7 +2953,7 @@ export declare function heartbeatService(db: Db, options?: HeartbeatServiceOptio
|
|
|
2953
2953
|
maxAttempts?: number;
|
|
2954
2954
|
delayMs?: number;
|
|
2955
2955
|
}) => Promise<{
|
|
2956
|
-
|
|
2956
|
+
reason?: undefined;
|
|
2957
2957
|
outcome: "retry_exhausted";
|
|
2958
2958
|
attempt: number;
|
|
2959
2959
|
maxAttempts: number;
|
|
@@ -2983,7 +2983,7 @@ export declare function heartbeatService(db: Db, options?: HeartbeatServiceOptio
|
|
|
2983
2983
|
maxAttempts?: undefined;
|
|
2984
2984
|
run?: undefined;
|
|
2985
2985
|
} | {
|
|
2986
|
-
|
|
2986
|
+
reason?: undefined;
|
|
2987
2987
|
errorCode?: undefined;
|
|
2988
2988
|
issueId?: undefined;
|
|
2989
2989
|
outcome: "scheduled";
|
|
@@ -3064,7 +3064,7 @@ export declare function heartbeatService(db: Db, options?: HeartbeatServiceOptio
|
|
|
3064
3064
|
maxAttempts: number;
|
|
3065
3065
|
reusedExisting: boolean;
|
|
3066
3066
|
} | {
|
|
3067
|
-
|
|
3067
|
+
reason?: undefined;
|
|
3068
3068
|
errorCode?: undefined;
|
|
3069
3069
|
issueId?: undefined;
|
|
3070
3070
|
reusedExisting?: undefined;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Db } from "@tickernelz/paperclip-pro-db";
|
|
2
|
+
import type { IssueRunModelOverridePropagation, IssueRunModelOverrideSubtaskScope } from "@tickernelz/paperclip-pro-shared";
|
|
3
|
+
import { type IssueRunModelOverrideValues } from "./issue-run-model-override.js";
|
|
4
|
+
export declare const ISSUE_MODEL_OVERRIDE_SUBTREE_MAX_DEPTH = 10;
|
|
5
|
+
export declare const ISSUE_MODEL_OVERRIDE_SUBTREE_MAX_ISSUES = 500;
|
|
6
|
+
/** Rewrites the override on descendants that do not own one, bounded and cycle-safe. */
|
|
7
|
+
export declare function applyIssueRunModelOverrideToSubtree(db: Db, input: {
|
|
8
|
+
companyId: string;
|
|
9
|
+
rootIssueId: string;
|
|
10
|
+
values: IssueRunModelOverrideValues;
|
|
11
|
+
subtaskScope: IssueRunModelOverrideSubtaskScope;
|
|
12
|
+
}): Promise<IssueRunModelOverridePropagation>;
|
|
13
|
+
//# sourceMappingURL=issue-model-override-inheritance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-model-override-inheritance.d.ts","sourceRoot":"","sources":["../../src/services/issue-model-override-inheritance.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,EAAE,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EACV,gCAAgC,EAChC,iCAAiC,EAClC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAGL,KAAK,2BAA2B,EACjC,MAAM,+BAA+B,CAAC;AAEvC,eAAO,MAAM,sCAAsC,KAAK,CAAC;AACzD,eAAO,MAAM,uCAAuC,MAAM,CAAC;AAE3D,wFAAwF;AACxF,wBAAsB,mCAAmC,CACvD,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IACL,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,2BAA2B,CAAC;IACpC,YAAY,EAAE,iCAAiC,CAAC;CACjD,GACA,OAAO,CAAC,gCAAgC,CAAC,CAmE3C"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { and, eq, inArray } from "drizzle-orm";
|
|
2
|
+
import { issues } from "@tickernelz/paperclip-pro-db";
|
|
3
|
+
import { hasExplicitIssueRunModelOverride, writeIssueRunModelOverride, } from "./issue-run-model-override.js";
|
|
4
|
+
export const ISSUE_MODEL_OVERRIDE_SUBTREE_MAX_DEPTH = 10;
|
|
5
|
+
export const ISSUE_MODEL_OVERRIDE_SUBTREE_MAX_ISSUES = 500;
|
|
6
|
+
/** Rewrites the override on descendants that do not own one, bounded and cycle-safe. */
|
|
7
|
+
export async function applyIssueRunModelOverrideToSubtree(db, input) {
|
|
8
|
+
const result = {
|
|
9
|
+
applied: 0,
|
|
10
|
+
skipped: 0,
|
|
11
|
+
visited: 0,
|
|
12
|
+
limitReached: false,
|
|
13
|
+
};
|
|
14
|
+
const visited = new Set([input.rootIssueId]);
|
|
15
|
+
let frontier = [input.rootIssueId];
|
|
16
|
+
for (let depth = 0; depth < ISSUE_MODEL_OVERRIDE_SUBTREE_MAX_DEPTH; depth += 1) {
|
|
17
|
+
if (frontier.length === 0)
|
|
18
|
+
break;
|
|
19
|
+
const children = await db
|
|
20
|
+
.select({
|
|
21
|
+
id: issues.id,
|
|
22
|
+
assigneeAdapterOverrides: issues.assigneeAdapterOverrides,
|
|
23
|
+
})
|
|
24
|
+
.from(issues)
|
|
25
|
+
.where(and(eq(issues.companyId, input.companyId), inArray(issues.parentId, frontier)));
|
|
26
|
+
const next = [];
|
|
27
|
+
for (const child of children) {
|
|
28
|
+
if (visited.has(child.id))
|
|
29
|
+
continue;
|
|
30
|
+
visited.add(child.id);
|
|
31
|
+
if (result.visited >= ISSUE_MODEL_OVERRIDE_SUBTREE_MAX_ISSUES) {
|
|
32
|
+
result.limitReached = true;
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
result.visited += 1;
|
|
36
|
+
if (hasExplicitIssueRunModelOverride(child.assigneeAdapterOverrides)) {
|
|
37
|
+
result.skipped += 1;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const nextOverrides = writeIssueRunModelOverride(child.assigneeAdapterOverrides, input.values, {
|
|
41
|
+
inheritToSubtasks: true,
|
|
42
|
+
subtaskScope: input.subtaskScope,
|
|
43
|
+
inherited: true,
|
|
44
|
+
sourceIssueId: input.rootIssueId,
|
|
45
|
+
});
|
|
46
|
+
await db
|
|
47
|
+
.update(issues)
|
|
48
|
+
.set({ assigneeAdapterOverrides: nextOverrides, updatedAt: new Date() })
|
|
49
|
+
.where(and(eq(issues.id, child.id), eq(issues.companyId, input.companyId)));
|
|
50
|
+
result.applied += 1;
|
|
51
|
+
next.push(child.id);
|
|
52
|
+
}
|
|
53
|
+
if (next.length === 0)
|
|
54
|
+
break;
|
|
55
|
+
frontier = next;
|
|
56
|
+
if (depth === ISSUE_MODEL_OVERRIDE_SUBTREE_MAX_DEPTH - 1) {
|
|
57
|
+
const deeper = await db
|
|
58
|
+
.select({ id: issues.id })
|
|
59
|
+
.from(issues)
|
|
60
|
+
.where(and(eq(issues.companyId, input.companyId), inArray(issues.parentId, next)))
|
|
61
|
+
.limit(1);
|
|
62
|
+
if (deeper.length > 0)
|
|
63
|
+
result.limitReached = true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=issue-model-override-inheritance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-model-override-inheritance.js","sourceRoot":"","sources":["../../src/services/issue-model-override-inheritance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAW,MAAM,8BAA8B,CAAC;AAK/D,OAAO,EACL,gCAAgC,EAChC,0BAA0B,GAE3B,MAAM,+BAA+B,CAAC;AAEvC,MAAM,CAAC,MAAM,sCAAsC,GAAG,EAAE,CAAC;AACzD,MAAM,CAAC,MAAM,uCAAuC,GAAG,GAAG,CAAC;AAE3D,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,mCAAmC,CACvD,EAAM,EACN,KAKC;IAED,MAAM,MAAM,GAAqC;QAC/C,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;QACV,YAAY,EAAE,KAAK;KACpB,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IACrD,IAAI,QAAQ,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACnC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,sCAAsC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QACjC,MAAM,QAAQ,GAAG,MAAM,EAAE;aACtB,MAAM,CAAC;YACN,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,wBAAwB,EAAE,MAAM,CAAC,wBAAwB;SAC1D,CAAC;aACD,IAAI,CAAC,MAAM,CAAC;aACZ,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,EACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACnC,CACF,CAAC;QACJ,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAE,SAAS;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACtB,IAAI,MAAM,CAAC,OAAO,IAAI,uCAAuC,EAAE,CAAC;gBAC9D,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC3B,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;YACpB,IAAI,gCAAgC,CAAC,KAAK,CAAC,wBAAwB,CAAC,EAAE,CAAC;gBACrE,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;gBACpB,SAAS;YACX,CAAC;YACD,MAAM,aAAa,GAAG,0BAA0B,CAC9C,KAAK,CAAC,wBAAwB,EAC9B,KAAK,CAAC,MAAM,EACZ;gBACE,iBAAiB,EAAE,IAAI;gBACvB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,SAAS,EAAE,IAAI;gBACf,aAAa,EAAE,KAAK,CAAC,WAAW;aACjC,CACF,CAAC;YACF,MAAM,EAAE;iBACL,MAAM,CAAC,MAAM,CAAC;iBACd,GAAG,CAAC,EAAE,wBAAwB,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;iBACvE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9E,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QAC7B,QAAQ,GAAG,IAAI,CAAC;QAChB,IAAI,KAAK,KAAK,sCAAsC,GAAG,CAAC,EAAE,CAAC;YACzD,MAAM,MAAM,GAAG,MAAM,EAAE;iBACpB,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;iBACzB,IAAI,CAAC,MAAM,CAAC;iBACZ,KAAK,CACJ,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAC3E;iBACA,KAAK,CAAC,CAAC,CAAC,CAAC;YACZ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;QACpD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,11 +1,20 @@
|
|
|
1
|
-
import type { IssueRunModelOverrideKey, IssueRunModelOverrideView } from "@tickernelz/paperclip-pro-shared";
|
|
2
|
-
|
|
1
|
+
import type { IssueRunModelOverrideInheritance, IssueRunModelOverrideKey, IssueRunModelOverridePropagation, IssueRunModelOverrideSubtaskScope, IssueRunModelOverrideView } from "@tickernelz/paperclip-pro-shared";
|
|
2
|
+
export declare const ISSUE_RUN_MODEL_OVERRIDE_KEYS: readonly IssueRunModelOverrideKey[];
|
|
3
|
+
export type IssueRunModelOverrideValues = Partial<Record<IssueRunModelOverrideKey, string | null>>;
|
|
3
4
|
export declare class IssueRunModelOverrideError extends Error {
|
|
4
5
|
readonly status: number;
|
|
5
6
|
constructor(message: string, status?: number);
|
|
6
7
|
}
|
|
8
|
+
export declare function readIssueRunModelOverrideInheritance(assigneeAdapterOverrides: unknown): IssueRunModelOverrideInheritance;
|
|
9
|
+
/** True when this issue carries an override a parent must never rewrite. */
|
|
10
|
+
export declare function hasExplicitIssueRunModelOverride(assigneeAdapterOverrides: unknown): boolean;
|
|
7
11
|
/** Merges the override into `assigneeAdapterOverrides`, leaving its other keys alone. */
|
|
8
|
-
export declare function writeIssueRunModelOverride(assigneeAdapterOverrides: unknown, values: IssueRunModelOverrideValues
|
|
12
|
+
export declare function writeIssueRunModelOverride(assigneeAdapterOverrides: unknown, values: IssueRunModelOverrideValues, inheritance?: {
|
|
13
|
+
inheritToSubtasks: boolean;
|
|
14
|
+
subtaskScope: IssueRunModelOverrideSubtaskScope;
|
|
15
|
+
inherited?: boolean;
|
|
16
|
+
sourceIssueId?: string | null;
|
|
17
|
+
}): Record<string, unknown> | null;
|
|
9
18
|
export interface IssueRunAdapterConfig {
|
|
10
19
|
config: Record<string, unknown>;
|
|
11
20
|
modelOverride: Record<IssueRunModelOverrideKey, string | null>;
|
|
@@ -22,10 +31,16 @@ export declare function buildIssueRunModelOverrideView(input: {
|
|
|
22
31
|
adapterConfig: Record<string, unknown> | null;
|
|
23
32
|
} | null;
|
|
24
33
|
assigneeAdapterOverrides: unknown;
|
|
34
|
+
propagation?: IssueRunModelOverridePropagation | null;
|
|
25
35
|
}): Promise<IssueRunModelOverrideView>;
|
|
26
36
|
export declare function resolveIssueRunModelOverrideUpdate(input: {
|
|
27
37
|
adapterType: string | null;
|
|
28
38
|
values: IssueRunModelOverrideValues;
|
|
29
39
|
}): Promise<IssueRunModelOverrideValues>;
|
|
30
|
-
|
|
40
|
+
/** The override a new child inherits, or `null` when it keeps what it was created with. */
|
|
41
|
+
export declare function inheritIssueRunModelOverrideForChild(input: {
|
|
42
|
+
parentIssueId: string;
|
|
43
|
+
parentOverrides: unknown;
|
|
44
|
+
childOverrides: unknown;
|
|
45
|
+
}): Record<string, unknown> | null;
|
|
31
46
|
//# sourceMappingURL=issue-run-model-override.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-run-model-override.d.ts","sourceRoot":"","sources":["../../src/services/issue-run-model-override.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"issue-run-model-override.d.ts","sourceRoot":"","sources":["../../src/services/issue-run-model-override.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gCAAgC,EAChC,wBAAwB,EACxB,gCAAgC,EAChC,iCAAiC,EACjC,yBAAyB,EAC1B,MAAM,kCAAkC,CAAC;AAS1C,eAAO,MAAM,6BAA6B,EAAE,SAAS,wBAAwB,EAG5E,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,OAAO,CAC/C,MAAM,CAAC,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC,CAChD,CAAC;AAEF,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,YAAY,OAAO,EAAE,MAAM,EAAE,MAAM,SAAM,EAIxC;CACF;AAsBD,wBAAgB,oCAAoC,CAClD,wBAAwB,EAAE,OAAO,GAChC,gCAAgC,CAUlC;AAED,4EAA4E;AAC5E,wBAAgB,gCAAgC,CAC9C,wBAAwB,EAAE,OAAO,GAChC,OAAO,CAIT;AAED,yFAAyF;AACzF,wBAAgB,0BAA0B,CACxC,wBAAwB,EAAE,OAAO,EACjC,MAAM,EAAE,2BAA2B,EACnC,WAAW,CAAC,EAAE;IACZ,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,iCAAiC,CAAC;IAChD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,GACA,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CA2BhC;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAChE;AAED,8EAA8E;AAC9E,wBAAgB,0BAA0B,CACxC,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/C,cAAc,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GACvE,qBAAqB,CAMvB;AAsED,wBAAsB,8BAA8B,CAAC,KAAK,EAAE;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE;QACb,EAAE,EAAE,MAAM,CAAC;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;KAC/C,GAAG,IAAI,CAAC;IACT,wBAAwB,EAAE,OAAO,CAAC;IAClC,WAAW,CAAC,EAAE,gCAAgC,GAAG,IAAI,CAAC;CACvD,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAyCrC;AAED,wBAAsB,kCAAkC,CAAC,KAAK,EAAE;IAC9D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,2BAA2B,CAAC;CACrC,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAkBvC;AAED,2FAA2F;AAC3F,wBAAgB,oCAAoC,CAAC,KAAK,EAAE;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;CACzB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAkBjC"}
|