@oni.bot/core 0.6.3 → 1.0.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.
- package/CHANGELOG.md +126 -0
- package/README.md +64 -263
- package/SECURITY.md +71 -0
- package/dist/checkpointers/sqlite.d.ts.map +1 -1
- package/dist/checkpointers/sqlite.js +42 -25
- package/dist/checkpointers/sqlite.js.map +1 -1
- package/dist/circuit-breaker.d.ts +20 -0
- package/dist/circuit-breaker.d.ts.map +1 -0
- package/dist/circuit-breaker.js +58 -0
- package/dist/circuit-breaker.js.map +1 -0
- package/dist/cli/build.d.ts +11 -0
- package/dist/cli/build.d.ts.map +1 -0
- package/dist/cli/build.js +61 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/dev.d.ts +5 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/dev.js +54 -0
- package/dist/cli/dev.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 +21 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +4 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +34 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/inspect.d.ts +5 -0
- package/dist/cli/inspect.d.ts.map +1 -0
- package/dist/cli/inspect.js +85 -0
- package/dist/cli/inspect.js.map +1 -0
- package/dist/cli/router.d.ts +14 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +107 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/cli/run.d.ts +5 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +53 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/templates.d.ts +9 -0
- package/dist/cli/templates.d.ts.map +1 -0
- package/dist/cli/templates.js +159 -0
- package/dist/cli/templates.js.map +1 -0
- package/dist/cli/test.d.ts +3 -0
- package/dist/cli/test.d.ts.map +1 -0
- package/dist/cli/test.js +29 -0
- package/dist/cli/test.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +37 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +180 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +74 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +5 -0
- package/dist/config/types.js.map +1 -0
- package/dist/coordination/pubsub.d.ts +4 -0
- package/dist/coordination/pubsub.d.ts.map +1 -1
- package/dist/coordination/pubsub.js +8 -0
- package/dist/coordination/pubsub.js.map +1 -1
- package/dist/coordination/request-reply.d.ts +3 -1
- package/dist/coordination/request-reply.d.ts.map +1 -1
- package/dist/coordination/request-reply.js +11 -2
- package/dist/coordination/request-reply.js.map +1 -1
- package/dist/dlq.d.ts +17 -0
- package/dist/dlq.d.ts.map +1 -0
- package/dist/dlq.js +41 -0
- package/dist/dlq.js.map +1 -0
- package/dist/errors.d.ts +43 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +179 -8
- package/dist/errors.js.map +1 -1
- package/dist/events/bridge.d.ts +17 -0
- package/dist/events/bridge.d.ts.map +1 -0
- package/dist/events/bridge.js +67 -0
- package/dist/events/bridge.js.map +1 -0
- package/dist/events/bus.d.ts +9 -0
- package/dist/events/bus.d.ts.map +1 -1
- package/dist/events/bus.js +39 -4
- package/dist/events/bus.js.map +1 -1
- package/dist/events/index.d.ts +2 -1
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +2 -0
- package/dist/events/index.js.map +1 -1
- package/dist/events/types.d.ts +123 -1
- package/dist/events/types.d.ts.map +1 -1
- package/dist/graph.d.ts +17 -0
- package/dist/graph.d.ts.map +1 -1
- package/dist/graph.js +29 -10
- package/dist/graph.js.map +1 -1
- package/dist/guardrails/types.d.ts +1 -1
- package/dist/guardrails/types.d.ts.map +1 -1
- package/dist/harness/agent-loop.d.ts +8 -0
- package/dist/harness/agent-loop.d.ts.map +1 -0
- package/dist/harness/agent-loop.js +524 -0
- package/dist/harness/agent-loop.js.map +1 -0
- package/dist/harness/context-compactor.d.ts +92 -0
- package/dist/harness/context-compactor.d.ts.map +1 -0
- package/dist/harness/context-compactor.js +201 -0
- package/dist/harness/context-compactor.js.map +1 -0
- package/dist/harness/harness.d.ts +41 -0
- package/dist/harness/harness.d.ts.map +1 -0
- package/dist/harness/harness.js +140 -0
- package/dist/harness/harness.js.map +1 -0
- package/dist/harness/hooks-engine.d.ts +77 -0
- package/dist/harness/hooks-engine.d.ts.map +1 -0
- package/dist/harness/hooks-engine.js +232 -0
- package/dist/harness/hooks-engine.js.map +1 -0
- package/dist/harness/index.d.ts +17 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +21 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/safety-gate.d.ts +29 -0
- package/dist/harness/safety-gate.d.ts.map +1 -0
- package/dist/harness/safety-gate.js +72 -0
- package/dist/harness/safety-gate.js.map +1 -0
- package/dist/harness/skill-loader.d.ts +76 -0
- package/dist/harness/skill-loader.d.ts.map +1 -0
- package/dist/harness/skill-loader.js +244 -0
- package/dist/harness/skill-loader.js.map +1 -0
- package/dist/harness/todo-module.d.ts +39 -0
- package/dist/harness/todo-module.d.ts.map +1 -0
- package/dist/harness/todo-module.js +179 -0
- package/dist/harness/todo-module.js.map +1 -0
- package/dist/harness/types.d.ts +100 -0
- package/dist/harness/types.d.ts.map +1 -0
- package/dist/harness/types.js +9 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/harness/validate-args.d.ts +16 -0
- package/dist/harness/validate-args.d.ts.map +1 -0
- package/dist/harness/validate-args.js +132 -0
- package/dist/harness/validate-args.js.map +1 -0
- package/dist/hitl/interrupt.d.ts.map +1 -1
- package/dist/hitl/interrupt.js +7 -6
- package/dist/hitl/interrupt.js.map +1 -1
- package/dist/index.d.ts +16 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -13
- package/dist/index.js.map +1 -1
- package/dist/internal/timeout.d.ts +2 -0
- package/dist/internal/timeout.d.ts.map +1 -0
- package/dist/internal/timeout.js +16 -0
- package/dist/internal/timeout.js.map +1 -0
- package/dist/lsp/client.d.ts +70 -0
- package/dist/lsp/client.d.ts.map +1 -0
- package/dist/lsp/client.js +421 -0
- package/dist/lsp/client.js.map +1 -0
- package/dist/lsp/index.d.ts +77 -0
- package/dist/lsp/index.d.ts.map +1 -0
- package/dist/lsp/index.js +183 -0
- package/dist/lsp/index.js.map +1 -0
- package/dist/lsp/servers.d.ts +48 -0
- package/dist/lsp/servers.d.ts.map +1 -0
- package/dist/lsp/servers.js +108 -0
- package/dist/lsp/servers.js.map +1 -0
- package/dist/lsp/types.d.ts +142 -0
- package/dist/lsp/types.d.ts.map +1 -0
- package/dist/lsp/types.js +16 -0
- package/dist/lsp/types.js.map +1 -0
- package/dist/mcp/client.d.ts +56 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +170 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/convert.d.ts +26 -0
- package/dist/mcp/convert.d.ts.map +1 -0
- package/dist/mcp/convert.js +56 -0
- package/dist/mcp/convert.js.map +1 -0
- package/dist/mcp/index.d.ts +21 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +19 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/transport.d.ts +56 -0
- package/dist/mcp/transport.d.ts.map +1 -0
- package/dist/mcp/transport.js +204 -0
- package/dist/mcp/transport.js.map +1 -0
- package/dist/mcp/types.d.ts +96 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +11 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/models/anthropic.d.ts.map +1 -1
- package/dist/models/anthropic.js +78 -41
- package/dist/models/anthropic.js.map +1 -1
- package/dist/models/google.d.ts.map +1 -1
- package/dist/models/google.js +54 -52
- package/dist/models/google.js.map +1 -1
- package/dist/models/http-error.d.ts +16 -0
- package/dist/models/http-error.d.ts.map +1 -0
- package/dist/models/http-error.js +67 -0
- package/dist/models/http-error.js.map +1 -0
- package/dist/models/index.d.ts +5 -0
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +3 -0
- package/dist/models/index.js.map +1 -1
- package/dist/models/ollama.d.ts.map +1 -1
- package/dist/models/ollama.js +4 -3
- package/dist/models/ollama.js.map +1 -1
- package/dist/models/openai.d.ts.map +1 -1
- package/dist/models/openai.js +42 -45
- package/dist/models/openai.js.map +1 -1
- package/dist/models/openrouter.d.ts +26 -0
- package/dist/models/openrouter.d.ts.map +1 -0
- package/dist/models/openrouter.js +361 -0
- package/dist/models/openrouter.js.map +1 -0
- package/dist/models/sse.d.ts +9 -0
- package/dist/models/sse.d.ts.map +1 -0
- package/dist/models/sse.js +45 -0
- package/dist/models/sse.js.map +1 -0
- package/dist/models/types.d.ts +10 -0
- package/dist/models/types.d.ts.map +1 -1
- package/dist/oni-code/agent-registry.d.ts +73 -0
- package/dist/oni-code/agent-registry.d.ts.map +1 -0
- package/dist/oni-code/agent-registry.js +151 -0
- package/dist/oni-code/agent-registry.js.map +1 -0
- package/dist/oni-code/bin.d.ts +18 -0
- package/dist/oni-code/bin.d.ts.map +1 -0
- package/dist/oni-code/bin.js +78 -0
- package/dist/oni-code/bin.js.map +1 -0
- package/dist/oni-code/change-tracking.d.ts +28 -0
- package/dist/oni-code/change-tracking.d.ts.map +1 -0
- package/dist/oni-code/change-tracking.js +77 -0
- package/dist/oni-code/change-tracking.js.map +1 -0
- package/dist/oni-code/cli.d.ts +6 -0
- package/dist/oni-code/cli.d.ts.map +1 -0
- package/dist/oni-code/cli.js +30 -0
- package/dist/oni-code/cli.js.map +1 -0
- package/dist/oni-code/conductor.d.ts +203 -0
- package/dist/oni-code/conductor.d.ts.map +1 -0
- package/dist/oni-code/conductor.js +1547 -0
- package/dist/oni-code/conductor.js.map +1 -0
- package/dist/oni-code/config.d.ts +130 -0
- package/dist/oni-code/config.d.ts.map +1 -0
- package/dist/oni-code/config.js +264 -0
- package/dist/oni-code/config.js.map +1 -0
- package/dist/oni-code/context-files.d.ts +22 -0
- package/dist/oni-code/context-files.d.ts.map +1 -0
- package/dist/oni-code/context-files.js +156 -0
- package/dist/oni-code/context-files.js.map +1 -0
- package/dist/oni-code/cron/humanize.d.ts +26 -0
- package/dist/oni-code/cron/humanize.d.ts.map +1 -0
- package/dist/oni-code/cron/humanize.js +83 -0
- package/dist/oni-code/cron/humanize.js.map +1 -0
- package/dist/oni-code/cron/index.d.ts +10 -0
- package/dist/oni-code/cron/index.d.ts.map +1 -0
- package/dist/oni-code/cron/index.js +7 -0
- package/dist/oni-code/cron/index.js.map +1 -0
- package/dist/oni-code/cron/matcher.d.ts +29 -0
- package/dist/oni-code/cron/matcher.d.ts.map +1 -0
- package/dist/oni-code/cron/matcher.js +73 -0
- package/dist/oni-code/cron/matcher.js.map +1 -0
- package/dist/oni-code/cron/parser.d.ts +27 -0
- package/dist/oni-code/cron/parser.d.ts.map +1 -0
- package/dist/oni-code/cron/parser.js +149 -0
- package/dist/oni-code/cron/parser.js.map +1 -0
- package/dist/oni-code/cron/persistence.d.ts +21 -0
- package/dist/oni-code/cron/persistence.d.ts.map +1 -0
- package/dist/oni-code/cron/persistence.js +58 -0
- package/dist/oni-code/cron/persistence.js.map +1 -0
- package/dist/oni-code/cron/scheduler.d.ts +64 -0
- package/dist/oni-code/cron/scheduler.d.ts.map +1 -0
- package/dist/oni-code/cron/scheduler.js +188 -0
- package/dist/oni-code/cron/scheduler.js.map +1 -0
- package/dist/oni-code/cron/store.d.ts +46 -0
- package/dist/oni-code/cron/store.d.ts.map +1 -0
- package/dist/oni-code/cron/store.js +68 -0
- package/dist/oni-code/cron/store.js.map +1 -0
- package/dist/oni-code/env.d.ts +17 -0
- package/dist/oni-code/env.d.ts.map +1 -0
- package/dist/oni-code/env.js +51 -0
- package/dist/oni-code/env.js.map +1 -0
- package/dist/oni-code/file-reader.d.ts +28 -0
- package/dist/oni-code/file-reader.d.ts.map +1 -0
- package/dist/oni-code/file-reader.js +368 -0
- package/dist/oni-code/file-reader.js.map +1 -0
- package/dist/oni-code/file-watcher.d.ts +66 -0
- package/dist/oni-code/file-watcher.d.ts.map +1 -0
- package/dist/oni-code/file-watcher.js +167 -0
- package/dist/oni-code/file-watcher.js.map +1 -0
- package/dist/oni-code/loop-detector.d.ts +64 -0
- package/dist/oni-code/loop-detector.d.ts.map +1 -0
- package/dist/oni-code/loop-detector.js +163 -0
- package/dist/oni-code/loop-detector.js.map +1 -0
- package/dist/oni-code/permissions.d.ts +43 -0
- package/dist/oni-code/permissions.d.ts.map +1 -0
- package/dist/oni-code/permissions.js +98 -0
- package/dist/oni-code/permissions.js.map +1 -0
- package/dist/oni-code/planner.d.ts +26 -0
- package/dist/oni-code/planner.d.ts.map +1 -0
- package/dist/oni-code/planner.js +86 -0
- package/dist/oni-code/planner.js.map +1 -0
- package/dist/oni-code/plugin-loader.d.ts +103 -0
- package/dist/oni-code/plugin-loader.d.ts.map +1 -0
- package/dist/oni-code/plugin-loader.js +171 -0
- package/dist/oni-code/plugin-loader.js.map +1 -0
- package/dist/oni-code/process-tree.d.ts +44 -0
- package/dist/oni-code/process-tree.d.ts.map +1 -0
- package/dist/oni-code/process-tree.js +107 -0
- package/dist/oni-code/process-tree.js.map +1 -0
- package/dist/oni-code/progress-tracker.d.ts +40 -0
- package/dist/oni-code/progress-tracker.d.ts.map +1 -0
- package/dist/oni-code/progress-tracker.js +375 -0
- package/dist/oni-code/progress-tracker.js.map +1 -0
- package/dist/oni-code/scheduler.d.ts +56 -0
- package/dist/oni-code/scheduler.d.ts.map +1 -0
- package/dist/oni-code/scheduler.js +105 -0
- package/dist/oni-code/scheduler.js.map +1 -0
- package/dist/oni-code/session-fork.d.ts +146 -0
- package/dist/oni-code/session-fork.d.ts.map +1 -0
- package/dist/oni-code/session-fork.js +238 -0
- package/dist/oni-code/session-fork.js.map +1 -0
- package/dist/oni-code/session-stats.d.ts +72 -0
- package/dist/oni-code/session-stats.d.ts.map +1 -0
- package/dist/oni-code/session-stats.js +141 -0
- package/dist/oni-code/session-stats.js.map +1 -0
- package/dist/oni-code/session-title.d.ts +25 -0
- package/dist/oni-code/session-title.d.ts.map +1 -0
- package/dist/oni-code/session-title.js +67 -0
- package/dist/oni-code/session-title.js.map +1 -0
- package/dist/oni-code/shell-parser.d.ts +112 -0
- package/dist/oni-code/shell-parser.d.ts.map +1 -0
- package/dist/oni-code/shell-parser.js +657 -0
- package/dist/oni-code/shell-parser.js.map +1 -0
- package/dist/oni-code/summarizer.d.ts +27 -0
- package/dist/oni-code/summarizer.d.ts.map +1 -0
- package/dist/oni-code/summarizer.js +70 -0
- package/dist/oni-code/summarizer.js.map +1 -0
- package/dist/oni-code/swarm-checkpoint.d.ts +52 -0
- package/dist/oni-code/swarm-checkpoint.d.ts.map +1 -0
- package/dist/oni-code/swarm-checkpoint.js +71 -0
- package/dist/oni-code/swarm-checkpoint.js.map +1 -0
- package/dist/oni-code/swarm-runner.d.ts +173 -0
- package/dist/oni-code/swarm-runner.d.ts.map +1 -0
- package/dist/oni-code/swarm-runner.js +873 -0
- package/dist/oni-code/swarm-runner.js.map +1 -0
- package/dist/oni-code/system-prompt.d.ts +13 -0
- package/dist/oni-code/system-prompt.d.ts.map +1 -0
- package/dist/oni-code/system-prompt.js +64 -0
- package/dist/oni-code/system-prompt.js.map +1 -0
- package/dist/oni-code/task-evaluator.d.ts +73 -0
- package/dist/oni-code/task-evaluator.d.ts.map +1 -0
- package/dist/oni-code/task-evaluator.js +172 -0
- package/dist/oni-code/task-evaluator.js.map +1 -0
- package/dist/oni-code/tools/batch.d.ts +12 -0
- package/dist/oni-code/tools/batch.d.ts.map +1 -0
- package/dist/oni-code/tools/batch.js +116 -0
- package/dist/oni-code/tools/batch.js.map +1 -0
- package/dist/oni-code/tools/coding.d.ts +10 -0
- package/dist/oni-code/tools/coding.d.ts.map +1 -0
- package/dist/oni-code/tools/coding.js +557 -0
- package/dist/oni-code/tools/coding.js.map +1 -0
- package/dist/oni-code/tools/cron.d.ts +4 -0
- package/dist/oni-code/tools/cron.d.ts.map +1 -0
- package/dist/oni-code/tools/cron.js +120 -0
- package/dist/oni-code/tools/cron.js.map +1 -0
- package/dist/oni-code/tools/custom.d.ts +43 -0
- package/dist/oni-code/tools/custom.d.ts.map +1 -0
- package/dist/oni-code/tools/custom.js +115 -0
- package/dist/oni-code/tools/custom.js.map +1 -0
- package/dist/oni-code/tools/patch.d.ts +58 -0
- package/dist/oni-code/tools/patch.d.ts.map +1 -0
- package/dist/oni-code/tools/patch.js +247 -0
- package/dist/oni-code/tools/patch.js.map +1 -0
- package/dist/oni-code/tools/plan.d.ts +17 -0
- package/dist/oni-code/tools/plan.d.ts.map +1 -0
- package/dist/oni-code/tools/plan.js +48 -0
- package/dist/oni-code/tools/plan.js.map +1 -0
- package/dist/oni-code/tools/question.d.ts +17 -0
- package/dist/oni-code/tools/question.d.ts.map +1 -0
- package/dist/oni-code/tools/question.js +46 -0
- package/dist/oni-code/tools/question.js.map +1 -0
- package/dist/oni-code/tools/skill.d.ts +36 -0
- package/dist/oni-code/tools/skill.d.ts.map +1 -0
- package/dist/oni-code/tools/skill.js +132 -0
- package/dist/oni-code/tools/skill.js.map +1 -0
- package/dist/oni-code/tools/spawn-agents.d.ts +37 -0
- package/dist/oni-code/tools/spawn-agents.d.ts.map +1 -0
- package/dist/oni-code/tools/spawn-agents.js +91 -0
- package/dist/oni-code/tools/spawn-agents.js.map +1 -0
- package/dist/oni-code/tools/spawn-swarm.d.ts +70 -0
- package/dist/oni-code/tools/spawn-swarm.d.ts.map +1 -0
- package/dist/oni-code/tools/spawn-swarm.js +129 -0
- package/dist/oni-code/tools/spawn-swarm.js.map +1 -0
- package/dist/oni-code/tools/web.d.ts +11 -0
- package/dist/oni-code/tools/web.d.ts.map +1 -0
- package/dist/oni-code/tools/web.js +375 -0
- package/dist/oni-code/tools/web.js.map +1 -0
- package/dist/oni-code/topology-agent-builder.d.ts +22 -0
- package/dist/oni-code/topology-agent-builder.d.ts.map +1 -0
- package/dist/oni-code/topology-agent-builder.js +220 -0
- package/dist/oni-code/topology-agent-builder.js.map +1 -0
- package/dist/oni-code/topology-selector.d.ts +85 -0
- package/dist/oni-code/topology-selector.d.ts.map +1 -0
- package/dist/oni-code/topology-selector.js +338 -0
- package/dist/oni-code/topology-selector.js.map +1 -0
- package/dist/oni-code/ui/App.d.ts +10 -0
- package/dist/oni-code/ui/App.d.ts.map +1 -0
- package/dist/oni-code/ui/App.js +395 -0
- package/dist/oni-code/ui/App.js.map +1 -0
- package/dist/oni-code/ui/FooterPanel.d.ts +16 -0
- package/dist/oni-code/ui/FooterPanel.d.ts.map +1 -0
- package/dist/oni-code/ui/FooterPanel.js +56 -0
- package/dist/oni-code/ui/FooterPanel.js.map +1 -0
- package/dist/oni-code/ui/Header.d.ts +21 -0
- package/dist/oni-code/ui/Header.d.ts.map +1 -0
- package/dist/oni-code/ui/Header.js +105 -0
- package/dist/oni-code/ui/Header.js.map +1 -0
- package/dist/oni-code/ui/InputArea.d.ts +11 -0
- package/dist/oni-code/ui/InputArea.d.ts.map +1 -0
- package/dist/oni-code/ui/InputArea.js +82 -0
- package/dist/oni-code/ui/InputArea.js.map +1 -0
- package/dist/oni-code/ui/MessageBlock.d.ts +11 -0
- package/dist/oni-code/ui/MessageBlock.d.ts.map +1 -0
- package/dist/oni-code/ui/MessageBlock.js +103 -0
- package/dist/oni-code/ui/MessageBlock.js.map +1 -0
- package/dist/oni-code/ui/OutputPane.d.ts +12 -0
- package/dist/oni-code/ui/OutputPane.d.ts.map +1 -0
- package/dist/oni-code/ui/OutputPane.js +8 -0
- package/dist/oni-code/ui/OutputPane.js.map +1 -0
- package/dist/oni-code/ui/PermissionPrompt.d.ts +11 -0
- package/dist/oni-code/ui/PermissionPrompt.d.ts.map +1 -0
- package/dist/oni-code/ui/PermissionPrompt.js +48 -0
- package/dist/oni-code/ui/PermissionPrompt.js.map +1 -0
- package/dist/oni-code/ui/QuestionPrompt.d.ts +8 -0
- package/dist/oni-code/ui/QuestionPrompt.d.ts.map +1 -0
- package/dist/oni-code/ui/QuestionPrompt.js +9 -0
- package/dist/oni-code/ui/QuestionPrompt.js.map +1 -0
- package/dist/oni-code/ui/StatusLine.d.ts +14 -0
- package/dist/oni-code/ui/StatusLine.d.ts.map +1 -0
- package/dist/oni-code/ui/StatusLine.js +23 -0
- package/dist/oni-code/ui/StatusLine.js.map +1 -0
- package/dist/oni-code/ui/SwarmPanel.d.ts +9 -0
- package/dist/oni-code/ui/SwarmPanel.d.ts.map +1 -0
- package/dist/oni-code/ui/SwarmPanel.js +52 -0
- package/dist/oni-code/ui/SwarmPanel.js.map +1 -0
- package/dist/oni-code/ui/ToolCallBlock.d.ts +10 -0
- package/dist/oni-code/ui/ToolCallBlock.d.ts.map +1 -0
- package/dist/oni-code/ui/ToolCallBlock.js +21 -0
- package/dist/oni-code/ui/ToolCallBlock.js.map +1 -0
- package/dist/oni-code/ui/Toolbar.d.ts +8 -0
- package/dist/oni-code/ui/Toolbar.d.ts.map +1 -0
- package/dist/oni-code/ui/Toolbar.js +11 -0
- package/dist/oni-code/ui/Toolbar.js.map +1 -0
- package/dist/oni-code/ui/WelcomeBanner.d.ts +12 -0
- package/dist/oni-code/ui/WelcomeBanner.d.ts.map +1 -0
- package/dist/oni-code/ui/WelcomeBanner.js +24 -0
- package/dist/oni-code/ui/WelcomeBanner.js.map +1 -0
- package/dist/oni-code/ui/activity.d.ts +15 -0
- package/dist/oni-code/ui/activity.d.ts.map +1 -0
- package/dist/oni-code/ui/activity.js +252 -0
- package/dist/oni-code/ui/activity.js.map +1 -0
- package/dist/oni-code/ui/banner.d.ts +16 -0
- package/dist/oni-code/ui/banner.d.ts.map +1 -0
- package/dist/oni-code/ui/banner.js +132 -0
- package/dist/oni-code/ui/banner.js.map +1 -0
- package/dist/oni-code/ui/command-menu.d.ts +7 -0
- package/dist/oni-code/ui/command-menu.d.ts.map +1 -0
- package/dist/oni-code/ui/command-menu.js +20 -0
- package/dist/oni-code/ui/command-menu.js.map +1 -0
- package/dist/oni-code/ui/diff.d.ts +17 -0
- package/dist/oni-code/ui/diff.d.ts.map +1 -0
- package/dist/oni-code/ui/diff.js +37 -0
- package/dist/oni-code/ui/diff.js.map +1 -0
- package/dist/oni-code/ui/format.d.ts +41 -0
- package/dist/oni-code/ui/format.d.ts.map +1 -0
- package/dist/oni-code/ui/format.js +223 -0
- package/dist/oni-code/ui/format.js.map +1 -0
- package/dist/oni-code/ui/input.d.ts +28 -0
- package/dist/oni-code/ui/input.d.ts.map +1 -0
- package/dist/oni-code/ui/input.js +216 -0
- package/dist/oni-code/ui/input.js.map +1 -0
- package/dist/oni-code/ui/insights.d.ts +39 -0
- package/dist/oni-code/ui/insights.d.ts.map +1 -0
- package/dist/oni-code/ui/insights.js +193 -0
- package/dist/oni-code/ui/insights.js.map +1 -0
- package/dist/oni-code/ui/markdown.d.ts +9 -0
- package/dist/oni-code/ui/markdown.d.ts.map +1 -0
- package/dist/oni-code/ui/markdown.js +44 -0
- package/dist/oni-code/ui/markdown.js.map +1 -0
- package/dist/oni-code/ui/panels.d.ts +39 -0
- package/dist/oni-code/ui/panels.d.ts.map +1 -0
- package/dist/oni-code/ui/panels.js +209 -0
- package/dist/oni-code/ui/panels.js.map +1 -0
- package/dist/oni-code/ui/paste.d.ts +17 -0
- package/dist/oni-code/ui/paste.d.ts.map +1 -0
- package/dist/oni-code/ui/paste.js +45 -0
- package/dist/oni-code/ui/paste.js.map +1 -0
- package/dist/oni-code/ui/raw-spinner.d.ts +37 -0
- package/dist/oni-code/ui/raw-spinner.d.ts.map +1 -0
- package/dist/oni-code/ui/raw-spinner.js +121 -0
- package/dist/oni-code/ui/raw-spinner.js.map +1 -0
- package/dist/oni-code/ui/session.d.ts +44 -0
- package/dist/oni-code/ui/session.d.ts.map +1 -0
- package/dist/oni-code/ui/session.js +93 -0
- package/dist/oni-code/ui/session.js.map +1 -0
- package/dist/oni-code/ui/spinner.d.ts +7 -0
- package/dist/oni-code/ui/spinner.d.ts.map +1 -0
- package/dist/oni-code/ui/spinner.js +20 -0
- package/dist/oni-code/ui/spinner.js.map +1 -0
- package/dist/oni-code/ui/swarm-activity.d.ts +50 -0
- package/dist/oni-code/ui/swarm-activity.d.ts.map +1 -0
- package/dist/oni-code/ui/swarm-activity.js +233 -0
- package/dist/oni-code/ui/swarm-activity.js.map +1 -0
- package/dist/oni-code/ui/terminal-size.d.ts +18 -0
- package/dist/oni-code/ui/terminal-size.d.ts.map +1 -0
- package/dist/oni-code/ui/terminal-size.js +45 -0
- package/dist/oni-code/ui/terminal-size.js.map +1 -0
- package/dist/oni-code/ui/theme.d.ts +82 -0
- package/dist/oni-code/ui/theme.d.ts.map +1 -0
- package/dist/oni-code/ui/theme.js +101 -0
- package/dist/oni-code/ui/theme.js.map +1 -0
- package/dist/oni-code/ui/tool-utils.d.ts +10 -0
- package/dist/oni-code/ui/tool-utils.d.ts.map +1 -0
- package/dist/oni-code/ui/tool-utils.js +82 -0
- package/dist/oni-code/ui/tool-utils.js.map +1 -0
- package/dist/oni-code/ui/useTerminalSize.d.ts +3 -0
- package/dist/oni-code/ui/useTerminalSize.d.ts.map +1 -0
- package/dist/oni-code/ui/useTerminalSize.js +16 -0
- package/dist/oni-code/ui/useTerminalSize.js.map +1 -0
- package/dist/oni-code/workspace/change-tracker.d.ts +18 -0
- package/dist/oni-code/workspace/change-tracker.d.ts.map +1 -0
- package/dist/oni-code/workspace/change-tracker.js +67 -0
- package/dist/oni-code/workspace/change-tracker.js.map +1 -0
- package/dist/oni-code/workspace/conflict-detector.d.ts +12 -0
- package/dist/oni-code/workspace/conflict-detector.d.ts.map +1 -0
- package/dist/oni-code/workspace/conflict-detector.js +24 -0
- package/dist/oni-code/workspace/conflict-detector.js.map +1 -0
- package/dist/oni-code/workspace/file-snapshots.d.ts +39 -0
- package/dist/oni-code/workspace/file-snapshots.d.ts.map +1 -0
- package/dist/oni-code/workspace/file-snapshots.js +77 -0
- package/dist/oni-code/workspace/file-snapshots.js.map +1 -0
- package/dist/oni-code/workspace/index.d.ts +5 -0
- package/dist/oni-code/workspace/index.d.ts.map +1 -0
- package/dist/oni-code/workspace/index.js +5 -0
- package/dist/oni-code/workspace/index.js.map +1 -0
- package/dist/oni-code/workspace/project-map.d.ts +14 -0
- package/dist/oni-code/workspace/project-map.d.ts.map +1 -0
- package/dist/oni-code/workspace/project-map.js +91 -0
- package/dist/oni-code/workspace/project-map.js.map +1 -0
- package/dist/prebuilt/tool-node.d.ts.map +1 -1
- package/dist/prebuilt/tool-node.js +0 -1
- package/dist/prebuilt/tool-node.js.map +1 -1
- package/dist/pregel.d.ts +15 -1
- package/dist/pregel.d.ts.map +1 -1
- package/dist/pregel.js +199 -51
- package/dist/pregel.js.map +1 -1
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +16 -4
- package/dist/retry.js.map +1 -1
- package/dist/sentinel/config/index.d.ts +2 -0
- package/dist/sentinel/config/index.d.ts.map +1 -0
- package/dist/sentinel/config/index.js +2 -0
- package/dist/sentinel/config/index.js.map +1 -0
- package/dist/sentinel/config/schema.d.ts +4 -0
- package/dist/sentinel/config/schema.d.ts.map +1 -0
- package/dist/sentinel/config/schema.js +42 -0
- package/dist/sentinel/config/schema.js.map +1 -0
- package/dist/sentinel/debate/index.d.ts +6 -0
- package/dist/sentinel/debate/index.d.ts.map +1 -0
- package/dist/sentinel/debate/index.js +64 -0
- package/dist/sentinel/debate/index.js.map +1 -0
- package/dist/sentinel/debate/prompts.d.ts +4 -0
- package/dist/sentinel/debate/prompts.d.ts.map +1 -0
- package/dist/sentinel/debate/prompts.js +13 -0
- package/dist/sentinel/debate/prompts.js.map +1 -0
- package/dist/sentinel/fix/index.d.ts +6 -0
- package/dist/sentinel/fix/index.d.ts.map +1 -0
- package/dist/sentinel/fix/index.js +27 -0
- package/dist/sentinel/fix/index.js.map +1 -0
- package/dist/sentinel/fix/strategies.d.ts +9 -0
- package/dist/sentinel/fix/strategies.d.ts.map +1 -0
- package/dist/sentinel/fix/strategies.js +40 -0
- package/dist/sentinel/fix/strategies.js.map +1 -0
- package/dist/sentinel/index.d.ts +14 -0
- package/dist/sentinel/index.d.ts.map +1 -0
- package/dist/sentinel/index.js +22 -0
- package/dist/sentinel/index.js.map +1 -0
- package/dist/sentinel/integrations/cli.d.ts +10 -0
- package/dist/sentinel/integrations/cli.d.ts.map +1 -0
- package/dist/sentinel/integrations/cli.js +24 -0
- package/dist/sentinel/integrations/cli.js.map +1 -0
- package/dist/sentinel/integrations/index.d.ts +2 -0
- package/dist/sentinel/integrations/index.d.ts.map +1 -0
- package/dist/sentinel/integrations/index.js +2 -0
- package/dist/sentinel/integrations/index.js.map +1 -0
- package/dist/sentinel/memory/index.d.ts +16 -0
- package/dist/sentinel/memory/index.d.ts.map +1 -0
- package/dist/sentinel/memory/index.js +60 -0
- package/dist/sentinel/memory/index.js.map +1 -0
- package/dist/sentinel/report/console.d.ts +3 -0
- package/dist/sentinel/report/console.d.ts.map +1 -0
- package/dist/sentinel/report/console.js +27 -0
- package/dist/sentinel/report/console.js.map +1 -0
- package/dist/sentinel/report/github.d.ts +3 -0
- package/dist/sentinel/report/github.d.ts.map +1 -0
- package/dist/sentinel/report/github.js +36 -0
- package/dist/sentinel/report/github.js.map +1 -0
- package/dist/sentinel/report/index.d.ts +6 -0
- package/dist/sentinel/report/index.d.ts.map +1 -0
- package/dist/sentinel/report/index.js +15 -0
- package/dist/sentinel/report/index.js.map +1 -0
- package/dist/sentinel/report/sarif.d.ts +3 -0
- package/dist/sentinel/report/sarif.d.ts.map +1 -0
- package/dist/sentinel/report/sarif.js +29 -0
- package/dist/sentinel/report/sarif.js.map +1 -0
- package/dist/sentinel/sentinel.d.ts +17 -0
- package/dist/sentinel/sentinel.d.ts.map +1 -0
- package/dist/sentinel/sentinel.js +111 -0
- package/dist/sentinel/sentinel.js.map +1 -0
- package/dist/sentinel/swarm/agents.d.ts +6 -0
- package/dist/sentinel/swarm/agents.d.ts.map +1 -0
- package/dist/sentinel/swarm/agents.js +36 -0
- package/dist/sentinel/swarm/agents.js.map +1 -0
- package/dist/sentinel/swarm/index.d.ts +8 -0
- package/dist/sentinel/swarm/index.d.ts.map +1 -0
- package/dist/sentinel/swarm/index.js +74 -0
- package/dist/sentinel/swarm/index.js.map +1 -0
- package/dist/sentinel/swarm/prompts.d.ts +2 -0
- package/dist/sentinel/swarm/prompts.d.ts.map +1 -0
- package/dist/sentinel/swarm/prompts.js +24 -0
- package/dist/sentinel/swarm/prompts.js.map +1 -0
- package/dist/sentinel/swarm/topology.d.ts +10 -0
- package/dist/sentinel/swarm/topology.d.ts.map +1 -0
- package/dist/sentinel/swarm/topology.js +38 -0
- package/dist/sentinel/swarm/topology.js.map +1 -0
- package/dist/sentinel/triage/analyzers/complexity-analyzer.d.ts +7 -0
- package/dist/sentinel/triage/analyzers/complexity-analyzer.d.ts.map +1 -0
- package/dist/sentinel/triage/analyzers/complexity-analyzer.js +94 -0
- package/dist/sentinel/triage/analyzers/complexity-analyzer.js.map +1 -0
- package/dist/sentinel/triage/analyzers/custom-analyzer.d.ts +19 -0
- package/dist/sentinel/triage/analyzers/custom-analyzer.d.ts.map +1 -0
- package/dist/sentinel/triage/analyzers/custom-analyzer.js +268 -0
- package/dist/sentinel/triage/analyzers/custom-analyzer.js.map +1 -0
- package/dist/sentinel/triage/analyzers/dependency-analyzer.d.ts +26 -0
- package/dist/sentinel/triage/analyzers/dependency-analyzer.d.ts.map +1 -0
- package/dist/sentinel/triage/analyzers/dependency-analyzer.js +220 -0
- package/dist/sentinel/triage/analyzers/dependency-analyzer.js.map +1 -0
- package/dist/sentinel/triage/analyzers/diff-analyzer.d.ts +12 -0
- package/dist/sentinel/triage/analyzers/diff-analyzer.d.ts.map +1 -0
- package/dist/sentinel/triage/analyzers/diff-analyzer.js +19 -0
- package/dist/sentinel/triage/analyzers/diff-analyzer.js.map +1 -0
- package/dist/sentinel/triage/analyzers/index.d.ts +14 -0
- package/dist/sentinel/triage/analyzers/index.d.ts.map +1 -0
- package/dist/sentinel/triage/analyzers/index.js +25 -0
- package/dist/sentinel/triage/analyzers/index.js.map +1 -0
- package/dist/sentinel/triage/analyzers/pattern-analyzer.d.ts +7 -0
- package/dist/sentinel/triage/analyzers/pattern-analyzer.d.ts.map +1 -0
- package/dist/sentinel/triage/analyzers/pattern-analyzer.js +180 -0
- package/dist/sentinel/triage/analyzers/pattern-analyzer.js.map +1 -0
- package/dist/sentinel/triage/analyzers/security-analyzer.d.ts +7 -0
- package/dist/sentinel/triage/analyzers/security-analyzer.d.ts.map +1 -0
- package/dist/sentinel/triage/analyzers/security-analyzer.js +96 -0
- package/dist/sentinel/triage/analyzers/security-analyzer.js.map +1 -0
- package/dist/sentinel/triage/analyzers/ts-parser.d.ts +71 -0
- package/dist/sentinel/triage/analyzers/ts-parser.d.ts.map +1 -0
- package/dist/sentinel/triage/analyzers/ts-parser.js +323 -0
- package/dist/sentinel/triage/analyzers/ts-parser.js.map +1 -0
- package/dist/sentinel/triage/analyzers/typescript-analyzer.d.ts +7 -0
- package/dist/sentinel/triage/analyzers/typescript-analyzer.d.ts.map +1 -0
- package/dist/sentinel/triage/analyzers/typescript-analyzer.js +68 -0
- package/dist/sentinel/triage/analyzers/typescript-analyzer.js.map +1 -0
- package/dist/sentinel/triage/index.d.ts +10 -0
- package/dist/sentinel/triage/index.d.ts.map +1 -0
- package/dist/sentinel/triage/index.js +39 -0
- package/dist/sentinel/triage/index.js.map +1 -0
- package/dist/sentinel/triage/scorer.d.ts +9 -0
- package/dist/sentinel/triage/scorer.d.ts.map +1 -0
- package/dist/sentinel/triage/scorer.js +28 -0
- package/dist/sentinel/triage/scorer.js.map +1 -0
- package/dist/sentinel/types.d.ts +125 -0
- package/dist/sentinel/types.d.ts.map +1 -0
- package/dist/sentinel/types.js +6 -0
- package/dist/sentinel/types.js.map +1 -0
- package/dist/store/index.d.ts +5 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +24 -1
- package/dist/store/index.js.map +1 -1
- package/dist/stream-events.js +2 -2
- package/dist/stream-events.js.map +1 -1
- package/dist/streaming.d.ts +13 -0
- package/dist/streaming.d.ts.map +1 -1
- package/dist/streaming.js +42 -0
- package/dist/streaming.js.map +1 -1
- package/dist/swarm/graph.d.ts +81 -2
- package/dist/swarm/graph.d.ts.map +1 -1
- package/dist/swarm/graph.js +517 -36
- package/dist/swarm/graph.js.map +1 -1
- package/dist/swarm/index.d.ts +10 -2
- package/dist/swarm/index.d.ts.map +1 -1
- package/dist/swarm/index.js +6 -1
- package/dist/swarm/index.js.map +1 -1
- package/dist/swarm/mermaid.d.ts +10 -0
- package/dist/swarm/mermaid.d.ts.map +1 -0
- package/dist/swarm/mermaid.js +64 -0
- package/dist/swarm/mermaid.js.map +1 -0
- package/dist/swarm/pool.d.ts +9 -1
- package/dist/swarm/pool.d.ts.map +1 -1
- package/dist/swarm/pool.js +58 -10
- package/dist/swarm/pool.js.map +1 -1
- package/dist/swarm/registry.d.ts +11 -1
- package/dist/swarm/registry.d.ts.map +1 -1
- package/dist/swarm/registry.js +17 -3
- package/dist/swarm/registry.js.map +1 -1
- package/dist/swarm/scaling.d.ts +95 -0
- package/dist/swarm/scaling.d.ts.map +1 -0
- package/dist/swarm/scaling.js +214 -0
- package/dist/swarm/scaling.js.map +1 -0
- package/dist/swarm/snapshot.d.ts +51 -0
- package/dist/swarm/snapshot.d.ts.map +1 -0
- package/dist/swarm/snapshot.js +115 -0
- package/dist/swarm/snapshot.js.map +1 -0
- package/dist/swarm/supervisor.d.ts.map +1 -1
- package/dist/swarm/supervisor.js +82 -4
- package/dist/swarm/supervisor.js.map +1 -1
- package/dist/swarm/tracer.d.ts +57 -0
- package/dist/swarm/tracer.d.ts.map +1 -0
- package/dist/swarm/tracer.js +138 -0
- package/dist/swarm/tracer.js.map +1 -0
- package/dist/swarm/types.d.ts +23 -1
- package/dist/swarm/types.d.ts.map +1 -1
- package/dist/swarm/types.js.map +1 -1
- package/dist/telemetry.d.ts +41 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +69 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/testing/index.d.ts +33 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +95 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tools/types.d.ts +2 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +160 -108
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loop Detector — detects when the agent is stuck in repetitive tool call patterns.
|
|
3
|
+
*
|
|
4
|
+
* Two detection modes:
|
|
5
|
+
* 1. **Identical call detection** — same tool + same args repeated N times
|
|
6
|
+
* 2. **Tool spam detection** — same mutating tool called too many times consecutively
|
|
7
|
+
*
|
|
8
|
+
* Read-only tools (read_file, grep, glob, project_map) are exempt from spam
|
|
9
|
+
* detection since reading many files is normal exploration behavior.
|
|
10
|
+
*/
|
|
11
|
+
export interface LoopDetectorConfig {
|
|
12
|
+
/** How many identical calls before blocking (default 3) */
|
|
13
|
+
identicalThreshold?: number;
|
|
14
|
+
/** How many consecutive same-tool calls before blocking (default 6) */
|
|
15
|
+
spamThreshold?: number;
|
|
16
|
+
/** How many recent calls to track (default 20) */
|
|
17
|
+
windowSize?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface CheckResult {
|
|
20
|
+
blocked: boolean;
|
|
21
|
+
reason?: string;
|
|
22
|
+
/** The type of loop detected: 'identical' (same tool+args) or 'spam' (same tool, different args) */
|
|
23
|
+
type?: "identical" | "spam";
|
|
24
|
+
}
|
|
25
|
+
export declare class LoopDetector {
|
|
26
|
+
private readonly identicalThreshold;
|
|
27
|
+
private readonly spamThreshold;
|
|
28
|
+
private readonly windowSize;
|
|
29
|
+
/**
|
|
30
|
+
* Circular buffer for call history — avoids O(N) Array.shift() on every
|
|
31
|
+
* call once the window is full. writeIdx always points to the next write
|
|
32
|
+
* slot; count tracks how many slots are occupied (≤ windowSize).
|
|
33
|
+
*/
|
|
34
|
+
private readonly ring;
|
|
35
|
+
private writeIdx;
|
|
36
|
+
private count;
|
|
37
|
+
private hashCounts;
|
|
38
|
+
private totalCalls;
|
|
39
|
+
private blockedCount;
|
|
40
|
+
private toolTotals;
|
|
41
|
+
constructor(config?: LoopDetectorConfig);
|
|
42
|
+
/**
|
|
43
|
+
* Check whether a tool call should be blocked.
|
|
44
|
+
* Also records the call in history.
|
|
45
|
+
*/
|
|
46
|
+
check(tool: string, args: Record<string, unknown>): CheckResult;
|
|
47
|
+
/** Reset all state */
|
|
48
|
+
reset(): void;
|
|
49
|
+
/**
|
|
50
|
+
* Allow one more cycle of a specific tool+args combo.
|
|
51
|
+
* Called when the user approves a doom loop escalation — resets the count
|
|
52
|
+
* for this exact tool+args hash so the next identicalThreshold calls are allowed.
|
|
53
|
+
*/
|
|
54
|
+
allowOnce(tool: string, args: Record<string, unknown>): void;
|
|
55
|
+
/** Get summary statistics */
|
|
56
|
+
getStats(): {
|
|
57
|
+
totalCalls: number;
|
|
58
|
+
blockedCount: number;
|
|
59
|
+
toolCounts: Record<string, number>;
|
|
60
|
+
};
|
|
61
|
+
private record;
|
|
62
|
+
private countConsecutiveSameTool;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=loop-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-detector.d.ts","sourceRoot":"","sources":["../../src/oni-code/loop-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,kBAAkB;IACjC,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oGAAoG;IACpG,IAAI,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;CAC7B;AAqCD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IACrD,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAAK;IAElB,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAA6B;gBAEnC,MAAM,GAAE,kBAAuB;IAO3C;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAoC/D,sBAAsB;IACtB,KAAK,IAAI,IAAI;IAUb;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAK5D,6BAA6B;IAC7B,QAAQ,IAAI;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACpC;IAcD,OAAO,CAAC,MAAM;IAuBd,OAAO,CAAC,wBAAwB;CAajC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loop Detector — detects when the agent is stuck in repetitive tool call patterns.
|
|
3
|
+
*
|
|
4
|
+
* Two detection modes:
|
|
5
|
+
* 1. **Identical call detection** — same tool + same args repeated N times
|
|
6
|
+
* 2. **Tool spam detection** — same mutating tool called too many times consecutively
|
|
7
|
+
*
|
|
8
|
+
* Read-only tools (read_file, grep, glob, project_map) are exempt from spam
|
|
9
|
+
* detection since reading many files is normal exploration behavior.
|
|
10
|
+
*/
|
|
11
|
+
// ── Constants ────────────────────────────────────────────────
|
|
12
|
+
const READ_ONLY_TOOLS = new Set([
|
|
13
|
+
"read_file",
|
|
14
|
+
"grep",
|
|
15
|
+
"glob",
|
|
16
|
+
"project_map",
|
|
17
|
+
"git",
|
|
18
|
+
"list_dir",
|
|
19
|
+
"list_changes",
|
|
20
|
+
"undo_edit",
|
|
21
|
+
"webfetch",
|
|
22
|
+
"websearch",
|
|
23
|
+
]);
|
|
24
|
+
// ── Helpers ──────────────────────────────────────────────────
|
|
25
|
+
/**
|
|
26
|
+
* Stable JSON hash — sorts keys so {a:1, b:2} === {b:2, a:1}
|
|
27
|
+
*/
|
|
28
|
+
function stableHash(tool, args) {
|
|
29
|
+
const sorted = Object.keys(args)
|
|
30
|
+
.sort()
|
|
31
|
+
.map((k) => `${k}:${JSON.stringify(args[k])}`)
|
|
32
|
+
.join("|");
|
|
33
|
+
return `${tool}::${sorted}`;
|
|
34
|
+
}
|
|
35
|
+
// ── LoopDetector ─────────────────────────────────────────────
|
|
36
|
+
export class LoopDetector {
|
|
37
|
+
identicalThreshold;
|
|
38
|
+
spamThreshold;
|
|
39
|
+
windowSize;
|
|
40
|
+
/**
|
|
41
|
+
* Circular buffer for call history — avoids O(N) Array.shift() on every
|
|
42
|
+
* call once the window is full. writeIdx always points to the next write
|
|
43
|
+
* slot; count tracks how many slots are occupied (≤ windowSize).
|
|
44
|
+
*/
|
|
45
|
+
ring;
|
|
46
|
+
writeIdx = 0;
|
|
47
|
+
count = 0;
|
|
48
|
+
hashCounts = new Map();
|
|
49
|
+
totalCalls = 0;
|
|
50
|
+
blockedCount = 0;
|
|
51
|
+
toolTotals = new Map();
|
|
52
|
+
constructor(config = {}) {
|
|
53
|
+
this.identicalThreshold = config.identicalThreshold ?? 3;
|
|
54
|
+
this.spamThreshold = config.spamThreshold ?? 6;
|
|
55
|
+
this.windowSize = config.windowSize ?? 20;
|
|
56
|
+
this.ring = new Array(this.windowSize);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check whether a tool call should be blocked.
|
|
60
|
+
* Also records the call in history.
|
|
61
|
+
*/
|
|
62
|
+
check(tool, args) {
|
|
63
|
+
const hash = stableHash(tool, args);
|
|
64
|
+
const currentCount = (this.hashCounts.get(hash) ?? 0) + 1;
|
|
65
|
+
const isReadOnly = READ_ONLY_TOOLS.has(tool);
|
|
66
|
+
// Check identical call threshold (read-only tools are exempt —
|
|
67
|
+
// re-reading a file after editing it is a normal verify pattern)
|
|
68
|
+
if (!isReadOnly && currentCount > this.identicalThreshold) {
|
|
69
|
+
this.blockedCount++;
|
|
70
|
+
this.record(tool, hash, currentCount);
|
|
71
|
+
return {
|
|
72
|
+
blocked: true,
|
|
73
|
+
type: "identical",
|
|
74
|
+
reason: `Loop detected: ${tool} called ${currentCount} times with identical arguments. Try a different approach.`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// Check tool spam (only for mutating tools)
|
|
78
|
+
if (!isReadOnly) {
|
|
79
|
+
const consecutiveCount = this.countConsecutiveSameTool(tool);
|
|
80
|
+
if (consecutiveCount >= this.spamThreshold) {
|
|
81
|
+
this.blockedCount++;
|
|
82
|
+
this.record(tool, hash, currentCount);
|
|
83
|
+
return {
|
|
84
|
+
blocked: true,
|
|
85
|
+
type: "spam",
|
|
86
|
+
reason: `Tool spam detected: ${tool} called ${consecutiveCount + 1} consecutive times. Step back and try a different approach.`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Record and allow
|
|
91
|
+
this.record(tool, hash, currentCount);
|
|
92
|
+
return { blocked: false };
|
|
93
|
+
}
|
|
94
|
+
/** Reset all state */
|
|
95
|
+
reset() {
|
|
96
|
+
this.ring.fill(undefined);
|
|
97
|
+
this.writeIdx = 0;
|
|
98
|
+
this.count = 0;
|
|
99
|
+
this.hashCounts.clear();
|
|
100
|
+
this.totalCalls = 0;
|
|
101
|
+
this.blockedCount = 0;
|
|
102
|
+
this.toolTotals.clear();
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Allow one more cycle of a specific tool+args combo.
|
|
106
|
+
* Called when the user approves a doom loop escalation — resets the count
|
|
107
|
+
* for this exact tool+args hash so the next identicalThreshold calls are allowed.
|
|
108
|
+
*/
|
|
109
|
+
allowOnce(tool, args) {
|
|
110
|
+
const hash = stableHash(tool, args);
|
|
111
|
+
this.hashCounts.delete(hash);
|
|
112
|
+
}
|
|
113
|
+
/** Get summary statistics */
|
|
114
|
+
getStats() {
|
|
115
|
+
const toolCounts = {};
|
|
116
|
+
for (const [tool, count] of this.toolTotals) {
|
|
117
|
+
toolCounts[tool] = count;
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
totalCalls: this.totalCalls,
|
|
121
|
+
blockedCount: this.blockedCount,
|
|
122
|
+
toolCounts,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
// ── Private ──────────────────────────────────────────────────
|
|
126
|
+
record(tool, hash, count) {
|
|
127
|
+
this.hashCounts.set(hash, count);
|
|
128
|
+
this.totalCalls++;
|
|
129
|
+
this.toolTotals.set(tool, (this.toolTotals.get(tool) ?? 0) + 1);
|
|
130
|
+
// Evict oldest entry if window is full (O(1) overwrite vs O(N) shift)
|
|
131
|
+
if (this.count >= this.windowSize) {
|
|
132
|
+
const evicted = this.ring[this.writeIdx];
|
|
133
|
+
const oldCount = this.hashCounts.get(evicted.hash) ?? 0;
|
|
134
|
+
if (oldCount <= 1) {
|
|
135
|
+
this.hashCounts.delete(evicted.hash);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
this.hashCounts.set(evicted.hash, oldCount - 1);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
this.count++;
|
|
143
|
+
}
|
|
144
|
+
// Write to current slot and advance pointer
|
|
145
|
+
this.ring[this.writeIdx] = { tool, hash };
|
|
146
|
+
this.writeIdx = (this.writeIdx + 1) % this.windowSize;
|
|
147
|
+
}
|
|
148
|
+
countConsecutiveSameTool(tool) {
|
|
149
|
+
let count = 0;
|
|
150
|
+
// Walk backward from the most recent entry in the circular buffer
|
|
151
|
+
for (let n = 0; n < this.count; n++) {
|
|
152
|
+
const idx = (this.writeIdx - 1 - n + this.windowSize) % this.windowSize;
|
|
153
|
+
if (this.ring[idx].tool === tool) {
|
|
154
|
+
count++;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return count;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=loop-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-detector.js","sourceRoot":"","sources":["../../src/oni-code/loop-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Manager — controls whether tool calls need user approval.
|
|
3
|
+
*
|
|
4
|
+
* Two modes:
|
|
5
|
+
* - **interactive** (default): conservative — most tools require approval
|
|
6
|
+
* - **auto**: permissive — only destructive git ops require approval
|
|
7
|
+
*
|
|
8
|
+
* Read-only tools are always auto-approved in both modes.
|
|
9
|
+
* Destructive git operations always require approval in both modes.
|
|
10
|
+
*/
|
|
11
|
+
export type PermissionMode = "interactive" | "auto";
|
|
12
|
+
export type PermissionDecision = "allow" | "deny" | "always_allow";
|
|
13
|
+
export interface PermissionConfig {
|
|
14
|
+
mode?: PermissionMode;
|
|
15
|
+
alwaysAllow?: string[];
|
|
16
|
+
rules?: Array<{
|
|
17
|
+
tool: string;
|
|
18
|
+
action: "allow" | "deny";
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export declare class PermissionManager {
|
|
22
|
+
private mode;
|
|
23
|
+
private alwaysAllowed;
|
|
24
|
+
private denyRules;
|
|
25
|
+
constructor(mode?: PermissionMode, _rootDir?: string);
|
|
26
|
+
addRulesFromConfig(config: PermissionConfig): void;
|
|
27
|
+
getMode(): PermissionMode;
|
|
28
|
+
setMode(mode: PermissionMode): void;
|
|
29
|
+
addAlwaysAllow(toolName: string): void;
|
|
30
|
+
clearAlwaysAllow(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Returns `true` if the tool call requires user approval.
|
|
33
|
+
*
|
|
34
|
+
* Rules (evaluated in order):
|
|
35
|
+
* 1. Read-only tools → never need approval
|
|
36
|
+
* 2. Destructive git ops → always need approval
|
|
37
|
+
* 3. Always-allowed tools → no approval needed
|
|
38
|
+
* 4. Interactive mode → everything else needs approval
|
|
39
|
+
* 5. Auto mode → everything else is auto-approved
|
|
40
|
+
*/
|
|
41
|
+
needsApproval(toolName: string, input: Record<string, unknown>): boolean;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/oni-code/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,MAAM,CAAC;AAEpD,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,GAAG,cAAc,CAAC;AAEnE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3D;AAgCD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,SAAS,CAAqB;gBAE1B,IAAI,GAAE,cAA8B,EAAE,QAAQ,CAAC,EAAE,MAAM;IAInE,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAalD,OAAO,IAAI,cAAc;IAIzB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAInC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAItC,gBAAgB,IAAI,IAAI;IAIxB;;;;;;;;;OASG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;CAmBzE"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Manager — controls whether tool calls need user approval.
|
|
3
|
+
*
|
|
4
|
+
* Two modes:
|
|
5
|
+
* - **interactive** (default): conservative — most tools require approval
|
|
6
|
+
* - **auto**: permissive — only destructive git ops require approval
|
|
7
|
+
*
|
|
8
|
+
* Read-only tools are always auto-approved in both modes.
|
|
9
|
+
* Destructive git operations always require approval in both modes.
|
|
10
|
+
*/
|
|
11
|
+
// ── Constants ────────────────────────────────────────────────
|
|
12
|
+
const READ_TOOLS = new Set([
|
|
13
|
+
"read_file",
|
|
14
|
+
"grep",
|
|
15
|
+
"glob",
|
|
16
|
+
"git_status",
|
|
17
|
+
"project_map",
|
|
18
|
+
]);
|
|
19
|
+
const DESTRUCTIVE_GIT_PATTERNS = [
|
|
20
|
+
/push\s+--force/,
|
|
21
|
+
/push\s+-f\b/,
|
|
22
|
+
/reset\s+--hard/,
|
|
23
|
+
/branch\s+-[dD]\b/,
|
|
24
|
+
/checkout\s+--\s/,
|
|
25
|
+
/clean\s+-f/,
|
|
26
|
+
/rebase/,
|
|
27
|
+
];
|
|
28
|
+
// ── Helpers ──────────────────────────────────────────────────
|
|
29
|
+
function isDestructiveGit(input) {
|
|
30
|
+
const text = String(input.command ?? input.args ?? "");
|
|
31
|
+
if (!text)
|
|
32
|
+
return false;
|
|
33
|
+
return DESTRUCTIVE_GIT_PATTERNS.some((pattern) => pattern.test(text));
|
|
34
|
+
}
|
|
35
|
+
// ── PermissionManager ────────────────────────────────────────
|
|
36
|
+
export class PermissionManager {
|
|
37
|
+
mode;
|
|
38
|
+
alwaysAllowed = new Set();
|
|
39
|
+
denyRules = new Set();
|
|
40
|
+
constructor(mode = "interactive", _rootDir) {
|
|
41
|
+
this.mode = mode;
|
|
42
|
+
}
|
|
43
|
+
addRulesFromConfig(config) {
|
|
44
|
+
if (config.mode)
|
|
45
|
+
this.mode = config.mode;
|
|
46
|
+
if (config.alwaysAllow) {
|
|
47
|
+
for (const tool of config.alwaysAllow)
|
|
48
|
+
this.alwaysAllowed.add(tool);
|
|
49
|
+
}
|
|
50
|
+
if (config.rules) {
|
|
51
|
+
for (const rule of config.rules) {
|
|
52
|
+
if (rule.action === "allow")
|
|
53
|
+
this.alwaysAllowed.add(rule.tool);
|
|
54
|
+
else if (rule.action === "deny")
|
|
55
|
+
this.denyRules.add(rule.tool);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
getMode() {
|
|
60
|
+
return this.mode;
|
|
61
|
+
}
|
|
62
|
+
setMode(mode) {
|
|
63
|
+
this.mode = mode;
|
|
64
|
+
}
|
|
65
|
+
addAlwaysAllow(toolName) {
|
|
66
|
+
this.alwaysAllowed.add(toolName);
|
|
67
|
+
}
|
|
68
|
+
clearAlwaysAllow() {
|
|
69
|
+
this.alwaysAllowed.clear();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Returns `true` if the tool call requires user approval.
|
|
73
|
+
*
|
|
74
|
+
* Rules (evaluated in order):
|
|
75
|
+
* 1. Read-only tools → never need approval
|
|
76
|
+
* 2. Destructive git ops → always need approval
|
|
77
|
+
* 3. Always-allowed tools → no approval needed
|
|
78
|
+
* 4. Interactive mode → everything else needs approval
|
|
79
|
+
* 5. Auto mode → everything else is auto-approved
|
|
80
|
+
*/
|
|
81
|
+
needsApproval(toolName, input) {
|
|
82
|
+
// Rule 1: read-only tools are always auto-approved
|
|
83
|
+
if (READ_TOOLS.has(toolName)) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
// Rule 2: destructive git ops always require approval
|
|
87
|
+
if (isDestructiveGit(input)) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
// Rule 3: user said "always allow" for this tool
|
|
91
|
+
if (this.alwaysAllowed.has(toolName)) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
// Rule 4 & 5: mode-dependent
|
|
95
|
+
return this.mode === "interactive";
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/oni-code/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH,gEAAgE;AAEhE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,WAAW;IACX,MAAM;IACN,MAAM;IACN,YAAY;IACZ,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAa;IACzC,gBAAgB;IAChB,aAAa;IACb,gBAAgB;IAChB,kBAAkB;IAClB,iBAAiB;IACjB,YAAY;IACZ,QAAQ;CACT,CAAC;AAEF,gEAAgE;AAEhE,SAAS,gBAAgB,CAAC,KAA8B;IACtD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,gEAAgE;AAEhE,MAAM,OAAO,iBAAiB;IACpB,IAAI,CAAiB;IACrB,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,YAAY,OAAuB,aAAa,EAAE,QAAiB;QACjE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,kBAAkB,CAAC,MAAwB;QACzC,IAAI,MAAM,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW;gBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAChC,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;oBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;oBAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,IAAoB;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,cAAc,CAAC,QAAgB;QAC7B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED;;;;;;;;;OASG;IACH,aAAa,CAAC,QAAgB,EAAE,KAA8B;QAC5D,mDAAmD;QACnD,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,sDAAsD;QACtD,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,iDAAiD;QACjD,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,6BAA6B;QAC7B,OAAO,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type ExecutionMode = "direct" | "subagent" | `swarm:${string}`;
|
|
2
|
+
interface Subtask {
|
|
3
|
+
id: string;
|
|
4
|
+
description: string;
|
|
5
|
+
estimatedFiles: string[];
|
|
6
|
+
dependsOn?: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface PlanInput {
|
|
9
|
+
task: string;
|
|
10
|
+
subtasks: Subtask[];
|
|
11
|
+
}
|
|
12
|
+
export interface ExecutionPlan {
|
|
13
|
+
task: string;
|
|
14
|
+
mode: "direct" | "subagent" | "swarm";
|
|
15
|
+
topology?: string;
|
|
16
|
+
execution: "parallel" | "sequential" | "single";
|
|
17
|
+
subtasks: Subtask[];
|
|
18
|
+
conflicts: Array<{
|
|
19
|
+
file: string;
|
|
20
|
+
tasks: string[];
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
export declare function classifyTask(task: string): ExecutionMode;
|
|
24
|
+
export declare function buildExecutionPlan(input: PlanInput): ExecutionPlan;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=planner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../src/oni-code/planner.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,MAAM,EAAE,CAAC;AAEtE,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,UAAU,GAAG,YAAY,GAAG,QAAQ,CAAC;IAChD,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACrD;AAqCD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAKxD;AAMD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,aAAa,CAkDlE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { ConflictDetector, } from "./workspace/conflict-detector.js";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Pattern tables
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
const DEBATE_PATTERNS = [
|
|
6
|
+
/\bshould\s+we\s+use\b/i,
|
|
7
|
+
/\bcompare\b/i,
|
|
8
|
+
/\bvs\.?\b/i,
|
|
9
|
+
/\bversus\b/i,
|
|
10
|
+
/\bwhich\s+is\s+better\b/i,
|
|
11
|
+
/\btrade[\s-]?off/i,
|
|
12
|
+
/\bpros\s+and\s+cons\b/i,
|
|
13
|
+
];
|
|
14
|
+
const MAP_REDUCE_PATTERNS = [
|
|
15
|
+
/\baudit\s+all\b/i,
|
|
16
|
+
/\bscan\s+all\b/i,
|
|
17
|
+
/\bfind\s+all\b/i,
|
|
18
|
+
/\banalyze\s+all\b/i,
|
|
19
|
+
/\bsummarize\s+all\b/i,
|
|
20
|
+
/\bevery\s+(file|module|component)\b/i,
|
|
21
|
+
];
|
|
22
|
+
const PIPELINE_PATTERNS = [
|
|
23
|
+
/\bthen\b/i,
|
|
24
|
+
/\bafter\s+that\b/i,
|
|
25
|
+
/\bfirst\b.*\bthen\b/i,
|
|
26
|
+
/\bstep\s+\d+\b/i,
|
|
27
|
+
/\bphase\b/i,
|
|
28
|
+
];
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// classifyTask — heuristic pattern matching
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
export function classifyTask(task) {
|
|
33
|
+
if (DEBATE_PATTERNS.some((p) => p.test(task)))
|
|
34
|
+
return "swarm:debate";
|
|
35
|
+
if (MAP_REDUCE_PATTERNS.some((p) => p.test(task)))
|
|
36
|
+
return "swarm:mapReduce";
|
|
37
|
+
if (PIPELINE_PATTERNS.some((p) => p.test(task)))
|
|
38
|
+
return "swarm:pipeline";
|
|
39
|
+
return "direct";
|
|
40
|
+
}
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// buildExecutionPlan — decompose + conflict detection
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
export function buildExecutionPlan(input) {
|
|
45
|
+
const { task, subtasks } = input;
|
|
46
|
+
// Single or empty → direct / single
|
|
47
|
+
if (subtasks.length <= 1) {
|
|
48
|
+
return {
|
|
49
|
+
task,
|
|
50
|
+
mode: "direct",
|
|
51
|
+
execution: "single",
|
|
52
|
+
subtasks,
|
|
53
|
+
conflicts: [],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// Multi-subtask: detect file conflicts
|
|
57
|
+
const detector = new ConflictDetector();
|
|
58
|
+
const estimates = subtasks.map((s) => ({
|
|
59
|
+
id: s.id,
|
|
60
|
+
estimatedFiles: s.estimatedFiles,
|
|
61
|
+
}));
|
|
62
|
+
const conflicts = detector.findConflicts(estimates);
|
|
63
|
+
// Check for explicit dependency edges
|
|
64
|
+
const hasDependencies = subtasks.some((s) => s.dependsOn && s.dependsOn.length > 0);
|
|
65
|
+
const execution = conflicts.length > 0 || hasDependencies ? "sequential" : "parallel";
|
|
66
|
+
// Derive topology from task classification
|
|
67
|
+
const classified = classifyTask(task);
|
|
68
|
+
let mode;
|
|
69
|
+
let topology;
|
|
70
|
+
if (classified.startsWith("swarm:")) {
|
|
71
|
+
mode = "swarm";
|
|
72
|
+
topology = classified.slice("swarm:".length);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
mode = "subagent";
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
task,
|
|
79
|
+
mode,
|
|
80
|
+
topology,
|
|
81
|
+
execution,
|
|
82
|
+
subtasks,
|
|
83
|
+
conflicts,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/oni-code/planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Loader — discovers and loads plugins from project directories.
|
|
3
|
+
*
|
|
4
|
+
* Scans `.oni/plugins/` for `.js` and `.mjs` files, dynamically imports them,
|
|
5
|
+
* and extracts plugin definitions. Plugins can provide tools, agent definitions,
|
|
6
|
+
* and lifecycle hooks — extending ONI beyond what custom tools alone can do.
|
|
7
|
+
*
|
|
8
|
+
* Plugin format (any of these export patterns):
|
|
9
|
+
* - Default export: `export default { tools?, agents?, hooks?, activate?, deactivate? }`
|
|
10
|
+
* - Named `plugin` export: `export const plugin = { ... }`
|
|
11
|
+
* - Module-level: exports matching the plugin shape
|
|
12
|
+
*
|
|
13
|
+
* A valid plugin must have at least one of: tools, agents, hooks, or activate.
|
|
14
|
+
* Non-plugin exports are silently skipped.
|
|
15
|
+
*
|
|
16
|
+
* Lifecycle:
|
|
17
|
+
* - `activate(ctx)` — called when plugin is loaded (sync or async)
|
|
18
|
+
* - `deactivate()` — called when plugin is unloaded (sync or async)
|
|
19
|
+
*
|
|
20
|
+
* Swarm-aware: Plugin tools are available to all execution tiers (conductor,
|
|
21
|
+
* subagents, swarm agents). Plugin agents can be used as swarm agent slots.
|
|
22
|
+
*/
|
|
23
|
+
import type { ToolDefinition } from "../tools/types.js";
|
|
24
|
+
export interface PluginAgentConfig {
|
|
25
|
+
name: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
mode?: "primary" | "subagent" | "hidden";
|
|
28
|
+
tools?: string[];
|
|
29
|
+
systemPrompt?: string;
|
|
30
|
+
maxTurns?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface PluginHookConfig {
|
|
33
|
+
event: string;
|
|
34
|
+
pattern?: string;
|
|
35
|
+
handler: (...args: unknown[]) => unknown;
|
|
36
|
+
}
|
|
37
|
+
export interface ONIPlugin {
|
|
38
|
+
name?: string;
|
|
39
|
+
version?: string;
|
|
40
|
+
tools?: ToolDefinition[];
|
|
41
|
+
agents?: PluginAgentConfig[];
|
|
42
|
+
hooks?: PluginHookConfig[];
|
|
43
|
+
activate?: (context: PluginContext) => void | Promise<void>;
|
|
44
|
+
deactivate?: () => void | Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
export interface PluginContext {
|
|
47
|
+
rootDir: string;
|
|
48
|
+
}
|
|
49
|
+
export interface LoadedPlugin {
|
|
50
|
+
name: string;
|
|
51
|
+
source: string;
|
|
52
|
+
plugin: ONIPlugin;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Find all loadable plugin files in the project's `.oni/plugins/` directory.
|
|
56
|
+
* Returns absolute paths to `.js` and `.mjs` files.
|
|
57
|
+
*/
|
|
58
|
+
export declare function scanPluginFiles(rootDir: string): string[];
|
|
59
|
+
/**
|
|
60
|
+
* Type guard: an object is plugin-like if it has at least one of
|
|
61
|
+
* tools (array), agents (array), hooks (array), or activate (function).
|
|
62
|
+
*/
|
|
63
|
+
export declare function isPluginLike(value: unknown): value is ONIPlugin;
|
|
64
|
+
/**
|
|
65
|
+
* Extract a plugin object from a module's exports.
|
|
66
|
+
*
|
|
67
|
+
* Priority:
|
|
68
|
+
* 1. `default` export (if plugin-like)
|
|
69
|
+
* 2. Named `plugin` export (if plugin-like)
|
|
70
|
+
* 3. Module itself (if plugin-like)
|
|
71
|
+
*
|
|
72
|
+
* Returns null if no valid plugin found.
|
|
73
|
+
*/
|
|
74
|
+
export declare function extractPlugin(mod: Record<string, unknown>, filenameStem: string): ONIPlugin | null;
|
|
75
|
+
/**
|
|
76
|
+
* Scan `.oni/plugins/`, import each file, extract plugin definitions,
|
|
77
|
+
* and call `activate()` on each.
|
|
78
|
+
*
|
|
79
|
+
* - Files that fail to import are silently skipped
|
|
80
|
+
* - Files with non-plugin exports are silently skipped
|
|
81
|
+
* - Plugins that throw during activate are skipped
|
|
82
|
+
*/
|
|
83
|
+
export declare function loadAllPlugins(rootDir: string, context?: PluginContext): Promise<LoadedPlugin[]>;
|
|
84
|
+
/**
|
|
85
|
+
* Call `deactivate()` on each loaded plugin. Errors are swallowed
|
|
86
|
+
* to ensure all plugins get a chance to clean up.
|
|
87
|
+
*/
|
|
88
|
+
export declare function unloadPlugins(plugins: LoadedPlugin[]): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Collect all tools from loaded plugins into a flat array.
|
|
91
|
+
* Useful for passing to ConductorConfig.customTools.
|
|
92
|
+
*/
|
|
93
|
+
export declare function extractPluginTools(plugins: LoadedPlugin[]): ToolDefinition[];
|
|
94
|
+
/**
|
|
95
|
+
* Collect all agent definitions from loaded plugins.
|
|
96
|
+
* Returns in the format expected by AgentRegistry.register().
|
|
97
|
+
*/
|
|
98
|
+
export declare function extractPluginAgents(plugins: LoadedPlugin[]): PluginAgentConfig[];
|
|
99
|
+
/**
|
|
100
|
+
* Collect all hook definitions from loaded plugins.
|
|
101
|
+
*/
|
|
102
|
+
export declare function extractPluginHooks(plugins: LoadedPlugin[]): PluginHookConfig[];
|
|
103
|
+
//# sourceMappingURL=plugin-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../../src/oni-code/plugin-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AASxD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;CAC1C;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,CAAC;CACnB;AAID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAezD;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAS/D;AAID;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,YAAY,EAAE,MAAM,GACnB,SAAS,GAAG,IAAI,CAmBlB;AAID;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiCzB;AAID;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1E;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CAE5E;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,iBAAiB,EAAE,CAEhF;AAID;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,gBAAgB,EAAE,CAE9E"}
|