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.
- package/dist/cli/src/commands/info.d.ts +1 -2
- package/dist/cli/src/commands/login.d.ts +1 -2
- package/dist/cli/src/commands/logout.d.ts +1 -2
- package/dist/cli/src/commands/outdated.d.ts +1 -2
- package/dist/cli/src/commands/publish.d.ts +1 -2
- package/dist/cli/src/commands/registry-install.d.ts +1 -2
- package/dist/cli/src/commands/search.d.ts +1 -2
- package/dist/cli/src/commands/update.d.ts +1 -2
- package/dist/cli/src/commands/whoami.d.ts +1 -2
- package/dist/dashboard/assets/{BufferResource-A8ncaeYI.js → BufferResource-D79vaoFm.js} +1 -1
- package/dist/dashboard/assets/{CanvasRenderer-B9ePxyZx.js → CanvasRenderer-BUoxTNKV.js} +1 -1
- package/dist/dashboard/assets/JarvisView-DSN7xWMz.js +1 -0
- package/dist/dashboard/assets/{RenderTargetSystem-B6qE1bDj.js → RenderTargetSystem-B7rwTXA1.js} +1 -1
- package/dist/dashboard/assets/ThreeBackground-BQTdScX-.js +1 -0
- package/dist/dashboard/assets/{WebGLRenderer-D5vXNoQg.js → WebGLRenderer-DgdVNsZ9.js} +1 -1
- package/dist/dashboard/assets/{WebGPURenderer-CPOVD6U9.js → WebGPURenderer-DnQNvjEQ.js} +1 -1
- package/dist/dashboard/assets/{browserAll-BXl_rCrX.js → browserAll-Cbsk7DE4.js} +1 -1
- package/dist/dashboard/assets/index-CrlhoBta.js +783 -0
- package/dist/dashboard/assets/{webworkerAll-Dv96EAc4.js → webworkerAll-BLmfReEj.js} +1 -1
- package/dist/dashboard/index.html +1 -1
- package/package.json +2 -2
- package/dist/cli/src/__tests__/cli.test.d.ts +0 -1
- package/dist/cli/src/__tests__/cli.test.js +0 -23
- package/dist/cli/src/commands/__tests__/outdated.test.d.ts +0 -1
- package/dist/cli/src/commands/__tests__/outdated.test.js +0 -76
- package/dist/cli/src/mcp/__tests__/catalog.test.d.ts +0 -1
- package/dist/cli/src/mcp/__tests__/catalog.test.js +0 -101
- package/dist/cli/src/mcp/__tests__/detect.test.d.ts +0 -1
- package/dist/cli/src/mcp/__tests__/detect.test.js +0 -84
- package/dist/cli/src/mcp/__tests__/setup.test.d.ts +0 -1
- package/dist/cli/src/mcp/__tests__/setup.test.js +0 -75
- package/dist/cli/src/mcp/__tests__/validate.test.d.ts +0 -1
- package/dist/cli/src/mcp/__tests__/validate.test.js +0 -42
- package/dist/cli/src/pencil/__tests__/detect.test.d.ts +0 -1
- package/dist/cli/src/pencil/__tests__/detect.test.js +0 -71
- package/dist/cli/src/pencil/__tests__/property-mapper.test.d.ts +0 -1
- package/dist/cli/src/pencil/__tests__/property-mapper.test.js +0 -120
- package/dist/cli/src/pencil/__tests__/template-sync.test.d.ts +0 -1
- package/dist/cli/src/pencil/__tests__/template-sync.test.js +0 -95
- package/dist/cli/src/runners/__tests__/provider-registry.test.d.ts +0 -1
- package/dist/cli/src/runners/__tests__/provider-registry.test.js +0 -31
- package/dist/cli/src/runners/__tests__/provider-runner.test.d.ts +0 -1
- package/dist/cli/src/runners/__tests__/provider-runner.test.js +0 -86
- package/dist/cli/src/utils/__tests__/command-prefix.test.d.ts +0 -1
- package/dist/cli/src/utils/__tests__/command-prefix.test.js +0 -35
- package/dist/cli/src/utils/__tests__/global-install.test.d.ts +0 -1
- package/dist/cli/src/utils/__tests__/global-install.test.js +0 -25
- package/dist/dashboard/assets/JarvisView-BzSP9oge.js +0 -1
- package/dist/dashboard/assets/ThreeBackground-Ds6SAxmB.js +0 -1
- package/dist/dashboard/assets/index--ULBmMcf.js +0 -1195
- package/dist/data/opensquad.db +0 -0
- package/dist/data/opensquad.db-shm +0 -0
- package/dist/data/opensquad.db-wal +0 -0
- package/node_modules/expxagents-knowledge/dist/config.d.ts +0 -4
- package/node_modules/expxagents-knowledge/dist/config.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/config.js +0 -37
- package/node_modules/expxagents-knowledge/dist/config.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/db/connection.d.ts +0 -6
- package/node_modules/expxagents-knowledge/dist/db/connection.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/db/connection.js +0 -69
- package/node_modules/expxagents-knowledge/dist/db/connection.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/db/migrations.d.ts +0 -3
- package/node_modules/expxagents-knowledge/dist/db/migrations.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/db/migrations.js +0 -46
- package/node_modules/expxagents-knowledge/dist/db/migrations.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/db/schema.d.ts +0 -3
- package/node_modules/expxagents-knowledge/dist/db/schema.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/db/schema.js +0 -79
- package/node_modules/expxagents-knowledge/dist/db/schema.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/index.d.ts +0 -16
- package/node_modules/expxagents-knowledge/dist/index.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/index.js +0 -16
- package/node_modules/expxagents-knowledge/dist/index.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/ingest/chunker.d.ts +0 -10
- package/node_modules/expxagents-knowledge/dist/ingest/chunker.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/ingest/chunker.js +0 -221
- package/node_modules/expxagents-knowledge/dist/ingest/chunker.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/ingest/document-loader.d.ts +0 -4
- package/node_modules/expxagents-knowledge/dist/ingest/document-loader.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/ingest/document-loader.js +0 -56
- package/node_modules/expxagents-knowledge/dist/ingest/document-loader.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/ingest/embedder.d.ts +0 -4
- package/node_modules/expxagents-knowledge/dist/ingest/embedder.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/ingest/embedder.js +0 -25
- package/node_modules/expxagents-knowledge/dist/ingest/embedder.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/ingest/entity-extractor.d.ts +0 -21
- package/node_modules/expxagents-knowledge/dist/ingest/entity-extractor.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/ingest/entity-extractor.js +0 -54
- package/node_modules/expxagents-knowledge/dist/ingest/entity-extractor.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/ingest/extraction-queue.d.ts +0 -16
- package/node_modules/expxagents-knowledge/dist/ingest/extraction-queue.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/ingest/extraction-queue.js +0 -49
- package/node_modules/expxagents-knowledge/dist/ingest/extraction-queue.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/ingest/pdf-extractor.d.ts +0 -9
- package/node_modules/expxagents-knowledge/dist/ingest/pdf-extractor.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/ingest/pdf-extractor.js +0 -116
- package/node_modules/expxagents-knowledge/dist/ingest/pdf-extractor.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/ingest/pipeline.d.ts +0 -27
- package/node_modules/expxagents-knowledge/dist/ingest/pipeline.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/ingest/pipeline.js +0 -92
- package/node_modules/expxagents-knowledge/dist/ingest/pipeline.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/query/graph-traversal.d.ts +0 -41
- package/node_modules/expxagents-knowledge/dist/query/graph-traversal.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/query/graph-traversal.js +0 -62
- package/node_modules/expxagents-knowledge/dist/query/graph-traversal.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/query/knowledge-query.d.ts +0 -31
- package/node_modules/expxagents-knowledge/dist/query/knowledge-query.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/query/knowledge-query.js +0 -106
- package/node_modules/expxagents-knowledge/dist/query/knowledge-query.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/query/vector-search.d.ts +0 -26
- package/node_modules/expxagents-knowledge/dist/query/vector-search.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/query/vector-search.js +0 -57
- package/node_modules/expxagents-knowledge/dist/query/vector-search.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/sources/agent-output.d.ts +0 -10
- package/node_modules/expxagents-knowledge/dist/sources/agent-output.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/sources/agent-output.js +0 -29
- package/node_modules/expxagents-knowledge/dist/sources/agent-output.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/sources/watcher.d.ts +0 -6
- package/node_modules/expxagents-knowledge/dist/sources/watcher.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/sources/watcher.js +0 -42
- package/node_modules/expxagents-knowledge/dist/sources/watcher.js.map +0 -1
- package/node_modules/expxagents-knowledge/dist/types.d.ts +0 -138
- package/node_modules/expxagents-knowledge/dist/types.d.ts.map +0 -1
- package/node_modules/expxagents-knowledge/dist/types.js +0 -2
- package/node_modules/expxagents-knowledge/dist/types.js.map +0 -1
- 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 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -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 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -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};
|