@synergenius/flow-weaver-pack-weaver 0.9.7 → 0.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bot/agent-loop.d.ts +20 -0
- package/dist/bot/agent-loop.d.ts.map +1 -0
- package/dist/bot/agent-loop.js +331 -0
- package/dist/bot/agent-loop.js.map +1 -0
- package/dist/bot/agent-provider.d.ts.map +1 -1
- package/dist/bot/agent-provider.js +3 -2
- package/dist/bot/agent-provider.js.map +1 -1
- package/dist/bot/approvals.js +17 -8
- package/dist/bot/approvals.js.map +1 -1
- package/dist/bot/assistant-core.d.ts +17 -0
- package/dist/bot/assistant-core.d.ts.map +1 -1
- package/dist/bot/assistant-core.js +418 -60
- package/dist/bot/assistant-core.js.map +1 -1
- package/dist/bot/assistant-tools.d.ts +1 -1
- package/dist/bot/assistant-tools.d.ts.map +1 -1
- package/dist/bot/assistant-tools.js +283 -9
- package/dist/bot/assistant-tools.js.map +1 -1
- package/dist/bot/bot-agent-channel.d.ts.map +1 -1
- package/dist/bot/bot-agent-channel.js +2 -0
- package/dist/bot/bot-agent-channel.js.map +1 -1
- package/dist/bot/bot-manager.d.ts +4 -0
- package/dist/bot/bot-manager.d.ts.map +1 -1
- package/dist/bot/bot-manager.js +72 -27
- package/dist/bot/bot-manager.js.map +1 -1
- package/dist/bot/conversation-store.d.ts +6 -5
- package/dist/bot/conversation-store.d.ts.map +1 -1
- package/dist/bot/conversation-store.js +98 -42
- package/dist/bot/conversation-store.js.map +1 -1
- package/dist/bot/cost-store.d.ts +3 -0
- package/dist/bot/cost-store.d.ts.map +1 -1
- package/dist/bot/cost-store.js +21 -10
- package/dist/bot/cost-store.js.map +1 -1
- package/dist/bot/cost-tracker.d.ts.map +1 -1
- package/dist/bot/cost-tracker.js +14 -1
- package/dist/bot/cost-tracker.js.map +1 -1
- package/dist/bot/cron-parser.d.ts.map +1 -1
- package/dist/bot/cron-parser.js +2 -0
- package/dist/bot/cron-parser.js.map +1 -1
- package/dist/bot/cron-scheduler.d.ts.map +1 -1
- package/dist/bot/cron-scheduler.js +1 -0
- package/dist/bot/cron-scheduler.js.map +1 -1
- package/dist/bot/device-connection.d.ts +13 -0
- package/dist/bot/device-connection.d.ts.map +1 -0
- package/dist/bot/device-connection.js +102 -0
- package/dist/bot/device-connection.js.map +1 -0
- package/dist/bot/error-classifier.d.ts.map +1 -1
- package/dist/bot/error-classifier.js +5 -0
- package/dist/bot/error-classifier.js.map +1 -1
- package/dist/bot/file-lock.d.ts.map +1 -1
- package/dist/bot/file-lock.js +13 -3
- package/dist/bot/file-lock.js.map +1 -1
- package/dist/bot/file-watcher.d.ts.map +1 -1
- package/dist/bot/file-watcher.js +1 -0
- package/dist/bot/file-watcher.js.map +1 -1
- package/dist/bot/genesis-prompt-context.d.ts +5 -0
- package/dist/bot/genesis-prompt-context.d.ts.map +1 -1
- package/dist/bot/genesis-prompt-context.js +55 -0
- package/dist/bot/genesis-prompt-context.js.map +1 -1
- package/dist/bot/genesis-store.d.ts +4 -0
- package/dist/bot/genesis-store.d.ts.map +1 -1
- package/dist/bot/genesis-store.js +79 -12
- package/dist/bot/genesis-store.js.map +1 -1
- package/dist/bot/improve-loop.d.ts +46 -0
- package/dist/bot/improve-loop.d.ts.map +1 -0
- package/dist/bot/improve-loop.js +592 -0
- package/dist/bot/improve-loop.js.map +1 -0
- package/dist/bot/insight-engine.d.ts +12 -0
- package/dist/bot/insight-engine.d.ts.map +1 -0
- package/dist/bot/insight-engine.js +256 -0
- package/dist/bot/insight-engine.js.map +1 -0
- package/dist/bot/knowledge-store.d.ts.map +1 -1
- package/dist/bot/knowledge-store.js +4 -1
- package/dist/bot/knowledge-store.js.map +1 -1
- package/dist/bot/pipeline-runner.d.ts.map +1 -1
- package/dist/bot/pipeline-runner.js +12 -4
- package/dist/bot/pipeline-runner.js.map +1 -1
- package/dist/bot/project-model.d.ts +25 -0
- package/dist/bot/project-model.d.ts.map +1 -0
- package/dist/bot/project-model.js +372 -0
- package/dist/bot/project-model.js.map +1 -0
- package/dist/bot/response-formatter.js +2 -3
- package/dist/bot/response-formatter.js.map +1 -1
- package/dist/bot/run-store.d.ts.map +1 -1
- package/dist/bot/run-store.js +10 -2
- package/dist/bot/run-store.js.map +1 -1
- package/dist/bot/safe-path.d.ts +1 -1
- package/dist/bot/safe-path.d.ts.map +1 -1
- package/dist/bot/safe-path.js +20 -1
- package/dist/bot/safe-path.js.map +1 -1
- package/dist/bot/safety.d.ts +10 -2
- package/dist/bot/safety.d.ts.map +1 -1
- package/dist/bot/safety.js +45 -2
- package/dist/bot/safety.js.map +1 -1
- package/dist/bot/session-state.d.ts +4 -0
- package/dist/bot/session-state.d.ts.map +1 -1
- package/dist/bot/session-state.js +52 -9
- package/dist/bot/session-state.js.map +1 -1
- package/dist/bot/slash-commands.d.ts.map +1 -1
- package/dist/bot/slash-commands.js +109 -3
- package/dist/bot/slash-commands.js.map +1 -1
- package/dist/bot/steering-engine.d.ts +67 -0
- package/dist/bot/steering-engine.d.ts.map +1 -0
- package/dist/bot/steering-engine.js +198 -0
- package/dist/bot/steering-engine.js.map +1 -0
- package/dist/bot/step-executor.d.ts.map +1 -1
- package/dist/bot/step-executor.js +62 -25
- package/dist/bot/step-executor.js.map +1 -1
- package/dist/bot/system-prompt.d.ts.map +1 -1
- package/dist/bot/system-prompt.js +5 -2
- package/dist/bot/system-prompt.js.map +1 -1
- package/dist/bot/task-queue.d.ts +6 -1
- package/dist/bot/task-queue.d.ts.map +1 -1
- package/dist/bot/task-queue.js +43 -4
- package/dist/bot/task-queue.js.map +1 -1
- package/dist/bot/tool-registry.d.ts +1 -1
- package/dist/bot/tool-registry.d.ts.map +1 -1
- package/dist/bot/tool-registry.js +65 -4
- package/dist/bot/tool-registry.js.map +1 -1
- package/dist/bot/trust-calculator.d.ts +34 -0
- package/dist/bot/trust-calculator.d.ts.map +1 -0
- package/dist/bot/trust-calculator.js +67 -0
- package/dist/bot/trust-calculator.js.map +1 -0
- package/dist/bot/types.d.ts +97 -0
- package/dist/bot/types.d.ts.map +1 -1
- package/dist/bot/update-checker.d.ts +21 -0
- package/dist/bot/update-checker.d.ts.map +1 -0
- package/dist/bot/update-checker.js +129 -0
- package/dist/bot/update-checker.js.map +1 -0
- package/dist/bot/weaver-tools.d.ts.map +1 -1
- package/dist/bot/weaver-tools.js +11 -4
- package/dist/bot/weaver-tools.js.map +1 -1
- package/dist/cli-bridge.d.ts +2 -0
- package/dist/cli-bridge.d.ts.map +1 -1
- package/dist/cli-bridge.js +3 -1
- package/dist/cli-bridge.js.map +1 -1
- package/dist/cli-handlers.d.ts +10 -1
- package/dist/cli-handlers.d.ts.map +1 -1
- package/dist/cli-handlers.js +141 -24
- package/dist/cli-handlers.js.map +1 -1
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +749 -0
- package/dist/cli.js.map +1 -0
- package/dist/docs/weaver-config.md +15 -9
- package/dist/handlers/on-execution-completed.d.ts +11 -0
- package/dist/handlers/on-execution-completed.d.ts.map +1 -0
- package/dist/handlers/on-execution-completed.js +25 -0
- package/dist/handlers/on-execution-completed.js.map +1 -0
- package/dist/mcp-tools.d.ts.map +1 -1
- package/dist/mcp-tools.js +33 -0
- package/dist/mcp-tools.js.map +1 -1
- package/dist/node-types/genesis-approve.d.ts.map +1 -1
- package/dist/node-types/genesis-approve.js +28 -3
- package/dist/node-types/genesis-approve.js.map +1 -1
- package/dist/node-types/genesis-observe.d.ts.map +1 -1
- package/dist/node-types/genesis-observe.js +23 -13
- package/dist/node-types/genesis-observe.js.map +1 -1
- package/dist/node-types/genesis-propose.d.ts.map +1 -1
- package/dist/node-types/genesis-propose.js +8 -0
- package/dist/node-types/genesis-propose.js.map +1 -1
- package/dist/node-types/genesis-update-history.d.ts.map +1 -1
- package/dist/node-types/genesis-update-history.js +13 -0
- package/dist/node-types/genesis-update-history.js.map +1 -1
- package/dist/templates/weaver-template.d.ts +11 -0
- package/dist/templates/weaver-template.d.ts.map +1 -0
- package/dist/templates/weaver-template.js +53 -0
- package/dist/templates/weaver-template.js.map +1 -0
- package/dist/workflows/weaver-bot-session.d.ts +65 -0
- package/dist/workflows/weaver-bot-session.d.ts.map +1 -0
- package/dist/workflows/weaver-bot-session.js +68 -0
- package/dist/workflows/weaver-bot-session.js.map +1 -0
- package/dist/workflows/weaver.d.ts +24 -0
- package/dist/workflows/weaver.d.ts.map +1 -0
- package/dist/workflows/weaver.js +28 -0
- package/dist/workflows/weaver.js.map +1 -0
- package/flowweaver.manifest.json +28 -1
- package/package.json +6 -3
- package/src/bot/agent-provider.ts +3 -2
- package/src/bot/approvals.ts +16 -8
- package/src/bot/assistant-core.ts +420 -63
- package/src/bot/assistant-tools.ts +291 -9
- package/src/bot/bot-agent-channel.ts +2 -0
- package/src/bot/bot-manager.ts +70 -29
- package/src/bot/conversation-store.ts +87 -42
- package/src/bot/cost-store.ts +20 -9
- package/src/bot/cost-tracker.ts +13 -1
- package/src/bot/cron-parser.ts +1 -0
- package/src/bot/cron-scheduler.ts +1 -0
- package/src/bot/device-connection.ts +102 -0
- package/src/bot/error-classifier.ts +5 -0
- package/src/bot/file-lock.ts +12 -2
- package/src/bot/file-watcher.ts +1 -0
- package/src/bot/genesis-prompt-context.ts +61 -0
- package/src/bot/genesis-store.ts +68 -16
- package/src/bot/improve-loop.ts +651 -0
- package/src/bot/insight-engine.ts +273 -0
- package/src/bot/knowledge-store.ts +4 -1
- package/src/bot/pipeline-runner.ts +11 -6
- package/src/bot/project-model.ts +404 -0
- package/src/bot/response-formatter.ts +2 -3
- package/src/bot/run-store.ts +5 -2
- package/src/bot/safe-path.ts +20 -1
- package/src/bot/safety.ts +57 -3
- package/src/bot/session-state.ts +47 -7
- package/src/bot/slash-commands.ts +111 -3
- package/src/bot/steering-engine.ts +233 -0
- package/src/bot/step-executor.ts +66 -26
- package/src/bot/system-prompt.ts +5 -2
- package/src/bot/task-queue.ts +40 -4
- package/src/bot/tool-registry.ts +67 -5
- package/src/bot/trust-calculator.ts +87 -0
- package/src/bot/types.ts +104 -0
- package/src/bot/update-checker.ts +138 -0
- package/src/bot/weaver-tools.ts +10 -4
- package/src/cli-bridge.ts +4 -1
- package/src/cli-handlers.ts +150 -29
- package/src/handlers/on-execution-completed.ts +30 -0
- package/src/mcp-tools.ts +38 -0
- package/src/node-types/genesis-approve.ts +28 -3
- package/src/node-types/genesis-observe.ts +23 -12
- package/src/node-types/genesis-propose.ts +8 -0
- package/src/node-types/genesis-update-history.ts +12 -0
- package/src/ui/evolution-panel.tsx +96 -0
- package/src/ui/insights-widget.tsx +77 -0
package/dist/bot/safety.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/bot/safety.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/bot/safety.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iFAAiF;AACjF,MAAM,CAAC,MAAM,sBAAsB,GAAa;IAC9C,8BAA8B;IAC9B,qCAAqC,EAAG,yBAAyB;IAEjE,oCAAoC;IACpC,iBAAiB,EAAe,2BAA2B;IAC3D,2BAA2B,EAAK,mBAAmB;IAEnD,qBAAqB;IACrB,oBAAoB,EAAY,cAAc;IAE9C,qCAAqC;IACrC,6BAA6B,EAAG,iBAAiB;IACjD,6BAA6B,EAAG,iBAAiB;IAEjD,uBAAuB;IACvB,WAAW,EAAqB,OAAO;IAEvC,wBAAwB;IACxB,kBAAkB,EAAc,YAAY;IAE5C,kBAAkB;IAClB,gBAAgB,EAAgB,UAAU;IAE1C,mBAAmB;IACnB,WAAW,EAAqB,cAAc;IAC9C,aAAa,EAAmB,sBAAsB;IACtD,gBAAgB,EAAgB,oBAAoB;IAEpD,iDAAiD;IACjD,mCAAmC,EAAG,gBAAgB;IAEtD,yCAAyC;IACzC,yBAAyB,EAAY,wBAAwB;IAC7D,uBAAuB,EAAc,yBAAyB;IAC9D,gBAAgB,EAAqB,UAAU;IAC/C,gBAAgB,EAAqB,UAAU;IAE/C,wCAAwC;IACxC,YAAY,EAA0B,WAAW;CAClD,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,gFAAgF,CAAC;AACpH,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AACvC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,KAAK,MAAM,OAAO,IAAI,sBAAsB,EAAE,CAAC;QAC7C,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC,MAAM,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -12,8 +12,12 @@ export declare class SessionStore {
|
|
|
12
12
|
constructor(dir?: string);
|
|
13
13
|
create(): Promise<SessionState>;
|
|
14
14
|
load(): SessionState | null;
|
|
15
|
+
/** Recover session from backup file when primary is corrupt. */
|
|
16
|
+
private loadBackup;
|
|
15
17
|
save(state: SessionState): Promise<void>;
|
|
16
18
|
update(patch: Partial<SessionState>): Promise<SessionState | null>;
|
|
17
19
|
clear(): void;
|
|
20
|
+
/** Atomic write: write to temp file, backup existing, rename into place. */
|
|
21
|
+
private writeAtomic;
|
|
18
22
|
}
|
|
19
23
|
//# sourceMappingURL=session-state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../../src/bot/session-state.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACpG,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAS;gBAEb,GAAG,CAAC,EAAE,MAAM;IAKlB,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAcrC,IAAI,IAAI,YAAY,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../../src/bot/session-state.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACpG,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAS;gBAEb,GAAG,CAAC,EAAE,MAAM;IAKlB,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAcrC,IAAI,IAAI,YAAY,GAAG,IAAI;IAW3B,gEAAgE;IAChE,OAAO,CAAC,UAAU;IAcZ,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAWxE,KAAK,IAAI,IAAI;IAQb,4EAA4E;IAC5E,OAAO,CAAC,WAAW;CAsBpB"}
|
|
@@ -31,16 +31,34 @@ export class SessionStore {
|
|
|
31
31
|
catch (err) {
|
|
32
32
|
if (process.env.WEAVER_VERBOSE)
|
|
33
33
|
process.stderr.write(`[weaver] session state load failed: ${err}\n`);
|
|
34
|
+
// Try backup recovery
|
|
35
|
+
return this.loadBackup();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Recover session from backup file when primary is corrupt. */
|
|
39
|
+
loadBackup() {
|
|
40
|
+
const backupPath = this.filePath + '.bak';
|
|
41
|
+
if (!fs.existsSync(backupPath))
|
|
42
|
+
return null;
|
|
43
|
+
try {
|
|
44
|
+
const data = JSON.parse(fs.readFileSync(backupPath, 'utf-8'));
|
|
45
|
+
// Restore backup to primary
|
|
46
|
+
try {
|
|
47
|
+
this.writeAtomic(data);
|
|
48
|
+
}
|
|
49
|
+
catch { /* best effort */ }
|
|
50
|
+
return data;
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
if (process.env.WEAVER_VERBOSE)
|
|
54
|
+
process.stderr.write(`[weaver] session backup load failed: ${err}\n`);
|
|
34
55
|
return null;
|
|
35
56
|
}
|
|
36
57
|
}
|
|
37
58
|
async save(state) {
|
|
38
59
|
return withFileLock(this.filePath, () => {
|
|
39
|
-
const dir = path.dirname(this.filePath);
|
|
40
|
-
if (!fs.existsSync(dir))
|
|
41
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
42
60
|
state.lastActivity = Date.now();
|
|
43
|
-
|
|
61
|
+
this.writeAtomic(state);
|
|
44
62
|
});
|
|
45
63
|
}
|
|
46
64
|
async update(patch) {
|
|
@@ -49,11 +67,8 @@ export class SessionStore {
|
|
|
49
67
|
if (!state)
|
|
50
68
|
return null;
|
|
51
69
|
Object.assign(state, patch);
|
|
52
|
-
const dir = path.dirname(this.filePath);
|
|
53
|
-
if (!fs.existsSync(dir))
|
|
54
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
55
70
|
state.lastActivity = Date.now();
|
|
56
|
-
|
|
71
|
+
this.writeAtomic(state);
|
|
57
72
|
return state;
|
|
58
73
|
});
|
|
59
74
|
}
|
|
@@ -61,7 +76,35 @@ export class SessionStore {
|
|
|
61
76
|
try {
|
|
62
77
|
fs.unlinkSync(this.filePath);
|
|
63
78
|
}
|
|
64
|
-
catch {
|
|
79
|
+
catch (err) {
|
|
80
|
+
if (err.code !== 'ENOENT')
|
|
81
|
+
throw err;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** Atomic write: write to temp file, backup existing, rename into place. */
|
|
85
|
+
writeAtomic(state) {
|
|
86
|
+
const dir = path.dirname(this.filePath);
|
|
87
|
+
if (!fs.existsSync(dir))
|
|
88
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
89
|
+
const tmpPath = this.filePath + `.tmp.${process.pid}`;
|
|
90
|
+
const backupPath = this.filePath + '.bak';
|
|
91
|
+
const content = JSON.stringify(state, null, 2);
|
|
92
|
+
// Write to temp file first
|
|
93
|
+
fs.writeFileSync(tmpPath, content, 'utf-8');
|
|
94
|
+
// Backup current file if it exists
|
|
95
|
+
if (fs.existsSync(this.filePath)) {
|
|
96
|
+
try {
|
|
97
|
+
fs.copyFileSync(this.filePath, backupPath);
|
|
98
|
+
}
|
|
99
|
+
catch { /* best effort */ }
|
|
100
|
+
}
|
|
101
|
+
// Atomic rename
|
|
102
|
+
fs.renameSync(tmpPath, this.filePath);
|
|
103
|
+
// Update backup after successful write
|
|
104
|
+
try {
|
|
105
|
+
fs.copyFileSync(this.filePath, backupPath);
|
|
106
|
+
}
|
|
107
|
+
catch { /* best effort */ }
|
|
65
108
|
}
|
|
66
109
|
}
|
|
67
110
|
//# sourceMappingURL=session-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../src/bot/session-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAY9C,MAAM,OAAO,YAAY;IACf,QAAQ,CAAS;IAEzB,YAAY,GAAY;QACtB,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,KAAK,GAAiB;YAC1B,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,IAAI;YACjB,cAAc,EAAE,CAAC;YACjB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;SACzB,CAAC;QACF,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI;QACF,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAiB,CAAC;QAC7E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,GAAG,IAAI,CAAC,CAAC;YACrG,OAAO,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../src/bot/session-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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,
|
|
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,EAuLxC,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"}
|
|
@@ -2,10 +2,39 @@ import { c } from './ansi.js';
|
|
|
2
2
|
export const SLASH_COMMANDS = [
|
|
3
3
|
{
|
|
4
4
|
name: '/help',
|
|
5
|
-
description: 'Show available commands',
|
|
5
|
+
description: 'Show available commands and capabilities',
|
|
6
6
|
handler: async (ctx) => {
|
|
7
|
-
|
|
7
|
+
// Check if this is a new project (no workflows)
|
|
8
|
+
let hasWorkflows = false;
|
|
9
|
+
try {
|
|
10
|
+
const fsMod = await import('node:fs');
|
|
11
|
+
const pathMod = await import('node:path');
|
|
12
|
+
const srcDir = pathMod.join(ctx.projectDir, 'src');
|
|
13
|
+
if (fsMod.existsSync(srcDir)) {
|
|
14
|
+
const files = fsMod.readdirSync(srcDir, { recursive: true });
|
|
15
|
+
hasWorkflows = files.some(f => f.endsWith('.ts'));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch { /* scan failed */ }
|
|
19
|
+
ctx.out(`\n ${c.bold('Weaver Assistant')}\n`);
|
|
20
|
+
ctx.out(` Tell me what to build, fix, or explore. I use tools to do the work.\n\n`);
|
|
21
|
+
if (!hasWorkflows) {
|
|
22
|
+
ctx.out(` ${c.bold('Getting Started:')}\n`);
|
|
23
|
+
ctx.out(` ${c.cyan('1.')} "create a hello world workflow"\n`);
|
|
24
|
+
ctx.out(` ${c.cyan('2.')} "create a data pipeline that reads an API and transforms the result"\n`);
|
|
25
|
+
ctx.out(` ${c.cyan('3.')} "what is Flow Weaver and how does it work?"\n\n`);
|
|
26
|
+
}
|
|
27
|
+
ctx.out(` ${c.bold('Capabilities:')}\n`);
|
|
28
|
+
ctx.out(` Workflows Create, validate, compile, diagram, describe, and modify\n`);
|
|
29
|
+
ctx.out(` Bots Spawn background workers that execute tasks autonomously\n`);
|
|
30
|
+
ctx.out(` Code Read, write, and patch files in your project\n`);
|
|
31
|
+
ctx.out(` Health Track project health, insights, cost, and trust level\n`);
|
|
32
|
+
ctx.out(` Evolution Propose and apply genesis improvements to bot workflows\n`);
|
|
33
|
+
ctx.out(` Shell Run commands, check TypeScript, run tests\n\n`);
|
|
34
|
+
ctx.out(` ${c.bold('Commands:')}\n`);
|
|
8
35
|
for (const cmd of SLASH_COMMANDS) {
|
|
36
|
+
if (cmd.name === '/help')
|
|
37
|
+
continue;
|
|
9
38
|
ctx.out(` ${c.cyan(cmd.name.padEnd(12))} ${c.dim(cmd.description)}\n`);
|
|
10
39
|
}
|
|
11
40
|
ctx.out('\n');
|
|
@@ -17,7 +46,7 @@ export const SLASH_COMMANDS = [
|
|
|
17
46
|
handler: async (ctx) => {
|
|
18
47
|
const bots = await ctx.executor('bot_list', {});
|
|
19
48
|
const summary = await ctx.executor('conversation_summary', {});
|
|
20
|
-
ctx.out(`\n ${bots.result}\n ${summary.result}\n\n`);
|
|
49
|
+
ctx.out(`\n Bots:\n ${bots.result}\n\n Conversation:\n ${summary.result}\n\n`);
|
|
21
50
|
},
|
|
22
51
|
},
|
|
23
52
|
{
|
|
@@ -34,6 +63,7 @@ export const SLASH_COMMANDS = [
|
|
|
34
63
|
handler: async (ctx) => {
|
|
35
64
|
process.stderr.write('\x1b[2J\x1b[H');
|
|
36
65
|
ctx.onClear?.();
|
|
66
|
+
ctx.out(` ${c.dim('Screen cleared. New conversation started.')}\n\n`);
|
|
37
67
|
},
|
|
38
68
|
},
|
|
39
69
|
{
|
|
@@ -66,6 +96,22 @@ export const SLASH_COMMANDS = [
|
|
|
66
96
|
ctx.onVerbose?.();
|
|
67
97
|
},
|
|
68
98
|
},
|
|
99
|
+
{
|
|
100
|
+
name: '/insights',
|
|
101
|
+
description: 'Show project insights and recommendations',
|
|
102
|
+
handler: async (ctx) => {
|
|
103
|
+
const result = await ctx.executor('project_insights', {});
|
|
104
|
+
ctx.out(`\n${result.result}\n\n`);
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: '/health',
|
|
109
|
+
description: 'Show project health summary',
|
|
110
|
+
handler: async (ctx) => {
|
|
111
|
+
const result = await ctx.executor('project_health', {});
|
|
112
|
+
ctx.out(`\n${result.result}\n\n`);
|
|
113
|
+
},
|
|
114
|
+
},
|
|
69
115
|
{
|
|
70
116
|
name: '/history',
|
|
71
117
|
description: 'Show conversation history summary',
|
|
@@ -74,6 +120,66 @@ export const SLASH_COMMANDS = [
|
|
|
74
120
|
ctx.out(`\n ${result.result}\n\n`);
|
|
75
121
|
},
|
|
76
122
|
},
|
|
123
|
+
{
|
|
124
|
+
name: '/improve',
|
|
125
|
+
description: 'Show status of the current or last improve run',
|
|
126
|
+
handler: async (ctx) => {
|
|
127
|
+
try {
|
|
128
|
+
const fsMod = await import('node:fs');
|
|
129
|
+
const pathMod = await import('node:path');
|
|
130
|
+
const osMod = await import('node:os');
|
|
131
|
+
const summaryDir = pathMod.join(osMod.homedir(), '.weaver', 'improve');
|
|
132
|
+
if (!fsMod.existsSync(summaryDir)) {
|
|
133
|
+
ctx.out(`\n No improve runs found. Start one with: weaver improve\n\n`);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const files = fsMod.readdirSync(summaryDir).filter((f) => f.endsWith('.json')).sort().reverse();
|
|
137
|
+
if (files.length === 0) {
|
|
138
|
+
ctx.out(`\n No improve runs found.\n\n`);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const latest = JSON.parse(fsMod.readFileSync(pathMod.join(summaryDir, files[0]), 'utf-8'));
|
|
142
|
+
const duration = Math.round((new Date(latest.finishedAt).getTime() - new Date(latest.startedAt).getTime()) / 1000);
|
|
143
|
+
ctx.out(`\n Improve Run (${latest.reason})\n`);
|
|
144
|
+
ctx.out(` Branch: ${latest.branch}\n`);
|
|
145
|
+
ctx.out(` Duration: ${duration}s\n`);
|
|
146
|
+
ctx.out(` Successes: ${latest.successes} Failures: ${latest.failures} Skips: ${latest.skips} Blocked: ${latest.blocked}\n\n`);
|
|
147
|
+
for (const cy of latest.cycles) {
|
|
148
|
+
const icon = cy.outcome === 'success' ? '✓' : cy.outcome === 'failure' ? '✗' : '○';
|
|
149
|
+
ctx.out(` ${icon} Cycle ${cy.cycle}: [${cy.outcome}] ${cy.description.slice(0, 70)}\n`);
|
|
150
|
+
}
|
|
151
|
+
// Check if a run is currently active
|
|
152
|
+
try {
|
|
153
|
+
const { execFileSync } = await import('node:child_process');
|
|
154
|
+
const worktrees = execFileSync('git', ['worktree', 'list'], { encoding: 'utf-8', cwd: ctx.projectDir });
|
|
155
|
+
if (worktrees.includes('weaver-improve')) {
|
|
156
|
+
ctx.out(`\n LIVE: improve worktree active — run is in progress\n`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch { /* git not available */ }
|
|
160
|
+
ctx.out('\n');
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
ctx.out(`\n Error reading improve status: ${err instanceof Error ? err.message : err}\n\n`);
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
name: '/genesis',
|
|
169
|
+
description: 'Propose a workflow evolution based on project insights',
|
|
170
|
+
handler: async (ctx) => {
|
|
171
|
+
const result = await ctx.executor('genesis_propose', {});
|
|
172
|
+
ctx.out(`\n${result.result}\n\n`);
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
name: '/trust',
|
|
177
|
+
description: 'Show current trust level and factors',
|
|
178
|
+
handler: async (ctx) => {
|
|
179
|
+
const result = await ctx.executor('project_health', {});
|
|
180
|
+
ctx.out(`\n${result.result}\n\n`);
|
|
181
|
+
},
|
|
182
|
+
},
|
|
77
183
|
];
|
|
78
184
|
export function getSlashCompletions(partial) {
|
|
79
185
|
if (!partial.startsWith('/'))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../src/bot/slash-commands.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,WAAW,CAAC;AAmB9B,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../src/bot/slash-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Steering Engine — time-based and event-based nudges that guide the
|
|
3
|
+
* assistant's behavior during long-running operations.
|
|
4
|
+
*
|
|
5
|
+
* Steers are injected into the system prompt when conditions are met.
|
|
6
|
+
* They're guidance, not hard stops (except urgent + "STOP" which triggers hasHardStop).
|
|
7
|
+
*/
|
|
8
|
+
export interface TimeTrigger {
|
|
9
|
+
type: 'time';
|
|
10
|
+
afterMs: number;
|
|
11
|
+
}
|
|
12
|
+
export interface EventTrigger {
|
|
13
|
+
type: 'event';
|
|
14
|
+
event: string;
|
|
15
|
+
count?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface Steer {
|
|
18
|
+
id: string;
|
|
19
|
+
trigger: TimeTrigger | EventTrigger;
|
|
20
|
+
message: string;
|
|
21
|
+
intensity: 'gentle' | 'firm' | 'urgent';
|
|
22
|
+
once: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare class SteeringEngine {
|
|
25
|
+
private readonly steers;
|
|
26
|
+
private startTime;
|
|
27
|
+
private eventCounts;
|
|
28
|
+
private firedOnce;
|
|
29
|
+
private pendingMessages;
|
|
30
|
+
private hardStopTriggered;
|
|
31
|
+
private eventSteerLastFired;
|
|
32
|
+
constructor(steers: Steer[]);
|
|
33
|
+
/**
|
|
34
|
+
* Check all steers and return the highest-priority triggered message,
|
|
35
|
+
* or null if nothing fired.
|
|
36
|
+
*/
|
|
37
|
+
check(): string | null;
|
|
38
|
+
/**
|
|
39
|
+
* Record an event occurrence. May trigger event-based steers on next check().
|
|
40
|
+
*/
|
|
41
|
+
recordEvent(event: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Get all pending messages since last call and clear the queue.
|
|
44
|
+
*/
|
|
45
|
+
getPendingMessages(): string[];
|
|
46
|
+
/**
|
|
47
|
+
* Reset all state for a new cycle. Restarts the timer.
|
|
48
|
+
*/
|
|
49
|
+
reset(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Returns true if an urgent steer with "STOP" in the message has fired.
|
|
52
|
+
*/
|
|
53
|
+
hasHardStop(): boolean;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Default steers that ship with every assistant session.
|
|
57
|
+
*/
|
|
58
|
+
export declare const DEFAULT_STEERS: Steer[];
|
|
59
|
+
/**
|
|
60
|
+
* Additional steers for the improve loop.
|
|
61
|
+
*/
|
|
62
|
+
export declare const IMPROVE_STEERS: Steer[];
|
|
63
|
+
/**
|
|
64
|
+
* Load steers from .weaver-steers.json, merged with defaults.
|
|
65
|
+
*/
|
|
66
|
+
export declare function loadSteers(projectDir: string, extras?: Steer[]): Steer[];
|
|
67
|
+
//# sourceMappingURL=steering-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steering-engine.d.ts","sourceRoot":"","sources":["../../src/bot/steering-engine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,WAAW,GAAG,YAAY,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IACxC,IAAI,EAAE,OAAO,CAAC;CACf;AAQD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,iBAAiB,CAAS;IAElC,OAAO,CAAC,mBAAmB,CAA6B;gBAE5C,MAAM,EAAE,KAAK,EAAE;IAK3B;;;OAGG;IACH,KAAK,IAAI,MAAM,GAAG,IAAI;IAiDtB;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAM9B;;OAEG;IACH,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,WAAW,IAAI,OAAO;CAGvB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,EAkDjC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,EAejC,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,KAAK,EAAO,GAAG,KAAK,EAAE,CAiB5E"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Steering Engine — time-based and event-based nudges that guide the
|
|
3
|
+
* assistant's behavior during long-running operations.
|
|
4
|
+
*
|
|
5
|
+
* Steers are injected into the system prompt when conditions are met.
|
|
6
|
+
* They're guidance, not hard stops (except urgent + "STOP" which triggers hasHardStop).
|
|
7
|
+
*/
|
|
8
|
+
const INTENSITY_PREFIX = {
|
|
9
|
+
gentle: '[CONTEXT NOTE]',
|
|
10
|
+
firm: '[STEER]',
|
|
11
|
+
urgent: '[URGENT STEER]',
|
|
12
|
+
};
|
|
13
|
+
export class SteeringEngine {
|
|
14
|
+
steers;
|
|
15
|
+
startTime;
|
|
16
|
+
eventCounts = new Map();
|
|
17
|
+
firedOnce = new Set();
|
|
18
|
+
pendingMessages = [];
|
|
19
|
+
hardStopTriggered = false;
|
|
20
|
+
// Track last event count when an event steer fired (for once: false repeat logic)
|
|
21
|
+
eventSteerLastFired = new Map();
|
|
22
|
+
constructor(steers) {
|
|
23
|
+
this.steers = steers;
|
|
24
|
+
this.startTime = Date.now();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check all steers and return the highest-priority triggered message,
|
|
28
|
+
* or null if nothing fired.
|
|
29
|
+
*/
|
|
30
|
+
check() {
|
|
31
|
+
const triggered = [];
|
|
32
|
+
const elapsed = Date.now() - this.startTime;
|
|
33
|
+
for (const steer of this.steers) {
|
|
34
|
+
if (steer.once && this.firedOnce.has(steer.id))
|
|
35
|
+
continue;
|
|
36
|
+
let shouldFire = false;
|
|
37
|
+
if (steer.trigger.type === 'time') {
|
|
38
|
+
shouldFire = elapsed >= steer.trigger.afterMs;
|
|
39
|
+
}
|
|
40
|
+
else if (steer.trigger.type === 'event') {
|
|
41
|
+
const count = this.eventCounts.get(steer.trigger.event) ?? 0;
|
|
42
|
+
const threshold = steer.trigger.count ?? 1;
|
|
43
|
+
if (steer.once) {
|
|
44
|
+
shouldFire = count >= threshold;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// For repeat steers, fire every time we cross another threshold
|
|
48
|
+
const lastFired = this.eventSteerLastFired.get(steer.id) ?? 0;
|
|
49
|
+
shouldFire = count >= threshold && count > lastFired;
|
|
50
|
+
if (shouldFire) {
|
|
51
|
+
this.eventSteerLastFired.set(steer.id, count);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (shouldFire) {
|
|
56
|
+
const prefix = INTENSITY_PREFIX[steer.intensity] ?? '[STEER]';
|
|
57
|
+
const formatted = `${prefix} ${steer.message}`;
|
|
58
|
+
triggered.push(formatted);
|
|
59
|
+
if (steer.once)
|
|
60
|
+
this.firedOnce.add(steer.id);
|
|
61
|
+
if (steer.intensity === 'urgent' && steer.message.includes('STOP')) {
|
|
62
|
+
this.hardStopTriggered = true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (triggered.length === 0)
|
|
67
|
+
return null;
|
|
68
|
+
// Add each triggered message individually to pending
|
|
69
|
+
this.pendingMessages.push(...triggered);
|
|
70
|
+
// Return combined for inline use
|
|
71
|
+
return triggered.join('\n\n');
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Record an event occurrence. May trigger event-based steers on next check().
|
|
75
|
+
*/
|
|
76
|
+
recordEvent(event) {
|
|
77
|
+
this.eventCounts.set(event, (this.eventCounts.get(event) ?? 0) + 1);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get all pending messages since last call and clear the queue.
|
|
81
|
+
*/
|
|
82
|
+
getPendingMessages() {
|
|
83
|
+
const msgs = [...this.pendingMessages];
|
|
84
|
+
this.pendingMessages = [];
|
|
85
|
+
return msgs;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Reset all state for a new cycle. Restarts the timer.
|
|
89
|
+
*/
|
|
90
|
+
reset() {
|
|
91
|
+
this.startTime = Date.now();
|
|
92
|
+
this.eventCounts.clear();
|
|
93
|
+
this.firedOnce.clear();
|
|
94
|
+
this.pendingMessages = [];
|
|
95
|
+
this.hardStopTriggered = false;
|
|
96
|
+
this.eventSteerLastFired.clear();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Returns true if an urgent steer with "STOP" in the message has fired.
|
|
100
|
+
*/
|
|
101
|
+
hasHardStop() {
|
|
102
|
+
return this.hardStopTriggered;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Default steers that ship with every assistant session.
|
|
107
|
+
*/
|
|
108
|
+
export const DEFAULT_STEERS = [
|
|
109
|
+
{
|
|
110
|
+
id: 'direction-check',
|
|
111
|
+
trigger: { type: 'time', afterMs: 300_000 },
|
|
112
|
+
message: "You've been working for 5 minutes. Take a step back — are you sure this is the right approach? If not, pivot now.",
|
|
113
|
+
intensity: 'gentle',
|
|
114
|
+
once: true,
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
id: 'wrap-up',
|
|
118
|
+
trigger: { type: 'time', afterMs: 1_200_000 },
|
|
119
|
+
message: '20 minutes in. Focus on finishing your current change. If tests pass, commit. If not, fix only what\'s broken.',
|
|
120
|
+
intensity: 'firm',
|
|
121
|
+
once: true,
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
id: 'final-warning',
|
|
125
|
+
trigger: { type: 'time', afterMs: 2_700_000 },
|
|
126
|
+
message: "45 minutes. Commit what works now. Revert anything that doesn't pass tests. Time is almost up.",
|
|
127
|
+
intensity: 'urgent',
|
|
128
|
+
once: true,
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
id: 'hard-stop',
|
|
132
|
+
trigger: { type: 'time', afterMs: 3_600_000 },
|
|
133
|
+
message: 'STOP. 60 minutes reached. Commit passing work or revert everything.',
|
|
134
|
+
intensity: 'urgent',
|
|
135
|
+
once: true,
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
id: 'repeated-errors',
|
|
139
|
+
trigger: { type: 'event', event: 'tool_error', count: 3 },
|
|
140
|
+
message: "You've hit 3 tool errors. Stop and reconsider your approach. Read the error messages carefully.",
|
|
141
|
+
intensity: 'firm',
|
|
142
|
+
once: false,
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
id: 'test-failure-reflect',
|
|
146
|
+
trigger: { type: 'event', event: 'test_fail' },
|
|
147
|
+
message: "Tests failed. Don't just retry — think about WHY they failed. Read the error output carefully before making changes.",
|
|
148
|
+
intensity: 'gentle',
|
|
149
|
+
once: false,
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
id: 'write-blocked',
|
|
153
|
+
trigger: { type: 'event', event: 'file_write_blocked', count: 2 },
|
|
154
|
+
message: "File writes are being blocked. You're probably using the wrong path. Use paths relative to the project directory, not absolute paths.",
|
|
155
|
+
intensity: 'firm',
|
|
156
|
+
once: true,
|
|
157
|
+
},
|
|
158
|
+
];
|
|
159
|
+
/**
|
|
160
|
+
* Additional steers for the improve loop.
|
|
161
|
+
*/
|
|
162
|
+
export const IMPROVE_STEERS = [
|
|
163
|
+
{
|
|
164
|
+
id: 'improve-focus',
|
|
165
|
+
trigger: { type: 'time', afterMs: 120_000 },
|
|
166
|
+
message: "2 minutes in. If you haven't started writing code yet, you're over-analyzing. Pick the simplest fix and start writing.",
|
|
167
|
+
intensity: 'gentle',
|
|
168
|
+
once: true,
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
id: 'improve-commit-ready',
|
|
172
|
+
trigger: { type: 'event', event: 'test_pass' },
|
|
173
|
+
message: 'Tests pass. Commit your changes now unless you have a specific reason to keep going.',
|
|
174
|
+
intensity: 'firm',
|
|
175
|
+
once: false,
|
|
176
|
+
},
|
|
177
|
+
];
|
|
178
|
+
/**
|
|
179
|
+
* Load steers from .weaver-steers.json, merged with defaults.
|
|
180
|
+
*/
|
|
181
|
+
export function loadSteers(projectDir, extras = []) {
|
|
182
|
+
const base = [...DEFAULT_STEERS, ...extras];
|
|
183
|
+
try {
|
|
184
|
+
const fs = require('node:fs');
|
|
185
|
+
const path = require('node:path');
|
|
186
|
+
const configPath = path.join(projectDir, '.weaver-steers.json');
|
|
187
|
+
if (fs.existsSync(configPath)) {
|
|
188
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
189
|
+
const userSteers = config.steers ?? [];
|
|
190
|
+
// User steers override defaults by ID
|
|
191
|
+
const userIds = new Set(userSteers.map(s => s.id));
|
|
192
|
+
return [...base.filter(s => !userIds.has(s.id)), ...userSteers];
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch { /* config not available */ }
|
|
196
|
+
return base;
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=steering-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steering-engine.js","sourceRoot":"","sources":["../../src/bot/steering-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-executor.d.ts","sourceRoot":"","sources":["../../src/bot/step-executor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"step-executor.d.ts","sourceRoot":"","sources":["../../src/bot/step-executor.ts"],"names":[],"mappings":"AAkCA,gDAAgD;AAChD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AA4GD,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAC1D,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,CAAC,CAgOrB"}
|