@synergenius/flow-weaver-pack-weaver 0.9.4 → 0.9.6

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 (35) hide show
  1. package/dist/bot/assistant-core.d.ts +2 -0
  2. package/dist/bot/assistant-core.d.ts.map +1 -1
  3. package/dist/bot/assistant-core.js +130 -17
  4. package/dist/bot/assistant-core.js.map +1 -1
  5. package/dist/bot/conversation-store.d.ts +1 -0
  6. package/dist/bot/conversation-store.d.ts.map +1 -1
  7. package/dist/bot/conversation-store.js +32 -0
  8. package/dist/bot/conversation-store.js.map +1 -1
  9. package/dist/bot/response-formatter.d.ts +15 -0
  10. package/dist/bot/response-formatter.d.ts.map +1 -0
  11. package/dist/bot/response-formatter.js +40 -0
  12. package/dist/bot/response-formatter.js.map +1 -0
  13. package/dist/bot/rich-input.d.ts +39 -0
  14. package/dist/bot/rich-input.d.ts.map +1 -0
  15. package/dist/bot/rich-input.js +308 -0
  16. package/dist/bot/rich-input.js.map +1 -0
  17. package/dist/bot/slash-commands.d.ts +20 -0
  18. package/dist/bot/slash-commands.d.ts.map +1 -0
  19. package/dist/bot/slash-commands.js +93 -0
  20. package/dist/bot/slash-commands.js.map +1 -0
  21. package/dist/cli-handlers.d.ts +1 -0
  22. package/dist/cli-handlers.d.ts.map +1 -1
  23. package/dist/cli-handlers.js +103 -2
  24. package/dist/cli-handlers.js.map +1 -1
  25. package/dist/node-types/agent-execute.js +15 -3
  26. package/dist/node-types/agent-execute.js.map +1 -1
  27. package/flowweaver.manifest.json +1 -1
  28. package/package.json +1 -1
  29. package/src/bot/assistant-core.ts +131 -19
  30. package/src/bot/conversation-store.ts +32 -0
  31. package/src/bot/response-formatter.ts +42 -0
  32. package/src/bot/rich-input.ts +307 -0
  33. package/src/bot/slash-commands.ts +114 -0
  34. package/src/cli-handlers.ts +105 -3
  35. package/src/node-types/agent-execute.ts +17 -4
@@ -0,0 +1,308 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import * as os from 'node:os';
4
+ import * as readline from 'node:readline';
5
+ export class RichInput {
6
+ history = [];
7
+ historyIndex = -1;
8
+ currentLine = '';
9
+ cursorPos = 0;
10
+ multiLineBuffer = [];
11
+ searchMode = false;
12
+ searchQuery = '';
13
+ ctrlCCount = 0;
14
+ prompt;
15
+ historyFile;
16
+ completionProvider;
17
+ maxHistory;
18
+ constructor(opts = {}) {
19
+ this.prompt = opts.prompt ?? '❯ ';
20
+ this.historyFile = opts.historyFile ?? path.join(os.homedir(), '.weaver', 'input-history.txt');
21
+ this.completionProvider = opts.completionProvider;
22
+ this.maxHistory = opts.maxHistorySize ?? 500;
23
+ this.loadHistory();
24
+ }
25
+ async getInput() {
26
+ // Non-TTY fallback
27
+ if (!process.stdin.isTTY) {
28
+ return this.getInputReadline();
29
+ }
30
+ return new Promise((resolve) => {
31
+ this.ctrlCCount = 0;
32
+ this.historyIndex = -1;
33
+ this.currentLine = '';
34
+ this.cursorPos = 0;
35
+ this.searchMode = false;
36
+ process.stdin.setRawMode(true);
37
+ process.stdin.resume();
38
+ const handler = (key) => {
39
+ this.handleKey(key, (result) => {
40
+ process.stdin.setRawMode(false);
41
+ process.stdin.pause();
42
+ process.stdin.removeListener('data', handler);
43
+ resolve(result);
44
+ });
45
+ };
46
+ process.stdin.on('data', handler);
47
+ this.renderPrompt();
48
+ });
49
+ }
50
+ resetCtrlC() {
51
+ this.ctrlCCount = 0;
52
+ }
53
+ handleKey(key, resolve) {
54
+ const s = key.toString();
55
+ // Handle search mode separately
56
+ if (this.searchMode) {
57
+ this.handleSearchKey(s, resolve);
58
+ return;
59
+ }
60
+ if (s === '\r' || s === '\n') {
61
+ this.handleEnter(resolve);
62
+ }
63
+ else if (s === '\x03') { // Ctrl+C
64
+ this.ctrlCCount++;
65
+ if (this.ctrlCCount >= 2 || this.currentLine === '') {
66
+ process.stderr.write('\n');
67
+ resolve(null);
68
+ }
69
+ else {
70
+ this.currentLine = '';
71
+ this.cursorPos = 0;
72
+ process.stderr.write('\n');
73
+ this.renderPrompt();
74
+ }
75
+ }
76
+ else if (s === '\x0c') { // Ctrl+L
77
+ process.stderr.write('\x1b[2J\x1b[H'); // clear screen + move to top
78
+ this.renderPrompt();
79
+ }
80
+ else if (s === '\x12') { // Ctrl+R
81
+ this.searchMode = true;
82
+ this.searchQuery = '';
83
+ this.renderSearchPrompt();
84
+ }
85
+ else if (s === '\x09') { // Tab
86
+ this.handleTab();
87
+ }
88
+ else if (s === '\x1b[A') { // Arrow Up
89
+ this.historyUp();
90
+ }
91
+ else if (s === '\x1b[B') { // Arrow Down
92
+ this.historyDown();
93
+ }
94
+ else if (s === '\x1b[C') { // Arrow Right
95
+ if (this.cursorPos < this.currentLine.length) {
96
+ this.cursorPos++;
97
+ process.stderr.write('\x1b[C');
98
+ }
99
+ }
100
+ else if (s === '\x1b[D') { // Arrow Left
101
+ if (this.cursorPos > 0) {
102
+ this.cursorPos--;
103
+ process.stderr.write('\x1b[D');
104
+ }
105
+ }
106
+ else if (s === '\x7f' || s === '\b') { // Backspace
107
+ if (this.cursorPos > 0) {
108
+ this.currentLine = this.currentLine.slice(0, this.cursorPos - 1) + this.currentLine.slice(this.cursorPos);
109
+ this.cursorPos--;
110
+ this.renderPrompt();
111
+ }
112
+ }
113
+ else if (s === '\x1b[3~') { // Delete
114
+ if (this.cursorPos < this.currentLine.length) {
115
+ this.currentLine = this.currentLine.slice(0, this.cursorPos) + this.currentLine.slice(this.cursorPos + 1);
116
+ this.renderPrompt();
117
+ }
118
+ }
119
+ else if (s === '\x01') { // Ctrl+A (home)
120
+ this.cursorPos = 0;
121
+ this.renderPrompt();
122
+ }
123
+ else if (s === '\x05') { // Ctrl+E (end)
124
+ this.cursorPos = this.currentLine.length;
125
+ this.renderPrompt();
126
+ }
127
+ else if (s === '\x15') { // Ctrl+U (clear line)
128
+ this.currentLine = '';
129
+ this.cursorPos = 0;
130
+ this.renderPrompt();
131
+ }
132
+ else if (s >= ' ' && s.length === 1) { // Printable
133
+ this.ctrlCCount = 0;
134
+ this.currentLine = this.currentLine.slice(0, this.cursorPos) + s + this.currentLine.slice(this.cursorPos);
135
+ this.cursorPos++;
136
+ this.renderPrompt();
137
+ }
138
+ else if (s.length > 1 && !s.startsWith('\x1b')) {
139
+ // Pasted text (multiple chars at once)
140
+ this.ctrlCCount = 0;
141
+ this.currentLine = this.currentLine.slice(0, this.cursorPos) + s + this.currentLine.slice(this.cursorPos);
142
+ this.cursorPos += s.length;
143
+ this.renderPrompt();
144
+ }
145
+ }
146
+ handleEnter(resolve) {
147
+ const fullLine = this.multiLineBuffer.length > 0
148
+ ? [...this.multiLineBuffer, this.currentLine].join('\n')
149
+ : this.currentLine;
150
+ // Check for multi-line continuation
151
+ if (this.isIncomplete(fullLine)) {
152
+ this.multiLineBuffer.push(this.currentLine);
153
+ this.currentLine = '';
154
+ this.cursorPos = 0;
155
+ process.stderr.write('\n');
156
+ process.stderr.write(' ... ');
157
+ return;
158
+ }
159
+ process.stderr.write('\n');
160
+ const trimmed = fullLine.trim();
161
+ if (trimmed) {
162
+ this.addToHistory(trimmed);
163
+ }
164
+ this.multiLineBuffer = [];
165
+ this.currentLine = '';
166
+ this.cursorPos = 0;
167
+ resolve(trimmed || null);
168
+ }
169
+ isIncomplete(text) {
170
+ const backticks = (text.match(/```/g) || []).length;
171
+ if (backticks % 2 !== 0)
172
+ return true;
173
+ if (text.endsWith('\\'))
174
+ return true;
175
+ return false;
176
+ }
177
+ historyUp() {
178
+ if (this.history.length === 0)
179
+ return;
180
+ if (this.historyIndex < this.history.length - 1) {
181
+ this.historyIndex++;
182
+ this.currentLine = this.history[this.history.length - 1 - this.historyIndex];
183
+ this.cursorPos = this.currentLine.length;
184
+ this.renderPrompt();
185
+ }
186
+ }
187
+ historyDown() {
188
+ if (this.historyIndex > 0) {
189
+ this.historyIndex--;
190
+ this.currentLine = this.history[this.history.length - 1 - this.historyIndex];
191
+ this.cursorPos = this.currentLine.length;
192
+ this.renderPrompt();
193
+ }
194
+ else if (this.historyIndex === 0) {
195
+ this.historyIndex = -1;
196
+ this.currentLine = '';
197
+ this.cursorPos = 0;
198
+ this.renderPrompt();
199
+ }
200
+ }
201
+ handleTab() {
202
+ if (!this.completionProvider)
203
+ return;
204
+ const candidates = this.completionProvider(this.currentLine);
205
+ if (candidates.length === 0)
206
+ return;
207
+ if (candidates.length === 1) {
208
+ this.currentLine = candidates[0];
209
+ this.cursorPos = this.currentLine.length;
210
+ this.renderPrompt();
211
+ }
212
+ else {
213
+ // Show candidates below, then redraw prompt
214
+ process.stderr.write('\n ' + candidates.join(' ') + '\n');
215
+ this.renderPrompt();
216
+ }
217
+ }
218
+ handleSearchKey(s, resolve) {
219
+ if (s === '\x1b' || s === '\x03') { // Esc or Ctrl+C — cancel search
220
+ this.searchMode = false;
221
+ this.renderPrompt();
222
+ }
223
+ else if (s === '\r' || s === '\n') { // Enter — accept match
224
+ this.searchMode = false;
225
+ const match = this.searchHistory(this.searchQuery);
226
+ if (match) {
227
+ this.currentLine = match;
228
+ this.cursorPos = this.currentLine.length;
229
+ }
230
+ this.renderPrompt();
231
+ }
232
+ else if (s === '\x7f' || s === '\b') { // Backspace
233
+ this.searchQuery = this.searchQuery.slice(0, -1);
234
+ this.renderSearchPrompt();
235
+ }
236
+ else if (s >= ' ' && s.length === 1) {
237
+ this.searchQuery += s;
238
+ this.renderSearchPrompt();
239
+ }
240
+ }
241
+ searchHistory(query) {
242
+ if (!query)
243
+ return null;
244
+ const lower = query.toLowerCase();
245
+ for (let i = this.history.length - 1; i >= 0; i--) {
246
+ if (this.history[i].toLowerCase().includes(lower))
247
+ return this.history[i];
248
+ }
249
+ return null;
250
+ }
251
+ renderPrompt() {
252
+ process.stderr.write(`\r\x1b[K${this.prompt}${this.currentLine}`);
253
+ // Move cursor to correct position
254
+ const offset = this.currentLine.length - this.cursorPos;
255
+ if (offset > 0)
256
+ process.stderr.write(`\x1b[${offset}D`);
257
+ }
258
+ renderSearchPrompt() {
259
+ const match = this.searchHistory(this.searchQuery) ?? '';
260
+ process.stderr.write(`\r\x1b[K\x1b[2m(search): ${this.searchQuery}\x1b[0m ${match}`);
261
+ }
262
+ addToHistory(line) {
263
+ // Don't add duplicates of the last entry
264
+ if (this.history.length > 0 && this.history[this.history.length - 1] === line)
265
+ return;
266
+ this.history.push(line);
267
+ if (this.history.length > this.maxHistory)
268
+ this.history.shift();
269
+ this.saveHistory();
270
+ }
271
+ loadHistory() {
272
+ try {
273
+ if (fs.existsSync(this.historyFile)) {
274
+ this.history = fs.readFileSync(this.historyFile, 'utf-8')
275
+ .split('\n')
276
+ .filter(Boolean)
277
+ .slice(-this.maxHistory);
278
+ }
279
+ }
280
+ catch { /* history not available */ }
281
+ }
282
+ saveHistory() {
283
+ try {
284
+ const dir = path.dirname(this.historyFile);
285
+ if (!fs.existsSync(dir))
286
+ fs.mkdirSync(dir, { recursive: true });
287
+ fs.writeFileSync(this.historyFile, this.history.join('\n') + '\n');
288
+ }
289
+ catch { /* non-fatal */ }
290
+ }
291
+ async getInputReadline() {
292
+ const rl = readline.createInterface({ input: process.stdin, output: process.stderr, prompt: this.prompt });
293
+ return new Promise((resolve) => {
294
+ rl.prompt();
295
+ rl.once('line', (line) => { rl.close(); resolve(line.trim() || null); });
296
+ rl.once('close', () => resolve(null));
297
+ });
298
+ }
299
+ destroy() {
300
+ if (process.stdin.isTTY) {
301
+ try {
302
+ process.stdin.setRawMode(false);
303
+ }
304
+ catch { }
305
+ }
306
+ }
307
+ }
308
+ //# sourceMappingURL=rich-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rich-input.js","sourceRoot":"","sources":["../../src/bot/rich-input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ToolExecutor } from '@synergenius/flow-weaver/agent';
2
+ export interface SlashContext {
3
+ executor: ToolExecutor;
4
+ out: (s: string) => void;
5
+ projectDir: string;
6
+ conversationId?: string;
7
+ onClear?: () => void;
8
+ onExit?: () => void;
9
+ onNew?: () => void;
10
+ onVerbose?: () => void;
11
+ }
12
+ export interface SlashCommand {
13
+ name: string;
14
+ description: string;
15
+ handler: (ctx: SlashContext, args: string) => Promise<void>;
16
+ }
17
+ export declare const SLASH_COMMANDS: SlashCommand[];
18
+ export declare function getSlashCompletions(partial: string): string[];
19
+ export declare function handleSlashCommand(input: string, ctx: SlashContext): Promise<boolean>;
20
+ //# sourceMappingURL=slash-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slash-commands.d.ts","sourceRoot":"","sources":["../../src/bot/slash-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D;AAED,eAAO,MAAM,cAAc,EAAE,YAAY,EA2ExC,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAK7D;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,OAAO,CAAC,CAMlB"}
@@ -0,0 +1,93 @@
1
+ import { c } from './ansi.js';
2
+ export const SLASH_COMMANDS = [
3
+ {
4
+ name: '/help',
5
+ description: 'Show available commands',
6
+ handler: async (ctx) => {
7
+ ctx.out('\n Available commands:\n');
8
+ for (const cmd of SLASH_COMMANDS) {
9
+ ctx.out(` ${c.cyan(cmd.name.padEnd(12))} ${c.dim(cmd.description)}\n`);
10
+ }
11
+ ctx.out('\n');
12
+ },
13
+ },
14
+ {
15
+ name: '/status',
16
+ description: 'Show bots, queue, and conversation summary',
17
+ handler: async (ctx) => {
18
+ const bots = await ctx.executor('bot_list', {});
19
+ const summary = await ctx.executor('conversation_summary', {});
20
+ ctx.out(`\n ${bots.result}\n ${summary.result}\n\n`);
21
+ },
22
+ },
23
+ {
24
+ name: '/bots',
25
+ description: 'List running bots',
26
+ handler: async (ctx) => {
27
+ const result = await ctx.executor('bot_list', {});
28
+ ctx.out(`\n ${result.result}\n\n`);
29
+ },
30
+ },
31
+ {
32
+ name: '/clear',
33
+ description: 'Clear screen and start new conversation',
34
+ handler: async (ctx) => {
35
+ process.stderr.write('\x1b[2J\x1b[H');
36
+ ctx.onClear?.();
37
+ },
38
+ },
39
+ {
40
+ name: '/exit',
41
+ description: 'Exit the assistant',
42
+ handler: async (ctx) => {
43
+ ctx.onExit?.();
44
+ },
45
+ },
46
+ {
47
+ name: '/new',
48
+ description: 'Start a new conversation',
49
+ handler: async (ctx) => {
50
+ ctx.onNew?.();
51
+ ctx.out(`\n ${c.dim('New conversation started.')}\n\n`);
52
+ },
53
+ },
54
+ {
55
+ name: '/list',
56
+ description: 'List saved conversations',
57
+ handler: async (ctx) => {
58
+ const result = await ctx.executor('conversation_list', {});
59
+ ctx.out(`\n ${result.result}\n\n`);
60
+ },
61
+ },
62
+ {
63
+ name: '/verbose',
64
+ description: 'Toggle verbose mode (show AI thinking)',
65
+ handler: async (ctx) => {
66
+ ctx.onVerbose?.();
67
+ },
68
+ },
69
+ {
70
+ name: '/history',
71
+ description: 'Show conversation history summary',
72
+ handler: async (ctx) => {
73
+ const result = await ctx.executor('conversation_summary', {});
74
+ ctx.out(`\n ${result.result}\n\n`);
75
+ },
76
+ },
77
+ ];
78
+ export function getSlashCompletions(partial) {
79
+ if (!partial.startsWith('/'))
80
+ return [];
81
+ return SLASH_COMMANDS
82
+ .filter(cmd => cmd.name.startsWith(partial))
83
+ .map(cmd => cmd.name);
84
+ }
85
+ export async function handleSlashCommand(input, ctx) {
86
+ const [name, ...rest] = input.split(' ');
87
+ const cmd = SLASH_COMMANDS.find(c => c.name === name);
88
+ if (!cmd)
89
+ return false;
90
+ await cmd.handler(ctx, rest.join(' '));
91
+ return true;
92
+ }
93
+ //# sourceMappingURL=slash-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../src/bot/slash-commands.ts"],"names":[],"mappings":"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"}
@@ -42,6 +42,7 @@ export interface ParsedArgs {
42
42
  assistantResume?: string;
43
43
  assistantList?: boolean;
44
44
  assistantDelete?: string;
45
+ assistantWatch?: string;
45
46
  }
46
47
  export declare function parseArgs(argv: string[]): ParsedArgs;
47
48
  export declare function formatDuration(ms: number): string;
@@ -1 +1 @@
1
- {"version":3,"file":"cli-handlers.d.ts","sourceRoot":"","sources":["../src/cli-handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-handlers.d.ts","sourceRoot":"","sources":["../src/cli-handlers.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import * as path from 'node:path';
2
2
  import * as fs from 'node:fs';
3
+ import * as os from 'node:os';
3
4
  import { fileURLToPath } from 'node:url';
4
5
  import { runWorkflow } from './bot/runner.js';
5
6
  import { RunStore } from './bot/run-store.js';
@@ -250,6 +251,10 @@ export function parseArgs(argv) {
250
251
  else if (arg === '--watch') {
251
252
  result.genesisWatch = true;
252
253
  }
254
+ else if (arg === '--watch-dir' && i + 1 < args.length) {
255
+ i++;
256
+ result.assistantWatch = args[i];
257
+ }
253
258
  else if (arg === '--new') {
254
259
  result.assistantNew = true;
255
260
  }
@@ -1031,6 +1036,41 @@ export async function handleEject(opts) {
1031
1036
  console.log(`[weaver] Metadata written to ${metaPath}`);
1032
1037
  console.log('[weaver] You can now customize the ejected workflow(s) freely.');
1033
1038
  console.log('[weaver] The bot will use local files when available.');
1039
+ // Generate CUSTOMIZATION.md guide
1040
+ const customizationGuide = `# Customizing Your Weaver Bot
1041
+
1042
+ ## What You Got
1043
+ ${results.map(r => `- ${r.file} — ${r.workflow} workflow (${r.nodeTypes.length} node types)`).join('\n')}
1044
+
1045
+ You can edit these files freely. Weaver will use your local versions.
1046
+
1047
+ ## Safe Changes
1048
+ - Add a notification node (Slack, Discord, email) after git-ops
1049
+ - Change approval mode: edit the @node approve line
1050
+ - Add custom validation: insert a node between agent and gitOps
1051
+ - Modify the system prompt: edit system-prompt.ts
1052
+ - Add new tools: create a node type and wire it in
1053
+
1054
+ ## How to Add a Node
1055
+ 1. Create a new file: my-node.ts with @flowWeaver nodeType annotation
1056
+ 2. Import it in the workflow file
1057
+ 3. Add: @node myNode myNodeType [color: "blue"] [icon: "star"]
1058
+ 4. Wire it: @connect existingNode.output -> myNode.input
1059
+ 5. Compile: flow-weaver compile <workflow-file>
1060
+
1061
+ ## How to Test
1062
+ flow-weaver validate <workflow-file> # check for errors
1063
+ flow-weaver diagram <workflow-file> # visualize the DAG
1064
+ weaver bot "test task" --auto-approve # run a test task
1065
+
1066
+ ## Learn More
1067
+ weaver examples # see what's possible
1068
+ weaver doctor # check your setup
1069
+ flow-weaver docs concepts # Flow Weaver documentation
1070
+ `;
1071
+ const customPath = path.resolve(destDir, 'CUSTOMIZATION.md');
1072
+ fs.writeFileSync(customPath, customizationGuide, 'utf-8');
1073
+ console.log(`[weaver] Generated ${customPath}`);
1034
1074
  }
1035
1075
  export async function handleRun(opts) {
1036
1076
  if (!opts.file) {
@@ -1432,6 +1472,32 @@ export async function handleSession(opts) {
1432
1472
  }
1433
1473
  catch { /* non-fatal */ }
1434
1474
  }
1475
+ // Webhook notification if configured
1476
+ if (config?.notify) {
1477
+ try {
1478
+ const webhookUrl = typeof config.notify === 'string' ? config.notify
1479
+ : typeof config.notify === 'object' && 'webhook' in config.notify ? config.notify.webhook
1480
+ : null;
1481
+ if (webhookUrl) {
1482
+ fetch(webhookUrl, {
1483
+ method: 'POST',
1484
+ headers: { 'Content-Type': 'application/json' },
1485
+ body: JSON.stringify({
1486
+ event: 'session.completed',
1487
+ timestamp: new Date().toISOString(),
1488
+ tasks: taskCount,
1489
+ completed: sessionCompleted,
1490
+ failed: sessionFailed,
1491
+ noOp: sessionNoOp,
1492
+ tokens: sessionInputTokens + sessionOutputTokens,
1493
+ cost: sessionCost,
1494
+ elapsed: Date.now() - sessionStartTime,
1495
+ }),
1496
+ }).catch(() => { }); // fire-and-forget
1497
+ }
1498
+ }
1499
+ catch { /* non-fatal */ }
1500
+ }
1435
1501
  }
1436
1502
  export async function handleAssistant(opts) {
1437
1503
  const projectDir = opts.file ?? process.cwd();
@@ -1461,12 +1527,37 @@ export async function handleAssistant(opts) {
1461
1527
  return;
1462
1528
  }
1463
1529
  const config = await loadConfig(opts.configPath);
1530
+ // Check platform login — override provider if logged in
1531
+ let providerOverride;
1532
+ try {
1533
+ const credPath = path.join(os.homedir(), '.fw', 'credentials.json');
1534
+ if (fs.existsSync(credPath)) {
1535
+ const creds = JSON.parse(fs.readFileSync(credPath, 'utf-8'));
1536
+ if (creds.token && creds.platformUrl && creds.expiresAt > Date.now()) {
1537
+ providerOverride = 'platform';
1538
+ // Make credentials available to the provider
1539
+ process.env.FW_PLATFORM_TOKEN = creds.token;
1540
+ process.env.FW_PLATFORM_URL = creds.platformUrl;
1541
+ }
1542
+ }
1543
+ }
1544
+ catch { /* not available */ }
1464
1545
  // Create provider
1465
- const { createAnthropicProvider, createClaudeCliProvider } = await import('@synergenius/flow-weaver/agent');
1546
+ const agentMod = await import('@synergenius/flow-weaver/agent');
1547
+ const { createAnthropicProvider, createClaudeCliProvider } = agentMod;
1548
+ const createPlatformProvider = 'createPlatformProvider' in agentMod
1549
+ ? agentMod.createPlatformProvider
1550
+ : null;
1466
1551
  const providerSetting = config?.provider ?? 'auto';
1467
1552
  const providerType = typeof providerSetting === 'object' ? providerSetting.name : String(providerSetting);
1468
1553
  let provider;
1469
- if (providerType === 'anthropic' || (providerType === 'auto' && process.env.ANTHROPIC_API_KEY)) {
1554
+ if ((providerOverride === 'platform' || providerType === 'platform') && createPlatformProvider) {
1555
+ provider = createPlatformProvider({
1556
+ token: process.env.FW_PLATFORM_TOKEN,
1557
+ platformUrl: process.env.FW_PLATFORM_URL,
1558
+ });
1559
+ }
1560
+ else if (providerType === 'anthropic' || (providerType === 'auto' && process.env.ANTHROPIC_API_KEY)) {
1470
1561
  const apiKey = process.env.ANTHROPIC_API_KEY ?? (typeof providerSetting === 'object' ? providerSetting.apiKey : undefined);
1471
1562
  if (!apiKey) {
1472
1563
  console.error('ANTHROPIC_API_KEY required for anthropic provider');
@@ -1487,6 +1578,7 @@ export async function handleAssistant(opts) {
1487
1578
  projectDir,
1488
1579
  resumeId: opts.assistantResume,
1489
1580
  newConversation: opts.assistantNew,
1581
+ watchDir: opts.assistantWatch,
1490
1582
  });
1491
1583
  }
1492
1584
  export async function handleSteer(opts) {
@@ -1997,6 +2089,15 @@ export async function handleDoctor(opts) {
1997
2089
  else {
1998
2090
  checks.push({ label: 'Connection', status: 'warn', detail: 'Not tested' });
1999
2091
  }
2092
+ // Weaver version (this pack)
2093
+ try {
2094
+ const url = await import('node:url');
2095
+ const packPkg = JSON.parse(fs.readFileSync(new url.URL('../package.json', import.meta.url), 'utf-8'));
2096
+ checks.push({ label: 'Weaver', status: 'ok', detail: `v${packPkg.version}` });
2097
+ }
2098
+ catch {
2099
+ checks.push({ label: 'Weaver', status: 'ok', detail: 'unknown version' });
2100
+ }
2000
2101
  // Flow Weaver version
2001
2102
  try {
2002
2103
  const { execFileSync: fwCheck } = await import('node:child_process');