@runfusion/fusion 0.78.0-beta.3 → 0.78.0-beta.4
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 +4076 -4950
- package/dist/child-process-worker.js +3064 -3550
- package/dist/client/.vite/manifest.json +259 -259
- package/dist/client/assets/{AgentDetailView-DAtUBPar.js → AgentDetailView-BVDrAj1Y.js} +3 -3
- package/dist/client/assets/AgentDetailView-DaSEdzYy.css +1 -0
- package/dist/client/assets/{AgentPermissionPolicyEditor-Cth5Qyvz.js → AgentPermissionPolicyEditor--11QLSt_.js} +1 -1
- package/dist/client/assets/{AgentsView-D6odi29-.js → AgentsView-D3mLjE0-.js} +4 -4
- package/dist/client/assets/{CommandCenter-DUlZFMvJ.js → CommandCenter-CPy2a26y.js} +1 -1
- package/dist/client/assets/{DevServerView-GD1-vwId.js → DevServerView-CWHhisoR.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-De3Q7_zu.js → DirectoryPicker-DMd9MEtq.js} +1 -1
- package/dist/client/assets/DocumentsView-YeYy6DJV.js +1 -0
- package/dist/client/assets/{EvalsView-CYfclysr.js → EvalsView-DfvYGoX4.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-B1dQuReY.js → ExperimentalAgentOnboardingModal-CFjRfBUk.js} +1 -1
- package/dist/client/assets/{GoalsView-BHxjegdt.js → GoalsView-DdlI85_-.js} +1 -1
- package/dist/client/assets/InsightsView-Du2UKeQE.js +11 -0
- package/dist/client/assets/{MemoryView-O8vfqipX.js → MemoryView-DeSuPKc7.js} +1 -1
- package/dist/client/assets/{PatchnodeView-WM5ZlnTS.js → PatchnodeView-Ow5ErHE3.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-BrTit_vk.js → PiExtensionsManager-D65p_Z4a.js} +1 -1
- package/dist/client/assets/{PluginManager-DBUm9Q30.js → PluginManager-BruzVBGM.js} +1 -1
- package/dist/client/assets/{PullRequestView-DW9EqNT3.js → PullRequestView-BTzsKxrq.js} +1 -1
- package/dist/client/assets/{ReportModal-Cv7Lxy1u.js → ReportModal-YpkrGp21.js} +2 -2
- package/dist/client/assets/ResearchView-D0oWTBMk.js +2 -0
- package/dist/client/assets/{SecretsView-C2K-n5_X.js → SecretsView-B6ZH6O1O.js} +1 -1
- package/dist/client/assets/{SettingsModal-Crpg0GmF.js → SettingsModal-CN4NVtbD.js} +1 -1
- package/dist/client/assets/SettingsModal-CmPRFol7.css +1 -0
- package/dist/client/assets/SettingsModal-CwUcFHcw.js +21 -0
- package/dist/client/assets/{SettingsTextareaRow-B7FIDTtF.js → SettingsTextareaRow-B_iNwevV.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-CBWFrde9.js → SetupWizardModal-BSAtv8xH.js} +2 -2
- package/dist/client/assets/{SkillsView-B1l4qkYj.js → SkillsView-DhhiUAPO.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-e122mQ0Z.js → WorkflowNodeEditor-YeZ_DH3a.js} +1 -1
- package/dist/client/assets/{agent-import-generation-CX_NVRPC.js → agent-import-generation-BPFU14s8.js} +1 -1
- package/dist/client/assets/{agentsOrgChartLayout-BAhAecHd.js → agentsOrgChartLayout-CWqQ9XMW.js} +1 -1
- package/dist/client/assets/app-BVuhE-pB.js +3 -0
- package/dist/client/assets/app-BVz53oEh.js +9 -0
- package/dist/client/assets/app-BfzM5z-d.js +9 -0
- package/dist/client/assets/app-BgtLSw3s.js +9 -0
- package/dist/client/assets/app-BpjF_vWi.js +9 -0
- package/dist/client/assets/app-Cjqb3Hrq.js +3 -0
- package/dist/client/assets/app-CoyPSunU.js +9 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-BOmFDW7M.js → architectureDiagram-3BPJPVTR-DX2xxWsB.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-D7CnZ9-e.js → blockDiagram-GPEHLZMM-tVB-pLpH.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-CQZw8PeP.js → c4Diagram-AAUBKEIU-BEV-l4nl.js} +1 -1
- package/dist/client/assets/channel-BoqUD_yo.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-DBS2o2AZ.js → chunk-2J33WTMH-DduonyQt.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-CFKEnTmJ.js → chunk-4BX2VUAB-BPCXybBl.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-DpjYRScs.js → chunk-55IACEB6-ByqbaUCB.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-Db7lQvPG.js → chunk-727SXJPM-DdtczHe_.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-rSGEvDdj.js → chunk-AQP2D5EJ-V5pHkNOZ.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-Cdi9zNME.js → chunk-FMBD7UC4-i0P_U91V.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-D_3BQZ27.js → chunk-ND2GUHAM-BWdXSws9.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-DnVoTnz9.js → chunk-QZHKN3VN-C7vpw2O4.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-5Yk5cF5o.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-5Yk5cF5o.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-HQFw9frh.js → cose-bilkent-S5V4N54A-C_OJmqvv.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-BdHp0sc2.js → dagre-BM42HDAG-DlxhXtcR.js} +1 -1
- package/dist/client/assets/{dashboard-view-C3vvo4zP.js → dashboard-view-C_aj9Avl.js} +2 -2
- package/dist/client/assets/{dashboard-view-mWhkEiwE.js → dashboard-view-CtFwciFc.js} +1 -1
- package/dist/client/assets/dashboard-view-Cy2aXOHq.js +1 -0
- package/dist/client/assets/{dashboard-view-DaqL1Ufr.js → dashboard-view-ZNgeI6tK.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-BDu9AETT.js → diagram-2AECGRRQ-B5OQ5SjT.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-2qzqfWTz.js → diagram-5GNKFQAL-OnHyeSDX.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-DYa-tplS.js → diagram-KO2AKTUF-BESRlk6K.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-ChwcQccK.js → diagram-LMA3HP47-jc5KVOgo.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-DoGKft5E.js → diagram-OG6HWLK6-CbvV1B1C.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-5dsSgUXk.js → erDiagram-TEJ5UH35-CU4gukmG.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-BOHB4RzL.js → flowDiagram-I6XJVG4X-Dq9UKge4.js} +1 -1
- package/dist/client/assets/{folder-open-BQcY8jvq.js → folder-open-CF9O-sX4.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-BD3aivUG.js → ganttDiagram-6RSMTGT7-BWA_00UM.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-HBZEAECF.js → gitGraphDiagram-PVQCEYII-DKdPzNtQ.js} +1 -1
- package/dist/client/assets/index-CiVIbypZ.js +2949 -0
- package/dist/client/assets/index-Duxgoh_Y.css +1 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-d7hsqM0V.js → infoDiagram-5YYISTIA-BvusFnLt.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-k4Dnhc_y.js → ishikawaDiagram-YF4QCWOH-NLucC59B.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-Dh3yqZPQ.js → journeyDiagram-JHISSGLW-OMF0ZqP2.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-BYqpe7Ju.js → kanban-definition-UN3LZRKU-DcIw1Gei.js} +1 -1
- package/dist/client/assets/{mermaid.core-D5Ccw5tQ.js → mermaid.core-BXdGnca4.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-D64P3Mc4.js → mindmap-definition-RKZ34NQL-CJdZ2giE.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-CtMfKnlZ.js → pieDiagram-4H26LBE5-CIS3IXyQ.js} +1 -1
- package/dist/client/assets/{puzzle-D4y4g-nb.js → puzzle-DLP4jrVO.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-B5gSMr9M.js → quadrantDiagram-W4KKPZXB-CyXg_FqY.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-DKtBfWDi.js → requirementDiagram-4Y6WPE33-Cl5zZfEW.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BcWeBcNk.js → sankeyDiagram-5OEKKPKP-RPvS_KDe.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-Crp7Mc0M.js → sequenceDiagram-3UESZ5HK-mqxbDVma.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-lD5Vcanq.js → standing-instructions-template-oByMjuf9.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-CA5FEPYe.js → stateDiagram-AJRCARHV-BMThgwA0.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Bo75sO6t.js → stateDiagram-v2-BHNVJYJU-BQQVmi0s.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-Dmr4NeTD.js → timeline-definition-PNZ67QCA-DxRT4zz3.js} +1 -1
- package/dist/client/assets/{upload-CzJ1o8Px.js → upload-C1hBXwxT.js} +1 -1
- package/dist/client/assets/{users-BMnytPKO.js → users-CUTsjdYo.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-DfbBSNgT.js → vennDiagram-CIIHVFJN-CplrXnmO.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-Wxq1L5VU.js → wardley-L42UT6IY-DN3nUl9Y.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-D6HnIS8j.js → wardleyDiagram-YWT4CUSO-C0hUcS3e.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-5MfFlu30.js → xychartDiagram-2RQKCTM6-CDB05pHe.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 +3278 -3998
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +104 -125
- package/dist/plugin-sdk/index.js +35 -93
- package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-linear-import/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
- package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-quality/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-quality/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-todos/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-todos/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +35 -93
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/skill/fusion/SKILL.md +1 -1
- package/skill/fusion/references/best-practices.md +2 -2
- package/skill/fusion/references/cli-commands.md +0 -2
- package/skill/fusion/references/engine-tools.md +2 -2
- package/skill/fusion/references/extension-tools.md +1 -18
- package/skill/fusion/references/fusion-capabilities.md +1 -4
- package/skill/fusion/references/task-structure.md +1 -1
- package/skill/fusion/workflows/task-lifecycle.md +5 -9
- package/skill/fusion/workflows/task-management.md +1 -3
- package/dist/client/assets/AgentDetailView-DPoh46Ym.css +0 -1
- package/dist/client/assets/DocumentsView-BMYBV8DV.js +0 -1
- package/dist/client/assets/InsightsView-DK0EP68R.js +0 -11
- package/dist/client/assets/ResearchView-DDGbBXlh.js +0 -2
- package/dist/client/assets/SettingsModal-C7npF9nB.js +0 -21
- package/dist/client/assets/SettingsModal-Crai1dEI.css +0 -1
- package/dist/client/assets/app-BO1iuWOt.js +0 -13
- package/dist/client/assets/app-BRFfR55q.js +0 -5
- package/dist/client/assets/app-BW03hpJV.js +0 -13
- package/dist/client/assets/app-B_skBURN.js +0 -13
- package/dist/client/assets/app-C0JL4IcI.js +0 -13
- package/dist/client/assets/app-C5uZ_9kI.js +0 -13
- package/dist/client/assets/app-DxFiSzSJ.js +0 -5
- package/dist/client/assets/channel-Drj7VQBu.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-DGxwjUYU.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DGxwjUYU.js +0 -1
- package/dist/client/assets/dashboard-view-CoxDPI4m.js +0 -1
- package/dist/client/assets/index-26HUNwwJ.css +0 -1
- package/dist/client/assets/index-QU8sENvc.js +0 -2959
|
@@ -160104,6 +160104,11 @@ var DEFAULT_GLOBAL_SETTINGS = {
|
|
|
160104
160104
|
*/
|
|
160105
160105
|
quickAddSubmitOnEnter: true,
|
|
160106
160106
|
/*
|
|
160107
|
+
FNXC:ChatComposer 2026-09-06-01:54:
|
|
160108
|
+
Le comportement automatique des trois composeurs insère une nouvelle ligne pour un pointeur tactile primaire et conserve l’envoi par Entrée avec une souris, y compris dans une fenêtre étroite. Cette préférence d’opérateur reste globale et ne s’applique qu’à Entrée sans Cmd/Ctrl ni Shift, après l’autocomplétion, Shift et la garde IME propre au Chat de tâche.
|
|
160109
|
+
*/
|
|
160110
|
+
chatSubmitOnEnter: "auto",
|
|
160111
|
+
/*
|
|
160107
160112
|
FNXC:ChatSnippets 2026-09-03-15:56:
|
|
160108
160113
|
Keep the optional global key present but undefined so scope-key derivation remains complete without sharing a mutable default array. readChatSnippets supplies a fresh effective empty list.
|
|
160109
160114
|
*/
|
|
@@ -160695,15 +160700,7 @@ var DEFAULT_PROJECT_SETTINGS = {
|
|
|
160695
160700
|
// maxPostReviewFixes MOVED to workflow settings (U4).
|
|
160696
160701
|
// Run maintenance (including WAL checkpointing) every 5 minutes by default.
|
|
160697
160702
|
maintenanceIntervalMs: 3e5,
|
|
160698
|
-
autoArchiveDoneTasksEnabled: true,
|
|
160699
|
-
autoArchiveDoneAfterMs: 48 * 60 * 60 * 1e3,
|
|
160700
|
-
doneAutoArchiveDays: 0,
|
|
160701
|
-
// FNXC:DuplicateIntake 2026-07-07-00:00 (FN-7658): default OFF — operators
|
|
160702
|
-
// decide via the near-duplicate flag/UI instead of tasks silently vanishing
|
|
160703
|
-
// into `archived` during intake. Set true to restore the pre-FN-7658 behavior.
|
|
160704
|
-
autoArchiveDuplicateTasksEnabled: false,
|
|
160705
160703
|
triageDuplicateResolution: "prompt",
|
|
160706
|
-
archiveAgentLogMode: "compact",
|
|
160707
160704
|
autoUpdatePrStatus: false,
|
|
160708
160705
|
githubCommentOnDone: false,
|
|
160709
160706
|
githubCommentTemplate: void 0,
|
|
@@ -160798,6 +160795,7 @@ var DEFAULT_PROJECT_SETTINGS = {
|
|
|
160798
160795
|
prTitlePromptInstructions: void 0,
|
|
160799
160796
|
prDescriptionPromptInstructions: void 0,
|
|
160800
160797
|
scripts: void 0,
|
|
160798
|
+
scriptMetadata: void 0,
|
|
160801
160799
|
setupScript: void 0,
|
|
160802
160800
|
insightExtractionEnabled: false,
|
|
160803
160801
|
insightExtractionSchedule: "0 2 * * *",
|
|
@@ -161023,8 +161021,6 @@ var AGENT_PERMISSIONS = [
|
|
|
161023
161021
|
// Merge completed task branches
|
|
161024
161022
|
"tasks:delete",
|
|
161025
161023
|
// Delete tasks
|
|
161026
|
-
"tasks:archive",
|
|
161027
|
-
// Archive/unarchive tasks
|
|
161028
161024
|
"agents:create",
|
|
161029
161025
|
// Create new agents
|
|
161030
161026
|
"agents:update",
|
|
@@ -161264,8 +161260,13 @@ function completionSummaryNode(column) {
|
|
|
161264
161260
|
// ../core/src/missions/mission-types.ts
|
|
161265
161261
|
var VALIDATION_INFLIGHT_STALE_MAX_AGE_MS = 6 * 60 * 60 * 1e3;
|
|
161266
161262
|
|
|
161263
|
+
// ../core/src/types.ts
|
|
161264
|
+
var RETIRED_BUILTIN_WORKFLOW_SUCCESSORS = /* @__PURE__ */ new Map([
|
|
161265
|
+
["builtin:coding-ideas", "builtin:coding-ideas-v2"]
|
|
161266
|
+
]);
|
|
161267
|
+
|
|
161267
161268
|
// ../core/src/workflows/trait-types.ts
|
|
161268
|
-
var RESTRICTED_TRAIT_FLAGS = ["complete"
|
|
161269
|
+
var RESTRICTED_TRAIT_FLAGS = ["complete"];
|
|
161269
161270
|
function traitHookKey(traitId, hookKind) {
|
|
161270
161271
|
return `${traitId}::${hookKind}`;
|
|
161271
161272
|
}
|
|
@@ -161465,15 +161466,6 @@ var TraitRegistry = class {
|
|
|
161465
161466
|
message: `Column '${column.id}' is both a completion column and an intake column`
|
|
161466
161467
|
});
|
|
161467
161468
|
}
|
|
161468
|
-
if (flags.archived && flags.countsTowardWip) {
|
|
161469
|
-
violations.push({
|
|
161470
|
-
code: "archived-with-wip",
|
|
161471
|
-
severity: "error",
|
|
161472
|
-
columnId: column.id,
|
|
161473
|
-
traitIds: this.traitIdsWithFlags(knownDefs, ["archived", "countsTowardWip"]),
|
|
161474
|
-
message: `Column '${column.id}' is archived but counts toward WIP \u2014 archived cards must not hold capacity`
|
|
161475
|
-
});
|
|
161476
|
-
}
|
|
161477
161469
|
if (flags.intake) intakeColumnCount += 1;
|
|
161478
161470
|
}
|
|
161479
161471
|
if (intakeColumnCount > 1) {
|
|
@@ -161656,13 +161648,6 @@ var BUILTIN_TRAIT_DEFINITIONS = [
|
|
|
161656
161648
|
builtin: true,
|
|
161657
161649
|
flags: { complete: true }
|
|
161658
161650
|
},
|
|
161659
|
-
{
|
|
161660
|
-
id: "archived",
|
|
161661
|
-
name: "Archived",
|
|
161662
|
-
description: "Hidden from board; global semantics. Restricted flag.",
|
|
161663
|
-
builtin: true,
|
|
161664
|
-
flags: { archived: true, hiddenFromBoard: true }
|
|
161665
|
-
},
|
|
161666
161651
|
{
|
|
161667
161652
|
id: "merge-blocker",
|
|
161668
161653
|
name: "Merge blocker",
|
|
@@ -161956,8 +161941,7 @@ var DEFAULT_WORKFLOW_COLUMN_IDS = [
|
|
|
161956
161941
|
"todo",
|
|
161957
161942
|
"in-progress",
|
|
161958
161943
|
"in-review",
|
|
161959
|
-
"done"
|
|
161960
|
-
"archived"
|
|
161944
|
+
"done"
|
|
161961
161945
|
];
|
|
161962
161946
|
function defaultColumnForNode(node) {
|
|
161963
161947
|
const seam = node.config?.seam;
|
|
@@ -164107,7 +164091,7 @@ Write a lean, executable PROMPT.md quickly. Preserve safety gates, but skip heav
|
|
|
164107
164091
|
- Preserve required safety sections for bugs, workflow routing, forensic tasks, and decision-only work.
|
|
164108
164092
|
|
|
164109
164093
|
## Duplicate check
|
|
164110
|
-
Before writing a spec, call \`fn_task_list\` for active work, then call \`fn_task_search\` with \`includeDone: false\`
|
|
164094
|
+
Before writing a spec, call \`fn_task_list\` for active work, then call \`fn_task_search\` with \`includeDone: false\` for 2-4 targeted keyword phrases from the title/description, such as file paths, symptoms, and symbols. Do not search completed work for duplicate candidates. When an active match is a duplicate, do not write a spec \u2014 but still write PROMPT.md, with its entire contents being the single line \`DUPLICATE: {existing-task-id}\` and nothing else. That file is how the duplicate is recorded; announcing it only in your reply leaves no plan behind and re-plans the task in a loop.
|
|
164111
164095
|
|
|
164112
164096
|
## Required PROMPT.md shape
|
|
164113
164097
|
Write PROMPT.md with Original Description, What This Delivers, Before \u2192 After Transformation, Mission, Dependencies, Context to Read First, File Scope, Steps, Documentation Requirements, Completion Criteria, Git Commit Convention, and Do NOT. Put \`## Original Description\` immediately after the title/\`Created\`/\`Size\` metadata with the operator's original task description copied **verbatim** (do not paraphrase). Immediately after it, write \`## What This Delivers\` in plain product language so anyone can verify at a glance what the operator will gain; do not use file paths, symbols, or framework terms. Put \`## Before \u2192 After Transformation\` next, before \`## Mission\`, with concise Before/After bullets: current state, target state, why it satisfies the user's request at a glance. In \`## Steps\`, every executable heading MUST use \`### Step N: <name>\` (e.g. \`### Step 0: Preflight\`), numbered 0-based from \`### Step 0:\` through \`### Step N-1:\` with no gaps. Do not write bare \`### Preflight\` / \`### Implementation\` headings, and do not add review-level, triage subtask, or proactive subtask headings.
|
|
@@ -164392,8 +164376,8 @@ Verified facts about this codebase's storage \u2014 cite these correctly so Plan
|
|
|
164392
164376
|
- New Postgres migrations must be **registered explicitly** in \`packages/core/src/postgres/schema-applier.ts\` (version constant + bookkeeping check); a \`.sql\` file dropped in the migrations dir that is not wired there silently never runs.
|
|
164393
164377
|
|
|
164394
164378
|
## Duplicate check
|
|
164395
|
-
Before writing a spec, first call \`fn_task_list\` to see active tasks, then call \`fn_task_search\` with \`includeDone: false\`
|
|
164396
|
-
Do not search completed
|
|
164379
|
+
Before writing a spec, first call \`fn_task_list\` to see active tasks, then call \`fn_task_search\` with \`includeDone: false\` for 2-4 distinct keyword phrases from the task title and description (for example file paths, error symptoms, and symbol names).
|
|
164380
|
+
Do not search completed work for duplicate candidates.
|
|
164397
164381
|
If an actionable task already covers the same work (even if worded differently), do not write a spec.
|
|
164398
164382
|
Instead you MUST still write PROMPT.md, with its ENTIRE contents being this one line and nothing else:
|
|
164399
164383
|
\`DUPLICATE: {existing-task-id}\`
|
|
@@ -165549,8 +165533,7 @@ var RAW_BUILTIN_CODING_WORKFLOW_IR = {
|
|
|
165549
165533
|
name: "In review",
|
|
165550
165534
|
traits: [{ trait: "merge-blocker" }, { trait: "human-review" }, { trait: "stall-detection" }, { trait: "merge" }]
|
|
165551
165535
|
},
|
|
165552
|
-
{ id: "done", name: "Done", traits: [{ trait: "complete" }] }
|
|
165553
|
-
{ id: "archived", name: "Archived", traits: [{ trait: "archived" }] }
|
|
165536
|
+
{ id: "done", name: "Done", traits: [{ trait: "complete" }] }
|
|
165554
165537
|
],
|
|
165555
165538
|
nodes: [
|
|
165556
165539
|
{ id: "start", kind: "start", column: "triage" },
|
|
@@ -165755,8 +165738,7 @@ var RAW_BUILTIN_STEPWISE_CODING_WORKFLOW_IR = {
|
|
|
165755
165738
|
name: "In review",
|
|
165756
165739
|
traits: [{ trait: "merge-blocker" }, { trait: "human-review" }, { trait: "stall-detection" }, { trait: "merge" }]
|
|
165757
165740
|
},
|
|
165758
|
-
{ id: "done", name: "Done", traits: [{ trait: "complete" }] }
|
|
165759
|
-
{ id: "archived", name: "Archived", traits: [{ trait: "archived" }] }
|
|
165741
|
+
{ id: "done", name: "Done", traits: [{ trait: "complete" }] }
|
|
165760
165742
|
],
|
|
165761
165743
|
// KTD-12: PROMPT.md is the planning-produced step-source artifact this workflow
|
|
165762
165744
|
// parses into task steps.
|
|
@@ -166107,8 +166089,7 @@ var CODING_IDEAS_COLUMNS = [
|
|
|
166107
166089
|
name: "In review",
|
|
166108
166090
|
traits: [{ trait: "merge-blocker" }, { trait: "human-review" }, { trait: "stall-detection" }, { trait: "merge" }]
|
|
166109
166091
|
},
|
|
166110
|
-
{ id: "done", name: "Done", traits: [{ trait: "complete" }] }
|
|
166111
|
-
{ id: "archived", name: "Archived", traits: [{ trait: "archived" }] }
|
|
166092
|
+
{ id: "done", name: "Done", traits: [{ trait: "complete" }] }
|
|
166112
166093
|
];
|
|
166113
166094
|
var RAW_BUILTIN_CODING_IDEAS_WORKFLOW_IR = (() => {
|
|
166114
166095
|
const ir = JSON.parse(JSON.stringify(BUILTIN_STEPWISE_FINAL_REVIEW_CODING_WORKFLOW_IR));
|
|
@@ -166383,8 +166364,7 @@ var RAW_BUILTIN_LEAD_GENERATION_WORKFLOW_IR = {
|
|
|
166383
166364
|
{ trait: "stall-detection", config: { timeoutMs: 864e5, action: "notify" } }
|
|
166384
166365
|
]
|
|
166385
166366
|
},
|
|
166386
|
-
{ id: "converted", name: "Converted", traits: [{ trait: "complete" }] }
|
|
166387
|
-
{ id: "archived", name: "Archived", traits: [{ trait: "archived" }] }
|
|
166367
|
+
{ id: "converted", name: "Converted", traits: [{ trait: "complete" }] }
|
|
166388
166368
|
],
|
|
166389
166369
|
fields: [
|
|
166390
166370
|
{ id: "company", name: "Company", type: "string", render: { placement: "card", widget: "input" } },
|
|
@@ -166514,8 +166494,7 @@ var RAW_BUILTIN_MARKETING_WORKFLOW_IR = {
|
|
|
166514
166494
|
name: "Editorial review",
|
|
166515
166495
|
traits: [{ trait: "merge-blocker" }, { trait: "human-review" }, { trait: "stall-detection" }, { trait: "merge" }]
|
|
166516
166496
|
},
|
|
166517
|
-
{ id: "published", name: "Published", traits: [{ trait: "complete" }] }
|
|
166518
|
-
{ id: "archived", name: "Archived", traits: [{ trait: "archived" }] }
|
|
166497
|
+
{ id: "published", name: "Published", traits: [{ trait: "complete" }] }
|
|
166519
166498
|
],
|
|
166520
166499
|
nodes: [
|
|
166521
166500
|
{ id: "start", kind: "start", column: "ideation" },
|
|
@@ -166618,8 +166597,7 @@ var RAW_BUILTIN_PR_WORKFLOW_IR = {
|
|
|
166618
166597
|
// move (no PR knowledge in the substrate).
|
|
166619
166598
|
traits: [{ trait: "merge-blocker" }, { trait: "stall-detection" }]
|
|
166620
166599
|
},
|
|
166621
|
-
{ id: "done", name: "Done", traits: [{ trait: "complete" }] }
|
|
166622
|
-
{ id: "archived", name: "Archived", traits: [{ trait: "archived" }] }
|
|
166600
|
+
{ id: "done", name: "Done", traits: [{ trait: "complete" }] }
|
|
166623
166601
|
],
|
|
166624
166602
|
nodes: [
|
|
166625
166603
|
{ id: "start", kind: "start", column: "triage" },
|
|
@@ -166722,6 +166700,9 @@ var BUILTIN_WORKFLOW_ID_PREFIX = "builtin:";
|
|
|
166722
166700
|
function isBuiltinWorkflowId(id) {
|
|
166723
166701
|
return id.startsWith(BUILTIN_WORKFLOW_ID_PREFIX);
|
|
166724
166702
|
}
|
|
166703
|
+
function resolveRetiredBuiltinWorkflowId(id) {
|
|
166704
|
+
return RETIRED_BUILTIN_WORKFLOW_SUCCESSORS.get(id) ?? id;
|
|
166705
|
+
}
|
|
166725
166706
|
function ceCodeReviewOptionalGroupNode(column) {
|
|
166726
166707
|
return {
|
|
166727
166708
|
id: "code-review",
|
|
@@ -166984,7 +166965,7 @@ function withPostMergeVerificationNode(nodes2) {
|
|
|
166984
166965
|
var BUILTIN_WORKFLOWS = [
|
|
166985
166966
|
{
|
|
166986
166967
|
id: "builtin:coding",
|
|
166987
|
-
name: "Coding",
|
|
166968
|
+
name: "Coding (Auto)",
|
|
166988
166969
|
description: "Default coding pipeline: plan steps, execute them one at a time, then run the optional final code review and merge.",
|
|
166989
166970
|
kind: "workflow",
|
|
166990
166971
|
ir: BUILTIN_STEPWISE_FINAL_REVIEW_CODING_WORKFLOW_IR,
|
|
@@ -167016,44 +166997,6 @@ var BUILTIN_WORKFLOWS = [
|
|
|
167016
166997
|
createdAt: BUILTIN_TS,
|
|
167017
166998
|
updatedAt: BUILTIN_TS
|
|
167018
166999
|
},
|
|
167019
|
-
/*
|
|
167020
|
-
* FNXC:CodingIdeasWorkflow 2026-07-04-09:40:
|
|
167021
|
-
* The Coding (Ideas) variant adds a manual "Ideas" intake in front of the default stepwise pipeline. New cards land in "ideas" (autoTriage off) and are not planned until an operator promotes them into the merged "todo" planner column; from there the graph is identical to the default Coding workflow.
|
|
167022
|
-
*/
|
|
167023
|
-
{
|
|
167024
|
-
id: "builtin:coding-ideas",
|
|
167025
|
-
name: "Coding (Ideas)",
|
|
167026
|
-
description: "Capture-first coding pipeline: park ideas in a manual intake, then plan, execute per step, run the optional final code review, and merge.",
|
|
167027
|
-
kind: "workflow",
|
|
167028
|
-
ir: BUILTIN_CODING_IDEAS_WORKFLOW_IR,
|
|
167029
|
-
layout: {
|
|
167030
|
-
start: { x: 60, y: 160 },
|
|
167031
|
-
plan: { x: 230, y: 160 },
|
|
167032
|
-
"plan-review": { x: 400, y: 160 },
|
|
167033
|
-
"plan-replan": { x: 400, y: 320 },
|
|
167034
|
-
"plan-review-no-op": { x: 570, y: 320 },
|
|
167035
|
-
parse: { x: 570, y: 160 },
|
|
167036
|
-
steps: { x: 740, y: 160 },
|
|
167037
|
-
/* U8: the pending-review park is an exit, not a stage — placed off the main line. */
|
|
167038
|
-
"review-pending-handoff": { x: 740, y: 320 },
|
|
167039
|
-
"browser-verification": { x: 910, y: 160 },
|
|
167040
|
-
"browser-verification-remediation": { x: 910, y: 320 },
|
|
167041
|
-
"code-review": { x: 1080, y: 160 },
|
|
167042
|
-
"code-review-remediation": { x: 1080, y: 320 },
|
|
167043
|
-
"completion-summary": { x: 1250, y: 160 },
|
|
167044
|
-
"merge-gate": { x: 1420, y: 160 },
|
|
167045
|
-
"branch-group-member-integration": { x: 1590, y: 80 },
|
|
167046
|
-
"branch-group-promotion": { x: 1760, y: 80 },
|
|
167047
|
-
"merge-attempt": { x: 1930, y: 160 },
|
|
167048
|
-
"merge-retry": { x: 2100, y: 80 },
|
|
167049
|
-
"recovery-router": { x: 2100, y: 240 },
|
|
167050
|
-
"merge-manual-hold": { x: 1590, y: 240 },
|
|
167051
|
-
"post-merge-verification": { x: 2270, y: 160 },
|
|
167052
|
-
end: { x: 2440, y: 160 }
|
|
167053
|
-
},
|
|
167054
|
-
createdAt: BUILTIN_TS,
|
|
167055
|
-
updatedAt: BUILTIN_TS
|
|
167056
|
-
},
|
|
167057
167000
|
/*
|
|
167058
167001
|
* FNXC:CodingIdeasV2Workflow 2026-08-26-05:56:
|
|
167059
167002
|
* Same Ideas board as builtin:coding-ideas, with one rule: in-review NEVER writes code.
|
|
@@ -167067,7 +167010,7 @@ var BUILTIN_WORKFLOWS = [
|
|
|
167067
167010
|
*/
|
|
167068
167011
|
{
|
|
167069
167012
|
id: "builtin:coding-ideas-v2",
|
|
167070
|
-
name: "Coding (Ideas)
|
|
167013
|
+
name: "Coding (Ideas)",
|
|
167071
167014
|
description: "Capture-first coding pipeline with a read-only review lane: park ideas in a manual intake, plan, implement and test per step, then review, document, and merge.",
|
|
167072
167015
|
kind: "workflow",
|
|
167073
167016
|
ir: BUILTIN_CODING_IDEAS_V2_WORKFLOW_IR,
|
|
@@ -167463,7 +167406,7 @@ var BUILTIN_WORKFLOWS = [
|
|
|
167463
167406
|
];
|
|
167464
167407
|
var BUILTIN_BY_ID = new Map(BUILTIN_WORKFLOWS.map((wf) => [wf.id, wf]));
|
|
167465
167408
|
function getBuiltinWorkflow(id) {
|
|
167466
|
-
return BUILTIN_BY_ID.get(id);
|
|
167409
|
+
return BUILTIN_BY_ID.get(resolveRetiredBuiltinWorkflowId(id));
|
|
167467
167410
|
}
|
|
167468
167411
|
var DEFAULT_WORKFLOW_ID = "builtin:coding";
|
|
167469
167412
|
function resolveDefaultWorkflowIr() {
|
|
@@ -167513,7 +167456,8 @@ function defaultCodingWorkflowIr() {
|
|
|
167513
167456
|
return resolveDefaultWorkflowIr();
|
|
167514
167457
|
}
|
|
167515
167458
|
var inflightSelectionReads = /* @__PURE__ */ new WeakMap();
|
|
167516
|
-
async function resolveWorkflowIrById(store,
|
|
167459
|
+
async function resolveWorkflowIrById(store, requestedWorkflowId, irCache) {
|
|
167460
|
+
const workflowId = resolveRetiredBuiltinWorkflowId(requestedWorkflowId);
|
|
167517
167461
|
let projectId;
|
|
167518
167462
|
try {
|
|
167519
167463
|
projectId = store.getWorkflowSettingsProjectId?.();
|
|
@@ -167608,8 +167552,7 @@ var LIFECYCLE_ROLE_FLAGS = {
|
|
|
167608
167552
|
hold: "hold",
|
|
167609
167553
|
wip: "countsTowardWip",
|
|
167610
167554
|
review: "mergeOrchestration",
|
|
167611
|
-
complete: "complete"
|
|
167612
|
-
archived: "archived"
|
|
167555
|
+
complete: "complete"
|
|
167613
167556
|
};
|
|
167614
167557
|
function resolveLifecycleColumns(ir) {
|
|
167615
167558
|
const columns = columnsOf(ir);
|
|
@@ -167622,8 +167565,7 @@ function resolveLifecycleColumns(ir) {
|
|
|
167622
167565
|
hold: first(LIFECYCLE_ROLE_FLAGS.hold),
|
|
167623
167566
|
wip: first(LIFECYCLE_ROLE_FLAGS.wip),
|
|
167624
167567
|
review: first(LIFECYCLE_ROLE_FLAGS.review),
|
|
167625
|
-
complete: first(LIFECYCLE_ROLE_FLAGS.complete)
|
|
167626
|
-
archived: first(LIFECYCLE_ROLE_FLAGS.archived)
|
|
167568
|
+
complete: first(LIFECYCLE_ROLE_FLAGS.complete)
|
|
167627
167569
|
};
|
|
167628
167570
|
}
|
|
167629
167571
|
async function resolveTaskLifecycleColumns(store, taskId, cache, selectionCache) {
|
|
@@ -167642,7 +167584,7 @@ var ROLE_DEFAULT_PERMISSIONS = {
|
|
|
167642
167584
|
executor: ["tasks:execute", "agents:view", "messages:read", "messages:send"],
|
|
167643
167585
|
reviewer: ["tasks:review", "agents:view", "messages:read", "messages:send"],
|
|
167644
167586
|
merger: ["tasks:merge", "agents:view", "messages:read"],
|
|
167645
|
-
scheduler: ["tasks:assign", "tasks:create", "
|
|
167587
|
+
scheduler: ["tasks:assign", "tasks:create", "agents:view", "automations:manage", "missions:manage", "messages:read"],
|
|
167646
167588
|
engineer: ["tasks:execute", "tasks:review", "agents:view", "messages:read", "messages:send"],
|
|
167647
167589
|
custom: []
|
|
167648
167590
|
};
|
|
@@ -169551,7 +169493,7 @@ var AgentStore = class _AgentStore extends EventEmitter {
|
|
|
169551
169493
|
*
|
|
169552
169494
|
* Guards:
|
|
169553
169495
|
* - task must exist and not be paused
|
|
169554
|
-
* - task must not be in
|
|
169496
|
+
* - task must not be in its workflow's Complete column
|
|
169555
169497
|
* - task must not already be assigned to another agent
|
|
169556
169498
|
* - task checkout must be unheld or already held by this agent
|
|
169557
169499
|
*
|
|
@@ -169588,7 +169530,7 @@ var AgentStore = class _AgentStore extends EventEmitter {
|
|
|
169588
169530
|
return { ok: false, reason: bindVerdict.reason, task };
|
|
169589
169531
|
}
|
|
169590
169532
|
const claimLifecycle = await resolveTaskLifecycleColumns(this.taskStore, taskId);
|
|
169591
|
-
if (task.column === (claimLifecycle?.complete ?? "done")
|
|
169533
|
+
if (task.column === (claimLifecycle?.complete ?? "done")) {
|
|
169592
169534
|
return { ok: false, reason: "terminal", task };
|
|
169593
169535
|
}
|
|
169594
169536
|
if (task.assignedAgentId && task.assignedAgentId !== agentId) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@runfusion/fusion",
|
|
3
|
-
"version": "0.78.0-beta.
|
|
3
|
+
"version": "0.78.0-beta.4",
|
|
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",
|
package/skill/fusion/SKILL.md
CHANGED
|
@@ -27,7 +27,7 @@ Mission → Milestone → Slice → Feature → Task
|
|
|
27
27
|
|
|
28
28
|
**Tool categories:**
|
|
29
29
|
<!-- BEGIN: tool-categories (auto-generated by scripts/sync-fusion-skill-tools.mjs — do not edit by hand) -->
|
|
30
|
-
- **Task tools** — `fn_task_create`, `fn_task_update`, `fn_task_list`, `fn_task_show`, `fn_task_logs_read`, `fn_task_attach`, `fn_task_pause`, `fn_task_unpause`, `fn_task_retry`, `fn_task_bypass_review`, `fn_task_duplicate`, `fn_task_refine`, `
|
|
30
|
+
- **Task tools** — `fn_task_create`, `fn_task_update`, `fn_task_list`, `fn_task_show`, `fn_task_logs_read`, `fn_task_attach`, `fn_task_pause`, `fn_task_unpause`, `fn_task_retry`, `fn_task_bypass_review`, `fn_task_duplicate`, `fn_task_refine`, `fn_task_delete`, `fn_task_browse_gitlab_project_issues`, `fn_task_import_gitlab_project_issues`, `fn_task_browse_gitlab_group_issues`, `fn_task_import_gitlab_group_issues`, `fn_task_browse_gitlab_merge_requests`, `fn_task_import_gitlab_merge_requests`, `fn_task_plan`
|
|
31
31
|
- **Workflow tools** — `fn_workflow_list`, `fn_workflow_get`, `fn_workflow_validate`, `fn_workflow_create`, `fn_workflow_update`, `fn_workflow_delete`, `fn_workflow_settings`, `fn_trait_list`, `fn_workflow_select`, `fn_workflow_step_resume`
|
|
32
32
|
- **GitHub tools** — `fn_task_import_github`, `fn_task_import_github_issue`, `fn_task_browse_github_issues`
|
|
33
33
|
- **Mission tools** — `fn_mission_create`, `fn_mission_list`, `fn_mission_show`, `fn_mission_list_goals`, `fn_mission_link_goal`, `fn_mission_unlink_goal`, `fn_mission_backfill_assertions`, `fn_mission_delete`, `fn_mission_set_status`, `fn_mission_clear_blocked`, `fn_mission_update`, `fn_milestone_add`, `fn_slice_add`, `fn_feature_add`, `fn_feature_delete`, `fn_slice_delete`, `fn_milestone_delete`, `fn_slice_activate`, `fn_feature_link_task`, `fn_feature_repoint_task`, `fn_feature_unlink_task`, `fn_feature_set_status`, `fn_mission_reconcile`, `fn_feature_repair_validation`, `fn_feature_update`, `fn_milestone_update`
|
|
@@ -35,14 +35,14 @@ For work larger than L, use missions to break it into phases.
|
|
|
35
35
|
| Task failed, needs retry | `fn_task_retry` |
|
|
36
36
|
| User explicitly requests manual control | `fn_task_pause` |
|
|
37
37
|
| Completed task needs follow-up | `fn_task_refine` |
|
|
38
|
-
|
|
|
38
|
+
| Remove a task from live views | `fn_task_delete` |
|
|
39
39
|
| Import external work | `fn_task_import_github*` |
|
|
40
40
|
|
|
41
41
|
## Dependency Management
|
|
42
42
|
|
|
43
43
|
- Declare dependencies at creation time using the `depends` parameter
|
|
44
44
|
- Dependencies must be valid task IDs that exist
|
|
45
|
-
- Tasks wait in todo until all dependencies
|
|
45
|
+
- Tasks wait in todo until all dependencies reach their workflow's Complete column
|
|
46
46
|
- Circular dependencies are rejected
|
|
47
47
|
- Use missions for complex dependency graphs across many tasks
|
|
48
48
|
|
|
@@ -26,8 +26,6 @@ fn task move FN-001 todo # Move task to column
|
|
|
26
26
|
fn task merge FN-001 # Merge in-review task to main
|
|
27
27
|
fn task duplicate FN-001 # Copy task to triage
|
|
28
28
|
fn task refine FN-001 --feedback "..." # Create follow-up task
|
|
29
|
-
fn task archive FN-001 # Move done → archived
|
|
30
|
-
fn task unarchive FN-001 # Move archived → done
|
|
31
29
|
fn task delete FN-001 [--force] # Soft delete (recoverable via DB)
|
|
32
30
|
fn task retry FN-001 # Retry failed task → todo
|
|
33
31
|
fn task comment FN-001 "text" # Add general comment
|
|
@@ -18,7 +18,7 @@ This reference documents tools injected by the engine at runtime for specific ag
|
|
|
18
18
|
|
|
19
19
|
For cross-task publication, read first and pass both returned values when practical: `{ "task_id": "FX-002", "key": "evidence", "content": "rebased evidence", "expected_revision": 3, "expected_content_hash": "sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" }`. Revision zero is create-if-absent. A stale write is an error result with `TASK_DOCUMENT_PRECONDITION_FAILED` and current revision/hash; re-read and explicitly rebase rather than retrying unchanged. Omitted expectations preserve unconditional compatibility.
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Task archiving and archived-document publication are absent from every runtime tool schema. Agent tools may read a retained historical document only when an explicit key is supplied, while keyless list mode hides soft-deleted and historical parents.
|
|
22
22
|
| `fn_task_prompt_write` | plan/spec review (Plan Review reviewer) | Replace the task's authoritative PROMPT.md with revised plan/spec content during Plan Review/spec repair; routed through TaskStore so PROMPT.md validation and task.json sync stay the single persistence path. Provide the complete final PROMPT.md content; do not implement product code from plan review | `content` (string) |
|
|
23
23
|
| `fn_goal_list` | triage, executor, heartbeat | List goals with concise citation-ready snippets and active-goal warning details | `status?` (`active` \| `archived` \| `all`) |
|
|
24
24
|
| `fn_goal_show` | triage, executor, heartbeat | Show one goal's full detail on demand, including the full description body | `id` (string) |
|
|
@@ -70,7 +70,7 @@ Archived publication is deliberately absent from every runtime tool schema: ther
|
|
|
70
70
|
| Tool | Purpose | Parameters |
|
|
71
71
|
|---|---|---|
|
|
72
72
|
| `fn_task_list` | List active tasks during specification (duplicate check, discovery) | none |
|
|
73
|
-
| `fn_task_search` | Keyword search
|
|
73
|
+
| `fn_task_search` | Keyword search over live tasks for duplicate detection | `query` (string), `limit?` (number), `includeDone?` (boolean) |
|
|
74
74
|
| `fn_task_show` | Fetch full task detail including PROMPT.md | `id` (string) |
|
|
75
75
|
| `fn_review_spec` | Spawn spec reviewer and return `APPROVE`/`REVISE`/`RETHINK`/`UNAVAILABLE` | none |
|
|
76
76
|
|
|
@@ -125,23 +125,6 @@ Request a refinement of a completed or in-review task. Creates a new follow-up t
|
|
|
125
125
|
| `id` | string | ✓ | Task ID to refine (e.g. FN-001). Must be in 'done' or 'in-review' column. |
|
|
126
126
|
| `feedback` | string | ✓ | Description of what needs to be refined or improved |
|
|
127
127
|
|
|
128
|
-
### fn_task_archive
|
|
129
|
-
|
|
130
|
-
Archive a task from any live column (move to archived). Archived tasks are preserved for historical reference but moved out of the main board view. If the task is still referenced as a lineage parent by another task, archiving is rejected unless removeLineageReferences:true is passed.
|
|
131
|
-
|
|
132
|
-
| Parameter | Type | Required | Description |
|
|
133
|
-
|-----------|------|----------|-------------|
|
|
134
|
-
| `id` | string | ✓ | Task ID to archive from any live column (e.g. FN-001). |
|
|
135
|
-
| `removeLineageReferences` | boolean | — | When true, clear incoming lineage-parent references (child sourceParentTaskId) before archiving, so a task still referenced as a lineage parent can be archived. |
|
|
136
|
-
|
|
137
|
-
### fn_task_unarchive
|
|
138
|
-
|
|
139
|
-
Unarchive an archived task (move from archived → its restore column). Restores to the pre-archive column when available, with active execution columns downgraded to todo.
|
|
140
|
-
|
|
141
|
-
| Parameter | Type | Required | Description |
|
|
142
|
-
|-----------|------|----------|-------------|
|
|
143
|
-
| `id` | string | ✓ | Task ID to unarchive (e.g. FN-001). Must be in 'archived' column. |
|
|
144
|
-
|
|
145
128
|
### fn_task_delete
|
|
146
129
|
|
|
147
130
|
Soft-delete a task from active Fusion board views. The task row and artifacts are preserved; optional allowResurrection marks the ID for intentional recreation. If live lineage children or dependents still reference the task, deletion is rejected unless the matching explicit reference-removal option is passed.
|
|
@@ -521,7 +504,7 @@ Activate a pending slice for implementation. Sets status to 'active' and enables
|
|
|
521
504
|
|
|
522
505
|
### fn_feature_link_task
|
|
523
506
|
|
|
524
|
-
Link a feature to a fn task for implementation. Updates the feature status to 'triaged' and associates it with the task. If the target task is not on the active board (for example
|
|
507
|
+
Link a feature to a fn task for implementation. Updates the feature status to 'triaged' and associates it with the task. If the target task is not on the active board (for example deleted, historical, or never created), the tool returns a clear validation error indicating that only active tasks can be linked.
|
|
525
508
|
|
|
526
509
|
| Parameter | Type | Required | Description |
|
|
527
510
|
|-----------|------|----------|-------------|
|
|
@@ -34,8 +34,6 @@ All skill/extension tool invocations in this catalog use the public `fn_*` names
|
|
|
34
34
|
| `fn_workflow_step_resume` | Resume a stuck pending workflow step on an in-review or in-progress Fusion task (operator-only, mandatory reason, audit-logged). When a prompt node (like code-review) is dispatched but never receives a verdict callback (Runfusion/Fusion#1946), the step stays in 'pending' status indefinitely. This tool transitions it to 'failed', enabling the existing fn_task_bypass_review escape hatch to clear the merge blocker. Requires a mandatory reason and step ID. |
|
|
35
35
|
| `fn_task_duplicate` | Duplicate an existing task, creating a fresh copy in planning. Copies the title and description but resets all execution state. The AI planning agent will replan the new task. |
|
|
36
36
|
| `fn_task_refine` | Request a refinement of a completed or in-review task. Creates a new follow-up task in planning that references the original task as a dependency. Use this when a done or in-review task needs additional work, improvements, or follow-up changes. |
|
|
37
|
-
| `fn_task_archive` | Archive a task from any live column (move to archived). Archived tasks are preserved for historical reference but moved out of the main board view. If the task is still referenced as a lineage parent by another task, archiving is rejected unless removeLineageReferences:true is passed. |
|
|
38
|
-
| `fn_task_unarchive` | Unarchive an archived task (move from archived → its restore column). Restores to the pre-archive column when available, with active execution columns downgraded to todo. |
|
|
39
37
|
| `fn_task_delete` | Soft-delete a task from active Fusion board views. The task row and artifacts are preserved; optional allowResurrection marks the ID for intentional recreation. If live lineage children or dependents still reference the task, deletion is rejected unless the matching explicit reference-removal option is passed. |
|
|
40
38
|
| `fn_task_import_github` | Import GitHub issues as Fusion tasks. Fetches open issues from a repository and creates tasks in the planning column. Each task includes the issue title and body with a link to the source issue. |
|
|
41
39
|
| `fn_task_import_github_issue` | Import a specific GitHub issue as a Fusion task. Fetches the issue by number and creates a single task in the planning column with the issue title and body. |
|
|
@@ -76,7 +74,7 @@ All skill/extension tool invocations in this catalog use the public `fn_*` names
|
|
|
76
74
|
| `fn_slice_delete` | Delete a slice and its features. Rejects deletion when child features link to live tasks unless force=true. |
|
|
77
75
|
| `fn_milestone_delete` | Delete a milestone and all descendant slices/features. Rejects deletion when child features link to live tasks unless force=true. |
|
|
78
76
|
| `fn_slice_activate` | Activate a pending slice for implementation. Sets status to 'active' and enables task linking for its features. |
|
|
79
|
-
| `fn_feature_link_task` | Link a feature to a fn task for implementation. Updates the feature status to 'triaged' and associates it with the task. If the target task is not on the active board (for example
|
|
77
|
+
| `fn_feature_link_task` | Link a feature to a fn task for implementation. Updates the feature status to 'triaged' and associates it with the task. If the target task is not on the active board (for example deleted, historical, or never created), the tool returns a clear validation error indicating that only active tasks can be linked. |
|
|
80
78
|
| `fn_feature_repoint_task` | Atomically re-point an already-linked feature's single-valued taskId to a different task. Corrects a feature pinned to the wrong task (for example a shared vision doc) without the status-lossy unlink then link two-step. The target task must be live; same-task re-point is an idempotent no-op. |
|
|
81
79
|
| `fn_feature_unlink_task` | Detach a feature from its linked task entirely, clearing its single-valued taskId and demoting its status to 'defined'. Use before the documented safe duplicate-cleanup and reconcile-done flow. Returns a clear error if the feature is not currently linked to any task. |
|
|
82
80
|
| `fn_feature_set_status` | Set a feature lifecycle status. |
|
|
@@ -119,7 +117,6 @@ All skill/extension tool invocations in this catalog use the public `fn_*` names
|
|
|
119
117
|
- `fn task merge FN-001` — Merge an in-review task
|
|
120
118
|
- `fn task duplicate FN-001` — Duplicate a task
|
|
121
119
|
- `fn task refine FN-001 --feedback "..."` — Create refinement task
|
|
122
|
-
- `fn task archive FN-001` / `fn task unarchive FN-001` — Archive/restore tasks
|
|
123
120
|
- `fn task delete FN-001` — Delete a task
|
|
124
121
|
- `fn task retry FN-001` — Retry a failed task
|
|
125
122
|
- `fn task comment FN-001 "..."` — Add a task comment
|
|
@@ -29,7 +29,7 @@ Key fields stored in the `tasks` table:
|
|
|
29
29
|
| `id` | string | Task ID (e.g., FN-001) |
|
|
30
30
|
| `title` | string? | Short title (optional, can be auto-generated) |
|
|
31
31
|
| `description` | string | Full task description |
|
|
32
|
-
| `column` | string | Current column
|
|
32
|
+
| `column` | string | Current workflow column; built-ins use triage/todo/in-progress/in-review/done |
|
|
33
33
|
| `status` | string? | Sub-status: failed, paused, awaiting-approval |
|
|
34
34
|
| `size` | string? | Size estimate: S, M, L |
|
|
35
35
|
| `reviewLevel` | number? | Review intensity: 0-3 |
|
|
@@ -11,10 +11,10 @@ Help the agent understand how tasks flow through the Fusion board, what happens
|
|
|
11
11
|
**Column flow:**
|
|
12
12
|
|
|
13
13
|
```
|
|
14
|
-
Triage → Todo → In Progress → In Review → Done
|
|
14
|
+
Triage → Todo → In Progress → In Review → Done
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
Each column transition is driven by
|
|
17
|
+
Each column transition is driven by workflow automation:
|
|
18
18
|
|
|
19
19
|
**Triage (specification)**
|
|
20
20
|
- Task enters triage when created via `fn_task_create`
|
|
@@ -48,14 +48,10 @@ Each column transition is driven by the AI engine or user action:
|
|
|
48
48
|
- After merge, task moves to **done**
|
|
49
49
|
|
|
50
50
|
**Done**
|
|
51
|
-
- Work is merged to
|
|
52
|
-
-
|
|
51
|
+
- Work is merged to the integration branch and its task history remains in Done
|
|
52
|
+
- Done is server-paginated while its column counter reports the exact total
|
|
53
53
|
- Can be refined with `fn_task_refine` to create follow-up work
|
|
54
|
-
|
|
55
|
-
**Archived**
|
|
56
|
-
- Removed from active board view
|
|
57
|
-
- Can be restored with `fn_task_unarchive`
|
|
58
|
-
- Can be cleaned up to free disk space (removes task directory, keeps metadata)
|
|
54
|
+
- Tasks that should leave live views use `fn_task_delete`; soft deletion keeps the task ID reserved
|
|
59
55
|
|
|
60
56
|
**Task statuses (within any column):**
|
|
61
57
|
|
|
@@ -65,9 +65,7 @@ Use `fn_task_show` with the task ID:
|
|
|
65
65
|
| Retry failed task | `fn_task_retry` | Clears error, moves back to todo |
|
|
66
66
|
| Duplicate task | `fn_task_duplicate` | Creates fresh copy in triage |
|
|
67
67
|
| Refine completed task | `fn_task_refine` | Creates follow-up task with dependency on original |
|
|
68
|
-
|
|
|
69
|
-
| Restore archived task | `fn_task_unarchive` | Moves from archived → done |
|
|
70
|
-
| Delete task | `fn_task_delete` | Soft delete — hides from active views; ID stays reserved; archive cleanup is the only hard-removal path |
|
|
68
|
+
| Delete task | `fn_task_delete` | Soft delete — hides from active views and keeps the ID reserved |
|
|
71
69
|
|
|
72
70
|
**Attaching files:**
|
|
73
71
|
|
|
@@ -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(--btn-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)}
|