@runfusion/fusion 0.75.1-beta.0 → 0.75.1-beta.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/bin.js +523 -212
- package/dist/child-process-worker.js +323 -99
- package/dist/client/.vite/manifest.json +249 -249
- package/dist/client/assets/{AgentDetailView-swTdiyeE.js → AgentDetailView-ltOG8f0-.js} +1 -1
- package/dist/client/assets/{AgentPermissionPolicyEditor-Dq-KuDaA.js → AgentPermissionPolicyEditor-CC_rrbbG.js} +1 -1
- package/dist/client/assets/{AgentsView-D1GEHyH0.js → AgentsView-DWUdi27N.js} +3 -3
- package/dist/client/assets/{ChatView-D1czGvvT.js → ChatView-mFKfoegS.js} +1 -1
- package/dist/client/assets/{CommandCenter-DWZ7OTOB.js → CommandCenter-C2wvDq_N.js} +1 -1
- package/dist/client/assets/{DevServerView-CAcUKOXd.js → DevServerView-0MWEJM7o.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-DVUl5jOk.js → DirectoryPicker-BjMPhCdh.js} +1 -1
- package/dist/client/assets/{DocumentsView-CnexOxtr.js → DocumentsView-ckH3rjmd.js} +1 -1
- package/dist/client/assets/{EvalsView-rTupzcDf.js → EvalsView-NyA644VF.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-CXE6Bj3V.js → ExperimentalAgentOnboardingModal-D0ZfbBRN.js} +1 -1
- package/dist/client/assets/{GoalsView-CjHwnnIi.js → GoalsView-Ctt5P_yo.js} +1 -1
- package/dist/client/assets/{InsightsView-C3XocYP-.js → InsightsView-NDp0bdNB.js} +1 -1
- package/dist/client/assets/{MemoryView-CsNHcx_d.js → MemoryView-BKbA4Bm4.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-BPTPoZBI.js → PiExtensionsManager-V3AFWMHm.js} +1 -1
- package/dist/client/assets/{PluginManager-CXadn8JE.js → PluginManager-D88G_TZh.js} +1 -1
- package/dist/client/assets/{PullRequestView-CC03CtZJ.js → PullRequestView-DQQmFFYC.js} +1 -1
- package/dist/client/assets/{ReportModal-Ci0na1eI.js → ReportModal-Clh1S8RF.js} +1 -1
- package/dist/client/assets/{ResearchView-DGWyAo8p.js → ResearchView-kxvq4zp5.js} +1 -1
- package/dist/client/assets/SecretsView-Dm0Vk8SA.js +1 -0
- package/dist/client/assets/{SessionTerminal-B22RlQeo.js → SessionTerminal-DJO4JTEX.js} +1 -1
- package/dist/client/assets/{SettingsModal-BkgBQZ19.js → SettingsModal-BN5mL_ym.js} +1 -1
- package/dist/client/assets/SettingsModal-CTf5voEW.js +21 -0
- package/dist/client/assets/{SettingsTextareaRow-0LXwMUQR.js → SettingsTextareaRow-CvKszqO-.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-CyW3AlRO.js → SetupWizardModal-D5hVZh1G.js} +2 -2
- package/dist/client/assets/{SkillsView-3oqB1ubq.js → SkillsView-DQVz21w2.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-CfUK_xs1.js → WorkflowNodeEditor-CpKIi6Tb.js} +3 -3
- package/dist/client/assets/{agent-import-generation-C7-Cmo3M.js → agent-import-generation-DGUNF3nd.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-BQ7ZN1r_.js → architectureDiagram-3BPJPVTR-CV83wubP.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-Debw1Xka.js → blockDiagram-GPEHLZMM-CNQsA3dD.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-CiU212s3.js → c4Diagram-AAUBKEIU-CXe7ii5H.js} +1 -1
- package/dist/client/assets/channel-DoX862zl.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-BUJQ86zb.js → chunk-2J33WTMH-BS6W9bWv.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-C6GdEm1z.js → chunk-4BX2VUAB-DbehRhdW.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-CImvrxQL.js → chunk-55IACEB6-DMI5SR42.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-Dt-A3pkM.js → chunk-727SXJPM-D1d-GBVj.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-DDj4oXTx.js → chunk-AQP2D5EJ-BzO6K3Uf.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-BD4r1ukC.js → chunk-FMBD7UC4-BVRLV3lK.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-DFSteefi.js → chunk-ND2GUHAM-DdWByQfn.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-t2zF8tjB.js → chunk-QZHKN3VN-1ia12cRV.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-mb2IeAGN.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-mb2IeAGN.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-tkvDkXQA.js → cose-bilkent-S5V4N54A-BPDT41HR.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-DD2rW7wo.js → dagre-BM42HDAG-Cktn26EH.js} +1 -1
- package/dist/client/assets/{dashboard-view-B1vduc8x.js → dashboard-view-8o0EUcRX.js} +1 -1
- package/dist/client/assets/{dashboard-view-CciuDS5A.js → dashboard-view-CkCerlVJ.js} +1 -1
- package/dist/client/assets/{dashboard-view-DruCruAc.js → dashboard-view-D_HC4lnr.js} +1 -1
- package/dist/client/assets/{dashboard-view-C7jJ1lA4.js → dashboard-view-zd8GxC49.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-DASuxGNc.js → diagram-2AECGRRQ-But4Lvf-.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-f9WtiIUk.js → diagram-5GNKFQAL-2bpQAGFc.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-QivICYCd.js → diagram-KO2AKTUF-Ckn9Qd1u.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-CMwcDFHR.js → diagram-LMA3HP47-Bjn8h84N.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-C-vPMeHZ.js → diagram-OG6HWLK6-BI6541hx.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-CxGtk9vj.js → erDiagram-TEJ5UH35-BqMiwHiM.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-qBZRZoV1.js → flowDiagram-I6XJVG4X-Q_SAB10M.js} +1 -1
- package/dist/client/assets/{folder-open-Dysi9Zzg.js → folder-open-CHiAJbTN.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-DAaXroiu.js → ganttDiagram-6RSMTGT7-CqWFSfPF.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DNUNQot_.js → gitGraphDiagram-PVQCEYII-B1o4uEjO.js} +1 -1
- package/dist/client/assets/index-Bdw5eNKV.css +1 -0
- package/dist/client/assets/index-kwRywd9M.js +2767 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-BSJmWLwh.js → infoDiagram-5YYISTIA-BzaMa0c2.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-AyVKvoDq.js → ishikawaDiagram-YF4QCWOH-I38yge00.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-972txzzd.js → journeyDiagram-JHISSGLW-WVQSgx4P.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-1xiNvIqK.js → kanban-definition-UN3LZRKU-BWtPQ3AH.js} +1 -1
- package/dist/client/assets/{mermaid.core-oeDA8jOm.js → mermaid.core-D1hnBtbi.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-DcktmI8s.js → mindmap-definition-RKZ34NQL-DqiSLkW7.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-ekBwLt-O.js → pieDiagram-4H26LBE5-CcgwbdIN.js} +1 -1
- package/dist/client/assets/{puzzle-I6pr6ZrW.js → puzzle-BhXUaTQl.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-D_wjTsvn.js → quadrantDiagram-W4KKPZXB-MsqQQfDN.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-CKGHyiJ1.js → requirementDiagram-4Y6WPE33-CILGjMMA.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-CtiZFNk5.js → sankeyDiagram-5OEKKPKP-c14fWbtR.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B6OMrfGk.js → sequenceDiagram-3UESZ5HK-BD5bxMom.js} +1 -1
- package/dist/client/assets/{shield-alert-CVMmviMG.js → shield-alert-C9W2WywS.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-Cg1a3tjW.js → standing-instructions-template-CJdbDSyg.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-CyTY2M_7.js → stateDiagram-AJRCARHV-CZ5YqeOn.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-NWPCCiqC.js → stateDiagram-v2-BHNVJYJU-mdMN-PNX.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-DU4TVYpw.js → timeline-definition-PNZ67QCA-DHKay9uj.js} +1 -1
- package/dist/client/assets/{upload-VCzeCiFH.js → upload-DxEwowRU.js} +1 -1
- package/dist/client/assets/{users-DB3knZtm.js → users-mNFgW_Zd.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-DX0Ppll6.js → vennDiagram-CIIHVFJN-X29K9hWM.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-CBoWxpDv.js → wardley-L42UT6IY-yEoTrfmN.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-B_eVqdhC.js → wardleyDiagram-YWT4CUSO-ny4k3kG0.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-DeZzEX0f.js → xychartDiagram-2RQKCTM6-DC8ODtRJ.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 +411 -155
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +159 -141
- package/dist/plugin-sdk/index.js +19 -0
- package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-linear-import/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
- package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-quality/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-quality/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-todos/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-todos/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +19 -0
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/dist/client/assets/SecretsView-Cv2IuqFO.js +0 -1
- package/dist/client/assets/SettingsModal-CPRpRK71.js +0 -21
- package/dist/client/assets/channel-D-O4mRXx.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-BhHdSetA.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BhHdSetA.js +0 -1
- package/dist/client/assets/index-D0QgE5F5.js +0 -2767
- package/dist/client/assets/index-DHk_s6rA.css +0 -1
|
@@ -209,7 +209,160 @@ declare class Database {
|
|
|
209
209
|
getPath(): string;
|
|
210
210
|
}
|
|
211
211
|
|
|
212
|
+
declare const THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh"];
|
|
213
|
+
type ThinkingLevel = (typeof THINKING_LEVELS)[number];
|
|
214
|
+
declare const COLUMNS: readonly ["triage", "todo", "in-progress", "in-review", "done", "archived"];
|
|
215
|
+
type Column = (typeof COLUMNS)[number];
|
|
216
|
+
type ColumnId = Column | (string & {});
|
|
217
|
+
declare const TASK_PRIORITIES: readonly ["low", "normal", "high", "urgent"];
|
|
218
|
+
type TaskPriority = (typeof TASK_PRIORITIES)[number];
|
|
219
|
+
|
|
220
|
+
interface ModelPreset {
|
|
221
|
+
id: string;
|
|
222
|
+
name: string;
|
|
223
|
+
executorProvider?: string;
|
|
224
|
+
executorModelId?: string;
|
|
225
|
+
executorCredentialInstanceId?: string;
|
|
226
|
+
validatorProvider?: string;
|
|
227
|
+
validatorModelId?: string;
|
|
228
|
+
validatorCredentialInstanceId?: string;
|
|
229
|
+
}
|
|
230
|
+
type WorkflowStepMode = "prompt" | "script";
|
|
231
|
+
type WorkflowStepToolMode = "readonly" | "coding";
|
|
232
|
+
type WorkflowStepGateMode = "gate" | "advisory";
|
|
233
|
+
type WorkflowReviewFindingSeverity = "low" | "medium" | "high" | "critical";
|
|
234
|
+
interface WorkflowReviewFinding {
|
|
235
|
+
id: string;
|
|
236
|
+
title: string;
|
|
237
|
+
body: string;
|
|
238
|
+
filePath?: string;
|
|
239
|
+
line?: number;
|
|
240
|
+
severity?: WorkflowReviewFindingSeverity;
|
|
241
|
+
}
|
|
242
|
+
type WorkflowStepPhase = "pre-merge" | "post-merge";
|
|
243
|
+
type WorkflowReviewKind = "plan" | "code";
|
|
244
|
+
interface WorkflowStep {
|
|
245
|
+
id: string;
|
|
246
|
+
templateId?: string;
|
|
247
|
+
name: string;
|
|
248
|
+
description: string;
|
|
249
|
+
mode: WorkflowStepMode;
|
|
250
|
+
phase?: WorkflowStepPhase;
|
|
251
|
+
gateMode: WorkflowStepGateMode;
|
|
252
|
+
prompt: string;
|
|
253
|
+
toolMode?: WorkflowStepToolMode;
|
|
254
|
+
skillName?: string;
|
|
255
|
+
requiresBrowser?: boolean;
|
|
256
|
+
scriptName?: string;
|
|
257
|
+
enabled: boolean;
|
|
258
|
+
defaultOn?: boolean;
|
|
259
|
+
modelProvider?: string;
|
|
260
|
+
modelId?: string;
|
|
261
|
+
thinkingLevel?: ThinkingLevel;
|
|
262
|
+
migratedFragmentId?: string;
|
|
263
|
+
createdAt: string;
|
|
264
|
+
updatedAt: string;
|
|
265
|
+
}
|
|
266
|
+
type NtfyNotificationEvent = "in-review" | "merged" | "failed" | "task-wedged" | "awaiting-approval" | "awaiting-user-review" | "planning-awaiting-input" | "cli-agent-awaiting-input" | "gridlock" | "board-stall-unrecovered" | "db-corruption-detected" | "fallback-used" | "memory-dreams-processed" | "token-budget" | "message:agent-to-user" | "message:agent-to-agent" | "message:room" | "oauth-token-expired" | "task-created" | "workflow-notify";
|
|
267
|
+
interface NotificationProviderConfig {
|
|
268
|
+
id: string;
|
|
269
|
+
name: string;
|
|
270
|
+
enabled: boolean;
|
|
271
|
+
config: Record<string, unknown>;
|
|
272
|
+
}
|
|
273
|
+
interface CustomProvider {
|
|
274
|
+
id: string;
|
|
275
|
+
name: string;
|
|
276
|
+
apiType: "openai-compatible" | "anthropic-compatible" | "google-generative-ai" | "openai-responses";
|
|
277
|
+
baseUrl: string;
|
|
278
|
+
apiKey?: string;
|
|
279
|
+
supportsDeveloperRole?: boolean;
|
|
280
|
+
anthropicPromptCaching?: boolean;
|
|
281
|
+
models?: {
|
|
282
|
+
id: string;
|
|
283
|
+
name: string;
|
|
284
|
+
}[];
|
|
285
|
+
}
|
|
286
|
+
interface WorkflowStepInput {
|
|
287
|
+
templateId?: string;
|
|
288
|
+
name: string;
|
|
289
|
+
description: string;
|
|
290
|
+
mode?: WorkflowStepMode;
|
|
291
|
+
phase?: WorkflowStepPhase;
|
|
292
|
+
gateMode?: WorkflowStepGateMode;
|
|
293
|
+
prompt?: string;
|
|
294
|
+
toolMode?: WorkflowStepToolMode;
|
|
295
|
+
skillName?: string;
|
|
296
|
+
scriptName?: string;
|
|
297
|
+
enabled?: boolean;
|
|
298
|
+
defaultOn?: boolean;
|
|
299
|
+
modelProvider?: string;
|
|
300
|
+
modelId?: string;
|
|
301
|
+
thinkingLevel?: ThinkingLevel;
|
|
302
|
+
migratedFragmentId?: string;
|
|
303
|
+
}
|
|
304
|
+
interface WorkflowStepResult {
|
|
305
|
+
workflowStepId: string;
|
|
306
|
+
workflowStepName: string;
|
|
307
|
+
phase?: WorkflowStepPhase;
|
|
308
|
+
source?: "optional-group" | "node";
|
|
309
|
+
status: "passed" | "failed" | "advisory_failure" | "skipped" | "pending";
|
|
310
|
+
reviewKind?: WorkflowReviewKind;
|
|
311
|
+
output?: string;
|
|
312
|
+
findings?: WorkflowReviewFinding[];
|
|
313
|
+
verdict?: "APPROVE" | "APPROVE_WITH_NOTES" | "REVISE";
|
|
314
|
+
notes?: string;
|
|
315
|
+
startedAt?: string;
|
|
316
|
+
completedAt?: string;
|
|
317
|
+
leaseOwner?: string;
|
|
318
|
+
leaseNodeId?: string;
|
|
319
|
+
bypassedBy?: string;
|
|
320
|
+
bypassedAt?: string;
|
|
321
|
+
bypassReason?: string;
|
|
322
|
+
bypassedFromStatus?: WorkflowStepResult["status"];
|
|
323
|
+
bypassedFromVerdict?: WorkflowStepResult["verdict"];
|
|
324
|
+
supersededAt?: string;
|
|
325
|
+
supersededReason?: "dependency-change";
|
|
326
|
+
planReviewAttemptCount?: number;
|
|
327
|
+
priorAttempts?: WorkflowStepResult[];
|
|
328
|
+
}
|
|
329
|
+
type WorkflowRunStepInstanceStatus = "pending" | "in-progress" | "awaiting-integration" | "completed" | "failed";
|
|
330
|
+
interface WorkflowRunStepInstance {
|
|
331
|
+
taskId: string;
|
|
332
|
+
runId: string;
|
|
333
|
+
foreachNodeId: string;
|
|
334
|
+
stepIndex: number;
|
|
335
|
+
pinnedStepCount: number;
|
|
336
|
+
currentNodeId?: string | null;
|
|
337
|
+
status: WorkflowRunStepInstanceStatus;
|
|
338
|
+
baselineSha?: string | null;
|
|
339
|
+
checkpointId?: string | null;
|
|
340
|
+
reworkCount: number;
|
|
341
|
+
branchName?: string | null;
|
|
342
|
+
integratedAt?: string | null;
|
|
343
|
+
updatedAt: string;
|
|
344
|
+
}
|
|
345
|
+
interface WorkflowStepTemplate {
|
|
346
|
+
id: string;
|
|
347
|
+
name: string;
|
|
348
|
+
description: string;
|
|
349
|
+
prompt: string;
|
|
350
|
+
mode?: WorkflowStepMode;
|
|
351
|
+
phase?: "pre-merge" | "post-merge";
|
|
352
|
+
scriptName?: string;
|
|
353
|
+
toolMode?: WorkflowStepToolMode;
|
|
354
|
+
gateMode?: WorkflowStepGateMode;
|
|
355
|
+
defaultOn?: boolean;
|
|
356
|
+
modelProvider?: string;
|
|
357
|
+
modelId?: string;
|
|
358
|
+
thinkingLevel?: ThinkingLevel;
|
|
359
|
+
category: string;
|
|
360
|
+
icon?: string;
|
|
361
|
+
enabled?: boolean;
|
|
362
|
+
}
|
|
363
|
+
|
|
212
364
|
type WorkflowIrNodeKind = "start" | "prompt" | "script" | "gate" | "end" | "hold" | "split" | "join" | "foreach" | "loop" | "optional-group" | "step-review" | "parse-steps" | "code" | "notify" | "merge-gate" | "merge-attempt" | "manual-merge-hold" | "retry-backoff" | "recovery-router" | "branch-group-member-integration" | "branch-group-promotion" | "pr-create" | "pr-respond" | "pr-merge" | "ask-user" | "exit-gate";
|
|
365
|
+
|
|
213
366
|
interface WorkflowIrNode {
|
|
214
367
|
id: string;
|
|
215
368
|
kind: WorkflowIrNodeKind;
|
|
@@ -521,14 +674,6 @@ type ToolFailureRetryClaim = {
|
|
|
521
674
|
outcome: "exhausted";
|
|
522
675
|
};
|
|
523
676
|
|
|
524
|
-
declare const THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh"];
|
|
525
|
-
type ThinkingLevel = (typeof THINKING_LEVELS)[number];
|
|
526
|
-
declare const COLUMNS: readonly ["triage", "todo", "in-progress", "in-review", "done", "archived"];
|
|
527
|
-
type Column = (typeof COLUMNS)[number];
|
|
528
|
-
type ColumnId = Column | (string & {});
|
|
529
|
-
declare const TASK_PRIORITIES: readonly ["low", "normal", "high", "urgent"];
|
|
530
|
-
type TaskPriority = (typeof TASK_PRIORITIES)[number];
|
|
531
|
-
|
|
532
677
|
declare const MERGE_REQUEST_STATES: readonly ["queued", "running", "retrying", "succeeded", "exhausted", "cancelled", "manual-required"];
|
|
533
678
|
type MergeRequestState = (typeof MERGE_REQUEST_STATES)[number];
|
|
534
679
|
declare const WORKFLOW_WORK_ITEM_KINDS: readonly ["task", "merge", "retry", "manual-hold", "recovery"];
|
|
@@ -5670,138 +5815,6 @@ interface AutoRecoverySettings {
|
|
|
5670
5815
|
type UnavailableNodePolicy = "block" | "fallback-local";
|
|
5671
5816
|
type OwningNodeHandoffPolicy = "block" | "reassign-to-local" | "reassign-any-healthy";
|
|
5672
5817
|
|
|
5673
|
-
interface ModelPreset {
|
|
5674
|
-
id: string;
|
|
5675
|
-
name: string;
|
|
5676
|
-
executorProvider?: string;
|
|
5677
|
-
executorModelId?: string;
|
|
5678
|
-
executorCredentialInstanceId?: string;
|
|
5679
|
-
validatorProvider?: string;
|
|
5680
|
-
validatorModelId?: string;
|
|
5681
|
-
validatorCredentialInstanceId?: string;
|
|
5682
|
-
}
|
|
5683
|
-
type WorkflowStepMode = "prompt" | "script";
|
|
5684
|
-
type WorkflowStepToolMode = "readonly" | "coding";
|
|
5685
|
-
type WorkflowStepGateMode = "gate" | "advisory";
|
|
5686
|
-
type WorkflowStepPhase = "pre-merge" | "post-merge";
|
|
5687
|
-
interface WorkflowStep {
|
|
5688
|
-
id: string;
|
|
5689
|
-
templateId?: string;
|
|
5690
|
-
name: string;
|
|
5691
|
-
description: string;
|
|
5692
|
-
mode: WorkflowStepMode;
|
|
5693
|
-
phase?: WorkflowStepPhase;
|
|
5694
|
-
gateMode: WorkflowStepGateMode;
|
|
5695
|
-
prompt: string;
|
|
5696
|
-
toolMode?: WorkflowStepToolMode;
|
|
5697
|
-
skillName?: string;
|
|
5698
|
-
requiresBrowser?: boolean;
|
|
5699
|
-
scriptName?: string;
|
|
5700
|
-
enabled: boolean;
|
|
5701
|
-
defaultOn?: boolean;
|
|
5702
|
-
modelProvider?: string;
|
|
5703
|
-
modelId?: string;
|
|
5704
|
-
thinkingLevel?: ThinkingLevel;
|
|
5705
|
-
migratedFragmentId?: string;
|
|
5706
|
-
createdAt: string;
|
|
5707
|
-
updatedAt: string;
|
|
5708
|
-
}
|
|
5709
|
-
type NtfyNotificationEvent = "in-review" | "merged" | "failed" | "task-wedged" | "awaiting-approval" | "awaiting-user-review" | "planning-awaiting-input" | "cli-agent-awaiting-input" | "gridlock" | "board-stall-unrecovered" | "db-corruption-detected" | "fallback-used" | "memory-dreams-processed" | "token-budget" | "message:agent-to-user" | "message:agent-to-agent" | "message:room" | "oauth-token-expired" | "task-created" | "workflow-notify";
|
|
5710
|
-
interface NotificationProviderConfig {
|
|
5711
|
-
id: string;
|
|
5712
|
-
name: string;
|
|
5713
|
-
enabled: boolean;
|
|
5714
|
-
config: Record<string, unknown>;
|
|
5715
|
-
}
|
|
5716
|
-
interface CustomProvider {
|
|
5717
|
-
id: string;
|
|
5718
|
-
name: string;
|
|
5719
|
-
apiType: "openai-compatible" | "anthropic-compatible" | "google-generative-ai" | "openai-responses";
|
|
5720
|
-
baseUrl: string;
|
|
5721
|
-
apiKey?: string;
|
|
5722
|
-
supportsDeveloperRole?: boolean;
|
|
5723
|
-
anthropicPromptCaching?: boolean;
|
|
5724
|
-
models?: {
|
|
5725
|
-
id: string;
|
|
5726
|
-
name: string;
|
|
5727
|
-
}[];
|
|
5728
|
-
}
|
|
5729
|
-
interface WorkflowStepInput {
|
|
5730
|
-
templateId?: string;
|
|
5731
|
-
name: string;
|
|
5732
|
-
description: string;
|
|
5733
|
-
mode?: WorkflowStepMode;
|
|
5734
|
-
phase?: WorkflowStepPhase;
|
|
5735
|
-
gateMode?: WorkflowStepGateMode;
|
|
5736
|
-
prompt?: string;
|
|
5737
|
-
toolMode?: WorkflowStepToolMode;
|
|
5738
|
-
skillName?: string;
|
|
5739
|
-
scriptName?: string;
|
|
5740
|
-
enabled?: boolean;
|
|
5741
|
-
defaultOn?: boolean;
|
|
5742
|
-
modelProvider?: string;
|
|
5743
|
-
modelId?: string;
|
|
5744
|
-
thinkingLevel?: ThinkingLevel;
|
|
5745
|
-
migratedFragmentId?: string;
|
|
5746
|
-
}
|
|
5747
|
-
interface WorkflowStepResult {
|
|
5748
|
-
workflowStepId: string;
|
|
5749
|
-
workflowStepName: string;
|
|
5750
|
-
phase?: WorkflowStepPhase;
|
|
5751
|
-
source?: "optional-group" | "node";
|
|
5752
|
-
status: "passed" | "failed" | "advisory_failure" | "skipped" | "pending";
|
|
5753
|
-
output?: string;
|
|
5754
|
-
verdict?: "APPROVE" | "APPROVE_WITH_NOTES" | "REVISE";
|
|
5755
|
-
notes?: string;
|
|
5756
|
-
startedAt?: string;
|
|
5757
|
-
completedAt?: string;
|
|
5758
|
-
leaseOwner?: string;
|
|
5759
|
-
leaseNodeId?: string;
|
|
5760
|
-
bypassedBy?: string;
|
|
5761
|
-
bypassedAt?: string;
|
|
5762
|
-
bypassReason?: string;
|
|
5763
|
-
bypassedFromStatus?: WorkflowStepResult["status"];
|
|
5764
|
-
bypassedFromVerdict?: WorkflowStepResult["verdict"];
|
|
5765
|
-
supersededAt?: string;
|
|
5766
|
-
supersededReason?: "dependency-change";
|
|
5767
|
-
planReviewAttemptCount?: number;
|
|
5768
|
-
priorAttempts?: WorkflowStepResult[];
|
|
5769
|
-
}
|
|
5770
|
-
type WorkflowRunStepInstanceStatus = "pending" | "in-progress" | "awaiting-integration" | "completed" | "failed";
|
|
5771
|
-
interface WorkflowRunStepInstance {
|
|
5772
|
-
taskId: string;
|
|
5773
|
-
runId: string;
|
|
5774
|
-
foreachNodeId: string;
|
|
5775
|
-
stepIndex: number;
|
|
5776
|
-
pinnedStepCount: number;
|
|
5777
|
-
currentNodeId?: string | null;
|
|
5778
|
-
status: WorkflowRunStepInstanceStatus;
|
|
5779
|
-
baselineSha?: string | null;
|
|
5780
|
-
checkpointId?: string | null;
|
|
5781
|
-
reworkCount: number;
|
|
5782
|
-
branchName?: string | null;
|
|
5783
|
-
integratedAt?: string | null;
|
|
5784
|
-
updatedAt: string;
|
|
5785
|
-
}
|
|
5786
|
-
interface WorkflowStepTemplate {
|
|
5787
|
-
id: string;
|
|
5788
|
-
name: string;
|
|
5789
|
-
description: string;
|
|
5790
|
-
prompt: string;
|
|
5791
|
-
mode?: WorkflowStepMode;
|
|
5792
|
-
phase?: "pre-merge" | "post-merge";
|
|
5793
|
-
scriptName?: string;
|
|
5794
|
-
toolMode?: WorkflowStepToolMode;
|
|
5795
|
-
gateMode?: WorkflowStepGateMode;
|
|
5796
|
-
defaultOn?: boolean;
|
|
5797
|
-
modelProvider?: string;
|
|
5798
|
-
modelId?: string;
|
|
5799
|
-
thinkingLevel?: ThinkingLevel;
|
|
5800
|
-
category: string;
|
|
5801
|
-
icon?: string;
|
|
5802
|
-
enabled?: boolean;
|
|
5803
|
-
}
|
|
5804
|
-
|
|
5805
5818
|
type PrConflictState = "clean" | "conflicting" | "behind" | "blocked" | "unknown";
|
|
5806
5819
|
interface PrConflictDiagnostics {
|
|
5807
5820
|
conflictingFiles: string[];
|
|
@@ -5968,6 +5981,7 @@ type TaskReviewDecision = "approved" | "changes-requested" | "commented" | "pend
|
|
|
5968
5981
|
type TaskReviewVerdict = "APPROVE" | "APPROVE_WITH_NOTES" | "REVISE" | "RETHINK" | "UNAVAILABLE";
|
|
5969
5982
|
type TaskReviewerType = "plan" | "code";
|
|
5970
5983
|
type TaskReviewItemStatus = "queued" | "in-progress" | "addressed" | "failed";
|
|
5984
|
+
type TaskReviewFindingSeverity = "low" | "medium" | "high" | "critical";
|
|
5971
5985
|
interface LegacyTaskReviewItem {
|
|
5972
5986
|
id: string;
|
|
5973
5987
|
source: TaskReviewSource;
|
|
@@ -6020,6 +6034,7 @@ interface TaskReviewStateItem {
|
|
|
6020
6034
|
threadId?: string;
|
|
6021
6035
|
githubCommentId?: number;
|
|
6022
6036
|
path?: string;
|
|
6037
|
+
line?: number;
|
|
6023
6038
|
diffSide?: string;
|
|
6024
6039
|
body: string;
|
|
6025
6040
|
author: TaskReviewAuthor;
|
|
@@ -6033,6 +6048,7 @@ interface TaskReviewStateItem {
|
|
|
6033
6048
|
verdict?: TaskReviewVerdict;
|
|
6034
6049
|
step?: number;
|
|
6035
6050
|
summary?: string;
|
|
6051
|
+
severity?: TaskReviewFindingSeverity;
|
|
6036
6052
|
}
|
|
6037
6053
|
type ReviewAddressingStatus = "queued" | "in-progress" | "addressed" | "failed";
|
|
6038
6054
|
interface ReviewAddressingSnapshot {
|
|
@@ -6044,6 +6060,7 @@ interface ReviewAddressingSnapshot {
|
|
|
6044
6060
|
authorLogin?: string;
|
|
6045
6061
|
filePath?: string;
|
|
6046
6062
|
lineNumber?: number;
|
|
6063
|
+
severity?: TaskReviewFindingSeverity;
|
|
6047
6064
|
threadId?: string;
|
|
6048
6065
|
url?: string;
|
|
6049
6066
|
}
|
|
@@ -6518,7 +6535,7 @@ interface Task {
|
|
|
6518
6535
|
pausedByAgentId?: string;
|
|
6519
6536
|
baseBranch?: string;
|
|
6520
6537
|
autoMerge?: boolean;
|
|
6521
|
-
autoMergeProvenance?: "user" | "legacy-stamp";
|
|
6538
|
+
autoMergeProvenance?: "user" | "mission" | "legacy-stamp";
|
|
6522
6539
|
branch?: string;
|
|
6523
6540
|
branchContext?: TaskBranchContext;
|
|
6524
6541
|
executionStartBranch?: string;
|
|
@@ -6708,6 +6725,7 @@ interface TaskCreateInput {
|
|
|
6708
6725
|
branchContext?: TaskBranchContext;
|
|
6709
6726
|
taskPrefix?: string;
|
|
6710
6727
|
autoMerge?: boolean;
|
|
6728
|
+
autoMergeProvenance?: "mission";
|
|
6711
6729
|
sourceIssue?: TaskSourceIssue;
|
|
6712
6730
|
gitlabTracking?: TaskGitLabTracking;
|
|
6713
6731
|
tokenUsage?: TaskTokenUsage;
|
package/dist/plugin-sdk/index.js
CHANGED
|
@@ -10540,6 +10540,7 @@ function validateForeach(node, topLevelNodeIds, columnIds) {
|
|
|
10540
10540
|
);
|
|
10541
10541
|
}
|
|
10542
10542
|
for (const inner of templateNodes) {
|
|
10543
|
+
validateReviewKind(inner, "nested");
|
|
10543
10544
|
if (inner.kind === "foreach" || inner.kind === "loop") {
|
|
10544
10545
|
throw new WorkflowIrError(
|
|
10545
10546
|
`foreach node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
|
|
@@ -10658,6 +10659,7 @@ function validateLoop(node, topLevelNodeIds, columnIds) {
|
|
|
10658
10659
|
);
|
|
10659
10660
|
}
|
|
10660
10661
|
for (const inner of templateNodes) {
|
|
10662
|
+
validateReviewKind(inner, "nested");
|
|
10661
10663
|
if (inner.kind === "loop" || inner.kind === "foreach") {
|
|
10662
10664
|
throw new WorkflowIrError(
|
|
10663
10665
|
`loop node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
|
|
@@ -10751,6 +10753,7 @@ function validateOptionalGroup(node, topLevelNodeIds, columnIds) {
|
|
|
10751
10753
|
throw new WorkflowIrError(`optional-group node '${node.id}' template has duplicate node ids`);
|
|
10752
10754
|
}
|
|
10753
10755
|
for (const inner of templateNodes) {
|
|
10756
|
+
validateReviewKind(inner, "nested");
|
|
10754
10757
|
if (inner.kind === "loop" || inner.kind === "foreach" || inner.kind === "optional-group") {
|
|
10755
10758
|
throw new WorkflowIrError(
|
|
10756
10759
|
`optional-group node '${node.id}' template may not contain nested loop/foreach/optional-group ('${inner.id}')`
|
|
@@ -11422,6 +11425,19 @@ function validateColumnRecovery(column) {
|
|
|
11422
11425
|
);
|
|
11423
11426
|
}
|
|
11424
11427
|
}
|
|
11428
|
+
function validateReviewKind(node, placement) {
|
|
11429
|
+
const value = node.config?.reviewKind;
|
|
11430
|
+
if (value === void 0) return;
|
|
11431
|
+
if (value !== "plan" && value !== "code") {
|
|
11432
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' has invalid reviewKind '${String(value)}'; expected 'plan' or 'code'`);
|
|
11433
|
+
}
|
|
11434
|
+
if (placement === "nested") {
|
|
11435
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind in an unsupported nested template placement`);
|
|
11436
|
+
}
|
|
11437
|
+
if (node.kind !== "prompt" && node.kind !== "gate" && node.kind !== "script" && node.kind !== "optional-group") {
|
|
11438
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind on unsupported node kind '${node.kind}'`);
|
|
11439
|
+
}
|
|
11440
|
+
}
|
|
11425
11441
|
function validateV2(ir) {
|
|
11426
11442
|
validateColumns(ir);
|
|
11427
11443
|
for (const [index2, column] of ir.columns.entries()) {
|
|
@@ -11444,6 +11460,7 @@ function validateV2(ir) {
|
|
|
11444
11460
|
}
|
|
11445
11461
|
const nodesById = new Map(ir.nodes.map((n) => [n.id, n]));
|
|
11446
11462
|
for (const node of ir.nodes) {
|
|
11463
|
+
validateReviewKind(node, "top-level");
|
|
11447
11464
|
validateExtensionMetadata(`Workflow node '${node.id}'`, node.extensions);
|
|
11448
11465
|
if (node.column !== void 0 && !columnIds.has(node.column)) {
|
|
11449
11466
|
throw new WorkflowIrError(
|
|
@@ -13614,6 +13631,7 @@ function codeReviewOptionalGroupNode(column, options = {}) {
|
|
|
13614
13631
|
column,
|
|
13615
13632
|
config: {
|
|
13616
13633
|
name: CODE_REVIEW_NAME,
|
|
13634
|
+
reviewKind: "code",
|
|
13617
13635
|
// Default-ON: runs for every coding task by default, but operators can toggle it
|
|
13618
13636
|
// off per task (remove `code-review` from enabledWorkflowSteps).
|
|
13619
13637
|
defaultOn: options.defaultOn ?? true,
|
|
@@ -13744,6 +13762,7 @@ function planReviewOptionalGroupNode(column, options = {}) {
|
|
|
13744
13762
|
...column ? { column } : {},
|
|
13745
13763
|
config: {
|
|
13746
13764
|
name: PLAN_REVIEW_NAME,
|
|
13765
|
+
reviewKind: "plan",
|
|
13747
13766
|
defaultOn: options.defaultOn ?? true,
|
|
13748
13767
|
/*
|
|
13749
13768
|
* FNXC:WorkflowRemediation 2026-06-29-12:14:
|
|
@@ -10539,6 +10539,7 @@ function validateForeach(node, topLevelNodeIds, columnIds) {
|
|
|
10539
10539
|
);
|
|
10540
10540
|
}
|
|
10541
10541
|
for (const inner of templateNodes) {
|
|
10542
|
+
validateReviewKind(inner, "nested");
|
|
10542
10543
|
if (inner.kind === "foreach" || inner.kind === "loop") {
|
|
10543
10544
|
throw new WorkflowIrError(
|
|
10544
10545
|
`foreach node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
|
|
@@ -10657,6 +10658,7 @@ function validateLoop(node, topLevelNodeIds, columnIds) {
|
|
|
10657
10658
|
);
|
|
10658
10659
|
}
|
|
10659
10660
|
for (const inner of templateNodes) {
|
|
10661
|
+
validateReviewKind(inner, "nested");
|
|
10660
10662
|
if (inner.kind === "loop" || inner.kind === "foreach") {
|
|
10661
10663
|
throw new WorkflowIrError(
|
|
10662
10664
|
`loop node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
|
|
@@ -10750,6 +10752,7 @@ function validateOptionalGroup(node, topLevelNodeIds, columnIds) {
|
|
|
10750
10752
|
throw new WorkflowIrError(`optional-group node '${node.id}' template has duplicate node ids`);
|
|
10751
10753
|
}
|
|
10752
10754
|
for (const inner of templateNodes) {
|
|
10755
|
+
validateReviewKind(inner, "nested");
|
|
10753
10756
|
if (inner.kind === "loop" || inner.kind === "foreach" || inner.kind === "optional-group") {
|
|
10754
10757
|
throw new WorkflowIrError(
|
|
10755
10758
|
`optional-group node '${node.id}' template may not contain nested loop/foreach/optional-group ('${inner.id}')`
|
|
@@ -11421,6 +11424,19 @@ function validateColumnRecovery(column) {
|
|
|
11421
11424
|
);
|
|
11422
11425
|
}
|
|
11423
11426
|
}
|
|
11427
|
+
function validateReviewKind(node, placement) {
|
|
11428
|
+
const value = node.config?.reviewKind;
|
|
11429
|
+
if (value === void 0) return;
|
|
11430
|
+
if (value !== "plan" && value !== "code") {
|
|
11431
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' has invalid reviewKind '${String(value)}'; expected 'plan' or 'code'`);
|
|
11432
|
+
}
|
|
11433
|
+
if (placement === "nested") {
|
|
11434
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind in an unsupported nested template placement`);
|
|
11435
|
+
}
|
|
11436
|
+
if (node.kind !== "prompt" && node.kind !== "gate" && node.kind !== "script" && node.kind !== "optional-group") {
|
|
11437
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind on unsupported node kind '${node.kind}'`);
|
|
11438
|
+
}
|
|
11439
|
+
}
|
|
11424
11440
|
function validateV2(ir) {
|
|
11425
11441
|
validateColumns(ir);
|
|
11426
11442
|
for (const [index2, column] of ir.columns.entries()) {
|
|
@@ -11443,6 +11459,7 @@ function validateV2(ir) {
|
|
|
11443
11459
|
}
|
|
11444
11460
|
const nodesById = new Map(ir.nodes.map((n) => [n.id, n]));
|
|
11445
11461
|
for (const node of ir.nodes) {
|
|
11462
|
+
validateReviewKind(node, "top-level");
|
|
11446
11463
|
validateExtensionMetadata(`Workflow node '${node.id}'`, node.extensions);
|
|
11447
11464
|
if (node.column !== void 0 && !columnIds.has(node.column)) {
|
|
11448
11465
|
throw new WorkflowIrError(
|
|
@@ -13613,6 +13630,7 @@ function codeReviewOptionalGroupNode(column, options = {}) {
|
|
|
13613
13630
|
column,
|
|
13614
13631
|
config: {
|
|
13615
13632
|
name: CODE_REVIEW_NAME,
|
|
13633
|
+
reviewKind: "code",
|
|
13616
13634
|
// Default-ON: runs for every coding task by default, but operators can toggle it
|
|
13617
13635
|
// off per task (remove `code-review` from enabledWorkflowSteps).
|
|
13618
13636
|
defaultOn: options.defaultOn ?? true,
|
|
@@ -13743,6 +13761,7 @@ function planReviewOptionalGroupNode(column, options = {}) {
|
|
|
13743
13761
|
...column ? { column } : {},
|
|
13744
13762
|
config: {
|
|
13745
13763
|
name: PLAN_REVIEW_NAME,
|
|
13764
|
+
reviewKind: "plan",
|
|
13746
13765
|
defaultOn: options.defaultOn ?? true,
|
|
13747
13766
|
/*
|
|
13748
13767
|
* FNXC:WorkflowRemediation 2026-06-29-12:14:
|
|
@@ -10539,6 +10539,7 @@ function validateForeach(node, topLevelNodeIds, columnIds) {
|
|
|
10539
10539
|
);
|
|
10540
10540
|
}
|
|
10541
10541
|
for (const inner of templateNodes) {
|
|
10542
|
+
validateReviewKind(inner, "nested");
|
|
10542
10543
|
if (inner.kind === "foreach" || inner.kind === "loop") {
|
|
10543
10544
|
throw new WorkflowIrError(
|
|
10544
10545
|
`foreach node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
|
|
@@ -10657,6 +10658,7 @@ function validateLoop(node, topLevelNodeIds, columnIds) {
|
|
|
10657
10658
|
);
|
|
10658
10659
|
}
|
|
10659
10660
|
for (const inner of templateNodes) {
|
|
10661
|
+
validateReviewKind(inner, "nested");
|
|
10660
10662
|
if (inner.kind === "loop" || inner.kind === "foreach") {
|
|
10661
10663
|
throw new WorkflowIrError(
|
|
10662
10664
|
`loop node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
|
|
@@ -10750,6 +10752,7 @@ function validateOptionalGroup(node, topLevelNodeIds, columnIds) {
|
|
|
10750
10752
|
throw new WorkflowIrError(`optional-group node '${node.id}' template has duplicate node ids`);
|
|
10751
10753
|
}
|
|
10752
10754
|
for (const inner of templateNodes) {
|
|
10755
|
+
validateReviewKind(inner, "nested");
|
|
10753
10756
|
if (inner.kind === "loop" || inner.kind === "foreach" || inner.kind === "optional-group") {
|
|
10754
10757
|
throw new WorkflowIrError(
|
|
10755
10758
|
`optional-group node '${node.id}' template may not contain nested loop/foreach/optional-group ('${inner.id}')`
|
|
@@ -11421,6 +11424,19 @@ function validateColumnRecovery(column) {
|
|
|
11421
11424
|
);
|
|
11422
11425
|
}
|
|
11423
11426
|
}
|
|
11427
|
+
function validateReviewKind(node, placement) {
|
|
11428
|
+
const value = node.config?.reviewKind;
|
|
11429
|
+
if (value === void 0) return;
|
|
11430
|
+
if (value !== "plan" && value !== "code") {
|
|
11431
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' has invalid reviewKind '${String(value)}'; expected 'plan' or 'code'`);
|
|
11432
|
+
}
|
|
11433
|
+
if (placement === "nested") {
|
|
11434
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind in an unsupported nested template placement`);
|
|
11435
|
+
}
|
|
11436
|
+
if (node.kind !== "prompt" && node.kind !== "gate" && node.kind !== "script" && node.kind !== "optional-group") {
|
|
11437
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind on unsupported node kind '${node.kind}'`);
|
|
11438
|
+
}
|
|
11439
|
+
}
|
|
11424
11440
|
function validateV2(ir) {
|
|
11425
11441
|
validateColumns(ir);
|
|
11426
11442
|
for (const [index2, column] of ir.columns.entries()) {
|
|
@@ -11443,6 +11459,7 @@ function validateV2(ir) {
|
|
|
11443
11459
|
}
|
|
11444
11460
|
const nodesById = new Map(ir.nodes.map((n) => [n.id, n]));
|
|
11445
11461
|
for (const node of ir.nodes) {
|
|
11462
|
+
validateReviewKind(node, "top-level");
|
|
11446
11463
|
validateExtensionMetadata(`Workflow node '${node.id}'`, node.extensions);
|
|
11447
11464
|
if (node.column !== void 0 && !columnIds.has(node.column)) {
|
|
11448
11465
|
throw new WorkflowIrError(
|
|
@@ -13613,6 +13630,7 @@ function codeReviewOptionalGroupNode(column, options = {}) {
|
|
|
13613
13630
|
column,
|
|
13614
13631
|
config: {
|
|
13615
13632
|
name: CODE_REVIEW_NAME,
|
|
13633
|
+
reviewKind: "code",
|
|
13616
13634
|
// Default-ON: runs for every coding task by default, but operators can toggle it
|
|
13617
13635
|
// off per task (remove `code-review` from enabledWorkflowSteps).
|
|
13618
13636
|
defaultOn: options.defaultOn ?? true,
|
|
@@ -13743,6 +13761,7 @@ function planReviewOptionalGroupNode(column, options = {}) {
|
|
|
13743
13761
|
...column ? { column } : {},
|
|
13744
13762
|
config: {
|
|
13745
13763
|
name: PLAN_REVIEW_NAME,
|
|
13764
|
+
reviewKind: "plan",
|
|
13746
13765
|
defaultOn: options.defaultOn ?? true,
|
|
13747
13766
|
/*
|
|
13748
13767
|
* FNXC:WorkflowRemediation 2026-06-29-12:14:
|
|
@@ -10659,6 +10659,7 @@ function validateForeach(node, topLevelNodeIds, columnIds) {
|
|
|
10659
10659
|
);
|
|
10660
10660
|
}
|
|
10661
10661
|
for (const inner of templateNodes) {
|
|
10662
|
+
validateReviewKind(inner, "nested");
|
|
10662
10663
|
if (inner.kind === "foreach" || inner.kind === "loop") {
|
|
10663
10664
|
throw new WorkflowIrError(
|
|
10664
10665
|
`foreach node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
|
|
@@ -10777,6 +10778,7 @@ function validateLoop(node, topLevelNodeIds, columnIds) {
|
|
|
10777
10778
|
);
|
|
10778
10779
|
}
|
|
10779
10780
|
for (const inner of templateNodes) {
|
|
10781
|
+
validateReviewKind(inner, "nested");
|
|
10780
10782
|
if (inner.kind === "loop" || inner.kind === "foreach") {
|
|
10781
10783
|
throw new WorkflowIrError(
|
|
10782
10784
|
`loop node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
|
|
@@ -10870,6 +10872,7 @@ function validateOptionalGroup(node, topLevelNodeIds, columnIds) {
|
|
|
10870
10872
|
throw new WorkflowIrError(`optional-group node '${node.id}' template has duplicate node ids`);
|
|
10871
10873
|
}
|
|
10872
10874
|
for (const inner of templateNodes) {
|
|
10875
|
+
validateReviewKind(inner, "nested");
|
|
10873
10876
|
if (inner.kind === "loop" || inner.kind === "foreach" || inner.kind === "optional-group") {
|
|
10874
10877
|
throw new WorkflowIrError(
|
|
10875
10878
|
`optional-group node '${node.id}' template may not contain nested loop/foreach/optional-group ('${inner.id}')`
|
|
@@ -11541,6 +11544,19 @@ function validateColumnRecovery(column) {
|
|
|
11541
11544
|
);
|
|
11542
11545
|
}
|
|
11543
11546
|
}
|
|
11547
|
+
function validateReviewKind(node, placement) {
|
|
11548
|
+
const value = node.config?.reviewKind;
|
|
11549
|
+
if (value === void 0) return;
|
|
11550
|
+
if (value !== "plan" && value !== "code") {
|
|
11551
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' has invalid reviewKind '${String(value)}'; expected 'plan' or 'code'`);
|
|
11552
|
+
}
|
|
11553
|
+
if (placement === "nested") {
|
|
11554
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind in an unsupported nested template placement`);
|
|
11555
|
+
}
|
|
11556
|
+
if (node.kind !== "prompt" && node.kind !== "gate" && node.kind !== "script" && node.kind !== "optional-group") {
|
|
11557
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind on unsupported node kind '${node.kind}'`);
|
|
11558
|
+
}
|
|
11559
|
+
}
|
|
11544
11560
|
function validateV2(ir) {
|
|
11545
11561
|
validateColumns(ir);
|
|
11546
11562
|
for (const [index2, column] of ir.columns.entries()) {
|
|
@@ -11563,6 +11579,7 @@ function validateV2(ir) {
|
|
|
11563
11579
|
}
|
|
11564
11580
|
const nodesById = new Map(ir.nodes.map((n) => [n.id, n]));
|
|
11565
11581
|
for (const node of ir.nodes) {
|
|
11582
|
+
validateReviewKind(node, "top-level");
|
|
11566
11583
|
validateExtensionMetadata(`Workflow node '${node.id}'`, node.extensions);
|
|
11567
11584
|
if (node.column !== void 0 && !columnIds.has(node.column)) {
|
|
11568
11585
|
throw new WorkflowIrError(
|
|
@@ -13733,6 +13750,7 @@ function codeReviewOptionalGroupNode(column, options = {}) {
|
|
|
13733
13750
|
column,
|
|
13734
13751
|
config: {
|
|
13735
13752
|
name: CODE_REVIEW_NAME,
|
|
13753
|
+
reviewKind: "code",
|
|
13736
13754
|
// Default-ON: runs for every coding task by default, but operators can toggle it
|
|
13737
13755
|
// off per task (remove `code-review` from enabledWorkflowSteps).
|
|
13738
13756
|
defaultOn: options.defaultOn ?? true,
|
|
@@ -13863,6 +13881,7 @@ function planReviewOptionalGroupNode(column, options = {}) {
|
|
|
13863
13881
|
...column ? { column } : {},
|
|
13864
13882
|
config: {
|
|
13865
13883
|
name: PLAN_REVIEW_NAME,
|
|
13884
|
+
reviewKind: "plan",
|
|
13866
13885
|
defaultOn: options.defaultOn ?? true,
|
|
13867
13886
|
/*
|
|
13868
13887
|
* FNXC:WorkflowRemediation 2026-06-29-12:14:
|