helixmind 0.5.4
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/LICENSE +73 -0
- package/README.md +323 -0
- package/dist/cli/agent/autonomous.d.ts +24 -0
- package/dist/cli/agent/autonomous.d.ts.map +1 -0
- package/dist/cli/agent/autonomous.js +194 -0
- package/dist/cli/agent/autonomous.js.map +1 -0
- package/dist/cli/agent/loop.d.ts +87 -0
- package/dist/cli/agent/loop.d.ts.map +1 -0
- package/dist/cli/agent/loop.js +492 -0
- package/dist/cli/agent/loop.js.map +1 -0
- package/dist/cli/agent/monitor/alerter.d.ts +29 -0
- package/dist/cli/agent/monitor/alerter.d.ts.map +1 -0
- package/dist/cli/agent/monitor/alerter.js +80 -0
- package/dist/cli/agent/monitor/alerter.js.map +1 -0
- package/dist/cli/agent/monitor/baseline.d.ts +14 -0
- package/dist/cli/agent/monitor/baseline.d.ts.map +1 -0
- package/dist/cli/agent/monitor/baseline.js +157 -0
- package/dist/cli/agent/monitor/baseline.js.map +1 -0
- package/dist/cli/agent/monitor/prompts.d.ts +9 -0
- package/dist/cli/agent/monitor/prompts.d.ts.map +1 -0
- package/dist/cli/agent/monitor/prompts.js +103 -0
- package/dist/cli/agent/monitor/prompts.js.map +1 -0
- package/dist/cli/agent/monitor/responder.d.ts +12 -0
- package/dist/cli/agent/monitor/responder.d.ts.map +1 -0
- package/dist/cli/agent/monitor/responder.js +59 -0
- package/dist/cli/agent/monitor/responder.js.map +1 -0
- package/dist/cli/agent/monitor/scanner.d.ts +18 -0
- package/dist/cli/agent/monitor/scanner.d.ts.map +1 -0
- package/dist/cli/agent/monitor/scanner.js +81 -0
- package/dist/cli/agent/monitor/scanner.js.map +1 -0
- package/dist/cli/agent/monitor/types.d.ts +119 -0
- package/dist/cli/agent/monitor/types.d.ts.map +1 -0
- package/dist/cli/agent/monitor/types.js +5 -0
- package/dist/cli/agent/monitor/types.js.map +1 -0
- package/dist/cli/agent/monitor/watcher.d.ts +4 -0
- package/dist/cli/agent/monitor/watcher.d.ts.map +1 -0
- package/dist/cli/agent/monitor/watcher.js +214 -0
- package/dist/cli/agent/monitor/watcher.js.map +1 -0
- package/dist/cli/agent/permissions.d.ts +65 -0
- package/dist/cli/agent/permissions.d.ts.map +1 -0
- package/dist/cli/agent/permissions.js +447 -0
- package/dist/cli/agent/permissions.js.map +1 -0
- package/dist/cli/agent/plan-engine.d.ts +72 -0
- package/dist/cli/agent/plan-engine.d.ts.map +1 -0
- package/dist/cli/agent/plan-engine.js +261 -0
- package/dist/cli/agent/plan-engine.js.map +1 -0
- package/dist/cli/agent/plan-executor.d.ts +37 -0
- package/dist/cli/agent/plan-executor.d.ts.map +1 -0
- package/dist/cli/agent/plan-executor.js +105 -0
- package/dist/cli/agent/plan-executor.js.map +1 -0
- package/dist/cli/agent/plan-types.d.ts +50 -0
- package/dist/cli/agent/plan-types.d.ts.map +1 -0
- package/dist/cli/agent/plan-types.js +58 -0
- package/dist/cli/agent/plan-types.js.map +1 -0
- package/dist/cli/agent/sandbox.d.ts +28 -0
- package/dist/cli/agent/sandbox.d.ts.map +1 -0
- package/dist/cli/agent/sandbox.js +298 -0
- package/dist/cli/agent/sandbox.js.map +1 -0
- package/dist/cli/agent/swarm.d.ts +75 -0
- package/dist/cli/agent/swarm.d.ts.map +1 -0
- package/dist/cli/agent/swarm.js +272 -0
- package/dist/cli/agent/swarm.js.map +1 -0
- package/dist/cli/agent/tools/browser-click.d.ts +2 -0
- package/dist/cli/agent/tools/browser-click.d.ts.map +1 -0
- package/dist/cli/agent/tools/browser-click.js +35 -0
- package/dist/cli/agent/tools/browser-click.js.map +1 -0
- package/dist/cli/agent/tools/browser-close.d.ts +2 -0
- package/dist/cli/agent/tools/browser-close.d.ts.map +1 -0
- package/dist/cli/agent/tools/browser-close.js +27 -0
- package/dist/cli/agent/tools/browser-close.js.map +1 -0
- package/dist/cli/agent/tools/browser-navigate.d.ts +2 -0
- package/dist/cli/agent/tools/browser-navigate.d.ts.map +1 -0
- package/dist/cli/agent/tools/browser-navigate.js +27 -0
- package/dist/cli/agent/tools/browser-navigate.js.map +1 -0
- package/dist/cli/agent/tools/browser-open.d.ts +2 -0
- package/dist/cli/agent/tools/browser-open.d.ts.map +1 -0
- package/dist/cli/agent/tools/browser-open.js +38 -0
- package/dist/cli/agent/tools/browser-open.js.map +1 -0
- package/dist/cli/agent/tools/browser-screenshot.d.ts +2 -0
- package/dist/cli/agent/tools/browser-screenshot.d.ts.map +1 -0
- package/dist/cli/agent/tools/browser-screenshot.js +68 -0
- package/dist/cli/agent/tools/browser-screenshot.js.map +1 -0
- package/dist/cli/agent/tools/browser-type.d.ts +2 -0
- package/dist/cli/agent/tools/browser-type.d.ts.map +1 -0
- package/dist/cli/agent/tools/browser-type.js +33 -0
- package/dist/cli/agent/tools/browser-type.js.map +1 -0
- package/dist/cli/agent/tools/bug-list.d.ts +2 -0
- package/dist/cli/agent/tools/bug-list.d.ts.map +1 -0
- package/dist/cli/agent/tools/bug-list.js +82 -0
- package/dist/cli/agent/tools/bug-list.js.map +1 -0
- package/dist/cli/agent/tools/bug-report.d.ts +2 -0
- package/dist/cli/agent/tools/bug-report.d.ts.map +1 -0
- package/dist/cli/agent/tools/bug-report.js +130 -0
- package/dist/cli/agent/tools/bug-report.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 +61 -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 +57 -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 +45 -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 +41 -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 +52 -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 +34 -0
- package/dist/cli/agent/tools/registry.d.ts.map +1 -0
- package/dist/cli/agent/tools/registry.js +53 -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 +112 -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 +86 -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 +169 -0
- package/dist/cli/auth/callback-server.js.map +1 -0
- package/dist/cli/auth/feature-gate.d.ts +47 -0
- package/dist/cli/auth/feature-gate.d.ts.map +1 -0
- package/dist/cli/auth/feature-gate.js +171 -0
- package/dist/cli/auth/feature-gate.js.map +1 -0
- package/dist/cli/auth/guard.d.ts +11 -0
- package/dist/cli/auth/guard.d.ts.map +1 -0
- package/dist/cli/auth/guard.js +94 -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 +287 -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 +166 -0
- package/dist/cli/brain/archive.js.map +1 -0
- package/dist/cli/brain/control-protocol.d.ts +913 -0
- package/dist/cli/brain/control-protocol.d.ts.map +1 -0
- package/dist/cli/brain/control-protocol.js +87 -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 +157 -0
- package/dist/cli/brain/generator.d.ts.map +1 -0
- package/dist/cli/brain/generator.js +633 -0
- package/dist/cli/brain/generator.js.map +1 -0
- package/dist/cli/brain/instance-manager.d.ts +42 -0
- package/dist/cli/brain/instance-manager.d.ts.map +1 -0
- package/dist/cli/brain/instance-manager.js +152 -0
- package/dist/cli/brain/instance-manager.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 +505 -0
- package/dist/cli/brain/relay-client.js.map +1 -0
- package/dist/cli/brain/server.d.ts +40 -0
- package/dist/cli/brain/server.d.ts.map +1 -0
- package/dist/cli/brain/server.js +873 -0
- package/dist/cli/brain/server.js.map +1 -0
- package/dist/cli/brain/stdout-capture.d.ts +19 -0
- package/dist/cli/brain/stdout-capture.d.ts.map +1 -0
- package/dist/cli/brain/stdout-capture.js +45 -0
- package/dist/cli/brain/stdout-capture.js.map +1 -0
- package/dist/cli/brain/sync.d.ts +53 -0
- package/dist/cli/brain/sync.d.ts.map +1 -0
- package/dist/cli/brain/sync.js +113 -0
- package/dist/cli/brain/sync.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 +2099 -0
- package/dist/cli/brain/template.js.map +1 -0
- package/dist/cli/brain/web-chat-handler.d.ts +26 -0
- package/dist/cli/brain/web-chat-handler.d.ts.map +1 -0
- package/dist/cli/brain/web-chat-handler.js +134 -0
- package/dist/cli/brain/web-chat-handler.js.map +1 -0
- package/dist/cli/browser/chrome-finder.d.ts +12 -0
- package/dist/cli/browser/chrome-finder.d.ts.map +1 -0
- package/dist/cli/browser/chrome-finder.js +74 -0
- package/dist/cli/browser/chrome-finder.js.map +1 -0
- package/dist/cli/browser/controller.d.ts +51 -0
- package/dist/cli/browser/controller.d.ts.map +1 -0
- package/dist/cli/browser/controller.js +152 -0
- package/dist/cli/browser/controller.js.map +1 -0
- package/dist/cli/browser/vision.d.ts +38 -0
- package/dist/cli/browser/vision.d.ts.map +1 -0
- package/dist/cli/browser/vision.js +123 -0
- package/dist/cli/browser/vision.js.map +1 -0
- package/dist/cli/bugs/detector.d.ts +14 -0
- package/dist/cli/bugs/detector.d.ts.map +1 -0
- package/dist/cli/bugs/detector.js +108 -0
- package/dist/cli/bugs/detector.js.map +1 -0
- package/dist/cli/bugs/journal.d.ts +39 -0
- package/dist/cli/bugs/journal.d.ts.map +1 -0
- package/dist/cli/bugs/journal.js +195 -0
- package/dist/cli/bugs/journal.js.map +1 -0
- package/dist/cli/bugs/types.d.ts +27 -0
- package/dist/cli/bugs/types.d.ts.map +1 -0
- package/dist/cli/bugs/types.js +2 -0
- package/dist/cli/bugs/types.js.map +1 -0
- package/dist/cli/checkpoints/browser.d.ts +26 -0
- package/dist/cli/checkpoints/browser.d.ts.map +1 -0
- package/dist/cli/checkpoints/browser.js +272 -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 +44 -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 +196 -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 +5363 -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 +43 -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 +38 -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 +310 -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 +80 -0
- package/dist/cli/config/store.d.ts.map +1 -0
- package/dist/cli/config/store.js +247 -0
- package/dist/cli/config/store.js.map +1 -0
- package/dist/cli/config/trust.d.ts +21 -0
- package/dist/cli/config/trust.d.ts.map +1 -0
- package/dist/cli/config/trust.js +106 -0
- package/dist/cli/config/trust.js.map +1 -0
- package/dist/cli/context/assembler.d.ts +9 -0
- package/dist/cli/context/assembler.d.ts.map +1 -0
- package/dist/cli/context/assembler.js +217 -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 +69 -0
- package/dist/cli/context/session-buffer.d.ts.map +1 -0
- package/dist/cli/context/session-buffer.js +362 -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 +137 -0
- package/dist/cli/context/trimmer.js.map +1 -0
- package/dist/cli/core/index.d.ts +15 -0
- package/dist/cli/core/index.d.ts.map +1 -0
- package/dist/cli/core/index.js +12 -0
- package/dist/cli/core/index.js.map +1 -0
- package/dist/cli/core/input.d.ts +208 -0
- package/dist/cli/core/input.d.ts.map +1 -0
- package/dist/cli/core/input.js +807 -0
- package/dist/cli/core/input.js.map +1 -0
- package/dist/cli/core/screen.d.ts +211 -0
- package/dist/cli/core/screen.d.ts.map +1 -0
- package/dist/cli/core/screen.js +826 -0
- package/dist/cli/core/screen.js.map +1 -0
- package/dist/cli/core/terminal.d.ts +88 -0
- package/dist/cli/core/terminal.d.ts.map +1 -0
- package/dist/cli/core/terminal.js +200 -0
- package/dist/cli/core/terminal.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 +33 -0
- package/dist/cli/feed/pipeline.d.ts.map +1 -0
- package/dist/cli/feed/pipeline.js +250 -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/helixmind.cmd +2 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +297 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/jarvis/autonomy.d.ts +55 -0
- package/dist/cli/jarvis/autonomy.d.ts.map +1 -0
- package/dist/cli/jarvis/autonomy.js +176 -0
- package/dist/cli/jarvis/autonomy.js.map +1 -0
- package/dist/cli/jarvis/code-reviewer.d.ts +35 -0
- package/dist/cli/jarvis/code-reviewer.d.ts.map +1 -0
- package/dist/cli/jarvis/code-reviewer.js +93 -0
- package/dist/cli/jarvis/code-reviewer.js.map +1 -0
- package/dist/cli/jarvis/core-ethics.d.ts +35 -0
- package/dist/cli/jarvis/core-ethics.d.ts.map +1 -0
- package/dist/cli/jarvis/core-ethics.js +246 -0
- package/dist/cli/jarvis/core-ethics.js.map +1 -0
- package/dist/cli/jarvis/daemon.d.ts +24 -0
- package/dist/cli/jarvis/daemon.d.ts.map +1 -0
- package/dist/cli/jarvis/daemon.js +230 -0
- package/dist/cli/jarvis/daemon.js.map +1 -0
- package/dist/cli/jarvis/dependency-guardian.d.ts +40 -0
- package/dist/cli/jarvis/dependency-guardian.d.ts.map +1 -0
- package/dist/cli/jarvis/dependency-guardian.js +148 -0
- package/dist/cli/jarvis/dependency-guardian.js.map +1 -0
- package/dist/cli/jarvis/git-intelligence.d.ts +36 -0
- package/dist/cli/jarvis/git-intelligence.d.ts.map +1 -0
- package/dist/cli/jarvis/git-intelligence.js +222 -0
- package/dist/cli/jarvis/git-intelligence.js.map +1 -0
- package/dist/cli/jarvis/identity.d.ts +57 -0
- package/dist/cli/jarvis/identity.d.ts.map +1 -0
- package/dist/cli/jarvis/identity.js +416 -0
- package/dist/cli/jarvis/identity.js.map +1 -0
- package/dist/cli/jarvis/index.d.ts +9 -0
- package/dist/cli/jarvis/index.d.ts.map +1 -0
- package/dist/cli/jarvis/index.js +7 -0
- package/dist/cli/jarvis/index.js.map +1 -0
- package/dist/cli/jarvis/instance-lock.d.ts +15 -0
- package/dist/cli/jarvis/instance-lock.d.ts.map +1 -0
- package/dist/cli/jarvis/instance-lock.js +95 -0
- package/dist/cli/jarvis/instance-lock.js.map +1 -0
- package/dist/cli/jarvis/learning.d.ts +73 -0
- package/dist/cli/jarvis/learning.d.ts.map +1 -0
- package/dist/cli/jarvis/learning.js +284 -0
- package/dist/cli/jarvis/learning.js.map +1 -0
- package/dist/cli/jarvis/multi-project.d.ts +39 -0
- package/dist/cli/jarvis/multi-project.d.ts.map +1 -0
- package/dist/cli/jarvis/multi-project.js +152 -0
- package/dist/cli/jarvis/multi-project.js.map +1 -0
- package/dist/cli/jarvis/notifications.d.ts +39 -0
- package/dist/cli/jarvis/notifications.d.ts.map +1 -0
- package/dist/cli/jarvis/notifications.js +216 -0
- package/dist/cli/jarvis/notifications.js.map +1 -0
- package/dist/cli/jarvis/onboarding.d.ts +19 -0
- package/dist/cli/jarvis/onboarding.d.ts.map +1 -0
- package/dist/cli/jarvis/onboarding.js +116 -0
- package/dist/cli/jarvis/onboarding.js.map +1 -0
- package/dist/cli/jarvis/orchestrator.d.ts +46 -0
- package/dist/cli/jarvis/orchestrator.d.ts.map +1 -0
- package/dist/cli/jarvis/orchestrator.js +253 -0
- package/dist/cli/jarvis/orchestrator.js.map +1 -0
- package/dist/cli/jarvis/parallel.d.ts +63 -0
- package/dist/cli/jarvis/parallel.d.ts.map +1 -0
- package/dist/cli/jarvis/parallel.js +172 -0
- package/dist/cli/jarvis/parallel.js.map +1 -0
- package/dist/cli/jarvis/performance-profiler.d.ts +31 -0
- package/dist/cli/jarvis/performance-profiler.d.ts.map +1 -0
- package/dist/cli/jarvis/performance-profiler.js +229 -0
- package/dist/cli/jarvis/performance-profiler.js.map +1 -0
- package/dist/cli/jarvis/proposals.d.ts +80 -0
- package/dist/cli/jarvis/proposals.d.ts.map +1 -0
- package/dist/cli/jarvis/proposals.js +286 -0
- package/dist/cli/jarvis/proposals.js.map +1 -0
- package/dist/cli/jarvis/queue.d.ts +41 -0
- package/dist/cli/jarvis/queue.d.ts.map +1 -0
- package/dist/cli/jarvis/queue.js +245 -0
- package/dist/cli/jarvis/queue.js.map +1 -0
- package/dist/cli/jarvis/runtime-context.d.ts +34 -0
- package/dist/cli/jarvis/runtime-context.d.ts.map +1 -0
- package/dist/cli/jarvis/runtime-context.js +113 -0
- package/dist/cli/jarvis/runtime-context.js.map +1 -0
- package/dist/cli/jarvis/scheduler.d.ts +21 -0
- package/dist/cli/jarvis/scheduler.d.ts.map +1 -0
- package/dist/cli/jarvis/scheduler.js +182 -0
- package/dist/cli/jarvis/scheduler.js.map +1 -0
- package/dist/cli/jarvis/sentiment.d.ts +29 -0
- package/dist/cli/jarvis/sentiment.d.ts.map +1 -0
- package/dist/cli/jarvis/sentiment.js +221 -0
- package/dist/cli/jarvis/sentiment.js.map +1 -0
- package/dist/cli/jarvis/skill-scoring.d.ts +63 -0
- package/dist/cli/jarvis/skill-scoring.d.ts.map +1 -0
- package/dist/cli/jarvis/skill-scoring.js +226 -0
- package/dist/cli/jarvis/skill-scoring.js.map +1 -0
- package/dist/cli/jarvis/skills.d.ts +87 -0
- package/dist/cli/jarvis/skills.d.ts.map +1 -0
- package/dist/cli/jarvis/skills.js +367 -0
- package/dist/cli/jarvis/skills.js.map +1 -0
- package/dist/cli/jarvis/telegram-bot.d.ts +77 -0
- package/dist/cli/jarvis/telegram-bot.d.ts.map +1 -0
- package/dist/cli/jarvis/telegram-bot.js +251 -0
- package/dist/cli/jarvis/telegram-bot.js.map +1 -0
- package/dist/cli/jarvis/telemetry.d.ts +32 -0
- package/dist/cli/jarvis/telemetry.d.ts.map +1 -0
- package/dist/cli/jarvis/telemetry.js +213 -0
- package/dist/cli/jarvis/telemetry.js.map +1 -0
- package/dist/cli/jarvis/test-sentinel.d.ts +36 -0
- package/dist/cli/jarvis/test-sentinel.d.ts.map +1 -0
- package/dist/cli/jarvis/test-sentinel.js +178 -0
- package/dist/cli/jarvis/test-sentinel.js.map +1 -0
- package/dist/cli/jarvis/thinking-loop.d.ts +15 -0
- package/dist/cli/jarvis/thinking-loop.d.ts.map +1 -0
- package/dist/cli/jarvis/thinking-loop.js +437 -0
- package/dist/cli/jarvis/thinking-loop.js.map +1 -0
- package/dist/cli/jarvis/triggers.d.ts +23 -0
- package/dist/cli/jarvis/triggers.d.ts.map +1 -0
- package/dist/cli/jarvis/triggers.js +157 -0
- package/dist/cli/jarvis/triggers.js.map +1 -0
- package/dist/cli/jarvis/types.d.ts +582 -0
- package/dist/cli/jarvis/types.d.ts.map +1 -0
- package/dist/cli/jarvis/types.js +18 -0
- package/dist/cli/jarvis/types.js.map +1 -0
- package/dist/cli/jarvis/voice-bridge.d.ts +68 -0
- package/dist/cli/jarvis/voice-bridge.d.ts.map +1 -0
- package/dist/cli/jarvis/voice-bridge.js +254 -0
- package/dist/cli/jarvis/voice-bridge.js.map +1 -0
- package/dist/cli/jarvis/world-model.d.ts +43 -0
- package/dist/cli/jarvis/world-model.d.ts.map +1 -0
- package/dist/cli/jarvis/world-model.js +209 -0
- package/dist/cli/jarvis/world-model.js.map +1 -0
- package/dist/cli/jarvis-proxy/client.d.ts +18 -0
- package/dist/cli/jarvis-proxy/client.d.ts.map +1 -0
- package/dist/cli/jarvis-proxy/client.js +64 -0
- package/dist/cli/jarvis-proxy/client.js.map +1 -0
- package/dist/cli/jarvis-proxy/executor.d.ts +13 -0
- package/dist/cli/jarvis-proxy/executor.d.ts.map +1 -0
- package/dist/cli/jarvis-proxy/executor.js +32 -0
- package/dist/cli/jarvis-proxy/executor.js.map +1 -0
- package/dist/cli/jarvis-proxy/types.d.ts +25 -0
- package/dist/cli/jarvis-proxy/types.d.ts.map +1 -0
- package/dist/cli/jarvis-proxy/types.js +7 -0
- package/dist/cli/jarvis-proxy/types.js.map +1 -0
- package/dist/cli/license/checker.d.ts +11 -0
- package/dist/cli/license/checker.d.ts.map +1 -0
- package/dist/cli/license/checker.js +28 -0
- package/dist/cli/license/checker.js.map +1 -0
- package/dist/cli/license/validator.d.ts +13 -0
- package/dist/cli/license/validator.d.ts.map +1 -0
- package/dist/cli/license/validator.js +72 -0
- package/dist/cli/license/validator.js.map +1 -0
- package/dist/cli/providers/anthropic.d.ts +11 -0
- package/dist/cli/providers/anthropic.d.ts.map +1 -0
- package/dist/cli/providers/anthropic.js +120 -0
- package/dist/cli/providers/anthropic.js.map +1 -0
- package/dist/cli/providers/model-limits.d.ts +12 -0
- package/dist/cli/providers/model-limits.d.ts.map +1 -0
- package/dist/cli/providers/model-limits.js +63 -0
- package/dist/cli/providers/model-limits.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 +14 -0
- package/dist/cli/providers/openai.d.ts.map +1 -0
- package/dist/cli/providers/openai.js +319 -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 +72 -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 +201 -0
- package/dist/cli/sessions/manager.js.map +1 -0
- package/dist/cli/sessions/session.d.ts +58 -0
- package/dist/cli/sessions/session.d.ts.map +1 -0
- package/dist/cli/sessions/session.js +74 -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 +137 -0
- package/dist/cli/sessions/tab-view.js.map +1 -0
- package/dist/cli/ui/activity.d.ts +81 -0
- package/dist/cli/ui/activity.d.ts.map +1 -0
- package/dist/cli/ui/activity.js +286 -0
- package/dist/cli/ui/activity.js.map +1 -0
- package/dist/cli/ui/agent-display.d.ts +24 -0
- package/dist/cli/ui/agent-display.d.ts.map +1 -0
- package/dist/cli/ui/agent-display.js +36 -0
- package/dist/cli/ui/agent-display.js.map +1 -0
- package/dist/cli/ui/bottom-chrome.d.ts +121 -0
- package/dist/cli/ui/bottom-chrome.d.ts.map +1 -0
- package/dist/cli/ui/bottom-chrome.js +428 -0
- package/dist/cli/ui/bottom-chrome.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 +237 -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 +118 -0
- package/dist/cli/ui/command-suggest.js.map +1 -0
- package/dist/cli/ui/input-window.d.ts +145 -0
- package/dist/cli/ui/input-window.d.ts.map +1 -0
- package/dist/cli/ui/input-window.js +415 -0
- package/dist/cli/ui/input-window.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/plan-display.d.ts +35 -0
- package/dist/cli/ui/plan-display.d.ts.map +1 -0
- package/dist/cli/ui/plan-display.js +381 -0
- package/dist/cli/ui/plan-display.js.map +1 -0
- package/dist/cli/ui/progress.d.ts +22 -0
- package/dist/cli/ui/progress.d.ts.map +1 -0
- package/dist/cli/ui/progress.js +126 -0
- package/dist/cli/ui/progress.js.map +1 -0
- package/dist/cli/ui/prompt-history.d.ts +37 -0
- package/dist/cli/ui/prompt-history.d.ts.map +1 -0
- package/dist/cli/ui/prompt-history.js +156 -0
- package/dist/cli/ui/prompt-history.js.map +1 -0
- package/dist/cli/ui/select-menu.d.ts +45 -0
- package/dist/cli/ui/select-menu.d.ts.map +1 -0
- package/dist/cli/ui/select-menu.js +330 -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 +72 -0
- package/dist/cli/ui/statusbar.d.ts.map +1 -0
- package/dist/cli/ui/statusbar.js +376 -0
- package/dist/cli/ui/statusbar.js.map +1 -0
- package/dist/cli/ui/suggestion-panel.d.ts +52 -0
- package/dist/cli/ui/suggestion-panel.d.ts.map +1 -0
- package/dist/cli/ui/suggestion-panel.js +159 -0
- package/dist/cli/ui/suggestion-panel.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 +31 -0
- package/dist/cli/ui/tool-output.d.ts.map +1 -0
- package/dist/cli/ui/tool-output.js +204 -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 +209 -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 +648 -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/cli/version.d.ts +2 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +5 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/cli/voice/clone-manager.d.ts +19 -0
- package/dist/cli/voice/clone-manager.d.ts.map +1 -0
- package/dist/cli/voice/clone-manager.js +55 -0
- package/dist/cli/voice/clone-manager.js.map +1 -0
- package/dist/cli/voice/engine.d.ts +43 -0
- package/dist/cli/voice/engine.d.ts.map +1 -0
- package/dist/cli/voice/engine.js +109 -0
- package/dist/cli/voice/engine.js.map +1 -0
- package/dist/cli/voice/whisper-stt.d.ts +28 -0
- package/dist/cli/voice/whisper-stt.d.ts.map +1 -0
- package/dist/cli/voice/whisper-stt.js +78 -0
- package/dist/cli/voice/whisper-stt.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 +44 -0
- package/dist/server.js.map +1 -0
- package/dist/shared/protocol-types.d.ts +283 -0
- package/dist/shared/protocol-types.d.ts.map +1 -0
- package/dist/shared/protocol-types.js +9 -0
- package/dist/shared/protocol-types.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 +241 -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 +176 -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 +30 -0
- package/dist/spiral/embeddings.d.ts.map +1 -0
- package/dist/spiral/embeddings.js +99 -0
- package/dist/spiral/embeddings.js.map +1 -0
- package/dist/spiral/engine.d.ts +98 -0
- package/dist/spiral/engine.d.ts.map +1 -0
- package/dist/spiral/engine.js +330 -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 +176 -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 +169 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/edges.d.ts +30 -0
- package/dist/storage/edges.d.ts.map +1 -0
- package/dist/storage/edges.js +98 -0
- package/dist/storage/edges.js.map +1 -0
- package/dist/storage/nodes.d.ts +60 -0
- package/dist/storage/nodes.d.ts.map +1 -0
- package/dist/storage/nodes.js +161 -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 +94 -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 +93 -0
|
@@ -0,0 +1,807 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InputManager — Isolated input handling with framed display.
|
|
3
|
+
*
|
|
4
|
+
* Wraps Node.js readline to provide:
|
|
5
|
+
* - Input rendered inside the Screen's input frame (│ ❯ _)
|
|
6
|
+
* - readline output goes to /dev/null — we render the line ourselves
|
|
7
|
+
* - Complete control over when/how input appears
|
|
8
|
+
* - ESC to stop agent (single ESC)
|
|
9
|
+
* - Double-ESC for emergency stop
|
|
10
|
+
* - Ctrl+C to clear input / exit
|
|
11
|
+
* - Tab completion + suggestion panel (arrow key navigation)
|
|
12
|
+
* - Bracketed paste detection
|
|
13
|
+
* - Prompt history (up/down arrows)
|
|
14
|
+
* - Mute/unmute during agent streaming
|
|
15
|
+
* - Type-ahead preview during agent work
|
|
16
|
+
*
|
|
17
|
+
* Events emitted:
|
|
18
|
+
* - 'submit' (line: string) — user pressed Enter
|
|
19
|
+
* - 'escape' — single ESC pressed
|
|
20
|
+
* - 'double-escape' — ESC ESC pressed quickly
|
|
21
|
+
* - 'ctrl-c' — Ctrl+C pressed
|
|
22
|
+
* - 'tab' — Tab pressed (for completion)
|
|
23
|
+
* - 'typing' (line: string, cursor: number) — content changed
|
|
24
|
+
* - 'paste' (text: string) — bracketed paste received
|
|
25
|
+
*/
|
|
26
|
+
import * as readline from 'node:readline';
|
|
27
|
+
import { Writable } from 'node:stream';
|
|
28
|
+
import { EventEmitter } from 'node:events';
|
|
29
|
+
import chalk from 'chalk';
|
|
30
|
+
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
31
|
+
const ESC_DOUBLE_THRESHOLD = 300; // ms between two ESCs for double-ESC
|
|
32
|
+
const PASTE_THRESHOLD_MS = 100; // ms to detect multi-line paste
|
|
33
|
+
const MAX_SUGGESTIONS = 6;
|
|
34
|
+
// ─── InputManager ────────────────────────────────────────────────────────────
|
|
35
|
+
export class InputManager extends EventEmitter {
|
|
36
|
+
screen;
|
|
37
|
+
terminal;
|
|
38
|
+
rl;
|
|
39
|
+
devNull;
|
|
40
|
+
// State
|
|
41
|
+
_muted = false;
|
|
42
|
+
_isPrompting = false;
|
|
43
|
+
_lastEscTime = 0;
|
|
44
|
+
_ctrlCCount = 0;
|
|
45
|
+
_ctrlCTimer = null;
|
|
46
|
+
// Suggestion panel
|
|
47
|
+
_suggestions = [];
|
|
48
|
+
_suggestionIndex = -1;
|
|
49
|
+
_suggestionOriginalInput = '';
|
|
50
|
+
_suggestionOpen = false;
|
|
51
|
+
// Paste detection
|
|
52
|
+
_bracketedPasteActive = false;
|
|
53
|
+
_bracketedPasteBuffer = '';
|
|
54
|
+
_pasteBuffer = [];
|
|
55
|
+
_pasteTimer = null;
|
|
56
|
+
// Suppress flag: when true, _ttyWrite skips all input (used during bracketed paste)
|
|
57
|
+
_suppressInput = false;
|
|
58
|
+
// Paste badges: embedded markers in readline line text.
|
|
59
|
+
// \x01 = badge start, \x02 = badge end. Actual paste text stored in _pasteStore.
|
|
60
|
+
// Multiple badges possible — each paste inserts a marker at cursor position.
|
|
61
|
+
_pasteStore = new Map(); // badgeId → actual paste text
|
|
62
|
+
_nextPasteId = 1;
|
|
63
|
+
static PASTE_BLOCK_THRESHOLD = 3; // lines ≥ this → badge mode
|
|
64
|
+
// Legacy compat
|
|
65
|
+
_pasteBlock = null;
|
|
66
|
+
// Multi-line input state (Shift+Enter inserts newline)
|
|
67
|
+
_multiLines = ['']; // lines[0] synced with readline's .line
|
|
68
|
+
_multiCursorLine = 0; // which line the cursor is on
|
|
69
|
+
// Drain guard: skip phantom line events after sub-menus
|
|
70
|
+
_drainUntil = 0;
|
|
71
|
+
// Pending paste text (stored for combining with typed input on Enter)
|
|
72
|
+
_pendingPasteText = null;
|
|
73
|
+
// Options
|
|
74
|
+
_getSuggestions;
|
|
75
|
+
_getBestCompletion;
|
|
76
|
+
/**
|
|
77
|
+
* Access the underlying readline interface.
|
|
78
|
+
* Needed for legacy code (PermissionManager.setReadline, rl.question, etc.)
|
|
79
|
+
*/
|
|
80
|
+
get readline() { return this.rl; }
|
|
81
|
+
constructor(screen, terminal, options = {}) {
|
|
82
|
+
super();
|
|
83
|
+
this.screen = screen;
|
|
84
|
+
this.terminal = terminal;
|
|
85
|
+
this._getSuggestions = options.getSuggestions ?? null;
|
|
86
|
+
this._getBestCompletion = options.getBestCompletion ?? null;
|
|
87
|
+
// Create a /dev/null writable — readline writes its output here (we render ourselves)
|
|
88
|
+
this.devNull = new Writable({ write: (_chunk, _encoding, callback) => callback() });
|
|
89
|
+
// Enable keypress events before creating readline
|
|
90
|
+
if (process.stdin.isTTY) {
|
|
91
|
+
readline.emitKeypressEvents(process.stdin);
|
|
92
|
+
}
|
|
93
|
+
// Create readline with output to devNull — we render the input ourselves.
|
|
94
|
+
// IMPORTANT: terminal must be true so readline uses _ttyWrite (our intercept point).
|
|
95
|
+
// Without it, readline falls back to non-terminal line buffering and _ttyWrite is never called.
|
|
96
|
+
this.rl = readline.createInterface({
|
|
97
|
+
input: process.stdin,
|
|
98
|
+
output: this.devNull,
|
|
99
|
+
prompt: '',
|
|
100
|
+
terminal: true,
|
|
101
|
+
escapeCodeTimeout: 50,
|
|
102
|
+
completer: options.completer,
|
|
103
|
+
});
|
|
104
|
+
// Intercept readline's internal _ttyWrite for suggestion panel navigation
|
|
105
|
+
this._interceptTtyWrite();
|
|
106
|
+
// Register event handlers
|
|
107
|
+
this._registerKeypress();
|
|
108
|
+
this._registerLineHandler();
|
|
109
|
+
this._registerBracketedPaste();
|
|
110
|
+
}
|
|
111
|
+
// ─── Public API ────────────────────────────────────────────────────────
|
|
112
|
+
/**
|
|
113
|
+
* Show the prompt and accept input. Draws the frame and positions cursor.
|
|
114
|
+
*/
|
|
115
|
+
prompt() {
|
|
116
|
+
this._isPrompting = true;
|
|
117
|
+
this.screen.inputActive = true;
|
|
118
|
+
// Activate readline's input processing (output goes to devNull, we render ourselves)
|
|
119
|
+
this.rl.prompt();
|
|
120
|
+
// Draw the input frame
|
|
121
|
+
this.screen.drawFrameTop();
|
|
122
|
+
this._renderCurrentLine();
|
|
123
|
+
// Draw frame bottom when no activity (idle state)
|
|
124
|
+
this.screen.drawFrameBottom();
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Mute input echo (during agent streaming).
|
|
128
|
+
* Keystrokes are still captured but shown as dim type-ahead preview.
|
|
129
|
+
*/
|
|
130
|
+
mute() {
|
|
131
|
+
this._muted = true;
|
|
132
|
+
this.screen.inputActive = false; // allow hook redraws during agent work
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Unmute input echo (after agent finishes).
|
|
136
|
+
*/
|
|
137
|
+
unmute() {
|
|
138
|
+
this._muted = false;
|
|
139
|
+
this.screen.inputActive = true;
|
|
140
|
+
this.rl.prompt(); // Re-activate readline input processing
|
|
141
|
+
this._renderCurrentLine();
|
|
142
|
+
}
|
|
143
|
+
/** Whether input echo is muted */
|
|
144
|
+
get isMuted() { return this._muted; }
|
|
145
|
+
/** Whether we're currently prompting for input */
|
|
146
|
+
get isPrompting() { return this._isPrompting; }
|
|
147
|
+
/** Get current input line content */
|
|
148
|
+
get currentLine() {
|
|
149
|
+
return this.rl.line || '';
|
|
150
|
+
}
|
|
151
|
+
/** Get current cursor position */
|
|
152
|
+
get cursorPos() {
|
|
153
|
+
return this.rl.cursor || 0;
|
|
154
|
+
}
|
|
155
|
+
/** Programmatically set the input line (resets multi-line to single line) */
|
|
156
|
+
setLine(text) {
|
|
157
|
+
this._resetMultiLine();
|
|
158
|
+
this._multiLines[0] = text;
|
|
159
|
+
this.rl.line = text;
|
|
160
|
+
this.rl.cursor = text.length;
|
|
161
|
+
this._renderCurrentLine();
|
|
162
|
+
}
|
|
163
|
+
/** Clear the current input (resets multi-line) */
|
|
164
|
+
clearLine() {
|
|
165
|
+
this._resetMultiLine();
|
|
166
|
+
this.rl.line = '';
|
|
167
|
+
this.rl.cursor = 0;
|
|
168
|
+
this._renderCurrentLine();
|
|
169
|
+
}
|
|
170
|
+
/** Set pending paste text (to be combined with input on Enter) */
|
|
171
|
+
get pendingPaste() { return this._pendingPasteText; }
|
|
172
|
+
set pendingPaste(text) { this._pendingPasteText = text; }
|
|
173
|
+
/** Whether a paste block is currently stored */
|
|
174
|
+
get hasPasteBlock() { return this._pasteBlock !== null; }
|
|
175
|
+
/** Get paste block info */
|
|
176
|
+
get pasteBlock() { return this._pasteBlock; }
|
|
177
|
+
/**
|
|
178
|
+
* Suppress all input processing in _ttyWrite.
|
|
179
|
+
* Used by chat.ts during bracketed paste to prevent readline from
|
|
180
|
+
* accumulating paste characters in its internal buffer.
|
|
181
|
+
*/
|
|
182
|
+
set suppressInput(suppress) { this._suppressInput = suppress; }
|
|
183
|
+
get suppressInput() { return this._suppressInput; }
|
|
184
|
+
/**
|
|
185
|
+
* Store pasted text. Short pastes → insert inline. Long pastes → badge at cursor.
|
|
186
|
+
* Badge markers (\x01...\x02) are embedded in readline's line buffer so the cursor
|
|
187
|
+
* can move freely through them. Multiple pastes create multiple badges.
|
|
188
|
+
*/
|
|
189
|
+
setPasteBlock(text) {
|
|
190
|
+
const trimmed = text.trim();
|
|
191
|
+
if (!trimmed)
|
|
192
|
+
return;
|
|
193
|
+
const lines = trimmed.split('\n');
|
|
194
|
+
const maxContent = (this.terminal.cols || 80) - 6;
|
|
195
|
+
const isLong = trimmed.length > maxContent; // long single-line text
|
|
196
|
+
if (lines.length < InputManager.PASTE_BLOCK_THRESHOLD && !isLong) {
|
|
197
|
+
// Short paste → insert directly into readline line
|
|
198
|
+
const current = this.currentLine;
|
|
199
|
+
const cursor = this.cursorPos;
|
|
200
|
+
const singleLine = lines.join(' '); // collapse to single line
|
|
201
|
+
const newLine = current.slice(0, cursor) + singleLine + current.slice(cursor);
|
|
202
|
+
this.setLine(newLine);
|
|
203
|
+
this.rl.cursor = cursor + singleLine.length;
|
|
204
|
+
this._renderCurrentLine();
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
// Long paste → insert badge marker at cursor position
|
|
208
|
+
const id = this._nextPasteId++;
|
|
209
|
+
this._pasteStore.set(id, trimmed);
|
|
210
|
+
const lineCount = lines.length;
|
|
211
|
+
const label = lineCount > 1 ? `${lineCount} lines` : `${trimmed.length} chars`;
|
|
212
|
+
// Badge text: \x01 id:label \x02 — visible part is the label
|
|
213
|
+
const badge = `\x01${id}:📋 ${label}\x02`;
|
|
214
|
+
const current = this.currentLine;
|
|
215
|
+
const cursor = this.cursorPos;
|
|
216
|
+
const newLine = current.slice(0, cursor) + badge + current.slice(cursor);
|
|
217
|
+
// Update readline directly (bypass setLine which resets multi-line)
|
|
218
|
+
this.rl.line = newLine;
|
|
219
|
+
this.rl.cursor = cursor + badge.length;
|
|
220
|
+
// Legacy compat
|
|
221
|
+
this._pasteBlock = { text: trimmed, lineCount };
|
|
222
|
+
this._pendingPasteText = null; // not needed — badges are inline now
|
|
223
|
+
this._renderCurrentLine();
|
|
224
|
+
this.emit('paste-block', trimmed, lineCount);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Clear all paste badges from the line and storage.
|
|
228
|
+
*/
|
|
229
|
+
clearPasteBlock() {
|
|
230
|
+
if (this._pasteStore.size === 0 && !this._pasteBlock)
|
|
231
|
+
return;
|
|
232
|
+
this._pasteStore.clear();
|
|
233
|
+
this._pasteBlock = null;
|
|
234
|
+
this._pendingPasteText = null;
|
|
235
|
+
// Remove badge markers from readline line
|
|
236
|
+
const line = this.currentLine;
|
|
237
|
+
// eslint-disable-next-line no-control-regex
|
|
238
|
+
const cleaned = line.replace(/\x01[^\x02]*\x02/g, '');
|
|
239
|
+
if (cleaned !== line) {
|
|
240
|
+
this.rl.line = cleaned;
|
|
241
|
+
this.rl.cursor = Math.min(this.cursorPos, cleaned.length);
|
|
242
|
+
}
|
|
243
|
+
this.screen.setInputFrameLines(1);
|
|
244
|
+
this._renderCurrentLine();
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Resolve all badge markers in text, replacing with actual paste content.
|
|
248
|
+
* Used on submit to assemble the final text.
|
|
249
|
+
*/
|
|
250
|
+
resolveBadges(text) {
|
|
251
|
+
// eslint-disable-next-line no-control-regex
|
|
252
|
+
return text.replace(/\x01(\d+):[^\x02]*\x02/g, (_match, idStr) => {
|
|
253
|
+
const id = parseInt(idStr, 10);
|
|
254
|
+
return this._pasteStore.get(id) || '';
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
/** Clear the paste store (call after resolveBadges on submit) */
|
|
258
|
+
clearPasteStore() {
|
|
259
|
+
this._pasteStore.clear();
|
|
260
|
+
this._nextPasteId = 1;
|
|
261
|
+
}
|
|
262
|
+
/** Suppress line events for a duration (after sub-menus) */
|
|
263
|
+
drainFor(ms) {
|
|
264
|
+
this._drainUntil = Date.now() + ms;
|
|
265
|
+
}
|
|
266
|
+
/** Load history entries into readline */
|
|
267
|
+
loadHistory(entries) {
|
|
268
|
+
this.rl.history = entries.slice(0, 1000);
|
|
269
|
+
}
|
|
270
|
+
/** Add entry to readline history */
|
|
271
|
+
addToHistory(entry) {
|
|
272
|
+
const history = this.rl.history;
|
|
273
|
+
if (history && history[0] !== entry) {
|
|
274
|
+
history.unshift(entry);
|
|
275
|
+
if (history.length > 1000)
|
|
276
|
+
history.pop();
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/** Pause readline (before sub-menus) */
|
|
280
|
+
pause() {
|
|
281
|
+
this.rl.pause();
|
|
282
|
+
this.screen.inputActive = false;
|
|
283
|
+
}
|
|
284
|
+
/** Resume readline (after sub-menus) */
|
|
285
|
+
resume() {
|
|
286
|
+
this.rl.resume();
|
|
287
|
+
this.screen.inputActive = true;
|
|
288
|
+
this._renderCurrentLine();
|
|
289
|
+
}
|
|
290
|
+
/** Whether suggestion panel is open */
|
|
291
|
+
get isSuggestionOpen() { return this._suggestionOpen; }
|
|
292
|
+
/** Get selected suggestion command */
|
|
293
|
+
get selectedSuggestion() {
|
|
294
|
+
if (!this._suggestionOpen || this._suggestionIndex < 0)
|
|
295
|
+
return null;
|
|
296
|
+
return this._suggestions[this._suggestionIndex]?.cmd ?? null;
|
|
297
|
+
}
|
|
298
|
+
/** Close and clean up */
|
|
299
|
+
destroy() {
|
|
300
|
+
this.closeSuggestions();
|
|
301
|
+
this.rl.close();
|
|
302
|
+
if (this._pasteTimer)
|
|
303
|
+
clearTimeout(this._pasteTimer);
|
|
304
|
+
if (this._ctrlCTimer)
|
|
305
|
+
clearTimeout(this._ctrlCTimer);
|
|
306
|
+
}
|
|
307
|
+
// ─── Suggestion Panel ──────────────────────────────────────────────────
|
|
308
|
+
/**
|
|
309
|
+
* Open the suggestion panel with filtered commands.
|
|
310
|
+
*/
|
|
311
|
+
openSuggestions(items, originalInput) {
|
|
312
|
+
if (items.length === 0) {
|
|
313
|
+
this.closeSuggestions();
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const visible = items.slice(0, MAX_SUGGESTIONS);
|
|
317
|
+
this._suggestions = visible;
|
|
318
|
+
this._suggestionOriginalInput = originalInput;
|
|
319
|
+
this._suggestionIndex = -1;
|
|
320
|
+
this._suggestionOpen = true;
|
|
321
|
+
this.screen.setExtraRows(visible.length);
|
|
322
|
+
this._renderSuggestions();
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Update suggestions while user types (live filter).
|
|
326
|
+
*/
|
|
327
|
+
updateSuggestions(items, input) {
|
|
328
|
+
if (items.length === 0) {
|
|
329
|
+
this.closeSuggestions();
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
const visible = items.slice(0, MAX_SUGGESTIONS);
|
|
333
|
+
this._suggestions = visible;
|
|
334
|
+
this._suggestionOriginalInput = input;
|
|
335
|
+
// Keep selection if same command still in list
|
|
336
|
+
if (this._suggestionIndex >= 0) {
|
|
337
|
+
const prevCmd = this._suggestions[this._suggestionIndex]?.cmd;
|
|
338
|
+
const newIdx = visible.findIndex(it => it.cmd === prevCmd);
|
|
339
|
+
this._suggestionIndex = newIdx;
|
|
340
|
+
}
|
|
341
|
+
if (this.screen.extraRows !== visible.length) {
|
|
342
|
+
this.screen.setExtraRows(visible.length);
|
|
343
|
+
}
|
|
344
|
+
this._renderSuggestions();
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Close the suggestion panel.
|
|
348
|
+
*/
|
|
349
|
+
closeSuggestions() {
|
|
350
|
+
if (!this._suggestionOpen)
|
|
351
|
+
return;
|
|
352
|
+
this._suggestionOpen = false;
|
|
353
|
+
this._suggestions = [];
|
|
354
|
+
this._suggestionIndex = -1;
|
|
355
|
+
this._suggestionOriginalInput = '';
|
|
356
|
+
this.screen.setExtraRows(0);
|
|
357
|
+
}
|
|
358
|
+
/** Move suggestion selection down, returns selected command */
|
|
359
|
+
suggestionDown() {
|
|
360
|
+
if (!this._suggestionOpen || this._suggestions.length === 0)
|
|
361
|
+
return null;
|
|
362
|
+
this._suggestionIndex = this._suggestionIndex < this._suggestions.length - 1
|
|
363
|
+
? this._suggestionIndex + 1 : 0;
|
|
364
|
+
this._renderSuggestions();
|
|
365
|
+
return this._suggestions[this._suggestionIndex].cmd;
|
|
366
|
+
}
|
|
367
|
+
/** Move suggestion selection up, returns selected command */
|
|
368
|
+
suggestionUp() {
|
|
369
|
+
if (!this._suggestionOpen || this._suggestions.length === 0)
|
|
370
|
+
return null;
|
|
371
|
+
this._suggestionIndex = this._suggestionIndex > 0
|
|
372
|
+
? this._suggestionIndex - 1
|
|
373
|
+
: this._suggestions.length - 1;
|
|
374
|
+
this._renderSuggestions();
|
|
375
|
+
return this._suggestions[this._suggestionIndex].cmd;
|
|
376
|
+
}
|
|
377
|
+
/** Confirm current suggestion selection */
|
|
378
|
+
confirmSuggestion() {
|
|
379
|
+
if (!this._suggestionOpen || this._suggestions.length === 0)
|
|
380
|
+
return null;
|
|
381
|
+
if (this._suggestionIndex < 0)
|
|
382
|
+
this._suggestionIndex = 0;
|
|
383
|
+
const cmd = this._suggestions[this._suggestionIndex].cmd;
|
|
384
|
+
this.closeSuggestions();
|
|
385
|
+
return cmd;
|
|
386
|
+
}
|
|
387
|
+
// ─── Private: Render ───────────────────────────────────────────────────
|
|
388
|
+
_renderCurrentLine() {
|
|
389
|
+
if (!this.screen.isActive)
|
|
390
|
+
return;
|
|
391
|
+
const line = this.currentLine;
|
|
392
|
+
const cursor = this.cursorPos;
|
|
393
|
+
if (this._muted) {
|
|
394
|
+
// Type-ahead preview (dim)
|
|
395
|
+
if (line) {
|
|
396
|
+
this.screen.writeAtInputRow(chalk.dim(line));
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
this.screen.writeAtInputRow('');
|
|
400
|
+
}
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
// Build display text: strip badge markers for visible width, style badges cyan.
|
|
404
|
+
// Badge markers: \x01 id:label \x02 — embedded in readline's .line.
|
|
405
|
+
// Cursor moves freely through the entire line including badge markers.
|
|
406
|
+
const maxContent = (this.terminal.cols || 80) - 6; // matches screen.ts: 2 border + ❯ + spaces
|
|
407
|
+
// Strip invisible marker chars (\x01, \x02) for display — keep the label text
|
|
408
|
+
// eslint-disable-next-line no-control-regex
|
|
409
|
+
const visibleLine = line.replace(/\x01\d+:/g, '[').replace(/\x02/g, ']');
|
|
410
|
+
// Map cursor from raw line (with markers) to visible line (without \x01id: and \x02)
|
|
411
|
+
const visibleCursor = this._rawToVisibleCursor(line, cursor);
|
|
412
|
+
// Style badge labels cyan: [📋 N lines] → chalk.cyan(...)
|
|
413
|
+
const styledLine = visibleLine.replace(/(\[📋[^\]]*\])/g, (m) => chalk.cyan(m));
|
|
414
|
+
if (maxContent > 0 && visibleLine.length > maxContent) {
|
|
415
|
+
// Auto-wrap: split VISIBLE text into visual lines
|
|
416
|
+
const rawLines = [];
|
|
417
|
+
for (let i = 0; i < visibleLine.length; i += maxContent) {
|
|
418
|
+
rawLines.push(visibleLine.slice(i, i + maxContent));
|
|
419
|
+
}
|
|
420
|
+
// If cursor at exact boundary, add empty line for cursor
|
|
421
|
+
if (visibleLine.length > 0 && visibleLine.length % maxContent === 0 && visibleCursor === visibleLine.length) {
|
|
422
|
+
rawLines.push('');
|
|
423
|
+
}
|
|
424
|
+
// Style badges in wrapped lines
|
|
425
|
+
const styledLines = rawLines.map(seg => seg.replace(/(\[📋[^\]]*\])/g, (m) => chalk.cyan(m)));
|
|
426
|
+
const cursorVisualLine = Math.min(Math.floor(visibleCursor / maxContent), styledLines.length - 1);
|
|
427
|
+
const cursorVisualCol = visibleCursor % maxContent;
|
|
428
|
+
this.screen.setInputFrameLines(styledLines.length);
|
|
429
|
+
this.screen.renderMultiLineInput(styledLines, cursorVisualLine, cursorVisualCol);
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
// Single line — shrink frame if it was expanded
|
|
433
|
+
if (this.screen.inputFrameLines > 1) {
|
|
434
|
+
this.screen.setInputFrameLines(1);
|
|
435
|
+
}
|
|
436
|
+
this.screen.renderInput(styledLine, visibleCursor);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
// ─── Private: Badge cursor mapping ──────────────────────────────────
|
|
440
|
+
/**
|
|
441
|
+
* Map cursor position from raw line (with \x01id:...\x02 markers)
|
|
442
|
+
* to visible line (with [...] brackets instead of markers).
|
|
443
|
+
*/
|
|
444
|
+
_rawToVisibleCursor(rawLine, rawCursor) {
|
|
445
|
+
let visible = 0;
|
|
446
|
+
let i = 0;
|
|
447
|
+
while (i < rawCursor && i < rawLine.length) {
|
|
448
|
+
if (rawLine[i] === '\x01') {
|
|
449
|
+
// Skip \x01 + digits + colon → replaced with [
|
|
450
|
+
visible++; // the [ bracket
|
|
451
|
+
i++; // skip \x01
|
|
452
|
+
while (i < rawLine.length && rawLine[i] !== ':' && i < rawCursor)
|
|
453
|
+
i++;
|
|
454
|
+
if (i < rawLine.length && rawLine[i] === ':')
|
|
455
|
+
i++; // skip :
|
|
456
|
+
}
|
|
457
|
+
else if (rawLine[i] === '\x02') {
|
|
458
|
+
// \x02 → replaced with ]
|
|
459
|
+
visible++;
|
|
460
|
+
i++;
|
|
461
|
+
}
|
|
462
|
+
else {
|
|
463
|
+
visible++;
|
|
464
|
+
i++;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
return visible;
|
|
468
|
+
}
|
|
469
|
+
// ─── Private: Multi-line helpers ──────────────────────────────────────
|
|
470
|
+
/** Insert a newline at the cursor position (Shift+Enter) */
|
|
471
|
+
_insertNewline() {
|
|
472
|
+
const line = this.currentLine;
|
|
473
|
+
const cursor = this.cursorPos;
|
|
474
|
+
// Split current line at cursor into two lines
|
|
475
|
+
const before = line.slice(0, cursor);
|
|
476
|
+
const after = line.slice(cursor);
|
|
477
|
+
// Update multi-line array
|
|
478
|
+
this._multiLines[this._multiCursorLine] = before;
|
|
479
|
+
this._multiLines.splice(this._multiCursorLine + 1, 0, after);
|
|
480
|
+
this._multiCursorLine++;
|
|
481
|
+
// Set readline to the new line's content
|
|
482
|
+
this.rl.line = after;
|
|
483
|
+
this.rl.cursor = 0;
|
|
484
|
+
this._renderCurrentLine();
|
|
485
|
+
this.emit('typing', this._getFullText(), 0);
|
|
486
|
+
}
|
|
487
|
+
/** Switch readline to a different line in the multi-line buffer */
|
|
488
|
+
_switchToLine(lineIdx) {
|
|
489
|
+
// Save current readline state
|
|
490
|
+
this._multiLines[this._multiCursorLine] = this.currentLine;
|
|
491
|
+
// Switch to target line
|
|
492
|
+
this._multiCursorLine = lineIdx;
|
|
493
|
+
const targetLine = this._multiLines[lineIdx];
|
|
494
|
+
this.rl.line = targetLine;
|
|
495
|
+
this.rl.cursor = Math.min(this.cursorPos, targetLine.length);
|
|
496
|
+
this._renderCurrentLine();
|
|
497
|
+
}
|
|
498
|
+
/** Merge current line with the previous one (Backspace at start of line) */
|
|
499
|
+
_mergeWithPrevLine() {
|
|
500
|
+
const prevIdx = this._multiCursorLine - 1;
|
|
501
|
+
const prevLine = this._multiLines[prevIdx];
|
|
502
|
+
const curLine = this.currentLine;
|
|
503
|
+
const newCursor = prevLine.length;
|
|
504
|
+
// Merge: previous line + current line
|
|
505
|
+
this._multiLines[prevIdx] = prevLine + curLine;
|
|
506
|
+
this._multiLines.splice(this._multiCursorLine, 1);
|
|
507
|
+
this._multiCursorLine = prevIdx;
|
|
508
|
+
// Update readline
|
|
509
|
+
this.rl.line = this._multiLines[prevIdx];
|
|
510
|
+
this.rl.cursor = newCursor;
|
|
511
|
+
this._renderCurrentLine();
|
|
512
|
+
this.emit('typing', this._getFullText(), newCursor);
|
|
513
|
+
}
|
|
514
|
+
/** Get the full multi-line text joined with newlines */
|
|
515
|
+
_getFullText() {
|
|
516
|
+
return this._multiLines.join('\n');
|
|
517
|
+
}
|
|
518
|
+
/** Reset multi-line state to single line */
|
|
519
|
+
_resetMultiLine() {
|
|
520
|
+
this._multiLines = [''];
|
|
521
|
+
this._multiCursorLine = 0;
|
|
522
|
+
}
|
|
523
|
+
_renderSuggestions() {
|
|
524
|
+
for (let i = 0; i < this._suggestions.length; i++) {
|
|
525
|
+
const item = this._suggestions[i];
|
|
526
|
+
const isSelected = i === this._suggestionIndex;
|
|
527
|
+
let line;
|
|
528
|
+
if (isSelected) {
|
|
529
|
+
line = chalk.cyan.bold(`❯ ${item.cmd}`) + chalk.dim(` — ${item.description}`);
|
|
530
|
+
}
|
|
531
|
+
else {
|
|
532
|
+
line = chalk.dim(` ${item.cmd} — ${item.description}`);
|
|
533
|
+
}
|
|
534
|
+
this.screen.setSuggestionRow(i, line);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
// ─── Private: readline intercept ───────────────────────────────────────
|
|
538
|
+
/**
|
|
539
|
+
* Intercept readline's internal _ttyWrite to handle:
|
|
540
|
+
* - Arrow keys when suggestion panel is open
|
|
541
|
+
* - Tab/Enter while panel has selection
|
|
542
|
+
* - ESC to close panel
|
|
543
|
+
*/
|
|
544
|
+
_interceptTtyWrite() {
|
|
545
|
+
const origTtyWrite = this.rl._ttyWrite.bind(this.rl);
|
|
546
|
+
const self = this;
|
|
547
|
+
this.rl._ttyWrite = function (s, key) {
|
|
548
|
+
// During bracketed paste, suppress ALL input to prevent readline buffer pollution
|
|
549
|
+
if (self._suppressInput)
|
|
550
|
+
return;
|
|
551
|
+
// Suggestion panel navigation
|
|
552
|
+
if (self._suggestionOpen) {
|
|
553
|
+
if (key?.name === 'down') {
|
|
554
|
+
const cmd = self.suggestionDown();
|
|
555
|
+
if (cmd) {
|
|
556
|
+
self.setLine(cmd + ' ');
|
|
557
|
+
}
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
if (key?.name === 'up') {
|
|
561
|
+
const cmd = self.suggestionUp();
|
|
562
|
+
if (cmd) {
|
|
563
|
+
self.setLine(cmd + ' ');
|
|
564
|
+
}
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
if (key?.name === 'tab') {
|
|
568
|
+
const cmd = self.confirmSuggestion();
|
|
569
|
+
if (cmd) {
|
|
570
|
+
self.setLine(cmd + ' ');
|
|
571
|
+
}
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
if (key?.name === 'return') {
|
|
575
|
+
if (self._suggestionIndex >= 0) {
|
|
576
|
+
const cmd = self.confirmSuggestion();
|
|
577
|
+
if (cmd) {
|
|
578
|
+
self.setLine(cmd + ' ');
|
|
579
|
+
}
|
|
580
|
+
return; // Don't submit — just confirm selection
|
|
581
|
+
}
|
|
582
|
+
// No selection — fall through to normal Enter handling
|
|
583
|
+
}
|
|
584
|
+
if (key?.name === 'escape') {
|
|
585
|
+
self.closeSuggestions();
|
|
586
|
+
// Restore original input
|
|
587
|
+
self.setLine(self._suggestionOriginalInput);
|
|
588
|
+
return;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
// Shift+Enter → insert newline (multi-line input)
|
|
592
|
+
if (key?.name === 'return' && key?.shift) {
|
|
593
|
+
self._insertNewline();
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
// Multi-line navigation: Up/Down move between lines when multi-line is active
|
|
597
|
+
if (self._multiLines.length > 1) {
|
|
598
|
+
if (key?.name === 'up' && !self._suggestionOpen && self._multiCursorLine > 0) {
|
|
599
|
+
self._switchToLine(self._multiCursorLine - 1);
|
|
600
|
+
return;
|
|
601
|
+
}
|
|
602
|
+
if (key?.name === 'down' && !self._suggestionOpen && self._multiCursorLine < self._multiLines.length - 1) {
|
|
603
|
+
self._switchToLine(self._multiCursorLine + 1);
|
|
604
|
+
return;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
// Backspace at start of line in multi-line → merge with previous line
|
|
608
|
+
if (key?.name === 'backspace' && self._multiLines.length > 1 && self._multiCursorLine > 0) {
|
|
609
|
+
if (self.cursorPos === 0) {
|
|
610
|
+
self._mergeWithPrevLine();
|
|
611
|
+
return;
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
// Paste badges are inline in the text — backspace works naturally through readline.
|
|
615
|
+
// No special handling needed — deleting marker chars removes the badge.
|
|
616
|
+
// Shift+Tab → cycle permission mode
|
|
617
|
+
if (key?.name === 'tab' && key?.shift) {
|
|
618
|
+
self.emit('shift-tab');
|
|
619
|
+
return;
|
|
620
|
+
}
|
|
621
|
+
// Tab completion (when panel is not open)
|
|
622
|
+
if (key?.name === 'tab' && !self._suggestionOpen) {
|
|
623
|
+
const line = self.currentLine;
|
|
624
|
+
if (line.startsWith('/') && self._getSuggestions) {
|
|
625
|
+
const items = self._getSuggestions(line);
|
|
626
|
+
if (items.length === 1) {
|
|
627
|
+
// Single match — complete immediately
|
|
628
|
+
self.setLine(items[0].cmd + ' ');
|
|
629
|
+
}
|
|
630
|
+
else if (items.length > 1) {
|
|
631
|
+
// Multiple matches — open panel
|
|
632
|
+
self.openSuggestions(items, line);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
// Pass to readline
|
|
638
|
+
origTtyWrite(s, key);
|
|
639
|
+
// Sync readline's line back into the multi-line array
|
|
640
|
+
self._multiLines[self._multiCursorLine] = self.currentLine;
|
|
641
|
+
// After readline processes the key, re-render and update suggestions
|
|
642
|
+
self._renderCurrentLine();
|
|
643
|
+
// Live-update suggestions while typing
|
|
644
|
+
const newLine = self.currentLine;
|
|
645
|
+
if (newLine.startsWith('/') && newLine.length >= 2 && self._getSuggestions) {
|
|
646
|
+
const items = self._getSuggestions(newLine);
|
|
647
|
+
if (items.length > 0) {
|
|
648
|
+
if (self._suggestionOpen) {
|
|
649
|
+
self.updateSuggestions(items, newLine);
|
|
650
|
+
}
|
|
651
|
+
else {
|
|
652
|
+
self.openSuggestions(items, newLine);
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
else if (self._suggestionOpen) {
|
|
656
|
+
self.closeSuggestions();
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
else if (self._suggestionOpen && !newLine.startsWith('/')) {
|
|
660
|
+
self.closeSuggestions();
|
|
661
|
+
}
|
|
662
|
+
// Emit typing event
|
|
663
|
+
self.emit('typing', newLine, self.cursorPos);
|
|
664
|
+
};
|
|
665
|
+
}
|
|
666
|
+
// ─── Private: Keypress Handling ────────────────────────────────────────
|
|
667
|
+
_registerKeypress() {
|
|
668
|
+
// Raw data handler (runs BEFORE readline) for ESC detection.
|
|
669
|
+
// Bracketed paste detection is handled by chat.ts which has full context
|
|
670
|
+
// (agentRunning state, typeAheadBuffer, etc.) and sets suppressInput
|
|
671
|
+
// to prevent readline from accumulating paste characters.
|
|
672
|
+
process.stdin.prependListener('data', (data) => {
|
|
673
|
+
const bytes = Buffer.isBuffer(data) ? data : Buffer.from(data);
|
|
674
|
+
// ── Shift+Enter / Alt+Enter → insert newline (multi-line input) ──
|
|
675
|
+
// With Kitty keyboard protocol: Shift+Enter = \x1b[13;2u, Alt+Enter = \x1b[13;3u
|
|
676
|
+
// With xterm modifyOtherKeys: Shift+Enter = \x1b[27;2;13~
|
|
677
|
+
// Legacy: Alt+Enter = \x1b\r or \x1b\n
|
|
678
|
+
// IMPORTANT: suppress readline for this event — return alone doesn't prevent
|
|
679
|
+
// other data listeners from processing these bytes through _ttyWrite.
|
|
680
|
+
const str = bytes.toString('utf8');
|
|
681
|
+
if (str === '\x1b[13;2u' || // Shift+Enter (kitty)
|
|
682
|
+
str === '\x1b[13;3u' || // Alt+Enter (kitty)
|
|
683
|
+
str === '\x1b[27;2;13~' || // Shift+Enter (xterm modifyOtherKeys)
|
|
684
|
+
str === '\x1b[27;3;13~' || // Alt+Enter (xterm modifyOtherKeys)
|
|
685
|
+
(bytes.length === 2 && bytes[0] === 0x1b && (bytes[1] === 0x0d || bytes[1] === 0x0a)) // Alt+Enter (legacy)
|
|
686
|
+
) {
|
|
687
|
+
if (this._isPrompting && !this._muted) {
|
|
688
|
+
// Suppress readline from processing these bytes as keypresses
|
|
689
|
+
this._suppressInput = true;
|
|
690
|
+
this._insertNewline();
|
|
691
|
+
setImmediate(() => { this._suppressInput = false; });
|
|
692
|
+
}
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
695
|
+
// ── ESC detection ──
|
|
696
|
+
if (bytes.length === 1 && bytes[0] === 0x1b) {
|
|
697
|
+
// ESC clears multi-line first
|
|
698
|
+
if (this._multiLines.length > 1) {
|
|
699
|
+
this._resetMultiLine();
|
|
700
|
+
this.rl.line = '';
|
|
701
|
+
this.rl.cursor = 0;
|
|
702
|
+
this._renderCurrentLine();
|
|
703
|
+
return;
|
|
704
|
+
}
|
|
705
|
+
// ESC clears paste block (before triggering escape/double-escape)
|
|
706
|
+
if (this._pasteBlock) {
|
|
707
|
+
this.clearPasteBlock();
|
|
708
|
+
return;
|
|
709
|
+
}
|
|
710
|
+
const now = Date.now();
|
|
711
|
+
if (now - this._lastEscTime < ESC_DOUBLE_THRESHOLD) {
|
|
712
|
+
this._lastEscTime = 0;
|
|
713
|
+
this.emit('double-escape');
|
|
714
|
+
return;
|
|
715
|
+
}
|
|
716
|
+
this._lastEscTime = now;
|
|
717
|
+
// Delay to check for double-ESC
|
|
718
|
+
setTimeout(() => {
|
|
719
|
+
if (this._lastEscTime === now) {
|
|
720
|
+
this.emit('escape');
|
|
721
|
+
}
|
|
722
|
+
}, ESC_DOUBLE_THRESHOLD);
|
|
723
|
+
// Don't consume — let readline handle ESC for its own purposes
|
|
724
|
+
}
|
|
725
|
+
});
|
|
726
|
+
// Keypress handler for Ctrl+C, Shift+Tab, session switching
|
|
727
|
+
process.stdin.on('keypress', (_str, key) => {
|
|
728
|
+
if (!key)
|
|
729
|
+
return;
|
|
730
|
+
// Ctrl+C handling
|
|
731
|
+
if (key.name === 'c' && key.ctrl) {
|
|
732
|
+
this._handleCtrlC();
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
});
|
|
736
|
+
}
|
|
737
|
+
// ─── Private: Line Handler ─────────────────────────────────────────────
|
|
738
|
+
_registerLineHandler() {
|
|
739
|
+
this.rl.on('line', (rawLine) => {
|
|
740
|
+
// Guard: skip phantom events from sub-menus
|
|
741
|
+
if (Date.now() < this._drainUntil)
|
|
742
|
+
return;
|
|
743
|
+
// Sync current readline line into multi-line array before assembling
|
|
744
|
+
this._multiLines[this._multiCursorLine] = rawLine;
|
|
745
|
+
// Assemble full text from all lines
|
|
746
|
+
const fullText = this._multiLines.length > 1
|
|
747
|
+
? this._multiLines.join('\n').trim()
|
|
748
|
+
: rawLine.trim();
|
|
749
|
+
// Reset multi-line state
|
|
750
|
+
this._resetMultiLine();
|
|
751
|
+
this._isPrompting = false;
|
|
752
|
+
this.screen.inputActive = false;
|
|
753
|
+
// Close suggestion panel if open
|
|
754
|
+
if (this._suggestionOpen) {
|
|
755
|
+
this.closeSuggestions();
|
|
756
|
+
}
|
|
757
|
+
// Resolve inline paste badges → replace markers with actual paste text.
|
|
758
|
+
// NOTE: Do NOT clear _pasteStore here — chat.ts has its own rl.on('line')
|
|
759
|
+
// handler that also needs to resolve badges. Store is cleared via clearPasteBlock().
|
|
760
|
+
let finalLine = this.resolveBadges(fullText);
|
|
761
|
+
this._pasteBlock = null;
|
|
762
|
+
this._pendingPasteText = null;
|
|
763
|
+
// Shrink frame if it was multi-line
|
|
764
|
+
if (this.screen.inputFrameLines > 1) {
|
|
765
|
+
this.screen.setInputFrameLines(1);
|
|
766
|
+
}
|
|
767
|
+
// Reset Ctrl+C counter
|
|
768
|
+
this._ctrlCCount = 0;
|
|
769
|
+
this.emit('submit', finalLine);
|
|
770
|
+
});
|
|
771
|
+
}
|
|
772
|
+
// ─── Private: Bracketed Paste ──────────────────────────────────────────
|
|
773
|
+
_registerBracketedPaste() {
|
|
774
|
+
// The actual paste detection happens in the raw data handler above.
|
|
775
|
+
// This is just for the non-bracketed fallback (legacy paste detection).
|
|
776
|
+
}
|
|
777
|
+
// ─── Private: Ctrl+C ──────────────────────────────────────────────────
|
|
778
|
+
_handleCtrlC() {
|
|
779
|
+
this._ctrlCCount++;
|
|
780
|
+
// If multi-line, clear all
|
|
781
|
+
if (this._multiLines.length > 1) {
|
|
782
|
+
this.clearLine();
|
|
783
|
+
this._ctrlCCount = 0;
|
|
784
|
+
return;
|
|
785
|
+
}
|
|
786
|
+
// If there's input, clear it
|
|
787
|
+
const line = this.currentLine;
|
|
788
|
+
if (line.length > 0) {
|
|
789
|
+
this.clearLine();
|
|
790
|
+
this._ctrlCCount = 0;
|
|
791
|
+
return;
|
|
792
|
+
}
|
|
793
|
+
// If paste is pending, clear it
|
|
794
|
+
if (this._pendingPasteText) {
|
|
795
|
+
this._pendingPasteText = null;
|
|
796
|
+
this.clearLine();
|
|
797
|
+
this._ctrlCCount = 0;
|
|
798
|
+
return;
|
|
799
|
+
}
|
|
800
|
+
// Empty line — emit ctrl-c for exit handling
|
|
801
|
+
this.emit('ctrl-c');
|
|
802
|
+
if (this._ctrlCTimer)
|
|
803
|
+
clearTimeout(this._ctrlCTimer);
|
|
804
|
+
this._ctrlCTimer = setTimeout(() => { this._ctrlCCount = 0; }, 2000);
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
//# sourceMappingURL=input.js.map
|