@synergenius/flow-weaver-pack-weaver 0.9.59 → 0.9.77

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 (217) hide show
  1. package/dist/ai-chat-provider.d.ts +12 -0
  2. package/dist/ai-chat-provider.d.ts.map +1 -1
  3. package/dist/ai-chat-provider.js +351 -335
  4. package/dist/ai-chat-provider.js.map +1 -1
  5. package/dist/bot/agent-loop.d.ts +20 -0
  6. package/dist/bot/agent-loop.d.ts.map +1 -0
  7. package/dist/bot/agent-loop.js +331 -0
  8. package/dist/bot/agent-loop.js.map +1 -0
  9. package/dist/bot/ai-router.d.ts +19 -0
  10. package/dist/bot/ai-router.d.ts.map +1 -0
  11. package/dist/bot/ai-router.js +104 -0
  12. package/dist/bot/ai-router.js.map +1 -0
  13. package/dist/bot/assistant-tools.d.ts.map +1 -1
  14. package/dist/bot/assistant-tools.js +49 -33
  15. package/dist/bot/assistant-tools.js.map +1 -1
  16. package/dist/bot/async-mutex.d.ts +13 -0
  17. package/dist/bot/async-mutex.d.ts.map +1 -0
  18. package/dist/bot/async-mutex.js +37 -0
  19. package/dist/bot/async-mutex.js.map +1 -0
  20. package/dist/bot/bot-manager.d.ts +2 -2
  21. package/dist/bot/bot-manager.d.ts.map +1 -1
  22. package/dist/bot/bot-manager.js +3 -3
  23. package/dist/bot/bot-manager.js.map +1 -1
  24. package/dist/bot/bot-registry.js +2 -2
  25. package/dist/bot/bot-registry.js.map +1 -1
  26. package/dist/bot/conversation-store.d.ts +1 -0
  27. package/dist/bot/conversation-store.d.ts.map +1 -1
  28. package/dist/bot/conversation-store.js.map +1 -1
  29. package/dist/bot/dashboard.d.ts.map +1 -1
  30. package/dist/bot/dashboard.js +17 -8
  31. package/dist/bot/dashboard.js.map +1 -1
  32. package/dist/bot/improve-loop.js.map +1 -1
  33. package/dist/bot/index.d.ts +2 -4
  34. package/dist/bot/index.d.ts.map +1 -1
  35. package/dist/bot/index.js +1 -2
  36. package/dist/bot/index.js.map +1 -1
  37. package/dist/bot/instance-manager.d.ts +31 -0
  38. package/dist/bot/instance-manager.d.ts.map +1 -0
  39. package/dist/bot/instance-manager.js +115 -0
  40. package/dist/bot/instance-manager.js.map +1 -0
  41. package/dist/bot/orchestrator.d.ts +36 -0
  42. package/dist/bot/orchestrator.d.ts.map +1 -0
  43. package/dist/bot/orchestrator.js +176 -0
  44. package/dist/bot/orchestrator.js.map +1 -0
  45. package/dist/bot/profile-store.d.ts +36 -0
  46. package/dist/bot/profile-store.d.ts.map +1 -0
  47. package/dist/bot/profile-store.js +208 -0
  48. package/dist/bot/profile-store.js.map +1 -0
  49. package/dist/bot/profile-types.d.ts +126 -0
  50. package/dist/bot/profile-types.d.ts.map +1 -0
  51. package/dist/bot/profile-types.js +7 -0
  52. package/dist/bot/profile-types.js.map +1 -0
  53. package/dist/bot/run-store.d.ts.map +1 -1
  54. package/dist/bot/run-store.js +8 -0
  55. package/dist/bot/run-store.js.map +1 -1
  56. package/dist/bot/runner.d.ts +4 -0
  57. package/dist/bot/runner.d.ts.map +1 -1
  58. package/dist/bot/runner.js +5 -1
  59. package/dist/bot/runner.js.map +1 -1
  60. package/dist/bot/swarm-controller.d.ts +109 -0
  61. package/dist/bot/swarm-controller.d.ts.map +1 -0
  62. package/dist/bot/swarm-controller.js +640 -0
  63. package/dist/bot/swarm-controller.js.map +1 -0
  64. package/dist/bot/swarm-event-log.d.ts +28 -0
  65. package/dist/bot/swarm-event-log.d.ts.map +1 -0
  66. package/dist/bot/swarm-event-log.js +54 -0
  67. package/dist/bot/swarm-event-log.js.map +1 -0
  68. package/dist/bot/task-prompt-builder.d.ts +22 -0
  69. package/dist/bot/task-prompt-builder.d.ts.map +1 -0
  70. package/dist/bot/task-prompt-builder.js +240 -0
  71. package/dist/bot/task-prompt-builder.js.map +1 -0
  72. package/dist/bot/task-store.d.ts +21 -0
  73. package/dist/bot/task-store.d.ts.map +1 -0
  74. package/dist/bot/task-store.js +364 -0
  75. package/dist/bot/task-store.js.map +1 -0
  76. package/dist/bot/task-types.d.ts +79 -0
  77. package/dist/bot/task-types.d.ts.map +1 -0
  78. package/dist/bot/task-types.js +6 -0
  79. package/dist/bot/task-types.js.map +1 -0
  80. package/dist/bot/types.d.ts +8 -0
  81. package/dist/bot/types.d.ts.map +1 -1
  82. package/dist/cli-handlers.d.ts.map +1 -1
  83. package/dist/cli-handlers.js +79 -54
  84. package/dist/cli-handlers.js.map +1 -1
  85. package/dist/cli.d.ts +3 -0
  86. package/dist/cli.d.ts.map +1 -0
  87. package/dist/cli.js +749 -0
  88. package/dist/cli.js.map +1 -0
  89. package/dist/docs/docs/weaver-bot-usage.md +35 -18
  90. package/dist/docs/docs/weaver-config.md +20 -0
  91. package/dist/docs/docs/weaver-task-queue.md +31 -19
  92. package/dist/docs/weaver-config.md +15 -9
  93. package/dist/index.d.ts +2 -2
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +1 -1
  96. package/dist/index.js.map +1 -1
  97. package/dist/mcp-tools.d.ts +17 -0
  98. package/dist/mcp-tools.d.ts.map +1 -1
  99. package/dist/mcp-tools.js +98 -279
  100. package/dist/mcp-tools.js.map +1 -1
  101. package/dist/node-types/bot-report.d.ts.map +1 -1
  102. package/dist/node-types/bot-report.js +6 -24
  103. package/dist/node-types/bot-report.js.map +1 -1
  104. package/dist/node-types/orchestrator-dispatch.d.ts +17 -0
  105. package/dist/node-types/orchestrator-dispatch.d.ts.map +1 -0
  106. package/dist/node-types/orchestrator-dispatch.js +63 -0
  107. package/dist/node-types/orchestrator-dispatch.js.map +1 -0
  108. package/dist/node-types/orchestrator-load-state.d.ts +16 -0
  109. package/dist/node-types/orchestrator-load-state.d.ts.map +1 -0
  110. package/dist/node-types/orchestrator-load-state.js +60 -0
  111. package/dist/node-types/orchestrator-load-state.js.map +1 -0
  112. package/dist/node-types/orchestrator-route.d.ts +16 -0
  113. package/dist/node-types/orchestrator-route.d.ts.map +1 -0
  114. package/dist/node-types/orchestrator-route.js +28 -0
  115. package/dist/node-types/orchestrator-route.js.map +1 -0
  116. package/dist/node-types/receive-task.d.ts +2 -3
  117. package/dist/node-types/receive-task.d.ts.map +1 -1
  118. package/dist/node-types/receive-task.js +3 -48
  119. package/dist/node-types/receive-task.js.map +1 -1
  120. package/dist/templates/weaver-template.d.ts +11 -0
  121. package/dist/templates/weaver-template.d.ts.map +1 -0
  122. package/dist/templates/weaver-template.js +53 -0
  123. package/dist/templates/weaver-template.js.map +1 -0
  124. package/dist/ui/bot-activity.js +2 -2
  125. package/dist/ui/bot-constants.d.ts +14 -0
  126. package/dist/ui/bot-constants.d.ts.map +1 -0
  127. package/dist/ui/bot-constants.js +189 -0
  128. package/dist/ui/bot-constants.js.map +1 -0
  129. package/dist/ui/bot-panel.js +207 -245
  130. package/dist/ui/bot-slot-card.js +141 -0
  131. package/dist/ui/budget-bar.js +59 -0
  132. package/dist/ui/chat-task-result.js +178 -0
  133. package/dist/ui/decision-log.js +136 -0
  134. package/dist/ui/profile-card.js +158 -0
  135. package/dist/ui/profile-editor.js +597 -0
  136. package/dist/ui/swarm-controls.js +245 -0
  137. package/dist/ui/swarm-dashboard.js +3012 -0
  138. package/dist/ui/task-create-form.js +98 -0
  139. package/dist/ui/task-detail-view.js +1044 -0
  140. package/dist/ui/task-pool-list.js +156 -0
  141. package/dist/workflows/orchestrator.d.ts +21 -0
  142. package/dist/workflows/orchestrator.d.ts.map +1 -0
  143. package/dist/workflows/orchestrator.js +281 -0
  144. package/dist/workflows/orchestrator.js.map +1 -0
  145. package/dist/workflows/weaver-bot-session.d.ts +65 -0
  146. package/dist/workflows/weaver-bot-session.d.ts.map +1 -0
  147. package/dist/workflows/weaver-bot-session.js +68 -0
  148. package/dist/workflows/weaver-bot-session.js.map +1 -0
  149. package/dist/workflows/weaver.d.ts +24 -0
  150. package/dist/workflows/weaver.d.ts.map +1 -0
  151. package/dist/workflows/weaver.js +28 -0
  152. package/dist/workflows/weaver.js.map +1 -0
  153. package/flowweaver.manifest.json +547 -133
  154. package/package.json +1 -1
  155. package/src/ai-chat-provider.ts +378 -371
  156. package/src/bot/ai-router.ts +132 -0
  157. package/src/bot/assistant-tools.ts +47 -29
  158. package/src/bot/async-mutex.ts +37 -0
  159. package/src/bot/bot-manager.ts +3 -3
  160. package/src/bot/bot-registry.ts +2 -2
  161. package/src/bot/conversation-store.ts +2 -1
  162. package/src/bot/dashboard.ts +17 -8
  163. package/src/bot/improve-loop.ts +6 -6
  164. package/src/bot/index.ts +2 -4
  165. package/src/bot/instance-manager.ts +128 -0
  166. package/src/bot/orchestrator.ts +244 -0
  167. package/src/bot/profile-store.ts +225 -0
  168. package/src/bot/profile-types.ts +141 -0
  169. package/src/bot/run-store.ts +8 -0
  170. package/src/bot/runner.ts +9 -1
  171. package/src/bot/swarm-controller.ts +780 -0
  172. package/src/bot/swarm-event-log.ts +57 -0
  173. package/src/bot/task-prompt-builder.ts +309 -0
  174. package/src/bot/task-store.ts +407 -0
  175. package/src/bot/task-types.ts +100 -0
  176. package/src/bot/types.ts +8 -0
  177. package/src/cli-handlers.ts +78 -53
  178. package/src/docs/weaver-bot-usage.md +35 -18
  179. package/src/docs/weaver-config.md +20 -0
  180. package/src/docs/weaver-task-queue.md +31 -19
  181. package/src/index.ts +5 -4
  182. package/src/mcp-tools.ts +129 -372
  183. package/src/node-types/bot-report.ts +6 -24
  184. package/src/node-types/orchestrator-dispatch.ts +71 -0
  185. package/src/node-types/orchestrator-load-state.ts +66 -0
  186. package/src/node-types/orchestrator-route.ts +33 -0
  187. package/src/node-types/receive-task.ts +3 -57
  188. package/src/ui/bot-activity.tsx +2 -2
  189. package/src/ui/bot-constants.ts +192 -0
  190. package/src/ui/bot-panel.tsx +213 -247
  191. package/src/ui/bot-slot-card.tsx +139 -0
  192. package/src/ui/budget-bar.tsx +30 -0
  193. package/src/ui/chat-task-result.tsx +236 -0
  194. package/src/ui/decision-log.tsx +148 -0
  195. package/src/ui/profile-card.tsx +157 -0
  196. package/src/ui/profile-editor.tsx +384 -0
  197. package/src/ui/swarm-controls.tsx +260 -0
  198. package/src/ui/swarm-dashboard.tsx +647 -0
  199. package/src/ui/task-create-form.tsx +87 -0
  200. package/src/ui/task-detail-view.tsx +841 -0
  201. package/src/ui/task-pool-list.tsx +187 -0
  202. package/src/workflows/orchestrator.ts +302 -0
  203. package/dist/docs/weaver-bot-usage.md +0 -34
  204. package/dist/docs/weaver-genesis.md +0 -32
  205. package/dist/docs/weaver-task-queue.md +0 -34
  206. package/dist/ui/bot-workspace.js +0 -1015
  207. package/dist/ui/chat-bot-result.js +0 -71
  208. package/dist/ui/queue-input.js +0 -82
  209. package/dist/ui/session-bar.js +0 -174
  210. package/src/bot/error-guide.ts +0 -4
  211. package/src/bot/retry-utils.ts +0 -4
  212. package/src/bot/session-state.ts +0 -116
  213. package/src/bot/task-queue.ts +0 -262
  214. package/src/ui/bot-workspace.tsx +0 -442
  215. package/src/ui/chat-bot-result.tsx +0 -81
  216. package/src/ui/queue-input.tsx +0 -56
  217. package/src/ui/session-bar.tsx +0 -157
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/ui/bot-slot-card.tsx
31
+ var bot_slot_card_exports = {};
32
+ __export(bot_slot_card_exports, {
33
+ BotSlotCard: () => BotSlotCard,
34
+ default: () => bot_slot_card_default
35
+ });
36
+ module.exports = __toCommonJS(bot_slot_card_exports);
37
+ var import_react = __toESM(require("react"), 1);
38
+ var import_plugin_ui_kit = require("@fw/plugin-ui-kit");
39
+ var statusToLabel = {
40
+ idle: "Idle",
41
+ executing: "Executing",
42
+ paused: "Paused",
43
+ stopped: "Stopped"
44
+ };
45
+ function formatTokens(n) {
46
+ if (n >= 1e6) return `${(n / 1e6).toFixed(1)}M`;
47
+ if (n >= 1e3) return `${(n / 1e3).toFixed(1)}k`;
48
+ return String(n);
49
+ }
50
+ function formatCost(n) {
51
+ if (n < 0.01 && n > 0) return "<$0.01";
52
+ return `$${n.toFixed(2)}`;
53
+ }
54
+ function BotSlotCard({ bot, currentTaskTitle, profileName, botDisplayName, botIcon, botColor, onPause, onResume, onStop }) {
55
+ const { botId, botName, status, currentTaskId, tokensUsed, cost } = bot;
56
+ const isExecuting = status === "executing";
57
+ const isPaused = status === "paused";
58
+ const label = statusToLabel[status] ?? status;
59
+ const taskText = isExecuting ? currentTaskTitle || currentTaskId || "-" : "-";
60
+ return import_react.default.createElement(
61
+ import_plugin_ui_kit.Flex,
62
+ {
63
+ variant: "row-center-start-nowrap-8",
64
+ style: { padding: "6px 16px", minHeight: "38px", borderBottom: "1px solid var(--color-border-default)" }
65
+ },
66
+ // Instance name
67
+ import_react.default.createElement(import_plugin_ui_kit.Typography, {
68
+ variant: "smallCaption-regular",
69
+ color: "color-text-high",
70
+ style: { width: "120px", flexShrink: 0 }
71
+ }, profileName ? `${profileName} #${botId.split("-").pop() ?? "0"}` : botName),
72
+ // Bot (icon + name)
73
+ import_react.default.createElement(
74
+ import_plugin_ui_kit.Flex,
75
+ {
76
+ variant: "row-center-start-nowrap-4",
77
+ style: { width: "110px", flexShrink: 0, color: botColor ? `var(--${botColor})` : void 0 }
78
+ },
79
+ import_react.default.createElement(import_plugin_ui_kit.Icon, { name: botIcon || "smartToy", size: 12 }),
80
+ import_react.default.createElement(import_plugin_ui_kit.Typography, {
81
+ variant: "smallCaption-regular",
82
+ color: "color-text-subtle"
83
+ }, botDisplayName || "-")
84
+ ),
85
+ // Status
86
+ import_react.default.createElement(import_plugin_ui_kit.Typography, {
87
+ variant: "smallCaption-regular",
88
+ color: isExecuting ? "color-brand-main" : "color-text-subtle",
89
+ style: { width: "70px", flexShrink: 0 }
90
+ }, label),
91
+ // Current task
92
+ import_react.default.createElement(import_plugin_ui_kit.Typography, {
93
+ variant: "smallCaption-regular",
94
+ color: isExecuting ? "color-text-medium" : "color-text-subtle",
95
+ style: { flex: 1, minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }
96
+ }, taskText),
97
+ // Tokens
98
+ import_react.default.createElement(import_plugin_ui_kit.Typography, {
99
+ variant: "smallCaption-regular",
100
+ color: "color-text-subtle",
101
+ style: { width: "50px", flexShrink: 0, textAlign: "right" }
102
+ }, formatTokens(tokensUsed)),
103
+ // Cost
104
+ import_react.default.createElement(import_plugin_ui_kit.Typography, {
105
+ variant: "smallCaption-regular",
106
+ color: "color-text-subtle",
107
+ style: { width: "50px", flexShrink: 0, textAlign: "right" }
108
+ }, formatCost(cost)),
109
+ // Actions
110
+ import_react.default.createElement(
111
+ import_plugin_ui_kit.Flex,
112
+ {
113
+ variant: "row-center-end-nowrap-1",
114
+ style: { width: "50px", flexShrink: 0 }
115
+ },
116
+ isExecuting && onPause && import_react.default.createElement(import_plugin_ui_kit.IconButton, {
117
+ icon: "pause",
118
+ size: "xs",
119
+ variant: "clear",
120
+ onClick: () => onPause(botId),
121
+ title: "Pause"
122
+ }),
123
+ isPaused && onResume && import_react.default.createElement(import_plugin_ui_kit.IconButton, {
124
+ icon: "playArrow",
125
+ size: "xs",
126
+ variant: "clear",
127
+ onClick: () => onResume(botId),
128
+ title: "Resume"
129
+ }),
130
+ (isExecuting || isPaused) && onStop && import_react.default.createElement(import_plugin_ui_kit.IconButton, {
131
+ icon: "stop",
132
+ size: "xs",
133
+ variant: "clear",
134
+ color: "danger",
135
+ onClick: () => onStop(botId),
136
+ title: "Stop"
137
+ })
138
+ )
139
+ );
140
+ }
141
+ var bot_slot_card_default = BotSlotCard;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/ui/budget-bar.tsx
21
+ var budget_bar_exports = {};
22
+ __export(budget_bar_exports, {
23
+ BudgetBar: () => BudgetBar,
24
+ default: () => budget_bar_default
25
+ });
26
+ module.exports = __toCommonJS(budget_bar_exports);
27
+ var React = require("react");
28
+ var { Flex, Typography } = require("@fw/plugin-ui-kit");
29
+ function BudgetBar({ label, used, limit, unit }) {
30
+ const pct = limit > 0 ? Math.min(100, used / limit * 100) : 0;
31
+ const color = pct > 90 ? "var(--color-status-negative)" : pct > 70 ? "var(--color-status-caution)" : "var(--color-brand-main)";
32
+ return React.createElement(
33
+ Flex,
34
+ { variant: "column-start-start-nowrap-2", style: { width: "100%" } },
35
+ React.createElement(
36
+ Flex,
37
+ { variant: "row-center-space-between-nowrap-4" },
38
+ React.createElement(Typography, { variant: "smallCaption-regular", color: "color-text-subtle" }, label),
39
+ React.createElement(
40
+ Typography,
41
+ { variant: "smallCaption-regular", color: "color-text-subtle" },
42
+ `${used.toLocaleString()} / ${limit.toLocaleString()} ${unit}`
43
+ )
44
+ ),
45
+ React.createElement(
46
+ Flex,
47
+ {
48
+ variant: "row-start-start-nowrap-0",
49
+ style: { width: "100%", height: "4px", borderRadius: "2px", backgroundColor: "var(--color-surface-raised)", overflow: "hidden" }
50
+ },
51
+ React.createElement(Flex, {
52
+ variant: "row-start-start-nowrap-0",
53
+ style: { width: `${pct}%`, height: "100%", borderRadius: "2px", backgroundColor: color, transition: "width 0.3s" }
54
+ })
55
+ )
56
+ );
57
+ }
58
+ var budget_bar_default = BudgetBar;
59
+ module.exports = BudgetBar;
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+
3
+ // src/ui/chat-task-result.tsx
4
+ var React = require("react");
5
+ var { useState, useEffect, useCallback, useRef } = React;
6
+ var { Flex, Typography, StatusIcon, Button } = require("@fw/plugin-ui-kit");
7
+ function parseResult(result) {
8
+ try {
9
+ const parsed = typeof result === "string" ? JSON.parse(result) : result;
10
+ if (!parsed || typeof parsed !== "object") return { task: null, subtasks: [] };
11
+ const obj = parsed;
12
+ const task = obj.task ?? parsed;
13
+ const subtasks = Array.isArray(obj.subtasks) ? obj.subtasks : [];
14
+ return { task: task?.id ? task : null, subtasks };
15
+ } catch {
16
+ return { task: null, subtasks: [] };
17
+ }
18
+ }
19
+ function statusToIcon(status) {
20
+ switch (status) {
21
+ case "pending":
22
+ case "blocked":
23
+ return "pending";
24
+ case "in-progress":
25
+ return "running";
26
+ case "done":
27
+ return "completed";
28
+ case "failed":
29
+ case "cancelled":
30
+ return "failed";
31
+ default:
32
+ return "pending";
33
+ }
34
+ }
35
+ function statusLabel(status) {
36
+ switch (status) {
37
+ case "pending":
38
+ return "Pending";
39
+ case "in-progress":
40
+ return "In Progress";
41
+ case "blocked":
42
+ return "Blocked";
43
+ case "done":
44
+ return "Done";
45
+ case "failed":
46
+ return "Failed";
47
+ case "cancelled":
48
+ return "Cancelled";
49
+ default:
50
+ return status;
51
+ }
52
+ }
53
+ function isTerminal(status) {
54
+ return status === "done" || status === "failed" || status === "cancelled";
55
+ }
56
+ function ChatTaskResult({ result, args, callTool, openWorkspace }) {
57
+ const initial = parseResult(result);
58
+ const [task, setTask] = useState(initial.task);
59
+ const [subtasks, setSubtasks] = useState(initial.subtasks);
60
+ const mountedRef = useRef(true);
61
+ useEffect(() => {
62
+ mountedRef.current = true;
63
+ return () => {
64
+ mountedRef.current = false;
65
+ };
66
+ }, []);
67
+ useEffect(() => {
68
+ if (!task?.id) return;
69
+ if (isTerminal(task.status)) return;
70
+ const poll = async () => {
71
+ try {
72
+ const raw = await callTool("fw_weaver_task_get", { id: task.id });
73
+ if (!mountedRef.current) return;
74
+ const { task: updated, subtasks: updatedSubs } = parseResult(raw);
75
+ if (updated) {
76
+ setTask(updated);
77
+ if (updatedSubs.length > 0) setSubtasks(updatedSubs);
78
+ }
79
+ } catch {
80
+ }
81
+ };
82
+ const interval = setInterval(poll, 3e3);
83
+ const timeout = setTimeout(poll, 1e3);
84
+ return () => {
85
+ clearInterval(interval);
86
+ clearTimeout(timeout);
87
+ };
88
+ }, [task?.id, task?.status, callTool]);
89
+ if (!task) {
90
+ return React.createElement(
91
+ Flex,
92
+ {
93
+ variant: "row-center-start-nowrap-10",
94
+ style: {
95
+ borderRadius: "var(--border-radius-regular)",
96
+ border: "1px solid var(--color-border-default)",
97
+ backgroundColor: "var(--color-surface-low)"
98
+ }
99
+ },
100
+ React.createElement(StatusIcon, { status: "pending", size: "sm" }),
101
+ React.createElement(Typography, {
102
+ variant: "caption-thick",
103
+ color: "color-text-medium"
104
+ }, "Task created")
105
+ );
106
+ }
107
+ const doneCount = subtasks.filter((s) => s.status === "done").length;
108
+ const totalCount = subtasks.length;
109
+ const hasSubtasks = task.isParent && totalCount > 0;
110
+ const botLabel = task.currentBotId ? `Bot: ${task.currentBotId}` : task.assignedProfile ? `Profile: ${task.assignedProfile}` : null;
111
+ const handleOpenDashboard = useCallback(() => {
112
+ openWorkspace({
113
+ packId: "@synergenius/flow-weaver-pack-weaver",
114
+ taskId: task.id
115
+ });
116
+ }, [openWorkspace, task.id]);
117
+ return React.createElement(
118
+ Flex,
119
+ {
120
+ variant: "row-center-start-nowrap-10",
121
+ style: {
122
+ borderRadius: "var(--border-radius-regular)",
123
+ border: "1px solid var(--color-border-default)",
124
+ backgroundColor: "var(--color-surface-low)"
125
+ }
126
+ },
127
+ // Status icon
128
+ React.createElement(StatusIcon, {
129
+ status: statusToIcon(task.status),
130
+ size: "sm"
131
+ }),
132
+ // Title + meta column
133
+ React.createElement(
134
+ Flex,
135
+ {
136
+ variant: "column-start-start-nowrap-2",
137
+ style: { flex: 1, minWidth: 0 }
138
+ },
139
+ // Title row
140
+ React.createElement(Typography, {
141
+ variant: "caption-thick",
142
+ color: "color-text-high",
143
+ truncate: true
144
+ }, task.title),
145
+ // Status + subtask progress + bot
146
+ React.createElement(
147
+ Flex,
148
+ {
149
+ variant: "row-center-start-wrap-8"
150
+ },
151
+ // Status label
152
+ React.createElement(Typography, {
153
+ variant: "smallCaption-regular",
154
+ color: task.status === "done" ? "color-text-positive" : task.status === "failed" ? "color-text-negative" : task.status === "in-progress" ? "color-text-info" : "color-text-medium"
155
+ }, statusLabel(task.status)),
156
+ // Subtask progress
157
+ hasSubtasks && React.createElement(Typography, {
158
+ variant: "smallCaption-regular",
159
+ color: "color-text-medium"
160
+ }, `${doneCount}/${totalCount} done`),
161
+ // Bot
162
+ botLabel && React.createElement(Typography, {
163
+ variant: "smallCaption-regular",
164
+ color: "color-text-low",
165
+ truncate: true
166
+ }, botLabel)
167
+ )
168
+ ),
169
+ // Open Dashboard button
170
+ React.createElement(Button, {
171
+ size: "xs",
172
+ variant: "clear",
173
+ color: "secondary",
174
+ onClick: handleOpenDashboard
175
+ }, "Open Dashboard")
176
+ );
177
+ }
178
+ module.exports = ChatTaskResult;
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/ui/decision-log.tsx
21
+ var decision_log_exports = {};
22
+ __export(decision_log_exports, {
23
+ DecisionLog: () => DecisionLog,
24
+ default: () => decision_log_default
25
+ });
26
+ module.exports = __toCommonJS(decision_log_exports);
27
+ var React = require("react");
28
+ var {
29
+ Flex,
30
+ Typography,
31
+ ScrollArea,
32
+ Tag,
33
+ SectionTitle
34
+ } = require("@fw/plugin-ui-kit");
35
+ var methodColors = {
36
+ "exact-match": "info",
37
+ "single-eligible": "positive",
38
+ "ai-routed": "secondary",
39
+ "round-robin": "secondary",
40
+ "manual": "caution"
41
+ };
42
+ var methodLabels = {
43
+ "exact-match": "exact",
44
+ "single-eligible": "single",
45
+ "ai-routed": "ai",
46
+ "round-robin": "robin",
47
+ "manual": "manual"
48
+ };
49
+ function formatTime(ts) {
50
+ const d = new Date(ts);
51
+ return d.toLocaleTimeString("en-GB", { hour: "2-digit", minute: "2-digit", second: "2-digit" });
52
+ }
53
+ function truncate(text, max) {
54
+ return text.length > max ? text.slice(0, max - 1) + "\u2026" : text;
55
+ }
56
+ function DecisionLog({ decisions }) {
57
+ if (!decisions || decisions.length === 0) {
58
+ return React.createElement(
59
+ Flex,
60
+ {
61
+ variant: "column-stretch-start-nowrap-4"
62
+ },
63
+ React.createElement(SectionTitle, null, "Decision Log"),
64
+ React.createElement(Typography, {
65
+ variant: "smallCaption-regular",
66
+ color: "color-text-subtle"
67
+ }, "No routing decisions yet.")
68
+ );
69
+ }
70
+ const sorted = [...decisions].sort((a, b) => b.timestamp - a.timestamp);
71
+ return React.createElement(
72
+ Flex,
73
+ {
74
+ variant: "column-stretch-start-nowrap-4"
75
+ },
76
+ React.createElement(SectionTitle, null, "Decision Log"),
77
+ React.createElement(
78
+ ScrollArea,
79
+ {
80
+ style: { maxHeight: "260px" }
81
+ },
82
+ React.createElement(
83
+ Flex,
84
+ {
85
+ variant: "column-stretch-start-nowrap-0"
86
+ },
87
+ ...sorted.map((d) => {
88
+ const methodLabel = d.method === "ai-routed" && d.confidence != null ? `ai ${d.confidence}%` : methodLabels[d.method] || d.method;
89
+ return React.createElement(
90
+ Flex,
91
+ {
92
+ key: d.id,
93
+ variant: "column-stretch-start-nowrap-2",
94
+ style: {
95
+ padding: "6px 8px",
96
+ borderBottom: "1px solid var(--color-border-default)"
97
+ }
98
+ },
99
+ // Main line: time, title, instance, method
100
+ React.createElement(
101
+ Flex,
102
+ { variant: "row-center-start-nowrap-8" },
103
+ React.createElement(Typography, {
104
+ variant: "smallCaption-regular",
105
+ color: "color-text-subtle",
106
+ style: { flexShrink: 0, fontFamily: "var(--font-mono, monospace)", fontSize: "11px" }
107
+ }, formatTime(d.timestamp)),
108
+ React.createElement(Typography, {
109
+ variant: "smallCaption-regular",
110
+ color: "color-text-high",
111
+ style: { flex: 1, minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }
112
+ }, `"${truncate(d.taskTitle, 40)}"`),
113
+ React.createElement(Typography, {
114
+ variant: "smallCaption-regular",
115
+ color: "color-text-medium",
116
+ style: { flexShrink: 0 }
117
+ }, `\u2192 ${d.assignedInstanceId}`),
118
+ React.createElement(Tag, {
119
+ size: "small",
120
+ color: methodColors[d.method] || "secondary"
121
+ }, methodLabel)
122
+ ),
123
+ // Reason line
124
+ React.createElement(Typography, {
125
+ variant: "smallCaption-regular",
126
+ color: "color-text-subtle",
127
+ style: { paddingLeft: "70px" }
128
+ }, d.reason)
129
+ );
130
+ })
131
+ )
132
+ )
133
+ );
134
+ }
135
+ var decision_log_default = DecisionLog;
136
+ module.exports = DecisionLog;
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/ui/profile-card.tsx
21
+ var profile_card_exports = {};
22
+ __export(profile_card_exports, {
23
+ ProfileCard: () => ProfileCard,
24
+ default: () => profile_card_default
25
+ });
26
+ module.exports = __toCommonJS(profile_card_exports);
27
+ var React = require("react");
28
+ var {
29
+ Flex,
30
+ Typography,
31
+ Icon,
32
+ Chip,
33
+ IconButton,
34
+ Tag
35
+ } = require("@fw/plugin-ui-kit");
36
+ function ProfileCard({ profile, activeInstances, onEdit, onDelete }) {
37
+ const {
38
+ id,
39
+ name,
40
+ description,
41
+ icon,
42
+ color,
43
+ capabilities,
44
+ preferences,
45
+ maxInstances
46
+ } = profile;
47
+ const budgetParts = [];
48
+ if (preferences.maxCostPerRun) budgetParts.push(`$${preferences.maxCostPerRun.toFixed(2)}/run`);
49
+ if (preferences.maxCostPerTask) budgetParts.push(`$${preferences.maxCostPerTask.toFixed(2)}/task`);
50
+ const budgetText = budgetParts.length > 0 ? budgetParts.join(" / ") : null;
51
+ return React.createElement(
52
+ Flex,
53
+ {
54
+ variant: "column-stretch-start-nowrap-6",
55
+ style: {
56
+ padding: "10px 12px",
57
+ borderRadius: "8px",
58
+ border: "1px solid var(--color-border-default)",
59
+ backgroundColor: "var(--color-surface-elevated)"
60
+ }
61
+ },
62
+ // Row 1: Icon + Name + Edit/Delete buttons
63
+ React.createElement(
64
+ Flex,
65
+ { variant: "row-center-start-nowrap-8" },
66
+ React.createElement(
67
+ Flex,
68
+ {
69
+ variant: "row-center-center-nowrap-0",
70
+ style: { color: `var(--${color})`, flexShrink: 0 }
71
+ },
72
+ React.createElement(Icon, { name: icon || "smartToy", size: 18 })
73
+ ),
74
+ React.createElement(Typography, {
75
+ variant: "caption-thick",
76
+ color: "color-text-high",
77
+ style: { flex: 1, minWidth: 0 }
78
+ }, name),
79
+ onEdit && React.createElement(IconButton, {
80
+ icon: "edit",
81
+ size: "xs",
82
+ variant: "clear",
83
+ onClick: () => onEdit(id),
84
+ title: "Edit profile"
85
+ }),
86
+ onDelete && React.createElement(IconButton, {
87
+ icon: "delete",
88
+ size: "xs",
89
+ variant: "clear",
90
+ color: "danger",
91
+ onClick: () => onDelete(id),
92
+ title: "Delete profile"
93
+ })
94
+ ),
95
+ // Description
96
+ description && React.createElement(Typography, {
97
+ variant: "smallCaption-regular",
98
+ color: "color-text-medium"
99
+ }, description),
100
+ // Divider
101
+ React.createElement(Flex, {
102
+ variant: "row-center-start-nowrap-0",
103
+ style: { borderTop: "1px solid var(--color-border-default)", margin: "2px 0" }
104
+ }),
105
+ // Capabilities
106
+ capabilities.length > 0 && React.createElement(
107
+ Flex,
108
+ { variant: "row-center-start-wrap-4" },
109
+ React.createElement(Typography, {
110
+ variant: "smallCaption-regular",
111
+ color: "color-text-subtle",
112
+ style: { flexShrink: 0 }
113
+ }, "Capabilities:"),
114
+ ...capabilities.map(
115
+ (cap) => React.createElement(
116
+ "span",
117
+ { key: cap.name, title: cap.description },
118
+ React.createElement(Chip, { label: cap.name, size: "small", color: "color-brand-main" })
119
+ )
120
+ )
121
+ ),
122
+ // Cost strategy
123
+ React.createElement(
124
+ Flex,
125
+ { variant: "row-center-start-wrap-12" },
126
+ React.createElement(Typography, {
127
+ variant: "smallCaption-regular",
128
+ color: "color-text-subtle"
129
+ }, `Cost strategy: ${preferences.costStrategy}`)
130
+ ),
131
+ // Instances + Approval + Budget
132
+ React.createElement(
133
+ Flex,
134
+ { variant: "row-center-start-wrap-12" },
135
+ React.createElement(Typography, {
136
+ variant: "smallCaption-regular",
137
+ color: "color-text-subtle"
138
+ }, `Instances: ${activeInstances}/${maxInstances} active`),
139
+ React.createElement(Tag, {
140
+ size: "small",
141
+ color: preferences.requireApproval ? "caution" : "positive"
142
+ }, preferences.requireApproval ? "Approval required" : "Auto-approve")
143
+ ),
144
+ // Budget line
145
+ budgetText && React.createElement(Typography, {
146
+ variant: "smallCaption-regular",
147
+ color: "color-text-subtle"
148
+ }, `Budget: ${budgetText}`),
149
+ // Instructions
150
+ preferences.instructions && React.createElement(Typography, {
151
+ variant: "smallCaption-regular",
152
+ color: "color-text-subtle",
153
+ style: { fontStyle: "italic" }
154
+ }, preferences.instructions)
155
+ );
156
+ }
157
+ var profile_card_default = ProfileCard;
158
+ module.exports = ProfileCard;