@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
|
@@ -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"}]}`;
|
|
@@ -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"}]}`;
|
|
@@ -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 value2 = node.config?.readonlyMcpServers;
|
|
11586
|
+
if (value2 !== void 0 && (!Array.isArray(value2) || value2.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 value2 = 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"}]}`;
|
|
@@ -159964,8 +159964,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
|
|
|
159964
159964
|
};
|
|
159965
159965
|
}
|
|
159966
159966
|
|
|
159967
|
+
// ../core/src/workflows/workflow-merge-region.ts
|
|
159968
|
+
var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
159969
|
+
"merge-gate",
|
|
159970
|
+
"merge-attempt",
|
|
159971
|
+
"manual-merge-hold",
|
|
159972
|
+
"retry-backoff",
|
|
159973
|
+
"recovery-router",
|
|
159974
|
+
"branch-group-member-integration",
|
|
159975
|
+
"branch-group-promotion",
|
|
159976
|
+
"pr-create",
|
|
159977
|
+
"pr-respond",
|
|
159978
|
+
"pr-merge"
|
|
159979
|
+
]);
|
|
159980
|
+
|
|
159967
159981
|
// ../core/src/workflows/workflow-step-results.ts
|
|
159968
159982
|
var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
|
|
159983
|
+
var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
|
|
159969
159984
|
|
|
159970
159985
|
// ../core/src/merge/task-merge.ts
|
|
159971
159986
|
var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
|
|
@@ -161512,20 +161527,6 @@ function classifyWorkflowAgentNode(node) {
|
|
|
161512
161527
|
}
|
|
161513
161528
|
}
|
|
161514
161529
|
|
|
161515
|
-
// ../core/src/workflows/workflow-merge-region.ts
|
|
161516
|
-
var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
|
|
161517
|
-
"merge-gate",
|
|
161518
|
-
"merge-attempt",
|
|
161519
|
-
"manual-merge-hold",
|
|
161520
|
-
"retry-backoff",
|
|
161521
|
-
"recovery-router",
|
|
161522
|
-
"branch-group-member-integration",
|
|
161523
|
-
"branch-group-promotion",
|
|
161524
|
-
"pr-create",
|
|
161525
|
-
"pr-respond",
|
|
161526
|
-
"pr-merge"
|
|
161527
|
-
]);
|
|
161528
|
-
|
|
161529
161530
|
// ../core/src/workflows/workflow-extension-types.ts
|
|
161530
161531
|
function workflowExtensionRegistryId(pluginId, extensionId) {
|
|
161531
161532
|
return `plugin:${pluginId}:${extensionId}`;
|
|
@@ -162517,6 +162518,16 @@ function validateReviewerAgentOverrides(nodes2) {
|
|
|
162517
162518
|
if (Array.isArray(templateNodes)) validateReviewerAgentOverrides(templateNodes);
|
|
162518
162519
|
}
|
|
162519
162520
|
}
|
|
162521
|
+
function validateReadonlyMcpServersConfig(nodes2) {
|
|
162522
|
+
for (const node of nodes2) {
|
|
162523
|
+
const value = node.config?.readonlyMcpServers;
|
|
162524
|
+
if (value !== void 0 && (!Array.isArray(value) || value.some((name) => typeof name !== "string" || !name.trim()))) {
|
|
162525
|
+
throw new WorkflowIrError(`Workflow node '${node.id}' readonlyMcpServers must be an array of non-empty strings when present`);
|
|
162526
|
+
}
|
|
162527
|
+
const templateNodes = node.config?.template?.nodes;
|
|
162528
|
+
if (Array.isArray(templateNodes)) validateReadonlyMcpServersConfig(templateNodes);
|
|
162529
|
+
}
|
|
162530
|
+
}
|
|
162520
162531
|
function validateThinkingLevelConfig(nodes2) {
|
|
162521
162532
|
for (const node of nodes2) {
|
|
162522
162533
|
const value = node.config?.thinkingLevel;
|
|
@@ -163131,6 +163142,7 @@ function validateV2(ir) {
|
|
|
163131
163142
|
const topLevelIds = new Set(ir.nodes.map((n) => n.id));
|
|
163132
163143
|
validateStepExecutePlacement(ir.nodes);
|
|
163133
163144
|
validateThinkingLevelConfig(ir.nodes);
|
|
163145
|
+
validateReadonlyMcpServersConfig(ir.nodes);
|
|
163134
163146
|
validateCredentialInstanceIdConfig(ir.nodes);
|
|
163135
163147
|
validateReviewerAgentOverrides(ir.nodes);
|
|
163136
163148
|
for (const node of ir.nodes) {
|
|
@@ -165330,6 +165342,7 @@ Be specific: cite \`file:line\` for every finding and explain the concrete failu
|
|
|
165330
165342
|
- 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.
|
|
165331
165343
|
- 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.
|
|
165332
165344
|
- Every blocking issue MUST appear as an entry in \`findings\` with its severity and \`filePath\`/\`line\`. Prose in \`notes\` alone does not block.
|
|
165345
|
+
- 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.
|
|
165333
165346
|
- \`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.
|
|
165334
165347
|
- Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
|
|
165335
165348
|
{"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"}]}`;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@runfusion/fusion",
|
|
3
|
-
"version": "0.77.0-beta.
|
|
3
|
+
"version": "0.77.0-beta.13",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Fusion CLI: HTTP API server, daemon, dashboard launcher, and task tooling for the Fusion AI coding agent.",
|
|
6
6
|
"homepage": "https://github.com/Runfusion/Fusion#readme",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.agent-detail-modal{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);width:100%;height:100%;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--shadow-lg)}.agent-detail-inline-shell{width:100%;height:100%;min-height:0;display:flex;flex-direction:column;overflow:hidden}.agent-detail-inline{width:100%;height:100%;min-height:0;display:flex;flex-direction:column;overflow:hidden;background:var(--surface);border:1px solid var(--border)}.agent-detail-inline-loading{width:100%;height:100%;min-height:0;display:flex;align-items:center;justify-content:center;overflow:hidden}.agent-detail-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);padding:calc(var(--space-xl) * 2 + var(--space-md));color:var(--text-muted)}.agent-detail-header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--space-sm) var(--space-md);padding:var(--space-md) calc(var(--space-lg) + var(--space-xs));border-bottom:1px solid var(--border);background:var(--bg-secondary);flex-shrink:0}.agent-detail-identity{display:flex;align-items:center;gap:var(--space-md);flex:1 1 auto;min-width:0}.agent-detail-inline-back{display:inline-flex;align-items:center;gap:var(--space-xs);min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs));padding:calc(var(--space-sm) - var(--space-xs) * .5) calc(var(--space-sm) + var(--space-xs) * .5);flex-shrink:0}.agent-detail-icon{width:calc(var(--space-lg) * 2 + var(--space-xs));height:calc(var(--space-lg) * 2 + var(--space-xs));display:flex;align-items:center;justify-content:center;color:var(--text);flex-shrink:0}.agent-detail-info{min-width:0}.agent-detail-info h2{font-size:calc(var(--space-md) + var(--space-xs));font-weight:600;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-detail-badges{display:flex;gap:var(--space-xs);margin-top:calc(var(--space-xs) * .5)}.agent-detail-header-actions{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:var(--space-sm);flex:0 1 auto;min-width:0}.agent-detail-controls{display:flex;align-items:center;flex-wrap:wrap;gap:calc(var(--space-xs) + var(--space-sm) * .25);flex-shrink:0}.btn--compact{padding:calc(var(--space-xs) + var(--space-xs) * .25) calc(var(--space-sm) + var(--space-xs) * .5);font-size:var(--space-md);gap:var(--space-xs)}.agent-detail-utility-actions{display:flex;align-items:center;gap:var(--space-xs);flex-shrink:0}.agent-detail-bulk-menu{position:relative}.agent-detail-bulk-menu-popover{position:absolute;right:0;top:calc(100% + var(--space-xs));min-width:calc(var(--space-xl) * 9);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);z-index:2;padding:var(--space-xs);display:flex;flex-direction:column;gap:var(--space-xs)}.agent-detail-bulk-menu-item{width:100%;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--text);text-align:left;padding:var(--space-sm);display:flex;flex-direction:column;gap:calc(var(--space-xs) * .5);cursor:pointer}.agent-detail-bulk-menu-item:hover:not(:disabled),.agent-detail-bulk-menu-item:focus-visible{outline:none;background:var(--card-hover)}.agent-detail-bulk-menu-item:disabled{color:var(--text-muted);cursor:not-allowed}.agent-detail-bulk-menu-item-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .5);color:var(--text-muted)}.agent-detail-import-btn{min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-title{display:flex;align-items:center;gap:var(--space-lg)}.agent-detail-actions{display:flex;align-items:center;gap:var(--space-sm)}.agent-detail-tabs{display:flex;gap:var(--space-xs);padding:0 calc(var(--space-lg) + var(--space-xs));border-bottom:1px solid var(--border);background:var(--bg-secondary);flex-shrink:0;overflow-x:auto;touch-action:pan-x pan-y;-webkit-overflow-scrolling:touch;scrollbar-width:none}.agent-detail-tabs::-webkit-scrollbar{display:none}.agent-detail-tab{display:flex;flex:0 0 auto;touch-action:pan-x pan-y;align-items:center;gap:var(--space-xs);padding:calc(var(--space-sm) + var(--space-xs) * .5) var(--space-md);background:none;border:none;border-bottom:calc(var(--space-xs) * .5) solid transparent;color:var(--text-muted);font-size:.875rem;cursor:pointer;transition:all var(--transition-fast);white-space:nowrap}.agent-detail-tab:hover{color:var(--text);background:var(--card-hover)}.agent-detail-tab.active{color:var(--todo);border-bottom-color:var(--todo)}.agent-detail-tab:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);background:color-mix(in srgb,var(--todo) 12%,transparent);color:var(--text);border-radius:var(--radius-sm)}.agent-detail-content{flex:1;min-height:0;overflow-y:auto;padding:var(--space-xl)}.agent-detail-footer{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-md) var(--space-xl);border-top:1px solid var(--border);background:var(--bg-secondary);font-size:var(--space-md);color:var(--text-muted);flex-shrink:0}.agent-detail-id{font-family:var(--font-mono);cursor:pointer}.agent-detail-id:hover{color:var(--text)}.dashboard-tab{display:flex;flex-direction:column;gap:var(--space-xl)}.dashboard-summary-layout{padding-bottom:var(--space-md)}.dashboard-summary-health-reason{margin-left:var(--space-xs);font-size:calc(var(--space-sm) + var(--space-xs))}.dashboard-summary-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-md)}.budget-warning-banner{display:flex;gap:var(--space-sm);align-items:flex-start;border:1px solid var(--color-warning);background:color-mix(in srgb,var(--color-warning) 12%,transparent);border-radius:var(--radius-md);padding:var(--space-md)}.dashboard-summary-hero__heading{display:flex;align-items:center;gap:var(--space-sm)}.dashboard-summary-hero__heading h3{margin:0;font-size:calc(var(--space-lg) + var(--space-xs) * .5);font-weight:600}.dashboard-summary-hero__meta{display:flex;flex-wrap:wrap;gap:var(--space-md);color:var(--text-muted)}.agent-detail-approval-badge{display:inline-flex;align-items:center;gap:var(--space-xs);color:var(--color-warning)}.dashboard-summary-skills{display:inline-flex;align-items:center;gap:var(--space-sm)}.dashboard-summary-skill-badges{display:inline-flex;flex-wrap:wrap;gap:var(--space-xs)}.dashboard-summary-skill-badge{max-width:calc(var(--space-xl) * 8);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-summary-skill-badge-btn{cursor:pointer}.dashboard-summary-skill-badge-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.dashboard-summary-skill-badge--selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 20%,transparent)}.dashboard-summary-skill-detail{margin-top:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);padding:var(--space-md);display:flex;flex-direction:column;gap:var(--space-sm)}.dashboard-summary-skill-detail-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.dashboard-summary-skill-detail-title{font-weight:600;color:var(--text)}.dashboard-summary-skill-detail-loading,.dashboard-summary-skill-detail-empty{display:inline-flex;align-items:center;gap:var(--space-xs);color:var(--text-muted)}.dashboard-summary-skill-detail-error{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-xs);color:var(--color-error)}.dashboard-summary-skill-detail-content{margin:0;padding:var(--space-sm);border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--card);color:var(--text);white-space:pre-wrap;word-break:break-word;max-height:calc(var(--space-2xl) * 6);overflow:auto}.dashboard-summary-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(calc(var(--space-xl) * 6 + var(--space-sm)),1fr));gap:var(--space-md)}.dashboard-summary-grid p{margin:0}.dashboard-summary-label{font-size:calc(var(--space-sm) + var(--space-xs) * .5);color:var(--text-muted)}.dashboard-summary-health-row{display:inline-flex;align-items:center;gap:var(--space-xs)}.dashboard-summary-health-reason{margin-left:var(--space-xs);font-size:var(--space-md)}.runs-list{display:flex;flex-direction:column;gap:var(--space-sm)}.run-item{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:var(--space-sm)}.dashboard-section{background:var(--bg-secondary);border-radius:var(--radius-md);padding:calc(var(--space-lg) + var(--space-xs))}.dashboard-section h3{font-size:calc(var(--space-md) + var(--space-xs) * .5);font-weight:600;margin:0 0 var(--space-lg) 0;color:var(--text-muted);text-transform:uppercase;letter-spacing:calc(var(--space-xs) * .125)}.info-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(calc(var(--space-xl) * 7 + var(--space-sm)),1fr));gap:var(--space-lg)}.info-item{display:flex;flex-direction:column;gap:var(--space-xs)}.info-label{font-size:var(--space-md);color:var(--text-muted)}.info-value{font-size:calc(var(--space-md) + var(--space-xs) * .5);font-weight:500}.inline-badge{display:inline-block;padding:calc(var(--space-xs) * .5) var(--space-sm);border-radius:var(--radius-sm);font-size:var(--space-md);text-transform:capitalize}.stats-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-lg)}.stat-card{background:var(--surface);border-radius:var(--radius-md);padding:var(--space-lg);text-align:center}.stat-value{font-size:calc(var(--space-lg) + var(--space-xs) * .5);font-weight:700;color:var(--todo)}.stat-label{font-size:calc(var(--space-sm) + var(--space-xs) * .5);color:var(--text-muted);margin-top:var(--space-xs)}.current-task{display:flex;align-items:center;gap:var(--space-md)}.task-badge{font-family:var(--font-mono);background:var(--surface);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm);font-size:calc(var(--space-md) + var(--space-xs) * .25)}.metadata-json{background:var(--surface);padding:var(--space-md);border-radius:var(--radius-sm);font-size:var(--space-md);overflow-x:auto;margin:0}.logs-tab{display:flex;flex-direction:column;height:100%}.logs-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:var(--space-md);margin-bottom:var(--space-md);border-bottom:1px solid var(--border)}.logs-count{font-size:var(--space-md);color:var(--text-muted)}.log-window-loader{display:flex;justify-content:center;padding-bottom:var(--space-sm)}.streaming-indicator{display:flex;align-items:center;gap:calc(var(--space-xs) + var(--space-sm) * .25);font-size:var(--space-md);color:var(--color-success)}.streaming-dot{width:var(--space-sm);height:var(--space-sm);background:var(--color-success);border-radius:50%;animation:pulse 1.5s infinite}.logs-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:calc(var(--space-2xl) + var(--space-lg));color:var(--text-muted);text-align:center}.logs-empty p{margin:var(--space-sm) 0 0 0}.agent-mail-tab{display:flex;flex-direction:column;gap:var(--space-md)}.agent-mail-tab-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.agent-mail-tab-header h3{margin:0;font-size:calc(var(--space-md) + var(--space-xs) * .5)}.agent-mail-tab-error{display:flex;align-items:center;gap:var(--space-xs);color:var(--color-error)}.agent-detail-loading--inline{flex-direction:row;justify-content:flex-start;padding:var(--space-md) 0}.agent-mail-tab .agent-mail-tab-message{width:100%;border:0;background:transparent;text-align:left;color:inherit;cursor:pointer}.agent-mail-tab .agent-mail-tab-message:hover{background:var(--card-hover)}.agent-mail-tab .agent-mail-tab-message:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.agent-mail-tab .agent-mail-tab-message--selected{background:color-mix(in srgb,var(--todo) 12%,transparent)}.agent-mail-tab .agent-mail-tab-detail{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-lg);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.agent-mail-tab .agent-mail-tab-back{align-self:flex-start}.agent-mail-tab .agent-mail-tab-detail-meta{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-mail-tab .agent-mail-tab-detail-row{display:flex;flex-wrap:wrap;gap:var(--space-md)}.agent-mail-tab .agent-mail-tab-detail-label{color:var(--text-muted);min-width:calc(var(--space-2xl) * 2)}.agent-mail-tab .agent-mail-tab-reply-context{color:var(--text-muted)}.agent-mail-tab .agent-mail-tab-detail-body{white-space:pre-wrap;word-break:break-word}.runs-tab{display:flex;flex-direction:column;gap:var(--space-md)}.runs-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:calc(var(--space-2xl) + var(--space-lg));color:var(--text-muted);text-align:center}.runs-empty p{margin:var(--space-sm) 0 0 0}.run-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg)}.run-card--active{border-color:var(--in-progress);background:color-mix(in srgb,var(--in-progress) 5%,transparent)}.run-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-sm)}.run-live-indicator{display:flex;align-items:center;gap:calc(var(--space-xs) + var(--space-sm) * .25);font-weight:600;color:var(--in-progress)}.live-dot{width:var(--space-sm);height:var(--space-sm);background:var(--in-progress);border-radius:50%;animation:pulse 1.5s infinite}.run-id{font-family:var(--font-mono);font-size:calc(var(--space-md) + var(--space-xs) * .25);color:var(--text-muted)}.run-status{display:flex;align-items:center;gap:calc(var(--space-xs) + var(--space-sm) * .25);font-size:calc(var(--space-md) + var(--space-xs) * .25);text-transform:capitalize}.run-status.active{color:var(--in-progress)}.run-status.completed{color:var(--color-success)}.run-status.failed{color:var(--color-error)}.run-status.terminated{color:var(--text-muted)}.run-details{display:flex;gap:var(--space-sm);font-size:var(--space-md);color:var(--text-muted)}.run-logs-container{padding:var(--space-md);background:var(--bg-secondary);border-top:1px solid var(--border);border-bottom:1px solid var(--border)}.run-details-loading-state{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) 0}.run-output-sections{margin-bottom:var(--space-md)}.run-output-section{margin-bottom:var(--space-sm)}.run-output-label{margin-bottom:var(--space-xs);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;letter-spacing:calc(var(--space-xs) * .1);text-transform:uppercase}.run-output-label--error{color:var(--color-error)}.run-output-panel{margin:0;max-height:calc(var(--space-2xl) * 6.25);overflow:auto;border-radius:var(--radius-sm);padding:var(--space-sm) var(--space-md);background:var(--surface);border:1px solid var(--border);white-space:pre-wrap;word-break:break-word;font-size:calc(var(--space-sm) + var(--space-xs));line-height:1.5}.run-output-panel--error{color:var(--color-error);border-color:color-mix(in srgb,var(--color-error) 35%,var(--border));background:color-mix(in srgb,var(--color-error) 10%,transparent)}.run-context-grid{display:flex;flex-wrap:wrap;gap:var(--space-xs) var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs))}.run-context-item{line-height:1.5}.run-output-empty{padding:var(--space-sm) 0;font-style:italic;font-size:calc(var(--space-sm) + var(--space-xs))}.prompt-size-summary{display:flex;align-items:center;gap:var(--space-sm)}.prompt-size-sparkline{width:calc(var(--space-2xl) * 2);height:calc(var(--space-xl) + var(--space-md));border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface)}.prompt-size-sparkline-grid{fill:none;stroke:var(--text-muted);stroke-width:1}.prompt-size-sparkline-line{fill:none;stroke:var(--accent);stroke-width:2}.prompt-size-values{font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}.run-agent-logs-section{margin-top:var(--space-xs);padding-top:var(--space-sm);border-top:1px solid var(--border)}.agent-tasks-list{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-task-item{display:flex;flex-direction:column;gap:calc(var(--space-xs) + var(--space-sm) * .25);padding:var(--space-md) calc(var(--space-md) + var(--space-xs) * .5);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-secondary);text-decoration:none;transition:background var(--transition-fast),border-color var(--transition-fast)}.agent-task-item:hover{background:var(--card-hover);border-color:var(--text-dim)}.agent-task-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.agent-task-id{font-family:var(--font-mono);font-size:var(--space-md);font-weight:600;color:var(--todo)}.agent-task-title{font-size:calc(var(--space-md) + var(--space-xs) * .5);font-weight:500;color:var(--text);line-height:1.4}.agent-task-status{font-size:var(--space-md);color:var(--text-muted)}.agent-task-column{display:inline-flex;align-items:center;padding:calc(var(--space-xs) * .5) var(--space-sm);border-radius:var(--radius-pill);font-size:calc(var(--space-sm) + var(--space-xs) * .5);font-weight:700;text-transform:uppercase;letter-spacing:calc(var(--space-xs) * .1)}.agent-task-column.column-triage{color:var(--triage);background:color-mix(in srgb,var(--triage) 18%,transparent)}.agent-task-column.column-todo{color:var(--todo);background:color-mix(in srgb,var(--todo) 18%,transparent)}.agent-task-column.column-in-progress{color:var(--in-progress);background:color-mix(in srgb,var(--in-progress) 18%,transparent)}.agent-task-column.column-in-review{color:var(--in-review);background:color-mix(in srgb,var(--in-review) 18%,transparent)}.agent-task-column.column-done{color:var(--done);background:color-mix(in srgb,var(--done) 18%,transparent)}.agent-task-column.column-archived{color:var(--text-muted);background:color-mix(in srgb,var(--text-muted) 18%,transparent)}.agent-tasks-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:calc(var(--space-2xl) + var(--space-lg));color:var(--text-muted);text-align:center}.agent-tasks-empty p{margin:0}.config-tab{display:flex;flex-direction:column;gap:var(--space-xl);color:var(--text)}.config-section{background:var(--bg-secondary);border:1px solid var(--border-subtle);border-radius:var(--radius-md);padding:calc(var(--space-md) + var(--space-sm));color:var(--text)}.config-section .input,.config-section .select,.config-section textarea{background:var(--surface);color:var(--text);border-color:var(--border)}.config-section .input::placeholder,.config-section textarea::placeholder{color:var(--text-dim)}.config-section .input:hover:not(:disabled):not([readonly]),.config-section .select:hover:not(:disabled),.config-section textarea:hover:not(:disabled):not([readonly]){border-color:var(--text-muted)}.config-section .input:focus-visible,.config-section .select:focus-visible,.config-section textarea:focus-visible,.config-section input[type=checkbox]:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.config-section .input:disabled,.config-section .select:disabled,.config-section textarea:disabled,.config-section .btn:disabled,.config-runtime-tab:disabled,.agent-avatar-editor-action:disabled{opacity:var(--opacity-disabled, .6);color:var(--text-muted);cursor:not-allowed}.config-section .input[readonly],.config-section textarea[readonly]{background:var(--surface-muted);color:var(--text-muted)}.config-section input[type=checkbox]{accent-color:var(--todo)}.agent-avatar-editor-actions .agent-avatar-editor-action{background:var(--card);color:var(--text);border-color:var(--border)}.agent-avatar-editor-actions .agent-avatar-editor-action:hover:not(:disabled){background:var(--card-hover);border-color:var(--text-muted)}.agent-avatar-editor-actions .agent-avatar-editor-action:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.config-section h3{font-size:calc(var(--space-md) + var(--space-xs));font-weight:600;margin:0 0 var(--space-sm) 0}.config-section--danger{border:1px solid color-mix(in srgb,var(--color-error) 40%,transparent)}.config-danger-note{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted)}.agent-content-toolbar{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-sm) var(--space-lg);border-bottom:1px solid var(--border);background:var(--surface);flex-shrink:0}.agent-content-mode-toggle{display:flex;align-items:center;gap:var(--space-xs)}.agent-content-mode-toggle .btn{display:inline-flex;align-items:center;gap:calc(var(--space-xs) + var(--space-sm) * .25)}.agent-content-preview{overflow-y:auto;padding:var(--space-lg);min-height:150px}.agent-content-placeholder{color:var(--text-muted);text-align:center;padding:var(--space-xl);min-height:150px;display:flex;align-items:center;justify-content:center}.config-description{font-size:calc(var(--space-md) + var(--space-xs) * .5);color:var(--text-muted);margin:0 0 calc(var(--space-md) + var(--space-sm)) 0}.config-actions-row{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-md)}.config-fields{display:flex;flex-direction:column;gap:var(--space-lg)}.config-field{display:flex;flex-direction:column;gap:calc(var(--space-xs) + var(--space-sm) * .25)}.config-field label{font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:500}.config-role-tags{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin:0;padding:var(--space-sm);border:var(--border-width) solid var(--border);border-radius:var(--radius-md)}.config-role-tags legend{padding-inline:var(--space-xs)}.agent-avatar-editor{display:flex;align-items:center;gap:var(--space-md)}.agent-avatar-editor-preview{background:var(--card)}.agent-avatar-editor-actions{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap}.config-runtime-tabs{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-sm);margin-bottom:var(--space-md)}.config-runtime-tab{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);color:var(--text-muted);padding:var(--space-sm) var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast)}.config-runtime-tab:hover{border-color:var(--todo);color:var(--text);background:var(--card-hover)}.config-runtime-tab:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.config-runtime-tab.active{border-color:var(--todo);color:var(--text);background:color-mix(in srgb,var(--todo) 12%,transparent)}.config-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);font-style:italic}.config-error{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--color-error)}.input--error{border-color:var(--color-error)!important}.config-actions{display:flex;align-items:center;gap:var(--space-md);margin-top:calc(var(--space-md) + var(--space-sm));padding-top:var(--space-lg);border-top:1px solid var(--border)}.config-saved-indicator{display:flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);font-size:calc(var(--space-md) + var(--space-xs) * .25);color:var(--color-success)}.config-saved-indicator--error{color:var(--color-error)}.heartbeat-procedure-actions{margin-top:var(--space-sm)}.heartbeat-procedure-viewer{margin-top:var(--space-lg)}.heartbeat-procedure-status{display:inline-flex;align-items:center;gap:var(--space-xs);margin-left:auto}.heartbeat-procedure-status--warning{color:var(--color-warning)}.rating-summary-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:calc(var(--space-md) + var(--space-sm));display:flex;flex-direction:column;gap:var(--space-md)}.rating-score-display{display:flex;align-items:center;gap:var(--space-md)}.rating-average{font-size:var(--space-2xl);font-weight:700;line-height:1}.rating-stats{display:flex;align-items:center;gap:var(--space-md)}.rating-count{font-size:calc(var(--space-md) + var(--space-xs) * .5);color:var(--text-muted)}.rating-trend-badge{font-size:var(--space-md);padding:var(--space-xs) calc(var(--space-md) - var(--space-xs) * .5);border-radius:var(--radius-lg);font-weight:500}.trend-improving{background:color-mix(in srgb,var(--color-success) 15%,transparent);color:var(--color-success)}.trend-declining{background:color-mix(in srgb,var(--color-error) 15%,transparent);color:var(--color-error)}.trend-stable{background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning)}.trend-insufficient{background:var(--bg-tertiary);color:var(--text-muted)}.category-breakdown{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg)}.category-breakdown h4{margin:0 0 var(--space-md) 0;font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:600}.category-breakdown .category-item{display:flex;justify-content:space-between;align-items:center;padding:var(--space-sm) 0;border-bottom:1px solid var(--border)}.category-breakdown .category-item:last-child{border-bottom:none}.category-name{text-transform:capitalize;font-size:calc(var(--space-md) + var(--space-xs) * .25)}.category-score{font-weight:600;font-size:calc(var(--space-md) + var(--space-xs) * .25)}.add-rating-form{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-md)}.add-rating-form h4{margin:0;font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:600}.star-selector{display:flex;gap:var(--space-xs)}.star-btn{background:none;border:none;padding:var(--space-xs);cursor:pointer;border-radius:var(--radius-sm);color:var(--text-muted);transition:background-color var(--transition-fast),color var(--transition-fast)}.star-btn:hover{background:var(--card-hover)}.star-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.rating-stars{display:inline-flex;gap:var(--space-xs)}.rating-stars .star-filled{color:var(--color-warning)}.rating-stars .star-empty{color:var(--text-muted)}.add-rating-form .add-rating-category-select,.add-rating-form .add-rating-comment-input{width:100%}.add-rating-form .add-rating-comment-input{resize:vertical;min-height:calc(var(--space-xl) + var(--space-2xl))}.rating-history{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg);max-height:calc(var(--space-xl) * 12 + var(--space-md));overflow-y:auto}.rating-history h4{margin:0 0 var(--space-md) 0;font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:600}.rating-history .no-ratings{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);text-align:center;padding:var(--space-lg)}.rating-history-item{padding:var(--space-md) 0;border-bottom:1px solid var(--border)}.rating-history-item:last-child{border-bottom:none}.rating-item-header{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap}.rating-category-badge{font-size:calc(var(--space-sm) + var(--space-xs) * .5);padding:calc(var(--space-xs) * .5) var(--space-sm);background:var(--card-hover);border-radius:var(--radius-pill);text-transform:capitalize}.rating-time{font-size:calc(var(--space-sm) + var(--space-xs) * .5);color:var(--text-muted);margin-left:auto}.rating-delete-btn{background:none;border:none;padding:var(--space-xs);cursor:pointer;color:var(--text-muted);border-radius:var(--radius-sm);transition:color var(--transition-fast),background-color var(--transition-fast)}.rating-delete-btn:hover{color:var(--color-error);background:color-mix(in srgb,var(--color-error) 10%,transparent)}.rating-comment{margin:var(--space-sm) 0 0 0;font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted);line-height:1.4}.runs-loading-row{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-xl)}.runs-toolbar{padding:var(--space-sm) var(--space-lg);border-bottom:1px solid var(--border)}.runs-toolbar--between{display:flex;justify-content:space-between;align-items:center}.runs-toolbar-meta{font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}.run-card--clickable{cursor:pointer}.run-card--clickable:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.run-header-group{display:flex;align-items:center;gap:var(--space-sm)}.run-badge--compact{font-size:calc(var(--space-sm) + var(--space-xs) * .5);padding:calc(var(--space-xs) * .25) calc(var(--space-sm) * .75)}.run-output-summary{cursor:pointer;user-select:none}.run-live-indicator--with-margin{margin-left:var(--space-sm)}.detail-section-body--loading{display:flex;align-items:center;gap:var(--space-sm)}.agent-empty--padded{padding:var(--space-xl)}.logs-fallback-label{font-size:calc(var(--space-sm) + var(--space-xs))}.config-textarea-mono{font-family:var(--font-mono);font-size:calc(var(--space-md) + var(--space-xs) * .25);resize:vertical}.config-textarea-top-spacing{margin-top:var(--space-sm)}.config-hint--block-spacing{margin-bottom:var(--space-md)}.config-hint--block{display:block;margin-bottom:var(--space-sm)}.config-hint--top-spacing{margin-top:var(--space-sm)}.config-hint--inline-loader{display:inline-flex;gap:var(--space-xs);margin-top:var(--space-sm)}.config-inline-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-sm)}.config-hint--inline-tight{display:flex;align-items:center;gap:var(--space-xs)}.config-hint--warning{color:var(--color-warning)}.agent-heartbeat-auto-claim-card{background:color-mix(in srgb,var(--surface) 60%,transparent);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md)}.agent-heartbeat-preset-row{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);margin-bottom:var(--space-sm)}.agent-heartbeat-preset-label{display:block;color:var(--text);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;margin-bottom:calc(var(--space-xs) * .5)}.agent-heartbeat-preset-btn{min-height:calc(var(--space-xl) + var(--space-md));flex-shrink:0}@media(max-width:768px){.agent-heartbeat-preset-row{flex-direction:column;align-items:stretch}.agent-heartbeat-preset-btn{width:100%;min-height:calc(var(--space-xl) + var(--space-md))}.config-runtime-tabs{grid-template-columns:1fr}.config-runtime-tab{min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-avatar-editor-actions{flex-direction:column;align-items:stretch}.agent-avatar-editor-actions .agent-avatar-editor-action{width:100%;justify-content:center}.skill-multiselect,.skill-multiselect-filter,.skill-multiselect-list,.skill-multiselect-chips{width:100%}.skill-chip{max-width:100%}@media(max-width:767.98px){.agent-detail-modal{min-width:0!important;min-height:0!important;width:100vw!important;height:100dvh!important;max-width:100vw!important;max-height:100dvh;margin:0;border-radius:0;border:none;resize:none}}.agent-detail-header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;column-gap:var(--space-sm);row-gap:var(--space-sm);padding:var(--space-md);padding-top:max(var(--space-md),env(safe-area-inset-top,0))}.agent-detail-identity{grid-column:1;grid-row:1;flex:1 1 auto;min-width:0;gap:var(--space-md)}.agent-detail-icon{width:calc(var(--space-lg) * 2);height:calc(var(--space-lg) * 2);flex-shrink:0}.agent-detail-icon svg{width:calc(var(--space-sm) + var(--space-xs) * 2);height:calc(var(--space-sm) + var(--space-xs) * 2)}.agent-detail-info h2{font-size:calc(var(--space-md) + var(--space-xs) * .75);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-detail-badges{flex-wrap:wrap;row-gap:var(--space-xs);column-gap:var(--space-sm);margin-top:var(--space-xs)}.agent-detail-header-actions{grid-column:2;grid-row:1;flex:0 0 auto;justify-content:flex-end;gap:calc(var(--space-xs) * .5)}.agent-detail-controls{flex:0 0 auto;gap:calc(var(--space-xs) * .5)}.agent-detail-controls .btn--compact{padding:calc(var(--space-sm) - var(--space-xs) * .5) calc(var(--space-md) - var(--space-xs) * .5);font-size:var(--space-md);min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-controls .agent-detail-mobile-icon-control{min-width:calc(var(--space-lg) + var(--space-md) + var(--space-xs));padding-left:calc(var(--space-sm) - var(--space-xs) * .5);padding-right:calc(var(--space-sm) - var(--space-xs) * .5)}.agent-detail-controls .agent-detail-mobile-icon-control .agent-detail-control-label{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.agent-detail-controls .btn--compact svg{width:calc(var(--space-md) + var(--space-xs) * .5);height:calc(var(--space-md) + var(--space-xs) * .5)}.agent-detail-utility-actions{flex-shrink:0;margin-left:0}.agent-detail-bulk-menu-popover{right:0}.agent-detail-utility-actions .btn-icon{min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs));min-width:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-import-btn{min-width:calc(var(--space-xl) * 3 + var(--space-xs))}.agent-detail-title{flex:1 1 auto;min-width:0;gap:var(--space-md)}.agent-detail-actions{flex:1 1 100%;flex-wrap:wrap;gap:calc(var(--space-xs) + var(--space-sm) * .25)}.agent-detail-actions .btn{padding:calc(var(--space-sm) - var(--space-xs) * .5) calc(var(--space-md) - var(--space-xs) * .5);font-size:calc(var(--space-md) + var(--space-xs) * .25);min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-actions .btn svg{width:calc(var(--space-sm) + var(--space-xs) * 1.5);height:calc(var(--space-sm) + var(--space-xs) * 1.5)}.agent-detail-actions .btn-icon{min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs));min-width:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-tabs{padding:0;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.agent-detail-tabs::-webkit-scrollbar{display:none}.agent-detail-tab{padding:var(--space-md) calc(var(--space-md) + var(--space-xs) * .5);font-size:.875rem;touch-action:pan-x pan-y;white-space:nowrap;min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-content{padding:var(--space-lg);-webkit-overflow-scrolling:touch;overscroll-behavior:contain}.agent-detail-footer{flex-wrap:wrap;gap:var(--space-sm);padding:var(--space-sm) var(--space-lg);padding-bottom:max(var(--space-sm),env(safe-area-inset-bottom,0));font-size:calc(var(--space-sm) + var(--space-xs) * .75)}.agent-detail-id{max-width:140px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-tab{gap:var(--space-lg)}.dashboard-summary-hero__heading{flex-wrap:wrap;row-gap:var(--space-sm);column-gap:var(--space-md)}.dashboard-summary-hero__meta{align-items:flex-start;row-gap:var(--space-lg);column-gap:var(--space-md)}.dashboard-summary-hero__health{overflow-wrap:anywhere}.dashboard-summary-skills{flex-direction:column;align-items:flex-start;row-gap:var(--space-sm)}.dashboard-summary-skill-detail-header{flex-direction:column;align-items:flex-start}.dashboard-section{padding:var(--space-lg)}.info-grid{grid-template-columns:repeat(2,1fr);gap:var(--space-md)}.stats-grid{grid-template-columns:repeat(3,1fr);gap:var(--space-md)}.stat-value{font-size:calc(var(--space-lg) + var(--space-xs) * .5)}.logs-empty{padding:var(--space-2xl) var(--space-lg)}.agent-mail-tab-header{flex-direction:column;align-items:flex-start}.agent-mail-tab .mailbox-agent-subtabs{width:100%}.agent-mail-tab .mailbox-agent-subtab{flex:1}.agent-mail-tab .agent-mail-tab-detail{width:100%;padding:var(--space-md)}.agent-mail-tab .agent-mail-tab-back{min-height:calc(var(--space-lg) * 2 + var(--space-xs))}.run-card{padding:var(--space-md)}.run-header{flex-wrap:wrap;gap:calc(var(--space-xs) + var(--space-sm) * .25)}.run-details{flex-wrap:wrap}.run-logs-container{padding:var(--space-sm)}.run-output-panel{max-height:calc(var(--space-2xl) * 5)}.run-context-grid{flex-direction:column;gap:var(--space-xs)}.run-details .text-muted{min-width:0;overflow-wrap:anywhere}.config-tab{gap:var(--space-lg)}.config-section{padding:var(--space-lg)}.config-section .input,.config-section .select,.config-section textarea{font-size:calc(var(--space-md) + var(--space-xs));min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.config-actions{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.config-actions .btn{width:100%;justify-content:center}.heartbeat-procedure-status{margin-left:0}}@media(max-width:480px){.dashboard-summary-card{padding:var(--space-md)}.dashboard-summary-hero__heading{row-gap:var(--space-md)}.dashboard-summary-hero__meta{row-gap:var(--space-lg);column-gap:var(--space-sm)}.info-grid,.stats-grid{grid-template-columns:1fr}.agent-detail-actions{flex-direction:column;width:100%}.agent-detail-actions .btn{width:100%;justify-content:center}.agent-detail-actions .btn-icon{align-self:flex-end}.config-actions,.agent-avatar-editor-actions{width:100%}.config-runtime-tabs,.skill-multiselect{gap:var(--space-xs)}.agent-detail-footer .divider,.agent-detail-footer .text-muted,.agent-detail-footer .link{display:none}}@media(max-width:768px){.agent-avatar-editor{flex-direction:column;align-items:flex-start}.agent-avatar-editor-actions{width:100%}.agent-avatar-editor-actions .btn{min-height:calc(var(--space-lg) * 2 + var(--space-xs))}.agent-dialog-overlay{padding:0;align-items:stretch}.agent-dialog{width:100vw!important;height:100dvh;max-width:100%!important;max-height:100dvh;border-radius:0;border:none}.agent-dialog-header{padding:max(var(--space-md),env(safe-area-inset-top,0px)) var(--space-lg) var(--space-md) var(--space-lg);flex-shrink:0}.agent-dialog-body{padding:var(--space-lg);-webkit-overflow-scrolling:touch}.agent-dialog-footer{padding:var(--space-md) var(--space-lg);padding-bottom:max(var(--space-md),env(safe-area-inset-bottom,0px));flex-wrap:wrap;gap:var(--space-sm)}.agent-dialog-field .input,.agent-dialog-field .select,.agent-dialog-field textarea{font-size:calc(var(--space-md) + var(--space-xs));min-height:calc(var(--space-lg) * 2 + var(--space-xs))}.agent-dialog-summary-row{flex-direction:column;gap:calc(var(--space-xs) * .5)}.agent-dialog-summary-row>span:first-child,.agent-dialog-summary-row-label{width:auto}.agent-dialog-steps{padding:var(--space-sm) var(--space-lg)}.agent-dialog-step{flex:1;width:auto;height:calc(var(--space-xs) - var(--space-xs) * .25)}.agent-dialog-tabs{grid-template-columns:1fr;gap:calc(var(--space-sm) - var(--space-xs) * .5);margin-bottom:var(--space-md)}.agent-dialog-tab{min-height:calc(var(--space-lg) * 2 + var(--space-xs));text-align:left}.agent-import-file-upload{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.agent-import-textarea{font-size:calc(var(--space-md) + var(--space-xs));min-height:calc(var(--space-xl) * 4 + var(--space-xs))}.agent-import-agent-list{max-height:calc(100dvh - (var(--space-xl) * 10 + var(--space-lg)))}.agent-import-result-stats{flex-direction:column;gap:var(--space-sm);align-items:center}.agent-import-browse-list{max-height:calc(100dvh - (var(--space-xl) * 10 + var(--space-lg)))}.agent-import-skill-list{max-height:calc(100dvh - (var(--space-xl) * 15 + var(--space-md)))}}@media(max-width:480px){.agent-dialog-body{padding:var(--space-md)}.agent-dialog-footer{flex-direction:column}.agent-dialog-footer .btn{width:100%;justify-content:center}}.agent-permission-inherit-banner{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);margin-bottom:var(--space-sm)}.agent-capability-grants{display:flex;flex-direction:column;gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-capability-grants h4{margin:0;color:var(--text-primary);font-size:var(--font-size-md)}.agent-capability-grants-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,var(--size-card-min, 16rem)),1fr));gap:var(--space-sm)}.agent-capability-grant-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.agent-capability-grant-name{display:block;color:var(--text-primary);font-weight:600}@media(max-width:768px){.agent-capability-grants-grid{grid-template-columns:1fr}.agent-capability-grant-row,.agent-permission-inherit-banner{align-items:flex-start;flex-direction:column}}.agent-memory-file-editor{border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden;display:flex;flex-direction:column;min-height:320px;max-height:55vh}.agent-memory-file-editor .cm-editor{height:100%;min-height:0}.agent-memory-file-editor .cm-scroller{overflow:auto}.memory-consolidation-history{margin-block:var(--space-md);padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.memory-consolidation-history__heading,.memory-consolidation-history__row{display:flex;align-items:center;gap:var(--space-sm);justify-content:space-between}.memory-consolidation-history__heading h4{margin:0;color:var(--text-primary)}.memory-consolidation-history__list{display:grid;gap:var(--space-sm);margin:var(--space-sm) 0 0;padding:0;list-style:none}.memory-consolidation-history__row{flex-wrap:wrap;padding:var(--space-sm);border-radius:var(--radius-sm);background:var(--surface-muted);color:var(--text-muted)}.memory-consolidation-history__row--completed strong{color:var(--color-success)}.memory-consolidation-history__row--skipped strong{color:var(--color-warning)}.memory-consolidation-history__row--failed strong{color:var(--color-error)}.dashboard-summary-skill-badge[data-skill-state=disabled]{border-color:var(--color-warning)}.dashboard-summary-skill-badge[data-skill-state=unknown]{border-color:var(--color-error)}.reflections-tab{padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-lg)}.reflections-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md)}.reflections-header h3{display:flex;align-items:center;gap:var(--space-sm);font-size:1rem;font-weight:600;color:var(--text)}.reflections-stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:var(--space-md)}.reflections-stat-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);text-align:center}.reflections-stat-card .stat-value{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);font-size:1.5rem;font-weight:700;color:var(--text);margin-bottom:var(--space-xs)}.reflections-stat-card .stat-label{font-size:.75rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em}.reflections-no-data{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-xl);color:var(--text-muted);text-align:center}.reflections-list{display:flex;flex-direction:column;gap:var(--space-md)}.reflections-loading-indicator{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-lg)}.reflections-ratings-section{display:flex;flex-direction:column;gap:var(--space-md)}.reflections-ratings-section>h4,.reflections-list h4{font-size:.875rem;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.reflection-cards{display:flex;flex-direction:column;gap:var(--space-sm)}.reflection-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);cursor:pointer;transition:border-color .15s,background-color .15s}.reflection-card:hover{border-color:var(--border);background:var(--card-hover)}.reflection-card:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.reflection-card--expanded{border-color:var(--accent)}.reflection-card-header{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-sm)}.reflection-trigger-badge{font-size:.7rem;font-weight:600;padding:2px 6px;border-radius:var(--radius-sm);text-transform:uppercase;letter-spacing:.05em}.reflection-trigger-periodic{background:color-mix(in srgb,var(--color-info) 15%,transparent);color:var(--color-info)}.reflection-trigger-post-task{background:color-mix(in srgb,var(--color-success) 15%,transparent);color:var(--color-success)}.reflection-trigger-manual{background:color-mix(in srgb,var(--accent) 15%,transparent);color:var(--accent)}.reflection-trigger-user-requested{background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning)}.reflection-timestamp{font-size:.75rem;color:var(--text-muted);flex:1}.reflection-chevron{color:var(--text-muted)}.reflection-summary{font-size:.875rem;color:var(--text);line-height:1.5}.reflection-details{margin-top:var(--space-md);padding-top:var(--space-md);border-top:1px solid var(--border);display:flex;flex-direction:column;gap:var(--space-md)}.reflection-insights h5,.reflection-suggestions h5{display:flex;align-items:center;gap:var(--space-xs);font-size:.8rem;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.reflection-insights ul,.reflection-suggestions ul{list-style:none;display:flex;flex-direction:column;gap:var(--space-xs)}.reflection-insights li,.reflection-suggestions li{font-size:.8rem;color:var(--text-muted);padding-left:var(--space-md);position:relative}.reflection-insights li:before{content:"•";position:absolute;left:4px;color:var(--color-success)}.reflection-suggestions li:before{content:"→";position:absolute;left:0;color:var(--accent)}.reflection-metrics{background:var(--bg);border-radius:var(--radius-sm);padding:var(--space-sm)}.reflection-metrics h5{font-size:.75rem;font-weight:600;color:var(--text-muted);margin-bottom:var(--space-xs)}.metrics-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:var(--space-sm)}.metric{display:flex;flex-direction:column;gap:2px}.metric-label{font-size:.7rem;color:var(--text-muted)}.metric-value{font-size:.875rem;font-weight:600;color:var(--text)}.reflection-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-2xl);color:var(--text-muted);text-align:center}.reflection-empty p{font-size:.875rem}@media(max-width:768px){.reflections-header{flex-wrap:wrap;align-items:flex-start}.reflections-header .btn{width:100%;justify-content:center}}.budget-progress-container{margin-top:var(--space-xs)}.budget-progress-bar{width:100%;height:var(--space-sm);background:var(--surface);border-radius:var(--radius-sm);overflow:hidden;margin-top:var(--space-xs)}.budget-progress-bar__fill{height:100%;border-radius:var(--radius-sm);transition:width var(--transition-slow),background-color var(--transition-slow)}.budget-progress-bar__fill--green{background:var(--color-success)}.budget-progress-bar__fill--amber{background:var(--color-warning)}.budget-progress-bar__fill--red{background:var(--color-error)}.budget-progress-label{font-size:.75rem;color:var(--text-muted);margin-top:var(--space-xs);display:block}.budget-badge{display:inline-flex;align-items:center;gap:var(--space-xs);padding:calc(var(--space-xs) / 2) var(--space-sm);border-radius:var(--radius-pill);font-size:.75rem;font-weight:500}.budget-warning-banner{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm);background:var(--state-error-bg, color-mix(in srgb, var(--color-error) 15%, transparent));color:var(--state-error-text);border:1px solid var(--state-error-border);font-size:.875rem;margin-bottom:var(--space-md)}.btn-reset-budget{margin-top:var(--space-sm)}
|