@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
@@ -1,71 +0,0 @@
1
- "use strict";
2
-
3
- // src/ui/chat-bot-result.tsx
4
- var React = require("react");
5
- var { useState, useEffect, useCallback } = React;
6
- var { Flex, Typography, StatusIcon, Button, toast } = require("@fw/plugin-ui-kit");
7
- function ChatBotResult({ result, args, callTool, openWorkspace }) {
8
- const [status, setStatus] = useState("running");
9
- const [summary, setSummary] = useState(null);
10
- const parsed = typeof result === "string" ? JSON.parse(result) : result;
11
- const runId = parsed?.runId;
12
- const instruction = parsed?.instruction || args?.task || "Bot task";
13
- useEffect(() => {
14
- if (!runId || status !== "running") return;
15
- const poll = async () => {
16
- try {
17
- const s = await callTool("fw_weaver_status");
18
- if (s?.currentRunId !== runId) {
19
- const history = await callTool("fw_weaver_history", { id: runId });
20
- if (Array.isArray(history) && history.length > 0) {
21
- const run = history[0];
22
- setStatus(run.success ? "completed" : "failed");
23
- setSummary(run.summary || null);
24
- } else {
25
- setStatus("completed");
26
- }
27
- }
28
- } catch {
29
- }
30
- };
31
- const interval = setInterval(poll, 3e3);
32
- poll();
33
- return () => clearInterval(interval);
34
- }, [runId, status, callTool]);
35
- return React.createElement(
36
- Flex,
37
- {
38
- variant: "row-center-start-nowrap-10",
39
- style: {
40
- padding: "8px 12px",
41
- borderRadius: "var(--border-radius-regular)",
42
- border: "1px solid var(--color-border-default)",
43
- backgroundColor: "var(--color-surface-low)"
44
- }
45
- },
46
- React.createElement(StatusIcon, {
47
- status: status === "running" ? "running" : status === "completed" ? "completed" : "failed",
48
- size: "sm"
49
- }),
50
- React.createElement(
51
- Flex,
52
- { variant: "column-start-start-nowrap-2", style: { flex: 1, minWidth: 0 } },
53
- React.createElement(Typography, {
54
- variant: "caption-thick",
55
- color: "color-text-high",
56
- style: { overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }
57
- }, instruction),
58
- summary && React.createElement(Typography, {
59
- variant: "smallCaption-regular",
60
- color: "color-text-medium"
61
- }, summary)
62
- ),
63
- React.createElement(Button, {
64
- size: "xs",
65
- variant: "clear",
66
- color: "secondary",
67
- onClick: () => openWorkspace({ runId, packId: "@synergenius/flow-weaver-pack-weaver", live: status === "running" })
68
- }, "Open")
69
- );
70
- }
71
- module.exports = ChatBotResult;
@@ -1,82 +0,0 @@
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/queue-input.tsx
21
- var queue_input_exports = {};
22
- __export(queue_input_exports, {
23
- QueueInput: () => QueueInput,
24
- default: () => queue_input_default
25
- });
26
- module.exports = __toCommonJS(queue_input_exports);
27
- var React = require("react");
28
- var { useState, useCallback } = React;
29
- var { Flex, IconButton, Input, toast } = require("@fw/plugin-ui-kit");
30
- function QueueInput({ callTool, onTaskAdded }) {
31
- const [newTask, setNewTask] = useState("");
32
- const [adding, setAdding] = useState(false);
33
- const handleAdd = useCallback(async () => {
34
- const instruction = newTask.trim();
35
- if (!instruction) return;
36
- setAdding(true);
37
- try {
38
- await callTool("fw_weaver_queue", { action: "add", task: instruction });
39
- setNewTask("");
40
- onTaskAdded?.();
41
- toast("Task added to queue", { type: "success" });
42
- } catch (err) {
43
- toast(err instanceof Error ? err.message : "Failed to add task", { type: "error" });
44
- }
45
- setAdding(false);
46
- }, [callTool, newTask, onTaskAdded]);
47
- return React.createElement(
48
- Flex,
49
- {
50
- variant: "row-center-start-nowrap-6",
51
- style: {
52
- flexShrink: 0,
53
- padding: "8px 16px",
54
- borderTop: "1px solid var(--color-border-default)",
55
- width: "100%",
56
- boxSizing: "border-box"
57
- }
58
- },
59
- React.createElement(Input, {
60
- type: "text",
61
- size: "medium",
62
- placeholder: "Add a task...",
63
- value: newTask,
64
- onChange: setNewTask,
65
- onEnter: handleAdd,
66
- disabled: adding,
67
- defaultBoxStyle: { flex: 1, minWidth: 0 },
68
- inputBoxStyle: { maxWidth: "none" }
69
- }),
70
- React.createElement(IconButton, {
71
- icon: "add",
72
- size: "md",
73
- variant: "fill",
74
- color: "primary",
75
- "aria-label": "Add task",
76
- onClick: handleAdd,
77
- loading: adding,
78
- disabled: adding || !newTask.trim()
79
- })
80
- );
81
- }
82
- var queue_input_default = QueueInput;
@@ -1,174 +0,0 @@
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/session-bar.tsx
21
- var session_bar_exports = {};
22
- __export(session_bar_exports, {
23
- SessionBar: () => SessionBar,
24
- default: () => session_bar_default
25
- });
26
- module.exports = __toCommonJS(session_bar_exports);
27
- var React = require("react");
28
- var { useState, useEffect, useCallback, useRef } = React;
29
- var { Flex, Typography, Icon, Button, Badge, toast, formatDuration, formatCost } = require("@fw/plugin-ui-kit");
30
- function SessionBar({ callTool, dispatchEvent }) {
31
- const [session, setSession] = useState(null);
32
- const [elapsed, setElapsed] = useState(0);
33
- const [starting, setStarting] = useState(false);
34
- const [stopping, setStopping] = useState(false);
35
- const [pausing, setPausing] = useState(false);
36
- const prevActiveRef = useRef(false);
37
- const pollStatus = useCallback(async () => {
38
- try {
39
- const result = await callTool("fw_weaver_session", { action: "status" });
40
- const isActive2 = result.status !== "no active session" && result.status !== "idle";
41
- setSession(isActive2 ? result : null);
42
- if (prevActiveRef.current && !isActive2) {
43
- dispatchEvent("fw:refresh-bot-workspace");
44
- }
45
- prevActiveRef.current = isActive2;
46
- } catch {
47
- }
48
- }, [callTool, dispatchEvent]);
49
- useEffect(() => {
50
- pollStatus();
51
- const interval = setInterval(pollStatus, 5e3);
52
- return () => clearInterval(interval);
53
- }, [pollStatus]);
54
- useEffect(() => {
55
- if (!session?.startedAt || session.status === "idle") return;
56
- const tick = () => setElapsed(Date.now() - (session.startedAt ?? Date.now()));
57
- tick();
58
- const interval = setInterval(tick, 1e3);
59
- return () => clearInterval(interval);
60
- }, [session?.startedAt, session?.status]);
61
- const [startError, setStartError] = useState(null);
62
- const handleStart = useCallback(async () => {
63
- setStarting(true);
64
- setStartError(null);
65
- try {
66
- const result = await callTool("fw_weaver_session", { action: "start" });
67
- const data = result;
68
- if (data?.error) {
69
- setStartError(data.error);
70
- toast(data.error, { type: "error" });
71
- setStarting(false);
72
- return;
73
- }
74
- toast("Session started", { type: "success" });
75
- dispatchEvent("fw:refresh-bot-workspace");
76
- await pollStatus();
77
- } catch (err) {
78
- const msg = err instanceof Error ? err.message : "Failed to start session";
79
- setStartError(msg);
80
- toast(msg, { type: "error" });
81
- }
82
- setStarting(false);
83
- }, [callTool, pollStatus, dispatchEvent]);
84
- const handleStop = useCallback(async () => {
85
- setStopping(true);
86
- try {
87
- await callTool("fw_weaver_session", { action: "stop" });
88
- toast("Session ended", { type: "info" });
89
- await pollStatus();
90
- } catch (err) {
91
- toast(err instanceof Error ? err.message : "Failed to stop session", { type: "error" });
92
- }
93
- setStopping(false);
94
- }, [callTool, pollStatus]);
95
- const handlePause = useCallback(async () => {
96
- setPausing(true);
97
- try {
98
- await callTool("fw_weaver_steer", { command: "pause" });
99
- toast("Session paused", { type: "info" });
100
- } catch (err) {
101
- toast(err instanceof Error ? err.message : "Failed to pause session", { type: "error" });
102
- }
103
- setPausing(false);
104
- }, [callTool]);
105
- const isActive = session && session.status !== "idle" && session.status !== "no active session";
106
- if (!isActive) {
107
- return React.createElement(
108
- Flex,
109
- {
110
- variant: "row-center-space-between-nowrap-10",
111
- style: { flexShrink: 0, padding: "8px 16px", backgroundColor: "transparent", borderBottom: "1px solid var(--color-border-default)" }
112
- },
113
- React.createElement(Icon, { name: "smartToy", size: 14, color: "color-text-subtle" }),
114
- React.createElement(
115
- Flex,
116
- { variant: "row-center-start-nowrap-12", style: { flex: 1, fontSize: "12px" } },
117
- React.createElement(Typography, {
118
- variant: "caption-regular",
119
- color: startError ? "color-status-negative" : "color-text-subtle"
120
- }, startError ?? "No active session")
121
- ),
122
- React.createElement(
123
- Flex,
124
- { variant: "row-center-start-nowrap-6", style: { flexShrink: 0 } },
125
- React.createElement(Button, {
126
- size: "sm",
127
- variant: "clear",
128
- onClick: handleStart,
129
- loading: starting,
130
- disabled: starting
131
- }, "Start Session")
132
- )
133
- );
134
- }
135
- return React.createElement(
136
- Flex,
137
- {
138
- variant: "row-center-space-between-nowrap-10",
139
- style: { flexShrink: 0, padding: "8px 16px", backgroundColor: "var(--color-brand-main-alpha-10)", borderBottom: "1px solid var(--color-brand-main)" }
140
- },
141
- React.createElement(Badge, { variant: "success" }, "Session"),
142
- React.createElement(
143
- Flex,
144
- {
145
- variant: "row-center-start-nowrap-12",
146
- style: { flex: 1, fontSize: "12px", color: "var(--color-text-medium)" }
147
- },
148
- session.completedTasks != null && React.createElement("span", null, `${session.completedTasks} tasks done`),
149
- session.totalCost != null && session.totalCost > 0 && React.createElement("span", null, formatCost(session.totalCost)),
150
- session.startedAt && React.createElement("span", null, `${formatDuration(elapsed)} elapsed`),
151
- session.currentTask && React.createElement("span", { style: { opacity: 0.7 } }, `\xB7 ${session.currentTask}`)
152
- ),
153
- React.createElement(
154
- Flex,
155
- { variant: "row-center-start-nowrap-6", style: { flexShrink: 0 } },
156
- React.createElement(Button, {
157
- size: "sm",
158
- variant: "clear",
159
- onClick: handlePause,
160
- loading: pausing,
161
- disabled: pausing || stopping
162
- }, "Pause"),
163
- React.createElement(Button, {
164
- size: "sm",
165
- variant: "clear",
166
- color: "danger",
167
- onClick: handleStop,
168
- loading: stopping,
169
- disabled: stopping || pausing
170
- }, "End")
171
- )
172
- );
173
- }
174
- var session_bar_default = SessionBar;
@@ -1,4 +0,0 @@
1
- /**
2
- * @deprecated Use error-classifier.ts instead. This file re-exports for backward compatibility.
3
- */
4
- export { getErrorGuidance } from './error-classifier.js';
@@ -1,4 +0,0 @@
1
- /**
2
- * @deprecated Use error-classifier.ts instead. This file re-exports for backward compatibility.
3
- */
4
- export { isTransientError, withRetry } from './error-classifier.js';
@@ -1,116 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
- import * as os from 'node:os';
4
- import * as crypto from 'node:crypto';
5
- import { withFileLock } from './file-lock.js';
6
-
7
- export interface SessionState {
8
- sessionId: string;
9
- status: 'idle' | 'planning' | 'executing' | 'validating' | 'waiting-approval' | 'paused' | 'fixing';
10
- currentTask: string | null;
11
- /** The runId of the currently executing task (for SSE streaming). */
12
- currentRunId?: string | null;
13
- completedTasks: number;
14
- totalCost: number;
15
- startedAt: number;
16
- lastActivity: number;
17
- }
18
-
19
- export class SessionStore {
20
- private filePath: string;
21
-
22
- constructor(dir?: string) {
23
- const base = dir ?? path.join(os.homedir(), '.weaver');
24
- this.filePath = path.join(base, 'session.json');
25
- }
26
-
27
- async create(): Promise<SessionState> {
28
- const state: SessionState = {
29
- sessionId: crypto.randomUUID().slice(0, 8),
30
- status: 'idle',
31
- currentTask: null,
32
- completedTasks: 0,
33
- totalCost: 0,
34
- startedAt: Date.now(),
35
- lastActivity: Date.now(),
36
- };
37
- await this.save(state);
38
- return state;
39
- }
40
-
41
- load(): SessionState | null {
42
- try {
43
- if (!fs.existsSync(this.filePath)) return null;
44
- return JSON.parse(fs.readFileSync(this.filePath, 'utf-8')) as SessionState;
45
- } catch (err) {
46
- if (process.env.WEAVER_VERBOSE) process.stderr.write(`[weaver] session state load failed: ${err}\n`);
47
- // Try backup recovery
48
- return this.loadBackup();
49
- }
50
- }
51
-
52
- /** Recover session from backup file when primary is corrupt. */
53
- private loadBackup(): SessionState | null {
54
- const backupPath = this.filePath + '.bak';
55
- if (!fs.existsSync(backupPath)) return null;
56
- try {
57
- const data = JSON.parse(fs.readFileSync(backupPath, 'utf-8')) as SessionState;
58
- // Restore backup to primary
59
- try { this.writeAtomic(data); } catch { /* best effort */ }
60
- return data;
61
- } catch (err) {
62
- if (process.env.WEAVER_VERBOSE) process.stderr.write(`[weaver] session backup load failed: ${err}\n`);
63
- return null;
64
- }
65
- }
66
-
67
- async save(state: SessionState): Promise<void> {
68
- return withFileLock(this.filePath, () => {
69
- state.lastActivity = Date.now();
70
- this.writeAtomic(state);
71
- });
72
- }
73
-
74
- async update(patch: Partial<SessionState>): Promise<SessionState | null> {
75
- return withFileLock(this.filePath, () => {
76
- const state = this.load();
77
- if (!state) return null;
78
- Object.assign(state, patch);
79
- state.lastActivity = Date.now();
80
- this.writeAtomic(state);
81
- return state;
82
- });
83
- }
84
-
85
- clear(): void {
86
- try {
87
- fs.unlinkSync(this.filePath);
88
- } catch (err) {
89
- if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;
90
- }
91
- }
92
-
93
- /** Atomic write: write to temp file, backup existing, rename into place. */
94
- private writeAtomic(state: SessionState): void {
95
- const dir = path.dirname(this.filePath);
96
- if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
97
-
98
- const tmpPath = this.filePath + `.tmp.${process.pid}`;
99
- const backupPath = this.filePath + '.bak';
100
- const content = JSON.stringify(state, null, 2);
101
-
102
- // Write to temp file first
103
- fs.writeFileSync(tmpPath, content, 'utf-8');
104
-
105
- // Backup current file if it exists
106
- if (fs.existsSync(this.filePath)) {
107
- try { fs.copyFileSync(this.filePath, backupPath); } catch { /* best effort */ }
108
- }
109
-
110
- // Atomic rename
111
- fs.renameSync(tmpPath, this.filePath);
112
-
113
- // Update backup after successful write
114
- try { fs.copyFileSync(this.filePath, backupPath); } catch { /* best effort */ }
115
- }
116
- }