@synergenius/flowweaver-pack-weaver 0.1.0

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 (49) hide show
  1. package/dist/bot/agent-provider.d.ts +24 -0
  2. package/dist/bot/agent-provider.d.ts.map +1 -0
  3. package/dist/bot/agent-provider.js +95 -0
  4. package/dist/bot/agent-provider.js.map +1 -0
  5. package/dist/bot/bot-agent-channel.d.ts +30 -0
  6. package/dist/bot/bot-agent-channel.d.ts.map +1 -0
  7. package/dist/bot/bot-agent-channel.js +44 -0
  8. package/dist/bot/bot-agent-channel.js.map +1 -0
  9. package/dist/bot/cli-provider.d.ts +12 -0
  10. package/dist/bot/cli-provider.d.ts.map +1 -0
  11. package/dist/bot/cli-provider.js +50 -0
  12. package/dist/bot/cli-provider.js.map +1 -0
  13. package/dist/bot/index.d.ts +11 -0
  14. package/dist/bot/index.d.ts.map +1 -0
  15. package/dist/bot/index.js +7 -0
  16. package/dist/bot/index.js.map +1 -0
  17. package/dist/bot/notifications.d.ts +18 -0
  18. package/dist/bot/notifications.d.ts.map +1 -0
  19. package/dist/bot/notifications.js +144 -0
  20. package/dist/bot/notifications.js.map +1 -0
  21. package/dist/bot/runner.d.ts +8 -0
  22. package/dist/bot/runner.d.ts.map +1 -0
  23. package/dist/bot/runner.js +123 -0
  24. package/dist/bot/runner.js.map +1 -0
  25. package/dist/bot/system-prompt.d.ts +6 -0
  26. package/dist/bot/system-prompt.d.ts.map +1 -0
  27. package/dist/bot/system-prompt.js +161 -0
  28. package/dist/bot/system-prompt.js.map +1 -0
  29. package/dist/bot/types.d.ts +44 -0
  30. package/dist/bot/types.d.ts.map +1 -0
  31. package/dist/bot/types.js +2 -0
  32. package/dist/bot/types.js.map +1 -0
  33. package/dist/docs/docs/weaver-config.md +141 -0
  34. package/dist/docs/weaver-config.md +141 -0
  35. package/dist/index.d.ts +9 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +9 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/templates/index.d.ts +5 -0
  40. package/dist/templates/index.d.ts.map +1 -0
  41. package/dist/templates/index.js +4 -0
  42. package/dist/templates/index.js.map +1 -0
  43. package/dist/templates/weaver-template.d.ts +11 -0
  44. package/dist/templates/weaver-template.d.ts.map +1 -0
  45. package/dist/templates/weaver-template.js +672 -0
  46. package/dist/templates/weaver-template.js.map +1 -0
  47. package/flowweaver.manifest.json +42 -0
  48. package/package.json +45 -0
  49. package/templates.js +1 -0
@@ -0,0 +1,24 @@
1
+ import type { BotProviderConfig, BotConfig } from './types.js';
2
+ export interface BotAgentProvider {
3
+ decide(request: {
4
+ agentId: string;
5
+ context: Record<string, unknown>;
6
+ prompt: string;
7
+ }): Promise<Record<string, unknown>>;
8
+ }
9
+ export declare function resolveProviderConfig(provider: BotConfig['provider']): BotProviderConfig;
10
+ export declare function createProvider(config: BotProviderConfig): BotAgentProvider;
11
+ export declare function detectProvider(): BotProviderConfig;
12
+ export declare class AnthropicAgentProvider implements BotAgentProvider {
13
+ private model;
14
+ private maxTokens;
15
+ constructor(config: BotProviderConfig);
16
+ decide(request: {
17
+ agentId: string;
18
+ context: Record<string, unknown>;
19
+ prompt: string;
20
+ }): Promise<Record<string, unknown>>;
21
+ private parseJson;
22
+ private loadSdk;
23
+ }
24
+ //# sourceMappingURL=agent-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-provider.d.ts","sourceRoot":"","sources":["../../src/bot/agent-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI/D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,OAAO,EAAE;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtC;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,GAC9B,iBAAiB,CAInB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,gBAAgB,CAM1E;AAED,wBAAgB,cAAc,IAAI,iBAAiB,CAmBlD;AAED,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,iBAAiB;IAK/B,MAAM,CAAC,OAAO,EAAE;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAiCpC,OAAO,CAAC,SAAS;YAiBH,OAAO;CAwBtB"}
@@ -0,0 +1,95 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { buildSystemPrompt } from './system-prompt.js';
3
+ import { CliAgentProvider } from './cli-provider.js';
4
+ export function resolveProviderConfig(provider) {
5
+ if (provider === 'auto')
6
+ return detectProvider();
7
+ if (typeof provider === 'string')
8
+ return { name: provider };
9
+ return provider;
10
+ }
11
+ export function createProvider(config) {
12
+ if (config.name === 'anthropic')
13
+ return new AnthropicAgentProvider(config);
14
+ if (config.name === 'claude-cli' || config.name === 'copilot-cli') {
15
+ return new CliAgentProvider(config.name);
16
+ }
17
+ throw new Error(`Unknown provider: ${config.name}`);
18
+ }
19
+ export function detectProvider() {
20
+ if (process.env.ANTHROPIC_API_KEY)
21
+ return { name: 'anthropic' };
22
+ try {
23
+ execSync('which claude', { stdio: 'pipe' });
24
+ return { name: 'claude-cli' };
25
+ }
26
+ catch { /* not installed */ }
27
+ try {
28
+ execSync('which copilot', { stdio: 'pipe' });
29
+ return { name: 'copilot-cli' };
30
+ }
31
+ catch { /* not installed */ }
32
+ throw new Error('No AI provider found. Options:\n' +
33
+ ' 1. Set ANTHROPIC_API_KEY environment variable\n' +
34
+ ' 2. Install Claude CLI: https://docs.anthropic.com/claude-code\n' +
35
+ ' 3. Install GitHub Copilot CLI: https://github.com/features/copilot');
36
+ }
37
+ export class AnthropicAgentProvider {
38
+ model;
39
+ maxTokens;
40
+ constructor(config) {
41
+ this.model = config.model ?? 'claude-sonnet-4-6';
42
+ this.maxTokens = config.maxTokens ?? 4096;
43
+ }
44
+ async decide(request) {
45
+ if (!process.env.ANTHROPIC_API_KEY) {
46
+ throw new Error('ANTHROPIC_API_KEY environment variable is required for the Anthropic provider');
47
+ }
48
+ const Anthropic = await this.loadSdk();
49
+ const client = new Anthropic();
50
+ const systemPrompt = await buildSystemPrompt();
51
+ const contextStr = typeof request.context === 'string'
52
+ ? request.context
53
+ : JSON.stringify(request.context, null, 2);
54
+ const response = await client.messages.create({
55
+ model: this.model,
56
+ max_tokens: this.maxTokens,
57
+ system: systemPrompt,
58
+ messages: [
59
+ {
60
+ role: 'user',
61
+ content: `Context:\n${contextStr}\n\nInstructions:\n${request.prompt}`,
62
+ },
63
+ ],
64
+ });
65
+ const text = response.content[0].type === 'text' ? response.content[0].text : '';
66
+ return this.parseJson(text);
67
+ }
68
+ parseJson(text) {
69
+ let cleaned = text.trim();
70
+ if (cleaned.startsWith('```')) {
71
+ cleaned = cleaned.replace(/^```(?:json)?\s*\n?/, '').replace(/\n?```\s*$/, '');
72
+ }
73
+ try {
74
+ return JSON.parse(cleaned);
75
+ }
76
+ catch {
77
+ const match = cleaned.match(/\{[\s\S]*\}/);
78
+ if (match) {
79
+ return JSON.parse(match[0]);
80
+ }
81
+ throw new Error(`Failed to parse AI response as JSON: ${text.slice(0, 200)}`);
82
+ }
83
+ }
84
+ async loadSdk() {
85
+ try {
86
+ // @ts-expect-error -- optional peer dep, loaded at runtime
87
+ const mod = await import('@anthropic-ai/sdk');
88
+ return mod.default ?? mod.Anthropic;
89
+ }
90
+ catch {
91
+ throw new Error('Bot mode requires @anthropic-ai/sdk. Install it:\n npm install @anthropic-ai/sdk');
92
+ }
93
+ }
94
+ }
95
+ //# sourceMappingURL=agent-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-provider.js","sourceRoot":"","sources":["../../src/bot/agent-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { BotAgentProvider } from './agent-provider.js';
2
+ import type { NotificationEvent } from './types.js';
3
+ export interface BotChannelContext {
4
+ projectDir: string;
5
+ workflowFile?: string;
6
+ cycle?: number;
7
+ }
8
+ export declare class BotAgentChannel {
9
+ private provider;
10
+ private approvalMode;
11
+ private approvalTimeoutSeconds;
12
+ private notifier;
13
+ private context;
14
+ constructor(provider: BotAgentProvider, options: {
15
+ approvalMode: 'auto' | 'timeout-auto';
16
+ approvalTimeoutSeconds: number;
17
+ notifier: (event: NotificationEvent) => Promise<void>;
18
+ context: BotChannelContext;
19
+ });
20
+ request(agentRequest: {
21
+ agentId: string;
22
+ context: Record<string, unknown>;
23
+ prompt: string;
24
+ }): Promise<object>;
25
+ private handleApproval;
26
+ onPause(): Promise<object>;
27
+ resume(_result: object): void;
28
+ fail(_reason: string): void;
29
+ }
30
+ //# sourceMappingURL=bot-agent-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-agent-channel.d.ts","sourceRoot":"","sources":["../../src/bot/bot-agent-channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,QAAQ,CAA8C;IAC9D,OAAO,CAAC,OAAO,CAAoB;gBAGjC,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,GAAG,cAAc,CAAC;QACtC,sBAAsB,EAAE,MAAM,CAAC;QAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,EAAE,iBAAiB,CAAC;KAC5B;IASG,OAAO,CAAC,YAAY,EAAE;QAC1B,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,MAAM,CAAC;YAOL,cAAc;IAwB5B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAG1B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAC5B"}
@@ -0,0 +1,44 @@
1
+ export class BotAgentChannel {
2
+ provider;
3
+ approvalMode;
4
+ approvalTimeoutSeconds;
5
+ notifier;
6
+ context;
7
+ constructor(provider, options) {
8
+ this.provider = provider;
9
+ this.approvalMode = options.approvalMode;
10
+ this.approvalTimeoutSeconds = options.approvalTimeoutSeconds;
11
+ this.notifier = options.notifier;
12
+ this.context = options.context;
13
+ }
14
+ async request(agentRequest) {
15
+ if (agentRequest.agentId.includes('approval')) {
16
+ return this.handleApproval(agentRequest);
17
+ }
18
+ return this.provider.decide(agentRequest);
19
+ }
20
+ async handleApproval(request) {
21
+ const event = {
22
+ type: 'approval-needed',
23
+ cycle: this.context.cycle,
24
+ projectDir: this.context.projectDir,
25
+ workflowFile: this.context.workflowFile,
26
+ proposal: request.context,
27
+ };
28
+ if (this.approvalMode === 'auto') {
29
+ await this.notifier(event);
30
+ return { approved: true, reason: 'auto-approved by Weaver' };
31
+ }
32
+ // timeout-auto: notify, wait, then auto-approve
33
+ await this.notifier(event);
34
+ await new Promise((r) => setTimeout(r, this.approvalTimeoutSeconds * 1000));
35
+ return { approved: true, reason: `auto-approved after ${this.approvalTimeoutSeconds}s timeout` };
36
+ }
37
+ // Compat stubs for AgentChannel interface (used by executor, not by nodes)
38
+ onPause() {
39
+ return new Promise(() => { });
40
+ }
41
+ resume(_result) { }
42
+ fail(_reason) { }
43
+ }
44
+ //# sourceMappingURL=bot-agent-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-agent-channel.js","sourceRoot":"","sources":["../../src/bot/bot-agent-channel.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,eAAe;IAClB,QAAQ,CAAmB;IAC3B,YAAY,CAA0B;IACtC,sBAAsB,CAAS;IAC/B,QAAQ,CAA8C;IACtD,OAAO,CAAoB;IAEnC,YACE,QAA0B,EAC1B,OAKC;QAED,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;QAC7D,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,YAIb;QACC,IAAI,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,OAG5B;QACC,MAAM,KAAK,GAAsB;YAC/B,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YACzB,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;YACnC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;YACvC,QAAQ,EAAE,OAAO,CAAC,OAAO;SAC1B,CAAC;QAEF,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;QAC/D,CAAC;QAED,gDAAgD;QAChD,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC,CAAC;QAC5E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,uBAAuB,IAAI,CAAC,sBAAsB,WAAW,EAAE,CAAC;IACnG,CAAC;IAED,2EAA2E;IAC3E,OAAO;QACL,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,CAAC,OAAe,IAAS,CAAC;IAChC,IAAI,CAAC,OAAe,IAAS,CAAC;CAC/B"}
@@ -0,0 +1,12 @@
1
+ import type { BotAgentProvider } from './agent-provider.js';
2
+ export declare class CliAgentProvider implements BotAgentProvider {
3
+ private cli;
4
+ constructor(cli: 'claude-cli' | 'copilot-cli');
5
+ decide(request: {
6
+ agentId: string;
7
+ context: Record<string, unknown>;
8
+ prompt: string;
9
+ }): Promise<Record<string, unknown>>;
10
+ private parseJson;
11
+ }
12
+ //# sourceMappingURL=cli-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-provider.d.ts","sourceRoot":"","sources":["../../src/bot/cli-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,OAAO,CAAC,GAAG,CAA+B;gBAE9B,GAAG,EAAE,YAAY,GAAG,aAAa;IAIvC,MAAM,CAAC,OAAO,EAAE;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IA8BpC,OAAO,CAAC,SAAS;CAgBlB"}
@@ -0,0 +1,50 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { buildSystemPrompt } from './system-prompt.js';
3
+ export class CliAgentProvider {
4
+ cli;
5
+ constructor(cli) {
6
+ this.cli = cli;
7
+ }
8
+ async decide(request) {
9
+ const systemPrompt = await buildSystemPrompt();
10
+ const contextStr = typeof request.context === 'string'
11
+ ? request.context
12
+ : JSON.stringify(request.context, null, 2);
13
+ const fullPrompt = `${systemPrompt}\n\nContext:\n${contextStr}\n\nInstructions:\n${request.prompt}`;
14
+ let raw;
15
+ if (this.cli === 'claude-cli') {
16
+ raw = execSync('claude -p --output-format text', {
17
+ input: fullPrompt,
18
+ encoding: 'utf-8',
19
+ stdio: ['pipe', 'pipe', 'pipe'],
20
+ timeout: 120_000,
21
+ }).trim();
22
+ }
23
+ else {
24
+ raw = execSync('copilot -p --silent --allow-all-tools', {
25
+ input: fullPrompt,
26
+ encoding: 'utf-8',
27
+ stdio: ['pipe', 'pipe', 'pipe'],
28
+ timeout: 120_000,
29
+ }).trim();
30
+ }
31
+ return this.parseJson(raw);
32
+ }
33
+ parseJson(text) {
34
+ let cleaned = text.trim();
35
+ if (cleaned.startsWith('```')) {
36
+ cleaned = cleaned.replace(/^```(?:json)?\s*\n?/, '').replace(/\n?```\s*$/, '');
37
+ }
38
+ try {
39
+ return JSON.parse(cleaned);
40
+ }
41
+ catch {
42
+ const match = cleaned.match(/\{[\s\S]*\}/);
43
+ if (match) {
44
+ return JSON.parse(match[0]);
45
+ }
46
+ throw new Error(`Failed to parse CLI response as JSON: ${text.slice(0, 200)}`);
47
+ }
48
+ }
49
+ }
50
+ //# sourceMappingURL=cli-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-provider.js","sourceRoot":"","sources":["../../src/bot/cli-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,OAAO,gBAAgB;IACnB,GAAG,CAA+B;IAE1C,YAAY,GAAiC;QAC3C,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAIZ;QACC,MAAM,YAAY,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAE/C,MAAM,UAAU,GACd,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;YACjC,CAAC,CAAC,OAAO,CAAC,OAAO;YACjB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE/C,MAAM,UAAU,GAAG,GAAG,YAAY,iBAAiB,UAAU,sBAAsB,OAAO,CAAC,MAAM,EAAE,CAAC;QAEpG,IAAI,GAAW,CAAC;QAChB,IAAI,IAAI,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC;YAC9B,GAAG,GAAG,QAAQ,CAAC,gCAAgC,EAAE;gBAC/C,KAAK,EAAE,UAAU;gBACjB,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC,IAAI,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,QAAQ,CAAC,uCAAuC,EAAE;gBACtD,KAAK,EAAE,UAAU;gBACjB,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC,IAAI,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAEO,SAAS,CAAC,IAAY;QAC5B,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC3C,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ export type { BotConfig, BotProviderConfig, BotApprovalConfig, BotNotifyConfig, NotificationEvent, NotificationEventType, WeaverConfig, WorkflowResult, ProviderName, } from './types.js';
2
+ export type { BotAgentProvider } from './agent-provider.js';
3
+ export { AnthropicAgentProvider, resolveProviderConfig, createProvider, detectProvider, } from './agent-provider.js';
4
+ export { CliAgentProvider } from './cli-provider.js';
5
+ export { BotAgentChannel } from './bot-agent-channel.js';
6
+ export type { BotChannelContext } from './bot-agent-channel.js';
7
+ export { WebhookNotificationChannel, createNotifier, } from './notifications.js';
8
+ export type { NotificationChannel } from './notifications.js';
9
+ export { buildSystemPrompt } from './system-prompt.js';
10
+ export { runWorkflow } from './runner.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bot/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,cAAc,EACd,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,0BAA0B,EAC1B,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { AnthropicAgentProvider, resolveProviderConfig, createProvider, detectProvider, } from './agent-provider.js';
2
+ export { CliAgentProvider } from './cli-provider.js';
3
+ export { BotAgentChannel } from './bot-agent-channel.js';
4
+ export { WebhookNotificationChannel, createNotifier, } from './notifications.js';
5
+ export { buildSystemPrompt } from './system-prompt.js';
6
+ export { runWorkflow } from './runner.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bot/index.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,cAAc,EACd,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EACL,0BAA0B,EAC1B,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { BotNotifyConfig, NotificationEvent, NotificationEventType } from './types.js';
2
+ export interface NotificationChannel {
3
+ name: string;
4
+ shouldSend(eventType: NotificationEventType): boolean;
5
+ send(event: NotificationEvent): Promise<void>;
6
+ }
7
+ export declare class WebhookNotificationChannel implements NotificationChannel {
8
+ name: string;
9
+ private url;
10
+ private channelType;
11
+ private events;
12
+ private headers;
13
+ constructor(config: BotNotifyConfig);
14
+ shouldSend(eventType: NotificationEventType): boolean;
15
+ send(event: NotificationEvent): Promise<void>;
16
+ }
17
+ export declare function createNotifier(channels: NotificationChannel[]): (event: NotificationEvent) => Promise<void>;
18
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/bot/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,SAAS,EAAE,qBAAqB,GAAG,OAAO,CAAC;IACtD,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AA8FD,qBAAa,0BAA2B,YAAW,mBAAmB;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,OAAO,CAAyB;gBAE5B,MAAM,EAAE,eAAe;IAenC,UAAU,CAAC,SAAS,EAAE,qBAAqB,GAAG,OAAO;IAI/C,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CAoCpD;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,mBAAmB,EAAE,GAC9B,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAI7C"}
@@ -0,0 +1,144 @@
1
+ const EVENT_COLORS = {
2
+ 'workflow-start': 0x3498db, // blue
3
+ 'workflow-complete': 0x2ecc71, // green
4
+ 'cycle-start': 0x3498db, // blue
5
+ 'cycle-complete': 0x2ecc71, // green
6
+ 'approval-needed': 0xf1c40f, // yellow
7
+ error: 0xe74c3c, // red
8
+ };
9
+ const EVENT_LABELS = {
10
+ 'workflow-start': 'Workflow Started',
11
+ 'workflow-complete': 'Workflow Complete',
12
+ 'cycle-start': 'Cycle Started',
13
+ 'cycle-complete': 'Cycle Complete',
14
+ 'approval-needed': 'Approval Needed',
15
+ error: 'Error',
16
+ };
17
+ function formatDiscordBody(event) {
18
+ const color = EVENT_COLORS[event.type];
19
+ const context = event.cycle != null ? `Cycle ${event.cycle}` : (event.workflowFile ?? 'Workflow');
20
+ const title = `Weaver: ${EVENT_LABELS[event.type]} (${context})`;
21
+ const fields = [];
22
+ if (event.summary) {
23
+ fields.push({ name: 'Summary', value: event.summary });
24
+ }
25
+ if (event.outcome) {
26
+ fields.push({ name: 'Outcome', value: event.outcome, inline: true });
27
+ }
28
+ if (event.diff) {
29
+ const s = event.diff.summary;
30
+ if (s) {
31
+ fields.push({
32
+ name: 'Nodes',
33
+ value: `+${s.nodeTypesAdded ?? 0} / -${s.nodeTypesRemoved ?? 0}`,
34
+ inline: true,
35
+ });
36
+ fields.push({
37
+ name: 'Connections',
38
+ value: `+${s.connectionsAdded ?? 0} / -${s.connectionsRemoved ?? 0}`,
39
+ inline: true,
40
+ });
41
+ }
42
+ }
43
+ if (event.error) {
44
+ fields.push({ name: 'Error', value: event.error.slice(0, 1024) });
45
+ }
46
+ return {
47
+ embeds: [
48
+ {
49
+ title,
50
+ description: event.projectDir,
51
+ color,
52
+ fields: fields.length > 0 ? fields : undefined,
53
+ timestamp: new Date().toISOString(),
54
+ },
55
+ ],
56
+ };
57
+ }
58
+ function formatSlackBody(event) {
59
+ const label = EVENT_LABELS[event.type];
60
+ const blocks = [
61
+ {
62
+ type: 'header',
63
+ text: {
64
+ type: 'plain_text',
65
+ text: `Weaver: ${label}${event.cycle != null ? ` (Cycle ${event.cycle})` : ''}`,
66
+ },
67
+ },
68
+ ];
69
+ const parts = [`*Project:* ${event.projectDir}`];
70
+ if (event.summary)
71
+ parts.push(`*Summary:* ${event.summary}`);
72
+ if (event.outcome)
73
+ parts.push(`*Outcome:* ${event.outcome}`);
74
+ if (event.error)
75
+ parts.push(`*Error:* ${event.error.slice(0, 500)}`);
76
+ blocks.push({
77
+ type: 'section',
78
+ text: { type: 'mrkdwn', text: parts.join('\n') },
79
+ });
80
+ return { blocks };
81
+ }
82
+ function formatWebhookBody(event) {
83
+ return { event };
84
+ }
85
+ export class WebhookNotificationChannel {
86
+ name;
87
+ url;
88
+ channelType;
89
+ events;
90
+ headers;
91
+ constructor(config) {
92
+ this.name = config.channel;
93
+ this.url = config.url;
94
+ this.channelType = config.channel;
95
+ this.events = new Set(config.events ?? [
96
+ 'cycle-start',
97
+ 'cycle-complete',
98
+ 'approval-needed',
99
+ 'error',
100
+ ]);
101
+ this.headers = config.headers ?? {};
102
+ }
103
+ shouldSend(eventType) {
104
+ return this.events.has(eventType);
105
+ }
106
+ async send(event) {
107
+ if (!this.shouldSend(event.type))
108
+ return;
109
+ let body;
110
+ switch (this.channelType) {
111
+ case 'discord':
112
+ body = formatDiscordBody(event);
113
+ break;
114
+ case 'slack':
115
+ body = formatSlackBody(event);
116
+ break;
117
+ default:
118
+ body = formatWebhookBody(event);
119
+ }
120
+ try {
121
+ const resp = await fetch(this.url, {
122
+ method: 'POST',
123
+ headers: {
124
+ 'Content-Type': 'application/json',
125
+ ...this.headers,
126
+ },
127
+ body: JSON.stringify(body),
128
+ });
129
+ if (!resp.ok) {
130
+ console.error(`[genesis-bot] ${this.channelType} notification failed: ${resp.status} ${resp.statusText}`);
131
+ }
132
+ }
133
+ catch (err) {
134
+ const msg = err instanceof Error ? err.message : String(err);
135
+ console.error(`[genesis-bot] ${this.channelType} notification error: ${msg}`);
136
+ }
137
+ }
138
+ }
139
+ export function createNotifier(channels) {
140
+ return async (event) => {
141
+ await Promise.allSettled(channels.map((ch) => ch.send(event)));
142
+ };
143
+ }
144
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/bot/notifications.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { WeaverConfig, WorkflowResult } from './types.js';
2
+ export declare function runWorkflow(filePath: string, options?: {
3
+ params?: Record<string, unknown>;
4
+ verbose?: boolean;
5
+ dryRun?: boolean;
6
+ config?: WeaverConfig;
7
+ }): Promise<WorkflowResult>;
8
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/bot/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,YAAY,EACZ,cAAc,EACf,MAAM,YAAY,CAAC;AA4DpB,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,GACA,OAAO,CAAC,cAAc,CAAC,CAsGzB"}
@@ -0,0 +1,123 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { createProvider, resolveProviderConfig, } from './agent-provider.js';
4
+ import { BotAgentChannel } from './bot-agent-channel.js';
5
+ import { WebhookNotificationChannel, createNotifier, } from './notifications.js';
6
+ function resolveApproval(approval) {
7
+ if (!approval || approval === 'auto') {
8
+ return { mode: 'auto', timeoutSeconds: 300 };
9
+ }
10
+ if (approval === 'timeout-auto') {
11
+ return { mode: 'timeout-auto', timeoutSeconds: 300 };
12
+ }
13
+ return {
14
+ mode: approval.mode,
15
+ timeoutSeconds: approval.timeoutSeconds ?? 300,
16
+ };
17
+ }
18
+ function resolveNotify(notify) {
19
+ if (!notify)
20
+ return [];
21
+ return Array.isArray(notify) ? notify : [notify];
22
+ }
23
+ function resolveWeaverConfig(filePath, explicit) {
24
+ if (explicit)
25
+ return explicit;
26
+ // Check .weaver.json next to the workflow file
27
+ const dir = path.dirname(filePath);
28
+ const localConfig = path.join(dir, '.weaver.json');
29
+ if (fs.existsSync(localConfig)) {
30
+ return JSON.parse(fs.readFileSync(localConfig, 'utf-8'));
31
+ }
32
+ // Check .weaver.json in cwd
33
+ const cwdConfig = path.join(process.cwd(), '.weaver.json');
34
+ if (fs.existsSync(cwdConfig)) {
35
+ return JSON.parse(fs.readFileSync(cwdConfig, 'utf-8'));
36
+ }
37
+ // No config file found: fall back to auto-detection
38
+ return { provider: 'auto' };
39
+ }
40
+ // ============================================================
41
+ // Generic workflow runner
42
+ // ============================================================
43
+ export async function runWorkflow(filePath, options) {
44
+ const absPath = path.resolve(filePath);
45
+ const verbose = options?.verbose ?? false;
46
+ if (!fs.existsSync(absPath)) {
47
+ throw new Error(`Workflow file not found: ${absPath}`);
48
+ }
49
+ // Resolve config
50
+ const config = resolveWeaverConfig(absPath, options?.config);
51
+ // Create provider and notification channels
52
+ const providerConfig = resolveProviderConfig(config.provider);
53
+ const approvalConfig = resolveApproval(config.approval);
54
+ const notifyConfigs = resolveNotify(config.notify);
55
+ const provider = createProvider(providerConfig);
56
+ const channels = notifyConfigs.map((c) => new WebhookNotificationChannel(c));
57
+ const notifier = createNotifier(channels);
58
+ const projectDir = path.dirname(absPath);
59
+ if (verbose) {
60
+ console.log(`[weaver] Workflow: ${absPath}`);
61
+ const providerLabel = providerConfig.model
62
+ ? `${providerConfig.name} (${providerConfig.model})`
63
+ : providerConfig.name;
64
+ console.log(`[weaver] Provider: ${providerLabel}`);
65
+ console.log(`[weaver] Approval: ${approvalConfig.mode}`);
66
+ console.log(`[weaver] Notifications: ${channels.length} channel(s)`);
67
+ }
68
+ // Notify start
69
+ await notifier({
70
+ type: 'workflow-start',
71
+ workflowFile: absPath,
72
+ projectDir,
73
+ });
74
+ const botChannel = new BotAgentChannel(provider, {
75
+ approvalMode: approvalConfig.mode,
76
+ approvalTimeoutSeconds: approvalConfig.timeoutSeconds,
77
+ notifier,
78
+ context: { projectDir, workflowFile: absPath },
79
+ });
80
+ try {
81
+ const mod = '@synergenius/flow-weaver/dist/mcp/workflow-executor.js';
82
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ const { executeWorkflowFromFile } = await import(mod);
84
+ if (options?.dryRun) {
85
+ console.log('[weaver] Dry run, skipping execution');
86
+ return { success: true, summary: 'Dry run', outcome: 'skipped' };
87
+ }
88
+ const execResult = await executeWorkflowFromFile(absPath, options?.params ?? {}, {
89
+ agentChannel: botChannel,
90
+ includeTrace: false,
91
+ production: true,
92
+ });
93
+ const result = execResult.result;
94
+ const success = result?.onSuccess ?? false;
95
+ const summary = result?.summary ?? 'No summary';
96
+ const outcome = success ? 'completed' : 'failed';
97
+ await notifier({
98
+ type: 'workflow-complete',
99
+ workflowFile: absPath,
100
+ projectDir,
101
+ summary,
102
+ outcome,
103
+ });
104
+ return {
105
+ success,
106
+ summary,
107
+ outcome,
108
+ functionName: execResult.functionName,
109
+ executionTime: execResult.executionTime,
110
+ };
111
+ }
112
+ catch (err) {
113
+ const msg = err instanceof Error ? err.message : String(err);
114
+ await notifier({
115
+ type: 'error',
116
+ workflowFile: absPath,
117
+ projectDir,
118
+ error: msg,
119
+ });
120
+ return { success: false, summary: msg, outcome: 'error' };
121
+ }
122
+ }
123
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/bot/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAOlC,OAAO,EACL,cAAc,EACd,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,0BAA0B,EAC1B,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,SAAS,eAAe,CACtB,QAA+B;IAE/B,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC;IAC/C,CAAC;IACD,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC;IACvD,CAAC;IACD,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,cAAc,EAAE,QAAQ,CAAC,cAAc,IAAI,GAAG;KAC/C,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,MAA2B;IAE3B,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAgB,EAChB,QAAuB;IAEvB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,+CAA+C;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACnD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,4BAA4B;IAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IAC3D,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,oDAAoD;IACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED,+DAA+D;AAC/D,0BAA0B;AAC1B,+DAA+D;AAE/D,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,OAKC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC;IAE1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,iBAAiB;IACjB,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAE7D,4CAA4C;IAC5C,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEnD,MAAM,QAAQ,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEzC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;QAC7C,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK;YACxC,CAAC,CAAC,GAAG,cAAc,CAAC,IAAI,KAAK,cAAc,CAAC,KAAK,GAAG;YACpD,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,sBAAsB,aAAa,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,sBAAsB,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,2BAA2B,QAAQ,CAAC,MAAM,aAAa,CAAC,CAAC;IACvE,CAAC;IAED,eAAe;IACf,MAAM,QAAQ,CAAC;QACb,IAAI,EAAE,gBAAgB;QACtB,YAAY,EAAE,OAAO;QACrB,UAAU;KACX,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,eAAe,CAAC,QAAQ,EAAE;QAC/C,YAAY,EAAE,cAAc,CAAC,IAAI;QACjC,sBAAsB,EAAE,cAAc,CAAC,cAAc;QACrD,QAAQ;QACR,OAAO,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE;KAC/C,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,wDAAwD,CAAC;QACrE,8DAA8D;QAC9D,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAO,MAAM,CAAC,GAAG,CAAkB,CAAC;QAExE,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QACnE,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAC9C,OAAO,EACP,OAAO,EAAE,MAAM,IAAI,EAAE,EACrB;YACE,YAAY,EAAE,UAAU;YACxB,YAAY,EAAE,KAAK;YACnB,UAAU,EAAE,IAAI;SACjB,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,UAAU,CAAC,MAGlB,CAAC;QAET,MAAM,OAAO,GAAG,MAAM,EAAE,SAAS,IAAI,KAAK,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,YAAY,CAAC;QAChD,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;QAEjD,MAAM,QAAQ,CAAC;YACb,IAAI,EAAE,mBAAmB;YACzB,YAAY,EAAE,OAAO;YACrB,UAAU;YACV,OAAO;YACP,OAAO;SACR,CAAC,CAAC;QAEH,OAAO;YACL,OAAO;YACP,OAAO;YACP,OAAO;YACP,YAAY,EAAE,UAAU,CAAC,YAAY;YACrC,aAAa,EAAE,UAAU,CAAC,aAAa;SACxC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE7D,MAAM,QAAQ,CAAC;YACb,IAAI,EAAE,OAAO;YACb,YAAY,EAAE,OAAO;YACrB,UAAU;YACV,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC5D,CAAC;AACH,CAAC"}