@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
|
@@ -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":"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"}
|
|
@@ -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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { AdapterConfigFieldValueError, isFreeTextAdapterConfigField, validateAdapterConfigFieldValue, } from "./adapter-config-field-value.js";
|
|
1
2
|
import { resolveAdapterConfigSchema } from "./adapter-config-schema.js";
|
|
2
|
-
const ISSUE_RUN_MODEL_OVERRIDE_KEYS = [
|
|
3
|
+
export const ISSUE_RUN_MODEL_OVERRIDE_KEYS = [
|
|
3
4
|
"model",
|
|
4
5
|
"thinking",
|
|
5
6
|
];
|
|
6
|
-
const FREE_TEXT_FIELD_TYPES = { text: true, combobox: true };
|
|
7
7
|
export class IssueRunModelOverrideError extends Error {
|
|
8
8
|
status;
|
|
9
9
|
constructor(message, status = 422) {
|
|
@@ -27,8 +27,25 @@ function readIssueRunModelOverride(assigneeAdapterOverrides) {
|
|
|
27
27
|
thinking: nonEmptyString(adapterConfig.thinking),
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
|
+
export function readIssueRunModelOverrideInheritance(assigneeAdapterOverrides) {
|
|
31
|
+
const raw = asRecord(asRecord(assigneeAdapterOverrides).modelOverrideInheritance);
|
|
32
|
+
const subtaskScope = raw.subtaskScope === "new_and_existing" ? "new_and_existing" : "new";
|
|
33
|
+
return {
|
|
34
|
+
inheritToSubtasks: raw.inheritToSubtasks !== false,
|
|
35
|
+
subtaskScope,
|
|
36
|
+
inherited: raw.inherited === true,
|
|
37
|
+
sourceIssueId: nonEmptyString(raw.sourceIssueId),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** True when this issue carries an override a parent must never rewrite. */
|
|
41
|
+
export function hasExplicitIssueRunModelOverride(assigneeAdapterOverrides) {
|
|
42
|
+
const stored = readIssueRunModelOverride(assigneeAdapterOverrides);
|
|
43
|
+
if (!stored.model && !stored.thinking)
|
|
44
|
+
return false;
|
|
45
|
+
return !readIssueRunModelOverrideInheritance(assigneeAdapterOverrides).inherited;
|
|
46
|
+
}
|
|
30
47
|
/** Merges the override into `assigneeAdapterOverrides`, leaving its other keys alone. */
|
|
31
|
-
export function writeIssueRunModelOverride(assigneeAdapterOverrides, values) {
|
|
48
|
+
export function writeIssueRunModelOverride(assigneeAdapterOverrides, values, inheritance) {
|
|
32
49
|
const current = asRecord(assigneeAdapterOverrides);
|
|
33
50
|
const adapterConfig = { ...asRecord(current.adapterConfig) };
|
|
34
51
|
for (const key of ISSUE_RUN_MODEL_OVERRIDE_KEYS) {
|
|
@@ -46,6 +63,18 @@ export function writeIssueRunModelOverride(assigneeAdapterOverrides, values) {
|
|
|
46
63
|
if (typeof current.useProjectWorkspace === "boolean") {
|
|
47
64
|
next.useProjectWorkspace = current.useProjectWorkspace;
|
|
48
65
|
}
|
|
66
|
+
const resolved = inheritance ?? readIssueRunModelOverrideInheritance(current);
|
|
67
|
+
const keepsOverride = Boolean(next.adapterConfig);
|
|
68
|
+
const inherited = keepsOverride && resolved.inherited === true;
|
|
69
|
+
if (inherited || !resolved.inheritToSubtasks || resolved.subtaskScope !== "new") {
|
|
70
|
+
next.modelOverrideInheritance = {
|
|
71
|
+
inheritToSubtasks: resolved.inheritToSubtasks,
|
|
72
|
+
subtaskScope: resolved.subtaskScope,
|
|
73
|
+
...(inherited
|
|
74
|
+
? { inherited: true, sourceIssueId: resolved.sourceIssueId ?? null }
|
|
75
|
+
: {}),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
49
78
|
return Object.keys(next).length > 0 ? next : null;
|
|
50
79
|
}
|
|
51
80
|
/** Layers the per-issue adapter overrides onto the run's execution config. */
|
|
@@ -59,23 +88,6 @@ export function buildIssueRunAdapterConfig(workspaceManagedConfig, issueOverride
|
|
|
59
88
|
function findField(schema, key) {
|
|
60
89
|
return schema.fields.find((field) => field.key === key) ?? null;
|
|
61
90
|
}
|
|
62
|
-
function validateIssueRunModelOverrideValue(field, value) {
|
|
63
|
-
const trimmed = value.trim();
|
|
64
|
-
if (!trimmed) {
|
|
65
|
-
throw new IssueRunModelOverrideError(`${field.label} cannot be empty; clear the override instead.`);
|
|
66
|
-
}
|
|
67
|
-
if (field.type === "select") {
|
|
68
|
-
const allowed = (field.options ?? []).map((option) => option.value);
|
|
69
|
-
if (!allowed.includes(trimmed)) {
|
|
70
|
-
throw new IssueRunModelOverrideError(`${field.label} must be one of: ${allowed.join(", ")}.`);
|
|
71
|
-
}
|
|
72
|
-
return trimmed;
|
|
73
|
-
}
|
|
74
|
-
if (!FREE_TEXT_FIELD_TYPES[field.type]) {
|
|
75
|
-
throw new IssueRunModelOverrideError(`${field.label} cannot be overridden per task.`);
|
|
76
|
-
}
|
|
77
|
-
return trimmed;
|
|
78
|
-
}
|
|
79
91
|
/** Validates against the adapter's published config schema, not a server-side list. */
|
|
80
92
|
function validateIssueRunModelOverride(schema, values) {
|
|
81
93
|
const result = {};
|
|
@@ -91,7 +103,18 @@ function validateIssueRunModelOverride(schema, values) {
|
|
|
91
103
|
if (!field) {
|
|
92
104
|
throw new IssueRunModelOverrideError(`This agent's adapter does not expose a "${key}" setting.`);
|
|
93
105
|
}
|
|
94
|
-
|
|
106
|
+
try {
|
|
107
|
+
result[key] = validateAdapterConfigFieldValue(field, value, {
|
|
108
|
+
clearHint: "clear the override instead",
|
|
109
|
+
unsupportedReason: "cannot be overridden per task",
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
if (error instanceof AdapterConfigFieldValueError) {
|
|
114
|
+
throw new IssueRunModelOverrideError(error.message, error.status);
|
|
115
|
+
}
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
95
118
|
}
|
|
96
119
|
return result;
|
|
97
120
|
}
|
|
@@ -103,7 +126,7 @@ function buildField(key, field, agentConfig, override) {
|
|
|
103
126
|
key,
|
|
104
127
|
label: field.label,
|
|
105
128
|
hint: field.hint ?? null,
|
|
106
|
-
freeText:
|
|
129
|
+
freeText: isFreeTextAdapterConfigField(field),
|
|
107
130
|
options: (field.options ?? [])
|
|
108
131
|
.filter((option) => option.value.trim())
|
|
109
132
|
.map((option) => ({
|
|
@@ -122,6 +145,8 @@ export async function buildIssueRunModelOverrideView(input) {
|
|
|
122
145
|
issueId: input.issueId,
|
|
123
146
|
agentId: input.assigneeAgent?.id ?? null,
|
|
124
147
|
adapterType: input.assigneeAgent?.adapterType ?? null,
|
|
148
|
+
inheritance: readIssueRunModelOverrideInheritance(input.assigneeAdapterOverrides),
|
|
149
|
+
propagation: input.propagation ?? null,
|
|
125
150
|
};
|
|
126
151
|
if (!input.assigneeAgent) {
|
|
127
152
|
return {
|
|
@@ -168,4 +193,28 @@ export async function resolveIssueRunModelOverrideUpdate(input) {
|
|
|
168
193
|
}
|
|
169
194
|
return validateIssueRunModelOverride(resolved.schema, input.values);
|
|
170
195
|
}
|
|
196
|
+
/** The override a new child inherits, or `null` when it keeps what it was created with. */
|
|
197
|
+
export function inheritIssueRunModelOverrideForChild(input) {
|
|
198
|
+
const parentInheritance = readIssueRunModelOverrideInheritance(input.parentOverrides);
|
|
199
|
+
if (!parentInheritance.inheritToSubtasks)
|
|
200
|
+
return null;
|
|
201
|
+
const parentValues = readIssueRunModelOverride(input.parentOverrides);
|
|
202
|
+
const childConfig = asRecord(asRecord(input.childOverrides).adapterConfig);
|
|
203
|
+
const values = {};
|
|
204
|
+
for (const key of ISSUE_RUN_MODEL_OVERRIDE_KEYS) {
|
|
205
|
+
if (!parentValues[key])
|
|
206
|
+
continue;
|
|
207
|
+
if (childConfig[key] !== undefined)
|
|
208
|
+
continue;
|
|
209
|
+
values[key] = parentValues[key];
|
|
210
|
+
}
|
|
211
|
+
if (Object.keys(values).length === 0)
|
|
212
|
+
return null;
|
|
213
|
+
return writeIssueRunModelOverride(input.childOverrides, values, {
|
|
214
|
+
inheritToSubtasks: true,
|
|
215
|
+
subtaskScope: parentInheritance.subtaskScope,
|
|
216
|
+
inherited: true,
|
|
217
|
+
sourceIssueId: parentInheritance.sourceIssueId ?? input.parentIssueId,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
171
220
|
//# sourceMappingURL=issue-run-model-override.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-run-model-override.js","sourceRoot":"","sources":["../../src/services/issue-run-model-override.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"issue-run-model-override.js","sourceRoot":"","sources":["../../src/services/issue-run-model-override.ts"],"names":[],"mappings":"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"}
|