helixmind 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.
Potentially problematic release.
This version of helixmind might be problematic. Click here for more details.
- package/LICENSE +20 -0
- package/README.md +207 -0
- package/dist/cli/agent/autonomous.d.ts +10 -0
- package/dist/cli/agent/autonomous.d.ts.map +1 -0
- package/dist/cli/agent/autonomous.js +172 -0
- package/dist/cli/agent/autonomous.js.map +1 -0
- package/dist/cli/agent/loop.d.ts +76 -0
- package/dist/cli/agent/loop.d.ts.map +1 -0
- package/dist/cli/agent/loop.js +333 -0
- package/dist/cli/agent/loop.js.map +1 -0
- package/dist/cli/agent/permissions.d.ts +28 -0
- package/dist/cli/agent/permissions.d.ts.map +1 -0
- package/dist/cli/agent/permissions.js +180 -0
- package/dist/cli/agent/permissions.js.map +1 -0
- package/dist/cli/agent/sandbox.d.ts +17 -0
- package/dist/cli/agent/sandbox.d.ts.map +1 -0
- package/dist/cli/agent/sandbox.js +124 -0
- package/dist/cli/agent/sandbox.js.map +1 -0
- package/dist/cli/agent/tools/edit-file.d.ts +2 -0
- package/dist/cli/agent/tools/edit-file.d.ts.map +1 -0
- package/dist/cli/agent/tools/edit-file.js +49 -0
- package/dist/cli/agent/tools/edit-file.js.map +1 -0
- package/dist/cli/agent/tools/find.d.ts +2 -0
- package/dist/cli/agent/tools/find.d.ts.map +1 -0
- package/dist/cli/agent/tools/find.js +35 -0
- package/dist/cli/agent/tools/find.js.map +1 -0
- package/dist/cli/agent/tools/git-commit.d.ts +2 -0
- package/dist/cli/agent/tools/git-commit.d.ts.map +1 -0
- package/dist/cli/agent/tools/git-commit.js +51 -0
- package/dist/cli/agent/tools/git-commit.js.map +1 -0
- package/dist/cli/agent/tools/git-diff.d.ts +2 -0
- package/dist/cli/agent/tools/git-diff.d.ts.map +1 -0
- package/dist/cli/agent/tools/git-diff.js +36 -0
- package/dist/cli/agent/tools/git-diff.js.map +1 -0
- package/dist/cli/agent/tools/git-log.d.ts +2 -0
- package/dist/cli/agent/tools/git-log.d.ts.map +1 -0
- package/dist/cli/agent/tools/git-log.js +32 -0
- package/dist/cli/agent/tools/git-log.js.map +1 -0
- package/dist/cli/agent/tools/git-status.d.ts +2 -0
- package/dist/cli/agent/tools/git-status.d.ts.map +1 -0
- package/dist/cli/agent/tools/git-status.js +38 -0
- package/dist/cli/agent/tools/git-status.js.map +1 -0
- package/dist/cli/agent/tools/list-dir.d.ts +2 -0
- package/dist/cli/agent/tools/list-dir.d.ts.map +1 -0
- package/dist/cli/agent/tools/list-dir.js +73 -0
- package/dist/cli/agent/tools/list-dir.js.map +1 -0
- package/dist/cli/agent/tools/read-file.d.ts +2 -0
- package/dist/cli/agent/tools/read-file.d.ts.map +1 -0
- package/dist/cli/agent/tools/read-file.js +45 -0
- package/dist/cli/agent/tools/read-file.js.map +1 -0
- package/dist/cli/agent/tools/registry.d.ts +18 -0
- package/dist/cli/agent/tools/registry.d.ts.map +1 -0
- package/dist/cli/agent/tools/registry.js +31 -0
- package/dist/cli/agent/tools/registry.js.map +1 -0
- package/dist/cli/agent/tools/run-command.d.ts +2 -0
- package/dist/cli/agent/tools/run-command.d.ts.map +1 -0
- package/dist/cli/agent/tools/run-command.js +79 -0
- package/dist/cli/agent/tools/run-command.js.map +1 -0
- package/dist/cli/agent/tools/search.d.ts +2 -0
- package/dist/cli/agent/tools/search.d.ts.map +1 -0
- package/dist/cli/agent/tools/search.js +104 -0
- package/dist/cli/agent/tools/search.js.map +1 -0
- package/dist/cli/agent/tools/spiral-query.d.ts +2 -0
- package/dist/cli/agent/tools/spiral-query.d.ts.map +1 -0
- package/dist/cli/agent/tools/spiral-query.js +52 -0
- package/dist/cli/agent/tools/spiral-query.js.map +1 -0
- package/dist/cli/agent/tools/spiral-store.d.ts +2 -0
- package/dist/cli/agent/tools/spiral-store.d.ts.map +1 -0
- package/dist/cli/agent/tools/spiral-store.js +37 -0
- package/dist/cli/agent/tools/spiral-store.js.map +1 -0
- package/dist/cli/agent/tools/web-research.d.ts +2 -0
- package/dist/cli/agent/tools/web-research.d.ts.map +1 -0
- package/dist/cli/agent/tools/web-research.js +96 -0
- package/dist/cli/agent/tools/web-research.js.map +1 -0
- package/dist/cli/agent/tools/write-file.d.ts +2 -0
- package/dist/cli/agent/tools/write-file.d.ts.map +1 -0
- package/dist/cli/agent/tools/write-file.js +91 -0
- package/dist/cli/agent/tools/write-file.js.map +1 -0
- package/dist/cli/agent/undo.d.ts +30 -0
- package/dist/cli/agent/undo.d.ts.map +1 -0
- package/dist/cli/agent/undo.js +48 -0
- package/dist/cli/agent/undo.js.map +1 -0
- package/dist/cli/auth/callback-server.d.ts +15 -0
- package/dist/cli/auth/callback-server.d.ts.map +1 -0
- package/dist/cli/auth/callback-server.js +168 -0
- package/dist/cli/auth/callback-server.js.map +1 -0
- package/dist/cli/auth/feature-gate.d.ts +19 -0
- package/dist/cli/auth/feature-gate.d.ts.map +1 -0
- package/dist/cli/auth/feature-gate.js +74 -0
- package/dist/cli/auth/feature-gate.js.map +1 -0
- package/dist/cli/auth/guard.d.ts +10 -0
- package/dist/cli/auth/guard.d.ts.map +1 -0
- package/dist/cli/auth/guard.js +46 -0
- package/dist/cli/auth/guard.js.map +1 -0
- package/dist/cli/auth/login.d.ts +22 -0
- package/dist/cli/auth/login.d.ts.map +1 -0
- package/dist/cli/auth/login.js +194 -0
- package/dist/cli/auth/login.js.map +1 -0
- package/dist/cli/auth/logout.d.ts +6 -0
- package/dist/cli/auth/logout.d.ts.map +1 -0
- package/dist/cli/auth/logout.js +36 -0
- package/dist/cli/auth/logout.js.map +1 -0
- package/dist/cli/bench/dataset.d.ts +13 -0
- package/dist/cli/bench/dataset.d.ts.map +1 -0
- package/dist/cli/bench/dataset.js +97 -0
- package/dist/cli/bench/dataset.js.map +1 -0
- package/dist/cli/bench/harness.d.ts +7 -0
- package/dist/cli/bench/harness.d.ts.map +1 -0
- package/dist/cli/bench/harness.js +135 -0
- package/dist/cli/bench/harness.js.map +1 -0
- package/dist/cli/bench/metrics.d.ts +15 -0
- package/dist/cli/bench/metrics.d.ts.map +1 -0
- package/dist/cli/bench/metrics.js +98 -0
- package/dist/cli/bench/metrics.js.map +1 -0
- package/dist/cli/bench/output.d.ts +42 -0
- package/dist/cli/bench/output.d.ts.map +1 -0
- package/dist/cli/bench/output.js +140 -0
- package/dist/cli/bench/output.js.map +1 -0
- package/dist/cli/bench/prompt.d.ts +13 -0
- package/dist/cli/bench/prompt.d.ts.map +1 -0
- package/dist/cli/bench/prompt.js +106 -0
- package/dist/cli/bench/prompt.js.map +1 -0
- package/dist/cli/bench/runner.d.ts +14 -0
- package/dist/cli/bench/runner.d.ts.map +1 -0
- package/dist/cli/bench/runner.js +334 -0
- package/dist/cli/bench/runner.js.map +1 -0
- package/dist/cli/bench/types.d.ts +109 -0
- package/dist/cli/bench/types.d.ts.map +1 -0
- package/dist/cli/bench/types.js +2 -0
- package/dist/cli/bench/types.js.map +1 -0
- package/dist/cli/bench/ui.d.ts +12 -0
- package/dist/cli/bench/ui.d.ts.map +1 -0
- package/dist/cli/bench/ui.js +126 -0
- package/dist/cli/bench/ui.js.map +1 -0
- package/dist/cli/brain/archive.d.ts +33 -0
- package/dist/cli/brain/archive.d.ts.map +1 -0
- package/dist/cli/brain/archive.js +159 -0
- package/dist/cli/brain/archive.js.map +1 -0
- package/dist/cli/brain/control-protocol.d.ts +159 -0
- package/dist/cli/brain/control-protocol.d.ts.map +1 -0
- package/dist/cli/brain/control-protocol.js +41 -0
- package/dist/cli/brain/control-protocol.js.map +1 -0
- package/dist/cli/brain/exporter.d.ts +34 -0
- package/dist/cli/brain/exporter.d.ts.map +1 -0
- package/dist/cli/brain/exporter.js +37 -0
- package/dist/cli/brain/exporter.js.map +1 -0
- package/dist/cli/brain/generator.d.ts +67 -0
- package/dist/cli/brain/generator.d.ts.map +1 -0
- package/dist/cli/brain/generator.js +239 -0
- package/dist/cli/brain/generator.js.map +1 -0
- package/dist/cli/brain/relay-client.d.ts +8 -0
- package/dist/cli/brain/relay-client.d.ts.map +1 -0
- package/dist/cli/brain/relay-client.js +173 -0
- package/dist/cli/brain/relay-client.js.map +1 -0
- package/dist/cli/brain/server.d.ts +34 -0
- package/dist/cli/brain/server.d.ts.map +1 -0
- package/dist/cli/brain/server.js +425 -0
- package/dist/cli/brain/server.js.map +1 -0
- package/dist/cli/brain/template.d.ts +3 -0
- package/dist/cli/brain/template.d.ts.map +1 -0
- package/dist/cli/brain/template.js +2072 -0
- package/dist/cli/brain/template.js.map +1 -0
- package/dist/cli/checkpoints/browser.d.ts +27 -0
- package/dist/cli/checkpoints/browser.d.ts.map +1 -0
- package/dist/cli/checkpoints/browser.js +238 -0
- package/dist/cli/checkpoints/browser.js.map +1 -0
- package/dist/cli/checkpoints/keybinding.d.ts +22 -0
- package/dist/cli/checkpoints/keybinding.d.ts.map +1 -0
- package/dist/cli/checkpoints/keybinding.js +43 -0
- package/dist/cli/checkpoints/keybinding.js.map +1 -0
- package/dist/cli/checkpoints/revert.d.ts +37 -0
- package/dist/cli/checkpoints/revert.d.ts.map +1 -0
- package/dist/cli/checkpoints/revert.js +144 -0
- package/dist/cli/checkpoints/revert.js.map +1 -0
- package/dist/cli/checkpoints/store.d.ts +48 -0
- package/dist/cli/checkpoints/store.d.ts.map +1 -0
- package/dist/cli/checkpoints/store.js +188 -0
- package/dist/cli/checkpoints/store.js.map +1 -0
- package/dist/cli/commands/archive.d.ts +7 -0
- package/dist/cli/commands/archive.d.ts.map +1 -0
- package/dist/cli/commands/archive.js +66 -0
- package/dist/cli/commands/archive.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +10 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +44 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/bench.d.ts +25 -0
- package/dist/cli/commands/bench.d.ts.map +1 -0
- package/dist/cli/commands/bench.js +114 -0
- package/dist/cli/commands/bench.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +11 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +2321 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/config.d.ts +4 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +41 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/feed.d.ts +6 -0
- package/dist/cli/commands/feed.d.ts.map +1 -0
- package/dist/cli/commands/feed.js +95 -0
- package/dist/cli/commands/feed.js.map +1 -0
- package/dist/cli/commands/helix-menu.d.ts +4 -0
- package/dist/cli/commands/helix-menu.d.ts.map +1 -0
- package/dist/cli/commands/helix-menu.js +400 -0
- package/dist/cli/commands/helix-menu.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +26 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +20 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +314 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/spiral.d.ts +4 -0
- package/dist/cli/commands/spiral.d.ts.map +1 -0
- package/dist/cli/commands/spiral.js +81 -0
- package/dist/cli/commands/spiral.js.map +1 -0
- package/dist/cli/config/store.d.ts +72 -0
- package/dist/cli/config/store.d.ts.map +1 -0
- package/dist/cli/config/store.js +241 -0
- package/dist/cli/config/store.js.map +1 -0
- package/dist/cli/context/assembler.d.ts +8 -0
- package/dist/cli/context/assembler.d.ts.map +1 -0
- package/dist/cli/context/assembler.js +124 -0
- package/dist/cli/context/assembler.js.map +1 -0
- package/dist/cli/context/project.d.ts +13 -0
- package/dist/cli/context/project.d.ts.map +1 -0
- package/dist/cli/context/project.js +126 -0
- package/dist/cli/context/project.js.map +1 -0
- package/dist/cli/context/session-buffer.d.ts +57 -0
- package/dist/cli/context/session-buffer.d.ts.map +1 -0
- package/dist/cli/context/session-buffer.js +268 -0
- package/dist/cli/context/session-buffer.js.map +1 -0
- package/dist/cli/context/trimmer.d.ts +26 -0
- package/dist/cli/context/trimmer.d.ts.map +1 -0
- package/dist/cli/context/trimmer.js +105 -0
- package/dist/cli/context/trimmer.js.map +1 -0
- package/dist/cli/feed/analyzer.d.ts +17 -0
- package/dist/cli/feed/analyzer.d.ts.map +1 -0
- package/dist/cli/feed/analyzer.js +220 -0
- package/dist/cli/feed/analyzer.js.map +1 -0
- package/dist/cli/feed/intent.d.ts +8 -0
- package/dist/cli/feed/intent.d.ts.map +1 -0
- package/dist/cli/feed/intent.js +70 -0
- package/dist/cli/feed/intent.js.map +1 -0
- package/dist/cli/feed/parser.d.ts +23 -0
- package/dist/cli/feed/parser.d.ts.map +1 -0
- package/dist/cli/feed/parser.js +166 -0
- package/dist/cli/feed/parser.js.map +1 -0
- package/dist/cli/feed/pipeline.d.ts +32 -0
- package/dist/cli/feed/pipeline.d.ts.map +1 -0
- package/dist/cli/feed/pipeline.js +242 -0
- package/dist/cli/feed/pipeline.js.map +1 -0
- package/dist/cli/feed/reader.d.ts +10 -0
- package/dist/cli/feed/reader.d.ts.map +1 -0
- package/dist/cli/feed/reader.js +61 -0
- package/dist/cli/feed/reader.js.map +1 -0
- package/dist/cli/feed/scanner.d.ts +10 -0
- package/dist/cli/feed/scanner.d.ts.map +1 -0
- package/dist/cli/feed/scanner.js +124 -0
- package/dist/cli/feed/scanner.js.map +1 -0
- package/dist/cli/feed/watcher.d.ts +14 -0
- package/dist/cli/feed/watcher.d.ts.map +1 -0
- package/dist/cli/feed/watcher.js +76 -0
- package/dist/cli/feed/watcher.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +204 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/providers/anthropic.d.ts +10 -0
- package/dist/cli/providers/anthropic.d.ts.map +1 -0
- package/dist/cli/providers/anthropic.js +117 -0
- package/dist/cli/providers/anthropic.js.map +1 -0
- package/dist/cli/providers/ollama.d.ts +37 -0
- package/dist/cli/providers/ollama.d.ts.map +1 -0
- package/dist/cli/providers/ollama.js +151 -0
- package/dist/cli/providers/ollama.js.map +1 -0
- package/dist/cli/providers/openai.d.ts +13 -0
- package/dist/cli/providers/openai.d.ts.map +1 -0
- package/dist/cli/providers/openai.js +283 -0
- package/dist/cli/providers/openai.js.map +1 -0
- package/dist/cli/providers/rate-limiter.d.ts +51 -0
- package/dist/cli/providers/rate-limiter.d.ts.map +1 -0
- package/dist/cli/providers/rate-limiter.js +164 -0
- package/dist/cli/providers/rate-limiter.js.map +1 -0
- package/dist/cli/providers/registry.d.ts +16 -0
- package/dist/cli/providers/registry.d.ts.map +1 -0
- package/dist/cli/providers/registry.js +99 -0
- package/dist/cli/providers/registry.js.map +1 -0
- package/dist/cli/providers/types.d.ts +61 -0
- package/dist/cli/providers/types.d.ts.map +1 -0
- package/dist/cli/providers/types.js +2 -0
- package/dist/cli/providers/types.js.map +1 -0
- package/dist/cli/sessions/manager.d.ts +69 -0
- package/dist/cli/sessions/manager.d.ts.map +1 -0
- package/dist/cli/sessions/manager.js +200 -0
- package/dist/cli/sessions/manager.js.map +1 -0
- package/dist/cli/sessions/session.d.ts +54 -0
- package/dist/cli/sessions/session.d.ts.map +1 -0
- package/dist/cli/sessions/session.js +70 -0
- package/dist/cli/sessions/session.js.map +1 -0
- package/dist/cli/sessions/tab-view.d.ts +18 -0
- package/dist/cli/sessions/tab-view.d.ts.map +1 -0
- package/dist/cli/sessions/tab-view.js +134 -0
- package/dist/cli/sessions/tab-view.js.map +1 -0
- package/dist/cli/ui/activity.d.ts +82 -0
- package/dist/cli/ui/activity.d.ts.map +1 -0
- package/dist/cli/ui/activity.js +309 -0
- package/dist/cli/ui/activity.js.map +1 -0
- package/dist/cli/ui/chat-view.d.ts +10 -0
- package/dist/cli/ui/chat-view.d.ts.map +1 -0
- package/dist/cli/ui/chat-view.js +165 -0
- package/dist/cli/ui/chat-view.js.map +1 -0
- package/dist/cli/ui/command-suggest.d.ts +22 -0
- package/dist/cli/ui/command-suggest.d.ts.map +1 -0
- package/dist/cli/ui/command-suggest.js +115 -0
- package/dist/cli/ui/command-suggest.js.map +1 -0
- package/dist/cli/ui/logo.d.ts +3 -0
- package/dist/cli/ui/logo.d.ts.map +1 -0
- package/dist/cli/ui/logo.js +25 -0
- package/dist/cli/ui/logo.js.map +1 -0
- package/dist/cli/ui/progress.d.ts +21 -0
- package/dist/cli/ui/progress.d.ts.map +1 -0
- package/dist/cli/ui/progress.js +125 -0
- package/dist/cli/ui/progress.js.map +1 -0
- package/dist/cli/ui/select-menu.d.ts +22 -0
- package/dist/cli/ui/select-menu.d.ts.map +1 -0
- package/dist/cli/ui/select-menu.js +152 -0
- package/dist/cli/ui/select-menu.js.map +1 -0
- package/dist/cli/ui/spinner.d.ts +3 -0
- package/dist/cli/ui/spinner.d.ts.map +1 -0
- package/dist/cli/ui/spinner.js +14 -0
- package/dist/cli/ui/spinner.js.map +1 -0
- package/dist/cli/ui/statusbar.d.ts +65 -0
- package/dist/cli/ui/statusbar.d.ts.map +1 -0
- package/dist/cli/ui/statusbar.js +272 -0
- package/dist/cli/ui/statusbar.js.map +1 -0
- package/dist/cli/ui/theme.d.ts +20 -0
- package/dist/cli/ui/theme.d.ts.map +1 -0
- package/dist/cli/ui/theme.js +25 -0
- package/dist/cli/ui/theme.js.map +1 -0
- package/dist/cli/ui/tool-output.d.ts +25 -0
- package/dist/cli/ui/tool-output.d.ts.map +1 -0
- package/dist/cli/ui/tool-output.js +171 -0
- package/dist/cli/ui/tool-output.js.map +1 -0
- package/dist/cli/validation/autofix.d.ts +32 -0
- package/dist/cli/validation/autofix.d.ts.map +1 -0
- package/dist/cli/validation/autofix.js +148 -0
- package/dist/cli/validation/autofix.js.map +1 -0
- package/dist/cli/validation/classifier.d.ts +17 -0
- package/dist/cli/validation/classifier.d.ts.map +1 -0
- package/dist/cli/validation/classifier.js +174 -0
- package/dist/cli/validation/classifier.js.map +1 -0
- package/dist/cli/validation/criteria.d.ts +22 -0
- package/dist/cli/validation/criteria.d.ts.map +1 -0
- package/dist/cli/validation/criteria.js +188 -0
- package/dist/cli/validation/criteria.js.map +1 -0
- package/dist/cli/validation/dynamic-checks.d.ts +16 -0
- package/dist/cli/validation/dynamic-checks.d.ts.map +1 -0
- package/dist/cli/validation/dynamic-checks.js +109 -0
- package/dist/cli/validation/dynamic-checks.js.map +1 -0
- package/dist/cli/validation/model.d.ts +16 -0
- package/dist/cli/validation/model.d.ts.map +1 -0
- package/dist/cli/validation/model.js +59 -0
- package/dist/cli/validation/model.js.map +1 -0
- package/dist/cli/validation/reporter.d.ts +18 -0
- package/dist/cli/validation/reporter.d.ts.map +1 -0
- package/dist/cli/validation/reporter.js +167 -0
- package/dist/cli/validation/reporter.js.map +1 -0
- package/dist/cli/validation/spiral-checks.d.ts +12 -0
- package/dist/cli/validation/spiral-checks.d.ts.map +1 -0
- package/dist/cli/validation/spiral-checks.js +167 -0
- package/dist/cli/validation/spiral-checks.js.map +1 -0
- package/dist/cli/validation/static-checks.d.ts +26 -0
- package/dist/cli/validation/static-checks.d.ts.map +1 -0
- package/dist/cli/validation/static-checks.js +492 -0
- package/dist/cli/validation/static-checks.js.map +1 -0
- package/dist/cli/validation/stats.d.ts +29 -0
- package/dist/cli/validation/stats.d.ts.map +1 -0
- package/dist/cli/validation/stats.js +137 -0
- package/dist/cli/validation/stats.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +43 -0
- package/dist/server.js.map +1 -0
- package/dist/spiral/cloud/content-extractor.d.ts +27 -0
- package/dist/spiral/cloud/content-extractor.d.ts.map +1 -0
- package/dist/spiral/cloud/content-extractor.js +175 -0
- package/dist/spiral/cloud/content-extractor.js.map +1 -0
- package/dist/spiral/cloud/search-provider.d.ts +22 -0
- package/dist/spiral/cloud/search-provider.d.ts.map +1 -0
- package/dist/spiral/cloud/search-provider.js +212 -0
- package/dist/spiral/cloud/search-provider.js.map +1 -0
- package/dist/spiral/cloud/topic-detector.d.ts +25 -0
- package/dist/spiral/cloud/topic-detector.d.ts.map +1 -0
- package/dist/spiral/cloud/topic-detector.js +196 -0
- package/dist/spiral/cloud/topic-detector.js.map +1 -0
- package/dist/spiral/cloud/web-enricher.d.ts +58 -0
- package/dist/spiral/cloud/web-enricher.d.ts.map +1 -0
- package/dist/spiral/cloud/web-enricher.js +170 -0
- package/dist/spiral/cloud/web-enricher.js.map +1 -0
- package/dist/spiral/compression.d.ts +54 -0
- package/dist/spiral/compression.d.ts.map +1 -0
- package/dist/spiral/compression.js +175 -0
- package/dist/spiral/compression.js.map +1 -0
- package/dist/spiral/embeddings.d.ts +24 -0
- package/dist/spiral/embeddings.d.ts.map +1 -0
- package/dist/spiral/embeddings.js +69 -0
- package/dist/spiral/embeddings.js.map +1 -0
- package/dist/spiral/engine.d.ts +95 -0
- package/dist/spiral/engine.d.ts.map +1 -0
- package/dist/spiral/engine.js +271 -0
- package/dist/spiral/engine.js.map +1 -0
- package/dist/spiral/injection.d.ts +29 -0
- package/dist/spiral/injection.d.ts.map +1 -0
- package/dist/spiral/injection.js +164 -0
- package/dist/spiral/injection.js.map +1 -0
- package/dist/spiral/relevance.d.ts +37 -0
- package/dist/spiral/relevance.d.ts.map +1 -0
- package/dist/spiral/relevance.js +75 -0
- package/dist/spiral/relevance.js.map +1 -0
- package/dist/storage/database.d.ts +11 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +141 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/edges.d.ts +25 -0
- package/dist/storage/edges.d.ts.map +1 -0
- package/dist/storage/edges.js +69 -0
- package/dist/storage/edges.js.map +1 -0
- package/dist/storage/nodes.d.ts +45 -0
- package/dist/storage/nodes.d.ts.map +1 -0
- package/dist/storage/nodes.js +124 -0
- package/dist/storage/nodes.js.map +1 -0
- package/dist/storage/vectors.d.ts +25 -0
- package/dist/storage/vectors.d.ts.map +1 -0
- package/dist/storage/vectors.js +110 -0
- package/dist/storage/vectors.js.map +1 -0
- package/dist/tools/spiral-compact.d.ts +14 -0
- package/dist/tools/spiral-compact.d.ts.map +1 -0
- package/dist/tools/spiral-compact.js +14 -0
- package/dist/tools/spiral-compact.js.map +1 -0
- package/dist/tools/spiral-query.d.ts +18 -0
- package/dist/tools/spiral-query.d.ts.map +1 -0
- package/dist/tools/spiral-query.js +16 -0
- package/dist/tools/spiral-query.js.map +1 -0
- package/dist/tools/spiral-relate.d.ts +21 -0
- package/dist/tools/spiral-relate.d.ts.map +1 -0
- package/dist/tools/spiral-relate.js +21 -0
- package/dist/tools/spiral-relate.js.map +1 -0
- package/dist/tools/spiral-status.d.ts +8 -0
- package/dist/tools/spiral-status.d.ts.map +1 -0
- package/dist/tools/spiral-status.js +10 -0
- package/dist/tools/spiral-status.js.map +1 -0
- package/dist/tools/spiral-store.d.ts +41 -0
- package/dist/tools/spiral-store.d.ts.map +1 -0
- package/dist/tools/spiral-store.js +22 -0
- package/dist/tools/spiral-store.js.map +1 -0
- package/dist/types.d.ts +92 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/config.d.ts +14 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +44 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +40 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/tokens.d.ts +21 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +33 -0
- package/dist/utils/tokens.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Serializers
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
export function serializeSession(session) {
|
|
5
|
+
const recentOutput = session.output.slice(-20);
|
|
6
|
+
return {
|
|
7
|
+
id: session.id,
|
|
8
|
+
name: session.name,
|
|
9
|
+
icon: session.icon,
|
|
10
|
+
status: session.status,
|
|
11
|
+
startTime: session.startTime,
|
|
12
|
+
endTime: session.endTime,
|
|
13
|
+
elapsed: session.elapsed,
|
|
14
|
+
outputLineCount: session.output.length,
|
|
15
|
+
recentOutput,
|
|
16
|
+
result: session.result
|
|
17
|
+
? {
|
|
18
|
+
text: session.result.text.slice(0, 2000),
|
|
19
|
+
stepsCount: session.result.steps.length,
|
|
20
|
+
errorsCount: session.result.errors.length,
|
|
21
|
+
}
|
|
22
|
+
: null,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
let instanceStartTime = Date.now();
|
|
26
|
+
export function buildInstanceMeta(projectName, projectPath, model, provider, version, instanceId) {
|
|
27
|
+
return {
|
|
28
|
+
instanceId,
|
|
29
|
+
projectName,
|
|
30
|
+
projectPath,
|
|
31
|
+
model,
|
|
32
|
+
provider,
|
|
33
|
+
uptime: Math.floor((Date.now() - instanceStartTime) / 1000),
|
|
34
|
+
version,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** Reset instance start time (called once on CLI startup) */
|
|
38
|
+
export function resetInstanceStartTime() {
|
|
39
|
+
instanceStartTime = Date.now();
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=control-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-protocol.js","sourceRoot":"","sources":["../../../src/cli/brain/control-protocol.ts"],"names":[],"mappings":"AAiHA,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/C,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;QACtC,YAAY;QACZ,MAAM,EAAE,OAAO,CAAC,MAAM;YACpB,CAAC,CAAC;gBACE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;gBACxC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;gBACvC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;aAC1C;YACH,CAAC,CAAC,IAAI;KACT,CAAC;AACJ,CAAC;AAED,IAAI,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAEnC,MAAM,UAAU,iBAAiB,CAC/B,WAAmB,EACnB,WAAmB,EACnB,KAAa,EACb,QAAgB,EAChB,OAAe,EACf,UAAkB;IAElB,OAAO;QACL,UAAU;QACV,WAAW;QACX,WAAW;QACX,KAAK;QACL,QAAQ;QACR,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,iBAAiB,CAAC,GAAG,IAAI,CAAC;QAC3D,OAAO;KACR,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,sBAAsB;IACpC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { SpiralEngine } from '../../spiral/engine.js';
|
|
2
|
+
import type { BrainScope } from '../../utils/config.js';
|
|
3
|
+
export interface BrainExport {
|
|
4
|
+
meta: {
|
|
5
|
+
totalNodes: number;
|
|
6
|
+
totalEdges: number;
|
|
7
|
+
webKnowledgeCount: number;
|
|
8
|
+
exportDate: string;
|
|
9
|
+
projectName: string;
|
|
10
|
+
brainScope: BrainScope;
|
|
11
|
+
};
|
|
12
|
+
nodes: Array<{
|
|
13
|
+
id: string;
|
|
14
|
+
label: string;
|
|
15
|
+
content: string;
|
|
16
|
+
type: string;
|
|
17
|
+
level: 1 | 2 | 3 | 4 | 5 | 6;
|
|
18
|
+
relevanceScore: number;
|
|
19
|
+
createdAt: string;
|
|
20
|
+
lastAccessed: string;
|
|
21
|
+
/** Web knowledge source URL (only for L6 nodes) */
|
|
22
|
+
webSource?: string;
|
|
23
|
+
/** Web topic that was researched (only for L6 nodes) */
|
|
24
|
+
webTopic?: string;
|
|
25
|
+
}>;
|
|
26
|
+
edges: Array<{
|
|
27
|
+
source: string;
|
|
28
|
+
target: string;
|
|
29
|
+
type: string;
|
|
30
|
+
weight: number;
|
|
31
|
+
}>;
|
|
32
|
+
}
|
|
33
|
+
export declare function exportBrainData(engine: SpiralEngine, projectName?: string, brainScope?: BrainScope): BrainExport;
|
|
34
|
+
//# sourceMappingURL=exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../../src/cli/brain/exporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE;QACJ,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,UAAU,CAAC;KACxB,CAAC;IACF,KAAK,EAAE,KAAK,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,mDAAmD;QACnD,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,wDAAwD;QACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,KAAK,EAAE,KAAK,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,YAAY,EACpB,WAAW,GAAE,MAA4B,EACzC,UAAU,GAAE,UAAqB,GAChC,WAAW,CA0Cb"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export function exportBrainData(engine, projectName = 'HelixMind Project', brainScope = 'global') {
|
|
2
|
+
const data = engine.exportForVisualization();
|
|
3
|
+
// Mark web knowledge nodes as L6 for visualization
|
|
4
|
+
let webKnowledgeCount = 0;
|
|
5
|
+
const nodes = data.nodes.map(node => {
|
|
6
|
+
const tags = node.type === 'pattern'
|
|
7
|
+
? [] // we check content instead
|
|
8
|
+
: [];
|
|
9
|
+
const isWebKnowledge = node.content.includes('[Web Knowledge:');
|
|
10
|
+
if (isWebKnowledge) {
|
|
11
|
+
webKnowledgeCount++;
|
|
12
|
+
// Extract source URL and topic from content
|
|
13
|
+
const sourceMatch = node.content.match(/Source:\s*(\S+)/);
|
|
14
|
+
const topicMatch = node.content.match(/\[Web Knowledge:\s*([^\]]+)\]/);
|
|
15
|
+
return {
|
|
16
|
+
...node,
|
|
17
|
+
level: 6,
|
|
18
|
+
webSource: sourceMatch?.[1],
|
|
19
|
+
webTopic: topicMatch?.[1],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return node;
|
|
23
|
+
});
|
|
24
|
+
return {
|
|
25
|
+
meta: {
|
|
26
|
+
totalNodes: data.nodes.length,
|
|
27
|
+
totalEdges: data.edges.length,
|
|
28
|
+
webKnowledgeCount,
|
|
29
|
+
exportDate: new Date().toISOString(),
|
|
30
|
+
projectName,
|
|
31
|
+
brainScope,
|
|
32
|
+
},
|
|
33
|
+
nodes,
|
|
34
|
+
edges: data.edges,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../../src/cli/brain/exporter.ts"],"names":[],"mappings":"AAkCA,MAAM,UAAU,eAAe,CAC7B,MAAoB,EACpB,cAAsB,mBAAmB,EACzC,aAAyB,QAAQ;IAEjC,MAAM,IAAI,GAAG,MAAM,CAAC,sBAAsB,EAAE,CAAC;IAE7C,mDAAmD;IACnD,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAClC,MAAM,IAAI,GAAc,IAAY,CAAC,IAAI,KAAK,SAAS;YACrD,CAAC,CAAC,EAAE,CAAC,2BAA2B;YAChC,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QAEhE,IAAI,cAAc,EAAE,CAAC;YACnB,iBAAiB,EAAE,CAAC;YAEpB,4CAA4C;YAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAEvE,OAAO;gBACL,GAAG,IAAI;gBACP,KAAK,EAAE,CAAU;gBACjB,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;gBAC3B,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;aAC1B,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE;YACJ,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YAC7B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YAC7B,iBAAiB;YACjB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,WAAW;YACX,UAAU;SACX;QACD,KAAK;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { BrainExport } from './exporter.js';
|
|
2
|
+
import type { BrainScope } from '../../utils/config.js';
|
|
3
|
+
import type { ControlHandlers, InstanceMeta, SessionInfo } from './control-protocol.js';
|
|
4
|
+
/** Generate a static HTML file (fallback / export) */
|
|
5
|
+
export declare function generateBrainFile(data: BrainExport): string;
|
|
6
|
+
/**
|
|
7
|
+
* Start a live brain server that auto-refreshes when spiral data changes.
|
|
8
|
+
* Returns the URL to open in browser. Subsequent calls reuse the same server.
|
|
9
|
+
*/
|
|
10
|
+
export declare function startLiveBrain(engine: any, projectName?: string, brainScope?: BrainScope): Promise<string>;
|
|
11
|
+
/** Stop the live brain server */
|
|
12
|
+
export declare function stopLiveBrain(): void;
|
|
13
|
+
/**
|
|
14
|
+
* Push a web knowledge event to the brain visualization.
|
|
15
|
+
* Shows a live popup animation in the 3D view when new web knowledge arrives.
|
|
16
|
+
*/
|
|
17
|
+
export declare function pushWebKnowledge(topic: string, summary: string, source: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Push an agent finding to the brain visualization.
|
|
20
|
+
* Shows a live popup for security findings, auto-fix results, etc.
|
|
21
|
+
*/
|
|
22
|
+
export declare function pushAgentFinding(sessionName: string, finding: string, severity: 'critical' | 'high' | 'medium' | 'low' | 'info', file?: string): void;
|
|
23
|
+
/** Check if brain server is running */
|
|
24
|
+
export declare function isBrainServerRunning(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Register a handler for voice input from the brain browser.
|
|
27
|
+
* When the user speaks in the browser, the transcribed text is sent here.
|
|
28
|
+
*/
|
|
29
|
+
export declare function onBrainVoiceInput(handler: (text: string) => void): void;
|
|
30
|
+
/**
|
|
31
|
+
* Register a handler for scope switch from the brain browser.
|
|
32
|
+
* When the user clicks Local/Global in the browser header.
|
|
33
|
+
*/
|
|
34
|
+
export declare function onBrainScopeSwitch(handler: (scope: 'project' | 'global') => void): void;
|
|
35
|
+
/**
|
|
36
|
+
* Push a scope change confirmation to the browser.
|
|
37
|
+
*/
|
|
38
|
+
export declare function pushScopeChange(scope: 'project' | 'global'): void;
|
|
39
|
+
/**
|
|
40
|
+
* Register a handler for model activation from the brain browser.
|
|
41
|
+
* When the user clicks "Activate" on a model in the browser.
|
|
42
|
+
*/
|
|
43
|
+
export declare function onBrainModelActivate(handler: (model: string) => void): void;
|
|
44
|
+
/**
|
|
45
|
+
* Push a model activated confirmation to the browser.
|
|
46
|
+
*/
|
|
47
|
+
export declare function pushModelActivated(model: string): void;
|
|
48
|
+
/** Register control handlers on the active brain server */
|
|
49
|
+
export declare function registerControlHandlers(handlers: ControlHandlers): void;
|
|
50
|
+
/** Set instance metadata on the brain server (for discovery) */
|
|
51
|
+
export declare function setInstanceMeta(meta: InstanceMeta): void;
|
|
52
|
+
/** Get the brain server connection token (for local auth) */
|
|
53
|
+
export declare function getBrainToken(): string | null;
|
|
54
|
+
/** Push a session-updated event to control clients */
|
|
55
|
+
export declare function pushSessionUpdate(session: SessionInfo): void;
|
|
56
|
+
/** Push a session-created event to control clients */
|
|
57
|
+
export declare function pushSessionCreated(session: SessionInfo): void;
|
|
58
|
+
/** Push a session-removed event to control clients */
|
|
59
|
+
export declare function pushSessionRemoved(sessionId: string): void;
|
|
60
|
+
/** Push an output line event to subscribed control clients */
|
|
61
|
+
export declare function pushOutputLine(sessionId: string, line: string, lineIndex: number): void;
|
|
62
|
+
/**
|
|
63
|
+
* Start the relay client (outbound connection to Web Server).
|
|
64
|
+
* Only connects if relay.url + relay.apiKey are configured.
|
|
65
|
+
*/
|
|
66
|
+
export declare function startRelayClient(relayUrl: string, apiKey: string, handlers: ControlHandlers, getInstanceMeta: () => InstanceMeta): Promise<void>;
|
|
67
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/cli/brain/generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAExF,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAK3D;AAcD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,GAAG,EACX,WAAW,GAAE,MAA4B,EACzC,UAAU,GAAE,UAAqB,GAChC,OAAO,CAAC,MAAM,CAAC,CA2CjB;AAED,iCAAiC;AACjC,wBAAgB,aAAa,IAAI,IAAI,CAiBpC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CASrF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,EACzD,IAAI,CAAC,EAAE,MAAM,GACZ,IAAI,CAUN;AAED,uCAAuC;AACvC,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAKvE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,KAAK,IAAI,GAAG,IAAI,CAKvF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,IAAI,CAGjE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAK3E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAGtD;AAMD,2DAA2D;AAC3D,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAIvE;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAIxD;AAED,6DAA6D;AAC7D,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAE7C;AAED,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAO5D;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAO7D;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAO1D;AAED,8DAA8D;AAC9D,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CASvF;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EACzB,eAAe,EAAE,MAAM,YAAY,GAClC,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { generateBrainHTML } from './template.js';
|
|
5
|
+
import { startBrainServer } from './server.js';
|
|
6
|
+
/** Generate a static HTML file (fallback / export) */
|
|
7
|
+
export function generateBrainFile(data) {
|
|
8
|
+
const html = generateBrainHTML(data);
|
|
9
|
+
const outputPath = join(tmpdir(), 'helixmind-brain.html');
|
|
10
|
+
writeFileSync(outputPath, html, 'utf-8');
|
|
11
|
+
return outputPath;
|
|
12
|
+
}
|
|
13
|
+
/** Active brain server instance (singleton per process) */
|
|
14
|
+
let activeBrainServer = null;
|
|
15
|
+
let updateInterval = null;
|
|
16
|
+
/** Pending handlers to register when server starts */
|
|
17
|
+
let pendingVoiceHandler = null;
|
|
18
|
+
let pendingScopeSwitchHandler = null;
|
|
19
|
+
let pendingModelActivateHandler = null;
|
|
20
|
+
/** Relay client instance */
|
|
21
|
+
let activeRelayClient = null;
|
|
22
|
+
/**
|
|
23
|
+
* Start a live brain server that auto-refreshes when spiral data changes.
|
|
24
|
+
* Returns the URL to open in browser. Subsequent calls reuse the same server.
|
|
25
|
+
*/
|
|
26
|
+
export async function startLiveBrain(engine, projectName = 'HelixMind Project', brainScope = 'global') {
|
|
27
|
+
const { exportBrainData } = await import('./exporter.js');
|
|
28
|
+
const initialData = exportBrainData(engine, projectName, brainScope);
|
|
29
|
+
if (activeBrainServer) {
|
|
30
|
+
// Server already running — just push fresh data
|
|
31
|
+
activeBrainServer.pushUpdate(initialData);
|
|
32
|
+
return activeBrainServer.url;
|
|
33
|
+
}
|
|
34
|
+
// Start new server
|
|
35
|
+
activeBrainServer = await startBrainServer(initialData);
|
|
36
|
+
// Register any pending handlers
|
|
37
|
+
if (pendingVoiceHandler) {
|
|
38
|
+
activeBrainServer.onVoiceInput(pendingVoiceHandler);
|
|
39
|
+
}
|
|
40
|
+
if (pendingScopeSwitchHandler) {
|
|
41
|
+
activeBrainServer.onScopeSwitch(pendingScopeSwitchHandler);
|
|
42
|
+
}
|
|
43
|
+
if (pendingModelActivateHandler) {
|
|
44
|
+
activeBrainServer.onModelActivate(pendingModelActivateHandler);
|
|
45
|
+
}
|
|
46
|
+
// Poll spiral engine for changes every 5 seconds
|
|
47
|
+
let lastNodeCount = initialData.meta.totalNodes;
|
|
48
|
+
let lastEdgeCount = initialData.meta.totalEdges;
|
|
49
|
+
updateInterval = setInterval(() => {
|
|
50
|
+
try {
|
|
51
|
+
const freshData = exportBrainData(engine, projectName, brainScope);
|
|
52
|
+
if (freshData.meta.totalNodes !== lastNodeCount ||
|
|
53
|
+
freshData.meta.totalEdges !== lastEdgeCount) {
|
|
54
|
+
lastNodeCount = freshData.meta.totalNodes;
|
|
55
|
+
lastEdgeCount = freshData.meta.totalEdges;
|
|
56
|
+
activeBrainServer?.pushUpdate(freshData);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Engine might be closed
|
|
61
|
+
}
|
|
62
|
+
}, 5000);
|
|
63
|
+
return activeBrainServer.url;
|
|
64
|
+
}
|
|
65
|
+
/** Stop the live brain server */
|
|
66
|
+
export function stopLiveBrain() {
|
|
67
|
+
if (updateInterval) {
|
|
68
|
+
clearInterval(updateInterval);
|
|
69
|
+
updateInterval = null;
|
|
70
|
+
}
|
|
71
|
+
if (activeRelayClient) {
|
|
72
|
+
activeRelayClient.close();
|
|
73
|
+
activeRelayClient = null;
|
|
74
|
+
}
|
|
75
|
+
if (activeBrainServer) {
|
|
76
|
+
activeBrainServer.close();
|
|
77
|
+
activeBrainServer = null;
|
|
78
|
+
}
|
|
79
|
+
// Clear pending handlers when server stops
|
|
80
|
+
pendingVoiceHandler = null;
|
|
81
|
+
pendingScopeSwitchHandler = null;
|
|
82
|
+
pendingModelActivateHandler = null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Push a web knowledge event to the brain visualization.
|
|
86
|
+
* Shows a live popup animation in the 3D view when new web knowledge arrives.
|
|
87
|
+
*/
|
|
88
|
+
export function pushWebKnowledge(topic, summary, source) {
|
|
89
|
+
if (!activeBrainServer)
|
|
90
|
+
return;
|
|
91
|
+
activeBrainServer.pushEvent({
|
|
92
|
+
type: 'web_knowledge',
|
|
93
|
+
topic,
|
|
94
|
+
summary,
|
|
95
|
+
source,
|
|
96
|
+
timestamp: Date.now(),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Push an agent finding to the brain visualization.
|
|
101
|
+
* Shows a live popup for security findings, auto-fix results, etc.
|
|
102
|
+
*/
|
|
103
|
+
export function pushAgentFinding(sessionName, finding, severity, file) {
|
|
104
|
+
if (!activeBrainServer)
|
|
105
|
+
return;
|
|
106
|
+
activeBrainServer.pushEvent({
|
|
107
|
+
type: 'agent_finding',
|
|
108
|
+
sessionName,
|
|
109
|
+
finding,
|
|
110
|
+
severity,
|
|
111
|
+
file: file || '',
|
|
112
|
+
timestamp: Date.now(),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/** Check if brain server is running */
|
|
116
|
+
export function isBrainServerRunning() {
|
|
117
|
+
return activeBrainServer !== null;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Register a handler for voice input from the brain browser.
|
|
121
|
+
* When the user speaks in the browser, the transcribed text is sent here.
|
|
122
|
+
*/
|
|
123
|
+
export function onBrainVoiceInput(handler) {
|
|
124
|
+
if (activeBrainServer) {
|
|
125
|
+
activeBrainServer.onVoiceInput(handler);
|
|
126
|
+
}
|
|
127
|
+
pendingVoiceHandler = handler;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Register a handler for scope switch from the brain browser.
|
|
131
|
+
* When the user clicks Local/Global in the browser header.
|
|
132
|
+
*/
|
|
133
|
+
export function onBrainScopeSwitch(handler) {
|
|
134
|
+
if (activeBrainServer) {
|
|
135
|
+
activeBrainServer.onScopeSwitch(handler);
|
|
136
|
+
}
|
|
137
|
+
pendingScopeSwitchHandler = handler;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Push a scope change confirmation to the browser.
|
|
141
|
+
*/
|
|
142
|
+
export function pushScopeChange(scope) {
|
|
143
|
+
if (!activeBrainServer)
|
|
144
|
+
return;
|
|
145
|
+
activeBrainServer.pushEvent({ type: 'scope_changed', scope, timestamp: Date.now() });
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Register a handler for model activation from the brain browser.
|
|
149
|
+
* When the user clicks "Activate" on a model in the browser.
|
|
150
|
+
*/
|
|
151
|
+
export function onBrainModelActivate(handler) {
|
|
152
|
+
if (activeBrainServer) {
|
|
153
|
+
activeBrainServer.onModelActivate(handler);
|
|
154
|
+
}
|
|
155
|
+
pendingModelActivateHandler = handler;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Push a model activated confirmation to the browser.
|
|
159
|
+
*/
|
|
160
|
+
export function pushModelActivated(model) {
|
|
161
|
+
if (!activeBrainServer)
|
|
162
|
+
return;
|
|
163
|
+
activeBrainServer.pushEvent({ type: 'model_activated', model, timestamp: Date.now() });
|
|
164
|
+
}
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
// Control Protocol — CLI ↔ Web
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
/** Register control handlers on the active brain server */
|
|
169
|
+
export function registerControlHandlers(handlers) {
|
|
170
|
+
if (activeBrainServer) {
|
|
171
|
+
activeBrainServer.registerControlHandlers(handlers);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** Set instance metadata on the brain server (for discovery) */
|
|
175
|
+
export function setInstanceMeta(meta) {
|
|
176
|
+
if (activeBrainServer) {
|
|
177
|
+
activeBrainServer.setInstanceMeta(meta);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/** Get the brain server connection token (for local auth) */
|
|
181
|
+
export function getBrainToken() {
|
|
182
|
+
return activeBrainServer?.connectionToken ?? null;
|
|
183
|
+
}
|
|
184
|
+
/** Push a session-updated event to control clients */
|
|
185
|
+
export function pushSessionUpdate(session) {
|
|
186
|
+
if (!activeBrainServer)
|
|
187
|
+
return;
|
|
188
|
+
activeBrainServer.pushControlEvent({
|
|
189
|
+
type: 'session_updated',
|
|
190
|
+
session,
|
|
191
|
+
timestamp: Date.now(),
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/** Push a session-created event to control clients */
|
|
195
|
+
export function pushSessionCreated(session) {
|
|
196
|
+
if (!activeBrainServer)
|
|
197
|
+
return;
|
|
198
|
+
activeBrainServer.pushControlEvent({
|
|
199
|
+
type: 'session_created',
|
|
200
|
+
session,
|
|
201
|
+
timestamp: Date.now(),
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
/** Push a session-removed event to control clients */
|
|
205
|
+
export function pushSessionRemoved(sessionId) {
|
|
206
|
+
if (!activeBrainServer)
|
|
207
|
+
return;
|
|
208
|
+
activeBrainServer.pushControlEvent({
|
|
209
|
+
type: 'session_removed',
|
|
210
|
+
sessionId,
|
|
211
|
+
timestamp: Date.now(),
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
/** Push an output line event to subscribed control clients */
|
|
215
|
+
export function pushOutputLine(sessionId, line, lineIndex) {
|
|
216
|
+
if (!activeBrainServer)
|
|
217
|
+
return;
|
|
218
|
+
activeBrainServer.pushControlEvent({
|
|
219
|
+
type: 'output_line',
|
|
220
|
+
sessionId,
|
|
221
|
+
line,
|
|
222
|
+
lineIndex,
|
|
223
|
+
timestamp: Date.now(),
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Start the relay client (outbound connection to Web Server).
|
|
228
|
+
* Only connects if relay.url + relay.apiKey are configured.
|
|
229
|
+
*/
|
|
230
|
+
export async function startRelayClient(relayUrl, apiKey, handlers, getInstanceMeta) {
|
|
231
|
+
try {
|
|
232
|
+
const { createRelayClient } = await import('./relay-client.js');
|
|
233
|
+
activeRelayClient = createRelayClient(relayUrl, apiKey, handlers, getInstanceMeta, activeBrainServer);
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
// Relay client is optional
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/cli/brain/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ControlHandlers, InstanceMeta } from './control-protocol.js';
|
|
2
|
+
import type { BrainServer } from './server.js';
|
|
3
|
+
interface RelayClient {
|
|
4
|
+
close(): void;
|
|
5
|
+
}
|
|
6
|
+
export declare function createRelayClient(relayUrl: string, apiKey: string, handlers: ControlHandlers, getInstanceMeta: () => InstanceMeta, brainServer: BrainServer | null): RelayClient;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=relay-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-client.d.ts","sourceRoot":"","sources":["../../../src/cli/brain/relay-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAkB,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,UAAU,WAAW;IACnB,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EACzB,eAAe,EAAE,MAAM,YAAY,EACnC,WAAW,EAAE,WAAW,GAAG,IAAI,GAC9B,WAAW,CAiLb"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Relay Client — outbound WebSocket connection from CLI to the Web Server relay.
|
|
3
|
+
* Forwards brain events and handles control messages from remote browsers.
|
|
4
|
+
*/
|
|
5
|
+
import WebSocket from 'ws';
|
|
6
|
+
export function createRelayClient(relayUrl, apiKey, handlers, getInstanceMeta, brainServer) {
|
|
7
|
+
let ws = null;
|
|
8
|
+
let reconnectTimer = null;
|
|
9
|
+
let pingTimer = null;
|
|
10
|
+
let backoff = 1000;
|
|
11
|
+
let closed = false;
|
|
12
|
+
let authenticated = false;
|
|
13
|
+
function connect() {
|
|
14
|
+
if (closed)
|
|
15
|
+
return;
|
|
16
|
+
// Normalize URL: ensure it ends with /api/relay/cli
|
|
17
|
+
let url = relayUrl.replace(/\/+$/, '');
|
|
18
|
+
if (!url.includes('/api/relay')) {
|
|
19
|
+
url += '/api/relay/cli';
|
|
20
|
+
}
|
|
21
|
+
// Convert http(s) to ws(s)
|
|
22
|
+
url = url.replace(/^http/, 'ws');
|
|
23
|
+
try {
|
|
24
|
+
ws = new WebSocket(url);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
scheduleReconnect();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
ws.on('open', () => {
|
|
31
|
+
backoff = 1000;
|
|
32
|
+
// Send auth
|
|
33
|
+
ws.send(JSON.stringify({
|
|
34
|
+
type: 'cli_auth',
|
|
35
|
+
apiKey,
|
|
36
|
+
timestamp: Date.now(),
|
|
37
|
+
}));
|
|
38
|
+
});
|
|
39
|
+
ws.on('message', (raw) => {
|
|
40
|
+
try {
|
|
41
|
+
const msg = JSON.parse(String(raw));
|
|
42
|
+
if (msg.type === 'cli_auth_ok') {
|
|
43
|
+
authenticated = true;
|
|
44
|
+
// Send instance meta
|
|
45
|
+
const meta = getInstanceMeta();
|
|
46
|
+
ws.send(JSON.stringify({
|
|
47
|
+
type: 'instance_meta',
|
|
48
|
+
instance: meta,
|
|
49
|
+
timestamp: Date.now(),
|
|
50
|
+
}));
|
|
51
|
+
// Start heartbeat
|
|
52
|
+
pingTimer = setInterval(() => {
|
|
53
|
+
if (ws?.readyState === WebSocket.OPEN) {
|
|
54
|
+
ws.send(JSON.stringify({ type: 'ping', timestamp: Date.now() }));
|
|
55
|
+
}
|
|
56
|
+
}, 30000);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (msg.type === 'cli_auth_fail') {
|
|
60
|
+
// Don't reconnect on auth failure
|
|
61
|
+
closed = true;
|
|
62
|
+
ws?.close();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// Handle control messages from relay (forwarded from browser)
|
|
66
|
+
if (authenticated && isControlRequest(msg.type)) {
|
|
67
|
+
handleControlMessage(msg);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch { /* ignore malformed */ }
|
|
71
|
+
});
|
|
72
|
+
ws.on('close', () => {
|
|
73
|
+
authenticated = false;
|
|
74
|
+
if (pingTimer) {
|
|
75
|
+
clearInterval(pingTimer);
|
|
76
|
+
pingTimer = null;
|
|
77
|
+
}
|
|
78
|
+
scheduleReconnect();
|
|
79
|
+
});
|
|
80
|
+
ws.on('error', () => {
|
|
81
|
+
// Error triggers close event, which handles reconnect
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
function handleControlMessage(msg) {
|
|
85
|
+
const requestId = msg.requestId;
|
|
86
|
+
switch (msg.type) {
|
|
87
|
+
case 'ping':
|
|
88
|
+
sendRelay({ type: 'pong', requestId, timestamp: Date.now() });
|
|
89
|
+
break;
|
|
90
|
+
case 'list_sessions': {
|
|
91
|
+
const sessions = handlers.listSessions();
|
|
92
|
+
sendRelay({ type: 'sessions_list', sessions, requestId, timestamp: Date.now() });
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
case 'start_auto': {
|
|
96
|
+
const sessionId = handlers.startAuto(msg.goal);
|
|
97
|
+
sendRelay({ type: 'auto_started', sessionId, requestId, timestamp: Date.now() });
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
case 'start_security': {
|
|
101
|
+
const sessionId = handlers.startSecurity();
|
|
102
|
+
sendRelay({ type: 'security_started', sessionId, requestId, timestamp: Date.now() });
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
case 'abort_session': {
|
|
106
|
+
const success = handlers.abortSession(msg.sessionId);
|
|
107
|
+
sendRelay({ type: 'session_aborted', sessionId: msg.sessionId, success, requestId, timestamp: Date.now() });
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case 'send_chat': {
|
|
111
|
+
handlers.sendChat(msg.text);
|
|
112
|
+
sendRelay({ type: 'chat_received', requestId, timestamp: Date.now() });
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
case 'get_findings': {
|
|
116
|
+
const findings = handlers.getFindings();
|
|
117
|
+
sendRelay({ type: 'findings_list', findings, requestId, timestamp: Date.now() });
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function sendRelay(msg) {
|
|
123
|
+
if (ws?.readyState === WebSocket.OPEN) {
|
|
124
|
+
ws.send(JSON.stringify(msg));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/** Forward brain events to the relay */
|
|
128
|
+
function forwardEvent(event) {
|
|
129
|
+
sendRelay(event);
|
|
130
|
+
}
|
|
131
|
+
function scheduleReconnect() {
|
|
132
|
+
if (closed)
|
|
133
|
+
return;
|
|
134
|
+
reconnectTimer = setTimeout(() => {
|
|
135
|
+
backoff = Math.min(backoff * 2, 30000);
|
|
136
|
+
connect();
|
|
137
|
+
}, backoff);
|
|
138
|
+
}
|
|
139
|
+
// Start connection
|
|
140
|
+
connect();
|
|
141
|
+
// Hook into brain server push events if available
|
|
142
|
+
if (brainServer) {
|
|
143
|
+
const origPushEvent = brainServer.pushEvent.bind(brainServer);
|
|
144
|
+
const origPushControlEvent = brainServer.pushControlEvent.bind(brainServer);
|
|
145
|
+
// Monkey-patch to also forward to relay
|
|
146
|
+
brainServer.pushEvent = (event) => {
|
|
147
|
+
origPushEvent(event);
|
|
148
|
+
forwardEvent(event);
|
|
149
|
+
};
|
|
150
|
+
brainServer.pushControlEvent = (event) => {
|
|
151
|
+
origPushControlEvent(event);
|
|
152
|
+
forwardEvent(event);
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
close() {
|
|
157
|
+
closed = true;
|
|
158
|
+
if (reconnectTimer)
|
|
159
|
+
clearTimeout(reconnectTimer);
|
|
160
|
+
if (pingTimer)
|
|
161
|
+
clearInterval(pingTimer);
|
|
162
|
+
ws?.close();
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function isControlRequest(type) {
|
|
167
|
+
return [
|
|
168
|
+
'list_sessions', 'start_auto', 'start_security',
|
|
169
|
+
'abort_session', 'subscribe_output', 'unsubscribe_output',
|
|
170
|
+
'send_chat', 'get_findings', 'ping',
|
|
171
|
+
].includes(type);
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=relay-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../../../src/cli/brain/relay-client.ts"],"names":[],"mappings":"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"}
|