@runfusion/fusion 0.77.0-beta.11 → 0.77.0-beta.13
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/bin.js +4920 -2723
- package/dist/child-process-worker.js +3369 -1522
- package/dist/client/.vite/manifest.json +256 -256
- package/dist/client/assets/AgentDetailView-DPoh46Ym.css +1 -0
- package/dist/client/assets/{AgentDetailView-DBtLmaDe.js → AgentDetailView-DwCr9HOY.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-CUoT_KSS.js → AgentPermissionPolicyEditor-CXRP1R7V.js} +1 -1
- package/dist/client/assets/{AgentsView-BAr7SsM4.js → AgentsView-DEVhP_Ad.js} +3 -3
- package/dist/client/assets/CommandCenter-BshTzOtB.css +1 -0
- package/dist/client/assets/CommandCenter-sNTR0N1L.js +107 -0
- package/dist/client/assets/{DevServerView-Du_4m2bu.js → DevServerView-X1Ncu9x-.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-BlAdIKxx.js → DirectoryPicker-UrDTGJYj.js} +1 -1
- package/dist/client/assets/{DocumentsView-ByJFT4I0.js → DocumentsView-DyyfLF1R.js} +1 -1
- package/dist/client/assets/{EvalsView-Dme2v3rH.js → EvalsView-DgMdhmj1.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-C3AjkBSq.js → ExperimentalAgentOnboardingModal-DqETOMkr.js} +1 -1
- package/dist/client/assets/{GoalsView-B8n2ggt7.js → GoalsView-Cai1_q1j.js} +1 -1
- package/dist/client/assets/{InsightsView-CquFSXMH.js → InsightsView-DN9i_pr2.js} +1 -1
- package/dist/client/assets/{MemoryView-CiErG8PC.js → MemoryView-DpVhI_BB.js} +1 -1
- package/dist/client/assets/{PatchnodeView-5bDCQRSq.js → PatchnodeView-C9glaWoU.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-DQ03OEXC.js → PiExtensionsManager-DkJ3I9ur.js} +1 -1
- package/dist/client/assets/{PluginManager-k29ipdWr.js → PluginManager-C3BKqDE-.js} +1 -1
- package/dist/client/assets/{PullRequestView-BvWI2q9N.js → PullRequestView-BCPolzJY.js} +1 -1
- package/dist/client/assets/{ReportModal-BH9g02a6.js → ReportModal-CBc5lSf3.js} +1 -1
- package/dist/client/assets/{ResearchView-CeP1rljk.js → ResearchView-BInIb1tK.js} +1 -1
- package/dist/client/assets/{SecretsView-Dv3_J_81.js → SecretsView-Db2mKOcp.js} +1 -1
- package/dist/client/assets/SettingsModal-BEULP2a7.css +1 -0
- package/dist/client/assets/SettingsModal-Dn9vcqW7.js +21 -0
- package/dist/client/assets/{SettingsModal-DMjYH6JA.js → SettingsModal-tnr4Y2cG.js} +1 -1
- package/dist/client/assets/{SettingsTextareaRow-UZ0YryUW.js → SettingsTextareaRow-DDIEo7kX.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-GSMFrNw2.js → SetupWizardModal-BgpCpOJi.js} +2 -2
- package/dist/client/assets/{SkillsView-gCNtWZf_.js → SkillsView-C4_dPxaH.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-DWu3E6Jg.js → WorkflowNodeEditor-BRIoMtdz.js} +1 -1
- package/dist/client/assets/{agent-import-generation-B1vyAdo0.js → agent-import-generation-DZjrAuLD.js} +1 -1
- package/dist/client/assets/{agentsOrgChartLayout-70TuKPlY.js → agentsOrgChartLayout-T3vfKGm-.js} +1 -1
- package/dist/client/assets/{app-CVozLPHX.js → app-BUPxz3_I.js} +1 -1
- package/dist/client/assets/{app-y8x9KYqa.js → app-Bsb-vSJ2.js} +3 -3
- package/dist/client/assets/{app-60jCmuOy.js → app-CDMzhkVk.js} +1 -1
- package/dist/client/assets/{app-BtBMuy2Z.js → app-Ca3_7roP.js} +3 -3
- package/dist/client/assets/{app-JnrgtY9I.js → app-CaiQxtA9.js} +3 -3
- package/dist/client/assets/{app-LrO9EOLE.js → app-D7N3gRgK.js} +3 -3
- package/dist/client/assets/{app-Cv-4fcPl.js → app-Du0s0Xs8.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-s7myd3al.js → architectureDiagram-3BPJPVTR-CG7lqp3T.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-DRHcpa5H.js → blockDiagram-GPEHLZMM-CCQyln9-.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-BFsUy5yO.js → c4Diagram-AAUBKEIU-DgTWfMuv.js} +1 -1
- package/dist/client/assets/channel-DQn8tAbt.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-BP1RbVtu.js → chunk-2J33WTMH-DbvgPKWu.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-CPRpQLCP.js → chunk-4BX2VUAB-Jeug78io.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-r6YyDKyy.js → chunk-55IACEB6-wSkfWEqo.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-0xpHKXZs.js → chunk-727SXJPM-o-cSBR4a.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-C6JMfScy.js → chunk-AQP2D5EJ-9iL_Co48.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-DxjEMlOu.js → chunk-FMBD7UC4-HKJKjpLt.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-BGUlWNB6.js → chunk-ND2GUHAM-DZUdY7Yv.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-CFRjGMND.js → chunk-QZHKN3VN-AFzlVJep.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-BVZs0DmH.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BVZs0DmH.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-DGG2Ux35.js → cose-bilkent-S5V4N54A-vhimfYza.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-CTY5i3so.js → dagre-BM42HDAG-wPz2jgXD.js} +1 -1
- package/dist/client/assets/{dashboard-view-N-SfZn-J.js → dashboard-view-BJVPfjWI.js} +1 -1
- package/dist/client/assets/{dashboard-view-BRjXwd9e.js → dashboard-view-BN6as5aN.js} +1 -1
- package/dist/client/assets/{dashboard-view-CDY9wohw.js → dashboard-view-ByLTU9KO.js} +1 -1
- package/dist/client/assets/{dashboard-view-Dq76DWwm.js → dashboard-view-HiX6AOAw.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-DJArhGIk.js → diagram-2AECGRRQ-DvPGnzo9.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-B84qgzdt.js → diagram-5GNKFQAL-CUD0xVXq.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-CdNfsKkQ.js → diagram-KO2AKTUF-p88av64o.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-BEbs4y1i.js → diagram-LMA3HP47-B2V_VFOf.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-CAtbZh_w.js → diagram-OG6HWLK6-CO02xKJJ.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-xwztc3Q7.js → erDiagram-TEJ5UH35-LiIZMOks.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-Br7puzSx.js → flowDiagram-I6XJVG4X-BMgU0xdB.js} +1 -1
- package/dist/client/assets/{folder-open-DdKnoktO.js → folder-open-Bfz0pfA0.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-BSi95Wyd.js → ganttDiagram-6RSMTGT7-C-DNnJ7F.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-BBqhe6Fa.js → gitGraphDiagram-PVQCEYII-BKnH_s4c.js} +1 -1
- package/dist/client/assets/index-D6zw4rNc.js +2937 -0
- package/dist/client/assets/index-lxhrCjd_.css +1 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-CLDl9nTe.js → infoDiagram-5YYISTIA-DrFgtiS_.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CbAV7HqZ.js → ishikawaDiagram-YF4QCWOH-cXcVkWVR.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-qU403OEV.js → journeyDiagram-JHISSGLW-2rAR6JrI.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-Cm7X52UA.js → kanban-definition-UN3LZRKU-uaIVKg6k.js} +1 -1
- package/dist/client/assets/{mermaid.core-CRm31xPI.js → mermaid.core-Bl1eKb-3.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-xK11OOHv.js → mindmap-definition-RKZ34NQL-C_ZfL855.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-KeD-Qpaa.js → pieDiagram-4H26LBE5-B-GWMxe6.js} +1 -1
- package/dist/client/assets/{puzzle-DEZH73Mz.js → puzzle--EYtEUHj.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CxdT8X-P.js → quadrantDiagram-W4KKPZXB-C4yu-vxx.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-DEURCYJL.js → requirementDiagram-4Y6WPE33-CmsMO-mZ.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-C5VDamq0.js → sankeyDiagram-5OEKKPKP-DKXXMJDr.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BuW7sjzh.js → sequenceDiagram-3UESZ5HK-DbpptsX5.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-D_2X2t4q.js → standing-instructions-template-bCcrFYtU.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-Cyo0XRvV.js → stateDiagram-AJRCARHV-DDwdEj_k.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-DuPs9FQx.js → stateDiagram-v2-BHNVJYJU-CjOnclTc.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-DiUEvc6L.js → timeline-definition-PNZ67QCA-Q8Appf3Z.js} +1 -1
- package/dist/client/assets/{upload-DWeBKn62.js → upload-Ka3GrAEL.js} +1 -1
- package/dist/client/assets/{users-CmWW59nZ.js → users-B7a_oi7v.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-DKC77z8l.js → vennDiagram-CIIHVFJN-ZsuVN3Hk.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-Bu26Q283.js → wardley-L42UT6IY-Eh9WyxS2.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-BJSAoAKw.js → wardleyDiagram-YWT4CUSO-CG1fl8Sj.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-DmqYngZ7.js → xychartDiagram-2RQKCTM6-BnZAlrGh.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +4058 -2058
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +9 -1
- package/dist/plugin-sdk/index.js +27 -14
- package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +40 -19
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-linear-import/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
- package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-quality/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-quality/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-todos/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-todos/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +27 -14
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/dist/client/assets/AgentDetailView-jzgy1BAS.css +0 -1
- package/dist/client/assets/CommandCenter-Djf24bRQ.js +0 -102
- package/dist/client/assets/CommandCenter-ilm-DbtI.css +0 -1
- package/dist/client/assets/SettingsModal-C5ic1ls7.css +0 -1
- package/dist/client/assets/SettingsModal-DHLK98c1.js +0 -21
- package/dist/client/assets/channel-9ayksTsZ.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-6A8Tw1Fx.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-6A8Tw1Fx.js +0 -1
- package/dist/client/assets/index-CSZd8sbH.js +0 -2936
- package/dist/client/assets/index-DQBk-yr8.css +0 -1
|
@@ -273,6 +273,7 @@ interface WorkflowStep {
|
|
|
273
273
|
gateMode: WorkflowStepGateMode;
|
|
274
274
|
prompt: string;
|
|
275
275
|
toolMode?: WorkflowStepToolMode;
|
|
276
|
+
readonlyMcpServers?: string[];
|
|
276
277
|
skillName?: string;
|
|
277
278
|
requiresBrowser?: boolean;
|
|
278
279
|
scriptName?: string;
|
|
@@ -336,6 +337,10 @@ interface WorkflowStepResult {
|
|
|
336
337
|
repositoryScopeRevision?: number;
|
|
337
338
|
remediationArchivedAt?: string;
|
|
338
339
|
remediationArchivedFromStatus?: WorkflowStepResult["status"];
|
|
340
|
+
remediationAttemptSignature?: string;
|
|
341
|
+
remediationAttemptOwner?: string;
|
|
342
|
+
remediationAttemptClaimedAt?: string;
|
|
343
|
+
remediationRefusedReason?: "no-actionable-findings" | "upstream-out-of-scope" | "unclassified-gate-no-reopen" | "appender-declined";
|
|
339
344
|
notRunReason?: WorkflowStepNotRunReason;
|
|
340
345
|
reviewInputFingerprint?: string;
|
|
341
346
|
reviewedCommitSha?: string;
|
|
@@ -5073,7 +5078,6 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
|
|
|
5073
5078
|
taskIdIntegrityReport: TaskIdIntegrityReport;
|
|
5074
5079
|
lastTaskIdIntegrityLogSignature: string | null;
|
|
5075
5080
|
workflowStepsCache: WorkflowStep[] | null;
|
|
5076
|
-
workflowDefinitionsCache: WorkflowDefinition[] | null;
|
|
5077
5081
|
_pluginWorkflowStepTemplates: Array<{
|
|
5078
5082
|
pluginId: string;
|
|
5079
5083
|
template: WorkflowStepTemplate;
|
|
@@ -5823,6 +5827,10 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
|
|
|
5823
5827
|
updateTaskAtomic(id: string, updater: (current: Task) => Parameters<TaskStore["updateTask"]>[1] | null | undefined | Promise<Parameters<TaskStore["updateTask"]>[1] | null | undefined>, runContext?: RunMutationContext): Promise<Task>;
|
|
5824
5828
|
appendRemediationSteps(taskId: string, steps: readonly TaskStep[], options?: AppendRemediationStepsOptions): Promise<AppendRemediationStepsResult>;
|
|
5825
5829
|
updateWorkflowStepResultsFenced(id: string, compute: WorkflowStepResultsFencedCompute): Promise<WorkflowStepResultsFencedUpdateResult>;
|
|
5830
|
+
updateWorkflowStepResultsWithLogFenced(id: string, compute: (current: Task) => {
|
|
5831
|
+
workflowStepResults: Task["workflowStepResults"];
|
|
5832
|
+
logEntry: TaskLogEntry;
|
|
5833
|
+
} | null): Promise<WorkflowStepResultsFencedUpdateResult>;
|
|
5826
5834
|
dismissAiMergeReviewFinding(taskId: string, findingId: string, reason: string, actor?: string): Promise<Task>;
|
|
5827
5835
|
linkTaskRecommendation(id: string, recommendationId: string, createdTaskId: string, completeColumns?: ReadonlySet<string>): Promise<Task>;
|
|
5828
5836
|
normalizeWorkspaceTaskWorktreeMetadata(id: string): Promise<Task>;
|
package/dist/plugin-sdk/index.js
CHANGED
|
@@ -9027,8 +9027,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
|
|
|
9027
9027
|
};
|
|
9028
9028
|
}
|
|
9029
9029
|
|
|
9030
|
+
// ../core/src/workflows/workflow-merge-region.ts
|
|
9031
|
+
var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
9032
|
+
"merge-gate",
|
|
9033
|
+
"merge-attempt",
|
|
9034
|
+
"manual-merge-hold",
|
|
9035
|
+
"retry-backoff",
|
|
9036
|
+
"recovery-router",
|
|
9037
|
+
"branch-group-member-integration",
|
|
9038
|
+
"branch-group-promotion",
|
|
9039
|
+
"pr-create",
|
|
9040
|
+
"pr-respond",
|
|
9041
|
+
"pr-merge"
|
|
9042
|
+
]);
|
|
9043
|
+
|
|
9030
9044
|
// ../core/src/workflows/workflow-step-results.ts
|
|
9031
9045
|
var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
|
|
9046
|
+
var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
|
|
9032
9047
|
|
|
9033
9048
|
// ../core/src/merge/task-merge.ts
|
|
9034
9049
|
var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
|
|
@@ -10574,20 +10589,6 @@ function classifyWorkflowAgentNode(node) {
|
|
|
10574
10589
|
}
|
|
10575
10590
|
}
|
|
10576
10591
|
|
|
10577
|
-
// ../core/src/workflows/workflow-merge-region.ts
|
|
10578
|
-
var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
10579
|
-
"merge-gate",
|
|
10580
|
-
"merge-attempt",
|
|
10581
|
-
"manual-merge-hold",
|
|
10582
|
-
"retry-backoff",
|
|
10583
|
-
"recovery-router",
|
|
10584
|
-
"branch-group-member-integration",
|
|
10585
|
-
"branch-group-promotion",
|
|
10586
|
-
"pr-create",
|
|
10587
|
-
"pr-respond",
|
|
10588
|
-
"pr-merge"
|
|
10589
|
-
]);
|
|
10590
|
-
|
|
10591
10592
|
// ../core/src/workflows/workflow-extension-types.ts
|
|
10592
10593
|
function workflowExtensionRegistryId(pluginId, extensionId) {
|
|
10593
10594
|
return `plugin:${pluginId}:${extensionId}`;
|
|
@@ -11579,6 +11580,16 @@ function validateReviewerAgentOverrides(nodes2) {
|
|
|
11579
11580
|
if (Array.isArray(templateNodes)) validateReviewerAgentOverrides(templateNodes);
|
|
11580
11581
|
}
|
|
11581
11582
|
}
|
|
11583
|
+
function validateReadonlyMcpServersConfig(nodes2) {
|
|
11584
|
+
for (const node of nodes2) {
|
|
11585
|
+
const value = node.config?.readonlyMcpServers;
|
|
11586
|
+
if (value !== void 0 && (!Array.isArray(value) || value.some((name) => typeof name !== "string" || !name.trim()))) {
|
|
11587
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' readonlyMcpServers must be an array of non-empty strings when present`);
|
|
11588
|
+
}
|
|
11589
|
+
const templateNodes = node.config?.template?.nodes;
|
|
11590
|
+
if (Array.isArray(templateNodes)) validateReadonlyMcpServersConfig(templateNodes);
|
|
11591
|
+
}
|
|
11592
|
+
}
|
|
11582
11593
|
function validateThinkingLevelConfig(nodes2) {
|
|
11583
11594
|
for (const node of nodes2) {
|
|
11584
11595
|
const value = node.config?.thinkingLevel;
|
|
@@ -12193,6 +12204,7 @@ function validateV2(ir) {
|
|
|
12193
12204
|
const topLevelIds = new Set(ir.nodes.map((n) => n.id));
|
|
12194
12205
|
validateStepExecutePlacement(ir.nodes);
|
|
12195
12206
|
validateThinkingLevelConfig(ir.nodes);
|
|
12207
|
+
validateReadonlyMcpServersConfig(ir.nodes);
|
|
12196
12208
|
validateCredentialInstanceIdConfig(ir.nodes);
|
|
12197
12209
|
validateReviewerAgentOverrides(ir.nodes);
|
|
12198
12210
|
for (const node of ir.nodes) {
|
|
@@ -14392,6 +14404,7 @@ Be specific: cite \`file:line\` for every finding and explain the concrete failu
|
|
|
14392
14404
|
- APPROVE_WITH_NOTES: shippable. Use this when your findings are all P1/P2 \u2014 they are recorded and handed to the implementer without another remediation round.
|
|
14393
14405
|
- REVISE: a correctness bug, regression, or contract break requires changes before merge. Requires at least one \`critical\` finding in \`findings\`; a REVISE without one will be treated as APPROVE_WITH_NOTES.
|
|
14394
14406
|
- Every blocking issue MUST appear as an entry in \`findings\` with its severity and \`filePath\`/\`line\`. Prose in \`notes\` alone does not block.
|
|
14407
|
+
- Every REVISE finding is a required Fix-step record. Its \`id\`, \`title\`, \`body\`, \`filePath\`, \`line\`, and \`severity\` must be concrete enough for an executor to implement without asking what to fix. If you cannot name an affected file and correction, do not return REVISE: investigate until you can, or return the appropriate non-blocking verdict.
|
|
14395
14408
|
- \`notes\` MUST contain one to three sentences naming what was checked and why the verdict was reached. An empty \`notes\` string is a protocol violation.
|
|
14396
14409
|
- Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
|
|
14397
14410
|
{"verdict":"APPROVE|APPROVE_WITH_NOTES|REVISE","notes":"...","findings":[{"id":"stable-id","title":"concise issue","body":"concrete failure and remediation","filePath":"path/to/file.ts","line":1,"severity":"critical|high|medium|low","resolution":"open|resolved-in-review|superseded"}]}`;
|
|
@@ -9026,8 +9026,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
|
|
|
9026
9026
|
};
|
|
9027
9027
|
}
|
|
9028
9028
|
|
|
9029
|
+
// ../core/src/workflows/workflow-merge-region.ts
|
|
9030
|
+
var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
9031
|
+
"merge-gate",
|
|
9032
|
+
"merge-attempt",
|
|
9033
|
+
"manual-merge-hold",
|
|
9034
|
+
"retry-backoff",
|
|
9035
|
+
"recovery-router",
|
|
9036
|
+
"branch-group-member-integration",
|
|
9037
|
+
"branch-group-promotion",
|
|
9038
|
+
"pr-create",
|
|
9039
|
+
"pr-respond",
|
|
9040
|
+
"pr-merge"
|
|
9041
|
+
]);
|
|
9042
|
+
|
|
9029
9043
|
// ../core/src/workflows/workflow-step-results.ts
|
|
9030
9044
|
var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
|
|
9045
|
+
var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
|
|
9031
9046
|
|
|
9032
9047
|
// ../core/src/merge/task-merge.ts
|
|
9033
9048
|
var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
|
|
@@ -10582,20 +10597,6 @@ function classifyWorkflowAgentNode(node) {
|
|
|
10582
10597
|
}
|
|
10583
10598
|
}
|
|
10584
10599
|
|
|
10585
|
-
// ../core/src/workflows/workflow-merge-region.ts
|
|
10586
|
-
var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
10587
|
-
"merge-gate",
|
|
10588
|
-
"merge-attempt",
|
|
10589
|
-
"manual-merge-hold",
|
|
10590
|
-
"retry-backoff",
|
|
10591
|
-
"recovery-router",
|
|
10592
|
-
"branch-group-member-integration",
|
|
10593
|
-
"branch-group-promotion",
|
|
10594
|
-
"pr-create",
|
|
10595
|
-
"pr-respond",
|
|
10596
|
-
"pr-merge"
|
|
10597
|
-
]);
|
|
10598
|
-
|
|
10599
10600
|
// ../core/src/workflows/workflow-extension-types.ts
|
|
10600
10601
|
function workflowExtensionRegistryId(pluginId, extensionId) {
|
|
10601
10602
|
return `plugin:${pluginId}:${extensionId}`;
|
|
@@ -11587,6 +11588,16 @@ function validateReviewerAgentOverrides(nodes2) {
|
|
|
11587
11588
|
if (Array.isArray(templateNodes)) validateReviewerAgentOverrides(templateNodes);
|
|
11588
11589
|
}
|
|
11589
11590
|
}
|
|
11591
|
+
function validateReadonlyMcpServersConfig(nodes2) {
|
|
11592
|
+
for (const node of nodes2) {
|
|
11593
|
+
const value = node.config?.readonlyMcpServers;
|
|
11594
|
+
if (value !== void 0 && (!Array.isArray(value) || value.some((name) => typeof name !== "string" || !name.trim()))) {
|
|
11595
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' readonlyMcpServers must be an array of non-empty strings when present`);
|
|
11596
|
+
}
|
|
11597
|
+
const templateNodes = node.config?.template?.nodes;
|
|
11598
|
+
if (Array.isArray(templateNodes)) validateReadonlyMcpServersConfig(templateNodes);
|
|
11599
|
+
}
|
|
11600
|
+
}
|
|
11590
11601
|
function validateThinkingLevelConfig(nodes2) {
|
|
11591
11602
|
for (const node of nodes2) {
|
|
11592
11603
|
const value = node.config?.thinkingLevel;
|
|
@@ -12201,6 +12212,7 @@ function validateV2(ir) {
|
|
|
12201
12212
|
const topLevelIds = new Set(ir.nodes.map((n) => n.id));
|
|
12202
12213
|
validateStepExecutePlacement(ir.nodes);
|
|
12203
12214
|
validateThinkingLevelConfig(ir.nodes);
|
|
12215
|
+
validateReadonlyMcpServersConfig(ir.nodes);
|
|
12204
12216
|
validateCredentialInstanceIdConfig(ir.nodes);
|
|
12205
12217
|
validateReviewerAgentOverrides(ir.nodes);
|
|
12206
12218
|
for (const node of ir.nodes) {
|
|
@@ -14400,6 +14412,7 @@ Be specific: cite \`file:line\` for every finding and explain the concrete failu
|
|
|
14400
14412
|
- APPROVE_WITH_NOTES: shippable. Use this when your findings are all P1/P2 \u2014 they are recorded and handed to the implementer without another remediation round.
|
|
14401
14413
|
- REVISE: a correctness bug, regression, or contract break requires changes before merge. Requires at least one \`critical\` finding in \`findings\`; a REVISE without one will be treated as APPROVE_WITH_NOTES.
|
|
14402
14414
|
- Every blocking issue MUST appear as an entry in \`findings\` with its severity and \`filePath\`/\`line\`. Prose in \`notes\` alone does not block.
|
|
14415
|
+
- Every REVISE finding is a required Fix-step record. Its \`id\`, \`title\`, \`body\`, \`filePath\`, \`line\`, and \`severity\` must be concrete enough for an executor to implement without asking what to fix. If you cannot name an affected file and correction, do not return REVISE: investigate until you can, or return the appropriate non-blocking verdict.
|
|
14403
14416
|
- \`notes\` MUST contain one to three sentences naming what was checked and why the verdict was reached. An empty \`notes\` string is a protocol violation.
|
|
14404
14417
|
- Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
|
|
14405
14418
|
{"verdict":"APPROVE|APPROVE_WITH_NOTES|REVISE","notes":"...","findings":[{"id":"stable-id","title":"concise issue","body":"concrete failure and remediation","filePath":"path/to/file.ts","line":1,"severity":"critical|high|medium|low","resolution":"open|resolved-in-review|superseded"}]}`;
|
|
@@ -37992,11 +38005,19 @@ async function authenticateAcpConnection(connection, opts) {
|
|
|
37992
38005
|
return { methodId };
|
|
37993
38006
|
}
|
|
37994
38007
|
async function newAcpSession(connection, opts) {
|
|
37995
|
-
|
|
37996
|
-
|
|
37997
|
-
|
|
37998
|
-
|
|
37999
|
-
|
|
38008
|
+
let res;
|
|
38009
|
+
try {
|
|
38010
|
+
res = await connection.conn.newSession({
|
|
38011
|
+
cwd: opts.cwd,
|
|
38012
|
+
mcpServers: opts.mcpServers ?? [],
|
|
38013
|
+
...opts.meta && Object.keys(opts.meta).length > 0 ? { _meta: opts.meta } : {}
|
|
38014
|
+
});
|
|
38015
|
+
} catch (error51) {
|
|
38016
|
+
throw new Error(
|
|
38017
|
+
`session/new failed (cwd ${opts.cwd}): ${describeAcpTurnError(error51)}`,
|
|
38018
|
+
{ cause: error51 }
|
|
38019
|
+
);
|
|
38020
|
+
}
|
|
38000
38021
|
return { sessionId: boundIdentifier(res.sessionId), modes: res.modes ?? void 0 };
|
|
38001
38022
|
}
|
|
38002
38023
|
var RETRYABLE_JSONRPC_CODES = /* @__PURE__ */ new Set([
|
|
@@ -9026,8 +9026,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
|
|
|
9026
9026
|
};
|
|
9027
9027
|
}
|
|
9028
9028
|
|
|
9029
|
+
// ../core/src/workflows/workflow-merge-region.ts
|
|
9030
|
+
var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
9031
|
+
"merge-gate",
|
|
9032
|
+
"merge-attempt",
|
|
9033
|
+
"manual-merge-hold",
|
|
9034
|
+
"retry-backoff",
|
|
9035
|
+
"recovery-router",
|
|
9036
|
+
"branch-group-member-integration",
|
|
9037
|
+
"branch-group-promotion",
|
|
9038
|
+
"pr-create",
|
|
9039
|
+
"pr-respond",
|
|
9040
|
+
"pr-merge"
|
|
9041
|
+
]);
|
|
9042
|
+
|
|
9029
9043
|
// ../core/src/workflows/workflow-step-results.ts
|
|
9030
9044
|
var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
|
|
9045
|
+
var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
|
|
9031
9046
|
|
|
9032
9047
|
// ../core/src/merge/task-merge.ts
|
|
9033
9048
|
var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
|
|
@@ -10582,20 +10597,6 @@ function classifyWorkflowAgentNode(node) {
|
|
|
10582
10597
|
}
|
|
10583
10598
|
}
|
|
10584
10599
|
|
|
10585
|
-
// ../core/src/workflows/workflow-merge-region.ts
|
|
10586
|
-
var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
10587
|
-
"merge-gate",
|
|
10588
|
-
"merge-attempt",
|
|
10589
|
-
"manual-merge-hold",
|
|
10590
|
-
"retry-backoff",
|
|
10591
|
-
"recovery-router",
|
|
10592
|
-
"branch-group-member-integration",
|
|
10593
|
-
"branch-group-promotion",
|
|
10594
|
-
"pr-create",
|
|
10595
|
-
"pr-respond",
|
|
10596
|
-
"pr-merge"
|
|
10597
|
-
]);
|
|
10598
|
-
|
|
10599
10600
|
// ../core/src/workflows/workflow-extension-types.ts
|
|
10600
10601
|
function workflowExtensionRegistryId(pluginId, extensionId) {
|
|
10601
10602
|
return `plugin:${pluginId}:${extensionId}`;
|
|
@@ -11587,6 +11588,16 @@ function validateReviewerAgentOverrides(nodes2) {
|
|
|
11587
11588
|
if (Array.isArray(templateNodes)) validateReviewerAgentOverrides(templateNodes);
|
|
11588
11589
|
}
|
|
11589
11590
|
}
|
|
11591
|
+
function validateReadonlyMcpServersConfig(nodes2) {
|
|
11592
|
+
for (const node of nodes2) {
|
|
11593
|
+
const value = node.config?.readonlyMcpServers;
|
|
11594
|
+
if (value !== void 0 && (!Array.isArray(value) || value.some((name) => typeof name !== "string" || !name.trim()))) {
|
|
11595
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' readonlyMcpServers must be an array of non-empty strings when present`);
|
|
11596
|
+
}
|
|
11597
|
+
const templateNodes = node.config?.template?.nodes;
|
|
11598
|
+
if (Array.isArray(templateNodes)) validateReadonlyMcpServersConfig(templateNodes);
|
|
11599
|
+
}
|
|
11600
|
+
}
|
|
11590
11601
|
function validateThinkingLevelConfig(nodes2) {
|
|
11591
11602
|
for (const node of nodes2) {
|
|
11592
11603
|
const value = node.config?.thinkingLevel;
|
|
@@ -12201,6 +12212,7 @@ function validateV2(ir) {
|
|
|
12201
12212
|
const topLevelIds = new Set(ir.nodes.map((n) => n.id));
|
|
12202
12213
|
validateStepExecutePlacement(ir.nodes);
|
|
12203
12214
|
validateThinkingLevelConfig(ir.nodes);
|
|
12215
|
+
validateReadonlyMcpServersConfig(ir.nodes);
|
|
12204
12216
|
validateCredentialInstanceIdConfig(ir.nodes);
|
|
12205
12217
|
validateReviewerAgentOverrides(ir.nodes);
|
|
12206
12218
|
for (const node of ir.nodes) {
|
|
@@ -14400,6 +14412,7 @@ Be specific: cite \`file:line\` for every finding and explain the concrete failu
|
|
|
14400
14412
|
- APPROVE_WITH_NOTES: shippable. Use this when your findings are all P1/P2 \u2014 they are recorded and handed to the implementer without another remediation round.
|
|
14401
14413
|
- REVISE: a correctness bug, regression, or contract break requires changes before merge. Requires at least one \`critical\` finding in \`findings\`; a REVISE without one will be treated as APPROVE_WITH_NOTES.
|
|
14402
14414
|
- Every blocking issue MUST appear as an entry in \`findings\` with its severity and \`filePath\`/\`line\`. Prose in \`notes\` alone does not block.
|
|
14415
|
+
- Every REVISE finding is a required Fix-step record. Its \`id\`, \`title\`, \`body\`, \`filePath\`, \`line\`, and \`severity\` must be concrete enough for an executor to implement without asking what to fix. If you cannot name an affected file and correction, do not return REVISE: investigate until you can, or return the appropriate non-blocking verdict.
|
|
14403
14416
|
- \`notes\` MUST contain one to three sentences naming what was checked and why the verdict was reached. An empty \`notes\` string is a protocol violation.
|
|
14404
14417
|
- Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
|
|
14405
14418
|
{"verdict":"APPROVE|APPROVE_WITH_NOTES|REVISE","notes":"...","findings":[{"id":"stable-id","title":"concise issue","body":"concrete failure and remediation","filePath":"path/to/file.ts","line":1,"severity":"critical|high|medium|low","resolution":"open|resolved-in-review|superseded"}]}`;
|
|
@@ -9146,8 +9146,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
|
|
|
9146
9146
|
};
|
|
9147
9147
|
}
|
|
9148
9148
|
|
|
9149
|
+
// ../core/src/workflows/workflow-merge-region.ts
|
|
9150
|
+
var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
9151
|
+
"merge-gate",
|
|
9152
|
+
"merge-attempt",
|
|
9153
|
+
"manual-merge-hold",
|
|
9154
|
+
"retry-backoff",
|
|
9155
|
+
"recovery-router",
|
|
9156
|
+
"branch-group-member-integration",
|
|
9157
|
+
"branch-group-promotion",
|
|
9158
|
+
"pr-create",
|
|
9159
|
+
"pr-respond",
|
|
9160
|
+
"pr-merge"
|
|
9161
|
+
]);
|
|
9162
|
+
|
|
9149
9163
|
// ../core/src/workflows/workflow-step-results.ts
|
|
9150
9164
|
var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
|
|
9165
|
+
var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
|
|
9151
9166
|
|
|
9152
9167
|
// ../core/src/merge/task-merge.ts
|
|
9153
9168
|
var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
|
|
@@ -10694,20 +10709,6 @@ function classifyWorkflowAgentNode(node) {
|
|
|
10694
10709
|
}
|
|
10695
10710
|
}
|
|
10696
10711
|
|
|
10697
|
-
// ../core/src/workflows/workflow-merge-region.ts
|
|
10698
|
-
var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
10699
|
-
"merge-gate",
|
|
10700
|
-
"merge-attempt",
|
|
10701
|
-
"manual-merge-hold",
|
|
10702
|
-
"retry-backoff",
|
|
10703
|
-
"recovery-router",
|
|
10704
|
-
"branch-group-member-integration",
|
|
10705
|
-
"branch-group-promotion",
|
|
10706
|
-
"pr-create",
|
|
10707
|
-
"pr-respond",
|
|
10708
|
-
"pr-merge"
|
|
10709
|
-
]);
|
|
10710
|
-
|
|
10711
10712
|
// ../core/src/workflows/workflow-extension-types.ts
|
|
10712
10713
|
function workflowExtensionRegistryId(pluginId, extensionId) {
|
|
10713
10714
|
return `plugin:${pluginId}:${extensionId}`;
|
|
@@ -11699,6 +11700,16 @@ function validateReviewerAgentOverrides(nodes2) {
|
|
|
11699
11700
|
if (Array.isArray(templateNodes)) validateReviewerAgentOverrides(templateNodes);
|
|
11700
11701
|
}
|
|
11701
11702
|
}
|
|
11703
|
+
function validateReadonlyMcpServersConfig(nodes2) {
|
|
11704
|
+
for (const node of nodes2) {
|
|
11705
|
+
const value = node.config?.readonlyMcpServers;
|
|
11706
|
+
if (value !== void 0 && (!Array.isArray(value) || value.some((name) => typeof name !== "string" || !name.trim()))) {
|
|
11707
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' readonlyMcpServers must be an array of non-empty strings when present`);
|
|
11708
|
+
}
|
|
11709
|
+
const templateNodes = node.config?.template?.nodes;
|
|
11710
|
+
if (Array.isArray(templateNodes)) validateReadonlyMcpServersConfig(templateNodes);
|
|
11711
|
+
}
|
|
11712
|
+
}
|
|
11702
11713
|
function validateThinkingLevelConfig(nodes2) {
|
|
11703
11714
|
for (const node of nodes2) {
|
|
11704
11715
|
const value = node.config?.thinkingLevel;
|
|
@@ -12313,6 +12324,7 @@ function validateV2(ir) {
|
|
|
12313
12324
|
const topLevelIds = new Set(ir.nodes.map((n) => n.id));
|
|
12314
12325
|
validateStepExecutePlacement(ir.nodes);
|
|
12315
12326
|
validateThinkingLevelConfig(ir.nodes);
|
|
12327
|
+
validateReadonlyMcpServersConfig(ir.nodes);
|
|
12316
12328
|
validateCredentialInstanceIdConfig(ir.nodes);
|
|
12317
12329
|
validateReviewerAgentOverrides(ir.nodes);
|
|
12318
12330
|
for (const node of ir.nodes) {
|
|
@@ -14512,6 +14524,7 @@ Be specific: cite \`file:line\` for every finding and explain the concrete failu
|
|
|
14512
14524
|
- APPROVE_WITH_NOTES: shippable. Use this when your findings are all P1/P2 \u2014 they are recorded and handed to the implementer without another remediation round.
|
|
14513
14525
|
- REVISE: a correctness bug, regression, or contract break requires changes before merge. Requires at least one \`critical\` finding in \`findings\`; a REVISE without one will be treated as APPROVE_WITH_NOTES.
|
|
14514
14526
|
- Every blocking issue MUST appear as an entry in \`findings\` with its severity and \`filePath\`/\`line\`. Prose in \`notes\` alone does not block.
|
|
14527
|
+
- Every REVISE finding is a required Fix-step record. Its \`id\`, \`title\`, \`body\`, \`filePath\`, \`line\`, and \`severity\` must be concrete enough for an executor to implement without asking what to fix. If you cannot name an affected file and correction, do not return REVISE: investigate until you can, or return the appropriate non-blocking verdict.
|
|
14515
14528
|
- \`notes\` MUST contain one to three sentences naming what was checked and why the verdict was reached. An empty \`notes\` string is a protocol violation.
|
|
14516
14529
|
- Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
|
|
14517
14530
|
{"verdict":"APPROVE|APPROVE_WITH_NOTES|REVISE","notes":"...","findings":[{"id":"stable-id","title":"concise issue","body":"concrete failure and remediation","filePath":"path/to/file.ts","line":1,"severity":"critical|high|medium|low","resolution":"open|resolved-in-review|superseded"}]}`;
|
|
@@ -9026,8 +9026,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
|
|
|
9026
9026
|
};
|
|
9027
9027
|
}
|
|
9028
9028
|
|
|
9029
|
+
// ../core/src/workflows/workflow-merge-region.ts
|
|
9030
|
+
var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
9031
|
+
"merge-gate",
|
|
9032
|
+
"merge-attempt",
|
|
9033
|
+
"manual-merge-hold",
|
|
9034
|
+
"retry-backoff",
|
|
9035
|
+
"recovery-router",
|
|
9036
|
+
"branch-group-member-integration",
|
|
9037
|
+
"branch-group-promotion",
|
|
9038
|
+
"pr-create",
|
|
9039
|
+
"pr-respond",
|
|
9040
|
+
"pr-merge"
|
|
9041
|
+
]);
|
|
9042
|
+
|
|
9029
9043
|
// ../core/src/workflows/workflow-step-results.ts
|
|
9030
9044
|
var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
|
|
9045
|
+
var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
|
|
9031
9046
|
|
|
9032
9047
|
// ../core/src/merge/task-merge.ts
|
|
9033
9048
|
var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
|
|
@@ -10574,20 +10589,6 @@ function classifyWorkflowAgentNode(node) {
|
|
|
10574
10589
|
}
|
|
10575
10590
|
}
|
|
10576
10591
|
|
|
10577
|
-
// ../core/src/workflows/workflow-merge-region.ts
|
|
10578
|
-
var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
10579
|
-
"merge-gate",
|
|
10580
|
-
"merge-attempt",
|
|
10581
|
-
"manual-merge-hold",
|
|
10582
|
-
"retry-backoff",
|
|
10583
|
-
"recovery-router",
|
|
10584
|
-
"branch-group-member-integration",
|
|
10585
|
-
"branch-group-promotion",
|
|
10586
|
-
"pr-create",
|
|
10587
|
-
"pr-respond",
|
|
10588
|
-
"pr-merge"
|
|
10589
|
-
]);
|
|
10590
|
-
|
|
10591
10592
|
// ../core/src/workflows/workflow-extension-types.ts
|
|
10592
10593
|
function workflowExtensionRegistryId(pluginId, extensionId) {
|
|
10593
10594
|
return `plugin:${pluginId}:${extensionId}`;
|
|
@@ -11579,6 +11580,16 @@ function validateReviewerAgentOverrides(nodes2) {
|
|
|
11579
11580
|
if (Array.isArray(templateNodes)) validateReviewerAgentOverrides(templateNodes);
|
|
11580
11581
|
}
|
|
11581
11582
|
}
|
|
11583
|
+
function validateReadonlyMcpServersConfig(nodes2) {
|
|
11584
|
+
for (const node of nodes2) {
|
|
11585
|
+
const value = node.config?.readonlyMcpServers;
|
|
11586
|
+
if (value !== void 0 && (!Array.isArray(value) || value.some((name) => typeof name !== "string" || !name.trim()))) {
|
|
11587
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' readonlyMcpServers must be an array of non-empty strings when present`);
|
|
11588
|
+
}
|
|
11589
|
+
const templateNodes = node.config?.template?.nodes;
|
|
11590
|
+
if (Array.isArray(templateNodes)) validateReadonlyMcpServersConfig(templateNodes);
|
|
11591
|
+
}
|
|
11592
|
+
}
|
|
11582
11593
|
function validateThinkingLevelConfig(nodes2) {
|
|
11583
11594
|
for (const node of nodes2) {
|
|
11584
11595
|
const value = node.config?.thinkingLevel;
|
|
@@ -12193,6 +12204,7 @@ function validateV2(ir) {
|
|
|
12193
12204
|
const topLevelIds = new Set(ir.nodes.map((n) => n.id));
|
|
12194
12205
|
validateStepExecutePlacement(ir.nodes);
|
|
12195
12206
|
validateThinkingLevelConfig(ir.nodes);
|
|
12207
|
+
validateReadonlyMcpServersConfig(ir.nodes);
|
|
12196
12208
|
validateCredentialInstanceIdConfig(ir.nodes);
|
|
12197
12209
|
validateReviewerAgentOverrides(ir.nodes);
|
|
12198
12210
|
for (const node of ir.nodes) {
|
|
@@ -14392,6 +14404,7 @@ Be specific: cite \`file:line\` for every finding and explain the concrete failu
|
|
|
14392
14404
|
- APPROVE_WITH_NOTES: shippable. Use this when your findings are all P1/P2 \u2014 they are recorded and handed to the implementer without another remediation round.
|
|
14393
14405
|
- REVISE: a correctness bug, regression, or contract break requires changes before merge. Requires at least one \`critical\` finding in \`findings\`; a REVISE without one will be treated as APPROVE_WITH_NOTES.
|
|
14394
14406
|
- Every blocking issue MUST appear as an entry in \`findings\` with its severity and \`filePath\`/\`line\`. Prose in \`notes\` alone does not block.
|
|
14407
|
+
- Every REVISE finding is a required Fix-step record. Its \`id\`, \`title\`, \`body\`, \`filePath\`, \`line\`, and \`severity\` must be concrete enough for an executor to implement without asking what to fix. If you cannot name an affected file and correction, do not return REVISE: investigate until you can, or return the appropriate non-blocking verdict.
|
|
14395
14408
|
- \`notes\` MUST contain one to three sentences naming what was checked and why the verdict was reached. An empty \`notes\` string is a protocol violation.
|
|
14396
14409
|
- Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
|
|
14397
14410
|
{"verdict":"APPROVE|APPROVE_WITH_NOTES|REVISE","notes":"...","findings":[{"id":"stable-id","title":"concise issue","body":"concrete failure and remediation","filePath":"path/to/file.ts","line":1,"severity":"critical|high|medium|low","resolution":"open|resolved-in-review|superseded"}]}`;
|
|
@@ -9029,8 +9029,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
|
|
|
9029
9029
|
};
|
|
9030
9030
|
}
|
|
9031
9031
|
|
|
9032
|
+
// ../core/src/workflows/workflow-merge-region.ts
|
|
9033
|
+
var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
9034
|
+
"merge-gate",
|
|
9035
|
+
"merge-attempt",
|
|
9036
|
+
"manual-merge-hold",
|
|
9037
|
+
"retry-backoff",
|
|
9038
|
+
"recovery-router",
|
|
9039
|
+
"branch-group-member-integration",
|
|
9040
|
+
"branch-group-promotion",
|
|
9041
|
+
"pr-create",
|
|
9042
|
+
"pr-respond",
|
|
9043
|
+
"pr-merge"
|
|
9044
|
+
]);
|
|
9045
|
+
|
|
9032
9046
|
// ../core/src/workflows/workflow-step-results.ts
|
|
9033
9047
|
var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
|
|
9048
|
+
var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
|
|
9034
9049
|
|
|
9035
9050
|
// ../core/src/merge/task-merge.ts
|
|
9036
9051
|
var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
|
|
@@ -10577,20 +10592,6 @@ function classifyWorkflowAgentNode(node) {
|
|
|
10577
10592
|
}
|
|
10578
10593
|
}
|
|
10579
10594
|
|
|
10580
|
-
// ../core/src/workflows/workflow-merge-region.ts
|
|
10581
|
-
var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
10582
|
-
"merge-gate",
|
|
10583
|
-
"merge-attempt",
|
|
10584
|
-
"manual-merge-hold",
|
|
10585
|
-
"retry-backoff",
|
|
10586
|
-
"recovery-router",
|
|
10587
|
-
"branch-group-member-integration",
|
|
10588
|
-
"branch-group-promotion",
|
|
10589
|
-
"pr-create",
|
|
10590
|
-
"pr-respond",
|
|
10591
|
-
"pr-merge"
|
|
10592
|
-
]);
|
|
10593
|
-
|
|
10594
10595
|
// ../core/src/workflows/workflow-extension-types.ts
|
|
10595
10596
|
function workflowExtensionRegistryId(pluginId, extensionId) {
|
|
10596
10597
|
return `plugin:${pluginId}:${extensionId}`;
|
|
@@ -11582,6 +11583,16 @@ function validateReviewerAgentOverrides(nodes2) {
|
|
|
11582
11583
|
if (Array.isArray(templateNodes)) validateReviewerAgentOverrides(templateNodes);
|
|
11583
11584
|
}
|
|
11584
11585
|
}
|
|
11586
|
+
function validateReadonlyMcpServersConfig(nodes2) {
|
|
11587
|
+
for (const node of nodes2) {
|
|
11588
|
+
const value = node.config?.readonlyMcpServers;
|
|
11589
|
+
if (value !== void 0 && (!Array.isArray(value) || value.some((name) => typeof name !== "string" || !name.trim()))) {
|
|
11590
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' readonlyMcpServers must be an array of non-empty strings when present`);
|
|
11591
|
+
}
|
|
11592
|
+
const templateNodes = node.config?.template?.nodes;
|
|
11593
|
+
if (Array.isArray(templateNodes)) validateReadonlyMcpServersConfig(templateNodes);
|
|
11594
|
+
}
|
|
11595
|
+
}
|
|
11585
11596
|
function validateThinkingLevelConfig(nodes2) {
|
|
11586
11597
|
for (const node of nodes2) {
|
|
11587
11598
|
const value = node.config?.thinkingLevel;
|
|
@@ -12196,6 +12207,7 @@ function validateV2(ir) {
|
|
|
12196
12207
|
const topLevelIds = new Set(ir.nodes.map((n) => n.id));
|
|
12197
12208
|
validateStepExecutePlacement(ir.nodes);
|
|
12198
12209
|
validateThinkingLevelConfig(ir.nodes);
|
|
12210
|
+
validateReadonlyMcpServersConfig(ir.nodes);
|
|
12199
12211
|
validateCredentialInstanceIdConfig(ir.nodes);
|
|
12200
12212
|
validateReviewerAgentOverrides(ir.nodes);
|
|
12201
12213
|
for (const node of ir.nodes) {
|
|
@@ -14395,6 +14407,7 @@ Be specific: cite \`file:line\` for every finding and explain the concrete failu
|
|
|
14395
14407
|
- APPROVE_WITH_NOTES: shippable. Use this when your findings are all P1/P2 \u2014 they are recorded and handed to the implementer without another remediation round.
|
|
14396
14408
|
- REVISE: a correctness bug, regression, or contract break requires changes before merge. Requires at least one \`critical\` finding in \`findings\`; a REVISE without one will be treated as APPROVE_WITH_NOTES.
|
|
14397
14409
|
- Every blocking issue MUST appear as an entry in \`findings\` with its severity and \`filePath\`/\`line\`. Prose in \`notes\` alone does not block.
|
|
14410
|
+
- Every REVISE finding is a required Fix-step record. Its \`id\`, \`title\`, \`body\`, \`filePath\`, \`line\`, and \`severity\` must be concrete enough for an executor to implement without asking what to fix. If you cannot name an affected file and correction, do not return REVISE: investigate until you can, or return the appropriate non-blocking verdict.
|
|
14398
14411
|
- \`notes\` MUST contain one to three sentences naming what was checked and why the verdict was reached. An empty \`notes\` string is a protocol violation.
|
|
14399
14412
|
- Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
|
|
14400
14413
|
{"verdict":"APPROVE|APPROVE_WITH_NOTES|REVISE","notes":"...","findings":[{"id":"stable-id","title":"concise issue","body":"concrete failure and remediation","filePath":"path/to/file.ts","line":1,"severity":"critical|high|medium|low","resolution":"open|resolved-in-review|superseded"}]}`;
|