@synergenius/flow-weaver-pack-weaver 0.9.0 → 0.9.3

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 (210) hide show
  1. package/dist/bot/ai-client.d.ts +22 -2
  2. package/dist/bot/ai-client.d.ts.map +1 -1
  3. package/dist/bot/ai-client.js +168 -20
  4. package/dist/bot/ai-client.js.map +1 -1
  5. package/dist/bot/assistant-core.d.ts +25 -0
  6. package/dist/bot/assistant-core.d.ts.map +1 -0
  7. package/dist/bot/assistant-core.js +265 -0
  8. package/dist/bot/assistant-core.js.map +1 -0
  9. package/dist/bot/assistant-tools.d.ts +9 -0
  10. package/dist/bot/assistant-tools.d.ts.map +1 -0
  11. package/dist/bot/assistant-tools.js +602 -0
  12. package/dist/bot/assistant-tools.js.map +1 -0
  13. package/dist/bot/audit-logger.d.ts.map +1 -1
  14. package/dist/bot/audit-logger.js +9 -5
  15. package/dist/bot/audit-logger.js.map +1 -1
  16. package/dist/bot/bot-manager.d.ts +49 -0
  17. package/dist/bot/bot-manager.d.ts.map +1 -0
  18. package/dist/bot/bot-manager.js +279 -0
  19. package/dist/bot/bot-manager.js.map +1 -0
  20. package/dist/bot/child-process-tracker.d.ts +6 -0
  21. package/dist/bot/child-process-tracker.d.ts.map +1 -0
  22. package/dist/bot/child-process-tracker.js +35 -0
  23. package/dist/bot/child-process-tracker.js.map +1 -0
  24. package/dist/bot/cli-provider.d.ts.map +1 -1
  25. package/dist/bot/cli-provider.js +13 -8
  26. package/dist/bot/cli-provider.js.map +1 -1
  27. package/dist/bot/conversation-store.d.ts +40 -0
  28. package/dist/bot/conversation-store.d.ts.map +1 -0
  29. package/dist/bot/conversation-store.js +182 -0
  30. package/dist/bot/conversation-store.js.map +1 -0
  31. package/dist/bot/error-guide.d.ts +10 -0
  32. package/dist/bot/error-guide.d.ts.map +1 -0
  33. package/dist/bot/error-guide.js +34 -0
  34. package/dist/bot/error-guide.js.map +1 -0
  35. package/dist/bot/knowledge-store.d.ts +17 -0
  36. package/dist/bot/knowledge-store.d.ts.map +1 -0
  37. package/dist/bot/knowledge-store.js +53 -0
  38. package/dist/bot/knowledge-store.js.map +1 -0
  39. package/dist/bot/retry-utils.d.ts +19 -0
  40. package/dist/bot/retry-utils.d.ts.map +1 -0
  41. package/dist/bot/retry-utils.js +64 -0
  42. package/dist/bot/retry-utils.js.map +1 -0
  43. package/dist/bot/runner.d.ts.map +1 -1
  44. package/dist/bot/runner.js +12 -1
  45. package/dist/bot/runner.js.map +1 -1
  46. package/dist/bot/session-state.d.ts.map +1 -1
  47. package/dist/bot/session-state.js +3 -1
  48. package/dist/bot/session-state.js.map +1 -1
  49. package/dist/bot/steering.js +1 -1
  50. package/dist/bot/steering.js.map +1 -1
  51. package/dist/bot/step-executor.d.ts +10 -5
  52. package/dist/bot/step-executor.d.ts.map +1 -1
  53. package/dist/bot/step-executor.js +252 -3
  54. package/dist/bot/step-executor.js.map +1 -1
  55. package/dist/bot/system-prompt.d.ts +1 -1
  56. package/dist/bot/system-prompt.d.ts.map +1 -1
  57. package/dist/bot/system-prompt.js +69 -43
  58. package/dist/bot/system-prompt.js.map +1 -1
  59. package/dist/bot/task-decomposer.d.ts +24 -0
  60. package/dist/bot/task-decomposer.d.ts.map +1 -0
  61. package/dist/bot/task-decomposer.js +75 -0
  62. package/dist/bot/task-decomposer.js.map +1 -0
  63. package/dist/bot/task-queue.d.ts +17 -4
  64. package/dist/bot/task-queue.d.ts.map +1 -1
  65. package/dist/bot/task-queue.js +95 -4
  66. package/dist/bot/task-queue.js.map +1 -1
  67. package/dist/bot/terminal-renderer.d.ts +60 -0
  68. package/dist/bot/terminal-renderer.d.ts.map +1 -0
  69. package/dist/bot/terminal-renderer.js +205 -0
  70. package/dist/bot/terminal-renderer.js.map +1 -0
  71. package/dist/bot/types.d.ts +7 -0
  72. package/dist/bot/types.d.ts.map +1 -1
  73. package/dist/bot/weaver-tools.d.ts +18 -0
  74. package/dist/bot/weaver-tools.d.ts.map +1 -0
  75. package/dist/bot/weaver-tools.js +215 -0
  76. package/dist/bot/weaver-tools.js.map +1 -0
  77. package/dist/cli-bridge.d.ts.map +1 -1
  78. package/dist/cli-bridge.js +5 -1
  79. package/dist/cli-bridge.js.map +1 -1
  80. package/dist/cli-handlers.d.ts +13 -1
  81. package/dist/cli-handlers.d.ts.map +1 -1
  82. package/dist/cli-handlers.js +616 -48
  83. package/dist/cli-handlers.js.map +1 -1
  84. package/dist/mcp-tools.js +2 -2
  85. package/dist/mcp-tools.js.map +1 -1
  86. package/dist/node-types/abort-task.d.ts.map +1 -1
  87. package/dist/node-types/abort-task.js +4 -3
  88. package/dist/node-types/abort-task.js.map +1 -1
  89. package/dist/node-types/agent-execute.d.ts +38 -0
  90. package/dist/node-types/agent-execute.d.ts.map +1 -0
  91. package/dist/node-types/agent-execute.js +256 -0
  92. package/dist/node-types/agent-execute.js.map +1 -0
  93. package/dist/node-types/bot-report.d.ts +5 -3
  94. package/dist/node-types/bot-report.d.ts.map +1 -1
  95. package/dist/node-types/bot-report.js +39 -7
  96. package/dist/node-types/bot-report.js.map +1 -1
  97. package/dist/node-types/build-context.d.ts +3 -3
  98. package/dist/node-types/build-context.d.ts.map +1 -1
  99. package/dist/node-types/build-context.js +108 -24
  100. package/dist/node-types/build-context.js.map +1 -1
  101. package/dist/node-types/detect-provider.d.ts +2 -2
  102. package/dist/node-types/detect-provider.d.ts.map +1 -1
  103. package/dist/node-types/detect-provider.js +3 -1
  104. package/dist/node-types/detect-provider.js.map +1 -1
  105. package/dist/node-types/exec-validate-retry.d.ts.map +1 -1
  106. package/dist/node-types/exec-validate-retry.js +43 -6
  107. package/dist/node-types/exec-validate-retry.js.map +1 -1
  108. package/dist/node-types/execute-plan.d.ts.map +1 -1
  109. package/dist/node-types/execute-plan.js +31 -8
  110. package/dist/node-types/execute-plan.js.map +1 -1
  111. package/dist/node-types/execute-target.d.ts.map +1 -1
  112. package/dist/node-types/execute-target.js +3 -1
  113. package/dist/node-types/execute-target.js.map +1 -1
  114. package/dist/node-types/fix-errors.d.ts.map +1 -1
  115. package/dist/node-types/fix-errors.js +21 -5
  116. package/dist/node-types/fix-errors.js.map +1 -1
  117. package/dist/node-types/genesis-observe.d.ts.map +1 -1
  118. package/dist/node-types/genesis-observe.js +3 -1
  119. package/dist/node-types/genesis-observe.js.map +1 -1
  120. package/dist/node-types/genesis-report.js +4 -1
  121. package/dist/node-types/genesis-report.js.map +1 -1
  122. package/dist/node-types/git-ops.d.ts.map +1 -1
  123. package/dist/node-types/git-ops.js +98 -4
  124. package/dist/node-types/git-ops.js.map +1 -1
  125. package/dist/node-types/index.d.ts +2 -0
  126. package/dist/node-types/index.d.ts.map +1 -1
  127. package/dist/node-types/index.js +2 -0
  128. package/dist/node-types/index.js.map +1 -1
  129. package/dist/node-types/load-config.d.ts +2 -2
  130. package/dist/node-types/load-config.d.ts.map +1 -1
  131. package/dist/node-types/load-config.js.map +1 -1
  132. package/dist/node-types/plan-task.d.ts.map +1 -1
  133. package/dist/node-types/plan-task.js +14 -2
  134. package/dist/node-types/plan-task.js.map +1 -1
  135. package/dist/node-types/read-workflow.js +8 -2
  136. package/dist/node-types/read-workflow.js.map +1 -1
  137. package/dist/node-types/receive-task.d.ts.map +1 -1
  138. package/dist/node-types/receive-task.js +35 -26
  139. package/dist/node-types/receive-task.js.map +1 -1
  140. package/dist/node-types/send-notify.js +2 -1
  141. package/dist/node-types/send-notify.js.map +1 -1
  142. package/dist/node-types/validate-gate.d.ts +18 -0
  143. package/dist/node-types/validate-gate.d.ts.map +1 -0
  144. package/dist/node-types/validate-gate.js +96 -0
  145. package/dist/node-types/validate-gate.js.map +1 -0
  146. package/dist/workflows/genesis-task.d.ts +20 -12
  147. package/dist/workflows/genesis-task.d.ts.map +1 -1
  148. package/dist/workflows/genesis-task.js +20 -12
  149. package/dist/workflows/genesis-task.js.map +1 -1
  150. package/dist/workflows/weaver-agent.d.ts +35 -0
  151. package/dist/workflows/weaver-agent.d.ts.map +1 -0
  152. package/dist/workflows/weaver-agent.js +777 -0
  153. package/dist/workflows/weaver-agent.js.map +1 -0
  154. package/dist/workflows/weaver-bot-batch.d.ts +19 -26
  155. package/dist/workflows/weaver-bot-batch.d.ts.map +1 -1
  156. package/dist/workflows/weaver-bot-batch.js +1043 -27
  157. package/dist/workflows/weaver-bot-batch.js.map +1 -1
  158. package/dist/workflows/weaver-bot.d.ts +21 -35
  159. package/dist/workflows/weaver-bot.d.ts.map +1 -1
  160. package/dist/workflows/weaver-bot.js +1119 -36
  161. package/dist/workflows/weaver-bot.js.map +1 -1
  162. package/flowweaver.manifest.json +21 -1
  163. package/package.json +5 -2
  164. package/src/bot/ai-client.ts +180 -19
  165. package/src/bot/assistant-core.ts +306 -0
  166. package/src/bot/assistant-tools.ts +605 -0
  167. package/src/bot/audit-logger.ts +6 -5
  168. package/src/bot/bot-manager.ts +293 -0
  169. package/src/bot/child-process-tracker.ts +40 -0
  170. package/src/bot/cli-provider.ts +13 -8
  171. package/src/bot/conversation-store.ts +222 -0
  172. package/src/bot/error-guide.ts +34 -0
  173. package/src/bot/knowledge-store.ts +59 -0
  174. package/src/bot/retry-utils.ts +76 -0
  175. package/src/bot/runner.ts +12 -1
  176. package/src/bot/session-state.ts +2 -1
  177. package/src/bot/steering.ts +1 -1
  178. package/src/bot/step-executor.ts +313 -5
  179. package/src/bot/system-prompt.ts +70 -47
  180. package/src/bot/task-decomposer.ts +100 -0
  181. package/src/bot/task-queue.ts +113 -7
  182. package/src/bot/terminal-renderer.ts +241 -0
  183. package/src/bot/types.ts +8 -0
  184. package/src/bot/weaver-tools.ts +225 -0
  185. package/src/cli-bridge.ts +7 -1
  186. package/src/cli-handlers.ts +625 -48
  187. package/src/mcp-tools.ts +2 -2
  188. package/src/node-types/abort-task.ts +5 -4
  189. package/src/node-types/agent-execute.ts +306 -0
  190. package/src/node-types/bot-report.ts +40 -9
  191. package/src/node-types/build-context.ts +112 -25
  192. package/src/node-types/detect-provider.ts +4 -3
  193. package/src/node-types/exec-validate-retry.ts +47 -8
  194. package/src/node-types/execute-plan.ts +32 -8
  195. package/src/node-types/execute-target.ts +2 -1
  196. package/src/node-types/fix-errors.ts +20 -5
  197. package/src/node-types/genesis-observe.ts +2 -1
  198. package/src/node-types/genesis-report.ts +1 -1
  199. package/src/node-types/git-ops.ts +93 -4
  200. package/src/node-types/index.ts +2 -0
  201. package/src/node-types/load-config.ts +3 -3
  202. package/src/node-types/plan-task.ts +15 -3
  203. package/src/node-types/read-workflow.ts +2 -2
  204. package/src/node-types/receive-task.ts +31 -26
  205. package/src/node-types/send-notify.ts +1 -1
  206. package/src/node-types/validate-gate.ts +112 -0
  207. package/src/workflows/genesis-task.ts +20 -12
  208. package/src/workflows/weaver-agent.ts +799 -0
  209. package/src/workflows/weaver-bot-batch.ts +1049 -27
  210. package/src/workflows/weaver-bot.ts +1123 -36
@@ -1,6 +1,12 @@
1
1
  import type { ProviderInfo } from './types.js';
2
- export declare function callCli(provider: string, prompt: string, model?: string): string;
3
- export declare function callCliAsync(provider: string, prompt: string, model?: string): Promise<string>;
2
+ export declare function callCli(provider: string, prompt: string, model?: string, systemPrompt?: string): string;
3
+ /**
4
+ * Extract the model's response from the claude CLI --output-format json wrapper.
5
+ * With --json-schema: structured_output contains the validated JSON.
6
+ * Without: result contains the raw text.
7
+ */
8
+ export declare function extractCliJsonResult(raw: string): string;
9
+ export declare function callCliAsync(provider: string, prompt: string, model?: string, systemPrompt?: string): Promise<string>;
4
10
  export declare function callApi(apiKey: string, model: string, maxTokens: number, systemPrompt: string, userPrompt: string): Promise<string>;
5
11
  /**
6
12
  * Call the platform-injected AI proxy (routes through IPC to the host process).
@@ -12,4 +18,18 @@ export declare function callPlatform(systemPrompt: string, userPrompt: string, m
12
18
  */
13
19
  export declare function callAI(pInfo: Pick<ProviderInfo, 'type' | 'apiKey' | 'model' | 'maxTokens'>, systemPrompt: string, userPrompt: string, defaultMaxTokens?: number): Promise<string>;
14
20
  export declare function parseJsonResponse(text: string): Record<string, unknown>;
21
+ export interface NormalizedPlan {
22
+ steps: Array<{
23
+ id: string;
24
+ operation: string;
25
+ description: string;
26
+ args: Record<string, unknown>;
27
+ }>;
28
+ summary: string;
29
+ }
30
+ /**
31
+ * Normalize an AI-generated plan into a consistent { steps, summary } shape.
32
+ * Handles: wrapped plans, bare arrays, flat objects, missing fields.
33
+ */
34
+ export declare function normalizePlan(parsed: unknown): NormalizedPlan;
15
35
  //# sourceMappingURL=ai-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-client.d.ts","sourceRoot":"","sources":["../../src/bot/ai-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,YAAY,CAAC;AAM5D,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAahF;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqDpG;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAChD,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GACvC,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CASjB;AAED;;GAEG;AACH,wBAAsB,MAAM,CAC1B,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC,EACpE,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,gBAAgB,SAAO,GACtB,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASvE"}
1
+ {"version":3,"file":"ai-client.d.ts","sourceRoot":"","sources":["../../src/bot/ai-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA4B/C,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAOvG;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoBxD;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqH3H;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAChD,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GACvC,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CASjB;AAED;;GAEG;AACH,wBAAsB,MAAM,CAC1B,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC,EACpE,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,gBAAgB,SAAO,GACtB,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASvE;AAMD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IACpG,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,CAoC7D"}
@@ -1,56 +1,164 @@
1
1
  import { execSync, spawn } from 'node:child_process';
2
- import { parseStreamLine, extractTextFromChunks } from './cli-stream-parser.js';
2
+ import { trackChild } from './child-process-tracker.js';
3
3
  // Strip CLAUDECODE from child env so nested claude CLI invocations work.
4
4
  const childEnv = { ...process.env };
5
5
  delete childEnv.CLAUDECODE;
6
- export function callCli(provider, prompt, model) {
7
- if (provider === 'claude-cli') {
8
- const modelFlag = model ? ` --model ${model}` : '';
9
- return execSync(`claude -p --output-format text${modelFlag}`, {
10
- input: prompt, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 300_000, env: childEnv,
11
- }).trim();
12
- }
6
+ /** JSON schema for Weaver plan responses — enforced via --json-schema. */
7
+ const PLAN_JSON_SCHEMA = JSON.stringify({
8
+ type: 'object',
9
+ properties: {
10
+ steps: {
11
+ type: 'array',
12
+ items: {
13
+ type: 'object',
14
+ properties: {
15
+ id: { type: 'string' },
16
+ operation: { type: 'string' },
17
+ description: { type: 'string' },
18
+ args: { type: 'object' },
19
+ },
20
+ required: ['id', 'operation', 'description', 'args'],
21
+ },
22
+ },
23
+ summary: { type: 'string' },
24
+ },
25
+ required: ['steps', 'summary'],
26
+ });
27
+ export function callCli(provider, prompt, model, systemPrompt) {
13
28
  if (provider === 'copilot-cli') {
14
29
  return execSync('copilot -p --silent --allow-all-tools', {
15
30
  input: prompt, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 300_000, env: childEnv,
16
31
  }).trim();
17
32
  }
18
- throw new Error(`Unknown CLI provider: ${provider}`);
33
+ throw new Error(`callCli only supports copilot-cli. Use callCliAsync for claude-cli.`);
19
34
  }
20
- export async function callCliAsync(provider, prompt, model) {
35
+ /**
36
+ * Extract the model's response from the claude CLI --output-format json wrapper.
37
+ * With --json-schema: structured_output contains the validated JSON.
38
+ * Without: result contains the raw text.
39
+ */
40
+ export function extractCliJsonResult(raw) {
41
+ const trimmed = raw.trim();
42
+ try {
43
+ const wrapper = JSON.parse(trimmed);
44
+ // Prefer structured_output (schema-validated JSON)
45
+ if (wrapper?.structured_output) {
46
+ return JSON.stringify(wrapper.structured_output);
47
+ }
48
+ // Fall back to result field (raw text)
49
+ if (typeof wrapper?.result === 'string' && wrapper.result.trim()) {
50
+ return wrapper.result;
51
+ }
52
+ // If wrapper has type: "result" but empty result, return the whole thing
53
+ if (wrapper?.type === 'result') {
54
+ return trimmed;
55
+ }
56
+ }
57
+ catch {
58
+ // Not valid JSON wrapper — return raw output
59
+ }
60
+ return trimmed;
61
+ }
62
+ export async function callCliAsync(provider, prompt, model, systemPrompt) {
21
63
  if (provider === 'copilot-cli') {
22
64
  return callCli(provider, prompt, model);
23
65
  }
24
66
  if (provider !== 'claude-cli') {
25
67
  throw new Error(`Unknown CLI provider: ${provider}`);
26
68
  }
27
- const args = ['-p', '--output-format', 'stream-json'];
69
+ // Flags matching the platform's proven CLI integration:
70
+ // --verbose + --output-format stream-json + --include-partial-messages for incremental streaming
71
+ // --json-schema for structured JSON output enforcement
72
+ // --dangerously-skip-permissions to prevent permission prompt hangs
73
+ const args = [
74
+ '-p', '--verbose',
75
+ '--output-format', 'stream-json',
76
+ '--include-partial-messages',
77
+ '--json-schema', PLAN_JSON_SCHEMA,
78
+ '--dangerously-skip-permissions',
79
+ ];
28
80
  if (model)
29
81
  args.push('--model', model);
82
+ if (systemPrompt)
83
+ args.push('--system-prompt', systemPrompt);
30
84
  const child = spawn('claude', args, {
31
85
  stdio: ['pipe', 'pipe', 'pipe'],
32
86
  env: childEnv,
33
87
  });
88
+ trackChild(child);
34
89
  child.stdin.write(prompt);
35
90
  child.stdin.end();
36
91
  const timeout = setTimeout(() => child.kill('SIGTERM'), 300_000);
37
- const chunks = [];
92
+ // Stream parsing — matches platform's proven approach from cli-providers/claude.ts.
93
+ // ONLY content_block_delta is reliable for incremental text.
94
+ // result event contains structured_output for --json-schema responses.
95
+ let resultJson = '';
38
96
  let buffer = '';
97
+ let hasStreamedText = false;
98
+ let inThinkingBlock = false;
39
99
  try {
40
100
  for await (const data of child.stdout) {
41
101
  buffer += data.toString();
42
102
  const lines = buffer.split('\n');
43
103
  buffer = lines.pop();
44
104
  for (const line of lines) {
45
- const chunk = parseStreamLine(line);
46
- if (chunk)
47
- chunks.push(chunk);
105
+ if (!line.trim())
106
+ continue;
107
+ try {
108
+ let event = JSON.parse(line);
109
+ // Unwrap stream_event wrapper (--include-partial-messages wraps API events)
110
+ if (event.type === 'stream_event' && event.event) {
111
+ event = event.event;
112
+ }
113
+ // Thinking block start — print indicator once
114
+ if (event.type === 'content_block_start' && event.content_block?.type === 'thinking') {
115
+ inThinkingBlock = true;
116
+ process.stderr.write('\x1b[90m thinking...\x1b[0m');
117
+ }
118
+ // Incremental thinking — dim text, no emoji per token
119
+ else if (event.type === 'content_block_delta' && event.delta?.type === 'thinking_delta' && event.delta?.thinking) {
120
+ // Don't stream every thinking token — just show we're thinking
121
+ }
122
+ // Text block start
123
+ else if (event.type === 'content_block_start' && event.content_block?.type === 'text') {
124
+ if (inThinkingBlock) {
125
+ process.stderr.write('\n');
126
+ inThinkingBlock = false;
127
+ }
128
+ }
129
+ // Incremental text — stream to stderr (chatbot-like output)
130
+ else if (event.type === 'content_block_delta' && event.delta?.type === 'text_delta' && event.delta?.text) {
131
+ hasStreamedText = true;
132
+ process.stderr.write(`\x1b[36m${event.delta.text}\x1b[0m`);
133
+ }
134
+ // Block boundary — newline
135
+ else if (event.type === 'content_block_stop') {
136
+ if (inThinkingBlock) {
137
+ process.stderr.write('\n');
138
+ inThinkingBlock = false;
139
+ }
140
+ }
141
+ // Result event — contains structured_output with --json-schema
142
+ else if (event.type === 'result') {
143
+ resultJson = line;
144
+ // Newline after streamed text
145
+ if (hasStreamedText)
146
+ process.stderr.write('\n');
147
+ }
148
+ }
149
+ catch {
150
+ // Non-JSON line — ignore
151
+ }
48
152
  }
49
153
  }
154
+ // Process remaining buffer
50
155
  if (buffer.trim()) {
51
- const chunk = parseStreamLine(buffer);
52
- if (chunk)
53
- chunks.push(chunk);
156
+ try {
157
+ const event = JSON.parse(buffer);
158
+ if (event.type === 'result')
159
+ resultJson = buffer;
160
+ }
161
+ catch { /* ignore */ }
54
162
  }
55
163
  }
56
164
  finally {
@@ -65,7 +173,7 @@ export async function callCliAsync(provider, prompt, model) {
65
173
  });
66
174
  child.on('error', reject);
67
175
  });
68
- return extractTextFromChunks(chunks);
176
+ return extractCliJsonResult(resultJson || buffer);
69
177
  }
70
178
  export async function callApi(apiKey, model, maxTokens, systemPrompt, userPrompt) {
71
179
  const body = JSON.stringify({
@@ -109,7 +217,10 @@ export async function callAI(pInfo, systemPrompt, userPrompt, defaultMaxTokens =
109
217
  if (pInfo.type === 'anthropic') {
110
218
  return callApi(pInfo.apiKey, pInfo.model ?? 'claude-sonnet-4-6', pInfo.maxTokens ?? defaultMaxTokens, systemPrompt, userPrompt);
111
219
  }
112
- return callCli(pInfo.type, systemPrompt + '\n\n' + userPrompt, pInfo.model);
220
+ // Async-only path: uses spawn() so Ctrl+C can kill child processes.
221
+ // Also uses --output-format json + --json-schema to enforce JSON output
222
+ // (eliminates hallucination entirely — no retry needed).
223
+ return callCliAsync(pInfo.type, userPrompt, pInfo.model, systemPrompt);
113
224
  }
114
225
  export function parseJsonResponse(text) {
115
226
  let cleaned = text.trim();
@@ -125,4 +236,41 @@ export function parseJsonResponse(text) {
125
236
  return JSON.parse(match[0]);
126
237
  throw new Error(`Failed to parse AI response as JSON: ${text.slice(0, 200)}`);
127
238
  }
239
+ /**
240
+ * Normalize an AI-generated plan into a consistent { steps, summary } shape.
241
+ * Handles: wrapped plans, bare arrays, flat objects, missing fields.
242
+ */
243
+ export function normalizePlan(parsed) {
244
+ const obj = parsed;
245
+ // Case 1: already has steps array
246
+ let steps;
247
+ if (Array.isArray(obj?.steps)) {
248
+ steps = obj.steps;
249
+ }
250
+ // Case 2: wrapped in plan.steps
251
+ else if (obj?.plan && Array.isArray(obj.plan.steps)) {
252
+ steps = obj.plan.steps;
253
+ }
254
+ // Case 3: parsed is itself an array
255
+ else if (Array.isArray(parsed)) {
256
+ steps = parsed;
257
+ }
258
+ if (!steps) {
259
+ return { steps: [], summary: obj?.summary ?? 'No valid steps in AI response' };
260
+ }
261
+ // Normalize each step
262
+ const normalized = steps
263
+ .filter((s) => s != null && typeof s === 'object' && !Array.isArray(s))
264
+ .map((step, idx) => ({
265
+ id: step.id ?? `step-${idx + 1}`,
266
+ operation: step.operation ?? '',
267
+ description: step.description ?? step.operation ?? `Step ${idx + 1}`,
268
+ args: step.args ?? {},
269
+ }))
270
+ .filter(s => s.operation !== ''); // Drop steps with no operation
271
+ return {
272
+ steps: normalized,
273
+ summary: obj?.summary ?? `${normalized.length} steps`,
274
+ };
275
+ }
128
276
  //# sourceMappingURL=ai-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-client.js","sourceRoot":"","sources":["../../src/bot/ai-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAGhF,yEAAyE;AACzE,MAAM,QAAQ,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AACpC,OAAO,QAAQ,CAAC,UAAU,CAAC;AAE3B,MAAM,UAAU,OAAO,CAAC,QAAgB,EAAE,MAAc,EAAE,KAAc;IACtE,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,OAAO,QAAQ,CAAC,iCAAiC,SAAS,EAAE,EAAE;YAC5D,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;SACnG,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC/B,OAAO,QAAQ,CAAC,uCAAuC,EAAE;YACvD,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;SACnG,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,MAAc,EAAE,KAAc;IACjF,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;IACtD,IAAI,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE;QAClC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAC/B,GAAG,EAAE,QAAQ;KACd,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IAElB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;IAEjE,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;YAEtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;gBACpC,IAAI,KAAK;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC;gBAAE,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC,CAAC;;gBAC5E,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAc,EAAE,KAAa,EAAE,SAAiB,EAChD,YAAoB,EAAE,UAAkB;IAExC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY;QAClD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;KAClD,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uCAAuC,EAAE;QACpE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,mBAAmB,EAAE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE;QACvG,IAAI;KACL,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAwD,CAAC;IACzF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,YAAoB,EACpB,UAAkB,EAClB,KAAc,EACd,SAAkB;IAElB,MAAM,QAAQ,GAAI,UAAkB,CAAC,mBAAmB,CAAC;IACzD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG;QACf,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;QACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE;KACtC,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACrE,OAAO,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,KAAoE,EACpE,YAAoB,EACpB,UAAkB,EAClB,gBAAgB,GAAG,IAAI;IAEvB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,YAAY,CAAC,YAAY,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,IAAI,gBAAgB,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC/B,OAAO,OAAO,CACZ,KAAK,CAAC,MAAO,EACb,KAAK,CAAC,KAAK,IAAI,mBAAmB,EAClC,KAAK,CAAC,SAAS,IAAI,gBAAgB,EACnC,YAAY,EACZ,UAAU,CACX,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,GAAG,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC3C,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAChF,CAAC"}
1
+ {"version":3,"file":"ai-client.js","sourceRoot":"","sources":["../../src/bot/ai-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Assistant Core — provider-agnostic conversational loop.
3
+ * The user types, the assistant responds with text and tool calls.
4
+ * UI-agnostic: terminal is one frontend, platform AI chat is another.
5
+ *
6
+ * Supports two provider modes:
7
+ * - CLI provider: tools handled internally via MCP bridge (tool_result events)
8
+ * - API provider: tools collected and executed manually (tool_use_start/end events)
9
+ */
10
+ import { type AgentProvider, type ToolDefinition, type ToolExecutor } from '@synergenius/flow-weaver/agent';
11
+ export interface AssistantOptions {
12
+ provider: AgentProvider;
13
+ tools: ToolDefinition[];
14
+ executor: ToolExecutor;
15
+ projectDir: string;
16
+ systemPrompt?: string;
17
+ /** Override for testing — provide messages instead of reading stdin */
18
+ inputMessages?: string[];
19
+ /** Resume a specific conversation by ID */
20
+ resumeId?: string;
21
+ /** Always start a fresh conversation */
22
+ newConversation?: boolean;
23
+ }
24
+ export declare function runAssistant(opts: AssistantOptions): Promise<void>;
25
+ //# sourceMappingURL=assistant-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistant-core.d.ts","sourceRoot":"","sources":["../../src/bot/assistant-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,cAAc,EACnB,KAAK,YAAY,EAElB,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,QAAQ,EAAE,YAAY,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAqCD,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiKxE"}
@@ -0,0 +1,265 @@
1
+ /**
2
+ * Assistant Core — provider-agnostic conversational loop.
3
+ * The user types, the assistant responds with text and tool calls.
4
+ * UI-agnostic: terminal is one frontend, platform AI chat is another.
5
+ *
6
+ * Supports two provider modes:
7
+ * - CLI provider: tools handled internally via MCP bridge (tool_result events)
8
+ * - API provider: tools collected and executed manually (tool_use_start/end events)
9
+ */
10
+ import * as readline from 'node:readline';
11
+ import { runAgentLoop, } from '@synergenius/flow-weaver/agent';
12
+ const DEFAULT_SYSTEM_PROMPT = `You are Weaver Assistant — a director-level AI that manages bot workers and the flow-weaver ecosystem.
13
+
14
+ You help users:
15
+ 1. Spawn and manage multiple bot sessions (bot_spawn, bot_list, bot_status, bot_pause, bot_resume, bot_stop, bot_logs)
16
+ 2. Queue tasks for bots (queue_add, queue_add_batch, queue_list, queue_retry)
17
+ 3. Inspect workflows (fw_validate, fw_diagram, fw_describe)
18
+ 4. Read and analyze project files (read_file, list_files, run_shell)
19
+ 5. Generate reports on bot progress and costs
20
+
21
+ USE TOOLS to fulfill requests. Don't describe what you'd do — actually do it.
22
+ When the user asks to "start a bot", call bot_spawn.
23
+ When they ask for status, call bot_list or bot_status.
24
+ When they ask to add tasks, call queue_add or queue_add_batch.
25
+
26
+ Be concise. Show results, not explanations.
27
+ The user is a senior engineer — don't over-explain.
28
+
29
+ CRITICAL: You are running in a terminal. Do NOT use markdown formatting.
30
+ - No **bold**, no _italic_, no \`backticks\`, no tables with |pipes|
31
+ - No emoji (✅, 🔴, etc.)
32
+ - Use plain text with indentation for structure
33
+ - Use UPPERCASE or quotes for emphasis instead of markdown
34
+ - For lists, use simple dashes: - item
35
+ - For key-value pairs, use: key: value (one per line)
36
+ - Keep output scannable and clean`;
37
+ // ANSI helpers
38
+ const c = {
39
+ cyan: (s) => `\x1b[36m${s}\x1b[0m`,
40
+ dim: (s) => `\x1b[2m${s}\x1b[0m`,
41
+ bold: (s) => `\x1b[1m${s}\x1b[0m`,
42
+ green: (s) => `\x1b[32m${s}\x1b[0m`,
43
+ red: (s) => `\x1b[31m${s}\x1b[0m`,
44
+ };
45
+ export async function runAssistant(opts) {
46
+ const { provider, tools, executor, projectDir } = opts;
47
+ // Build system prompt — include project plan if it exists
48
+ let systemPrompt = opts.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;
49
+ try {
50
+ const fs = await import('node:fs');
51
+ const path = await import('node:path');
52
+ const planPath = path.resolve(projectDir, '.weaver-plan.md');
53
+ if (fs.existsSync(planPath)) {
54
+ const plan = fs.readFileSync(planPath, 'utf-8').trim();
55
+ systemPrompt += '\n\n## Project Plan & Vision\n\nAll bots you spawn and tasks you queue MUST align with this plan.\n\n' + plan;
56
+ }
57
+ }
58
+ catch { /* plan not available */ }
59
+ const out = (s) => process.stderr.write(s);
60
+ // Persistent conversation store
61
+ const { ConversationStore } = await import('./conversation-store.js');
62
+ const store = new ConversationStore();
63
+ // Resolve conversation: resume, new, or auto
64
+ let conversation;
65
+ const history = [];
66
+ if (opts.resumeId) {
67
+ const existing = store.get(opts.resumeId);
68
+ if (!existing) {
69
+ out(` ${c.red('Conversation not found:')} ${opts.resumeId}\n`);
70
+ return;
71
+ }
72
+ conversation = existing;
73
+ history.push(...store.loadMessages(existing.id));
74
+ compressHistory(history);
75
+ }
76
+ else if (opts.newConversation) {
77
+ conversation = store.create(projectDir);
78
+ }
79
+ else {
80
+ // Auto-resume most recent if within 1 hour, else create new
81
+ const recent = store.getMostRecent();
82
+ if (recent && Date.now() - recent.lastMessageAt < 3600_000) {
83
+ conversation = recent;
84
+ history.push(...store.loadMessages(recent.id));
85
+ compressHistory(history);
86
+ }
87
+ else {
88
+ conversation = store.create(projectDir);
89
+ }
90
+ }
91
+ // Welcome
92
+ out(`\n ${c.bold('weaver assistant')}\n`);
93
+ out(` ${c.dim(`Project: ${projectDir}`)}\n`);
94
+ if (conversation.title) {
95
+ out(` ${c.dim(`Resuming: "${conversation.title}" (${conversation.messageCount} messages)`)}\n`);
96
+ }
97
+ else {
98
+ out(` ${c.dim(`Conversation: ${conversation.id}`)}\n`);
99
+ }
100
+ out(` ${c.dim('Type your request. Ctrl+C to exit.')}\n\n`);
101
+ // Input source
102
+ const rl = opts.inputMessages
103
+ ? null
104
+ : readline.createInterface({ input: process.stdin, output: process.stderr, prompt: `${c.cyan('❯')} ` });
105
+ const getNextInput = opts.inputMessages
106
+ ? (() => {
107
+ let i = 0;
108
+ return () => Promise.resolve(opts.inputMessages[i++] ?? null);
109
+ })()
110
+ : () => new Promise((resolve) => {
111
+ rl.prompt();
112
+ rl.once('line', (line) => resolve(line.trim() || null));
113
+ rl.once('close', () => resolve(null));
114
+ });
115
+ const onStreamEvent = (event) => {
116
+ if (event.type === 'text_delta') {
117
+ out(event.text);
118
+ }
119
+ else if (event.type === 'thinking_delta') {
120
+ out(c.dim(event.text));
121
+ }
122
+ };
123
+ const onToolEvent = (event) => {
124
+ if (event.type === 'tool_call_start') {
125
+ const preview = toolPreview(event.name, event.args ?? {});
126
+ out(`\n ${c.cyan('◆')} ${event.name}${preview ? c.dim(`(${preview})`) : ''}\n`);
127
+ }
128
+ if (event.type === 'tool_call_result') {
129
+ const icon = event.isError ? c.red('✗') : c.dim('→');
130
+ const result = (event.result ?? '').replace(/\n/g, ' ').slice(0, 150);
131
+ out(` ${icon} ${result}\n`);
132
+ }
133
+ };
134
+ // Main conversation loop
135
+ while (true) {
136
+ const input = await getNextInput();
137
+ if (input === null)
138
+ break;
139
+ if (!input.trim())
140
+ continue;
141
+ out('\n');
142
+ // Add user message to history
143
+ history.push({ role: 'user', content: input });
144
+ try {
145
+ const result = await runAgentLoop(provider, tools, executor, history, // full conversation history
146
+ {
147
+ systemPrompt,
148
+ maxIterations: 20,
149
+ onStreamEvent,
150
+ onToolEvent,
151
+ });
152
+ // Collect new messages from the agent loop
153
+ const newMessages = [];
154
+ if (result.messages.length > history.length) {
155
+ for (let i = history.length; i < result.messages.length; i++) {
156
+ history.push(result.messages[i]);
157
+ newMessages.push(result.messages[i]);
158
+ }
159
+ }
160
+ // Persist to disk
161
+ const tokensUsed = result.usage.promptTokens + result.usage.completionTokens;
162
+ store.appendMessages(conversation.id, [{ role: 'user', content: input }, ...newMessages]);
163
+ store.updateAfterTurn(conversation.id, [{ role: 'user', content: input }, ...newMessages], tokensUsed);
164
+ // Auto-title from first assistant response
165
+ if (!conversation.title) {
166
+ const firstAssistant = newMessages.find(m => m.role === 'assistant');
167
+ if (firstAssistant && typeof firstAssistant.content === 'string') {
168
+ const title = firstAssistant.content.split('\n')[0].slice(0, 80).trim();
169
+ if (title) {
170
+ conversation.title = title;
171
+ store.setTitle(conversation.id, title);
172
+ }
173
+ }
174
+ }
175
+ // Token-aware compression
176
+ compressHistory(history);
177
+ if (!result.success && result.summary) {
178
+ out(`\n ${c.red(result.summary)}\n`);
179
+ }
180
+ }
181
+ catch (err) {
182
+ const msg = err instanceof Error ? err.message : String(err);
183
+ out(`\n ${c.red('Error:')} ${msg}\n`);
184
+ }
185
+ out('\n');
186
+ }
187
+ rl?.close();
188
+ out(`\n ${c.dim('Goodbye.')}\n\n`);
189
+ }
190
+ function toolPreview(name, args) {
191
+ if (args.name)
192
+ return String(args.name);
193
+ if (args.bot)
194
+ return String(args.bot);
195
+ if (args.file)
196
+ return String(args.file).split('/').pop() ?? '';
197
+ if (args.path)
198
+ return String(args.path).split('/').pop() ?? '';
199
+ if (args.instruction)
200
+ return String(args.instruction).slice(0, 40);
201
+ if (args.command)
202
+ return String(args.command).slice(0, 40);
203
+ return '';
204
+ }
205
+ // --- Token-aware history compression ---
206
+ // Rough token estimate: ~4 chars per token for English text
207
+ const CHARS_PER_TOKEN = 4;
208
+ // Budget: leave room for system prompt (~2k) + tools (~3k) + response (~4k)
209
+ const MAX_HISTORY_TOKENS = 80_000;
210
+ // When compressing, truncate tool results to this size
211
+ const COMPRESSED_TOOL_RESULT_SIZE = 200;
212
+ function estimateTokens(msg) {
213
+ const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);
214
+ return Math.ceil(content.length / CHARS_PER_TOKEN);
215
+ }
216
+ function totalTokens(history) {
217
+ return history.reduce((sum, m) => sum + estimateTokens(m), 0);
218
+ }
219
+ /**
220
+ * Compress conversation history to stay within token budget.
221
+ * Strategy (progressive, stops as soon as under budget):
222
+ * 1. Truncate long tool results to 200 chars (keep tool call structure)
223
+ * 2. Summarize old tool results to just "[tool_name: ok/error]"
224
+ * 3. Drop oldest turns (keep most recent 10 turns)
225
+ */
226
+ function compressHistory(history) {
227
+ if (totalTokens(history) <= MAX_HISTORY_TOKENS)
228
+ return;
229
+ // Phase 1: Truncate tool results older than last 6 messages
230
+ const cutoff = Math.max(0, history.length - 6);
231
+ for (let i = 0; i < cutoff; i++) {
232
+ const msg = history[i];
233
+ if (msg.role === 'tool' && typeof msg.content === 'string' && msg.content.length > COMPRESSED_TOOL_RESULT_SIZE) {
234
+ msg.content = msg.content.slice(0, COMPRESSED_TOOL_RESULT_SIZE) + '... (truncated)';
235
+ }
236
+ }
237
+ if (totalTokens(history) <= MAX_HISTORY_TOKENS)
238
+ return;
239
+ // Phase 2: Summarize all tool results older than last 10 messages
240
+ const summaryCutoff = Math.max(0, history.length - 10);
241
+ for (let i = 0; i < summaryCutoff; i++) {
242
+ const msg = history[i];
243
+ if (msg.role === 'tool' && typeof msg.content === 'string') {
244
+ const isError = msg.content.toLowerCase().includes('error') || msg.content.toLowerCase().includes('not found');
245
+ msg.content = isError ? '(error — details truncated)' : '(ok — details truncated)';
246
+ }
247
+ // Also truncate long assistant messages
248
+ if (msg.role === 'assistant' && typeof msg.content === 'string' && msg.content.length > 500) {
249
+ msg.content = msg.content.slice(0, 500) + '... (truncated)';
250
+ }
251
+ }
252
+ if (totalTokens(history) <= MAX_HISTORY_TOKENS)
253
+ return;
254
+ // Phase 3: Drop oldest turns, keep last 10 messages
255
+ const keep = 10;
256
+ if (history.length > keep) {
257
+ // Insert a summary of what was dropped
258
+ const dropped = history.length - keep;
259
+ history.splice(0, dropped, {
260
+ role: 'user',
261
+ content: `(${dropped} earlier messages compressed. Key context: this is an ongoing assistant session managing bots and workflows.)`,
262
+ });
263
+ }
264
+ }
265
+ //# sourceMappingURL=assistant-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistant-core.js","sourceRoot":"","sources":["../../src/bot/assistant-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Assistant tool definitions and executor.
3
+ * These are the tools the AI assistant uses to manage bots,
4
+ * queues, and the flow-weaver ecosystem.
5
+ */
6
+ import type { ToolDefinition, ToolExecutor } from '@synergenius/flow-weaver/agent';
7
+ export declare const ASSISTANT_TOOLS: ToolDefinition[];
8
+ export declare function createAssistantExecutor(projectDir: string): ToolExecutor;
9
+ //# sourceMappingURL=assistant-tools.d.ts.map