@flowdesk/opencode-plugin 0.1.12 → 0.1.14

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.
Files changed (98) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-task-output.d.ts +17 -0
  3. package/dist/agent-task-output.d.ts.map +1 -0
  4. package/dist/agent-task-output.js +119 -0
  5. package/dist/agent-task-output.js.map +1 -0
  6. package/dist/agent-task-runner.d.ts +24 -0
  7. package/dist/agent-task-runner.d.ts.map +1 -1
  8. package/dist/agent-task-runner.js +536 -61
  9. package/dist/agent-task-runner.js.map +1 -1
  10. package/dist/auto-continue-preview-tool.d.ts +36 -0
  11. package/dist/auto-continue-preview-tool.d.ts.map +1 -0
  12. package/dist/auto-continue-preview-tool.js +119 -0
  13. package/dist/auto-continue-preview-tool.js.map +1 -0
  14. package/dist/completion-ui-cache.d.ts +6 -0
  15. package/dist/completion-ui-cache.d.ts.map +1 -0
  16. package/dist/completion-ui-cache.js +260 -0
  17. package/dist/completion-ui-cache.js.map +1 -0
  18. package/dist/controlled-write-tool.d.ts +49 -0
  19. package/dist/controlled-write-tool.d.ts.map +1 -0
  20. package/dist/controlled-write-tool.js +296 -0
  21. package/dist/controlled-write-tool.js.map +1 -0
  22. package/dist/event-hook-observer.d.ts +14 -0
  23. package/dist/event-hook-observer.d.ts.map +1 -0
  24. package/dist/event-hook-observer.js +193 -0
  25. package/dist/event-hook-observer.js.map +1 -0
  26. package/dist/managed-dispatch-adapter.d.ts +1 -0
  27. package/dist/managed-dispatch-adapter.d.ts.map +1 -1
  28. package/dist/managed-dispatch-adapter.js +100 -29
  29. package/dist/managed-dispatch-adapter.js.map +1 -1
  30. package/dist/model-selection-engine.d.ts +47 -0
  31. package/dist/model-selection-engine.d.ts.map +1 -0
  32. package/dist/model-selection-engine.js +175 -0
  33. package/dist/model-selection-engine.js.map +1 -0
  34. package/dist/provider-usage-live-tool.d.ts +27 -0
  35. package/dist/provider-usage-live-tool.d.ts.map +1 -1
  36. package/dist/provider-usage-live-tool.js +443 -4
  37. package/dist/provider-usage-live-tool.js.map +1 -1
  38. package/dist/quick-reviewer-run.d.ts +3 -0
  39. package/dist/quick-reviewer-run.d.ts.map +1 -1
  40. package/dist/quick-reviewer-run.js +20 -8
  41. package/dist/quick-reviewer-run.js.map +1 -1
  42. package/dist/runtime-reviewer-execution-bridge.d.ts +21 -0
  43. package/dist/runtime-reviewer-execution-bridge.d.ts.map +1 -1
  44. package/dist/runtime-reviewer-execution-bridge.js +238 -0
  45. package/dist/runtime-reviewer-execution-bridge.js.map +1 -1
  46. package/dist/server.d.ts +60 -1
  47. package/dist/server.d.ts.map +1 -1
  48. package/dist/server.js +800 -41
  49. package/dist/server.js.map +1 -1
  50. package/dist/stall-recovery.d.ts +60 -0
  51. package/dist/stall-recovery.d.ts.map +1 -1
  52. package/dist/stall-recovery.js +763 -11
  53. package/dist/stall-recovery.js.map +1 -1
  54. package/dist/status-live-tool.d.ts +81 -0
  55. package/dist/status-live-tool.d.ts.map +1 -1
  56. package/dist/status-live-tool.js +620 -38
  57. package/dist/status-live-tool.js.map +1 -1
  58. package/dist/tui-subtask-activity.d.ts +69 -0
  59. package/dist/tui-subtask-activity.d.ts.map +1 -0
  60. package/dist/tui-subtask-activity.js +266 -0
  61. package/dist/tui-subtask-activity.js.map +1 -0
  62. package/dist/tui-usage-snapshot.d.ts +44 -0
  63. package/dist/tui-usage-snapshot.d.ts.map +1 -0
  64. package/dist/tui-usage-snapshot.js +397 -0
  65. package/dist/tui-usage-snapshot.js.map +1 -0
  66. package/dist/tui.d.ts +7 -0
  67. package/dist/tui.d.ts.map +1 -0
  68. package/dist/tui.js +134 -0
  69. package/dist/tui.js.map +1 -0
  70. package/dist/workflow-assign-tool.d.ts +23 -0
  71. package/dist/workflow-assign-tool.d.ts.map +1 -0
  72. package/dist/workflow-assign-tool.js +117 -0
  73. package/dist/workflow-assign-tool.js.map +1 -0
  74. package/dist/workflow-author-tool.d.ts +29 -0
  75. package/dist/workflow-author-tool.d.ts.map +1 -0
  76. package/dist/workflow-author-tool.js +227 -0
  77. package/dist/workflow-author-tool.js.map +1 -0
  78. package/dist/workflow-dispatch-plan-tool.d.ts +47 -0
  79. package/dist/workflow-dispatch-plan-tool.d.ts.map +1 -0
  80. package/dist/workflow-dispatch-plan-tool.js +251 -0
  81. package/dist/workflow-dispatch-plan-tool.js.map +1 -0
  82. package/dist/workflow-dispatch-tool.d.ts +56 -0
  83. package/dist/workflow-dispatch-tool.d.ts.map +1 -0
  84. package/dist/workflow-dispatch-tool.js +306 -0
  85. package/dist/workflow-dispatch-tool.js.map +1 -0
  86. package/dist/workflow-orchestrator.d.ts +31 -0
  87. package/dist/workflow-orchestrator.d.ts.map +1 -0
  88. package/dist/workflow-orchestrator.js +160 -0
  89. package/dist/workflow-orchestrator.js.map +1 -0
  90. package/dist/workflow-scheduler.d.ts +19 -0
  91. package/dist/workflow-scheduler.d.ts.map +1 -0
  92. package/dist/workflow-scheduler.js +45 -0
  93. package/dist/workflow-scheduler.js.map +1 -0
  94. package/dist/workflow-synthesis-tool.d.ts +31 -0
  95. package/dist/workflow-synthesis-tool.d.ts.map +1 -0
  96. package/dist/workflow-synthesis-tool.js +194 -0
  97. package/dist/workflow-synthesis-tool.js.map +1 -0
  98. package/package.json +10 -2
@@ -0,0 +1,31 @@
1
+ import { type FlowDeskAgentTaskInputV1 } from "./agent-task-runner.js";
2
+ export interface FlowDeskWorkflowOrchestratorInputV1 {
3
+ workflowId?: string;
4
+ goalSummary: string;
5
+ parentSessionId: string;
6
+ rootDir: string;
7
+ client: FlowDeskAgentTaskInputV1["client"];
8
+ providerQualifiedModelId: string;
9
+ agentName: string;
10
+ }
11
+ export interface FlowDeskWorkflowOrchestratorResultV1 {
12
+ status: "orchestration_completed" | "orchestration_incomplete" | "blocked_before_orchestration";
13
+ workflowId?: string;
14
+ taskCount?: number;
15
+ executedTaskIds?: string[];
16
+ synthesisId?: string;
17
+ conflictDetected?: boolean;
18
+ summaryForUser: string;
19
+ redactedBlockReason?: string;
20
+ safeNextActions: readonly string[];
21
+ authority: {
22
+ realOpenCodeDispatch: false;
23
+ providerCall: false;
24
+ runtimeExecution: false;
25
+ actualLaneLaunch: false;
26
+ fallbackAuthority: false;
27
+ hardCancelOrNoReplyAuthority: false;
28
+ };
29
+ }
30
+ export declare function executeFlowDeskWorkflowOrchestratorV1(input: FlowDeskWorkflowOrchestratorInputV1): Promise<FlowDeskWorkflowOrchestratorResultV1>;
31
+ //# sourceMappingURL=workflow-orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-orchestrator.d.ts","sourceRoot":"","sources":["../src/workflow-orchestrator.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAOvE,MAAM,WAAW,mCAAmC;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAC3C,wBAAwB,EAAE,MAAM,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oCAAoC;IACpD,MAAM,EACH,yBAAyB,GACzB,0BAA0B,GAC1B,8BAA8B,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,SAAS,EAAE;QACV,oBAAoB,EAAE,KAAK,CAAC;QAC5B,YAAY,EAAE,KAAK,CAAC;QACpB,gBAAgB,EAAE,KAAK,CAAC;QACxB,gBAAgB,EAAE,KAAK,CAAC;QACxB,iBAAiB,EAAE,KAAK,CAAC;QACzB,4BAA4B,EAAE,KAAK,CAAC;KACpC,CAAC;CACF;AAsBD,wBAAsB,qCAAqC,CAC1D,KAAK,EAAE,mCAAmC,GACxC,OAAO,CAAC,oCAAoC,CAAC,CAyI/C"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * FlowDesk Workflow Orchestrator
3
+ * Chains: Author → Assign → Schedule → Synthesize
4
+ * All authority flags remain false throughout.
5
+ */
6
+ import { reloadFlowDeskSessionEvidenceV1, } from "@flowdesk/core";
7
+ import { executeFlowDeskWorkflowAuthorToolV1 } from "./workflow-author-tool.js";
8
+ import { executeFlowDeskWorkflowAssignToolV1 } from "./workflow-assign-tool.js";
9
+ import { executeFlowDeskWorkflowSchedulerV1 } from "./workflow-scheduler.js";
10
+ import { executeFlowDeskWorkflowSynthesisToolV1 } from "./workflow-synthesis-tool.js";
11
+ import { loadFlowDeskTuiUsageSnapshotViewV1 } from "./tui-usage-snapshot.js";
12
+ const SAFE_AUTHORITY = {
13
+ realOpenCodeDispatch: false,
14
+ providerCall: false,
15
+ runtimeExecution: false,
16
+ actualLaneLaunch: false,
17
+ fallbackAuthority: false,
18
+ hardCancelOrNoReplyAuthority: false,
19
+ };
20
+ function blocked(reason, workflowId) {
21
+ return {
22
+ status: "blocked_before_orchestration",
23
+ workflowId,
24
+ redactedBlockReason: reason,
25
+ summaryForUser: `FlowDesk orchestration blocked: ${reason}`,
26
+ safeNextActions: ["/flowdesk-status", "/flowdesk-doctor"],
27
+ authority: SAFE_AUTHORITY,
28
+ };
29
+ }
30
+ export async function executeFlowDeskWorkflowOrchestratorV1(input) {
31
+ // Validate inputs
32
+ if (!input.goalSummary?.trim())
33
+ return blocked("goalSummary is required");
34
+ if (!input.parentSessionId?.trim())
35
+ return blocked("parentSessionId is required");
36
+ if (!input.rootDir?.trim())
37
+ return blocked("rootDir is required");
38
+ if (!input.providerQualifiedModelId?.includes("/"))
39
+ return blocked("providerQualifiedModelId must be concrete");
40
+ if (!input.agentName?.trim())
41
+ return blocked("agentName is required");
42
+ // ── Step 1: Author — decompose goal into task graph ────────────────────
43
+ const authorResult = await executeFlowDeskWorkflowAuthorToolV1({
44
+ workflowId: input.workflowId,
45
+ goalSummary: input.goalSummary,
46
+ parentSessionId: input.parentSessionId,
47
+ rootDir: input.rootDir,
48
+ client: input.client,
49
+ providerQualifiedModelId: input.providerQualifiedModelId,
50
+ agentName: input.agentName,
51
+ });
52
+ if (authorResult.status !== "workflow_authoring_completed" || !authorResult.workflowId || !authorResult.taskCount) {
53
+ return {
54
+ status: "orchestration_incomplete",
55
+ workflowId: authorResult.workflowId,
56
+ redactedBlockReason: authorResult.redactedBlockReason ?? "authoring did not complete",
57
+ summaryForUser: `FlowDesk orchestration stopped at authoring: ${authorResult.redactedBlockReason ?? "unknown"}`,
58
+ safeNextActions: ["/flowdesk-status"],
59
+ authority: SAFE_AUTHORITY,
60
+ };
61
+ }
62
+ const workflowId = authorResult.workflowId;
63
+ // ── Step 2: Assign — pick agents/models per task from usage ────────────
64
+ const usageView = loadFlowDeskTuiUsageSnapshotViewV1({
65
+ rootDir: input.rootDir,
66
+ workflowId: "workflow-provider-usage-live",
67
+ });
68
+ const assignResult = executeFlowDeskWorkflowAssignToolV1({
69
+ workflowId,
70
+ rootDir: input.rootDir,
71
+ sidebarCacheRows: usageView.providers.filter(p => p.connected),
72
+ });
73
+ if (assignResult.status !== "assignments_written") {
74
+ return {
75
+ status: "orchestration_incomplete",
76
+ workflowId,
77
+ redactedBlockReason: assignResult.redactedBlockReason ?? "assignment did not complete",
78
+ summaryForUser: `FlowDesk orchestration stopped at assignment: ${assignResult.redactedBlockReason ?? "unknown"}`,
79
+ safeNextActions: ["/flowdesk-status"],
80
+ authority: SAFE_AUTHORITY,
81
+ };
82
+ }
83
+ // ── Step 3: Schedule — execute tasks in DAG order ─────────────────────
84
+ const reload = reloadFlowDeskSessionEvidenceV1({ workflowId, rootDir: input.rootDir });
85
+ if (!reload.ok)
86
+ return {
87
+ status: "orchestration_incomplete",
88
+ workflowId,
89
+ redactedBlockReason: "evidence reload failed before scheduling",
90
+ summaryForUser: "FlowDesk orchestration stopped: could not reload evidence before scheduling.",
91
+ safeNextActions: ["/flowdesk-status"],
92
+ authority: SAFE_AUTHORITY,
93
+ };
94
+ const graphEntry = reload.entries.find(e => e.evidenceClass === "task_graph");
95
+ const selectionEntries = reload.entries.filter(e => e.evidenceClass === "task_model_selection");
96
+ if (!graphEntry)
97
+ return {
98
+ status: "orchestration_incomplete",
99
+ workflowId,
100
+ redactedBlockReason: "task_graph evidence not found after authoring",
101
+ summaryForUser: "FlowDesk orchestration stopped: task graph evidence missing.",
102
+ safeNextActions: ["/flowdesk-status"],
103
+ authority: SAFE_AUTHORITY,
104
+ };
105
+ const taskGraph = graphEntry.record;
106
+ const modelSelections = selectionEntries.map(e => e.record);
107
+ const schedulerResult = await executeFlowDeskWorkflowSchedulerV1({
108
+ taskGraph,
109
+ modelSelections,
110
+ parentSessionId: input.parentSessionId,
111
+ rootDir: input.rootDir,
112
+ client: input.client,
113
+ agentRef: `agent-${input.agentName.toLowerCase().replace(/[^a-z0-9-]/g, "-")}`,
114
+ });
115
+ if (schedulerResult.status !== "workflow_completed") {
116
+ return {
117
+ status: "orchestration_incomplete",
118
+ workflowId,
119
+ taskCount: authorResult.taskCount,
120
+ executedTaskIds: schedulerResult.executedTaskIds,
121
+ redactedBlockReason: schedulerResult.redactedReason ?? "scheduler did not complete all tasks",
122
+ summaryForUser: `FlowDesk orchestration stopped at execution (${schedulerResult.executedTaskIds.length}/${authorResult.taskCount} tasks done): ${schedulerResult.redactedReason ?? "unknown"}`,
123
+ safeNextActions: ["/flowdesk-status"],
124
+ authority: SAFE_AUTHORITY,
125
+ };
126
+ }
127
+ // ── Step 4: Synthesize — aggregate task results ────────────────────────
128
+ const synthesisResult = await executeFlowDeskWorkflowSynthesisToolV1({
129
+ workflowId,
130
+ rootDir: input.rootDir,
131
+ client: input.client,
132
+ parentSessionId: input.parentSessionId,
133
+ providerQualifiedModelId: input.providerQualifiedModelId,
134
+ agentName: input.agentName,
135
+ });
136
+ if (synthesisResult.status !== "workflow_synthesis_completed") {
137
+ return {
138
+ status: "orchestration_incomplete",
139
+ workflowId,
140
+ taskCount: authorResult.taskCount,
141
+ executedTaskIds: schedulerResult.executedTaskIds,
142
+ redactedBlockReason: synthesisResult.redactedBlockReason ?? "synthesis did not complete",
143
+ summaryForUser: `FlowDesk tasks completed but synthesis stopped: ${synthesisResult.redactedBlockReason ?? "unknown"}`,
144
+ safeNextActions: ["/flowdesk-status"],
145
+ authority: SAFE_AUTHORITY,
146
+ };
147
+ }
148
+ return {
149
+ status: "orchestration_completed",
150
+ workflowId,
151
+ taskCount: authorResult.taskCount,
152
+ executedTaskIds: schedulerResult.executedTaskIds,
153
+ synthesisId: synthesisResult.synthesisId,
154
+ conflictDetected: synthesisResult.conflictDetected,
155
+ summaryForUser: synthesisResult.summaryForUser,
156
+ safeNextActions: ["/flowdesk-status", "/flowdesk-export-debug"],
157
+ authority: SAFE_AUTHORITY,
158
+ };
159
+ }
160
+ //# sourceMappingURL=workflow-orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-orchestrator.js","sourceRoot":"","sources":["../src/workflow-orchestrator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACN,+BAA+B,GAG/B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,mCAAmC,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,mCAAmC,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,kCAAkC,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,sCAAsC,EAAE,MAAM,8BAA8B,CAAC;AACtF,OAAO,EAAE,kCAAkC,EAAE,MAAM,yBAAyB,CAAC;AAmC7E,MAAM,cAAc,GAAG;IACtB,oBAAoB,EAAE,KAAK;IAC3B,YAAY,EAAE,KAAK;IACnB,gBAAgB,EAAE,KAAK;IACvB,gBAAgB,EAAE,KAAK;IACvB,iBAAiB,EAAE,KAAK;IACxB,4BAA4B,EAAE,KAAK;CAC1B,CAAC;AAEX,SAAS,OAAO,CAAC,MAAc,EAAE,UAAmB;IACnD,OAAO;QACN,MAAM,EAAE,8BAA8B;QACtC,UAAU;QACV,mBAAmB,EAAE,MAAM;QAC3B,cAAc,EAAE,mCAAmC,MAAM,EAAE;QAC3D,eAAe,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;QACzD,SAAS,EAAE,cAAc;KACzB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qCAAqC,CAC1D,KAA0C;IAE1C,kBAAkB;IAClB,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE;QAAE,OAAO,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC1E,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,EAAE;QAAE,OAAO,OAAO,CAAC,6BAA6B,CAAC,CAAC;IAClF,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;QAAE,OAAO,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK,CAAC,wBAAwB,EAAE,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC,2CAA2C,CAAC,CAAC;IAChH,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE;QAAE,OAAO,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAEtE,0EAA0E;IAC1E,MAAM,YAAY,GAAG,MAAM,mCAAmC,CAAC;QAC9D,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,wBAAwB,EAAE,KAAK,CAAC,wBAAwB;QACxD,SAAS,EAAE,KAAK,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,IAAI,YAAY,CAAC,MAAM,KAAK,8BAA8B,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;QACnH,OAAO;YACN,MAAM,EAAE,0BAA0B;YAClC,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,mBAAmB,EAAE,YAAY,CAAC,mBAAmB,IAAI,4BAA4B;YACrF,cAAc,EAAE,gDAAgD,YAAY,CAAC,mBAAmB,IAAI,SAAS,EAAE;YAC/G,eAAe,EAAE,CAAC,kBAAkB,CAAC;YACrC,SAAS,EAAE,cAAc;SACzB,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;IAE3C,0EAA0E;IAC1E,MAAM,SAAS,GAAG,kCAAkC,CAAC;QACpD,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,UAAU,EAAE,8BAA8B;KAC1C,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,mCAAmC,CAAC;QACxD,UAAU;QACV,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,gBAAgB,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAkF;KAC/I,CAAC,CAAC;IAEH,IAAI,YAAY,CAAC,MAAM,KAAK,qBAAqB,EAAE,CAAC;QACnD,OAAO;YACN,MAAM,EAAE,0BAA0B;YAClC,UAAU;YACV,mBAAmB,EAAE,YAAY,CAAC,mBAAmB,IAAI,6BAA6B;YACtF,cAAc,EAAE,iDAAiD,YAAY,CAAC,mBAAmB,IAAI,SAAS,EAAE;YAChH,eAAe,EAAE,CAAC,kBAAkB,CAAC;YACrC,SAAS,EAAE,cAAc;SACzB,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,MAAM,MAAM,GAAG,+BAA+B,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACvF,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO;YACtB,MAAM,EAAE,0BAA0B;YAClC,UAAU;YACV,mBAAmB,EAAE,0CAA0C;YAC/D,cAAc,EAAE,8EAA8E;YAC9F,eAAe,EAAE,CAAC,kBAAkB,CAAC;YACrC,SAAS,EAAE,cAAc;SACzB,CAAC;IAEF,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,YAAY,CAAC,CAAC;IAC9E,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,sBAAsB,CAAC,CAAC;IAEhG,IAAI,CAAC,UAAU;QAAE,OAAO;YACvB,MAAM,EAAE,0BAA0B;YAClC,UAAU;YACV,mBAAmB,EAAE,+CAA+C;YACpE,cAAc,EAAE,8DAA8D;YAC9E,eAAe,EAAE,CAAC,kBAAkB,CAAC;YACrC,SAAS,EAAE,cAAc;SACzB,CAAC;IAEF,MAAM,SAAS,GAAG,UAAU,CAAC,MAAwC,CAAC;IACtE,MAAM,eAAe,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAiD,CAAC,CAAC;IAEvG,MAAM,eAAe,GAAG,MAAM,kCAAkC,CAAC;QAChE,SAAS;QACT,eAAe;QACf,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,SAAS,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE;KAC9E,CAAC,CAAC;IAEH,IAAI,eAAe,CAAC,MAAM,KAAK,oBAAoB,EAAE,CAAC;QACrD,OAAO;YACN,MAAM,EAAE,0BAA0B;YAClC,UAAU;YACV,SAAS,EAAE,YAAY,CAAC,SAAS;YACjC,eAAe,EAAE,eAAe,CAAC,eAAe;YAChD,mBAAmB,EAAE,eAAe,CAAC,cAAc,IAAI,sCAAsC;YAC7F,cAAc,EAAE,gDAAgD,eAAe,CAAC,eAAe,CAAC,MAAM,IAAI,YAAY,CAAC,SAAS,iBAAiB,eAAe,CAAC,cAAc,IAAI,SAAS,EAAE;YAC9L,eAAe,EAAE,CAAC,kBAAkB,CAAC;YACrC,SAAS,EAAE,cAAc;SACzB,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,MAAM,eAAe,GAAG,MAAM,sCAAsC,CAAC;QACpE,UAAU;QACV,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,wBAAwB,EAAE,KAAK,CAAC,wBAAwB;QACxD,SAAS,EAAE,KAAK,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,IAAI,eAAe,CAAC,MAAM,KAAK,8BAA8B,EAAE,CAAC;QAC/D,OAAO;YACN,MAAM,EAAE,0BAA0B;YAClC,UAAU;YACV,SAAS,EAAE,YAAY,CAAC,SAAS;YACjC,eAAe,EAAE,eAAe,CAAC,eAAe;YAChD,mBAAmB,EAAE,eAAe,CAAC,mBAAmB,IAAI,4BAA4B;YACxF,cAAc,EAAE,mDAAmD,eAAe,CAAC,mBAAmB,IAAI,SAAS,EAAE;YACrH,eAAe,EAAE,CAAC,kBAAkB,CAAC;YACrC,SAAS,EAAE,cAAc;SACzB,CAAC;IACH,CAAC;IAED,OAAO;QACN,MAAM,EAAE,yBAAyB;QACjC,UAAU;QACV,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,eAAe,EAAE,eAAe,CAAC,eAAe;QAChD,WAAW,EAAE,eAAe,CAAC,WAAW;QACxC,gBAAgB,EAAE,eAAe,CAAC,gBAAgB;QAClD,cAAc,EAAE,eAAe,CAAC,cAAc;QAC9C,eAAe,EAAE,CAAC,kBAAkB,EAAE,wBAAwB,CAAC;QAC/D,SAAS,EAAE,cAAc;KACzB,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { FlowDeskTaskGraphV1, FlowDeskTaskModelSelectionV1 } from "@flowdesk/core";
2
+ import { type FlowDeskAgentTaskInputV1, type FlowDeskAgentTaskResultV1 } from "./agent-task-runner.js";
3
+ export interface FlowDeskWorkflowSchedulerInputV1 {
4
+ taskGraph: FlowDeskTaskGraphV1;
5
+ modelSelections: FlowDeskTaskModelSelectionV1[];
6
+ parentSessionId: string;
7
+ rootDir: string;
8
+ client: FlowDeskAgentTaskInputV1["client"];
9
+ agentRef: string;
10
+ runAgentTask?: (input: FlowDeskAgentTaskInputV1) => Promise<FlowDeskAgentTaskResultV1>;
11
+ }
12
+ export interface FlowDeskWorkflowSchedulerResultV1 {
13
+ status: "workflow_completed" | "workflow_incomplete";
14
+ executedTaskIds: string[];
15
+ results: Record<string, FlowDeskAgentTaskResultV1>;
16
+ redactedReason?: string;
17
+ }
18
+ export declare function executeFlowDeskWorkflowSchedulerV1(input: FlowDeskWorkflowSchedulerInputV1): Promise<FlowDeskWorkflowSchedulerResultV1>;
19
+ //# sourceMappingURL=workflow-scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-scheduler.d.ts","sourceRoot":"","sources":["../src/workflow-scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAA8B,KAAK,wBAAwB,EAAE,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEnI,MAAM,WAAW,gCAAgC;IAChD,SAAS,EAAE,mBAAmB,CAAC;IAC/B,eAAe,EAAE,4BAA4B,EAAE,CAAC;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACvF;AAED,MAAM,WAAW,iCAAiC;IACjD,MAAM,EAAE,oBAAoB,GAAG,qBAAqB,CAAC;IACrD,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IACnD,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,kCAAkC,CACvD,KAAK,EAAE,gCAAgC,GACrC,OAAO,CAAC,iCAAiC,CAAC,CA+C5C"}
@@ -0,0 +1,45 @@
1
+ import { executeFlowDeskAgentTaskV1 } from "./agent-task-runner.js";
2
+ export async function executeFlowDeskWorkflowSchedulerV1(input) {
3
+ const run = input.runAgentTask ?? executeFlowDeskAgentTaskV1;
4
+ const nodes = input.taskGraph.nodes;
5
+ const selections = new Map(input.modelSelections.map((selection) => [selection.task_id, selection]));
6
+ const deps = new Map(nodes.map((node) => [node.task_id, new Set()]));
7
+ for (const edge of input.taskGraph.edges) {
8
+ if (edge.relation === "depends_on")
9
+ deps.get(edge.to_task_id)?.add(edge.from_task_id);
10
+ }
11
+ const done = new Set();
12
+ const executedTaskIds = [];
13
+ const results = {};
14
+ while (done.size < nodes.length) {
15
+ const next = nodes.find((node) => !done.has(node.task_id) && [...(deps.get(node.task_id) ?? [])].every((id) => done.has(id)));
16
+ if (!next)
17
+ return { status: "workflow_incomplete", executedTaskIds, results, redactedReason: "task graph dependency cycle or missing dependency" };
18
+ const selection = selections.get(next.task_id);
19
+ if (!selection || selection.selection_status !== "selected") {
20
+ return { status: "workflow_incomplete", executedTaskIds, results, redactedReason: `missing selected model for ${next.task_id}` };
21
+ }
22
+ const result = await run({
23
+ workflowId: input.taskGraph.workflow_id,
24
+ taskId: next.task_id,
25
+ laneId: `lane-${next.task_id}`,
26
+ agentRef: input.agentRef,
27
+ providerQualifiedModelId: selection.provider_qualified_model_id,
28
+ promptText: `${next.title}\n\n${next.summary}`,
29
+ parentSessionId: input.parentSessionId,
30
+ rootDir: input.rootDir,
31
+ client: input.client,
32
+ outputContract: "final_assistant_text",
33
+ });
34
+ results[next.task_id] = result;
35
+ executedTaskIds.push(next.task_id);
36
+ if (result.status !== "task_completed") {
37
+ const reason = result.status === "task_failed" ? result.redactedReason
38
+ : result.status === "task_launched" ? `async lane launched: ${result.laneId}` : "unknown";
39
+ return { status: "workflow_incomplete", executedTaskIds, results, redactedReason: reason };
40
+ }
41
+ done.add(next.task_id);
42
+ }
43
+ return { status: "workflow_completed", executedTaskIds, results };
44
+ }
45
+ //# sourceMappingURL=workflow-scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-scheduler.js","sourceRoot":"","sources":["../src/workflow-scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type FlowDeskAgentTaskInputV1 } from "./agent-task-runner.js";
2
+ export interface FlowDeskWorkflowSynthesisToolResultV1 {
3
+ status: "workflow_synthesis_completed" | "workflow_synthesis_incomplete" | "blocked_before_synthesis";
4
+ workflowId?: string;
5
+ synthesisId?: string;
6
+ tasksSummarized?: number;
7
+ conflictDetected?: boolean;
8
+ redactedBlockReason?: string;
9
+ summaryForUser: string;
10
+ safeNextActions: readonly string[];
11
+ authority: {
12
+ realOpenCodeDispatch: false;
13
+ providerCall: false;
14
+ runtimeExecution: false;
15
+ actualLaneLaunch: false;
16
+ fallbackAuthority: false;
17
+ };
18
+ }
19
+ export declare function executeFlowDeskWorkflowSynthesisPreviewV1(input: {
20
+ workflowId: string;
21
+ rootDir: string;
22
+ }): FlowDeskWorkflowSynthesisToolResultV1;
23
+ export declare function executeFlowDeskWorkflowSynthesisToolV1(input: {
24
+ workflowId: string;
25
+ rootDir: string;
26
+ client: FlowDeskAgentTaskInputV1["client"];
27
+ parentSessionId: string;
28
+ providerQualifiedModelId: string;
29
+ agentName: string;
30
+ }): Promise<FlowDeskWorkflowSynthesisToolResultV1>;
31
+ //# sourceMappingURL=workflow-synthesis-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-synthesis-tool.d.ts","sourceRoot":"","sources":["../src/workflow-synthesis-tool.ts"],"names":[],"mappings":"AAOA,OAAO,EAA8B,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAqBnG,MAAM,WAAW,qCAAqC;IACrD,MAAM,EAAE,8BAA8B,GAAG,+BAA+B,GAAG,0BAA0B,CAAC;IACtG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,SAAS,EAAE;QACV,oBAAoB,EAAE,KAAK,CAAC;QAC5B,YAAY,EAAE,KAAK,CAAC;QACpB,gBAAgB,EAAE,KAAK,CAAC;QACxB,gBAAgB,EAAE,KAAK,CAAC;QACxB,iBAAiB,EAAE,KAAK,CAAC;KACzB,CAAC;CACF;AAwGD,wBAAgB,yCAAyC,CAAC,KAAK,EAAE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CAChB,GAAG,qCAAqC,CAqBxC;AAED,wBAAsB,sCAAsC,CAAC,KAAK,EAAE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB,EAAE,MAAM,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,qCAAqC,CAAC,CAwDjD"}
@@ -0,0 +1,194 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { validateFlowDeskWorkflowSynthesisResultV1, applyFlowDeskSessionEvidenceWriteIntentsV1, prepareFlowDeskSessionEvidenceWriteIntentV1, reloadFlowDeskSessionEvidenceV1, } from "@flowdesk/core";
3
+ import { executeFlowDeskAgentTaskV1 } from "./agent-task-runner.js";
4
+ import { refreshFlowDeskCompletionUiCachesV1 } from "./completion-ui-cache.js";
5
+ function extractJsonBlock(text) {
6
+ const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/);
7
+ if (fenced?.[1]) {
8
+ try {
9
+ return JSON.parse(fenced[1].trim());
10
+ }
11
+ catch { /* fall through */ }
12
+ }
13
+ const bare = text.match(/\{[\s\S]*\}/);
14
+ if (bare) {
15
+ try {
16
+ return JSON.parse(bare[0]);
17
+ }
18
+ catch { /* fall through */ }
19
+ }
20
+ return null;
21
+ }
22
+ function clamp(text, max) {
23
+ return text.length > max ? text.slice(0, max - 1) + "…" : text;
24
+ }
25
+ const FORBIDDEN_MARKERS = /system prompt|provider payload|raw token|hidden injection|opencode\srun|dispatch|fallback|reselect/i;
26
+ const SAFE_AUTHORITY = { realOpenCodeDispatch: false, providerCall: false, runtimeExecution: false, actualLaneLaunch: false, fallbackAuthority: false };
27
+ function blocked(reason, workflowId) {
28
+ return { status: "blocked_before_synthesis", workflowId, redactedBlockReason: reason, summaryForUser: `Blocked: ${reason}`, safeNextActions: ["/flowdesk-status", "/flowdesk-doctor"], authority: SAFE_AUTHORITY };
29
+ }
30
+ function collectTaskResultSummaries(input) {
31
+ const reload = reloadFlowDeskSessionEvidenceV1({ workflowId: input.workflowId, rootDir: input.rootDir });
32
+ if (!reload.ok)
33
+ return { ok: false, result: blocked("session evidence reload failed", input.workflowId) };
34
+ const taskResultEntries = reload.entries.filter(e => e.evidenceClass === "task_result");
35
+ if (taskResultEntries.length === 0)
36
+ return { ok: false, result: blocked("no task_result evidence found – run scheduler first", input.workflowId) };
37
+ const summaries = [];
38
+ let conflictDetected = false;
39
+ const conflictKeywords = /conflict|contradict|blocked|failed|changes_required|invalid|error/i;
40
+ for (const entry of taskResultEntries.slice(0, 10)) {
41
+ const record = entry.record;
42
+ const rawText = typeof record.result_text === "string" ? record.result_text : "(no output)";
43
+ const redacted = FORBIDDEN_MARKERS.test(rawText) ? "(redacted)" : clamp(rawText, 500);
44
+ const taskId = typeof record.task_id === "string" ? record.task_id : entry.evidenceId;
45
+ const status = "completed";
46
+ if (conflictKeywords.test(redacted))
47
+ conflictDetected = true;
48
+ summaries.push({ taskId, status, text: redacted });
49
+ }
50
+ return { ok: true, summaries, conflictDetected };
51
+ }
52
+ function writeWorkflowSynthesisResult(input) {
53
+ const synthesisId = `synthesis-${randomBytes(5).toString("hex")}`;
54
+ const synthesisRecord = {
55
+ schema_version: "flowdesk.workflow_synthesis_result.v1",
56
+ workflow_id: input.workflowId,
57
+ synthesis_id: synthesisId,
58
+ tasks_summarized: input.summaries.length,
59
+ task_refs: input.summaries.map(s => s.taskId),
60
+ conflict_detected: input.conflictDetected,
61
+ synthesis_summary: input.synthesisSummary,
62
+ safe_next_actions: ["/flowdesk-status", "/flowdesk-export-debug"],
63
+ };
64
+ if (!validateFlowDeskWorkflowSynthesisResultV1(synthesisRecord).ok) {
65
+ return { status: "workflow_synthesis_incomplete", workflowId: input.workflowId, redactedBlockReason: "synthesis record validation failed", summaryForUser: "Synthesis validation failed.", safeNextActions: ["/flowdesk-status"], authority: SAFE_AUTHORITY };
66
+ }
67
+ const prepared = prepareFlowDeskSessionEvidenceWriteIntentV1({ workflowId: input.workflowId, evidenceId: synthesisId, record: synthesisRecord });
68
+ if (!prepared.ok || !prepared.writeIntent)
69
+ return blocked("synthesis write intent failed", input.workflowId);
70
+ const applied = applyFlowDeskSessionEvidenceWriteIntentsV1(input.rootDir, [prepared.writeIntent]);
71
+ if (!applied.ok)
72
+ return blocked("synthesis evidence write failed", input.workflowId);
73
+ refreshFlowDeskCompletionUiCachesV1({
74
+ rootDir: input.rootDir,
75
+ workflowId: input.workflowId,
76
+ });
77
+ return {
78
+ status: "workflow_synthesis_completed",
79
+ workflowId: input.workflowId,
80
+ synthesisId,
81
+ tasksSummarized: input.summaries.length,
82
+ conflictDetected: input.conflictDetected,
83
+ summaryForUser: input.synthesisSummary,
84
+ safeNextActions: ["/flowdesk-status", "/flowdesk-export-debug"],
85
+ authority: SAFE_AUTHORITY,
86
+ };
87
+ }
88
+ function existingWorkflowSynthesisResult(input) {
89
+ const reload = reloadFlowDeskSessionEvidenceV1({ workflowId: input.workflowId, rootDir: input.rootDir });
90
+ if (!reload.ok)
91
+ return undefined;
92
+ const existing = reload.entries.find((entry) => entry.evidenceClass === "workflow_synthesis_result");
93
+ if (!existing)
94
+ return undefined;
95
+ const record = existing.record;
96
+ const synthesisId = typeof record.synthesis_id === "string" ? record.synthesis_id : existing.evidenceId;
97
+ refreshFlowDeskCompletionUiCachesV1({
98
+ rootDir: input.rootDir,
99
+ workflowId: input.workflowId,
100
+ });
101
+ return {
102
+ status: "workflow_synthesis_completed",
103
+ workflowId: input.workflowId,
104
+ synthesisId,
105
+ tasksSummarized: typeof record.tasks_summarized === "number" ? record.tasks_summarized : 0,
106
+ conflictDetected: record.conflict_detected === true,
107
+ summaryForUser: typeof record.synthesis_summary === "string" ? record.synthesis_summary : "Existing synthesis preview.",
108
+ safeNextActions: ["/flowdesk-status", "/flowdesk-export-debug"],
109
+ authority: SAFE_AUTHORITY,
110
+ };
111
+ }
112
+ export function executeFlowDeskWorkflowSynthesisPreviewV1(input) {
113
+ if (!input.workflowId?.trim())
114
+ return blocked("workflowId is required");
115
+ if (!input.rootDir?.trim())
116
+ return blocked("rootDir is required");
117
+ const existing = existingWorkflowSynthesisResult({ workflowId: input.workflowId, rootDir: input.rootDir });
118
+ if (existing)
119
+ return existing;
120
+ const collected = collectTaskResultSummaries({ workflowId: input.workflowId, rootDir: input.rootDir });
121
+ if (!collected.ok)
122
+ return collected.result;
123
+ const previewText = collected.summaries
124
+ .map(s => `${s.taskId}: ${s.text}`)
125
+ .join("; ");
126
+ const synthesisSummary = clamp(`Provider-free synthesis preview for ${collected.summaries.length} task result(s). ${previewText}`, 650);
127
+ return writeWorkflowSynthesisResult({
128
+ workflowId: input.workflowId,
129
+ rootDir: input.rootDir,
130
+ summaries: collected.summaries,
131
+ conflictDetected: collected.conflictDetected,
132
+ synthesisSummary,
133
+ });
134
+ }
135
+ export async function executeFlowDeskWorkflowSynthesisToolV1(input) {
136
+ if (!input.workflowId?.trim())
137
+ return blocked("workflowId is required");
138
+ if (!input.rootDir?.trim())
139
+ return blocked("rootDir is required");
140
+ if (!input.parentSessionId?.trim())
141
+ return blocked("parentSessionId is required");
142
+ if (!input.providerQualifiedModelId?.includes("/"))
143
+ return blocked("providerQualifiedModelId must be concrete");
144
+ if (!input.agentName?.trim())
145
+ return blocked("agentName is required");
146
+ const existing = existingWorkflowSynthesisResult({ workflowId: input.workflowId, rootDir: input.rootDir });
147
+ if (existing)
148
+ return existing;
149
+ const collected = collectTaskResultSummaries({ workflowId: input.workflowId, rootDir: input.rootDir });
150
+ if (!collected.ok)
151
+ return collected.result;
152
+ const summaries = collected.summaries;
153
+ let conflictDetected = collected.conflictDetected;
154
+ const promptText = [
155
+ "You are a results synthesizer. Read the following task results and provide a concise, bounded synthesis.",
156
+ "Return ONLY a JSON object: { \"synthesis_summary\": string (≤600 chars, no raw tokens/payloads/dispatch wording), \"conflict_detected\": boolean }",
157
+ "No execution authority. Redacted summaries only.",
158
+ "---",
159
+ summaries.map(s => `Task ${s.taskId} (${s.status}): ${s.text}`).join("\n"),
160
+ ].join("\n");
161
+ const taskResult = await executeFlowDeskAgentTaskV1({
162
+ workflowId: input.workflowId,
163
+ taskId: `task-synth-${randomBytes(4).toString("hex")}`,
164
+ laneId: `lane-synth-${randomBytes(4).toString("hex")}`,
165
+ agentRef: `agent-${input.agentName.toLowerCase().replace(/[^a-z0-9-]/g, "-")}`,
166
+ providerQualifiedModelId: input.providerQualifiedModelId,
167
+ promptText,
168
+ parentSessionId: input.parentSessionId,
169
+ rootDir: input.rootDir,
170
+ client: input.client,
171
+ outputContract: "final_assistant_text",
172
+ });
173
+ let synthesisSummary = `Synthesized ${summaries.length} task result(s). Conflict: ${conflictDetected}.`;
174
+ if (taskResult.status === "task_completed") {
175
+ const parsed = extractJsonBlock(taskResult.resultText);
176
+ if (parsed && typeof parsed === "object" && "synthesis_summary" in parsed) {
177
+ const raw = parsed.synthesis_summary;
178
+ if (typeof raw === "string" && !FORBIDDEN_MARKERS.test(raw)) {
179
+ synthesisSummary = clamp(raw, 700);
180
+ if (typeof parsed.conflict_detected === "boolean") {
181
+ conflictDetected = parsed.conflict_detected;
182
+ }
183
+ }
184
+ }
185
+ }
186
+ return writeWorkflowSynthesisResult({
187
+ workflowId: input.workflowId,
188
+ rootDir: input.rootDir,
189
+ summaries,
190
+ conflictDetected,
191
+ synthesisSummary,
192
+ });
193
+ }
194
+ //# sourceMappingURL=workflow-synthesis-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-synthesis-tool.js","sourceRoot":"","sources":["../src/workflow-synthesis-tool.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowdesk/opencode-plugin",
3
- "version": "0.1.12",
3
+ "version": "0.1.14",
4
4
  "description": "FlowDesk OpenCode plugin with Release 1 non-dispatch command-backed registration.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -42,6 +42,11 @@
42
42
  "import": "./dist/server.js",
43
43
  "default": "./dist/server.js"
44
44
  },
45
+ "./tui": {
46
+ "types": "./dist/tui.d.ts",
47
+ "import": "./dist/tui.js",
48
+ "default": "./dist/tui.js"
49
+ },
45
50
  "./bootstrap-cli": {
46
51
  "types": "./dist/bootstrap-cli.d.ts",
47
52
  "import": "./dist/bootstrap-cli.js",
@@ -57,9 +62,12 @@
57
62
  "test": "npm run build && node --test dist/**/*.test.js"
58
63
  },
59
64
  "dependencies": {
60
- "@flowdesk/core": "^0.1.12"
65
+ "@flowdesk/core": "^0.1.14"
61
66
  },
62
67
  "peerDependencies": {
68
+ "@opentui/core": ">=0.2.15",
69
+ "@opentui/keymap": ">=0.2.15",
70
+ "@opentui/solid": ">=0.2.15",
63
71
  "@opencode-ai/plugin": ">=1.14.40 <2"
64
72
  },
65
73
  "peerDependenciesMeta": {