expxagents 0.25.0 → 0.25.2

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 (126) hide show
  1. package/dist/cli/src/commands/info.d.ts +1 -2
  2. package/dist/cli/src/commands/login.d.ts +1 -2
  3. package/dist/cli/src/commands/logout.d.ts +1 -2
  4. package/dist/cli/src/commands/outdated.d.ts +1 -2
  5. package/dist/cli/src/commands/publish.d.ts +1 -2
  6. package/dist/cli/src/commands/registry-install.d.ts +1 -2
  7. package/dist/cli/src/commands/search.d.ts +1 -2
  8. package/dist/cli/src/commands/update.d.ts +1 -2
  9. package/dist/cli/src/commands/whoami.d.ts +1 -2
  10. package/dist/dashboard/assets/{BufferResource-A8ncaeYI.js → BufferResource-D79vaoFm.js} +1 -1
  11. package/dist/dashboard/assets/{CanvasRenderer-B9ePxyZx.js → CanvasRenderer-BUoxTNKV.js} +1 -1
  12. package/dist/dashboard/assets/JarvisView-DSN7xWMz.js +1 -0
  13. package/dist/dashboard/assets/{RenderTargetSystem-B6qE1bDj.js → RenderTargetSystem-B7rwTXA1.js} +1 -1
  14. package/dist/dashboard/assets/ThreeBackground-BQTdScX-.js +1 -0
  15. package/dist/dashboard/assets/{WebGLRenderer-D5vXNoQg.js → WebGLRenderer-DgdVNsZ9.js} +1 -1
  16. package/dist/dashboard/assets/{WebGPURenderer-CPOVD6U9.js → WebGPURenderer-DnQNvjEQ.js} +1 -1
  17. package/dist/dashboard/assets/{browserAll-BXl_rCrX.js → browserAll-Cbsk7DE4.js} +1 -1
  18. package/dist/dashboard/assets/index-CrlhoBta.js +783 -0
  19. package/dist/dashboard/assets/{webworkerAll-Dv96EAc4.js → webworkerAll-BLmfReEj.js} +1 -1
  20. package/dist/dashboard/index.html +1 -1
  21. package/package.json +2 -2
  22. package/dist/cli/src/__tests__/cli.test.d.ts +0 -1
  23. package/dist/cli/src/__tests__/cli.test.js +0 -23
  24. package/dist/cli/src/commands/__tests__/outdated.test.d.ts +0 -1
  25. package/dist/cli/src/commands/__tests__/outdated.test.js +0 -76
  26. package/dist/cli/src/mcp/__tests__/catalog.test.d.ts +0 -1
  27. package/dist/cli/src/mcp/__tests__/catalog.test.js +0 -101
  28. package/dist/cli/src/mcp/__tests__/detect.test.d.ts +0 -1
  29. package/dist/cli/src/mcp/__tests__/detect.test.js +0 -84
  30. package/dist/cli/src/mcp/__tests__/setup.test.d.ts +0 -1
  31. package/dist/cli/src/mcp/__tests__/setup.test.js +0 -75
  32. package/dist/cli/src/mcp/__tests__/validate.test.d.ts +0 -1
  33. package/dist/cli/src/mcp/__tests__/validate.test.js +0 -42
  34. package/dist/cli/src/pencil/__tests__/detect.test.d.ts +0 -1
  35. package/dist/cli/src/pencil/__tests__/detect.test.js +0 -71
  36. package/dist/cli/src/pencil/__tests__/property-mapper.test.d.ts +0 -1
  37. package/dist/cli/src/pencil/__tests__/property-mapper.test.js +0 -120
  38. package/dist/cli/src/pencil/__tests__/template-sync.test.d.ts +0 -1
  39. package/dist/cli/src/pencil/__tests__/template-sync.test.js +0 -95
  40. package/dist/cli/src/runners/__tests__/provider-registry.test.d.ts +0 -1
  41. package/dist/cli/src/runners/__tests__/provider-registry.test.js +0 -31
  42. package/dist/cli/src/runners/__tests__/provider-runner.test.d.ts +0 -1
  43. package/dist/cli/src/runners/__tests__/provider-runner.test.js +0 -86
  44. package/dist/cli/src/utils/__tests__/command-prefix.test.d.ts +0 -1
  45. package/dist/cli/src/utils/__tests__/command-prefix.test.js +0 -35
  46. package/dist/cli/src/utils/__tests__/global-install.test.d.ts +0 -1
  47. package/dist/cli/src/utils/__tests__/global-install.test.js +0 -25
  48. package/dist/dashboard/assets/JarvisView-BzSP9oge.js +0 -1
  49. package/dist/dashboard/assets/ThreeBackground-Ds6SAxmB.js +0 -1
  50. package/dist/dashboard/assets/index--ULBmMcf.js +0 -1195
  51. package/dist/data/opensquad.db +0 -0
  52. package/dist/data/opensquad.db-shm +0 -0
  53. package/dist/data/opensquad.db-wal +0 -0
  54. package/node_modules/expxagents-knowledge/dist/config.d.ts +0 -4
  55. package/node_modules/expxagents-knowledge/dist/config.d.ts.map +0 -1
  56. package/node_modules/expxagents-knowledge/dist/config.js +0 -37
  57. package/node_modules/expxagents-knowledge/dist/config.js.map +0 -1
  58. package/node_modules/expxagents-knowledge/dist/db/connection.d.ts +0 -6
  59. package/node_modules/expxagents-knowledge/dist/db/connection.d.ts.map +0 -1
  60. package/node_modules/expxagents-knowledge/dist/db/connection.js +0 -69
  61. package/node_modules/expxagents-knowledge/dist/db/connection.js.map +0 -1
  62. package/node_modules/expxagents-knowledge/dist/db/migrations.d.ts +0 -3
  63. package/node_modules/expxagents-knowledge/dist/db/migrations.d.ts.map +0 -1
  64. package/node_modules/expxagents-knowledge/dist/db/migrations.js +0 -46
  65. package/node_modules/expxagents-knowledge/dist/db/migrations.js.map +0 -1
  66. package/node_modules/expxagents-knowledge/dist/db/schema.d.ts +0 -3
  67. package/node_modules/expxagents-knowledge/dist/db/schema.d.ts.map +0 -1
  68. package/node_modules/expxagents-knowledge/dist/db/schema.js +0 -79
  69. package/node_modules/expxagents-knowledge/dist/db/schema.js.map +0 -1
  70. package/node_modules/expxagents-knowledge/dist/index.d.ts +0 -16
  71. package/node_modules/expxagents-knowledge/dist/index.d.ts.map +0 -1
  72. package/node_modules/expxagents-knowledge/dist/index.js +0 -16
  73. package/node_modules/expxagents-knowledge/dist/index.js.map +0 -1
  74. package/node_modules/expxagents-knowledge/dist/ingest/chunker.d.ts +0 -10
  75. package/node_modules/expxagents-knowledge/dist/ingest/chunker.d.ts.map +0 -1
  76. package/node_modules/expxagents-knowledge/dist/ingest/chunker.js +0 -221
  77. package/node_modules/expxagents-knowledge/dist/ingest/chunker.js.map +0 -1
  78. package/node_modules/expxagents-knowledge/dist/ingest/document-loader.d.ts +0 -4
  79. package/node_modules/expxagents-knowledge/dist/ingest/document-loader.d.ts.map +0 -1
  80. package/node_modules/expxagents-knowledge/dist/ingest/document-loader.js +0 -56
  81. package/node_modules/expxagents-knowledge/dist/ingest/document-loader.js.map +0 -1
  82. package/node_modules/expxagents-knowledge/dist/ingest/embedder.d.ts +0 -4
  83. package/node_modules/expxagents-knowledge/dist/ingest/embedder.d.ts.map +0 -1
  84. package/node_modules/expxagents-knowledge/dist/ingest/embedder.js +0 -25
  85. package/node_modules/expxagents-knowledge/dist/ingest/embedder.js.map +0 -1
  86. package/node_modules/expxagents-knowledge/dist/ingest/entity-extractor.d.ts +0 -21
  87. package/node_modules/expxagents-knowledge/dist/ingest/entity-extractor.d.ts.map +0 -1
  88. package/node_modules/expxagents-knowledge/dist/ingest/entity-extractor.js +0 -54
  89. package/node_modules/expxagents-knowledge/dist/ingest/entity-extractor.js.map +0 -1
  90. package/node_modules/expxagents-knowledge/dist/ingest/extraction-queue.d.ts +0 -16
  91. package/node_modules/expxagents-knowledge/dist/ingest/extraction-queue.d.ts.map +0 -1
  92. package/node_modules/expxagents-knowledge/dist/ingest/extraction-queue.js +0 -49
  93. package/node_modules/expxagents-knowledge/dist/ingest/extraction-queue.js.map +0 -1
  94. package/node_modules/expxagents-knowledge/dist/ingest/pdf-extractor.d.ts +0 -9
  95. package/node_modules/expxagents-knowledge/dist/ingest/pdf-extractor.d.ts.map +0 -1
  96. package/node_modules/expxagents-knowledge/dist/ingest/pdf-extractor.js +0 -116
  97. package/node_modules/expxagents-knowledge/dist/ingest/pdf-extractor.js.map +0 -1
  98. package/node_modules/expxagents-knowledge/dist/ingest/pipeline.d.ts +0 -27
  99. package/node_modules/expxagents-knowledge/dist/ingest/pipeline.d.ts.map +0 -1
  100. package/node_modules/expxagents-knowledge/dist/ingest/pipeline.js +0 -92
  101. package/node_modules/expxagents-knowledge/dist/ingest/pipeline.js.map +0 -1
  102. package/node_modules/expxagents-knowledge/dist/query/graph-traversal.d.ts +0 -41
  103. package/node_modules/expxagents-knowledge/dist/query/graph-traversal.d.ts.map +0 -1
  104. package/node_modules/expxagents-knowledge/dist/query/graph-traversal.js +0 -62
  105. package/node_modules/expxagents-knowledge/dist/query/graph-traversal.js.map +0 -1
  106. package/node_modules/expxagents-knowledge/dist/query/knowledge-query.d.ts +0 -31
  107. package/node_modules/expxagents-knowledge/dist/query/knowledge-query.d.ts.map +0 -1
  108. package/node_modules/expxagents-knowledge/dist/query/knowledge-query.js +0 -106
  109. package/node_modules/expxagents-knowledge/dist/query/knowledge-query.js.map +0 -1
  110. package/node_modules/expxagents-knowledge/dist/query/vector-search.d.ts +0 -26
  111. package/node_modules/expxagents-knowledge/dist/query/vector-search.d.ts.map +0 -1
  112. package/node_modules/expxagents-knowledge/dist/query/vector-search.js +0 -57
  113. package/node_modules/expxagents-knowledge/dist/query/vector-search.js.map +0 -1
  114. package/node_modules/expxagents-knowledge/dist/sources/agent-output.d.ts +0 -10
  115. package/node_modules/expxagents-knowledge/dist/sources/agent-output.d.ts.map +0 -1
  116. package/node_modules/expxagents-knowledge/dist/sources/agent-output.js +0 -29
  117. package/node_modules/expxagents-knowledge/dist/sources/agent-output.js.map +0 -1
  118. package/node_modules/expxagents-knowledge/dist/sources/watcher.d.ts +0 -6
  119. package/node_modules/expxagents-knowledge/dist/sources/watcher.d.ts.map +0 -1
  120. package/node_modules/expxagents-knowledge/dist/sources/watcher.js +0 -42
  121. package/node_modules/expxagents-knowledge/dist/sources/watcher.js.map +0 -1
  122. package/node_modules/expxagents-knowledge/dist/types.d.ts +0 -138
  123. package/node_modules/expxagents-knowledge/dist/types.d.ts.map +0 -1
  124. package/node_modules/expxagents-knowledge/dist/types.js +0 -2
  125. package/node_modules/expxagents-knowledge/dist/types.js.map +0 -1
  126. package/node_modules/expxagents-knowledge/package.json +0 -7
@@ -1,95 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { parseFrameName, generateTemplateMarkdown, computeSyncActions, } from '../template-sync.js';
3
- describe('pencil/template-sync', () => {
4
- describe('parseFrameName()', () => {
5
- it('parses "Template 01 - Hero Banner"', () => {
6
- const result = parseFrameName('Template 01 - Hero Banner');
7
- expect(result).toEqual({ number: 1, name: 'Hero Banner', slug: 'hero-banner' });
8
- });
9
- it('parses "Template 12 - Call to Action"', () => {
10
- const result = parseFrameName('Template 12 - Call to Action');
11
- expect(result).toEqual({ number: 12, name: 'Call to Action', slug: 'call-to-action' });
12
- });
13
- it('returns null for non-template frame names', () => {
14
- expect(parseFrameName('Random Frame')).toBeNull();
15
- expect(parseFrameName('Background')).toBeNull();
16
- });
17
- });
18
- describe('generateTemplateMarkdown()', () => {
19
- it('generates markdown with CSS from node properties', () => {
20
- const frame = {
21
- id: 'frame1',
22
- name: 'Template 01 - Hero Banner',
23
- width: 1080,
24
- height: 1350,
25
- children: [
26
- {
27
- id: 'child1',
28
- name: 'Header',
29
- type: 'frame',
30
- fill: '#FFFFFF',
31
- layout: 'vertical',
32
- padding: [20, 24, 20, 24],
33
- },
34
- ],
35
- };
36
- const md = generateTemplateMarkdown(frame);
37
- expect(md).toContain('# Template 01 — Hero Banner');
38
- expect(md).toContain('1080x1350');
39
- expect(md).toContain('background: #FFFFFF');
40
- expect(md).toContain('flex-direction: column');
41
- });
42
- });
43
- describe('computeSyncActions()', () => {
44
- it('detects new templates (frame without .md)', () => {
45
- const frames = [
46
- { id: 'f1', name: 'Template 01 - Hero', width: 1080, height: 1350, children: [] },
47
- ];
48
- const existingMds = [];
49
- const actions = computeSyncActions(frames, existingMds);
50
- expect(actions).toHaveLength(1);
51
- expect(actions[0].type).toBe('create');
52
- expect(actions[0].filename).toBe('template-01-hero.md');
53
- });
54
- it('detects orphaned templates (.md without frame)', () => {
55
- const frames = [];
56
- const existingMds = ['template-01-hero.md'];
57
- const actions = computeSyncActions(frames, existingMds);
58
- expect(actions).toHaveLength(1);
59
- expect(actions[0].type).toBe('orphan');
60
- expect(actions[0].filename).toBe('template-01-hero.md');
61
- });
62
- it('detects existing templates that may need update', () => {
63
- const frames = [
64
- { id: 'f1', name: 'Template 01 - Hero', width: 1080, height: 1350, children: [] },
65
- ];
66
- const existingMds = ['template-01-hero.md'];
67
- const actions = computeSyncActions(frames, existingMds);
68
- expect(actions).toHaveLength(1);
69
- expect(actions[0].type).toBe('update');
70
- });
71
- it('handles mix of new, existing, and orphaned', () => {
72
- const frames = [
73
- { id: 'f1', name: 'Template 01 - Hero', width: 1080, height: 1350, children: [] },
74
- { id: 'f2', name: 'Template 03 - Footer', width: 1080, height: 1350, children: [] },
75
- ];
76
- const existingMds = ['template-01-hero.md', 'template-02-sidebar.md'];
77
- const actions = computeSyncActions(frames, existingMds);
78
- const create = actions.filter(a => a.type === 'create');
79
- const update = actions.filter(a => a.type === 'update');
80
- const orphan = actions.filter(a => a.type === 'orphan');
81
- expect(update).toHaveLength(1); // template-01 exists
82
- expect(create).toHaveLength(1); // template-03 is new
83
- expect(orphan).toHaveLength(1); // template-02 has no frame
84
- });
85
- it('skips non-template frames', () => {
86
- const frames = [
87
- { id: 'f1', name: 'Background', width: 1920, height: 1080, children: [] },
88
- { id: 'f2', name: 'Template 01 - Hero', width: 1080, height: 1350, children: [] },
89
- ];
90
- const actions = computeSyncActions(frames, []);
91
- expect(actions).toHaveLength(1);
92
- expect(actions[0].filename).toBe('template-01-hero.md');
93
- });
94
- });
95
- });
@@ -1,31 +0,0 @@
1
- import { ProviderRegistry } from '../provider-registry.js';
2
- function createMockProvider(type) {
3
- return {
4
- type,
5
- run: vi.fn().mockResolvedValue({
6
- output: 'test output',
7
- inputChars: 100,
8
- outputChars: 50,
9
- model: 'test-model',
10
- }),
11
- };
12
- }
13
- describe('ProviderRegistry', () => {
14
- let registry;
15
- beforeEach(() => {
16
- registry = new ProviderRegistry();
17
- });
18
- it('registers and retrieves a provider', () => {
19
- const provider = createMockProvider('anthropic');
20
- registry.register(provider);
21
- expect(registry.get('anthropic')).toBe(provider);
22
- });
23
- it('throws for unknown provider', () => {
24
- expect(() => registry.get('nonexistent')).toThrow(/Unknown provider/);
25
- });
26
- it('lists registered providers', () => {
27
- registry.register(createMockProvider('anthropic'));
28
- registry.register(createMockProvider('openai'));
29
- expect(registry.list()).toEqual(['anthropic', 'openai']);
30
- });
31
- });
@@ -1,86 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- vi.mock('@anthropic-ai/sdk', () => ({
3
- default: vi.fn().mockImplementation(() => ({
4
- messages: {
5
- create: vi.fn().mockResolvedValue({
6
- content: [{ type: 'text', text: 'Anthropic response text' }],
7
- }),
8
- },
9
- })),
10
- }));
11
- vi.mock('openai', () => ({
12
- default: vi.fn().mockImplementation(() => ({
13
- chat: {
14
- completions: {
15
- create: vi.fn().mockResolvedValue({
16
- choices: [{ message: { content: 'OpenAI response text' } }],
17
- }),
18
- },
19
- },
20
- })),
21
- }));
22
- import { runWithAnthropic } from '../anthropic-runner.js';
23
- import { runWithOpenAI } from '../openai-runner.js';
24
- import { runWithProvider } from '../provider-runner.js';
25
- describe('runWithAnthropic', () => {
26
- beforeEach(() => {
27
- process.env.ANTHROPIC_API_KEY = 'test-key';
28
- });
29
- afterEach(() => {
30
- delete process.env.ANTHROPIC_API_KEY;
31
- });
32
- it('returns text from Anthropic response', async () => {
33
- const result = await runWithAnthropic('Do something', 'claude-haiku-4-5-20251001');
34
- expect(result).toBe('Anthropic response text');
35
- });
36
- it('uses default model when none specified', async () => {
37
- const result = await runWithAnthropic('Do something');
38
- expect(typeof result).toBe('string');
39
- });
40
- it('throws if ANTHROPIC_API_KEY not set', async () => {
41
- delete process.env.ANTHROPIC_API_KEY;
42
- await expect(runWithAnthropic('test')).rejects.toThrow(/ANTHROPIC_API_KEY/);
43
- });
44
- });
45
- describe('runWithOpenAI', () => {
46
- let originalKey;
47
- beforeEach(() => {
48
- originalKey = process.env.OPENAI_API_KEY;
49
- process.env.OPENAI_API_KEY = 'test-key';
50
- });
51
- afterEach(() => {
52
- if (originalKey === undefined)
53
- delete process.env.OPENAI_API_KEY;
54
- else
55
- process.env.OPENAI_API_KEY = originalKey;
56
- });
57
- it('returns text from OpenAI response', async () => {
58
- const result = await runWithOpenAI('Do something', 'gpt-4o');
59
- expect(result).toBe('OpenAI response text');
60
- });
61
- it('throws if OPENAI_API_KEY not set', async () => {
62
- delete process.env.OPENAI_API_KEY;
63
- await expect(runWithOpenAI('test')).rejects.toThrow(/OPENAI_API_KEY/);
64
- });
65
- });
66
- describe('runWithProvider', () => {
67
- const mockClaudeCode = vi.fn().mockResolvedValue('claude-code result');
68
- const baseAgent = { id: 'a', name: 'A', icon: 'robot', prompt: '' };
69
- beforeEach(() => {
70
- process.env.ANTHROPIC_API_KEY = 'test-key';
71
- process.env.OPENAI_API_KEY = 'test-key';
72
- });
73
- it('calls anthropic runner for provider: anthropic', async () => {
74
- const result = await runWithProvider('prompt', { ...baseAgent, provider: 'anthropic', model: 'claude-haiku-4-5-20251001' }, '/cwd', mockClaudeCode);
75
- expect(result).toBe('Anthropic response text');
76
- });
77
- it('calls openai runner for provider: openai', async () => {
78
- const result = await runWithProvider('prompt', { ...baseAgent, provider: 'openai', model: 'gpt-4o' }, '/cwd', mockClaudeCode);
79
- expect(result).toBe('OpenAI response text');
80
- });
81
- it('calls spawnClaudeCode for provider: claude-code (default)', async () => {
82
- const result = await runWithProvider('prompt', baseAgent, '/cwd', mockClaudeCode);
83
- expect(mockClaudeCode).toHaveBeenCalledWith('prompt', '/cwd');
84
- expect(result).toBe('claude-code result');
85
- });
86
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,35 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import { getCommandPrefix } from '../command-prefix.js';
3
- describe('getCommandPrefix', () => {
4
- const originalArgv = process.argv;
5
- const originalEnv = { ...process.env };
6
- afterEach(() => {
7
- process.argv = originalArgv;
8
- process.env = originalEnv;
9
- });
10
- it('returns "npx expxagents" when npm_execpath contains npx', () => {
11
- process.env.npm_execpath = '/usr/local/lib/node_modules/npm/bin/npx-cli.js';
12
- process.argv = [process.argv[0], '/usr/local/bin/expxagents'];
13
- expect(getCommandPrefix()).toBe('npx expxagents');
14
- });
15
- it('returns "npx expxagents" when argv[1] contains _npx (fallback)', () => {
16
- delete process.env.npm_execpath;
17
- process.argv = [process.argv[0], '/home/user/.npm/_npx/abc123/bin/expxagents.js'];
18
- expect(getCommandPrefix()).toBe('npx expxagents');
19
- });
20
- it('returns "expxagents" for global install on Unix', () => {
21
- delete process.env.npm_execpath;
22
- process.argv = [process.argv[0], '/usr/local/bin/expxagents'];
23
- expect(getCommandPrefix()).toBe('expxagents');
24
- });
25
- it('returns "expxagents" for global install on Windows', () => {
26
- delete process.env.npm_execpath;
27
- process.argv = [process.argv[0], 'C:\\Users\\X\\AppData\\Roaming\\npm\\expxagents'];
28
- expect(getCommandPrefix()).toBe('expxagents');
29
- });
30
- it('returns "expxagents" when both env and argv are empty', () => {
31
- delete process.env.npm_execpath;
32
- process.argv = [process.argv[0], ''];
33
- expect(getCommandPrefix()).toBe('expxagents');
34
- });
35
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,25 +0,0 @@
1
- import { describe, it, expect, vi, afterEach } from 'vitest';
2
- import { execSync } from 'child_process';
3
- import { tryGlobalInstall } from '../global-install.js';
4
- vi.mock('child_process', () => ({
5
- execSync: vi.fn(),
6
- }));
7
- const mockExecSync = vi.mocked(execSync);
8
- afterEach(() => {
9
- vi.restoreAllMocks();
10
- });
11
- describe('tryGlobalInstall', () => {
12
- it('returns true when npm install -g succeeds', () => {
13
- mockExecSync.mockReturnValue(Buffer.from(''));
14
- expect(tryGlobalInstall('0.20.1')).toBe(true);
15
- expect(mockExecSync).toHaveBeenCalledWith('npm install -g expxagents@0.20.1', { stdio: 'pipe', timeout: 60000 });
16
- });
17
- it('returns false when npm install -g fails', () => {
18
- mockExecSync.mockImplementation(() => { throw new Error('EACCES'); });
19
- expect(tryGlobalInstall('0.20.1')).toBe(false);
20
- });
21
- it('never throws', () => {
22
- mockExecSync.mockImplementation(() => { throw new Error('network error'); });
23
- expect(() => tryGlobalInstall('1.0.0')).not.toThrow();
24
- });
25
- });
@@ -1 +0,0 @@
1
- var W=Object.defineProperty;var D=(c,s,o)=>s in c?W(c,s,{enumerable:!0,configurable:!0,writable:!0,value:o}):c[s]=o;var M=(c,s,o)=>D(c,typeof s!="symbol"?s+"":s,o);import{r as m,J as b,a as d,b as S,c as G,d as k,j as N,s as B}from"./index--ULBmMcf.js";const I=/\bava\b/i;function U(c){return I.test(c)}function j(c){if(!c)return[];if(c.length<=b.ttsSplitLength)return[c];const s=c.match(/[^.!?]+[.!?]+\s*/g)||[c],o=[];let n="";for(const e of s)n.length+e.length>b.ttsSplitLength&&n?(o.push(n.trim()),n=e):n+=e;return n.trim()&&o.push(n.trim()),o}function O(c){const s=globalThis.SpeechRecognition||globalThis.webkitSpeechRecognition,o=!!s;let n=null,e=null,a=null,t=null,i=!1,u=!1;function l(){if(s&&!(n!=null&&n._started)){u=!1,n=new s,n.continuous=!0,n.interimResults=!0,n.lang="pt-BR",n.onresult=p=>{var T;const r=p.results[p.resultIndex];if(!r)return;const f=((T=r[0])==null?void 0:T.transcript)??"",h=r.isFinal;if(i&&h){const v=f.replace(I,"").trim();v&&(i=!1,c.onUtterance(v));return}if(U(f)&&!u){const v=f.replace(/^.*?\bava\b\s*/i,"").trim();v&&h?(u=!0,c.onWakeWord(v)):v?h&&(u=!0,c.onWakeWord(v)):(u=!0,c.onWakeWord(""),i=!0)}},n.onend=()=>{if(n)try{n.start()}catch{}},n.onerror=()=>{};try{n.start()}catch{}}}function x(){if(n){const p=n;n=null;try{p.stop()}catch{}}}async function g(){try{t=await navigator.mediaDevices.getUserMedia({audio:!0}),a=new AudioContext;const p=a.createMediaStreamSource(t);e=a.createAnalyser(),e.fftSize=256,p.connect(e)}catch{e=null}}function R(p){x(),speechSynthesis.cancel();const y=j(p);if(y.length===0){c.onTTSEnd(),l();return}y.forEach((r,f)=>{const h=new SpeechSynthesisUtterance(r);h.lang="pt-BR",h.rate=1.05,h.pitch=1.25;const v=speechSynthesis.getVoices().filter(E=>E.lang.startsWith("pt")),P=v.find(E=>/female|femin|luciana|joana|francisca|fernanda|raquel|google.*br/i.test(E.name)&&!/male|masculin|felipe|daniel|luciano|ricardo/i.test(E.name))??v.find(E=>/luciana|francisca|fernanda/i.test(E.name));h.voice=P??v[0]??null,f===y.length-1&&(h.onend=()=>{c.onTTSEnd(),l()},h.onerror=()=>{c.onTTSEnd(),l()}),speechSynthesis.speak(h)})}function A(){speechSynthesis.cancel()}return{start:()=>{l(),typeof navigator<"u"&&navigator.mediaDevices&&g()},stop:()=>{x(),A(),t&&(t.getTracks().forEach(p=>p.stop()),t=null),a&&(a.close(),a=null),e=null},speak:R,cancelSpeech:A,isSupported:o,getAnalyser:()=>e}}function V(c){const s=m.useRef(null),o=m.useRef(c);o.current=c,m.useEffect(()=>{const t=O({onWakeWord:i=>o.current.onWakeWord(i),onUtterance:i=>o.current.onUtterance(i),onTTSEnd:()=>o.current.onTTSEnd()});return s.current=t,t.start(),()=>t.stop()},[]);const n=m.useCallback(t=>{var i;(i=s.current)==null||i.speak(t)},[]),e=m.useCallback(()=>{var t;(t=s.current)==null||t.cancelSpeech()},[]),a=m.useCallback(()=>{var t;return((t=s.current)==null?void 0:t.getAnalyser())??null},[]);return{speak:n,cancelSpeech:e,getAnalyser:a,isSupported:!!(globalThis.SpeechRecognition||globalThis.webkitSpeechRecognition)}}const q={STANDBY:d.orbStandby,GREETING:d.orbListening,LISTENING:d.orbListening,PROCESSING:d.orbProcessing,SPEAKING:d.orbSpeaking};class L{constructor(s){M(this,"canvas");M(this,"ctx");M(this,"particles");M(this,"destroyed",!1);this.canvas=s,this.ctx=s.getContext("2d"),this.particles=this.initParticles()}getParticleCount(){return this.particles.length}initParticles(){const s=b.particleCount,o=[];for(let n=0;n<s;n++)o.push({x:Math.random()*this.canvas.width,y:Math.random()*this.canvas.height,vx:(Math.random()-.5)*.5,vy:(Math.random()-.5)*.5,radius:b.particleMinRadius+Math.random()*(b.particleMaxRadius-b.particleMinRadius),alpha:.2+Math.random()*.6});return o}render(s){if(this.destroyed)return;const{ctx:o,canvas:n}=this,e=n.width,a=n.height,t=e/2,i=a/2;o.clearRect(0,0,e,a),o.fillStyle=d.background,o.fillRect(0,0,e,a),this.drawGrid(e,a,s.time),this.updateAndDrawParticles(s.mode,e,a),this.drawOrb(t,i,s),s.mode==="LISTENING"&&s.amplitudes&&this.drawWaveform(t,i,s.amplitudes),this.drawSquadsPanel(s.squads,a),this.drawStatusPanel(s,e,a),this.drawTranscript(s.transcript,t,a),o.fillStyle=d.textAccent,o.font="11px monospace",o.textAlign="center",o.textBaseline="bottom",o.globalAlpha=.5,o.fillText("── EXPXAGENTS AVA v1 ──",t,a-8),o.globalAlpha=1}drawGrid(s,o,n){const e=this.ctx,a=b.gridSpacing;e.strokeStyle=d.grid,e.lineWidth=.5,e.beginPath();for(let t=0;t<s;t+=a)e.moveTo(t,0),e.lineTo(t,o);e.stroke(),e.beginPath();for(let t=0;t<o;t+=a)e.moveTo(0,t),e.lineTo(s,t);e.stroke()}updateAndDrawParticles(s,o,n){const e=this.ctx,a=s==="LISTENING"||s==="PROCESSING"?2:1;for(const t of this.particles)t.x+=t.vx*a,t.y+=t.vy*a,t.x<0&&(t.x=o),t.x>o&&(t.x=0),t.y<0&&(t.y=n),t.y>n&&(t.y=0),e.beginPath(),e.arc(t.x,t.y,t.radius,0,Math.PI*2),e.fillStyle=d.particleStart,e.globalAlpha=t.alpha,e.fill();e.globalAlpha=1}drawOrb(s,o,n){const e=this.ctx,a=b.orbRadius,t=q[n.mode];e.save(),e.shadowBlur=n.mode==="STANDBY"?20:40,e.shadowColor=t;const i=e.createRadialGradient(s,o,0,s,o,a);if(i.addColorStop(0,t),i.addColorStop(1,"transparent"),e.fillStyle=i,e.beginPath(),e.arc(s,o,a,0,Math.PI*2),e.fill(),e.strokeStyle=t,e.lineWidth=b.orbRingWidth,e.beginPath(),n.mode==="PROCESSING"){const l=n.time/500%(Math.PI*2);e.arc(s,o,a+8,l,l+Math.PI*1.5)}else e.arc(s,o,a+8,0,Math.PI*2);if(e.stroke(),n.mode==="STANDBY"){const l=.5+.3*Math.sin(n.time/1500);e.globalAlpha=l,e.beginPath(),e.arc(s,o,a+4,0,Math.PI*2),e.fillStyle=t,e.fill(),e.globalAlpha=1}if(n.mode==="SPEAKING"){const l=.6+.4*Math.sin(n.time/200);e.globalAlpha=l,e.beginPath(),e.arc(s,o,a*(.9+.1*Math.sin(n.time/300)),0,Math.PI*2),e.fillStyle=t,e.fill(),e.globalAlpha=1}e.restore(),e.fillStyle=t,e.font="bold 12px monospace",e.textAlign="center",e.textBaseline="top";const u=n.mode==="PROCESSING"?"Processando...":n.mode;e.fillText(u,s,o+a+20),e.fillStyle=d.textPrimary,e.font="bold 16px monospace",e.fillText("AVA",s,o-a-30)}drawWaveform(s,o,n){const e=this.ctx,a=b.waveformBars,t=b.waveformMaxHeight,i=b.orbRadius+16;e.strokeStyle=d.orbListening,e.lineWidth=2;for(let u=0;u<a;u++){const l=u/a*Math.PI*2-Math.PI/2,x=Math.floor(u/a*n.length),g=(n[x]??0)/255,R=g*t,A=s+Math.cos(l)*i,p=o+Math.sin(l)*i,y=s+Math.cos(l)*(i+R),r=o+Math.sin(l)*(i+R);e.beginPath(),e.moveTo(A,p),e.lineTo(y,r),e.globalAlpha=.6+g*.4,e.stroke()}e.globalAlpha=1}drawSquadsPanel(s,o){const n=this.ctx,e=b.panelWidth,a=b.panelPadding,t=Math.max(200,s.length*28+60),i=(o-t)/2;n.fillStyle=d.panelBg,n.fillRect(a,i,e,t),n.strokeStyle=d.panelBorder,n.lineWidth=1,n.strokeRect(a,i,e,t),n.fillStyle=d.textAccent,n.font="bold 13px monospace",n.textAlign="left",n.textBaseline="top",n.fillText("SQUADS",a+10,i+10),n.font="12px monospace",s.forEach((u,l)=>{const x=i+40+l*28,g=u.active?"●":"○";n.fillStyle=u.active?d.orbSpeaking:d.textPrimary,n.fillText(`${g} ${u.name}`,a+10,x)})}drawStatusPanel(s,o,n){var p;const e=this.ctx,a=b.panelWidth,t=b.panelPadding,i=200,u=(n-i)/2,l=o-a-t;e.fillStyle=d.panelBg,e.fillRect(l,u,a,i),e.strokeStyle=d.panelBorder,e.lineWidth=1,e.strokeRect(l,u,a,i),e.fillStyle=d.textAccent,e.font="bold 13px monospace",e.textAlign="left",e.textBaseline="top",e.fillText("STATUS",l+10,u+10),e.font="12px monospace";const x=Math.floor(s.time/1e3),g=String(Math.floor(x/60)).padStart(2,"0"),R=String(x%60).padStart(2,"0"),A=[`Mode: ${s.mode}`,"Mic: ON",`Squad: ${((p=s.squads.find(y=>y.active))==null?void 0:p.name)??"---"}`,`Time: ${g}:${R}`];s.userName&&A.push(`User: ${s.userName}`),A.forEach((y,r)=>{e.fillStyle=d.textPrimary,e.fillText(y,l+10,u+40+r*24)})}drawTranscript(s,o,n){const e=this.ctx,a=s.slice(-10);if(a.length===0)return;const t=b.transcriptLineHeight,i=Math.min(700,this.canvas.width-100),u=a.length*t+24,l=o-i/2,x=n-u-40;e.fillStyle=d.panelBg,e.fillRect(l,x,i,u),e.strokeStyle=d.panelBorder,e.lineWidth=1,e.strokeRect(l,x,i,u),e.font="12px monospace",e.textAlign="left",e.textBaseline="top",a.forEach((g,R)=>{const A=x+12+R*t,p=g.role==="user"?"User: ":"Ava: ";e.fillStyle=g.role==="user"?d.textAccent:d.textAva;const y=Math.floor((i-20)/7),r=p+(g.text.length>y?g.text.slice(0,y-3)+"...":g.text);e.fillText(r,l+10,A)})}destroy(){this.destroyed=!0}}function F(){const c=m.useRef(null),s=m.useRef(null),o=m.useRef(0),n=m.useRef(Date.now()),[e,a]=m.useState(""),t=S(r=>r.messages);S(r=>r.userName);const i=G(r=>r.user);k(r=>r.squads),m.useEffect(()=>{i!=null&&i.username&&S.getState().setUserName(i.username)},[i==null?void 0:i.username]);const u=m.useRef(0);m.useEffect(()=>{if(t.length>u.current){const r=t[t.length-1];r.role==="assistant"&&S.getState().mode==="PROCESSING"&&(S.getState().setMode("SPEAKING"),g.current.speak(r.content))}u.current=t.length},[t]);const l=m.useCallback(r=>{const f=["Certo, vou verificar isso agora.","Entendido, deixa comigo.","Um momento, já estou processando.","Certo, já estou buscando a informação."],h=f[Math.floor(Math.random()*f.length)];g.current.speak(h)},[]),x=m.useCallback(r=>{const f=S.getState().selectedSquad??"_jarvis";S.getState().addMessage("user",r),l(r),S.getState().setMode("PROCESSING"),S.getState().clearStandbyTimer(),B(f,r)},[l]),g=m.useRef({speak:r=>{}}),{speak:R,getAnalyser:A,isSupported:p}=V({onWakeWord:r=>{const f=S.getState().mode;if(!(f==="PROCESSING"||f==="SPEAKING"))if(r)x(r);else{S.getState().setMode("GREETING");const h=S.getState().userName||"";R(h?`Olá ${h}, como posso ajudar?`:"Olá, como posso ajudar?")}},onUtterance:r=>{const f=S.getState().mode;f==="PROCESSING"||f==="SPEAKING"||x(r)},onTTSEnd:()=>{const r=S.getState().mode;(r==="GREETING"||r==="SPEAKING")&&(S.getState().setMode("LISTENING"),S.getState().startStandbyTimer())}});g.current.speak=R,m.useEffect(()=>{const r=c.current;if(!r)return;const f=()=>{r.width=window.innerWidth,r.height=window.innerHeight};f(),window.addEventListener("resize",f);const h=new L(r);s.current=h;const T=()=>{const v=A();let P=null;if(v){const w=new ArrayBuffer(v.frequencyBinCount);P=new Uint8Array(w),v.getByteFrequencyData(P)}const E=S.getState(),C=k.getState().squads;h.render({mode:E.mode,time:Date.now()-n.current,amplitudes:P,squads:C.map(w=>({name:w.code,active:w.code===E.selectedSquad})),transcript:E.messages.map(w=>({role:w.role,text:w.content})),userName:E.userName}),o.current=requestAnimationFrame(T)};return o.current=requestAnimationFrame(T),()=>{cancelAnimationFrame(o.current),h.destroy(),window.removeEventListener("resize",f)}},[A]),m.useEffect(()=>()=>{S.getState().clearStandbyTimer()},[]);const y=r=>{r.preventDefault(),e.trim()&&(x(e.trim()),a(""))};return N.jsxDEV("div",{style:{position:"fixed",inset:0,background:d.background,zIndex:1e3},children:[N.jsxDEV("canvas",{ref:c,style:{display:"block",width:"100%",height:"100%"}},void 0,!1,{fileName:"/Users/thuliobittencourt/Documents/Projetos/ExpxAgents_2/dashboard/src/views/JarvisView.tsx",lineNumber:172,columnNumber:7},this),!p&&N.jsxDEV("div",{style:{position:"absolute",top:20,left:"50%",transform:"translateX(-50%)",color:d.orbProcessing,fontFamily:"monospace",fontSize:13,background:"rgba(255, 140, 0, 0.1)",border:"1px solid rgba(255, 140, 0, 0.3)",borderRadius:4,padding:"8px 16px",zIndex:1001},children:"Speech recognition not available. Use text input below."},void 0,!1,{fileName:"/Users/thuliobittencourt/Documents/Projetos/ExpxAgents_2/dashboard/src/views/JarvisView.tsx",lineNumber:178,columnNumber:9},this),N.jsxDEV("form",{onSubmit:y,style:{position:"absolute",bottom:30,left:"50%",transform:"translateX(-50%)",display:"flex",gap:8,zIndex:1001},children:[N.jsxDEV("input",{type:"text",value:e,onChange:r=>a(r.target.value),placeholder:p?"Or type a message...":"Type a message...",style:{width:400,padding:"8px 12px",background:"rgba(0, 200, 255, 0.08)",border:"1px solid rgba(0, 200, 255, 0.25)",borderRadius:4,color:d.textPrimary,fontFamily:"monospace",fontSize:13,outline:"none"}},void 0,!1,{fileName:"/Users/thuliobittencourt/Documents/Projetos/ExpxAgents_2/dashboard/src/views/JarvisView.tsx",lineNumber:208,columnNumber:9},this),N.jsxDEV("button",{type:"submit",style:{padding:"8px 16px",background:"rgba(0, 200, 255, 0.15)",border:"1px solid rgba(0, 200, 255, 0.25)",borderRadius:4,color:d.textAccent,fontFamily:"monospace",fontSize:13,cursor:"pointer"},children:"Send"},void 0,!1,{fileName:"/Users/thuliobittencourt/Documents/Projetos/ExpxAgents_2/dashboard/src/views/JarvisView.tsx",lineNumber:225,columnNumber:9},this)]},void 0,!0,{fileName:"/Users/thuliobittencourt/Documents/Projetos/ExpxAgents_2/dashboard/src/views/JarvisView.tsx",lineNumber:196,columnNumber:7},this)]},void 0,!0,{fileName:"/Users/thuliobittencourt/Documents/Projetos/ExpxAgents_2/dashboard/src/views/JarvisView.tsx",lineNumber:166,columnNumber:5},this)}export{F as JarvisView};
@@ -1 +0,0 @@
1
- import{r as d,u as W,j as Z}from"./index--ULBmMcf.js";import{S as $,O as tt,W as et,B as k,a as z,P as ot,C as nt,b as st,L as it,c as rt,V as _}from"./three-BZk_I9Ly.js";const m=60,q=120,V=40;function at(){try{const g=document.createElement("canvas");return!!(g.getContext("webgl2")||g.getContext("webgl"))}catch{return!1}}function pt({opacity:g=1}){const T=d.useRef(null),G=d.useRef(0),R=d.useRef({x:0,y:0}),U=d.useRef(W.getState().theme),[S]=d.useState(()=>at());return d.useEffect(()=>W.subscribe(u=>{U.current=u.theme}),[]),d.useEffect(()=>{if(!S)return;const n=T.current;if(!n)return;const u=n.clientWidth,b=n.clientHeight,N=new $,C=new tt(0,u,0,b,-100,100),c=new et({alpha:!0,antialias:!0});c.setSize(u,b),c.setPixelRatio(Math.min(window.devicePixelRatio,2)),n.appendChild(c.domElement);const r=[],v=new k,M=new Float32Array(m*3);for(let e=0;e<m;e++){const s=Math.random()*u,p=Math.random()*b,E=(Math.random()-.5)*.3,L=(Math.random()-.5)*.3;r.push({position:new _(s,p,0),velocity:new _(E,L,0),baseY:p}),M[e*3]=s,M[e*3+1]=p,M[e*3+2]=0}v.setAttribute("position",new z(M,3));const A=new ot({size:2,color:new nt("#007acc"),transparent:!0,opacity:.6,sizeAttenuation:!1}),H=new st(v,A);N.add(H);const a=new k,j=m*m,Y=new Float32Array(j*6),X=new Float32Array(j*6);a.setAttribute("position",new z(Y,3)),a.setAttribute("color",new z(X,3));const P=new it({vertexColors:!0,transparent:!0,opacity:.12,depthTest:!1}),J=new rt(a,P);N.add(J);const D=e=>{const s=n.getBoundingClientRect();R.current.x=e.clientX-s.left,R.current.y=e.clientY-s.top};n.addEventListener("mousemove",D);let F=0;const I=()=>{G.current=requestAnimationFrame(I),F+=.005;const e=U.current==="dark",s=0,p=.478,E=.8;A.color.setRGB(s,p,E),A.opacity=e?.5:.35,P.opacity=e?.08:.05;const L=v.attributes.position.array,K=R.current.x,Q=R.current.y;for(let o=0;o<m;o++){const t=r[o];t.position.x+=t.velocity.x,t.position.y+=t.velocity.y+Math.sin(F+o*.1)*.08;const y=K-t.position.x,h=Q-t.position.y,l=Math.sqrt(y*y+h*h);l<200&&l>1&&(t.position.x+=y/l*V*.005,t.position.y+=h/l*V*.005),t.position.x<-10&&(t.position.x=u+10),t.position.x>u+10&&(t.position.x=-10),t.position.y<-10&&(t.position.y=b+10),t.position.y>b+10&&(t.position.y=-10),L[o*3]=t.position.x,L[o*3+1]=t.position.y}v.attributes.position.needsUpdate=!0;let B=0;const f=a.attributes.position.array,x=a.attributes.color.array;for(let o=0;o<m;o++)for(let t=o+1;t<m;t++){const y=r[o].position.x-r[t].position.x,h=r[o].position.y-r[t].position.y,l=Math.sqrt(y*y+h*h);if(l<q){const w=1-l/q,i=B*6;f[i]=r[o].position.x,f[i+1]=r[o].position.y,f[i+2]=0,f[i+3]=r[t].position.x,f[i+4]=r[t].position.y,f[i+5]=0,x[i]=s*w,x[i+1]=p*w,x[i+2]=E*w,x[i+3]=s*w,x[i+4]=p*w,x[i+5]=E*w,B++}}a.setDrawRange(0,B*2),a.attributes.position.needsUpdate=!0,a.attributes.color.needsUpdate=!0,c.render(N,C)};I();const O=()=>{const e=n.clientWidth,s=n.clientHeight;C.right=e,C.bottom=s,C.updateProjectionMatrix(),c.setSize(e,s)};return window.addEventListener("resize",O),()=>{cancelAnimationFrame(G.current),n.removeEventListener("mousemove",D),window.removeEventListener("resize",O),c.dispose(),v.dispose(),A.dispose(),a.dispose(),P.dispose(),n.contains(c.domElement)&&n.removeChild(c.domElement)}},[S]),S?Z.jsxDEV("div",{ref:T,style:{position:"absolute",inset:0,zIndex:0,pointerEvents:"auto",opacity:g}},void 0,!1,{fileName:"/Users/thuliobittencourt/Documents/Projetos/ExpxAgents_2/dashboard/src/components/ThreeBackground.tsx",lineNumber:225,columnNumber:5},this):null}export{pt as ThreeBackground};